Wednesday 10 February 2016

Studying, becoming a scientist, becoming an engineer.

A degree in informatics or computer science. Magical words, dividing so many tech people into supporters and haters. I often hear "I wanted to make computer games and I am forced to understand numerical methods. I don't need them! I've got Unity!" And I wonder where we went wrong with understanding what this is all about?

I may be personally biased as I do hold a degree in science. BUT I do not think that a degree is the only right way, nor do I believe it is a waste of time. It should be also noted that information technology, software and hardware are generally quite different from many other disciplines, so some statements are definitely not meant to be applied outside IT.

So, you wanna be a software engineer? That's a great start. Now there are a few things that should be taken into consideration. Do you want to write software and be great with it, or do you want to understand software inside-out? It may appear to be a stupid question, but imho it is far from that. How can you do something without understanding it?

Well, maybe you can't. But the level of understanding is another story. You can make bread without knowing all the chemical processes going on inside. Similarly, you do not need to understand how compilers work to write good code. Nah, you actually do not need to know what memory management is, how IDEs work or what are the internals of some data structures to write software to some extent. You only need to get some abstractions to start coding, understand what the code does rather than how is it done. Because if you are going to write some basic JavaScript stuff then you may be better off investing your time in learning about web development in general, rather than algorithms, microprocessors and databases. However, there is always a "however".

If you are going to write large systems, you probably will need to understand some more complex concepts from informatics and computer science. Willing to highly optimize your critical code you do need to know what is going on when your code is compiled and interpreted. And if you want to make it even faster, you probably would be much better off knowing some stuff about how CPU works. So, should you get a degree if you want to work on complex systems?

As always, it depends. It is never obligatory to take a course. There are less and less companies that care about your title rather than your skills, and there are plenty of books and online courses on pretty much all CS-related topics. In other words, if you prefer to, you can learn everything you need on your own, and make some project to show your skills. Make it open sourced and throw a link to your resume - it is often better to have stuff like that than just a degree. Because remember: the degree is kind of a confirmation that you had courses on some particular stuff and that you passed some tests. Your skills may be another story, if you do not take care of them.

One of the greatest misconceptions I see reading blogs or listening to people is thinking that studying informatics or computer science aims to make you a software developer. But why would that be? CS is much broader than just programming, and not every great computer scientist is a great programmer! They may be amazing algorithm designers, hardware builder, researchers or developers. Programming is like a subpart of informatics and thinking otherwise is often very misleading. So a computer scientist ≠ software developer. Just like a car expert ≠ a great driver.

So maybe the right question (and not an easy one) is: wanna be an information scientist, computer scientist or software engineer? Those are not exclusive, of course, but there are significant differences. A computer scientist can be a great software engineer, and vice versa. BUT a computer scientist may also suck at writing software or a software engineer may not understand all complex ideas behind some libraries. And this does not make them bad professionals - just their particular field of expertise may lie somewhere else.

Another thing is using "programming" and "software engineering" meaning the same job. Well, this is not quite right and it is not a matter of me being picky here. As a software engineer you should:

  • understand your client's needs
  • design solutions for them
  • write code that implement those solutions (programming is here)
  • deploy that solution so that they can actually use it
Programming is only a part of your job, and this often leads to people being unhappy because this is not how they imagined their job. What is a solution then? The weights of different elements form that mix may vary from company to another. You may find some corporations or startups where your only role is to write code, given some specification. There are also other ones, where you are actually expected to translate natural language requirements to some software related constraints. And this is all software engineering!

So if you went for an informatics course do not be surprised that you are expected to understand Turing machines, Shannon's theorem and numerical methods because as an information scientist you are expected to understand how stuff works, rather than just what it does. But if you "just want to make computer games", maybe a better option would be start with some existing tools and engines, and if you need to get into more complex stuff you can learn that along the way. At the same time remember: the most innovative, cutting-edge technologies are usually developed by people who really know what is going on down to the processor level. In other words, you probably need to get some differential equations to build like an amazing graphics engine. It is not magic there, its beautiful science and engineering behind.

When I see all that "skills not school" stuff it gets me kinda surprised: why would anyone think it is about the degree? If you finished a CS course on a great university, does it make you a great software engineer? Hell no! BUT it tells your potential employer some things about you, that you should know some concepts that may be very helpful for a successful engineer. On the other hand, if you finished a Software Engineering course on an even better uni, is that enough! No no no! It is all about what you learned rather than where you went the past few years. You may use studies to your advantage, learn a lot, meet great people and truly become an expert pretty quickly. But if you do not take care of that yourself, why do you expect your teachers to pack knowledge into your head?