Hacker News new | past | comments | ask | show | jobs | submit login
What Makes a Great Software Engineer? [pdf] (washington.edu)
304 points by vshan on Dec 10, 2017 | hide | past | favorite | 126 comments



I don't get the "9 to 5 wouldn't make you a great engineer" about not being passionate, some people are passionate but have other life obligations like kids or other activities.

Being personable: "Can I have a beer with this guy?" is the worse in my opinion. I care about your professional skills and if you're communicating well, but you definitely don't have to be a beer buddy, we might have 15 years difference, a very different background and share very few topics in common over a beer (assuming you even drink beer) but you could still be a great engineer to work with.

Also you don't have to be a guy! The authors recognize that they only interview 5% women in the end...

So overall some good advice, but it has a huge sampling bias. therefore the definition of a "great software engineer" is only valid in certain circumstances. For instance the authors recognize creativity is important, but one could argue some of the most creative engineers that can be found are the people who do another, very creative activity on the side (arts etc). These people would tend to be "9 to 5" because their "6 to 8" are already booked, so even if they appear less "passionate" they can be a huge asset to the team.


> I don't get the "9 to 5 wouldn't make you a great engineer" about not being passionate, some people are passionate but have other life obligations like kids or other activities.

I think what the engineer is trying to convey is that a great software engineer thinks about code beyond just the job. I don't think the engineer literally means being a workaholic or the literal 9am-5pm shift, but the engineer has pet projects of his or her own that aren't necessarily related to work, as well as thinks of programming beyond just a paycheck as a personal interest (just as a photographer or any other craftsman would).

I've hired many programmers. The most disappointing ones were ones that only did exactly what their work told them to do. They would never read technical stuff or things like Hacker News on their days off.

The best programmers were the ones that built pet projects for their own needs. I remember one guy would write a script to download new wallpapers for his laptop to cycle through the hours of the day. If I recall correctly, Gmail was an engineer's pet project (when 20% time existed). Some contribute to Stack Overflow; others to open-source and to blog posts.

It's a lot like being a good restaurant cook or musician. You enjoy cooking, not just for the pay, but for how the craft empowers you. A good cook will think about what sides will pair with that steak, while an average cook will probably robotically sling together a dish. A good engineer will show passion.


That's a relief. Three kids mandate 9 to 5 work hours. There isn't much quality time or mental energy to dedicate after that.

It's a relief because whatever energy I have left I spend on books, articles, papers. Those things have helped my 9 to 5 in a big way. I bring what I learn to the job.

It doesn't beat hands on practice. I do itch to work on practice projects and I'm hoping when the kids are a little older, I'll have more time and energy for that.

In any case, my kids are my number one. The day my first was born was the day my motivations and my reason for being shifted.


I couldn’t agree with you more. I wish I could do more than give you an upvote, so here is an internet cheers and just know there are a lot of people who feel the same way. I also love what I do, read when I can, but at the end of the day I work hours which allow me to be with my kids and wife as much as possible. I hope to keep getting better, to become a great engineer, but I will take the slower road if it means more family time.


Exactly the same :) the guilt of not spending time with my kids and my wife is too much. There have been times where I've tried to sit down and work on something but it's no fun when there's a strong feeling of "I should be spending this time with my family".

The other thing I've noticed is that the separation and challenge of raising children has made me more productive. You don't know stress until you've had a newborn. There are things at work that used to affect me and I look back now and think "how was that even a problem?"


> There have been times where I've tried to sit down and work on something but it's no fun when there's a strong feeling of "I should be spending this time with my family".

That doesn't sound like a recommendation for becoming a parent. In fact it sounds the opposite - "don't have children, or you'll guilt yourself out of every other thing you could be doing".


Well life is about choices. People are free not to have children. But yes, when you do you bear a certain level of responsibility to them. I think a lot of people would characterize sitting in your office building CRUD apps every night so that you have a sweet green GitHub calendar while your kids sit alone on the couch watching TV as an abdication of that responsibility.


Teach them to code and do it together! ;)


Well it's not for me to recommend. I don't recommend it if you don't feel you've got where you need to be and that matters very much.

There's tonnes of reasons why I wouldn't recommend parenthood. I don't think I was ready by any margin. All I'm saying is that I don't regret it and I consider it the best decision of my life.


I'll say the selfish thing. There isn't (and rightly so) any law that requires us to have children. I say use it. Let the suckers who want children raise the children we need to take care of us when we are to old.

My personal recommendation us when in doubt, err on the side of not having children. Don't make life harder on you than it has to be.


Sensible advice if not coloured with the chalk of Ayn Rand!

Hopefully I do a good job and it'll be my honour when my children look after the old when they grow up.


Ideally, they won't look after the old; their robots will.


