程序员

在我小的时候,家长经常打趣胖的孩子说:哟,身体长得挺快,可惜就是横向发展。所以在很多人的潜意识里,纵向发展是值得夸奖的,横向发展则不是那么光彩的事情。但是我的工作经历,却让我对“横向思考”有了新的认识。

程序员的发展,长期以来都是大家关心的问题。一般来说,程序员的发展有两大方向,深度和广度。深度发展,就是精神自己的本事,研习新潮、尖端的技术乃至“屠龙之术”,以绝招打遍天下;广度发展,就是拓展自己的技能,比如学会更多的语言,以完成更多种类的任务。除去这两大方向,其它能选的发展方向基本就只有“改行”了。

今天我要说的当然不是改行,而是除去深度发展、广度发展之外的第三维度,因为不知道该如何命名,干脆借用“横向发展”的说法吧。

我们写一个程序,深度发展关注的是让它速度更快、资源消耗更少,广度发展关注的是让它更合适与其它模块交互,甚至用更合适的语言编写这个程序。横向发展,则是让这个程序更像一个真正能用程序,而不是实验室里的玩具。

在我刚刚工作的时候,有一天我提前完成了任务,喜滋滋地去向项目经理汇报,不料他看了代码之后,却把我劈头盖脸说了一顿:你以为你还是学生呢,给老师写个程序算出正确结果就完?你看你处理网络连接的部分,对服务器返回的异常信息,包括网络传输的各种意外都没有处理,谁告诉你服务器总是返回正确信息的?谁告诉你网络传输不会意外的?万一网络断了,你的程序就一直死循环吗?……

我必须承认他说的有道理,但也无可奈何,在学校的时候写过不少程序,但老师一般只看大致结构和结果,从没有问过“网络断线了怎么办”的问题,所以我从来也没想过。没想过归没想过,项目经理说的毕竟有道理,只有学生才会写出只能在理想环境下运行的程序,于是我开始有意识地学习和思考各种异常情况的处理,不久还因为这方面的工作得到了项目经理的表扬,也深刻感觉到“横向发展”确实解放了自己。

后来换了工作,还是做服务器方面的开发,我本来以为自己之前的经验可以被人赏识,却发现自己完全想错了。作为要求更高、应用场景更严苛的程序,只思考在程序里怎么处理异常是不够的,还需要确保程序的持续运行,其运行状态持续可以记录、监控、分析,出现问题必须能在第一时间判断症结……为了做到这一切,既需要专门开发一些程序去监控自己的程序,又需要原来的程序能够被方便的监控,所以在设计时又有更高的要求。最后,虽然核心的功能并没有变复杂,但为了保证核心功能的稳定运行,程序本身的复杂度却上升了很多。这种要求,颇有几分类似小朋友的“横向发展”,所以我把对程序员的这种要求称为“程序员的横向发展”。

或许是从工作开始就有机会重视“横向发展”的缘故,所以我长期以来并不认为这是一个严重的问题。曾经有朋友告诉我,国内互联网行业某新兴领域排名三甲的公司,竟然连自己的服务器上跑的哪个版本的程序都不知道,我还当是笑话。后来见得多了,才知道事实当真如此——与小朋友的“横向发展”不讨人喜欢类似,许多程序员也忽视甚至讨厌“横向发展”,觉得这是在给自己找麻烦,他们认为,把代码敲完,往服务器上一扔,自己的工作到此为止了。至于其它方面,那是系统管理员的问题。

所以我们见过许多这样的程序:完全不处理意外情况,各种异常一股脑交给操作系统去处理。也看到很多这样的程序:自动发送邮件的程序,不知道自己每天发了多少封邮件,消耗了多少流量,有一天用户收不到邮件才知道出了问题;备份数据库的程序,不会记录每次备份的开始时间、结束时间、备份文件大小,有一天硬盘满了才发现已经很久不能正常备份了;抓取数据的程序,不知道抓取的成功率、速度、消耗的流量,有一天业务部门说数据很久没更新了才知道抓取失效了…… 其实这些功能并不复杂,但总是不够稳定,而且每次出了问题都不能预先知道,更因为没有详细的记录,又要消耗无数的人力物力去解决。在一些稍微复杂的系统里,不少程序员每天的工作内容就是这样的重复劳动,伴着无休无止的抱怨…… 更糟糕的是,这样的程序员业余时间还在积极学习,希望在把语言工具掌握得更熟练,学会更多的语言和工具,却不知道问题的症结在于自己缺乏“横向发展”的意识。

我仔细回忆自己小时候,家长和老师会在一种情况下提倡“横向发展”,那就是要求身板像“豆芽菜”一样的同学多锻炼,成长结实一点。同样的道理,如果程序员觉得自己写出的程序像“豆芽菜”一样没有底气、不能放心,与其继续钻研新语言、新技术,倒不如抽出精力去“横向发展”一把。

via: luanxiang.org