How to Become a great Software Engineer?

  1. Nerves of steel/Patience – if you freak out when you drop a dish in the kitchen, you are probably not going to be able to stomach the horrors of software engineering
  2. Big Picture/Visionary thinking + attention to detail – you need to be able to picture the entire system and its components’ interactions in your head, and be able to draw analogies from code to real life and be good with metaphors. You also need to pay attention to the little things that make up the whole
  3. Long-term thinking – patching up problems with the first possible solution and taking the path of least resistance will get you nowhere in Software Engineering.
  4. Auto-didactic skills, thirst for knowledge, resourcefulness – Software Engineering is among the fastest changing, constantly evolving fields, where last year knowledge is already obsolete and painful. You need to be able to organize a learning process, to keep up with current trends, to know how to absorb and apply knowledge, you need to want to do it, otherwise it is going to be very painful. You don’t need to know everything but you need to know how to search, evaluate and apply information
  5. Laziness – you need to be lazy enough so that you don’t want to perform repetitive tasks over and over again, and try to automate everything. This will get you ahead in the game
  6. Relentless perseverance – there will be long hours of trial and error – you want to get something to work or find a bug, but you won’t be able to. You should never give up. Once I tried 450+ times to configure a CI system (in my first month as a programmer) until I did it.
  7. Good communication skills – you need to explain well, know when to inform people about what is going on, be literate, speak English well
  8. Good organizational skills and time management – you need to be able to organize your time, set priorities, use lists, manage your focus, manage communications, be accountable, responsive and responsible
  9. Good programming skills – clean code, SOLID, Design Patterns, OOP
  10. Good software architecture skills – knowledge of different types of architectures and their tradeoffs – MVC, MVP, MVVM, Clean Architecture, Domain-Driven development etc
  11. Knowing when to optimize, when to avoid overengineering
  12. Good testing skills – unit, integration, ui testing, load testing, Test driven development, Behavior driven development