Joel Spolsky, Snake-Oil Salesman
stochasticgeometry.wordpress.com
stochasticgeometry.wordpress.com
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.
How many times a month does news.yc have a thread where people debate whether you need any education whatsoever to do our job? If we can't even decide ourselves no wonder others think anyone can do what we do.
Another systemic problem in our industry is training. "Training" at most companies, if you're lucky, is a small budget for buying books on amazon.com that you can bring home and read on your own time. Lots of companies will tell you (especially if you're a new grad) they train their new employees and then, once hired, you're shunted off into a cube and the "training" turns out to be an overworked co-worker who comes over to tell you how to set up your workstation, where the source code is oh and if you have any questions just send me an email.
Combine the above with a culture of acting like add-afflicted children (oooh shiny erlang, let's rewrite everything in erlang! Rails is sexy. I'm a rockstar!), and the MBA types distrust us and view us as people incapable of managing ourselves, people that need proper structure to deliver anything at all (Joel's last statements).
At my last job, soon before I left and after I'd handed in my resignation, a manager (not my manager but another) came around and congratulated me on how much work I'd gotten done in my last couple of weeks, with the obvious subtext that he was surprised I did anything at all since I'd resigned. It was insulting. If he had seen me as a real professional, there's no way he would've said that but he obviously didn't.
http://www.joelonsoftware.com/articles/ThePerilsofJavaSchool...
He even links to this in the current article! I suppose he is trying to make a more nuanced argument, but it does not come across well. He seems to be saying that universities need to be a little more "Java School"ish than they are now, but not too much...?
I think he should better clarify just how much Java School there should be in a good computer science curriculum.
They sure don't like it when I call 'em "Powerpoint resources".
Powerpoint resources is a great way to put it. I'll be sure to use it.
Thank you!
Every engineer will describe themselves as an 'X engineer' where X is equal to automotive, or electrical or structural or something similar. No engineer is going to think that just because they're really good at design underwater oil pipelines, they'll be equally awesome at designing cars.
Many programmers on the other hand seem to be of the opinion that once they've learned how to 'program' they'll be equally adept at writing ray tracers, TCP/IP stacks and video editors (as long as they get to use their favourite language).
It's perfectly valid to describe oneself as a 'web developer' or 'systems programmer'. What bugs me is calling yourself a 'C++ programmer' or a 'Ruby hacker'. Emphasizing skill with a tool is the mark of a tradesman - it abets the industry dysfunction of viewing programmers as interchangeable resources who should be slotted into a project with minimal investment.
What is needed is not to get annoyed at these peoples existence or their approach to programming, but to find a way to differentiate between them and other types of programmers.
People who fashion themselves into interchangeable parts shouldn't be surprised if they're swapped for cheaper substitutes.
Also, to counter your 'Autocad engineer' example, commercial airline pilots can be described as a 'Boeing 747 pilot' or an 'Airbus A318' pilot. You need certification to fly a specific model and can't just hop in and start flying a different model.
I don't think that's a good analogy.
Pilots are operators, not creators. What they do is pretty much defined by what devices they use to do it.
Engineers, in contrast, use tools to create new things, and are defined by what kinds of things they create (e.g. civil infrastructure, electrical systems, computer architecture), not what tools they use to create them.
Granted, my sample size is limited, but I think that every one of them would be as annoyed at being referred to as an <aircraft x> Pilot as I am at being referred to as a <language x> Programmer.
Bob T. Builder : Civil Engineer with Emphasis in Concrete Stress ---Skills--- Autocad : Industry Used Physics Modeling Software
Suzie M. Hacker : Java Programmer ---Skills--- Eclipse : Ant
They seem roughly equivalent to me...
What people most often identify with seems to be the frameworks they are using. So you will see someone call themselves a .Net Developer not C# .Net coder even if that's what they do. They don't know all of .Net but they feel confident they know how to approach most .Net issues and they happen to use .Net and Visual Studio.
I could have looked at the Spring stack or Coca, but I think the point still stands. Even if someone is calling themselves an OX X developer they are talking about knowing the same type of thing as a .Net developer.
Why not, looks like a gap in the market.
Seriously, it looks like there's a market for training professionals to do the vocational side of their job.
For a very long time there has been a "tradition" of sending newly graduated engineers to work on the manufacturing floor, or in product testing for a while so they get background in the business before actually having to design anything. Such a tradition seems to be missing in software development.
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?
"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.
You wouldn't expect someone with a degree in English to know how to navigate a book contract, would you?
The vast majority of computer science students pursue a CS degree because it has become a prerequisite for being a professional software engineer. NOT because they have a desire to become a computer scientist.
The simple fact is that if you do not have a 4-year college degree you will find it immensely harder to work as a software engineer in the industry. It's silly to pretend otherwise.
The vast majority of today's CS programs do a disservice to all of their students. They are neither good engineering programs training students for industry (for which they currently serve as a proxy) nor good computer science programs. A recently minted graduate of a Chemistry or Physics program (from an accredited US 4-year college program) is, on average, much more versed in the relevant scientific findings and research techniques of their field than a CS graduate. They are so poor precisely because the vast majority of CS graduates do not go on to do CS research or utilize their CS knowledge but instead become software engineers.
I don't know if things are different outside of Canada, but isn't this precisely what a computer engineering or software engineering diploma is for? That's what I'm doing and it's definitely different from CS - very applied, a lot of low-level programming (assembly, VHDL, embedded C), making a game with Java calling C++, source control is always used, etc.
Software Engineering is more of what Joel is describing, and more schools are starting to offer it as a major, with as much focus going to various project management methodologies as algorithms and data structures.
Personally, I was already a programmer when I took my first University CS courses and realized quickly that while I love programming, CS isn't where my interests lie. I took the CS courses that were most relevant and wound up getting a business degree.
I do wish there were more programs available serving the middle ground between the v-school ghetto and the ivory tower.
I agree, it is possible to be a professional software engineer without a CS degree (some of the best fit that category), but that's a non-traditional road. More to the point, it's exceedingly rare for someone to intentionally avoid earning a CS degree if they plan, prior to attending college, to become a software developer.
> ...nor good computer science programs.
This may well be true, and that is pretty unfortunate.But, frankly, if all you want a job developing software, I'd suggest interning instead of getting a degree. You'll certainly be more qualified than your peers for most jobs four years on.
And, for what it's worth, I'm currently hiring for a Jr Developer. I want someone smart who we can train. A CS degree wouldn't hurt, but it's certainly not a prerequisite.
Any (career?) suggestions in general? I have a strong background in CS (I made prodigious use of ocw.mit.edu), and I feel competent at a practical level.
At this point, I'm just trying to pick a particular language to master while learning something esoteric on the side.
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.
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.
There's a certain purity in studying the math and science behind computers instead of studying how to bring your C# program in under deadline.
Those who really care about both can always double major.
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.
The concepts are what should be taught - not the latest buzzwords.
"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.
The last thing Joel needs is students getting used to and/or turning software like Trac or Bugzilla into direct competitors. Having noticed this, its pretty obvious why Joel would give away FogBugz.
Joel has long said he only hires great programmers that know CS theory in and out. I don't think that's changed, he's just also identified that recent graduates are lacking in time-management and collaboration skills needed to be good industrial programmers. However, he isn't just having a debate about academic vs vocational education but offering paid internships, and now sponsoring one of these Capstone groups, in an effort to give students the skills he thinks they are missing.
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.
It's not charity - it's very smart marketing and most likely good business.
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).
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.
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)?
Remember, his article was about time management. The whole basis of his argument is that college kids assume "boring" code can be done quickly and thus can be delayed to last possible second.
The truth is "boring" code usually means API code, user interface code, and input processing code. They may involve concepts that CS students have already learned, but it certainly isn't a breeze. It's not whether or not a student can do it - it's how fast they can ship a working product.
As for the rest of what you wrote, you seem to have some grudge against Joel. Maybe it's just manufactured to produce traffic. But that's just my cynicism leaking through.
The classes I regret taking had to do with "hot" industry technologies such as Data Warehousing, Applets, JSP. Spending those credits on something like Graph Theory or deeper dives into Operating Systems/Computer Language design would have been more rewarding.
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?
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.)
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.
So, which is it? Do schools teach the fundamentals, transferrable to any language, or do they teach what'll be useful in industry?
The thing to remember is this - we teach them the fundamentals for a reason, namely to get jobs in industry. At the back of all this academic teaching is a commercial reality that can't be forgotten. But you have to balance that with a long-term view of the student's entire career. We're trying to give them a degree course, not a Sam's book!
Just color me bitter about how my college neither taught fundamentals nor prepared anyone for industry.
Do you feel that your experience or mine is more mainstream? When I read Joel's "The Perils of Java Schools," I felt that it described my school to a tee. I had just assumed that that's how most programs are, given my school's size. Obviously, Ivy-leage schools should be better, but I just kind of assumed that my own experience was average.
I can't judge what would be mainstream in US accurately enough to rate your school I'm afraid. I'd see some of the details of the main schools as they write up their courses in journal articles; but my experience is mostly with Irish universities. However, from what several people here and back on the blog and over on reddit are saying, it sounds like the average Irish CS degree is a step or two ahead of at least some US schools. Which I have to say is a major surprise to me, since US schools were (I thought, from speaking to grad students and academics from them) better funded than Irish ones.
College is quickly becoming a big commodity business, rather than a place to learn.
FukYorBrane is a great Branfuck variant.
(Of course, this doesn't invalidate your point about relative popularity.)
As for de facto standards, I don't think we should be paying much attention to them. I think it's very important to draw the distinction that software development currently has no standards (you might be able to argue for TCP/IP, where alternatives are only ever used because they fulfill some unique use case not covered by TCP/IP), because for as much as we want to call this industry "software engineering", we sure as hell don't treat it like any other field of engineering, for many of the reasons already mentioned.
I think the first step is to sit down and agree on some terminology. You can't even get two programmers to agree on what "Object Oriented Programming" means. No wonder we aren't treated like professional engineers. We don't act like them.
Still though, we use some languages for teaching (like Pascal or Modula-2) which don't have the kind of industrial usage levels of C or C++, so we might see Python being taken up sooner rather than later. I think there are one or two courses already using it over here on a trial basis.
Just because C is hardcore and Lisp is amazing and Haskell is mind-exploding doesn't mean that Python isn't a great language.
----
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.
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.
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.
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.
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?
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.
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.