

Discover more from Level up software engineering ๐
30 lessons I wish I could go back and tell my junior self
My biggest life-lessons from 20,000 hrs spent as a software engineer that can be the difference between a thriving skillset and career, and feeling stuck in a loop.
๐๐ฎ๐ข๐จ๐ฆ ๐ค๐ณ๐ฆ๐ฅ๐ช๐ต: ๐๐ฐ-๐๐ช ๐๐ณ๐ฐ๐ฅ๐ถ๐ค๐ต๐ช๐ท๐ช๐ต๐บ ๐ฐ๐ฏ ๐ ๐ฐ๐ถ๐ต๐ถ๐ฃ๐ฆ
1. Consistency beats random hustling
Iโve always loved to hustle. But itโs only gotten me so far.
Hustling is great in little motivational spurtsโฆ
What itโs not great for is a longterm growth strategy. When our motivation fails, we fall back to our systems and our daily habits.
If you have no daily habits of learning and growth, you wonโt make much progress.
Several years back I was stuck on endless tutorials and weekend hustling not making much progress.
Hereโs what saved me and helped me massively level up and 2x my salary.
Go ahead and read it, and then read the other 30 tips ๐
2. Anyone can learn software engineering
I'm an Average Person who became a senior software engineer. You can be too.
Am I decently techy? Yes.ย
Have I ever spent 1000 hrs on leetcode? Nope.ย
Have I built my own computer?
Built my own compiler?
Built my own app?
Nope. Nope. And Nope.ย
Have I built projects in two weeks that resulted in $70,000 in additional revenue for my company?
Have I built an email campaigns tool thatโs now scaled to 750,000,000 emails sent?
Have I grown from graphic designer, to wordpress sites, to fullstack engineer, to tech lead?ย
Yes. Yes. And Yes.ย
For me itโs all been about:
a drive to own my own growth
prioritizing learning and growth
finding engineers and mentors I can learn with/from
Your growth will compound if you keep showing up.
Be patient, and believe in yourself. You can do this!
3. Join a team where others are smarter, but still willing to help you level up.ย
Iโve always heard you are the average of the 5 closest people you hang out with.ย
Thatโs usually quoted as a negative, but you can totally use it to your advantage.ย
Surround yourself with people who are growing.ย
Itโs amazing how much you can grow by just being around other people who are growing and eager to learn together.ย
This has been true for me the past 3 yrs.ย
I joined a startup that was filled with all the 10% kids.ย
Yeah, you know. The ones in college on the group assignment that did all the work? I went from being the smartest person in the room to being the dumbest.ย
But it was the best thing ever for my career and skills.ย
For a while there, every day was a struggle.ย It almost felt like I was starting over.ย
It was almost embarrassing seeing what everyone else was cranking out while I onboarded and took 6 weeks on a 2 pt task they assigned to me.
But they stuck with me. I was with a team that let me ask stupid questions. They let me pair with experienced engineers and take on challenging projects.
Every day I learned and grew so much just by rubbing shoulders and working with other smart engineers.
4. Take on challenging projects to stretch yourself
Looking back over my career, itโs been the times I volunteered for or was just assigned a difficult project that I grew the most.ย
Figuring out how to process and save thousands of webhooks / secondย
Exceeding the data binding limit in Angular and building a scroll offloader
Optimizing complex database queries so they ran in 300ms instead of timing outย
Building and scaling an email campaigns tool thatโs now sent 800,000,000+ emails
None of those projects were easy.ย
Some of them I had a freak out moment when I started.ย Some of them I got stuck on for a while.ย
But I did it! I figured them out and grew in my skills! ๐
Now anytime Iโm working on something particularly difficult, I get excited because it means Iโm really going to grow. ๐ช
5. Freelancing is a business, you have to be good at coding and running a business
When I first started my journey as a software engineer I decided to run my own freelancing business. I figured it would be a good way to step my toes into coding.
It was much harder than I expected.
I thought I would be able to sit around coding up really cool websites and apps, just working for myself and really fun companies.
The reality: freelancing requires you to run a business.
I actually had to learn sales, marketing, finances, contracts, retainers, cash flow, charging what you are worthโฆ and on and on.
I definitely learned a ton and wouldnโt trade the experience, but I didnโt realize how much โbusinessyโ things Iโd be doing, vs. just learning coding like I hoped.
tldr;
You can definitely learn a lot doing it, but just go in with your eyes wide open.
Itโs a business, not just a heads down coding shop.
6. Drive the screen while screen sharing
When I was learning fullstack development early on I had a mentor engineer who was a wizard.
You know the ones, the kind that build compliers for fun on the weekend.
Whenever we paired it was easy for me to let him screen share and walk me through things where I was stuck or needed a deeper dive.
However, doing so actually slowed down my learning.
I left many of those calls nodding along, and then later one Iโd have to ping him again with another 20 questions because I hadnโt actually done the work.
Driving the screen can be scary, messy, and nerve-wrackingโฆ
But wow, does it help you learn and level up quickly. ๐
7. Git is a lifesaver, โgitโ good at it
Do I really need to be good at git? ๐คช
This question was pretty popular in a freeCodeCamp forum. Hereโs what I would say:
Git is useful even for solo projects, and is a must have skill for any engineer working on a team.
It essentially allows you to have infinite file versioning history. To break up your work into little โcommitsโ of work.
Got something working? โ commit it
Want to try something crazy? โ start a new branch
Messed up something? โ roll git back to the last working point
I loved what one engineer shared in response to that question:
โGit is extremely useful.. because of its โoh--I-**-my-code-up-big-timeโ rollback ability. ...Working it into your habits will save you loads of hours in case things go wrong later down the line.โ
I totally agree! Itโs something I use every single day.
8. Learn how to learn, it will help you grow quicker
Software engineering often changes quickly.
There have been many times in my career that I felt like I was falling behind. I needed to quickly learn a new technology at a job I just landed, or I was working on a new project that required a new library I hadnโt used yet.
Itโs been times like these where Iโve been helped by a proven learning framework.
A dude named Richard Feynman once dubbed: โthe smartest human in the world,โ came up with a proven approach to learn new things.
Iโve adapted it a bit to apply more to software engineering.
Read the official docs, grab a book, etc.
Try it out
Do more reading / research
Get it working
Refactor
Summarize and document
Share what youโve learned
Anyone can learn software engineering โ even the most complex things like microservices, kubernetes, kafka, idempotency, etc.
If we put in consistent effort, and apply the learning systems that work, we will successfully grow in our skills.
Donโt take it from me though โ hereโs what the smartest man in the world had to say:
There are no miracle people. It just happens they got interested in this thing and they learned all this stuff. Thereโs just people.
โ Richard Feynman
I believe in you โ youโve got this.
9. Donโt be afraid to make mistakes
Making mistakes is part of the job. We all suck when we start something new.
Itโs part of how we learn and grow as humans.
When I think back to my now 1st grader as a toddler learning to walk, he stumbled and fumbled quite a bit. But we were elated he was moving and learning and trying!
Itโs the same thing with making mistakes as an engineer (in a good company culture).
You learn, you grow, you figure out how to do it better next time.
Soon youโll have people coming to you asking you for advice.
Itโs that 1% better everyday that matters and adds up.
10. Develop a bias for action, just try things
This is one of the traits of top performing software engineers.
Amazon even lists this as one of their core principles.
Itโs often heard in our industry as: โmove fast and break sh!t.โ
But what does that mean?
Does it mean being impulsive?
Does it mean build first, plan later?
Having a bias for action means you will:
Take calculated risks with the best info you have, and try things to find the best solution quickly.
If you find yourself asking: โshould I do something about this?โย
The answer is probably yes. โ
Make a plan, and start acting.ย
If it fails, regroup, and start again.
Try. Fail. Learn. Fail. Grow. Fail. Succeed.
11. There are no stupid questions, ask more
One of the best ways to learn is to ask questions.
I used to be afraid to ask questions for fear of what others would think of me.
However, instead of just looking dumb for 5 mins while asking the question, oftentimes Iโve gone 5 months without knowing the really learning something.
Now I see that asking questions is a way to supercharge my growth.
This applies to so many things:
learning a new skill on the job
landing a new job and learning all the things
interviewing and researching a company
learning about the business to make better engineering decisions
Pro-tip: after you get an answer, document it for yourself and others to level up!
12. Spend 15-30 extra mins to understand the larger system when you work on bugs
One of the ways I really leveled up in my systems design understanding was working on bugs.
Oftentimes when we fix a bug itโs deep inside a code flow or system and just needs a one line fix.
Itโs really easy to find the error and push up a fix without understanding the whole picture and exactly how it broke and what all it affected.
What I started doing was taking an extra 15-30 minutes on a bug to understand the surrounding system I was working in.
I would ask myself questions like:
What APIs call this code path?
How would users experience this bug?
What could we do to prevent a similar bug in the future?
Is there a poor architecture pattern in use that allowed this bug to slip in?
Asking questions and digging in for an extra 15-30 mins helped me massively level up in my understanding of our systems.
Do this for 6 months, and soon youโll become the engineer everyone goes to with questions.
13. Clean coding design patterns really help reduce spaghetti code
Ah yes, good olโ spaghetti code. Easy to hate on, difficult to work in it.
But how does spaghetti code even get there in the first place?
From what Iโve seen, itโs over prioritizing new features, rather than maintenance, flexibility, extensibility, simplicity, etc.
Over time one more function param is added, one more unit tested is omitted, one more rushed deadline is thrown at the teamโฆ
Until one day you end up with a mess of code that one one wants to touch.
To combat this, I like to follow the boy/girl scout rule:
โAlways leave things better than you found them.โ
Add that missing unit test
Rename a variable to be more clear
Break out a massive function into little ones that do one thing
Make your code better over time, not worse.
If everyone does this, little by little your codebase will improve and soon become a joy to work in again.
Not to mention be cheaper to maintain, easier to extend, and faster to build in.
14. Read one or two books a year
Reading one or two really good books will often help you round out your skills more than just reading a bunch of random blog posts.
However, what you donโt want to do is see lists of 50 top engineering books, try to read them all tomorrow and then get overwhelmed.
My advice: pick 1-2 books and read them over the next 6-12 months.
Youโll probably finish way more and retain a lot more than if you try to crush through all of them and only finish a few.
Here are a few of my favorites:
Clean Code
It doesnโt have to be crazy at work
Practical Object Oriented Design
Designing Data Intensive Applications
15. Take some basic design training, youโll need it some day
So often as fullstack or backend engineers we focus on getting something to work and then weโll โmake it prettyโ later on.
However, a lot of times that โweโll come backโ never happens.
Poor design minimizes the value of the userโs experience to an afterthought.
We preach about test driven development.
We should do the same with good design + user experience.
For me, taking some basic design training, as well as getting good at HTML/CSS really helped me be confident creating new components and UIs that look great, and work really well for our users.
16. Build yourself a support system
Community has been huge for me.
Not only for support, and mentorship, but also opportunities, and career growth.
A few years ago I was working in a toxic job environment.
One thing that really helped me recover from that time is a group of engineers I call my โcoders support group.โ
We have a group chat going where we:
Share what we are stuck on and could use ideas for
Laugh at random things we find funny
Support each other during hard times at work
When I was in that really stressful job, it was amazing to have their support.
I healed by being able to share stories, have their empathy and support, and hear them tell me my workplace wasnโt normal or ok at all.
Iโm in a much healthier environment now, but the support group is still something I really value.
We are made for community. To do life with others and share the highs / lows with them.
Hereโs a few ideas on how to find people for a group:
Connecting on social media (twitter/linkedin/youtube)
Meeting at a co-working space
Striking up a conversation at your favorite coffee shop
Happy hour at work with coworkers
17. Find a mentor who really cares about you
Finding a mentor who cares about you and your personal and professional growth is huge.
Itโs like having a cheat code for the test.
You can learn from others and their experiences without necessarily having to go through the same mistakes yourself.
If you find someone willing to be your friend and mentor you โ even if they are just one step ahead, hold on to them. They are worth their weight in gold.
18. Take breaks and acknowledge your humanity
I love to work hard. I love fast-paced work environments.
But I also really believe in work-life balance. 60 hr forced work weeks are not for me.
However, what I havenโt been great at is actually taking long breaks. This year I havenโt taken any vacationโฆ and Iโm not really proud of that.
Itโs been one crazy project after another we had to get out.
Then recently I stepped into management for the first time and Iโve been trying to protect my team from some of the craziness of bugs, organizational shifting, and crazy clients.
However, what message is that sending to my team? I want them to feel freedom to take their vacation, to rest and recover.
I want to celebrate breaks just as much as we do working hard.
So this week Iโm on the beach with my little fam, off social media, unplugging, resting up, refreshing my mind and body.
Deep breath โย man, it feels good.
(fyi: I wrote this article last week and scheduled the send time so I could fully unplug)
19. Imposter syndrome is a sign you are in a season of ๐ growth
I used to look forward to becoming a Senior Software Engineer so I could build anything, and all my imposter syndrome would go away.ย
Iโm here now. Did it work?
Nope.ย At least not all the way.ย
Yes, I know more, I can build more things,ย but Iโm also working on harder problemsโฆ
I still struggle with imposter syndrome, but now I see it for what is.
A sign Iโm in an uncomfortable ๐- season of growth.
Iโm leveling up in new, exciting, and challenging ways.ย And thatโs truly something I can get really excited about.ย
20. Never say thatโs not my job
One of the things Iโve learned after working at several startups is that sometimes you just need to roll up your sleeves and do the dirty work.
The thing thatโs not really your job, but also isnโt really anyone elseโs.
Writing up that ticket with better acceptance criteria
Pitching the business value of a refactor to leadership
Working with a designer to work through differences in the styleguide to code
Pulling a .csv report so that one customer feels confident in your system
Estimating the cost of scaling that db on your busiest service
A lot of those things are โdevopsyโ or โdesignyโ or โbusinessyโ, but sometimes youโll just need to do them.
Iโm not advocating for doing a bunch of invisible work and saving the team from defining roles and responsibility and processes.
What I am saying is be flexible, pitch in to help out the team, and just be a kind human.
Other folks will want to work with you, and opportunities will find you.
21. Soft skills are the hard skills
One of the things I see often in our industry is that โsoft skillsโ are undervalued.
Most of our tutorials, books, youtubes, courses all focus on getting better at coding.
Reality: our jobs as engineers have a lot of things that arenโt coding.
We have to learn how to disagree respectfully and move forward with others whoโs opinions are different than us
We need to learn how to write project status updates in a way business leaders can understand
We prepare presentations, and write technical specs
We mentor others and help each other grow
There are a lot of โleadershipโ and โrelationshipโ skills in our day-to-day.
Focusing on growing in them with the same rigor as I have to grow in my coding skills has led to promotions and opportunities I never would have had.
22. Be a kind and genuine human
Iโd loved this bit that Ryan Peterman shared recently that really lined up with something Iโve learned and am passionate about.
So much of our work is actually just about being a kind/helpful/thoughtful human.
Being a great engineer doesn't mean it's okay to be a jerk. Building software is collaborative. The better teammate you are, the more effective you will be.
Empathy in a strong engineer is a superpower; having high EQ will do more for your career than writing perfect code.
โRyan Peterman, Staff Engineer | Instagram, author ofThe Developing Dev
If anything, as leaders, we should be the most enjoyable to work with.
With great power comes great responsibility.
Be a thoughtful, genuine, kind, caring human. ๐
23. We are problem solvers first, not coders
As software engineers, we are brilliant thinkers, creative problem solvers, and excellent tradeoff analyzers!
Our main job is actually not just writing codeโฆ
Itโs creating value and solving problems. At the end of the day we are writing software that humans or computers will use to help humans.
Sometimes the best way to solve a problem is without code.
Focus on learning how to solve problems, not just on learning how to code.
Itโs a subtle difference but it will really help you focus and create huge value for the companies and users you work for.
24. Communication skills are huge
One of the best non-coding engineering skills you can develop is clear, concise, and thoughtful communication.
The type of communication that speaks to all interested stakeholders โ not just technically minded people.
Wait, but hold upโฆ donโt software engineers just write code for 10 hrs a day?
That couldnโt be further from the truth. Here are just a few of the ways we spend our time communicating besides just writing code.
Writing 5 pager technical specs
Creating documentation for new app features
Writing out tickets and bug reports
Sharing standup updates
Giving project status updates to business leaders
Work on your communication skills, both written and verbal.
It will pay huge dividends. ๐
25. Learning about the business will help you be a better engineer
One of the things I loved about the hyper-growth startup I worked at in 2020 was the way I got to learn about the business, sales, product, customer support and more.
Our founder always encouraged anyone โ even lowly engineers โย to ask about business plans, about upcoming sales, or new projects.
He even welcomed us to challenge their growth plans or new product ideas in an all hands meeting or via private DM with the C-suite team. ๐คฏ
I learned so much from that experience.
It made me a better dev.
Because I understood more about our products, services, and clients, I was able to pour that into how I built features, and solved problems for our users.
I donโt hear many people talking about this โย but I think itโs a really underrated area as a developer that can make you standout โ especially if you want to work at a startup.
26. Some company cultures are just toxic, itโs ok to leave
Thereโs a time to stay and affect change by speaking up โ and thereโs a time to affect change by leaving and choosing health for yourself.
A toxic job can take years to recover from (speaking from experience).
If you see these and other unhealthy signs repeatedly, you advocate for change, and nothing improves โย run.
Working weekends and evenings is part of being a โteam player.โ
Leaders bad-mouth other leads to their reportsย developing an us vs. them culture.
There is no diversity in thought, opinion, culture, representation, or ideas. eg. โwe just need people to do their jobs, we donโt have time for that diversity stuff.โ
Project estimates are not respected: โI know you said 4 wks for this project, but canโt you just hack it up in 2 wks somehow?โ
Everything is engineered at google scale. There are no MVPs. Complex systems built for simple problems happens again and again.
There are healthy company cultures and teams out there, you deserve to work at one.
27. Donโt hold yourself back from applying for that stretch dream job
Something Iโve learned is that companies are going to ask for the world.
Mid-level engineer position job post:
8+ yrs experience in faang tech companies
Expert in Java, Ruby, Php, Typescript, Elm, React, Serverless, DBs, Kafka
Crushed 1000+ hrs in leetcode with a top 1% rating
Itโs so easy to see unrealistic posts like this and undervalue your skills.
In reality, if you find a healthy company and can show you know how to solve problems, are excited about their vision, and eager to learn and build, they will probably be interested in you.
Good companies know that the best engineers can pick up new languages.
Itโs not so much that you know everything on the job post, but that you know how to learn, and have the experience to solve the kinds of problems they have.
Donโt hold yourself back. Apply for that job!
If you donโt make it, keep working on your skills, and try again in 3-6 months.
Rinse and repeat.
28. Keep a brag doc for encouragement and resume building
A brag doc is something you update bi-weekly with everything youโre working towards and accomplished.
Every couple months review your bi-weekly notes and summarize them.
Summarize the value or business outcomes of your successes.ย
Maybe you spearheaded a new product feature. Did sales land a new deal because of that feature? How much was that deal worth?ย
Example: Built a feedback form tool for customers to leave dine-in reviews after a meal. As a result of successfully completing the engineering work for this feature ask, we pulled in $700,000 in additional sales this year.ย
Or perhaps you onboarded and mentored three junior engineers. How much did your team productivity increase because of helping those engineers onboard successfully?
Their success are your successes in part, because without a good onboarding experience or mentoring they wouldnโt be contributing as successfully.ย
A lot of times youโll be sharing your accomplishments with business and hiring folks who arenโt in the day-to-day of the coding world.
Learning how to speak their language and show your wins in a clear way will really help you standout in our crowded engineering field.
Quantify. Quantify. Quantify.ย โ๏ธ
Brag docs are also an awesome reference doc for your LinkedIn, 1:1s, resume, yearly reviews, promotion conversations etc.ย
29. Your skills are worth a lot
โThe problem isn't that people are over paid. It's that so many are underpaid.โ
For a long time in my career I didnโt realize I was so underpaid.
Yes, I had some areas I needed to grow in, but even then every time I asked for a raise I was told โok, once you become a better developer weโll consider it.โย
Problem was, there was no career ladder defined.ย It was just a way for the company to say no.
We all deserve better.
Eventually I did level way up and my boss said: โWoah, donโt learn too quickly we canโt afford to pay you that much.โ What??
You realize you are underpaying me but donโt want to lose me but still want my skills here?
We all deserve better.
After researching growing companies with good compensation and a healthy engineering culture for three months.
I ended up landing a new job that 2xโd my salary. ๐๐คฏ
I didnโt realize how much of a boost of confidence that would be!
Now I see under paying workers lowers the self-esteem of your employees.ย
Creating a vicious cycle of frustration of working for low pay, but also not feeling like you any other options.
We all deserve better than this. ๐
If you are in a situation like I was reach out, talk with friends and family, do research on other companies with similar positions and looks for companies that will treat you better and compensate you well!
You may just land a 2x pay increase like I did. ๐๐ผ
30. Senior engineers, stop coding so much
Wait what?? Ok, Caleb, now you are off your rocker โ thatโs what helped me get to senior engineer level. ๐ง
I know, same here!
What Iโve learned is thereโs actually a point where too much heads down coding will hurt your skills/career growth.
What you should focus on instead is becoming a force-multipler:
Encouraging others to leadย
Coaching other engineers through technical speccingย
Letting go of my opinion as the best way to solve somethingย
Spending time to research where we need scaling or refactoring
Mentoring others on their engineering skills, soft skills, and leadership skills
Itโs starting to become more clear nowโฆย
Senior+ engineering levels are not just about being the best coder.
Itโs about how all our teams and systems work together,ย rather than just my project or tasks. ๐ค
Itโs more about supporting, cheerleading, and coaching others. ๐
Helping us all level up together ๐
I hope those lessons were helpful! Iโve learned a lot over my last 10 years as a software engineer. And I know I still have a lot more to learn!
What lessons have you learned that you would you share with your junior self?
Iโd love to hear from you in the comments ๐โโ๏ธ๐โโ๏ธ
Until next week ๐๐ผ
Catch me daily on LinkedIn where I talk about everything software engineering, startups, and growing in your engineering soft skills.
โ Caleb
P.S. Donโt forget to like, comment, and share with others if you found this helpful!
30 lessons I wish I could go back and tell my junior self
hey Caleb, this was a great read.
Loved your advice on learning Git and Debugging.
I read the book "Pro Git" many years ago and it was one of the best time investment I did.
This was a great article. Loved it.