如何像程序员一样思考——解决问题的经验教训
这篇文章最初发表在Medium上
如果你对编程感兴趣,你可能之前见过这句话:
“这个国家的每个人都应该学习编程,因为它教会你思考。”——史蒂夫·乔布斯
你可能也想知道,像程序员一样思考究竟意味着什么?又该如何做到呢?
本质上,这都是一种更有效的解决问题的方法。
在这篇文章中,我的目的就是用这种方式来教你。
到最后,您将确切地知道要采取哪些步骤才能更好地解决问题。
为什么这很重要?
解决问题是一种元技能。
我们每个人都会遇到各种问题,无论大小。我们处理这些问题的方式有时……相当随机。
除非你有一个系统,否则这可能就是你“解决”问题的方式(这也是我开始编码时所做的):
- 尝试解决方案。
- 如果这不起作用,请尝试另一个。
- 如果这不起作用,请重复步骤 2,直到成功为止。
听着,有时候你运气真好。但这绝对是解决问题最糟糕的方法!而且极其浪费时间。
最好的方法是 a) 拥有一个框架和 b)实践它。
几乎所有雇主都优先考虑解决问题的能力。
解决问题的能力几乎一致成为雇主最看重的资质……甚至比编程语言熟练程度、调试和系统设计能力更重要。
展现计算思维或分解大型复杂问题的能力,与工作所需的基本技术技能一样有价值(甚至更有价值)。—— Hacker Rank(2018 年开发者技能报告)
有一个框架
为了找到正确的框架,我遵循了蒂姆·费里斯 (Tim Ferriss) 的学习书籍《4 小时大厨》中的建议。
这让我采访了两个非常令人印象深刻的人:C. Jordan Ball (在Coderbyte的 65,000 多名用户中排名第一或第二)和V. Anton Spraul ( 《像程序员一样思考:创造性问题解决简介》一书的作者)。
我问了他们同样的问题,你猜怎么着?他们的答案非常相似!
很快,你也会认识他们。
附注:这并不意味着他们做每件事都一样。每个人都不一样。你也会不一样。但如果你从我们都认同的原则出发,你就能更快地取得更大的进步。
“我看到新程序员犯的最大错误是专注于学习语法,而不是学习如何解决问题。”—— V. Anton Spraul
那么,当你遇到新问题时,应该怎么做呢?
步骤如下:
1. 理解
准确理解问题所在。大多数难题之所以难,是因为你不理解它们(因此这是第一步)。
如何知道你理解了一个问题?当你能用简单的英语解释它的时候。
您是否记得自己被一个问题难住了,您开始解释它,然后立即发现了以前没有发现的逻辑漏洞?
大多数程序员都知道这种感觉。
这就是为什么你应该写下你的问题,画一张图表,或者告诉别人(或者……有些人用橡皮鸭)。
如果你不能用简单的术语解释某件事,你就没有理解它。——理查德·费曼
2. 计划
不要在没有计划的情况下直接开始解决问题(并且希望自己能糊里糊涂地解决)。一定要制定计划,制定解决方案!
如果您不能写下确切的步骤,那么什么也帮不了您。
在编程中,这意味着不要马上开始编程。给你的大脑一些时间来分析问题和处理信息。
为了得到一个好的计划,请回答这个问题:
“给定输入 X,返回输出 Y 需要哪些步骤?”
旁注:程序员有一个很棒的工具可以帮助他们实现这一点......评论!
3. 划分
注意。这是最重要的一步。
不要试图解决一个大问题。你会哭的。
相反,把它分解成子问题。这些子问题更容易解决。
然后,逐一解决每个子问题。从最简单的开始。最简单的意味着你知道答案(或者更接近答案)。
此后,最简单意味着这个子问题的解决不依赖于其他问题的解决。
一旦你解决了每一个子问题,就把各个点连接起来。
将所有“子解决方案”连接起来,就能得到原始问题的解决方案。恭喜!
这项技巧是解决问题的基石。记住它(如果需要,请再读一遍这一步)。
如果我能教给每个初级程序员一项解决问题的技巧,那一定是‘简化问题技巧’。
例如,假设你是一名新程序员,你被要求编写一个程序,读取十个数字并找出第三大的数字。对于一个新程序员来说,这可能是一项艰巨的任务,即使它只需要基本的编程语法。
如果你遇到困难,你应该把问题简化成更简单的问题。与其求第三大的数字,不如求最大的数字?还是太难?那就求三个数字中最大的一个怎么样?或者两个数字中较大的一个?
把问题简化到你知道如何解决并写出解决方案的程度。然后稍微扩展问题,并重写解决方案以适应扩展,如此反复,直到回到起点。—— V. Anton Spraul
4. 卡住了?
现在,你可能正坐在那里想“嘿,理查德......这很酷,但如果我陷入困境,甚至无法解决一个子问题怎么办?”
首先,深呼吸。其次,这很公平。
不过朋友,别担心。每个人都会遇到这种情况!
不同之处在于,最好的程序员/问题解决者对错误/错误更感兴趣,而不是感到恼火。
事实上,面对打击时可以尝试以下三件事:
- 调试:逐步检查你的解决方案,尝试找出问题所在。程序员称之为调试(实际上,调试器所做的就是这些)。
“调试的艺术在于弄清楚你真正告诉程序要做什么,而不是你以为你告诉它要做什么。”——安德鲁·辛格
- 重新评估:退一步思考,从另一个角度审视问题。是否有什么东西可以抽象成更通用的方法?
有时,我们会过于纠结于问题的细节,而忽略了能够从更普遍的层面解决问题的普遍原则。[…]
当然,最典型的例子是对一长串连续整数 1 + 2 + 3 + ... + n 进行求和,年轻的高斯很快就意识到它其实就是 n(n+1)/2,从而省去了加法运算的麻烦。—— C. Jordan Ball
附注:重新评估的另一种方法是重新开始。删除所有内容,用全新的视角重新开始。我是认真的。你会惊讶于这种方法的效果。
- 研究:啊,老谷歌了!你没看错。无论你遇到什么问题,肯定有人已经解决了。找到那个人/解决方案。事实上,即使你解决了问题,也要这样做!(你可以从别人的解决方案中学到很多东西)。
警告:不要寻找大问题的解决方案。只寻找子问题的解决方案。为什么?因为除非你努力(哪怕是一点点),否则你什么也学不到。如果你什么都没学到,你就浪费了时间。
实践
不要指望一周后就能变得很棒。如果你想成为一个优秀的问题解决者,那就解决很多问题!
练习。练习。练习。你最终会意识到“这个问题可以轻松解决”,这只是时间问题。
怎么练习?选择多多!
国际象棋谜题、数学问题、数独、围棋、大富翁、视频游戏、加密猫等等等等。
事实上,成功人士的一个共同点就是他们习惯于练习“微观问题解决”。例如,彼得·泰尔下棋,埃隆·马斯克玩电子游戏。
拜伦·里夫斯曾说过:‘如果你想知道三到五年后商业领导力会是什么样子,看看网络游戏领域正在发生的事情。’
快进到今天,埃隆·马斯克、里德·霍夫曼、马克·扎克伯格以及其他许多人都表示,游戏是他们公司成功的基础。—— 玛丽·米克尔(2017 年互联网趋势报告)
这是否意味着你应该只玩电子游戏?完全不是。
但电子游戏到底是为了什么呢?没错,就是解决问题!
所以,你应该做的是找到一个练习的出口。一个能让你解决很多小问题的东西(理想情况下,是你喜欢的东西)。
比如,我喜欢编程挑战。每天我都会尝试解决至少一个挑战(通常是在Coderbyte上)。
正如我所说的,所有问题都有类似的模式。
结论
就这样吧,伙计们!
现在,你更好地了解了“像程序员一样思考”的含义。
您还知道,解决问题是一项值得培养的不可思议的技能(元技能)。
好像这还不够,请注意你还知道如何练习你的解决问题的能力!
呼……很酷吧?
最后祝大家遇到很多问题。
你没看错。至少现在你知道怎么解决它们了!(而且,你还会发现,每找到一个解决方案,你的水平就会提高)。
就在你以为成功跨越一个障碍时,另一个又出现了。但这正是生活精彩之处。[…]
生活就是不断突破这些障碍的过程——我们必须突破一系列的防线。
每一次,你都会有所收获。
每一次,你都会发展出力量、智慧和洞察力。
每一次,竞争对手都会逐渐减少。直到剩下的只有你:最好的你。——瑞恩·霍利迪(《障碍即道路》)
现在,去解决一些问题吧!
祝你好运
特别感谢C. Jordan Ball和V. Anton Spraul。这里所有的好建议都来自他们。
另外,如果没有Lambda School,我不可能在这么短的时间内掌握这么多编程知识。非常感谢他们,强烈推荐他们。
谢谢阅读!😊
文章来源:https://dev.to/richardreeze/how-to-think-like-a-programmerlessons-in-problem-solving-5096