
如果您对编程感兴趣,您可能已经听说过以下短语:
“每个人都需要学习编程,因为它可以教您思考。”
-史蒂夫·乔布斯
也许您还想知道以程序员的身份思考意味着什么?
实际上,我们正在谈论一种解决问题的更有效方法。
这篇文章旨在教您这一点。
阅读后,您将更准确地了解需要执行哪些操作才能找到最佳解决方案。
为什么这很重要?
解决问题是一项基本技能。
我们不断解决问题。 大大小小的。 我们该怎么做? 有时候很好...如果您很幸运。
如果您没有系统的方法,那么您可能会解决以下问题(我刚开始编写代码时就这样做了):
- 尝试解决方案
- 如果不合适,请尝试另一种,
- 如果不起作用,请重复步骤2直到获胜。
您可能很幸运,但这是最糟糕的方法! 这可能需要很多时间。
最好的方法:
- 有系统的方法
- 付诸实践。
“大多数雇主认为解决问题的能力更为重要。
几乎一致地解决问题的能力是雇主正在寻找的最重要的能力……比编程语言,调试和系统设计的知识更为重要。
展示综合思维能力和解决大复杂问题的能力与工作所需的基本技术技能一样有价值(如果不是更多的话)。”
-黑客排名( 2018开发人员技能报告 )
系统方法
为了找到正确的方法,我遵循了蒂姆·费里斯(Tim Ferriss)的书中有关教
四小时厨师的建议 。
这使我接受了两个真正令人印象深刻的人的采访:
C. Jordan Ball (在65,000
Coderbyte用户中排名第一或第二)和
V.Anton Spraul (
《将其视为程序员》的作者。创建代码的创造性方法)。 ”)。
我问了他们同样的问题,你猜怎么着? 他们的答案非常相似!
很快,您也会认识到它们。
注意:这并不意味着它们都一样。 他们是不同的人,而您与他们是不同的。 但是,如果您从正确的基本原则入手,结果将更好,更快。“我在年轻的程序员中看到的最严重的错误是专注于学习语法,而不是学习如何解决问题。”
-V.安东·斯普劳
那么当您面临新挑战时该怎么办?
让我们完成以下步骤:
1.理解
了解到底需要做什么。 大多数任务很困难,因为您不了解它们(这就是为什么这是第一步)。
您怎么知道您了解问题的实质? 尝试用简单的语言解释它。
请记住当您专注于一项任务并开始向自己解释时的情况。 此时,出现了以前从未见过的逻辑错误。
大多数程序员都知道这种感觉。
这就是为什么您应该描述您的任务,绘制图表或将某事告诉某人的原因(有些人使用
橡皮鸭 )。
“如果您无法用简单的语言解释某些内容,那么您将无法理解。”
-理查德·费曼(Richard Feynman)
2.规划
没有计划就不要开始解决问题,希望不要对此感到困惑。 计划您的决定!
在编程中,您不必继续进行。 给您的时间来分析和处理信息。
为了获得良好的计划,请回答一个简单的问题:
“通过申请输入X,必须采取什么步骤才能在输出处获得Y?”
注意:程序员为此提供了一个很好的工具。 评论!3.分解
这是最重要的步骤。 小心点!
不要试图解决一个大问题。
而是将其划分为子任务。 解决它们会容易得多。
然后从最简单的问题开始解决子任务。 当任务看起来很简单时,就意味着您知道答案(或接近答案)。
独立解决每个子任务,并在解决方案之后合并结果。
将所有小任务结合在一起,将为您提供原始解决方案。
恭喜你!
这种方法是解决问题的基石。 记住这一点(如有必要,请重新阅读此步骤)。
如果我可以教每个年轻的程序员如何解决问题,那将减少技术债务。
假设您要编写一个使用10位数字并返回第三大数字的程序。 对于初学者来说,这只是一项艰巨的任务,尽管它只需要基本语法的知识。
如果您陷入困境,则需要简化。 而不是第三大的数字,如何找到最大的数字呢? 还是太复杂了? 如何找到三个数字中最大的一个? 还是两者中的更多?
减少问题,直到您了解如何解决。 记录决策。 然后展开任务,直到返回初始问题。
-V.安东·斯普劳
4.卡住了吗?
现在您可能正在坐着并思考:“嘿,这一切都很酷,但是如果我不能解决这个问题怎么办?”
首先深吸一口气。 不用担心 它发生在每个人身上!
唯一的区别是,最好的程序员会修复漏洞并有兴趣而不是烦恼地解决问题。
实际上,遇到困难时,您应该尝试做以下三件事:
- 侦错 逐步检查您的决定中可能有误的地方。 程序员将其称为调试。
“调试的技巧是找出您在程序中编写的内容与要编写的内容之间的区别”
-安德鲁·辛格
- 方法的改变。 返回上一步。 从另一个角度看待任务。 是否有可能忽略实施并采用更通用的方法?
“有时我们会涉及太多细节,以至于我们没有考虑可以更高层次解决问题的一般原则。 [...]
当然,一个经典的例子是一长串连续整数1 + 2 + 3 + ... + n的总和,使用公式n(n +1)/ 2可以很容易地计算出年轻高斯,避免了与增加元素数有关的问题”
-C.乔丹·鲍尔
注意:有时候最好删除所有内容,然后重新开始。 我是认真的 您会惊讶于其效果如何。 - 研究。 噢,好老的Google 。 无论您的任务是什么,很可能有人已经在您之前解决了它。 查找此人或解决方案。 即使自己弄清楚,也要这样做。 您可以从其他人那里学到很多东西。
警告:不要为大问题寻找解决方案。 寻找仅适用于小型子任务的解决方案。 怎么了 如果您不紧张(至少一点),那么您将不会学到任何新东西。 如果您什么都不学,那是在浪费时间。
练习
不要期望在一周内成为专业人士。 为了很好地解决问题,您需要解决很多问题!
练习 练习 再练习一次。 只有随着时间的推移,您才能说:“借助<在此处替换您的解决方案>可以轻松解决此问题。”
怎么训练? 有有趣的选择!
下棋难题,数学问题,数独游戏,围棋,垄断,电子游戏等。
实际上,成功人士的惯例是他们“解决微任务”的习惯。 例如,彼得·泰尔(Peter Thiel)下棋,伊隆·马斯克(Elon Musk)玩电子游戏。
拜伦·里夫斯(Byron Reeves)表示:“如果您想了解三到五年内商业领袖的模样,请看一下在线游戏。”
快进。 伊隆·马斯克(Elon Musk),里德·霍夫曼(Reid Hoffman),马克·扎克伯格(Mark Zuckerberg)以及其他许多人说,游戏是成功建立公司的基础。
-Mary Meeker( 2017年互联网趋势报告 )
这是否意味着您只应该玩游戏? 当然不是
但是大多数游戏的本质是什么? 是的,解决问题!
所以在实际练习中应该是什么。 可以解决许多微任务的东西(理想情况下您喜欢它)。
例如,我喜欢编程任务。 而且每天我都尝试解决至少一个问题(主要在
Coderbyte上 )。
正如我所说,所有任务都具有相似的解决方案模型。
结论
仅此而已!
现在您知道了像程序员一样思考的含义。
您还知道解决问题是一项不可思议的(基本)技能,需要开发。
注意,现在您还知道如何练习解决问题的技能!
最后,我希望您面对许多挑战。
“当您认为自己已经成功克服了一个障碍时,就会出现另一个障碍。 但这就是使生活变得有趣的原因。 [...]
生命是克服障碍的过程-我们必须突破的防御工事。
每次您学习新东西。
每次您都会发展力量,智慧和观点。
每次竞争都会减少。 最后,将只保留您的改进版本。”
-Ryan Holiday( 《障碍就是路》 )
现在去解决问题!
祝你好运!
特别感谢 C. Jordan Ball和V. Anton Spraul。 他们提供了有用的建议。
另外,如果没有
Lambda School ,我不可能这么快地获得编程知识。 我不能感谢或推荐他们。