By Aroj George
This is a continuation to my previous post on how to graduate from an apprentice to a star developer.
Success can’t be achieved by merely being technically good. To really succeed, one needs to grow along three different dimensions:
- Technical Skills
- Engineering Practices like CI, TDD, Agile etc..
- Soft Skills
This post is going to focus on a mix of the above three.
I have no special talent. I am only passionately curious.
— Albert Einstein
Curiosity did kill the cat. But only then did we realise it has nine lives 😉 Sadly, curiosity is the one thing I find lacking in most graduates. Is it the education system, which over focusses on exams and rote learning, that’s to blame here?
Regardless, it’s important for a candidate to be passionately curious. Look at what your pair is doing, ask questions. Ask what keyboard shortcut they used. Ask why did he/she refactor that code. Ask why are things done the way they are done. Don’t be happy with high level answers. Grab the chance to dig deep, ask more ‘why’s’.
- I am curious by nature. I can’t rest until I really know how things work. I used to learn a lot by just tinkering with code. Make a small change here and there, execute the code and see what happens. This is why I love languages with REPL.
- When I was learning C#, I was fascinated by LINQ and lambda expressions. And I used to look at the decompiled bytecode files to understand how these things work!
- “Aroj, they don’t really teach us all this OO stuff in college.” True, but then how did I know the difference between Abstraction and Encapsulation right out of college? Because I was curious enough to go read about it and understand it.
At GO-JEK, Agile takes an entirely new definition. We do about half a million orders per engineer each month. We move fast, ship code fast.
What makes us really agile is our ability to respond fast and effortlessly to changing business requirements, with confidence. We welcome change with open arms. Most organisations are afraid of changing software, because change is difficult and change can break many things, some of them even seemingly unrelated to the change. Change can be costly.
But what makes us unafraid of change, and hence truly Agile, is our core engineering practices, like TDD, Refactoring, Pair programming, Continuous Integration (CI) and Continuous Delivery (CD).
So if you focus on mastering these core skills, you will go a long way towards becoming that star contributor.
Ah, how difficult is it to force yourself to write tests when you don’t even know what the code is. Many would rather write the code first to at least understand what to do and only then write the tests afterwards.
Yet, for most of us, we can’t think of any other way to write code. It’s actually much more fun to think out the test cases first and let your tests drive your code, than the other way round. We love the rhythm of TDD.
It’s a super important skill to acquire.
- For me it was pairing with other experienced colleagues that helped me learn TDD.
- And by making mistakes. The more you make, the more you learn.
- And experiencing that aha moment one fine day, when I realised writing tests first have led my code to be much better than it would have been otherwise.
So my only recommendation is to not give up, and keep pairing with the people who are good at it.
Object Oriented Design
Writing good OO code is so important we often do cover this during the interview. Thankfully, we have an Object Bootcamp to help anyone ramp up on this aspect. So do sign up for the OO Bootcamp whenever it’s scheduled for! Check out @gojektech on twitter for more.
But if there is one thing to learn about doing good OO design, it’s this: Understand how to identify missing abstractions and fix it by refactoring and taking care - that the code you write is not breaking encapsulation in any way.
1. Tell, Don’t Ask Principle
Procedural code gets information, then makes decisions. Object-oriented code tells objects to do things.
— Alec Sharp
If there’s one thing you want to learn, learn the Tell, Don’t Ask Principle. If you understand this, everything else will naturally follow.
This is also the number 1 mistake I see most newbies making.
As Martin Fowler highlights, please don’t do a am.getAlarm().warn(). Don’t dig into the internals of an object and operate on that data. Rather co-locate data and behaviour and delegate to that object.
2. SOLID Principles
Next, learn the SOLID principles.
- SRP: The Single Responsibility Principle . A class should have one, and only one, reason to change.
- OCP: The Open Closed Principle. You should be able to extend a classes’ behaviour, without modifying it.
- LSP: The Liskov Substitution Principle. Derived classes must be substitutable for their base classes.
- ISP: The Interface Segregation Principle. Make fine grained interfaces that are client specific.
- DIP: The Dependency Inversion Principle. Depend on abstractions, not on concretions.
3. Design Patterns
And now with your OO foundations set, it’s time to move on to learning the various design patterns.
You can pick up any book to learn Design Patterns, but I can highly recommend Head First Design Patterns. Don’t expect to understand everything or master this in one shot. This is one of those things you will understand better after applying them at work.
Continuous Integration (CI) & Continuous Delivery (CD)
This is a key engineering practice at GO-JEK. Yes, everyone knows what CI is and how it works. But do you really ‘get’ it?
- If so, then why do you end up coding on a branch for a very long time?
- Do you practice small and frequent commits?
- How do you ensure your incomplete feature can still be integrated into the ‘master’, without breaking it.
That’s when you realise CI is not a tool, but a mindset.
You need to think, how soon can I integrate my work, gain feedback and iterate. If you work alone on a branch for a long time, not only do you diverge a lot from the master, but you also end up not having the team ‘eye’ your code. If it’s on master, it’s visible to everyone and impacts everyone. So any big issues, will get found out faster. CI then is nothing but continuous feedback!
Continuous Delivery (CD) is then a natural extension to CI — where you take things beyond and use QA and Infrastructure automation to ensure frequent releases for continuous Business Feedback.
At GO-JEK, our Gitlab deployment pipeline leverages Chef to enable One-Click deployments to Production.
CD is a vast topic, so you should definitely go through the Continuous Delivery book by Jez Humble.
Do you really think Sachin Tendulkar will try out a new shot in a cricket match? No, he would have practised that new shot a hundred times till he’s completely confident and happy. No cricketer or any sportsperson will go into an actual match or sporting event without adequate practice.
Yet, why do many programmers think they can just ‘learn on the job’.
Practice. Do it outside of core working hours too. Coding should have passion. Take time out on weekends. Even a small 1 hour session is fine. But do take out that time and practise things that are new to you. Until you truly understand it. Technology is changing so fast, today’s fad, is tomorrow’s flop.
- That’s why I love the idea of Code Katas. A set of exercises with increasing levels of difficulty to hone your skills.
- And that’s why I love the Learn the Hard Way series, which is also very exercise driven.
So stop being lazy and stop making excuses about not finding time. If you truly want something, you will automatically carve out the time.
I would like to wind up with something that I have always believed in,
The more you sweat in peace, the less you bleed in war.
And this requires another key quality, discipline.
From the moment they wake, they devote themselves to the perfection of whatever they pursue — I have never seen such discipline. I am surprised to learn that the word Samurai means, ‘to serve’
— From the movie, The Last Samurai.
Even the mighty Samurais practice their skills with great discipline. Do watch the above clip from the movie, it’s inspiring!
Hope the above mix of technical, engineering practices and soft skills gives you a good outline of the things to focus on your path to being that rockstar developer. It sure has helped me grab my chance to work at GO-JEK and keep learning from amazing colleagues.
Speaking of amazing colleagues, we’re hiring! Check out gojek.jobs for more, we have developer roles across geos. After our expansion plans were announced, we’re looking for MORE rockstar developers. Join us!