"With hardware, theoretically anything is possible." - This statement emphasizes the limits of hardware. Theoretically you can do whatever you want, but you're limited by the material the earth provides. I admit that human beings are highly innovative - memory chip designers happily use techniques today that were believed to be physically impossible not long ago.
"With software, practically anything is possible." - Software has no inherent limitations. The concept "software" consists of a bunch of algorithms neatly packed together into a structured specification of how to solve a problem. Of course, software is limited by the hardware it is run on, which is why I usually have a problematic relationship with hardware which sometimes leads to mutual physical violence.
There is a point in the life of a software developer when you realize this (the limitlessness of software, not my problem with hardware). That realization marks your promotion to Programmer Level 1. At that time you usually know a bunch of programming languages, acquired some basic algorithmic competence and finished some minor projects. You leave the hunting grounds of not knowing how to implement things and ascend to the heavenly plains of being capable of anything.
You're Turing Complete.
It's tempting to stay at this level. It's a great feeling - you know that you can do whatever task comes your way. You are a professional. All you need is somebody to tell you what she needs and you'll develop the solution. Some of them will need some creativity with regards to runtime performance, but hey, that's just another technical challenge. There's nothing more you need to learn besides exciting new technological tools.
It's even more tempting to completely ignore level 2. Some people even vehemently deny it's existence. Acknowledging level 2 is the first step on your long journey to the highest programming nirvana. You'll reach level 2 once you can write maintainable software. If you ask "now, buddy, what is so hard about that?" then you're a long way away from mastering level 1.
The principle behind maintainable software is easy:
Write software that your fellow programmers can understand.
The easier it is for others to understand your code, the better your code. So how can you write understandable code? This is the hard one. It's not easy. There are no "top ten guidelines" you follow and somehow become a good programmer over night. There's no "30 minutes Howto for Dummies". It means hard work. It means lifelong learning. And it means to have a certain attitude towards coding:
- Be a teacher. Write code that teaches the reader what the program does. Don't be the Riddler. Communicate your intent clearly.
- Be a student. Watch how people react to your code. Be open to ideas and criticism. Learn from your fellow coder.
- Be pragmatic. Don't do stuff "just because". Always know an answer to "why". Introduce convenience to get things done.
- Be a methodologist. Be fierce when sloppiness threatens the clarity of your design and code. Don't give in to convenience if this makes it harder to read your code.
Reaching Programmer Level 2 is an ideal, an illusion. When you realize that being able to code anything is not enough you somehow enter Level 2 metaphysically, knowing that you'll never reach it for good. But if you want to enter the life long journey and defy the perils of the Code Monster, here's a hint on how to start: