老码农:如何写出让自己满意的代码

  今天有位朋友在微博上问我这样一个问题:

  “@老码农的自留地 ,最近出于学习目的写一个管理系统,越到后边,越觉得自己前边的代码写得烂。前辈,我想让代码写得更好一点,能不能谈谈你的经验,给我指点一下!”

  我在回复里刚写了几句,就意识到140个字很难把我的想法说清楚,本着知无不言言无不尽的好为人师精神,我决定把我的回答写成一篇博文。

  首先要说明的是,我写这篇博客并不代表本人觉得自己的代码写得有多好。事实上我很清楚自己的水平,作为一个做应用系统的程序员,和那些做框架做系统的大牛根本就不在一个层次。而且即使在应用层次,我的水平大概也只能算二三流,只是因为热爱编程所以一直在努力而已,但不管怎么说,能做自己喜欢的工作我已经很满足了。所以我稍微篡改了一下问题,针对“觉得自己前边的代码写得烂”这个重点,把这位朋友问的如何“让代码写得更好一点”改成了“如何写出让自己满意的代码”。

  言归正传,我自己的体会是写代码很像写作文,开始写之前的构思过程是最关键的。记得高中的时候,有位语文老师给我传授的经验是,至少花三分之一的时间来构思,反复斟酌中心思想、各个段落的大意,文章的脉络,主要的修辞手法,等等。把这些要素都想清楚了,写起来就可以一气呵成。

  我觉得写代码也是一样,思路是最关键的。假定采用的技术平台、框架、工具等已经确定了,那么在开始动手写之前,花三分之一以上的开发时间去把所有的数据结构及其相互关系考虑清楚。例如需要定义几个类,类和类之间的关系是怎样的,每个类里都有什么属性,每个类提供一些什么样的方法,等等,这些是最核心的。这些数据结构要考虑得尽可能细,比如功能实现可能没问题,但是性能上不理想,这就说明你的数据结构设计还需要改进。这些细节要反复考虑,交叉检验,直到自己觉得很周到了为止。在此基础上,再注意实现的细节、测试用例、代码可读性,就应该可以写出让自己满意的代码。具体说明如下:

  1. 数据结构和核心算法

  关于数据结构的重要性,大神Linus Torvalds讲过这样的话,我觉得非常赞同:”Bad programmers worry about the code. Good programmers worry about data structures and their relationships.” (低水平程序员总在考虑代码,高水平程序员总在考虑数据结构及其之间的关系)

  数据结构考虑清楚了,核心的算法自然就出来了,这就是关于每个类的每个方法如何实现的问题。比如需要实现一个中位数查询方法,如果你前面确定了数据保存的格式是一个列表,那么你可以考虑采用插入排序法;如果数据格式是自平衡二叉排序树(AVL),则只需直接返回根节点就可以了。

  数据结构决定算法,所以你在考虑数据结构的时候,一定要尽可能地使数据的结构和它的自然属性相匹配,不然后面的实现就会是一场噩梦。比如,你把一个多层级的结构定义成二维数组,看上去也靠谱,相当于在一个表格里维护一个组织结构图,可是当你做到部门增减的时候,本层级的数组元素移动自不必说,下面各个层级的元素移动就很容易乱套,而且性能很差,可能你写了2000行代码还有很多边界条件会出错。相反,如果用一个孩子兄弟链表来表示这个树型结构,操作起来就非常容易,可能100行都足够了。

  2. 功能实现

  思路确定后,实现过程也需要大量的构思活动。碰到你比较熟悉有经验的领域,你自然可以轻车熟路,但难免会有一些你不太熟悉的技术需要尝试。有的同学比较排斥这种领域,比如我好不容易才掌握了Struts 2,领导又让我去学习Grails框架,我就会觉得很不爽,大概看了看就挑出它的一堆问题,然后能躲多远就躲多远。可是我要说,这样的心态会阻碍自己不断提高技术水平。作为一个程序员,最大的挑战也是最大的乐趣所在,就是不断学习新的技术,没有这样的心态,很快就会落后。

  好,那么遇到不熟悉的技术怎么办?我的体会是,先不要急着实现项目中的代码,自己另外维护一个测试项目,在里边边查文档边学习,边做一个小功能,把所有需要在项目中实现的功能先在测试项目里跑通,然后再写项目里的代码。这样做的好处是把单个技术问题和其他潜在的bug隔离开来,便于快速学习新技术。否则,你直接在项目里写代码出错以后,要判断问题的源头都要多费好几倍的精力。

  3. 测试

  测试很重要,设计测试用例就像开发时设计数据结构一样,也是很关键的。在设计测试用例的时候,要把当时自己设计数据结构的思路全部忘掉,或者找别人来设计测试用例,不然会不由自主地测试那些你已经考虑到了的地方。这样测试是跑通了,用户一用起来可能各种边界条件会到处出问题。

  有人会推崇TDD的方法,先设计好测试用例,然后在开发过程中确保所有测试通过。我个人不喜欢这种方法,虽然承认从开发质量管理和长期维护的角度来说TDD是很有必要的,但我个人尝试的结果是,设计完测试用例后,想到开发的目标不是实现功能,而是为了跑通测试,就感到毫无乐趣可言。这一点我自己也觉得很矛盾。

  写到这里我又想到大神Linus说过的另一句话:”Regression testing” What’s that If it compiles, it is good; if it boots up, it is perfect. (“回归测试”?这是什么东西?如果代码能编译就是好的,如果它启动了,那就是完美的。)

  当然了,大神水平摆在那里,他有资本目空一切,咱确实没资格仿效。但是我还是觉得TDD也有TDD的问题,测试是很重要,但把它摆到驱动开发的高度,就有点本末倒置了。这个是我自己的一点看法,本人对TDD了解得不深入,如果有谬误之处,请多多指教。

  4. 代码可读性

  要想自己满意,代码的可读性一定要好。要做到一年后甚至几年后你拿到自己写的代码,还能很容易看明白当时的思路和实现。这就涉及到命名和注释的问题。

  命名就像超市里的商品标签一样,要让看得人一目了然就知道这是个什么东西,比如你的员工类里有两个属性分别是到岗日期和离职日期,把它们定义成date1和date2就没有多少可读性,而定义成dateOnBoard和dateQuit就比较清晰。

  注释也是很重要的,它可以用来说明一段代码的作用,算法的设计思想,或者是方法调用的参数格式要求等。有人觉得命名就是注释,代码本身就为自己代言了。我觉得这种说法用来强调命名规范的重要性是很好的,但是因此说不需要注释则有失偏颇。试想,如果Dijkstra首次发明最短路径算法的时候,他给出的代码里没有一行注释,即使所有的变量命名都定义得准确而严谨,又有几个人能看懂他的算法呢?所以,在重要或者复杂的地方,都需要详细地写一些注释,便于看代码的人清晰地了解你的思路。

  最后总结一下:要想写出自己满意的代码,首先不要急于动手,要先仔细想清楚思路性的东西,尤其是数据结构,然后在实现过程中大胆尝试小心验证,设计好测试用例,确保代码的可读性,就可以在代码中表现出自己的最高水平。但毕竟各人水平是有差异的,自己满意并不等于其他人欣赏。我对此的看法是,不求尽如人意,但求无愧我心,足矣。最后再啰嗦一句,技术水平是可以慢慢提高的,但是好的编程习惯需要从一开始就养成,它会让你在前进的道路上事半功倍,受益终生。

  【更新】针对评论中提到的需求不确定导致设计和实现困难的问题,我又写了一篇有关需求分析的文章:《关于需求分析的几点体会》,欢迎批评指正。

  本文作者: 伯乐在线 - 老码农

  本文链接: http://blog.jobbole.com/47966/

