A pragmatic approach to training programmers, part one

One topic that seems to generate a lot of discussion in the TechRepublic forums is the proper education for a programmer. I have come to believe (largely influenced by these discussions) that there should be two educational tracks for software programmers: a true computer science program that focuses on a very mathematical, theoretical approach to programming, and a hands-on route that educates people to be real-world programmers.

Today, I will present what my ideal course listing for such a path might be. I do not think that this type of course would necessarily be taught in a college setting, since it is more vocational training than theory study (I also think colleges have no business granting MBAs either). However, the program will be split into the traditional eight semesters minus the general education requirements, and electives will only be available in the final year of study. (Note: I hoped to have some timings on Perl vs. C# this week, but I had to postpone it. Soon... I promise!)

Semester 1

Introduction to Programming
This course focuses on the basic structure of a program: control statements, looping, conditions, and so on. It would ideally be taught in a very simple, trickery-free procedural language, one that supports (but does not need to use) OOP. It would also need to enforce good programming habits. I suspect that (unfortunately) VB.Net with Explicit and Strict turned on would be the best fit for this, or possibly Ruby (I do not know enough about it to say for sure). Pascal would also be a good candidate for this course.

Symbolic Logic 1
This course teaches the basics of constructing a formal logic proof or disproof.

Requirements Gathering
The focus of this course is collecting the business requirements of a project, learning who the key stakeholders are and getting information from them, getting in touch with actual users to determine their needs, and so on. Heavy emphasis is placed on learning the "why" of the project, even when the customers are focusing only on the "how." The course will also teach you how to present the best approach to a project even though it may not be what the customer thinks they want or need.

Networking and System Administration Basics
A course that helps programmers understand the environment that their software will be running in, particularly in the modern world, is needed. This course teaches students enough basic networking and system administration to be aware of common problems in a production environment and how to anticipate them in code. Special focus will be placed upon permissions and TCP/IP troubleshooting.

Semester 2

Usability and Accessibility
Good programmers need to be aware that all users have certain needs in common (usability) and that some users have special needs (accessibility). This is a code-free course that explains the fundamentals of how good interface design serves the needs of the users.

Symbolic Logic 2
An advanced course in symbolic logic.

Database Theory
This course takes the student through an exploration of sound database design. There will be information about relational databases and normalization, as well as learning about the different needs of an application and reporting. The proper use of indexes, primary keys, views, stored procedures, and so on will receive particular focus.

Programming Fundamentals
Using an extremely stripped down language (similar to EdScheme), the students will spend a semester building a number of basic libraries to extend a language that is restricted to simple primitive types and control structures to be a full-fledged language.

Object-Oriented (OO) Design
Students will be taught OO design and programming techniques. There will be significant time discussing the proper architecture of OO projects and how to leverage OO techniques to work in a team environment.

Semester 3

Data Structures
Taught in C, this course will walk students through common data structures such as linked lists, stacks, queues, graphs, trees, etc.

Technical Specifications
Building upon the Requirements Gathering course, this course teaches students how to translate business requirements into technical specifications. Special attention will be paid to the differences between how business users express ideas and how technical people understand ideas.

Data-Driven Applications
Students will build data-driven applications, combining their knowledge of OOP, databases, data structures, and interface design to construct simple client/server applications.

Basic Web Design
HTML, CSS, and JavaScript will be taught, along with the basics image editing tasks that a programmer typically uses. Emphasis will be placed on standards compliance and creating usable, accessible Web sites.

Semester 4

Data Validation
In this course, students learn about the need to perform data validation, and techniques to perform it. Basic regex instruction will be provided as well.

C++ 1
A beginner's course on the C++ language with an emphasis on working with objects and writing bulletproof code.

Dynamic/Interpreted Languages
A survey of different dynamic and interpreted languages in common usage, including Perl, Ruby, Python, and JavaScript. Students will learn the unique properties of dynamic/interpreted languages and how to leverage them within the proper context.

Students will be shown how to create data models for reporting and to create reports. Extra attention will be placed upon discerning the best way of displaying data to the user in an easily understood and consumed manner.

Stay tuned: Next week I will post part two of this series.



Justin James is the Lead Architect for Conigent.

Editor's Picks