https://www.freecodecamp.org/news/do-you-solve-programming-problems-or-complete-exercises-the-difference-matters/
人们倾向于交替使用术语“问题”和“锻炼”。但是有区别,这很重要。
Paul Zeitz教授对此加以区分。
取5×5。这很容易,而且是一种练习。5,490,900×496也是如此。这有点困难,需要更多时间来解决,但是您知道该怎么做。这就是关键。
蔡茨在有关解决问题的系列讲座中解释说:“练习是一个数学问题,您会立即知道如何回答。” “您可能无法正确回答,实际上您可能永远无法正确回答…但是毫无疑问如何进行。”
问题不是这样。根据Zeitz所说,问题“至少在最初是一个数学问题,您不知道如何回答。”
他通过数学问题解决的角度来定义问题和练习,但它们也适用于编程。
每天,我们都将解决问题的能力用作程序员:调试代码,学习新主题甚至解决问题。练习有其应有的地位,但是作为程序员,解决问题是无可替代的。
练习运动
您可以通过两种方式从练习中受益。首先,它们在学习新主题时会很有帮助。
我现在正在学习JavaScript,并结合使用各种练习和问题来进行学习。这些练习可以帮助我了解模式并熟悉概念和语法。
这是一个要求我编写一个函数的项目的示例,该函数需要一系列汽车。
const cars = [
{ id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 },
{ id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 },
{ id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 },
...
]
我必须car_model
按键以升序对对象数组进行排序。
这并不是说此练习轻而易举-并非如此。我花了一些时间,并且得到了很多错误消息。
但是,它有资格作为练习,因为我从一开始就知道我需要做的事情。
我最近了解了JavaScript中的数组。尽管我不得不研究如何使用JavaScript进行数据处理,但我还是很熟悉根据Python经验对数据进行排序的方法。明确的指示也有所帮助。
但是这些概念仍然是新的。我需要练习将它们放在一起,这就是为什么此练习很有价值的原因。重复会滋生熟悉感,这些概念在我的脑海中开始固化。
维持您获得的收益
练习还有助于使学习到的信息保持最新。
在学习JavaScript的过程中,我不想忘记我所学到的关于第一门语言Python的所有知识。因此,我每天多次使用抽认卡程序Anki。
在这种情况下,练习可以帮助您保持连贯的资料,提醒您重要的概念,以及使用特定的数据结构或方法使自己感到更自在。到目前为止,这是对您所掌握的知识的维护工作。
我有超过1,000张卡片,里面装满了我以前看过很多次的材料。有些卡对语法有疑问。其他人要求我编写SQL查询或命令行或Git命令。许多其他活动充满了练习,例如“将数字列表向右旋转一个位值”。
重要的是要注意,此练习对我来说曾经是一个问题。如果您做的足够多,那么它就可以成为练习。同时,您可以通过添加约束来使练习成为一个问题。
练习是湿滑的斜坡。一方面,它们对于学习目的很有用。另一方面,仅坚持练习很容易感到舒适。
缺点是:待在舒适区。
处理歧义
编程是解决问题的方法。解决问题将带您走出舒适区。这是一件好事。
对我而言,问题具有两种独特的品质。首先是模棱两可。解决问题在很大程度上与如何有效处理歧义有关。
- 每次您的程序运行时,都会出现一条错误消息。为什么?这是怎么回事?错误在哪里?您如何解决?
- 您提出了新的问题陈述。您阅读并重新阅读。乍一看,您不知道发生了什么,更不用说您需要做什么来解决它了。您甚至可能会感觉到“鹿头灯”的感觉,并伴有胃底凹陷。(您选择了一个好问题!)
- 您需要了解关系数据库。那很广泛。你打算怎么做?首先要关注什么?最重要的是什么?您现在真正需要了解什么?
这些例子都含糊不清。所有这些都需要解决问题,无论是查找错误并解决错误,解决实际问题还是学习新主题。
为了取得进步,您需要进行研究,试验,找出事实,制定计划并应用各种解决问题的策略。简而言之,您将学会弄清楚。您花在解决问题上的时间越多,获得的观点越多,它揭示的层次就越多,您就越接近“ aha”时刻。
拥抱斗争
问题的另一个区别是斗争。它是真实的。
解决问题的能力将测试您的精神耐力和耐心。进展可能很慢,而且过程很繁琐。我辛苦工作了好几个小时,几天甚至几周。
这并不是说练习不会挑战您。他们能。当您知道需要使用特定方法时,这是一回事。您只需要使其正常工作即可。这是一个挑战,有时可能会令人沮丧。
但这完全是另一回事,当您一开始就不知道要做什么时,解决问题时可能会发生多次。对我来说,问题是一场斗争。
最好的解决办法是忍受它并使自己陷入困境。根据我的经验,奋斗意味着我学到了很多东西,而突破通常就在眼前。
克服精神不适时,您会发现自己创造性地思考并设计出从未想过的解决方案。(您会感到惊讶并给自己留下深刻的印象-您知道的比您想象的要多!)您正在成为一个更强大的程序员。
您甚至会发现自己很开心。当然,解决问题具有挑战性,有时甚至令人沮丧。但这也令人难以置信。
就像越过半程马拉松的终点线一样。毫无疑问,过去的13.1英里非常艰苦,但是越过终点线是值得的,我会再做一次。解决问题的感觉是一样的。
是什么:问题或练习?
当您打开笔记本电脑时,是要解决问题还是完成练习?
练习有好处,可以将它们合并到编程会议中。在编程会议之前,我将练习用作热身。我将翻看Anki抽认卡甲板十到十五分钟,并进行一些练习。如果我正在学习诸如JavaScript之类的新知识,那么我可能会进行整个编程课程来练习。
但是,我每天都花时间解决问题,无论我正在学习或正在学习什么。即使在我花费大量时间进行锻炼的日子里,我也花费大量时间来解决问题。
因此,当您要开始编程会话时,请注意要执行的操作:练习或问题。无论如何,都要花时间解决问题。
解决问题是一项需要大量实践和时间才能发展的技能。变得更好的唯一方法就是每天工作。这很重要,并且有充分的理由。
我们每天都以程序员的方式并以各种方式解决问题。花时间解决问题是不费吹灰之力的。我们作为程序员的工作依赖于此。
我写了有关学习编程的文章,以及进行编程的最佳方法(amymhaddad.com)。