You don't know stress until you've had a divorce due to all of these after hours spent studying the latest fad. That is real stress and that happens to a lot of programmers. I am dealing with that personally, I have had 2 kids and I have done the best I could. Newborn stress is nothing compared to a divorce from a long term marriage.


Well there is that. One other thing I've learned is that no matter how stresses I get, there's always someone going through worse and here we are.

Sorry to hear that man, cannot imagine what you're going through - I've come close with my Mrs and it's not nice.


>>In any case, my kids are my number one. The day my first was born was the day my motivations and my reason for being shifted.

Your kids should be your number one priority, absolutely.

Make no mistake though: when you have kids you are trading off professional development outside of work for raising a family.

Nothing wrong with that, but the trade off definitely is there. People who ambitiously work on personal projects in their spare time will, on average, advance faster than those who are 9-5'ers.


Yep and I'd have it no other way. Before kids, I used to be like that.

If I "ambitiously worked on side projects", I'd at best miss times I'll never get back and at worse be downright neglectful.

That's a "trade off" I haven't thought twice about making. There is no mistake. As I said, my kids are number one.

In fact, I'd argue it isn't much of a trade off at all. Time with my kids is infinitely more valuable than time spent on my career.

Someday :)


I wish it was more socially acceptable to not have children. In many parts of the world, there is still so much stigma if you marry and don't have a child within a couple of years. I am hopeful things will change and we can swing down the total fertility rate to below one.


I'm 34 and living in Berlin - I know a low of people within ±10 years of my age here and MANY have no kids and aren't planning on having any. The norms are changing in a lot of major urban areas.


I certainly felt no pressure to have children. In fact, up until the moment I decided to have children, I always said I didn't want them.

What changed was my partner's boy, and now my boy for all intents and purposes. It made me rethink my stance and I decided to expand my family.


> when you have kids you are trading off professional development outside of work for raising a family.

I believe that having children gave me more motivation and reason to be better at the things I do. It also forced me to structure my life a lot more which can have beneficial effects on productivity too.


> The day my first was born was the day my motivations and my reason for being shifted.

One of the many reasons I remain childfree.


Each to their own - I don't see it as a bad thing. Having children has made me happier and more fulfilled in ways that I could never have imagined.

You cannot know the feeling of it until you do. You cannot really understand it until you do. It changes your world.


> Having children has made me happier and more fulfilled in ways that I could never have imagined.

That's my main problem with it, it's super selfish to procreate. I don't feel I have the right to force new life (with all the pain and suffering that entails) onto this world for the sake of making me happy. I love my potential children too much to do that to them.


I think this is probably the most self-indulgent thing I've ever read.


Is it just a coincidence that there was an article about this very thing a few days ago here?

https://news.ycombinator.com/item?id=15869983


In my case, yes. I've been an antinatalist for a long time.


It's self-indulgent to not have children?

How is it not self-indulgent to have a child to fulfill your own sense of purpose?

You are utterly alien to a lot of people.


I don't want to have kids in the slightest, but this is not accurate at all. You can have kids for both reasons, and enjoying the lives of your kids is not wrong if you love and care for them for their sake alone as well. In fact, when I tell people that I don't want kids, people go the other way and tell me I'm being selfish not to.


That's rediculous. For most people, having children is the most selfless possible thing. Kids are extremely expensive.


Use our planets limited resources because you think your DNA needs to survive ? Of course it's selfish.

Give one reason to have children that doesn't include words like "I want".


Give one reason why you do anything you do without "I want".

Wanting something isn't selfish. It entirely depends on what it is you actually want.

Oh yes, you could argue from a hardcore libertarian stance that altruism does not exist and every action is inherently selfish but is that a good way of looking at the world? I think not.


> is that a good way of looking at the world? I think not.

Define 'good' ? It's an accurate way of looking at the world. You can try to convince yourself otherwise but you don't really live in that world.


If it's an accurate way of looking at the world, you've just demolished your own reasons for not having kids.

You don't want kids because it's selfish? That must mean, using objectivist reasoning, that to you not having kids is even more selfish. So your reason for not having kids is no reason at all if you subscribe to that sort of shit.

As for good, in the same way that you reduce a lot of things down to one thing that is objectively true but isn't really useful for everyday life.

Sure, I accept that it's possible to reduce down and argue all behaviours are selfish. Does that provide insights about the world? Nope. Does it explain human behaviour adequately, even if fundamentally accurate? "Why does inequality negatively impact inequality?" Because people are selfish?


Some night even argue that not having kids is selfish.


> Some night even argue that not having kids is selfish.

People argue all kinds of insane things.

Having kids to fulfill your own sense of purpose is very selfish.


On the flip side, there is some probability that your child may save 1 or more lives.

On the flip flip side, there is some chance your child may take 1 or more lives.

Arguing about the selfishness of procreation is silly. It is your biological purpose. Whether you choose to run with that or not is down to you. It is not selfish if you choose whatever way.

