问题解决/algorithm技能是一个诀窍或可以开发与实践?

每当我开始一个难题,如果不能找出确切的解决scheme或不能开始,我会进入这个永无止境的讨论,如下所示:

  • 这个问题解决/math/algorithm技能是天赋的(不是你可以通过练习来学习,通过练习,你只能掌握你以前已经解决的那种问题)

  • 只有那些去上好学校的人才能做到这一点,因为他们很早就学会了。

你的想法是什么?只有努力工作,才能在问题解决/algorithm上取得惊人的成就,或者你需要在自己身上拥有额外的基因?

我花了很大一部分时间想知道天赋是你发展的东西还是你天生的东西。 然后,我想到了答案是无关的,至less如果你想自己做的事情。 即使你有才华,如果你只是来自实践,才会帮助你,因为你会更难。

关于algorithm,以及任何其他非常困难的技能,需要练习才能获得好的效果。 不pipe你是否还要有一定的才能,我都不知道。 然而,我知道一个事实,人们通过练习在TopCoder等竞赛中取得了巨大的进步。 我自己从中学到了很多东西。

如果你build立了一个系统化的培训计划,即使它不是完美的,你也会领先一步。 到目前为止,我已经在TopCoder上编写了几百个程序,深刻地影响了我的思维。 我学到了很多只能从错误中学习,然后修正错误的东西。 我的一个朋友在TopCoder上写了几千个程序,虽然比他开始的时候更糟糕,但是他比我更好。 这不是巧合。

编辑:

我刚刚在math.stackexchange上遇到了这个答案 。 我认为这是如何学习algorithm的最好的解释之一,尽pipe他写的是国际象棋和math。

1)不要试图在最普遍的抽象中解决这个问题。
2)select正确的时间,当你的头脑工作最大。

我从math教练那里得到了第一点build议。 有用! 尝试做不同的例子和情况的问题。 这在很大程度上帮助识别在大多数问题中最难理解的边界情况。

我最喜欢解决这类问题的时间是凌晨(凌晨4-6点)。 前一天晚上睡个好觉,准备好解决问题。 沉默是你的朋友。

我相信有些人比别人有更多的智慧,但这不是最重要的因素。 这是你如何利用这个智力来解决这个问题。

我十二岁时在一个小组里学习了魔法课。 魔术师的名字是乔·卡洛塔。 他一次做了一个魔术,我脱口而出,“你是怎么做到的?” 他说那天一直困在我身边的一些事情。

乔的回答,“迈克尔,如果你真的想知道这个技巧是怎么完成的,你必须弄清楚你自己怎么做。”

那当然不是我想听到的,但是它让我的头脑专注于解决问题。 从我的angular度来看这是解决问题的方法 如果我第一次尝试解决这个问题需要17个步骤,而且真的很快乐,那么好消息是我解决了这个问题。

然后通过查看我开发的解决scheme,并进一步寻找改进解决scheme的方法,我将学习如何简化最终结果。 后来在我的电脑编程生活中,我发现这个过程被称为“逐步细化”。

它在1971年运行,今天依然有效。

对我来说,我认为这有点天赋,但更重要的是经验和实践。 如果你知道很多问题和最好的解决scheme,你可以更容易地提出解决新问题的方法。

从我自己的过去的例子:有一些编程比赛(有利于训练,顺便说一句),我没有find一个好的解决scheme。 获胜者主要通过使用KD-Tree来解决问题。 为了提出这个问题,首先你需要知道在这个例子中,KD-Tree是什么,它在哪里有用。 今天,我很清楚,如果再遇到类似的问题,我可以很快解决。

