抱歉,我是开发,你居然让我写单测[视频]

抱歉,我是开发,你居然让我写单测[视频]

吐槽一下吧,最近工作不是很有激情(难道又职业倦怠?其实老油条还觉得我是职场新人😂)。 我自己之前是有坚持写博客的习惯,主要是工作学习的一些记录吧(自学 py 励志之旅)。最近其实发现,技术越是深入的文章在知乎上越没什么人点赞,比如我关注的一些写lisp、分布式的,反倒是小白文章一群人围观,情感爆款心灵鸡汤各种人点赞,娱乐至死的年代大家还是喜欢不用动脑子的东西。

慢慢我也熟悉一点套路了,现在只写科普的文章,并且最好是标题党,我最近俩专栏《python学习之路》和《vim装逼指南视频教程》都越来越标题党,当然我还是会尽量保证内容对读者有帮助。(或许女装直播看滴人多) 其实感觉写文章动力越来越不足了,一来越来越懒,二来我乎实在激励措施不够,我写了这么多东西,录制了不少视频,目前只收到过25块钱打赏,一个是培训班老师,一个是python营销号(在此感谢你们), 花了这么多金钱、时间和精力(买软件、买手写板等倒贴)收到的钱还不够中午吃一顿麻辣烫(有妹子想吃可以联系我,坐标北林),几乎没有任何投入产出比。其实之前有些知友私信我要不要出书(我写过入坑指南讲了python web 后端技术栈)或者要不要兼职培训讲师,我都给拒绝了。 出书感觉很麻烦,主要是得有体系,兼职讲师吧又感觉工作不久不算资深(我乎牛逼的工程师太多,人家也懒得写小白文),怕坑了学员(似乎很多讲师水平也就那样,python根本没啥太多业界实践经验,看了几本书就敢给学员讲)。 现在我也想开了,如果有业余需要兼职讲师(远程培训)的我也不会拒绝了,就当挣点外快了(我将传授我毕生所学手把手教结对编程,python/web框架/算法数据结构/数据库/工程实践/面试求职等),很多公司带新人都是 mentor 制,感觉非常有用。钱还是最好的激励措施呀,也该考虑考虑人生大事了。

上期讲了如何应对面试中的白板编程,以及手撸一个 lru cache, 这次录个视频讲讲 python 编码中的单元测试以及真实项目里会涉及到的软件工程的一些东西,我们还是用白板图解+编码来演示(我觉得这是一种很好的学习和演示方式),单测是很多野路子程序员和初入职场的学生不重视的点之一。

你一天可能花几个小时撸了几百行代码,但是测试同事和其他开发同事可能要花更多时间来修复你代码中的缺陷,并且开发周期越靠后, 发现和修复 bug 的成本也急剧升高。 研究显示,一个程序员每天产出的工业级可用的代码通常不会超过两百行,而且不同程序员之间的效率甚至有数量级的差异。 一个高生产力的老鸟如果离职了,即使你立马找10个菜鸟顶上也无法产生同样质量的软件(并且更多程序员在交流时会产生更多问题并损失生产力)

我们先来思考一些问题,不知道你有没有碰到过,这些是我之前经历过一些糟糕的代码仓库所碰到的:

  • 看一个函数正不正确还是靠 print,print 两下没问题就意淫代码是正确的了
  • 每天写的代码行数很多就是生产力高吗?我花了1个小时写的代码有bug,结果需要别人用3个小时给我擦屁股该怎么办?写单测是否是浪费时间?项目给的开发时间非常紧迫怎么办?
  • 几乎天天被报 bug,每天的工作职责就是修复bug (继 重构工程师之后的又一新职位:杀虫工程师)
  • 如果你写了一个巨复杂的算法或者牛逼的 api,没有单测,别人敢用吗?
  • 你发现了代码里有一个函数可以大幅优化,想重构一下,于是乎你打开编辑器撒丫子就上去改了一把,结果一上线跪了。怎么保证你的改动没有问题呢?你能确保上线后不会一堆用户来骂?
  • 哪怕你只改了一行代码(bug 中的万年虫:拼写错误),就要测试同事辛辛苦苦重新测试整个流程吗(回归测试)?效率会不会太低了?测试同学说,你丫的离职吧,不要给我们添乱了。
  • 你接手一个新项目,发现不但代码写得狗屎,而且还一行单元测试代码都没有,本来 python 也不好维护(此时我一般会先 git blame 看看谁写的,然后在心里默默问候他祖宗),你敢上来就改代码吗?会不会又是一上线一堆用户老爷过来骂,哪个傻逼程序员又写一堆 bug

如果你遇到了类似的问题,或许单元测试是一个比较好的解决方案。现代软件功能越来越复杂,代码越来越膨胀,复杂度控制和质量保证也越来越困难, 但是如果能从小处着手,保证我们写的每个函数、类都没有问题,就能大大降低软件出错的概率。

  • 什么是单测?为什么单测很重要?为什么很多公司的代码项目里没有单测?单测是否只是浪费了开发时间?为什么软件工程里的有些东西是反直觉的?
  • 如何写单测?python 里可以使用哪些工具。py.test , when-changed 监控文件变动自动执行测试
  • 测试用例怎么写?边界值、正常值、异常值、等价类划分等。测试是如何影响代码设计的?
  • 什么是 TDD, 我们需要用它吗。如何在 Python 中实践 TDD
  • 为啥测试只能证明代码有缺陷,而不能证明代码没有缺陷。测试的度的问题,覆盖率、测试点等。

以上是我的一些浅见,测试其实也有很多东西,比如如何 mock,patch,怎么测试 web 接口,怎么处理网络调用和数据库查询等等。有什么没有提到的可以留言交流,也欢迎投稿呦,希望做成油管上视频 channel 的形式。视频专栏投稿内容可以是 leetcode 题解、工程实践、框架学习等等。如果你有什么想了解的也可以留言,说不定下期就会讲到。


以下是视频,我以一个简单的二分搜索来说明,二分查找的思想非常简单,但是距离二分思想的出现和第一个完全正确实现的二分查找算法中间间隔了数年,并且 java 标准库中甚至曾出现过计算中间位置的时候 (beg+end)/2 整数溢出的 bug,在一些无法自动调整数值范围的编程语言中,你应该用 beg + (end-beg)/2 来计算中间位置。

https://www.zhihu.com/video/965562918401736704张帅:每个程序员都应该会点形式化证明zhuanlan.zhihu.com图标

编辑于 2018-04-10

文章被以下专栏收录