最近和学生讨论科研进展时,又一次聊到了一个很典型的问题:
我们到底是在“做事情”,还是在“解决问题”?
这不是某一个学生的问题,而是很多人在科研训练早期都会遇到的共同困境:我们以为自己在推进项目,但实际上可能只是在不断完成任务。
在科研早期,很多人都会经历这样一个阶段:
很努力,也做了很多事情,但项目似乎始终没有真正往前走。
汇报时常常会说:
“我试了这个方法。”
“我又加了一个模块。”
“这个结果不好。”
“那个也没有提升。”
“我还跑了几个新的实验。”
这些当然说明我们确实投入了时间,也付出了劳动。但科研最难的地方恰恰在于:做了很多事情,并不等于做对了事情。
真正重要的不是“我做了什么”,而是:
我到底要解决什么问题?
为什么这个问题是真问题?
我的方法是否真的指向这个问题?
我的实验是否在验证这个问题?
即使结果不好,我能不能解释为什么不好?
这可能是科研训练中最重要、也最容易被忽视的一课。
科研不是把事情做完。
科研是把问题做对。
一、执行能力是基础,但科研不能停在执行层
首先必须承认,执行能力是科研的基础。
没有扎实的论文阅读、代码实现、实验复现、数据处理和结果整理能力,再好的想法也落不了地。科研不是空谈,也不是只靠想法就能完成的。很多时候,一个工作能不能推进,首先取决于我们能不能把最基本的实验做扎实,把 baseline 跑清楚,把结果整理明白。
所以,执行当然重要。
而且非常重要。
但真正拉开差距的,往往不是“有没有做”,而是:
做的事情是否嵌入了一条清晰的问题链条中。
同样是跑实验,有的人是在验证一个明确假设;有的人只是在随机尝试。
同样是加模块,有的人知道这个模块解决什么子问题;有的人只是觉得“可以加一个”。
同样是结果不好,有的人能从失败中得到信息;有的人只知道“这个不 work”。
科研能力不是单纯的执行能力,而是围绕真实问题形成闭环的能力:
发现问题,提出假设,设计方法,验证结果,解释失败,并据此推进下一步。
执行能力决定我们能不能把事情做出来。
问题意识和研究设计能力决定我们是不是在做对的事情。
二、先找到那个真正值得按住的问题
一个研究项目最怕的不是起点小,而是目标散。
今天想做一个模块,明天想加一个机制,后天又觉得可以引入一个新的信号。每一个东西单独看,好像都有意义;但放在一起之后,反而让人看不清:这个工作到底想解决什么?
科研中真正值得按住的,往往是一个足够具体、足够真实、足够可验证的问题。
它不一定一开始就很宏大,但它必须是真问题。
也就是说,它不是为了让方法看起来复杂而被制造出来的,也不是为了拼凑论文贡献点而被包装出来的,而是来自真实系统、真实实验、真实观察中的困难。
比如:
为什么模型在某些看似简单的场景下反复出错?
为什么我们给了更多信息,效果反而下降?
为什么一个整体指标上有效的方法,在某些细粒度样本上完全失效?
为什么两个表面上很接近的输入,会导致系统作出完全不同的判断?
为什么某个模块看起来合理,但加进去之后并没有带来提升?
这些问题看起来都不大,但如果它们反复出现,而且现有方法解释不了,就可能是真问题。
一个学生真正开始进入科研,往往不是从“我会实现一个模型”开始的,而是从“我能准确说出一个问题”开始的。
所以我经常提醒学生:
不要急着把系统做大,也不要急着堆很多模块。
先问自己一句:
我现在最想解决的那个问题,到底是什么?
如果这个问题说不清,后面做得越多,越容易散。
这是我之前提到的“我们解决‘真’的问题”。
三、不要为了实现而实现
科研中还有一种常见风险:
我们设计了一个模块,然后努力把它实现出来。但做到最后才发现,这个模块和最初的问题之间关系并不强。
一个模块听起来很合理,不代表它真的有必要。
一个机制看起来很高级,不代表它真的解决问题。
一个系统看起来很完整,也不代表每一步都有效。
很多时候,我们不是缺少方法,而是缺少对方法必要性的追问。
这一步为什么要存在?
它解决了什么子问题?
它和最终目标之间有什么关系?
没有它会怎样?
它失败了说明什么?
它成功了又能证明什么?
如果这些问题回答不上来,那么这个模块就很可能只是“为了实现而实现”。
科研方法不是模块堆叠。
不是说把检索、抽取、打分、分类、重排、反馈都加进去,系统就一定更强。
一个好的方法应该让人看得出它的逻辑:
我为什么要做这一步;
这一步对应什么问题;
它如何改变原来的系统;
它为什么可能带来提升;
如果它没有提升,我能从中学到什么。
有些模块只是冗余,最多浪费一点时间。
但有些模块如果方向不对,反而会把整个研究带偏。
所以我经常提醒学生:
不要为了实现一个想象中的复杂系统而做方法。
要为了真正解决问题而设计方法。
实现和有效,是两回事。
四、有设计地试,而不是盲目地试
有学生曾经问过我一个很好的问题:
“我怎么知道自己的思路是不是对的?这不是要做出来才知道吗?”
这个问题非常真实。
科研当然需要尝试。没有实验,就没有结果;没有试错,也很难发现新东西。
但问题在于,尝试本身也有高效和低效之分。
一种低效的方式是:
我先试十种方法,看看哪个有效。
A 不行,换 B;
B 不行,换 C;
C 不行,再换 D。
这种方式当然有可能成功。运气好的时候,很快就能试出一个有效结果。
但运气不好的时候,试一个月、两个月、三个月,也可能什么都没有留下。
更好的方式不是“不试”,而是有设计地试。
所谓有设计地试,至少要先想清楚三件事。
第一,我的问题是什么?
不是“我要做一个模块”,而是“我遇到了什么具体困难”。
第二,我的方法为什么可能解决这个问题?
不是“这个方法看起来可以加进去”,而是“这个方法和问题之间有什么直接关系”。
第三,如果结果不好,我能从失败中学到什么?
是我的假设错了?
是信号不够强?
是建模方式不对?
是数据构造不合理?
还是评测指标没有对准问题?
这和“盲目试”最大的区别在于:
盲目试错只告诉你“这个方法不行”。
有设计的试错会告诉你“为什么不行”,以及“下一步应该往哪里改”。
科研中最可怕的不是实验失败。
最可怕的是实验失败之后,我们什么都解释不了。
五、ACL 与 EMNLP:两种科研气质的类比
我以前也和学生讲过一个经典说法:
在自然语言处理领域,ACL 和 EMNLP 往往代表着两种不同的科研气质。
当然,这不是严格区分,也不是说哪个会议更高级。今天的 ACL、EMNLP、NAACL、COLING 等会议早已高度交叉融合。ACL 上有大量非常扎实的 empirical work,EMNLP 上也有很多问题意识和方法设计都非常强的论文。
所以这里更适合把它理解成一种历史气质上的类比,而不是绝对划分。
早期的 ACL,更接近 computational linguistics 的传统。它更强调问题本身、语言现象、理论动机和方法设计之间的关系。一个工作最好能说清楚:为什么这个问题重要?为什么现有方法没有解决?为什么你的方法从思想上是合理的?
换句话说,它更看重一种“思想上的一致性”。
如果你的问题定义、动机分析和方法设计已经非常清楚,别人往往会相信:这个方向是合理的。实验当然重要,但实验不是唯一支撑。你的理论动机、问题拆解和方法逻辑,本身也能形成说服力。
而 EMNLP 的传统,则更偏 empirical NLP,也就是更强调经验、实验和可验证的效果。
它的精神有点像:
你说这个东西有效,那你做实验给我看。
你说这个规律存在,那你拿结果证明。
你说这个方法更好,那你在数据上跑出来。
这当然也是非常重要的科研方式。很多 NLP 方法并不是从严密理论推导中诞生的,而是从大量实验、经验观察和反复验证中逐渐形成规律。
所以我经常用一个很简单的比喻来解释这两种气质。
一种方式像物理中的理论推导。
如果数学推导足够严谨,即使某些极端条件下的实验暂时做不了,人们也会相信这个结论很可能成立。因为你的逻辑链条是完整的。
另一种方式像尝苹果。
你想知道哪个苹果好吃,最直接的方法就是咬一口。你不一定需要先从植物学、光照、糖分、颜色、品种讲一大套理论。你尝了,发现好吃,再总结规律,这也是一种可靠的经验方法。
这两种方式都可以做科研。
但问题在于,科研早期很容易出现一种尴尬状态:
既没有形成清晰的理论牵引,也没有做出足够直接、足够有力的实验验证。
既不是严谨推导,也不是有效尝苹果。
更像是在十个苹果面前抛硬币,然后说:“我试过了。”
这就很危险。
因为抛硬币和苹果好不好吃之间的联系太弱。别人自然会质疑:你为什么这么做?这个动作和你的目标有什么关系?你试出来的结果到底能说明什么?
所以,实验主义不是乱试。
经验方法也不是没有逻辑。
好的 empirical research 不是“我试了很多”,而是“我设计了一个足够直接、足够贴近问题的实验”。
好的 idea-driven research 也不是“我讲了一个很大的故事”,而是“我的问题、动机、方法和预期结果之间高度一致”。
无论偏哪一种风格,最终都绕不开一个核心:
你的研究动作,必须和你的研究问题之间有强关系。
六、让方法、目标和动机保持一致
一个好的科研方案,应该是目标、动机和方法三者一致的。
如果你的目标是解决某种细粒度判断问题,那么方法就应该真正提供新的判别信号。
如果你的目标是提升系统鲁棒性,那么实验就应该覆盖那些最容易出错的场景。
如果你的目标是减少噪声干扰,那么你就要说明什么是噪声、为什么它会干扰、你的方法如何识别或抑制它。
方法不能只是“看起来合理”。
它必须和你的问题发生关系。
我希望学生在设计方法时,能形成这样一条清楚的逻辑链:
我观察到了什么现象;
这个现象暴露了什么问题;
现有方法为什么不够;
我引入了什么新的视角或机制;
它为什么可能解决这个问题;
我如何验证它是否真的有效。
如果这条链条是通的,即使实验还没有做完,方向也会显得可信。
如果这条链条断了,即使做了很多实验,也很难让人相信这是一个好研究。
很多时候,别人并不是在质疑你有没有努力。
别人质疑的是:你的努力是否指向了正确的地方。
科研能力的核心,是让每一次努力都和问题之间建立强关系。
七、科研汇报不应该只是“我做了什么”
我也经常和学生说,汇报时不要只讲“我做了什么”。
“我实现了一个模块。”
“我跑了一个 baseline。”
“我改了一个模型。”
“我做了几个实验。”
这些信息当然需要讲,但它们不是汇报的核心。
更重要的是讲清楚:
我现在要解决的问题是什么;
这个问题为什么重要;
我目前的假设是什么;
我为什么这样设计方法;
我已经验证了哪一部分;
结果支持了什么,不支持什么;
下一步我要怎么调整。
如果只讲做了什么,听众只能知道你花了时间。
但他们不知道这些时间有没有产生价值。
科研不是按工作时长计费。
不是每天坐在那里,事情就自然往前走。
一个成熟的研究者,应该逐渐成为一个“最小驱动单元”。
也就是说,即使没有别人每天监督,也能够自己发现问题、拆解问题、设计尝试、解释结果,并在失败后调整方向。
导师当然可以给建议,但导师不可能替你摸每一个细节。
如果一个项目每隔几周就停住,最后只剩下“做了一个东西没用,又做了一个东西也没用”,那不一定是能力不够,而很可能是科研模式还没有建立起来。
科研训练的目标,不是让学生永远等待任务,而是让他逐渐从“任务执行者”变成“问题推进者”。
八、少一点苦劳,多一点有效努力
我并不鼓励学生无休止地工作。
相反,我一直觉得,科研最重要的不是工作时间有多长,而是方向是否正确、动作是否有效。
如果用十分之一的精力就把事情做对了,剩下的时间完全可以休息。
如果三天真正把“鱼”打上来了,够吃一个星期,后面几天晒网也没有关系。
但如果方向不对,即使每天都很努力,也可能只是原地打转。
所以我不太愿意只表扬“辛苦”。
辛苦当然值得尊重,但科研最终还是要看是否解决了问题。
我们都不希望只有苦劳,没有功劳。
也不希望任何人把自己耗在大量低效尝试里。
真正好的科研训练,应该帮助我们逐渐形成一种能力:
少做无效功;
少堆复杂模块;
少被表面现象迷惑;
少用“我已经做了很多”来安慰自己。
更多地去问:
我是否抓住了真问题?
我是否在用合适的方法解决它?
我的每一步设计是否都有必要?
我的失败是否能带来信息?
我的下一步是否比上一轮更接近答案?
这也是我之前提到的“我们要‘真’的在解决问题”。
九、科研训练,本质上是在训练一种思维方式
方法能力可以慢慢培养,工程能力也可以慢慢提高。
但更底层的,是一种科研思维方式。
这种思维方式不是简单地“多试”,也不是空想一个复杂系统。
它是在真实问题中不断追问:
为什么这是一个问题?
为什么现在的方法解决不了?
我的方法到底改变了什么?
它和最终目标之间有什么关系?
结果为什么变好,或者为什么没有变好?
很多具体技术可能过几年就会过时。
但这种想问题的方式,可以用很久。
所以我希望学生在每次项目讨论之后,不只是记住“老师让我改哪一页 PPT”,也不只是记住“下次要补哪个实验”。
更重要的是,他要慢慢学会:
如何判断一个问题是否值得做;
如何判断一个方法是否真的解决问题;
如何设计一次有效尝试;
如何从失败中提炼信息;
如何把自己的研究讲成一条清晰的逻辑链。
科研不是把事情做完。
科研是把问题做对。
当一个人开始从“我做了什么”转向“我为什么这样做”,从“我试了很多”转向“我有设计地验证”,从“结果不好”转向“我知道为什么不好”,他才真正开始进入科研。
这也是科研训练中最重要的成长。
PS:这些话,是我现在常常讲给学生听的;更早的时候,也是我的硕导、博导和博后导师曾经反复讲给我的。很多科研训练的方法,也许就是这样一代一代传下来的。所谓薪火相传,大概就是如此。