第十七章 一道没有标准答案的题
下午一点,宋严把测试题发到了几个人的电脑上。
周野看了一眼,发现只有半页纸。
他原本以为会是什么看一眼就让人头疼的公式,结果上面写的全是普通话:一批人在等立即返回的结果,另一批任务可以排到后面,还有少量需要等外部回应的工作,输入随时间变化。
要求也很简单。
整体效率提高,等待减少,资源使用更稳定。
周野看完,觉得这题像不少公司的招聘要求。
钱花得少,人来得好,最好还不用管理。
沈知行却没有笑。
他把那半页纸从头看完,问宋严:“这是你整理的,还是业务那边原话?”
“根据实际情况整理的。几家公开的典型场景合在一起,具体数据都用模拟输入。”
“目标谁确认?”
“技术部分我们一起看,业务方面下午有人远程参加。”
沈知行点头,没急着启动程序。
陈墨把另一台设备接好,罗祺核对参数。何敏和唐宁坐在后面,各自处理会谈记录。苏景明下午还要参加一场公司内部沟通,先去了旁边小会议室,约定有实质进展再回来。
没有人为了保持阵容完整而全程陪坐。
这反而让机房里的气氛轻快了些。
沈知行在白板上写下三个问题。
多快算快。
谁可以等。
什么结果算完成。
周野看着那三行字,第一反应是这会不会太简单,第二反应是自己竟然答不出来。
宋严想了想,说用户交互通常希望尽快得到结果,后台任务可以晚一些,外部等待要看对方多久回应。
“通常不够。”沈知行说,“今天选一组明确条件,至少先知道在什么地方算成功。”
陈墨点头。
“如果把所有目标都写成越快越好,最后只会比较谁更敢牺牲其他东西。”
远程接入的高杉同事开了麦,说可以给出一种产品要求:先让用户知道请求已经收到,真正处理完成后再通知。
沈知行问:“那第一下返回不等于完成,对吗?”
“对。”
“统计的时候分开。”
对方停了一下,说好。
宋严把原本放在同一列里的两项拆开。
这一拆,屏幕上看起来最漂亮的平均等待时间明显不那么耀眼了。可真正需要解决的问题,也第一次露得清楚。
有人很快收到了一句请稍候,却仍然等很久才能用上结果。
如果只把前面那句回复算成速度,系统就能显得极其勤快。
周野低声说:“这跟客服先回个亲,有点像。”
何敏抬起头,笑了一下。
“别写进正式记录。”
“我给自己理解用。”
一点半,许知夏准时到了。
她把小组材料放在旁边,先看了白板,又看了测试说明,没有打断当前讨论。
周野给她让出一张椅子,递来纸笔。她却先问能不能拿一份不含内部信息的场景描述,免得自己只听见几个名词就乱提意见。
沈知行把公开版发给她。
许知夏读得很慢,遇到含义不明的词就在旁边标一下,没有假装听懂。她上学期做过一次面向学校社团的工具,最开始大家都夸功能多,真正开放以后,第一周收到的问题却全是在哪儿点、为什么没动、是不是已经提交。
当时她跟组员反复解释说明已经写了,后来坐在旁边看三位同学实际操作,才发现说明放的位置根本没人会看。
从那以后,她看项目,先想一个不熟悉规则的人会怎么用。
沈知行注意到她把纸横着放,左边记看到什么,右边记接下来会做什么,中间空了一道很窄的缝。他以前习惯把运行状态画得很详细,很少从这种角度整理。
她见他看过来,抬了抬纸:“字写不小,只能这么摆。”
“挺清楚。”
“那就好。我原来担心你们全在讨论机器,我在这里问人点了什么,会显得很外行。”
沈知行摇头:“机器最后也是替人办事。”
等沈知行问有没有使用者角度的补充,她才举了一下手。
“那个需要立即返回的任务,用户一定会看着它等吗?”
宋严转向她:“什么意思?”
“有些人点完就去做别的事了,有些人下一步操作全靠这个结果。都叫交互,等一分钟的感受可能差很多。”
沈知行指了指第三行。
“所以要把完成之后影响什么也写清楚。”
她点头,又问如果用户连续点了几次,是否当成多个独立请求。
“可以识别同一个任务的重复操作。”宋严答。
“那识别完以后,用户知道吗?”
宋严停住。
这不是底层调度本身的问题,却关系到使用者会不会以为系统没反应,继续点更多次。
许知夏拿自己的手机比了一下。
“我不是要求今天做完整界面。只是这个场景如果不写,后面真实使用的输入就会跟你们想的不一样。”
陈墨点头,把这条补进去。
周野看着她,突然明白沈知行为什么要请一个做产品的人来。
她没往电脑里多写一行代码,却把题目改得更接近真正发生的事。
机房的窗户没完全关,外面有人上体育课,口令声一阵阵传进来。
沈知行听着那些声音,把最后一个条件写到白板上。
后台任务不能永远被推迟。
宋严看了一眼:“你准备给它们保底?”
“至少有等待上限和可见的进度,不能只为了前面的人好看,让后面那批一直挪。”
“这样可能影响最快那部分的成绩。”
“影响就记下来。我们今天找的是更好的安排,不是只拿一列数字去宣传。”
梁岳在门边听了会儿,走进来。
他看着比原先多出许多具体条件的白板,问测试还要准备多久。
宋严说再确认一次,就可以开始。
梁岳没有催。
他问了两项业务取舍,然后当场联系相关同事,确认哪些属于真实要求,哪些只是因为以前一直这么做而保留下来的习惯。
有一项原本被视为必须立即完成的任务,实际上只要在固定时间前结束就行。
把这个条件改清楚之后,整个安排多出不少空间。
沈知行把它圈出来,旁边标上确认时间。
“这条很重要。”
梁岳看向他:“技术能做?”
“能。”
“现在就能?”
“按眼前这组输入,先跑出来看。”
他说得太平常,周野反而一时没反应过来。
刚才大家花了这么久确认问题,像在一团缠起来的线里找头绪。沈知行等最后一个条件落下来,就已经知道手该从哪里伸进去。
宋严问他要不要一点时间整理方案。
“先给我原始基线。”
文件发过来。
沈知行没有直接上自己的版本,让宋严用原方式完整跑一次。机器开始工作,状态条缓慢推进。有人很快结束,有人排在队尾,等的时间越长,队列看起来越不整齐。
他低头看屏幕,意识中的实验室同步展开。
所有刚确认的条件都有了对应位置。
这回他没有只修局部错误,而是重新看整个安排:哪些信息要在进来时记录,哪些不值得提前计算,哪些变化可以稍后再修正,哪些必须及时响应。
一条条路径在灰白工作台上展开,又被他合并。
其中一条表现极漂亮,却让后台任务被拖得过久。
他直接关掉。
另一条稳定,但为了稳定保留了过多空闲,浪费了现有设备。
他调整了入口的判断。
没有人催他。
现实里,宋严那轮基线还没跑完。
沈知行已经抬起头,向陈墨借了一支笔。
他没画复杂的架构图,只把刚才那三个问题重新摆了一下位置,再在下面加了一行恢复规则。
陈墨看着,眉头慢慢皱起来。
不是不理解,是他发现这个安排比自己预先想过的几种办法更简洁。简洁意味着容易看清,也意味着一旦关键处不对,就没有太多地方可以遮掩。
“这块会不会来回摆?”他问。
沈知行指向上午写过的稳定区间。
“沿用那一层,不追每一次小波动。”
“长任务的进度?”
“单独记,不能只看它是不是当前最优先。”
“外部不回应呢?”
“等它回来再进入后续,不让整个工作单元空占着。”
陈墨没再说话,低头重新推了一遍。
宋严的基线跑完了。
结果保存时,几个人都没有去看屏幕中间最大的那个数字,而是同时看向之前约定的几项指标。
这让周野觉得挺新鲜。
才过一个下午,大家的看法已经被沈知行重新摆好了位置。
不是谁更会展示。
是先弄清楚这件事到底怎样才算做成。
许知夏在旁边记录用户侧的结果,忽然发现有一行描述不太准确。她没直接改测试配置,只在纸上圈出,等当前轮次结束再提。
沈知行看见了。
“哪里?”
她指给他看:“这里写请求已完成,实际上只是交到下一步了。”
他点头,改成更准确的状态名称,保留底下的真实记录。
许知夏看着那个新名字,轻轻笑了。
“现在好多了。”
“之前很难懂?”
“像通知用户你们内部已经走完一个流程,让用户自己猜这跟他有没有关系。”
沈知行想起昨晚那条关于按钮的消息,也笑了一下。
“这习惯得改。”
她没多问,把笔收回去,在纸边记下时间,留出空白,准备将实际结果补在后面。
时间到两点左右。
宋严将完整基线确认给众人,罗祺也保存好设备状态。远程参会的人停止讨论,等待下一步。
沈知行站起身,把白板上那几条线最后看了一遍。
“我建议今天别只给原有流程打补丁。”
梁岳抬头。
“你的意思?”
“接口和已有业务先不动。任务怎么进来、怎么等待、怎么退出,这一小层重新安排。”
宋严问:“改动量会不会太大?”
沈知行看着已经准备好的输入。
“做成正式产品当然不止今天。只验证现在这组条件,够了。”
陈墨放下笔,抬头望着他。
“你准备现在写?”
“嗯。”
机房里只剩风扇和设备运行的声音。
周野坐在门边,默默把正在打字的手机扣在桌上。他原本准备给刘成发条消息,说下午已经把题目讨论明白了。
现在看来,后半句得等一等。
沈知行把椅子拉近。
他打开一个新的目录,手指落到键盘上。
“给你们看个更省事的办法。”