22 Lessons From My 22 Years as a Developer, Lead, and VP
What got me to where I'm now, but I wish I had learned much earlier.
I'm satisfied with my career. Over the years, I've consistently advanced professionally, to senior, lead, and finally VP. Along the way, I was able to steer my career as I wanted, switching between roles and technologies that interested me, delving into coding, tech leadership, agile coaching, and management.
I also learned a lot, and without these insights, I'd never have gotten to where I am now. However, if I had known them sooner, it would have saved me a great deal of frustration and accelerated my progress by several years.
It's impossible to compress all the learnings from 22 years in the trenches into a single blog post (for a more comprehensive take, check out my "Definitive Guide to Succeeding as a Professional Dev"). But I've selected the 22 most crucial insights that I wish I had known earlier in my career.
On the nature of software development
1. Software development is so much more than just coding.
Don't dig yourself into the narrow hole of being just a hacker (no matter how brilliant). Coding is only a fraction of what software development is about. A well-rounded senior dev has to be equally good at teamwork, communication, managing projects, managing their own time, analyzing requirements, understanding new business domains, prototyping, iterative development, and a ton of other "soft" and "process" skills.
These skills don't come naturally and require as much deliberate learning and practice as coding. But without them, you'll never be seen as a true senior dev. And you'll never advance your career past the point of a mid-level individual contributor.
2. Software development is all about working with people.
There's no place for lone geniuses in professional software development. Modern software is built by tens, hundreds, and thousands of people - and for people. This means working with your team, other teams, management, business stakeholders, and users. Even as a single-person indie studio, you still have to interact with your customers, influencers, and the press.
Getting good at people skills (emotional intelligence, active listening, empathy, conflict resolution, negotiation, building rapport) is fundamental for a successful software development career.
3. The key coding principles to learn are those that stem from human cognition.
Code is written mainly to be read and modified by humans. And the human brain hasn't changed for millennia.
Principles stemming from the current era's computer architecture and popular tech stacks change with every new tech iteration.
Principles based on how the human brain works - like encapsulation, readability, cognitive load, or levels of abstraction - are universal, timeless, and transferable. Focus on mastering those.
4. There aren't many new paradigms in programming.
The landscape of programming languages, frameworks, and libraries changes at a breathtaking pace. However, very few of the underlying paradigms are new.
Functional vs object-oriented. Asynchronous vs synchronous. Centralized vs distributed. Concurrent vs sequential. Caching vs processing on-demand. Fundamental concepts like these don't change much at their core and are highly transferable across tech generations and stacks. Whether you use Actors, Coroutines, Channels, or Threads, concurrent processing principles stay the same. And regardless of which application layer requires caching due to current hardware characteristics, similar principles of handling stale content and cache invalidation still apply.
Understand the fundamentals thoroughly, and you'll build a solid, future-proof foundation for quickly learning any new technology or language.
5. Most of the code is legacy code.
Software development is a team game and most of the software is long-living. This means that the majority of the code you'll ever work with was either written by someone else, modified by someone else since you wrote it, or written by you too long ago to remember the details.
Working effectively with legacy code - navigating, understanding, modifying, and improving it - is the most critical coding skill to learn, as early in your career as possible.
6. Almost everything can be gradually refactored.
Code is inherently malleable. Even the most spaghetti of codebases can be improved gradually over time. Especially if you are skilled in proper "safety net" techniques: rigorous refactoring, characterization tests, and so on.
"Freeze and rewrite" is almost never a good strategy. It is painful for developers and dangerous for the business. Unfortunately, it's one of these things most of us have to live through at least once to acknowledge. But please hear me out. 🙏
7. Code aesthetics aren't important.
Every programmer, at some point, becomes enamored with a particular syntax, often to the point of a religious dispute over which language, framework, or coding convention is prettier.
Please, don't!
Choose your tech stack based on the career opportunities it'll open for you. Choose it because of domain-specific strengths, like being optimized for massively concurrent processing. But don't choose it simply because of its elegant syntax.
And never ever waste energy, time, and the good will of your new team by whining about their established coding standards just because you prefer a different way to use semicolons or brackets.
Beauty is in the eye of the beholder. It's the high-level architecture, readable code, tooling, and domain fit that make you productive, not the trivial syntax details.
On learning and reinventing yourself
8. Learning is THE most important skill for a software developer.
The pace of change in today's world, particularly within the tech industry, is staggering. Since I started university 27 years ago, we've seen the rise of the internet, web apps, online banking, online shopping, smartphones, mobile apps, app stores, Google search engine, SEO, social media, cloud computing, SaaS, audio and video streaming, machine learning, voice assistants, chatbots, NoSQL databases, and the majority of today's widely-used programming languages (JavaScript, C#, Ruby, Python, Go, Rust, Kotlin, Swift).
As a developer, you'll also need to continually learn new business domains and requirements, work with new people, and adapt to new processes, projects, and companies. In other words, you'll have to constantly reinvent yourself. If you don't enjoy learning - and don't become skilled and efficient at it - you'll struggle to have a successful software development career.
9. Learning is a skill that has to be honed like any other.
Though learning might appear natural, it's anything but. Our understanding of effective learning techniques has grown substantially over the past few decades and continues to evolve at a rapid pace. Sadly, schools in many countries lag behind, failing to teach students how to learn properly.
Start cultivating your learning skills as early in your career as possible. Approach it broadly: learn how to read faster, how to mindmap, and how to research and seek information efficiently. Also, understand how to accelerate learning in the context of software development: identify commonalities between different languages, learn through experimentation with the code, and utilize developer-specific platforms like GitHub or Stack Overflow. This will set you on the right path for your entire career, with the benefits compounding over time.
10. There's no better way to learn than on real-life projects.
Diving into small, "weekend" projects is a great way to quickly get the gist of new technologies and to get yourself hyped for further learning. However, these projects can't compare to the depth and thoroughness gained from building real, production stuff. Confronting user or business requirements, tackling real-life edge cases and bugs, and addressing scalability issues will push you in ways personal projects (where you can sidestep the toughest obstacles) simply can't.
I'm not saying you should avoid personal projects. They're fantastic for broadening your horizons. But if you want to truly master something, seek out opportunities to do it "for real".
11. No principle, pattern, or best practice is universally applicable.
Even the most widely accepted principles can't be applied unconditionally. If you don't deeply understand the theory, context, and edge cases - if you just blindly follow a cargo cult - you'll never become a true expert (nor truly impress a hiring manager during an interview).
But gaining such a deep understanding requires a distinct mindset.
Experiment with edge cases and boundaries. Dive as deep as possible, exploring where things break and how much you can stretch them. Look at the subject from various perspectives: through practice, mental experiments, blogging, teaching, presenting, and discussion. And finally, dig deep into the roots. Understand what the original authors had in mind, the problems they were solving, the context in which they operated, and how the principle later evolved and why.
12. Large, long-lasting projects will teach you more than greenfield ones.
Starting a project from scratch is tempting. You can experiment with different tech stacks, employ the latest best practices, and promise yourself to "write cleaner code this time."
But by working with a clean slate every time, you'll never experience the long-term impact of your decisions. You won't learn what code and architecture remain easy to work with after a few years. You'll never gain practical experience in critical skills like code archaeology, characterization tests, or refactoring. Most of today's best practices were discovered by working on long-lasting projects for years.
13. No time for learning is no excuse.
The most common excuse I hear from people for not growing professionally and not advancing their careers effectively is the lack of time outside of work hours. But you don't have to sacrifice your work-life balance. There's enough time at your job to learn almost everything you need to progress professionally. You just need to seek out and create suitable opportunities.
Challenge yourself to write code using new techniques. Shower your senior colleagues with questions (most people love sharing their knowledge). Review their code (even if it's not a formal requirement). Present at a conference. Volunteer to lead various initiatives. Volunteer to conduct research. Enlist the support of your manager (it's their job to help you learn and grow). Often, even explicitly requesting time for learning during work hours can be successful if you have a compelling pitch for how this time will be spent.
14. There are more ways to find mentors than you think.
Finding a mentor is crucial, especially in the early stages of your career. But where can you find a great mentor?
By rethinking what mentorship truly means at its core, you can bend the rules in your favor. Mentorship, in essence, is having someone more experienced review your work or provide customized advice. You can achieve this through a variety of channels.
Enlisting more experienced colleagues at work is the most obvious option. But you can also reach out to external consultants if your company employs any, even if they don't directly work with your team. By contributing to open-source projects, you can have your code reviewed by seasoned maintainers. You can get personalized advice from experienced thought leaders by commenting on their blogs. You can ask a question or post a poll on a discussion forum, Twitter, or LinkedIn. You can approach speakers at a conference. You can even directly reach out to people you admire – many of them will actually reply. You get the gist. Only your creativity is the limit.
On advancing your career
15. The only thing that really counts is the impact you make.
Businesses don't hire developers to look good on paper. Your knowledge, skills, and experience don't matter if they don't translate into tangible value - into a positive impact on the team, product, and company. And the bigger the magnitude of the impact, the more you'll be noticed and promoted, and the more the company will fight to not lose you.
Making a company-wide impact requires a very different mindset and a broader skillset than just becoming the best "coding ninja". And for many of us, it requires stepping way out of our comfort zone. But there's no other way to advance your career past the individual contributor stage.
16. You must understand also the business side of your job.
All businesses have similar needs: building competitive advantage, gaining new customers, optimizing their operational efficiency, sustainably growing in size, and adapting to changing market conditions. Software - and software development teams - are at the heart of all this.
If you want to be regarded as a true professional and make a company-wide impact, you must understand how businesses operate, what they need, and how software can best support these needs. It's you who should tell your company how to best utilize software to its advantage, not the other way round. Become an expert on the matter - a trusted technical advisor to your business - and your career will soar.
17. Marketing is key to success.
As a professional, you yourself become a product. And a product needs to be promoted. To get a new job, raise, or promotion, you must know how to sell yourself.
To be 100% clear: I'm not talking about false, shady marketing. But you need to make your accomplishments known. You have to "advertise" yourself: write an effective CV, create an eye-catching portfolio, make your manager aware of your contributions.
This doesn't only apply to directly advancing your career. Promoting your blog or open-source project, getting invited to speak at a conference, or even pitching your ideas to your teammates also requires a fair amount of marketing.
For many of us, this is far outside our comfort zone. However, if you change your mindset and develop decent marketing chops, they can give your career a significant boost.
18. First impressions matter a lot.
The first impression you make at a new company or team is critical. Your first few days and weeks can establish your reputation for the rest of your time there.
Open your first meaningful pull request within a day or two. Within the first few weeks, build rapport with your team and understand their work process, product, and business domain - and propose valuable improvements, delivering real business value without the "my way is better" attitude. You'll be instantly perceived as a true professional. Or even, if the improvements are substantial, as a natural leader who can influence the company's success.
That's why often neglected skills such as code archaeology, effective learning, communication, building rapport, understanding of software development processes, and being a business-oriented developer (along with a sprinkle of marketing) are so crucial.
19. Your current job is just a stepping stone.
Apart from the most junior roles, you get promoted or hired for your demonstrated skills and track record, not merely potential. To continuously advance your career, your current job must allow you to build the necessary skills, experience, and portfolio to secure your next position.
This should be your primary criterion when deciding to accept a job: not the immediate benefits of the current position, but what next job it'll allow you to build up to. Always think two steps ahead.
This applies also when deciding to change jobs. If you've exhausted all opportunities for building up towards the next position you aim for (either through learning, gaining experience, getting promoted, or making a lateral move) - that's the right moment to leave your current company.
20. A company is not a family.
Some companies, especially in the corporate world, treat their employees like cannon fodder. But there are also some truly exceptional companies out there, with a fantastic culture and strong camaraderie, that genuinely care about their crew (I've had the luck and pleasure of working in such an environment). When you work in a company like this, it's easy to become emotionally attached.
This is a mistake. And will inevitably lead to painful disillusionment and frustration.
A great company is, first and foremost, results-oriented - much like a sports team. Camaraderie and fun are important, but you also need to win matches. If you don't consistently perform at a given level, there's no place for you on the team. And if you aspire to be a true professional, you shouldn't shy away from expecting the same from your teammates.
Finally, if a company no longer needs your services or if you've found an even better opportunity to advance your career, it's not as if you're breaking an oath. Approach it with professionalism and respect, but maintain a level head and move on.
21. A healthy lifestyle is the best long-term career investment.
Many people don't perceive programming as physically demanding. However, sitting behind a desk for countless hours per week, with your eyes fixed on the screen and your shoulders hunched over the keyboard takes a toll on your body - especially when done for years and years. And this doesn't even take into account the mental strain of maintaining extended concentration and coping with stress.
You may disregard this when you're young, but please take care of your health in a holistic manner: take breaks at work, maintain a sustainable work schedule, set up an ergonomic desk, prioritize sleep, exercise regularly, maintain a healthy diet, spend time outdoors, recover mentally, and take your vacations. Otherwise, it will hit you hard later in your career, at a moment when you have the most momentum and potential, when you need to be at your best to capitalize on what you've built over the years, not plateau or burn out.
22. Task and time management is a critical career skill.
Learn task and time management as early in your career as possible. There's a vast body of knowledge on the topic and the skills are highly transferable, to software development and beyond. They will help you stay organized, be more productive, deliver on your promises, and never drop the ball - which is the surefire way to impress your manager.
Later in your career, these skills will provide you with a solid foundation for managing projects, overseeing complex initiatives, and leading teams.
Bottom line
Over the course of a 22-year professional career, you learn a lot of things, big and small (for an even more comprehensive take, check out my "Definitive Guide to Succeeding as a Professional Dev"). The 22 insights I've chosen are among those that have had the biggest impact on my career. And from my experience working with, leading, mentoring, and networking with other developers, I can say they work not only for me.
It's easy to focus primarily on the here-and-now coding skills, like the knowledge of your current tech stack - especially at the early stage of your career. To some extent, this is fine. You'll never become a successful developer without the fundamentals in place. However, the sooner you start diving into deeper, more "meta" topics like career development, effective learning, and timeless truths about programming, the faster your career will advance - and the more mature and in-demand developer you'll become.