极客时间已完结课程限时免费阅读

01 | 10x程序员是如何思考的?

01 | 10x程序员是如何思考的?-极客时间

01 | 10x程序员是如何思考的?

讲述:郑晔

时长10:30大小9.63M

你好,我是郑晔。
在开篇词中我们提到,程序员在工作中遇到的很多问题,大多不是程序问题,辛苦而低效的工作,多数是由偶然复杂度导致的。那这个由于偶然复杂度造成的差距会有多大呢?
1975 年,弗雷德里克·布鲁克斯(Frederick Brooks)出版了软件行业的名著《人月神话》,他给出了一个统计结果,优秀程序员的开发效率是普通程序员的 10 倍。40 多年过去了,这个数字得到了行业的普遍认同。
成为 10x 程序员是很多程序员的追求。但工作产出并不只是由写代码的效率决定的,一些不恰当工作方法很大程度上影响着你的产出。
在接下来的这段时间里,我希望通过这个专栏和你一起探讨,作为一个程序员,该如何更高效地工作,怎样才能把时间和精力尽可能地放在处理本质复杂度的事情上,减少在偶然复杂度上的消耗。
作为整个课程第一讲,我就从我常用的一个思考框架开始。

一个思考框架

我曾经组织过针对应届毕业生的培训,第一堂课我往往亲自操刀,其中有一个头脑风暴的环节“畅想未来”,我会让大家思考三个问题:
我现在是个什么水平?
我想达到一个什么水平?
我将怎样到达那个目标?
大家会围绕着这三个问题,从各种角度展开讨论。这是一个有趣的练习,你会发现大家“最擅长”的是回答第一个问题:我现在处于什么水平?和有经验的人相比,他们大多自认为比较“菜”。但对于后两个问题的讨论,却可以切实看出人和人之间处理问题的能力差异。
有人通过之前的资料搜集,已经对自己的未来有了一个打算。比如想成为一个研发大牛,或者想做一个开源软件等,也就是说,对于第二个问题,他有明确的答案。
而有的人则是一脸茫然,他很可能根本没有考虑过这个问题。而从题目本身来看,目标相对清晰的同学,才会进入到第三个问题,而茫然的同学,则完全无从下手。
那么我为什么会问这几个问题呢?我是想让大家跳出现有的思考模式,摆脱仅凭直觉“闷头做事”的习惯方式,把低着的头抬起来,看一眼未来,给自己找一个方向。
否则,如果你对未来没有定位,是茫然的,尽管你也知道要努力,但劲儿该往哪里使呢?如果使劲的方向不对,那么你越使劲儿,可能会在错误的路上跑得越远。南辕北辙的道理大家都懂,但具体到自己的工作和发展上,真正能体会并实践的却是少数。
其实,这三个问题来自一个思考框架。在给其他公司团队做咨询时,我也经常会运用到它,原来的问题是:
Where are we?(我们现在在哪?)
Where are we going?(我们要到哪儿去?)
How can we get there?(我们如何到达那里?)
这三个问题实际上是帮我们确定:
现状;
目标;
实现路径。
如果一个人能够清晰地回答出这三个问题,通常意味着他对要做的事有着清晰的认识。这个框架虽然看似简单,但却非常有效,它已经成为我工具箱里一件非常称手的思考工具。
在我的职业生涯里,与很多人讨论不同的事时,我都会用到这个思考框架的不同变体,而在这个专栏里,我也会用它来帮助回答“怎样高效工作、怎样做好软件”这件事。

四个思考原则

