本帖最后由 冯海霞 于 2013-1-7 11:08 编辑
3.理解你的代码 生活中充满了奇妙的神秘,但你的代码可不适合出现这些神秘。你不必知道你的车怎么工作的——如果引擎发出奇怪的声音,把它交给汽车技师就好了。但换成是你的代码,如果连你都不知道它是怎么运行的或出了什么错,那就没人知道了。 有自己的编写风格 我童年时的钢琴教师是这么评价我和我姐姐哥哥的:“你姐姐的时间感强,你哥哥的键盘打得不错。”然后他停顿了一下说:“你嘛,嗯,你很努力。” 编程是一种有些人能做有些人不能做的事,但还有一些人则是天才。虽然我有过多年的练习,钢琴还是弹不好;虽然我那么喜欢打球,水平仍然一般般。但我确实认为我有编程和写作的天赋。不要吃惊,我认为好程序就像好散文。散文和代码都是文本,有语法、句法、拼写和语义。对于大多数写代码的人和写作的人,有这些就够了,但好作家和好程序师还要有一种美感,他们的作品在结构和风格上是有特点的,往往能借此识别出作者。 许多Windows程序师都感到好奇:为什么坏脾气的老Unix/Mac/Amiga/Lisp程序师对Win32/MFC/.NET很不满,但如果所有应用界面都来自Microsoft,你可能就不知道还有什么东西是更好的。 复制粘贴 风格化编程的反面是复制粘贴。从什么地方复制一些可能有用的代码,稍作调整,合并,重复,然后就大功告成了。你的软件简直就是大杂烩。 离开一家公司的几个月后,一位前同事电邮问我,他复制粘贴了十页的代码组成一个算法,为什么运行不了。我实在不知道怎么回答了。如果你不能解释你自己的代码应该是怎么运行的,你还指望谁来拯救你? 我甚至在诊断自己从样本代码复制粘贴过来的代码时也犯过难。从复制粘贴开始新代码是合情理的,但你不能因为看起来能运行就放手不管了——你得返回去看看你是否读懂了每一条,根据自己的目的理清代码。 清理代码 保持你的房子/公寓/房间整洁的最好办法就是每天花一点时间清理它,或至少每周清理一次吧。如果等到住所乱到一定程度才打扫,那么这麻烦就非常大了。除非你雇个清洁工。 假设你没办法奢侈到雇一个人每天帮你清理代码的程度,那么你就应该定时地检查你的代码、清理累积的死代码、淘汰过时的注释和错误的名称,否则你必定会得到一份不敢拿出来见人的代码。如果你不觉得丢不起人,好吧,你行。 我指导过的一名程序员总是向我报告,她的代码“完成”了。这是管理者乐意听到的话,却让我非常抓狂。她的代码从来没有做完——你得调试它、维护它、改进它,直到它彻底没问题。 问题?注释? 有些人认为编程是一门手艺活,也有些人认为编程是一项工程。更经常的是,它是一门考古学。你挖掘代码的沉积物,想知道这些奇怪的人工产品是用来干什么的。为后来人着想一下,留点线索吧。 我问之前提到的那位程序员“完成”注释了没有。结果是,一个函数名称为“GetData”的注释居然是“Gets data”。这不只是废话——简直是侮辱。什么数据?什么格式?来自哪里?更不要提像服务器不可用或传送中断时会怎么样这种小细节了。 将你的代码做成文档,以防有人随时要拿来用。可能要用的人就是你本人——想想如果不这么做,你得重新访问代码多少次啊? 与之前的一个老板合作时,他叫我浏览一段没人有时间看的代码。一开始,我认为它很糟,不知道写的都是什么东西。之后我慢慢摸索出来这段代码是干什么的,所以我勉强同意它不算太糟。最后我终于认出这货竟是我两年以前写的。教训:多留点注释。 当你写代码时,记得注释,而不是等着出现什么方便的清理短语——注释你的代码,让它甚至可以清楚地反映你在编写时的想法。你可以成为自己的编写伙伴。 现在你可以用javadoc和doxygen等生成漂亮的HTML或来自源代码注释的其他格式化的文件。理想的情况是,你每天晚上做的就是doc生成的部分,可以通过你的内联网获得。 注意警告 无视编辑器和运行时间警告会害到你自己。有“警告”就有原因。 我曾做过一个基于Unix的应用,它不能成功地连接某些函数。我们通过在运行时再次连接这些函数解决问题。六个月后,当我们执行一个干净的新版本时,我们才发现原来我们关掉了能提醒我们未知连接漏洞的警告。在供应商的斥责下,我们将连接问题解决了。但结果是,原来我们只要通过重新排列库就能连接上了。 提高编辑器的警告水平,注释代码以及记录创建和运行时间的警告信息,最好包括解决警告的标准,这样你就会知道是否解决问题或忽略问题。 4.优化编程 带着目的写代码 复制粘贴代码的人的另一个极端是,只是为了让代码看起来更漂亮(至少对他们而言)而改变代码。虽然有编程审美感是值得赞扬的,但改变代码以便让你觉得漂亮只是浪费时间(无用的冒险)。浏览并改变别人写的代码,让它看起来更漂亮,真是让人生气。 我有一个挑剔的同事,浏览我们的代码库时将所有的附加语都删除了。如果他只是清理了入门级员工写的代码,那可能没人会说什么,但那些附加语是我们团队的技术领导写的,他可是我们公司最出色的人物之一。 不要搞破坏 “代码重构”现在十分流行,但程序员往往以为它是指代码清理或重新设计。这个技巧是指重新组织代码,同时不破坏其他东西。如果你以改进的名义破坏已经存在的功能,那么你的意思就是:要么你的时间比其他人的时间金贵,要么你不破坏就不会整代码。 我有一个特别讨人嫌的同事,他决定重新执行我们系统中的解析器,但结果让代码变成其他所有人都不知道怎么写了。我让他恢复原状,之后发现代码能编写了,却不能运行了—–问他怎么回事,他说“应你的要求”,他移除了整个解析器。真没团队精神。 保持代码运行需要一些耐心和额外的工作——你勤奋地回归测试你的工作,在将函数添加到新代码中时,你可能需要暂时留住老代码和界面。但对于所有与这个代码库有关的人来说,这是必须做的。 找到瓶颈 人们总是谈论“最佳”,但这不是一个正确的词。我们极少将最佳作为目标——相反的,我们的目标是改进和权衡以达到足够好的表现。 在谷歌的电话面试时,我被问到如何在一组有序的数字中搜索某个数字。显然,提问的人是在问二进制搜索法。但在现实生活中,我可能会做出“错误”的选择——从头找到尾。如果程序表现足够好了,还花两倍的时间写两倍的、必须维护和调试的代码,那是毫无意义的,特别是如果那段代码并非程序的瓶颈(我严重怀疑如果那个数据是瓶颈部分,你居然还会将它线性排列)。 如果你确实需要在程序的速度或空间方面达到最佳,折腾除了瓶颈以外的其他任何部分都只是浪费时间。
|