我们大多数人都得到了同样的建议:要成为一个更好的问题解决者,你需要解决更多的问题。但这个建议太简单了。做好任何事情都需要的不仅仅是代表。这也是你如何做这件事。
此外,当程序员听到“解决更多问题”的建议时,他们通常认为“更多”意味着更快。这是我在出发时犯的错误。
1.在各种平台上解决各种问题
“当我开始学习编码时,我痴迷于HackerRank,”我正在上一门Python课程的一位讲师说。虽然拥有一个最喜欢的平台没关系,但不要把自己限制在一个平台上。原因如下:你需要为任何事情做好准备。
我的一个目标是在不同问题类型和不同平台之间平稳切换。后来开始看鲁文·勒纳的书《Python练习》同样,我发现勒纳每周Python练习中的问题陈述与HackerRank上的问题陈述不同。
当然,我有我的偏好。然而,我需要能够解决所有类型的问题。因此,我正在使用各种平台和资源来练习。
以下是一些例子:
- 李特代码
- 破解盖尔·拉克曼·麦克道尔的编码采访
- 鲁文·勒纳的Python练习
- 鲁文·勒纳每周Python练习
周日,当我为下周制定计划时,我从上述资源中选择了一些问题。我对此进行深思。例如,我将从LeetCode中选择一个专注于二进制搜索的问题。然后,专注于鲁文·勒纳来源之一的数据结构。
这种做法让我不能依赖相同的数据结构或技术。我需要能够为这份工作挑选最好的工具。我必须能够枢轴。
它对我也有些考验,在于我选择的问题将我推向极限边缘,这是心理学家安德斯·爱立信所称的“深思熟虑的实践”的特点。
深思熟虑的练习就是技能发展。爱立信在他的优秀著作《峰值》中解释说,这是一种全神贯通、有意识的努力,带你走出“舒适区”,以特定目标为中心,并“需要近乎最大限度的努力”。
换句话说,你不会在做一些容易或自然的事情。爱立信写道:“…深思熟虑的实践的标志是,你试图做一些你做不到的事情。”
2.交叉训练你的编程大脑
你经常听说运动员将交叉训练纳入他们的日常生活。例如,跑步者每周完成一两次自行车锻炼。这很有意义:通过交叉训练,运动员从另一个角度推动他们的心血管健康。然而,关于这种方法的好处,就像运动员进行交叉训练以提高心血管健康一样,我正在结合交叉训练来提高我的心理健康。
我的交叉训练包括解决数学问题。我采用与解决编程问题相同的策略,但在数学领域。相同的过程,不同的上下文。
我目前的数学书提供了上述交叉培训的好处。但它正在做更多事情:它帮助我建立解决问题的直觉。
这是重要的一点。我不想记住数学方程或过程。我想直观地知道什么时候使用它。解决编程问题时也是如此。
3.从解决方案中学习
我们都陷入困境,在解决问题时都会出错。我们利用这些失败来帮助我们找出不同的做法。
通常情况下,学习就会停止。一旦我们解决了这个问题,我们就急于前进。但不要。
数学家理查德·哈明建议,学习应该开始。
一本书《科学与工程的艺术》中写道:“我认为研究成功基本上比研究失败更重要…错误的方式很多,正确的方式很少,研究成功更有效率。”
这种“回头看”和研究你成功的想法是我之前写过的话题,值得再次注意。你总是听说我们需要如何“从失败中吸取教训”。但作者是对的:从我们的成功中可以学到很多东西。
因此,我对解决问题过程所做的最大改变之一是将话付诸实践。我清楚地记得解决了第一个涉及链表的问题,这是一个当时对我来说很新的数据结构。解决了问题后,我专心研究它。我把解决方案复制到谷歌文档文件中,并使用注释向自己解释代码。
出于这个关键原因,我想确保我清楚地理解我做了什么,为什么:这样我就可以再做一次。
4.获取反馈
不要认为你的解决方案很棒。通过获得反馈为自己找到答案。反馈是改善的关键因素。也是深思熟虑的练习的一个组成部分。
我有两种方式获得反馈。
首先,我完成一个问题后,研究其他人的解决方案。有时LeetCode和破解编码提供了解决方案。其他时候,我找到了一个程序员的解决方案,他解决了同样的问题。有时两者都用。
无论哪种方式,下一步都是一样的:我从解决方案的顶部开始,用我自己的话解释每行。例如,我推测程序员为什么选择这种特定的数据结构。然后,我写了一个简短的程序摘要,以巩固我刚刚学到的核心概念或新方法。
在自己的话语中加入一些复杂的东西,比如一行代码,是看看你是否真正理解它的绝佳测试。此外,还可以练习另一种核心技能:阅读代码。
如果有什么新鲜事,我会研究它。我比较他们的代码和自己的代码。我学习。我评价。我学习。这是一个艰巨的过程,但我从中获了很多。
获得反馈的第二种方法是简单地向其他程序员询问。视频通话有助于实时逐行浏览代码。
应用它!把你的学问付诸实践。
5.始终如一
现在我们来谈谈重复。解决问题是一项技能。像任何技能一样,建造需要时间。它根本不会在一夜之间或周末发生。这就是为什么我每天花时间解决问题。
对这种日常实践有一个共同的反应:“有太多东西需要学习。我不能每天花时间解决问题。”
我的回答是双重的。首先,总是有更多东西需要学习。
其次,编程在很大程度上是解决问题。这是基础。值得你每天花时间和关注。让你的日常练习有意识。
这是艺术
许多人将解决问题视为一门艺术。我碰巧同意这种观点。这个过程本身也是如此。
重点是:有意识地练习。质量很重要;让每个问题都很重要。
好了,本文到此结束。如果对编程、计算机、程序员方面感兴趣的话,欢迎私信联系我,随时交流!点个关注,是对我莫大的鼓励!