How much do you all think programmers actually learn in school? Has anyone taken classes at a university that they think seriously helped them develop software better (better meaning in less time, with fewer bugs, more maintainable, more efficient algorithms, etc)? As an extension to this, do you think you learn much from the tech-courses (e.g., a Sun course on Java Enterprise Computing)?
I went to a pretty good CS university for 4 years, and got a BSCS. From Day 1, it felt like a waste of my time. With only 2 exceptions, I seriously don't think I learned anything from my CS courses. The 2 exceptions were some of the more complicated algorithms that I just hadn't experienced yet, and a good course by RalphJohnson (his course is the sole reason I'm even considering going back for a MS).
I'll admit that I was quite a bit ahead of the curve going in, but I really don't think the courses actually taught students how to do anything useful anyway. Courses almost never forced students learn how to really develop software on their own either.
I met multiple people who weren't able to get any of their >=500 line projects working in the reasonably complex classes, but they were getting by just fine with at least C's. So far as I can tell, the teachers just helped the students enough to get them to pass the class. I assume they didn't want to teach the students how to program when they were really trying to teach them something much more complex. I'm not saying they should've had to teach the students to program, but I do think the failure rate should've been much higher.
My friends and I always seemed to have a basic understanding of programming that most people in our classes never seemed to grasp. We met countless students about to graduate couldn't even write a decent 1000 line program. Practically everyone was lacking in at least requirements analysis, design, and debugging. Some students could write a program given an extremely good description of the problem, and some hints about how to do it. Unfortunately, I don't even think that was the majority of students.
After a couple of semesters, we'd started to "try out" a class for the first week or two to see if there was anything we thought we needed in it. By the end, we weren't attending 95% of our classes. We'd just show up to quizzes and tests. It got so bad that we actually sat down with a calculator to see how much of the homework we had to actually do to get a B (we always assumed we'd score in the top 10% on testing.. and people always failed the tests so badly that they were always curved).
By our junior year, we'd learned that most of the people with a clue weren't in the CS classes. It was so bad that we actually figured somebody was more likely to have a clue if we never saw them in the class, but only at the test.
I regret skipping homework now because I could've easily attained at least a 3.9 GPA if I'd extended couple of more hours per week to school, but it didn't seem worth the time. I was too caught up doing my real work (I programmed to pay for school) and doing normal extracurricular student activities.
I'm in an accredited CS program, and I've learned a few things (trivia type things that is). I show up to almost every class, but I could get away with skipping a lot more before my grades would suffer (except in classes where professors take points off for absences).
I've spent a lot of time helping students in classes I couldn't take because of prerequisites. [See if you can take a test to get out of the prereq. If not, see if you actually have to take the prereq to enroll in the desired class.. Some registration systems let you take the desired class anyway] I was even paid on occasion to tutor students in classes I couldn't take yet. Once, I was asked to give a presentation in a class I couldn't take. I think I'm going to be doing a lot of independent studies rather than taking the existing electives.
I did undergraduate work in CS and Mathematics, and a PhD in Mathematics. I'm now a researcher / developer; I feel that both degrees were worthwhile. But not because the stated content of the coursework.
The undergraduate CS courses broadened my experience, by making me work on Minix, Domain OS, Ultrix, and MTS (a System/360 timeshare OS), in Pascal, C, and Mips and 360 assembler. I also picked up makefile authoring and several flavors of shell scripting in order to complete coursework. There's a lot to be said for gaining a breadth of experience. For content, the most valuable course I took was a graduate-level analysis of algorithms course.
[ I would argue that if you had spent those four years working in the industry you would have had just as much, if not more, exposure to strange scripting systems and hardware platforms ]
The PhD work in Math is the other half. I am not using, really, any of this coursework now. I am certainly not doing anything in the direction of my thesis. But I learned a *lot* about problem solving, and about writing about problems and their solutions. I also learned tenacity, and not to be afraid of tackling hard problems.
So: SchoolIsWorthwhile?, but to some extent StatedCourseContentDoesntMatter?.
-- GarthDickie
I didn't take any CS classes in college. I studied English, and didn't even finish that. Another of my colleagues didn't exactly finish high school, and he's an excellent programmer. Among programmers who _do_ have degrees, I find that some of them are quite good and quite knowledgeable and some, for whatever reason, aren't. The only time I feel that I'm at a disadvantage to my CS-degree-having peers is when heavy math comes into play, but that's mostly a stunt show.
From my experience, I have to conclude that CS programs are certainly not any kind of SilverBullet, at least in their current manifestation. Perhaps I would have a different opinion if the curriculum were modeled after ThePragmaticProgrammer, real practical knowledge about how to efficiently build software for production and maintainability, rather than computer sciency subjects like computability?
I am tempted to suggest that software engineering should be taught in business schools rather than in the engineering department, but I would probably regret it if I did. -- RobertChurch
I know I would regret it, judging by the quality of work my colleges Business Comp Sci students did. Great Business work, but really bad computer work.
I've been paying some attention to this recently. I'm amazed to observe that hardly a week goes by that I don't follow some train of thought molded by my college experience. I studied electrical engineering as an undergraduate and computer science after that (a great combination). I also learned as much out of class as in, though I wouldn't have done that were I not in school. My advice: go for the hard science and math. They have staying power. Pick up some history or psychology too. Don't worry about grades, worry about connecting what you learn instead. Learn how to debug a program before you take a class with a programming project. Avoid classes that serve industry unless industry is paying your tuition. Do an internship or two to make your resume look attractive. -- WardCunningham
p.s. A senior topics class explained how the academic country-club (their words) worked. They also presented salary data that showed two years of experience was more valuable in the short term than two years of graduate work, and even more so for four or six. The real question is, how do you want to think for the rest of your life? (There is no right answer.)
...a little testimonial...
I have to admit that I never went to college, actually, I barely finished high-school. In fact, before I was 24-25, all my time was spent on music, writing/reading, or other liberal arts - I could have cared less about computers. When I did (accidentally) discover the creative aspects of software (and decided to jump in), my first couple of years were insane. All I would do is write code, read books, and go on compuserve's programming forums. Unfortunately, I worked initially by myself. First on internally projects for a company, and then alone consulting. When I did start to work in teams, I realized that my terminology was wholly bizarre and my thought process unlike the rest of the team. While I brought a fresh perspective on some ideas, other times I would over look a rote solution to a problem. A good example is storing the lines of a Text Editor's Model in an array instead of a linked list. Luckily, a little more experience corrected my terminology and rounded out my understanding of basic algorithms and data-structures. All in all, I think I have retained a unique way of looking at and solving problems. I feel fortunate that I was obsessive and driven enough to take the route I did.
In truth, I wouldn't recommend the route I took because I do believe school is important. Also, if you are motivated by anything other than a craving to create software - self-education won't work out. If your main motivation is a career, I can tell you right now, you wont have the drive required to spend hours a day, by yourself, learning by doing. I easily spent 15 hours a day reading books and going on-line (with Compuserve or FidoNet) to ask (and answer) questions of other engineers. In fact, I probably learned more by going on line, downloading peoples questions (which I didn't understand), then looking up and posting an answer than I did by reading the already posted answers. Honestly, I wasn't so much driven to learn as much as I was driven by passion for the craft. During that time, I could have cared less about programming as a career, I truly would have done it for free - such was the level of my enjoyment.
If one lacks this passion and love for programming (especially in their early years) then self-education or school is not going to matter. Instead, they should be looking for something else to do...something that does make them feel that overriding passion. I've always felt that passion was the key to lifelong success. If one stumbles across that thing they are passionate about, they should pursue it and forget about the likely hood of making a career out of it. If it really is your thing, you will become successful - despite the odds, a way will be made to make it into a living. I think all of us can say that what distinguished us from others in our early careers (and maybe even now), is the level of passion we had -- not our good instincts at choosing a career. Parents: remember this for your children. It's not what you do but how much you love it.
From my experience, the great benefit of the college degree was that I learned what had come before - and where to look for answers. I did not spend a long time relearning big O notation, the Travelling Salesman problem, the Dining Philosophers, etc. I also learned how to manage my time (and how not to, some times). -- Pete Hardie
At one place where I worked, we had a saying, learned from experience in hiring recent college graduates: "For every two years of college, a programmer needs one year of rehabilitation." A lot of formal education in computers seems to teach a highly abstract, indirect way of looking at problems. Instead of scrappily exploiting the particulars of each situation, recent college grads often conjure up a veil of abstractions to sit between them and the problem. I think the idea is to make the problem more similar to the presumably simpler sorts of artificial problems they solved in school, but in practice it makes the problem more complicated. -- BenKovitz
Abstraction is one of the most valuable things I learned in school. It makes it possible to simultaneously solve a class of problems, instead of just one problem. -- AnonymousDonor
I have a BS and MS in AerospaceEngineering. The most important thing I learned from six years of problem sets was how to DefineWhatYouDontKnow?. An example being the second step when solving an engineering word problem: you state the "knowns", then you state what you are trying to solve for, and then you solve it.
Speaking of defining what I don't know, I would define the problems I am trying to solve by reading Wiki as:
Well, at school I learned analytical geometry, and used it to build my own wire-frame 3d library, in BASIC, in my lunch-hours.
At university (joint honours maths and physics) I learned FORTRAN (and VMS) and how to apply it to a range of physical problems. Learned TeX (and unix) to write my dissertation. Also, I learned how to build abstract models of parts of the world.
Did a Masters in Software Engineering, and learned: ISO 9000, COCOMO, a couple of CASE tools, vi, Bourne shell, SQL, E-R modelling, C++, OMT, that spending days using the CASE tools to draw OMT diagrams was fun but a waste of time, that COCOMO said that our end of year programming assignment would take six people 18 months to complete, that having learned how to build abstract models of parts of the world back then made OMT and E-R modelling a snap, that people who spent every hour the lab was open hunched in front of a workstation were very, very sad indeed.
In my first job I learned how to write compilers. In my second job, I learned (from RobWhittick) how to use automated test harnesses, all the time, on everything. And that my masters was worth 18 months--two years experience. In my third job I learned that I didn't like hacking, even (especially) when it's hidden behind Rose. In my fourth, that life is too short for RUP [EditHint.Select:"Rational Unified Process"|"Remote Uptime"|"You name it" --fp] and way too short for Gantt charts. I just started my fifth, and can't wait to learn something. -- KeithBraithwaite
I am constantly amazed at what people don't know. This applies to people having compsci degrees and those that don't. Inquisitive people will learn regardless. Even then school is helpful in finding what's out there. This may be less true in generation.net. Unfortunalately a majority of people don't seem to be inquisitive and seem happy as cogs. Cogs need schooling.
-- ToddHoff
First off, I graduated from LehighUniversity? with a BS in ComputerScience
I would like to say that I learned a great deal in college that helped me to develop software better. I probably had a better chance, though, since I went to college so recently (graduated class of 2000), which allowed me to take classes, and do research involving today's new technology. (I had classes invloving Java, OpenGL, and hardware including Wearable Computers, Pentium (I, II, and III) architectures, among other things, too may to mention them all. It also taught me how to deal with the 10-20 hour workdays... (caffeine, anyone? heh)
Another thing that many people overlook (I'm sorry if people already mentioned this on this page, but I quickly skimmed through it and may have missed it) is that experiencing college helps you deal with all of the problems that come up that are unrelated to software development. By learning how to deal with them and get them out of the way faster and better, you can devote more time and effort to software development.
-- JoshuaBaran
I graduated from the UniversityOfToronto. It sucked, but I must admit I actually did learn some useful theory. ToddHoff's comment that "Inquisitive people will learn regardless" is probably true, so I'm not sure how much I would have learned if I didn't take university. I have a feeling that it wouldn't have been as much theory, but probably much more practice. When I got out of uni. I felt like I knew nothing about real world programming (i.e. software engineering). Certainly they don't teach you anything about how to tackle project-sized software. On the other hand, I find it frustrating when I have to explain 'simple' concepts like complexity theory to fellow programmers who took programming courses at a tech college. It's like two separate worlds.
My brother went to the UniversityOfWaterloo, and they have an excellent co-op program, so he left school with a much better understanding of real software. Had I known what I know now, I would have gone to UW. I always suggest UW to Canadian high-school students looking into CS. -- RobHarwood
''I went to UW. It's a meat grinder. The major policy to keep that place's reputation up is that it's hard to get a UW Honors CS degree. My honest appraisal is that UW (like few other u's) really knows how to teach coding. People can really code well coming out of UW. However, the software engineering program is still very waterfall-focused (3 courses spread over 18 months - one on analysis, one on design and implementation, one on QA/maintenance). Most SE students get shafted with tremendous amounts of work (BigDesignUpFront), but little insight on how things are done in the real world. This may have changed, but I still have friends that dropped out of SE to regular CS recently.
The CS curriculum is decent - very Java focused now, and some senior courses are excellent - i.e. the OS course, the concurrency course. UW is very heavily influenced by math. It's actually very common for UW graduates to switch careers after a CS degree (There is a 25% attrition rate), because 80 hour weeks in the lab wind up making you hate computers.
They are also working on a Faculty of Computer Science, with completely different ideologies.
Note, I switched into Economics after 3 years of CS, so I'm probably more biased. So, what did I learn in school? Well, that I don't have the motivation to perform well enough in math courses to stay in a CS program. I *like* math, but I like software more, so I tend to spend most of my free time reading books and doing side projects. This, contrasted to the typical UW student reality of eat/sleep/schoolwork. So my marks were generally decent, the Math faculty doesn't like course failures, even if you maintain your averages.. so I switched. I don't regret it - because I enjoy economics, and without spending those 5+ years reading and thinking through software, I wouldn't be where I am today in terms of my job & the industry. -- StuCharlton''
So, the solution, perhaps, is an apprentice system? The establishment of teaching institutes where you could learn by pairing with an experienced programmer? A system based on PairProgramming could work well.
Although we're all enlightened, the assumption is still that the school is the sending unit and you're the receiving unit. So the tendency is to blame the curricula for any disappointments. Let's get even more enlightened, shall we? -- WaldenMathews
The thing I miss most about school is the university library. I used to spend lots of time reading OldBooksAndPapers about computer science (and other subjects). It's hard to find those things at Barnes & Noble. -- KrisJohnson
What I learned in school:
-- EricHodges
I was fortunate enough to attend a small technical school with domes by the Charles River, where I took a one semester class in compiler design. It was at this point in my life that I decided computer programming wasn't for me.
25 years later of course I realize that I have spent the last 20 years doing computer programming. Did I ever do any compiler design? No. But the class sure made me appreciate the complexity of what goes on behind the scenes...
So my recommendation is yes, go to school, take computer classes that are WAY over your head. The good part about this is you will know your limits and humility (which is what higher education is probably about anyway).
-- JeffChapman
In first grade, I learned to answer questions with a complete sentence, not just "Yes" or "No".
In my grade school Logo class, I learned that the solutions to small problems can be combined into the solutions to bigger problems.
In my Algebra I class, I learned to solve problems systematically:
In college, I learned:
I also believe that inquisitive minds will find out. It might be part of why schools are often dismissed. Either people have already found out and felt learning again in a differently paced and motivated crowd to be useless or they have learnt (or studied) something which they have not felt a need to be inquisitive about later.
I think compilers, automata theory, data structures, search algorithms, reasoning, lambda calculus, linear algebra and the whole lot have been a blast whenever there has been a chance to use (or just recognize and understand a process containing) them. There was also a great load of tedious things often containing some silver bullet methodologies and handwaving and explaining a complex term in two short sentences.
And the person talking about broadening perspectives I will call lucky. I have broadened mine on my own and it seems these days the schools are trying to narrow it as fast as they can. To Java and UML and SQL, I hear/fear.
I'm another "didn't go to college" guy. Happily, I did learn how to learn (though not in school), and found that I had/have a fascination with computers and software.
Despite having no degree, I was invited to teach as an adjunct at a local college, where I taught languages (Assembly, C, database) for five years. Very rewarding, though the money sucked. I was able to directly apply skills I'd picked up doing volunteer education remediation overseas. I was able to directly contribute to the career starts and successes of a number of the students.
I found that the curious, the motivated, the enlightened needed little more than to be pointed in the right direction, with occasional directed insight. The trick was to keep them interested while not losing the bulk of the class, who were primarily there because it was an item on their class list - a requirement to be fulfilled.
Ironically we were seldom able to use the designated textbook to any real advantage, and occasionally I'd find a better book, poll the class and, if they were all willing, we junked the textbook and bought something we could use to actually learn the subject. This does not make you popular with the administration.
My students consistently outperformed their peers from classes of the same designation with different instructors. When I finally went looking for why this was, I found that many of the other instructors had "mechanized" their syllabus into pat handouts, prefab tests, cookie cutter projects. They criticized my "lack of organization" as I tailored each semester to the people I had in front of me at the time.
Eventually I had a heated discussion with a director about the need to upgrade our courses and the "bad example" I was setting, and I was not invited back the following year.
I believe I understand how it is that certain students will get a lot out of school by virtue of the instructors they have, while many (most?) will find the whole college thing less than inspiring. The problem, fundamentally, is that since there is no actual standard for learning the stuff, it's left up to the brilliance (or not) of the individual student and the degree of enlightenment enjoyed by the teacher.
That's not what I'd call a reliable system for knowledge transfer. -- GarryHamilton
I consider myself a self taught programmer. However when I start at NTNU (Norwegian University of Science and Technology) this fall I won't attend CS/CE (master programs,) but EE (also master.) This is because I believe that it might be good to tool up with another skill that I find interesting. I'm intrigued by all engineering, EE in particular. I also believe EE will give me a greater understanding of programming. Both on a lower level (hardware) and a higher level (system design.)
However, I can certainly see why people will choose not to get a degree of some sort, hands on is good. Personally I don't think that I would have picket up electronics within the next 10 years if it wasn't through university and certainly not on a master level. In addition, even though I'm self taught I'm an extremely slow learner, not in the sense of 'dumb', but more like ... ooh, shiny, metal, nice, programming boring now, metal fun ... ooh tv, metal boring. You get my drift. I also have a problem finishing projects (especially when I have to do major refactoring,) but I know university will give me an incentive for completion.
Regarding learning through working in the industry. Even with the basis that I have I feel university will give more degrees of freedom. I'll be able to pick my subjects with greater liberty - especially with todays saturated IT-industry - and delve deeper than a project at work would allow. Learning by working, especially with high work load, locks you into the projects you are working with and you often have to settle with knowledge that's on a need-to-know basis, thus leaving large holes in your knowledge. However your milage may vary.
Regarding quality of school, I've considered this extremely important when choosing where to get my degree. I have the grades and didn't really consider there to be any other choises than NTNU in Norway (there's always MIT in the US, but that's a pipe-dream.) I've worked a lot with my relatively old uncle (around 40) who's getting his bachelor in IT. It's basically computer courses including Java programming. I've helped him out and I'm not impressed with the level of the course. It's a slow progressing program. My uncle has never delt with computers on this level before and is having problems grasping especially the programming even though he puts in a reasonable effort. This indicates to me that there his education isn't worthless. He and most of his fellow students will never become leaders in the industry, but they'll have gained skills enough to do certain tasks. (Small in-house projects, QA, grunt programming etc.) and they'll also stand stronger as management types that are neither too engineerified nor too distanced from engineering. And I have also gotten something out of learning him stuff. I've learned some bits about algorithms (e.g. big O notation) and I've gotten some holes plugged. Leading me to think that this may be the escalating factor for people who lack the CV and basis knowledge to grow in the industry. People who are excellent admins and would make excellent programmers could benefit greatly from this kind of experience. Just think of it as an extended certification process, more of like school. School is easy to hate (I don't think it has much charm,) university is better/more free (or so I hear, hope and believe.)
-- Jon
My college CS classes were all little more than "Mouse Clicking for Dummies", "Watch Your Professor Figure Out How To Display A Powerpoint Presentation in only 24 Hours!", and "Confuse Your Teacher By Coding Things That They Didn't Know Could Be Done In QBASIC." Naturally, that wasn't what they were called in the course listings, but that's about all they amounted to. The business courses were equally useless. History, philosophy, and math courses were good though, great for broadening your horizons and giving new perspectives. The most important thing that I learned in college was that I didn't want to be there, and didn't want to go into academics. I like the theoretical/experimental aspect, but I'd rather work at a business where someone else handles any irrelevant bureaucracy, and there's far less of it.
In my work experience, all types of coworkers have been able to find a place, from the stubborn and careful degreed and experienced, to the naive new graduates and current students, to the gung-ho undisciplined self-taught mavericks. With a good mix, they can cover each other's weaknesses, support each other's strengths, and all learn from each other. Of course, that's another thing that they don't teach in school...
See FreeSchools, ComputerScience, AvoidCompSci, BadStuffWeLearnInSchool, EducationalTechniques, SelfTaught, HowImportantIsEducation