给程序员的错误找个台阶

发布于: 2020 年 05 月 08 日
给程序员的错误找个台阶



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

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



01 管SHA不管埋

台阶:大名鼎鼎的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的某个人背。



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



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说:上帝在梦中告诉我,我做出了最优秀的操作系统。

高德纳回答说:我可没这么说过。



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



以上,共勉。



发布于: 2020 年 05 月 08 日 阅读数: 843
用户头像

Still Waters Run Deep 静水流深 2017.10.19 加入

上海奥琪科技 CTO 0x0f年+IT从业经验,专于基础架构/ 分布式/ 大数据/ 图计算,长于传统或互联网业的社保/ 航空/ 金融,善于工程效能/ 敏捷管理/ 团队文化。 前招商银行技术经理 「曲水流觞TechRill」作者

评论 (4 条评论)

发布
用户头像
不少人以为是Donald的音译,叫人家高纳德,以人家自己的首页为准; ~~~~~可是人家首页写的是高德纳,哈哈
2020 年 06 月 12 日 09:18
回复
我也是本着求真的原则,搜索遍网络,找到这个首页才敢明确高德纳才是正主。
2020 年 07 月 20 日 22:12
回复
用户头像
感谢分享,文章推荐到InfoQ官网首页了。
2020 年 05 月 08 日 17:49
回复
用户头像
文章已正常发布
2020 年 05 月 08 日 16:46
回复
没有更多了
给程序员的错误找个台阶