My geography teacher once told the story of her first university lecture. As an introduction, her professor asked the class to draw a map of Germany without any help and as accurate as possible. To her surprise she was not able to fill the map with much detail. Even the shape of the country was a bit vague.
She had seen thousands of images of Germany (her mother country) but wasn’t able to reproduce it from her blurry memory. She would have to look it up.
Doesn’t this sound familiar? We rely on machines to manage large potions of our knowledge. There’s hard work involved to learn something by heart.
Here is a similar test for programmers:
Using a programming language of your choice, write a correct sorting algorithm with an average runtime complexity of O(n*log n) (Heapsort, Quicksort, Bucketsort, you name it) on a piece of paper without the help of any external tools.
And by correct I mean it must be free of bugs without any modifications when you type it in.
You would be surprised by the large percentage of professional software engineers who can’t pull this off.
Some might argue that knowledge about details of programming language syntax is unimportant: “Why learn all the little nitpicks when you know how to use a search engine? Why start from a blank sheet when you can easily copy, paste and modify an example from a tutorial? Every few years/months I have completely relearn the syntax for a different language anyway.”
But that is a myth. If you know only one programming language really well - even if it is something outdated like Fortran or COBOL - you could easily earn a fortune with that knowledge. Suppose you started with C in 1975. You could still use the same syntax today - almost four decades later. Same for text editors. Emacs and Vim are both decades old. They are battle-hardened. I don’t care which one you prefer but you will spend most of your life with these tools so invest the time to use them really well.1
If you don’t know how to use your tools without a manual, you are a bad craftsman. If you need a dictionary to write a simple letter, you will have a hard time being a writer because it would already be challenging for you to form elegant, fluent sentences – let alone engaging and original stories. I don’t want to read these books.
What makes a programmer?
- She has at least one programming language she knows inside out.
- She is able to implement standard algorithms (i.e. for sorting, searching) and data-structures (i.e. trees, linked lists) which are robust and reasonably fast on the fly.
- She has at least a basic understanding of complexity theory and programming concepts like recursion and pointers.
But, to be a good programmer, you should
- Be able to code in at least two fundamentally different programming paradigms (i.e. declarative, functional).
- Have experience with big software architectures.
- Be familiar with your programming environment like the operating system and a sophisticated text editor of your choice. Preferably one, that is easily extendable.
And that is just the tip of the iceberg. “There’s too much to learn!”, I hear some of you say. Start slowly. You need only three commands to start with Vim:
:wq. That’s enough for day one.
I realize that most of these essentials won’t be taught during lectures. You have to learn a huge portion on your own. But let’s face it: If you don’t know this stuff, you are not a programmer, you’re a freshman.
More? Here's a list of all posts.