代码习惯

前天在AgileChina2009上听了Fred George的演讲,他说他以前拿自己的代码给Kent Beck看,结果Kent说这代码很垃圾,你去看看我写的Smalltalk best practice patterns吧。然后Fred George就看了这本书并且完全按照书上的要求去做,5年后当他再给Kent看自己的代码时,Kent说很漂亮的代码。

考虑到Fred比Kent要老,可以看出Fred是非常虚心的,听了Kent的评价不仅没有生气,而且还完全听从了建议。当然这也可能是Kent太出名的缘故,若是我说他的代码不好,或许他就不会这样做了。

这让我联想到有一次和8x一起面试,8x的手工重构让我很是惊讶。虽然我也看过《重构》,虽然我平时也重构,但是不论从步伐还是安全性上,都相差深 远。我读《重构》的时候对如此小步伐的改变是不太赞同的,因为效率比较低。我认为书中之所以把条目分的很详细,每个条目的步骤很小很谨慎,完全是为了可以 让支持重构的工具得以实现,对于人来说,保持这样小的步骤太难了,不管是从记忆还是从操作的角度来看。然而8x的表现让我改变了看法,不仅速度并不慢,而 且安全性非常的高。回想起我的重构经常出现改错以后没法返回的问题,不禁感叹--差距啊。

经常在国内的论坛上看到各种讨论设计、架构的帖子,然而每每show代码的时候却发现一塌糊涂。当然他们自己不觉得,可是我觉得很不好。最近 Kent Beck和Robert C.Martin出的两本书《Implementation Patterns》和《Clean Code》都是讨论一些很细节的东西的,如何命名、方法应该要多长、注释怎么写、格式怎么排等等,这些东西早在《The Element of Programming Style》中其实都有对应的东西,只不过语言不同了,细节方面也不同。然而为何这么多年来,一直有人不停的写本质上相同的东西呢?我觉得还是大家不重 视,没有养成良好的习惯,自然就需要有人去写这些东西,反反复复的提醒大家。

这里再一次很惭愧的说,我没有好好去读,也没有按照书中的东西认真去做,总是以为大概了解个概念,知道怎么回事,然后差不多做到了就行了。然而现在 想来,却完全不是那么回事。记得XP中有很多非常“极限”的要求,都是“一定”要如何如何,可实际上很多人都不以为然,认为太过激进,实际操作不现实或者 不必要,因此在实施的时候,做了一些妥协和变通,最后失败了还说XP不好。当然XP不可能是包治百病的灵丹,在某些情况下确实也不应该用它,但是很多人明 明可以从中获益,却因为没有领悟到其中的精髓而早早放弃。

比如说TDD,看起来与一般的单元测试的不同只是把写测试的工作放在了写代码之前,而Pair Programming也不过就是两个人坐在一起写程序罢了。然而在实际应用中,却会发现TDD并不是那么简单,它带来的好处是你在使用之前完全想不到 的,甚至很多都和Test是无关的。而Pair也不简单的就是两个人干一份工,如何根据技能的不同组合Pair,两人如何分工都有很大的讲究,甚至一般的 对于Pair目的的理解可能也是错误的。因此要想证明一件东西能不能起作用,首先要完全按照他要求的方式去做,等到你真的把该遇到的问题都遇到了,你才能 真正知道它是什么,能做什么,不能做什么,最后才知道它到底能解决什么问题,不能解决什么问题。

在说回到代码习惯的问题,软件开发中包含太多东西了,需求的、设计的、测试的、管理的、文化的、心里的、沟通的……要想掌握这么多东西是很大的挑 战。如何将一件事记住而不忘掉,最好的办法就是将之变成习惯,就像呼吸一样自然,不需要刻意去想就能做到。良好的代码习惯是一个开发人员最基本的技能,使 之成为习惯,会获益很多。

决定在看一遍《重构》和《实现模式》并完全按照其中的要求去做,争取也能在5年之内将之养成习惯。

posted @ 2009-09-15 15:14 Nick Wang (懒人王) 阅读(3923) 评论(60) 编辑 收藏

 回复 引用 查看   
#1楼 2009-09-15 15:20 韦恩卑鄙      
我拍个爪

正苦于在这方面没有头绪呢