在实际的工作中,这个思考框架会帮助我更好地了解自己的工作。比如,当一个产品经理给我交代一个要开发的功能特性时,我通常会问他这样一些问题:
为什么要做这个特性,它会给用户带来怎样的价值?
什么样的用户会用到这个特性,他们在什么场景下使用,他们又会怎样使用它?
达成这个目的是否有其它手段?是不是一定要开发一个系统?
这个特性上线之后,怎么衡量它的有效性?
如果产品经理能够回答好这些问题,说明他基本上已经把这个工作想得比较清楚了,这个时候,我才会放心地去了解后续的细节。
我们用思考框架对照一下,为什么我会问这些问题。一般来说,一个新特性要开发时,现状我是知道的。所以,我更关心目标,这里“为什么要做这个特性?”就是在问目标,“给用户带来怎样的价值”是在确定这个目标的有效性。
接下来,我会关注实现路径,用户会怎么用,是否有其他的替代手段,我需要了解产品经理的设计是经过思考的,还是“拍着脑袋”给出的。衡量有效性,则是要保证我的工作不会被浪费。
通过这个例子,我给你展示了怎么用这个思考框架提出问题。但我估计你更想了解的是,我怎么会想到问这些问题。给出思考框架是为了让你明白为什么要提出问题,而具体问题要怎么问,就可以遵循下面这四项原则:
以终为始;
任务分解;
沟通反馈;
自动化。
这是我从思考框架延伸出来的。在这个专栏里,我会围绕这四项原则和你详细讨论。
解释一下,以终为始就是在工作的一开始就确定好自己的目标。我们需要看到的是真正的目标,而不是把别人交代给我们的工作当作目标。你可以看出这个原则是在帮助我们回答思考框架中,Where are we going?(我们要到哪儿去?)这个问题。
任务分解是将大目标拆分成一个一个可行的执行任务,工作分解得越细致,我们便越能更好地掌控工作,它是帮助我们回答思维框架中,How can we get there?(我们如何到达那里?)的问题。
如果说前两个原则是要在动手之前做的分析,那后面两个原则就是在通往目标的道路上,为我们保驾护航,因为在实际工作中,我们少不了与人和机器打交道
沟通反馈是为了疏通与其他人交互的渠道。一方面,我们保证信息能够传达出去,减少因为理解偏差造成的工作疏漏;另一方面,也要保证我们能够准确接收外部信息,以免因为自我感觉良好,阻碍了进步。
自动化就是将繁琐的工作通过自动化的方式交给机器执行,这是我们程序员本职工作的一部分,我们擅长的是为其他人打造自动化的服务,但自己的工作却应用得不够,这也是我们工作中最值得优化的部分。
这四个原则互相配合,形成了一个对事情的衡量标准。总体上可以保证我的工作是有效的,在明确目标和完成目标的过程中,都可以尽量减少偶然复杂度。
怎么把这四个原则用在工作中呢?我们回过头来看一下前面的场景,产品经理把要做的功能特性摆在我面前。站在以终为始的角度,我需要了解真正的目标是什么,所以,我会关心为什么要做这个特性。为了保证目标是有效的,我会关心它给用户带来的价值
有了任务分解的视角,我需要将一个大的目标进行拆解,如果我要达成这个目标,整体解决方案是远远不够的,我需要把任务分解成一个一个小的部分。所以,我会关心一个一个具体的使用场景
一方面,我会了解到更多的细节,另一方面,当时间紧迫的时候,我会和产品经理来谈谈究竟优先实现哪个场景。
为什么要学会沟通反馈?因为我需要明确,自己是否真正理解了产品经理提交的需求。所以,我要不断地问问题,确保自己的理解和产品经理交代的内容一致。
另外,我也需要保证我的产品做出来确实能够达到目标。所以,我会关心它上线后的衡量手段。因为我知道,这个行业里有太多代码上线后,从来没有运行过。
自动化的角度很有意思,我们做的方案通常是一个自动化方案,但我们需要了解这个方案没有自动化之前是怎么做的。如果不自动化,用户会怎么用。所以,我会关心是不是还有其它替换方案,比如,买一个现成的服务。因为很多需求的提出,只是因为我们有了一个开发团队而已。
好,现在你已经对这四个原则在工作中的应用有了一个直观的认识。但你也会发现,我问的这些问题似乎已经“超纲”了,超过了一个普通程序员应该关注的范围。但这就是真实世界,它不像考试一样,有一个标准答案。
我们不是一个人孤独地在工作,而是与其他人在协作,想要做到高效工作,我们就要“抬起头”来,跳出写代码这件事本身。所以,我在开篇词里说,程序员解决的问题,大多不是程序问题。
可能你对这些原则的了解还没过瘾,没关系,这篇文章只是让大家清晰地了解思考框架和原则的背后逻辑。接下来,我会结合行业里的最佳实践,给你进一步讲解这些原则和具体应用。

