锁定老帖子 主题:借花献佛——也写给我的团队(一)代码篇
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-24
看了neora的大作写给我的团队 ,颇受启发,在这里我借花献佛,也写一些短文给团队的新老成员做些总结。照搬的地方neora老大表骂我
<!----><!----> 各位尊敬的同事 你们好!我知道大家都很忙,忙的连写注释和文档的时间都没有,更不要说做总结了。所以我就写一些短文,帮助大家总结一下。正如大家所知道的,我们的团队每天所面对的问题有很多——需求、测试、编码、变更、架构 …… ,好吧,就让我们从编码开始吧。 为什么要编码?软件就是把人们的需要转化为计算机可以执行的程序。 这一点毫无疑问,但是这就是我们编码的目的吗?我们都知道,计算机其实很笨,它只能认识 0 和 1 这两个数字,无论多么复杂的程序都是由这两个最简单的数字构成。这正如哥德巴赫猜想,作为最复杂的数学证明题,要求解决的却是最简单的 1+1 问题。也就是说,最直接的编程就是向计算机输入 0 或者 1 ,为什么我们不这样呢? 原因当然很简单,因为 0 和 1 组成的机器语言实在是太难以理解和记忆了。于是前辈们就发明了汇编语言,汇编语言用单词代替了机器语言,它能够让人们更加容易理解代码和程序。可是前辈们又发现汇编语言还是太晦涩难懂,几百行代码已经让人云山雾罩,遇到几万行的大型程序,那简直就是天书了。所以先行者们又发明了高级语言,高级语言用接近自然语言的方式来编写程序,就象自然语言一样,它(们)成为了程序员阐明观点交流思想的通用工具。 所以,我们编写代码的目的就是为了交流和沟通,而这,也正是计算机语言存在的意义。 考虑别人既然编写代码的目的是为了沟通,那么作为一个程序员有什么理由去写那些只有自己才能够看懂的代码呢。如果吧这个作为一个问题问大家,恐怕没有一个人会这样回答:“编写只有自己能看懂的代码,让别人去猜吧!”。因为大家都希望合作,都愿意与其他人沟通,这不仅仅是工作的需要也是人类的基本需要之一。 可是,并不是每一个程序员都懂得沟通的艺术。几年前,我认识了一个很有天分的程序员,他的编程能力让人吃惊。但是,当他把一个命名为“ tj ”的函数交给我的时候,我只有无语了——“统计?”“添加?”,反复猜测不得要领之后,我只好让他重写这个函数。这样的例子还有很多,几乎每一个新手都出现过这样问题,即使他们对所使用的编程语言掌握的无比纯熟。 那么怎样才能编写一份能够阅读并易于理解的代码呢?下面我给出一些建议,其中的一些已经作为我们团队《编程规范》的一部分而被大家了解了,而另一些则不然。 <!----><!----><!----> ● <!---->时刻考虑你所编写的每一行代码、代码中的每一个单词都会在将来某个时候被你的伙伴们阅读、测试和维护。这是一个原则,也是一个前提,是每一个程序员所必须具备的基本素质。在一个团队中,编写可以阅读和维护的代码是团队合作的前提条件。 <!----><!----><!----> <!---->● <!---->必须认真的慎重的为你的变量、函数(方法)、类命名。要起一个科学合理的名字,因为名字是理解代码的重要依据。同时,一旦代码发布,其依赖者、继承者都要永远维持这种命名。想像一下,如果你和你的同事不得不使用类似“ tj ”这样的名字,而又不能改变现状(会影响其他使用者),那该是一件多么痛苦的事情。 <!----><!----><!----> ● 为你的代码编写注释。注释是代码的重要组成部分,同时也是别人理解你代码的重要依据,无论任务多么繁重,时间多么紧张,都应该象对待代码一样对待你的注释。哦,还有,最重要的是维护你的代码的同时要维护注释,就像下面一条所说的: <!----><!----><!----> ● 请确保注释是有效的。无效的,甚至是错误的注释还不如不写注释,这是显而易见的。注释应该言简意赅,不要用注释重复你的代码,也不要用注释阐述代码中显而易见的逻辑。请原谅我的啰嗦——在维护代码的同时不要忘记维护注释。 <!----><!----><!----> <!---->● <!---->空行、空格也是代码。空行是一个逻辑段起止的标志,它和编程者的思路是一致的。另外,适当的使用空行和空格可以使你的代码更加清晰。 <!----><!----><!----> <!---->● <!---->不要耍小聪明。只要有可能,请尽量使用平实的思路来规划你的代码。我们都知道,阅读别人的代码往往比自己编写同样功能的代码要困难,因为阅读代码的过程就是读懂对方思想的过程。困难的原因之一是作者的水平比读者要高——这当然是读者所欢迎的;但是,也可能是因为作者使用了晦涩难懂的思路和技巧,这些技巧五花八门无法列举,下面是常见的几种情况: <!---->1)
<!---->过度的使用了设计模式。
<!---->2)
<!---->拼凑结果。
<!---->3)
<!---->过度封装。
<!---->4)
<!---->拒绝使用成熟的第三方类库。
<!---->5)
<!---->冒然采用新的技术。
消除重复如果说软件目的就是将需求转换为程序,那么软件的本质就是复用。复用是一个非常宽泛概念,微软将 Windows 操作系统刻录成光盘出售,用户买到的都是同样的程序,这就是复用;我们使用 163 或者 google 的 Email 服务,访问同样的 Web 网站,这,也是复用。一个程序、一个 URL 、一个架构、一个类、一个方法都可以成为复用的对象。这里,我们只讨论代码的复用。 <!----><!----><!----> ●
仅在需要的时候使用接口。
<!---->1)
<!---->两个并行开发的模块(或类、子系统),互相存在依赖关系。
<!---->2)
<!---->对于结构复杂的或提供公共服务的模块。
<!---->3)
<!---->当模块的可变性是可以预见的时候。
<!---->4) <!---->在某些大型项目中,不同的模块可能需要不同的团队甚至不同公司进行开发。这个时候需要使用接口来规范双方之间的通信。
<!----><!----><!---->
<!---->●
用抽象类实现公用的代码。
<!----><!----><!----> <!---->● 在复杂的模块中使用设计模式。 <!----><!----><!----> <!---->●
适量的使用条件分支判断。
<!---->1) <!---->一组条件分支只判断一类条件。多种条件混合在一组分支中只能说明编程者的思维混乱。 <!---->2) <!---->分支要尽可能少,不要超过 8 个。 <!---->3) <!---->每个分支的代码在 3 行以内。 <!---->4) <!---->每个分支都有注释。 <!---->5) <!---->最后一个分支用于判断缺省情况。 <!---->6) <!---->如果上述 5 条不能同时满足,请休息片刻,然后重构你的代码。 <!----><!----><!----> ●
不要
Copy-Paste
你的代码。
源代码就是文档我们为什么写设计文档呢?设计文档可以说明你的代码,阐明设计思路,文档是我们沟通的重要工具,它可以使软件具有可持续发展性。这里我只想说说详细设计文档。 几年 前,我一直有一些疑问,什么是概要设计和详细设计?怎样才算“概要”?怎样才算“详细”?详细到什么程度才算合格? 现在我已经明白了,所谓概要设计就是架构设计,架构就是将一个软件中功能性的东西剔除之后剩下的部分。这一部分是软件的结构,它说明了软件中最为重要的特性和这些特性的实现方式。 那么详细设计呢?我曾经看到过的详细设计可以细致到伪代码,程序员可以不必动脑筋,直接将伪代码翻译为 Java 或者 C# 代码即可。我对这样的设计人员致以无比的敬意,因为他(们)不但可以为数量远超他们的程序员写代码,更为神奇的是,这些代码可以在没有调试过的情况下正常运行。但是,我想今生我都无法达到这个水平了。而且即使我达到了这个水平,我还要为这些设计文档的维护尤其是文档与代码之间的同步 付出无比艰辛的劳动,与其这样,我不如: <!----><!----><!----> <!----><!----> <!---->●
<!---->简单设计。
<!---->●
<!---->单元测试的文档作用。
<!---->●
<!---->现代编程语言对于文档的支持。
<!---->1) <!---->天然的与代码同步,省去了很多同步的成本。 <!---->2) <!---->连接特性使得文档更容易阅读。 <!---->3) <!---->更加规范的文档格式。 <!---->●
<!---->源码之前了无秘密。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-24
山哥的这些实践和经验绝对是多年丰富积累的成果,给我们提供了样板和模板,同时对我的项目组也具有极高的借鉴!
强烈建议推出其他篇章,我们翘首企盼,拭目以待。 |
|
返回顶楼 | |
发表时间:2008-10-24
受益匪浅,期待下篇。
|
|
返回顶楼 | |
发表时间:2008-10-24
LZ的意思是不是: 不要做编程牛仔,要做有职业素养的程序员?
|
|
返回顶楼 | |
发表时间:2008-10-24
唔,推荐一下KENT Beck的新书“Implementation Patterns”吧,中文名“实现模式”。
该书的影印版已经上市,在China-pub可以看到。 翻译版年底也会上市。 |
|
返回顶楼 | |
发表时间:2008-10-24
hyhongyong 写道 LZ的意思是不是: 不要做编程牛仔,要做有职业素养的程序员?
也不是呀,编程牛仔也不错,我是说,编程牛仔+职业素养更好。 |
|
返回顶楼 | |
发表时间:2008-11-03
cats_tiger 写道
为什么要编码? 软件就是把人们的需要转化为计算机可以执行的程序。 这一点毫无疑问,但是这就是我们编码的目的吗?我们都知道,计算机其实很笨,它只能认识 0 和 1 这两个数字,无论多么复杂的程序都是由这两个最简单的数字构成。这正如哥德巴赫猜想,作为最复杂的数学证明题,要求解决的却是最简单的 1+1 问题。也就是说,最直接的编程就是向计算机输入 0 或者 1 ,为什么我们不这样呢? 原因当然很简单,因为 0 和 1 组成的机器语言实在是太难以理解和记忆了。于是前辈们就发明了汇编语言,汇编语言用单词代替了机器语言,它能够让人们更加容易理解代码和程序。可是前辈们又发现汇编语言还是太晦涩难懂,几百行代码已经让人云山雾罩,遇到几万行的大型程序,那简直就是天书了。所以先行者们又发明了高级语言,高级语言用接近自然语言的方式来编写程序,就象自然语言一样,它(们)成为了程序员阐明观点交流思想的通用工具。 所以,我们编写代码的目的就是为了交流和沟通,而这,也正是计算机语言存在的意义。
这一段口水话意义在哪里? |
|
返回顶楼 | |
发表时间:2008-11-03
tobato 写道 cats_tiger 写道 为什么要编码? 软件就是把人们的需要转化为计算机可以执行的程序。 这一点毫无疑问,但是这就是我们编码的目的吗?我们都知道,计算机其实很笨,它只能认识 0 和 1 这两个数字,无论多么复杂的程序都是由这两个最简单的数字构成。这正如哥德巴赫猜想,作为最复杂的数学证明题,要求解决的却是最简单的 1+1 问题。也就是说,最直接的编程就是向计算机输入 0 或者 1 ,为什么我们不这样呢? 原因当然很简单,因为 0 和 1 组成的机器语言实在是太难以理解和记忆了。于是前辈们就发明了汇编语言,汇编语言用单词代替了机器语言,它能够让人们更加容易理解代码和程序。可是前辈们又发现汇编语言还是太晦涩难懂,几百行代码已经让人云山雾罩,遇到几万行的大型程序,那简直就是天书了。所以先行者们又发明了高级语言,高级语言用接近自然语言的方式来编写程序,就象自然语言一样,它(们)成为了程序员阐明观点交流思想的通用工具。 所以,我们编写代码的目的就是为了交流和沟通,而这,也正是计算机语言存在的意义。 这一段口水话意义在哪里? 没啥意义,想写就写了。这是给初哥初姐看的,大牛就不要追究了。 |
|
返回顶楼 | |
发表时间:2008-11-04
这正如哥德巴赫猜想,作为最复杂的数学证明题,要求解决的却是最简单的 1+1 问题。也就是说,最直接的编程就是向计算机输入 0 或者 1 ,为什么我们不这样呢?
------------------------------------------------------------------- 你确定你明白什么是哥德巴赫猜想? |
|
返回顶楼 | |
发表时间:2008-11-04
ironsabre 写道 这正如哥德巴赫猜想,作为最复杂的数学证明题,要求解决的却是最简单的 1+1 问题。也就是说,最直接的编程就是向计算机输入 0 或者 1 ,为什么我们不这样呢?-------------------------------------------------------------------你确定你明白什么是哥德巴赫猜想? 举个例子而已,简单中隐藏复杂,仅此而已。 |
|
返回顶楼 | |