我曾经和我认为优秀的程序员一起工作,但是他们是真正优秀的程序员吗?是什么让他们如此优秀?(或者,他们只是普通的程序员?)
最近读到Mark Pearl博客里一篇名为《Programming, a Subset of Writing》的文章,其中的观点让我十分推崇,尤其是下面这段:
优秀程序员和普通程序员最大的区别在于,优秀的程序员会使用整洁、易于理解的方式进行编程,任何不必要的复杂代码均不会出现。和我工作过的那些真正优秀的程序员总是尊学这样的编程步骤:写代码、重构、进一步重构。
就像日常生活技能一样,提高自己的办法唯有不断练习, 但是除了重构和进一步重构之外,你还能做些什么?
还有一种提升自我的方法,很简单,只需要对编程的其他重要要素保持开放的心态就好了。如单元测试、异常处理甚至交流技巧都非常重要。如果忽略或轻视这些因素也许会导致你过度自信,甚至成为一个自负的人。
我认为鼓吹“忽略实际情况,循规蹈矩地遵守软件开发实践就能成为一个优秀程序员”的说法非常荒谬。有时我会认为他们只是些 “自负的程序员”,虽然,老实说,他们中的一些人还是很优秀的。
我非常赞同我以前的同事 Russell Politzky 曾经说过的一句话:
那些自负的程序员往往是教条、狭隘和不切实际的。在我们的业务中,这会导致他们做出不合适的和有缺陷的设计。
如下是一些程序员经常挂在嘴边的话:
-
所有的测试必须是单元测试
-
要不惜代价达到100%的代码测试覆盖率
-
所有使用mocks/stubs的测试,必须基于mock库进行实现
-
不管业务目标是什么,所有的应用程序都必须建立在DDD模式之上
-
所有使用数据库的程序必须使用ORM来操作数据
-
不使用ORM是非常糟糕的,而且难于维护
-
代码注释不应该存在于代码中,因为存在注释表明代码不够清楚明了,不能直接表达其含义,应该总是使用代码来表达程序的含义而不是注释
-
任何一个你产出的文档,比如说设计文档,总是会过时的,用处很少
-
你唯一需要的文档就是代码
-
你唯一需要的模型也是代码
-
自顶向下的设计是不会成功的,这种尝试总会失败,拥护这种设计的人只是没找着门路,最终他们还是会折服于“演进式设计”所带来的优越性,没错,就是TDD
-
除了面向对象,你用别的编程范式根本写不出好的软件,因为只有OO能降低复杂度
你认识这类程序员吗?如果是,你认为他们的水平如何?经验表明这类极端的思维,既不是完全正确也不是完全错误,只是不合逻辑。
更加切实的考虑和合理的推理才能帮助你成为一名优秀的程序员。磨练技艺,增强技能固然很好,但是当我们在做这些事情的时候,应该从实际情况出发,认真考虑实施其所需的范围、成本、环境等各种因素。将这些合理的因素纳入考虑范畴需要成熟的思考,才能成为优秀的程序员。
当然,也需要大量的练习。