是什么造就了一个优秀的程序员？
================================================================================
是什么造就了一个优秀的程序员？首先问问你自己吧，这会是个有趣的问题。它让你反思自己的软件开发技术。这个问题也适合问问你的同事们。它可以带来一些关于如何协同工作的有趣讨论。下面是我认为成为一个优秀程序员必备的五个重要技能。

### 1. 分解问题 ###

编程是为了解决问题，但在你开始写代码前，需要明白如何解决问题。优秀程序员的一项技能是把大的问题逐层分解成一个个更小的部分，直到每一部分都可以很容易解决。但找到解决问题的方式往往并没有那么简单。优秀程序员能找到方法去建立问题模型，这种方法使得输出结果的程序容易解释、实现和测试。

我写过的某些最复杂的程序在局部上都是难懂的，因为代码实现并不能很好地匹配这个问题，也就导致了编写的代码难以理解。当问题很好地建模的时候，我赞同伯尼·科赛尔所说的话（取自著名的[程序员在工作][1]中的访谈记录）：

> “……很少有本质上很难的程序。如果你盯着某一块代码，它看起来确实很难；如果你无法理解这段代码应该产生什么结果，这基本上就是暗示它很难被理解了。在这个时候，你不应该卷起袖子，尝试修复代码；你需要只是往回一步，再仔细考虑清楚。当你已经深思熟虑后，你会发现问题变得很简单”。 

### 2. 场景分析 ###

优秀开发者能考虑到如何使程序适合多种不同的场景。这项能力既适用于处理程序本身的逻辑，又适用于处理可能会发生的外部和内部事件。为了考虑逻辑上的不同思路，他们问自己这样的问题：如果这个参数为空会发生什么？如果所有条件都为假呢？这个方法在线程上是安全的吗？为了发现软件需要处理的各种类型的事件，他们问自己这样的问题：如果队列占满了会怎样？如果请求收不到响应会怎样？如果在这台服务器重启的同时另外一台服务器也重启了会怎样？

优秀程序员问他们自己：如何发现程序的缺陷？换句话说，他们有能力像测试人员一样思考。相反，缺少经验的程序员通常只考虑正确的路径——在一切都按照预期进行时正常的控制流（当然这也是程序在大部分时候的情况）。当然，异常不可避免要发生，所以需要程序能处理这些情况。

### 3. 命名 ###

编程由大量的命名对象组成：类、方法和变量。当编码完成得很好时，程序也具备了自我描述的能力，也就是说通过阅读源代码可以清楚地明白程序中函数的含义。自描述代码的一个好处就是很自然地产生许多更短的命名方法，而不是少数更长的方法，因为你有更多空间去放置有意义的名字（还有[其它原因][2]解释为什么短小方法更好）。

想出好的名字比它听起来更困难一些。我喜欢这段引用（来自菲尔·卡尔顿）：“在计算机科学领域只有两件困难的事情：缓存失效和命名对象。”命名在一定程度上很困难是因为你需要清楚地明白每一个名字究竟要代表什么。有时候命名不是一下子就清晰明了，只有随着软件开发进展才会慢慢显现。因此，重命名和命名一样重要。

命名对象也包含提出要用的概念和这些概念该如何称呼。通过深思熟虑，清楚命名所使用的惯用概念（在程序中和与程序员、非程序员讨论时使用），这使得编写程序变得更加容易。

### 4. 一致性 ### 

也许编程中最大的挑战是管理复杂性。保持一致性是处理复杂性的一种方法。它通过允许我们看到对象命名、使用和处理所采用的模式和推理来降低了某些复杂性。有了一致性，我们就无需用脑去记住异常和随机变量。取而代之，我们可以更关注[程序本身的复杂性，而不是偶然产生的复杂性][3]。

保持一致性从整体看来是很重要的。它应用在变量名字和分组、方法命名、模块划分、目录结构、GUI、错误处理、日志输出和文档等很多方面。比如，如果某些变量是的相关，并一起出现（在声明、方法调用或数据库中的列），而且总是以相同的顺序使用它们。那么当其中一个消失或者整体被打乱时，你就会很容易发现。对于一个操作，如果在一个地方叫delete，就不要在另一个地方叫remove：务必使用相同的名字。史蒂夫·麦克奈尔在[代码大全][4]中对于使用相反命名有相同的建议。比如，begin和end是相反的，就如同start和stop一样。当使用相反对时不要混用不同对的名字（比如使用begin和stop）。

当修改一段程序时可能会引入非一致性。粗心大意的程序员不会注意到他们添加的代码是否和已有的代码保持一致。优秀程序员会严苛地确保在这些看似很小的细节上都要做到精益求精。他们知道保持一致性对于在软件开发的整个过程中处理复杂性是多么的重要。

### 5. 学习能力 ###

作为一名软件开发者，你需要持续学习。在为软件添加一项新功能前，你必须明白为什么要这么做。在给一个已有程序添加代码前，你通常必须知道已有代码在做什么，以便合适地嵌入新功能。你还需要学习相关系统，以便正确地与它们交互。因此，快速学习的能力使你成为一名更加高效的开发者。

而且，因为软件工程领域的开发速度是如此的快速，所以新的编程语言、工具、技术和框架需要学习层出不穷。这是好还是坏，就看你怎么看。佛瑞德·布鲁克斯把学习能力列为[技能的快乐之一][5]，对此我深表赞同。学习新事物本身就是令人心满意足的，它也意味着开发者的生活从不无聊。

### 总结 ###

上面所有的技能都是通用的——它们中没有一项是针对某种语言、某个框架或某种技术。如果你拥有它们，你就能快速学习一门新的语言或工具，在新的环境下写出优秀的软件。而且，因为它们在本质上是通用的，所以不会在若干年以后过时。

是什么造就了一个优秀的程序员？以上便是我的观点。你认为造就一个优秀程序员的因素有哪些？在评论里告诉我吧。

--------------------------------------------------------------------------------

via: http://henrikwarne.com/2014/06/30/what-makes-a-good-programmer/

作者：[Henrik Warne][a]
译者：[KayGuoWhu](https://github.com/KayGuoWhu)
校对：[Caroline](https://github.com/carolinewuyan)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出

[a]:http://henrikwarne.com/about/
[1]:http://www.amazon.com/review/R2OV0TG7MJGXGL
[2]:http://henrikwarne.com/2013/08/31/7-ways-more-methods-can-improve-your-program/
[3]:http://faculty.salisbury.edu/~xswang/Research/Papers/SERelated/no-silver-bullet.pdf
[4]:http://www.amazon.com/review/R269BBARXH1V6R/
[5]:http://henrikwarne.com/2012/06/02/why-i-love-coding/