As a parent, my children come first. I would die for them. You make that choice when you have children. That is NOT selfish.


Perhaps it can be viewed in the same vein as Michael Jordan's "for the love of the game" contract clause. The clause stipulated that MJ would be able to run off whenever he wanted to join a pickup game, let him remember why he plays. Now, it'd be probably unreasonable for engineers to say to their manager, "hey, I'm going to take a few days off because I want to contribute to an open source project". But my point is whether they ever have a "for the love of my craft" perspective at anytime in their life. How that actually manifests in reality, good question.


Why is that unreasonable?


Its not unreasonable, given that some companies demand passionate rockstar unicorn engineers, yet most companies will not grant that request - they will instead exploit that passion into workaholism and leave you holding the bag when you burnout. So as engineers, we must demand equally that "passion" not be a requirement.


Lots of companies don't actually want "rockstars". I know someone from college with incredible quantiative and programming skills. He started taking rigorous college level math classes and writing his own compression schemes in high school. He got his undergrad degree in about 2 years by getting permission to enroll in 4+ graduate computer science courses each semester instead of doing the normal curriculum.

When he got hired to do boring tech work at the company I worked at, he just freaked everyone out. The questions he asked were too pointed and he would just do things correctly instead of doing what his boss said. Since he was extremely gifted and had offers to work at other (better) firms, threat of job loss didn't mean anything. All his managers basically hated him.


I know people like that, and I think I've been that person before at my first job. I would argue that someone with great quantitative and programming skills who "freaks out" their coworkers is not a rockstar. To be a rockstar developer, you have to have good enough communication skills to work within your team.

A rockstar developer wouldn't ask questions of their coworkers that would embarrass them; a rockstar developer would phrase questions and concerns in a way that the other people on their team could understand. A rockstar developer wouldn't do something contrary to what their boss said, they would explain why would do something a different way before doing it (or explain why it's better). Now, if coworkers or management are too incompetent for even that, sure, even the best developer would have a bad time.

Part of being a rockstar developer is, in short, knowing how to work with developers who may not be as good as you. I've been there before and while it can be tempting to use that opportunity as a way to establish hierarchy (sadly important if your company stack ranks) by asking technically challenging gotcha questions and showing off how smart you are, it creates a toxic work environment and disrupts other people's work. It's much better to help people grow and not to overwhelm them with technobabble


"Now, if coworkers or management are too incompetent for even that, sure, even the best developer would have a bad time."

I haven't worked with his team, but based on my experience with the company, it's possible that there was some of this, and people being so demoralized that they let the incompetent guy with the most standing make stupid decisions and then just do what he says. But they may not have been as bad.


I admit some envy of people who find their passion early and make the most of every year of their life leading up to a career, but if he's so smart and driven, why is he working at some "boring tech" company as a cog under some layer management? Why doesn't he consult solo and reap the fruit of his precociousness?


> I admit some envy of people who find their passion early and make the most of every year of their life leading up to a career

Don't. At least some of us are having a bad time working because of it.

I found programming in my early teenage years, and - excuse me if I sound arrogant - by now, I've already seen or worked with anything even remotely interesting programming-wise that a regular coding dayjob could throw at me. Gluing together CRUDs from random libraries gets boring very quickly. Solving problems in large systems becomes day-to-day drudgery, because you know that there isn't much smarts there either - all those problems are, unavoidably, self-inflicted. As the codebase grows, you spend bigger and bigger fraction of time allocated to a task on routing - figuring out how to transport some information or command from one piece of the system to another, without turning everything into spaghetti or setting it on fire.

The usual things I see cow-orkers excited about is "oh, I'll get to use generics in Java for this, I've never used generics before!", or "this will teach me Framework X, it's surely a powerful tool that will be very useful for me in the future". They didn't get through this phase in high school, so they're full of excitement about work, however bullshit the project is. If you "found your passion early", you don't get that - all that remains is the bullshit project.

The point being, most of the work I've seen in this industry is pretty meaningless, and it's harder to do if you don't have the comfort of being constantly excited by even most trivial insights in programming. People who started late are better off, because the enjoyment they get through learning also helps them show up and do the work they're being paid for. They don't need to spend time on side projects after work just to retain their love for the craft.


I started programming when I was 8, on the family Apple ][. By my late twenties, I was ready to give it up. Working on legacy code bases for bad bosses has a way of sucking the joy out of software engineering (kind of like after four years in the Army I never wanted to go camping again).

But about the time my kids were old enough to no longer need constant, unrelenting supervision (all my kids were born by the time I was 25) I began taking up side projects again, which has largely renewed my love of programming.

So now I put up with the drudgery of the day job so I can go home and work on something I enjoy (I mean really, the day job could be anything at this point - programming just pays better than anything else I could do, and occasionally an interesting problem at work pops up). Which is also why I tend to become extremely resentful if forced to work very much overtime :)


