2.4.1 工作闭环和边界判断
为了帮助新人快速上手,我将自己当初学习Pascal时的第一个例程借了过来。我给新人布置的第一项任务是:“快速复习阅读《C程序设计语言》前4章,然后写一控制台程序:已知内层和外层菱形的高度,输出一空心菱形”。
大家是否会感觉这是一个很简单的例程呢?实际上这是我精心挑选设计出来的一个例程,因为其中有很多的坑。这个例子本身并不复杂,一般通过公司层层筛选招聘进来的学生,总是可以搞定的,但想不踩坑是不可能的。
多年职场经历告诉我一个很高效的团队工作技能:让工作闭环。遗憾的是,现实世界中,经常给新人安排一项工作后,如果你不主动问,经常就会没有任何反馈了。经常让人感叹,工作做完了,就不能回复一下吗?这个例程中我故意设计了一个陷阱,让新人去体会这种不反馈的后果,然后在顺势培养闭环的这种工作习惯。
已知内层和外层菱形的高度,输出一空心菱形,这个例程中菱形的高度并没有被清晰准确的定义。按照常规理解,习惯性将整个整个菱形高度作为高度,此时需要较复杂的边界判断逻辑,如下:
- 内层高度>0;
- 内层高度<屏幕边界;
- 内层高度为奇数;
- 外层高度>0;
- 外层高度<屏幕边界;
- 外层高度为奇数;
- 外层高度>内层高度。
新人的第一个提交版本一般很难做出完善的判断,甚至有很多人都意识不到需要进行边界判断,此时,在我的刻意错误输入下,程序就会出现各种各样异常,如下图所示:
又或干脆是:
相比较网络或数据库程序,大多数工控产品代码规模并不大,但对程序质量要求却比较严格。因此,如何写出高效简洁的边界判断语句,是一个嵌入式程序员的基本功。回到该例程,如何简洁且有效的对菱形高度进行判断,成为写好该例程的首个关键点。
在该例程的边界判断有个技巧,如果能约定菱形的高度为菱形上三角形的高度,边界判断就简洁很多(此时程序实现也会简单很多),如下:
- 菱形内层高度大于等于0;
- 菱形外层高度小于约定值(屏幕边界);
- 菱形内层高度小于菱形外层高度。
概念的重定义刚开始可能会让某些新人有不适感。概念是为了目标而服务的,不然就需要增加两条奇数判断逻辑,程序简洁性也会打折扣了。在嵌入式软件中,为了简化程序构建各种各样的概念是经常的事,如为了程序架构清晰,基于小容量eeprom也可以构建文件系统,但又不同于我们传统理解的文件系统。
重新定义菱形高度这个概念后,该例程就需要重新描述了。此时,我一般会让新人用自己的话重新描述该例程,遗憾的是现实世界中很多人做不好,可能源于平时缺乏相应训练吧。该处,希望大家稍微停下来想一想,试着用自己的话清晰描述这个例程。
一个团队协作时,会存在大量的交流,而交流过程中,总是会产生或多或少的歧义,而恰恰是这些歧义会导致需求的不明确,会导致大量的返工,甚至会导致项目的失败。因此,我给新人的第一份工作要求就是:执行前,将任务用自己的语言表达出来,和对方确认后再实施。这一点在以后的团队协作中非常的重要,因此我早早的将这一点嵌入到了入职培训中。如该例程在实现之前能多问一句,我或许就会提醒边界判断,就可能少走一些弯路。
经过这么一折腾,空心菱形例程重新描述如下:“写一控制台程序,用户输入内层和外层菱形的高度,输出一个空心菱形。菱形的高度约定为菱形