Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Whether you learned from a University, or mentor, or what have you (I'm mainly more concerned with University/Equivalent), what did the institution do right? And what do you think they could've improved upon when learning your programming skills?

I'm curious how everyone felt their institution did as far as teaching them how to become a good programmer.

share|improve this question

closed as not constructive by Mark Trapp Jan 26 '12 at 1:24

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.If this question can be reworded to fit the rules in the help center, please edit the question.

Since when did universities help students in becoming good programmers? ;) – sukhbir Feb 23 '11 at 21:11
Knowing the why might give this question more relevance. Are you a professor? (as in, why do you ask?) – Ben L Feb 23 '11 at 21:18
@Ben im just curious :) – user6791 Feb 23 '11 at 22:09

13 Answers 13

up vote 8 down vote accepted

I was not a comp sci major, but one comment I'll make: Undergrad education is supposed to be focused on timeless fundamentals of a field, not the latest buzzwords and technologies or mundane nitty-gritty practical details. If you want to learn the absolute latest research and buzzwords, that's what research journals and/or grad school are for. If you want to learn nitty-gritty practical stuff like source control and maintenance, that's what real-world experience is for.

I majored in biomedical engineering, and I didn't understand this at the time. I always wondered why we weren't learning about "latest cool buzzword that will get me a job X" and instead were wasting time on free body diagrams or reaction kinetics something boring like that. In hindsight the focus on the timeless fundamentals of engineering and biology in my undergrad education makes perfect sense. The "latest cool buzzword" changes too fast and is hard to understand deeply without a solid grasp of the fundamentals.

Teaching lots of detail about source control and the latest development methodologies (agile, waterfall, RAD, SCRUM, or whatever else people use) is silly because it will be obsolete in 5 years, there's nothing conceptually deep about it, and it's easy to learn on your own. The timeless fundamentals of computer science are computer architecture, algorithms, complexity classes, data structures, the Church-Turing thesis, etc.

share|improve this answer

Right: Teach us multiple levels of abstraction in programming languages - we studied Assembly, C, C++, and some Java. I believe that it's important for developers in high-level languages like Java to still understand what happens behind the scenes.

Wrong: No maintenance skills or exercises, we always wrote code from scratch.

share|improve this answer
If you describe Java as high-level, they should have taught even more languages ;) – delnan Feb 23 '11 at 21:41
@delnan: Plus infinity. IMHO any language that doesn't have lambda functions, closures or something roughly equivalent as a first-class concept has no business being called "high-level'. – dsimcha Feb 23 '11 at 21:47
@dsimcha: I wouldn't go that far. It certainly meets the "old" definition of "high-level" (everything above assembly, including C) and it certainly hides many nasty low-level details exposed in e.g. C++. But there's still much more potential. – delnan Feb 23 '11 at 22:03
@delnam: Most schools teach Java as a high-level production language that is used in industry. There was a variety of high level "academic" languages (like LISP, Smalltalk, ML, Prolog) where it was made clear that students were unlikely to use them in practice. – Uri Feb 23 '11 at 22:39

Wrong: No test driven development, no agile methodology at all, too much "when I was your age writing punch card software" lecturing, no source control, no refactoring, no design patterns, etc.

Right: Free pizza at ACM meetings.

share|improve this answer
What is there to teach about agile methodology. Call someone the scummaster. Call a meeting everyday. Go off and code for 1 to 2 weeks. Blame the customer because things aren't working properly. Repeat for several months. Delivery 20% of the desired system that the customer ends up never using but claim success because they could use the system to do part of what is needed if they wanted to. – Dunk Feb 23 '11 at 21:36
@Dunk - Right, because Agile strategies were developed by lazy programmers who were tired of delivering projects on time and on budget using waterfall strategies. – JeffO Feb 23 '11 at 21:39
I just payed for your pizza, ops, renewed my ACM membership :D – Vitor Py Feb 23 '11 at 21:45
@Vitor Braga - I ate my pizza years ago ;) – davidhaskins Feb 23 '11 at 21:57

