作为人类,我们一直在解决问题,作为开发人员,也不例外。以问题解决为中心的课程不是很受欢迎或常见,许多开发人员倾向于专注于学习工具、语言和框架,而不是学习如何像问题解决者、程序员一样思考。
什么是问题解决?
解决问题对于不同的人或情况可能意味着不同的事情,因此当提到“解决问题”时,最好澄清本文的含义。
为方便起见,当您将损坏的汽车送到商店时,他们可能会决定修理损坏的部件、更换损坏的部件或为您提供购买新车的选项。尽管所有这些选项看起来都是“解决方案”,但实际上只有第一个选项在处理问题。其他一切都是避免不得不处理问题。
作为开发人员,有时您可能不得不决定完全避免问题并用新的东西替换它,而不是处理问题,但本文侧重于解决问题的技术,而不是替换或避免它。
当给定一组约束并且必须遵循一些规则时,您解决了一个问题,您提出了一个满足所有约束且不违反规则的解决方案。作为程序员,我们编写一个程序,一组解决问题的指令。
编码不同于解决问题
任何花时间学习如何编码的人最终都将能够进行编程。学习编码就像学习一门新语言。它是通过使用解释或编译计算机能够理解的语言来为计算机创建指令以执行的能力。
解决问题是一种不同的技能,作为人类,我们天生擅长它。我的意思是,我们通过解决一个又一个问题来构建我们周围的世界。开发人员经常遇到的问题是将这两个技能集联系起来。解决编程问题会让你更擅长解决现实世界的问题,如果你擅长解决现实世界的问题,编程可能对你来说很自然。
为什么这方面的课程不多?
如果你环顾四周,有成千上万的课程教你如何使用工具,如何将一个工具连接到另一个工具,以及如何构建东西,但没有明确说明它们如何解决问题。当然,理解一种语言、工具或框架很重要,但这并不能使您成为问题解决者。
仅仅因为您了解工具箱中的工具并不意味着您可以修理汽车,但工具集的知识以及解决问题的策略和心态可能会让您最终修理汽车。
编码教程的好处是让您接触尽可能多的问题和解决方案,作为教您如何编程的一种方式。开发人员在找不到带有答案的视频或博客文章时往往会吓坏了,这就是他们在论坛或 Reddit 和 StackOverflow 等社交媒体网站上发帖的原因。
在互联网普及之前,程序员必须真正为他们正在处理的问题找到解决方案。当时,拥有解决问题的策略和思维方式至关重要,而如今开发人员往往会忽视这一技能组合,因为他们只能在谷歌上搜索解决方案。
互联网的这种便利使学习如何编程变得更容易,而且你甚至不必去上学,但也让许多可以编码但没有解决问题战略思维的开发人员涌入了这个行业。
常见问题解决错误
新开发人员经常做的是直接进入编码工作。他们在学习的过程中经常需要适应和更改代码,这并不是一项糟糕的技能,但是您可以周而复始,永远无法找到解决方案。这种通过反复试验的蛮力方法可能会奏效,并且对原型和探索很有用,但即使在这些情况下,最好也有一个计划。
其实谁都没有错。如果您停下来想一想当今人们是如何学习编程的,您就会意识到这基本上是通过单击视频并获得所需的确切解决方案。天真地,当您尝试自己解决问题时,您可能会尝试做同样的事情。
通常不明显的是,为了制作教程视频,讲师通常会经历一个以多年经验为后盾的过程,并接触过许多问题和解决方案,这使他/她可以轻松地引导您完成解决方案无需解释他们如何达到该解决方案。
不,教程不是坏事,您不应该停止观看教程或谷歌搜索解决方案。即使是专业开发人员也会做同样的事情。我想让你明白的是,在深入编码之前,你应该花一些时间和精力来学习这个过程并计划你的解决方案。
那么如何解决问题呢?
这是在工作面试的编码会话期间简要测试的技能。当您参加技术面试时,您可能会接受某些工具知识(通常是低级或入门级工作)或解决问题的技能(通常是中高级工作职位)的测试,这是因为专业开发人员和工程师通常具有去面对那些让他们走出舒适区的工具所特有的问题。
某些问题解决方案甚至可能需要您创建自己的工具或系统。这就是大型框架、工具和系统诞生于高级职位和科技公司的原因。Facebook 引入了 React 和 GraphQl,谷歌开发人员创建了 Angular 和 Dart,微软给了我们 Typescript 等等。这表明当你真正致力于解决一个问题时,它可能会带来可以与他人共享的新工具或系统。
每个问题解决者都有一个方法,一个逐步指导以找到解决方案,而这正是您需要熟悉的。实际上,你的大脑已经知道这一点,但它很快就会找到解决方案,以至于你常常不会去想它是如何到达那里的。要解决问题,您需要放慢速度并控制焦虑以快速找到解决方案。
您可以通过分析、研究和规划解决方案(有时是多个解决方案)来使用良好的问题解决策略来解决问题。这可能需要时间并需要耐心。所以让我们分解它。
了解问题
如果您不了解所有细节,问题可能看起来很复杂。在求职面试中,第一步是在编写解决方案之前了解他们的要求。作为自由职业者,在提出解决方案之前,您必须清楚地了解客户的要求。作为开发人员,您必须在实施解决方案之前了解任务的要求和验收标准。
如果你能用简单的语言向别人解释一个问题并且他们明白了,那么你就明白了。写下你的理解、绘制草图、制作图表等是很好的。很多时候,其他开发人员把我叫到他们的办公桌前帮助他们解决问题,只是通过尝试向我解释他们找出解决方案。
你的大脑经常陷入一些特定的细节,有时会阻止你看到更大的图景,通过试图解释它、勾勒它并分解它,你迫使你的大脑抓住更多细节,丰富你对问题的理解。
您确认您对问题的理解的方式可能是将其重复给向您介绍问题的人,或者通过对您收集的详细信息进行确认。
始终先计划解决方案
一旦您掌握了详细信息并了解了问题,就可以计划解决方案了。这是您分析约束和规则、制定逐步解决方案并提出测试数据或假设以对其进行测试的部分。
您可以通过编写注释、高级伪代码、图表、流程图、更详细的草图等来完成。规划阶段的目的是看到更大的图景并确定问题的所有子问题、步骤和部分。
您的计划可能会在解决方案实施过程中发生变化,或者随着您的进行而被完全不同的东西所取代。把时间花在一个可能会在以后被草拟的计划上的想法似乎是在浪费时间,但是计划某事的简单步骤可以让您了解整个事情,并且可以更轻松地在以后进行调整。
不可能在一个计划中预测整个结果,这就是为什么一旦您开始实施计划,计划可能会改变或被放弃。没有计划,您只是在掷骰子并希望获得幸运。缺乏计划也使得很难委派或欢迎人们加入解决方案。
从你知道的开始
如果计划正确,您应该能够识别问题的许多部分,并且最好先解决您熟悉的问题。这种方法可以帮助您保持解决问题的动力,并可能激发关于如何解决其余问题的新想法。
识别模式
有时,类似的问题已经被其他人解决了。一个问题甚至可以与其他一些更简单的问题共享模式。在这里,良好的研究和经验可以帮助您轻松识别问题的细节或部分,这些细节或部分类似于您或其他开发人员之前解决的问题。
一旦你确定了模式,你就已经解决了问题。如果需要更改,您将有一个起点可以继续。
首先从最多的约束开始
如果您必须找到一个与同事共进午餐的地方,最好的选择是首先从饮食限制和规则最多的人开始,然后从那里开始。一旦你解决了最多的约束,你就会缩小你的选择范围,让它更容易解决其他所有问题。
这相当于买新房。首先列出所有约束;您可以放下多少,卧室和浴室的数量,面积,预算,大小等。一旦您记下所有详细信息,您就可以缩小选择范围,从而更清楚地了解您可以负担得起的费用。如果不满意,那么你需要做些什么来改变你的选择也是显而易见的。
划分问题
有些问题不能用一种解决方案来解决。如果您必须解决数独或国际象棋游戏,尝试为赢得游戏所需的所有动作制定计划会使找到解决方案成为一项复杂的任务。你应该总是把你的问题分成块,解决所有的块,然后解决整个事情。
简化问题
简化不同于划分问题。简化意味着改变约束或规则。在科技界,它通常被称为寻找 MVP 解决方案。你几乎缩小了问题的范围,使问题更简单。一旦你有了解决问题的更简单版本的解决方案,它就会为我们提供足够的知识、经验和研究时间,以便以后解决更大版本的问题。
实验
有时,尝试事物并观察结果是解决问题的最佳方法,但不要与键入一些代码并希望得到正确结果相混淆。实验是一个受控过程,旨在探索未知或收集信息。
也许有一个库可以帮助你解决问题,但你并不熟悉。也许你期待一个结果,但得到了完全不同的东西。实验是处理错误修复的特别好方法。一般来说,探索一个问题以尝试更多地理解它或测试不同的选项以比较哪个可以是更好的解决方案是一种很好的方法。
备份并说明问题
有时,即使您收集了所有细节、计划和分块,您也无法找到解决方案。如果您感到沮丧,最好退后一步,冷静下来并重新陈述问题。你永远不应该在影响你心情的事情上转动你的轮子。
一旦你感到沮丧,你往往会把事情复杂化,失败或为问题选择一个复杂的解决方案。离开一天或几个小时,深呼吸,然后大声向你解释这个问题。勾勒出正在发生的事情,以检查您对问题的理解。解决问题应该是合乎逻辑的事情,而不是情绪化的事情。
实践
解决问题就是将自己暴露在尽可能多的情况下,并一遍又一遍地练习这些策略。随着时间的推移,它成为你的第二天性和处理任何问题的自然方式。无论大小,始终从计划开始,使用此处提到的其他策略,直到您有信心并准备好编写解决方案为止。
结论
成为问题解决者需要时间和练习。在编程方面,了解基础知识、数据结构、算法、设计模式以及事物的工作原理是更重要的知识,因为它们可以应用于任何编程语言和环境。
有了解决问题的心态,一切皆有可能。写下这些步骤,并尝试在下一次解决问题的冒险中遵循它们,直到记住它们。有许多网站可以让您免费测试您解决问题的能力,您应该尝试一下。有关更具体的示例和详细信息,请阅读以下书籍。
1 thought on “如何解决任何编程问题”