透明思考


Transparent Thoughts


我对毕业生的期望 之 有思路

对毕业生的三个期望,第二样是“遇到问题要有思路”。说得更直白一点,脑子要清楚,不能一团浆糊。

毕业生进了项目,大家最怕看到的不是这位同学有多少知识不知道不停地问问题——这样的同学都算优秀的了。最怕的是往那儿一坐两眼一抹黑,不知道该干嘛。给讲一段代码,就大概可以照着这段代码抄一抄;稍微遇到个不一样的问题,或者出个异常,立马就手足无措。Java出问题不会搞,HTML出问题也不会搞,数据库出问题还是不会搞。这可急死了带队的老同事:漫天都是不会的,从哪儿教起呢?

有些同学说,我不是想不明白,是根本不知道往哪儿想,因为我以前根本没做过类似的东西。这都是借口!经验丰富了肯定有助于你把事情想明白,但是经验不丰富不是想不明白的借口,因为思考本身是有方法的。而且我们做IT的人,总是面对未知比较多——某件事情一旦变成已知,你就写程序把它自动化了,不用再想它了。掌握思考的方法,你才能探索未知。所以思考方法实在比知识和技能更重要。

要把脑子弄得清楚一点,第一条是要学会看事实。我最怕听毕业生说“我觉得……”。网页上的图显示不出来了,“我觉得是JSON出问题了”,然后就去看生成JSON的代码。嘿,等等,你一没知识二没经验,你凭什么觉得?首先要学会看事实,先别动任何代码,尽可能多地把事实列出来:浏览器发了什么请求,得到了什么应答,JavaScript有没有报错,render了什么HTML,全都列出来。当然你也可以猜是哪儿有问题,但是一定要把假设、猜想和事实分开。要是脑瓜儿太小记不下,就拿个笔来记:我看到哪些事实,我假设哪些条件,我做了什么猜想。信不信,很多时候你写到这里,就已经知道问题怎么解决了。

事实、假设、猜想,你只能相信事实。事实都列出来了,问题还不清楚,怎么办?这就引出第二条:学会设计实验。我们的理科教育有一件很失败:做了N多实验,却没有教人怎么设计实验,只是照着实验步骤一步步做下来,结果还是不知道什么现象证明什么道理。你得学会设计实验来验证你的假设和猜想,把假设和猜想变成事实,或者扔掉它。实验要简单明了,一次实验只验证一个猜想:如果猜想正确,应该得到什么结果;如果猜想错误,应该得到什么结果。最简单的实验是什么?面前有一大段代码,你觉得是后半段出错了,就到正中间去插一句输出语句,如果输出的结果就已经不对,就说明你的猜想错了,事实是前半段有错,你就获得更多的事实了。

学会看事实,学会设计实验,你还得用逻辑来分析事实。说起来“逻辑”好像很学术,其实只要记住三件事就可以应付绝大多数情况:第一,必要条件,就是没有它一定不行,有了它也不一定行;第二,充分条件,就是有了它一定行,没有它未必不行;第三,排除法,就是去掉不可能的,答案一定在剩下的部分。本来程序跑得好好的,你写了半小时代码,就运行不起来了,你就得去看刚写的那几行出了什么错,这叫排除法。找到一个错是不是就万事大吉?不一定,因为这个错只是程序出错的充分条件不是必要条件,还可能有别的错呢。所以我总是要求毕业生小步前进频繁提交,就是为了排除的时候轻松一点。

前面一篇我说毕业生首先要把键盘练快,有人就说了,难道键盘快就一定能成为优秀程序员吗?软件的精髓在于设计!——对照我说的这几点来看,第一句话,没分清必要条件和充分条件;第二句话,跟毕业生说就是不了解大多数毕业生的真实情况,假设、猜想毕业生都已经练好了基本功现在需要追求“精髓”,没有验证假设和猜想,脱离了事实。看看,我说这几条,看似简单,仍然是需要时时练习才能得心应手的。同学们,加油啊。

(本文作者熊节是ThoughtWorks的总监咨询师)