一个优秀的程序员是如何炼成的

作者: Transnet2014 | 来源:发表于2014-07-17 17:23 被阅读2053次

一个优秀的程序员是如何炼成的?问一下自己这个问题会很有意思。这能让你好好思考一下软件开发的过程。拿它来问一下同事也不错,这能引起一些关于如何一起协作的很有意思的讨论。下面是我认为成为一名优秀的程序员所必需的5个技能。

问题分解

编程讲的是如何解决问题。但在你开始写代码之前,你需要清楚如何解决问题。一个好的程序员应该拥有这样的技能,他能将问题分解成子问题,直到每个子问题都可以很轻松地进行解决。不过要找到一个解决问题的方式可不是件简单的事。好的程序员能够很好的对问题进行建模,这样写出来的程序很容易能看懂,很容易实现及测试。

我所见识过的一些复杂的程序,它们之所以这么复杂,部分原因是由于它的实现并不适合对应的问题。这导致代码很难理解。我很同意Bernie Cosell关于问题建模方面的看法:

“很少有程序天生就是复杂的。如果你看到一段非常晦涩的代码——你无法理解它到底要做什么——这通常就意味着它的实现非常糟糕。这个时候不要撸起衣袖就开始修改代码,而是应该退一步,好好地重新思考一下 。当你把整个问题都想透了,你会发现问题其实很简单。“

场景分析

好的开发人员应当能够考虑到程序的不同场景。这不仅是指程序的逻辑,同样还有的是可能会发生的内外部的事件。要想考虑到业务逻辑的不同路径,你可能会提出这样的问题:如果这个参数为空的话会怎样?如果这些条件都不为真的话呢 ?这个方法是线程安全的吗?为了弄清楚程序到底需要解决哪类的问题,你可能会问自己:如果队列为空的话怎么办?或者这个请求没有响应?如果这个服务器重启的时候,别的服务器也在重启该怎么办?

好的程序员应该会问自己:什么情况下它会出现问题?也就是说,他们能够像测试人员一样看待问题。反过来 ,没有经验的程序员通常只考虑程序主逻辑——也就是当所有事情都如预期时的正常的控制流程。不过一旦发生了异常情况,程序必须得能够应对它。

命名

程序编写涉及到许多命名的问题:类,方法以及变量。如果做得好的话,程序应当是自文档型的,也就是说通过读源码就能很清晰地理解程序的意图。自文档型代码的一个结果就是方法通常会更短,而不是使用很长的方法,这是因为小的方法,你才可以有更多的地方来赋予一些有意义的名字。

好的名字可比想像中的要困难得多。我喜欢Phil Karlton说的这段话:”计算机科学里只有两件难事:缓存失效以及命名“。命名之所以这么难是由于你得清楚每个名字都代表着什么。有的时候事情并不会那么明朗 ,只有开发到达一定程度的时候才会清楚。也就是说,重命名和命名一样非常重要。

好的命名同样也包括你所提出的概念以及这些概念到底叫什么。如果仔细地思考过这点的话,不同名字的概念应当是始终一致的(在程序中,不管是和程序员还是非程序员讨论业务领域时都用的是相同的概念),这样写程序就会非常容易。

一致性

或许写程序里面最大的挑战就是管理的复杂性了。一致性是对抗复杂性的一种方式。它让我们看到了问题的固有模式,让我们可以推论出东西该如何命名,使用以及处理,这在一定程度上减少了复杂性。达到一致性之后, 我们不用再费精力去记住异常情况以及随机的变动。我们可以聚焦于问题的本质复杂度,而不是偶然复杂度。

一致性是非常重要的。它包括变量名及分组,方法命名,模块的划分,目录结构,GUI,错误处理,日志,文档,等等。比如说,如果有一些变量是关联的并且出现在一起,那么就应当始终按照同样的顺序来使用它们。这样的话,如果漏掉了一个或者将它们搞混了就能够很容易发现。对于某个操作而言,如果它在某个地方是叫做delete,那么就不要在另一个地方把它称为remove——要坚持使用同样的名字。 Steve McConnell在代码大全中关于准确地使用反义词有一些不错的建议。比如说,begin和end是反义词,同样的还有start和stop。不要混合不同分组的词语(比如begin和stop)

修改程序可能会导致不一致。草率的程序员是不会注意到他们添加的代码是不是与现有的代码一致的。好的程序员会确保每一个细节都是正确的。他们知道一致性对于减少复杂性有多么重要。

学习

作为一名软件开发人员,你需要不停地学习。在增加一个新特性之前,你必须知道它是要做什么。在往一个现有的程序中增加代码之前,你通常都要学习现有的代码是做什么的,这样才能正确地实现新功能。你还得了解周边的系统 ,这样才能正确地和它们进行交互。快速的学习能力可以让你成为一名高效的开发人员。

