Categories: Yurii谈工作

程序员的“横向发展”

本文由Yurii原创,转载请注明来源: Life Sailor

本文链接 程序员的“横向发展”


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

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

今天我要说的当然不是改行,而是除去深度发展、广度发展之外的第三维度,因为似乎一直也没有正式的命名,所以我干脆借用“横向发展”的说法好了。

什么是横向发展呢?举例子来说,我们写个程序,深度发展关注的是让它速度更快、资源消耗更少,广度发展关注的是让它更合适与其它模块交互,甚至用更合适的语言编写这个程序。横向发展,则是让这个程序成为真正能用的程序,而不是实验室里的玩具。换句话说,“横向发展”是让程序更加“工业化”而不是“技术化”的发展。

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

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

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

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

如果你认真回忆,一定见过许多这样的程序:完全不处理意外情况,各种异常一股脑交给操作系统去处理,我甚至见过默不作声把所有异常都吃掉,假装没事继续运行的系统。也见过很多这样的程序:自动发送邮件的程序,不知道自己每天发了多少封邮件,消耗了多少流量,等到用户收不到邮件才知道出了问题;备份数据库的程序,不会记录每次备份的开始时间、结束时间、备份文件大小,直到硬盘满了才发现已经很久不能正常备份了;抓取数据的程序,不知道抓取的成功率、速度、消耗的流量,非要业务部门说数据很久没更新了才知道抓取失效了…… 其实这些功能通常都不复杂,但完成它们的程序,不管什么平台,什么语言,就是做不到稳定。每次出了问题都不能预先知道,又因为没有详细的记录,又要消耗无数的人力物力去解决。在一些稍微复杂的系统里,不少程序员每天的工作内容就是这样的重复劳动,随之而来的是无休无止的抱怨,说工作毫无意义,没有机会学新东西…… 更糟糕的是,不少这样的程序员业余时间还在积极学习,希望在把语言工具掌握得更熟练,学会更多的语言和工具,却不知道问题的症结在于自己缺乏“横向发展”的意识。

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

Yurii

View Comments

  • 我目前遇到的问题是,貌似要横向到非技术领域去了…… 程序开发,实施,售前,售后,乃至催客户签合同签竣工报告……

  • 问题来了,如何“横向发展”?
    多问自己,此代码有优化可能吗?
    有时候有些事情当时就是想不到,考虑不周全,该该如何避免?

    • 多思考,多学习,尤其是钻研一些广泛使用的开源代码,会学到很多的。

  • 文章写得好极了!非常感谢!

    和之前Fenng的那篇——事情要做绝,意境相通。那篇说的是,即使是小网站,也可以考虑能不能加上监控,怎么样减少流量,提高SEO,把这些问题都做绝了,那小网站中也可以学到很多很多东西了。

  • 我觉得这是中国教育的问题,把人训练为习惯解决封闭问题而非开放问题,所以问题总要归个类,然后通过反复训练让人习惯解决这类问题。这使得中国人总在某些封闭领导内追求提升。

    美国人简单直接很多,只问什么能够创造更大价值。这是个很开放的问题,现在的瓶颈是什么就在什么上面追求提升,而不在乎那是什么以后别人是否认为它重要。

    • 说到底,还是只会解决已经定义好的问题,而不是自己去完整定义一个问题。

  • 所谓的“横向发展”问题是不是因为前期对功能和需求识别不清楚造成的问题啊。在前期、中期、后期的横向沟通是不是更重要一些?

  • 既然另两维是深度和广度,这维不妨叫作「硬度」吧。在现实世界上,提高所编写的软件面对异常情况和攻击的耐受性。

    我对 Erlang 和 CouchDB 有一种特别的敬仰,因为 Erlang 说「Let it crash」,CouchDB 教程开篇就说现实世界如何残酷,他们是如何使用「crash-only design」来设计软件的。

    哦还有 UNIX 哲学中的「crash loudly」以及 Python 的「Errors should never pass silently. Unless explicitly silenced.」

    不过要做稳定可靠的软件不容易,充分地考虑到各种意外与竞态、不同环境的行为确定、各种异常状态的测试、出现各种问题的处理策略,等等,都要耗费大量的时间和精力。而很多商业公司都不在乎那 1% 的用户的感受,况不足万分之一的意外乎!愿意花费 80% 的时间来完善那余下的 20% 的人太少了。

    • 哈哈,我见到的情况是很多商业公司不在乎的意外情况尽然占了10%甚至20%,所以大部分软件其实是相当脆弱的。

  • 感谢分享,今天代码就出现了一次因为网络情况不佳导致的报错。而自己在最初根本没有考虑好这种情况,

  • 这些命名,能否三维的各轴关联起来?
    如:Z轴即为深度,X轴即为广度,那么Y轴呢?高度可以吗?

