9 ms·
Joel Spolsky, Snake-Oil Salesman
- imok20 17y agoWhile some of this makes sense... this "Undergraduate courses lose their technical currency in something like five years on average" sticks out like a sore thumb. How well would we be served if C were taught in undergraduate programs? In depth. Add to that a Lisp and Java, and who knows what we would be capable of in a shorter timeframe? C and Java have not gone obsolete, and along with Lisp, many different paradigms of programming are taught. Not only that, but technical skill with important and oft-used languages would be transferred. I add Lisp simply to include another paradigm and because it's an old concept that's never really gone away, and seems to be gaining traction (see this site, see Clojure, see the continuing development and expansion of Scheme and CL and Gambit etc etc.)
- markdennehy 17y agoIt does stick out... but apparently too far as it blocked out the following qualification "(obviously different sectors age at different rates – web programming has a very fast cycle, embedded systems a very slow one)". C is a systems language, it's been around forever and is not about to be replaced anytime soon, possibly anytime in our lifetimes. It's too good at what it does. And that's why it's taught in a lot of universities. As is Lisp, for the reasons you mentioned. As is SQL. As are several others (though I'd disagree with Java myself because it's really more set up to do things than to teach things and there are too many shortcuts in there - but many others disagree with me on that point :) ). I'm not for getting rid of established languages from courses. C is 37 years old; C++, 30 years; Lisp, 51 years; Objective C, 23 years - these are well-established languages that won't vanish in the four-year span of an undergrad course. Java at only 14 years (and so many releases that stability is a valid question) tends (to my mind at least) to mark the start of the gray area there. Some though, like Perl and C++, are really hard to teach in compared to others and that can outweigh their stability as a factor. Still though, I look at languages like Python and would love to work them into a course. But it is still a risk for the students. Maybe for the final year work though. But teaching a four-year course using Ruby as a primary language, intellectually interesting as that sounds, is an unethical act at the moment. It's a beautiful language, a real joy even to read - but what the students start learning on day one may not be around, or be a useful thing to know for the jobs they'll pay their mortgages with four years down the line. That's the responsibility the university is taking on when it creates a course. The student invests four years of their life - the university must produce a return on that, and conservative thinking is needed for that.
- imok20 17y agoAnd that's exactly the problem. In liberal arts educations (such as the one I'm receiving) or even at universities such as MIT, Python is the language of choice. It's great fun to teach, very easy to learn, but it's not an industry standard, and many would argue that it's too easy to use.
- alexgartrell 17y agoBeing the introductory language of choice doesn't make it the language of choice. MIT kids learn the real stuff too.
- sketerpot 17y agoPython is "the real stuff", and I'm always annoyed by the snobbishness that leads some people to dismiss it. Python is an excellent language, with a large user base, and some compilers in the works. Just because C is hardcore and Lisp is amazing and Haskell is mind-exploding doesn't mean that Python isn't a great language.
- brown9-2 17y agoAre you really saying that Python is "not useful"?
- imok20 17y agoThat was a mistake: Python is QUITE useful. But I wouldn't call it an industry standard. Corrected.
- dagw 17y agoReally? Python seems to be showing up everywhere I look. I don't think I've seen any largish company in quite a while that wasn't using python for something somewhere.
- markdennehy 17y ago
- spamizbad 17y agoIt's easy to point to Java and C as stalwart success stories in hindsight, but I can recall with Java there was a tremendous amount of histrionics from the C++ and VB crowd claiming that Java was merely another passing fad. C faced down Pascal and COBOL, two languages which were considered far more favorable to programmers at the time. ---- I feel sorry for CS/CEng departments these days, as they're facing pressure from both sides: The industry wants more vocational-style training, and students want "real world" experience but also want a world-class western liberal arts education. It's as if their idea of a perfect school is one with the prestige of Harvard married with the curriculum of DeVry. I'm afraid you cannot have both.
- imok20 17y agoI can't imagine a better course than writing a Lisp interpreter in C, and then a Java implementation in Lisp. They're clearly not fads, they're clearly useful, and the kind of knowledge and education that doing such an exercise would require is exactly something that proponents "world-class western liberal arts education" would laud. It can work, it seems to me.
- lg 17y agoC/assembly to learn about the machine and because they're everywhere, Lisp to learn about all the paradigms, and a popular scripting language if you need big libraries. Java is so ugly, it'll just confuse them. It confused me, anyway.
- gaius 17y agoYeah, it's kinda like the point of learning the different sorts is not really to learn how to sort things - it's a vehicle for teaching big-O notation.
- tsuraan 17y agoPerhaps it's not too popular, but VHDL or Verilog are a ton more useful for learning about how a machine works. Seriously, writing some x86 assembly teaches you a thing or two, but implementing a full CPU from the design of the ISA to putting it on an FPGA is the way to go. Once you've done that, all the magic is gone, and computers are completely transparent and understandable.
- lg 17y agoYeah, you're probably right. This is my 'limited life experience' showing...
- sethg 17y agoIf I had learned C, Lisp, and Java "in depth" when I was an undergraduate, much of the effort to learn them would have been wasted. My first programming-ish job involved documenting C++ libraries (in an era where C++ templates had just started to be supported by mainstream compilers). Then I had a job involving Perl and Java, and even though I had no experience with Java I had no trouble getting up to speed with it. Then I had a job involving J2EE; I hear that the "enterprise" Java world is doing a lot with Hibernate and other lightweight frameworks these days, so what little I learned about EJBs on that job is now stale. And now almost all of my coding involves some combination of shell scripts, Python, and SQL. There's a place in every software shop for the language lawyer who really knows a programming language's subtle tricks and traps, but not everyone needs that coming out of a CS program.
- eli 17y agoIt's a Computer Science degree, not a programming degree. If you want to learn a trade, go to trade school not a four-year university. You wouldn't expect someone with a degree in English to know how to navigate a book contract, would you?
- markdennehy 17y agoNope, I wouldn't. I'd expect them to be able to write the book and then get a lawyer to review the contract that the agent negotiates for them. Mind you, I've not seen degrees in programming as distinct from Computer Science or Computer Engineering over here. We have one, two and three-year diplomas, yes, but degrees are all on the fundamentals over here.
- mellis 17y agoDoesn't programming deserve to be the subject of a rigorous, high-level education? It is a rich craft with a growing tradition. We would do well to consider, as Joel does, how to provide students with appropriate experience for the future practice of their career. That doesn't mean teaching the particular, accidental details of contemporary professional programming, but it does mean taking programming seriously as a subject of education. You can study architecture, design, and engineering in universities - not just sciences and humanities. Similarly, the existence of computer science shouldn't exclude programming from our institutions of higher learning.
- xal 17y agoIt's a trade in Germany. I left school after 10th grade and started my apprenticeship in programming. The net effect is that at 29 i've now been a professional programmer for 12 years. More importantly, I also developed all my programming habits during my formative years and therefore developed pretty good habits that are now hard wired and second nature. It gives me a huge edge over other programmers of my age who have been joining the work force over the last few years.
- tel 17y agoThe huge difference being that in Germany you have functional apprenticeship programs. In the US, which this article is centric to, you're really just going to go to college, have little option besides CS, and then end up somewhere in the chasm of this debate. Trade schools exist, but since they're generally looked down upon you're not going to see a lot of popularity in Programming Trade degrees. Though perhaps the only difference between programming and metal craftsmen is that CS is more obviously popular and valuable these days. P only might equal NP so computers and robots haven't yet taken over the job of crafting programs. This is meant to be a lot less a critique of programming and a lot more a nod toward the intense craft that goes into many of the things you might learn as a "trade". The general skill to build something physical and high quality is so frequently looked down upon these days.
- yesimahuman 17y agoFrom Joel: Where do they learn to write a program longer than 20 lines? Oh man, if I never had to write a program longer than 20 lines for my CS degree, life would have been a lot less hectic (and I also wouldn't have learned shit, which is not the case at all).
- wyday 17y agoJoel's statement was hyperbolic. The average assignment might amount to 1000 - 3000 lines of code for the more advanced courses, but his point still stands. Real products (products that actually make money) consist of a few thousand lines of "fun" algorithm code and hundreds of thousands of lines of "boring" code. But code length wasn't even the main point of his essay - time management was.
- markdennehy 17y agoHow many of those hundreds of thousands of lines of boilerplate code have concepts in them that the average CS student isn't taught in their "fun" algorithm code? None. The simple fact is that with the amount of things to teach in a CS course, boilerplate code is just not a good use of time to teach. Students come across it in any major project and know it exists in the rest of the course - but spending equal time on boilerplate and on algorithm code would be like teaching an artist a degree course in chemistry before letting him buy his first tube of paint. He'd be a great chemist, but a lousy artist. As to time management, Joel's point was nonexistant there. He spent the entire article berating student's time management skills, suggested Scrum supported by his product could fix the problem, then quickly blurted out that industrial programmers have equally poor time management skills and in fact are solely differentiated from college students by the point that industrial programmers have managers to enforce time management on them, and that neither Joel's product nor Scrum can help that. Leaving aside the point that he's not actually correct about time management skills (long-term time management isn't just down to the programmer, but to how stable project requirements are and other such factors), and leaving aside the query of just how bad the programmers he works with in industry are (because in six years of industry work, I never came across a programmer who both kept their job and had poor time management skills), there's the query of what the hell his post was about at all in the first place if all it did was to create FUD, hawk his product as a solution, then indemnify himself from any failure by saying it probably wouldn't work (in a sufficiently roundabout way that it didn't discourage the sale)?
- deleted 17y ago[deleted]
- alexgartrell 17y agoThrough internships, open source projects, research, and real courses (Operating System Design and Implementation comes to mind), students learn everything they need to about version control, bug tracking, etc. Students who don't are lazy. Professors who don't gently push students in that direction are lazy too. Good courses have projects so hard that using version control is implicitly mandatory. Further, Fundamentals of Software Engineering at my school requires students to participate in an active open source project (for example: chrome, firefox, scala, eclipse, etc.) and actually have their patches accepted. [Edit] Also, group projects are only collected through subversion (yeah yeah, I know), so students don't have any choice but to learn to use version control. Maybe it's time for a curriculum upgrade?
- Mongoose 17y agoI can say the same for the University of Washington. A lot of my peers don't know or care much about real-world development, but those of us who realize its importance seek out jobs, research, and internships to fill in the gaps.
- deleted 17y ago[deleted]
- wglb 17y agoWhile I don't always agree with Joel, it is a bit of headline grabbing to call him a snake-oil salesman. He is building a product that is shipping and the company is profitable. Not easy to do. But I think if universities taught CS the way that they should, and not many do, in my opinion, the result might not be what he expects. I think that many companies misuse programmer talent--one example is to employ thousands (not exaggerating) in enterprise departments that are reduced to moving one field to the other. If there were lots of well-trained CS grads with a better orientation, they might be questioning how things are done. Both in large enterprise situations and perhaps in Joel's company. His strongest point is that students are not exposed to longer projects. I was once in a position to hire compiler people. Few graduates of programs that taught compilers were well-equipped. One large state university in Michigan taught a compiler course in a semester. The graduates that I talked to came away with the notion that compilers were very scary. Graduates from another midwestern school across the lake did very well. Their compiler course was a full year as part of their masters program. I think that industry does not really know what to ask for. CICS as part of a CS program? (True). Really?
- wglb 17y agoFor interesting contrast, see http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD898.html http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EW... recently posted here.
- Xichekolas 17y agoWow. "The fact that operating system design posed some at the time tough conceptual and logical problems was hardly allowed to surface. Consequently, those problems did not get the attention they deserved, and this had far-reaching consequences: I recently read a series of articles on the Shuttle on-board software and, though President Reagan has generously offered a teacher a free ride, I tell you I am not available." This talk was given at a conference in mid-November 1984. The flight with a teacher on board was, of course, the Challenger in January of 1986. Of course, the disaster wasn't due to software... but still rather uncanny.
- jordanb 17y agoIt's interesting that Joel purports to treat his programmer staff as professionals, yet has the same unreasonable tradesman-focused expectations that the cube farm managers have about education in Computer Science. A graduating structural engineer has no idea how to marshal a design through the building inspector's approval process. A graduating lawyer has no idea how to actually engage in litigation. Yet those fields aren't dominated by managers whining that students should be learning "real world skills" instead of "theoretical stuff" like high physics or constitutional law. They understand that a professional isn't an automation that gets precision machined by a training program to slide frictionlessly into their workflow. They know that when they hire a graduate, he isn't trained in the mechanics of his job (nor is he even licensed yet), and that the hire represents a commitment on the firm's part to take the theoretical knowledge he got in school show him how to leverage it for the real-world practice of his profession. They are fine with that because they have a culture -- as professions and as firms -- of respecting and investing in their practitioners. The computing industry doesn't operate that way. All the lip service it gives about 'professionalism' is, as far as I can tell, entirely driven by a desire to ensure that programmers remain exempt. Why is it that the manager class at development firms is dominated by non-technical MBAs? Why are development firms not set up so that programmers are partner-tracked associates? I can't think of any real profession where that's not the default configuration for a firm. And most apropos here: why do they expect their supposedly professional workforce to receive trade skills from their university education programs? I think people like Joel need to quit attacking universities until they can get some consistency in their own views of their employees. Either programmers are the skilled tradesmen we're currently treated as. In which case, the exempt status should be removed and the industry should come up with a tradesman's curriculum. Or they should accept us as professionals, and start treating us that way.
- dangrover 17y agoThis piece is a bit much, but I do think it's odd for Joel to be prejudiced in only hiring people from top schools and then complain about how top schools are too theoretical. You can't have it both ways.
- steiza 17y agoI think most people agree that universities should try to teach people how to learn, and not just the latest technologies and good engineering practices. But I've sat through too many university lectures on programming language syntax or introducing threads to believe the university is teaching me "how to learn". Why not tell students, "here's an introduction to C++, read it before next week's lecture" or "for this project you must use a VCS, pick one and learn it" instead of making me sit through lectures where the professor reads documentation to me? Have other people had the same experience?
- jimbokun 17y ago'"here's an introduction to C++, read it before next week's lecture" or "for this project you must use a VCS, pick one and learn it"' My one modification would be "here is the problem, implement a solution however you choose" (with maybe a caveat that it must be in a language that the TAs can read well enough to grade your work). Maybe some suggestions as to which languages are appropriate, especially if libraries written in a specific language are required or recommended.
- ditda 17y agoI just don't get where all the Joel-bashing comes from. You'd never know it from reading this rant or any of the comments but Joel is giving his software to these students for free: "FogBugz would work great for tracking this: if you’re doing a capstone project and need access to FogBugz, please let us know and we’ll be happy to set you up for free." More importantly Joel is paying for students to participate in the program, and providing one of his programmers as a mentor. He's also had well-known, paid internship programs at Fogcreek. To me that says he's taken the initiative to fill this void in academia himself, with his own money no less.
- adw 17y agoJoel is training people who are about to enter into the workplace, and through hearing about this are self-selected as people likely to be both vocal and interested, to use FogBugz. It's not charity - it's very smart marketing and most likely good business.
- markdennehy 17y agoAs someone else put it elsewhere, 'the first taste is always free'... Companies have been giving away software to college courses for as long as there's been an industry. It's a long-term marketing strategy based on the idea that if you give free software to 200 students (with limits on how it can be used so they can't make money using it), then inside ten years many of them will end up in positions where they're asked to recommend software and yours is the first they ever used. Altruistic it is not.
- pchristensen 17y agoJust because it's business doesn't mean it's not altruistic. pg does YC because he wants young hackers to do interesting work and solve the money problem, but he wants a return. Joel wants people to manage their time and get their work done in an organized way, and he believes in that so much that he wrote a product that does it. I'm sure he wouldn't care if you used any great product to track your time, but there's only one he can offer for free.
- rbanffy 17y ago
- shin_lao 17y agoThe most important thing to learn is data structures, algorithms, complexity. The languages and techniques are not that important and change all the time. Just go into a course where you understand what a hash table is, what is a NP problem, what is a turing machine, etc. Understand what an operating system is, what is virtual memory, how a program is scheduled. See how a compiler works. Learn with a functional programming language, learn a language where you need to manage memory and pointers yourself, learn an "object oriented language". This will help you all your life.
- spolsky 17y agoI'm happy that my article is causing some conversation, but I was NOT advocating that there is anything wrong with the nature of CS education, other than the fact that it happens to be poor preparation for a career as a programmer. Anyone who got to paragraph 4 of my article would realize that I think CS degrees should stay CS degrees. That said, a lot of CS students do go straight into programming careers, so a lot of good CS programs include capstone/senior projects on a team, and they're never time-managed very well, which is what I was writing about.
- mgenzel 17y agoBut are there really all that many undergrad programs that prepare people to go straight into the associated careers? Why hold CS to a different standard? Maybe we just should have a programming school a la medical school :)
- jclee4843 17y agoSchools should have separate programs for students who want to pursue academic research and who want to work in the industry. Recently graduated with a CS degree, I found that most school courses didn't help much me to land on a job. It's really the internships (which was part of my program) I did during my school years helped me most to land on a job.
- dkersten 17y agoI think that learning the theory is more important than the tools we use in industry. Picking up a programming language is pretty easy, if you already know all the hard topics like different paradigms, computability, logic, mathematics and so forth. Sure, you can learn these on your own, but I think its much more valuable to have people who know how to learn, know how to program and have a good, solid theoretical background. I don't think you can be a great programmer unless you can develop a non-trivial program in a programming language in all major paradigms. The best way to do this, is to know the more abstract details beforehand. Having said that, I do believe its important to do a lot of hands-on programming experience and feel that universities need to be somewhat more hands-on too. I also think that they should put some focus on team work and collaboration, on tools like debuggers, source control and profilers and also things like unit testing, though it is much much easier to learn these later than it is to learn the theory later.