In this blog, we’ll share some advice helpful to most in our field regardless of their career goals and paths. They’re applicable to professionals in many other fields too, but are particularly meaningful to software engineers, due to the highly dynamic nature of the software field and the huge performance variances among people in our field in general and even those with comparable levels of experience. We’re barely scratching the surface of the topics here, and will expand on some of them, in some of the future blogs.
- Plan your career – create and maintain 3-year goals & rough plan, and a 6-month plan.
Most in our field understand that planning is valuable for non-trivial work. And intuitively the value of planning increases dramatically as projects get more complex and/or uncertain. It’s hardly controversial that developing a successful career in our industry is a highly complex and challenging endeavor with a lot of uncertainties. However, surprisingly few people plan and manage their career deliberately. You will be head and shoulders above most if you manage to develop the habit and discipline of creating and maintaining a rough 3-year career plan and a more detailed 6-month plan. This is particularly true for those relatively early on in their careers. If you intend to create a career plan but are at a loss as how to do it properly, fret not! Just do it however you want to start with. Planning is everything, plan doesn’t matter.
- Keep learning and learning deliberately.
Software is such a vast and dynamic field. Technologies come and go quickly, companies come and go quickly too, and the pace of evolution is only accelerating. Experience alone doesn’t go far at all, and can even become a liability. You’ve to keep learning just to keep up, not to mention to get ahead. Obviously you’re automatically learning to some degree while doing your job. However, learning deliberately and making conscious efforts to seek out learning opportunities, both on the job and on your own outside of your job makes a huge difference over time.
- Maximize your impact.
Most of us are motivated to make an impact, and we feel good about the positive impact we make on society, our family and friends, the company and team we work with, etc. Self-motivation aside, the bigger your impact is at a job, the more likely you will be successful at your job and get rewarded more. No matter where you work or what your specific role is, striving to maximize your impact and seeking opportunities to increase your impact is a great optimization, both in the short term and in the longer term.
- Minimize the overhead you cause others & become “fire & forget”.
Loosely speaking, your net contribution is your output – the overhead you cause others. In a fair system, what really matters is your net contribution, and you will be measured by it too. Reducing overhead you cause others directly increases your net contribution, and improves your job performance. And consciously thinking about and working on minimizing unnecessary overhead on others in good ways while getting the job done will likely help you develop habits and approaches that make you more effective in general and help your organization become more productive too. And people, especially senior people & leaders, appreciate your being “fire & forget”, much more than they may have realized or made obvious to you.
- Increase your network and build a support system.
The good life advice “It’s Not What You Know, It’s Who You Know That Matters Most” is particularly relevant to our field. Right people whom you know can open doors for you, provide valuable advice to you, help you avoid common mistakes, provide emotional support, and enable you to achieve your goals in a fraction of the time. A strong network and support system gives you leverage, and can have a particularly large multiplier effect in our field.
- Internalize that technology is 90% about solving problems for people.
Many software engineers are passionate about technology, which is good. On the other hand, it’s critical to internalize that technologies are valuable and relevant only if they can solve meaningful problems for people and add meaningful value, at reasonable cost. When building a product, don’t get fixated on the “technology”/technical aspects alone. Rather,
- keep thinking about the problems you’re trying to solve, and the users, namely whom you’re solving the problem for.
- try to understand them to a good degree to start with, and understand them more and more deeply over time.
Over time, you’ll become much better at picking the right problems to solve and coming up with the right solutions, and making the right “technology” decisions.
- Work on your soft skills – communication, interpersonal, influencing skills in particular.
The importance of technical skills is well understood by most software engineers. After all, many are drawn to the field of software, via exposure to coding in the first place, and the Computer Science curriculum that prepares people to enter the field tends to focus heavily on technical skills. However, almost all of us in the field have to work with people, as part of a team (small or large), on a daily basis, in order to produce anything useful. And remember that technology is much more about solving problems for people than about technology itself? Making a conscious effort to gain more awareness of the human elements of everything we do, work on the “soft skills”, and get better at communicating with, influencing, motivating, and working with people in general will make your everyday work and life more pleasant, and yourself a better person and much more productive professional at the same time.
- Focus more on fundamental/”horizontal” skills (vs “vertical” skills).
There is a saying that many engineers with 10 years of experience basically have 1 year of experience times 10. It’s obviously a gross simplification and generalization, and a bit too harsh, but there is quite a bit of truth to it. Most people move from one project to another and one job to another, and pick up and apply the technologies/tools needed for the projects at hand. Over time, they may have accumulated experience in many technologies & skills, but the value of most of these ‘vertical’ skills decrease rapidly as technologies come and go & different companies or project teams may favor different sets of technologies. At the same time, they don’t improve much on the “horizontal” skills which are much more transferable, and as a result their fundamental strength as an engineer only increases marginally after the first year or two. Making an ongoing and deliberate effort to improve on “horizontal” skills will make a difference.
- Manage your time wisely – defragment your time, minimize distractions, and focus.
We all have 24 hours a day and 7 days a week, and time is the most valuable asset we have in many ways. Developing the discipline and a good system to protect your time and free yourself from distractions will make a huge difference in your productivity in the short term and your overall success in the long run. Prioritizing relentlessly and focusing on one thing at a time (or at least coming close to it) can give you a huge leverage too. And much of the work we get to do in our field is complex, intellectual and creative, and having large blocks of uninterrupted time is critical to our productivity in tackling it. While minimizing distractions and cutting down time spent on other things helps, many of these are “necessary evils” and the more senior you get, the less time you tend to have for your “own work”. Defragmenting your time is a key tool much more under your own control and can give you significant leverage – you can get a lot more work (especially those with high value-add) done in 15 hours divided into 5 3-hour blocks than in 15 hours divided into 1-hour blocks.
4 thoughts on “General advice for engineers”
Thanks for this write up and for starting this blog in general.
Can you give examples of what “horizontal” skills are and how to improve them?
Pretty much everything mentioned in this blog is “horizontal” skills (if we can use the term “skill” loosely).
“horizontal” skills vs “vertical” skills – not binary, a skill can be largely vertical but horizontal to some degree too.
Using some of the common tech skills (for sw engs) as examples:
* Java & C# are to some degree “vertical skills” in that the skills you pick up by learning the langs are not as valuable or transferable if you focus on the syntax/libraries/etc. Instead, if you gain a better understanding of object-oriented programming/design, principles behind clean API design, the value of memory management (provided by the runtime env), etc. in the process, you’ll have learned “horizontal skills” (that are more transferable & valuable).
* Somewhat similarly, ActiveMQ & RabbitMQ (& even Kafka) are to a large degree vertical skills. But the general messaging technology that supports asynchronous communication & processing and makes it easier for you to decouple parts of your system, and core design principles & paradigm in applying messaging technology, are “horizontal skills”.