如何像程序员一样思考
大数据文摘出品
编译:罗然、Hope、云舟
这个国家的每个人都应该学习计算机编程,因为它可以教会你思考。—史蒂夫·乔布斯
如果你对编程感兴趣,你以前可能看过这句话
大家可能还不是很明白,像程序员一样思考是什么意思?又是怎么做到的呢?
从本质上讲,这是解决问题的一种更有效的方法。
在本文中,我就将把这种方法教给你。
到最后,你会明确地知道解决问题需要的步骤,从而能够更好地解决问题。
为什么解决问题的能力很重要?
因为解决问题的能力是最基本的能力。
世界上一直都存在大大小小的问题。我们如何处理它们有时是......非常随机的。
除非你有一个系统,这可能是你“解决”问题的方式(这是我开始编程时所做的):
1.尝试使用解决方案。
2.如果不起作用,尝试另一个。
3.如果不起作用,重复步骤2,直到运气变好。
即使你的运气一向很好,这种方法也并不值得使用。事实上,它可能是最糟糕的解决方法,因为会浪费大量的时间。
最好的方法包括:1.设立一个框架,2.不断实践。
几乎所有雇主都会优先考虑解决问题的能力。解决问题的能力应该是雇主在求职者中寻求的最重要的特质......而不仅仅是编程语言的熟练程度,调试和系统设计的能力。展示计算思维或分解大型复杂问题的能力与工作所需的基本技能一样有价值(甚至是更加有价值)。 —黑客等级设立一个框架
为了找到合适的框架,我参考了Tim Ferriss关于学习的书《4小时厨师》中的建议。
继而,我采访了两位大佬:C.Jordan Ball(在Coderbyte的65,000多名用户中排名第一或第二)和V. Anton Spraul(《像程序员一样思考:创造性问题解决导论》一书的作者)。
我问了他们同样的问题,令人吃惊的是,他们的回答非常相似!
这并不意味着他们做任何事情都采取一致的行动,每个人都不同,你也是与众不同的。但是,如果我们都遵循一些良好的原则,我们就会更快地得到进步。
我看到新程序员犯下的最大错误就是专注于学习语法,而不是学习如何解决问题。—V. Anton Spraul那么,遇到新问题时应该怎么做?
以下是处理问题的步骤:
理解
大多数难题之所以难的原因,正是因为你不理解它们,因此,解决问题的第一步就是确切地知道问题是什么。
那么,理解问题的标准是什么呢?
当你能用简单的语言解释它的时候。
你是否遇到过这种情况?在一个难题上一筹莫展,但是当你尝试用语言解释的时候,马上就发现了以前疏忽的逻辑漏洞。
大多数程序员对这一点都感同身受。
这就是为什么你应该写下你的问题,画个涂鸦,或者将它告诉别人(或者其他方式......有些人使用橡皮鸭)。
橡皮鸭的资料请参阅:
https://en.wikipedia.org/wiki/Rubber_duck_debugging
如果你不能用简单的语言来描述,你就没有真正地理解。—理查德·费曼
计划
不要漫无目的地开始解决问题,要有明确的计划!
如果你不能写下确切的步骤,那么解决复杂问题简直就是天方夜谭。
在编程中,这意味着不要立即开始动手干活,要让你的大脑有充分的时间分析问题,并对信息进行整合。
要想制定一个好的计划,就必须回答以下问题:
“给定输入X,返回输出Y所需的步骤是什么?”
对于这一任务,程序员有一个很好的工具来帮助他们...评论!
划分
请注意,这是最重要的一步。
不要一开始就想解决一个大问题,你会被它虐哭的。
相反,将其分解为多个子问题,这些子问题会更容易得到解决。
然后,逐个解决每个子问题。从最简单的开始,也就是你马上就能知道答案的问题(或者已经接近答案了)。
此外,优先解决那些独立于其他问题的子问题。
一旦解决了每个子问题,就可以将它们连接起来。
连接所有“子解决方案”就得到了原始问题的解决方案。恭喜!
谨记,这种方法是解决问题的基石(如果有必要,请再次阅读此步骤)。
V. Anton Spraul曾经说:“如果让我给刚入门的程序员讲授解决问题的技巧,我首先会教他们'减少问题的技巧'。
譬如,你是一名新的程序员,需要编写一个读取十个数字的程序,并确定哪个数字是这些数字中第三大的。对于一个新来的程序员来说,这可能是一个艰难的任务,即使它只需要基本的编程语法。
如果你遇到困难,你应该把问题简化为更简单的问题。试试找到最大的数字,而不是第三大的数字,还是太难了? 试试如何找到三个数字中最大的一个?再试试找到两个中较大的一个?
将问题你分解到你马上就能动手编写的程度,然后稍微扩展问题并重写解决方案,剩下的就是继续前进直到你回到起点。“
还是一筹莫展?
现在,你脑子里的念头可能是“这些方法很酷,但是如果我卡在一个子问题上跨不过去了怎么办?”
首先,深吸一口气。其次,这是很正常的。
不过不要担心,每个人都遇到过这种情况!
不同之处在于,一个好的程序员对哪里出现问题更感兴趣,而不是乱发脾气。
事实上,在面对打击时,我们需要尝试三件事:
调试:逐步运行你的解决方案,试图找到出错的地方。程序员把这叫做调试(事实上,这都是调试器所做的)。
调试的艺术在于弄清楚你真正想要你的程序做什么,而不是你自以为你要让它做什么。—Andrew Singer重新评估:退后一步,从另一个角度看问题,看是否有任何东西可以抽象为更一般的方法?
有时候我们会在问题的细节上迷失方向,而忽略了它能够在更一般的层面得到解决。经典的例子是求一长串连续整数的总和,1 + 2 + 3 + ... + n,年轻的高斯很快就认识到它只是n(n + 1)/ 2,从而避免了通过一点一点的加和来进行计算。—C. Jordan Ball另一种重新评估的方式是从头再来,删除所有内容,然后重新开始。我负责任地告诉你,你会惊讶于这个方法是多么有效。
研究:使用谷歌。你没有看错,不管你有什么问题,有人可能已经解决了。找到那个人/解决方案。事实上,即使你解决了问题,也要这样做!(你可以从其他人的解决方案中学到很多东西)。
警告:不要寻找解决大问题的方法,只寻找子问题的解决方案。为什么?因为除非你付出了努力(哪怕是一点点),否则你什么都学不会。如果你什么都没学到,那纯属浪费时间。
练习
别奢望在一周的时间内变成解决问题的强者。如果你想成为一个好的问题解决者,就必须解决很多问题才行!
实践,实践,再实践。这只是时间问题,最后你会意识到“这个问题只需要<这样子>就可以解决了”。
怎么练习?选择非常多!
国际象棋谜题,数学问题,数独,围棋,大富翁,电子游戏,密码,bla ... bla ... bla ....
事实上,成功人士的共同模式是他们练习“解决小型问题”的习惯。什么问题并不重要,比如Peter Thiel选择下棋,而Elon Musk选择玩电子游戏。
“Byron Reeves说:'如果你想看看三到五年内的商业领导力是什么样的,那就看看在线游戏中发生了什么。'
直到今天, Elon Musk, Reid Hoffman, Mark Zuckerberg ,以及其他许多人都认为游戏是他们在建立公司方面取得成功的基础。——Mary Meeker
这是否意味着应该只玩电子游戏?当然不是。
但是电子游戏的本质是什么?没错,就是对解决问题的训练!
所以,你应该做的是找到练习的方法,也就是可以让你解决许多小问题的训练(可以的话,找那些给你带来欢乐的练习)。
例如,我喜欢编程挑战。每天,我都尝试解决至少一个挑战(通常在Coderbyte上)。
就像我说的,所有问题都有相似的模式。
结论
以上就是所有的步骤和内容。
现在,你应该更清楚“像程序员一样思考”意味着什么了。
你也知道解决问题是一项极其值得培养的技能(基本技能)。
如果这还不够,你可能还需要注意如何练习解决问题的技巧!
最后,我希望你遇到很多问题。
你没看错。遇到很多问题是一件好事,不然你怎么知道如何解决它们!(你将会在每次解决问题中得到进步)。
当你成功跨越一个障碍的时候,另一个障碍出现了。生活因此而丰富多彩。生命是一个不断突破这些障碍的过程,我们必须突破一系列的障碍,走出一条踏实的路。每一次,你都会学到一些东西。每一次,你都会积蓄力量、开启智慧并形成观点。每一次,压力和竞争都会一点点消失。最后只剩下你自己:你得到了最好版本的你。——瑞安假日现在,去解决一些问题吧!
祝你好运
特别感谢C. Jordan Ball和V. Anton Spraul。这里所有好的建议都来自他们。
同样,如果没有Lambda School,我不可能在短时间内获得大量的编程知识。在这里我对他们表达无尽的感激之情。
相关报道:
https://medium.freecodecamp.org/how-to-think-like-a-programmer-lessons-in-problem-solving-d1d8bf1de7d2