[译] 如何像程序员般思考 —— 蕴含在问题解决中的经验

原文做者 Richard Reis前端

若是你对编程感兴趣,那么你以前可能会据说过这样的 一句话android

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

你可能还想知道,像程序员同样思考到底意味着什么?同时,要怎么样才能作到呢?git

从本质上讲,像程序员般思考是一种更加有效的解决问题的方法程序员

经过这篇文章,个人目的是教会你用那样的方式去思考问题。github

到最后,你就会更加清楚地知道,要经过哪些步骤才能成为一个更好的难题终结者。编程

这件事为何很重要?

解决问题是最根本的元技能。后端

咱们全部人都会遇到或大或小的各类各样的难题。而不少时候,咱们如何去解决这些问题却显得,能够说...很随机。网络

除非你有一套解决问题的体系,不然以下极可能就是你“解决”问题的方法(这也正是我编程之初经常走的歧途):框架

  1. 尝试某种解决方案。
  2. 若是这种解决方案不凑效,那么换另一个进行尝试。
  3. 若是另外一种仍是不凑效,那么不断重复步骤 2,直到走大运刚好碰到解决这个问题的方法。

你看,某些时候可能你很走运,可以把问题解决。但这倒是解决问题中最最糟糕的方法。同时,这对你的时间形成了巨大浪费。

最好的方法包含了如下的两个方面:a)拥有一套解决问题的框架;b)不断练习实践这套框架

“几乎全部的雇主都把解决问题的能力放在首位。

解决问题的能力几乎是全部雇主一致追寻的最重要的品质,甚至比精通编程语言、调试和系统设计更为重要。

