How to study computer science

“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’re officially elite, yet, this doesn’t 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.

Unfortunatelly 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:

  1. 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.
  2. 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.
  3. Abstract background knowledge – quite theoretical. Lots of math, formal verification aka model checking, Turing machines, lambda calculus and type theory.
  4. 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-wokers may not be “into computers” like you are.
  5. 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.
  6. Creativity – don’t 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.
  7. 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.

Published in: on September 3, 2007 at 8:59 am  Comments (25)  

The URI to TrackBack this entry is:

RSS feed for comments on this post.

25 CommentsLeave a comment

  1. It’s true that we are the masters of our own time but it’s not always possible to venture into hardcore comp sci or maybe learn the odd new programming language because of hectic schedules. That’s what most people complain about. It’s really a matter of personal interest. If only universities followed the Google strategy of giving 20% time to the students to do something of their own.

  2. In my IT degree (later specialised in CS and AI), we did three basic programming units. P1 was in Haskell. P2 was in C. P3 was in C++. I *thought* I already new how to code. Haskell opened my eyes (unlike most other compulsory subjects).

    Unfortunately, the same degree now uses Java for all three subjects. Sucks for the new fodder I guess.

  3. Maybe my old university (Uppsala, Sweden) wasn’t so bad after all. Excellent post!

    Hans-Eric Grรถnlund,

  4. The time isn’t the problem here in Germany, Rohit. From what i’ve heard, college is more strict in the US, but i fear, we will adapt to the US system with the adaption of the bachelor/master system, instead of diplomas.

    I learned a little Haskell in the second semester. A little Java in the first. The rest was pretty much programming free, which isn’t good either.

    You’re welcome, Hans-Eric. You also have a nice blog. ๐Ÿ˜‰


  6. IMHO, if you want to be a perfect computer scientist, knowing only programming is not enough. Sometimes to get the performance boost you are seeking through optimization you must travel to the center of the sun: the hardware. You may know writing programs very well but without knowing architecture there’s always something missing.

  7. Hello, Andreas!

    I’m actually returning from my first CS lecture, at the International University Bremen (Jacobs). I’m an undergraduate student here, starting my first year, intending to major in EECS (Electrical Engineering and Computer Science). I just happened to stumble upon your blog.

    So anyhow…

    Our professor actually touched on many of the points you mentioned.

    But for our first CS course here, which is General CS 1, we’ll be programming in SML.

    As far as I know, this language is not very widely known. But our prof stressed pretty much the same points as you do in your post.

    So I have two questions:

    1.) Do you know about the Jacobs university CS programme, and if so, what do you think/know about it? ๐Ÿ˜›

    2.) Do you like the idea of learning SML for a general-CS course during freshman year?

  8. Good points mentioned. I think your ways to handle this subject is excellent.
    There are always 2 paths after the U education : 1. to further pursuit the pure academic. 2. to jump to the real world situation.

  9. I think it important to introduce people brand new to CS with a language like Python, Scheme, or even good old Logo — one whose syntax stays out of your way so you can concentrate on the essentials: algorithms, abstraction, and how programs compose to form bigger programs.

    Then, by all means, teach them Java and C++. They’ll be better prepared to absorb the complexity.

  10. Yes, Hardware can be important. I mention that under “algorithms and data structures”. I could have made that an extra point, though.

    Sorry, i don’t know the International University Bremen.

    SML as a first language? It’s a research language with focus on types. The language itself should be rather simple, which is a good thing. You probably won’t use it for anything real.

    Try to remember the part about types and functional programming! The rest isn’t that important, unless you learn about verification.

    It is two paths after university and i still don’t know which to pursue. If you know, which one you want, you should of course adapt your studies to that.

  11. ahhh
    finally someone who speaks of the stupidity in universities when it comes to teaching computer science!
    you forgot to mention “Theory of Computation” as a must have course for anyone who wants to study computer science!
    thanks ๐Ÿ˜€

  12. The least important aspect of a CS degree is the language they use, I think. Learning a specific language is a technical task, and can be taught by certification programs. Of course it is important to program in a CS major.

    But, having made my way into IT during the 90’s, and subsequently going back to school to get my CS degree, I can tell you there’s a huge difference between applied technology and computer science.

    Here are the key classes at my school that are the essence of the science of computers:
    Data structures
    Principles of computer organization (assembly, circuits, processors, and memory)
    Formal logic and computability
    Operating systems and compilers (in which we write a compiler)

    These I think are the important things. After that you will have the understanding you need to be able to determine which programming language is best suited for a task and master that language.

  13. You must learn to distinguish between computer science and software engineering. Most people think these are the same.

    There are many talented software engineers out there. The apply knowledge and figure out efficient ways to manage and design software from the ground up. However, they might know very little about the internal workings of the computer or it’s theory of operation.

    On the other hand, you have your computer science student. This person knows about how the computer works and how it is organized. But more importantly, they know how to think and solve problems, then they use their knowledge of computer science to get the computer to do the work for them. These people might not necessarily be very adept software engineers.

    Sometimes you’ll have a mix of the two. A hybrid, and depending on the balance this type of person is extremely useful.

    One thing is for sure, if you ever find yourself overly preoccupied with learning a particular language, then you’ve probably missed the boat, and you are probably not a computer science student or a software engineer. In this case you are a computer programmer.

  14. I’d like to agree, gassendi, but i don’t think you can easily seperate computer science and software engineering. In many fields you need a solid foundation in both. For example operating systems, compilers and AI need research and real implementations.

  15. I did a post like this a while back where I thought about what was missing from university curriculum for programming.

  16. I find that University level programming is often not applicable to the real world. It’s a common situation where a 1st or 2nd year CS student is doing well on the C++/Java assignments, and then is completely lost during the work terms in between school.

    So I think it would be good to see other programming languages used in the classroom. I’d love to take a class with any of the cool languages you’ve listed – Ruby, Haskell, Erlang or Scheme. The lectures should really concentrate on the concepts, not syntax. Since the latter on its own is hardly usable anyways.

  17. hai i’m srikanth
    how to be popular in prog lang like c++

  18. You think you can get a degree in Karlsruhe without math knowledge?
    How did you get your “Vordiplom”? You’re required to do two exams in math. One in linear algebra and one in analysis. Since those are held by mathematicians the niveau is rather high. As far as I know, the mathematic education of an computer scientist who made his degree in Karlsruhe is at a very high standard.

  19. Well, i learned some math here, Soeren. I managed to evade some topics. For example i had to learn Fourier analysis now, but should have learned it two years ago by curriculum.

    My experience and what i hear from others let presume the possibility that you can get a degree and know nothing more than you learned in school.

    On the other hand our definition of what it means to “know” something may be different.

  20. To preserve a link: 10 Lessons of an MIT Education by Prof. Rota

  21. Program = DataStructure + Alogrithm, so, I guess math is of crucial importance to CS study.

  22. i think for computer science n programing n all u need very strong logical and analytical skills. CS students should keep doing puzzles n stuff to get their grey matterial goin .

  23. I am a second year computer major . So far, I have no problem with computer programming courses ( i.e. C++, Java, Assembly etc…) . However, I really have a difficult time with theoretical courses such as Data Structure, Algorithm , pProgramming Languages etc…
    Maybe I do not know how to study abstract subjects ?
    I would like to have some advices in dealing with these tyoes of courses. Thanks..

    Best regards,

  24. I think in the first two years only dot net 2005 should be thought as it has everything in it like SQL, C++, and

  25. I’ve studied in Germany as exchange student for one year and I should say that german informatik(they say it is a CS) is something like between software engineering and com. programming. In my opinion the name of “CS” should be given to this deps.

    By the way, the 4.and 7.topics are not related with CS at all=)(my idea)
    CS is shortly: knowing arch of Comp, computaional theory, DS, Automata The.,math(like linear algebra,diff.equ,numerical analy.,stats…) and so on ๐Ÿ˜‰

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: