终于进入到程序员看上去最熟悉的一个主题:自动化。

每每提及自动化,我就会想起 Perl 语言的发明人 Larry Wall 一个经典叙述:优秀程序员应该有三大美德:懒惰、急躁和傲慢(Laziness, Impatience and hubris)。

有人甚至为此专门打造了一个三大美德的网站,阐释这个初看起来匪夷所思的说法。

懒惰,是一种品质,它会使你花很大力气去规避过度的精力消耗,敦促你写出节省体力的程序,别人也能很好地利用,你还会为此写出完善的文档,以免别人来问问题。

急躁,是计算机偷懒时,你会感到的一种愤怒。它会促使你写出超越预期的程序,而不只是响应需求。

傲慢,极度自信,写出(或维护)别人挑不出毛病的程序。

不知道你是否感受到,程序员独有的幽默和透露出的那种骄傲:我做的东西就应该是最好的。

之所以要从 Larry Wall 的这段话开启“自动化”这个模块,因为只要一说到自动化,我就会情不自禁地联想到“偷懒”这个词。是的,我们程序员的工作,本质上就是打造各种自动化的工具,让人们从各种繁复的工作中解脱出来,让人有机会“偷懒”。

不过,我也知道,从机器那里偷来的“懒”很快就被更多的工作填满了。但 Larry Wall 的这段话却可以鼓励我们不断地打造出更好的工具。

作为程序员,你当然知道“自动化”这件事的价值,在日常工作中,也实实在在地践行着打造自动化工具的任务,但很多人对自动化的理解可能有些单薄。今天,我就从一个你可能会忽略的主题开始讨论:不要自动化。

不要自动化

我先给你讲一个让我印象深刻的“不自动化”的例子。

之前在 ThoughtWorks 工作时,我们有一项工作是,帮助其他公司启动一些新产品。有一次,我的两个同事被一个公司请去启动一个视频网站的项目。那时候还不像如今的市场,已经由几大视频网站瓜分完毕,当时不少公司看到了视频网站的苗头,觉得自己有机会。这个来请我们的公司也不例外,觉得自己也能分一杯羹。

两个星期之后,我的两个同事回来了。我们饶有兴趣地去问项目的进展,因为项目启动之后,通常会有后续的开发合作,但结果令我们很意外,这个项目停止了。

“出了什么状况吗?”我们问。

“是我们建议用户停掉这个项目的。”他们回答道。

我们“恨恨地”问他们为什么丢掉了一个这么重要的机会。这两个同事的回答也很直白,他们结合着客户的想法算了一笔账:这个项目需要大量的资金投入,投入规模之大,是超出客户想象的,按照现有的规划投入,这个项目肯定会亏本。要么重新规划,要么取消这个项目。客户认真研究了一番,最终决定取消项目。

这件事大约发生在10年前,今天我们都看到各大视频网站在烧钱上的投入,以那个公司的实力,想要参加这场比拼,确实还差太多。

这件事之所以给我留下深刻印象,因为它是我职业生涯中见到的第一个通过“主动取消项目”获取项目成功的案例。

或许你不能理解我这里所说的“项目成功”。在我看来,做有价值的事是重要的,这里面的有价值,不仅仅是“做”了什么,通过“不做”节省时间和成本也是有价值的。我的两个同事阻止了客户的浪费,所以,我将这个项目视为成功。

对于开发来说,也遵循同样的道理。程序员这个群体技术能力实在太强,做一个技术方案简直是太符合直觉的做法,我们就是忠实地把一个个需求做出来,把“全世界”都自动化了。

但事实上,这个世界太多的浪费就是做了不该做的东西。在我们的专栏里,我反复地说,我们要多问问题,目的就是为了不做那些不该做的事。

小心 NIH 综合症

你可以从需求的角度判断哪些工作是可以不做的,但我们也要防止程序员自己“加戏”,我再给你讲一个技术人员普遍存在的问题:NIH 综合症(Not Invented Here Syndrome)。

NIH 是什么意思?就是有人特别看不上别人做的东西,非要自己做出一套来,原因只是因为那个东西不是我做的,可能存在各种问题。

这种现象在开源之前尤为流行,很多公司都要做自己的中间件,做自己的数据库封装。虽然很多公司因此有了自己特色的框架,但是因为水平有限,做出来的东西通常极为难用,很多人一边骂,一边还要继续在上面开发。

开源运动兴起之后,我以为这种现象会好一些,但事实证明,我想多了。

比如,这种乱象在前端领域也出现了,各种各样的框架,让很多前端程序员哭诉,实在学不动了。再比如,我曾经面试过一个接触 Go 比较早的程序员,他就是恨不得把所有框架都自己写。

因为他学 Go 的时候,确实框架比较少,但问题是,如今的 Go 已经不是他学习时的那个 Go 了,现在各种框架已经很丰富了,不需要什么都自己做。当时我问他,如果有一天你离开了,公司怎么办呢?实际上,他从来没考虑过这个问题。

说了这么多,无非就是想说明一件事,写代码之前,先问问自己真的要做吗?能不做就不做,直到你有了足够的理由去做。对应到 Larry Wall 的说法,你要懒惰,花大力气去规避精力消耗。

做好自动化

说完了不要自动化的部分,再来说说要自动化的部分。

我还是先从你可能会忽略的问题入手,你的日常工作是给别人打造自动化,但你自己的工作够自动化吗?还是问一个更具体的问题吧!如果你写的代码要上线,会经过怎样的过程?

我先给你看一个极其糟糕的例子。刚开始工作不久,我有一次出差到客户现场。临近下班时,我发现了程序的一个Bug。在那个年代,我们的程序是按照官方推荐做法编写的 EJB(Enterprise JavaBean),今天很多年轻的程序员可能不了解了,它只有部署到应用服务器才能运行。

我的解决方案就是加上一些打印语句,然后部署到应用服务器上,看输出的结果,再加上另外一些语句,再部署,如此往复。那时我们完全是手工打包上传,每次至少要十几分钟。最终,定位到了问题,只修改了一行代码。但几个小时的时间就这样被无谓的消耗了。

那之后,我花了很长时间研究怎么做自动化的增量部署,最终让这个过程简化了下来。但这件事对我的影响很大,这是我第一次认识到一个部署过程可能对开发造成的影响,也让我对自动化在开发过程内的应用有了属于自己的认识。

相比于我刚开始工作那会。现在在工具层面做类似的事已经容易很多了,在后面的内容中,我会结合着具体的场景介绍一下现在的最佳实践。

你要懂得软件设计

最后,我们再来说说我们的本职工作,给别人打造自动化工具中需要的能力:软件设计。

软件设计,是很多人既熟悉又陌生的一个词,说熟悉,很多人都知道,做软件要设计,还能顺嘴说出几个设计模式的名字;说陌生,是因为在我的职业生涯中,遇到真正懂软件设计的程序员少之又少。大多数人都是混淆了设计和实现。

举个例子。有一次,我要在两个系统之间做一个连接器,让上游系统向下游系统发消息,或许你一听就知道了,这里需要的是一个消息队列。但实际上,我们需要的能力要比消息队列更丰富一些,比如,要将重复的消息去除。一个同事给我推荐了 Kafka 当作这个连接器的基础,我欣然地接受了。

不过,在后续设计的讨论中,我们就经常出现话语体系的分歧。我说,这个连接器要有怎样的能力,他会说 Kafka 能够如何如何。究其根因,我在讨论的是设计,而他说的是实现,所以,我们两个很难把问题讨论到一起。

为什么我会如此看重设计呢?在软件开发中,其它的东西都是易变的,唯有设计的可变性是你可以控制的。

同样以前面的讨论为例,尽管 Kafka 在当下比较火热,但是我不敢保证 Kafka 在未来不会被我换掉。因为就在几年前,消息队列还是传统中间件的强项,现在也渐渐被人淡忘了。

我不想让我的设计随着某一个技术选型而不断摇摆。如果工作许多年,知识体系只能靠各种新框架新工具支撑,我们做程序员就只剩下疲于奔命了。不懂软件设计,只专注各种工具,其结果一定是被新技术遗弃,这也是很多人经常抱怨 IT 行业变化快的重要原因。

回到 Larry Wall 的说法上,你要想写出一个别人挑不出毛病的程序,你先要懂得软件设计。幸运的是,软件设计这些年的变化真不大,掌握了软件设计再来看很多框架和工具,学习起来就会容易很多。在这个模块的后半部分,我会与你探讨软件设计的话题,降低自己给自己挖坑的概率。

总结时刻

Perl 语言的发明人 Larry Wall 曾经说过,优秀程序员应该有三大美德:懒惰、急躁和傲慢(Laziness, Impatience and hubris)。想要成为一个优秀的程序员,就要让机器为自己很好地工作,而这需要对自动化有着很好地理解。

我们学习自动化,先要知道哪些东西不要自动化,尽最大的努力不做浪费时间的事。一方面,我们要从需求上规避那些没必要做的事;另一方面,我们也从自身防止 NIH 综合症(Not Invented Here Syndrome),争取做一个懒惰的程序员。

对于要自动化的事,我们需要反思一下,在为别人打造自动化工具的同时,我们自己的工作过程有没有很好地自动化。而如果我们想拥有打造良好的自动化工具,我们需要对软件设计有着充分地理解。

如果今天的内容你只能记住一件事,那请记住:请谨慎地将工作自动化。

最后,我想请你分享一下,学习了本讲之后,你现在是怎样理解自动化的呢?欢迎在留言区写下你的想法。

感谢阅读,如果你觉得这篇文章对你有帮助的话,也欢迎把它分享给你的朋友。

29 | “懒惰”应该是所有程序员的骄傲相关推荐

  1. 零基础,29岁,可以成为程序员吗?

    我的学习过程大致是这样的:1. 先看了一本c#的入门书,类似java核心技术这种,看完感觉糊里糊涂的,尼玛面向对象什么鬼. 2. 看了一本编程案例的书,照着把书里大部分案例写了一遍,发现编程不那么难了 ...

  2. 为程序员而骄傲的飞鸽传书

    随着我们飞鸽传书的整体经济不断发展,对残疾人事业越来越重视,飞鸽传书帮助文档这也体现了一个社会对弱势群体的关爱,飞鸽传书旗舰版也需要更多的关心弱势群体.出于这个考虑,中国残疾人联合会在今年春晚时筹备了 ...

  3. 我的编程之路:「懒惰」是程序员最大的美德

    首先给大家介绍一下自己吧 大家好,我是 justjavac,一名全栈工程师,目前正在出版<代码之谜>.熟悉我的人可能知道我还有一个中文昵称「迷渡」,取「雾失楼台,月迷津渡」之意,一般用在豆 ...

  4. 关注程序员健康,刻不容缓

    关注程序员健康,刻不容缓 听到著名模拟器开发者李可文逝世的消息,人们不禁为一个天才的早逝扼腕叹息.在为他感到惋惜和怀念的同时,我们也清晰地看到,行业中绝大多数程序员生活在疾病或者亚健康状态之中.从选择 ...

  5. 你属于程序员中的哪种人?

    当初的我们,初窥编程的世界,看着屏幕出现的"hello world"惊喜万分.想着计算机真的是世界上最神奇的东西,通过一行行的代码,我们居然可以和它交流,让它帮我们做事情.可是后来 ...

  6. 被辞后恶意报复,程序员清除125台设备数据,被判21个月监禁

    整理 | 于轩 出品 | 程序人生 (ID:coder _life) 硅谷"创业教父"保罗 · 格雷厄姆曾言,"程序员是现存最大的手工艺人群体,黑客与画家的共同之处,在于 ...

  7. 什么才是真正的程序员?

    作者 | 削微寒 责编 | 王晓曼 出品 | CSDN 博客 第一章 (推荐看完整篇文章,再回过头看一遍第一章) 我非常幸运出生在一个电脑和电子游戏还没有普遍的时代.所以我可以和我的小伙伴们一起玩耍, ...

  8. 什么是真正的程序员?

    什么是真正的程序员 这篇文章的原文来自:A Little Printf Story 作者仿照<小王子>中的情节,通过小printf遇见的不同类型的程序员,最后悟出什么才是真正的程序员!第一 ...

  9. 程序员还有35岁的坎吗?

    昨天晚上和多年未见的前同事聊天,提到了程序员的年龄歧视问题: 自己年龄也 30 出头了,在思考 IT 届流传的 35 岁是一个坎的问题: 开始注重提升管理能力,担心35岁之后,一线写代码的岗位不能胜任 ...

最新文章

  1. JVM内存调优原则及几种JVM内存调优方法
  2. 链表问题12——将单链表的每K个节点之间逆序
  3. python里感叹号什么意思_仪表盘上的感叹号是什么意思
  4. 如何构建一个成功的AI PoC(概念验证项目)
  5. gsonformat安装怎么使用_车载蓝牙充电器怎么安装使用?如何运用
  6. 顺丰控股:2月速运物流业务营业收入98.49亿元,同比下降3.36%
  7. .net byte转java byte_「Java知识收集整理」Java语法的基础
  8. 软件测试及自动化测试
  9. C# 获取硬盘序列号
  10. 像距为什么要大于焦距?
  11. vue3 + ts + EsLint + Prettier 规范代码
  12. 安卓车机数字时间屏保
  13. stm32通过ESP8266连接互联网服务器,手机通过网页实现远程控制灯亮灭
  14. 搭建最炫酷的 Windows Terminal 全新命令行更新以及美化指南 微软新版终端工具安装美化教程
  15. Pytorch错误集锦
  16. ITBP 是什么职位?
  17. CS61A Homework3
  18. 合肥市2022年专利预审申请条件备案流程以及授权时间介绍
  19. 外呼系统是怎么解决电销封卡封号的?
  20. 如何在VS201里引用ActiveX类型的引用

热门文章

  1. Office 2016零售版转换为VOL版本
  2. SQL Server2012 序列号 注册码
  3. 真是太开心了居然看见google yahoo收录的身影-原创天地
  4. 常规心电图和动态心电图的区别
  5. Unity3D实现谷歌数字地球
  6. Intel迅盘应用从入门到精通
  7. mp3转换器哪个好?教你两种正确转换音频文件的技巧
  8. python文件名排序按windowsp_在SQLServer中如果实现Windows文件夹中按名称排序?算法是什么怎么Order By...
  9. 博世BOSCH EDI DESADV发货通知详解
  10. YUN人才招聘系统PHP源码v5.1.2