Pros: Our university had a great programming languages class that helped me start to really wrap my head around how programming languages work. I had a fantastic professor that taught the importance of design, best practices, and version control.

Cons: Lots of (very obvious) cheating, too many apathetic professors who didn't challenge us, especially in important classes like operating systems and assembly...they would pass anyone as long as they turned in anything.

share|improve this answer

To preface, I was a Information Systems major (Business College) at a public state university.


  • Wide range of general business classes (accounting, econ, finance, managment, supply chain, marketing)
  • Wide range of Information Systems classes (system design, web app development, db architecture, network security, etc)
  • Really prepared me well for a "real world" experience that was focused on technology but still well rounded enough to see how you can apply technology to business as a whole.


  • No high-level programming classes and was never taught anything about programming theory or architecture patterns.
  • Were taught using Microsoft software, so I came out of school with most of my experience in .NET, which isn't bad...but certainly isn't good.
share|improve this answer

The two most important courses that I took as an undergraduate were computer organization and computer architecture. These courses were cross-listed with the EE department when I was in school and were taught from a computer engineering perspective. By the time a candidate completed this course sequence, he/she had a firm grasp of how computational devices worked all the way from half-adders through hierarchical memory systems. High-level software development is a piece of cake after one has implemented an instruction set in microcode.

With the above said, I believe that the number one problem that I have with most computer science programs today is that they have morphed into glorified vocational programs (what Joel Spolsky refers to as “Java Schools”). There is far too much emphasis on high-level coding and far too little emphasis on the design and application of computational automata. This orientation results in a temporal education that has a half-life of about five years.

share|improve this answer


  • Offered lots of opportunities for internships and co-op programs for students to get local development job experience, even if it was at just slightly above minimum wage.


  • Little focus on version control systems.
  • Little focus on team development and collaboration.
share|improve this answer


  • Have us focus on logic before code for the first year.
  • Exception handling and why it's important.
  • Threads on the .NET framework.
  • Collaborating among many developers .
  • Object Oriented Principles.


  • Not teach us about source control like SVN or Mercurial.
  • Let the lazy students turn in blatantly copied code. Ugh!
  • Not give credit where credit is due to students who actually learned something on their own.
  • Never taught us about design patterns - I learned they existed after joining SO.

I could go on and on. Maybe you can narrow down your question?

share|improve this answer
Why the downvote? – Sergio Feb 23 '11 at 21:41


  • Assign teachers' assistants in key courses instead of professors more interested in research.
  • Remote teaching via live sessions. (gratuitous linkage)


  • Gear so much towards research that many courses are obsolete. Data structures theory doesn't change that much, but methodology and design patterns have.
  • No collaboration (nay, a ban on all communication) between peers.

I did not expect my university to teach me languages beyond the introductory C++ course (which I already had, and got credited). What I expected was theory of computer programming, analysis, and software development. What I got was outdated theory of computer programming, analysis and software development.

share|improve this answer
+1 for the "ban on all communication b/t peers." – davidhaskins Feb 23 '11 at 21:59
@davidhaskins I read your comment before the answer and thought MPelletier was angry that his institution blocked P2P. – zneak Feb 24 '11 at 0:01
@zneak: :) Human communication. I can do P2P from home, thank you very much. – MPelletier Feb 24 '11 at 4:55

Things I feel were done right within my university mostly in terms of formalizing things:

  • Software Development Life Cycle
  • Testing methodology (White box, Black box)
  • Object-Oriented Principles (Encapsulation, Abstraction, Polymorphism)
  • Understanding a couple of different ways that Math can be represented within computers,e.g. Numerical Analysis and Symbolic Computation.
  • Complexity theory and algorithm design/analysis
  • Introduction to the internet. My university years were 1993-1997 so this was just before the big dot com boom of the late 1990s. Thus I got used to e-mail and the web while in university.

