# 挑刺 一条别人的提案摆在你面前(原文在材料"本任务要处理的东西"里)。作者自己划的因子、写的协议,到现在只有作者一个人看过,你是第二双眼睛。作者写定冻结协议时要逐条答复你的意见,之后协议就不能再改:你现在指出、作者堵上的漏洞,就是这一轮的结论不会被它带偏的地方;你现在没指出的,跑完以后多半没人能再看出来。你的意见还有第二批读者:给第二次范围的人会对照着它读,所以每条意见要不看全文也能懂。 ## 怎么找问题 先在心里把这条提案拆开:要让它按作者说的那样起作用,有哪几件事必须成立?然后拿基线代码逐件对照,顺着路径读(`read_source` 读基线,`research_query` 查提案引用的记录)。意见就从"哪一件在代码里不成立、或者没写清"里来。拆的过程不用写出来。 下面这些问题值得想,不是要逐项交的清单: - 作者假设的机制,在这份基线上成立吗?它要省掉、绕开或加强的那个东西,基线里真的存在吗? - 有没有另一种解释,也能产生同样的结果?说混杂,就点名那种解释,并说用什么能把两者分开。 - 作者的机制要是错的,计划中的测量会不会测出不一样的数?不会,这条提案就推翻不了,这本身是一条意见。 - 实验员照字面实现,哪里只能自己猜?两个人照着写,会不会写出两样东西? - 某个因子其实是两件事吗?捆在一起,消融时只能一起关,结论就分不开,这不是一句带过的小事。某个因子用到另一个因子的产物时,关掉被依赖的那个、它照开的那一格写清了吗? - 保障清单里的每一条,照系统提示词"因子与保障"那几问追到代码里。 - 跑完以后,它能回答它想问的问题吗? 你看不到作者自己估的分数,也不用替大家估分。但"作者的机制在这份基线上站不站得住"不是分数问题,正是你该查的;给第二次范围的人要靠这类意见才有东西可改。 ## 好意见长什么样 下面几条来自几道互不相干的题,只示范写法,内容和你的题目无关: - 坏:"这个提案不够严谨。"好:"p1 的做法写'字典满了就清理不常用的词条',没写'不常用'按什么计、一次清掉多少。两位实验员会写出不同的清理规则,压缩率的差别分不清来自改法还是清理规则。写明计数窗口和清理比例就能解决。" - 坏:"预取可能没用。"好:"p1 的理由是预取能提前把下一页装进缓存,但基线 `server.py:handle` 在返回当前页之前已经同步读取了下一页,预取要省的那次读取在基线里本来就不存在。分数变好的话,原因只能在别处。作者需要说明在这份基线上预取省掉的是哪一次读取。" - 坏:"p2 好像改得太多了。"好:"p2 同时加大了候选词表、又把查表顺序从按字母改成按词频,两件事单独放到基线上都说得通,消融时只能一起关。而且登记的指标只有最终准确率,词表大了还是顺序变了,测出来的数都一样。拆成两个因子,或登记一条'由新增词条纠正的次数',就能分开。" - 坏:"p3 有依赖问题。"好:"p3 用 p1 统计出的调用次数表决定哪些函数展开,可没写关掉 p1、p3 照开的那一格 p3 读什么。那一格它可能读到空表、什么都不展开,量到的是 p3 被废掉,而不是关掉 p1 的效果。写明那一格 p3 改用什么来源就能解决。" ## 两头的错 挑得太少,真问题漏过去,结论就建立在一份有洞的协议上。挑得太多也是错:为了显得认真凑出来的意见,会让作者花力气改本来没问题的地方,甚至把对的提案改错。下面几种看起来像问题,其实不是: - 替作者定参数:"迭代次数应该取 500。"该指出的是"提案没写上限,实验员只能自己定",取多少由作者定。 - 拿以前的失败一概否定:"上一轮类似的改法没用。"要说出这一条跟那次在哪一点上相同,为什么那一点会让它同样失败。 - "作者应该改做另一件事":只有提案的选择让它回答不了自己想问的问题时才是缺点,否则写成建议。 确实没找到问题,就说查了什么、为什么认为没有。从提案和代码核不了的地方,写"核不了",说明需要看什么,这也是有用的意见。