程序员的使命:成为更好的问题解决者

全文共3034字,预计学习时长8分钟

程序员的使命:成为更好的问题解决者

图源:unsplash

你可能也得到过这样的建议:要想成为一个更好的问题解决者,你需要解决更多的问题。但这个建议过于简单,要想精通任何一件事,不能仅仅是简单的重复,重要的是解决方法。

很多程序员听到“解决更多问题”这样的建议时,会将“更多”误认为是“更快”的意思,这也是我刚开始时犯过的一个错误。

仅仅重复做着解决问题的单调工作对提高个人的学习和水平没有益处。一开始时,我只专注于快速解决一个问题,然后赶快转到下一个。久而久之,这种做法的弊端很快就显现出来了。由于过分关注数量,我牺牲了工作的质量,还错过了在此过程中学习关键方法和经验的机会。

这并不是说重复不重要,其实它很重要。单靠重复并不能触及问题的核心,但解决问题的过程却可以。

我想把解决问题这方面完成得更好,从而提高我作为一名程序员的技术水平。所以本文里我将提出解决方案,当然,这个过程中需要大量的重复工作。

1.在各种平台上解决各种问题

“刚开始学习编程时,我迷上了HackerRank。”我的一门Python课的老师如是说。虽然有一个偏好的平台没有什么问题,但最好不要把自己限制在一个平台上,因为你需要为所有事情做好准备。

我的目标之一是能在不同的问题类型和不同平台之间顺利切换。Interview Cake上的问题与鲁文·勒纳《Python训练》中的问题是不一样的;同样,我发现勒纳的《每周Python练习》中的问题描述与HackerRank上的也不一样。

当然,我有自己的偏好,但我也需要有能力解决各种类型的问题,所以我会使用各种各样的平台和资源来练习。

程序员的使命:成为更好的问题解决者

图源:unsplash

比如:

· LeetCode

· 盖勒·拉克曼恩·麦克道威尔的《程序员面试金典》

· Exercism

· Interview Cake

· 鲁文•勒纳《Python训练》

· 鲁文•勒纳《每周Python练习》

每个星期天,当我为下周制定计划时,我会从上面的资源中选择一些问题,然后很仔细地思考。例如,我将从LeetCode中挑选一个关于二分查找的问题,然后再从鲁文·勒纳的资源中挑选一个关于数据结构的问题。

这种做法可以让我跳脱自己的舒适圈。我不能总是依赖相同的数据结构或技术,我需要有能力为工作挑选最好的工具,必须要会灵活转化。这也是对我的挑战。这是因为我选择的问题会把自己推到能力极限的边缘,这就是心理学家安德斯·埃里克森所说的“刻意练习”的特点。

埃里克森在他的优秀著作《巅峰》中解释道:刻意练习是是一种需要你完全集中精力、且有意识地进行努力的练习方法,它能将你带出“舒适区”,这种练习以一个特定的目标为中心,需要你付出近乎最大的努力。

换句话说,你不是在做一件容易或自然的事情。“它的特点就是刻意练习,”埃里克森写道,“就是要尝试着做你做不到的事情。”

2.交叉训练你的编程大脑

我们常常听到运动员会在日常训练中融入交叉训练。例如,跑步运动员需要每周完成一、两次自行车训练。这很有意义,交叉训练可以从不同的角度维护运动员的心血管健康。

程序员的交叉训练是我曾经写过的一个主题。就像运动员通过交叉训练来维持心血管健康一样,我也会通过交叉训练来改善我的心理健康状况。我的交叉训练包括解决数学问题。我会运用相同的策略来解决编程问题,但在解决数学问题上,过程是一模一样的,只是环境不同罢了。

我目前在读的一本数学书——《解决问题的艺术》,其中讲述了上面提到的交叉训练的益处,但它还有更多的作用——它帮助我树立了解决问题的直觉。这一点很重要。我不想死记硬背一个数学方程或程序,我想凭直觉知道什么时候该使用它,在解决编程问题时也是如此。

程序员的使命:成为更好的问题解决者

图源:unsplash

3.从解决方案中学习

在解决问题的过程中,所有人都会陷入困境,都会犯错误。我们需要利用这些失败的经验来帮助我们找到修正的方法。通常这就是学习停止的地方,一旦解决了这个问题,我们就急于向前走,但千万不要这么做。

数学家理查德·汉明建议到,问题解决后才是该开始学习的时候。汉明在《做科学和工程的艺术》写到:“我认为研究成功比研究失败更重要,错误的方式太多,而正确的方式太少,因此研究成功更有效。”

“回顾过去”和“研究你的成功”也是我之前写过的一个主题,但它值得我再次强调。你总会听到人们说,我们需要“从失败中学习”。但汉明是对的:我们也可以从成功中学到很多东西。

因此,我在解决问题的过程中所做的最大的改变之一就是把汉明的话付诸实践。我清楚地记得我解决的第一个问题是关于链表的,这种数据结构我当时还不熟悉。解决了问题之后,我又仔细地研究了它。然后,我将我的解决方案复制到一个谷歌文档中,并通过注释的方式向自己解释代码。

我想确保自己能清楚地了解自己做了什么,以及这样做的关键原因:这样我就可以再次成功。

4.获取反馈

意识可以成为一个很好的老师。通过获得反馈,你可以自己找出答案。当事情向好的方向发展时,反馈是一个关键因素。这也是刻意练习的一个重要组成部分。

程序员的使命:成为更好的问题解决者

图源:unsplash

我有两种获得反馈的方式。

首先,在完成一个问题后,我会研究其他人的解决方案。有时候,我会通过Leecode和《程序员面试金典》这样的资源寻求解决方案。还有些时候,我会向解决过相同问题的程序员寻求解决方案,有时我会同时用到这两种方法。

无论哪种方式,下一步都是一样的:我会从解决方案的开头开始,用我自己的话解释之后的每一行代码。例如,我推测出了程序员选择某个特定数据结构的原因,然后写一个简短的总结,以巩固我刚刚学到的核心概念或新方法。

把一些复杂的东西,比如一行代码,用你自己的语言表达出来,这是一个很好的测试,可以看出自己是否真正理解了它。

此外,你还可以练习另一项核心技能:阅读代码。如果对我来说有什么新东西,我就会去研究它。我将他们的代码与我自己的代码进行比较,然后进行研究、评估和学习。这是一个艰难的过程,但我从中得到了很多。

第二种获得反馈的方法是直接询问另一个程序员。视频通话是个好办法,它可以让一行行代码实时、逐步执行。不过,合并请求也很有用。

反馈的要点在于:应用它!要把学到的东西付诸实践。

5.持之以恒

现在我们来谈谈重复。解决问题是一种技能,像其它技能一样,它需要花很长时间来学习和掌握,不是一朝一夕就能习得的。这也是我每天都花时间来解决问题的原因。

对于这种日常练习,人们的普遍反应是:“要学的东西太多了。我不能每天都花时间解决问题。”

但其实这是一个伪命题。首先,你总会有更多新的东西需要学习,永远都是。其次,编程在很大程度上是解决问题,这对我们的技术至关重要。它值得你每天花很多时间和精力来学习。注意,要有目的地进行日常练习。

程序员的使命:成为更好的问题解决者

图源:unsplash

许多人认为解决问题是一门艺术,我同意这种观点。无谓的重复是在浪费生命,你要刻意进行练习,质量非常重要,它让每个问题都变得有意义。

程序员的使命:成为更好的问题解决者

一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

猜你喜欢

转载自blog.csdn.net/duxinshuxiaobian/article/details/108311445