Recent Posts

德国育儿经验:家长需要和儿童谈论”空气动力学“吗?

家长应当和儿童,尤其是低龄儿童谈论“空气动力学”吗? 我的答案曾经是非常肯定的:不应当。不要说儿童,就是成年人也不见得理解这些抽象的概念,与儿童谈论这些名词,只会让人望而生畏。身为父母,我们应当做的是,以孩子能理解的、感兴趣的方式谈论相关的具体问题,但绝对不要提这些大词。 不过世界的奇妙就在于,父母对教育并没有绝对的权威,总是需要根据实际情况来修正自己的观点。在“空气动力学”的问题上,我就吃到了教训。 那是一个下午,家里小朋友在iPad上看完他最喜欢的Blippi(这个节目我之前介绍过,对80后父母来说,Blippi可以理解为“带你见识各种新鲜玩意的董浩叔叔”),忽然抬起头来问我:“爸爸,你知道什么是aerodynamics吗?” “什么?你问我知不知道什么是aerodynamics?”我的下巴都要掉下来了。“空气动力学”这种词还是上中学时,身为军迷的我们在《航空知识》上知道的。再往后英语好一些,能看原版科普视频了,才知道“空气动力学”的原文就是aerodynamics。可是,我家这个还没上小学的家伙,竟然就能真诚地瞪大眼睛,一本正经地问我“知不知道什么是aerodynamics”。 (more…)

3 months ago

忆孟繁超老师:他从来没有给我上过一堂正式的课,但我永远都是他的学生。

我本来是不应该认识孟老师的。 2001年,我在寝室夜谈里第一次听到孟老师的名字。当时有同学说“公共选修课的《法学概论》讲得真好,那个老师叫孟繁超”,开始我不怎么在意,慢慢才发现这么说的人还不少。那个年月网上的资料正丰富,出版管制也不那么严格,刚进大学不久的我正自由自在地看得过瘾,心想“大学里的法学概论讲再好,能讲些什么,还不是教科书上老一套”,所以这种课,不听也罢。 但生活就在这么奇妙。那年冬天,有天中午我吃过饭正准备午睡,忽然有人敲门问“计算机系有位叫余晟的同学在这里吗?” 大中午的谁会来找我?我正好奇这个问题,门一推开就有同学喊“孟老师,孟老师来了”。 那是我第一次见到孟老师,中年人,国字脸,身材高大,打扮很精神,披在身后的深色大衣让我一下子想起电影里的斗篷。他笑眯眯地说“你是余晟?听同学说你搞电脑很厉害,我家的电脑坏了,想请你去看看。” (more…)

3 months ago

“历史照进现实”,这似乎不太现实

中国人大概都对历史有一些特别的偏好。对我们普通人来说,历史首先是文化的象征,一个人“懂历史”,基本等于这个人“有文化”;历史也是民族自豪感的来源,哪怕考古上仍然存在争议,但是“五千年文明”的说法是普通人都耳熟能详的。 不过等我长大之后才发现,这种偏好大概还有更深层次的原因,那就是历史看起来有种道德的意味,因为我们从小就熟悉“以史为鉴”的智慧,也熟悉各种“历史的选择”:每当我们对现实感到失望、困惑的时候,我们经常去历史——而不是先贤的智慧中——中寻找解答。找到曾经发生的类似的故事,就可以预言未来的结局。 于是乎,失望也好、困惑也罢,总归会有光明的未来,历史总会给我们支撑的信念。 我曾经很相信,熟谙历史是种智慧,而且是深层次的智慧。但是看得越多、经历得越多,我就越觉得,这很难称之为“智慧”。 为什么? (more…)

