第十七章 一道没有标准答案的题

下午一点,宋严把测试题发到了几个人的电脑上。

周野看了一眼,发现只有半页纸。

他原本以为会是什么看一眼就让人头疼的公式,结果上面写的全是普通话:一批人在等立即返回的结果,另一批任务可以排到后面,还有少量需要等外部回应的工作,输入随时间变化。

要求也很简单。

整体效率提高,等待减少,资源使用更稳定。

周野看完,觉得这题像不少公司的招聘要求。

钱花得少,人来得好,最好还不用管理。

沈知行却没有笑。

他把那半页纸从头看完,问宋严:“这是你整理的,还是业务那边原话?”

“根据实际情况整理的。几家公开的典型场景合在一起,具体数据都用模拟输入。”

“目标谁确认?”

“技术部分我们一起看,业务方面下午有人远程参加。”

沈知行点头,没急着启动程序。

陈墨把另一台设备接好,罗祺核对参数。何敏和唐宁坐在后面,各自处理会谈记录。苏景明下午还要参加一场公司内部沟通,先去了旁边小会议室,约定有实质进展再回来。

没有人为了保持阵容完整而全程陪坐。

这反而让机房里的气氛轻快了些。

沈知行在白板上写下三个问题。

多快算快。

谁可以等。

什么结果算完成。

周野看着那三行字,第一反应是这会不会太简单,第二反应是自己竟然答不出来。

宋严想了想,说用户交互通常希望尽快得到结果,后台任务可以晚一些,外部等待要看对方多久回应。

“通常不够。”沈知行说,“今天选一组明确条件,至少先知道在什么地方算成功。”

陈墨点头。

“如果把所有目标都写成越快越好,最后只会比较谁更敢牺牲其他东西。”

远程接入的高杉同事开了麦,说可以给出一种产品要求:先让用户知道请求已经收到,真正处理完成后再通知。

沈知行问:“那第一下返回不等于完成,对吗?”

“对。”

“统计的时候分开。”

对方停了一下,说好。

宋严把原本放在同一列里的两项拆开。

这一拆,屏幕上看起来最漂亮的平均等待时间明显不那么耀眼了。可真正需要解决的问题,也第一次露得清楚。

有人很快收到了一句请稍候,却仍然等很久才能用上结果。

如果只把前面那句回复算成速度,系统就能显得极其勤快。

周野低声说:“这跟客服先回个亲,有点像。”

何敏抬起头,笑了一下。

“别写进正式记录。”

“我给自己理解用。”

一点半,许知夏准时到了。

她把小组材料放在旁边,先看了白板,又看了测试说明,没有打断当前讨论。

周野给她让出一张椅子,递来纸笔。她却先问能不能拿一份不含内部信息的场景描述,免得自己只听见几个名词就乱提意见。

沈知行把公开版发给她。

许知夏读得很慢,遇到含义不明的词就在旁边标一下,没有假装听懂。她上学期做过一次面向学校社团的工具,最开始大家都夸功能多,真正开放以后,第一周收到的问题却全是在哪儿点、为什么没动、是不是已经提交。

当时她跟组员反复解释说明已经写了,后来坐在旁边看三位同学实际操作,才发现说明放的位置根本没人会看。

从那以后,她看项目,先想一个不熟悉规则的人会怎么用。

沈知行注意到她把纸横着放,左边记看到什么,右边记接下来会做什么,中间空了一道很窄的缝。他以前习惯把运行状态画得很详细,很少从这种角度整理。

她见他看过来,抬了抬纸:“字写不小,只能这么摆。”

“挺清楚。”

“那就好。我原来担心你们全在讨论机器,我在这里问人点了什么,会显得很外行。”

沈知行摇头:“机器最后也是替人办事。”

等沈知行问有没有使用者角度的补充,她才举了一下手。

“那个需要立即返回的任务,用户一定会看着它等吗?”

宋严转向她:“什么意思?”

“有些人点完就去做别的事了,有些人下一步操作全靠这个结果。都叫交互,等一分钟的感受可能差很多。”

沈知行指了指第三行。

“所以要把完成之后影响什么也写清楚。”

她点头,又问如果用户连续点了几次,是否当成多个独立请求。

“可以识别同一个任务的重复操作。”宋严答。

“那识别完以后,用户知道吗?”

宋严停住。

这不是底层调度本身的问题,却关系到使用者会不会以为系统没反应,继续点更多次。

许知夏拿自己的手机比了一下。

“我不是要求今天做完整界面。只是这个场景如果不写,后面真实使用的输入就会跟你们想的不一样。”

陈墨点头,把这条补进去。

周野看着她,突然明白沈知行为什么要请一个做产品的人来。

她没往电脑里多写一行代码,却把题目改得更接近真正发生的事。

机房的窗户没完全关,外面有人上体育课,口令声一阵阵传进来。

沈知行听着那些声音,把最后一个条件写到白板上。

