题图:by WLOP,版权付费
周末在 Medium 网站上看到一篇文章,标题是:How to think like a programmer — lessons in problem solving。文章写的很有启发,可惜国内大部分用户都不能访问这个网站,所以我先给出原文链接,然后再用自己的方式解读一下。
原文链接:http://t.cn/Ru4FU6p
这篇文章的作者是 Richard Reis,他在文章中提出了一个解决问题的思维框架,而这个框架,应该是优秀的工程师常用的解决问题的法则。
很多人问我为什么最终选择给 IT 从业者做产品,如果你对互联网或苹果产品感兴趣的话,可能听过乔布斯说过的一句话:每个人都应该学习编程,因为它会教你如何思考。
这句话是乔帮主在二十多年前说的,目前正一步步变成现实。为什么要像优秀的程序员那样思考呢?为什么编程反而会教会我们如何思考呢,这篇文章要说明的就是这个问题,并教给我们一套解决问题的思维框架。
无论是工作还是生活,其过程就是,遇到问题,分析问题,解决问题,然后再遇到下一个问题。这是一个递归的过程,永无休止。用二爷的话说,优秀的人就是让正确的事情持续发生,就是解决了一个问题,然后又解决了一个问题。
如何解决问题呢?很多人的步骤是这样的:
1、尝试一种解决方案
2、失败了,再尝试另一种
3、又失败了,然后再重复 Step 2,直到幸运女神的降临。
这种方式是最低效的,也是最浪费时间的。最好的方式是建立一个思维框架,然后在这个框架上不断的练习自己的解决问题能力。这种思维框架就像是编程语言中的分析、调试和系统设计。基于计算思维分解大型复杂问题的能力恰恰是计算机擅长的,也是程序员们的攻坚利器。
好了,现在我们先来说说思维框架,也就是我们常说的套路。这个思维框架来自 Tim Ferriss 的书《 The 4-Hour Chef 》,有兴趣的可以找来读读。
程序员最大的问题是只关注语法,而不是去学习如何解决问题。那我们碰到一个新问题,如何解决呢?套路如下,四步法则:
碰到一个问题先要真正去理解它,而不是走马观花。很多人语文理解水平不达标,听题看题都不能抓住重点,导致走弯路,解错题,都是常有的事。如何证明你理解了这个问题呢?用自己的话把问题讲出来给别人听,给自己听也行。如果你能讲出来,说明你自己理解了。
编程也是一样,为什么程序员会写下自己的问题,画各种时序图和交互流程,或者与其他的工程师交流讨论,就是确保自己对问题的理解没有偏差。
没有计划,最好不要轻举妄动。如果你不能写清楚接下来要干什么,那没什么人能帮到你。很多人说现在计划赶不上变化,即便如此,计划也是必要的。
我们常说,没什么作战计划在与敌人遭遇之后依然绝对有效,但做计划的过程依然是必要的。缺乏计划会让产品失掉节奏感,员工失去方向,并且很难专注。计划制定的过程,本身是一个制定战略,统一思想,上下齐心的过程。也就是说,大家要登船渡海,扬帆起航了,得弄个罗盘,定好灯塔,然后再出发,这样在行进的过程中,无论怎么折腾,总的方向不会有大的偏差。
做出一个好的计划,并且回答这个问题:如果输入是 X,那我们采用什么步骤可以得到结果 Y?
计算机中的大量算法都用到了分治的方法。分治算法不仅可以帮助我们解决实际问题,还可以提高我们思维的量级。
分治算法的原理就是把复杂的大问题分解成很多的小问题,然后分别求解,再把小问题的解,合并成原始问题的答案。比如归并排序法,比如 MapReduce 算法等,比如现在流行的架构微服务等。遇到难以解决的问题,不妨把大问题分解为小问题,这样既便于分配给别人,也可是实施并行计算或并行实施,还可以量化目标完成的进度。
OKR 其实就是这样一种分解任务的方式,不过平时你可以采用更简单的任务分解,粒度到你能掌握的程度即可,比如任务、子任务,然后进行结果归并等等。
即使我们理解了问题,做了计划,对任务进行了分解,也会遇到卡壳的时候。比如二爷说,我就是解决不了这个子问题咋办吧。你能扣我专栏费吗?不能。
首先让我们深呼吸最清新空气,然后告诉自己,卡住很正常。别担心,每个人都会这样子。
好的程序员和差的最大的区别是,他们对解决这样的问题更感兴趣,而不是恼火。我们该怎么做呢?
1、调试,一步步的跟踪,看看到底是哪里出了问题。程序员叫这个过程为 debug,或捉虫。调试的过程就是找到你真正告诉程序做了什么,而不是你认为程序做了什么。程序调试是一门艺术,解决问题也是。
2、重新评估,退一步海阔天空,往回退一退,看看问题的另一面,是不是有什么可以抽象成另一种通用的方法?当我们陷入细节的时候,可能会忘记出发时的方向,这时候就需要我们重新回顾自己解决问题的过程。另外,重新评估还有一种方式,就是推到重来,删掉所有的东西,以全新的视角去看待问题,这个风险很大,但有时候可以绝处逢生。
不要以为有了这四部法则就可以解决所有的问题。这只是个过程,在过程中你需要不断的 Practice. Practice. Practice。如果你想成为一个解决问题的专家,那么你就需要解决足够多的问题。
基于这四个法则不断练习,才是解决问题的终极之道。很多成功人士就是这么来的,他们之所以成功,是因为他们做了很多成功的事情。
你平时是怎么解决问题的?可以在评论里说说。
卖桃者说:
今天极客时间上线了一个新专栏《从0开始学微服务》。那微服务是用来解决什么问题的呢?用专栏作者、微博技术专家胡忠想的话来说:
微服务是当下最火热的后端架构之一。不管你是一个什么级别的程序员,也不论你在一个什么体量的公司,服务化都是你迟早会遇到的难题。从我的经验来看,实践微服务的过程本身也是一个升级打怪的过程,这中间你会遇到基本上所有后端架构的问题。解决了这些问题,你自然也就理解了那些高深的概念,也就成为了一名架构师,成长和能力提升都是这个过程的附属品。
欢迎加入这个专栏,解决中小互联网服务企业架构微服务化的问题。