卖桃者说
池建强
极客时间创始人、墨问西东创始人
30376 人已学习
免费领取
课程目录
已完结/共 523 讲
第一季 (135讲)
第二季 (134讲)
第三季 (124讲)
第四季 (90讲)
卖桃者说
15
15
1.0x
00:00/10:32
登录|注册

第221期 | 为何“懒惰”是所有程序员的骄傲?

讲述:池建强大小:9.65M时长:10:32
你好,这里是卖桃者说。最近我一直在读郑晔老师的《10x 程序员工作法》专栏,顾名思义,这个专栏的目的就是想要帮助你在工作中变得更高效。那我就要简单调查一下了,你有没有订阅这个专栏呢,买了有没有看呢,看了之后实践到工作中了么?
郑晔老师在专栏里跟读者分享了一个很有意思的观点,他认为懒惰应该是我们所有程序员的骄傲。“高效”和“懒惰”?这似乎是两个完全无法扯上关系的词,为什么他会这么说呢?今天我就来和你聊聊我的看法。
Perl 语言的发明人 Larry Wall 有一个金句:优秀程序员应该有三大美德,懒惰、急躁和傲慢(Laziness, Impatience and hubris)。乍一听,你肯定会说,这不都是贬义词吗?为啥能是美德呢?
我来简单解释下 Larry 的逻辑。懒惰,其实换个角度看也是一种品质,它会推动你写出更好的程序,这个程序可以帮你完成很多重复性的工作。急躁,是当你的程序没有充分发挥出计算机能力,让计算机闲着的时候,你会愤怒,它倒逼你写出更优秀的代码。傲慢,是极度自信,它会激发你写出别人挑不着毛病的程序。
不知道你是否感受到,程序员独有的幽默和透露出的那种骄傲:我做的东西就应该是最好的。
我们程序员的工作,本质上就是打造各种自动化的工具,让人们从各种繁复的工作中解脱出来,让人有机会“偷懒”。比如极客时间编辑非常重要的一项工作就是检查错别字,这事很初级,又很重要,很多出版社甚至还为此引入了专门的审核人员。但后来编辑们引入了一个文本校对工具,工具就可以帮助他们高效且准确地找出问题,这不就是一个典型的利用工具“偷懒”的例子吗?
不过,我也知道,从机器那里偷来的“懒”很快就被更多的工作填满了。但 Larry Wall 的这段话却可以鼓励我们不断地打造出更好的工具。
作为程序员,你当然知道“自动化”这件事的价值,但今天,我想从一个你可能会忽略的主题开始讨论:不要自动化。

能不做就不做

我先给你讲一个让我印象深刻的关于“懒惰”的例子。两年前,极客时间准备增加一个电商模块,我们运营同学对我说,“极客时间用户对于实体商品的需求特别强烈,电商的发展大有可为啊。我们需要一套电商系统。”总结来说就是,万事俱备,只差一个程序员了。
我听完她的各种数据分析之后觉得很有道理,不过,要开发一套完善的实物电商系统并不容易,投入非常大,短期内功能基本上不可能达到第三方电商平台的水准。权衡之后,我建议她先用已有的第三方平台启动项目,等验证需求且收入达到一定量级之后,我们再定制化开发自己的系统。我们用很短的时间接入了第三方电商平台,一直用到现在。
现在,两年过去了,极客时间还在用第三方平台的电商系统,因为够用了。够用就好。
在我看来,做有价值的事是重要的,这里面的有价值,不仅仅是“做”了什么,通过“不做”节省时间和成本也是有价值的。
对于开发来说,也遵循同样的道理。程序员这个群体技术能力实在太强,做一个技术方案简直是太符合直觉的做法,我们就是忠实地把一个个需求做出来,把“全世界”都自动化了。
但事实上,这个世界太多的浪费就是做了不该做的东西。郑晔老师在他的专栏里反复地说,要多问问题,目的就是为了不做那些不该做的事。

小心 NIH 综合征

你可以从需求的角度判断哪些工作是可以不做的,但我们也要防止程序员给自己“加戏”,我再给你讲一个技术人员普遍存在的问题:NIH 综合征(Not Invented Here Syndrome)。
NIH 是什么意思?就是有人特别看不上别人做的东西,非要自己做出一套来,原因只是因为那个东西不是我做的,可能存在各种问题。
有一次,我面试过一个接触 Go 语言比较早的程序员,他就是恨不得把自己用到的所有程序库都自己写。解释下,其实程序库就是别人已经写好的标准代码。他初学 Go 语言的时候,程序库确实比较少,所以,不得不去写一些基础的程序库,但问题是,如今的 Go 语言已经不是他学习时的那个语言了,现在各种程序库已经很丰富了,不需要什么都自己做。当时我问他,如果有一天你离开了,公司怎么办呢?实际上,他从来没考虑过这个问题。
说了这么多,无非就是想说明一件事,写代码之前,先问问自己真的要做吗?能不做就不做,直到你有了足够的理由去做。对应到 Larry Wall 的说法,你要懒惰,花大力气去规避精力消耗。

你自己的工作够自动化吗?

前面讲到,程序员的日常工作是帮别人“偷懒”,打造自动化,但你自己的工作够自动化吗?还是问一个更具体的问题吧!如果你写的代码要上线,会经过怎样的过程?
我先给你看一个极其糟糕的例子。刚开始工作不久,我有一次出差到客户现场。临近下班时,我发现了程序的一个 Bug。在那个年代,我们的程序只有部署到应用服务器才能运行,今天很多年轻的程序员可能已经不太了解了。
我当时的解决方案就是,修改一些代码,将系统的内部信息显示出来,修改之后,重新把应用打包,部署到服务器上,看输出的结果。根据输出结果,再修改另外一些代码,增加显示的信息,再打包,再部署,如此往复。那时我们完全是手工打包上传,每次至少要十几分钟。最终,定位到了问题,只修改了一行代码。但几个小时的时间就这样被无谓地消耗了。
那之后,我花了很长时间研究怎么做自动化,最终让这个过程简化了下来。但这件事对我的影响很大,这是我第一次认识到一个部署过程可能对开发造成的影响,也让我对自动化在开发过程内的应用有了属于自己的认识。

你要重视软件设计

最后,我们再来说说我们的本职工作,给别人打造自动化工具中需要的能力:软件设计。
软件设计,是很多人既熟悉又陌生的一个词,说熟悉,很多人都知道,做软件要设计,还能顺嘴说出几个设计模式的名字;说陌生,是因为在我的职业生涯中,遇到真正懂软件设计的程序员少之又少。大多数人都是混淆了设计和实现。
举个例子。有一次做设计的时候,系统需要一种消息机制,让上游系统能够向下游系统发消息,于是我设计了一个连接器去满足这个需求,其他同事则推荐使用 Kafka ,一个工业级别的开源流处理平台,可以很好地契合系统的设计,于是,我们采用了这个方案。
不过,在后续设计的讨论中,大家会经常出现话语体系的分歧。有人说,这个连接器要有怎样的能力,他会说 Kafka 能够如何如何。究其根因,大家在讨论的是设计,有人说的是具体实现,所以,我们很难把问题讨论到一起。
为什么我会如此看重设计呢?在软件开发中,其它的东西都是易变的,唯有设计的可变性是你可以控制的。
同样以前面的讨论为例,尽管 Kafka 这个项目现在比较火,但是我不敢保证它在未来不会被换掉。因为技术趋势的变化实在是太快了。
我不想让我的设计随着某一个技术选型而不断摇摆。如果工作许多年,知识体系只能靠各种新框架新工具支撑,我们做程序员就只剩下疲于奔命了。不懂软件设计,只专注各种工具,其结果一定是被新技术遗弃,这也是很多人经常抱怨 IT 行业变化快的重要原因。
回到 Larry Wall 的说法上,你要想写出一个别人挑不出毛病的程序,你先要懂得软件设计。幸运的是,软件设计这些年的变化真不大,掌握了软件设计再来看很多程序库和工具,学习起来就会容易很多。

总结时刻

最后我来总结下,想要成为一个优秀的程序员,就要让机器为自己工作,而这就需要能够深入理解自动化。我们学习自动化,先要知道哪些东西不要自动化,尽最大的努力不做浪费时间的事。一方面,我们要从需求上规避那些没必要做的事;另一方面,我们也从自身防止 NIH 综合征,争取做一个“懒惰”的程序员。
当然,对于要自动化的事,我们也需要反思一下,在为别人打造自动化工具的同时,我们自己的工作过程有没有很好地自动化。而如果我们想拥有打造良好的自动化工具,我们需要对软件设计有着充分的理解,因为技术的世界变化很快,唯有设计的可变性是程序员可以控制的。
最后给大家插播一个福利,极客时间和得到一起做了个活动,推出了一个联合学习套餐——得到电子书 + 极客时间充值卡,原价 348 元的套餐现在只要 262 元,双倍知识双倍成长。有需要的同学可以点击文稿查看具体的优惠信息。
卖桃者说,明天见。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《卖桃者说》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • 熊斌
    学习算法时,我们要找到那个可重复单元,抽象出一个公式,要避免人肉重复。 工作时也一样,如果一旦发现自己每天都是重复一件事情,就得去尝试交给机器去完成。 程序员“偷懒”,是懒得去重复,而要把精力放在更具创造性的事情上去
    1
    3
  • Geek_494b1e
    战术性懒惰是推动人类进步的生产力
    2
  • leslie
    郑老师的课我记住的是“如果今天的课你只记住一句话”。 每堂课每次课都记住一句关键的话其实看似简单:背后却是“是否能一句话概括今天的课”。 理解透精髓才能一句话概括一篇文章:这个偷懒其实并不简单“台上一分钟,台下十年功”。
    1
  • 小斧
    想要成为一个优秀的程序员,就要让机器为自己工作,而这就需要能够深入理解自动化。我们学习自动化,先要知道哪些东西不要自动化,尽最大的努力不做浪费时间的事。一方面,我们要从需求上规避那些没必要做的事;另一方面,我们也从自身防止 NIH 综合征,争取做一个“懒惰”的程序员。 当然,对于要自动化的事,我们也需要反思一下,在为别人打造自动化工具的同时,我们自己的工作过程有没有很好地自动化。而如果我们想拥有打造良好的自动化工具,我们需要对软件设计有着充分的理解,因为技术的世界变化很快,唯有设计的可变性是程序员可以控制的。
    1
  • 李洪亮
    懒惰催生了许多新机会
  • 我要换个名字
    大部分情况下只有思考过,实践过才知道要优化
  • 轩呀
    做了测试工程师以后,才发现需要学的有好多好多,算法,数据结构,数据库,操作系统,编程语言
  • 子瞻
    如果工作许多年,知识体系只能靠各种新框架新工具支撑,我们做程序员就只剩下疲于奔命了。不懂软件设计,只专注各种工具,其结果一定是被新技术遗弃,这也是很多人经常抱怨 IT 行业变化快的重要原因。
  • 不爱编程的云妮洛普
    害,只有高效才有功夫懒惰,懒惰还没丢饭碗,大神啊
    1
  • 刘潇潇
    尽最大的努力不做浪费时间的事,感觉这个思路真的很有道理,可以应用到除了程序员之外任很多事情上~
收起评论
大纲
固定大纲
能不做就不做
小心 NIH 综合征
你自己的工作够自动化吗?
你要重视软件设计
总结时刻
显示
设置
留言
16
收藏
53
沉浸
阅读
分享
手机端
快捷键
回顶部