Dr. Dobb's Journal Fall 1998
In a July 8, 1998 New York Times op-ed entitled, "Needed: Techies Who Know Shakespeare," Ellen Ullman, known for books conveying the programming experience to the masses, wrote, "I hope...students and professors realize that programming instruction can take place in a few classes, and students can spend the rest of their time studying foreign languages, literature, linguistics, philosophy and history of science."
But with organizations complaining about the programmer shortage, and pundits poohpoohing the poor qualifications of programmers fresh from college, Ullman's suggestion is hard to swallow. Do we need programmers who can quote Shakespeare and Nietzsche, or do we need programmers who know the difference between a struct and a class? And just what are the benefits of a course in the Humanities, other than a guaranteed job offer from Starbucks or Barnes & Noble?
Clearly, a strong understanding of the fundamentals of computer science is vital to the success of a software developer. If you don't know whether to use a quicksort or heapsort, or when to use a tree or trie, you are not going to be successful as a programmer. Just as important is real programming experience -- and the more of it, the better. Most computer-science departments offer courses with a strong emphasis on programming, ranging from graphics to operating systems.
But practical experience entails more than classroom programming. Programming real systems that may have hundreds or even thousands of users, is different from completing a programming assignment for a class. Additionally, companies require programmers to work in teams, make decisions based on more than technical factors, and master new topics quickly.
Students who jam their course curriculum with programming and computer-science courses will only marginally enhance their abilities as professional programmers. If they combine a proper balance of theory and programming courses with part-time jobs or internships, however, they will have the necessary programming skills, with plenty of units available for other courses.
Is Ullman correct, then, in claiming that students should spend the rest of their time on history and literature courses? Could those courses actually add value to their abilities as programmers?
Grace Hopper, one of the pioneers of our industry, was designing the A-0 compiler, when she came across this problem: When the source code specified a jump to a subroutine defined later in the program, the compiler would not know the memory location of that subroutine. How could Hopper design a one-pass compiler that did not already know the memory locations of all the subroutines?
While mulling over this problem, Hopper remembered her basketball-playing days at Vassar in the 1920s. Inspired by the "give-and-go," Hopper set aside a chunk of memory and called it the "neutral corner." When the compiler came across a jump to a subroutine whose memory location had not yet been determined, it would jump to a location in the neutral corner. When the compiler finally did compile the subroutine, it placed an instruction in the neutral corner to jump to the now-specified memory location of the subroutine. Hopper later enthused, "It was possible to make a single-pass compiler and the concept did come from playing basketball!"
Hopper's inspiration is not an isolated example. Inspired by cell biology, Alan Kay created the Smalltalk language. Larry Wall modeled Perl after the English language, and a section of his book, Programming Perl, is devoted to Perl poetry. Students who read Wittgenstein will find elements of his philosophy remarkably similar to some of the tenets of object-oriented programming.
People sometimes forget that programming is an art as much as it is a science, and as such, a broad, interdisciplinary curriculum can have tremendous value. More importantly, such a curriculum can bring great value to one's life, which is, after all, what college is all about.
-- Eugene Eric Kim