I never saw it that way before -- but as someone who found programming in their early teenage years too, this sounds very familiar. I still feel a sense of excitement when I learn something new, but it wears off very quickly because most new technologies are just another way of doing the things you did before. E.g. I got to learn Type Script recently, but after a couple of days of getting used to the syntax it felt just like all the other frontend frameworks out there... It's true that most regular coding dayjobs mainly consist of gluing together libraries and solving (often) self inflicted problems, and it's so frustrating!


Well, it was just an internship he got through a relative. He ended up there after getting dinged from Google due to some issue with his class standing or something. He got a much better job after, and then suffered some very tragic personal circumstances, so I'm not quite sure what he is up to now. But I have great hope for his future.


of course the the corporate overlords want engineers to spend free time doing side projects. Usually they can claim those side projects as their own via the employment contract.


I hear this sentiment a lot. I don't think it has much merit if any. Were musicians practicing scales daily 9-5 (+ occasional overtime when a customer urgently needs a modus they're not familiar with) - would you expect them to "enjoy" another 3h of fingering, possibly on some other instrument, in their spare time - because it "empowers" them and it's "a passion"?


I have been in music for some time, and this is almost exactly what great musicians do. There is definitely a time for activities that are ‘neccessary’ or ‘good practice’ to spend time on, and then there is a large amount of time they almost subconsciously spend in their field: they just enjoy having a beer with friends (at a jam session), having a chat (about music), hanging back (with their instrument), waste time on YouTube (watching poor quality phone recordings of musicians they look up to). Some don't think about anything else. Some have other interests. But I cannot think of one great musician that doesn't touch music when they're ‘off from work’.


There is a difference between coding in your off time and reading Hacker News. What you're describing is someone who is relaxing not working. Aka great don't work long days mastering an instrument, just put in their 9-5 and casually have fun. So sure, if someone does not keep abreast of computing in their free time that's not a great sign, but deliberate practice works best a few hours a day not 10+.

PS: What side projects do provide is a way to have more experience than your number of years in the field would suggest. But, that has heavy diminishing returns.


I played a wind instrument for 10 years, ending in senior year of high school. I got quite good (if I do say so myself, lol) and had the opportunity to learn from a few excellent musicians in private instructions, chamber music, and the like. I have to say, I agree with the OP. The best musicians I knew critically listened to different pieces of music in their spare time, reflected on their performances, and so on. From what I could tell, music permeated every aspect of their lives, even if they weren't spending their free time practicing technical fundamentals. Their love of the art was such that I don't think they could stop that if they even tried to.


I think having someone who does their coding at work works better for people later in their career, or who have at least done a good solid couple of years of development professionally. For those early into their profession, I usually recommend people dump as much time as they can while they can to get to that point faster, that way when life changes such as they decide to have kids, or focus energy in other passions instead, they are better prepared to make the transition.

In addition, there is a real danger early in a developer's career that their resume becomes a signal of being a weak developer if they don't put in the effort to progress - I have seen this happen to multiple developers who did not take seriously the need to reach a certain level.

Now to tackle the analogy directly, there is a lot of competition for positions in the music world - musicians have to work pretty hard to get stable jobs, or carve out positions of prestige. The most successful musicians I know do it very often, whether it be arranging songs, practicing their musicianship, and immersing themselves in as many musical communities as possible.


They don’t have to actually code outside work. I scratch my coding itch at my job.

But I read all sorts of technology and programming stuff just because I’m interested in it. And that knowledge ends up coming in very useful.

I’d rather have someone like me than someone who does their coding at work but never reads anything that they weren’t assigned to by their job.

To use your analogy, would you want to musician who worked 9 to 5 but never listened to any music outside of their job?


I've had coworkers who were obese, childless at a relatively advanced age (around 40), poor relationship with their significant other, etc. tell me about how they spend their downtime making sure their manager meets their deadlines and studying documentation, sometimes working til 2 in the morning.

I'd rather just get laid off and collect unemployment for a few months then spend another week ruining my life like that tbh


I like programming and technology and reading about it and learning new things.

I’m never working 80 hours a week for someone to make them look good. No one should expect that.


Yeah, I'd rather have people in my life and things to do that don't involve making computers do stuff for money. If that makes me a bad engineer then our standards are fucked. I was on that track for several years, but it's not worth it. And I've built some good stuff and gotten a lot done since giving that up.


If a manager expects or even does anything short of actively discouraging that behavior, they are not fit to be a manager.


> Being personable: "Can I have a beer with this guy?" is the worse in my opinion

I'm not going to disagree with you re: beer buddies. Really the way I read this is not as a requirement that employees participate in after-work events or in mandatory work friendships, but more of a misguided heuristic for something simpler. The general question is whether the average interaction with you is pleasant or not. If your job requires interacting with others (as it often does in software teams) and you're generally unpleasant or difficult to interact with, then people might avoid interacting with you, and that's a hit on everyone's ability to do their job. On the flipside, someone who's easy to interact with can be a great resource to everyone and also learn from all the people they interact with.


