如何像程序员一样思考——解决问题的经验教训

2025-06-07

如何像程序员一样思考——解决问题的经验教训

这篇文章最初发表在Medium上

如果你对编程感兴趣,你可能之前见过这句话:

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

你可能也想知道,像程序员一样思考究竟意味着什么?又该如何做到呢?

本质上,这都是一种更有效的解决问题的方法

在这篇文章中,我的目的就是用这种方式来教你。

到最后,您将确切地知道要采取哪些步骤才能更好地解决问题。

为什么这很重要?

解决问题是一种元技能。

我们每个人都会遇到各种问题,无论大小。我们处理这些问题的方式有时……相当随机。

除非你有一个系统,否则这可能就是你“解决”问题的方式(这也是我开始编码时所做的):

  1. 尝试解决方案。
  2. 如果这不起作用,请尝试另一个。
  3. 如果这不起作用,请重复步骤 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 BallV. Anton Spraul。这里所有的好建议都来自他们。

另外,如果没有Lambda School,我不可能在这么短的时间内掌握这么多编程知识。非常感谢他们,强烈推荐他们。

谢谢阅读!😊

文章来源:https://dev.to/richardreeze/how-to-think-like-a-programmerlessons-in-problem-solving-5096
PREV
你好,Vite + React!
NEXT
面向对象编程反击!