要回答这个问题,首先我们需要find解决问题能力的要素。

  1. 有一个所谓的天赋人才。 这是你天生的才能。 这预先确定了你的潜力。 出生于灰质较多的人往往比那些与自然不太和谐的人performance得更好。 这意味着,如果一个人具有相同的参数(教育,个性,抗压力,意志力),那么一个人才更好的人比不具备天赋的人更有可能performance出更好的performance。 如果一个人观察到他或她倾向于耗费大量的时间来吸收新的信息,直到他或她能够运用它,那么这个人最明智的决定就是离开编程,并防止一个充满挫败感的生活。 当然,作为初学者,不能期望能够立即理解最复杂的现象,但是如果初学者对初学者概念理解太慢,那么编程不是他或她的一杯茶。

  2. 发展人才。 一个人有天赋,但这本身还不足以解决问题。 我从来没有见过新生儿写代码。 必须得到一些教育。 越早越好。 而且,学校的质量也是非常重要的。 我们绝不能否认,一个没有机会早日在好学校学习编程的人,那么他或她在成功的比赛中就有障碍。 但是,如果有人早点错过了好的学校,那么残疾人就可以付出艰辛的努力。 例如,我的妻子在另外一个领域接受过教育,但大学gradle后,她找不到合适的工作。 所以我开始教育她 一个月后,她学会了如何学习,并能解决几乎所有呈现给她的问题,但她还没有奏效。 她逐渐开始学习自动化的方式。 一年后,她已经是一个专业的编码器。 她没有来自她可以编码的学校的文件,但她正在做一个出色的工作。 所以,她错过了早期的教育,但后来能够抵消残疾。 发达的人才可以被形容为学习和知道的信息集合,以及正确的态度,科学的方式来迎接新的挑战。

  3. 实践:实践有利于提高发达人才水平,但不应当成为培养人才的唯一来源。 随着实践,理论视野必须定期扩大。

  4. 工作策略:一个人可以非常有才华,可以有很多知识。 如果他或她没有正确的工作策略,那么他或她有障碍。 每当有新的任务给出时,应该问正确的问题:

    • 这个最接近的任务是什么? 我可以重复使用我的解决scheme吗?
    • 我应该学会怎样才能解决这个问题?
    • 我怎样才能写出清晰高效的代码来解决这个问题呢?

所以答案是:虽然尽早有优秀的教育是好的,但没有必要。 不要忘记,生活是最好的学校,如果你有才能,意志力和信息来源,你可以在晚些时候恢复失去的机会。 实践不仅是向您展示解决问题的正确步骤,也拓宽了您的视野。 例如,如果你理解数字系统,那么他或她将能够理解以后的各种事情,比如CSS,PSD或者数字溢出的颜色。 如果学习如何在Java中编写代码,那么他或她会很快理解C#。 所以,实践是给你一个给定的问题types的解决scheme的知识,而且,提供新的理论知识,将在各个领域有用。 要发展的核心技能是快速学习的能力。

有很多例子,拥有非凡的才能和最小的成功。 你在体育,政治,商业以及一般的身边都会看到这样的例子。 所以,我觉得经过一定的限制,天赋是没有意义的。 它主要是一个硬性的词,奖励你更大的成功。 如果你关注板球, 这里是一个很好的例子。 我觉得同样的原则适用于algorithm和问题解决。 一年前,我使用拾取algorithm问题来解决,并用于发现自己完全失去了。 一年的时间投入阅读algorithm书籍,解决它的练习题,也练习一些更多的编程问题,我相信现在我可以解决大部分的问题了(我还有很长一段路要让自己高效)。 但关键是聪明的工作足以发展解决问题的这个诀窍。

人才便宜,毫无用功。 人才只能在一定程度上带给你,但只要勤奋和练习,任何人都可以达到高峰

– 8次全国国际象棋冠军Josh Waitzkin,13次全国冠军和2次世界冠军

他自己在国际象棋大师版的声音里这么说

如果人才不努力工作,努力打好人才。 这个说法定义了持久性的真正潜力是什么。这个世界上的任何技能都可以通过实践来发展。这个过程类似于钉在墙上的一个钉子,它不仅需要正确的大小,而且需要适当的方向。