I had a nice chat this morning with our new intern, who's due to start working with us this summer. One of the things he asked me was if I could give him any tips about things he should be looking to learn in order to advance his career in programming. In my mind, I started formulating a list of programming languages, web frameworks, libraries and technologies. I was then struck by the thought that most things on my list would be obsolete in 5-10 years. I considered whether knowing the intricacies of a specific language, or how a framework is put together or how the Model-View-Controller paradigm works, was a solid foundation for a successful career in Software Development. The clear answer to my own question was that no, all these things are transient. They are here today, gone tomorrow.
An old proverb sprang to mind: "You give someone a fish, they'll eat for a day. Teach them to fish and they'll be eating for a lifetime".
So this is what I told him: "Learn whatever catches your eye, excites you and you feel comfortable with. But whatever you do, keep in mind the following":
You'll be spending one of the biggest parts of your life working (the other big part is sleeping but we can't help that). If the tools or people you're working with frustrate, impede or depress you, then change them. Sometimes, this may require changing jobs. That's fine, you have no obligation to suffer in exchange for money or out of some mis-placed sense of loyalty. By enjoying what you do at work, you're going to be better at it and more productive. Enjoying being round your colleagues will make you more collaborative and help you learn new things. Most importantly, by working in an enjoyable environment you will also be safeguarding your mental health, this most precious of goods.
To be a good developer you need to be able to code. To be a great developer you need to be able to:
- Communicate your assumptions and expectations to others.
- Empathise with others and understand their point of view.
- Plan ahead with forethought and discretion.
- Manage other people's expectations of you.
Unfortunately, there aren't any boot camps for these skills. These are skills you need to hone and cultivate yourself. They take time and effort and not everyone manages to accomplish all of them. But mastering these skills can make all the difference between yet another coder and an effective software developer.
You may not think so, but, trust me, you do. So what does this mean? It means that when you write code you must keep in mind that someone else (or even worse, you 12 months later) will have to read it. So make sure your code is readable, well-documented and trimmed down to what is needed to deliver the intended piece of functionality. Ensure your codebase is not bloated with clever code hacks or complex design patterns and architectures which only exist to inflate people's egos or adhere to some dogmatic pattern or methodology. Keep your code simple, modular and readable. Your colleagues and future self will thank you for it.
Everything changes over time, but there are things that change at predictable occasions or at regular frequency. Make sure these things are separated from stuff that doesn't often change. So keep your UI code well away from your business-logic code. Keep your data-reading code away from your data-formatting code. If you are dealing with external APIs, hide them behind an adaptor or facade. The APIs will be changing a lot more frequently than your internal usage of them, i.e. your facade. Apply this principle throughout your code and designs.
Never try to build a complete and perfect system in one go. Focus on the most needed and clear features first and provide the simplest working solution to them. Then build-up your project over many iterations, each iteration refining existing features and delivering new ones.
If you're not sure what an iterative and incremental approach is, then this should help clarify it.
Do not try to anticipate future needs without solid evidence that these needs are likely to arise. If your web-site ever needs to handle 10 zillion requests per minute then don't worry, at that stage you'll be making enough money to comfortably retire at your own private island, so focus on that instead ;) .The point is, do not optimise pre-maturely, 'just in case'. Do not work on the basis of 'what-ifs'. If you do, you'll only add unnecessary complexity in your code, increase the likelihood of bugs and reduce its readability. On that note, prefer languages and frameworks that promote flexibility and ease-of-change.
To quote Mr Brooks
There is no single development, in either technology or management technique, which by itself promises even one order of magnitude [tenfold] improvement within a decade in productivity, in reliability, in simplicity.
Over your career you'll see many 'hotnesses' come and go. You'll hear people raving on about the fastest web framework, the coolest design paradigm, the best programming language, and so on. All these things may be true within the narrow slice of reality of the people clamouring for them, but they are not necessarily true in your reality. Complex problems, like the ones we face in software development, are never solved by simple solutions, like using a single programming language or web framework. Never be fooled by thinking you found that one thing which will solve all your programming problems.
In nature, the species of animals more likely to survive are the generalist species, that is the species which can exploit different environments and food sources. In contrast, the species more likely to go extinct are the specialists, the ones that rely on a single food source or can only thrive in one environment. The same applies in software development. Do not put all your eggs in one basket, as the saying goes. The ability to do many things well, will see you farther than the ability to one thing brilliantly.
Here you go, I'm sure there are a couple of more items I forgot to add, but I think these capture the fundamental principles I've learned over many years as a software developer. I wish someone told me these things when I was first starting out. Hopefully they may help someone else, so thanks for reading and feel free to add your own advice in the comments.