How to Solve it?

一次"职慧"听课记录——解决问题

Posted by kissg on May 22, 2016

路漫漫其修远兮 吾将上下而求索


前言

上周, 学校组织了一场比较大型的实习双选会. 之前一直在做企业筛选, 简历准备的工作, 没来得及对最近学的Python知识做一个总结回顾. 用一篇职慧的听课记录代替.
(直接看正文)

开始之前, 先对职慧做个简单介绍吧.

职慧, 是一个公益组织, “致力于提升中国大学生的职业素养, 使他们成长为具有诚信品格, 专业精神和社会责任的青年英才”. 应试教育下成长起来的中国大学生除了应付考试, 对自我, 社会和职场知之甚少. 职慧希望让所有大学生都有机会享受到高质量的职场能力提升培训和辅导.
(以上文字摘自”职慧”微信公众号, 有兴趣的同学可以微信搜索”livetogive”, 个人认为推文不错)

简单地说, 职慧是一个培养大学生职场能力的公益组织, 这一点从他们的课程安排也可以看出来: 简历制作, 职场礼仪, 解决问题……

我们学校至今只申请到一堂职慧的课, 而我有幸去听了, 感觉老师讲得很好. 现将上课内容整理出来与大家分享, 希望能有所帮助.

正文

那堂课的主题是解决问题. 老师将解决问题的过程, 概括为了4个字: , , , . 本文也将顺着这个思路展开.

所谓, 即定义问题.

在定义问题之前, 其实有必要先对“问题”下一个定义. 什么是问题? 在英语里, questionproblem都可以表示问题. 但明显, 此处所谓的问题是problem, 而非question. question, 更偏向于疑惑, 相应地, 与之搭配的动词是answer, 即解答; 而problem的定义是——现状期望差距——相应地, 与之搭配的动词是solve, 即解决.

知道了问题的概念之后, 再来定义问题, 思路就相对清晰了. 既然问题是”差距”, 那么定义问题就是将这差距给描述出来. 一种好的方法是, 采用量化的思想, 即为现状和期望都设一个恰当的数值, 中间的差值就是问题所在.

举个简单的例子. 一开始我们定义的问题可能是这样的: 这个程序跑得太~慢了, 我希望它能跑得更快. 用量化差距的方法来修改问题定义, 可以是这样: 这个程序执行一次要200ms, 我希望它能在100ms以内跑完. 与模糊的相比, 用时间间隔来刻画现状与期望, 一眼就能看出问题所在.

一个更具有普适性的例子是: 我每天都睡太迟了, 今天要早点睡 -(量化)-> 我每天都凌晨1点才睡着, 今天要11点就睡.

此外, 有必要指出选项不是问题, 即类似这个功能是用for循环呢, 还是用递归呢(晚饭是吃面呢, 还是吃饭呢), 是一个选项, 而非问题. 你可以选择用for循环, 或者叫递归, 全凭心情(当然, 考虑到代码实现的难易, 可读性和程序效率, 你会有所取舍的). 但明显, 这个”问题”本身并不涉及现状与期望, 也就无从谈差距了.

所谓, 即分析问题, 找出原因.

针对”闻”, 老师介绍了2个工具——鱼骨图五个为什么——一个用于列出所有原因, 一个用于归纳主要原因.

先看看鱼骨图, 它的大致形状如下所示: 鱼头指向当前现状, “脊椎”两侧的”大鱼刺”代表大方面的原因, “大鱼刺”上的各”小鱼刺”则表示更细的原因.

鱼骨图

可以看出, 鱼骨图可以非常清晰地显示出导致当前现状的各方面原因. 这也是使用鱼骨图的关键所在——尽可能列出所有原因.

五个为什么, 以一种层层深入地提问的方式, 找出根因所在. 来看一个具体例子吧(一下子很难想到编程相关的例子, 以下摘自维基百科, 有删改):

  • 情景: 汽车无法启动了.
    1. Q: 为什么汽车无法启动?
      A: 因为电池电量耗尽了.
    2. Q: 为什么电池电量会耗尽?
      A: 因为交流发电机不能正常工作.
    3. Q: 为什么发电机不能正常工作?
      A: 因为交流发电机的皮带断裂了.
    4. Q: 为什么皮带会断裂?
      A: 因为交流发电机皮带远远超出了其使用寿命, 从未更换过.
    5. Q: 为什么超出了使用寿命, 却从不更换?
      A: 因为我一直没有按照厂家推荐的保养计划对汽车进行过保养和维护.

从上述例子, 已经能看出来, 五个为什么就是通过不断地追问来找出根本原因. 一般到第五问时, 根因差不多也就出来了. 当然具体要追问多少次, 还得情况而定.

所谓, 即产生解决方案, 用到的工具可以是头难风暴. 这也是我第一次听到这个名词, 了解之后, 发现确实很有用.

头脑风暴法(英语:Brainstorming),又称为脑力激荡法,是一种为激发创造力、强化思考力而设计出来的一种方法。可以由一个人或一组人进行。参与者围在一起,随意将脑中和研讨主题有关的见解提出来,然后再将大家的见解重新分类整理。在整个过程中,无论提出的意见和见解多么可笑、荒谬,其他人都不得打断和批评,从而产生很多的新观点和问题解决方法
——维基百科-头脑风暴

简单地说, 头脑风暴就是一个群策的过程, 日常的讨论算是广义的头脑风暴吧. 进行头脑风暴, 有几个要点:

  1. 设定一个主题
  2. 设定时间限制
  3. 列出所有意见
  4. 激励大家参与
  5. 不做评价

就”不做评价”做一个简单说明, 头脑风暴的目的是尽可能多地产生解决方法, 仅此而已, 评价筛选的工作在确定方案阶段进行. 若提早对某一方案做评价(一般会是批判性的), 将影响参与者的积极性, 一定程度上也会限制意见的创新. 当时我们头脑风暴主题是”如何写学术论文”, 连”抄袭”都出来了, 不过大家也就默契地一笑置之.

所谓, 就是确定解决方案.

一种可行的工具是评价矩阵, 候选的解决方案就是上一阶段头脑风暴的结果, 还需要设置一个或多个评价标准, 大概的样子如下所示:

Fibonacci number in recursion and loop

由评价矩阵可知, 虽然循环和递归方式实现Fibonacci数列, 两者各项得分有所不同, 但按总分来看, 可以优先选择循环的方式(当然更好的构造Fibonacci数列的方式可能是生成器).

根据使用场景的不同, 还可以为各项评价标准设定不同的权重, 比如就上述例子而言, 若重点考虑空间消耗, 可设其权重为2或更多, 其他评价标准权重为1或其他值.

另外, 得分越高越优还是越低越优, 可以根据个人喜好来, 但务必保持一致. 比如有些同学喜欢用小的数值表示消耗低, 而效率则喜欢用大的数值表示高效性, 这就造成了混乱, 最后究竟是得分高者为优还是低的为优? 这是个问题.

小结

至此, 解决问题的一套流程算是跑完了. 让我们简单梳理一下:

  • 定义问题 - 问题, 本身就被定义为现状与期望的差距, 因此一种行之有效的定义问题的方法是: 量化差距
  • 分析原因 - 用鱼骨图列出所有原因, 或用五个为什么找出根本原因
  • 产生解决方案 - 可以用头脑风暴的方式产生尽可能多的解决方案, 注意不要做评价
  • 确定解决方案 - 可以用评价矩阵来确定最终方案

为了讲解清楚, 正文中所举的例子都是针对单个环节的. 但在实际使用时, 大家望闻问切的思路来解决问题, 应该会有意料之外的收获.

One more thing, 解决问题的方法是多样的, 本文也仅仅提供了一种解决问题的思路. 你完全可以在不同环节采用不同的方法或工具, 比如在分析出问题产生的原因之后, 针对各原因逐个消除, 或解决主要矛盾, 再或者完全采用其他的解决之道. 用伟大领袖我邓主席的话作结:

黑猫白猫, 能抓住老鼠的, 就是好猫.

(本篇博客的题目, 引用了 Zbigniew Michalewicz & David B.Fogel 两位的著作How to Solve It: Modern Heuristics(如何求解问题:现代启发式方法) 的书题)