Hi! Thanks for stopping by. After a previous post received 106 comments and generated thousands of views and reactions, it made sense to write about the other side of the coin: skills colleges never teach programmers. Let us take a look at a few, shall we?
There is no doubt college has become the industry requirement for getting a job – however, does it really teach you everything you need for the real world? It seems the obvious answer is an astounding NO!
That being said however, college does give you the foundation for computer science knowledge (in any of the majors related to computers) – but they don’t usually encourage people to build upon those skills. There are a number of professors that are bias towards a single platform (or technology) such as just Windows, Linux or Mac - this in turn decreases the quality of software that people are developing (outside of missing skills for other platforms/technologies).
Now, obviously, one cannot learn every technology, at the very least in 4 years but programmers should at least be aware of some tools, caveats and dangers. I will mention just a small list of what I think many programmers come out of college without.
- Technologies can be fads and learning Framework X could be superseded by Framework Y in a short time. Sometimes those technologies are similar enough that you don’t need to learn anything new. An example: XNA: The first version of XNA was created in December 2007, the last version was released in October 6, 2011. This framework was only around for four years and yet produced many great games and is still a good framework. However, another group of people took the layout of the API and created MonoGame. The big difference between MonoGame and XNA is that the former leverages OpenGL and can be deployed to a variety of platforms such as iOS, Android, PlayStation Mobile, Windows, Linux with the same code. This comic shows how out of control this issue can be. Another example of this are source control systems. Subversion, or SVN, was first released in October 20th 2000. Git was released in April 7th 2005 – only five years after SVN. Now, SVN is still supported and used today, but systems like Git and Mercurial are starting to take the market share. Free services like github and bitbucket allow a developer to easily setup git hosting so a lot of people are ditching SVN (including myself) for git. The skill here is: move with the industry – it is bad to stick with the same thing because you don’t want to learn something new. Arguably not every new technology will be useful but it does have the possibility to really help you in your projects.
- Another important skill colleges don’t teach is the skill to FAIL. There is a great quote by Albert Einstein “ Anyone who never made a mistake has never tried anything new”. In the classroom you have a safety net from the professor – if you are stuck you can ask them and generally they should be able to help. However, sometimes great ideas require failure before they mature into something useful. A classic example is during the 1980′s Tim Berners-Lee went through several ideas of what would eventually be the internet today. My point is that sometimes you work on a project only to scrap it but the lessons you learned from that project can be used for the next one as a sort of guide of what works/what doesn’t work.
- In today’s age of cheap hardware and unimaginable amounts of RAM in a system, programmers don’t have to be concerned about fitting their code into a 16K limit. They can instead develop software that utilize gigabytes of RAM and usually there is plenty left for other processes. Especially with the advent of Swap memory - on OS can write out memory for applications from RAM to the hard disk and then back to the RAM again when it needs to execute instructions – this is obviously slow on a spinning disk but may not take too much of a performance hit on a SSD. This brings me to this point: many aspiring programmers are not concerned with efficiency of their applications. This skill is especially important because while a developer now a days has tons of resources to work with – slips in efficiency does add up. In my time, I have seen developers make copies of large arrays when it wasn’t necessary, pulling entire databases. I have even worked on applications that required 16GB+ of RAM and quad cores and still took several (6+) hours to perform its function. In today’s day and age, one should be very concerned about how well their applications perform. I will list out some tools that I have used/know about:
- The fourth skill is Open Source. Open source licences are a topic that I don’t think is ever mentioned in college and it’s arguably one of the most important things you should know about as a programmer. Many open source licenses are very loose in what they require – however, the GPL is probably one of the most restrictive out there. You could be an indie developer who may make a game or some software and want to release it on the various markets and platforms but you may not want to release the source code. If you used ANY GPL code in your software – your entire project must be licensed under the GPL (except under certain cases such as dynamic linking). This is very important because if you do release software with GPL you MUST release the source code (or provide instructions on how to get the source code). Of course if you don’t distribute the software then you do not have to give out the source. However, this is still an important topic that programmers need to be aware of when choosing to use other people’s libraries in their own projects. With that though, a programmer can ask another programmer for special permission to use it in such a way that violates the licence. An original author does not waive their rights over software by releasing it under a licence – the licence just says “here are the terms which you can use my software without asking” but since they own the rights to that software, they can give exceptions to anyone who wants it. Giving special exceptions does introduce its own problems as now there is code base floating around under a different licence – which may or may not be a bad thing. If your project is inactive – it really doesn’t have any effect but if your project is active and you are releasing new versions, it could cause confusions and even friction in the open source world! Here are some resources on licenses - http://www.tldrlegal.com, https://news.ycombinator.com/item?id=1011426
Those are just a few of the important skills college will not teach you. There are many others like how to deal with people and communication.
Thank you for reading to this point. If you liked this post, please share it with your friends online using the buttons below. If you have questions or comments, please do not hesitate to ask.
If you are on Twitter or Facebook, please consider following me or liking my page and I will do the same.
Thanks again and see you soon!