总结时刻

大多数人工作低效是由于工作中偶然复杂度太多造成的,只要能够更多地将注意力放到本质复杂度上,减少偶然复杂度造成的消耗,我们“真实”的工作效率自然会得到大幅度提升。
而想要减少偶然复杂度的消耗,就要了解一些高效的工作方式和行业的最佳实践,而这一切是可以用统一的框架进行思考的。
运用这个思考框架,我们需要问自己一些问题:
Where are we?(我们现在在哪?)
Where are we going?(我们要到哪儿去?)
How can we get there?(我们如何到达那里?)
为了把这个框架应用在我们程序员的工作中,我给了你四个思考原则:
以终为始,确定好真实目标;
任务分解,找到实施路径;
沟通反馈,解决与人打交道出现的问题;
自动化,解决与机器打交道出现的问题。
如果今天的内容你只能记住一件事,那请记住:面对问题时,用思考框架问问自己,现状、目标和路径。
最后,我想请你思考一下,如果把这个思考框架运用在你的职业发展规划上,你会如何回答这三个问题呢?
感谢阅读,如果你觉得这篇文章对你有帮助的话,也欢迎把它分享给你的朋友。
分享给需要的人,Ta购买本课程,你将得20
生成海报并分享

赞 140

提建议

上一篇
开篇词 | 程序员解决的问题,大多不是程序问题
下一篇
02 | 以终为始:如何让你的努力不白费?
unpreview
 写留言