多谢


 回复 引用 查看   
#2楼 2009-09-15 15:24 xiao_p      
好文章,顶。

我在总结的时候,总喜欢在认真的工作态度前面加上良好的工作习惯,相对来说,良好的工作习惯绝对比认真的工作态度更重要。

 回复 引用 查看   
#3楼 2009-09-15 15:24 金色海洋(jyk)      
厉害,我写代码能不能在坚持五年,我自己都不知道,呵呵。
 回复 引用 查看   
#4楼 2009-09-15 15:26 李永京      
设计真是个永恒的话题啊....
嗯!要说代码嘛,lz你等菜鸟最好是参考我的代码.
 回复 引用 查看   
#6楼 2009-09-15 15:30 asheng      
楼主,推荐您经常去的 技术博客或者论坛呗
谢谢啦

 回复 引用 查看   
#7楼 2009-09-15 15:32 韦恩卑鄙      
@吉日嘎拉>不仅权限设计.
你那个大豆腐块对我心脏不好 :P

引用韦恩卑鄙:
@吉日嘎拉>不仅权限设计.
你那个大豆腐块对我心脏不好 :P

你算个鸟啊!我吉日嘎拉有10年经验的老鸟是你这么口气说话的吗

 回复 引用 查看   
#9楼 2009-09-15 15:38 小眼睛老鼠      
@吉日嘎拉>不仅权限设计.
有病啊你
bs你这种不登录恶意中伤别人的人

 回复 引用 查看   
#10楼 2009-09-15 15:41 asheng      
哈哈……
 回复 引用   
#11楼 2009-09-15 15:42 ????[未注册用户]
引用吉日嘎拉>不仅权限设计.:嗯!要说代码嘛,lz你等菜鸟最好是参考我的代码.

没有必要这样去害别人。有撒意思呢

 回复 引用   
#12楼 2009-09-15 15:46 qwertyuiop[未注册用户]
@吉日嘎拉>不仅权限设计.
这里不欢迎你

 回复 引用 查看   
#13楼 2009-09-15 15:57 Jeffrey Zhao      
我是程序员我自豪,我写代码我快乐。
经常有人说写代码不重要,真正搞软件设计的人不会重视这些。
看看Kent Beck,啥叫大师,这就叫大师。

 回复 引用 查看   
#14楼 2009-09-15 16:01 asheng      
@Jeffrey Zhao
嗯嗯 老赵说的是 是

 回复 引用 查看   
#15楼 2009-09-15 16:06 侯锋      
@Jeffrey Zhao
顶一个

 回复 引用 查看   
#16楼 2009-09-15 16:07 玉米疯收      
呵呵,也曾有人对幼小的我说过:你写的太垃圾了……然后,我不忿地开始写和那人一样风格的代码,因为我觉得写不出来就否定人家是无能的表现……,过了一段时间,嘿,回头一看,原来自己的代码真的很垃圾……
 回复 引用 查看   
#17楼 2009-09-15 16:15 生鱼片      
这些写的时候可能不怎么觉得他的好处,但是系统你维护的越久体会越深刻啊
 回复 引用   
#18楼 2009-09-15 16:29 ddgg[未注册用户]
引用吉日嘎拉>不仅权限设计.:嗯!要说代码嘛,lz你等菜鸟最好是参考我的代码.


就凭你这句话,断定你水平也不怎么样.



 回复 引用 查看   
#19楼 2009-09-15 17:06 麒麟.NET      
以前看别人的代码经常会感觉不舒服,然后提一大堆关于重构的意见,或者在Code Review时直接改掉,但往往被一些不以为然的同事认为是“无理取闹”、“只关注不重要的东西,而忽略了最重要的功能已经实现了”等等,搞得我也一度心灰意冷……
我要谢谢lz,你又给我信心了,我继续给别人代码挑毛病去:)

 回复 引用 查看   
#20楼 2009-09-15 17:13 AlexLiu      
实现模式就是李剑翻译的那个啊
 回复 引用 查看   
#21楼[楼主] 2009-09-15 17:17 Nick Wang (懒人王)      
@麒麟.NET
说人家不好要讲出道理,讲不出就没人听了

 回复 引用 查看   
