Category Archives: 程序人生

Code Review CheckList

在关于高效代码审查的博客中,我们推荐使用清单(checklist)。清单是代码审查中的伟大工具——他们确保审查在团队里持续高效。它们也是确保常见问题被识别、解决的方便途径。

软件工程协会的研究表明,程序员常犯的错误有 15-20 种。因此把这种错误增加到清单里,你就能确保在它们出现时指出来,帮助消除这种隐患。

为了让你开始建立清单,下面是经典的条目列表:

代码审查清单

总体

  • 代码能运行吗?代码实现了想要实现的功能了吗,逻辑是正确的吗,等等。
  • 所有代码都很容易理解吗?
  • 它遵循了你们都同意的代码规范吗?规范通常包括花括号的位置、变量和函数的命名、行长度、缩进、格式和注释。
  • 有多余的或重复的代码?
  • 代码尽可能模块化了?
  • 全局变量能被替换?
  • 有任何被注释掉的代码?
  • 循环结构里有固定的长度值和正确的结束条件?
  • 有代码可以被类库函数取代?
  • 日志和调试代码可以被移除?

安全

  • 所有数据输入都被校验(为了正确的类型、长度、格式和范围)和转码了?
  • 第三方工具集在哪里用到了,能够返回被捕捉到的错误吗?
  • 输出值经过校验和转码了?
  • 不合法的参数值得到处理了?

文档

  • 有文档吗,文档描述了代码意图吗?
  • 所有的函数都加注释了?
  • 任何不寻常的行为和边界处理都做说明了?
  • 就第三方类库的使用和功能写文档了?
  • 所有的数据结构和测试单元都做解释了?
  • 有不完整的代码?如果有,它应该被移除还是打上’TODO‘之类的适当标记?

测试

  • 代码可测试吗?比如,不要增加太多的或隐藏的依赖,不能够实例化对象,测试框架能够使用方法等。
  • 有测试吗,它们全面吗?比如,至少包含了你们认可的代码覆盖率吗?
  • 单元测试实际地测试了代码正在实现的目标功能了?
  • 数组检查’越界‘错误了?
  • 测试代码可被已有 API 的应用取代吗?

你还可以为清单增加一些语言相关的问题。

该清单故意没有包含所有的问题,你并不想一个长长的清单,以致于没人去使用。只需覆盖常见问题即可。

优化你的清单

把该清单做为一个起点,你应该针对具体用例进行优化。有个不错的办法,那就是让你的团队在代码审核时,花一点时间提出所产生的问题。有了这些数据,你就能够甄别出团队的常见错误,然后就被改造成常见清单。要确保删除那些不会发生的条目(你或许希望保持较少地发生,还有诸如安全相关的重要条目)。

集思广益,及时更新

做为通用法则,清单上的条目应该是具体的,如果有可能,你可以就此做一份二元决策【注1】。这有助于避免判断上的矛盾,与团队分享清单,并得到他们对于内容的认同也是不错的主意。确保定期审查清单,检查每一项以确保仍然相关。

有了优秀的清单武装,你就可以增加代码审核中的瑕疵数量。这有助于你提升代码质量、避免不稳定的代码审核质量。

为了更多地了解 Fog Creek 上的代码审核,请观看下面的视频:http://fast.wistia.net/embed/iframe/vigy79tuhq

from:http://www.techug.com/increase-defect-detection-with-our-code-review-checklist-example

 

做程序员你需要明白这九件事

(本文为 Medium 驻站作家 Manual Elbert 撰写,以下以第一人称叙述)

三年前我在巴塞隆纳的神经科学实验室工作,忙着把电极贴到人身上、教认知系统的课,而现在我靠着设计、编写软件维生。

当然从前我在研究科学时就写过很多软件。如果你想要看懂 40G 的脑部扫描资料,你必须捲起袖子写些语法来处理这些数据,而我一直都是个很好的程序编写者。但直到我辞去了我的学术工作(可能也告别了我的学术生涯)并开始在一个小而有野心的新创公司工作之后,我才真正知道什么是软件工程师,以及在这一行是怎么回事,并不是知道更多程序语法、资料库、演算法跟设计模型就好。

如果我在读研究所之前就知道这些事情就好了,将会让我的工作生涯变得更轻松。这是一些对年轻的我的忠告,是我过去三年所学到的经验,不得不说,有些实在不是那么美好。

  • 1. 不要高估天赋的价值

年轻的时候,如果你很聪明,你便可以遥遥领先其他人,如同小池塘里的一只大鱼。如果你那半调子的口才很好的话,那么聪明的功效还能加倍。事实上,聪明加上口才好能够让你不用念什么书就顺利度过高中跟大部份的大学课程。(不过你还是得念物理,你总不能说服一个等式转弯)。

