开篇词 程序员解决的问题,大多不是程序问题

你好!我是郑晔,一个程序员。

很多人都说,程序员很辛苦,与这个角色联系在一起的词儿,通常是忙碌、加班、熬夜等。

作为程序员,我们将其看作一个值得全情投入的职业,希望能够把精力放在设计算法、改进设计、优化系统这些具有创造性与成就感的本职工作上。

但现实情况却是,许多人因为一些“意外”,陷入了无休止的忙碌,比如:

  • 你辛辛苦苦写的代码还没上线,产品经理就告诉你需求变了;
  • 你拼命加班只因错估了工作量,自己造的“孽”,含着泪也要搞定;
  • 你累死累活做出来的东西和要求不符,只能从头再来;
  • 你大面积地修改代码只是因为设计糟糕,无法适应新的需求变化;
  • ……

诸如此类,不胜枚举。我们很辛苦,但耗费我们大量时间和精力去应付的工作,并不是技术工作,反而是这些看似很“不值当”的事儿。

为什么会这样?

软件行业里有一本名著叫《人月神话》,其中提到两个非常重要的概念:本质复杂度(Essential Complexity)和偶然复杂度(Accident Complexity)。

简单来说,本质复杂度就是解决一个问题时,无论怎么做都必须要做的事,而偶然复杂度是因为选用的做事方法不当,而导致要多做的事。

比如你要做一个网站,网站的内容是你无论如何都要写的,这就是“本质复杂度”。而如果今天你还在用汇编写一个网站,效率是不可能高起来的,因为你选错了工具。这类选错方法或工具而引发的问题就是“偶然复杂度”。

作为一个在软件行业奋斗了近二十年的程序员,我深刻意识到一个遗憾的事实:大部分程序员忙碌解决的问题,都不是程序问题,而是由偶然复杂度导致的问题。

换句话说,只要选择了正确的做事方法,减少偶然复杂度带来的工作量,软件开发是可以有条不紊进行的。

如何减少偶然复杂度引发的问题,让软件开发工作有序、高效地进行,这正是我希望通过这个专栏帮你解决的问题。

许多人工作做事主要依靠直觉,在这个科学越发昌明的时代,我们清楚地看到,人类的直觉常常是错的,就像古人凭直觉认为大地是平的一样。

软件开发也不例外,如果你不曾在做软件这件事上有过学习和思考,形成一套高效的工作方法,只是凭直觉行事,在真实世界中往往会举步维艰。

幸运的是,总会有不同的人在不同的方向上探索不同的做法,一旦通过真实世界的验证,就会沉淀出可供行业直接应用的最佳实践(Best Practice)。

在软件行业中,这样能够提升工作效率的最佳实践已经有很多,但是,学习掌握这些最佳实践是有难度的,其根源就在于,很难找到这些实践彼此间的内在联系。

直觉大多是错误的,最佳实践又多而琐碎,所以在这个专栏中,我会尝试给你提供一个思考框架,帮你在遇到问题时梳理自己真正要做的事情。围绕着这个框架,我还会给你一些原则。

这些原则,是我从软件行业的诸多软件开发最佳实践中总结出来的,也是我如今在工作中所坚持的。这些原则就是一条主线,将各种最佳实践贯穿起来。

这些原则不多,总结起来就四个:

  • 以终为始;
  • 任务分解;
  • 沟通反馈;
  • 自动化。

也许看到这四个原则的名字,你会不以为然,这些说法你在很多地方都看到过,但我想与你分享的内容可能与你想的并不完全一致。

比如:你以为的“终”可能不是终,因为你只是站在自己的角度;你以为自己做了任务分解,在我看来,可能还不够,因为我希望你能够做到微操作;你以为的沟通反馈就是说话聊天,我想告诉你很多技术实践的存在也是为了沟通反馈;你以为自动化就是写代码,我会告诉你,有时候不写代码而解决问题,可能才是一个好方案。

在我看来,想要将精力聚焦在本质复杂度上,提高工作效率,摆脱直觉的束缚,只要掌握上面的四个原则就可以了。

或许你此时会问,这些原则很难吧?其实并不难,在探讨这个专栏的内容时,我的编辑作为软件开发的局外人,经常发出感叹:“这事真的就这么简单吗?这不就是正常做事应该有的逻辑吗?”

是的,就是这样简单,但大多数人没有这样做,因为这些原则在实际工作中很可能是反直觉的。只要打破思维误区,你的整个人都会变得不一样。

下面是整个专栏的目录,我希望能帮助你回答,或者厘清一些开发过程中,曾经遇到,又未曾深入的问题。

当我们详谈这些原则时,我会给你讲述一些最佳实践,让你看到这些原则是如何应用于不同的实践中的。希望我对这些实践的理解成为你的知识地图,让你拥有继续探索的方向。

我做这个专栏的原则是“授人以鱼,不如授人以渔”。我希望你很好地理解这些原则,掌握高效工作的方法。至于最佳实践,你可以自行决定,是直接采纳还是曲线救国更为合适。

介绍一下我自己,我是郑晔,目前在火币网担任首席架构师,写过代码、带过团队、做过咨询,创过业,还维护着一个拿过 Oracle Duke 选择奖的开源项目 Moco,至今仍然在编程一线写着代码。

很长时间里,我一直对如何做好软件充满了好奇,了解过各种技术以及开发方法。做咨询的经历让我有机会见识到不同公司面临的问题;带团队的时候,我也看到很多小兄弟因为不会工作,虽然很努力却收效甚微;而我自己菜鸟时期的笨拙依然是历历在目。

在我看来,所有做软件的人能力都很强,这些问题都只是因为不会工作造成的,但更可怕的是,许多人深陷泥潭而不自知。

在这些年的工作里,我一遍又一遍给别人讲如何工作,逐渐总结出一套自己的工作原则,如今呈现在你面前的就是我这些年思考的总结。

我不指望所有人都能从这个专栏受益,我只想把这个专栏写给那些愿意成长的人。我只是来做一次信息分享,分享一些思考,分享一些做法,希望可以将你从常见的思维误区中带出来。

也许在这个专栏的最后,你发现自己并不认同我的原则,却能够用自己的原则来与我探讨,那么,恭喜你,因为那是最美妙的事情!

精选留言(15)
  • AlphaGao 👍(108) 💬(3)

    直觉在某种程度上也是很重要的吧,不是很多专家都是很依赖直觉的么

    2018-12-25

  • Geek_xicjbu 👍(49) 💬(4)

    购买了课程,学完了目前更新过的所有课程,除了测试这块,比较难推动,其他的基本都原来都践行,或者正在准备在落实。非常有用的课程,个人觉得,比看JAVA或者微服务的一个专栏,更容易学进去,也更有直接的收获,也更迫切需要。技术类课程到处都是,不花钱也可以找到,但是对于程序员的效率提升,整体能力的提升的课程较少,我之前也是一直觉得程序员就是写代码,但是新公司半年的加班告诉我,写代码成本太高,客户,产品经理一句话就可能让你多加几天班,但做出的功能却在业务上并未带来多少意义。我们不是执行指令的机器,也讨厌客户说的那句,你们只管写代码就好了,不要总是提什么拆分任务评估工时,跟她讲条件。按刘慈欣整理定律的方式来整理客户和开发的经验:1.甲方永远觉得付了钱,让乙方多干活也理所当然。2.开发时间是比较难评估的,一定要预留缓冲时间,即使多出来时间,也可以用来优化。3。技术是硬知识,独立思考和沟通,个人管理与项目管理是软知识,软知识是我所欠缺的,有更好的软知识可以事半功倍,可以处理各个上下文的问题。还有最直接的,把甲方拍大腿想的需求推掉,至少晚上更有时间去学习那些技术。

    2019-02-17

  • felix 👍(19) 💬(1)

    这个专栏太棒了,不客气地说,跟我十年工作之后的体会一模一样。平常我也是跟团队教导这四个原则。 努力很重要,方向和方法更重要。我们要付出至少90%的努力,同时达到120%的效果。

    2018-12-26

  • davidce 👍(16) 💬(1)

    t.cn/EGeYlAA,一个讲本质复杂度和偶然复杂度的视频

    2019-01-09

  • 二木又土 👍(12) 💬(1)

    请教下,对于一个明确的技术点,优秀的程序员仿佛能更快的找到解决方案,而且往往就是最佳实践,这是什么原因?从技术点角度讲,它并不需要掌握其他相关知识…

    2019-01-08

  • 妮可 👍(10) 💬(1)

    作为开发,要谈需求,写需求,以及日常业务数据处理,有的时候还要充当客服,确实有点迷茫。希望能通过学习大佬的经验,回到开发本质上,提升工作效率。期待(๑˙ー˙๑)

    2018-12-24

  • Y024 👍(9) 💬(1)

    10x 程序员工作法——郑晔老师希望你记住的一句话版本: https://mubu.com/doc/4mk3cB_cKdv

    2019-11-22

  • 磉盘 👍(7) 💬(1)

    首先做一个,愿意成长的人。其次要承认直觉不总是正确的。 认清程序员的本质工作,避免陷入琐碎的忙碌。 选择正确的方法解决偶然复杂度,投入精力解决必然复杂度。 学习行业的最佳实践,试着用思考框架考虑事情,通过原则处理事情。 最终目的是优化完善自己的做事方式,希望从此专栏里得到启发。 I can do it

    2019-09-15

  • 丁丁历险记 👍(5) 💬(3)

    成不成10x 不重要,读书笔记一定要写的欢快起来。 1 开发严重浪费的成本花哪去了, accident complexity 【极端例子,用汇编写网站】 。 2 如何优化呢( 减少偶然复杂度引发的问题,让软件开发工作有序、高效地进行),我整篇专栏都在说如何处理。 3开发认知。 直觉 到最佳实践(BP),掌握BP 是有难度的,极根源在于【很难找到这些实践彼此间的内在联系】 【附带说一句,科学往往是反直觉的】 4 上套路:四原则(以终为始 任务分解 沟通反馈 自动化) 【初看,其中都蕴含着节约注意力的思考】 5 作者很nx.(细节略 6 作者经常看到某小弟很幸苦,回想自己 青葱岁月,可怕的是这些人不自知陷入了困境,他总结了很多经验,想分享给想成长的人,想通过努力把他们从常见的思维误区中带出来,请大家快速买课,谢谢。

    2019-10-29

  • 火山飘雪 👍(5) 💬(3)

    老师,你好!你说古人是凭直觉,说地是平的,方的,这是不正确的,在古天文学家张衡的《灵宪》已经说明了地是圆的。并且古人并不是通过平直觉或想象就妄下结论的。不要感觉现在人就比古人聪明。

    2019-04-14

  • Max 👍(4) 💬(1)

    要做工程师,拒绝做码农……今天开始打卡,跟着老师走正道😉

    2019-03-29

  • 李伟 👍(2) 💬(1)

    做了十多年开发,特别认同这句话”在我看来,所有做软件的人能力都很强,这些问题都只是因为不会工作造成的,但更可怕的是,许多人深陷泥潭而不自知。“ 个人觉得程序员最需要解决的有两个问题 1、沟通能力,学会怎么与人交流,说白了就是怎么提高情商; 2、如何工作,工作中不能只关注眼前的代码

    2021-08-03

  • helloworld 👍(2) 💬(1)

    希望通过本专栏能对自己的整体能力有一个小小的提升!为什说小呢?因为改变自己既有的行为习惯和思考习惯不是一蹴而就的事情,需要自己真正领悟了后才能从打心眼里付诸行动。

    2019-02-15

  • Seachal 👍(1) 💬(1)

    程序员加班多不是因为技术难题,而是被那些突如其来的复杂问题给绊住了。课程里提到了四个超级实用的原则:先定目标再行动、把大任务拆小、及时沟通反馈、还有自动化流程。这些原则能帮我们提高效率,不再被直觉牵着走。老师还分享了自己在软件行业的经验,教我们怎么避开思维上的坑。

    2024-11-16

  • zhongmin 👍(1) 💬(1)

    弱弱的问下,标题中的 10x 是个怎么解释的

    2021-10-11