The Undergrad CS Program, Linux, and Open Source


Linux and Open Source are Changing the World

Linux and Open Source are changing the face of computing. Companies large and small are embracing Linux and Open Source for many reasons, including cost, reliability, flexibility, and availability. Notable recent quotes from the press include (See my earlier essay "The Case for Linux in Universities" for more about this phenomenon and how it impacts universities.)

In the commercial world, adapting to Linux and Open Source has been disruptive, since it upset many cherished ideas about the value and secrecy of source code. Universities, on the other hand, have long used Unix and encouraged open sharing of ideas and source code, so adapting to Linux and Open Source should come somewhat more naturally.

The collaborative methods used to develop Linux and many Open Source projects are fascinating in their own rights. Everybody on Earth who is interested in a project and has a reasonable Internet connection can instantly plug in to a social network of people working on that project, read or search through their past discussions, ask new questions of them, fix bugs or add new code, and try out the contributions of others. Each contribution adds irreversibly to the richness of the project. It is an exhilarating bazaar of ideas and progress. This phenomenon is one of the key reasons Open Source has become vital to the practice of software engineering: it lets engineers (and companies) ride on the shoulders of a giant growing by leaps and bounds.

Some University Students not well prepared for Open Source programming

I have personally interviewed many students from respected four-year universities for an Open Source programming internship.

As part of the interview process, I ask the students to take a short quiz about a few tools commonly used in Open Source development, namely Make and the Bourne Shell. The quiz is open book and take-home, and most of the answers can be readily looked up in the on-line help or tested by running the commands in question, yet very few applicants get even half the answers right. I conclude that the students are not being exposed to these important topics. And unfortunately, these are not topics that can be picked up trivially at the start of an internship; if someone has never used Make or a shell, it's unrealistic to expect them to be able to deal with real-world shell scripts or Makefiles during a short internship.

Applicants that do manage to answer half the questions on the quiz are then asked to do some simple programming task, e.g. reversing a string. Amazingly, a fair percentage of CS students are unable to handle even these simple programming tasks.

Finally, students often seem flummoxed by techniques commonly used in Open Source development (e.g. diff and patch), and don't bother to test their changes the first few times they try to submit changes back to an Open Source project.

There seem to be three problems here:

I suspect that these students have been doing too much book-learning and not enough actual programming, and that universities are overemphasizing Windows and underemphasizing Linux and Open Source.

Proposed Changes

While the universities involved have fine computer science curricula, the above experiences give me the feeling they have not yet adapted to the challenges and opportunities posed by Linux and Open Source. I believe a few small curriculum changes might be enough of an adaptation to give university CS students sufficient exposure to Open Source tools and techniques, and improve the chance they do some real-world programming:

CS students should be asked to write real code every term

In at least some universities, there is a gap of several terms during which computer science undergrads are not asked to write any code. This is bad because programming is like speaking a foreign language; only by practicing can one become fluent. Universities should try to keep their CS undergrads constantly challenged with nontrivial programming of one sort or another.

Universities should offer a free online prefrosh programming course

I suspect that programming, like foreign language, is best learned young. (The fact that I learned programming and logic design in 9th grade probably biases me toward that conclusion.)

Motivated incoming students interested in CS should be given an incentive of some sort to learn on their own pace at home during the summer before starting college, perhaps by offering an online version of CS101; students that take that course during the prefrosh summer, and who pass a placement exam, should be given credit. This would free them to take more interesting courses on arrival at school, and would help take better advantage of the plasticity of young minds.

First year CS students should be exposed to Open Source tools

Microsoft's influence in Computer Science departments is strong. The market share of Microsoft Windows is still well over 90% for laptop and desktop computers, so students arrive at university already familiar with Windows. Microsoft recently donated several million dollars to U of Waterloo on the condition that they require teaching the Microsoft C# language to all CS students. Also, Microsoft donated computer labs to several universities (e.g. UCLA) in exchange for the university "incorporating VS.NET into the first year curriculum". Furthermore, Microsoft hires Student Ambassadors at many universities who are paid commissions based on how many departments they can convince to use Microsoft languages and products. This pressure to use Microsoft languages and software cannot fail to leave students poorly-equipped when later faced with Linux or other Open Source tools, and amounts to a pro-Microsoft bias on the part of the university.

This bias could be mitigated by switching one of the first-year CS courses to use Open Source tools instead of Microsoft tools. There are many open source-friendly compilers/interpreters to choose from, e.g. C/C++, python, java. Likewise, there are many Open Source IDEs to choose from, e.g. Anjuta (similar to Microsoft's Visual C++), Eclipse (for Java), etc.

Many Linux applications can be run on Windows by installing Cygwin. Installing Cygwin on existing Windows lab computers would have the benefit of giving access to Linux tools whether or not actual Linux was installed. This would allow students using those labs to freely choose between Open Source and proprietary environments. (Linux GUIs are just now being added to Cygwin; see e.g. this note on the Cygnome mailing list.)

Likewise, Fink is a free port of the same Open Source tools to the Mac OS X environment; a school with a mix of Windows, Linux, and Mac OS X computers can run the same Open Source applications on all its computers easily with the help of Cygwin and Fink.

CS students should have an opportunity to contribute to open source projects in a structured environment

One of the key skills of a software engineer in the open source world is social, not just technical: being able to find and fit into the development community for an open source tool.

I have found that very few students applying for programming internships have been exposed to open source development communities. This is sad because the peer review involved in making contributions to busy open source projects is educational; even pros learn constantly in such an environment because there are so many experts around to give useful feedback.

Therefore I'd like to see Open Source development techniques become a small part of the upper division CS curriculum. This should be a new elective course. Students would be introduced to a few basic collaborative tools required to participate in distributed open source development, would practice using them in local groups, and then would spend a few weeks making a small contribution to an existing real-world open source project with a significant user base, under the supervision of the class lab assistants. Many projects maintain To-Do lists for new volunteers; students would pick such a project and try to take care of one very simple item on the To-Do list (e.g. "Convert these 10 macros to inline functions"), have a lab assistant review the change briefly, then contribute their changes to the project, and iterate until the change was accepted (and then perhaps repeat with a more challenging contribution, once they're gotten a feel for the tools and the culture). The level of the course would determine the scope of the contributions; a course for 1st or 2nd year students would expect small contributions, but a capstone course for seniors might expect contribution of an interesting chunk of functionality.

I have put together a mini-tutorial which illustrates what the beginning of such a course might cover; it's online at

Here are a few classes along the lines I'm proposing:

And here are a few classes which at least touch on part of what I'm proposing:


Computer Science students sometimes don't get sufficient exposure to Open Source tools or to real-world programming. Microsoft's influence in Computer Science departments is strong, and amounts to a pro-Microsoft bias which will leave students ill-prepared for the increasing use of Linux and Open Source in the real world. Requiring the use of Open Source tools in at least one first-year CS class, encouraging CS students to program throughout school, offering some prefrosh outreach for prospective CS majors, and offering an elective course in Open Source software development methodology and culture, would go a long ways towards solving these problems, and would better prepare students for the future.

See Also

[ The latest version of this document can be found at ]
Copyright 2003, Dan Kegel
Last Updated: 31 Mar 2003