更有甚者,由于软件工程领域的发展速度实在是太快了,会不断地涌现出许多 新的语言,工具,技术以及框架。这是把双刃剑。Fred Brooks把学习看作是一种娱乐。学习新东西,乐在其中矣。这也意味着程序员的生活永远不会枯燥。

结论

上面讲的都是一些比较通用的技能——它们并不特定于某个语言,框架或者技术。如果你具备了这些技能,你可以快速地学习一门新语言或者一个新工具,并用它们编写出优秀的软件。更重要的是,由于它们具备通用性的本质,即使多年过后也仍不会过时。

相关文章

网友评论

  • 1840bf15fe0d:我们公司核心技术员工都是35左右,单纯的按计划码代码的(cv战士)基本25左右,年轻一点的无法独当一面,解决实际问题能力欠缺,执行能力还行。
    Transnet2014:@你个叛徒 公司福利很不错了。不过写代码就像练毛笔字,临摹是最好的练习。自成一体的时候就能独当一面了。
  • Transnet2014: @truelie 思路很好,欢迎来稿分享
  • truelie:做产品也一样:碰到问题要先分析,分解问题,深挖本质需求;
    从用户场景出发,避免单线程设计,要穷尽异常情况;
    一致性是解决复杂性很好的原则,在产品设计上也是良好用户体验的基础,降低用户的学习成本;
    有目的的学习,带着问题学习,思考中进步;
    向程序猿致敬。
  • 9bb0d9d61795:对原文引用的链接哪去了
  • Transnet2014:多谢各位捧场,关于技术问题,基本就是兴趣了,不必作为职业,甚至于谈到规划。有兴趣做,可以一直做,作的很牛,没有兴趣,还是转行做其他的吧。PS,这篇文章来自于java驿站,觉得不错,拿过来跟大家做个分享。还望作者见谅。
  • 挂瓜:@yangguang1029 而且最后,为什么非要提大公司。我在大公司待了近2年,而且有一帮“大公司”出来的朋友。包括盛大、网易、阿里、腾讯、金山这些。在大公司,头脑就被腐蚀了。而且中国式的官僚,让众多人失望。

    有能力自己干,有兄弟们自己合伙开公司。非要在大公司里面待到老吗?自己开公司,自己就是公司的管理+码农。不依赖别人,自己做自己的!你从没想到过自己开公司吗?
  • 挂瓜:@yangguang1029 国内很多人,都不需要去走管理路线了。你所谓的“管理路线”是7、8年那帮人的老生常谈,他们没有接触过更多的技术。所以他们的大脑在僵化。现在我也33了,思维活跃的和年轻人一样。有年轻的心态才有年轻的力量。

    而且别给我说拖家带口。多少程序猿离婚的,没有老婆的。我周围很多,不拖家带口不行吗?为什么非要给自己弄个包袱拖着?
  • 挂瓜:@yangguang1029 为什么要“拖家带口”?不结婚行不行?为什么要“学习能力”不如年轻人?你看到的,并不代表别人做不到。你的前置条件,可以有考虑的余地。既然别人做不到,我为什么就努力去做到?

    至少我知道,云风他们的简阅,云风是国内数得上的技术最牛的。你认可否?
  • 44e5ca6e0f51:你见过哪个CTO是公司技术最牛的?
  • yangguang1029:@挂瓜 呵呵,你见过哪个CTO是公司技术最牛的?哪个项目总监是技术最牛的?你技术再牛也要在人手底下干活,你要那么好技术做什么?等你30多拖家带口的,又不能加班学习能力也不如年轻人,不转管理你还有多大竞争力跟年轻力壮思维活跃的年轻码农竞争? 这就是我说的国内环境,大多国内IT企业都重效率而不重培养,只要能把活干完,随便怎么搞,用不着多优美,不至于一天崩10次就行。当然我这么说有点绝对,但是我说的却是事实,国外的码农也许还可以geek点。
  • 挂瓜:@yangguang1029 所以你这是在胡扯。因为国内的环境就“没必要”?是因为你没努力过。
  • 逸之:@yangguang1029 我们教研室的一个boss四十多岁了,代码都是他写的 :sweat_smile:
  • Tikitoo:Java 驿站
  • 89d61157aa44:始终认为,拥有持续学习的热情和能力实在厉害。
  • 952def166162:@yangguang1029 :sweat: 大部分的确如此
  • yangguang1029:国内的环境,你没必要成为多优秀的程序员,反正30岁以后你就得往管理方向转。

本文标题:一个优秀的程序员是如何炼成的

本文链接:https://www.haomeiwen.com/subject/irrstttx.html