和直觉相反,新手的大部分时间花在外围活动上,真正用来掌握核心业务的时间反倒不多

最近利用业余时间给朋友集成一台特殊用途服务器,专用板卡和驱动程序由第三方提供,我的任务是把软硬件集成起来,对上层软件提供API和demo代码。大约写了100行JAVA代码,配置脚本加起来20行不到,结果前前后后花掉整整一周的下班时间。

回顾整个工作过程,真正和业务相关的工作不超过3个小时,非常顺利。其实业务本身有一定专业深度,当年入门时仅仅是看各种英文规范就花掉两个月。朋友自己有非常熟练的系统集成工程师,找我操刀完全是因为业务背景的特殊性。因为有10多年没碰过该领域了,这3个小时还包括脑补该领域的最新标准,以及相关工具的使用。

大部分时间花在驯服工作环境上。实在没什么技术含量,花掉这么多时间,完全是因为手生。我平时工作在一个有严格配置管理的环境里面,从硬件到软件,操作系统到工具链,甚至编辑器都不会有任何意外。换句话说,在驯服环境方面,我是一个新手。好在给朋友估算进度的时候,预留了处理意外的时间。

Robert Martin有一本《代码整洁之道》,大部分内容是老生常谈,但是开场白里面引用的那个实验给人印象深刻。实验用屏幕记录的方式分析程序员的工作过程,发现程序员用于敲代码的时间少之又少,80%的时间用在把屏幕滚来滚去阅读代码。

我也回放一下整个过程,看看时间都去哪儿了?

一、开发demo程序,20分钟

比计划顺利。

二、服务器开机,一个小时

成功上电,10分钟。朋友用的是工控机,屁股后面插电源的地方有个开关,通上电,摁下开关,机箱里面的各种LED灯马上亮了,但是很安静,没有声音。正感叹现在散热技术进步,连风扇都省了,确发现显示器没检测到信号,反复进入休眠模式。幸好10多年前做学生的时候用过工控机,记得它前面板应该还有开关。找来钥匙,打开前面板,果然! 终于听到呼呼的风扇声了。

进入桌面,50分钟。朋友只发给我主机,没有显示器,凑巧我家有一台闲置的创维电视机,有VGA接口。可是天杀的创维,电视机把电脑画面的左边部分挪到屏幕外面去了,开机后登录框只能看到一半。一半就一半吧,输入密码,回车,咦!不对,怎么就进入guest模式了?朋友装的是ubuntu 14,我之前用过的最新的是ubuntu12,从来没有遇到过这个情况。倒腾了好半天,无意间拿鼠标点了一下登录框上面剩下的半个账户名称,然后再输入密码,进去了!ubuntu14这个莫名其妙的feature加上这个残废电视机,废掉我30分钟。进去以后倒是很顺利,调整了分辨率,显示器也工作正常了。

三、安装驱动程序,两个晚上

参照手册拷贝驱动程序,修改配置文件,加载驱动程序,运行验证程序,乱码+闪退。厂商提供了一小段示范程序源代码,加上调试信息,重新编译运行,原来是设备打开失败。本能驱使去检查kernel日志,发现安装驱动的过程中报告签名验证失败,上网搜攻略,可以在驱动程序中关闭签名验证功能,幸好供应商提供了驱动程序源代码,大喜,遂按照攻略关闭签名验证,重新编译、加载,问题依旧。

无奈之下求助技术支持。技术支持提议用QQ的远程桌面帮我调试,于是先下载wine-QQ,100M的安装包,慢慢拖下来,末了发现安装不上去。一直怀疑即便安装了wine-QQ也未必能远程控制ubuntu的桌面,于是决定土法上马,每次执行完技术支持的指令,当即用手机QQ拍一张屏幕照片发过去确认。技术支持怀疑是动态链接库的软链接的问题,估计他工作中经常遇到这种情况,可惜我这里软链接没有问题。后来重新编译安装驱动程序,重新拷贝动态链接库,重新建立软链接,…运行验证程序,还是报同样的错误。从晚上8点半一直折腾到10点半,无果。

绝望之下和技术支持商量其他远程桌面,想到TeamViewer。TeamViewer安装很顺利,但是技术支持就是访问不了。深夜11点,麻烦人家这么晚怪不好意思,打算明天再战,不信邪的技术支持提出推倒重来。死马当成活马医,重新做一遍,问题依旧。恍惚之间,脑洞小开,尝试用sudo运行测试程序,竟然不闪退了,直觉是成了,看来过去两个晚上的时间都折腾在这个sudo上了。但是厂商所配的测试程序输出乱码,无法进一步工作。尝试把厂商提供的样例代码存成utf-8,重新编译,乱码消失,确认是字符集的问题。可是其他程序没有源代码。 活干完了,突然想起下次可以让技术支持用qq访问我的windows电脑桌面,然后windows电脑通过vnc访问ubuntu的桌面。 四、搞定乱码,两个晚上

技术支持他建议用远程终端访问服务器,因为他知道如何在putty这种远程终端程序中搞定乱码。作为码农,是可忍孰不可忍?先是去下载了一个查看编码的工具,检查到原始编码是 GB2312。然后上网搜各种治乱码方略,一部分是专治centos/redhat的,ubuntu用不上,另外一部分ubuntun能用,比如用locale-gen生成GB2312,然后通过修改环境变量启用新编码。尝试过GBK,GB18030,GB2312,始终不能完整解决问题,比如窗口程序能正常转码了,但是字符终端仍旧是乱码。因为不熟练,有一次直接把GNOME搞瘫痪了,那个lauchpad再也找不到可执行程序,电脑成了砖头,觉得天都快塌了!幸好后来找到一个开启终端程序的快捷键,在决定重新安装系统前一分钟和电脑重新打开了交流渠道。折腾了两个晚上,乱码还是没搞定,打算改为在windows上运行板卡的管理程序。第三天早上,终于发现了一个可以工作的乱码转换方案,luit,简单又安全。

后话

作为老鸟,时刻提醒自己遇到困难绕道走,始终聚焦在终极目标上,没有犯换个灯泡修梯子,最后升级到要给汽车加油这种低级错误。即便如此,浪费掉的时间还是触目惊心。

我相信换个工程领域也能观察到类似现象。新手看起来很忙,其实绝大部分时间浪费在不创造价值的外围活动上,有人把这叫做踩坑,成长的必经之路。对于个人来说是成长,对组织来说是不折不扣的浪费。这件事充分说明工程师的经验对一个组织有多宝贵。