《卓有成效的工程师》一点读书笔记
开始打工之后,读书的时间越来越少,每天 Twitter 上逛 1 个小时,每周读书不到 10 分钟,微信读书的年会员算是白开了。
等电梯、坐车的时候拼拼凑凑终于读完了《卓有成效的工程师》这本书,简要记录一些读书笔记。
1. 关注重要而不紧急的工作
在工作四象限里面,通常是第二象限中的工作。比如
- 个人发展。比如学习新技术,提升自己的能力。
- 合作关系建立。比如与同事、客户沟通,周末聚餐,团队活动。
- 计划与总结。
类似地,跳出工作之外,还有个人成长,比如锻炼身体,阅读书籍,学习新知识等等。
这类任务通常没截止日期,也不紧急。但长远来看,这些任务对个人和团队的发展都能提供强大的价值。
2. 论代码测试的重要性
一些个人(Python)小项目上的代码写的都比较随意,经常在改动之后,不进行任何测试(当然也没有代码 review),直接推送到 github 上,然后借由 github workflow 部署到服务器。
Python 是一门解释性语言,对些对于一个潜在的代码 bug(比如数组越界,变量使用时拼写错误),必须等到代码执行到这一行才可能触发。 静态型语言如 C++, Rust 在编译阶段可能就能够发现这些错误,但 Python 必须结合测试才能发现。
对于这个问题,前前后后踩了很多坑,但没有特别重视,毕竟对于个人小项目而言代码挂了就挂了,也没有什么大的影响。比如我现在有一个文章聚合的小项目,功能是定时从特定 rss 源上获取最新文章,聚合过滤之后统一推送到 Telegram Channel 里。 但前几日在配置文件上犯了一个极低价的错误———Python 列表中有两个元素之间少加了一个逗号,代码部署之后,两天内没有收到任务 rss 文章推送,而正常情况下一天内可能平均接收到几十篇文章的推送(看得完吗朋友)。直到闲时线下跑了一遍服务,才发现了这个问题。
但不写测试是一个不好的习惯,哪怕是针对个人小项目。像《卓有成效的工程师》这本书里面也提到了,习惯是一种思维模式,它能主导一个人 90% 以上的行为。这种习惯也会从个人项目中慢慢蔓延到团队项目中,它不仅影响团队的代码质量,也可能在某次代码 review 没有发现特定 bug 的情况下,导致线上重大事故的产生。
测试代码的比重
前两天稍微看了一个 Pyshorteners 作者的测试代码,作者使用 pytest 简单有效的进行了测试验证。测试覆盖率越高,就能发现越多的错误。一位 JS 大佬 https://quick-lint-js.com/blog/cpp-vs-rust-build-times/ 写了一篇博客,将 quick-lint-js 的部分代码从 C++ 迁移到 Rust。我看到他的代码中测试代码的比较,有点吃惊,无论是 C++ 实现还是 Rust 实现,测试代码的比重基本上都在 45% 左右。
但思考一下,这个量也是很正常的,每一次增加新功能都应该对这部分代码添加测试,或者对核心的功能添加测试。 测试代码的一个好处是可以跟随项目增量添加且测试可自动化。如果一次变更只涉及了新增功能,那么已有的测试代码就不需要更改,结合 pytest, unittest 等测试框架,测试代码的可维护性也是很高的。
3. 持续学习 -《卓有成效的工程师》
培养成长型思维,不论处于人生的什么阶段,都要保持学习的态度。学习是一种习惯,是一种思维模式,是一种生活态度。
- 学习新的编程语言及开发框架
- 学习市场需求旺盛的技术
- 阅读
- 书籍提供了一种从别人的教训和错误中学习的机会,这是一项高杠杆的投资,能够帮助你避免重复犯错。
- 加入讨论小组
- 参加讲座、行业会议和线下聚会
- 关注那些传授技能的博客
- 为教学而写作
- 拓展兴趣项目
- 培养业余爱好