精选留言(87)

  • 此方彼方Francis
    2018-12-26
    这个方法论恐怕要建立在开发和产品双方地位比较平等的基础上。 以我们目前的现状,很多时候产品要做这需求的理由就一个:老板要的!

    作者回复: 后面还真有一篇怎么对付顶着老板名义做事的产品经理,敬请期待。

    共 4 条评论
    118
  • 2018-12-26
    现状:勉强的架构师、技术管理 目标:架构师、cto 途径:1.理论加强学习:togaf学习理论 2.实践技能应用: netty、redis、mysql、niginx、微服务架构、分布式架构 3.做微信公众号,多思考多积累经验,形成自己的套路,同时形成影响力。
    共 5 条评论
    82
  • 张维元
    2019-01-03
    思考框架是道,原则是演化下的术,我们从 A → B,有无穷无尽的路径,最有效的唯有那条直线。本质上,各个维度、原则(不限于作者提到的四项原则)都是帮助我们更好地定位 A 在哪里,B 在哪里,那条直线在哪里。 这个思考工具算是吸收了,四项原则也是有借鉴意义,谢谢

    作者回复: 这个理解真棒!

    共 3 条评论
    54
  • Xunqf
    2019-01-05
    我们的产品经理的回答是:“你是在拷问我吗?这个你不需要知道,做出来就好了。”或者:“先做出来上线看看用户的反馈,不行了再下掉。”又或者:“这个是老板提的需求,优先级最高”

    作者回复: 不靠谱的产品经理,总拿老板说事,刚好是后面的两个主题,欢迎关注! 补充一点,不允许问问题的产品经理一看就是虚的,如果他不让提问,那就把问题带到老板面前,让老板判断一下,自己问的问题是不是合理,扩大上下文是解决问题的一个好办法,对,这也是后面的一个主题,敬请期待!

    共 4 条评论
    34
  • Y024
    2018-12-27
    老师举得针对拿到产品经理新特性要求之后的灵魂四连问,刨根究底,其实也是为了避免 X-Y Problem,免得浪费无谓的人力和精力。关于 X-Y problem,可以看下隔壁专栏作者耗叔的 https://coolshell.cn/articles/10804.html (我保证不是耗叔派来的,哈哈
    17
  • David Mao
    2018-12-26
    结合工作中每年都要基于现状制定KPI,但往往忽视了最重要的环节,实现途径或方法。老师讲的逻辑很清晰,简单明了。虽是简单的三个环节,但每个环节要想认识清楚,还是需要很深的功力。总结起来: 1. 认清现状 2. 制定切合实际的目标 3.落实切实可行的实现方法。
    展开
    15
  • pony
    2020-07-16
    想起吴军老师讲的三条边,组成的“工”,上面是目标或者行业边界,下面是自己的现状,中间的边就是实现路径,人生主要就是要找到这条路径,下面的一条边代表基础和能力,越粗越好

    作者回复: 同是吴军老师的读者 🤝

    14
  • codeparser
    2018-12-26
    以终为始的理念还是非常有启发的,具体工作中往往会陷入细节中而看不到目标或者忽视目标,例如把实现路径当成了目标。同时,有了目标还需要不断的反思,孔子日三省吾身,我们起码按季度需要重新总结和考虑一下目标和路径的合理性。另外,文中讲到的沟通和自动化如果更加深入些就好了

    编辑回复: 后续内容会针对这四项原则进行深入探讨的,加油💪

    12
  • 磉盘
    2019-09-15
    说真的,真羡慕年轻人更早得到看到这些文章,本人马上进入不惑之年,已是走在讨探的边缘。因为过于平凡没有走出人生华丽的线条,学专栏是希望给职业续续命。 在职业中如果能持续地解决几个问题,会有不错的机会,正如人生走对几个关键点。此专栏分享的一套行之有效的方法论,职场中是很少有人提点的。 人的思想很难改变的,文中提到的原则都听过,缺少有系统地使用过。希望接下来的学习可以深化成自己的行事原则,和思考模式。 这个思考框架很有意思,像极了哲学的三个终极问题:我是谁?我从哪里来?我要到哪里去? 思考模型不局限于特定问题,而是通过这套模型去解决现实中的实际问题。作者说这套框架只是工具箱里的一件,不知道还有哪些好用的工具,期待分享。 不说了去看下一遍了
    展开

    作者回复: 学习是容易的,应用是困难的。

    共 3 条评论
    9
  • 布衣骇客
    2018-12-26
    老师的建议和指导都是非常有效,而且“感觉非常可行”,可是实际现实的情况,却有太多意外,我个人曾经在某银行的外包团队中,协同开发一个商户-收银以及集成了各种第三方的团队的接口等等,这个大项目大概有300人以上,由此我得leader不在,我代表开会,足足开了3-4个小时(约30个leader)。杂乱无章,从我个人开发角度无法去高屋建瓴的把握全局应用场景,使用价值之类的。但是每个模块之间互相调用联系,系统升级需要协作。首先,这里沟通成本很高,最要命的是需求变动,无法预测,有的时候新增需求,技术leader直接告诉我在什么地方写一个action,调用一个方法之类的。基本就是码农搬砖之类的,我想提的建议是:希望老师在有丰富理论知识,能给我们有一些实践中的例子,或者列举一些举一反三的例子,理论+实践,我觉得才是最佳法则(没有说老师只是有实际,没有实践,莫怪),第一次这么长的留言,望采纳,谢谢您了
    展开

    作者回复: 你的情况就是工作的上下文不足,这种情况你会很纠结,需要扩大自己的工作上下文,了解更多东西。这个话题后面会讲到。

    7
  • 业余爱好者
    2020-03-04
    解决问题的思考框架的四大要点。以终为始,任务分解,沟通反馈,自动化。 (其实我觉得自己当前在哪里有时并不明晰,人总是存在各种偏见傲慢不理性。) x-y问题描述的就是错把手段当目的的没有以终为始的一个典型反例。 解决问题第一步就是定义问题,知道自己要解决的问题的实质。爱因斯坦的名言说要解决问题的大部分时间应该拿来弄清问题本质。不过他指的解决问题应该只包含找到解决方案这部分,不包含具体实施。知道了问题的实质之后开始拆解问题,进行任务分解。通常,弄清问题本质和任务拆解是一体的,分不太开。 关于任务分解,也就是找出解决方案,学问就大了。其中涉及各种思考框架,包括通用的如金字塔原理,各种领域套路,4c3p。这部分就需要学习工作中常常总结了。 沟通反馈透露出控制论的思想。在行动中根据反馈不断调整自己的行动。 自动化,在程序员这一职业中更加长见,程序员本身做的事情就是在帮助别人自动化。而自己的工作也不能忘了自动化。从软件的整个生命周期中,大量存在各种使用的工具。不过不能停留在学习这些工具的使用上,而是应该追问这些工具出现的原因,而自己的工作中有哪些工作是可以使用工具帮忙完成的。
    展开

    作者回复: 这个总结角度很不错!

    6
  • 2019-01-01
    现状:中级Java程序员 目标:架构师 实现路径:主要从技术和管理两个方面进行修炼提高,针对每个方面的能力要求,先制定长中期目标,然后拆分中期目标为短期目标,一个个击破,同时要检验目标达成效果,不断优化,从而实现自己的最终目标
    7
  • Geek_fe0336
    2019-03-21
    很多团队的问题是人的问题,那些小公司的团队,收入不高,生活压力大,本身就生活在焦虑和恐惧中,哪有心情讨论需求的背景,要解决的问题,解决方案,非功能需求......。最后就是程序员看需求人员2,需求看程序员无法进行人类沟通。

    作者回复: 这就是大多数人连1x 程序员都算不上的原因。

    5
  • 红糖白糖
    2019-03-02
    这让我想起了金字塔原理。在解决问题领域可能是这样的: 1. 目标导向,在这里也就是以始为终。思考自己的目标 2. 分类,也就是思考从当前位置到目标有哪些影响因子 3. 优先级,在这里其实是选择适合的方法 4. 解决问题 解决问题的具体方法那就该是: 1. 任务分解 2. 自动化 3. 沟通反馈
    展开

    作者回复: 用金字塔原理解释是个很恰当的角度,后面我也会讲到。

    4
  • Demi
    2018-12-26
    计划赶不上变化,怎么办?

    作者回复: 计划太大,变化就可怕,后面很多内容就是在讲拥抱变化。

    4
  • 妮可
    2018-12-26
    既是产品经理也是项目经理也是程序员,所以全部是我本职工作,IT部部长要的结果就是我的目标。
    4
  • aoe
    2021-11-14
    现状:程序员 目标:飞出银河系 途径:写一个呼叫系统联系舰队
    2
  • escray
    2020-05-28
    我的现状勉强算是 1X 程序员吧,年龄不小,工作时间很久,但是估计能力水平大概和 3 年左右的程序员相仿。知道一些软件开发的思想,英文水平尚可,缺乏编码实践和项目经验。 目标是能够成为一个 freelancer,利用技术手段帮助客户实现业务目标。不过现在经济形势不好,所以年内的目标是找到工作。 最后,我怎么达到目标?对于程序员来说,无非是编码能力、基础知识,再加上一些软技能的学习。在看算法,在学 Certificated Scrum Developer,后面会继续练习测试驱动开发和重构,还可能会去考 PMP。 处于一个有很多可能的时间点(待业),似乎有很多条路可以选,当然其中的一个可能是找不到工作。 在留言里面看到 @One Day 同学,半年左右的时间内的进步。据我上一次看这篇文章大概已经一年多时间过去了,自己有进步,但是仍然有成长空间。 对于那些无法沟通的老板和项目经理,我觉得自己能做的就是提高自己的技术能力和软技能,尽可能找到好的团队,和优秀的人一起工作,这样专栏里面的内容才用得上。
    展开

    作者回复: 日拱一卒。

    2
  • Jerry Wu
    2020-04-03
    现状:中级Java程序员 目标:高级Java程序员 途径: 1. 理解常用的框架:项目实践、阅读源码; 2. 理论学习:JVM原理、算法、网络协议; 3. 运营自己:发朋友圈、写技术博客、写公众号文章;
    展开

    作者回复: 加油!

    2
  • 张永峰
    2019-11-18
    你的视野和胸怀决定了你最终能走多远。 很多时候,尤其是在刚毕业的前几年,要努力修炼内功,不该抬头看路的时候,就低头做事。如果你能得到的评价是“靠谱”二字,那么离成功也许就不远了。

    作者回复: 走路的时候要看路

    2