«    »

Improving Computer Science Degrees for Software Developers

Two recent experiences prompted me to think deeply about how software developers start out in the field and develop their expertise.

The first experience was reading an article by Uncle Bob titled Master Craftsman Teams. Bob's main point is that the current model of developing expertise based on entering the field with a four year computer science degree and then haphazardly gaining experience is broken – dysfunctional and ineffective in both cost and time. The alternative Bob suggests is a formalized path of learning based on the apprentice – journeyman – master craftsman model used by the trades, but without starting with the degree.

The second experience was the recent birth of my second son which involved interacting with a variety of medical staff at the hospital. Like previous hospital visits, the staff included nurses and doctors in a variety of training roles – student nurses, interns, and residents – as well as the experienced staff in charge – running the ward or performing the surgery. These training roles are clearly defined with careful supervision. One student nurse we dealt with was under the direct, one-on-one supervision of an experienced nurse who was constantly teaching, training, and assessing the student. Medical interns are supervised by junior residents who are in turn supervised by senior residents with a full staff doctor ultimately responsible. Unlike the trades, medical professions do require a university degree. Practical experience, however, is heavily integrated into the degree program. After the degree formalized training is heavily integrated into the work: residents rotate between roles within their area of specialization and still have exams to take.

So how have these experiences influenced my thoughts? I agree with Uncle Bob that the current model of developing expertise is grossly deficient. Far too many times I have witnessed novice or junior developers being thrown onto a team and expected to churn out production code with limited (if any) supervision or review. I have also suffered multiple times through the experience of having a team member who made a negative contribution to the team: we would have been more productive without them.

Is there a better way? Definitely! I'll start with the university degree. I disagree with Uncle Bob in that I do feel that a university degree can be a useful foundation for a career as a software developer. I think that the classic computer science curriculum is not the best approach: I would rather see a stronger emphasis on practical software development topics and a corresponding reduction in highly theoretical courses. In other words, take more of an applied science or engineering approach rather than a pure / theoretical science stance. Course work should include programming assignments. This may sound funny to say, but from personal experience in school I know individuals that did not have to write any code until their third year of school. There should be at least a few project courses that focus on having small teams of students develop a piece of software end-to-end, starting with gathering requirements and culminating in a tested, working version. The undergraduate program I went through offered one such course (called Software Engineering) that I found beneficial. It would have been much more effective, however, with an experienced software developer to act as a mentor throughout the course.

More important than the curriculum, however, is the need to integrate actual work experience into the degree program. I am familiar with computer science degrees that offer an optional 16-month internship. This is better than nothing, but a single big work block is, I believe, the least effective way to integrate work with school. In my undergraduate degree in computer engineering I went through a co-op program that after the second year alternated one to two terms (four-month blocks) of school with one to two terms of work, including summers. I purposely changed employers each work term to maximize the variety of experiences that I encountered which I believe this greatly enhanced my learning.

As beneficial as I found the co-op program, I know that it could be made far more effective. Work terms are actual paid job placements so the employers are motivated to get their money's worth from the co-op students rather than provide formalized instruction & mentoring. In some cases students are dumped into a team that is too busy as it is to provide effective guidance to the student. In other cases students end up doing activities unrelated to software development. Let's compare this to the medical model where students go through rotations that explicitly target different areas of medicine with much tighter integration between practical experience and classroom training.

I think computer science degrees would benefit from providing structured, part-time work experience concurrent with part-time classes – perhaps working three days a week and in classes two days a week. In order for structured mentoring / training to be provided within the work setting, the only viable solution I see is for the student to work for free and have the university pay the supervisors an instructor fee. Four-month paid work terms, most commonly over the summer, could still be included in the program.

The following table outlines a sample degree program incorporating the suggestions I have made above:

Year Fall Term Winter Term Summer
One Introductory classes with programming assignments Introductory classes with programming assignments and one project course Summer break (first and last :)
Two Classes with programming assignments and one project course Classes with programming assignments and one project course Part-time classes (3 days / week) and part-time structured work experience (2 days / week)
Three Part-time classes (3 days / week) and part-time structured work experience (2 days / week) Part-time classes (2 days / week) and part-time structured work experience (3 days / week) Paid work term (unstructured)
Four Part-time classes (2 days / week) and one project course and part-time structured work experience (3 days / week) Part-time classes (2 days / week) and one project course and part-time structured work experience (3 days / week) Graduation!

I haven't discussed the topic of developing expertise in the work place after university – this post is long enough and I'll save it for later – but I will say that I do like Uncle Bob's craftsman-based model.

What changes do you think should be made to computer science degree programs? Let me know via a comment below.

If you find this article helpful, please make a donation.

2 Comments on “Improving Computer Science Degrees for Software Developers”

  1. LarryH says:

    I think that the class room assignments should be on a longer time scale where each class inherits the outputs of the previous years work and builds on that. Probably with some well documented modules included in the mix.

    This way they learn how bad it could be in maintain legacy code, especially that written by new developers.

    And in the final year they get their first years code back and add new features to it.

  2. Frustrated says:

    This issue isn’t addressed effectively as often as it should be. The disjointness between the academia and the industry is distressing.

«    »