一两个月前刚进新公司时,正逢部门内部搞技术交流,每人轮流给部门其他人做一次自己擅长的技术培训。部门内几个老员工,有讲 Nginx 模块开发的,有讲视频编解码的,也有讲分布式存储系统的。由于我刚入行,对公司业务完全不熟,无奈之下,索性说我就讲讲 shell 编程吧。于是花了一天时间写了个十几页的 PPT,其中强调了脚本中对异常分支判断的重要性。脚本不是命令行的堆积,在交互模式下,一个命令的执行成功与否一目了然,根据这个结果我们会很自然的执行相应的命令;可是在脚本中,就不能这么想当然了,最简单的就是,cd 到一个目录,该目录是否存在?

可是今天还是犯了一个这样的错误。

由于对中国移动全球通的扣费方式有些疑惑,于是在网上下载了上个月的话费详单,用脚本统计了下每笔话费的累加和。很自然的用 while read 读文件的每一行,在循环里对每一行 awk 取出话费字段,然后累加。由于话费是浮点数,用 bc 来执行加法:sum=$(echo $sum + $huafei | bc )。多么简单的思路,脚本写好,一执行却冒出一堆“(standard_in) 1: parse error”。很明显,这个是传给 bc 的参数格式错误,可怎么看都没看出问题。不得已只好使出bash -x,才发现,前部分执行是没有问题的,但从中间某一行开始就出现上面的错误,原来是保存话费信息的文本中间有些空行。那么用 awk 对改行执行获取单笔费用的时候就会获得一个空字符串,传到 bc 时就会报格式错误了。

这个问题实在太简单,并不值得一提。可是为什么会一直犯这样的错误呢?因为思维没有固化。程序员在外行人眼里是一个技术活,可我们自己知道,其实日常绝大部分的工作与高深的算法设计、架构设计是没有关系的,在这种环境下,判断一个程序员是否专业的最基本的方法就是基本功了,例如本文提到的异常判断。

看过一个雷阿伦练习三分球的视频,感慨颇深,在绝大多数情况下,他每一次的动作看不出任何差异。虽然我们自己狗屎运来了也会连中几个三分,可是稍微一喘气,动作就变形,动作一变形能不能进就全靠运气了。有人说,雷阿伦也有很多场比赛投不进三分,可他毕竟是 NBA 当之无愧的三分王不是吗?他也不是真的投篮机器,只不过通过训练,可以让自己离投篮机器更近一点,再近一点。

曾问过一个健身教练,真的有必要去健身馆吗?我自己每天就做做俯卧撑,你看我的肌肉不也还行吗?健身教练回到道,你眼里只有胸肌,我们看到的是 XXX 肌、XXX 肌、XXX 肌….对这些肌肉群的练习一个人的健身运动是专业的还是野路子的区别所在。

希望自己能真的吃一堑长一智。