🧡 第六章 进阶对话技巧
📄 一句话概括

接手一个陌生项目,最值钱的三个问题固定不变:它怎么跑起来、这个函数谁在调、我改这里会影响谁;第三个最容易被跳过,也最贵。

📝 本节和前面几节的关系

上一节讲它问你,这一节反过来:你问它。这是本章最实用的一节。

一、第一个问题:这个项目怎么跑起来

这是第一个必问的。跑不起来,后面所有问题都白搭。 而且这个问题只有一个它能给:你这套环境是怎么装的。 问它比自己翻文档快十倍——它能一次扫完所有配置文件。

二、第二个问题:这个函数是谁调的

接手陌生代码,第一件事是找到被用得最多的地方——那是这个项目的重心。 本节的演示用一份调用清单真算了一遍:被调 21 次的那个,通常就是主干。 记住这个数很省事:哪里被调得多,哪里改动影响就大。

三、第三个问题:我要改这里,会影响谁

这是最容易被跳过,也最贵的一个问题。 改一个函数,先看谁在调它、它又调了谁——这一步花五分钟,能省下一次事故。 这一问和第 4.2 节的红灯逻辑是同一件事的两种问法:边界不清就别动手。

四、把它当向导,而不是当枪手

向导的价值是在你动手之前告诉你坑在哪儿。 所以提问的时机是动手之前——等改完了再问,等于事后诸葛。 一个简单的习惯:每个新项目,先花十分钟问这三个问题。

五、动手 Demo:把它当资深向导——先问哪三个问题

下面用一份调用清单真算一遍,看被调用次数如何暴露重心。

calls = [(u"登录校验", 3), (u"订单查询", 8), (u"日志打印", 21),
         (u"日期格式化", 12), (u"权限判断", 5)]
for name, n in sorted(calls, key=lambda x: -x[1]):
    T([u"%d 次" % n, name, u"是,它像核心" if n >= 10 else u"可以往后放"], [12, 24, 32])

实跑输出:

--------------------------------------------------------------------
把它当资深向导——先问哪三个问题
--------------------------------------------------------------------

接手一个陌生项目,最值钱的三个问题固定不变。下面用一份调用清单真算一遍:

  被调用次数     这是什么       该先看它吗
  -------------------------------------------
  21 次          日志打印       是,它像核心
  12 次          日期格式化     是,它像核心
  8 次           订单查询       可以往后放
  5 次           权限判断       可以往后放
  3 次           登录校验       可以往后放

五个函数共被调 49 次,其中【日志打印】占了 43%。

这三个问题是:
    1. 这个项目怎么跑起来?(先要一个能跑的环境)
    2. 这个函数是谁调的?(找核心,先看被用得最多的)
    3. 我要改这里,会影响谁?(找边界,别踩别人的地盘)

被调 21 次的【日志打印】占了全部调用的四成多——它就是项目的重心。 这个数在你打开陌生项目时很难一眼看出来,但让它算一次就有了。

30 秒实验

  1. 对你现在手上那个陌生项目,问它这三个问题。
  2. 尤其是第三个:你要改的那个地方,谁在调它?

常见误区

  1. 一上手就改。先问三个问题再动手,这是本节唯一要记住的事。
  2. 只问第一个问题。【怎么跑起来】解决了效率,【改这里影响谁】解决的是安全。
自测三问(点开对答案) 1. 接手陌生项目最该问的三个问题是什么? —— 它怎么跑起来、这个函数谁在调、我改这里会影响谁。 2. 为什么被调用次数能暴露项目重心? —— 被用得最多的地方就是主干,改动影响也最大。 3. 第三个问题为什么最贵? —— 改一个函数前不看清谁在调它,可能引发连锁问题——边界不清就别动手。

相关笔记