如何像程序员一样思考:以解决问题为导向的工程师思维

终身编程者

如果你对编程感兴趣,你一定听到过下面的格言:

“每个人都应该学习编程,因为它教会你如何思考。” — 史蒂夫·乔布斯

你可能会好奇什么是"像程序员一样思考",并且如何才能做到?

本质上,它是关于 更有效率的解决问题

这篇文章中,我将教会你如何更有效率的解决问题。

读完本章时,你将学会如何一步一步更好的解决问题。

为什么重要?

因为解决问题的能力是一个人的元技能.

我们都会遇到大大小小的问题,但有时候我们处理问题的方法却是随机的。

除非您有一个系统,否则可能您"解决"问题的方法就会象我开始编码时这样:

  1. 尝试一个解决方案,
  2. 如果不奏效,再尝试另一个方案,
  3. 如果仍不奏效,重复第2步,直到解决。

看,有时候您运气好,通过这种方法是把问题解决了,但这是解决问题最糟糕的方法!是对时间巨大的浪费。

解决问题最好的方法应是:

  1. 有一个框架
  2. 实践它

「几乎所有的雇主都把解决问题的能力放在首位。他们认为员工解决问题的能力是最重要的任职资格,而不仅仅是编程语言的熟练程度、调试能力和系统设计。展示计算思维或分解大型复杂问题的能力与工作所需的基本技术技能一样有价值 ,甚至可以说是更多。」 — Hacker Rank (《2018 开发者技能报告》)

使用框架

为了找到合适的框架,我采纳了 Tim Ferriss 在 “The 4-Hour Chef” 书中的建议.

这让我想起采访过两位令人印象深刻的人: C. Jordan Ball (他在拥有65,000+ 位用户的  Coderbyte 上排名1,2位),和  V. Anton Spraul (“Think Like a Programmer: An Introduction to Creative Problem Solving” 一书的作者).

我向他们提了相同的问题,然后他们的回答极其相似。

很快,你也会了解他们的。

注意:这并不意味着他们做事情的方式完全一样。每个人都是与众不同的,你也是与众不同的那一个。但是如果你从大家都认可的优秀的准则开始处理问题,那么你将会走的更远也会更有效率。

“我认为刚入门的程序员犯的最大错误是:他们关注学习语法而不是学习如何解决问题。” — V. Anton Spraul

那么,当你遇到一个新问题时该怎么做了?

以下是步骤:

1. 理解

准确的理解问题。大部分艰难的问题之所以艰难是因为你不理解他们(因此,理解成为了第一步)。

那么你如何判断你已经明白了问题了?答案是当你能用自己的话去说明它的时候。

你是否想起遇到过的这种场景:你被一个难题困住了,然后你开始向别人说明这个问题,然后你很快发现之前没注意到的逻辑漏洞?

多数的程序员都了解这种感受。

