Saturday, 25 June 2016

80 ways to become a 10x developer

The notion of a 10 times more productive developer has long been a controversial topic in the dev-world. Is it really possible for developer A to finish a product in 1/10th of the time developer B would use?

I would say yes if the circumstances are right. Developer productivity, performance or efficiency is a fuzzy concept in the dev world. It is inherently hard to measure productivity because it relies so much on experience, knowledge and creativity. There are infinite ways to complete a piece of software.  For comparison, lets take the job of building a house. In the construction engineering discipline there’s highly established practices for how to construct and assemble the pieces of the house. All the building blocks are standardized and well known. In the dev world we are often free to do whatever we like. We don’t rely on physical items with known tangible properties that need to be put together in a specific way. Instead everything is just lines upon lines of code. Everything is abstract and can be written in infinite ways as long as it compiles.

The 10x developer is a misleading term as there is no agreed upon evaluation criteria and no established way of measuring it. Anyway, in this blog post I’ll list several ways I believe can propel you towards becoming 10x more productive. I am not saying I am a 10x developer but here are some ways I myself and others I have observed have become more productive.
  1. Improve your typing skills. Buy the Das Keyboard, a completely blank keyboard with no letters.
  2. Learn OS and IDE shortcuts so you don’t have to move the hand over to the mouse.
  3. Get an overview and basic understanding of different tools and frameworks out there. This will help you choose the right tool for the job. 
  4. Learn about the pros and cons of Open Source and the different licensing models. Learn when to build it yourself and when not to. 
  5. Get deep knowledge in architecture, programming languages, algorithms, coding best practices, clean code, design patterns, agile methodologies, XP, unit testing and the other core things related to the art and craft of software development. 
  6. Improve your memory. If you can remember details you save time trying to look things up. Do memory exercises, learn recollection techniques etc.
  7. Improve your cognition. If your brain can operate at a higher speed you will be able to learn faster and connect the dots faster making your productivity higher. Although you are born with a certain IQ, you can always maximize your cognitive potential. Exercise your brain and stay sharp by always challenging yourself.
  8. Be flexible, open-minded and tolerant. If you are, you will be better liked and you’ll have a positive work environment. A good work environment gives you energy and you will boost your productivity. 
  9. Learn how to most efficiently use Find and Replace also with regex.
  10. Remove repetitive work. An example of repetitive work is writing boilerplate code. Writing boiler place code does not make you a better programmer. You want to do things that serve multiple purposes. Use better tools, make code that writes itself, automate etc.   
  11. Work hard and show you have grit. Show that you are willing to get your hands dirty. Don’t shrug off tasks you think will be hard or boring. You do it knowing it has to be done in order to get on with the more fun work. If you constantly complain your way out of tasks that has to be done anyway you just kill productivity. Sacrifice yourself for the team and do the boring task. Over time it will pay off. Show-stoppers or impediments usually escalate. Over time more and more people get invovled in discussing how to deal with it, as time goes there'se more and more noise. All of it could perhaps be avoided if you just sat down at the outset and just fixed the darn issue.
  12. Take care of your personal health. Developers who do not take care of their own health and wellbeing are at higher risk of decease. If two years from now you develop diabetes you will for sure be impacted and loose productivity. If you party getting blackout-drunk every week your health will decline and that will impact your ability to stay sharp and learn (see life-long learning).
  13. Learn how to analyze stuff. If you can analyze complicated issues you will be better equipped to make better decisions. With better decisions you can avoid going down dead-end roads of development or you will more likely choose a route that will lead you faster to the goal. Learn how to use simple pros and cons lists, learn how to understand complexity. Learn how to decompose issues, view them from different angles, learn about System Dynamics and Systems Thinking.
  14. Learn all the code snippets / templates / macros that are available in your IDE.
  15. Don’t use plain text editors over fully fledged IDE’s just to show off. (unless you are writing something that is not supported by your IDE)  
  16. Build understanding and empathy. If you don’t empathize with your team mates, your boss or your customers you are most likely going to be seen as egocentric, arrogant or distanced, which will create opposition or friction.
  17. Memorize language and framework library syntax so you don’t have to google it every time you need to use some feature. 
  18. Have stability in your life. With predictability and routines you can better plan your day and devote time for learning. Know your values and stick to them. 
  19. Learn to write readable code. Learn all you can about Clean Code, SOLID principles etc.
  20. Have focus in your life. Don’t engage in everything that comes to your attention in the private life or at work. If you try to do everything you will be less productive because you waste time on all kinds of things that may not contribute to your long term goals.
  21. Always learn. Get obsessed with reading and learning from videos. Coursera, PluralSight, Udemy, YouTube are you friends.
  22. Have balance in your life. Don’t work insane hours. Have some fun. Live life. Balance in your life is important to preserve good health. Maintain a sustainable work pace. Knows how to not overwork to avoid and crash and burn.
  23. Workout. Maintain a level of physical fitness. Going for a run will clear your mind and you’re head will be ready for more action.  
  24. Prioritize and set goals for learning and improving your skills.
  25. Learn everywhere. Learn while on the treadmill. Learn by listening to podcasts in your car.
  26. Know how to research and make good decisions.
  27. Reinforce what you learn by trying it out in practice or by blogging about it, giving talks about it etc. Do Coding Katas or have pet projects where you practice your skills. 
  28. Stop wasting time. Of course you are not playing Pok√©mon Go or watching crap TV. Do you really need to watch season 20 of WhatEverSeries on HBO/Netflix? Don’t watch a movie unless you know it has 7+ stars on IMDB.
  29. Invest in developer tools and other software for efficiency. 
  30. Invest in hardware such as monitors, a faster computer, a noiseless computer, good prescription glasses, good air-condition, an ergonomic desk and chair.
  31. Internalize and reflect on what worked and what didn’t. Don’t just try and fail but understand why things failed. 
  32. Spend time on post-incident reviews. Do root cause analysis of failures to learn and prevent the thing from happening again.
  33. Be curious and always try to understand how things are connected. This will help you understand how things lead to other things and you’ll get better at deciding what should be fixed right away so it don’t come back later with 10x the negative impact. (see technical debt)
  34. Don’t be afraid to ask. Rather than spending days trying to figure out some technical issue on your own, ask a coworker who you think may know. Maybe you just overlooked something. Don’t be afraid to lose face. All in all you’ll excel faster if you let go of the fear to look bad when asking questions.
  35. Learn how to write good code. Know how to avoid bugs that will come back to haunt you later and make you spend days trying to debug it.
  36. Know what to document and not. Document things that you or the team will get back to many times and will save you time. Don’t document things that only create noise.
  37. Spend time on reflection and to come up with the really good ideas. During a typical hectic day at work you may be in a multitasking act and react mode with little time for deep thinking. Find time at a less hectic day or during the weekend for lateral thinking.
  38. Stay agile. Be aware of just how much to do e.g. features, documentation, communication etc. not wasting time on things that are not important or deliver value. 
  39. Improve your creativity. Learn how the creative process works. Know how to do brainstorming. Learn techniques such as the Six Thinking Hats technique.
  40. Dear to try new things. Be open to trying new frameworks etc. (if analysis suggest there is value in using it). Sometimes it pays of a lot to replace some old buggy system with something new.
  41. Know how to plan. Good planning goes hand in hand with good decision making. If the plans are bad you’re of course at higher risk of failure. Failures along the way leads to wasted time and less productivity. 
  42. Learn how to do requirements specifications. Understand business needs so you don’t start developing something that is not needed or wanted. If you have to scrap a module and start over because the customer rejected it on the grounds it was not what they wanted then you have just wasted a heck lot of time. 
  43. In your office room agree not to make phone calls at the desk unless you have to. Always go elsewhere when having a private call so you don’t distract the others.   
  44. Build up general knowledge on all aspects relevant to development. If you have some basic knowledge in all relevant areas you are less likely to make bad decisions and you don’t have to rely on others to cover all the things you don’t know you don’t know.
  45. Learn to write readable code so you understand the code you wrote 6 months earlier.
  46. Learn how to get into the zone.  Find time to shut out everything so you can get into the zone or the flow.  Close down the e-mail reader, social media sites etc. Turn off sounds and vibration on the phone.  
  47. Improve your communication skills. With bad communication skills you may miscommunicate which can lead to lots of wasted time. Miscommunications may even result in team misunderstandings and distrust that may lead to long lasting conflicts which of course will be a lot of wasted time and energy.
  48. Unsubscribe to e-mail newsletter you rarely read.
  49. Share knowledge with your team. Help make the team more effective. If the others are productive people you reduce the chance of being held back by someone who’s unproductive.
  50. Only sit near people who you need to communicate with as part of daily work. If you sit near people you don’t work closely with you’ll find yourself distracted when they are on the phone or when someone comes over to their desk discussing things that are irrelevant for you.
  51. Agree with your coworkers to always detail out meeting invitations. Have a clear agenda and purpose for a meeting well in advance. If you don’t people will come unprepared to the meeting and many meetings will be a waste.
  52. Don’t have meetings unless it’s really needed. Read about good meeting best practices. But don’t take it too far. Meetings can be a good way to let people feel they are heard. If there are no channels for giving input or feedback some people will become dissatisfied.  
  53. Know when to outsource, when to hire, when to build or buy. 
  54. Be proactive. Sense and foresee things to engage in before it becomes an issue and a big waste of time for everyone.
  55. Have an eye on details when programming. Ensure the small things don’t get overlooked.
  56. See the big picture. Have an overview and total understanding of the things you are developing and why it’s developed.
  57. Get involved in meetups, seminars, conferences etc.
  58. Take courses.
  59. Take a few breaks during the day to clear your head.
  60. Read up on the latest in software engineering best practices on everything from bug tracking, agile methodologies, design patterns, continuous integration, unit testing, integration testing to application monitoring, code reviewing, scalability, cloud hosting, containers, databases, etc. etc.
  61. Get deep understanding of the programming languages and frameworks you use.
  62. Stay sober with a sharp mind. Limit alcohol intake. No drugs. Eat healthy and get a good night’s sleep. Don’t drink too much coffee too late in the day.
  63. Be critical. Don’t take things for granted. Know when to ask critical questions like "What was the reasoning behind choosing this solution?" Asking questions brings new insights. 
  64. See challenges in a bigger perspective. Avoid getting completely bogged down in a detailed technical challenge. Rethink, think out of the box and make the problem disappear by seeing it in a completely new light. Instead of asking how can I solve this problem, ask instead is this really the problem, what other things could be solved at the same time if I expanded the scope and introduced more simple solution? 
  65. Work on projects that motive you. That usually means choosing to work at a place that can give you challenging and interesting tasks.
  66. Don’t delay tasks. Tasks waiting to be done contribute to stress and extra work in the form of overhead. Typically you will regularly have to explain to the team why you’re not doing it and all this noise may even become more time-consuming than the actual time needed to complete the task. 
  67. Complete one thing at a time if you can. If you are multitasking and working on many tasks simultaneously during a day you’re not likely going to get into the flow where you can create elegant solutions.
  68. Do the things with the most risk first so you can be confident that you’ll succeed with thing you’re working on. If you constantly worry that you may not make the deadline it will be a stress factor that may keep you out of zone.
  69. Lean how to do Requirements gathering, making sure that the right questions get asked. Again it is all about making good decisions.
  70. Know when to analyze and when to just go and prototype the darn thing. Avoid analysis paralysis but don’t just jump into the task without thinking if there are risks involved, if there are path dependencies etc. 
  71. Learn about the business you are in. If you are working as a programmer in bank then learn what you can about banking. Get domain knowledge. Of course you can't learn all there is about banking but sure you can learn about areas within banking that are closest to the system you are working on.
  72. Write a ToDo list at the start of the day.
  73. When debugging use mock data rather than debugging against a remote API or a big ass database table join to save time waiting for the response.
  74. Be part of a great team. A team that stands together and fulfills each other will be stronger and will allow you to become more productive. There’s two ways to become part of a great team, either you switch job/department or you work with what you have and spend more time on recruitment, on knowledge transfer. Be inspiring and lead the way.
  75. Be a team player. A team player creates a positive environment that over time creates synergy in that everyone wants to contribute. As everyone on the team is enthusiastic it creates a positive spiral of learning and achievement.
  76. Make sure the compilation time, application startup time, debugging cycle time etc. is low so you don’t have to sit and wait doing nothing or even worse, you may be tempted to go on Facebook while you’re waiting. 
  77. Set up a proper dev, staging, QA, production environment.
  78. Use sticky notes as reminders or as cheat sheets.
  79. Close windows and tabs you are not using. They just contribute to noise and make it harder to switch between the tabs/windows you are actually using. They may also distract you and eat CPU/memory. 
  80. Understanding the Project Management Diamond/triangle. Learn the tradeoffs between cost, time and scope. Again it all comes down to making good decisions. Now you may say that it’s the manager’s job to make decisions. Eventually you will have to make some decisions yourself and you will also want to have your say in the decisions being made.
  81. Be passionate about programming. If you’re not you are not likely to have the motivation and drive to keep learning every day. 
  82. Keep a notebook to log your work, scribble down ideas and to take notes. You will need it.
  83. Get everyone in the office to agree to only disturb others when there is an urgent matter or the thing to discuss is too complicated, sensitive or risky to be described in an e-mail. Sending an instant message or going over to someone’s desk to ask something will take that person out of the flow. 
  84. Don’t listen to music at work. If you need to keep noise out use a noise cancelling headset with no sound. Music may be nice and make the workday more pleasant. My position is that music will lead to distractions. You will have control the audio player, change playlists, share songs with friends etc. It will take away focus when you really need to think super hard about something complicated. If you really want to be 10x then you will have to make sacrifices.
  85. Anticipate changes. Always consider feature/change requests that are likely to come. Instead of implementing strictly what the requirements says, evaluate likely changes down the road. If the changes are easy to implement now and would be very difficult to implement later then make all the changes at once.
  86. Use naming conventions. All too often I have seen noise and misunderstandings because of unclear, vague or incoherent naming. Stakeholders needs to spent time trying to agree on what to call things. DDD helps in this regard.
  87. Understand Statistics and cognitive biases. This is important to be able to judge data and how you and others interpret those data, this again will make you a better decision maker. Poor decisions will take you down roads of wasteful development.

A 10x developer is one who is not just doing things the right way but more importantly doing the right things.