如何成为一个优秀的程序员?对你自己而言这是一个有趣的问题。它让你思考在软件开发中的技能。你也可以问下你同事这个问题。在你们一起工作的时候会产生一些有意思的讨论。要想成为一个优秀的程序员我认为要掌握以下5个核心技能。
1. 分解问题
程序是用来解决问题的。但在你编写任何代码之前,你需要理清楚如何解决这个问题。优秀的程序员有能力将这个问题拆分为一块块熟悉的部分,直到每部分可以被轻松的解决。但是仅仅只是找到解决这些问题的方法是不够的。一个好的程序员会找到一种方法来对问题进行建模,从而使程序易于得到结果、易于实现、易于测试的。
我工作过的一些最复杂的程序在某种程度上是复杂的,因为实现过程不太适合这个问题。这就导致代码难以理解。当问题被很好的模型化时,我同意 Bernie Cosell 的观点(在优秀的程序员访谈中):
“… 难懂的代码很少。如果你看到一段代码非常难——如果你不理解它要做什么——这可以表示它表达的不清楚。在这一点上,你不会卷起袖子试图修复这个代码;你要往后退一步并且再次考虑下。当你想的足够多时这就很简单”。
2. 场景分析
优秀的开发者会为程序考虑更多场景。这既适用于程序中的逻辑,也适用于可能发生的内部和外部事件。考虑到逻辑中的不同路线,他们可能会问这样的问题:如果这个参数为 null 会怎么样?如果条件都不为 true 会怎么样?这个方法是线程安全的吗?发生什么样类型的事件软件需要去处理?他们会问这样的问题:如果这个队列满了怎么办?如果这个请求没有响应会怎么样?当这个服务重启中其它服务重启会怎样?
优秀的程序员会问他们:这个可以中断吗?换句话说,他们有能力想测试人员一样思考。相比之下,没有经验的程序员大多只会考虑到“乐于看到的路线”—— 所有的事情都是期待的那样(大多数情况也确实如此)正常的控制流程。但是当然,不期待的不可避免会发生,这就需要程序员有能力去应对。
3. 命名
编程过程中很大程度上由命名组成:类,方法还有变量。当这些都做的足够好,程序本身就是个大型文档,意味着只要阅读源码函数本身就能清晰的知道了。代码自身文档化有一个影响就是自然会导致产生更多的小方法,而不是几个大方法,因为简单所以你有更多的位置来放置更多有意义的命名(还要很多其它理由能说明为什么小点的方法很好)。
要想出一个好的名称比说起来难多了。我喜欢这句话(来自 Phil Karlton):“对计算机科学来说只有两件难的事情:缓存失效和命名”。某种程度上来说命名是有难度的,因为他需要你对每个名称所代表的意义都足够清楚。有时不是立马就清晰明了的,仅仅是在开发过程中才逐渐清晰的。因此,重命名和命名一样的重要。
好的命名也包括传达出使用的意图,以及这些概念应该被称为什么。经过深思熟虑,一致使用明确的命名概念(在程序中,当程序员和非程序员讨论领域模型时),写程序就变的非常简单了。
4. 一致性
也许编程中最大的挑战是管理的复杂性。一致性是对抗复杂性的一种方法。允许我们通过查看模式来推断出是如何命名、使用和处理,来减少复杂性。在一致性中,我们不需要用脑力去记住那些特殊的随机的变量。相反,我们要关注的本质的复杂性而不是偶然的复杂性。
在任何事情上一致性都很重要。它适用于变量命名、组命名、方法命名,模块划分,目录结构,GUI,错误处理,日志,文档等等。例如,如果一些命令是有相关性的并一起出现(在声明中,方法调用或者数据库中的列)那么总司以相同的顺序使用他们。如果一个错误或者他们被混淆了很容易看的出来。在一次操作中,在一个地方叫 delete ,那么在其它地方就别叫 remove 了,继续使用相同的名称。Steve McConnell 在 Code Complete 中建议使用反义词。例如,begin/end 是一对反义词,start/stop 也是一对反义词。不要混用了不同的反义词(例如 begin/stop) 来处理。
当修改程序时会引入不一致性。粗心的程序员不注意他们添加的内容是否与现有代码一致,优秀的程序员会坚持不懈地确保看似很小的细节都恰到好处。他们知道在与复杂性的全面斗争中,一致性是多么重要。
5. 学习
作为一个软件开发者,你需要持续不断的学习。在添加一个新功能之前,你需要了解它应该做什么。在一个已有的程序中添加代码之前,你通常需要了解已存在的代码做了些什么,来更好的适应新功能。你还必须学习它周边的系统,为了更好的与他们进入。因此,快速的学习能力可以使你成为一个更有效率的开发者。
此外,因为软件工程领域开发速度非常快,新的语言、工具、技术和框架源源不断的需要我们去学习。你可以认为这是好的也可以是坏的。我很同意 Fred Brooks 将学习列为这门手艺的乐趣之一。学习新东西容易让自己满足,这也意味着一名开发人员的生活永远不会无聊。
结尾
以上所有技能都是通用的——它们没有特指某一门语言,框架或技术。如果你拥有这些,你可以快速学习一门新语言或工具,并且写出邮箱的软件。此外,因为它们本质上市通用的,所以他们不会在几年内过时。
这些是我对如何成为一个优秀的程序员的回答。你认为怎样能成为一个优秀的程序员?让我在评论区看看你的答案。