证实计算思惟或者说分解大型复杂问题的能力,对于一份工做来讲,至少与其所需的基本技术技能同样有价值(就算不是更有价值的话)。” —— Hacker Rank (2018 年开发者技能报告

拥有一套解决问题的框架

为了找到正确的框架,我遵循了蒂姆·费里斯(Tim Ferriss)关于学习的书《4 小时厨师》(the 4-Hour Che) 中的建议。

这个建议让我采访了两位真正使人印象深入的人:C. Jordan Ball(在 Coderbyte 65,000+ 用户中排名第一或者第二),以及 V. Anton Spraul(书籍 “像程序员般思考:创造性解决难题导论” 的做者)。

我问了他们相同的问题,你猜猜结果如何?他们的答案基本是一致的!

很快,你也会认识到这些答案。

做者注:这并不意味着他们用相同的方法去作每一件事。每一个人都是不一样的,你和他们也是不一样的。但若是你遵循了咱们都认同的好的原则,以此开始,你会走得更远更快。

“我看到的新手程序员犯的最大的错误就是专一于学习编程语言语法而不是去学习如何解决问题。” —— V. Anton Spraul

那么,遇到新问题时该怎么作呢?

下面就是解决问题的一些步骤:

1. 理解问题

准确地理解问题所问的点是什么。绝大多数的难题,仅难在你不能理解这些问题(这就是为何要把理解问题放在第一步的缘由)。

如何知道你已经理解了一个问题?当你能用语言描述它的时候就真的理解了。

你记忆中是否有这样一个场景,当你被困在一个问题中时,你开始解释它,而后忽然之间,你发现了以前历来没有考虑过的逻辑漏洞?

绝大多数的程序员都应该对这种感受深有体会。

这就是为何你要把你的问题写下来、画个图或者告诉他人的缘由(另一件事是...有些程序员会使用小黄鸭调试法来解决问题)。

“若是你没法简单地解释清楚某件事,你就尚未弄懂它。” —— Richard Feynman

2. 作出计划

在没有计划以前千万不要一头扎入问题的解决当中(除非你但愿可以蒙混过关)。必定要作好计划!

若是你没法写下作事情的确切步骤,那么什么都帮不了你。

在编程中,这意味着不要一开始就强行暴力破解。必定要先给你大脑一些时间来分析问题和处理信息。

为了得到一个好的解决问题计划,先回答一下以下问题:

“在已有输入 X 的前提下,若是要获得返回值 Y,将要进行哪些必要的步骤?”

做者注:程序员们有一种很棒的工具来解决这个问题...那就是注释!

3. 划分问题单元

注意了,这是全部步骤中最最重要的。

不要尝试去解决一个大的问题。这样作你确定会哭的。

相反,应该把大问题分解成多个更容易解决的的子问题。

而后,对这些子问题各个击破。从最简单的问题开始吧。最简单的问题意味着你知道问题的答案(或者至少更为靠近答案)。

除此以外,最简单的问题还意味着这个子问题的解决并不依赖于其余问题的解决。

一旦你把每个子问题都解决了,而后就把每个小点链接起来。

串联起你的每个**“子方案”**将会让你得到最终的原始问题的解决方案。祝贺你,你已经解决了问题!

这种解决问题的技术是全部问题解决的基石。紧紧记住它(若是有必要,请再次阅读这一步)。

“若是我能教给每一个新手程序员一个解决问题的技巧,那就是‘减小问题的技术’。

例如,若是你是一个新程序员,而后你被要求去写一个程序,读取 10 个数字,而后算出哪一个数字是第三大的。对于一个全新的程序员来讲,这多是一项艰巨的任务,尽管它只须要基本的编程语法。

若是你陷入困境,你应该把问题简化。先不考虑找第三大的数,若是你去找最大的数你该如何作?仍是太困难?那若是要从三个数字中找到最大的你该怎么作呢?若是从两个数字中寻找呢?

不断简化问题直到你能写出解决方案。而后稍微把问题进行扩展,并写下相应的解决方法,不断扩展下去直到源问题被解决。” —— V. Anton Spraul

4. 陷入问题当中?

如今,你可能正坐在那里想到:“嘿,Richard... 这方法很酷,可是若是我卡住了,而后连子问题都没法解决该怎么办?”

首先呢,进行一下深呼吸。其次,这件事是公平的。

不要担忧,朋友。这种状况会在每一个人身上发生!

不一样的是最好的程序员/问题解决者对 bugs 或错误更感兴趣而不是恼怒。

事实上,当不幸面临难题时,这里有三件事能够尝试:

  • 调试: 一步一步检查你的解决方案,而后去试图寻找到底那里出错了。程序员们把这件事称为调试(事实上,这事全是调试器作的)。

“调试的艺术在于找出你真正告诉你的程序去作的事情,而不是你所认为你已经告诉了你的程序去作的事情。” —— Andrew Singer

  • 从新考虑: 后退一步。从另一个角度来看待这个问题。是否有能够抽象成更通常的方法?

“有时候咱们迷失在问题的细节里,而忽略了能在更通常层面上解决问题的通用方法。 […]

固然,最经典的例子是求连续天然数和, 1 + 2 + 3 + … + n,很是年轻的高斯很快认识到答案是简单的 n(n+1)/2,这样就不用去作加法了。” —— C. Jordan Ball

做者注:另一种从新评估的方式是从新开始。删除全部内容,用全新的眼光从新开始。我是认真的,你会惊讶于这是多么的有效。

  • 搜索:啊哈,你没有读错,好好去搜索一下。不管你遇到什么样的问题,极可能已经有人解决过了。去找到那我的或者找到那种解决方法。事实上,即便你解决了问题,你也能够再去调查一下!(你能够从其余人的解决方案中学到不少的东西。)

注意:不要去寻找解决一个大问题的方法。只去寻找解决子问题的方案。这是为何呢?由于除非你努力(哪怕是一点点),不然你什么都学不到。若是你什么都没有学到,你就是在浪费时间。

不断实践练习这套框架

不要指望仅仅一个星期以后就能变得很棒。若是你想成为一个好的问题解决者,那就多去解决一些问题吧!

练习、练习、再练习。早晚你会意识到“这个问题能够经过 <在这里插入概念> 轻松解决”。

如何去练习呢?这里有不少的选择!

象棋谜题、数学难题、数独、围棋、大富翁、电子游戏、加密猫,等等等等。

事实上,成功人士的一个广泛模式是他们有着不断练习“微观解决问题”的习惯。例如,彼得·泰尔 (Peter Thiel) 经过下棋,埃隆·马斯克 (Elon Musk) 经过玩电子游戏来进行练习同样。

“拜伦•里夫斯 (Byron Reeves) 说,‘若是你想知道将来三到五年的企业领导是什么样的,那就看看网络游戏正在发生什么吧。’”

快进到今天。埃隆·马斯克(Elon Musk)、雷德·霍夫曼(Reid Hoffman)、马克·扎克伯格(Mark Zuckerberg)和其余许多人都表示,游戏是他们成功创建公司的基石。” —— Mary Meeker(2017年互联网趋势报告

这是否意味着你应该只玩电子游戏?并非这样。

可是电子游戏究竟是关于什么的呢?没错,就是问题解决!

因此,你应该作的是找到可以练习的机会。能够是能让你解决不少小问题的东西(理想状况下,这应该是你喜欢的东西)。

例如,我喜欢编程挑战。天天,我都试图解决至少一个挑战(一般在 Coderbyte 上)。

正如我所说,全部的问题都有类似的模式。

结论

以上就是所有内容!

直至目前,你已经更好地了解了“像程序员般思考”究竟意味着什么。

你也知道了解决问题是一种难以置信的技能(元技能)。

若是这还不够,请注意,你还知道了要练习解决问题的技巧该作些什么!

啧啧啧... 听起来很酷,对吧?

最后,祝你遇到不少问题。

你没有读错,就是祝你遇到更多的问题。由于至少如今你知道怎么去解决问题了!(同时,你将会知道,每解决一个问题都会使你得到进步)。

“就在你认为你已经成功跨越了一个藩篱时,你与另一个障碍不期而遇。但这就是生活的奇妙之处。[...]

生活就是一个不断突破桎梏的过程 —— 这是一些咱们成长必须突破的阻碍。

每次,你都会获取新知。

每次,你都会变得更增强壮有力,睿智深邃和洞察非凡。

每次,都会有一些挑战被你逾越,从而消失。直到最后所留下的:是那个最好的你。” —— Ryan Holiday (绝境逢生的艺术 (The Obstacle is the Way)

从如今开始,去解决一些问题吧!

祝你好运 🙂

特别鸣谢 C. Jordan BallV. Anton Spraul,他们给了我不少宝贵的建议。

此外,若是没有 Lambda School 学校,我没法在如此短暂的时间内得到全部的编程知识。在这里我要很是感谢以及强烈推荐他们。

感谢您的阅读! 😊 若是您喜欢这篇文章,请您猛烈地把右手拍向左手,试一试您在 5 秒钟以内可以拍 👏 多少次吧。这是对您有益的手指有氧健身操,固然这也会帮助其余人看到这个故事。

在 Twitter 上向我 “打个招呼” 吧!

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索