程序调试心得

1.首先建立从改动到输出的管道 必须保证你改的代码,可以很方便地看到结果(或影响)。可见是可控的必要条件。 2.尽可能缩短反应链 尽可能缩短输入改动到输出改动的时间,最好是所见即所得(WYSIWYG)。曾经做过一个项目,在做出某些修改后,需要先编译半分钟,然后把编译后的文件上传到服务器上,再重启服务器,才能看到结果的改动,特别崩溃。这就好像大型食草恐龙的神经系统一样,切下它的尾巴,大概半分钟后神经信号才会传到大脑。 动态语言(python、javascirpt、ruby等)在这方面有天生的优势,而静态语言(c++、java)则可以通过IDE的自动编译和自动化脚本来缩短反应链。如果IDE不可用,编写自动编译脚本和测试工具绝对事半功倍。如果反应链无法缩减,那么做出任何改动之前都必须深思熟虑,还得有那么一点运气,再加上代码是你自己写的,才能一针见效。 3.理性思考的能力对于调试是很重要的,包括: 做出假设(问题出在哪里),然后以最小的代价(以时间或代码量来衡量)来验证这个假设。 单变量控制。一次改动太多的地方,就无法判断结果的变化是哪处改动造成的。 分离有问题的部分,做手术的创口尽可能小。这和上面提到的缩短反应链是一脉相承的。 极端情况下,也可以合理使用暴力手段。比如使用log或其他手段,只能定位到bug出在file1的第10行到第30行中间(假设顺序执行),那么可以用折半查找法,在第20行输出调试信息… 4.善于总结 问题的出现往往是重构的机会,一个bug往往能牵出更多的bug。如果同类的问题频繁出现,有可能标志着编写者思考方式上的漏洞。 class的职责是否不够清晰和专一? 是否缺乏合理的错误记录和处理机制?文档结构和变量命名是否规范、无歧义? 擅长总结,有助于编写者认识和弥补这些思维和编程实践上的不足,从而提升职业素养。 5.源代码管理是你最好的朋友 问题往往是日积月累才出现的,而且往往无独有偶。在着手解决bug之前,先看看有没有类似的bug被提交或解决过。除了查看代码本身的注释,也要查看出错文件的提交历史。当然,前提是大家在提交代码的时候能提供有用的注释。 6.持续重构,持续思考 排计划时要为重构预留出时间,定期做代码质量的改善,比如每周抽出1天时间来重构、写注释和说明文档。这有助于减少技术债务,提升编程能力。

2013年12月5日

如何使用互联网解决编程问题

1.学会使用关键词来描述问题 虽然搜索引擎的自然语言理解能力在进步,但现在还不能无障碍地和人类交流。要向搜索引擎请教问题,必须要用它的语言——关键词。 关键词之间必须要加上空格, 以免不好的分词系统造成对你要求的误解。 有的时候用关键词描述问题能更好地帮你看清问题的本质,即:要描述或定义我的问题,哪些词是不可能绕过去的?哪些词能帮我迅速缩小搜索的范围? 2.客观地描述问题本身,而不是预想的解决方案 看过一个很有意思的评论: 用户的需求不是买电脑,而是玩魔兽。 用户常常会把自己的解决方案当成需求提给你。 问路的时候,请不要说“附近哪有487路公交车站”,而是直接询问如何到达最终的目的地。当地人可能会给出更直接、更快捷的交通路线。 3.尽量少做假设 当你在论坛问“为什么我一用你们的软件就死机”的时候,其实你假设了 a) 别人知道你的软硬件配置 b) 别人知道你近期做了哪些操作,或者说,你认为 c) 以上这些信息对于解决问题没有意义。 一方面要提供有助于定位和解决问题的信息,另一方面要尽量使用大家都知道的词语或常识等。不要假设能解决你的问题的人和你有同样的认知水平。 很多时候假设是潜在的,所谓“当局者迷”。这时候,对结果的分析就很重要,有助于你认识到自己做了哪些假设,哪些假设是符合意图的,哪些是不合理的。 4.根据搜索结果中修正你的关键词。 搜索结果和你预期的不一样,一般有两类原因:1.你提问的方式不对,导致搜索引擎(以及搜到的回答)是基于一种错误的解读。 2.你提问的方式正确,但是问题本身,不是你想的那样,你需要重新审视你的问题。 对于第一类,你可能需要修改你的关键词,它是不是太宽泛,还是太狭隘,还是有歧义?等等。 对于第二类,你需要重新定位和描述你的问题,了解它所处的领域和背景。 简单地说,要么换个问法,要么换个问题。 5.寻找和关键词同义的核心词汇 书上的信息与网上搜索得到的信息有一个很大的不同:一本书上的信息是用一种相对统一的语言风格来传达的,你能大致预期作者会怎样去描述一个东西。但是互联网上搜索得到的信息缺乏这种统一性,很可能语言风格差别很大的两篇文章,说的是同一个事。我经常会发现,对于一个概念,我使用词语A,而大多数人都使用词语B,即B是约定俗成的“术语”,这时就要用B来代替A作为我的搜索关键词。要做到辨别这一点,必须总结一些特定领域的核心词汇,也就是上文提到的不可能绕过去的那些词。 6.信息的来源和信息的内容同等重要,甚至来源比内容更重要 在搜索决策上,去哪搜>搜什么>怎么搜。 举个例子,形如“如何用A在B中实现C功能”这样的编程问题,直接在google中输入英文关键词,然后site:stackoverflow.com,一般都能命中。 再如,位置相关的搜索,如北京周边的美食、酒店什么的,百度的服务一般优于google的。 高大上或者nerdy的问题就知乎、quora,而“见对象的家长该穿什么”,贴吧、天涯什么的更靠谱。 除了信息的来源,其他用户对信息的反馈(有多少个赞/up/star)也是衡量信息价值的重要标准。如果搜索结果可以根据反馈来排序,那就更好了,例如上面提到的知乎、quora和stackoverflow等问答社区。

2013年12月3日