恭喜你,你很幸运,同时却也十分不幸运。因为当你毫无阻碍的就冲过了求学的终点线,对待学习如反掌折枝。在这同时别人必须去学习勤劳、坚持、人际网路这些之后远远比学识更加重要的东西。

我们的社会太过重视聪明才智了。当我跟人们提到我以前专攻神经科学,大家都会说:「哇,你一定很聪明」。的确我不是笨蛋,但我知道很多人也许不如我这么聪明,却是远比我好的神经科学家。

聪明才智当然还是能帮你打开一扇门,但绝不会帮你做好工作。勤劳、严谨、可靠的人际关系都是不只软件工程师,而是你跨出研究所的美好泡泡之后要成为任何专家都必须拥有的特质。

  • 2. 要对你的专业感到骄傲、乐在其中

这句话可能有点老梗,但对年轻的你来说仍然很重要:无论你做的是什么,都以它为傲,没有任何事情应该只被视为达成目的的手段。

不论对象是人或是试管,你都必须严谨分析你的资料并使你的统计数据有效,然后再重来一遍,因为有时候你会发现你犯了哪些愚蠢错误。如果你无法乐在其中,仅把这些步骤视为出版论文或发行产品的必须过程,那么你永远无法真正擅长这件事。

如果你是写软件的,这代表你要规画你的特色、研究现有的开源代码、学习新的模型与程序语言、修復你的错误、重建程序码并且维护它。如果你没有想要精通你工作的野心,那无论你是科学家、工程是或是任何你在做的工作,可能都只是浪费时间。

你可以拥有一些「宠物计画」,一些小小的、有点蠢的、并不一定能满足你的即时目标、你只是因为「享受」在做这件事情。有趣的是,这在软件社群里似乎很常见:许多我们现今正在使用的产品大部分都来自某人的宠物计画,而几乎不是来自科学圈。我最喜欢的名言之一是来自奥地利动物学家 Konrad Lorenz:

「对一个研究科学家来说,每天早上吃早餐前都抛弃一个宠物假设是好的晨间运动。」

如果你觉得这听起来很蠢,也许你不该当一个研究科学家。

  • 3. 学习新工具/新技术

作为上一点的延伸:投注时间学习新工具。不只是拓展你的抽象知识,而是实际去学那些能帮助你完成事情的工具。这很快就能见效。

一个学习新工具的好方法是上述的「宠物计画」。每次你要建造新东西时,也用新的方法建造它。记住,宠物计画就是拿来失败用的,你投资不多、你学到一点东西;如果计画不成功,或是你失去兴趣、或是你发现实在有点太难了,你不会有损失,不会伤到自己。

如果你从事学术工作,以下是我强力推荐的好东西:

(1) Git 跟 Github

Git 帮助你管理你的工作,再也不用担心备份问题;而 Github 上有一堆很好用的程序码,你不需要自己重造轮子。噢,请记得跟你的同伴再确认一次你的程序码。绝对不要用程序码来分析那些只有你看过的资料。(我不敢相信我得告诉你这件事情啊,年轻的自己。你一直以来都是一个好的程序编写者,但我仍然做了那些可能会被忽视的错误。如果不是有再检查一遍,我不会发现因为程序错误,有百分之三十的科学结果可能是假的。)

(2) 一个绘图软件

我通常都用 Inkscape,但标准的 Adobe Illustrator 跟新的 Sketch其实也一样好。用这些绘图软件来先处理你的图表和计画,这通常都比你在 Matlab 或是 matplotlib 上写绘图指令来得容易。

(3) 学习如何有效的利用你的文字与代码编辑器

Sublime Text 是个比 VIM 或 Emacs 来得容易学会的编辑器。知道捷径能够帮你省下一堆时间。

(4) 学习如何说话

看看 TED 上的演讲并注意这些讲者如何在十五分钟内就抓住观众,同时说出那些吸引人的故事。你可以在镜子前面练习,你的肢体与声音都是工具。

(5) 知道基本的 Python、R、HTML 跟 Javascript

这些工具可以帮上不少忙。如果你对写程序并非一窍不通,那学个新的面向编程或资料库。玩玩计算机视觉、自然语法编写、网页撷取、音乐合成跟机器人!

你所能看见解决问题的方法,永远都会被你所使用的工具所限。学习新工具代表你用新的角度看问题。如果你是大学生,我强力建议你一周之间拨出一天来学习新工具。如果你开始做硕博士研究,那就拨两天出来。长期来看,你会省下很多时间,而人们会被你的效率所惊艷。如果你觉得这听起来太困难、你没有时间、其他压力太大,那就跟你的老朋友谈谈,看看到底什么才是值得你花时间去做的。

  • 4. 成为真正的局内人

正常来说,你的长官或 CEO 会做出对机构或公司最有利益的事情,毕竟那是他的职责。

当我们说到「公司的最大利益」,其实我们是说某些局内人的最大利益。真正的问题是,你的长官或 CEO 到底把谁当局内人?这些利益共享者的利益又有多重要?