时间: 2024-12-21 03:00:55

老码农:如何写出让自己满意的代码的相关文章

老码农:关于需求分析的几点体会

中介交易 SEO诊断 淘宝客 云主机 技术大厅 在我前面写的一篇博文<如何写出让自己满意的代码>中,有读者在评论中提到了用户需求不确定导致在总体设计阶段总是无的放矢的问题.需求分析当然是非常重要的,甚至在某些情况下比总体设计还更重要.那么,如何理解需求分析呢? Google一下关键字"需求分析",网上已经有很多相关的文章了,有不少已经写得像教科书一样全面准确,还提供了一些最佳实践的分类方法.我这篇就从个人经验方面谈一点自己的体会好了. 首先,最重要的一个问题就是,为什么要做

站长应该如何写出让搜索引擎满意的标题

摘要: 相信新老站长们众所周知,网站的标题关键词是写在html文件头部部位中的重要信息,虽然我们的头部信息不能完整的展示在访问用户的面前,但是标题关键词的设置却影响着我们整个网 相信新老站长们众所周知,网站的标题关键词是写在html文件头部部位中的重要信息,虽然我们的头部信息不能完整的展示在访问用户的面前,但是标题关键词的设置却影响着我们整个网站页面的排名,是搜索引擎判断网站页面相关性的重要元素,可以看出写好网站的标题,对于我们网站的排名占有着举足轻重不可忽视的作用,那么站长应该如何写出让搜索引

