Slashdot Mirror


Ask Slashdot: What Makes a Great Software Developer?

Nerval's Lobster writes: What does it take to become a great — or even just a good — software developer? According to developer Michael O. Church's posting on Quora (later posted on LifeHacker), it's a long list: great developers are unafraid to learn on the job, manage their careers aggressively, know the politics of software development (which he refers to as 'CS666'), avoid long days when feasible, and can tell fads from technologies that actually endure... and those are just a few of his points. Over at Salsita Software's corporate blog, meanwhile, CEO and founder Matthew Gertner boils it all down to a single point: experienced programmers and developers know when to slow down. What do you think separates the great developers from the not-so-fantastic ones?

42 of 214 comments (clear)

  1. Alternate Link by Anonymous Coward · · Score: 5, Insightful

    Here's an alternate link for the first article.

    Or better yet, skip it. Usual shitty dice.com summary article.

    The linked lifehacker article seems pretty good and I largely agree with it. Couldn't make it through the second one.

    Two things I would add from my personal arsenal:

    - Try to kick ass at least once a week. This sounds weird, but it's worked very well from me. In the perfect world we would kick ass every day, but I think realistically we (or at least I) would quickly burn out. So instead I try to just randomly pick a day where I come in with the mindset that I'm going to just fucking own whatever I'm working on. The day is random and sometimes I skip a week, but I usually manage, and while you would think inconsistent performance would stand out, I've found (at least where I work) that it doesn't, and people tend to remember the kick ass days rather than the average days.

    - Dive into the stuff that others avoid / are scared of / don't like doing for various reasons. I'm not saying take the shit jobs, but usually there are tasks programmers hate because they involve working with hardware, dealing with clients, travelling, or doing something out of their comfort zone. Become the <whatever> guy.

    1. Re:Alternate Link by barrywalker · · Score: 5, Interesting

      I've become the "goto" guy for a lot of stuff simply by being curious. I've had a significant hand in every single piece of our application and know it better than anybody else on the team. I volunteer for things that scare the shit out of most of our developers. All it takes is, "Huh. This is broken. I wonder how it works?" to become Mr. Indispensable.

    2. Re:Alternate Link by gfxguy · · Score: 4, Interesting

      That's what I would have added... curiosity. I think, like a lot engineers, the kind of people who took their parent's phones apart when they were kids to figure out how they worked... always playing the "what if" and "I wonder what would happen" games.

      --
      Stupid sexy Flanders.
    3. Re: Alternate Link by binarylarry · · Score: 4, Funny

      Not enough agile bro.

      Need to pick an hour everyday and kickass.

      --
      Mod me down, my New Earth Global Warmingist friends!
    4. Re:Alternate Link by Anonymous Coward · · Score: 2, Informative

      A good software developer is also someone who listens to user bugs reports and feature requests.

      Maybe this is true of some places, but everywhere I've worked has seen a huge separation between the developers and the end user. I think it's actually a major failing in a lot of big projects.

      A pretty common structure:

      - contracts people and requirements analysts work out a set of contractually binding requirements with the "client" (a group which is usually themselves abstracted from the people who will actually use the software).
      - designers build a design to meet those requirements, it's reviewed by "the client" (again, not Joe user, but some manager theoretically representing Joe users interests).
      - testers build tests to the design and the requirements, which our friend, quotey McClient approves.
      - software developers build to the design to pass the tests
      - testers test
      - client signs off on the software based on witnessing the tests they approved
      - client gets software, installs it (or it is installed for them)
      - users promptly go "what the actual fuck!" and try to deal with software that doesn't actually do what they need

    5. Re:Alternate Link by Anonymous Coward · · Score: 2, Funny

      >I've become the "goto" guy for a lot of stuff

      Is that a subtle way of saying your co-workers consider you harmful?

      (Sorry, just couldn't resist.)

    6. Re:Alternate Link by clockwise_music · · Score: 2

      I wrote a blog post on this a few years ago and I think it's still pretty relevant today:

      http://programmers.blogoverflo...

      I think the main thing that most people skip is how to work alongside other developers, and how to write maintainable code.

    7. Re:Alternate Link by tlhIngan · · Score: 2

      I absolutely agree that curiosity (along with a willingness to actually RTFM) go a long way to making one indispensable in a team. However, that brings its own risks with it: If you can't be replaced, you can't be promoted. How do you balance the benefits to your career (in terms of increased productivity, reputation etc) against the risks (stagnation, either because they can't manage without you, or because they realise how productive you are and aren't prepared to lose your utility)?

      Even the go-to guy can be promoted - he becomes the technical guru (sometimes referred to as system architect or system analyst, even).

      There are two career tracks, after all - you could go up through management, or the technical track. You may know the entire system, but as you go up, what you do is you teach - even I find my job consists less and less coding and more and more architecting, solving problems, and thinking, evaluating and reporting.

      Hell, by knowing the system you know you can make reasonable estimates - if someone says it's simple but you know it's a hairy mess, that makes your life so much easier.

      And anyhow, as you rise, there will be new know-it-alls as well and what makes you good is you all learn from each other (one of the biggest problems is ego, and learning to eat crow and to respect that someone may actually know more than you makes you even better still.

      Of course, there's also a laziness aspect - I hate writing pages of code if I can think about it a little more and turn out something more concise, so what little coding I do often starts with a lot of pre-planning to what I do write is simple and not complicated.

    8. Re:Alternate Link by fractoid · · Score: 2

      What is this "technical track" you speak of? The last company I worked for (I'm currently working on a startup) had a single tier of engineers, a couple of "tech lead" / "senior engineer" roles (only available if you outlasted the incumbent), and everyone above that level (and there were 3+ tiers of them) was a nontechnical manager. Which is part of why I no longer work there but that's another story.

      --
      Rampant carbon sequestration destroyed the Dinosaurs' tropical paradise. I'm here to help repair the damage.
  2. Beer by MarcNicholas · · Score: 4, Insightful

    Beer makes everything better ;)

    1. Re:Beer by rmdingler · · Score: 2
      While certainly, there exists the mythical Mallbeer peak,

      it is also relevant that drunk people believe they perform better on driving tests than they actually do.

      While sexy during the courtship ritual, blind confidence is something of a fickle mistress in many other applications.

      --
      Happiness in intelligent people is the rarest thing I know.

      Ernest Hemingway

  3. It depends by Tablizer · · Score: 5, Insightful

    The best "lone wolf" developers probably use something like Lisp and a high amount of math-like abstraction to crank out vast amounts of features in a short time.

    However, a good team programmer knows how OTHER typical programmers think and read code, and writes code that is easy for them to navigate, digest, and change. Team programming is more like authoring a good technical manual, not clever gee-whiz tricks.

    1. Re:It depends by phantomfive · · Score: 2

      People actually solve real-world problems, outside of academia, using LISP?

      Here's some.

      --
      "First they came for the slanderers and i said nothing."
    2. Re:It depends by epyT-R · · Score: 2

      If today's software is used as an example, it seems like most team programmers are chosen for their willingness not to to rock the boat (or management ego) first and programming skills last.

  4. Levels by phantomfive · · Score: 4, Interesting

    First level is to be able to get the computer to do what you want. If you can do that, you have a career as a programmer.

    Most people don't make it that far, so it's something. The next level is whether you can write readable code. A lot of programmers never learn to write readable code, but a good number of them do.

    The next step is writing flexible software. Some programmers stuff everything into design patterns and think they made it flexible, but they're wrong. Other programmers try to make everything generic thinking it's flexible, but they're wrong (also, their code is probably hard to read). But writing code where small changes take little effort, and bigger changes take more effort......that is a rare skill indeed.

    There are other ways of looking at it, but that's one way.

    --
    "First they came for the slanderers and i said nothing."
    1. Re:Levels by Anrego · · Score: 4, Interesting

      To be honest, I think a "team play" level is in there as well.

      Working on your own software pet project, working on an open source project with other developers, and working in a corporate software environment are very different experiences. The rock-star programmer cliche still exists, but I think your average run of the mill programmer's success is more determined by how well he plays with others and balances his relationship with management and other forces of evil.

      Also throw in a requirements level. A lot of people struggle with this early (and sometimes late) in their careers. It sounds simple, but figuring out what the customer wants (what they _actually_ want), and what you've agreed to provide, and what the program _actually_ needs to do (all three are often exclusive concepts) is a big deal. Sometimes the customer doesn't know what they want (but won't be happy until they get it). Sometimes the customer thinks they want the wrong thing, and won't be happy if you deliver it to them. Requirements analysis is a specialization all it's own, but speaking the language is a huge asset if you go into "big software" (aerospace, medical, defence, etc).

    2. Re:Levels by rwa2 · · Score: 4, Interesting

      Yeah, there's probably a matrix of skills and abilities, depending on how much collaboration you need to do with customers / suppliers / other developers.

      Great Coder: can make a computer do stuff. In code. No one else really cares how they do their thing. They just take a defined process and codify it to automate it or whatever.

      Great Programmer: can write programs, presumably that other people have to use. Hopefully you still have this programmer around if you need to fix their program.

      Great Software Developer: Now we're getting somewhere... they probably work together with other programmers as a team and start worrying about more of the stuff they learned in CS classes, like code reusability, refactoring, complexity, maybe some analysis of algorithms and pure math logic.

      Great Software Engineer: Maybe less of the pure math and algorithms on how to do tricky things in code, but more of the practical stuff like defining code standards, test harnesses, and social aspects of code maintenance, like the discipline of setting up and maintaining the process through peer reviews, continuous integration, etc.

      Great Software Architect: Solves problems before they occur by drawing pictures. But still gets blamed for all of the new problems anyway.

      A lot of greatness involves managing complexity and making things as simple as possible for other people to understand and maintain. But no simpler.

    3. Re:Levels by phantomfive · · Score: 4, Insightful

      I think you need to be a team player in order to write readable code. By definition, writing readable code means you are thinking about how other people will understand it.

      --
      "First they came for the slanderers and i said nothing."
    4. Re:Levels by phantomfive · · Score: 2

      Have you been reading the "Clean Code" book? lol (or rather, have your coworkers been reading it and berating you because of it).

      I like to divide code into two categories, code that 'does stuff' and 'glue code.' The goal is to minimize the glue code as much as possible, while still maintaining flexibility.

      If you follow the rule of the Linux kernel development, "Each function should do one thing and do it well," then your code will be a lot closer to flexible almost immediately, even without building a framework around it.

      --
      "First they came for the slanderers and i said nothing."
    5. Re:Levels by pak9rabid · · Score: 3, Insightful

      Or you yourself having to read it years later when you have zero memory of writing it ;)

    6. Re:Levels by DaChesserCat · · Score: 2

      Agreed. The most enlightening experience I ever had as a developer was to go back and maintain something I hadn't seen or touched, and no one else had touched, in three years.

      Who wrote this crap? Oh, I did. Was I ever that lame? Seriously? WTF does this code do? A one-line comment would've helped.

      Eagleson's Law definitely applies.

      Especially as you age. I'm pushing 50. I've become the king of docs, both in the code and on the wiki. Because I've learned that there's no guarantee that I'll remember how to do that obscure thing six months from now when I need it again. And if someone else benefits from my docs, that's just icing on the cake.

      --
      ... by the Dew of Mountains the thoughts acquire speed, the hands acquire shakes, the shakes become a warning
  5. Knowing you will make mistakes. by Bookwyrm · · Score: 3, Insightful

    It's not that great software developers never make mistakes, it's just that by knowing they can and will happen to anyone, they can try to catch them early.

    It's the people who think the code they write is flawless that tend to have the most problematic code.

  6. Great programmers are made not born by byteherder · · Score: 4, Insightful

    To be a great programmer (or even just a good one), you need to never stop learning. Always be learning something. Many times in my life I have learned something on my own, only to be able to apply is a totally different situation later in life.

    Great programmer are insanely curious. They want to know the how things work, why one solution is better than another, always improving. That is the key, always be improving your craft, and your knowledge.

  7. A great developer knows how shitty he is at coding by Anonymous Coward · · Score: 3, Insightful

    You WILL make mistakes and introduce bugs when coding. A great developer knows this.

    Ask anyone you think is a great developer, "What do you do to help prevent or detect the mistakes you make?"

  8. Crystal ball ? by alexhs · · Score: 2

    can tell fads from technologies that actually endure

    And are therefore defined in hindsight.

    Critical thinking, not buying anything some software vendor is willing to sell you, is one thing, and betting on the right horse every time is quite another.
    At some point, you can't miss the latter by being conservative and only adopting "new" technologies when they're already mature (now, if you had some sort of almanac...). Also to note, "better" does not always mean "successful".

    --
    I have discovered a truly marvelous proof of killer sig, which this margin is too narrow to contain.
  9. The most important prerequisite by Taco+Cowboy · · Score: 3, Insightful

    Whether or not it is called "Software Development" or "Software Engineering" or "Coding" or whatever the newest trendy iteration, they all boil down to identifying the need and/or problem and then SOLVE IT

    From the primitive but extra-ordinarily crucial computer systems that ran the Apollo space program to Lotus 1-2-3 to Linux, all they did was the same --- they identified what is needed and then providing solution to get the problems licked

    --
    Muchas Gracias, Señor Edward Snowden !
  10. Be a Good Listener by Khomar · · Score: 4, Insightful

    I think one of the most valuable abilities for a good programmer is to be a good listener. A big part of that is also being able to ask good questions. You need to be able to fully understand the problem to be able to develop the right solution -- remember, the solution that customer actually needs is not always the one they think they want. Also, being able to listen also means you will be better able to learn new skills.

    --

    I believe in de-evolution. God made the world perfect, man fell, and its been going downhill ever since!

  11. My opinion by dskoll · · Score: 4, Insightful

    I started a software company back in 1999; we're still around and up to 10 employees, so I have had some moderate success in the software business.

    I think the LifeHacker link makes a lot of good points. I especially agree with limiting overtime. I *never* ask my developers to work overtime. Just never. Because I don't set release dates. When someone asks when the next release will be, I say "when it's ready" and I mean it. It's far more important to get it right than to get it out "on time", whatever that is.

    I would add that to be a great software developer, you need a lot of discipline. You need to write your unit and regression tests even if you don't feel like it and even if you'd rather be moving on to the next cool feature. You need to write your documentation clearly and comprehensively. You need to have your code reviewed; even the best programmer can benefit from suggestions that improve code clarity.

    You need to listen to your customers. You can write the greatest software in the world, but if it doesn't do what your clients want, that's not much use. But you also need to have enough judgement to know when your customers are asking for something ridiculous and you need to have the communication skills necessary to explain to them why what they think they want isn't what they really want.

    You also have to be passionate. If you went into computer science because you thought you'd get a secure job, but never particularly liked computers and didn't do programming on your own time, forget it... you won't be a great software developer.

  12. You'd need a lot more beer ! by Taco+Cowboy · · Score: 2

    Beer and lots of offshore help! :)

    The more you rely on offshore help to solve the problems on hand the more beer you gonna find yourself gulping down

    Trust me on that !

    --
    Muchas Gracias, Señor Edward Snowden !
  13. Eisenhower said it by circletimessquare · · Score: 3, Interesting

    I tell this story to illustrate the truth of the statement I heard long ago in the Army: Plans are worthless, but planning is everything. There is a very great distinction because when you are planning for an emergency you must start with this one thing: the very definition of "emergency" is that it is unexpected, therefore it is not going to happen the way you are planning.

    there's nothing like a real life emergency in programming but business culture is "get this done yesterday." no one can do that. but some programmers are very fragile and can only function according to one set of requirements/ work environment/ speed, and if you mess with that they get angry/ stressed/ tune out/ burnt out. while the "rock stars" can react to sudden and dramatic changes of requirement and need and crank out the changes relatively adroitly (not necessarily quickly). a sort of suppleness of mind and eerie lack of stress that's more about personality than training. and i say personality, and not training, because their code is a reflection of their personality: you can throw a curve ball at it from any direction and it can adapt without falling to pieces when "little" things (it's never little) change

    your code is a reflection of how your mind works. which is your personality. and certain chilly stress proof people can generate flexible durable code that is almost like the redundancy and flexibility of logistics in war

    --
    intellectual property law is philosophically incoherent. it is your moral duty to ignore it or sabotage it
    1. Re:Eisenhower said it by circletimessquare · · Score: 2

      well yeah, by definition a rock star is very rare

      so if you want a rockstar working for you, you better be ready to shell out big money or provide truly extraordinary perks

      you can't just expect or demand rock star status from average or even above average programmers. you can't mold people's personalities like their technical proficiency. i suppose there does exist stress mitigating strategies someone can consciously adapt. but from the rock star i met, it is a sort of chilly immunity to even the concept of stress that is quite awesome to behold

      that's why i quoted eisenhower

      because when i met such a person, i immediately thought of someone functioning under the stresses of extreme combat. i thought of this person on the eastern front in wwii. what it would take to survive *real* stress, because stress in programming, while real, taken in perspective to something like fields of combat, is a joke

      i always wondered if this person had indeed been in such an extreme stressful environment, like war. a sort of "once i've seen that, none of this shit impresses me." because indeed, nothing seemed to impress him. you could scream in his face and he would react the same as if you were casually discussing gardening. nothing phased the dude

      --
      intellectual property law is philosophically incoherent. it is your moral duty to ignore it or sabotage it
  14. Software Design by Codeyman · · Score: 2

    To be a great software developer, you need to write great software. Any great software requires a lot more forethought than just coding.
    Upfront design is the key to flexible and maintainable software. Peer reviewed, simplified, unoptimized design gives you a great base to start writing great code. It is akin to listening to a shakespeare play before writing one (as opposed to just winging it as you move along) .

  15. Re:Difficult to answer by beelsebob · · Score: 4, Insightful

    Hint - if you think that you're the best coder in the world, and that everyone around you is only outputting a bunch of shitty buggy crap, it's probably time for you to do a bunch of introspection.

    It's a well known phenomenon that experts will tend to play down how good they are (because they realise what they don't know), while non-experts will tend to play up how good they are. The fact that you're claiming to be god's gift to man kind, and that everyone else seems to be doing something different is a good indication that you may well be in the latter category.

    Don't get me wrong - you may actually be god's gift to man kind, and/or you may be amongst a bunch of incompetent monkeys, but that's not the likely scenario.

  16. Re:A great developer knows how shitty he is at cod by beelsebob · · Score: 3, Insightful

    Yep, I've never met a really good programmer who didn't use every tool he could exploit to find his bugs. Every one of them that I ever met had a strong leaning towards strongly typed languages, because they could exploit the type checker to find their bugs. They had a strong leaning towards testing, because they could exploit it to find their bugs. They had a strong leaning towards running profiling tools for memory, leaks, performance etc because they could exploit them to show were their code was really bad.

    As far as I'm concerned - lesson 1 is to use every tool you possibly can to prop yourself up - get the computer to make you into a good programmer.

  17. From my perspective... by Anonymous Coward · · Score: 2, Funny

    ...Great programmers:

    1) Provide reliable estimates that aren't inflated.
    2) Meet aggressive deadlines, even when unplanned work was added to the project during development.
    3) Take responsibility for their bugs and get them fixed, on deadline.
    4) Don't take time off during crunch time.
    5) Are willing to help when called to troubleshoot a surprising client issue on a weekend.
    6) Are humble enough to be content with an average salary, rather than always demanding raises to be paid at the top of the industry.

    1. Re:From my perspective... by Anonymous Coward · · Score: 2, Insightful

      Average salary? A Great programmer should expect great money.

      What you've described is a chump who throws away his talents and time so that other people can make the good money. Screw that.

    2. Re:From my perspective... by uncqual · · Score: 2

      He's obviously a PHB.

      --
      Why is there an "insightful" mod and why isn't it "-1"? If I wanted insight, I wouldn't be reading /.
    3. Re:From my perspective... by Anonymous Coward · · Score: 4, Insightful

      I really hope this is sarcasm. You just described everything that causes projects to fail, take on lots of technical debt, cause burnout, and generally make people leave the industry. After working in many countries, I've also noticed that this is especially an American thing, like a badge of honor. You are a programmer, not a Marine.

    4. Re:From my perspective... by RuffMasterD · · Score: 2

      Sounds like my boss :-)

      I should add:
      7) Is obiedient, listens, and doesn't talk back.
      8) Stays technically current, but not on company time.
      9) Gives their manager credit for good results. If the manager gets promoted, they will want you right behind them, making them look good.

      --
      Human Rights, Article 12: Freedom from Interference with Privacy, Family, Home and Correspondence
  18. You need to care (among other things)... by m2pc · · Score: 2

    IMHO, a good developer needa to CARE about what he/she is writing. Here are some points I've gathered from two decades of development work:

    Care about the code
    The quality of the code, efficiency, consistency are all key. Internal documentation is very important. Even if you don't think anyone will *ever* look at that code again, guess again. Someone will probably end up going back over it in the future to fix a bug or add a feature -- often times that is YOU, the one who wrote it. So leave enough comments behind to tell the next guy (or you when you've long forgotten that code) what in the world you were thinking. I've known way too many developers that simply say "yes sir" to their boss and crank out the code as fast as possible. They don't bother to think for themselves things like "what would the customer want" or "how can I design this to be as efficient as possible but still be understandable"? People who view development as simply a "day job" and don't take pride in their work end up causing themselves and others pain down the road. Being a developer should be more than simply writing code that works. You should care enough to write code that works and is elegant.

    Care about the end user
    Whether your code is a script that nobody will ever see, or a GUI application that people will use daily, a good developer puts themselves in the customer's perspective. They care about efficiency. They care about how the people who will use their software on a daily basis will perceive it, and how it will impact their workflow. Try to imagine how shaving even a few seconds off a process that someone does many times a day could add up over the years. With the power of modern computing, it's all too easy to become lazy as a developer and not put much thought into scalability, or to write sloppy code that doesn't make good use of resources.

    Care about robustness and security
    Writing good code also involves covering yourself in terms of error trapping. Make sure your code can (attempt to at least) fail gracefully when the unexpected occurs. Also, make sure you always code with a view to security. Way too much software is written in such a way where security and error trapping is put off until later. All too many times, due to time constraints or simply forgetting, these tasks never get done, and as a result insecure, buggy software is released.

    Don't be afraid to start over
    Good developers also aren't afraid to refactor their code. Sometimes it takes finishing a good chunk of code and analyzing how it performs in the real world to realize you did it all wrong and you need to rip it up and redo it. That's OK. Try to learn from it and do it less as you mature as a developer.

    Memorize the headers and APIs you use most
    Try to memorize headers and such of key APIs and libraries you use often. Personally, I find it all to easy just to keep looking up that function over and over whenever I need to use it. But if you trust yourself and memorize the documentation, then you can code more efficiently with less interruptions from having to go and look up that function call every time.

    Keep it simple
    It's easy for a developer to code "the kitchen sink" and bombard the user with a million options and settings. Yes, the program can do everything someone could possibly want, but overwhelming and confusing the end user is never a good idea. It's much better to think things through carefully and build only what is necessary, or if all the options must exist, build it in layers so the most important options are visible first, then the advanced users can dig in and configure to their heart's content.

  19. Re:A great developer knows how shitty he is at cod by Marginal+Coward · · Score: 2

    Yep, I've never met a really good programmer who didn't use every tool he could exploit to find his bugs.

    Good point. In that vein, the best programmer I ever worked with once said he had an "anti-fetish" for bugs. I think that at least partly explained the extremely high quality of his work.

    For most of us, though, finding and fixing bugs is a chore that we'd rather avoid because writing code (and therefore more bugs) is more fun. I try to emulate the anti-fetish mentality of my friend, but that remains something that I sometimes have to discipline myself to do rather than something that comes naturally.

  20. It takes two things by mark-t · · Score: 2

    1. Skill

    2. Passion.