后台任务不能永远被推迟。

宋严看了一眼:“你准备给它们保底?”

“至少有等待上限和可见的进度,不能只为了前面的人好看,让后面那批一直挪。”

“这样可能影响最快那部分的成绩。”

“影响就记下来。我们今天找的是更好的安排,不是只拿一列数字去宣传。”

梁岳在门边听了会儿,走进来。

他看着比原先多出许多具体条件的白板,问测试还要准备多久。

宋严说再确认一次,就可以开始。

梁岳没有催。

他问了两项业务取舍,然后当场联系相关同事,确认哪些属于真实要求,哪些只是因为以前一直这么做而保留下来的习惯。

有一项原本被视为必须立即完成的任务,实际上只要在固定时间前结束就行。

把这个条件改清楚之后,整个安排多出不少空间。

沈知行把它圈出来,旁边标上确认时间。

“这条很重要。”

梁岳看向他:“技术能做?”

“能。”

“现在就能?”

“按眼前这组输入,先跑出来看。”

他说得太平常,周野反而一时没反应过来。

刚才大家花了这么久确认问题,像在一团缠起来的线里找头绪。沈知行等最后一个条件落下来,就已经知道手该从哪里伸进去。

宋严问他要不要一点时间整理方案。

“先给我原始基线。”

文件发过来。

沈知行没有直接上自己的版本,让宋严用原方式完整跑一次。机器开始工作,状态条缓慢推进。有人很快结束,有人排在队尾,等的时间越长,队列看起来越不整齐。

他低头看屏幕,意识中的实验室同步展开。

所有刚确认的条件都有了对应位置。

这回他没有只修局部错误,而是重新看整个安排:哪些信息要在进来时记录,哪些不值得提前计算,哪些变化可以稍后再修正,哪些必须及时响应。

一条条路径在灰白工作台上展开,又被他合并。

其中一条表现极漂亮,却让后台任务被拖得过久。

他直接关掉。

另一条稳定,但为了稳定保留了过多空闲,浪费了现有设备。

他调整了入口的判断。

没有人催他。

现实里,宋严那轮基线还没跑完。

沈知行已经抬起头,向陈墨借了一支笔。

他没画复杂的架构图,只把刚才那三个问题重新摆了一下位置,再在下面加了一行恢复规则。

陈墨看着,眉头慢慢皱起来。

不是不理解,是他发现这个安排比自己预先想过的几种办法更简洁。简洁意味着容易看清,也意味着一旦关键处不对,就没有太多地方可以遮掩。

“这块会不会来回摆?”他问。

沈知行指向上午写过的稳定区间。

“沿用那一层,不追每一次小波动。”

“长任务的进度?”

“单独记,不能只看它是不是当前最优先。”

“外部不回应呢?”

“等它回来再进入后续,不让整个工作单元空占着。”

陈墨没再说话,低头重新推了一遍。

宋严的基线跑完了。

结果保存时,几个人都没有去看屏幕中间最大的那个数字,而是同时看向之前约定的几项指标。

这让周野觉得挺新鲜。

才过一个下午,大家的看法已经被沈知行重新摆好了位置。

不是谁更会展示。

是先弄清楚这件事到底怎样才算做成。

许知夏在旁边记录用户侧的结果,忽然发现有一行描述不太准确。她没直接改测试配置,只在纸上圈出,等当前轮次结束再提。

沈知行看见了。

“哪里?”

她指给他看:“这里写请求已完成,实际上只是交到下一步了。”

他点头,改成更准确的状态名称,保留底下的真实记录。

许知夏看着那个新名字,轻轻笑了。

“现在好多了。”

“之前很难懂?”

“像通知用户你们内部已经走完一个流程,让用户自己猜这跟他有没有关系。”

沈知行想起昨晚那条关于按钮的消息,也笑了一下。

“这习惯得改。”

她没多问,把笔收回去,在纸边记下时间,留出空白,准备将实际结果补在后面。

时间到两点左右。

宋严将完整基线确认给众人,罗祺也保存好设备状态。远程参会的人停止讨论,等待下一步。

沈知行站起身,把白板上那几条线最后看了一遍。

“我建议今天别只给原有流程打补丁。”

梁岳抬头。

“你的意思?”

“接口和已有业务先不动。任务怎么进来、怎么等待、怎么退出,这一小层重新安排。”

宋严问:“改动量会不会太大?”

沈知行看着已经准备好的输入。

“做成正式产品当然不止今天。只验证现在这组条件,够了。”

陈墨放下笔,抬头望着他。

“你准备现在写?”

“嗯。”

机房里只剩风扇和设备运行的声音。

周野坐在门边,默默把正在打字的手机扣在桌上。他原本准备给刘成发条消息,说下午已经把题目讨论明白了。

现在看来,后半句得等一等。

沈知行把椅子拉近。

他打开一个新的目录,手指落到键盘上。

“给你们看个更省事的办法。”