所以,当你遇到问题时,你应该记录你的问题,针对问题画个草图,或者向别人描述这个问题(或者使用其他工具,比如有些人使用 rubber duck

“如果你无法使用简单词汇去向他人描述一件事情的时候,那么说明你还没理解它。” — Richard Feynman

2. 计划

不要在没有计划的情况下一头扎进去解决问题,虽然可能会莫名其妙地解决它,但是还是请规划好你的解决方案。

如果你没法记录正确的的步骤,那么一切都将是毫无帮助。

对于编程来说,这意味着你不要马上开始工作。你需要时间去分析这个问题和处理相关信息。

为了得到一个优秀的计划,请回答下面的问题:

“对于给出的输入 X ,需要经历哪些必要步骤才能得到输出 Y 了?”

注意:程序员们拥有一个优秀的工具来帮助他们完成这个,那就是注释!

3. 分治

请注意,这是最重要的一步。

不要去尝试直接解决一个复杂庞大的问题,这会让你疲惫不堪。

比较好的做法是,将一个大问题划分成若干个子问题,这些子问题比大问题更容易解决。

然后,一个接一个的去解决这些子问题,从最简单的子问题的开始。最简单的子问题就是那些你能直接得出答案或者更容易得出答案的问题。

最简单的意思是即将被解决的子问题不会依赖于其他子问题的解决情况。

一旦你解决了所有子问题,将他们串连起来。

串连起所有解决的子问题,这意味着你将得出起始问题的解决方案了。祝贺你!

这一步是解决问题的基础,请你牢记。(如果有必要,可以再读一遍这一步)。

“如果我可以教给每个初学者一个解决问题的技能,那么这一简化问题的方法成为我的不二选择。”

例如,假设你是个新手,你被要求写个程序,从输入10个数字中找出第三大的数字。对于一个完全新手来说,这将会是一个艰巨的任务,尽管这个问题只需要一些基本语法基础。

如果你卡住了,那么你应该想着把问题简化。比如我们的任务是找出第三大的数字,那么我们是不是先可以找出最大的数字了或者比较两个数字大小?

“你需要把问题简化到你可以解决的程度,并写出相应的解决方案。然后稍微拓展一下问题并且重新对问题写个解决方案。不断重复前面的操作直到你回到起始问题。” — V. Anton Spraul

4. 卡住?

到现在为止,您可能坐在那里思考:“嘿,理查德……这很酷,但是如果我被困住甚至不能解决子问题怎么办?”

首先,深呼吸。其次,这很公平。

朋友,请不要担心。这发生在每个人身上!

不同之处在于,最好的程序员/问题解决者对错误/错误的好奇大于对错误的好奇。

实际上,面对混乱时,可以尝试以下三件事:

-调试:逐步解决您的解决方案,以查找错误的地方。程序员称其为 debugging (实际上,这就是调试器所做的全部)。

“调试的技巧是弄清您真正告诉程序要执行的操作,而不是您认为要执行的操作。” —安德鲁·辛格(Andrew Singer)

-重新评估:退后一步。从另一个角度看问题。有什么可以抽象为更通用的方法的吗?

“有时我们对问题的细节迷失了,以至于忽略了一般性原则,而这些一般性原则将在更广泛的层面上解决问题。 […]

当然,经典的例子是一长串连续整数的总和,即1 + 2 + 3 +…+ n,一个非常年轻的高斯很快就认出了n(n + 1)/ 2,因此避免了必须做加法的工作。” — [C.乔丹·鲍尔(Jordan Ball)(https://www.linkedin.com/in/cjordanball/

旁注:重新评估的另一种方法是重新开始。删除所有内容,然后重新开始。我是认真的。您会惊讶于它的有效性。

-研究:啊,Google不错。您没看错。无论您遇到什么问题,都可能有人解决了。找到那个人/解决方案。实际上,即使您解决了问题,也要这样做! (您可以从其他人的解决方案中学到很多东西)。

警告:不要为大问题寻找解决方案。只寻找子问题的解决方案。为什么?因为除非您奋斗(一点点),否则您将不会学到任何东西。如果您什么都不学,那是在浪费时间。

实践

不要指望一周就可以变得很棒。如果你想成为一个好的问题解决者,请解决大量的问题!

实践实践再实践。意识到「使用「这里插入概念」可以很轻松的解决这个问题。」只是时间问题。

怎么实践?有大量的选择!

国际象棋、数学问题、数独、围棋、大富翁、电子游戏、区块猫等等。

实际上,在成功人士中,常见的习惯是练习“解决微观问题”的习惯。例如:彼得·泰尔(Peter Thiel)下棋和伊隆·马斯克(Elon Musk)玩电子游戏。

「拜伦·里夫斯(Byron Reeves)说,“如果您想了解三到五年内业务领导者的模样,请看一下在线游戏中正在发生的事情。”

快进到今天。 Elon [Musk],Reid [Hoffman],Mark Zuckerberg和其他许多人说,游戏是成功建立公司的基础。」 — Mary Meeker(2017年互联网趋势报告)

这是否意味着您应该只玩电子游戏? 一点也不。

但是电子游戏到底是什么呢? 是的,解决问题!

因此,您应该做的是找到一个练习的途径。 使您能够解决大量微观问题的事物(最好是您喜欢的事物)。

例如,我喜欢编码方面的挑战。 每天,我都会尝试解决至少一个难题(通常在 Coderbyte)。

就像我说的,所有问题都有相似的模式。

结论

同志们!

现在,你更好地了解了「像程序员一样思考」的含义。

你也知道了解决问题的能力是那么不可思议的技能(元技能)。

如果这还不够,请注意你还知道如何去练习解决问题的技能!

挺酷的吧?

最后,祝你遇到更多的问题。

你没看错。 至少现在你知道如何解决它们了! (此外,你将了解到每种解决方案都可以改善)。

「只要你认为自己已经成功克服了一个障碍,就会出现另一个障碍。 但这就是让生活变得有趣的原因。

生活是突破这些障碍的过程,这是我们必须突破的一系列防线。

每次你都会学到一些东西。

每次,你都能增加力量,智慧和远见。

每次,都会有更多的惊蛰者消失。 剩下的只有你:你最好的版本。」——瑞安·霍里(Ryan Holiday)(障碍就是路

现在,去解决问题吧!

祝你好运!

原文地址:https://medium.com/free-code-camp/how-to...

译文地址:https://learnku.com/lifecoder/t/32774

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!