Habits of great software engineers
vadimkravcenko.com
vadimkravcenko.com
Good developers don't stop at making the happy path work. They obsess over making their code fail elegantly. They make systems that are strongly robust. They think about the failure states deeply. Slightly antagonistcally, they're also able to prioritize moving forwards when something is good enough rather than trying to make something perfect.
In my career I've only met and worked with a handful of really good devs. I've worked with loads of people who are great at one or two aspects of the job, but you rarely find the complete package. I think the best devs have a key skill of understanding how to make good tradeoffs and maintain a balance of what's needed versus what's interesting. I know I don't have that skill (yet).
Everywhere I've worked, managers are pushing devs to close tickets, implement features as fast as possible. Usually they are fine with implementation of happy path only, leaving tons of technical debt to the far future.
If someone puts an extra effort to have perfect system - that means they will look less productive than their peers.
I want user-focused pragmatists who aim high while understanding they don't have the resources available for perfection.
I was a dev for 25 years before moving into management. That's pretty much my approach, although I think I fell a bit short in many ways. Now my job is to try to lead other devs to do better than me. I'm trying to be the manager I wish I'd had. I don't think that's unreasonable.
>Tech detox — Recharging away from your monitor makes you a better programmer.
Aren't these the opposite of each other? Do build stuff on your own time, but don't spend your own time on the computer?
Go above and beyond, but still close tickets = work 60 hrs/week
Do a tech detox = you better not have family to visit, because every vacation has to be about recovery from work.
Do side projects = what are kids ?
All of these these posts are written with a massive dose of cognitive dissonance.
Make US top 1 percentile wages, but live with the emotional security of a daily wage earner. Amazing !
I'm keeping an open mind, that's my initial reaction but if what follows is interesting then it has value nonetheless. In this case it's just 2 generalities that don't really help anyone, akin to me saying that to live a better life you should have a good work-life balance.
Everybody knows that, I'm not bringing anything that they can reflect about or act upon.
The Ayns will say do those 5 in addition you lazy bastard to which I say OK then I will do them for my own IP/ideas.
If 80% is spent understanding reading about the domain in which you are working, talking to your users and domain experts, documenting your work, and mentoring juniors or being mentored by seniors, there should be nothing depressing about that.
If you have 8-10 engineers you’re supervising and are the person interfacing with management, I don’t think it’s unreasonable to spend half your time coordinating, teaching, and planning.
So scale down the expected SDE 1 quotas (~50% coding), and you get around 25-30% coding time.
I think a lot of people confuse being an experienced career engineer with being a technical lead; that’s the real jump from SDE 2 to SDE 3.
I don’t think I explained that well — but a 3:3:1 to 5:5:1 SDE 1:2:3 mix is fairly standard across industry. (Again, with an SDM doing the managing.)
I used the word “supervising” because I wanted to distinguish that technical leadership from managing, but didn’t explain enough. Sorry for the confusion.
I think I write perhaps a couple of lines a week and that's usually patching something in an emergency after other people have failed.
Advice: never get too senior.
A trait of a good manager is allow different people to be effective in the collaboration of writing software together.
The article paints an unreal rosy picture where "everything runs smoothly and has forward momentum".
Working with a live system is messy. There is always compromise because there is never enough time to keep everything smooth.
It is very common to be stuck at some problem. That moment you let a problem clunk around your brain and you randomly think of a solution in the shower or at the grocery store is way too common. And honestly fun.
The percentage of coding on a project that I get to design is even lower.
- What are we making? Why does it work on a domain level?
- Feedback. This thing I've built, does it do what it needs to do? No? What needs to change? Two-way conversation.
Finally, I would say that while writing code is important, it's also important to be able to read code, and to remove code. It's as important to be able to read what others have written as to be able to compose your own, or surgically remove pieces.
One engineer has been asked by a naive product owner to remove the wings "for aesthetics". A junior engineer thinks we should be wind powered or something. A senior engineer has gone rogue and is trying to replace all the aluminum with titanium.
This aircraft doesn't even have landing gear, it'll never come down other than to crash. Meanwhile we crawl all over it, needing constant communication to keep from making a fatal change. Also the average tenure of an engineer on this aircraft is two years, just enough time to get the hang of it before jumping to the next aircraft.
It's amazing we even spend 20% of the time coding.
This is why I'm a big fan of pairing and mobbing. Fewer streams of work paradoxically allows for faster feature development because of reduced communication and training costs.
This is why I have my engineering teams only given X/2 streams of work where X was the number of engineers. I want more people thinking about finishing fewer tasks. Which means on average they spend about 28 hours a week writing code, far more than the industry average of 8 hours. This also reduces rework.
Is it the ability to solve problems using code? Is it performing maintenance? Is it the capability to navigate a socio-technological environment to build something? Or is it a mastery of technical fundamentals?
In most other professions, "greatness" is often tied to the actual outcome of their work. A salesperson can say, "I sold XYZ units this month," a plumber can say, "I fixed XYZ bathrooms this month," and a soccer player can say, "I made XYZ goals or defended XYZ balls against the goal." However, when it comes to software, some people forget the importance of outcomes, or worse, claim some exceptionalism in this field.
I'm not trying to be cynical here, but for me, it's quite challenging to establish if someone is great or not if we detach outcomes from the evaluation, regardless of the concept of "greatness" in this piece.
At least for me, greatness has a large share of context, opportunity and concrete outcomes.
Many of these habits are a byproduct of personality traits, which are largely plastic. Tinkering and lots of projects indicates high levels of Openness(HEXACO- openness to experience). Low Neuroticism can play a large part in the point about environmental fragility.
Great software engineers can (from MY experience and largely the collective commentary of hacker news) have a variety of dispositions.
Be:
- World class at what you do
- Humble
- Helpful
- Someone with a reputation for solving problems, not causing more
Perhaps aiming to be world class.
A good example of such a union is Newton’s letter to Hooke (1675). Most folks will recognize the “standing on the shoulders of giants” quote.
Context is everything. Newton said that to Robert Hooke, a short man with a hunchback!
we can be world class, and at the same time have the appreciation on how other people excel at their craft. especially the fact that we are standing at the shoulders of giants.
People overcomplicate everything!