3 months ago

无人出租车,是技术进步的一粒灰,还是普通人头上的一座山?

“无人出租车要来了”。以百度“萝卜快跑”为代表的无人出租车,眼看就要在国内多个城市成规模运营。 熟悉IT的人都知道,IT的独特优势就在于“大规模扩展时边际成本极低”。在软件时代,微软开发的Windows,多卖一份的成本只是多刻录一张光盘而已。在无人驾驶时代,从10辆车到10万辆车的成本,也遵循同样的规律。换句话说,一旦模式“跑通”了,就可以迅速大规模铺开。无人出租车的大规模应用,也是“指日可待”了。 只不过,新技术这一次似乎没有那么激动人心,反而引起了很多争议——无人驾驶出租车大规模推广,会不会影响广大出租车、网约车车主的收入甚至生计?如果是,这样的技术进步,真的是我们所需要、所期待的吗?对于这个问题,不同的人有相差迥异的答案。 按照我的观察,许多人对此是相当乐观的。理由在于,“技术的每一次飞跃发展,虽然有阵痛,最终都创造了更多的新岗位”。既如此,无人出租车短期“看似”抢了许多人的饭碗,但也只是短期的“阵痛”而已。看看历史,纺织机的发明,蒸汽机的改良,汽车的诞生,无不证明了“阵痛说”的正确性。 坦白说,这种观点我是怀疑的。 (more…)

3 months ago

回国感受:松弛一点,愉快一点

因为小朋友放暑假,近期带小朋友回国待了几个礼拜。最深的感受就是标题所说的:松弛一点,愉快一点。 我第一次突出意识到这点,是在上海下飞机乘地铁。当时我们乘的直梯就要关门,远远看见有个年轻小伙子跑过来,我连忙按住开门按钮,并招呼他”别着急,慢慢来“,等他进了轿厢才关门。本来我以为大家起码会打个招呼,露个笑脸,因为我已经习惯如此,但完全出乎我意料的是,他进来之后对我们完全视若不见,自顾自掏出手机,盯着看得入迷。 我继而发现,不管是在电梯里,站台上,还是车厢里,虽然四下里都是广播”请扶好站稳,抓好扶手,不要看手机“,但是似乎人人都盯着自己的手机。年轻人在打手机游戏,年纪大一点的在滑各种小视频,还有不少人在聊天软件里打字如飞……对着屏幕的表情都很生动,可是一旦抬起头来,似乎马上又换了个人。 后来又有一次,我乘地铁的时候,因为比较拥挤,一个小伙子倒退时踩了我一脚,他大概意识到了,很快把脚挪开,脸上闪过一丝不安,马上又恢复正常,我也没有计较。不幸的是,过了十来分钟,他又踩了我一脚,同样是先有一点不安,很快又恢复正常。 这次我忍不了了,于是我开口告诉他:“小伙子,你已经踩了我两脚了。” (more…)

3 months ago

First name, last name, middle name,浅谈外国人名

前几天,国内朋友发来一条消息,原来是乌克兰F-16坠落,飞行员丧生的新闻。我本来以为他要讨论此事的真假和原委,他真正的问题却完全出乎我的意料: 新闻里说,飞行员叫阿列克谢·“月鱼”·梅斯,对应原文是Alexei “Moonfish” Mes,为什么会有人把“月鱼”写在自己的名字里,而且还打引号。 之前看新闻,乌克兰还有一个著名的飞行员叫安德烈·“果汁”·皮尔希科夫(Andrii “Juice” Pishchykov),怎么“果汁”也是正式的名字? 未必Moonfish和Juice之类,还有什么特别的含义吗?…… 这堆问题看的我有点想笑,因为自己以前也很苦恼外国人的名字,只有在国外长期生活,才逐渐搞清楚这其中的名堂。所以,除了解答朋友的问题,我也把自己的解释写下来,搞清楚两个最不容易理解的点,就不会对外国人名有那么多问题了。 (more…)

3 months ago