编者按:职场或者人生最重要的技能是什么?老板最看重的是什么?解决问题的能力。如何培养解决问题的能力?这事儿也许需要从程序员身上吸取经验。否则的话,你可能就会像个没头苍蝇一样乱打乱撞。Richard Reis总结了程序员的思考方式,并且给出了你如何像程序员一样思考的步骤。
如果你对编程感兴趣,你也许之前已经见过这句话:
这个国家的每个人都应该学会对计算机进行编程,因为它教会你如何思考。
——乔布斯
你可能会在想这究竟是什么意思,像程序员一样思考?怎么才能做到呢?
基本上这一切与更有效地解决问题有关。
本文的目标就是教会你这种思考方式。.
看文本文之后,你将会了解到成为更好的问题解决者究竟需要哪些步骤。
这个为什么重要?
问题解决属于元技能。
我们都有问题。无论大或小。不过有时候我们解决问题的方式可是有点随意。
除非你有一套系统,否则的话你“解决”问题的方式大概是这样的(我开始编码时就是这样):
尝试一种解决方案。
如果这种解决方案无效,再试另一种。
如果还是没有用,重复第二步直到你走运。
你看,有时候你会走好运。但这是解决问题最糟糕的方式!而且非常非常浪费时间。
最好的方式涉及到a)有一个框架,以及b)练习之。
几乎所有的雇主都优先考虑问题解决技能。
问题解决技能几乎毫无疑义是雇主寻求的最重要的资质……比编程语言能力、调试能力以及系统设计能力都要重要。
证明计算思维或者分解大型复杂问题的能力与工作需要的基本技术技能一样重要(如果不是更重要的话)
——Hacker Rank(2018年开发者技能报告)
形成一种框架
为了找到合适的框架,我是按照Tim Ferriss有关学习的书《4小时大厨》里面的建议来做的。
这让我访谈了两位令人印象非常深刻的人:C. Jordan Ball(在Coderbyte的65000+位用户中排名1、2)以及V. Anton Spraul(《像程序员一样思考:创造性问题解决的介绍》的作者)。
我问了他们同样的问题,你猜怎么着?他们的回答都非常相似!
很快,你也会认识他们的。
旁注:这并不意味着他们每一件事的做法都一样。每个人都不一样。你也会有所不同。但如果你从我们都同意是好的原则开始的话,你取得更大突破会快很多。
我发现新程序员的最大错误是关注于学习语法而不是学习如何解决问题
——V. Anton Spraul
那么,遇到新问题时你会怎么做呢?
以下就是步骤:
1、理解
准确了解被问的是什么。大多数疑难问题之所以难是因为你不理解问题(因此这就是为什么这是第一步的原因)。
怎么才知道你什么时候理解了问题了呢?当你能够把问题说清楚的时候。
你还记得问题卡住的时候,你开始解释问题,然后马上看到了此前看不到的逻辑漏洞的时候吗?
大多数程序员都知道这种感觉。
所以这就是为什么你应该把问题写下来,画张图,或者把问题告诉某人(或者某物……有的人会利用橡皮鸭)的原因。
如果你不能用简单的语言解释一个东西,你就没有真正理解它。
——费曼
2、计划
不要在制订计划之前就匆忙投入到问题解决当中(然后指望自己能像没头苍蝇一样找到出路)。先计划好你的解决方案!
如果你不能写下确切的步骤的话,没有东西能帮到你。
在编程中,这意味着不要一言不发就开干。要给你的大脑一点时间来分析问题和处理信息。
要想制订出好的计划,请回答这个问题:
“在输入为X的情况下,返回输出Y的必要步骤是什么?”
旁注:程序员有很好的工具帮助他们做好这个……评论!
3、分解
注意。这是最重要的步骤。
别想着解决一个大问题。你会哭的。
相反,要把问题分解成子问题。这些子问题解决起来要容易多了。
然后一个个地解决这些子问题。从最简单的开始。最简单意味着你知道答案(或者更接近答案)。
之后,最简单意味着这个被解决掉的子问题并不依赖于其他被解决的问题。
一旦你解决了每一个子问题,再将点连成线。
把你所有的“子解决方案”连接起来就能得出原先问题的解决方案。祝贺你!
这一技巧是问题解决的基石。记住它(如果没记住,请把这个步骤再读一次)。
如果我要教给新手程序员一个问题解决技能的话,这个技能会是“问题分解技巧。”
比方说,假设你是一名新程序员,有人要你写一个程序读10个数字并找出第3大的那个。对于菜鸟程序员来说,这可能会是一个艰难的作业,即便这只需要基本的变成语法。
如果你卡住了,就应该把问题分解为简单一点的东西。与其寻找第三大的数字,何妨先找最大的数字呢》还觉得困难?那在3个数里面找出最大的数字呢?或者两个数中较大的那个?
把问题分解到你之大如何去解决的程度然后写下解决方案。把把问题稍微扩展一下,重写解决方案来跟问题匹配,一直这么做,直到你回到原先的起点。
——V. Anton Spraul
4、卡住了?
不过,你可能会想“嘿Richard……这的确很酷,但如果我连子问题也没法解决又该怎么办呢?”
首先,深呼吸一下。其次,这很公平。
但请不要担心,朋友。每个人都会这样!
不同的是最好的程序员/问题解决者会对bug/错误更加好奇而不是感到气愤。
实际上,在遭受打击时这里有三件事情是需要你尝试一下的:
调试:一步步仔细检查你的解决方案找出什么地方出问题了。程序员称之为调试(实际上,所有的调试工具都要做这个)。
调试的艺术在于找出你告诉程序要做的究竟是什么而不是你以为你告诉它做的是什么
——Andrew Singer
再评估:后退一步。换个角度审视问题。有没有什么东西可以抽象为更通用的方法?
对于问题有时候我们太过只见树木不见森林以至于忽视了从更普遍的水平上解决问题的一般原则。[……]
当然,这个的典型例子是一系列连续整数之和,1+2+3+…+n,这个问题一位年轻的高斯很快就能意识到答案是n(n+1)/2,从而避免了必须把一个个数加起来的麻烦。
—— C. Jordan Ball
旁注:重新评估的另一个办法是重新开始。删掉一切再次用崭新的眼光开始。我是认真的。你会对这种办法的有效性目瞪口呆。
调研:啊哈,就是上Google去google一下。没错。不管你有什么问题,可能都已经有人解决过了。找到那个人/解决方案。实际上,哪怕你已经解决了问题也要去查查看!(你可以从别人的解决方案中学到很多)。
警告:不要想寻找大问题的解决方案。只去找子问题的解决方案。为什么?因为除非你拼尽全力,否则就不会学到任何东西。如果你学不到任何东西,那就是在浪费时间。
实践
别指望一周之后你就会变得很棒。如果你想要成为一名好的问题解决者,那就解决很多问题先!
练习、练习,不断地练习。这样下去你意识到“这个问题很容易就能用[在此处插入概念]加以解决。”就只是个时间问题。
如何练习?选项太多了!
国际象棋迷局、数学难题、数独、围棋、地产大亨游戏、视频游戏、cryptokitties等等等等……
其实,成功人士的一个共同模式是练习“微观问题解决”的习惯。比方说,Peter Thiel下国际象棋,Elon Musk玩视频游戏。
Byron Reeves说“如果你想知道3~5年后商业领导力是什么样,那就看看在线游戏发生的事吧。”
回到现在。Elon、Reid、扎克伯格等人都说游戏是自己创业取得成功的基础。
——Mary Meeker《2017年互联网趋势报告》
这是否意味着你就应该去玩视频游戏呢?完全不是。
但是视频游戏是干什么的呢?对了,解决问题!
所以,你应该做的是找一个合适的地方去练习。
比方说,我喜欢变成挑战。每一天我都试图解决至少一个挑战(通常是在Coderbyte上)。
就像我说那样,一切问题都有类似的模式。
结论
就这些了伙计们!
现在你应该对“像程序员一样思考”更了解了吧。
你还知道了问题解决是需要培养的一项不可思议的技能(元技能)。
如果这还不够,注意还知道了如何去练习你的问题解决技能!
这相对酷对不对?
最后,我希望你能遇到很多问题。
你明白我的意思。至少现在你知道了该如何解决它们了!(此外,你也会知道每解决一个问题你都会更上一层楼)。
当你以为你已经成功排除了一个障碍的时候,新的障碍又出现了。但人生之所以有趣正是因为如此……
人生就突破这些障碍的过程——人生就是要突破这一道道的防御工事。
每一次你都会学到一点东西。
每一次你的力量、智慧以及看法都会得到发展。
每一次竞争对手都会被你抛在身后一点点。直到所有对手都看着你的背影望尘兴叹:你也成为了最好的自己。
——Ryan Holiday《The Obstacle is the Way(障碍就是出路)》
现在,去解决一些问题吧!
祝你好运!
编译组出品。郝鹏程编辑。
联系客服