如果你的老闆认为他自己是唯一的获利者(越出名越好、越快获利越好),你最好快点逃走,逃得越快越好,不然你会被当成牺牲品。那谁才有资格利益共享?你的投资者或贊助者?员工?学生?人类?重点是:快点找出来。如果你不被当成受益者之一,那就快走。无论你有多爱你的工作,那都只是一厢情愿、被滥用的关系。

  • 5. 学会展现成果

「Shipping it」变成科技界一个相当流行的词汇,意即把你的产品从仓库拿出来给客人。但除了字面上的意思,它其实还有一种精神层面的意涵:你的东西要到了客人手上才会有价值,而这应该是你一直以来的目标。

在学术范畴中,我写的大部分软件都只会在一个系统上执行一次。为了产品而写的程序则是完全不一样的东西,这会让五十万人使用,而当写程序成为我的专业时,我发现我并不擅长这件事。

但这同时也代表琢磨好几年,直到完美产品诞生是没有意义的。你只要做出一点成果,就把它送出去,写一份最简单的报告你就有可能被录取。晚点再担心更复杂的学问吧,先搞定基础,尽快发表它。Just ship it。

  • 6. 懂得 80/20 守则

80/20 守则基本上是说,达成你预期目标的 80% 需要花你整个企画 20% 的时间,而剩下的 80% 时间就是拿来搞定剩下的 20% 目标。这就像你从郊区开车进城市,你用两成的时间开了八成的距离,但只要你遇到塞车,最后的两成距离会花你超久的时间。

这重要在哪?因为人们总是低估计画所需的时间,科学家跟工程师尤其常这样。这部分要归因于经验:你知道得越多,你越能预测之后有什么会出错、以及有什么是人们一开始不会注意到的有趣东西。

如果你还没有这些经验,只要把你预期所需的时间乘以五倍,并且预想五倍时间过后你就能达到「快成功了」的阶段

  • 7. 你没出卖你的灵魂

我念博士全都是因为一些错误的原因,其中一个我现在称之为「学术之罪」。我相信如果我没有追求博士,我就是浪费了我的天份,我觉得我亏欠所以在求学过程中给我帮助的人:教授们、帮我出奖学金的人等等。但我并没有,他们也许投资了我的学术未来,也或许对他们的投资没有兑现、没制造出一个伟大科学家而感到失望,但那是他们的问题,不是我的问题。

这跟做工作是一样的道理。人们总是会投资你,但那常常是因为这对他们最有利,而不代表他们买走了你的灵魂。

  • 8. 脱离你的舒适圈

以下是我如何看待这个世界的:

1-nUYG9kYTLBMxde_YNAw6hw

如果身边一切看起来很熟悉,代表你能学的东西极少。但如果你现在处于非常惊慌的状态,你可能什么都没学到。

在舒适圈内,你熟知圈子里的每个人、那里是你的归属,你知道如何应付问题,太阳底下没有新鲜事。如果你想学些新知并成长,你必须离开你的舒适圈,那才是学习的开始、有趣的事情发生的地方。那是一个你无法对每件事立即反应过来的地方。

当然也有某些时刻你会被压垮,那就是惊恐圈,你在那里昏倒、你所能做的只有勉强维生,并期待某人快来救你。

最棒的地方就正在你的惊恐圈正前面,那里才有挑战、你会在那里学到最多、改变最多。想办法去到那里吧。

「忘记安全。在你所畏惧之处住下。摧毁你的名声。变得恶名昭彰。」-鲁米,伊斯兰神祕主义诗人

  • 9. 学会驯服你的躁动

舒适坐好、闭上眼睛并正常唿吸。专注在你吐出的空气,通过你的鼻腔抚过你的上唇,没别的,就专心做这件事。

你刚刚专心了多久?五分钟?恐怕不到。

一分钟?很好。

比二十秒更少?恭喜你,你是正常人。你的脑袋就像猴子一样,会抓住最近的树枝。在学术上我会换句话说 …… 说好听一点是「联想思考」。如果你想要有创意,联想思考是很好的事情,但它却是专注力的杀手。

好消息是,你能学会如何专注。外面有一卡车的「提升生产力的技巧」,但他们都只抓到皮毛,你不会想要一个分心自由写作的软件,你想要永远抚平你猴子般跳来跳去的思绪。

对我有效的跟对你有效的可能完全不同。对我来说,定期静坐冥想非常有效(同时有其他许多优点与副作用),但就算是冥想静坐也有很多种不同的形态与传统,而我不可能找到一个对大家来说都适用的。我所建议的,是让你的意识保持一定的型态,并且很认真的对待它。你认为静坐是浪费时间吗?你会去健身房健身,但你应该要两倍的时间在脑力运动上。

只有好好地集中精神,你才能一步一步完成所有的目标。

from:http://www.techug.com/9-things-i-learned-as-a-software-engineer