A Collection of Lessons Learned From My Last Decade on Software Development.

  1. No language fanatism : All languages are like tools in your toolbox. Just use the most suitable one, which is not necessarily the most popular one.

  2. Measure progress and make it visible, even when you are doing it yourself. Use board and charts.

  3. Code base is like your house. Always keep clean, otherwise after a while, you can find yourself in a mess. Refactor.

  4. Always be very humble. There is always someone better than yourself. The greatness is hidden in being small.

  5. Continuous learning. There is no stop in learning, learn until death. Read beatiful codes, designs, books, blogs, etc. Improve your skills.

  6. No frozen well defined requirements. Change is part of life like time, it is in nature of things. So is in development, then always be prepared for it. It is not a thing that bites you, it is something to tackle.

  7. Help others. Always be open to help others, especially juniors. This is kind of being thankful of having knowledge. The best way to learn is to teach others.

  8. Unit test. The more unit test, the less debug. Skipping unit test to gain time is an illusion.

  9. Keep being on the mid-way. Never overuse anything. Never overuse design patterns, never overrefactor, never overdesign, etc.

  10. Developers always underestimate. Most of “2-min work”s are not 2-min. Be aware of that and always add a little slack on estimations.

  11. There is no end in development. Stop developing at some point.

  12. Simplicity, simplicity, simplicity. Simplicity, simplicity, simplicity. simplicity

  13. No gossips : Never gossip. Never listen gossips. Never let them decrease your energy. Be smart and aware and observe environment to know what is going on, but no gossips. If you have a problem, talk to related people.

  14. Use version control.

  15. YAGNI : “Always implement things when you actually need them, never when you just foresee that you need them.” (Ron Jeffries). Developers always tend to develop things more generic, for possible future use purpose. However, most of this possible future never happens. So, even if we are very sure that we will need a feature in future, we should not implement it now, we should implement it when the expected future comes.

  16. Stabilize pursit of perfection with pragmatism.

  17. Continuous integration

  18. Communication is important. One of the most important and difficult thing is software development is communication. Clear communication in the team and clear communication with clients. And be very specific to unprofessional people.

  19. Focus on delivering working software and deliver frequently.

  20. Remember the big picture.