如何成为一名优秀的程序员?

如何成为一名优秀的程序员?这是个非常有趣的问题,尝试问一问你自己,或许它让你思考软件开发的技术。当然,对于你的同事来说这也是一个好问题。它可以让你们讨论一下你们该如何一起工作。要想成为一个优秀的程序员,我认为这五个技能非常重要。

  1. 问题分解

    编程是关于如何解决问题的。但是在你编写任何代码之前,你需要清楚的知道这个问题是如何解决的。优秀的程序员有把问题逐步分解成一个个很容易解决的小问题的能力。但是这不是随便说说就能做到的。一个优秀的程序员可以找到一个好的建模方式,编写出容易理解、易于实现和测试的程序。

    我遇到的最复杂的程序中,有一部分之所以复杂是因为它的实现部分没能准确的和要解决的问题对应起来,导致代码非常晦涩难懂。如果问题能够很好的建模,我非常赞同伯尼-科塞尔(Bernie Cosell)的观点(《 Coders at Work》里的评论):

    “…几乎没有本质上就很难的程序,如果你看到一段代码非常的难搞-你搞不懂这对代码到底在干吗-通常表明这段代码的解决思路思虑不周,在这个时候就不要卷起袖子奋笔疾码去修补这段代码了,你应该后退一步去重新思考这个问题。当你把问题梳理清楚的时候,你就可以很轻松的搞定它了。”

  2. 情景分析

    优秀的程序员有能力分析程序的多种应用场景,不仅仅是程序内的的逻辑,还有可能发生的内部外部事件。为了分析逻辑中的不同路径,他们通常考虑这样的问题:如果这个变量为null会发生什么情况?如果这个条件没有真值会怎样?这个方法是不是线程安全的? 为了找出软件需要解决什么类型的事件,他们会问像这样的问题:如果这个队列满了怎么办?要是这个请求没有响应该怎么办?假如这个服务正在重启的时候其他的服务要求重启怎么处理?

    优秀的程序员会反问自己:如果这里坏掉了会怎样?(原文:How can this break?)。换句话说,他们可以像测试人员一样思考。相比之下,没有经验的程序员大多只考虑“幸福之路”–一切控制流都按照预期正常工作(多数时候是这样的)。不过当然,如果发生不可避免的意外,程序是需要有能力应付这些问题的。

  3. 命名

    编程需要做大量规划命名的工作,包括各种类名,方法名称,变量名。如果这一点做的好话,程序在很大程度上会变成自文档化,就是说,你看代码就知道这个类是什么意思,这个方法是做什么的,这个变量是记录什么的。自文档化代码会有这样的一个效果,它会很自然的引导很多小的方法,而不是很少几个很大很长的方法,只是因为要给这段方法起一个有意义的名字放起来。(这里有一些其他为什么用小的方法更好的原因)。

    命名的东西还包括提出的概念,以及这些概念应该叫什么。经过深思熟虑之后,清晰明确的对这些概念进行命名,在项目(在程序内部,已经和程序员或者非程序员讨论该领域相关的问题)中统一使用这些名称会让程序写起来非常轻松。

  4. 一致性

    也许在编程中的最大挑战管理复杂性。一致性是应对复杂性的一种方式,它减少了一定的复杂性使我们看到的模式和推断事物是如何命名的,使用和处理。保持一致性,我们就不需要用脑力去记忆异常和随机变量,我们就可以专注于我们真正关心的复杂问题,而不是随机出现的复杂事物。

    在整个开发过程中,一致性是非常重要的。它被应用在变量名、组名、 方法名、 模块划分,目录结构,GUI,错误处理、 记录、 文件归档等。比如,如果某些一起出现的相关变量(在声明,方法调用或数据库中的列)它们总是应该以相同的顺序出现,这样一来如果有一部分少了或者乱掉了就很容易看出来。对于操作方法而言,如果有一个方法起初被称为delete,那么就不要在另外的地方叫它remove了-请保持一致。对于准确的使用反义词上面,史提夫·麦康奈尔在《代码大全》中有一些不错的建议。举个例子:开始/结束(begin/end)是对立统一的,正如启动/停止(start/stop),不要从不同的一对反义词里面凑出来一组对立名称,比如:启动/结束(start/end)

    不一致性会在修改程序时候产生。邋遢的程序不会去注意自己添加的代码是否符合原来的代码规范。优秀的程序员都不遗余力地确保看似小的细节都恰到好处,他们知道保持一致性在与复杂斗争的整个过程中是多么重要。

  5. 学习

    作为一个软件开发人员,你需要不断的学习。在你添加新功能之前,你必须名该它应该做什么。在你向现有的程序添加代码之前,通常你需要了解现有的代码,以确保新旧代码都可以正常工作。你也需要了解系统环境(surrounding system),以便与它们正确的对接。快速学习的能力,使你成为一个更高效的开发人员。

    此外,由于软件工程领域的发展速度是如此之快,还有源源不断出现的新语言、 工具、 技术和框架需要你去了解。你认为这是好也罢坏也行。弗莱德·布鲁克把学习视为技术的乐趣之一。当然,我很赞同他的说法。学习新的东西是一个自我满足的过程,那就意味着开发者的生活总是不会无聊。

结论

上面的这些所有技能都是通用的–没有说哪一条是针对哪门语言、哪种框架或者哪种技术才有效的。如果你有这样的能力,你可以很快的学习一门新的语言、工具,然后在那个环境中写出优秀的软件。此外,因为它们在本质上是通用的,所以他们不会在几年内就过时掉。

如何成为一个优秀的程序员?这就是我的答案。SO,你怎么看?

 

原文地址:http://henrikwarne.com/2014/06/30/what-makes-a-good-programmer/

发表评论

电子邮件地址不会被公开。 必填项已用*标注