Steve Jobs 有一句名言:「我们国家的每个人都应该会编程,它能教会你如何思考」。
这里并非让大家都去从事程序员的工作,而是像程序员一样去思考问题,解决问题。在美国、意大利等西方国家,编程已经成为中小学甚至是幼儿园课程的一部分。2014 年,奥巴马曾亲自上阵,编写了一段代码,鼓励民众学习编程,培养编程思维。
很多人,包括一些初级程序员,在面对复杂问题时。习惯从历史经验出发,随机尝试各种解决方案,成功与否就看经验够不够了。他们很少从框架性思维出发,寻求解决问题的方法。
这会导致解决问题的过程耗时耗力,最终效果还不见得好。
HackerRank 在 2018 年开发人员技能报告中就提到,在不强调技术重要性的前提下,拥有框架思维或分解大型复杂问题的能力,比熟练掌握编程语言更重要。
很多有经验或者擅长解决问题的程序员,优势就在于这种框架思维,也可以理解为程序员思维或者编程思维,这种思维除了编程时适用,也可以帮助所有人解决中的问题。
什么是程序员思维?
Tim Ferriss 的著作《 The 4-Hour Chef 》(译作:每周四小时下厨房),或许能给你一些启示,不过这本书目前似乎还没有中文翻译版。这位作者是著名的效率学家,TED 上也有非常经典的演讲,他还写了《每周健身四小时》和《每周工作四小时》,指导人们高效生活。
另外 V·Anton Spraul 的《像程序员一样思考》(英文书名:Think Like a Programmer),已有中文译本,阅读更方便噢。
下面讲解一下编程思维,可以从以下几个方面来理解:
1.理解问题
一个问题之所以困难,是因为你不够了解它。著名物理学家 Richard Feynman 曾说过,「如果你不能用简单的语言来解释某件事,就证明你并不了解这件事」。
所以在解决一个问题时,要先理解这个问题,直到能够用简单的语言描述出来。
很多程序员都有过这样的经历,在向别人解释一个问题的过程中,总能发现一些此前没有留意到的逻辑漏洞,而这些发现很可能是帮助他们解决问题的关键。
2.制定计划
也就是制定解决问题的步骤,不要在没有想清问题解决步骤的前提下,盲目执行。
对程序员来讲,就意味着在编程时,不要直接开始写代码,而是要先理清思路,分析问题,处理信息,制定一个输入 X,输出 Y 的所需步骤。
3.分解问题
在面对一个不能马上解决或者比较复杂的问题时,最好的办法是把它解构成好几个子问题,然后从最简单的问题着手解决。一旦你解决了这些子问题,只要将这些子问题连接起来,大问题也就顺利解决了。
举个例子,一名初级程序员要编写一个程序,要求从 10 个数字中找出第三大的数字。虽然该程序只需要掌握一些最基本的编程语言,但对于一个刚接触编程的人来讲仍然很困难。
这时你可以试着把这个问题分解一下,而不是直接寻找第三大的数字。
比如先确定 10 个数字中最大的那个,再以三个数字一组找出其中最大的,或者在两个数中找出最大的。然后再把这些组内最大的数字重新排列组合,直到确定第三大的数字。
将一个大问题进行分解,分解的最小单位一定是你能直接得出答案的,然后把这些子问题连接起来,稍微扩展一下就能得到最终答案。
4.面对困难
将一个大问题分解成数个子问题后,如果我们连子问题都无法解决,该怎么办呢?这时候不要因畏难情绪而退缩,反而要继续寻找解决问题的办法。
调试:也就是重新检查解决方案的每一步,看看是不是解决方案出现了 Bug,如果是,找到并解决它,这个过程用程序员的话来讲就是「调试」。
重新评估:如果没有找到 Bug 那就换个角度重新审视这个问题,看有没有更一般的方法来解决。注意,这里的重新评估是指从一个全新的角度确定解决方案。
常年在编码挑战网站 Coderbyte 上排名前三的 C. Jordan Ball 说过:「有时候我们会迷失在问题的细节中,而忽略解决该问题的一般性方法。比如在计算 1+2+3+……+n 时,利用公式 n(n+1)/2 可以很快得到答案,避免了做一些冗长,甚至会出错的加法。」
研究历史案例:很多问题其实前人已经给出了答案和解决方案,研究他们的案例可以帮你解决很多类似或者新的问题,还能在研究过程中提炼思考问题的方式,这对解决其他问题很有益处。
如何培养程序员思维?
如果你想成为一个优秀的问题解决者,最好的办法就是在日常生活中,培养自己解决问题的思维和能力。很多事情都是相通的,解决问题 A 的能力,同样可以用到问题 B 中。
也就是说,你可以在很多不用付出太大成本,比如游戏或者其他你感兴趣的事情上,训练自己解决问题的能力,培养解决问题的思维。
PayPal 创始人 Peter Thiel 就经常通过下棋来培养这种思维,Elon Musk 则是通过电子游戏。此外,Linkedin 联合创始人 Reid Garrett Hoffman、Facebook 创始人 Mark Zuckerberg 等知名企业家也曾表示在玩电子游戏的过程中,找到了解决实际问题的办法。
举这些例子不是说玩游戏就能成功,只是想告诉大家,培养解决问题的思维并不难,通过生活中的一些微观问题就能做到。
另外,如果你是程序员,或者对编程感兴趣,可以在 Coderbyte 上尝试一下编程挑战,对提升编程思维很有帮助。
面对问题,解析问题,然后逐个击破,就是「编程思维」。
虽然不敢说所有的程序员都会这样去思考问题,但这种方法确实很有效。而且,你经历的问题越多,解决问题的能力就越强。
这样看来,资深程序员的工资之所以比初级程序员高,原因可能不在编程技巧或工具上,而是思维上的不同,很多公司招人时都强调工作经验,多少也有这方面的因素。