元能力:向程序员学习怎样有效解决问题
乔布斯曾说,每个人都应该学习编程,因为它能教会你思考。编程是程序员的工作,反应程序员的思考过程,体现他们解决问题的方法。
解决问题是一种元能力,是一个人最基本最核心的技能。当一个人没有解决问题的框架,在碰到一个问题时,通常这样(大部分新手程序员也这样开始学编程):
1)尝试一种解决方法,
2)失败,换一种再试,
3)如果还不行,重复第二步,直到幸运女神降临。
有时候会很幸运,通过胡乱「试误」得到答案,但这是最没效率的方法,是对时间的极大浪费,就像一只苍蝇在瓶子里乱撞,不过凑巧碰到了出口。
个人的价值体现在解决问题的能力上,你能解决多大的问题,也意味着你有多大价值。几乎所有雇主都把解决问题的能力放在首位。如果你是创业者,顾客就是你的雇主,你提供的产品是解决方案,你能帮客户解决的麻烦越大,你的产品也越有价值,但是在提供方案前,先想你要解决的问题。
精益创业有句口号是:
爱上问题,而不是你的解决方案。
但很多人花时间学习知识,很少学习如何解决问题,资深程序员,自媒体作者 Richard Reis 认为优秀程序员解决问题时,会:
A)找到一个开发框架,B)在框架内不断练习。
下面是4个具体步骤:
1.理解
首先要理解问题。很多人一接触到问题,就急急忙忙开始找方法。这就如同我们上学做阅读理解,你不认真读原文,你就不可能找出正确答案。
如果你不能简单地解释一件事,你就没有理解它。
—— 理查德·费曼
检验你有没有理解事物的一个方式看你能不能清晰、准确的的表达它。经常会碰到有朋友过来提问题,在跟你讲解的过程中,突然说「我知道了,我知道该怎么做了」。
这就是通过给别人讲述,促进理解问题。大部分情况下,理解了问题,就能知道该如何解决。
不一定非要找一个人听你解释,我们可以自我解释,说给自己听,尝试用自己的语言复述问题,或者写出来,用图画出来,这也是费曼技巧的要点。
2.计划
一定要规划。我们说计划赶不上变化,没有一项战前计划能指挥作战行动。但计划还是很有必要,规划这个过程能进一步促使你理解问题,思考怎样做。它还让你梳理资源,确定要采取的对策以及明确时间节点。
计划的作用不是要你按部就班的执行,它更像迷路时的北极星,航海时的灯塔,帮助校正方向,行动过程中不要离题太远。
一个好的计划能够回答:如果输入X,采取什么步骤可以取得结果Y?
3.分解
我曾分享过模块化思考,这也是计算机处理问题的基本方法——分治。不要试图解决一个大的问题,要把它分解为更小的子问题,不断分解,直到这些子问题能够容易解决。
然后从最简单的开始,分别求解,最简单的意思就是,你知道怎样解决。最简单还意味着,它是独立的问题,不受其他问题影响。
当你解决了每个子问题后,将这些子问题的解整合,它就是原始问题的答案,这是一个综合的过程。而前面我们分解问题是分析。解决问题时分析与综合不断交错。
这一方法最早是笛卡尔提出来的,也是17世纪后,科技大爆发的主要原因。牛顿说他站在巨人肩上,这个巨人指的就是笛卡尔。
笛卡尔的这个科学方法论是解决问题的基石,解决所有的问题都要遵循这个技术,一定要理解并记住它。
4.卡壳
有时候,你顺畅地获得了答案。但很多情况下,你会卡住。这很正常 ,所有人都会卡,只有一种人不卡——从不解决问题的人。
卡住后,先舒一口气,冷静下来,如果你是一个积极进步的人,可能还有点兴奋,因为遇到了挑战。下面是卡壳后的三种正确姿势:
1)调试
调试是程序员的基本功,他们叫debug ,戏称捉虫。调试是一门通过试错寻找答案的艺术,这里的试错不同于前面新手一样的盲目试错,是一种「有纪律的试错」,善于解决问题的程序员都有一套高效的调试流程。
他们会对卡住的可能原因排好优先级,有纪律的调试。定位原因(这既要知识也需要经验),发现程序真正做了什么,而不是自认为应该需要程序做什么。
2)重新评估
退一步海阔天空,不妨尝试换一个角度,最初的切入角度是不是错了,或者我们太关注当前的细节,而忽视了更一般的原则。
甚至有时候,你得从头开始,推倒重来后,你可能会有柳暗花明又一村的感觉。
3)研究
研究就是搜索,借鉴其他人的解法。你遇到的问题,很可能是其他人也遇到过。找到那个人或者他的解决方案,看看他是如何处理的。
即使你解决了问题,也应该看看别人怎样做。你能从其他人的方法中学到很多。
注意:一定不要搜索大问题的解决方案,只搜索当前卡住你的子问题的解决方案,然后再逐步向上。只有当你自己努力解决问题时,你才是学习,直接使用别人的做法,吃现成饭,不能提升你解决问题的能力。
练习
不要指望一周后你就能是一个解决问题的高手。想要成为一个问题解决专家,你需要解决很多问题,你得做大量练习。程序员有个好处就是编程环境能够马上给予反馈,正确的代码能得出正确的结果,错误的代码立即报错。
我想这也是乔布斯为什么提议每个人都学编程的原因,因为试错成本低,想一想,这个世界上还有比写代码训练解决问题更低的成本吗?
你不想写代码也可以,你可以从你喜欢的,感兴趣的任何地方开始。解决问题的模式是相通的,算一道数学题,回答一个知乎问题,都是解决问题,你都可以用前面的四步法练习这个能力。
结语:
解决问题的能力是提升价值的元技能。它也是能够培养的一项技能。希望你遇到许多问题,你现在知道了怎样解决,而且每学到一个方法,你都前进了一步。
当你认为已经成功的克服了一个障碍后,另一个障碍出现了,这也是生活真正有趣的原因。生活就是不断解决问题,突破障碍的过程,每次你都能从中学到一些东西,你都会获得力量,智慧和洞察力。
相关文章: