I’ve worked with a lot of programmers over the years — some of them super amazing, and some distinctly lackluster. As I’ve had the pleasure of working with some very skilled individuals recently, I spent some time thinking about what I admire in them. What makes a good programmer so good, and a bad programmer so bad? Or, to mangle English a little bit, what makes a good programmer good?

Based on my experiences, being a great programmer has nothing to do with age, education, or how much money you make. It’s all in how you act and, more deeply, how you think. I’ve noticed a consistent set of habits in the programmers I admire. More than knowledge of their chosen language, deep understanding of data structures and algorithms, or even more than years of on-the-job experience — the way they communicate, the way they conduct themselves, and the way they approach programming speak volumes as to their amazing level of skill.

Certainly there’s more to being a good programmer than anyone can enumerate, and I wouldn’t judge any programmer solely based on the presence (or lack) of these practices. But I do know wisdom when I see it, and when I see a programmer expressing these traits, I think, “This person really knows what they’re doing.”

They do their research

Or “measure twice, cut once.” Or “Google it.”

Whatever you call it, most programming problems you’re likely to encounter have been solved in some form already — Ecclesiastes had it right in observing there was nothing new under the sun. In the form of libraries on GitHub, blog posts on the Internet, or just getting in touch with experienced individuals, good programmers know to do the research before they try to solve a problem.

I’ve seen even great programmers rush to solutions: but the worst programmers I’ve worked with never consult others, and as a result do huge amounts of duplicate work or tackle issues in precisely the wrong way. And unfortunately, they end up paying for their mistakes later.

They read error messages (and act on them)

This includes desymbolicating stack traces. Yes, it’s ugly and unfortunate — but if you’re not willing to do it how are you going to know what’s wrong? The most effective programmers I know aren’t afraid to dig deep into problems. The least effective see there was an error but don’t even bother reading the error message. (This sounds ridiculous but you’d be surprised how frequently I run into it.)

To take this a step further, great programmers see a problem and hunger to solve it. Reading error messages are for them just the beginning: they’re anxious to dive deep into the issue that it represents and figure out what’s going wrong. They’re not interested in passing responsibility, they’re interested in finding a solution. The buck really does stop with them.

They go to the source

Documentation, tests, people: these things lie. Not intentionally, but if you want to know exactly how something works, then you must view the source yourself.

Don’t be afraid if it’s not a language you’re super familiar with — if you’re primarily a Ruby programmer and you suspect there’s an error in one of Ruby’s C libraries, go crack it open and have a look. Yes, you might not get it. But who knows? You just might, and you stand a way better chance than if you didn’t try at all!

If you’re in a closed-source environment then this becomes a lot harder, unfortunately, but the principle still applies. Poor programmers have little interest in viewing source, and as a result problems flummox them much longer than those who are willing to do some research.

They just do it

Good programmers are driven to act. There’s a compulsion in them that can be difficult to control: they’re implementing a solution as soon as they identify a problem or see a new feature request, sometimes too early and sometimes too aggressively. But their instinctive response to a problem is to tackle it head-on.

This can be troublesome at times — but their enthusiasm is a crucial part of being good at what they do. While some might stonewall or wait for the problem to go away on its own, good programmers start solving.

To put it more simply (and, perhaps, too obviously): if you see someone excitedly grabbing problems and acting on them, chances are you have a good programmer on your hands.

They avoid crises

This is mostly a bad programmer trait: they tend to bounce from artificial crisis to artificial crisis, never really understanding one before they move to the next. They’ll assign blame to the wrong parts of their program and then spend hours debugging something that works perfectly well. They let their emotions get the better of them, trusting gut feelings rather than careful, explicit analysis.

If you hurry through a problem — or even view each problem as a world-shattering catastrophe — you’re more likely to make errors or not address the underlying issues. Great programmers take the time to understand what’s going wrong, even when there really is a catastrophe: but more than that, they treat regular problems as issues to be solved. Thus they solve more of them more accurately, and do so without raising the tension level of your organization.

They communicate well

Ultimately, programming is a form of communication. Being able to succinctly and eloquently express your thoughts is as crucial in writing code as it is in writing prose — and I’ve always found that those who can write a pithy email, elegant status report, or even just an effective memo will also be better programmers than those who cannot.

This applies to code in addition to English. It’s certainly possible to make a one-liner filled with parenthesis, brackets, and single-letter functions: but if no one understands it, what’s the point? Good programmers take the time to communicate their ideas properly in whatever medium they’re using.

They are passionate

I think this might be the most important aspect of a good programmer (and perhaps the part of this list most generally applicable to fields other than computer science).