Side effects from my university education worth mentioning:

  • Refinement of problem solving and justifying a solution to a given problem in a formal way
  • Dealing with communication in languages outside of English where I took courses in French and Russian

Areas for improvement:

  • The co-op program did work out well for me as in my first job I made more than a few mistakes and didn't ever really recover until after I graduated. I do believe there could have been more work done to prepare me for the working world and giving me algorithms for navigating a modern workplace.
share|improve this answer


  • introduction to different programming languages: C, C++, Java, VB.NET, a smidgen of Prolog
  • worked on different operating systems: Windows, Linux, Unix
  • database fundamentals with Oracle
  • data structures, algorithms
  • a variety of exercises, testing on different concepts


  • no discussion of best practices, such as unit testing, design patterns, or source control - had to learn these on my own
  • database fundamentals...with Oracle
  • not enough "real world" examples or exercises

At the end of it, my diploma program was really a taster of quite a few different things, some of which I pursued on my own time and after college. The downside was that I later learned there was much more to learn!

share|improve this answer

I live in Québec and I don't think our local college equivalents have the same targets American colleges have. Once you get out of CÉGEP (that's how we call them here), you should be ready to face the brave new world of finding a job. (Which, apparently, is not what most computer science students do. In my prom, there's only one person who did not continue to university.)

Still, knowing this, CÉGEP teachers tend to teach modern and immediately usable technologies, with a much smaller background on data structures and real computer science.

I'm not sure yet if this is good or not. However, our motivation for school projects all got us much, much farther than the curriculum alone would have. I'd say that the best things we had were teachers with a vision of their topic.

It's easy to vomit theory on your students and expect them to learn and remember it. My feeling however is that the classes where this was the case were the least productive ones (though maybe that's because I nearly never attended them). However, when there was a philosophy behind the class, and we were taught things because the teacher felt they were important (versus being taught X because the curriculum says we'll learn X), that was a whole new world of interesting things.

Therefore, I believe having good teachers is more important than anything else. If they didn't teach you about something, they'll probably have transferred you the reasons to teach it to yourself. That's what happened to source control, design patterns, and the .net framework: the program didn't cover any of these, but we used them all.

share|improve this answer
Ya I agree with the teacher part, I had a mix of really great professors, to really awful GGSNORE professors. – user6791 Feb 23 '11 at 23:58

I'm currently an undergrad, but here are some things I'd like to improve on:

  • More cross-pollination between computer engineering and computer science programs. Right now CS students take the engineering digital logic course, and CE students take two semesters of Java, data structures, and two CS electives (software development and operating systems being common). I would love to take, say, an embedded systems course, but the list of prerequisites is prohibitively long because I'm not an engineering student.

  • More exposure to languages. The first two classes every CS major takes are Java (programming fundamentals and object-oriented programming), then architecture, then data structures in Java again. So, by the end of the fourth semester, a student has only been required to see Java and MIPS. I'm taking the programming languages course now, and this is the first exposure to C that most students get. Not to sound pompous or anything but I knew C before I knew Java, and watching people who are otherwise bright students stumble with it is truly a sight to behold. Lisp is only covered as part of the AI courses (the languages course uses ML to introduce functional programming).

  • A cirriculum that's not straight out of 1998 would be lovely. This isn't really a problem as far as theory goes, but I'm told this is particularly bad in the software development class (version control is barely covered, for example). And, as I said, a student with no previous experience coming in gets to start with Java - and there's also a Visual Basic class, typically taken by nonmajors, but also those majors who aren't comfortable with the Java class.

Basically we have a really weird balance to strike between practical knowledge and theoretical foundation - and a lot of this stems from the fact that the introductory courses have to cater to CS, engineering, web design, IT, math, and physics majors - I'm not sure what the best way to solve it is. I personally would advocate doing the introduuctory courses in Python and then introducing Java at a later time, but the "everyone uses Java in the real world" mentality is strong.

share|improve this answer