Last couple of weeks, a few things happened that made me think. First, I started building a prototype for a Java application in Grails using Eclipse. Second, I wrote some small tools for Mozaic Works in python using Eclipse or vim. Third, I am involved in a startup that uses PHP to develop a great game. Fourth, I had my first TDD in C++ workshop in Stockholm. And, not to forget, my laptop runs Ubuntu.
I compared my last weeks with who I was 7 years ago. For my entire developer live, I used Windows and Visual Studio. I switched from C++ to C# in the 2000s, because it was new and better for the kind of applications I was doing back then. I knew a lot of things about Linux. I played with some scripting languages and was starting to like them. But why bother more?
I was lost for a while, caught in a dilemma. I wanted to learn more, but I couldn’t find a reason to change. I was increasingly annoyed because I wasn’t moving forward, but it’s so good in the comfort zone! I guess most developers in this situation become managers or settle. Fortunately, I didn’t want to be a manager and a series of events pushed me forward. Some of these events are private, of others I’ve wrote before. The result was a direction to focus on:
I learned I wanted to master the fundamentals of programming, the things that help you no matter the technology you’re using.
I can now summarize a few key learnings that allow me today to write code fast in any programming language:
* **Think more at the problem than at the solution.** If you don’t understand what you’re trying to solve, you won’t solve it. If you cannot split your problem into smaller problems, you’ll certainly miss details. Once you do split the problem into smaller and simpler problems you will be able to prioritize and have results in a matter of hours instead of days.
* **Learn how to learn.** Different people learn differently. I’ve learnt how to learn by reading books, reflecting on my learning experiences, observing and teaching others. If you improve your learning speed just a bit, you’ll grow faster which motivates you to learn more.
* **Listen to your code.** We see things like code duplication as code smells. You can also see duplication as a better design waiting to happen. If you learn to understand what the code is telling you, your code will be better. And by better, I mean: easier to change, easier to read, more flexible.
* **Master your tools.** Do you know everything your editor is capable of doing? Can you do a refactoring like rename or extract method in 5 seconds? Can you find the class, method or function you’re looking for without browsing the file system? While these things seem trivial, you do them thousands of times a day. If you can do them in half time, you have extra time to program more, read blogs, drink coffee with colleagues or hang on Facebook – whatever you prefer.
* **Learn a tool with a different paradigm.** If you know Eclipse of Visual Studio by heart, learn vim. Seeing another paradigm expands your horizon.
* **Understand design principles.** SOLID principles, design patterns, the Unix design principles, the four elements of simple design emerged as solutions of practical problems. If you’re serious about learning them, you should know things like: what MVC is and how it is used in Smalltalk, Django, ASP.NET MVC and Spring. Or how does MVC relate with SOLID and with the elements of simple design.
* **Learn another programming paradigm.** If you know OOP, learn functional programming. You can now do functional programming to some extent in all languages. C# has support for anonymous delegates and LINQ, Java supports anonymous classes, even C++ has introduced lambda support. Once you do this, you can ask interesting questions like: how do SOLID principles apply in functional programming? How about the elements of simple design?
Once you walked this road, there’s only one thing stopping you: the technology you’re using. Move forward, learn another programming language, other frameworks and use everything you learned in all the languages you use. Congratulations, because you’re not only a Java/C#/PHP/C++/… programmer; **you are now a programmer**.
This is my story. I am proud and happy to be here, and I am eagerly waiting for my next challenge. I hope you will too.
*Photo attribution: http://www.flickr.com/photos/skinnyde/62859435/sizes/z/in/photostream/*