像程序员一样思考——解决问题的编程思维
2019年06月06日 由 sunlei 发表
418962
0
如何你对编程感兴趣,你可能见过这句话:
“Everyone in this country should learn to program a computer, because it teaches you to think.” — Steve Jobs
(这个国家的每个人都应该学习计算机编程,因为它教会你思考—Steve Jobs)
你可能还想知道,像程序员一样思考到底意味着什么?我怎样才能做到?
从本质上讲,这是一种更有效的解决问题的方法。
而这篇文章中,就是围绕着如何达到这个目标展开的。
为什么高效解决问题的能力很重要?
我们每天都有遇到很多问题,无论大的小的。我们处理这些问题的方式有时候都是随机的。
除非你有个系统,否则用“随机的方式”可能就是你“解决”问题的方法(我初学编程时候就这么做的):
- 1、尝试一个解决方案
- 2、如果不行,再试另一个
- 3、如果没有效果,重复第二步,直到你解决了这个问题
凭运气这种方法实际上是解决问题的最糟糕的方法!也是非常浪费时间的。
最好的方法是:
“几乎所有的雇主都把解决问题的能力放在首位!解决问题的能力已经是雇主们寻找程序员、测试工程师、系统设计师等最看重的一个方面。
计算机系统思维和能将大而复杂的问题分而治之的能力和一个职位要求的专业技术同等重要。”
拥有一个框架
为了找到正确的框架,我遵循了Tim Ferriss 关于学习的书《the 4-Hour Chef》中的建议, 其中有两个让我印象深刻的人:C.Jordan Ball (是 Coderbyte 65000+ 用户的第一二名),和 V.Anton Spraul ( << Think Like a Programmer: An Introdution to Creative Problem Solving>> )。
我问了他们同样的问题,你猜怎么着?他们的回答竟然非常的相似!
接下来,你很快就能认识他们了~~
p.s.当然,其实这也并不意味着它们每件事情都是以同样的方式进行,每个人都是独一无二的,但如果你从我们都认同的好的原则开始,你也会走的更远更快。
我看到新程序员犯的最大错误是专注于学习语法,而不是学习如何解决问题。by - V. Anton Spraul
那么,当你遇到新的问题时,你应该怎么做呢?
步骤如下:
1、理解
清楚知道自己面对的是什么问题。大多数难题之所以难,是因为你不理解它们,所以这个是第一步。
如何知道你已经理解了一个问题呢?——当你能用简单的、自己的语言解释它的时候。
你可能会记得,当你被困在一个问题上,一旦开始解释它,你就立刻看到逻辑上的漏洞,而且漏洞很可能也是你以前没有看到的。
大多数程序员都知道这种感觉吧!
这就是为什么你应该把你的问题写下来,画个图,或者告诉别人。
如果你不能用简单的语言来解释某件事,说明你没有理解它 — Richard Feynman
2、计划
不要在没有计划的情况下,一头扎进解决问题的过程中(也许你能靠运气解决),我建议你还是制定解决方案的计划吧!
如果你不能写下具体实施的步骤,什么也都不帮不了你。
在编程中,切记不要钻牛角尖。给你的大脑一定的时间来分析问题和处理信息。
为了得到一个好计划,回答这个问题:
已知输入 X,为了输出Y所需要的步骤什么?
p.s.程序员的世界里面有一个伟大的工具用来助攻,那就是注释!
3、拆分
请注意,这是最重要的一步
不要试图一次就解决一个大问题,不然你可能会哭的。
相反,当你把这个问题进行拆分成一个一个子问题,这些子问题就更加容易解决了。
然后,逐个解决每个子问题,从最简单的开始。最简单意味着,你知道答案(或者更加接近那个答案)。
另外最简单的方法意味着子问题的解决并不依赖与其他问题的解决。
一旦你解决了每个子问题,再把这些点连接起来
连接所有“子问题解决方案” ,将为你提供的原始问题的解决方法!那么恭喜你,你做到了!
这种技巧呢,是解决所有问题的基石,请记住它(建议你重新再读一遍这个步骤)
如果我能交给每一个初学者一种解决问题的技能,那就是“分解问题的能力” ,例如:假设你是一个新程序员,你被要求编写一个程序,读取10个数字,然后算出哪个数字是第三大的,对于一个全新的程序员来说,这可能是一项艰巨的任务,尽管它只需要基本的编程语法
如果你陷入困境,你就应该把问题简化分解。而不是专注在第三个大的数字上。如何在一个整体中先找到最大的那个数呢?还是太难了?那从三个数字中找到最大的那个呢? 还是太难? 那如果是寻找两个较大的那个呢?
将问题分解到你知道如何解决问题,然后顺着问题分解的步骤,反向的逐渐更改解决方案,直到解决分解之前的那个问题— V. Anton Spraul
4、如果卡住了呢?
现在,你可能正坐在那里想,这几个步骤看起来还不错嘛,但如果我卡住了,连子问题都解决不了该怎么办?
首先,深呼吸。因为这个很正常!
别担心,朋友,每个人都会这样子!
不同之处在于,最好的程序员/问题解决者,对bug/错误更加好奇,而不是恼怒!
事实上,当你遇到困境时,有三件事情可以尝试:
“debug 的艺术关键在于你究竟让软件干了些啥,而不是你以为你让软件干了些啥。” - Andrew Singer
- 重新审视问题:切换到宏观视野。从另外的角度去审视问题。有什么是可以被抽象成通则么
“有时,我们迷失在细节里了,如果我们使用通则也许能奏效。
一个经典的案例:连续整数求和问题,1+2+3 + … + n, 年少的高斯很快给出了解法:(n + 1) / 2, 避免了无聊的累加计算
旁注:另一种从新审视的方法是,从头开始。删除所有的实现,从新开始。有时,它是如此行之有效,让你目瞪口呆。
- 搜索:Goolge 一下,你就知道。不论你碰到什么问题,也许被人解决过。找到它。事实上,即使,问题已经解决,你也应该常常这样做。(你会收获很多)
警告:不要 Google 你遇到的“大问题”,而是子问题。为什么?如果你遭遇一点挫折,你不会学到任何东西,只是浪费时间而已。
5、实践
不要期望仅仅一个星期就能变的很厉害,如果你想成为一个好的问题的解决者,就应该去解决很多问题!
练习、练习、练习!迟早你会认识到这个问题可以通过很轻松的方式来解决。
那么如何练习呢?其实也有很多选择的!
比如:象棋游戏、数学问题、数独、视频游戏、等等等等 .........
事实上,成功人士的一个普遍模式是他们练习“围观解决问题”的习惯。例如: 彼得.泰尔(Peter Thiel )下棋,埃隆.马斯克 (Elon Musk) 玩电子游戏....
拜伦.里夫斯(Byron Beeves)说,如果你想知道三到五年后商业领导力会是什么样子,那么就看看网络游戏正在发生什么吧
快进到今天。埃隆马斯克、雷德.霍夫曼、马克.扎克伯格和其他许多人都表示,游戏是他们称建立公司的基石。——Mary Meeker (2017年互联网趋势报告)
这意味着你应该只玩电子游戏? 也不全是。
但是这个到底跟电子游戏有什么关系呢? 没错,就是问题解决!
所以,你应该做的是,找到一个练习的出口,可以让你解决很多小问题的东西。
(理想情况下,还是你喜欢的东西,那就更好了)
正如我所说,所有的问题都有相似的模式!
6、结论
现在,你知道“像程序员一样思考” 是什么意思了。
你也知道解决问题是一种非常重要的元技能。
如果这还不够,你肯定也知道了如何练习解决问题的技巧。
你看,这是不是看起很酷!
最后,祝你遇到很多问题哈哈。
现在,去解决一些问题吧!
哈哈,祝你好运~~