10 unconventional lessons from 10 years working as a software engineer

Pablo Porto
Level Up Coding
Published in
11 min readJan 25, 2024

--

A photo from my last trip exploring the Albanian Alps

Ten years ago I moved to Manchester to start my career as a software engineer. To mark this milestone and reflect on the journey so far, I sat down with a nice cup of barista coffee and gathered my thoughts on what I think are the most important lessons I learned along the way.

The result is a list containing the ten lessons that have helped me the most.

Whether you are just starting or you are an experienced engineer, I think you can find these lessons useful to build an effective, meaningful and sustainable career as a software engineer.

Disclaimer: Some of them may not be the typical career advice you come across. Take what resonates and leave the rest.

But first, a bit of context…

During my reflection process, I looked back at my work notes from the past ten years. I made a list of my biggest achievements and biggest mistakes. I also created a career map to visualize the different positions I’ve had in 14 different teams up until now.

I’ve been working as a consultant in the same company, Thoughtworks, for the last ten years. One thing that’s consistent about my job is frequently changing projects, business domains, tech stacks and teams.

My career map (thanks to Elena Verna for the Miro template)

On one hand, I think changing roles and projects frequently, being part of multiple teams and working in different domains has helped me understand software development more quickly. It has also allowed me to experience patterns and anti-patterns across many different functional areas like frontend, backend, infrastructure and data.

On the other hand, transitioning between teams and roles, like data engineer or infrastructure engineer, demands a strong learning mindset and being patient and disciplined. You need to be able to learn new tools, practices and concepts quickly and adjust to the new role’s responsibilities and areas of influence.

Overall, I think being a consultant has helped me to develop the ability to easily pick up new programming languages, practices, and ways of working.

Enough context. Let me share with you the most important lessons I learned.

1. Optimize for Learning Over Money

Not all experience is created equal. Doesn’t matter how many years of experience you have. What matters is what you did all those years and with whom.

You can see a job as a combination of multiple things: money, learnings, people, mission… What of those things are you currently optimising for?

I think optimising for learning over money when you are starting wins in the long term. The knowledge gathered during the first years will compound and it will allow you to get higher-paying and more impactful jobs in the long term. Of course, you should only do this if you don’t currently need the money to pay off debt or support a family.

Play long-term games with long-term people. All returns in life, whether in wealth, relationships, or knowledge, come from compound interest.

— Naval Ravikant

At the beginning of your journey, learning and growing as an engineer during your working hours is far more important than money. Consider being in the right learning environment as a priority for your first couple of jobs.

The best career decision I made by far was leaving my comfort zone, moving abroad, and starting my professional journey in a great working environment. Working with a group of international, diverse and passionate people who cared about their craft expedited my learning more than anything else.

Thanks to remote working, you can now join one of these environments without leaving your home.

Being in a great learning environment during working hours is only the first step. Don’t forget to allocate some time to study and practice a bit each day. A daily hour of study and practice outside work will compound fast over the long run.

2. Invest on Principles and Practices

Invest your time in learning the principles and practices of effective software engineering since the start. Specific tools and technologies come and go, but principles and practices last longer.

Learn the timeless aspects of your craft. This knowledge will never lose its value.

— Derek Sivers

Spending time in understanding the ideas behind effective automated testing or when to use asynchronous versus synchronous integrations between services will give you more returns in the longer term than investing the same amount of time in learning the internals of the new Vue/React/SpringBoot framework or memorising the syntax of a language.

The principles, practices and tools mental model

I was lucky to work with colleagues that emphasised the importance of understanding the principles and practices of our craft. Mastering effective software engineering practices like clean code, refactoring, automated testing, CI/CD, and test-driven development will give you a head start and make your code a pleasure to work with.

3. Be the Engineer That Everyone Wants To Work With

The degree to which other people want to work with you is a direct indication of how successful you’ll be in your career as an engineer. Be the engineer that everyone wants to work with.

— John Allspaw, former Etsy CTO

Making your code a pleasure to work with is important, but that is only half of it. Don’t become the engineer that nobody wants to work with.

Effective collaboration is key to build great software. Learn how to collaborate well with others, help that colleague who is stuck, actively listen to other people ideas, and be the kind of person everybody wants to be in a team with.

4. Diversify Your Life

You cannot be really first rate at your work if your work is all you are.

— Anna Quindlen

To have a long and fulfilling career in tech, design your life-style around habits and rituals that diversify your life and give you a proper work-life balance.

Working nine to five and investing that extra hour studying and practicing your craft every day shouldn’t stop you from taking proper care of other areas of your life like your health, finances and relationships.

To stay in balance and avoid burning out, you can set some ground rules and cycle through times where you invest more time in your career and others where you take it easy and just do your nine to five.

These are some of the rules I set for myself to achieve that balance:

  • I protect my weekends. I don’t engage in work-related stuff during those two days.
  • I removed any work-related stuff from my smartphone.
  • I try to reduce my computer screen time after work.
  • I chose hobbies that get me out there, like traveling, MTB and snowboarding.

Don’t bet all your happiness and purpose on a single square. It’s fine to lean on one pillar or another at different times in your life, but you’d do well to make sure there’s a few others holding up the roof if the first one crumbles.

— DHH, creator of Rails.

Of course, there will be periods of time where we break these rules and put more time into work related projects or self-learning. That is absolutely fine as long as you are aware and willing to make that compromise for what you are getting in return. Remember, it is a balancing act.

5. Treat Feedback as Gold

We all need people who will give us feedback. That’s how we improve.

— Bill Gates

Constantly ask for and collect feedback. Feedback, mainly constructive, will help you identify your blind spots and get to know yourself faster.

Feedback will boost your growth more than any other thing.

