A pragmatic approach to training programmers, part two

Last week's post about a pragmatic approach to training programmers has generated a lot of interest. This week, I will fill out the details of the second half of my proposed coursework.

Semester 5

C++ 2

As a follow up to last semester's C++ course, students will write two small C++ applications, and one larger C++ application, with hands-on mentoring from instructors and TAs.

Database Architecture Students will be taught in-depth database design and architecture, with a focus on the architecture's effect upon programming. The relationship between normalization and how to write fast-performing SQL code depending upon the level of normalization will also be explored. CPU Fundamentals

In this course, students will learn the nitty-gritty details of CPU architecture, including the differences between CISC and RISC platforms, binary operations, memory management, and so on. Hands-on coding practice will occur in assembly language.

Development Methodologies

The differences between various development methodologies such as Waterfall, Agile, RAD, and so on will be taught. Students will participate in an ongoing series of workshops that mock up a development environment, alternating between playing the role of customer and developer.

Semester 6

Java This introductory course in Java will bring them to a level of fluency. Students will learn the Java language, details of the JVM, and the relationship between Java and J2EE application servers. VB.Net

Students will learn VB.Net, as well as the .Net Framework and the ASP.Net system. There will be significant focus upon event-driven application programming.


Students will be taught the C# language, as well as many of its advanced features such as anonymous functions, lambda calculus, and so on.


An intensive course covering the ins and outs of writing secure code. Students will learn about buffer overflows, data validation, SQL injection attacks, cross-site scripting attacks, and other typical security problems. Students will be asked to find the security holes in previous projects that they have worked on and to correct those holes as an exercise in hardening existing code.

Semester 7

UNIX Programming

Students will learn to program specifically on the UNIX platform. Special emphasis will be placed on the significant role of processes (including forking), pipes, sockets, and redirection. Students will also be given instruction and practice writing applications that deploy well in UNIX.

Windows Programming

Students will be taught how to program specifically for the Windows platform. Areas of focus will include UI design and the Windows API, and a heavy premium will be placed upon security.

"Lone Wolf" Programming

Students will be required to build a rather large project using a methodology of their choice. They will have to perform requirements gathering, specification writing, planning, development, and testing of their application.


Quality Assurance (QA) techniques will be taught in this half-semester course. Students will learn about QA and perform load testing, unit testing, code reviews, and so on, and be expected to correct any problems that they discover. The code will be pre-built for them, to allow the students to focus on the QA process and not the code writing process.


Students will learn how to properly document code and the various techniques available, as well as the best places and times to use different techniques. Inline code, reference generation, help file creation, manual writing, and such will all be covered. This is a half-semester course.

Semester 8

Team Programming This double-size course will have students working on four separate team projects. Students will function as developers in three of the projects, and as a business analyst/project manager/technical lead on the fourth project. Each project will take half of a semester, and each student will work on two concurrent projects. Multithreaded Development

In this advanced course, students will learn about parallel program design. Signalling, concurrency, and data integrity will all be taught. Students will be exposed to pthreads, the Java threading model, and the .Net threading model.

Semester 8 Electives

Each student must choose one of these courses as their final course in Semester 8:


Students will learn to program window manipulation and graphics handling on the Windows platform using C++ and DirectX.

Device Drivers

Students will learn about writing device drivers and practice writing a simple driver using assembly language on a limited functionality UNIX platform.

Optimization and Refactoring

Students will examine code to find inefficiencies and refactor code to drive performance, ease maintenance, and reduce potential points of failure. The code will be pre-written to allow students to concentrate on the lessons.

Scientific Programming

Students will practice the translation of scientific theory and mathematic algorithms into code, using the language of their choice on the UNIX platform.

Network Programming

This course will teach students how to code communications between computers using sockets. Students will be given practical advice and hands-on training in determining if reusing an existing protocol makes more sense than developing a new one, the choice between UDP and TCP, and there will be special emphasis on the HTTP protocol as well as the difference between applications running on LANs and WANs.

I hope you enjoyed this series. As always, feedback is welcome!


[Edited 7/30/2007 {Justin James} to add a missing period and paragraph break at the end of the first paragraph.]