If you truly care about what you’re doing — if it’s not just a job, but a hobby, an interest, even a fascination — then you have a major advantage over anyone else in your field. Great programmers are always programming. Their peers will clock out at eight hours a day: not out their job, but of their field in general. They don’t have programming side projects or much interest in contributing back to the community. They’re not constantly trying neat new methods and crazy programming languages just to see how they work.

When I see a programmer who’s doing their own hobby projects on the weekends, who’s involved in the creation of the tools that they use every day, who’s fascinated by the new and the interesting: that’s when I really know I’m looking at an amazing person. Ultimately great programmers view their profession not just as a means to make money, but as a means to make a difference. I think that’s what makes the best programmers who they are. Coding, to them, is a way of shaping the world. And that’s what I truly respect and admire.

Josh Symonds performs devops and server wrangling on cloud-scale infrastructures, deploys amazing web applications with Ruby on Rails, and creates awesome iOS apps with Objective-C and RubyMotion. He is founder and CTO of Symonds & Son, a development shop focused on quality and excellence.

What Makes a Good Programmer Good?的更多相关文章

  1. What technical details should a programmer of a web application consider before making the site public?

    What things should a programmer implementing the technical details of a web application consider bef ...

  2. 程序员能力矩阵 Programmer Competency Matrix

    [译文]程序员能力矩阵 Programmer Competency Matrix [译文]程序员能力矩阵 Programmer Competency Matrix 注意:每个层次的知识都是渐增的,位于 ...

  3. What every programmer should know about memory 笔记

    What every programmer should know about memory, Part 1(笔记) 每个程序员都应该了解的内存知识[第一部分] 2.商用硬件现状      现在硬件的 ...

  4. [转] Finding the Best Programmer's Font

    原文 Finding the Best Programmer's Font

  5. 10 Things Every Java Programmer Should Know about String

    String in Java is very special class and most frequently used class as well. There are lot many thin ...

  6. POJ - 1245 Programmer, Rank Thyself

    POJ - 1245 Programmer, Rank Thyself Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d  ...

  7. sof文件和NIOS II的软件(elf)合并为jic文件以使用Quartus Programmer烧写

    将Altera FPGA的sof文件和NIOS II的elf固件合并为一个jic文件以使用Quartus Programmer烧写   我们在学习和调试NIOS II工程的时候,一般都是先使用Quar ...

  8. Articles Every Programmer Must Read

    http://javarevisited.blogspot.sg/2014/05/10-articles-every-programmer-must-read.html Being a Java pr ...

  9. pic/at89c2051 programmer

    http://dangerousprototypes.com/forum/viewtopic.php?t=170 It looks like the PICKIT2 uses a small boos ...

  10. POJ 2970 The lazy programmer(优先队列+贪心)

    Language: Default The lazy programmer Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1 ...

随机推荐

  1. socat : Some useful commands

    http://technostuff.blogspot.com/2008/10/some-useful-socat-commands.html MONDAY, OCTOBER 6, 2008 Some ...

  2. Car immobilizer hacking

    Karsten Nohl <nohl@srlabs.de>

  3. mysql主从同步单个表实验记录

    问题的提出: 在CRM管理系统与运营基础数据平台之间需要有数据表进行交换,说是交换,其实是单向的,就是CRM里面的一些数据需要实时同步到运营基础数据平台中. 解决方案: A.采用时间戳的办法进行代码开 ...

  4. UML精粹学习 - 订单类结构图

    Order Class Diagram of Martin Fowler's UML Distilled

  5. windows 32位系统中进程最大可用内存空间为3GB (转)

    http://msdn.microsoft.com/zh-cn/library/ms189334.aspx 进程地址空间 所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 ...

  6. Android平台上长连接的实现

    Android 平台上长连接的实现 为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰. Android 上定时运行任务常用的方法有2种,一种方法用 Timer,另一种是 ...

  7. 【JavaScript】重温Javascript继承机制

    上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Ja ...

  8. getFields()和getDeclaredFields()

    getFields()获得某个类的所有的公共(public)的字段,包括父类. getDeclaredFields()获得某个类的所有申明的字段,即包括public.private和proteced, ...

  9. vs2012运行c语言出现:无法查找或打开 PDB 文件

    1.点 调试2.然后 选项和设置3.右边勾上 启用源服务器支持4.左边点 符号5.把微软符号服务器勾6.运行的时候等一下 莫慌!!7.问题解决

  10. careercup-高等难度 18.7

    18.7 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成. 解法: 原题 给定字符串,以及一个字典,判断字符串是否能够拆分为字段中的单词.例如,字段为{hell ...