That's a good point. Given the choice, I definitely would work with someone who's more pleasant to interact with. But my definition of "pleasant" in a professional environment is far away from my definition of "pleasant to have a beer with".

Like you can be a very friendly, chill, and fun person, but if professionally you keep overpromising, not own to your mistakes, pretend you know something when you don't (which could make you look cool outside of work but a pain at work), and other negative traits discussed in the paper, then I would avoid interact because you're not work-pleasant.


The funny thing is that a pleasant, over-promising person who pretends to know more than they actually do would be fast tracked for management at a lot of companies.


don't know why, but I've seen a lot manager in high level have these characteristics of over promising and always bull*hit something he don't even know.


"Like you can be a very friendly, chill, and fun person, but if professionally you keep overpromising, not own to your mistakes, pretend you know something when you don't "

This describes exactly the type of people the corporate IT department at my company. Really pleasant people until you actually need something.

Career wise these people can go very far though.


more of a misguided heuristic for something simpler

To me it's an indicator that the "simpler" is that management (and possibly more, given concomitant hiring practices) has only one way they know how to interact with people: after-class mode from college. In Social FizzBuzz it scores a "Fizz."


I don't think, and I absolutely don't think not joining a party would make one's interaction with another person unpleasant. I have seen both types. My old boss doesn't go to party much, but he's absolutely the easiest person to work with.


Yup, agreed - that was what I was trying to convey.


I feel like if the work isn't immediately like, "This is a product I myself see an immediate use and a need for," I'll have difficulty working on it.

On the other hand, if the product's like, "This is approximately something I've wanted to work on literally my entire life," my 9-5 is going to be a steady output stream of concise, quality code, with the languages and frameworks of my employer's choice.

My 6-8 is usually arts. I think engineering is art, it's just art whose language is mathematics. A lot of people disagree, but I purchased a GE NE-42 neon bulb and it's good evidence for my theory.


I don't get the "9 to 5 wouldn't make you a great engineer"

As an experienced engineering manager this is what I've come across - Some of the engineers who put a 9 to 5 clause, are usually the obstinate engineers, who are not very productive during the hours of 9 to 5, but won't make up by working extra hours. The motto is 'This is all I'll deliver, live with it'. Perhaps, this bias factors in and a generalization emerges 'All 9 to 5 engineers are stubborn, non-creative, non-committed'. This is a huge fallacy because, again based on my limited experience, I have worked with some of the most productive, creative and committed engineers who mostly worked 9-5, but sprang to action in the middle of the night when a high priority production bug had to be looked into.


Yeah, it's not about being unwilling to occasionally work overtime. The thing 9-to-5'ers are railing against is that overtime is being taken for granted. It's that projects are planned with unrealistic deadlines assuming we'll burn our lives away meeting them.


But don't the managers take the required estimates from engineers and plan accordingly ? Unless there is a strong deadline set by the market or by the customers.


They also can say that the estimate is unreasonable and demand to cut the hours because they're the ones who get a final say.


This.

> Being personable: "Can I have a beer with this guy?" is the worse in my opinion.

Social Drinking is a very western activity. In the East (India, Pakistan, China, etc...) a large majority of people are what are called "teetotalers" - never drink alcohol. Yet they socialize as much, if not more.


Japan and Korea have very strong social drinking cultures, so I don’t think it’s really a question of East vs West.


Drinking and eating is a very social part of life in China...


While I agree with you, in other industries such as hedge funds, "social drinking" is a regular thing.


Personally I've always hated the concept of beer buddies because if you didn't grow up with it, it's an entirely different type of interaction with different expected levels of intimacy. the people who will pass the beer buddy test will primarily be people who grow up with its culture and creates a monoculture. Perhaps not mono-racial but definitely mono-culture.


I think it really depends on where you come from. At my office in Sydney, Australia, I can say that the office "beer buddies" are extremely ethnically, religiously, politically and socially diverse.

The only things that are explicitly common would be a general appreciation for good beer and music. I wouldn't say it's monocultural, although it does tend to have a bias for people without (young) children.


If you don't get it, you will never get it. 9-5 won't make anyone a great anything. What makes people great is not what happens from 9-5 but what happens from their 5pm-9am.

9am-5pm, we do for others, 5pm-9am we do for ourselves. Life obligations or not.


"Great" is in the eye of the beholder - to a large extent.

An engineer that is great in a startup ("hacker", "moves fast and breaks things") may be pretty bad in a well-established product that just needs maintenance. And the opposite is also true - a very thoughtful engineer that takes time to create thoughtful, simple & extensible designs may just move too slow when the idea was bad to begin with, and just needed to be invalidated. Also - who is "great", a generalist or a specialist? Depends a lot on what you need...

