编程|如何更好地解决编程问题


编程|如何更好地解决编程问题
文章图片
编程|如何更好地解决编程问题
我们大多数人都得到了同样的建议:要成为一个更好的问题解决者 , 你需要解决更多的问题 。 但这个建议太简单了 。 做好任何事情都需要的不仅仅是代表 。 这也是你如何做这件事 。
此外 , 当程序员听到“解决更多问题”的建议时 , 他们通常认为“更多”意味着更快 。 这是我在出发时犯的错误 。
1.在各种平台上解决各种问题“当我开始学习编码时 , 我痴迷于HackerRank , ”我正在上一门Python课程的一位讲师说 。 虽然拥有一个最喜欢的平台没关系 , 但不要把自己限制在一个平台上 。 原因如下:你需要为任何事情做好准备 。
我的一个目标是在不同问题类型和不同平台之间平稳切换 。 后来开始看鲁文·勒纳的书《Python练习》同样 , 我发现勒纳每周Python练习中的问题陈述与HackerRank上的问题陈述不同 。
当然 , 我有我的偏好 。 然而 , 我需要能够解决所有类型的问题 。 因此 , 我正在使用各种平台和资源来练习 。
以下是一些例子:

  • 李特代码
  • 破解盖尔·拉克曼·麦克道尔的编码采访
  • 鲁文·勒纳的Python练习
  • 鲁文·勒纳每周Python练习
周日 , 当我为下周制定计划时 , 我从上述资源中选择了一些问题 。 我对此进行深思 。 例如 , 我将从LeetCode中选择一个专注于二进制搜索的问题 。 然后 , 专注于鲁文·勒纳来源之一的数据结构 。
这种做法让我不能依赖相同的数据结构或技术 。 我需要能够为这份工作挑选最好的工具 。 我必须能够枢轴 。
它对我也有些考验 , 在于我选择的问题将我推向极限边缘 , 这是心理学家安德斯·爱立信所称的“深思熟虑的实践”的特点 。
深思熟虑的练习就是技能发展 。 爱立信在他的优秀著作《峰值》中解释说 , 这是一种全神贯通、有意识的努力 , 带你走出“舒适区” , 以特定目标为中心 , 并“需要近乎最大限度的努力” 。
换句话说 , 你不会在做一些容易或自然的事情 。 爱立信写道:“......深思熟虑的实践的标志是 , 你试图做一些你做不到的事情 。 ”
2.交叉训练你的编程大脑你经常听说运动员将交叉训练纳入他们的日常生活 。 例如 , 跑步者每周完成一两次自行车锻炼 。 这很有意义:通过交叉训练 , 运动员从另一个角度推动他们的心血管健康 。 然而 , 关于这种方法的好处 , 就像运动员进行交叉训练以提高心血管健康一样 , 我正在结合交叉训练来提高我的心理健康 。
我的交叉训练包括解决数学问题 。 我采用与解决编程问题相同的策略 , 但在数学领域 。 相同的过程 , 不同的上下文 。
我目前的数学书提供了上述交叉培训的好处 。 但它正在做更多事情:它帮助我建立解决问题的直觉 。
这是重要的一点 。 我不想记住数学方程或过程 。 我想直观地知道什么时候使用它 。 解决编程问题时也是如此 。
3.从解决方案中学习我们都陷入困境 , 在解决问题时都会出错 。 我们利用这些失败来帮助我们找出不同的做法 。
通常情况下 , 学习就会停止 。 一旦我们解决了这个问题 , 我们就急于前进 。 但不要 。
数学家理查德·哈明建议 , 学习应该开始 。
一本书《科学与工程的艺术》中写道:“我认为研究成功基本上比研究失败更重要......错误的方式很多 , 正确的方式很少 , 研究成功更有效率 。 ”
这种“回头看”和研究你成功的想法是我之前写过的话题 , 值得再次注意 。 你总是听说我们需要如何“从失败中吸取教训” 。 但作者是对的:从我们的成功中可以学到很多东西 。
因此 , 我对解决问题过程所做的最大改变之一是将话付诸实践 。 我清楚地记得解决了第一个涉及链表的问题 , 这是一个当时对我来说很新的数据结构 。 解决了问题后 , 我专心研究它 。 我把解决方案复制到谷歌文档文件中 , 并使用注释向自己解释代码 。
出于这个关键原因 , 我想确保我清楚地理解我做了什么 , 为什么:这样我就可以再做一次 。
4.获取反馈不要认为你的解决方案很棒 。 通过获得反馈为自己找到答案 。 反馈是改善的关键因素 。 也是深思熟虑的练习的一个组成部分 。