华为阿里工作4年,我总结出这4条宝贵经验!
- 2021 年 6 月 29 日
- AI
当时间紧张、需求急迫时,如果没有高效的方法,很容易会乱了阵脚,得到失败的结果。
因此,对于不同领域,我总喜欢提起“方法论”这个词汇。
掌握一定的方法,能够条理清晰、脚踏实地的高效完成每一项工作。
对于编程开发也是这样。
在开发过程中,经常会接到各种各样的需求,也会出于不同原因导致各种各样的问题。
当系统出现一个问题之后,我们该如何高效解决问题,虽然在面试过程中不会考核这些,但是却和日常工作息息相关。
本文,就来介绍我通过总结得出的4步高效解决编码问题的方法。
首先说明一下,本文介绍的方法并非是笔者首创,而是从波利亚·哲尔吉的一本名为《How to Solve It》得到的灵感。
这本书最初于1945年问世,已售出超过100万本。
这本书中提出的解决问题方法已经被很多程序员和高校教授使用,通过这本书介绍的方法,可以通过四步来解决编码过程中面临的很多问题。
本文,将使用JavaScript作为实例语言进行举例,首先抛出问题:
创建一个将两个数字相加并返回该值的函数
解决问题的方法分为4个步骤:
- 了解问题
- 制定计划
- 执行计划
- 复盘回顾
下面逐步介绍一下。
步骤1:了解问题
在面对需求时,很多同学首先想到的就是赶紧进行编码,避免项目延期。
这是在所难免的,但是,需要避免这种情况。
在开始解决问题之前,首先确保真正理解该问题。
如果对问题一知半解,不仅使得开发过程中模棱两可浪费时间,还会导致最终需求对接存在误差倒是结果不尽人意,严重时甚至需要返工重新开发。
因此,需要认真理解问题,弄清楚自己不理解的部分,达到对问题有清晰的认识。
为了更好地理解问题,请问自己几个问题:
输入是什么?
问题的输入是什么?在本文的示例中,输入将会作为函数的参数。
通过对于前面提出的问题可以知道,我们的输入将是数字。
但是,需要做更加全面的考虑,我们可以问:
输入将始终只是两个数字吗?如果我们的函数收到三个数字作为输入怎么办?
以此,来达到对问题进行更加深入和全面的认识。
输出是什么?
该函数将返回什么?在这种情况下,输出将是一个数字,这是两个数字输入的结果。
确保你真正了解输出结果。
一旦掌握了问题并知道了可能的输入和输出,就可以开始处理一些具体示例。
编写用例
示例可以作为测试用例,用作稳定性、健全性检查。同时,通过编写用例,可以提升自己对代码的理解。
从一个简单的示例或两个可能的输入和输出开始。让我们回到加法函数。
我们将函数称为add。
什么是示例输入?输入示例可能是:
//add(2, 3)
它的输出是什么?要编写示例输出,我们可以编写:
// add(2, 3)---> 5
这表明我们的函数将输入2和3并返回5作为其输出。
也可以通过编写更为复杂的用例,来寻找需要考虑的极端情况。如果我们的输入是字符串而不是数字,该怎么办?
2. 制定计划
接下来,制定解决问题的计划。
在设计计划时,可以用伪代码将其写出来。
伪代码是算法步骤的简单语言描述。换句话说,伪代码是解决问题的重要组成部分。
写下解决问题所需采取的步骤。对于本文问题,你可以编写:
// 创建一个sum变量。
使用加法运算符将第一个输入添加到第二个输入。
// 将两个输入的值存储到sum变量中。
// 返回总和变量作为输出。
现在,你已经有逐步解决此问题的计划。
对于更复杂的问题,埃文斯教授指出:“系统地考虑人类如何解决问题。”
也就是说,暂时先不要考虑用代码怎么解决问题,而是考虑如何以人工方式解决它, 这可以帮助你更清楚地看到这些步骤。
3. 执行计划
解决问题策略的下一步就是执行计划。
使用你的伪代码作为指导,写出你的真实代码。
埃文斯教授建议将重点放在简单的解决方案上。
你的解决方案越简单,就越可能正确编程。
拿我们的伪代码,我们现在可以这样写:
function add(a, b) {
const sum = a + b;
return sum;
}
切记不要过早优化!
就是说,当你在实现需求的过程中可能会这样想:“等等,我这样做,这将是效率低下的代码,不如优化一下吧!”
首先,只需获得简单的解决方案即可。解决问题应该通盘考虑,而不是在实现过程中过度追求其中一部分的优化。
Colt Steele在这里提供了很好的建议:如果您无法解决部分问题,请忽略使您绊倒的那部分困难。
相反,请专注于可以开始编写的其他所有内容,暂时忽略你不太了解的问题中的困难部分。
完成这一部分后,请回到较难的部分。
4. 复盘回顾
解决方案开始运行后,请花点时间思考一下并找出如何进行改进。
这是你将解决方案重构为更有效的解决方案的时候了。
当你查看工作时,Colt Steele建议你提出一些问题,让自己思考如何改善解决方案:
- 还有哪些可行的其他方法?
- 一眼就能理解吗?是否有意义?
- 可以将结果或方法用于其他问题吗?
- 可以提高解决方案的性能吗?
- 能想到其他重构方法吗?
- 别人如何解决这个问题?
针对前面的代码实现,我们可以重构问题以使代码更简洁的一种方法:删除变量并使用隐式返回:
function add(a, b) {
return a + b;
}
当我自己编码时,总是会看到比我提出的解决方案更优雅或更有效的解决方案。
因此,可以通过不断的阅读别人代码,或者让别人评审自己的代码,这样有助于提出更为有效的解决方案。
在本文中,我们讨论了解决编码问题的四步问题解决策略。
请记住,解决问题的技巧是使得任何人都可以随着时间和实践而变得更好的技能。
干货推荐
为了方便大家,我花费了半个月的时间把这几年来收集的各种技术干货整理到一起,其中内容包括但不限于Python、机器学习、深度学习、计算机视觉、推荐系统、Linux、工程化、Java,内容多达5T+,我把各个资源下载链接整理到一个文档内,目录如下:

所有干货送给大家,希望能够点赞支持一下!
https://http://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA (提取码:0000)