老码农的技术理想

小时候,老师问我,你的理想是什么?我不假思索说是工程师,于是长大之后果然成了工程师. 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大悟,原来就是:用技术手段改进世界. 那么,在软件方面,目前的世界有哪些问题需要解决呢?有这么一些问题可以思考: 现在整个世界的信息化程度是偏高还是偏低? 程序员的人数够用吗? 软件行业的生产力是偏高还是偏低? 大部分软件系统都可靠吗? 我想说说自己对这几个问题的理解. 虽然现在我们的生活与十年前相比,已经发生了巨大变化,比如智能手持设备已经非常普及,

徐飞:老码农的技术理想

小时候,老师问我,你的理想是什么?我不假思索说是工程师,于是长大之后果然成了工程师. 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大悟,原来就是:用技术手段改进世界. 那么,在软件方面,目前的世界有哪些问题需要解决呢?有这么一些问题可以思考: 现在整个世界的信息化程度是偏高还是偏低? 程序员的人数够用吗? 软件行业的生产力是偏高还是偏低? 大部分软件系统都可靠吗? 我想说说自己对这几个问题的理解. 虽然现在我们的生活与十年前相比,已经发生了巨大变化,比如智能手持设备已经非常普及,

一个老码农的技术理想

小时候,老师问我,你的理想是什么?我不假思索说是工程师,于是长大之后果然成了工程师. 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大悟,原来就是:用技术手段改进世界. 那么,在软件方面,目前的世界有哪些问题需要解决呢?有这么一些问题可以思考: 现在整个世界的信息化程度是偏高还是偏低? 程序员的人数够用吗? 软件行业的生产力是偏高还是偏低? 大部分软件系统都可靠吗? 我想说说自己对这几个问题的理解. 虽然现在我们的生活与十年前相比,已经发生了巨大变化,比如智能手持设备已经非常普及,

New issue 老码农的技术理想

小时候,老师问我,你的理想是什么?我不假思索说是工程师,于是长大之后果然成了工程师. 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大悟,原来就是:用技术手段改进世界. 那么,在软件方面,目前的世界有哪些问题需要解决呢?有这么一些问题可以思考: 现在整个世界的信息化程度是偏高还是偏低? 程序员的人数够用吗? 软件行业的生产力是偏高还是偏低? 大部分软件系统都可靠吗? 我想说说自己对这几个问题的理解. 虽然现在我们的生活与十年前相比,已经发生了巨大变化,比如智能手持设备已经非常普及,

写给码农们:从业互联网13年 才觉得卖卤菜比找风投上市靠谱

中介交易 SEO诊断 淘宝客 云主机 技术大厅 黑客登场 十多年前的一天晚上,警察突然冲到了我家,把我带到省公安厅录口供开始,我的互联网人生从此拉开了序幕...(PS:肯定你要问为什么要被带走?因为当时高三逆反,反对应试教育,把省招办网站黑了改成了黄色网站,当时我高考的头一天上了当地报纸的头版头条,详见2001年7月6日的<天府早报>和<华西都市报>) 作者:webnetmax123 [黑客二次登场] 懵懵懂懂的我拿到大学会计专业的录取通知书,问我爸:"会(我读的huì)

自动写代码工具要颠覆码农?

自动写代码工具要颠覆码农? 时间:2014-11-14 09:23 来源:百度百家 作者:小谦 摘要 : 人类总是会对自己的未来充满了焦虑,在我们对未来心存怀疑的时候,任何一则"消极"一点的消息都能让我们更加否认自己的未来,这一心理近日在对程序员前景心存质疑的人们身上,非常明显. 人类总是会对自己的未来充满了焦虑,在我们对未来心存怀疑的时候,任何一则"消极"一点的消息都能让我们更加否认自己的未来,这一心理近日在对程序员前景心存质疑的人们身上,非常明显. 日前,据 网

写给立志做程序员(码农)的大学生

作者: 果冻虾仁  来源: CSDN  发布时间: 2017-08-10 23:08  阅读: 32769 次  推荐: 158   原文链接   [收藏]   写给立志做码农的大学生 确定方向 选择比努力更重要.       关于方向的选择其实越早确定越好,生活中我们要面临无数个选择,前几天看的一个黑客相关的美剧中有句台词说的不错: life is binary.       生活就是二进制,一个个0101组成的.每一次抉择,选了就是1,不选就是0.另外也有一句话说:"人一生要面临很多选择,但