#22楼 2009-09-15 17:22 AlexLiu      
这本书有中文的么?Smalltalk best practice patterns
找了半天,还真没找到这本书中文交什么,郁闷。

 回复 引用 查看   
#23楼[楼主] 2009-09-15 17:30 Nick Wang (懒人王)      
@AlexLiu
没看过,据说等价于《重构》,或者说《重构》是这本书的Java版

 回复 引用 查看   
#24楼 2009-09-15 17:46 徐少侠      
TDD
我觉得他的目标是要编码者能做到“想在前面”
如果仅仅是“测在前面”
其实还是会有很多没测到的东西
一家之见,见笑

 回复 引用   
#26楼 2009-09-15 17:49 吉日嘎拉 [未注册用户]
哈哈哈哈哈哈
 回复 引用 查看   
#27楼 2009-09-15 17:50 老姜      
顶一下,以后还是多看优秀的代码
上面的是有人恶搞,不是我的留言。


别人怎么都习惯了,盗用我的号码了?
奇怪了。


 回复 引用 查看   
#30楼 2009-09-15 19:33 kuku      
呵呵,写代码的时候经常想起,别人能看得懂我写的吗?我尽量写的让同事能看懂,这样大家都有好处,见到不好的代码,我一定会告诉他,可能我不一定是对了,但是我提出来了
 回复 引用   
#31楼 2009-09-15 19:41 missdeer[未注册用户]
《实现模式》倒是有一本,不过还没完整看完,觉得讲得很有道理。《Clean Code》只看到有英文版的,看得吃力。
 回复 引用 查看   
#32楼 2009-09-15 20:14 Anders Cui      
很好,大家可以约定五年后,回顾下自己的代码,一起来唏嘘下。
 回复 引用 查看   
#33楼 2009-09-15 20:39 编写人生      
这个要顶。
 回复 引用   
#34楼 2009-09-15 21:28 hell world 1[未注册用户]
好像还是很空 说话
 回复 引用 查看   
#35楼 2009-09-15 21:46 卡通一下      
楼主的照片,看着象个篮球运动员。

 回复 引用 查看   
#36楼 2009-09-15 21:50 卡通一下      
引用Jeffrey Zhao:
我是程序员我自豪,我写代码我快乐。
经常有人说写代码不重要,真正搞软件设计的人不会重视这些。
看看Kent Beck,啥叫大师,这就叫大师。

每个人都自己的快乐,只是不要强加于人。

 回复 引用 查看   
#37楼 2009-09-15 21:54 卡通一下      
有人说,人在老的时候,常常怀念老情人;现在看到过去所写的程序代码,也是唏嘘不已!

 回复 引用 查看   
#38楼 2009-09-16 06:12 卡通一下      
哇噻!真的生气了,好三天不与你见面。

 回复 引用 查看   
#39楼 2009-09-16 07:03 Jake.NET      
不错的文章,有一点书中用java的,请问lz如何把它转成c#或者c++来学习。
 回复 引用 查看   
#40楼[楼主] 2009-09-16 07:15 Nick Wang (懒人王)      
@Jake.NET
语言只是表象,任何做法都要究其背后的原因,知道了原因你就不需要在意语言的不同了。而且Java和C#可以说在编程模式上是非常相似的。

 回复 引用 查看   
#41楼 2009-09-16 07:55 Jake.NET      
@Nick Wang (懒人王)
可以这样说,但是到了具体例子还是要认真思考差异性,毕竟这是讲具体到代码级的书,不是一个大道理就完了。

例如我在书评上看到的
《Book Review: Implementation Patterns》http://www.infoq.com/articles/implementations-patterns-br

Equality method: define the equals() and hashCode() methods together for correct equality.
--------------------------------------------
这个到了c++应该对应成重载 operator<。

请问你在看书的时候,遇到同样的问题怎么思考?

 回复 引用 查看   
#42楼 2009-09-16 08:57 Bruce.Zhang      
引用老姜:顶一下,以后还是多看优秀的代码

只有看比较多的优秀代码,才能提高自己的水平呢,不过就是不知道怎么找比较好的……

 回复 引用 查看   
#43楼 2009-09-16 09:32 GWPBrian      
hi Nick
可否分享些好的代码习惯。

 回复 引用 查看   