It is true that some engineers are simply better than others (I'll take Peter Norvig any day over someone who fails at fizzbuzz, regardless of the context/problem that needs being solved) - but it is also equally true that people need the right context to really shine. E.g. I bet Peter Norvig would't have done his best work working for, say, Accenture.


I wrote a post a few years ago "50 characteristics of a great software developer" http://www.supercoders.com.au/blog/50characteristicsofagreat...

Having said that, and having written it, I still believe the absolute core issue in all technical recruiting is that no-one knows exactly what a great software developer is.

In fact, it is entirely subjective, and simply a matter of opinion.

I put it to you that most recruiting processes aren't worth a bent cent because the initial question cannot be adequately answered "OK, you're looking for 'the best' software developers..... PRECISELY what is that" And if an interviewer can't define precisely what they are looking for then how the heck do they know they found it with sufficient confidence to say "here is the right person for the job".

Most recruiting is simply Voodoo Recruiting, a collection of myths, legends, whispers, misplaced beliefs and pure nonsense. Does this person get the job or not? Shake the bones, look at the tealeaves, throw a rabbit over your shoulder and choose the person who gave the interviewer the best feeling.


Seems to boil down to the same old tropes that apply to every kind of work, and every kind of person. A good {worker} works hard, works well in a team, is self-reliant(!) blah blah. A good person is honest, forthright, etc.

Outside of very specific fields I haven't seen anyone come up with specific qualities that identify great workers. And the useful attributes will be specific to a field. For height for basketball players, chances created for soccer players, on-base percentage for baseball, etc.

We don't like to say it, but maybe there's something similar in Software Engineering, like "Can code FizzBuzz in under 5 minutes". At the same time I recognise that coding quizzes are not the latest word on what makes a guy good at coding.


It is definitely "ability to stay on task".

The difference between a great engineer and a mediocre one is the latter will just get distracted, stop working the problem and decide to go for good enough.

The great ones will work the problem, try multiple angles until something doesn't just work but offers the right balance of simplicity, elegance, future proofing and does the job well. You can't get there if every 5 minutes you take a facebook break, or can't grind through technical documentation and make experiments.


Huh, I would probably include "the ability to stop at good enough" in my criteria for greatness. I've worked with people who couldn't resist looking for a better solution instead of checking in the one they had - even for time critical bug fixes.


This is one of the most objective views on "what makes a great software engineer" so far here. People who can focus generally deliver better work, even when they don't work on pet projects after work.


It's a two-way street though. Some engineers work really well in management environments that others despise, some companies only want to hire engineers that don't need much training in their particular ___domain while others don't care as much, etc.

In order to establish criteria for universally assessing software development talent, we first have to decide what the perfect engineer looks like, and a lot of companies disagree on what that is.


> A good {worker} works hard [...]

Trustworthy, loyal, helpful, friendly, courteous, kind, obedient, cheerful, thrifty, brave, clean, and reverent!


I'm surprised to not hear an engineer's memory as an important correlator to skill. I find that working memory especially (or the lack thereof) really can hinder my performance when dealing with a complex problem. Sometimes I think it is THE defining factor!


Notetaking makes working memory much less of a issue. I recommend you find a way that works for you, if you're interested in career longevity as an engineer. Personally I alternate between todo lists for completion and coverage, and dialectics of theory and test for design and troubleshooting.


Yeah, I've never really understood the note taking thing. I'll be working on simple algorithm problems that require me to hold 3-4 elements in my mind and constantly have to mentally reference them over and over. "what was the value of x again?" — which distracts from solving the actual problem! Maybe the experience that others have is different.


One can use notetaking as extended working memory by visually cross-referencing facts back and forth from the same page. More like a logbook.


Although this could certainly be true, I would argue that one's critical thinking ability, in general, outweighs ones memory especially when it comes to solving new problems.


I find my long-term memory is limited when it comes to technical details. What has served me best is just storing a pointer in most cases and making sure I have access to the reference.

If it's been 6 weeks since I've worked on/with x and now I need to work with x again, what's important is that I have a process to reproduce x or build on x. I'd argue this is a better practice than trying to commit everything to memory because human memory is pretty corruptible. I also find this helps with complex problems because you don't have to deal with the devil upfront, you just have to be able to do some high-level fuzzing.

That being said, I think it's important to commit mistakes to memory because those are embarrassing to repeat.


I've been able to mitigate pretty much all the issues I've had with remembering details about complex problems by using effective note-taking and diagramming.


Good thing one of the first principles you learn is to break complex problems into smaller chunks, and then they become manageable pieces you are on your way to solving.

Beyond a basic ability to think logically and enjoying doing so, programming is 99% perspiration aka patience.


Memory? It depends, knowing technical knowledge by memory is useless since we could use google. However, if memory means EXPERIENCE then, its a different matter. A seasoned engineer costs a lot more for this reason.


Working memory is more about remembering what happened two minutes ago than retrieval of technical knowledge.


This article seems to limit itself to the "enterprise" definition of a great software engineer.

The greatest software engineers in small businesses (or personal projects) don't do much development work. Instead they are working as true engineers: making good compromises and solving problems outside of the software which usually leads them into roles that don't have "software" or "engineer" in the title.


So true. It is about solving problems with software, adding value to the project and just generally giving a crap about the work they do. The last is one of the hardest as so many people are what I refer to as "hack 'n slash" devs, with an attitude of "I just did what I was told....".


Here is why working on your programming pet projects shouldn't become a metric.

The Japanese bullet train was redesigned by observing how nature works: https://www.vox.com/videos/2017/11/9/16628106/biomimicry-des...

"A moment of inspiration from engineer and birdwatcher Eiji Nakatsu changed all that."

Nakatsu did not become a birdwatcher to become a great engineer. So if you want to become a great engineer you follow what you want to do with your free time.

Also, I think people put too much emphasis on the degree of technicality over humanism. A unethical technical genius is not a great software engineer because there is no art in the engineering work. Great architects, chefs, and musicians view their work as arts with thoughts.


I can see both of these statements being misinterpreted, and in opposite directions, so I will offer my commentary.

(1) Metrics. Metrics tend to destroy the sort of motivation that allows a "task to be done for its own sake", where you are capable of immersing yourself fully in the details of a situation without excluding any "secondary" information (with respect to the metric or super-goal). Mastery of a task comes in part from being familiar with the fullest extent of phenomena within a ___domain. Pleasure proxies mastery by creating immersion, and is common for a hobby.

A master physicist knows all of physics. A civil engineer knows enough to build bridges. Only one of these people I would trust to make be able to create a new method of building bridges that wasn't incremental, or was based on a novel theoretical insight.

[building bridges might not be the best example because it's an older ___domain with a lot of time to be refined]

(2) I don't see technicality as being the culprit so much as an overfocus on technology. The "art" comes from either the amount of /craft/ that is put into the use of the technology or the amount of /humanity/, that is, consideration and care for how the users will perceive and receive the technology in an interpersonal manner. You mention three domains where aesthetics count but I don't think a focus on the study of aesthetics is necessary for us to apply the concept of art. These things can be done on engineering's terms.


A good engineer solves problems in the most feasible and working way possible. If its fast, cheap and usable then its fine. A good software engineer solves problems by generating software. Its amazing the amount of self called software engineers that are unable to design from start to end a simple software. So, a good software engineer is mainly a PROGRAMMER.


Well obviously compiling a 10 page PDF, replete with references to 37 other sources, in order to establish the core 53 traits to identify the next great SWE is the simplest way to identify great engineers.

Just hand this doc over the HR and ask all hiring managers to memorize it.


I'm gonna go on a limb here, but I would say a great software engineer is someone that can block out email, slack, meetings, the huge noise of open offices and get some 'deep' work done.


I'm offended!


People skills. Empathy is hugely underrated and profoundly important. Whoever said "software is meant for other people to read, and only incidentally to be executed by machines" was on to something. All meaningful projects require cooperation and collaboration with other people. Most of the time, a solid coder with exceptional EQ will have more impact and effectiveness than an exceptional coder with indifferent (let alone subpar) people skills.


In small companies, a software engineer is a social job, it requires to talks with lot of people, specially with the customer (may be not all customers) but also, with others colleagues, with the people of infrastructure, sometime even with the people of finances (such as asking for a new server), with marketing or sales (if any), with design and so on.

In a big business, a software engineer is only a cogs that follows specific orders. I remember a blog of a former engineer of Microsoft that talked about it, he said that, in the past, Microsoft was direct, and having a technical meeting with Bill Gates was something usual. However, the company grow and those perks are long gone, now MS has a lot of bureaucracy and level and sub levels of complexity (so many executives and managers).


The ability to take a diverse sample from their interviewee pool and not just take the top 10 perfect looking resumes from recruiters for people they choose to spend time interviewing.

So many diamond-in-the-rough developers out there that would make good team members, but simply lack prestigious resumes or failed to put skill points in "Job Search" or attribute points in Charisma.


Homer doesn't spent time describing Helen in the Iliad. He knew one thing or two about describing an ideal I guess. Of course beauty is orders of magnitude harder to define. The baseline principle is the same though: The moment you restrain what a good engineer is/looks like your argument starts loosing ground.


This study seems to be asking, "What makes a great Microsoft software engineer," given their sample cohort.


Agreed. The paper treated having a Microsoft-only sample as being good since it's a "large sample size", but the skill set of an engineer can be perceived as good or bad at different sizes of companies, and not addressing that seems like a huge oversight.


Articles like this one never look from the side of the engineer and / or never consider his opportunity cost.

Why would anyone work for you on an engineer salary if they are "great" and have all the CEO skills. They shouldn't.

Selecting for passion is selecting for people, usually young who have no life outside work, don't know their real market value and have easy to abuse personality, will tolerate agile micromanagement etc etc. Women usually have more social skills, enough to know not to become software engineers in bigco.


At the end of the day this seems to me to be still anecdotal and not very testable. Would it be possible, given the code history of n number of developers + quality of the output code, to create a predictive model of a software engineer's 'greatness'? Seems daunting and fraught with potential problems but of a lot more value than just the typical platitudes; 'honesty, creativity, passion' (take three virtues, earthporn background etc)


youth, gullibility, and the desire to please


if you enjoy what you can do, only then you can master it. that would of been much simpler explenation ;D.... goes for all things too! And to be honest, 9 to 5 would make you a nice engineer. a lot of people like code, all day and night, but really, 8 hours of productive learning and coding each day is plenty to become very good at it...

I always reccomend anyone to learn whatever is below their current interest in the 'stack'. for example if you like to learn java code, learn what assembly code and perhaps even C code is, learn to implement oop systems in C or assembly and you will have a much finer understanding of why certain decisions are made in your platform, and what motivates these decisions oposed to others. for a web developer, learning what your browser is doing is very important, and to understand why certain things work that way in the end, you might want to learn about cpus, network hardware, assembly code and all that jazz. dig deeper and deeper for greater understanding. it might seem like a lot of work, but if you enjoy what you do, it's never to much and never to deep ;D


How can you even ask this question? Different teams have such different dynamics, such different ways of working: different tools; different practices: I would be exceedingly surprised to find any commonality whatsoever.

The discipline of software engineering is no undifferentiated mass: but a cultural kaleidoscope of different textures and colors; and a person who excels in one environment can easily tank in another.

For safety critical embedded code: a meticulous personality is essential; only someone who is a stickler for rules and processes will survive, let alone thrive. In a fast paced and creative environment, this person would be absolutely terrible!

The size of the organization is also a critical in determining who thrives and who does not. In a small team, being an independent self-starter and problem-solver is critical; whereas in a large team, that sort of independence will quickly get you into real trouble.

Different organizations have different values and assign different priorities to the various qualities and attributes of the product and the people who design it.

My advice: be as humble and as flexible as possible; do your best to fit into your team and your organization; but do not be afraid to recognize when you are bending yourself out of your comfort zone: Be prepared to move around a few times to find the organization and the team that fits you, too. There is no shame in this, and you will be happier in the long run.


Sorry folks, it's pretty much like high school out there. It doesn't matter what or who you know, it's the kind of person you are.


I believe this should have (2015) in the title.


Ny mom did!


I stopped reading at "59 engineers...at microsoft"


You make a great software engineer by practicing solving hard problems. There isn't any secret formula or mystique. It is thousands of hours spent solving problems of ever greater difficulty.

If you confine your practice to the 9 to 5 job then you are investing fewer hours than somebody who writes open source at night, and will likely be a weaker programmer. If you aren't independently finding new problems to solve then you will be a weaker programmer than somebody who is constantly stepping up their game. If you lack confidence and need frameworks, abstractions, and other bullshit to write a couple lines of code you will be a weaker programmer.

Simple. No magic.


> If you lack confidence and need frameworks, abstractions, and other bullshit to write a couple lines of code you will be a weaker programmer

So you like to reinvent everything? Do you reinvent HTML & CSS because they are FRAMEWORKS, one of the foundational frameworks of today's web.

If your job only ask you to fix a bug, there here is how to make yourself valuable AND technically challenging:

* go through the bugs and analyze if you can extract any correlations

* propose better process with other fellow engineers and product owners

* implement changes

For example, someone might be duplicating some code to write tests, how about you write a test harness or adopt some open-source harness? How about work with your fellow engineers to begin start collecting some metrics.

Otherwise, time to look for a new opportunity. The absolute worst kind of programmers are the ones who don't don't take care of their health.


Perhaps if you wrote software in addition to doing that which is strictly assigned to you your question would answer itself. This isn't rocket science.


But there is creativity. You don't have to go an extra mile though, but you can. My response is to this:

> If you aren't independently finding new problems to solve then you will be a weaker programmer than somebody who is constantly stepping up their game.


Write your shit in assembly then. Everything else is bound to be slower than assembly.

See, I can move goalposts too.


Whenever I mention competence is a direct correlation to quantity and quality of practice people cry and create bullshit excuses. :(


I think it might true that the guy "who writes open source at night" will generally be the better programmer, although it is not a necessary condition for being a good SE




Consider applying for YC's Summer 2025 batch! Applications are open till May 13

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: