What I wish I learnt in my computer science classes?
I have attended two different universities in France. I got my bachelor degree in Computer Science in a tiny university close to my hometown. Then, I moved to a bigger city to study in an engineering school, and graduate in "Computer Science: Software and Networks". I also spent two semesters at Laval University, in French-Canada, which was a really great experience.
After two years working as a software engineer, there is a lot of things I wish I had learned at school and some other less.
Note: I have also been doing an internship in a UC university where I have seen how different studies were in the US, so this applies only to french/european school in a certain limit.
This is crazy to see that testing was such a tiny portion of my studies, when it is probably the only way to ensure your implementation is correct, and that you are not going backwards when adding new features by adding also regressions. I remember that only unit testing was taught in a practical way. We had to use JUnit to prove some characteristics of triangle. I wish I would have been introduced to integration testing, mocking, code coverage and so on. I know that testing is now a big part of how I am working on my projects. I always keep in mind that I should structure my code in a certain way if I want to be able to test it easily and efficiently. By knowing how to tests, it prevents you to have a messy code in a certain way.
When I started to work at Prezi, I have been amazed that we were deploying several times a day, and that you would know in around 10 minutes if you had messed up something in your codebase. I didn't know what Jenkins was, and was really unfamiliar with Agile methodology, Kanban and other buzzwords. I just remember learning about Waterfall at school, and that it was the only thing that you used in the real-world. Scrum was mentionned but everything was always falling back to the Waterfall model.
I remember using SVN during my first internship, SVN during my second internship, and asked to push code using git for some job interviews. I had to learn them on my own, and it was greatly beneficial to me. I still find it weird when I see new employees and fresh graduates getting surprised by the fact of using git or other VCS. I think it should be demonstrated at school that VCS are helping people to work together. It should also be shown how it is used for features development, branches, staging, releasing and so on. I remember being shocked when I had to work with computer science students, close to graduate, wanting to use dropbox and email to exchange the parts of their code they were working on. That was just unbelievable for me that they were refusing to use git/svn/you name it, and such a waste of time.
I had two ocaml courses. The first one still sound pretty bad in my mind. That was not clear, not really practical. The practical assignment was something related to creating our own language (it was so boring I don't even remember it..). The second course was much better. The teacher made it sound less scary, explained how immutability was good, introduced streams, and that also changed the way I was thinking about coding at the time. I started to see states as being bad, and immutability as being error-safe. The assignments were great also, being smaller exercises, or even some small games. Functional programing is important as it teaches you another way of thinking about your code.
Ask us to create a game. Ask us to implement a web app. Don't try to trick us all the time with pointers in C, crazy design-patterns use cases in Java and a stupid use of generics in C++. That makes us having a wrong representation of the real-world problem. And don't do it on sheets of paper. Honestly, on paper..?
Put us in front of a terminal, ask us to pair-program and to push our code on git at the end of the sesssion, with some nice unit tests. That will make us better engineers, able to know what problems we are really interested in, and will make us productive faster in our first company.
Note: I might be biased as I am now working in a startup, and have been only knowing startups. If you think this is bullshit, say so. If you agree, do not hesistate to reach to me.