“What school teaches computer science right?”, someone asked on programming.reddit.
My university is one of the best here in Germany according to the CHE rating. We are officially elite, yet, this does not guarantee a good education. It is possible get a degree and have no clue about programming, math and science at the end.
The question was primarily about the programming languages used, i.e. do the lectures use languages other than Java/C++. The right thing, as implied by the author and the community, would be to teach cool languages like Ruby, Haskell, Erlang and Scheme.
Does the choice of programming language influence the quality of education? No. Learning Java and C++ is a good thing, since most of the software is written with those, but a teacher, who uses Java/C++ for everything, even when it is inappropriate, shows a lack of wisdom for me. Trying to explain Functional Programming with Java is funny at best.
Unfortunately it is unlikely that you learn any cool language in any school. As with most things, you have to do that on your own. A university can only give you resources and opportunities. Everybody knows that lectures and pen&paper tests are the worst way to educate.
What you do with your time is your responsibility. Here is my list (mostly scooped from w-g), what you should do or learn:
- Programming paradigms – imperative, object-oriented and functional programming. Try to learn a language for every category. Example: C (procedural), Java (object-oriented) and Haskell (functional). If you know every style, you will program much better, especially when you use multi-paradigm languages, like Python, C++ or Scala. Addons are Assembler, Prolog and Forth.
- Algorithms and data structures – Complexity theory, optimizations, searching, sorting, cryptography, AI, graphics. Dig deep to the hardware level and learn about instruction sets, caches and architectures. Compilers and operating systems are the high end topics here.
- Abstract background knowledge – quite theoretical. Lots of math, formal verification aka model checking, Turing machines, lambda calculus and type theory.
- The human side – project management, design patterns, UI design, psychology. You will have to deal with people, who think very different than you. Managers, customers and co-workers may not be “into computers” like you are.
- Practice – with the Open Source movement, you have a wealth of projects, who would like to get a hand or two. You’ll learn to deal with people and foreign source code. You’ll also gain familiarity with some tools like version control, IDEs and wikis.
- Creativity – do not forget to do other things. Music, design, drama or whatever you like. Your brain has two sides and not both are for logic. Creativity and outside the box thinking can be learned and nurtured.
- Personality feats – university is a good place to develop yourself. Learn to work with discipline, to stay healthy and fit and to be social! Train good habits and starve the bad ones! Read a lot!
The choice of the university is mostly important for the piece of paper you get at the end. The education you get depends on you.