I was lucky to start my career in a company with a well established feedback culture. Feedback allowed me to spot trends, reflect, and write down the actions I wanted to take to become a better professional.

I treat feedback as gold. I organise and consolidate the feedback I received digital notes together with the actions I want to take to act on it. I set a monthly reminder to review these actions to check if I am making progress.

If you are not asking for feedback, start now! Here are good tips to get started.

6. Go Broad First

To be a successful professional these days, I believe that one should go broad first (master the 20% that will allow you to deliver 80% of the tasks) and go in-depth only when there is a big need, a big opportunity, or a strong interest in keeping developing your skills further in a particular area.

— Thiago Ghisi, Director Of Engineering at Nubank

Don’t just stop at the core of your job. Learn about product management, agile and lean ideas, the business domain of the problem you are trying to solve, and how to work with people and lead a team. Be that engineer who questions what they are building.

My best learning experiences came from leaving my comfort zone and pushing myself to wear other hats. The better you understand the other roles in a team, the better you will be able to collaborate with them and contribute towards building a high-performing team.

There are always opportunities to explore and cross the frontiers of your current role. You can volunteer to do the exploratory testing of a new feature, work with the operations team to bake observability into your service, or pair with your product manager to understand why the users don’t like the latest feature your team shipped.

It can be a bit of an unconventional statement, but I believe the best engineers I worked with were well-rounded. They understood the end-to-end software development process, the product and the business problem they were trying to solve. They were not afraid to speak up and suggest improvements in areas they were not responsible for.

Being a generalizing specialist allows me to make an impact quicker when starting in a new project or jumping into an existing one. Going broad and learning how to be well-rounded is a super-skill.

7. Lead Without the Title

You don’t need to be the tech lead or the engineering manager to exercise your leadership muscle and make an impact.

Don’t be afraid to take the lead on that discussion about choosing a new tool. Don’t shy away of challenging that design the team is so proud of. Don’t avoid to point out which problems need to be solved. Don’t wait for a title to take the lead.

When you find yourself in a situation where everyone looks at each other, it’s time for you to lead. You’re a leader when you decide to become one. There’s no initiation or a title. Just a decision.

Darius Foroux

Over the years, I have seen a lot of more junior colleagues start leading without the title. A few years later, most of them were holding leadership positions and successfully setting the direction for their teams or even managing multiple teams. They didn’t wait for someone to give them “the title”, they exercised their leadership muscle since the beginning.

8. Think of areas of influence

A very experience engineer once told me to constantly think of my current area of influence but also what my next area of influence should be as I progress in my journey. The areas of influence mental model really stuck with me and it guided me as I tried to increase my impact as a software engineer.

If you are starting, your first area of influence may be the module you are working on, for example, a bunch of classes you need to change to implement a feature. Once you start feeling comfortable the area increases and you are able to influence the design and decisions made for a component within the system, like a web app or micro-service.

Areas of influence

As you keep acquiring more knowledge and experience, you start influencing the design of the whole system for a specific domain, e.g. all the services your team is responsible for. After that, you start understanding and influencing the system of systems, not only the services your team is responsible for but everything else that keeps your company up and running.

You move from one area to another by mastering the previous area and acquiring the knowledge and skills required to start influencing the next.

This idea can also be applied to your leadership journey. You start by leading and organizing yourself. Then you start coaching and mentoring other colleagues, to later on move to lead a team, multiple teams, or a whole organization.

Understand what your current area of influence is and what you need to move to the next.

9. Sharpen Your Tools

Give me six hours to chop down a tree and I will spend the first four sharpening the axe.

— Abraham Lincoln

Looking back, I am grateful to have invested time early on in mastering the tools we have to use day in and day out. I am not talking about the latest Javascript framework or a specific functional programming library for my language of choice. I am talking about those tools we use all the time: the IDE, the version control system, the debugger, the terminal…

Invest time in memorising the shortcuts, learning the twenty percent of commands that are used eighty percent of the time or knowing how to tweak the IDE configuration to make your workflows more efficient.

The return of investment of sharpening the axe is high. Having said that, don’t be afraid of changing and evolving your workflow. Definitely try new tools from time to time. Tech moves fast. New tools emerge and they can completely change the way we work. For example, GenAI assisted software development using tools like Github Copilot will change the way we work. Yes, I had to mention GenAI…

10. Show Your Work

Become a documentarian of what you do.

— Austin Kleon

Build a habit to document, curate, and show your work early in your journey.

My biggest regret is not starting to capture and share what I learned earlier. Give back!. Don’t become the engineer who only consumes information. Write that comment or appreciation in that tutorial that got you unblocked, publish that article you were thinking of writing for a year, and sign up for that talk you are so afraid to give…

Writing down your ideas and learnings and sharing them with people will give you feedback faster and help you develop a better understanding of a topic. Moreover, there is always someone that can find your current challenges and ideas useful.

If this resonates with you, you may consider building your own professional knowledge base and start sharing what Thiago Forte calls “intermediate packets”. I started building my own knowledge base a few years back and I can only wish I had started earlier.

Parting Thoughts

Made a friend in the Albanian Alps

I’ve learned a lot in the past decade, but these ten lessons are the ones that made the greatest impact on my journey. I hope you find them helpful for building a strong, sustainable, and fulfilling career as a software engineer.

Now, how about you? What advice would you give to a new software engineer starting in the tech industry? What are the most important lessons you’ve learned? Please, share them with us in the comments section.

Thanks to all the people I had the pleasure to work with over the last 10 years. They taught me invaluable lessons on how to be a better software engineer and a better person.

Thanks to my friend Mircea for taking the time to review early versions of this article.

All images, unless otherwise noted, belong to the author.

--

--

Tech lead at Thoughtworks. I write about effective software and data engineering practices and how to build a sustainable but effective career in tech.