`
ronghao
  • 浏览: 456009 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
E9473dd5-1985-3883-ac98-962354ca10b3
张小庆,在路上
浏览量:8779
社区版块
存档分类
最新评论

心理学,再谈好代码

阅读更多
什么代码才是好代码?这真是个老得能拔掉牙齿的话题。好吧,那让我们再在这刮沙尘暴的无聊时光里重复一次。好的代码要是易读的代码、要做到职责分离、要做到单一职责、要有高的执行效率....

等等,等等,这才抽象了,太书面化了。我只是一个菜鸟,刚写代码几年,也没念过什么书,能不能说得通俗易懂一些?

好吧,我停下来,想,这真是个难缠的家伙。我说,这样吧,我推荐几本书你去看吧,《重构》熊节最近再版了,建议你去买一本。恩,等等,有个省钱的招,去图灵俱乐部讨论组注册下,蹭赠书也很爽,哈哈。

可是,你还没告诉我什么代码才是好代码呢?知道你也没什么好答案,我自己来说好了。

省略掉此时我内心花花的汗水,下面是菜鸟的叙述:

1.一致
我发现自己有轻微的强迫症,当我碰到以下代码时,我就会冲动。
冲动前代码:
def imgName
if(XXX){
   imgName="meigui"
}else{
   imgName=""
}

冲动后代码:
def imgName=XXX?"meigui":""


尽管两段代码功能一致,但一旦我发现出现冲动前代码时,我就会感到不舒服,感到难受,就好像看到阅兵正步走不齐一样。方法名也是一样:
冲动前:
def testXXX(){}

冲动后:
def should_XXX_when_XXX(){}


变量亦是如此:
冲动前:
def imgNode=resouce.adoptTo(Node)

冲动后:
def node=resouce.adoptTo(Node)


总之,我不愿意看到同一个事情有两种实现方式,如果功能类似,那么不管是逻辑还是变量、方法名,我会强迫一致,整齐划一。

关于一致,从调试代码的角度看,零星的不一致比大量的不一致更加糟糕,因为这时大部分地方的一致性会令人麻痹大意。在实现查询分页功能时,我们有这样一行代码:
nodeIterator.size

这行代码的意思是获取查询结果的总数,大部分情况下它工作良好,但是在一种特殊情况下它返回了-1。这对我当时几乎是灾难性的,因为调试过程中我们始终相信这行代码的行为一致,结果是花费了一个下午才找到这个问题。

2.简洁
我喜欢短的代码,对我而言,短的程序总是比更长一些的代码容易理解,小学时学课文就已经这样了,一看到大段的段落我总是会晕过去(特别是文言文,首先我就对自己理解这段文字失去了信心)。这里要提到注释,即是这些注释明确是为了提高代码的可读性,也会增加我阅读代码的困难,所以我不会在方法里的任何位置添加注释,撑死在个别方法声明前添加,并且这种情况也尽量避免,如果这个类确实包含了重要的不易理解的算法,我也只会在类声明前添加注释。

关于自然语言,有一个基于经验的结论被称为Zipf定律,即:自然语言中最常用到的单词,其长度会趋于最短。

我写代码的时候,能够简写尽量简写,例如,变量名,imageNode,我一定会写成imgNode;方法名procedureXXX,我一定会写成procXXX,和讨厌大段代码一样,我非常讨厌命名很长的方法名和变量名,尽管这些名称这么长是为了更好的增加可读性,但可读性不是这样增加的。

在我的第一份代码工作里,我们使用拼音来命名方法和变量(还好,没有包括类名),我讨厌这种命名方式的原因并不是因为我的语文老师不好以至于我前后鼻音不分,而是这种写法根本排除了简写的可能性,甚至,为了避免歧义,有时不得不变得更长。

3.联觉和顺序
关于记忆,人类有两种重要的记忆能力:联觉和顺序记忆。

关于联觉,一个例子是:你总可以一眼记住一个人的脸,比如范冰冰,尽管我到现在也不清楚她到底是单眼皮还是双眼皮,也不清楚她到底是厚嘴唇还是薄嘴唇。

那么,在代码里,这里的表现就是局部,即一个功能的所有相关代码都集中在一个地方。我最讨厌的代码是这样的:最开始我打开一个文件,在阅读的过程中,我发现一个不清楚的方法,于是我按下ctrl并点击鼠标,于是我跳到另外一个文件;接下来,在阅读另外一个方法里,我再次发现了一个不清楚的方法,于是我再次按下ctrl并点击鼠标,哇哈,新的文件打开了....如此反复,终于当我打开最后一个文件时,我发现IDE的文件条里已经密密麻麻的排满了好几排文件,于是,我移动鼠标,右键,弹出一个关闭菜单,我选择了close others,瞬间,哦米拖佛,整个世界清静了,但是,等等,我最初是打算干嘛来着?

所以,请把所有相关联的代码都集中在一个地方,求您了。哦,对了,能不用接口请不要用接口,总会碰到这样的情况,打开好几排的文件,接口文件占了一半,我靠,少几个接口会死啊。对了,这可能是您的一致性心理在作怪,对不起,对不起。

关于局部,一个范例同样与调试有关,在很久之前的一次调试中,我们始终找不到一个变量错误的原因,因为在这段代码里,根本找不到任何错误,很久以后,终于发现,这个变量竟然是个全局变量,嘿嘿,告诉你吧,这个变量在servlet里,04年的时候,网上很火的一篇文章,标题就是:不要在servlet里使用全局变量!

关于顺序,最典型的例子出现在高中化学里,我总也不能瞬间说出第12、13个化学元素是什么,我通常会这样记忆:氢氦锂铍硼碳氮氧氟氖钠镁铝硅磷,啊哈,第12个元素是镁,第13个元素时铝,合起来就是--美女!

所以,在代码里,请将互相调用的方法按顺序摆放,方法1先调用了方法2,那么请将方法2紧放在方法1后边。我讨厌这样的配置:打开方法1,发现其调用了方法2,点击方法2,编辑器里的滚动条瞬间从最上端滚到最下端,紧接着,滚动条又从最下端滚动到中间,再接着,又是最下端,接着,归零到最上端....人生经不起这样的大起大落,真的,那得要多么大的心脏啊,麦蒂才有过那么一次,13秒....

还有,知道为什么goto为什么那么臭名昭著了吧。

4.自然
使得代码具有轻松的表达方式,同时把错误率降到最低,一种最重要的方法就是代码变得“自然”,即向自然语言靠拢。因为代码并不仅仅是与机器交流的,更重要的是,需要在人之间交流。

机器语言到高级语言,面向过程语言到面向对象语言,jdbc到hibernate,java到动态语言,这些都促使代码变得更加自然。

Ruby里有个不起眼的特性,就是方法调用不用再写括号,这一特性是如此的微不足道但是却被很多人津津乐道,原因就是它更加自然,更加贴近我们的自然语言。于是,我看到,我的同事晓娜,在groovy里,一遍遍的将她力所能及的括号去掉。

此外,程序语言和自然语言是有区别的,除了不能在代码里利用感情词抒发情感之外(我想,如果可以,一定会看到很多的冯特),程序语言没有口语。很少看到程序员之间这样交流,来吧,我们来说段代码(当然也有,徐昊就可以,哈哈),他们更多的会使用白板和笔或者直接是编辑器。所以,结束招聘时是否需要笔试的争论吧,我真为那些不经过笔试就直接招人的公司感到羞愧,因为他们根本就不懂程序语言。

此处省略华丽的分割线。

此文谢谢我们项目组的激烈讨论,谢谢讨论中徐昊的精彩点评。

Hi,各位,我想说明一下这篇帖子的目的,这里并没有给什么是好代码下一个明确的定义,这里只是一个观察的角度,提供另外一个视角,仅此而已。温伯格说过,所有系统都是观察者的一种主观幻觉而已,大概就是这个意思。
分享到:
评论
19 楼 ltian 2010-03-28  
代码重构的思想就是这些,不重构也罢!
18 楼 sg552 2010-03-26  
引用

我最讨厌的代码是这样的:最开始我打开一个文件,在阅读的过程中,我发现一个不清楚的方法,于是我按下ctrl并点击鼠标,于是我跳到另外一个文件;接下来,在阅读另外一个方法里,我再次发现了一个不清楚的方法,于是我再次按下ctrl并点击鼠标,哇哈,新的文件打开了....如此反复,终于当我打开最后一个文件时,我发现IDE的文件条里已经密密麻麻的排满了好几排文件,于是,我移动鼠标,右键,弹出一个关闭菜单,我选择了close others,瞬间,哦米拖佛,整个世界清静了,但是,等等,我最初是打算干嘛来着?

所以,请把所有相关联的代码都集中在一个地方,求您了。哦,对了,能不用接口请不要用接口,总会碰到这样的情况,打开好几排的文件,接口文件占了一半,我靠,少几个接口会死啊。对了,这可能是您的一致性心理在作怪,对不起,对不起。

以前看有大师说要分离 要接口而且看spring代码一个方法也会跟踪出好几排的文件~


我觉得这个问题的根源是 用户对IDE 不熟悉。
在Eclipse中, F3 查看, F3查看, F3查看, alt + left 后退, alt + left 后退, alt + left 后退。不用碰鼠标,不过几秒,如果你还想不起来干啥, 运行一下单元测试,看看哪里FAILED了,就干哪里。

Pragmatic Programmer的作者,建议大家以每天学会一点目前所用IDE的新功能为荣。

自己当初对于Eclipse 的快捷键的基础,让我现在用Aptana 得心应手。。。 *_*  你的付出绝对不会让你失望的。

大师说的没错。withouth EJB 提倡写小方法。refactoring 则是说事不过三,当你第三次见到某段代码应该 extract method, 那么就果断 extract 之。 当今几乎有名的开源程序,几乎都是小方法组成的。


不赞成缩写。如果这个文章确实被徐昊点评过,那么我很好奇,他对你缩写的观点如何看,以及 小方法所处的位置。作为一个TW控,我认为他们的项目中是禁止用缩写的。

对于LZ的其他观点甚是赞同 :-)
17 楼 kingtay 2010-03-26  
其实代码过分最求简单的话会导致可读性下降
这样的代码就和简短的文言文一样了
好的代码应该是思路清晰,设计简洁
16 楼 抛出异常的爱 2010-03-26  
引用

我最讨厌的代码是这样的:最开始我打开一个文件,在阅读的过程中,我发现一个不清楚的方法,于是我按下ctrl并点击鼠标,于是我跳到另外一个文件;接下来,在阅读另外一个方法里,我再次发现了一个不清楚的方法,于是我再次按下ctrl并点击鼠标,哇哈,新的文件打开了....如此反复,终于当我打开最后一个文件时,我发现IDE的文件条里已经密密麻麻的排满了好几排文件,于是,我移动鼠标,右键,弹出一个关闭菜单,我选择了close others,瞬间,哦米拖佛,整个世界清静了,但是,等等,我最初是打算干嘛来着?

所以,请把所有相关联的代码都集中在一个地方,求您了。哦,对了,能不用接口请不要用接口,总会碰到这样的情况,打开好几排的文件,接口文件占了一半,我靠,少几个接口会死啊。对了,这可能是您的一致性心理在作怪,对不起,对不起。



以前看有大师说要分离 要接口


而且看spring代码一个方法也会跟踪出好几排的文件~


把接口放一起。
在这个目录下建个包放接口的所有的实现。。。。
配合起来也好。弄
15 楼 waitingmyself 2010-03-25  
<pre name="code" class="java">我最讨厌的代码是这样的:最开始我打开一个文件,在阅读的过程中,我发现一个不清楚的方法,于是我按下ctrl并点击鼠标,于是我跳到另外一个文件;接下来,在阅读另外一个方法里,我再次发现了一个不清楚的方法,于是我再次按下ctrl并点击鼠标,哇哈,新的文件打开了....如此反复,终于当我打开最后一个文件时,我发现IDE的文件条里已经密密麻麻的排满了好几排文件,于是,我移动鼠标,右键,弹出一个关闭菜单,我选择了close others,瞬间,哦米拖佛,整个世界清静了,但是,等等,我最初是打算干嘛来着?

所以,请把所有相关联的代码都集中在一个地方,求您了。哦,对了,能不用接口请不要用接口,总会碰到这样的情况,打开好几排的文件,接口文件占了一半,我靠,少几个接口会死啊。对了,这可能是您的一致性心理在作怪,对不起,对不起。
</pre>
<p> </p>
<p> </p>
<p>以前看有大师说要分离 要接口</p>
<p> </p>
<p>而且看spring代码一个方法也会跟踪出好几排的文件~</p>
14 楼 wjywjy678 2010-03-25  
麦蒂35秒13分
13 楼 Snow_Young 2010-03-24  
好吧……你和我的习惯几乎完全一样……握手……

另外,你是A型血吗
12 楼 TheNewBeginning 2010-03-24  
抛出异常的爱 写道
cleanerje 写道
推荐LZ看《code complete》第二版(代码大全)。
详细看完以后,你对好代码的见解会有所改变!

CC里没有一句说怎么样写代码才最好
都是自己掂量着办的语气。


没有固定的好的代码格式,确实需要自己看着办。
适合A不一定适合B。
11 楼 hotjava 2010-03-24  
冲动后代码:
Java代码
def imgName=XXX?"meigui":"" 

---------
这样的代码是垃圾。
10 楼 抛出异常的爱 2010-03-23  
cleanerje 写道
推荐LZ看《code complete》第二版(代码大全)。
详细看完以后,你对好代码的见解会有所改变!

CC里没有一句说怎么样写代码才最好
都是自己掂量着办的语气。
9 楼 ald 2010-03-23  
lZ的想法有闪光点,但总得来说系这样是写不出好代码的。当然,跟使用的语言有关,我的说法有点绝对了。
8 楼 gray 2010-03-23  
合理化的代码确实能带来很多好处,从心里上说,想找什么就能找到什么,畅快,从身体上将,长时间的跳来跳去,好人也会跳废的,看来代码也需要管理呀。
7 楼 xiao_p 2010-03-23  
哥们,你太适合做函数式编程的程序员了。
6 楼 cleanerje 2010-03-23  
推荐LZ看《code complete》第二版(代码大全)。
详细看完以后,你对好代码的见解会有所改变!
5 楼 lzstone 2010-03-23  
看到好代码我就想起我项目经理给我批评,以前中喜欢把所有的代码写成一条语句,整一条语句老长了,天天靠这点成就感活着,有天项目经理把我叫去了,让我给代码上注视,这下我郁闷了,怎么上,后来被批下来,所有代码要分层次! 
4 楼 jnoee 2010-03-23  
对于命名、缩写、格式我也有着很严格的标准,不知道这算不算是一种强迫症,每次看到代码中有不符合的地方,哪怕一个字母,都会要求修改...
3 楼 强强爱妍妍 2010-03-22  
ronghao 写道

变量亦是如此:
冲动前:
def imgNode=resouce.adoptTo(Node)

冲动后:
def node=resouce.adoptTo(Node)


用大小写区分变量不是一个好主意. 不直观,容易搞混掉. 我看这里imgNode比node更好,表意更多,又不会和Node弄混淆.
2 楼 ronghao 2010-03-21  
dreamhead 写道
推荐你看一下《Clean Code》(中文名《代码整洁之道》)。

imageNode变成imgNode不见得是好的选择,前提是全项目组就这个缩写达成一致。比如,procXXX究竟是procedureXXX还是processXXX呢。如果能短固然好,但更要的是表意。


谢谢。

是的,如果不一致,那么缩写的意义就不大了。
1 楼 dreamhead 2010-03-20  
推荐你看一下《Clean Code》(中文名《代码整洁之道》)。

imageNode变成imgNode不见得是好的选择,前提是全项目组就这个缩写达成一致。比如,procXXX究竟是procedureXXX还是processXXX呢。如果能短固然好,但更要的是表意。

相关推荐

    源码追踪经验谈(侯俊杰谈如何读代码)

    面对别人写的代码,有时需要具备一定的心理学洞察。理解作者的设计意图,考虑他们在特定情境下的选择,可以帮助我们更好地解读代码。同时,侯俊杰可能也会提到,与原作者或团队交流是理解代码的高效途径,如果有机会...

    浅谈对口单招学生C语言的学习捷径.pdf

    文章《浅谈对口单招学生C语言的学习捷径》针对江苏省中专生在对口单招考试中如何高效学习C语言提供了专业指导和建议。 首先,作者指出C语言对于计算机专业学生来说具有极高的重要性,是考取高等院校的必备条件。...

    C语言程序设计学习指南.docx

    虽然我们提倡不懂就问,但是不要因此而产生一种对教师或他人的依赖心理,在问问题之前要自己先动脑思考一下,在思考以后再问,不只关注问题的答案,而是更关注问题分析的过程。 3. 不要只见树木不见森林,捡了芝麻...

    百人谈梨花声音研修院培训,新蓝海中的领航记共7页.pdf

    7. 心梓知识:可能是对学习过程中的心理准备和知识积累的建议,帮助学员更好地适应学习和职业发展。 【标签】:"数据集 源代码 计算机资料 学习资料 python stm32 C语言 小程序 心梓知识" 这些标签进一步提示,书...

    物联网谈读书与互联网思维.pdf

    在物联网中,这可能意味着理解如何将物联网技术与经济学、社会学、心理学等多学科结合,以解决实际问题。 此外,互联网思维强调的是快速迭代、用户中心和数据驱动。在物联网的学习过程中,利用互联网资源进行自我...

    电击手表放电手环的手机端App源代码

    电击手环就是可以产生静电脉冲的智能手环,它主要的功能就是早起闹钟,以及电击防疲劳,另外有一些人用电击手表来戒除坏习惯(心理学领域的电击厌恶疗法),它可以产生将近500伏的静电脉冲,目前市面上电击手表主要...

    电击手表放电手环起床神器Pavlock的软件源代码

    电击手环就是可以产生静电脉冲的智能手环,它主要的功能就是早起闹钟,以及电击防疲劳,另外有一些人用电击手表来戒除坏习惯(心理学领域的电击厌恶疗法),它可以产生将近500伏的静电脉冲,目前市面上电击手表主要...

    浅谈高职高专Java基础教学.pdf

    浅谈高职高专Java基础教学 Java 语言是高职高专教学中的一门重要课程,然而由于学生的整体水平和层次相对较低,学习的主动性和自觉性较差,使得教学工作变得非常困难。因此,笔者结合教学经验和思考,总结了个人的...

    Android开发经验谈-很少有人会告诉你的Android开发基本常识 - 简书1

    - **交互设计**:交互设计师基于策划的需求,结合心理学和用户体验,创建交互文档,定义功能和界面逻辑。 - **视觉设计**:视觉设计师根据交互设计制作出界面,Android平台常使用PNG和JPG图片格式,有时需要使用...

    C语言实践教学方法浅谈.pdf

    C语言实践教学的目标是让学生掌握C语言的基础语法和编程思想,熟悉基本算法,能够独立编写代码、调试程序和测试数据,以及具备一定的自学能力。C语言的实践性非常强,它包含大量的概念和复杂的语法规则,学生在学习...

    谈编译原理课程的教学理念与课程设计

    以往的教学往往先教授理论,再尝试实践,但在当代教育环境中,可以尝试让学生先接触实际的编译程序,如通过阅读和分析编译器源代码,了解编译器生成工具如ANTLR的使用,激发学生的学习兴趣。这样可以让学生看到编译...

    基于Vue2.0+Element-UI组件库实现面向大学生的心理健康辅助和情绪宣泄的网站源码.zip

    1.项目代码完整可靠,谈不上高分、满分(多数为夸大其词),但难度适中,满足毕设、课设要求,属于易上手的优质项目,资源内基本都有说明文档,依据文档即可运行 2.小白下载后,使用时可能会遇到些小问题,若自己...

    初中语文文摘生活房间乱心情就乱

    这在心理学上被称为环境影响情绪理论,它表明我们的物理环境能够影响我们的情绪和行为。在IT工作中,这可以延伸到工作空间的组织。一个杂乱无章的桌面或电脑桌面,可能会导致开发者分心,影响其集中精力解决问题。...

    精品资料(2021-2022年收藏)浅谈网站建设和网页制作的方法.docx

    色彩心理学在网页设计中起着重要作用,不同颜色能引发不同的情感反应,因此应根据网站主题来选择合适的颜色搭配。 **2. 网页制作方法与技巧** **2.1 表格的定位功能** 在网页制作中,表格常用于内容的排列和定位...

    浅谈数据结构课程中实践教学的作用.pdf

    首先,数据结构课程本身具有很强的逻辑性和抽象性,这使得课程的学习难度较大,尤其是对于初次接触程序设计的学生来说,他们往往对数据结构存在畏惧心理,难以入手。其次,学生在学习数据结构之前需要掌握一门或几门...

    JAVA自学之路

    提醒一句,要理解代码思路之后再跟着敲 ,背着敲,千万不要左边摆着别人的程序,右边自己一个一个子母的写,这就不再是程序员了,成了打字员了。 纸上得来终觉浅,所以:别问那么多,别想那么多,动手写吧。 ...

    圣思园教学视频地址

    “圣思园开学仪式(学习方法谈:程序设计学习七宗罪)”这一视频可能涵盖了开始学习Java前的心理准备和有效学习策略。它可能会讨论常见的学习误区,比如“程序设计学习七宗罪”,帮助学员避免在学习过程中遇到的常见...

    基于手机短消息的校园信息系统

    短消息主要用以联系家人朋友、谈恋爱、获取最新信息和班级社团工作等。 4. 大学生使用短消息的心理动机 分析大学生使用短消息的心理动机,可从人际交流需求变化、从众心理和自我参与意识膨胀三方面进行探讨。人际...

    佩利,VG (1989)。 白老师。 剑桥:哈佛大学出版社,142 页,[美元]9.95

    学校心理学,卷。 33(4), 1996 0 1996 John Wiley &amp; Sons, Inc. CCC 0033-3085/96/040361-05 书评 GILBERT R. GREDLER 南卡罗来纳大学 IWANIEC, D. (1995)。 被情感虐待和忽视的孩子。 纽约:John Wiley &amp; ...

Global site tag (gtag.js) - Google Analytics