What would an ideal computer science education look like?

I would appreciate comments on a draft article.  The topic is “what would an ideal computer science education look like?” (for a college-age person hoping eventually to get a job as a software engineer rather than staying in academia)

The draft is available at http://philip.greenspun.com/teaching/undergrad-cs but please comment here.

Thanks in advance.

67 thoughts on “What would an ideal computer science education look like?

  1. Methinks thou dost confuse education with skill training. Computer science should be more concerned with the fundamental science of computation. You seem to argue “Why isn’t computer science more like IT training”. Because it isn’t IT training, that’s why. They are different, just as EE is different.

    I would also argue that asking employers what they want more out of CS grads is certainly a valid approach, but what about CS grads who have been out of school for a couple of years? What would they have wanted in school? It’s been 20 years for me, but I found one of the biggest shocks was the number of meetings. I have contracted for 15 years, and of all the companies I’ve worked with, only one Intel manager ran the meetings well.

    So companies complain about lack of industry-based CS education. So what are they doing about it? If it’s just complaining, then they are not helping. If they are working hand-in-hand with local universities to provide company managers as mentors or adjutant faculty, then they are contributing to the solution.


  2. Doug, if students wanted to study “fundamental science”, wouldn’t they major in physics, biology, or chemistry? Computer Science happens to contain the word “science” but it is actually an engineering discipline. And the employers want people who can solve problems. It is necessarily different from “IT training” because a software engineer is being asked to build a new program to solve a new problem. A graduate of a typical “IT training” course is usually asked to solve an old problem, e.g., setting up a network with Cisco routers or whatever.

  3. Comment 1:

    Obviously there are a number of drawbacks to the
    standard college CompSci degree course, and it seems that many of these drawbacks are fairly obvious to
    someone who pays attention to what is going on in the field. This suggests there is plenty of scope for improvement. Yet computer science departments don’t seem to be innovating, nor are they being driven out of business by smart newcomers. Why??? If you don’t figure out what market force is stunting innovation, and design your new program accordingly, the program is likely to fail. I think this is a deeper question than those you mention explicitly and I’d like to see you approach it. Maybe it isn’t specific to CompSci.

    Comment 2:

    Joel Spolsky (hi Joel) started up his own software company after a stint at Microsoft which he apparently found extremely educational. I get the impression the Microsoft programming experience has a lot of aspects matching your new curriculum. Maybe you should address that.

  4. Comment 3:

    I think you forgot to mention that students should
    be learning Microsoft Excel, not C or Java!

  5. I happen to have a Computer Science degree. My school, the University of Victoria, was heavily focused on math and algorithms, and less on architecture/engineering. I actually focused on some software engineering classes, but I still believe that Computer Science and Software Engineering should actually be two separate disciplines: CompSci focused on the theory, research, etc. (heading towards academia), and Software Engineering an engineering discipline — the theory, practice, and architecture of building software systems.

    I did leave school for the private sector, and don’t intend to go back any time soon. The other thing that my school offered was a Co-Op program — I spent 4 semesters with 4 separate companies, doing everything from basic tech support, dealing with “real” users, to development of web-based tools for lab management, to research and analysis around some IETF standards work.

    So “real world” experience is important. And co-op gives the student and the company a chance to check each other out prior to leaving school with nothing but a bit of paper.

  6. Philip,
    I currently work with Oracle Applications. I am in a lead role where I manage small projects and am involved in the interview process. In addition to Oracle apps our site uses some proprietary software that runs in a unix environment as well as some sqlserver-based summary and reporting tools for the propietary environment.

    During a recent round of interviews for entry level positions, we were most impressed with peopole that had 2-3 years of industry experience where they had shown application of the skills that they had learned in college. In some cases this experience was gained during internships. The experience that we appreciated most was directly supporting the tools that we use in our office.

    Experience with change control was very high on our list. We conform to rules imposed by the FDA, which are very strict and result in regular audits. All new employees receive immediate indoctrination in these processes and those that cannot work with them in a team environment are not going to be successful.

    My co-workers that are the most impressive have come from India. They have received direct experience with the oracle applications while in college. As such they have a very solid base to grow on.

    I have been working in IT for about 15 years. I never graduated college, but I have been working with Oracle as a developer and dba since 1996. My training in this field has come from oracle educational classes, mentoring and experience (usually under deadlines). Even through I have been working with the oracle apps since 1999, I have to constantly learn new skills. This is either due to changes to the apps, or requirements from our users for new functionality.

    Typically, I will be handed a problem couched in business terms, investigate the problem through technical reference manuals, prototype a solution, implement the solution in test, complete change control documentation, implement in production and then receive post-imp comments from users.

    I am in the process of completing a bs through the university of phoenix. This will probably be followed by a masters because I am working my way into upper managemnet. The program that uop offers is pretty weak in the technical areas, but has a strong reliance on team work. In order to be successful at uop a student must work well with their team, break problems down into individual assignments and group those assignments together into a completed project. This team based approach has to be the strongest element of the uop method as it relates to the working world.

    If I could outline a curriculum it would consist of:
    Early experience with a variety of languages and tools based on programming languages, database and web presentation.
    General exposure to the business areas that these tools would be applied to.
    Specific exposure to the tools that are actually used in the business world (like oracle financials)
    Internship with local companies
    Exposure to team projects
    Exposure to testing and change control

    I also believe that students must be encouraged to bring their own interests to the table in order to develop newer and better solutions to existing situations. I believe that the most impressive work in user interfaces is being expressed in the computer gaming environment. If somebody were to apply the sort of immersive ‘play’ that exists in a game such as final fantasy to business simulation and execution, then they would probably own the next generation of business apps.

  7. A good addition to a student’s portfolio could be contributions to widely used open source tools and libraries. For example, if an employer needed someone with Java skills, a contribution to GNU Classpath would look impressive.

  8. Phil, I really like where you’re going with the ideas in that draft. I’m a professional developer who majored in CS (and EE), and I don’t think there could be a worse place for learning good software engineering than a formal university setting.

    As for specific tasks, I’d suggest that there’s insufficient focus on making code that’s extensible/repurpose-able. I’m not talking about plug-in architectures, but just simply writing for code re-use or ease of refactoring. University courses are short enough that there’s seldom the time and continuity necessary for follow-up projects of the sort, “Now take the mini-accounting system you implemented last month and modify it to handle the books of multiple clients.” Expanding the scope/requirements of an existing project in a previously unconsidered direction is a frequently required work skill that teaches (often the hard way) some specialized design strategies which make for code that’s more modular, more extensible, and embeddable.

  9. There is too much emphasis on algorithms and the Von Neumann model of computation. I would put more emphasis on concurrency (and distributed systems/networking), relational databases, and graph theory.

    Most CS undergrads have experience with some imperative or OO language like C or Basic. Starting with a labguage that resolutely breaks this paradigm like Erlang or Scheme (as is done at MIT) is a good thing – challenge their assumptions before they get too ingrained.

  10. OK, I read your paper, you are clearly looking for meta-skills like problem-solving and learning abilities.

    To develop learning, one method is to deliberately overload the student with coursework in many discipline simultaneously like maths, physics, biology, economics and the like. The sheer pressure will instill the habit of getting to the gist of a domain quickly without getting bogged down in details.

    For problem-solving with fuzzy objectives, the best approach would be to have an internship program. For one year, each student is paired with a small business. The student’s job is to apply IT to improve the customer’s business. Once a month, a review is performed and students are graded based on how meaningful their contributions to the business are.

  11. I made some comments in my blog.

    BTW, it sucks that if you don’t satisfy the rules for posting a comment (not obvious from the UI) that all the rest of your input disappears and you have to reenter it. And where the heck is the back button?

  12. The appropriate answer to any question depends on its context. How much beyond optimizing technical and job function skills should we address, and which are not necessarily peculiar to software engineering? For example, should we consider development of personal values, ethics, character, and spiritually? Should software engineers be well-grounded in philosophy of logic, critical thinking, ethics, metaphysics? What about health and physical fitness and diet which enable more mental, as well as physical energy? What about team sports and games to enhance joy, skills, and enthusiasm for teamwork and dedication to common goals (something which many companies try to reinforce through annual, albeit rather token, teambuilding events)? What about psychology in order to better understand our and co-worker motivations, behaviors, etc. What about education with respect to political activism to better facilitate involvement in improving the workplace, community, and environment, beyond improving software code? And what about history, science, religion, arts, and current events so that we have perspective? And what about education with respect to other cultures and beliefs beyond those native to us, so that we may be more tolerant, understanding, and mutually helpful?

    If we educate someone to be a good software engineer, but that person is callus about the environment, recycling, voting, altruism, etc. have we provided the ideal computer science education?

  13. Education goals depend on what you later want to do. If you know you want to get a job in industry or start your own software company then a crafts oriented education is fine. And we can do a much better job in that respct. I always envied my friends in (building) architecture whose education was based on a lot of practical work and studios in which practical work was mixed with theory and, most importantly, presentation and communication skills. Now since I am teaching computing myself I try to bring some of this approch into my classroom.

    However, some people might be interested in computing as science. For thse students an education centered on principles might be better. Peter Denning recently had a great article in CACM outlining his idea of teaching principles rather than technologies.

    Peter J. Denning
    Great principles of computing
    Communications of the ACM
    Volume 46 , Issue 11 (November 2003)
    Pages: 15 – 20
    Year of Publication: 2003
    ACM Press New York, NY, USA

  14. I am a recent graduate from the Computer Engineering program at the University of Waterloo, Canada. I immediately begun my Master’s degree, (I think my interest may be in research), so be warned: my views may have an “academic” bias. Additionally, my experience with the curriculua at other schools is limited.

    At my school, all of my course projects in 2nd through to 4th year were group work, most of them as partners, but a few done in groups of up to four. So at least at my school, there is a significant amount of group work. Additionally, we have a fourth year design project where we spend two semesters doing everything from planning, budgeting, through to actual implementation. While there are lots of flaws with this project requirement, I think it is a great idea because it requires some of the elements you discussed.

    Howover, I have also been asking myself what is wrong with CS education since this summer, when I was a TA for a fourth year distributed systems course. During the course of the first assignment, I was *astounded* that some of the students got hung up on very basic problems. These students had trouble understanding what I considered to be basic programming skills. I can’t remember any specific examples, but I recall students struggling to use simple debugging techniques like printing variables or using a debugger. Frankly, these are problems that by fourth year, students shouldn’t have. Certainly, the majority of the class did not have these kinds of problems, but I still think the system failed these students.

    So what is the problem? Well, one of the problems with the group projects are that they are unsupervised: The final product is evaluated, and the group is treated as a single unit. This means that in many groups, people with weaker skills are relegated to write the report, or to simply “watch.” The students certainly know who has strong skills, but the faculty doesn’t. To make this more effective, I think it would be useful (in some situations) to have a “manager,” who would also serve as the evaluator. This person would be able to work relatively closely with the students, and would be able to judge how productive everyone is. Hence, students wouldn’t be able to just ride someone else’s coattails. The challenge, of course, is how do you afford someone to spend this much time?

    I also think there should be time early in the cirriculum for a few “practical” skills, such as how do you debug code or use version control, but this is a low level detail that isn’t relevant to your draft.

    Thank you for the interesting reading,

    Evan Jones

  15. I don’t understand why you focus on the goal of getting a first job out of college. Obviously that’s an important aspect but most people are not going to go back to school everytime they change jobs. You would hope that a college education would still be valuable several years later.

    That being said, I dont’ disagree with the recommendations you come up with (except for the part about learning about the current Cisco/Oracle/Msft products, time can be better spent on enlightening people about security -comp.risk style-, user interface etc). I just disagree with the stated objective.

    Especially agree with making the school year longer.

    Small detail. Instead of “But in ANY case should it be a teacher whose salary is being paid by the student’s tuition” I assume you mean “But NO any case should it be a teacher whose salary is being paid by the student’s tuition”.

  16. You didn’t mention courses outside of CS, except to perhaps by oblique reference when you suggested that the school should be totally focused on CS. Would you consider someone with no exposure to the humanities an educated person, or did you just ignore the question of depth in order to focus your discussion on the CS part of a university education?

    Your proposed lab sounds a lot like my workplace, and of course that is not a coincidence. I work in corporate America and we have very few CS graduates working as programmers. So they haven’t been damaged by the traditional curriculum and their education as software engineers has been in a setting very similar to the one you describe. We have lots of crappy software! Plenty of half-baked OO, (badly) reinvented solutions to well-understood problems, etc. This is good enough. Our company won’t go out of business because of these problems. But our maintenance costs are higher than they should be and our software is less capable than it could be. Would you use your lab to introduce traditional CS concepts in a new way? If not, what parts of the traditional CS curriculum would you remove in order to provide more time for the software engineering lab?

  17. In your text you write “But in any case should it be a teacher whose salary is being paid by the student’s tuition.” I think you meant “…in no case should…”

    I have a CS background. I agree with much of what you write, Phillip. However, I also agree with those who advocate teaching principles. I would also make sure that students have the ability to visualize systems and spot bottlenecks. I also agree that it would be very valuable to have exposure to libraries. The orientation needs to be toward code reusability and rapid location of available solutions. I also agree with emphasis on concurrency and scalability.

  18. anonymous (lower case a),
    Your workplace sounds like a nightmare, I hope that Philip’s idea for a lab would not resemble it.

    I understand that most companies pursue the lowest cost solution to a project and that can result in the problems that you mention. My workplace has developed its methods under a federal consent decree (we were allowed to operate, but our ceo would be subject to criminal prosecution if we did not comply) that made it necessary to employ mature development practices.

    If anything, I would hope that creating a work-like environment in an educational setting would make allowances for concepts of mature software development (development lifecycle, change control, long-term application planning, psychology of interaction with ui) that are, at best, abbreviated in most workplaces.

    I was considering a model for ‘real world’ work in the educational setting:
    graduate level students work with local business to develop proposals for new work. graduate students act as project managers. work is parceled out to undergrad students in pieces that fit their current curriculum. development is actively managed in a change control process that allows work to continue as students move through the program. theoretical classes are integrated at appropriate levels of the curriculum.

    The end result would, hopefully, be to develop graduates that have experience in a disciplned development environment, fuller understanding of theoretical concepts behind development, and applications that can actually be delivered to the business community.

    btw, how much exposure to the humanities are required to be an educated person?

  19. Frank Lloyd Wright had The Fellowship, a group of young apprentices and journeymen (both male and female) who worked with him and learned through real life practice.

    As a person who didn’t get an undergrad degree in Computer Science but who realizes shortcomings regularly from this lack of formality, I wish I could have been mentored in this teacher/apprentice mode. Not an “internship” where grunt work is handed off, an apprenticeship where there is more watching and personal tutelage.

    I like the idea of students working together and even having studio space. The Art Center in Pasadena allocates studio space to each student upon arrival. That would be cool.

    This is a side note, but perhaps interesting. As I said earlier, my bachelor’s degree isn’t in Computer Science (I studied Accounting). But I’ve worked for many years now showing people, including graduates of many a CS program, how to use development tools. Most recently, a friend of mine who just finished a Master’s program in Computer Science, asked me to “help him” with an exam related to a job interview. The company had him remote into a machine and write some code. I know the ethics are sketchy (nobody rat me out) but I “took” the exam for him: stupid stuff, just a simple database web application, and yet he didn’t really have as much grounding as I did.

    That was really ironic, but illustrates some of what your essay is about.

  20. I finished high school in Australia last year and started work at a web development firm about a week after. I’ve spent the last 11 months building web applications. It is from this perspective that I approach Philip’s request for comments on his article.

    My experiences confirm everything that Philip is saying in this article. When I started working, my programming skills were advanced in some areas but my understanding of how those skills could be applied towards broad undefined business problems was limited. I’d never worked in a team with other programmers. I’d never had real experience taking a project from inception to completion, which is a rare skill. I had no idea how to communicate with business people, particularly brash marketing executives.

    The skills I have mentioned above are the ones required for success in the commercial world. However, I’m not convinced that 3 or 4 years spent in a traditional Computer Science degree would have been of any assistance in learning those skills.

    The issues that Philip raise are very real. Small highly skilled teams of Western programmers who are finely attuned to the business problems they are trying to solve will always be more effective than large teams of low-cost programmers in India simply pumping out Java to a definition document. Philip’s plan would address these needs and allow Western engineers to compete in a different market to the Delhi hordes.

    Lastly, Philip has written elsewhere that young people tend to have the view that the world is a meritocracy (http://philip.greenspun.com/writing/reading). I hate to think that anyone would enter the corporate world without being braced for the reality “that the best things in life go to the ass-kissers and incompetents with big PR budgets”. Strangely, the company I work for is extremely meritocratic (is that a word?) but as far as I can tell, this is the exception rather than the rule.

  21. Thanks, all, for the interesting comments! It looks as though I’ll have to do a bit of a rewrite to clarify my position on humanities. I was not suggesting cutting back on the literature and history classes (though in fact someone can graduate from MIT without ever taking such a class; there are a lot of ways to fulfill the “humanities” requirement that would not be recognized as such by an Oxford don), only that I couldn’t figure out how to work those subjects into the everything-is-a-project-with-a-client mold.

    Great principles advocates: If a project is difficult it might well require the students to dig into the journals to find the great principles. I learned most of my Computational Geometry, for example, while building some software to automate earthmoving. I spent days in the library reading about algorithms for Delaunay Triangulation, etc. If it turns out that none of the great principles are useful for helping the students get their projects done to the clients’ and users’ satisfaction then perhaps the principles aren’t so great 🙂

    Folks skeptical about group work: Hal Abelson, who is one of the best teachers at MIT, often says that “the only thing that any studies of education have been able to conclude without doubt is that students learn more when they work in groups.” I don’t know his sources.

    Terry Alford: You want us to teach political activism? These are software engineers. Political power in the U.S. is for people with $100 million+. And ethics, diet, physical fitness? The students are 18+ years old. In 2.5 years we are not going to turn them all into trim LDS missionaries, Buddhist monks, or kodo drummers. Psychology so they can understand their co-workers’ personalities? How many PhDs in Psychology actually understand other people or manage to get through a marriage? Anyway, a project-based CS school can have the same amount of time devoted to non-CS subjects and sports as a solo problem set-based CS school. But expecting that we will undo the effects of 18 years of bad parenting and 12 years of boring public school seems unrealistic.

  22. Philip, Maybe a middle path of teaching and participating in least one course each year that that are designed to simulate consciousness and more actively expose a wide range of considerations beyond the technical would be possible…but of course, this gets back to establishing context/scope and how one interprets “ideal” in “ideal computer science education.”

  23. I have several different areas to comment on, Philip.

    First: you advocate several large reforms that would seemingly eliminate the current CS curriculum. So I ask–can you include incremental suggestions for existing four-year universities that doesn’t include a “complete rewrite”, so to speak, of the entire system? In other words: what would you change about existing CS degree plans short of upheaval?

    Second: I found it difficult to prioritize your points; that is, I couldn’t figure out what you think are essential changes and what are marginal or less important changes. So please clarify this in some way, by adding a sentence or prefacing things with a “THIS IS IMPORTANT!!!!” banner, or make your important points a bolded, red blinking marquee, or whatever. Take whatever suggestions you think appropriate.

    Thoroughly enjoyed this essay.


  24. Ah, Philip. As the Kohelet the Preacher once said, there is no new thing under the sun. I got my BSCS in (mumble mumble) 1981. I was fortunate enough also to have a decent-paying programming job with the Registrar’s Office on campus. The applications and tools I developed there, in COBOL of all languages, complemented the training I got in my classes (I really do think what I got was “training” rather than “education”).

    My classes provided a very decent grounding in computational theory, along with inculcation in the dogmatic philosophy of “structured programming” that prevailed in the (mumble mumble) late 1970s. Interspersed with the theory were the requisite quota of “toy” programming projects to be done strictly on our own. The professors, and particularly the TAs, expended a substantial amount of their time looking for any evidence of unauthorized collaboration that would give them the pleasure of cracking their sanctimonious whips on “cheaters.” Although that’s completely divorced from the way actual software developers worked even in those ancient days, their emphasis on Zero Tolerance for “cheating” helped maintain their illusion of “academic excellence” as they defined it.

    There was also a distinct element of snobbery in their denigration of practical skills. I took a FORTRAN course from the Engineering school, for example, because I knew it would help my resume. But the CS department didn’t offer it. Fortunately, I had learned the COBOL that was paying for my education before I got to college– it was beneath their dignity so they didn’t teach it there. Having been introduced to programming with COBOL as a first language definitely gave me a perspective quite different from that of my BASIC-hacker classmates!

    Once, in one of my “project” classes, I wrote some library routines that resembled COBOL. The resulting assignment met all requirements, but the TA felt compelled to deduct five points with the note “you must be a COBOL programmer.” I went to the TA to ask about that, and he haughtily informed me that “COBOL is evil.” I insisted that the assignment had met all the requirements and worked correctly, which he acknowledged but he still refused to give me the points back. Then I told him that I was indeed a COBOL programmer (dramatic pause)– for the Registrar’s Office. His face turned red, and he then condescended to give me the points back (never mind that I had no actual access to grades or schedules, and couldn’t exact retribution even if I were so inclined). But the episode was just an egregious example of their snobbery and disconnection from the Real World.

    But getting to the point… in a class called something like “Human and Societal Factors in Computing” (I forget the exact title) I wrote a paper based on my experience with a job that complemented what I was getting in the classroom. I expressed the rather radical idea that a complementary “real-world” job should be a requirement for a CS degree. The professor was so intrigued that he asked my permission to distribute it to the rest of the faculty. I know at least some of them received it and read it, since they subsequently asked me questions about it. Fast forward a decade, when I happened to look at the then-current catalogue for my alma mater. The CS curriculum was essentially indistinguishable from the one I took. And, of course, there was no mention of any “real-world” work requirement. I then understood why my rather obvious idea seemed so radical and intriguing– too radical, in fact.

  25. The goal of computer science education is to produce computer scientists. Conversely, if the goal is to train software engineers, then you would need software engineering education. My point is, before you even think about what and how to teach, you really ought to define clearly what your goal is.

    For example, the programmers at NASA would not only know about programming languages, they would also benefit from knowledge of numerical analysis, astrophysics and aerodynamics. And of course it would be nice if they also know how to build really efficient and fault-tolerant machines. What kind of education do these people need? Computer Science? Software Engineering? How about general problem solving skills and ability to learn new tricks?

  26. We should stop calling it “Computer Science”. It is indeed an engineering discipline.

    Phil’s thoughts about how to redesign the curriculum seem like very good ideas about addressing the fundamental uselessness of the eduction that CS majors get in this country. It’s criminal, the way we convince these kids to study this stuff by pretending it’ll prepare them for jobs, when in fact the study of “Computer Science” in the way that’s conventional will actually _kill_ whatever good habits the students already had.

    Many employers won’t let a resume past the HR department without a BSCS on it…but no manager I’ve ever worked with (and no hypothetical one I’d suffer myself to work with for long) would accept a candidate for any position beyond mere scut work unless they’ve proven themselves in the real world on real projects for real users.

    As a business owner, I understand all the good reasons not to outsource development to other countries. But if CS graduates aren’t going to be capable of working with the rest of my team effectively, of coping with ambiguous and changing requirements from demanding users, of building systems that are not merely theoretically good but actually _work_ at the scales they need to work at, and most important of all of learning and caring about the problem domain my company works in…in other words, if I have to personally spoonfeed them the way I’d have to spoonfeed contract coders for a Chinese outsourcing provider, then all those good reasons go out the window, and China starts looking a lot more attractive.

  27. I would add that students should have to read a lot of other peoples software. I’ve found that new CS grads typically want to re-invent the wheel or have coding styles that make their code hard to integrate.

  28. I graduated with a CS degree and largely agree with what you say, but let me convey my personal experience and then finish with my practical suggestion.

    While I studied CS, I knew that I wanted to develop software in the “real world” and sort of accidentally started my own business with some college buddies. We were all eager and excited about software, but none of us fancied coding a simulation of the towers of hanoi or the various academic exercises. While I built software in the class for grades, I was also building it for a (modest) fee. The latter was far more productive and instructive for my career.

    However, it is only years later that I realize how the formal education has paid off. I have developed a smell for when someone proposes an algorithm that is computationally expensive or non-scalable. The grounding in theory has been useful many times over. Additionally, there is a culture of “the learned” that rubs off on a person in college that benefits a person for life. For this reason, I expect the CS grads to on average fair better than their contemporaries who attend a technical school.

    My practical suggestion is that we need the formal CS education, but we also need to augment it with apprenticeship. I did four internships during college and learned a tremendous amount from it. While college does a great job of acclimating a person to the culture of educated persons, it often fails to acclimate to the working culture. Internships and apprenticeships fill this niche nicely and are a good start to address some of the failings of new CS grads.

  29. I see some very short-sighted posts here. A software engineer needs some talent, discipline, basic skills and some experience. But most importantly, he or she needs to understand, respect and care about the problem to be solved, the users of the program, the co-workers and the job.

    An undergraduate education at a top-notch university is not for job training. It’s an environment to foster the interactions between brilliant minds. Students can study whatever they are passionate about. They do not go to MIT or Harvard to end up programming computers for corporate America until retirement. They go to these schools to learn to change the world, using computers if they wish.

    Whatever happened to creativity among you readers of Phil’s blog? Everywhere I interview, people ask me to name some design patterns from the gang of four. Is that what education is about? Producing engineers like cookie cutters? You don’t hear anyone arguing about cookie cutting education!?

  30. Why would someone wanting to learn software engineeing pay $$$ when they can learn everything necessary on the internet for free. The most important information will be picked up on the job anyhow. My suggestion for students interested in the IT field – save your money and apply for some good interniships.

  31. AC,
    I gotta agree and disagree with you.
    A software engineer that does not understand the users is prone to working on failed projects. (agree)

    An undergraduate degree at a ‘top-notch’ university does not foster interactions between brilliant minds so much as it diverts money from the parents/students to the university. (disagree)

    In fact, if a so-called top-notch university does not provide for a future career, then it is a failed business venture and should fall by the wayside while more competitive ventures thrive.(continue to disagree)

    Also, they do not “go to these schools to change the world”, rather students enter the workplace, and if they are so inclined (and capable) then they do work that attempts to change the world.(continue to disagree)

    As far as ‘design patterns from the gang of four’ goes I must be uneducated because that combination of words means nothing to me.(neutral)

    Personally, I was both fortunate and unfortunate. Unfortunate in that I could not afford a (top-notch or otherwise) college education. Fortunate in that I just happened to be working as an instrument operator in land surveying when Computer Aided Design, Global Positioning Systems, and finally Geographic Information Systems came rolling down the pike.

    I was lucky in that I had a few years of hands-on understanding of the usage of such tools and universities had not started pumping out graduates in the field. Those were the best days in IT for me, I was part of teams that changed the way people looked at the world, received national awards and got to hang out with the developers of the software while we picked each others brains.

    The workplace is where its at, if you don’t like your work, then find a job that does it for you. If a university fails to prepare you to go get that job, then it has not performed its purpose.

  32. Gary, you worked with GPS equipment, CAD etc. That’s very practical. But MIT people pride themselves on inventing those intruments that allow you to make a living. That’s the theory of MIT anyways.

    I did go to MIT. I could’ve learned my current job from the books in a few weeks. As others have pointed out, internships would have helped my programming skills more than, say, physical education in ice skating. But I stayed all four years and my parents didn’t pay very much.

    The smart people who figured out how to give me financial aid did not learn their jobs from books and classes. They could have studied computer science or political science in college. They identified my problem and found a solution that worked for me.

  33. FYI: I have a computer science degree from The University of Melbourne (Australia) and have been working in the industry for nearly 8 years. I have three main thrusts of comment:

    1/ I have noticed in hires and co-workers the following:

    a) Many CS graduates have little practical skill

    b) For the smart and passionate ones this can be an asset as they raise naive questions like “why do we do things this way” – which often have no reasonable answer, but “experienced” people never even see the question.

    c) Some CS graduates have little or no practiacal skill, but also have no passion for CS. If they are lucky they will learn it in employment, but many workplaces don’t encourage this.

    2/ My personal experience is:

    a)I studied a combine Surveying and Computer Science degree.

    b)I learned practical uses for CS (in Surveying we used fun things like 3D GIS modelling applications).

    c) I was also forced to work 3 months commercial work experience where I performed surveying work as well as wrote some simple VB software to perform surveying adjustments.

    d) The practical experience wasn’t particularly useful in my career where I spent 5 years in infrastructure and now am a software developer, but it did help foster my passion for CS

    e) it is my passion for CS that keeps me reading, learning, writing code that is consistently better, etc. But, it is also the hard-core theoretical background from my CS degree that continually supports me with the mental capacity to achieve these things.

    3/ Comments on your article:

    “Lack of experience with user interface design and testing” – I have been involved with excellent HCI subjects at The University of Sydney, perhaps they should be mandatory rather than elective?

    “Lack of professionalism” – absolutely. In my surveying degree we also completed 1 subject each year on professinalism where we wrote and presented reports, etc. This gave me a massive edge over pure CS grads in job interviews and in my career (even now).

    “Graduates haven’t done much group work” – Probably depends on the University. I remember doing quite a bit, and yes it is extremely valuable in building teamwork skills and receiving feedback.

    I like your idea of a permanent workstation and desk for students. Architecture students have always had this, and I think it helps foster a more professional work ethic (ownership etc.)

    I don’t like your idea of compressing the calendar. You may have forgotten how challenging it is to an 18 year old to learn so quickly. I think that the long breaks are essential to their developlment. It also gives them time to start taking control of their lives by working/travelling etc., rather than having their schedule spoon-fed like it is in high school. It could be, though, a good opportunity to get some of that work experience.

    “All student work should have the character of an engineering project” – great. A lot of my projects at Uni were like this and that approach definately helped deal with these situations in real life.

    History is a good idea. I missed out on the CS history elective when I was at Uni, but I can envision two independant historical subjects:

    * History of logic – eg. Godel, Boole, Hilbert etc.
    * Modern history of Computing – Drum/Bubble memory era batch computing, the invention of GUI at Parc, History of modern operating systems (Unix, OS/390), the rise of personal computing (Apple ][, Macintosh, IBM PC)

    I’m looking forward to seeing this document mature. Feel free to invite me to lecture 😉

    Speaking of lecturing, I’m giving a guest lecture this week at Sydney Uni on workflow systems. The first hour will be theory (FSM, Petri Nets etc.) and the second will be a practical implementation of workflows using OpenACS.

  34. AC,
    Just a sec, GPS(NAVSTAR) was a DOD project ran by a guy that got his BS at the Naval Academy, MS at MIT (score!) and PhD at Stanford. Incidentally, this work was started 7 years after he left Stanford. I do not know where CAD was developed, but a prototype for Autocad called t-square was developed at the Univ of Arizona (obviously a technical heavyweight).

    Admittedly, great things come from MIT (where would we be without Bob Metcalf?), but not every university grad student is going to develop ‘the next great thing’. I suppose that I am a little set back by your romanticising of university as a purely academic exercise. I believe that university is a service to both the student and the society that it resides in. Failing to serve these users in favor of an academic ideal is hubris.

    Personnaly, my early failings in college are mainly my own, I failed to get excited about wiring and gates, and as a result opted to drop out and start a family. Pretty misguided, but I do believe that the school that I attended failed me in some small way.

    I am really excited by the comments that Philip has offered in his paper. If you can find some of his wrting on the training methodologies employed during the Arsdigita gambit, then I think that you may get excited by it as well.

  35. “I see some very short-sighted posts here. A software engineer needs some talent, discipline, basic skills and some experience. But most importantly, he or she needs to understand, respect and care about the problem to be solved, the users of the program, the co-workers and the job.”

    Absolutely, AC. And the problem is that CS programs provide none of these things, and the ones I’ve had the most exposure to (by having to work with their graduates) actually destroy them to whatever extent they were present before.

  36. Gary: Bob Metcalfe was an MIT undergrad but he went to grad school at Harvard (where his PhD thesis on ARPAnet was rejected for not being sufficiently theoretical). We MITers take credit for Ivan Sutherland’s pioneering work on virtual reality but his lab was actually at Harvard. And of course both of these guys got their educations before there was a real CS program at MIT.

    Mark: I’m not a fan of pigeonholing HCI into one class. On the one hand there don’t seem to be enough always-true principles to sustain student interest for a whole semester. On the other hand it seems like HCI principles need to be taught and reinforced on every project every time for them to be regarded as something more than a frill.

    Ryan: Your idea of learning everything on the job and getting “internships” may not make sense in an economy glutted with labor. I have a feeling that fewer companies will be wanting clueless interns running around when fully trained programmers on the other side of the globe are available for $5,000 per year.

  37. Let’s we leave all vocational training to vocational schools. Universities should continue to focus on rocket science. And the society should continue to fund these programs even when they don’t produce results that have immediate impact.

    The reality is that the world does not need all its people working. The USA produces more food than it could consume. Yet some people are starving. We can train them and give them jobs. But we really don’t need them to work. We could still feed them though, like we feed the graduate students of Comparative Literature.

    So why is it that when a 18 year old chooses to study Computer Science, his goal must then be a programming job? (Some of my EECS friends are now doctors and lawyers). Why should we be different from those who choose to study poetry?

    Here’s another angle: we are keeping the kids in college and master’s programs so that they don’t roam the streets and become criminals. Let’s face it. School is just a place for baby sitting. Because our world is now so productive and efficient, the babies are getting older and we don’t need them to work. So it doesn’t really matter what we teach in college as long as we keep our world safe.

  38. Phil, point taken.

    What I’m am trying to get at is that programming skill is easy to come by. And for that reason, it’s cheap. However, business or industry knowledge is harder to come by, and for that reason it’s more scarce and valuable.

    For example: I’m a consultant. I charge many times more than my competitors overseas. Recently, I picked up several contracts from a company that had outsourced to India in the past. In these cases, I happened to know the business very well, so my hourly rate was far greater, but the total hours (and headaches) were less.

  39. If you do enough research, you will probably find that much of your software has been written before by somebody else.

    If you do enough research, you will probably find that most of this discussion has been discussed before elsewhere.

    “All the words come back to me in shades of mediocrity,” unless universities teach creativity and innovation instead of simply job skills. Think about it. Phil’s new college curriculum should stress the programming technology in vogue (at least) four years from now. That may not necessarily be Java, OOP and deterministic polynomial time algorithms.

  40. I think that a lot of the misunderstandings on this discussion center on the nature of computer science, both as a practice and as a word.

    The word ‘science’ would seem to imply that there is a study of fundamental rules, that we might define the physics of our universe, the biology of our life systems or the psychology of our interactions with others.

    The practice of ‘computer science’ is little more than the use and development of tools. These tools may be used to study physics, biology or psychology (and many early adopters of computers came from these disciplines), but they are merely tools. As tools, their usage and development will probably more resemble the patterns of middle-age craftsmen guilds than academia.

    So, why have universities put themselves in the business of training people in the use and development of tools? Because we need them to… But, also because these are pretty ‘high-end’ tools and you really would like to have some really smart kids involved in their development.

    Someday, maybe, the ‘usage’ of computers will disappear into the fabric of our existance so that we will not have to be ‘trained’ in their usage. Until that time comes, universities will have to shoulder the burden that they have chosen (and are well suited for).

    In the mean time, if you find some art in your efforts, or feel like a ‘genius’ when things really start flowing, then go ahead and call it art, science, whatever… But, don’t let your feelings get in the way of others’ progress.

  41. As an electrical engineer who has spent almost 20 years writing software (mainly applications for other engineers), the concept of learning by tackling non-textbook problems along with the appretince-mentor method of teaching deeply resonates with me especially since my engineering education emphasized the solving of problems that forced and got students used to stretching and synthesizing the theoretical material. Unfortunately, I think you would need a much larger corps of instructors at probably a higher level of practical mastery of the course material (theoretical mastery is assumed since it exists in droves now).

    So, what would you get if you turned out such “super-students”, ready to tackle not just the development component of a project but fully capable of identifying client needs and doing any necessary invention along the way? I believe you would have a whole lot of software engineers who would be unemployable today! This is because the value of software development has been purposely driven down to the lowest common denominator by those who employ the vast majority of such people in order to short-sightedly reduce costs. The market prefers 100 cheap programmers than 5 master craftspeople. Some more enlightened places are trying to have a few expert folks guide the work of the low cost armies overseas but I have seen repeatedly how companies cannot figure out how to make this work. Most of those who pay the bills just don’t recognize large differences in experience or training and don’t see this as a critical capability to develop.

    This current culture will be very hard if impossible to change and if it will change it will take a long time. Instead of developing superior software professionals we should be cranking out professionals in fields that the economy truly rewards, like plumbing! 😉

  42. First a bit about myself. I studied CS at a liberal arts college for 3 years and hated it. I dropped out and took a position as an application admin for the engineering dept at the company I had interned with for 2 summers. After doing that for 3 years I decided I was ready to finish my degree, so I’m currently a full time student on top of my salaried job.

    Part of the reason I decided I wanted to go back to school was that as I worked on more projects, I was starting to see the value in the CS courses I had taken. Language theory in particular has made it easy to pick up the half dozen or scripting languages I have to work with daily.

    Looking at the curriculum at my current University I have a few responses for Philip:

    1) I HATE being led by the nose through new material. Right now I’m taking Computing 3 (introduces C++ and OO) and Assembly. In both cases, we are presented with a slow gentle introduction to the material topic by topic. There is rarely an equivalent of this in the real world. I would be learning so much more if we just dove into the material head first. Force us to sift through manuals and API documentation. Give us some ugly legacy code and have to maintain it.

    Not all programming involves building a new app from the ground up. My company (hardware vendor) is in the process of re-building our software from the ground up based on current technology. It was outsourced! From what I can gather, the plan is that the in-house team will be responsible for maintenacne and extending it once it is actually built.

    2) More exposure to less ‘academic’ topics. GUI was mentioned above. I would also add security. Every graduate should know how to produce safe code. I think someone mentioned above that Microsoft prefers to hire directly out of college (can’t seem to find it now). Is it any coincidence that their programs are notrious for bugs?

    3) The major thing that has always bugged me about traditional education is that teachers often feel the need to dwell on a topic until everyone in the class understands it. Maybe it’s just my ADHD…

  43. RE your comment on pigeon-holing HCI into a class. They’re good points.

    The way the course deals somewhat with your concerns is that it had parallel lectures and lab classes : as the students learnt about empirical testing they ran their own mini-usability lab; as they learnt about proto-typing we taught them cgi and tcl/tk programming and gave them an assignment to design and prototype a product. You can build all the skills together into a final project, and all HCI projects lend themselves well to group work.

    If you’re interested, email me and I can send you some of the course material that is public.

  44. Another options is to get them all security clearances so they can work on classified projects that can’t be outsourced and thus enable them to suck off the tax payers teat for decades to come. 😉

    That’s at least as effective as the “give them more open ended group work” answer that we’ve been hearing for years that Phil is suggesting. 😉

  45. When I was a CS major I observed two general types of students. The first lived and breathed computers, you couldn’t get them to *not* write code, they contributed to open source projects or started their own, they always had pet projects, and they had active online presence. The second type was in CS because they heard it was a way to make a good living (this was in the run-up to the bubble, I think the usual phrase was more like, “a lot of money”). Regardless of what the school, the professors, and the curriculum do to turn these two groups into CS graduates, the first group will always be better programmers, engineers, what-have-you, because they *care*. They invest in upgrading their skills.

    And in some ten years of industry experience, I still find that “what are your side projects” is the most revealing question in an interview. Too often the answer is a blank look. Sometimes those applicants can be trained, but you’re starting from scratch. If someone isn’t interested in computers enough to work on them for fun in their spare time, you can’t really teach that with any curriculum.

  46. ‘Graduates are not very experienced with quickly making sense of large commercial tools and libraries and writing small pieces of code that control or extend those libraries. The result is a tendency to start from scratch or rewrite code that is not fully understood rather than reuse’

    The problem here is that no university is teaching how to read/understand existing code; In the C++/Java field few projects are really written from sratch (unlike EXCEL/FLASH scripting, where you do it all on your own). Reading code is a skill that is often called for, yet few people can do it.

    Also, i sometimes sense a feeling of uncertainty/fear on the part of co workers, when they have to look at code that is written by somebody else.

    There really should be a course/probably coupled with one that teaches software architecture (enginering choices like ‘data/table driven architecture’ vs ‘procedural’ etc etc), where the skill of reading/understanding code is practices.

    i have written some words on this.

  47. Michael: I think to describe the offshoring of hundreds of thousands of jobs already as “a phobia” is a bit of an understatement. The current CS curriculum was designed 30+ years ago, when foreign programming labor was not an option for American corporations. So it didn’t matter if a CS grad wasn’t a true software engineer as long as he or she was better than an English major. Today, however, the American CS grad needs to be somehow better than his $5,000/year counterpart in India or China. A friend of mine who sold his company to Intel moved to Shanghai to supervise a team of young newly hired CS grads there (Intel had a hiring freeze on American labor). He now says that he thinks it would be crazy for someone to hire American CS grads to work in the U.S. In his view their skills are not up to their costs.

  48. The type of curriculum you describe would be appropriate at the Devry Institute of Technology.

    We don’t train auto mechanics or plumbers at prestigeous 4-year universities, so why should be continue to train code monkeys in this way? Actually plumbing or auto repair is probably a more lucrative career path as these functions are inherently difficult to offshore.

  49. As a CS degree holder, my feedback regarding CS degree would be along the following lines:

    * Concepts, not languages and specific platforms. It seems too many CS graduates these days, at least IMV and XP, are filled full of langauge (C++, Java) knowledge but deficient in the study of algorithms.

    * Data structures and data persistence in a multi-platform, fully interconnected world.

    * Ramifications of office and desktop software and how CS pertains to the average user life.

    * More study of ethics and interpersonal relations, managing global teams or participating in global efforts.

  50. The way to make students learn others code is to have them grade each other’s work. When I was a teaching assistant at Berkeley, I tried to make sense of every fragment of code so that I could give partial credit to the struggling students. Incidentally, the two football linemen in the “Lisp for Poets” class did relatively well and were drafted into the NFL a couple years later.

    So now you know: some professional football players are decent programmers. We should teach programming by promoting football.

  51. I am a recent graduate of a computer science program at a liberal arts university. In our program, we never had a software engineering concentration in our studies. The goal of the curriculum was to establish a broad-based foundation of understanding about the academic side of computer science. The belief was that it is much easier to pick up software engineering principles outside of school, than it is to pick up computer science principles as a software engineer.

    This approach certainly has drawbacks, as you mention in your article. Developers graduating from this program are less prepared for their first job than graduates of other programs which include more work experience. I certainly could have used experience working with groups over the long term on the same project — and experience interfacing with people from other parts of a company, in order to fulfill a business goal, not an assignment.

    On the other hand, I like to think that my broader based education will be worthwhile in the long run (assuming a graduate like me does get that first job eventually). It took me longer to ramp up to full productivity initially, but with a firm understanding of computer science, I hope to be able to learn new skills more quickly than if I had a software engineering / real world based education.

    Will a graduate of the school you propose, Philip, be well equipped to take control of his or her life, and continue to learn and adapt throughout life, or will the graduate be only equipped to act as a cog in the programming wheel of a corporation? What happens when the work world moves on – will a graduate be equipped to adjust to the demands of a changing work environment?

  52. Josh: I’m not sure where in my article it says that computer science principles are going to be dumped from the curriculum. The goal is to teach all of the same principles and theory but do it in the context of open-ended projects rather than straightforward problem sets. Both students and faculty will have to work a bit harder at the school that I propose but otherwise it is pretty much the same old same old. For example, instead of taking a class on public-key crypto you might build an electronic ticket system and, as a subtask, have to learn all the textbook public-key crypto principles.

    It is not about chucking the principles. It is about students who’ve learned those principles while acting as engineers instead of having those principles spoon-fed to them.

  53. How can a graduate be equipped to adjust to the demands of a changing environment when they’re by definition unequipped to meet the demands of the _current_ environment?

  54. I am just finishing an undergraduate degree in computer science at Stanford and I have spent quite a lot of time thinking about this issue. I am from Bermuda and was involved in a project in which Stanford wrote Bermuda highschool computer science curriculum (see bermuda.stanford.edu). Of course that is very different from a undergraduate program.

    In my experience, one of the deciding factors in undergrad CS is how well someone can adapt to the geekiness of it all. Very little of this is taught. Let me be specific. If there were classes which taught:
    CVS, VNC, SSH, Linux stuff and so on, students would run into so many speed-bumps while learning to program. I have found that classmates have a strong grasp of the various technologies surrounding CS, the developer culture, do much better. For instance, it is much easier to understand an OS course if you are familiar with process ids and forking threads. At times, I have felt completely disconnect from real technology when writing programs for class. Just a few thoughts.


  55. The best parts about my CS education at the University of Manitoba (Canada) were the following:

    1) Electives! A few years ago the department put a cap on the amount of CS and math that students are allowed to take. This was in response to CS students graduating having only taken CS and math classes. The product of such an education was a non-rounded individual lacking the much desired “soft skills”. The new rules dictate that at most 3/4 of my classes can be CS and math. In response to the change, most students have pursued minors in unrelated fields, ranging from (most common) management to philosophy to film studies. On top of my impressive array of CS knowledge, I am graduating with knowledge of accounting, finance, business administration, economics, psychology, and political science. I like to think that as a result of taking non-CS electives I am fairly well rounded individual!

    Remember, there is more to being a being a software developer than cranking out code. Any one (including people in India willing to do so for much less) is capable of writing code. To be successful in the industry, one must have the soft skills.

    2) Co-op! The U of M CS program has three co-op work terms. I did all three of my work terms with North America’s top financial planning software company. I spent one work term in the general development group cleaning up the UI, and two work terms in the Enterprise Architecture group working under the guidance of the company’s software architect. As challenging as an academic term is, it is nothing compared to working with the industry’s top talent. After twelve months full-time and four months part-time with this company, I have a very impressive resume. Not to mention a guaranteed job with a booming company.

    Just a few comments off the top of my head….

  56. I am currently a striving undergrad (striving against my utter lack of study habits out of high school) and, as such, I have a pretty fresh idea of what I would like to see in the curriculum. As the paying customer for this education, it is my opinion that *I* – not the industry bobble-heads – am most qualified to determine what should and should not be in the curriculum. On the other hand, I am “only” an undergrad, and lack much of the experience that you and other successful grads have acquired – in which case you may be inclined to discount what I have to say.

    My first observation of public institutions and programs of study for computing is what I have already mentioned. A lot of effort goes into seeing what IBM, MS, etc. want of education in terms of the worker-units it produces. Almost no [real] effort goes into determining what the students (we who are paying for the education) want from their education. It is, after all, *my* education – not IBM’s.

    The second related observation is that there is _way_ too much campus access granted to these companies. No matter what public university I go to, I have a feeling that, at least as far as CS, CSE, and IT go, I will be attending the University of IBM, or the University of Oracle, or the University of Microbrain. Not acceptable. Period. Education and business should be separated by a law. A law which first and foremost should eliminate these disgusting corporate payoffs – er, sponsorships. The involvement of IBM and MS in public universities is very discouraging to me. I do not want to work as a code monkey for a giant crap factory. Work is not the goal of university.

    Other observations:

    1) I find professors who know technical details but do not know how to organize a class – these are professors in what way exactly?

    2) I find professors who have never worked in the industry, and really don’t have implementation-level knowledge, yet are excellent instructors – while this is far better than the problem mentioned above, we need to keep these professors outside of classes on such subjects as software engineering.

    3) There is no mentorship. What else is the faculty for except to be mentors? If a lecture is all there is, I could go to the library and read a book.

    4) Problem sets are either too simple and easy, or too time-consuming and equally easy, or completely out of the reach of my present level. The words optimal challenge zone come to mind – but apparently not to curricular planners.

    5) Despite over 40 years exposure to computing as a course in one form or another, universities still haven’t recognized the difference between computer science, computer engineering, and computer technology (my term for IT). These are different disciplines within the same field. If I went into engineering, I would not meet the similar difficulty to distinguish between general mechanical engineering, civil engineering, and aeronautical engineering. 40 years is an awfully long time – let’s get it together already.

    5) Perhaps this is not the case everywhere, but I’d like to point it out anyway – in classes which lend themselves to lecture format, let’s separate lecture from recitation from office hours. When I pay for this education of mine at public school, I do not need to listen to Billy Ray’s problems with installing Linux. After class – not during. “Interactive classes” for lectures in public (which is to say, not overly-selective) universities are a bad idea, serving only to encourage haphazard and disruptive conversation. Many universities get this right. Questions are for after class, during office hours, or in recitation/tutorial – not in the middle of a well-timed, dense lecture. Again, let’s get it together already.

    6) It is an amazing frustration to see professors who are unwilling to learn new things – most of all professors of computer science/engineering/technology. Fix this, please.

    7) Java/C/C++ is not *the* programming language. There is no reason that a programming language choice in a curriculum should ever need to be changed – education is precisely the place where a PL/I (i.e., a language which offers all things to all people) could be of some benefit. On the other hand, instead of sticking to one language, one could teach with many. The problem is, when IBM interviews us they want to see depth of skillset rather than knowledge – this is the tail wagging the dog. If IBM wants me to know something, that’s what OJT is. My education is for education, not job training.

    8) Undergraduate research. This is the proper forum for job training in education. Most universities that offer such undergrad research only offer it as a check-in-the-box for a survey form to show to people, saying “we have x, aren’t we great” – no you’re not great, you’re worse than useless. What we learn about the job in this job training is that most of the time we sit around doing nothing – nothing, not even thinking – because the research head won’t tell us what it is we are attempting to accomplish, and won’t support independent effort. Three months for naught. And so we already hate project managers. Well, ok, maybe this is good job training, but you see my point.

    9) Homework is haphazard. Sometimes there is none. Sometimes a ton. With little or no concern for the time that must be spent in other courses. It seems that professors dawdle and dawdle in the course, only to assign a stack of work at the last moment in order to catch up. Not the right way to go about catching up, but….

    10) …that is still better than leaving out a solid chunk of what we were supposed to cover in the course. When this happens we get to operating systems having only ever been exposed to Java, and now we need C, even though we were supposed to get a transition in some programming course along the way to aid the process.

    11) Then the course in which we need to catch up is a good candidate for a two-semester course, but they decided to “save time” and condense it, so now even those of us who know what we missed begin a tough course lagging behind because the professor is forced to do some “review” which was of course unplanned and therefore inefficient, and when midterms come along we have covered all of about 1/10 of the course content, but it still will be on the exam – or, even worse, passed over.

    I would like to comment on this notion of group projects. From my viewpoint, this is a bad idea with our current education system. Why do I want to entrust my grade – even partially – to someone I have either never met, or have, and know to be less able than I? I mean, I realize that I would have to work with such individuals, but then I am getting paid, and if the project flops, the boss has only himself to blame for hiring such people, but in school there is no boss, and I am not being paid to deal with stupidity – and on top of that, I am earning a diploma – not that _we_ are earning a diploma – *I* am. Very unfair – life isn’t fair, you say? Well, when life is unfair and I have paid for fairness, I sue your butt into the dirt – to make it fair. Let companies pay for this in-group training, and on their time, not mine – they stand to benefit, they want it, they pay for it.

    There are many things lacking in many ways, but I think the majority of the problems could be solved by recognizing the difference between the three different disciplines in computing, altering the programs to suit such realization, and then allowing students to choose a “track” which focuses on one of these three or some area of one of these three, and, perhaps most importantly, fostering a community – amongst faculty, amongst students, and between faculty and students. Not forcing it – supporting it. And mentors. Faculty mentors most importantly, and only after that, industry mentors.

    If I want to be a mechanic, I have two possible tasks. One is education. Maybe I go to school to learn the theories and standards of mechanical engineering – to be a *really* good mechanic. The second task is to learn to do the job that must be done in the place in which it is to be done – this is called job training. For that, I get a job. Now, nothing says I have to do both tasks – nor that I need to do either before the other. Same with computing. If I want to learn how to use a database (!!???), that is a waste of my time in the university. Every place uses a different database, every place has a different situation – industry should be training its employees for this, not making us pay for what I could learn in 20 minutes from a manual or a memo about procedures at XYZ Corp. And so then I pay to learn Oracle databases, then get to a place using MySQL, or PostgreSQL, or dbase, or god knows what else. Umm, hmm. Am I the only one who sees a major, show-stopping problem with that? What if Oracle doesn’t cover all the bases, theoretically speaking? Then some company who doesn’t use Oracle (there are more that don’t than do) is now stuck not only training me in their favorite fad DBMS, but also in re-educating me. That’s just nonsense. And then next year there’s a better DBMS and Oracle is past.

    Learning Oracle, learning Java – these are things for IT certifications. In university, I want to learn database theory and design and programming in the main. Then when I get to a workplace and they say “Do you know how to use Excel (or Oracle or gcc, etc.)?” I can say “Yes I do, first I read the little manual then I point the little cursor to the little Excel icon, then I click (or double-click) – voila, I am running Excel. Give me five minutes and I’ll do your payroll in it if I can wade through all the bugs and poor documentation fast enough.” or something like “No, but I can program something better that will be more interoperable with other programs designed to be the same, and what’s more, I can customize it exactly how you want it, and eliminate the need for an user to touch it by coding in a little expert system.” “Well, I am sorry, you have no training, I can’t hire you.” Yeah right. Give me a break. I’d rather be educated than trained to be a worker for these idiots who run companies looking for “an Oracle database administrator”. If I wanted to work in one task like that, I’d skip college and get a job straight away. For jobs like that, college grads are usually not as good as the ones who just walk in anyway.

    In short – what I would like to see in a CS curriculum is more and better curricular content and instruction, and *no* job training.

  57. Phil, I’d like to offer a few comments on your article.

    First, a brief bit of background about me: B.A. Philosophy from CMU (roughly half of my coursework was in math or CS), 14 years professional experience as computer sys admin/network engineer/systems programmer, two classes (and one thesis) short of completing M.S. in Telecom from UPenn. CCIE. I’ve lectured at Penn and helped to design the class curricula in for the first TCOM lab course they offered.

    My theory of university education: it should be to teach critical thinking and an appreciation for human achievement. The thrust of undergraduate education for the first two years should be basic subject mastery and critical thinking skills. The next two years should focus on original research, perhaps with a focus one year on pure theoretical research and the other year on applicative research in an inter-disciplinary fashion.

    Job training of the type you seem to be advocating is something more apropos to “tech school” education ala ITT Tech. There is a real lack of appreciation for the type of value these institutions offer in our society. These types of schools do focus on marketable skills acquisition. They could be improved through the use of more thorough education in “core concepts”, rather than *simply* learning how to use the de facto industry standard tool for solving common problems. If this is what undergraduate education is going to become, then let’s drop the pretensions and the prices as well. And by all means, let’s make it a 24-month year-round program. We’re talking skills training here, not intellectual development.

    Also, another focus that these tech schools should bring to bear is some rudimentary business training. As the US economy continues to transition from a manufacturing economy to a service economy, the average business size is going to continue to decrease. Students need to come to grips with the reality that they are likely to be best served by either being their own employer – or by knowing enough to judge whether or not their empoyer is running the business properly.

  58. Does anyone remember the EDS, Rose Perot, training boot camp? It was written up in the WSJ; this was in the early to mid 80’s. Lets forget for a moment about the EDS work environment, the educational training was unique in that they pro-rated the cost of the 6 months of education over 5 years of work (you worked 4 years and left, you owned EDS some money). They had two tracks, systems or application. When I started in this field, it was common practice for businesses to hire people with business or science skills that complimented their businesses (you’re automating a process you should know something about it), then the very first thing they did was instruct you, in their environment, on the specific technologies they used, anywhere between a month, 6 months, to a year; perhaps maybe not all in one shot. IBM and Amdahl had some awesome courses, plus there were the technical organizations where you could get specific knowledge and share info with others. Some of the best programmers over the years didn’t have formal college education, but were smart, enthusiastic, and could pickup news information really fast and apply it – and age has nothing to do with that. For this type of person, college would have ruined what made them unique and productive. In other words, I would not necessarily hire a CS graduate over a non-CS graduate, it depends. Although these same associates required good, thinking managers. I think we have a management crisis. Old but good books: The psychology of computer programming, Becoming a technical leader, Mythical Man-Month, The Silverlake Project.

    PS: I read where the DOD over the course of the next 5 years will be losing over half of their IT staff due to retirement, and they are looking for those 30 and under (argh :-(). Their biggest concern is that these individuals won’t like the office environment and business rules.

  59. I like all the tension between formal education and skills training. I think it’s an important tradeoff to consider. If the goal is to train software engineers for the corporate world, then is school even the right place to do it? Why not at one’s first job, like they do in Germany?

    In any case, one someone starts the skills training part of their career (whether during college or an early job), the most effective approach may be akin to the case method of business schools. Because software engineering is so complex and creative, there is no right answer. It’s more important to learn how to juggle information and people and produce something good enough in the time given, with the ability to adapt to changing requirements. That’s exactly what experiential learning provides.

    It should be no surprise that some of the most talented programmers I know learned how to program in consulting houses, where they worked on dozens of projects in a short time. Talk about opportunity and incentive to learn good software engineering practices! It only works if your mentors are talented, so I urge future programmers to be selective in that regard.

    This sort of thing can work in an academic setting as well (not just a job), but it’s different from mainstream undergraduate programs. If you want to add some software engineering skills to a computer science degree (that’s what I have), why not do it as a rapid series of cases at the end of the degree? Like many folks, I only did one “senior project,” but I would have benefited from doing several in rapid succession, and ones with real or at least realistic customers at that. If you are a college graduate and don’t get this sort of multi-case experiential learning in college or interships, take my advice, and seek it early in your career — ideally no later than your first job!

  60. > Methinks thou dost confuse education with skill training. Computer
    > science should be more concerned with the fundamental science of
    > computation.

    Makes me laugh. One of my professors at NYU told me that he isn’t interested in students getting a job afterwards. He said this (NYU) is an academic institute not a vocational school. Yes I’m sure he doesn’t care but his student doesn’t realize it until it too late – sitting in the technical interview. My professors were too worried that their graduates would embarrass them (NYU) in graduate school more than the students standing in unemployment line.

    No, I don’t think that professor (nor few other) actually had worked in the industry. Fact remains vast majority of CS students are ill prepared for their future.
    By its very nature programming is more like solving puzzles than creative writing – yet CS is taught like creative writing (language, outline, structure, etc.) or pure science (narrow set of variables and often ideal conditions). Even EE is nothing like CS given EE often just design components and leave “glue logic / problem solving” to software. I’m not trying to offend the EE. I tried learning analog electronics for years and just started “getting it” when I finally got my first Oscilloscope. Yet I was “doing” assembly programming the 2nd month of my programming hobby. I’m just saying they are different mindset.
    There are just very few who are problem solvers and the rest who are not. Just like music / art student are required to show evidence of proficiency BEFORE being allow entrance to the music / art school, so should the CS schools. I don’t believe that general puzzle (problem) solving can be taught to people without natural proficiency. That is not to say that CS cannot be taught. I could learn to play the piano but not to the point of being employed in an orchestra. The same goes for CS.

    I believe my CS was no way preparing me for the job market. But given I was already writing game programs on my home computer in HS, that didn’t matter. My diploma was just a formality.

    Coops and internships help, but that’s something that the students would learn eventually after graduation. Consider that CS with Coops works well. On-the-job experience works well. CS education often doesn’t work well. So the truth be told “on the job” experiences are more important than most pure academic CS education. In which case companies like Oracle, Borland, MS should handout degrees worth more than CS from universities. But the question is “how to fix CS” not “how to suppliment CS with Coop.”

    EX: If I have to get job experience at the local restaurant in addition to my culinary degree, why bother with the culinary degree (assuming all the cooking styles and methods from the school are useless without the restaurant learning – because that’s what’s happening with CS)?

    > For example, should we consider development of personal values, ethics,
    > character, and spiritually? Should software engineers be well-grounded in
    > philosophy of logic, critical thinking, ethics, metaphysics? What about
    > health and physical fitness and diet which enable more mental, as well as
    > physical energy?

    Oh God here we go. We are talking about students graduating with CS degree who can’t even program and this person wants to know about philosophy, ethics and metaphysics. You can require philosophy to CS students when you require CS to philosophy students. This reminds of all my college administrators who felt science students should master college level humanity courses, when the administrators couldn’t do high school math and science. Yes they should (master college level humanity course), but the administrators should master college level match and science too (and show proficiency regularly). Oh how I would love to push CS courses to humanity groupies. Oh how I would…


  61. A bachelor’s degree is like a black belt in karate – it doesn’t mean you’ve mastered the subject, merely that you’re ready to start learning it.

    Unfortunately, students are expected to get jobs after graduation, which highlights a flaw in the computer science program… and every other program, except perhaps teaching. The truly able will get past this in any case.

    We always hear of the catch-22 – nobody wants to hire a new graduate because the graduate has no experience, but how should the graduate get experience? There’s no answer to this, yet people have been surpassing this hurdle since people existed.

    Computer science *should not* be an in-depth exposure to Oracle, Windows programming, and It’s an opportunity to hone critical thinking skills from a computer science perspective.

    I agree that some newer skills should be taught – debugging, DBMS, networking are some to which I would give some exposure.

    Someone said something about those who have and those who don’t… he’s right. There should be a pass/fail test for people who has the innate skill to do this work. The others (in my school, these were usually females with little programming skill but a great smile) who be weeded out. I think that some schools are very successful at this, some not.

    Updating.. yes. Overhauling… no. Believe it or not, those very theoretical skills you learn in college are used when you go deeper into the field. I see and use things like code decompiled into assembly… network tracing that shows the traffic between computers… reverse engineering. Yes, all of this can be learned outside of school, but school emphasizes these fundamentals. Corporate work does not.

    In a nutshell: if you want to work at a company all your life as a programmer, just learn it on the internet. If you want to be at the top of your game – a designer – a top-notch engineer – someone who thinks of the new ways to acheive efficiency – stay in college.

  62. > First of all, the word “Computer Science” must be dropped because
    > “computer science” never existed and will never exist. It’s an oxymoron.
    > A real science, such as physics or chemistry, is the study and the
    > discovery of physical principles that exist in nature.

    Oooooo. Sounds so intelligent. But the word SCIENCE (in computer science) means “systematic knowledge or practice” – not the “system of acquiring knowledge based on scientific method” – Wikipedia.

    ” Computer science is considered by some to have a much closer relationship with mathematics than many scientific disciplines, with some observers saying that computing is a mathematical science. ” – Wikipedia – See Peter J. Denning

    Assuming (Computer) Science implies the limited definition of science is like assuming OXYMORON refers to morons. 🙂


  63. How about Computer programs focused on solving specific problems? Doesn’t Waterloo in Canada teach compiler design and development to most of the compiler builders at IBM? Instead of learning really simple lex (flex) and yacc (bison) structures, they actually have to build the tokenizer, the language grammer parser (in multiple forms ), the code generator, the opitimizer, and the machine language (or intermediate language in Java or Microsoft).

    The problem is that the world is too complicated now to just teach computer science. A truly successful developer has to not only master the computer skills (in Java or Microsoft, or Unix or Linux, or Apple), but also a “problem domain” (compiler design, GUI development, operating system entensions, game development, payroll processing, tax return processing, or in my case Pharmacy adjudication and reconciliation).

  64. That idiot here who posted that CS students and workers should always have pet projects–YOU’RE FAT, HAVE NO LIFE AND NOBODY (WELL MAY BE YOUR UGLY FAT WIFEY) WANTS TO DATE YOU. You’re a loser and a jerk.

    Sorry, job or school consume enough time and leave none for pet projects. I like to work out or make art or party and live life in my spare time. If you’re fat, unfit, lacking muscle and fitness, disgusting blog of a nerd……good luck. I’m from Russia, btw, CAN write code, know my math, know my C++ (we Russians are better than American programmers anyway…); my family consisted of prominent engineers and university professors for generations–thanks to that I know that wasting your life on “code and code” isn’t worth it. Do your work and live LIFE after that, real life, not 2nd life or fake one–you only live once. Don’t let people with OCD or schizophrenia who can’t have social interactions or fun tell you that your life should be only code or you’re worthless and don’t let these people drive the industry (there’s no need for super-fast tech progress at all–we ARE fine the way we are).

  65. CS school is for development of thinking skills, that can be applied to various areas of technology and theoretical concepts of CS. “Customer satisfaction”, “useful software”, etc..–well if that’s the way you’re thinking, why don’t you just go train to be a car mechanic? Heck, CS is a SCIENCE, just like any other one–a science at its beginnings (wait till we start making really smart computers that grow and modify or improve themselves). If you want to be a programmer as in “trade”–go to community college, they offer tons of programming classes. Write open source, etc, be a code monkey, whatever. Good CS program requires excellent coding skills btw AND theoretical skills/math on top of it. “Pet projects”–well some people do them, some don’t… those who do them often have to develop advanced scheduling in their brain to switch between memories of having a life like 5 years ago, coding, and thinking if probability of them getting laid within next 10 years is significant enough to be considered non-zero.

Comments are closed.