#44楼 2009-09-16 09:51 for certain      
回头也看看《重构》,做个程序员要看的东西真是太多了。。。。。
 回复 引用 查看   
#45楼 2009-09-16 10:11 Ryan Gene      
楼主到底是要说明一个什么问题呢?看了文章,感觉什么都没有。。。
 回复 引用 查看   
#46楼 2009-09-16 10:15 麒麟.NET      
引用Nick Wang (懒人王):
@麒麟.NET
说人家不好要讲出道理,讲不出就没人听了

当然讲得出,只不过像改个变量名之类的,很多人会认为很无聊,我也没办法

 回复 引用 查看   
#47楼[楼主] 2009-09-16 10:31 Nick Wang (懒人王)      
@Jake.NET
如果我看到这一点,我想知道的不是应不应该重载equals和hashcode,而是为什么,如果不这么做会有什么问题。其实背后的含义是如何维护对象的等值问题,(a=b => b=a),hashcode也是等值问题的一个约束。

换了一种语言,可能没有这两个函数,但是等值问题也一样是要解决的,只是方式可能就不同了。

 回复 引用 查看   
#48楼[楼主] 2009-09-16 10:32 Nick Wang (懒人王)      
@GWPBrian
这个很难几句话说清。推荐看《clean code》,然后尽量按照上面说的“一切”去做。慢慢就养成好的习惯了

 回复 引用 查看   
#49楼[楼主] 2009-09-16 10:34 Nick Wang (懒人王)      
引用Ryan Gene:楼主到底是要说明一个什么问题呢?看了文章,感觉什么都没有。。。


可能是因为你还没遇到过这样的问题。

 回复 引用 查看   
#50楼 2009-09-16 10:37 Ryan Gene      
引用Nick Wang (懒人王):
引用Ryan Gene:楼主到底是要说明一个什么问题呢?看了文章,感觉什么都没有。。。


可能是因为你还没遇到过这样的问题。



我说的是你的文章,整篇都在写谁谁代码不好,需要再看一遍《重构》,没别的了

 回复 引用 查看   
#51楼[楼主] 2009-09-16 10:40 Nick Wang (懒人王)      
@Ryan Gene
我说我的代码还不够好啊

 回复 引用 查看   
#52楼 2009-09-16 10:42 Ryan Gene      
引用Nick Wang (懒人王):
@Ryan Gene
我说我的代码还不够好啊


对啊,除了说自贬以外就没东西了

 回复 引用 查看   
#53楼[楼主] 2009-09-16 10:52 Nick Wang (懒人王)      
@Ryan Gene
呵呵,你说的很对。就是一个反思。

不过我经常从别人的反思中得到自己的反思,所以也把自己的拿出来,看看能不能帮助别人反思一下。

 回复 引用 查看   
#54楼 2009-09-16 10:56 Ryan Gene      
引用Nick Wang (懒人王):
@Ryan Gene
呵呵,你说的很对。就是一个反思。

不过我经常从别人的反思中得到自己的反思,所以也把自己的拿出来,看看能不能帮助别人反思一下。


哦,希望吧

 回复 引用 查看   
#55楼 2009-09-16 11:09 西伯利亚      
引用Bruce.Zhang:
引用老姜:顶一下,以后还是多看优秀的代码

只有看比较多的优秀代码,才能提高自己的水平呢,不过就是不知道怎么找比较好的……

看.NET Framework 就行了

 回复 引用 查看   
#56楼 2009-09-16 11:19 YeanJay      
《重构》这本书有没有购买的链接
 回复 引用 查看   
#57楼 2009-09-16 12:26 xiaosuo      
代码习惯很重要
 回复 引用 查看   
#58楼 2009-09-16 12:32 戏水      
@Nick Wang (懒人王)

"争取也能在5年之内将之养成习惯 "这句话最重要啊
向大师学习,也向老王学习

 回复 引用 查看   
#59楼 2009-09-16 13:12 CoolCode      
引用吉日嘎拉>不仅权限设计:
上面的是有人恶搞,不是我的留言。


我知道不是你留言,留言的人是:吉日嘎拉>不仅权限设计.后面多了个小数点。明显有人想中伤你,要小心。