给程序员的错误找个台阶

题图

2020这个人生最漫长的寒假,翻了一些书,记下不少名人趣事。百无聊赖间把这些小故事做了个分类,再把平日所见种种对照落入其中,遂成此短文。

我工作中常常以错误零容忍自居,对团队的错误”颐指气使”,想来也是让人极为厌恶的。人非圣贤,高人亦如此,何况吾凡辈。有些错误换个角度反而是一种美,那我们就从递台阶开始吧。

01 管杀不管埋

台阶:大名鼎鼎的J.U.C并发包

程序员皆知J.U.C包的造物主是并发大师Doug Lea。在jdk5之前对于线程同步使用的技术基本就是synchronized、wait、notify这些(用过jdk1.4或更早版本的老古董可以文末举个手,大爷我从jdk1.3入坑)。这时的并发控制不够优雅,性能也差的很,直到Doug Lea把JSR-166号提案提交到JCP组织(https://jcp.org),而这个JSR-166就是J.U.C的技术规范。

更牛掰化的是,在提案之前Doug Lea早就写完了基本类似现在J.U.C的整套原型代码,并已经使用它长达3年之久了,我们真该庆幸老李没有藏起来自斟自饮。

参考 The birth of J.U.C
https://programmer.help/blogs/the-birth-of-j.u.c.html

即使如此牛掰,我们也要鸡蛋里挑骨头。当使用 synchronized 关键字使对象阻塞时,通过线程dump能够看到被该阻塞的对象信息,方便问题定位。而jdk5里面的Lock等并发工具却遗漏了这一点,致使dump线程时看不到阻塞对象的信息,因而不得不在jdk6中的LockSupport新增了含有阻塞对象的park方法。

老李这种神人可能压根不需要dump文件,就可以盲分析出线程问题所在。但是这可苦了我辈Javaer了呀,因为代码不仅是给人用的,还是方便给人修的,不然很多数码家电都有厚厚一本操作手册可不是当摆设的。

不过这个锅到底是不是老李的,历史过于悠久,搜遍Google亦无从考证,遂作罢。老李背不动总得有jdk的某个人背。

管杀不管埋,个人觉得,是程序员群体特别容易掉进去的一个错误陷阱。它像不像写代码不写注释的你,像不像通篇大段逻辑代码却没有打印日志或者打印无脑日志(无助于排障)的你,像不像应用上线没有接入日志系统或者监控系统的你…现在,台阶已奉上,供君拾级而下。

02 绣花枕头

台阶:Homebrew的作者谷歌面试被拒

平时用macOS做开发的同学一定对Homebrew这个软件包管理工具不陌生,这个广有知名度的软件的作者Max Howell某一天去谷歌面试,面试官让其在白板上徒手写个反转二叉树的代码实现,这位大神说不会,然后就没有然后了,再然后就有了上面的twitter怒怼,再再然后LeetCode上架了这个算法题并标注为Easy级别…

此热门事件当时在程序员圈迅速发酵,引起正反两派的激烈辩论。但双方不管怎么互怼,大部分人应该私下都偷偷的去把反转代码撸了几遍,然后像模像样的再把非递归的比如队列算法再撸几遍,顿时,感觉自己要超越世界级大牛了…至少在反转二叉树这块…

说绣花枕头略有些过,毕竟任谁都会有一些知识死角。反过来说,还是看我们怎么定义这个问题,到底是不可避免的知识死角还是过于薄弱的基础能力。扬长避短是一种人生,那查漏补缺未尝不是一种更积极的人生态度

03 玩物丧志

台阶:Unix本是用来玩游戏的

现在我们开发环境所属的操作系统无非Windows, Mac(Unix BSD分支)或Linux(类Unix),除了Windows其他两个的内核鼻祖都是Unix。那么当然地,作为Unix的发明人 Ken Thompson 和 Dennis Ritchie,必然是鼻祖级的传奇人物,更不用提他俩一个是B语言之父,一个是C语言之父了。

何曾想,Unix的诞生只是因为一个叫Space Travel的游戏在当时的MULTICS系统上运行太慢,要迁移到一个更精简的操作系统上。然后有了Unix,和它收割世界的故事了。

Space Travel游戏真身
https://en.wikipedia.org/wiki/Space_Travel_(video_game)
https://www.uvlist.net/game-164857-Space+Travel

有人因为游戏开发了外挂,有人因为游戏开发了Unix…看来玩游戏并没有那么不堪,换个角度,游戏确实也是用来放松和激发想象力的有效手段,只会机械的编程与咸鱼有何分别?那么,工作中有些小伙伴玩心重,建议也不要急切的下定论。

依然记得当年公司的编程规范考试,我找了个开源的PHP考试系统简单修修改改后,部署发布在了公司内网。考完后的阅卷原以为平淡无奇,直到发现有人在编程题里注入了XSS代码,具体的弹窗内容已经不记得了,我只记得他当时错了蛮多题,理应过不了考试,但是我依然给了他过,不只是因为有趣还因为作为小鲜肉程序员有如此的知识厚度很难得。此时的我并不想拿规范考试束缚他。

恩,足够牛逼的人走到哪里都会有特权,就是这么回事。

附一个很有趣,Star高达38K的Github项目
https://github.com/kelseyhightower/nocode

04 砍材不误磨刀功

台阶:写算法我最优,但写书我得慢

我们要再提一个神级大佬Donald Ervin Knuth, 中文名叫高德纳。

不少人以为是Donald的音译,叫人家高纳德,以人家自己的首页为准
https://www-cs-faculty.stanford.edu/~knuth/

称他为算法之父毫不为过,因为我们现在用的数据结构、算法复杂度、算法分析符号啥的都是他发明的。当然更为世人所熟知的是他的巨著《The Art of Computer Programming》,简称 TAOCP,中文名 计算机程序设计艺术。原本出版社只想跟老高约一本关于编译器和程序设计方面的书,结果老高四年没写完,手稿倒是写了一堆,憋着劲要写一本传世之作,算来算去得整七卷。意料之外情理之中,刚刚写完第三卷,就被计算机界奉为神作,ACM的评委们也坐不住了,迫不及待要给老高颁发图灵奖。所以至今,老高(当时36岁)仍旧是最年轻的图灵奖获得者。

历史继续滚动,故事却刚刚开始。拿到图灵奖后不久老高就宣布搁笔,理由是排版工具太差,不能忍了。紧接着,说江郎才尽、见好就收的非议如期而至,人老高神人怎会在乎尔等凡人的屁话,说搁笔就搁笔,一搁就是十年之久。期间老高可没闲着,陆续创造了文字排版系统TEX(大名鼎鼎LaTeX的雏形)、字体设计系统METAFONT和文学化编程Literate Programming。再拿起笔写完第四卷已是2008年,距离第三卷过去了30多年。

你说30年,用再烂的排版系统怎么也可以捣鼓出来一本书了吧?话是没错,但这和写代码不复用不抽象,就是CopyPaste有何区别呢?

笑话一则
当年Linux之父Linus说:上帝在梦中告诉我,我做出了最优秀的操作系统。
高德纳回答说:我可没这么说过。

程序员的工作目标从来不是最快而是最优,工作内容从来不是重复性劳动而是创造性工作。若因为蹩脚的工具、繁冗的流程、糟糕的设计不能忍而影响了自己的交付进度,不用怕,程序员就该有程序员的样子!

以上,共勉。