-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathphd-grind-chn.tex
executable file
·988 lines (577 loc) · 221 KB
/
phd-grind-chn.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
% !TEX program = XeLaTeX
% !TEX encoding = UTF-8
\documentclass[12pt,UTF8,nofonts]{book}
\usepackage{xeCJK}
\setCJKmainfont[BoldFont=STXihei]{STSong}
\setCJKfamilyfont {gkai} {STKaiti}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{indentfirst}
%\let\cleardoublepage\clearpage
\setlength{\parindent}{2.4em}
\linespread{1.3}
% \setlength{\parskip}{1ex}
\setlength{\parskip}{0.5\baselineskip}
\newenvironment{dedication}
{
\clearpage
\thispagestyle{empty}
\vspace*{\stretch{2}}
\hfill\begin{minipage}[t]{.7\textwidth}
%\raggedright
\CJKfamily{gkai}
}
{
\end{minipage}
\vspace*{\stretch{3}}
% \clearpage
}
\newcommand{\bookname}{博士研磨}
\begin{document}
\title{\Huge \textbf{ \bookname } \\ \large \textbf{一个博士研究生的回忆录} \footnote{英文原文链接:\url{http://www.pgbovine.net/PhD-memoir/pguo-PhD-grind.pdf}。 本翻译基于原文2012 年7月16日发布的版本译成。}}
% Author
\author{{ \begin{tabular}{lll}
原著 & Philip J. Guo & (\texttt{[email protected]})\\
翻译 & 齐鹏 & (\texttt{[email protected]})\\
& 罗宇男 & (\texttt{[email protected]})
\end{tabular} }}
\date{}
\renewcommand*\contentsname{目录}
\frontmatter
\maketitle
\begin{dedication}
献给所有热爱创造的人。
\end{dedication}
\tableofcontents
\markboth{{\CJKfamily{gkai}目录}}{{\CJKfamily{gkai}\bookname}}
\mainmatter
\renewcommand{\emph}[1]{{\CJKfamily{gkai}#1}}
\newcommand{\breakline}[0]{\begin{center}$\sim$\end{center}}
\newcommand{\prologuesection}[1]{\begin{center}\large{\CJKfamily{gkai}#1}\end{center}}
\setcounter{chapter}{0}
\newcommand{\mychapter}[1]{
\addtocounter{chapter}{1}
\setcounter{section}{0}
\chapter*{#1}
\markboth{{\CJKfamily{gkai}#1}}{{\CJKfamily{gkai}\bookname}}
\addcontentsline{toc}{chapter}{#1}
}
%%% Disclaimer
\markboth{}{}
\section*{Disclaimer}
This is an unauthorized Chinese translation of Philip J. Guo's memoir \emph{The Ph.D. Grind}, and the original author did not have any input on the translation.
The copyright of the content belongs to the original author, and the translation to the translator. This work may not be used for business purposes, and may only be used as non-commercial material.
Apart from the Translator's Preface, none of the content of this work represents, none should be interpreted as, the opinion of the translator; nor will the translator be responsible for the consequences of any interpretation of this translation.
\section*{声明}
本作品是Philip J. Guo的回忆录《The Ph.D. Grind》的中文翻译,翻译并没有得到原作者的任何授权,原作者也并没有以任何形式参与到翻译过程中。
本作品内容的版权归原作者所有,翻译版本归译者所有。本作品不得被用于任何商业目的,只能作为非盈利性材料传播。
除译序外,本作品的一切内容均不代表——且不应被认为是——译者的观点;译者对此翻译的任何理解以及其导致的影响亦不负有任何责任。
%\clearpage
\mainmatter
%%%% Preface
\chapter*{序}
\markboth{}{}
这本书记述了从2006年到2012年,我在斯坦福大学攻读博士研究生期间六年的求学经历。这本书适合广泛的读者群,其中包括:
\begin{itemize}
\item 有志攻读博士研究生\footnote{研究生(graduate student)本是指本科之后的高等教育,通常包括硕士研究生和博士研究生两种学位。现代汉语中“研究生”一词经常被滥用,用以单指硕士研究生,这其实是错误的。——译者注}的本科生;
\item 寻求方向或灵感的在读博士生;
\item 希望更深入了解博士研究生的教授;
\item 希望聘用和管理拥有博士学位员工的雇主;
\item 在充满竞争的创新领域工作、与自我追求和自我激励密不可分的专业人士;
\item 对学术研究充满好奇的有一定教育背景的成年人(或者早熟的青少年)。
\end{itemize}
《\bookname》与已有的与博士经历相关的文章在写作形式、写作时机和写作基调上都有所不同:
\paragraph{形式} 《\bookname》是一本面向大众的回忆录,而非一本面向在读博士生的“成功指南”。尽管博士生也能在我的经历中学习到经验和教训,但我的目标并不是直接提供建议。对于博士生而言,市面上的“成功指南”和“建议专栏”已经不胜枚举,我也无意画蛇添足。这些文章充满了“持之以恒”和“不积跬步,无以至千里”等等空泛的词汇,但相反,回忆录的形式让我能丰富、具体地叙述发生在我自己身上的故事。
\paragraph{时机} 《\bookname》是我在完成博士学位之后马上着手写作的,而这正是撰写这样一本回忆录的最佳时机。不同于在读博士生的是,我可以在回忆录中对整个博士求学期间的工作进行系统的整理和反思;而相比资历较深的研究者而言,我可能更容易忠于攻读期间的经历,不会引入过多由研究经历带来的有选择性的观点和感受。
\paragraph{基调} 尽管保持完全客观是不可能的,但我在写作《\bookname》过程中仍然试图贯穿一种相对客观的基调。与其他作者不同的是,很多撰写博士相关文章、书籍,或者绘制漫画的人通常属于以下两类之一:
\begin{itemize}
\item 成功的教授或者科学家,他们通常给出一些冠冕堂皇的建议,比如他们可能会说:“研究生生活诚然辛苦,但它同时应该是一段美好的知识之旅,你应该享受这个过程、并从中受益……因为我当年就是这样做的!”
\item 或者是苦涩的博士研究生或者辍学博士,他们常常因为自己的经历留下了心理阴影,当提及博士生活的时候会用一种过分夸张、“看破一切”、自我怨恨的腔调:“啊,那时我的世界就是个活生生的地狱,我到底拿我的青春换了什么?!?”
\end{itemize}
冠冕堂皇的建议可能能激励一些学生,而大倒苦水的呻吟可能能引起另一些处境不佳的学生的共鸣,但作为大众读者而言,他们可能并不能感受到这些极端的情绪。
最后,在我开始讲述自己的故事之前,我希望强调一下,每个博士研究生的经历与他/她所在的学校、院系、研究领域、经费状况等都有巨大的关系。在我的读博生涯中,我感到自己非常幸运,能很大程度上自由自愿地完成自己的学业;我知道很多学生相比而言受到了很多的限制。我的故事只是一个孤立的数据点,所以我所呈现的故事可能并不能泛化、推广到每一个人。然而,我会尽力避免叙述变得过分局限于我个人的情况。
祝阅读愉快!
\begin{flushright}
Philip Guo, 2012年6月
\end{flushright}
\chapter*{译者序}
\markboth{}{}
\prologuesection{巫术与火刑}
可能最经常被家人朋友问到的问题之一,就是:“你说你在做研究、想读博,那读博士、做研究到底是在做什么?”我一直想不到一个很好的答案,直到读了Philip Guo的The Ph.D. Grind。
有时候,读博做研究在大众眼里,就好像中世纪早期欧洲的医学。彼时的人们仍然处于蒙昧状态,现代人习以为常的生物和化学知识,在那时仍大多是未知的领域。在战乱和饥荒之外,最多夺去人们生命的,就是疾病。当时的社会主流仍然认为身体不适是由恶魔侵袭造成的,而对此的对策也往往只是信仰治疗。与此同时,一个不被主流社会所认可的群体开始形成,在使用信仰治疗之外,他们开始尝试用各种草药对付不同的病症。这种和当时社会常识截然不同的治疗方法尽管比单纯的信仰治疗有效许多,但因为它和人们广为接受的宗教信仰有所冲突,所以大多巫医的治疗都在地下进行。巫医们似乎也不愿意把自己的草药知识普及到大众之中,所以他们草药知识体系的大部分都在自己的群体中形成,知识的累积和传授也通常在巫医们的地下集会中传播。没有不透风的墙,这种和教廷宣扬的教义冲突的“巫术”很快就被封禁了,很多参与者也被处以了当时的极刑——火刑——意在彻底消灭这些“恶魔”。可能迫于宗教势力的压迫,并没有人挺身而出救下这些曾经救死扶伤的巫医,而受此影响,传统医学的发展也大大受到了阻滞。
或许除了教会的压制之外,另一个阻止人们挺身而出的因素,正是他们对巫医治疗原理的不了解。作为少数掌握当时较高医学知识的群体,巫医迫于种种现实因素选择了将自己的知识保存在相对狭窄的群体中,并没有试图让更多普通人认识到他们对疾病的深入理解和反复试验累积的经验。这其实某种意义上和今天的象牙塔别无二致。受到高等教育的人群往往不愿意、甚至不屑于与大众分享自己专业领域的知识或者技能,从而两者之间通常会产生隔阂与不信任。当然今天的世界已不存在火刑这样残忍的刑罚,但对大众的不了解、不认同、甚至不信任,象牙塔里的学者们不能说毫无责任。
《\bookname》虽然并不是直接以此为目的的,但为大众了解象牙塔内的生活也能提供第一手资料,是一本不可多得的回忆录。也正是出于这个考虑,我才决定把整本书翻译成中文,希望能让更多英语阅读有障碍的中文母语者能获得同样的体验。
\prologuesection{研磨的故事}
在动手开始翻译之前,已经在许多中文材料中听说了The Ph.D. Grind,也见到过未完成的翻译作品。不同的材料中,对书名中grind一词的翻译往往见仁见智。
\begin{quote}
Grind,原意研磨或者碾压,指将物体细细碾成碎片或者粉末。后来这一词汇被引申为磨砺(通过摩擦使物体变得锋利或光滑),或者与研磨、磨砺相类似的,需要长期努力的苦工。
——翻译自Merriam-Webster字典释义
\end{quote}
一个相对广为接受的翻译似乎是《博士磨砺》,想必当时的译者取义“宝剑锋从磨砺出,梅花香自苦寒来”的暗喻,喻指博士生涯是一种对品格、性情、毅力、素养的磨练,当苦尽甘来时,回望来路彼时种种磨练都塑造了此时的自己。这种看法不无可取之处,它给人以希望,让我们提前看到这本回忆录应该有一个圆满的结局,而之前的一切苦难和不幸,都是最后成功之花绽放的铺垫。
而另一种广为流传的翻译似乎是另一个极端,即《博士磨难》。这位译者可能对书中描述的科研中遇到的困难和点滴都深有同感,也为我们还原了一个博士生在求学过程中经常看到的实景:真理的高峰往往在迷雾中不知所踪,而就算有幸看到了峰顶的光芒,攀登的过程也绝非一路康庄。
刚刚开始翻译的时候,我也曾经为grind这个词的翻译大伤脑筋。在翻译书名的时候想当然地借用了“磨砺”这个更加激励人心的翻译,但当翻译中一次次遇到这个词在正文中出现时,我开始质疑自己的选择。在整本回忆录中,grind更像是一个中性词,没有“磨砺”这种事后回望,一切苦功都没白费的庆幸,也鲜有“磨难”这种抱怨眼前困难,自悲自怜的消极。
为了尽量终于原文的阅读体验,并尽量保持正文和书名中的grind翻译一致,我最终还是选择了“研磨”这个更接近词语原意,也不具有明显感情倾向的翻译。尽管这个词在现代汉语中并没有直接用作“辛苦工作、历练、磨砺”的意思,我仍真切地希望读者能理解这个选择。
\prologuesection{献给所有热爱创造的人}
正如原作者在回忆录最后强调的,读博士带来的磨砺、成长和创造的乐趣并不只有读博士这一条路可以带来,不同人在不同的人生道路上可能都有相似的体验。尤其是那些热爱创造的人,他们在路上往往经历着相似的艰难险阻:因为从零到一往往是充满挑战的,即使眼前有确定的目标,前进的路上也决难以预料会有怎样未知的问题在等待解决。但他们又往往有着同样坚韧不拔的品格:尽管跋山涉水、披荆斩棘,经历过无数次失败和重来,无数次跌倒和重新启程,无数次止步不前的沮丧和取得进展的喜悦,他们仍然朝着心中的那个目标努力着。
借原作者致礼的这句话,再次表达对他们的敬意:\emph{献给所有热爱创造的人。}
最后,也借此机会感谢背后一直支持我的家人、女友和朋友们,你们一直是我前进路上最大的动力和最坚实的依靠。还要由衷感谢罗宇男参与了本书后半段的翻译工作,没有他的辛勤工作,这份完整的翻译稿也很难现在完成。其它在工作、生活和翻译上曾经给予过我鼓励、指导、建议和支持的朋友们,在此也一并感激。
\\[3em]
\begin{flushright}
齐鹏\\
2015年4月16日\ 于斯坦福
\end{flushright}
\mainmatter
%%% Prologue
\mychapter{前言}
因为我本科的专业是电子工程和计算机科学,大部分本科同学在毕业之后,都马上投入到了工程性的工作中了。而我最终选择攻读博士学位,究其原因,一方面是受到来自父母潜移默化的影响,另一方面也和我在本科期间对工程性的实习产生的不良印象不无关系。
我父母从未要求过我去攻读博士学位,但我可以看出,终身大学教授\footnote{在美国和加拿大等国家,终身职位(tenure)是指资深学者拥有的,除因正当理由外,免于被解雇的合同权利。与此不同的是任意性职位(at-will),规定劳动双方随时可以以任何理由终止劳动合同,不需要法定的正当理由,也不需要提前通知。大多数非学术研究类(工程性)的工作属于后者。——译者注}是他们最尊重的职业—— 而博士学位正是成为终身教授的必要条件。为什么终身教授会是他们心目中的理想职业呢?这其实并不是因为他们对纯粹的学术追求有什么不切实际的盲目推崇。尽管我的父母也都到过良好的教育,但他们同时也是非常现实的移民——一份终身教授的职位对他们而言,更大的吸引力在于终身制所带来的工作保障。
我父母的很多朋友都是在企业的工程性职位上供职的中国移民。由于他们在英语技巧和美国文化了解上的不足,他们中的大多数人在职业生涯中的经历都并不顺利,而这一问题往往随着年龄增长而更加突出。在假日聚会上,我经常能听到一个不变的主题:人们的工作因为难以相处的经理而处处不顺、成为年龄歧视和“玻璃天花板”效应\footnote{玻璃天花板(Glass Ceiling)效应是一个政治术语,用于形容“在企业内升职过程中看不到但难以逾越的障碍,通常见于少数人种和女性身上,且与这些人群的资历和成就并无关联”的现象。—— 译者注}的牺牲品、甚至面临大规模裁员和长期失业的风险。尽管我父亲不是一位工程师,而是在高技术产业就职,但他也难逃这种魔咒,在一系列和管理层极其官僚做派的斗争中失败,最终早早地结束了他在公司的工作。那时他还相对很年轻,只有45岁。
我的母亲则是这种不幸潮流中唯一的幸存者。她十分热爱自己在UCLA\footnote{UCLA 是加州大学洛杉矶分校(University of California, Los Angeles)的简称。——译者注}作为社会学终身教授的工作。和她的大部分中国移民朋友不同的是,她享受终身职务保障,不用向老板汇报工作,可以几乎完全自由地追求她自己的学术兴趣,在她的研究领域也小有名气。亲眼目睹我母亲成功的职业轨迹,和父亲及他们的朋友们在职业生涯上的恶性循环两者之间的巨大反差,这在我高中和大学本科的学习生涯中留下了难以磨灭的印象。
当然,仅仅因为这种非理性的、年少时的恐惧就去选择读博显然是不明智的。为了让自己对在企业的工作生活有所印象,我在本科的每个假期都参加了工程性公司的实习。因为我工作过的办公室都碰巧只有我一个实习生,我被赋予了一种罕有的特权—— 我的工作职责是按照全职初级工程师的标准分配的。尽管在这个过程中我学到了很多技术上的技巧,我仍然觉得这种日复一日的工作极少需要思考且非常无聊;这也可能与我实习过的公司不是一流公司有关。我本科的很多朋友都在微软(Microsoft)和谷歌(Google)等一流公司实习过,并非常喜欢他们的实习经历,他们最终也往往在毕业后和这些公司签下了全职工作合同。
因为我对我的实习经历感到厌倦,而另一方面对本科时作教学助理(助教)和研究助理(助研)的经历比较感兴趣,我当时将未来的职业目标定在了大学教学和学术研究上。等到我在MIT\footnote{MIT是麻省理工学院(Massachusetts Institute of Technology)的简称。——译者注}的第三年过半,我已经下定决心在毕业后攻读博士学位,因为这是实现我职业目标的必经之路。我决定留在MIT,完成一个五年制本硕连读的项目,以此来在申请博士项目之前积累更多的研究经验,以期能被录取到更多排名顶尖的院系中去。
我找到了一位硕士论文的导师,并且就像很多壮志踌躇的年轻人一样,开始向他阐述自己不甚成熟、遑论完善的研究思路和计划。我的导师很耐心的听我说完了我的想法,但最终仍然成功地说服我进行一些和他的研究兴趣更契合、更主流的研究,而且更重要的是,这些研究项目更契合他的基金项目要求。因为当时我的硕士项目学费一部分来自我的导师从美国政府申请的一个\emph{研究基金},我有义务在基金所规定的范围内完成研究工作。因此,我听从了他的建议,并将接下来两年半的时间用于开发一类新的原型工具,用于分析由C 和C++ 语言编写的计算机程序的运行时行为。\footnote{运行时行为分析(run-time behavior analysis)是计算机程序编写和维护中一种重要的技术,它可以帮助软件工程师更快、更准确地发现在程序编写时难以注意到的程序缺陷和漏洞(bug),进而完善其功能并提高稳定性。Bug一词的原意是虫子,现代被用于形容软件缺陷。这一说法一个可能的来源,是源于1947 年电子管计算机刚刚问世前后。当时在哈佛大学的二号机(Mark II)中,一位操作员仔细排查后发现,二号机当时一些计算谬误的产生,是由于一只飞蛾被困在了一个继电器上。这件事被记录在了当时的实验室日志中,后来常被称为“第一次真正找到的bug(此处为虫子和程序缺陷的双关)”。——译者注}
虽然我并不是非常热衷于我硕士论文的项目,但事实证明选择一个和导师研究兴趣契合的项目是一个明智的选择:在他有力的指导下,我发表了两篇论文——一篇我被列为第一作者(主要作者),另一篇的位置稍微靠后——并且我的硕士论文获得了系里年度\emph{最佳毕业论文奖}。这些成就,加上导师在我申请文档中的帮助,为我赢得了几所顶尖计算机科学系博士项目的录取。因为斯坦福是我的首选,在我收到录取的当天晚上,我甚至激动得几乎无法入睡。
我还非常幸运地得到了NSF\footnote{NSF是美国国家自然基金会(National Science Foundation)的简称。NSF是支持美国各大高等院校进行基础自然科学研究的重要基金来源之一。该奖学金的申请只面向美国公民及永久居民开放。——译者注}和NDSEG\footnote{NDSEG是美国国防科学与工程研究生奖学金(National Defense Science \& Engineering Graduate Fellowship)的简称。该奖学金由美国国防部出资设立,旨在推动国防相关的科学与工程研究的发展,其申请只面向拥有美国国籍的人士开放。——译者注}研究生奖学金的垂青,这两者都只颁发给了大概5\%的申请者。这两个奖学金为我免除了攻读博士的六年之中,五年的全部费用,也使我不必完成各种研究基金相关的研究项目。与我不同的是,在我的研究领域中,大部分博士研究生依赖于教授提供的研究经费和院系提供的助教经费。博士研究生的经费包括全额学费,以及大约每个月1,800美元的补贴,用于贴补生活开支。(在我的研究领域几乎没有人自费攻读博士,因为那样在经济上非常不划算。)
因为我已经有一定的研究和写作论文的经验,当我在2006年9月来到斯坦福时,我觉得自己已经为未来艰苦的博士研究做好了充足的准备。然而,那时我完全没有预见到的是,我的博士第一年即将成为我生命中到此为止最为打击信心、令人灰心丧气的一段时间。
%%% Year One: Downfall
\mychapter{第一年:碎梦大道}
2006年的夏天,在我开始在斯坦福攻读博士学位的几个月前,我考虑了一些我认为自己感兴趣研究的课题。大体而言,我想要创造一些创新性的工具,用来帮助人们在进行计算机编程时提高效率,换言之,\emph{提高程序员生产力}。我之所以对这个方向感兴趣,主要源于我在暑期实习中自己的编程经历:因为日复一日,公司分配给我的工作并不能让我提起太多兴趣,工作中的很多时间,我都坐在自己的格子间里反思,在我工作的这些公司中计算机编程的流程如何低效。那时我认为,如果能投身于旨在降低这种低效性的科学研究,应该是不错的方向。更宽泛地说,我的研究兴趣集中在能让所有类型的计算机使用者更加高效的工作中——而非仅仅聚焦在专业程序员的身上。举例来说,我希望能设计出新的工具,能帮助科学家分析和绘制数据、帮助系统管理员调整服务器配置、或者帮助计算机新手学习使用新的软件。
尽管我当时就有这些模糊、不成型的兴趣,但距离我将这些兴趣转化为真正可以发表的研究项目,并最终形成一篇\emph{博士论文},还有很多年的差距。对斯坦福计算机科学系的博士研究生而言,通常他们需要发表二到四篇第一作者的学术论文,并将这些论文合并成一篇博士论文——通常是一篇长度与书籍相仿的科技文档。当博士论文通过一个由三位教授组成的\emph{博士论文委员会}批准后,学生就可以毕业,从而获得博士学位了。在我所在的计算机系,通常一个博士研究生需要四到八年毕业,这个年限取决于他们发表文章的效率。
在2006年9月的新生信息会\footnote{信息会(Orientation),或译为迎新会,是在学校或大型组织中常见的,统一为新成员提供常用信息、帮助其尽快适应环境的活动,通常由资深成员主持。}上,系里的教授鼓励所有的博士新生尽快找到自己的\emph{导师},所以我和我的同学们一样,把一开始的几个月花在了找教授谈话上,希望尽快找到一个研究方向匹配的导师。对于一个学生的论文委员会来说,导师扮演了最重要的角色,因为他/她对学生能否毕业拥有最终的决定权。在我的研究领域,导师通常还负责通过自己的科研经费为学生提供经费支持,并且指导他们开展课题研究、写作论文。和几位教授谈话后,我发现Dawson\footnote{Dawson是这位教授的名字(first name),而非姓(last name),故翻译成Dawson 教授是不准确的——原文也没有出现Professor Dawson(Dawson 教授)这一称呼。单独使用名字在英语中非常普遍,通常用于熟人之间互相称呼、陌生人之间互相介绍、以及不希望提及全名的场合。文中出现的人名都是单独的名字。为了忠于原文的阅读体验,译者没有对这些名字进行标准化翻译和加工。—— 译者注}和我的研究兴趣和研究风格都似乎最为接近,所以我选择了他作为我的导师。
在我刚去斯坦福的时候,Dawson已经在斯坦福度过了八年,并且刚刚获得终身教授职位;通常,教授在他们工作的前七年如果发表了足够多高水平的研究论文,就可以得到\emph{终身职位}(终生的工作保障)。Dawson的主要研究兴趣是创造新的工具以自动在复杂、真实的软件中寻找\emph{bug}(软件代码中的缺陷)。在过去的十年间,Dawson 和他的学生编写了许多这样的工具,相比他们的竞争者而言,他们能找到程序中更多的bug。他们的研究成果十分有效——他们甚至成立了一个成功的创业公司,通过提供基于这类技术的缺陷检测服务而盈利。尽管我对Dawson的研究项目感兴趣,更吸引我的一点则是他的研究哲学和我自己的想法十分接近:他是充满激情的“务实派”——相比于单纯为了显得“学术”而去研究理论上“新颖”的课题,他更关注的是得到实实在在、有说服力的结果。
我和Dawson第一次面谈时,他似乎对我的大方向——让计算机的使用和计算机编程变得更高效——只是稍感兴趣。不过,有一点他说的很清楚:他非常希望招收一些新的研究生来帮助他完成一个叫\emph{Klee}的软件缺陷检查工具,因为这个项目是他现在的科研经费所支持的。(这个工具有好几个名字,但为了简便,这里就叫它“Klee”。)和其他的教授和高年级博士谈过之后我才意识到,对于新生而言,加入一个已有的、由研究基金支持的项目是一种常规现象,而并不是马上开始进行自己原创的研究项目。我说服了自己,认为自动查找软件缺陷也是一种间接提高程序员工作效率的研究,于是便打定主意,加入Klee项目组。
当2006年12月,我准备加入Klee项目组时,Dawson已经在指导五个学生参加这个项目了。项目组的带头人Cristi是第三年的博士生,而正是他和Dawson开发了最初版本的Klee。Dawson、Cristi和其他研究者不久前还发表了第一篇说明Klee系统的论文,并展示了Klee在发现一些新的缺陷上十分有效。那篇论文受到了学术界的好评,所以Dawson 希望保持这一势头,继续发表几篇跟进这一项目的文章。值得注意的是,从同一个研究项目中发表多篇论文是可能的(即“跟进论文”),只要这些新的论文有新的原创观点,相比前作的改进和创新,或者相比前作而言在结果上有很大的改善。当时,下一个相关领域的\emph{顶级会议}的论文提交截止日期是2007年3月,所以Klee 团队有四个月用于基于之前的论文做出创新性的改进,以期发表一篇新论文。
\breakline
在我继续讲述我的故事之前,我想简单地介绍一下学术论文是如何评审和发表的。在计算机科学领域,发表文章最受关注的场合是\emph{学术会议}。当然,值得指出的是,再很多其他学科中,\emph{学术期刊}才是最受关注的,而对这些领域而言,“学术会议”往往和计算机科学领域大相径庭。对计算机科学而言,学术会议的论文发表流程大概如下:
\begin{enumerate}
\item 每个会议发布一个征稿启事,其中说明了会议所要求的课题范围和一个论文提交的截止日期。
\item 研究者需要在指定的截止日期之前提交自己的论文。通常每个学术会议会收到100 到300份论文稿件,每篇论文大概包含30到40页双倍行距\footnote{双倍行距排版时,行间距与文字高度相同,通常用于学术期刊初稿的排版。而计算机科学的学术论文通常采用单倍行距、双栏排版。——译者注}的文字。
\item 学术会议的程序委员会(Program Comittee,简称PC)通常由大约20位专家研究者组成,他们负责将论文负责分类,以便审稿。每篇论文通常由三到五个人完成评审,参与评审的人员可能包括PC 的成员,或者由PC成员邀请的、来自学术界自愿参与审稿过程的审稿人。论文的评审过程通常需要大约三个月。
\item 当每位PC成员都完成审稿后,整个委员会将开会商议,通过审稿人的反馈决定接收一部分论文稿件,并拒收剩下的稿件。
\item 程序委员会会发出电子邮件通知所有的作者,告知他们论文是否被接收,并将审稿人对他们的论文提出的审稿评价附在电子邮件中。
\item 论文被接收的作者参加学术会议,并关于自己的论文做一个30分钟左右的演讲。学术会议结束后,所有的论文都将被收录在在线的数字图书馆中。\footnote{根据研究领域不同,学术会议的举办方式略有不同。在一些领域中,论文会被PC分为演讲展示(oral presentation)和海报展示(poster presentation)两种形式。演讲展示中,通常有5至30分钟供作者在报告厅等场合公开真实自己的研究成果;海报展示时,所有参与的作者则将自己的研究成果展示在一张海报上,并以海报为基础向观众展示自己的研究。通常演讲展示会有更多听众和更大的影响力,在有演讲展示和海报展示之分的学术会议中,PC也会把有限的演讲展示机会分配给他们认为更有影响力的学术研究项目。——译者注}
\end{enumerate}
通常,一个备受关注的\emph{顶级}学术会议的论文接收率在8\%到16\%之间,而\emph{第二级}的学术会议大概接收20\%到30\%的投稿。由于这些接收率相对较低,对于一篇学术论文来说,被拒收、修改并重新提交并不罕见——在论文最终被接收之前可能这一过程要重复多次,而这一过程可能会花费数年的时间。(在同一时间,一篇论文只能被提交到一个会议。)
\breakline
当Dawson说他想要提交一篇论文到2007年3月截止提交的顶级会议之后,他向我介绍了当时其他五个学生工作的方向,并让我选择自己感兴趣的工作。我选择了使用Klee 来寻找\emph{Linux驱动程序}中存在的新的程序缺陷。\emph{驱动程序}是指用于帮助操作系统完成其与外置设备(如鼠标或键盘)通信的软件代码。而\emph{Linux操作系统},和微软Windows系统或者苹果Mac OS系统类似,包含了成千上万这样的驱动程序,用以连接各种各样的外置设备。对于传统的调试方法而言,驱动程序中的软件缺陷十分难以找到,甚至有可能是危险的,因为驱动程序的缺陷可能会导致操作系统死机甚至崩溃。
Dawson认为Klee可以在Linux驱动程序的成千上万行代码中,找到其他自动缺陷分析软件(甚至人)从未找到过的软件缺陷。我记得我当时考虑过,尽管在Linux驱动程序中找到缺陷写在论文里看起来很不错,但我并不是很明白这样的工作能不能算是真正的研究贡献。按照我的理解,我要做的事情是用Klee去寻找程序缺陷—— 将一个已有的研究应用在实际问题上—— 而不是采用一种创新的方法来提高Klee的性能。此外,我并不明白,到三月份论文截稿时,我的工作和其他五个学生的工作如何能融合成一篇自洽的论文。尽管如此,我当时相信Dawson在头脑中有一个高瞻远瞩的思路完成这篇论文。介于我刚刚加入研究项目,我并不想马上开始对这些应该由教授决定的问题开始指手画脚。任务已经摆在眼前,我要考虑的只是尽我所能,完成这个任务。
\breakline
我博士生涯的前四个月被我用于配置Klee以用它来分析上千行的Linux设备驱动程序,以期从中发现新的程序缺陷——这一过程并不顺利。尽管看起来我的任务并不复杂,但我很快就被淹没在了一些细节问题中,而这些细节对于让Klee能够分析Linux 驱动程序又是必不可少的。我经常会花几个小时设置好Klee所需的复杂的实验环境,以分析某一个驱动程序的程序缺陷;但这种工作又往往以Klee因为其自身的程序缺陷而崩溃告终,让我的努力付诸东流。当我把这些Klee中存在的问题报告给Cristi时,他会竭尽全力解决,但由于Klee 本身极其复杂、环节众多,在其中找到并解决程序缺陷绝非易事。我并不是想要专门指责Klee:任何以科研为目的开发的原型软件都会或多或少有一些难以预见的缺陷。我的任务是用Klee去Linux驱动程序代码中寻找缺陷,但讽刺的是,我整个第一个月的工作都变成了在Klee里找缺陷。(Klee不能在自己的代码里自动找到缺陷,这实在是太遗憾了!)随着时间的流逝,我对于手头的工作越来越感到沮丧,我觉得自己被分配的任务就是单纯的苦力,毫无知识含量——我的时间都用在让Klee能正常运行上了。
这是我生命中第一次感受到被手头的工作所淹没的无望。以前,我的暑期实习都相对不难,而且就算一些学校的作业对我来说有些挑战,作业中也总有一个需要找到的正确答案等着我。如果我课上有没听懂的内容,助教或者高年级的学生总可以帮我答疑解惑。就算在本科进行学术研究的时候,我也总能请辅导我的博士学长帮忙,因为我当时处理的问题相对比较简单,而他通常知道问题的解决方法。对于本科的研究助理而言,对学术研究的投入以及期望也相对较低:科研只是我日常生活很小的一部分。如果我在某个科研问题上毫无头绪,我可以选择集中精力在课程作业上,或者干脆和朋友们出去玩。本科毕业也和学术研究毫无关联。然而,作为博士研究生,学术研究是我唯一的工作,除非我在学术研究上能有所成果,否则我将得不到博士学位。我难以把自己的情绪和每天的研究进展分离开来,而在那几个月中,我的研究进展出奇得缓慢。
我现在步入了一个完全陌生的领域,所以我很难再向本科时候那样向别人寻求帮助,因为问题的答案往往是不确定的。因为我是唯一试图将Klee应用于驱动程序代码的人,我的同事们并不能为我提供任何指导。Dawson偶尔会给我一些较高层面的策略性的建议,但就像所有已经获得终身职位的教授一样,他的角色并不是和他的学生们一起“在战壕里(第一线)参与战斗”。在做出研究成果的过程中,弄清楚所有复杂的细节是我们学生的任务—— 对我来说,这些细节就是如何找到别人从未发现过的、Linux 驱动程序中的软件缺陷。教授们都喜欢重复这句老生常谈:“如果有人曾经做过这样的工作的话,那就不能叫做学术研究啦!”这是我第一次亲身体会到了这句话的含义。
尽管我每天都觉得工作很无望,但我仍然不断安慰自己:\emph{我只是刚刚开始在这里工作,我应该保持耐心。}我不想在我的导师或者同事面前显得软弱无能,尤其因为我当时是Dawson组里最年轻的学生。所以,我在超过100天的时间里,每天修复Klee不断产生的新问题,不断遇到新的、更加棘手的问题,在我的“寻找Linux驱动程序缺陷之旅”中,拖着沉重的脚步前进。
当时,在我醒着的每时每刻,我不是在工作,就是在思考研究中的问题,抑或是在因为自己在研究中被艰深的技术问题所困扰而感到沮丧。与一般的朝九晚五的工作(比如我的暑期实习)所不同的是,以前每天晚上我可以把工作留在办公室,坐在电视前放松自己;而现在的学术研究在情绪上和心理上都是无休无止的。我晚上几乎没法让大脑停止思考问题,尽情放松休息——后来我发现几乎所有的博士研究生都有类似的困扰。有时,因为我的研究任务繁重得难以想象,我甚至会因为压力而失眠。想要在研究中休息一段时间也几乎不可能,因为在3月份的论文提交截止日期之前,还有很多工作需要完成。
在做这些苦力时,我曾经试图想出一些半自动的方法,可以让每天的研磨不那么辛苦。我和Dawson交流过一些初步的想法,但我们最终的结论是,如果我们想让Klee 能在Linux驱动程序里找到缺陷,这种耗时间的研磨是无法避免的。接下来,在论文提交前的几个月里,我只能继续辛苦工作。
理性而言,我十分理解在科学和工程领域中,通过实验式的研究方法获得研究成果,通常并不光鲜、甚至包含很多辛苦的工作。而博士研究生,尤其是第一、第二年的博士生,通常不得不在这一过程中参与最辛苦、最劳力的工作——这是他们的资金来源所决定的。通常,在一个研究组中,教授和高年级博士生制订高瞻远瞩的研究计划,并将任务布置给低年级的学生,由他们去研磨所有的细节,并让项目实际运转起来。第一、第二年的学生通常很难影响研究组项目的大方向。尽管我完全接受自己在这种“等级制度”下较低的地位,但感性上,我仍然深受打击,因为手头的工作实在是太他妈难了\footnote{原文此处为“so damn hard”,此处为保持原文语气,进行了直译。},而且毫无成就感可言。
\breakline
经过两个月的研磨之后,我收获了一些小小的成功。我成功地让Klee能在一些较小的驱动程序上良好工作,并开始找到了几个程序缺陷。为了确定这些缺陷是否真实存在(而非因为Klee的局限而导致的误报),我向开发这些驱动程序Linux的程序开发者发了几封电子邮件,说明了这些可能存在缺陷的地方。几位开发者回复了我邮件,确认了我的确是在他们的代码中找到了真正的缺陷。当我收到这些确认的邮件时十分激动,因为这是我第一次受到外界的认可,尽管它们只能算很小的鼓励。尽管我没有做出什么革新性的研究,我依然收获了一些成就感,因为这些缺陷在没有Klee的帮助下可能非常难以找到。
在这些小的驱动程序里的缺陷得到确认之后,我的士气有所恢复,所以我开始着手分析更大、更复杂的驱动程序。然而,接下来的几周中不断浮现的技术问题逐渐变得难以承受,并几乎把我推到了崩溃的边缘。这里简单总结一下我当时遇到的问题:Klee 实际上只能在不超过大概3000行,由C语言写成的代码中找到缺陷。最小的Linux驱动程序代码大概有100行,所以Klee分析它们游刃有余。而稍微大一些的驱动程序就有大约1000 行代码,而这些代码还与大约一万行到两万行的Linux操作系统代码密不可分。这就导致问题一下远远超过Klee 可以分析解决的范围,因为Klee 并不能把这
1000行代码和其他部分“斩断联系”而单独分析。我试过很多方法减少这些外部的连接(术语称为\emph{依赖}),但是这样做意味着对每一个驱动程序,我将需要花费几天的时间去完成十分复杂的工作,而最终这些工作也只对这一个驱动程序有效。
我和Dawson面谈了一次,向他说明了我面临的问题的复杂程度,也表达了自己对此的消极情绪。对我来说,在每一个新的驱动程序上都要花费几天的时间才能让Klee 可以运行,这简直是荒唐至极的工作。这种工作不仅让我疲惫不堪,它本身甚至不能算是学术研究!在我们的论文里,我应该怎么描述我的工作——我花了大概1000小时的苦工,就为了让Klee 能分析一堆驱动程序,除此之外我并没有其他可说的了?这根本不是学术贡献,反而听起来太愚蠢了。另一方面,我开始着急,因为距离论文提交截止只有五周了,而Dawson似乎还没有提过我们组的研究论文应该从什么思路着手写作。通常一篇优秀的学术论文需要至少四周时间才能完成,而且我们的情况可能更加复杂,因为我们有六个学生各自负责项目的一部分,我们需要把这些部分融合在一起。
我和Dawson面谈过后几天,他提出了一个改进的思路,让Klee能够克服我所面临的依赖问题。他提出的这个观点叫做\emph{约束下运行}(UnderCons-\\trained execution,简称UC),而这种方法也许能让Klee 将Linux驱动程序和外部的一两万行代码剥离开来,并单独在驱动程序代码中进行分析。他马上就开始和一个高年级的学生开始将UC技术融合在Klee 中;他们把改进后的版本称为\emph{Klee-UC}。尽管我当时筋疲力竭、接近崩溃,但我仍然非常欣慰看到自己的痛苦挣扎至少激发了Dawson的灵感,想到了这个有朝一日可能成为学术贡献的新思路。
接下来,Dawson和那名学生在Klee-UC上花了几周的时间。与此同时,他们让我继续用原来的方法,手工在Linux驱动程序中寻找缺陷。他们打算通过用Klee-UC试图找到我用普通Klee 找到的缺陷,来证明其有效性。他们想在论文里阐述的观点是,与其让一个博士生(就是我!)为了找到每个缺陷而在繁杂的工作上花费几天的时间,不如用Klee-UC来在几分钟之内找到这些缺陷,而且不需要准备任何特定的实验环境。
在近乎疯狂地又研磨了几周之后,我终于让原版的Klee成功分析了937个Linux驱动程序,并找到了55个新的软件缺陷(其中32个收到了开发者的确认)。接着,我还得把刚刚成型的Klee-UC配置好,并准备分析这937 个驱动程序。这比之前的配置还要麻烦,因为在我准备用Klee-UC分析驱动程序的同时,Dawson和那个学生仍然在(编程)实现它。谢天谢地,最终Klee-UC的确找到了我找到的缺陷中的大部分,这样我们做了一些学术贡献,也有成果可以在论文里展示了。
但是这里有个巨大的问题。等到我们得到那些不错的结果时,到论文截止日期已经只剩下\emph{三天}了,而我们都完全没有着手开始写论文。在这么短的时间里,撰写、编辑、完善一篇文章,使得它能被顶级计算机科学学术会议录用是完全不可能的。但我们还是努力这么做了。在提交截止前的72小时里,Dawson和我们五个学生(其中一位现在已经退学了)两个通宵住在办公室,以期完成实验和论文。我们所有学生心里都知道这篇论文不可能被接收,但我们还是在Dawson的带领下,顺从地向目标前进。
最终,我们提交了一篇令人尴尬的文章,里面充满了错误拼写、不通顺的句子片段、没有解释的图表,甚至连结论段都没有。整个是一团乱麻。在那一刻,我难以想象,如果我的研究工作一直是这样毫无章法,我到底要如何从博士项目中毕业。三个月后,不出所料,我们收到的审稿意见极其消极,甚至包括这样的严厉谴责:“程序委员会(PC)认为这篇论文简直太过草率,根本不可能被录用;请不要提交这种甚至无法审阅的论文。”
\breakline
这次惨痛经历之后,我申请了去谷歌实习,因为我急需换一换环境。那份实习和我的研究兴趣毫不相关,但我并不在意。当时我只想逃离斯坦福几个月。
这时是2007年4月份了,距离6月份我的实习开始,还有十周的时间。我不知道我能做些什么,但我想逃离我之前四个月折腾Klee和Linux驱动程序的经历,逃得越远越好。我根本不关心我们是不是会修改并且重新提交那篇论文(最后没有);我只想逃离那段梦魇。但因为我已经积累了近千小时的使用Klee的经验,而这也是Dawson 当时唯一关心的项目,我想这可能是一个开展新课题不错的切入点。于是,我找Dawson 谈了谈,和他交流了一些“不寻常”的使用Klee的方法,而不仅仅是局限于寻找软件缺陷。
然而我很快就意识到,我完全没必要把自己局限在Klee上,因为我的经费来自NDSEG 奖学金,而非Dawson的研究经费。而Dawson其他学生的境况则于我不同,他们除了继续在Klee 项目中工作之外别无选择,因为他们都是靠Klee的研究经费支持的。所以我决定仍然让Dawson 作为我的导师,但离开Klee项目组去从头开始开展我自己的研究项目。
为什么我不早点“单飞”呢?因为尽管我的奖学金理论上给予了我研究方向的自由,但我知道我仍然需要一位导师的支持才能最终毕业。当时,Dawson显然想让他所有的新生都把精力投入到Klee上,所以我就花了四个月的时间在Klee上研磨,塑造了一个“好士兵”的形象,而不是一开始就傲慢地要求做自己的项目。而且,就算我选择了别的导师,我一开始还是会需要花时间在他们的项目上,来证明自己的能力。这种“交学费”的工作根本无法避免。
接下来的十周里,我在一个完全真空的环境思考自己的研究思路,完全没有与人交流。因为我一开始对研究组留下了如此消极的印象,我现在只想自己一个人清静地思考。Dawson 对我的消失并没什么意见,因为他并没有在用自己的研究经费支持我。
我把自己完全与世隔绝,心理上基本处于崩溃状态,但我仍然试着每天能有所进步。我尝试着每天阅读几篇计算机科学的学术论文,并做好笔记,以帮助我激发自己的灵感。但因为没有良好的引导和研究背景,我最后浪费了很多时间,有时读完了论文却一无所获。我还曾经骑着自行车在校园里漫无目的地游荡,试图在过程中思考自己的研究思路但常常无功而返。最终,我把时间都浪费在了拖延上,可能甚于我这辈子至今为止的任何一段时光:我看了很多电视节目,睡了很多觉,花了无数个钟头在网上蹉跎。与我的朝九晚五的朋友们不同的是,我没有老板每天监督我的工作,所以我可以无拘无束,让我的大脑自由思考。
尽管我对研究方向的头脑风暴大部分都毫无目标,但我的想法逐渐地开始向一个问题聚拢:\emph{我们如何才能经验性地度量软件的质量呢?}这是在我开始读博之前,受到工程性实习中遇到的低质量的软件而启发,所想到过的一个感兴趣的研究方向。然而,在真空中空想研究思路的问题所在,是我当时没有足够所需的经验来把这些思路转化为现实的项目。因为我还没有准备好,显然这种完全的思想自由在当时更像是一种诅咒。
尽管我对创造新方法来度量软件质量非常感兴趣,我当时也明白这只能是一个模糊的梦,没有足够的形式化的研究方法支持,是不可能被学术界所接受的。如果我当时自己闭门造车研究这个项目,我的下场只能是成为一个胡说八道却又假装内行的人。我永远不可能有机会把这些想法发表在顶级、甚至次一级的学术会议中,而发表不了论文就意味着不能毕业。那时,我已经不再抱有虚无缥缈的梦想,想要成为一名终身教授了:我只想能找到个办法毕业。
在那整整十周的与世隔绝中,我几乎没跟任何人说话——甚至包括朋友和家人。找人抱怨也毫无意义,因为没人能明白我当时经历的一切。我的不读博的朋友们以为我就是“在学校上上课”。而少数几个我在系里新认识的朋友也和我一样,正在因为他们博士第一年里的挣扎感到抑郁——这些挣扎的主要部分,多半就是不得不直面充满挑战、不知从何入手的研究问题带来的震惊,以及无法影响实验室研究方向、只能随波逐流的无奈。我们这一群年轻的计算机科学家来到这里,自愿地投身于复杂而看起来毫无意义的工作中,所收获的却只是我们在公司工作的朋友们四分之一左右的工资。这种现实简直可悲到可笑的地步。但我觉得大家凑在一起互倒苦水也毫无裨益,所以我选择了闭嘴。我选择了不来计算机系的大楼里工作,因为我害怕碰到同事、同学们。我害怕他们会不可避免地问我我现在研究的课题是什么,而我并没有什么可说的东西。藏身于图书馆或者咖啡店让我感觉更为安逸。
反观当初,这么早脱离实验室单干是一个非常糟糕的选择。和想象中一位孤独的学者坐在路边,一边喝着拿铁咖啡一边在一张笔记纸上涂涂画画这种浪漫化的场景不同的是,真正的学术研究从来就不是在“真空”中完成的。为了创新,一个人需要有坚实的知识、历史、甚至物质基础(比如实验室设备)。在那几周中,我应该追寻的更明智的路线是找更多机会和Dawson谈话,并积极寻求和其他教授以及高年级学生的合作。但当时的我太过崩溃和沮丧,不满于“等级分明”的基于研究组的学术风格——把新来的博士研究生放在最繁杂枯燥的工作中——所以产生了逆反而选择了单飞。
\breakline
在我十周的与世隔绝接近尾声,即将去谷歌暑期实习之前,我给Dawson发了个电子邮件,简单说明了一下我最近读到的一篇让我思考了很多的科技博客。那篇博客让我想到了一个想法,那就是通过开发者在程序代码存在的整段时间里编辑代码的过程,来衡量一个软件项目的质量。令我惊喜的是,Dawson很快给我发了一个简短的回复,说他对这种衡量软件质量的技术也很感兴趣,尤其是如何用这种技术来帮助Klee这样的自动缺陷检测工具。
当知道Dawson对我感兴趣的领域也感兴趣之后,我再次燃起了希望,因为他也许能帮助我把这个想法变得更接近现实。我很快的为这个新想到的\emph{经验化软件质量度量}的项目记下了一些笔记,并打算从暑期实习回来后开始研究这个课题。这样,在四个月与Klee 的痛苦研磨,以及十周漫无目的的找寻方向之后,我博士生涯的第一年画上了一个还算乐观的休止符。
%%% Year Two: Inception
\mychapter{第二年:整装启程}
在谷歌的暑期实习对我而言,是一段脱离学术研究的轻松时光。我的工作压力并不大,所以我经常有机会和其他实习生一起闲聊、交朋友。临近夏天结束时,我已经从第一年的痛苦和折磨中痊愈,做好了重新开始博士生活的准备。
在夏季最后几天,我给Dawson写了一封电子邮件,重申了我对追求自己研究兴趣的渴望,但同时强调了从研究中发表论文对我而言的重要性:“我从这个暑期以及之前的暑期实习经验,发现自己很难集中精力完成一个博士科研项目,除非我对这个项目有强烈的归属感和科研的热情;所以我非常希望能在令我感到激动的研究方向,和学术界中的教授们广泛认为具有‘研究价值’的问题中,找到一个交集,并为之奋斗。”
我准备继续和Dawson一起在经验化软件质量度量的课题上做一番研究,因为我们已经在我第一年结束的时候讨论过这一问题。然而,我当时预感这个项目可能会风险较大,因为这不是Dawson主要的研究兴趣,也不是他主要的专业知识的所在;对他而言,Klee仍然是最高优先级的工作。于是,我想到自己可以去寻找另一个课题,通过同时在两个课题上做研究(并寄希望于至少一个能成功),来冲淡风险。我将在这章稍后介绍我和Dawson合作的主要研究项目,但我想先说说我的另一个项目。
\breakline
就在2007年9月,我准备开始我博士生涯的第二年之前,我去波士顿度假了一周,看望我大学时的朋友。因为我当时离得不远,所以我给几位我本科时就认识的MIT教授发了邮件,希望可以向他们寻求一些指导。他们和我见面的时候,大概都谈到了同样的事情:\emph{要主动去找教授谈话,尽量去找一个共同的兴趣点作为研究课题;不论如何,把自己关起来闭门造车是万万不可取的。}这句简单的建议在我博士接下来的五年里反复得到印证,也最终指引我顺利完成了博士学习。
还在波士顿时,我就马上将这个建议印在心里并付诸行动。我给MIT计算机系一位叫Rob 的教授发了一封\emph{冷邮件}(向从未通信过的人冒昧发送的邮件),并礼貌地请求和他面谈一次。在这封邮件中,我简单地说明了自己是MIT毕业不久的学生,现在在斯坦福攻读博士,并希望能开发出一些让计算机程序开发者能提高工作效率的工具。因为我知道Rob也对这一研究领域有兴趣,我希望他能回复我的邮件,而不是把它标记为垃圾邮件。Rob非常慷慨地在他的办公室和我面谈了一个小时,期间我向他介绍了几个研究项目的想法,希望能从他那里得到反馈。他似乎对这些想法很感兴趣,这让我信心倍增,因为我的想法或多或少得到了一位研究领域内的教授的认可。可惜,因为我不再是MIT的学生,我没有机会和Rob一起开展研究。在我们面谈的最后,Rob推荐我和斯坦福计算机系一位名叫Scott的教授谈一谈,看看我有没有机会成功向他推销这些观点。
回到斯坦福后,我给Scott发了一封冷邮件,请他给我一个机会面谈。去面谈时,我针对想和他沟通的三个具体的研究思路准备了一些笔记,大致格式如下:
\begin{enumerate}
\item 问题的定义是什么?
\item 我准备用什么方法解决?
\item 用什么样的实验,才能有说服力地证明我的方法具有良好的效果?
\end{enumerate}
Rob的一位博士学生,也是我的朋友,Greg,教会了我其中第三点——用实验指导思考——在提出研究项目思路中的重要性。教授们很乐意让自己的名字出现在发表的论文上,而计算机科学领域的学术论文通常需要强有力的实验支持才能有机会发表。因此,在提出项目的想法时就考虑到实验设计是十分重要的。
尽管我的介绍都没能赢得Scott的全力支持,但他仍然希望可以和我一起开展一个和我大致研究兴趣相关的研究课题。当时,他是一位刚刚来到斯坦福三年的助理教授(尚未获得终身职位),所以他非常希望能多多发表论文,早日拿到终身教职。因为我自己有奖学金,Scott并不需要用自己的经费支持我,所以对他来说也没有什么顾虑。
\breakline
Scott所精通的,是一个称为人机交互(Human-Computer Interaction,简称HCI)的、较为贴近实用的\emph{子领域}。和其它子领域不同的是,HCI的研究方法以人的需要为核心。一般来说,HCI的研究项目都是这样完成的:
\begin{enumerate}
\item 观察人,并弄清楚他们面临的真正问题是什么。
\item 设计一些创新性的工具,以帮助缓解这些问题带来的影响。
\item 用实验来评估这些工具,以检验它们是否真的可以帮助人们解决问题。
\end{enumerate}
因为我希望创造能提高程序开发者工作效率的工具,Scott就先建议我去开发者们真正的工作场所,观察他们的工作,并借此发现他们真正面临的问题。具体来说,Scott非常好奇为什么现代的软件开发者使用多种编程语言,并且严重依赖于在网上搜索、并剪贴代码片段来完成开发。之前几十年的高效开发工具的研究中,都假设了开发者只用一种语言进行开发,并且认为他们所处的环境中开发者的水平大致相同,而这些假设现在显然都早就过时了。通过观察现代程序开发者的日常活动,也许我就能设计出更贴合他们需求的新工具。
接到Scott给我的定下的大致目标之后,我就马上着手开始寻找可以让我观察的、专业的软件开发者。因为我刚刚在谷歌实习,我试过在那里找到目标,所以我发邮件给了我实习时的经理,他也同意将我的邮件转发给其他同事。我很快就收到了几封婉拒的邮件,因为没人想因为一个非雇员看着他们工作,而惹上知识产权的麻烦。接着我又给一些在斯坦福附近创业的朋友们发了邮件,但很快就发现他们和大公司的程序员一样,也收到种种限制。遗憾的是,他们更难以答应我的请求,因为为了避免竞争者抄袭,他们需要对自己的创业项目保密。而且,他们远比大公司的开发者们更加繁忙,所以也不太希望浪费自己的时间,去帮随便一个研究生完成这种对他们没什么帮助的科研项目。
我当时最后的希望是去谋智(Mozilla)观察软件开发者工作,因为谋智是一个非营利性的软件开发组织,他们的产品包括著名的火狐(Firefox)浏览器。因为谋智的软件项目都是开放源代码\footnote{开放源代码(Open Source),简称“开源”,是一种在自由软件开发者中非常流行的形式。开发者自愿将自己软件的源代码向其他开发者公开,而在一定的通用协议下(通常被称为“证书”),其他开发者可以基于这些软件代码进行改动和再次开发。开放源代码有助于鼓励开发者分享自己的成果,避免重复劳动。当然,尽管软件源代码是开放、可供人任意下载的,有些开源软件也是可以盈利的。——译者注}的,所以我以为他们应该不怕会有一个局外人来观察他们的程序员工作。我没有试着发冷邮件(其实我都不知道应该要给谁发!),我决定直接开车去谋智的总部,直接登门造访。我冒然和我看到的第一个人打了招呼,并向他介绍了自己。他很热心地告诉了我两位谋智高层领导的电子邮箱,并说明这两位可能会对这样的研究合作感兴趣。我当天就给两个人发了冷邮件,令我感到惊喜的是,其中一位回复称对我的研究很感兴趣。不幸的是,那也是我收到的来自他的最后一封邮件;当我请求继续开展研究时,他就再也没有回复我了。
现在反观当时,对于自己试图在工作场所观察别人工作的尝试以失败告终,我并不感到奇怪。毕竟,我并不能为那些被我观察的专业程序员带来任何好处;相反,我只会干扰他们的日常工作。幸运的是,几年后,我有机会观察了一组(非专业)程序员—— 为科学研究而编写程序的研究生们——的工作,他们并不排斥我可能带来的小小打扰,反而非常乐于和我交流他们工作环境中的问题。这些访谈的经历,最终激发了我的灵感,并直接为我的毕业论文做出了很大贡献。
\breakline
在寻找专业程序员的路线上碰了南墙,我就决定回头,开始在斯坦福内部寻找这样的机会了。当我看到一张海报,宣传系里即将举办一年一度的编程竞赛时,我马上给主办者发了一封冷邮件。我向他说明了自己想要观察学生们比赛过程的想法,他欣然接受了。
尽管学生的编程竞赛对说明现实中的软件开发环境而言毫无代表性,但总是聊胜于无。Scott的一个比我高一年的博士学生,Joel,也希望来参加这种观察。Joel和我把整个周六上午四个小时都花费在了观察几个学生参加比赛这件事情上。我们看到的结果很无聊,最终也没能从我们的笔记中整理出太多有用的东西。然而,这个经历促使我们产生了一个想法,那就是进行条件更加可控的\emph{实验室研究}。
这时,Scott已经决定让Joel和我合作进行研究,一起开展一个实验室研究,而不是分散精力在不同的项目上。因为Joel和我的研究兴趣相似,Scott也可以通过让我们合作,减轻自己管理学生的压力。Joel主要负责了实验室研究的设计,我也同时乐得清闲,因为我同时还在和Dawson做另一个课题的研究。
Joel、Scott和我设计了一个时长两个半小时的实验室研究,研究中,一名斯坦福的学生将会被要求从头开始,编程完成一个简单的网络聊天应用。他们可以使用任何他们想用的资源,最主要的就包括在网上搜索现成的代码,或者已有的教程。我们找到了20名学生参加实验,其中大部分来自Scott当时在讲授的\emph{人机交互导论}课程的学生中。
在接下来的几周里,Joel和我在系里地下室的机房坐了50个小时(20个学生,每人两个半小时),观察参与研究的学生,并同时将学生使用的电脑屏幕录制下来。一开始,观察学生如何工作非常引人入胜,但好景不长,我们很快就发现这个工作变得冗长繁杂,而且总能看到学生们一遍又一遍地做同样的操作、犯同样的错误。之后,我们又大概花了50个小时重放我们录下的视频,并在视频中标记了一些关键事件发生的时间。最终,我们分析自己的笔记,并回放标记好的关键事件,得到了一些关于“当这些学生面对一个简单、但实际工作中可能遇到的任务时,会遇到哪些问题”的深入了解。
我们把实验室研究的成果写成了论文,并将论文提交到了一个顶级的HCI学术会议。三个月后,我们发现论文被录用了,审稿意见非常令人振奋,而论文甚至还被提名了\emph{最佳论文奖}。在这篇论文里,Joel 是\emph{第一作者},而我是第二作者。几乎所有计算机科学领域的论文都是由多位作者合作完成的,而作者的顺序也是至关重要的。名字出现在首位的作者通常是研究项目的负责人(比如Joel),他通常在项目中完成的部分远多于其他位置靠后的作者,所以也最应当受到承认。其他的作者通常都是项目中的助理—— 通常是年轻的学生(比如我)或者远程的合作者——这些人也做出了足够多的贡献,可以被列为作者之一。博士生们通常把自己的导师(比如Scott)列在最后,因为导师通常会在研究想法形成、项目规划和论文写作方面提供帮助。
因为我不是论文的第一作者,这篇论文也就对我的毕业论文没有什么帮助;然而,这个经历教会了我许多关于如何开展研究、以及如何写作学术论文的知识。更重要的是,看到这个研究项目最终发表了一篇顶级会议的论文,我感到很有成就感——这和我博士第一年被拒收的Klee的论文形成了鲜明的对比。
Joel后来继续沿着这条研究路线走了下去,把我们的论文转化成了他博士论文的第一部分。在接下来的几年中,针对在一开始的实验室研究中发现的程序开发者们面临的困难,他又创造了几个能帮助克服这些困难的工具,并发表了论文描述这些工具的原理。同时,Scott也没有积极招我入麾下,我也就没有考虑过更换导师的事。当时看来,似乎我和Joel的兴趣太过接近了,而且Joel已经在他的子领域小有成就了。所以,我继续将研究重点放在和Dawson 一起研究的课题上,毕竟他仍然是我的导师。然而在这一边,研究进展就没这么顺利了。
\breakline
读者可以回忆一下,在我博士第一年接近尾声时,我开始在一个被称为\emph{经验化软件质量衡量}的子领域寻找研究灵感——具体来说,就是通过软件开发的历史记录,来衡量软件的质量。正好Dawson也对这一课题感兴趣,所以在我博士第二年里,我们就继续在这一问题上开展研究。他的主要兴趣还是在于发明像Klee这样的自动缺陷检测工具,但他也在软件质量方面有一些兴趣。对他而言,让他感兴趣的研究课题包括:
\begin{itemize}
\item 如果给定一个大型软件项目,其中包含上千万行代码,如何区分哪些部分对项目而言更加重要,而哪些部分不那么重要?
\item 有哪些因素影响了一些部分更容易出现软件缺陷?比如,是最近刚刚被新手修改过的程序代码更容易包含更多缺陷呢,还是短时间内被很多人修改过的程序更容易出问题?
\item 如果一个自动查找缺陷的工具找到了1000个可能的问题,哪些会是其中更重要的呢?程序开发者可能并没有时间和经历处理全部1000个缺陷,所以他们必须根据一个重要度的评估,来优先完成重要的部分。
\end{itemize}
我通过分析和Linux系统核心这个软件项目相关的数据集,开始调查这些问题。我选择了Linux作为研究对象,因为它是当时最大且影响最广泛的开源软件项目,有数以万计的程序开发者在二十年间贡献了几千万行的程序代码。Linux完整的\emph{版本控制历史}能在网上免费得到,所以这成为了我主要的数据来源。项目的版本控制历史记录了在项目的整个生存周期中,所有代码文件中出现过的所有改动,包括改动出现的时间,更重要的是,改动是谁做出的。为了将这些项目历史和软件缺陷对应起来,我从Dawson的软件缺陷检测公司拿到了一份数据集,其中包含了公司的一个产品在Linux中发现的2000个缺陷。当然,这不会是Linux里所有的缺陷,但这是我能接触到的数据集中,唯一能为我提供了足够的信息,来研究我们的学术问题的了。
那时,我每天的工作流程就是写程序来从Linux的版本控制历史以及那2000个缺陷报告中提取、和清洗数据\footnote{数据清洗(Data cleansing)在科研项目中通常被广泛应用,尤其是当数据来自实际的项目,或数据产生、采集的过程没有严格监控时。数据清洗通常包括丢弃数据中对研究没有帮助的部分,或者丢弃因格式、内容、完整性等问题不能被用于研究的“脏数据”。此处作者应该指前者,即将和研究相关的数据分离出来的过程。——译者注},并将它们转化成便于分析的格式,并进行分析。为了能对这些数据有更深层次的认识,我自学了量化数据分析、统计学和一些数据可视化的技巧。在研究过程中,我细致地将自己的实验进展记录在了一本\emph{研究笔记}中,用来记录哪些尝试并没有给我想要的结果。大概每周,我都会和Dawson面谈一次,汇报自己的研究进展。我们的会面通常是我想他展示我从分析中得到的图表或者表格,而他则会提供一些较高层次的评价,比如:“嘿,这张图的这个部分看起来不太对劲。这是为什么呢?试试这样分割你的数据,并做一些更深入的分析。”很多年后,我意识到这其实是一种对于很多学术领域中的\emph{计算研究者们}而言,再平常不过的工作流程;而在我的博士论文中,我也创造了一些工具,来消除这一过程中的一些效率不高的环节。不过那时我还没有这么长远的计划;我所想的只是做出一些有趣的发现,并把他们写成论文发表。
\breakline
Dawson和我在将我们的成果发表的道路上并非一帆风顺。在那一年里,我们提交了两篇论文,最后都以被拒收场。这个研究项目后来又经过了一年,才转化成为一篇长度较短的、第二级学术会议中的论文得以发表,论文影响力微乎其微,也没有“作数”成为我博士论文的一部分。不过到那时,我已经不太计较这些了,因为我已经在开展其他研究项目了。
我们的论文在发表上遇到了这么多障碍,究其原因是因为我们不是经验化软件质量衡量(有时也被称为\emph{经验化软件工程})这一子领域的“圈内人”,而我们的论文恰恰属于这一子领域。在我们步入这个方向之前,已经有几十所大学的研究小组在进行类似的研究了。Dawson和我在这种竞争中完全处于劣势,因为我们的竞争对手包括很多专于此道的教授和科学家,而他们手下通常有很多博士生为他们产生研究成果。这些人对发表论文如饥似渴,因为他们中很多人仍然是年轻的教授,渴望借此得到终身职位。他们也更擅长于一些能让论文更容易被接收发表的技巧,包括统计方法、相关文献的引用,以及“营销技巧”等。最重要的是,他们中很多人在相关的学术会议中担当了外部审稿人或者程序委员会成员等职务,所以他们很清楚如果一篇论文想要被这个领域的学术会议所接收发表,应该需要怎么撰写。
读者可以回忆一下,我介绍过每篇论文都会由三到五位自愿参与的领域内专家——通常都是领域内的教授或者科研工作者——进行\emph{同行评审}\footnote{同行评审(Peer-review)是一种广泛用于计算机科学学术会议的评审模式,其中参与审稿的审稿人可能是领域内的教授、专家、研究者或在读博士生(本科生和硕士生较为罕见),这些人可能也是学术会议中的投稿人(审稿人不能审阅和自己有利益相关性的——比如自己撰写的—— 稿件)。“同行(Peer)”一词即用于强调这种审稿人和投稿人之间的平等性。与此不同的是,很多学术期刊采用专业审稿人审稿的制度,审稿人往往是领域内名至实归的教授或者科研工作者,一般认为他们在领域内的经验、学识等比一般投稿作者都略高一筹。——译者注}来决定是否可以发表。如果审稿人认为文章值得发表,文章就会被接收并发表;否则,作者就需要修改论文,之后再重新投稿。同行评审的目的在于保证所有被发表的论文都有一定的质量保障,这一保障的水平则由学术圈来决定。这种检阅的机制是必要的,因为总要有一些公认的标准,来过滤掉一些不靠谱的言论。然而,同行评审这种制度本身存在其缺陷,尽管它努力使得评审结果更加客观,审稿人也仍然是人,还是不可避免地有自己的品味和偏见。
因为学术会议通常只接受不超过百分之二十的论文,如果一篇论文给审稿人以不好的第一印象,可能就会被拒收。Dawson和我都不是经验化软件度量领域的专家,所以我们并不能以一种审稿人所期待的方式,去“推销”自己的论文。所以,我们经常因为一些负面的评审意见受到打击,比如:“结果,我发现我就是对作者展示的结果不太信任。我的疑惑来自于两个方面:一方面我不相信他们对度量方法的认知是否合理;另一方面他们也没有使用一些有效的统计方法验证自己的成果。”在发表学术论文这个残酷的世界中,仅仅对一个课题感兴趣远远不足以让自己的论文得以成功发表;想要自己的论文可以发表,就得非常清楚作为论文审稿人的、自己领域中年长的同事们的偏好。简而言之,我们的数据集没有别人的好,技巧没有别人的细致,我们的成果和展示方式也和这一领域中有经验的研究者所期待的形式似乎格格不入。
相比而言,我和Scott、Joel发表的论文就更加成功,因为Scott是HCI领域的专家,并且在这一领域(尤其是我们发表文章的学术会议中)已经发表和评审了很多论文。当然,作为内行人并不能让审稿人在评审我们的论文时,对标准有任何的放松,因为那就太不公平了。但是,Scott仍然可以利用自己的经验,让我们的项目从动机到成果,都以一种审稿人所期待的形式展现出来,从而论文被接受的概率也大大上升。
\breakline
在我博士第二年接近尾声时(2008年6月),我因为仍然缺乏有说服力的成果,又看到在经验化软件度量领域的论文如雨后春笋般地冒出来,开始变得越来越沮丧。我仍然没能将自己的发现发表成论文,也意识到自己和圈内的老手根本没法竞争:因为Dawson和我都不知道审稿人期待看到的是什么,我开始明白继续在这个领域试图发表论文,只能是一路逆水行舟。又因为发表论文是毕业的先决条件,我必须尽快找到一个新的项目,否则我就不能拿到自己的博士学位了。在我准备在斯坦福开始自己博士生涯的第三年时,我非常绝望,以致不愿放过任何一棵能为我带来论文发表的救命稻草。也就是那时,我选择了回到博士第一年曾经让我痛苦不堪的项目——Klee——当中去。
%%% Year Three: Relapse
\mychapter{第三年:噩梦未止}
在2008年中,我的博士第三年拉开帷幕时,我作为项目组最年轻的学生,重新回到了Klee 项目中。当时,项目里只剩下两个人了——两位Klee的创造者,Dawson和Cristi (Cristi 这是已经是他最高年级的博士生了)。Klee项目组的其他成员都已经离开了这个项目。
对于回到项目中来,我的心情很复杂。一方面,我第一年不堪回首的经历让我对项目本身和项目组的工作状态都感到抵触。另一方面,Cristi和Dawson都对这个项目充满激情,他们也都希望发表更多的跟进论文。因为他们在软件缺陷检测这一领域已经身经百战,我觉得和他们合作似乎更有机会能够发表论文。我的另一个选择,则是继续在我第二年开展的经验化软件度量项目上进行研究。虽然我仍然对那个项目很感兴趣,我清楚地知道对于我和Dawson两个外行人来说,在那一领域发表论文并非易事。因为我的目标是发表论文,取得博士学位,我决定收起自己的自尊和自大,并重新投身于Klee项目中。我给Dawson发了一封邮件,说到:“我大体的计划就是与你和Cristi合作,尽量用Klee做出一些脚踏实地的研究,争取内能投稿几篇论文。我认为对我来说,为学术做出贡献以及每天做出一点令人满意的成果的最佳选择,就是尽可能利用Klee,并和你们的研究兴趣以及目标保持一致。”
\breakline
Cristi和Dawson希望我能实验一种被称为\emph{交叉检测}的、运行Klee的新方法,这种方法能让Klee找到同一个软件的不同版本之间的差异。在接下来的四个月中(2008年7月到10 月),我每天的研磨和我第一年用Klee寻找Linux驱动程序缺陷的任务别无二致,只不过我现在学会了更好地劳逸结合,让自己不至于过度劳累。但就像我第一年的情况一样,我在用Klee做很多繁重的苦工,而实质上并没有用什么方法改进Klee,以让它能找到新的软件缺陷。我每天的工作就是配置好一系列Klee的运行环境,用10个小时运行Klee让它完成对软件的一系列检测,第二天早上再来收集、分析、可视化、并弄明白结果的含义,对Klee 的设置进行适当的调整,然后再开始新的一轮10小时的实验。
就像很多复杂的软件工具一样,Klee有很多可以设置的选项。而因为它是一个由很多学生合作完成的用于学术研究的原型系统,它的选项中有很多都没有清晰的文档说明其功能。这就导致我因为误解了一些选项间复杂的相互作用,进而浪费了很多时间在调整这些选项上面。当时我的研究笔记上随处可见这样的脏话:“妈的,我觉得我的问题是没发现Klee 需要某些调用参数(比如-emit-all-errors),而目标程序也需要一些参数(比如-sym-args),如果把这些搞混了,你也不知道会发生什么,因为Klee在运行目标程序时采用的参数列表和你想象的不一样!”
在那几个月间,Cristi和Dawson时不时地提起他们想提交一篇关于Klee交叉检测的论文,所以我对于这个看似具体的目标充满动力。在我工作的同时,我完成了一篇论文的初稿,并在里面填上了我的实验结果和一些笔记。然而,令我惊讶的是,Christi 和Dawson似乎都不急于完善这篇论文并让它得以发表。我当时还做不到在没有他们帮助的情况下,在这一领域发表一篇像样的论文,因为我还只是一个帮忙完成苦工的研究助理:真正的研究意义以及有说服力的“营销”仍然离不开他们。后来,我们完全没有提交论文,所以我四个月的工作再一次付诸东流,就像我第一年在Klee上的研磨一样。
因为我自己对领域内的技术不够精通,加之缺乏年长的同事的指导,这个项目很快就流产了。尽管Cristi 在指导我交叉检测的思路、以及调试Klee的各种奇怪问题时十分耐心,但可以看出他的精力并没有完全投入在这个项目上。因为当时他已经即将完成博士学习了,他的主要精力都用在了申请助理教授职位上。教学职位的申请通常需要花费几个月的时间,投入十足的精力准备,而尽管这样也仍然有很多申请者无法获得职位。每年,每所大学的院系至多会招收一到两名新的终身制导向\footnote{终身制导向教授(Tenure-track professor)职位是区别于研究导向教授(Research professor)职位的一种称呼,后者和学校的工作合同通常是任意性(at-will)的,相应也不需完成教学的任务。只有终身制导向的助理教授才有机会获得终身职位。—— 译者注}的新教授,而上百位能力超群的高年级博士生、博士后(博士毕业后暂时留在实验室进行研究的学者)、以及从事研究的学者会竞争这些令人垂涎的空缺。申请学术职位是一种充满压力、耗尽一个人所有时间和精力的过程。所以,Cristi并没有动力花几百个小时的时间再去投稿一篇论文,因为就算论文被接收了,对于他的职位申请而言也已经太晚了。
事后回想,我能明白这个项目因为参与者动机不同注定失败,而当时的我却缺乏预知这种失败的智慧。我当时只是单纯地想要和年长的博士生以及富有经验的教授一起在他们熟知的领域发表论文,才回到了Klee 项目中和Cristi、Dawson一起合作。我之所以这么打算,是因为同样的策略在前一年收效显著,我帮助Joel(年长的博士生)和Scott(富有经验的教授)完成了他们的HCI项目,而那个项目最终让我们发表了一篇在一流学术会议中被提名最佳论文奖的论文。
这边的状况又有什么不同呢?简而言之,Cristi和Dawson都没有发表论文的渴望。此前,他们已经一起发表了很多篇Klee相关的论文,而和我一起完成一篇交叉检测的论文,对他们而言是“锦上添花”,但绝非雪中送炭。Cristi已经是博士最后一年了,所以并不需要再发表任何新论文就可以毕业了;Dawson已经获得了全职职位,所以他也不急于发表论文。相比而言,Joel当时正处于博士生涯的中段,急需发表用于博士论文的\emph{第一篇}论文;而Scott还是助理教授,他需要发表足够多的论文才能获得终身职位。这两次结果完全不同的经历让我明白了,在和可能的合作者合作研究之前,深入了解他们对项目的动力和动机的重要性。
\breakline
因为Cristi在忙于申请教职,交叉检测的项目完全没有进展,我决定自己起头,试图完成一个和Klee相关的项目,而不再继续作为交叉检测的实验助手。和Dawson讨论之后,他建议我试着改进一下Klee的核心组件—— 它的\emph{搜索算法}。Klee通过在软件的可执行代码中像搜索“迷宫”一样查找软件缺陷,所以改进搜索算法可能能让Klee 找到更多的缺陷。
这是第一次,我开始在Klee上进行创新——改进其搜索算法——而不是为了用Klee找到软件里的缺陷而做苦工。对于衡量我的工作的有效性而言,一种办法是测试Klee在一系列测试软件程序中的\emph{覆盖率}(即测试Klee的搜索算法能覆盖代码迷宫中多大的部分)。Dawson的目标很简单:取得一个比最近一篇Klee论文中报告的结果更高的覆盖率。当时,在89个测试程序上,Klee已经能达到91\%的覆盖率了(完美覆盖是100\%),而我的任务就是尽可能提升这一比率。每天,我都会尝试修改一下搜索算法,然后在89 个测试程序上运行一遍(大概需要十小时的时间),然后第二天早上再查看覆盖率的数据,然后再改动程序、运行测试,如此往复。
这时已经是我博士第三年的一半了,我和很多同期的同学一样,都陷入了一种“炼狱”般的状态,我们都不太会每天到办公室工作了。我们还因为自己所研磨的问题非常抽象和过分专业而饱受孤独的折磨,因为我们研究的问题可能除了我们之外很少有人理解或者感兴趣。我们的导师和高年级同事会给出一些较高层面的建议,但他们几乎从不坐下来和我们一起仔细研究项目中每一个恼人的细节。
和我们在公司上班的朝九晚五的同学们不同的是,我们没有马上做出任何实物的压力—— 我们没有项目截止日期的催促,也没有中层管理人员需要取悦。对于系里大部分学生而言,他们偶尔休息一天其实并没有人会在意,所以以此类推,为什么不干脆休息两天、休息一周,甚至休息一个月呢?所以,博士生在第三年左右退出博士项目并不是什么应该令人惊讶的事情。
为了防止拖延症,我不知疲倦地工作,逼自己保持自律,并保持工作日规律地工作。我试着对自己进行“微观管理”,每天给自己制定较小、容易完成的目标来激励自己,期望着最终能收获一个积极的结果。但结果是,因为很难看到自己每天的进展,我很难保持自己在工作中充满动力。
只有自律是不够的——在三个月的对Klee搜索算法的调试之后,我仍然没有得到任何令人振奋的结果。因为Klee在我们的测试程序上已经达到了91\%的覆盖率,把这个数字仅仅提高几个百分点,比如到94\%,都极其困难。雪上加霜的是,这些微乎其微的进展写在论文里也不会引人注目。我们的论文主旨用一句话来说将是:“我们以某种方式改进了Klee的搜索算法,使得它的平均覆盖率从91\%提升到了94\%。”这种成果在审稿人眼中很难谈得上令人激动,甚至可能连有趣都谈不上;这只是一种常见的、无趣的在已有的项目上进行的增量式的工作。不出意外,Dawson也并没有兴趣投稿这样的一篇无趣的论文。
如果我当时能用一种更有趣且有效的方法改进Klee的搜索算法,可能Dawson会更感兴趣投稿这样一篇论文。然而在2009年1月,我经过三个月的研磨徒劳无果后,我开始觉得自己日复一日的缓慢努力永远不可能达到一个符合Dawson期待的突破性进展。我不喜欢被称作一个经常放弃的人,但我意识到Klee搜索算法这个项目只有死路一条,所以我还是放弃了。
现在回想当初,我在一个悲剧性的事实中找到了对当时选择的宽慰:在我离开Klee 搜索算法的项目之后,Dawson的博士生中有两个人先后对这个问题展开了研究,结果两个人都没能在过去的\emph{三年}中就这一问题发表任何论文。我并不觉得自己能比那两个学生做的更好,所以如果我继续在那个课题上努力,可能我也会像这样卡在一个长达三年的炼狱之中。
\breakline
尽管在Klee项目上屡战屡败,我还是想要在它上面做出一点成果,毕竟这是Dawson 当时唯一关心的项目。我开始讨厌Klee了,但因为我已经在这个项目上消耗了上千小时的时间,我希望能最终收获一些实质的成果来证明自己的努力没有付诸东流。这时已经是我博士第三年的一半,我非常急于发表一篇第一作者的论文作为我博士论文的一部分;我开始感到自己有些落后于身边的同学们,因为他们中有些人已经发表了自己第一篇可以贡献于博士论文的学术论文。我天真地以为Klee是我通往博士学位道路上“阻力最小的方向”,因为它和我导师的研究兴趣比较贴合。
这时,一个名叫Peter的第一年的博士生加入了Dawson的实验室,并且在寻找研究项目。我和Dawson商量了一下和Peter合作的事情,考虑是两个人一起工作可能能比我一个人更容易做出较好的成果。Dawson对此表示赞同,并建议Peter和我一起在Klee 中重新实现\emph{约束下运行}的功能(简称“Klee-UC”)。读者可能还记得,在我博士第一年时,Dawson和他的另一位博士生一起实现了第一个版本的Klee-UC。他们做出了一份粗略的初稿,投稿了一篇在三天之内粗制滥造出来的论文(我仍然清晰地记得当时的惨痛教训),而在那个学生从博士项目中退学之后不久,项目也就停滞了。所以,两年之后的现在,轮到Peter和我来重新实现这个想法,并尽量让它能够做出足够好的成果发表一篇论文了。
我带着我能鼓起的所有勇气和乐观精神接受了这个新任务,并努力忘掉我和Klee并不愉快的过去。我对自己说,如果我能发表Klee相关的论文,那一定就是这个Klee-UC 的项目没错了。我全心全意地相信Dawson 的Klee-UC创意在学术研究的角度看来是新颖有趣的,所以如果Peter和我能够足够努力实现它,并用它找到一些更加重要的软件缺陷,我们就能发表一篇很好的论文。而且,我还可以重复利用我之前在Linux驱动程序的实验中大部分的程序和设置。然后,我还幻想着一篇关于Klee-UC的很好的论文可以一扫之前我在Klee 上几千小时苦工的阴霾,让我扬眉吐气。毕竟,还是我博士第一年用Klee查找Linux驱动程序缺陷时的经历,让Dawson想到了Klee-UC这个点子。这样的话,如果我能以第一作者身份完成这篇论文,把想法变成现实,也算是一个合情合理的交代(在我所在的领域,尽管有时候研究想法是教授产生的,他们也会让自己的学生作为论文的第一作者)。我甚至期待这个项目会成为我博士论文的第一部分,并从此为我最终博士毕业扫清障碍。
在接下来的两个月之间(2009年2月到3月),Peter和我全心全意地投入到了变成实现Klee-UC之中。我们每天一起在办公室编程,过程十分有趣;这对于很多博士生所过的孤独的生活而言是一个很好的调剂。然而不久之后,Dawson似乎就开始对我们缓慢的进展感到不满。Peter和我都认为我们的进展还算不错,但是Dawson 似乎对我们的工作很不满意,所以他很快就打消了写一篇论文赶在下一个截止日期之前提交的打算。
当时,我完全不理解Dawson为什么对我们如此缺乏耐心,但现在我能完全理解他当初的感受了。他当时心中有一个十分清晰的Klee-UC的想法,并且希望几个有天分、并且勤奋努力的研究生能把他的想法变成现实。如果Dawson仍然是一个博士生,他肯定用不了几个月就能让Klee-UC正常工作,然后自己单打独斗就能写出一篇顶级论文。当他还是个学生的时候,他的发表文章的记录就已经非常惊人了,也正是因此,他才能得到像斯坦福这样的顶尖大学的教授职位。然而,现在他需要完成一些教授需要完成的任务,比如教学、论文/程序委员会工作、论文审稿等等,所以他不能再像之前一样投入上千小时,专注于把一个想法变成一篇可以发表的论文了。就像所有劳力密集型的研究领域的教授一样,Dawson需要一些学生的帮助才能把他的想法变成现实。
我认为Dawson期望Peter和我能比实际进展更快得到能用于论文发表的成果,所以对于他来说,我们似乎对于给我们的任务不是能力不足,就是不够用心。作为一个顶尖大学的教授而言,Dawson所有的学生恐怕都不如博士时代的他自己有能力,这着实是一个不幸的事实。而这一事实的原因很简单:在顶尖大学的博士毕业生中,大概75个学生中只有一个能有幸在斯坦福这样的大学任教(而对于普通大学的博士毕业生中这个数字可能是200比1)。所以其实并不出乎意料的是,Peter和我都不是这样出类拔萃的人才。如果Dawson 能和他自己的年轻版的克隆人一起研究,估计研究进展会快很多!
尽管Peter和我在那两个月中在这个项目中投入了很多精力,但我们能清楚地意识到Dawson 对我们并不满意。Peter对此感到很失望,于是他之后更换了导师,并最终从博士项目中退学了。我的合作者离开之后,我对Klee的最后一丝幻想也随之破灭,所以我也很快离开了Klee项目,而且再也没回来过。
\breakline
Peter和我离开Klee项目的两年之后,Dawson终于找到了一个博士生,可以帮助他把他Klee-UC的想法最终变成现实。2011年,Dawson和这位新学生发表了一篇非常优秀的论文,其中包含了Klee-UC和交叉检测的思想。最终,通过四个博士生长达五年的努力,Dawson的Klee-UC的想法终于变成了一个可以发表论文的研究项目。在这四个学生中,只有一个“幸存”了下来——我离开了Klee项目组,另外两个博士生则直接退学了。从每个学生的角度看来,成功的概率实在是过分渺茫了。
然而,从一个教授的角度来说,Klee-UC是一个令人激动的成功!因为Dawson已经获得了终身职位,所以他的工作并没有什么风险。事实上,终身教授制的主要意义之一就在于,获得终身教职之后,教授们就可以有机会尝试更加大胆的项目思路。不过,这个制度的阴暗面就是,往往教授们会让学生去风险较大的项目上研磨,而这些项目的成功率往往并不高。学生也并不能拒绝教授的要求,因为他们都是由导师的科研经费支持的。幸运的是,我有外源奖学金的赞助,所以对我来说离开Klee项目要容易很多。
我并无意专门把Dawson和Klee拿出来,作为批评的典型。在\emph{大多数}劳力密集型的科学与工程学的研究领域中,这种在终身教授和博士生之间学术动机的鸿沟都是普遍存在的。通常的情况都是,首先,教授获得一些研究经费,并产生一系列高瞻远瞩的研究思路(比如Klee-UC或者交叉检测)。然后,教授用研究经费将一些学生招入麾下,指导他们实现自己的研究思路,通常(但并不一定)作为这些学生的毕业论文的主要工作。离开了这些上千小时的学生的工作时间,这些研究思路永远不可能转化为现实的成果,更遑论发表论文了。
有时,教授们可能需要经历好几届的学生在项目上的失败甚至退学,直到某一届学生最终将项目引向成功。这一过程有时需要两年,有时需要五年,有时甚至需要十年的时间。很多项目常常持续的时间都超过了博士生的“生命周期”。但只要最终这些项目的想法得到实现并形成论文得以发表,项目就算是成功了。教授对此感到很满意,院系也感到很满意,出资资助研究项目的机构也表示满意,最终将项目引向成功的学生也会感到满意。但在这之前,一路上“伤亡”的学生呢?终身教授通常可以接受几年的损失在临时的失败上,但对一个博士生来说,这一系列的失望可能导致的是学术事业夭折在萌芽中,甚至心理健康都可能岌岌可危。
\breakline
2009年5月,在我博士第三年接近尾声的时候,我参加了Cristi的\emph{论文答辩}。论文答辩是博士生获得博士学位之前最终的“神圣仪式”:博士生就自己博士期间和博士论文相关的研究做出一个一小时的口头汇报,并需要回答一个教授小组提出的尖锐的问题。Dawson通常都很安静和内敛,而这次当他向观众介绍Cristi、并激动地说到和他一起合作创造出Klee是一段令人愉快的时光时,他脸上的骄傲和自豪清晰可见。他对Cristi的夸奖并非空穴来风:Cristi在博士阶段的工作无可指摘,而且他在Klee 中发展出的思想,创立了软件缺陷检测领域中的一个新的子研究领域(称作\emph{混合式实际/符号化程序运行})。
看过Cristi的论文答辩展示之后,我更清晰地意识到自己几乎不可能从Klee中继续做出一整个博士论文的工作了,这也进一步增强了我离开Klee项目的决心。Cristi 闪耀的成功,让Dawson年轻的学生们发表论文和最终毕业变得更加困难了。从无到有的Klee的创造的工作已经完成;所剩下的大多是在此基础上一些添加和改进,或是将Klee应用在一些新的软件上,比如Linux驱动程序软件。尽管这些工作也可以最终成为可以发表的论文,甚至成为博士论文的一部分,Dawson已经不像其它刚刚进入我们研究领域的竞争者一样急于发表论文了。
因为Klee(以及一些2005年到2008年的相关项目)创建了一个全新的子领域,很多助理教授和年轻的学者很快就加入到了这个大潮中,并迅速发表了很多篇论文描述针对这些项目的改进,以期获得终身教职或者职位晋升。这就像一个学术圈的淘金潮,而Cristi、Dawson以及其它一些少数的先驱者引领了这个潮流。因为Dawson已经获得了终身教职,并创造了包括Klee在内的很多著名的项目,他并不需要随波逐流,也没有强烈的欲望发表很多论文来填满自己的简历了。
这一现象的结果是,和那些年轻的研究者一起开展研究的博士生更容易发表论文并取得博士学位,而与此同时Dawson的学生似乎都没那么顺利。在我离开Klee项目后的三年中,来自世界各地的很多研究小组发表了上百篇和Klee思路类似的论文。令人欣慰的是,其中有15篇论文描述了对Klee本身的改进——作为我们开放Klee 源代码,以促进这方面研究进展的结果。同时,Dawson的博士生中有五位在Klee上下过苦工;而到目前为止,\emph{只有一位}成功地发表了一篇论文(即Klee-UC)。
让然觉得讽刺和不幸的是,现在作为学术会议程序委员会成员和论文审稿人的都是Dawson 的直接竞争者,尽管他参与创立了这一研究领域,他自己的论文也更难以得到发表了。因为Dawson已经有几年没有积极发表论文了,他已经对于发表论文所需要的修辞技巧、新诞生的术语、以及符合审稿人口味的一些“营销技巧”有些生疏,所以在顶级会议发表论文已经变得困难了。此外,他的竞争者们发表越多的文章,审稿人对论文的要求也就越加苛刻,他和他的学生在发表论文时也就越需要说明自己研究思路的与这些论文的区别与联系,最终导致他们的论文更容易被拒收,收获更多令人失望的结果。这很讽刺,因为归根结底,如果不是因为十年前Dawson的远见,这些挑剔的审稿人根本不可能在这一领域开展研究,更别说拒收他的论文了!
我考虑了一下,留在Klee项目中唯一的优势就只剩下Dawson发自内心热爱这个项目了。尽管可能我最后不能在这个项目上发表论文,也许他也能最终给我一个“怜悯毕业”。但因为我之前在Klee上的经历并不顺利,我没有勇气在Klee上再研磨不知道多少年的时间,仅仅指望一个“怜悯毕业”的结果。
这时,我已经度过了我博士生涯三年的时光,但仍然对我最终要怎么完成一篇博士论文毫无概念。我对未来没有什么计划,但我清楚地知道,自己肯定不可能再回到Klee 项目中来了。
%%% Intermission
\mychapter{插曲}
我博士第三年结束后,我马上就动身去了华盛顿州的西雅图,去那里的微软研究院总部实习。那个夏天成了我生命中最有趣和最有成效的夏天之一:我实习时参加的研究项目让我发表了三篇顶级论文,而且更重要的是,这个项目为我的博士论文奠定了基石。
现在,微软研究院已经是一个进行高水平学术研究的企业研究所了。在更多的公司中,研究所往往将精力投入在研发工程中,以期改善公司即将推出的产品。然而,微软研究院(简称MSR)的主要任务则是进行科学与工程方面的基础科研,并以在相关领域发表顶尖学术论文作为目标。
如果做比喻的话,MSR可能最像是一个没有学生的、巨大的研究型大学。全职的研究员就像这里的教授,而区别是他们并没有教学或者指导学生的义务,所以他们可以将自己的几乎全部精力投入到研究当中。可能他们最享受的职业优势,则是不需要去申请科研经费,而对教授们来说这是一种周而复始、极其消耗时间精力的工作。因为微软已经是一个利润可观的公司,所以它可以每年将成百上千万美元的盈利用于支持学术研究(发表论文)。微软的打算是,由其麾下的研究员研发的一些知识产权可能作为新产品灵感的来源,而且它也希望能拥有计算机科学界最顶尖的研究者能作为自己的顾问。正因为如此,微软公司给予了研究者们所有他们所需的资源,让他们完成最好的学术研究。
在MSR获得全职研究员的难度不亚于在一个知名大学获得教职的难度。尽管技术上来说MSR 的研究员们并没有终身职位,他们的工作保障很优越,只要他们能保证不断发表学术论文。因为在计算机科学领域,很多研究领域都是劳力密集型的,所以研究员们经常招募博士生作为暑期实习生,帮他们完成自己的研究计划。这对于双方来说都是个不错的交易:研究员们可以请博士生们来帮助处理一些研究中的苦工,而博士生们同时也能有机会和学校以外的著名研究者一起,发表顶级的学术论文,甚至之后得到工作的推荐信。在过去的十年间,计算机科学领域顶级学术会议的论文中,有相当一部分都是由MSR 的研究员和他们的实习生完成的。
当初夏我抵达MSR总部时,整个地方都充满了活力,有上百位博士生在和他们的经理会面,并准备开展工作。因为我们只能在那里实习三个月,我们的经历都为我们精心策划了研究项目,以期在实习结束时能发表论文。我们中的大部分人都能用自己暑期实习的工作投稿一篇论文,而其中一部分最终能够得到发表。当然,学术研究本身是有风险的,所以也有一些实习生被分配到的项目并不能产生可以发表的论文。尽管如此,几乎每个人都很享受在这里的时间——我们的工资比平时在学校的津贴几乎翻了两番,微软还会组织有趣的出游活动增进大家的交流,我们还有机会聆听由一流的学者做出的激动人心的学术讲座。
可能MSR实习带来的最深远的影响,就是我们在实习中形成的友谊。在那个夏天,我有幸结识了一些我同辈中最聪明、最充满灵感的年轻的计算机科学家。比如,和我同一个办公室的三位实习生之一的一位女生即将开始她在MIT的博士项目,而她在本科学习期间发表的顶级论文可能已经超过了大多数博士生在博士期间所能发表的数量。另外一位是来自加州大学伯克利分校的博士生,在工作日白天的实习工作之外,他还将每天晚上和周末都用于有全国各地的合作者参与的另一个研究项目。他们都很可能将来成为获得诸多荣誉的教授、研究领袖、或是高科技行业的创业新秀,所以我感到非常荣幸能和这些人共事了一个夏天。
\breakline
关于我如何获得进入MSR实习的机会,这个过程则是一个对充分结合自己的研究成果、并积极发展专业内的人际关系,其重要性的明证。很多博士生都会通过某种人际关系获得实习机会(以及之后的全职工作),而我也不例外。
在我博士第二年,和Scott、Joel在他们的HCI项目上开展研究时,就申请过一次MSR 的实习。我通过常规渠道申请,在网上递交了自己的简历,但我的申请很快就被拒绝了,因为实习岗位被发表论文更多、且通常有更多内部人际关系的博士生们占去了。
一年之后,在我博士第三年,一位MSR的研究员注意到了我和Scott、Joel合作的HCI 项目(论文发表在一个该领域的学术会议上),所以他给我发了一封电子邮件,问我是否有兴趣在一个大致相关的项目上,跟着他做实习。他专门找到了我,是因为在我MIT本科的时候,我的研究导师曾经将我介绍给他过,所以他对上了号。
我对他的邀请深感荣幸,但我回复了他我已经不在HCI方向做研究了;那时,我已经回到了Klee项目中,继续进行着软件缺陷检测的研究。不过,我表达了自己对去MSR 开展经验化软件质量度量课题的强烈兴趣,因为我博士第二年都在和Dawson做这类的工作。他马上就把我的邮件转发给了他的同事Tom,而Tom是经验化软件度量领域正在冉冉升起的新星。通过邮件简单地自我介绍之后,我将自己和Dawson撰写的关于Linux 缺陷报告度量的论文发给了Tom。Tom很喜欢我的论文,于是便决定招聘我作为他的实习生。在我博士第二年中我曾经读过好几篇Tom的学术论文,所以我对于他招募我为他工作,感到十分激动。
如果我只是像上百位其他申请者一样,盲目地在网上递交自己的申请,可能我永远也没机会吸引Tom的注意。很多其他的实习生也是通过某种人际关系得到实习职位的,不过对他们而言,可能是导师直接将他们推荐给了在MSR研究方向相关的学者。有趣的是,不是Dawson,而是我本科一位研究导师(我们的项目大概是在六年前)为我提供了这种我当时亟需的人际关系。这位导师后来还为我的第一份全职工作,介绍了一位关键的人\footnote{原文是``provide a crucial introduction'',也可能是指介绍了一个机构/组织等,但从上下文无从推断。这里译者采用了更符合中文语言习惯的翻译。——译者注}。从这个经历,我明白了被有影响力的人推荐的重要性;在一个充满挑战的领域,仅仅做得好是远远不够的。
\breakline
Tom在较高层次上为我的实习研究制定了计划,并鼓励我完成一个可以实现但雄心勃勃的目标——在夏天结束之前投稿一篇顶级学术会议的论文。我的项目是使用量化的方法研究在软件缺陷报告生成之后,缺陷被修复,被分配给其它开发者,或者被认为已经修复、然而后来发现还有问题等,这些现象中背后的人为因素。为了深入研究这个问题,我需要写程序分析软件缺陷数据库,并对比微软内部的员工个人信息。我当时非常擅长做这类的数据挖掘和分析的工作,因为我整个博士第二年都在和Dawson一起,就Linux的缺陷报告和版本控制历史数据做着类似的分析。
每天下午五点,Tom在下班之前都会来看看我的进展。尽管每天的进度检查可能让人压力很大,但实际上我发现这些进度检查非常有帮助,因为Tom态度和蔼,对我的工作也并不抱有批判的态度。每天都能得到及时的反馈,让我能保证专心在工作上,也更有工作的动力。这种确定、短期的目标和持续、有效的反馈的组合,使得我实习期间的工作日比之前三年博士生涯中任何一段时间都更加高效。最让我开心的是,我每天只在正常的工作时间工作(早九点到晚六点)。我并不能将工作带回住处,因为我需要的数据都只能从微软内部才能访问,所以我每天晚上都有机会出去放松,而不需要担心自己是不是要做更多的工作;而在学校时,我常常在担心自己是不是工作得够多,因为几乎醒着的每一分每一秒我都能工作。
由于Tom发表过也评审过很多软件度量方向的论文,他是绝对的“局内人”,他知道什么样的结果和写作方式在这一子领域更受欢迎。在夏天结束、我们提交论文的时候,Tom非常熟练地在相关研究的基础之上说明了我们研究工作的贡献,阐明了我们论文的结果新颖、有影响力的原因,并尽量完善了论文的叙述。三个月后,我就听说了我们研究软件缺陷修复的论文被一个顶级会议收录的好消息,而那年这个会议的收录率只有14\%。
但Tom没有就此收手!因为他刚刚入职MSR不久,他非常渴望能够发表更多的跟进论文,以建立自己在公司的名望。在接下来的几年中,我们用我2009年暑期实习时得到的实验结果又发表了两篇顶级会议的论文,一篇是关于缺陷报告负责人变更的,另一篇是关于缺陷报告重新开放的(这篇论文获得了\emph{最佳论文奖})。
\breakline
我在MSR和Tom开展经验化软件度量研究所收获的成功(发表了三篇顶级论文),对我来说是一个令人满意的拯救——将我救出了博士第二年在这一领域失败的低谷(投稿了两篇论文被拒,最后只发表了一篇次级会议的短文)。因为我在这两次截然不同的经验之间并不是变得聪明了很多,我将我实习项目的成功归功于两个因素:微软和Tom。
首先,作为一个MSR的实习生,我可以访问到包含微软软件缺陷和人员资料在内的大量内部数据。如果是作为外部人员,我是永远不可能获得这些数据的访问权限的。MSR所拥有的庞大的数据资源使得他们的研究员们(比如Tom)可以更快地做出开辟性的研究,而他们的竞争者因为没有相应的数据,可能永远都做不到这一点。相比而言,当我和Dawson 一起做研究的时候,我能获得的Linux数据集规模小了很多,质量也差强人意,因为开源软件项目往往不如一个世界一流的软件公司在维护数据记录上更为用心。
此外,Tom在其中的贡献也不可或缺:因为他在经验化软件度量领域是老手,所以他知道应该如何作为一个技术导师来指导我,他还清楚论文需要怎样的精心调整才能尽可能最大化被接收的概率。与此相反的是,Dawson在这一领域只是一位充满研究热情的局外人,所以对他而言,他并没有在这一领域开展研究的动力,也不能良好地指导我完成研究项目(尽管他在另一领域——软件缺陷检测——是世界知名的学者)。
在我博士第二年时,因为Dawson和我在经验化软件度量这一领域发表论文困难重重而倍感煎熬,因为我们的竞争对手都是这一领域的专家和老手。现在当我终于和这些专家之一一起发表论文,站在了成功的这一边时,这种感觉令我由衷地欣喜。
\breakline
尽管我在暑期经历了一段美妙的“插曲”,当秋天回到斯坦福时,我仍然对博士论文的项目毫无头绪。我只知道我不想再Klee项目上继续消耗下去了,但我对于什么样的研究工作使我感兴趣——而且更重要的是,可以发表论文——仍然一无所知。
我考虑过将我在实习做的研究工作扩展成我的毕业论文。然而,我最终得出的结论是,我回到斯坦福之后就很难在这个问题上发表更多论文了,因为那样我就无法访问微软的数据了。最好的打算似乎是,我能在微软完成自己博士论文的所有相关工作。然而这显然可能性不大,因为我没听说过之前有学生这样做过。
作为最后的努力,我尝试联系了我在谷歌实习时的经理,以寻求重新回到谷歌实习,利用他们关于软件缺陷的内部数据集继续经验化软件度量的研究。他似乎对此没什么意见,但我后来没有继续跟进这个计划:因为他自己也不是学术研究者,而除了他之外,我似乎也想不到谁会愿意帮我完成这个研究计划。所以,我最终决定放弃经验化软件度量这个方向,所以在MSR发表的三篇论文最终也没有为我博士毕业做出贡献。然而,这些经历对于我提升研究水平和论文写作水平,无疑产生了积极的影响。
因为求毕业心切,我在暑期实习期间,将很多天晚上和周末用于阅读学术论文,或者是在咖啡店展开头脑风暴。在某一阶段,我甚至产生了一个想法,那就是创造一个和Klee 类似的博士论文项目,但不使用到Klee这个软件本身。这个计划可以一方面让我远离Klee的深渊,而另一方面也保持Dawson对我研究项目的兴趣。不幸的是,我没能从已经发表的论文中找到我自己原创的、有足够创新性的思路。
接着,2009年7月24日,就在我的暑期实习刚刚过半的时候,灵感突然降临了。在MSR 的办公室编写程序分析数据的时候,我开始想到了一个想法,而这个想法最终转化为了组成我博士论文的第一个项目。我发狂似地写下了一页接一页的笔记,并让我的朋友Robert帮我确认我的想法不是异想天开。当时,我完全没有预料到这个想法会不会被更广泛的学术圈认可,但对我而言,这至少是我回到斯坦福、开始我博士第四年时,一个明确的前进方向。
%%% Year Four: Reboot
\mychapter{第四年:卷土重来}
在我整个博士第二年、和2009年在MSR暑期实习期间进行经验化软件度量研究的过程中,我一直在使用一种叫Python的非常流行的编程语言\footnote{Python是一种解释型的编程语言,语法灵活且简洁明了,非常适合用于编写需要很快完成的数据处理、分析程序,也因此被很多研究者、数据分析师等采用。},进行数据处理、分析、和可视化。具体来说,为了我的程序可以运行,我需要在我的电脑上存储很多程序所需的数据;为了我的程序在数据分析过程中,经过每一次很小的改动之后可以运行得更快,我不得不把我的程序改得过分复杂。当这种想法在我的头脑中慢慢地酝酿一个夏天之后,在七月的一个安静的下午,我突然萌生了这样一个想法:如果我能以某种创新的方式修改Python 的运行环境(术语称为\emph{解释器}),也许我就能消除我每天面对的很多低效的工作,从而提高使用Python进行计算的研究者的工作效率。我将我对Python解释器的改进想法称为IncPy,这来自于增量式Python (\textbf{Inc}remental \textbf{Py}thon)的缩写。
\breakline
就像所有务实的研究者一样,我想到IncPy想法之后的第一件事(其实是从一开始的激动平静下来之后的第一件事),就是仔细地在网上搜索,试图确定是不是有人曾经做过相关研究。谢天谢地,没人曾经做出过我计划完成的工作,但的确有一些之前的研究项目和我的想法有点接近。不过这不是大问题;没有什么研究创意完全是原创的,所以学术界永远存在着很多相似、相关的研究项目。不过,如果想最终发表论文,我需要令人信服地说明IncPy和这些已经存在的项目有何不同。在几天之内,我就简单地规划出了一个初步的项目计划,包括一些说明IncPy为什么独特、新颖、值得研究的论述。
因为我还有一个多月才离开MSR,我充分利用了我周围的环境——有很多聪明的同事都在像我一样,为他们的研究编写着类似的数据处理程序。我和几位同事一起喝咖啡谈过话,我简单地问了问他们在工作中进行数据分析时的习惯,以及他们工作中遇到的低效问题。我还向他们简单阐述了自己的IncPy想法,并和他们讨论了如果要让这个想法更加实用、以及更加适合作为学术研究问题,项目的哪些方面还需要微调。这些早期的谈话增进了我的信心,让我知道我正前进在正确的方向上,因为其他人和我一样对数据分析中的低效感到失望,并且渴望看到一个IncPy这样的解决方案。
那个夏天接下来的时间里,我将晚上和周末都用于在咖啡店里不断完善我逐渐成型的IncPy 想法,强化它的“营销宣传”,并且从我的MSR同事们中获得反馈。我还将我的想法的初稿发给了Dawson,但那时我并不太关心他对这个想法感不感兴趣,因为这将会成为我自己的研究项目。我不是在征求他的同意;我只是想告诉他这是我秋天回到斯坦福之后想要开展的研究工作。
\breakline
我的博士生涯在我在斯坦福的第四年重新启程,我斩断与过去三年的联系,并翻开新的一页。不再在已有的研究项目上开展工作,不再去尝试制定计划使得自已与教授和高年级学生的研究兴趣相一致,也不再去担心什么样的研究才是学术圈乐于看到的。我现在拼命地只想把我IncPy的新想法实现出来,形成一篇可发表的文章,并使之成为我毕业论文的第一部分。
虽然充满了新的热情与激情,我还是有些忧惧的,因为我是脱离了原有的工作来做一件新的工作,并且还未得到教授的支持,不知道是否会成功。我们系大多数博士生都会做他们的导师或者教授感兴趣的项目,毕竟有了教授的帮助和专业知识会更容易发表论文。然而,即使没有教授撑腰,我还是预感IncPy会成为一个能发表出来的想法;在过去三年中的研究失败中我积累了不少经验教训,从而对哪些想法可能会成功有了一个更好的直觉。对这种直觉的坚信不疑成为了我博士生涯的转折点。
还有一点比较务实的事是,我依然保持Dawson作为我的导师,因为他同意我做自己的项目,而且还能时不时给我的工作一点高层面的回馈。由于我仍然有外源奖学金来作自我基金支持,我也就没有义务像Dawson的其他学生那样必须继续在Klee项目中工作。在我博士的接下来几年里,Dawson开始不太插手我的工作了。我们碰面讨论项目可能总共才十余次;我大多时候还是自己工作或者寻找其他合作者。但我却不想正式地更换导师,因为那样的话,我到了一个新的研究组里还是得再一次“交学费”,一切从头做起。况且,我也不知道系里还有哪个教授对我IncPy的想法感兴趣,不然的话我可能还是会认真考虑一下换导师的事情的。
为了最终能够毕业,我需要找到三位同意阅读并且会批准通过我的毕业论文的教授,来组成一个博士论文委员会。大多数学生会直接请导师帮他们选择这个委员会的成员,毕竟他们一直在做导师指定的“官方”项目。但由于我单飞了,没有在Dawson的Klee项目上开展工作,事情就没有这么简单了。我努力地寻找我们系或者其他相关院系(如统计系,生物信息学系)的教授来做我的委员会成员。我给一些教授发了冷邮件,并试图通过他们现在指导的学生联系到他们。我甚至还做了一个幻灯片准备向这些潜在的委员会成员展示我毕业论文的初步想法,但不幸的是,没有教授有兴趣和我面谈。然而,我没有选择放弃并回到有院系教授支持的传统项目上去,而是冒险在IncPy的征途上继续前进,并且觉得委员会成员的事一定会车到山前必有路。
\breakline
受第二年时与Scott和Joel在人机交互工作上的启发,我2009年秋天一回到斯坦福,就开始采访一些写Python 程序来在研究中分析数据的同学。我的目标是发现他们在编程中被什么影响了工作效率,以及如何能用IncPy消除这些影响效率的问题。我的一些朋友还帮我在他们的实验室组会中安排了报告的机会,让我能介绍关于IncPy的想法——尽管它当时还只是半成品。在项目启动阶段的这些采访和汇报,对我新想法的提出和“营销技巧”的提升都有很大帮助。我也特别感谢那些在我除了几页粗制滥造的幻灯片而外别无其他东西展示时,还能帮助我让我的项目起步的朋友们。
我越来越感到振奋,因为我发现很多基于计算的领域,例如机器学习、制药学、生物工程、生物信息学、神经科学,还有海洋工程,都在使用相似的方法进行数据分析,并且能从类似IncPy这样的工具中受益。经过了几个星期的调研采访和后续的计划细化以后,我自信我有了足够的卖点来令人信服地“推销”出这个项目,形成一篇论文投稿出去。我想提出的论点是:各种领域的众多计算型研究者每天都在与编程工作流中常见的低效问题抗争,而IncPy正好提供了针对这些低效问题的一个完全自动的解决方案,这是之前没有人做到的。这个初期形成的卖点最终也演化成了我整个博士论文的主题。
有了一个总体的策略之后,我准备好了开始一个长达几千小时的辛苦工作——研磨—— 这也是把IncPy从想法变成现实的原型工具所必经的工作。在那个夏天快要结束的时候,我扮演了一个“教授的角色”,草拟出了高层面的设计提纲,作了报告演讲,并细化了概念性的想法。现在我准备好了转成“学生的角色”,在接下来的一年经过辛苦的研磨从而把IncPy变成现实。
\breakline
这时我也清楚有了一个不错的想法只是做出可发表的研究成果的必要条件,而绝非充分条件。年轻的研究者——通常是博士生——必须在这里那里花费成百上千小时,在细节处挥洒汗水,最终才能让想法结出果实。在计算机科学的研究中,苦力劳动最主要的形式就是编写计算机程序来搭建、测试和评估基于软件的新的原型工具和技术。我在过去十年中花了近万小时在各种形式的编程工作上,这些工作有的在课堂上、有的在业余生活中、有的在实验室里、还有的在工业界的实习中,这些让我对实现一个类似IncPy这样的研究创意所必须的、高强度的、复杂的编程要求有了充分准备。
实现IncPy包含了一些我从未完成过的编程中的脏活累活。如果我在过去十年没有经历过这么多小时的如火炼真金般的训练,那我也绝不会去尝试这么一个劳动密集型的项目。不用怀疑,肯定也有其他人已经发现了我所注意到的计算型研究工作流中的这些低效问题,他们本可能成为我的竞争者,但将我与他们区分开来的要素是,他们没有创造出像IncPy这样\emph{完全自动的}解决方案所需要的深厚编程功底。他们可能最多也就能做出一个半自动的解决方案而已,而实质上这样的工作还不足以在优秀的会议上发表论文。
虽然我不太喜欢我研究生初期和本科期间的研究项目,但我从这些经历中获得的技术上的技巧以及判断力,使得我现在能将自己真正关心的想法实现出来变得可能。在接下来的三年中(2009年到2011年),我不知疲倦地做出了五款帮助计算型研究者的新原型工具(IncPy是其中的第一个),发表了多篇\footnote{原文是``published one or more first-author papers describing each tool",这里没有直译,而是根据上下文翻译成了“多篇”。—— 译者注}介绍这些工具的第一作者论文,接着将这些工作组合在一起形成了一篇我深感自豪的博士论文。那三年——我博士生涯的后半程——是我迄今为止最具创造力和最高产的一段时期,与我博士生涯的前半程形成了鲜明的对比。
强烈的\emph{想要做出成果的狂怒}让我疯狂地主动工作。我变得刚毅、果决、高度专注。每当我回想起我前三年博士生活所忍受的低效、失败、沮丧所带来的煎熬时,我心中就会产生一团怒火,然后逼迫自己工作得更努力;我被这种强迫性的鞭策所驱动,来弥补假想的浪费掉的时间。诚然,早些年的光阴实际上并没有浪费;没有那些挣扎,我也不会获得创造出组成我博士论文的这五个项目的灵感和能力。
\breakline
然而,2009年9月,在我开始我第四年博士生涯的时候,我还不知道有什么会在未来等着我,也绝没有像五个项目、230页的毕业论文这样的宏伟计划。我甚至都不知道有没有教授会认真地看待我未经检验的想法,并同意担任我的论文评委。我想做的就只是将IncPy 实现出来,尽可能让其发表,然后到时候再来考虑接下来一步做什么。
当我正准备开始(编写程序)实现IncPy的时候,出人意料的好运从天而降。当时,我还不知道这么一件小事竟能带来一系列的好运,为我铺开了一条通往毕业的大道。有一天午饭的时候,我的一个朋友Robert给我说他正计划把他一个新研究项目的论文投稿到一个研讨会\footnote{研讨会:相比起学术会议(conference),研讨会(workshop)的规模较小,更倾向于集中讨论某一个特定的话题。—— 译者注},这个研讨会的论文截止日期是两个半月之后。
按常理来说,我对这件事应该不会有太多想法,有两个原因:首先,Robert的研究主题(一个叫做\emph{数据溯源}的子领域)和IncPy并不相关,所以他准备投稿其实和我没有一点关系。第二,在我们系,一篇发表的\emph{研讨会论文}对于博士论文来说并不“作数”。研讨会论文的目的是宣传初期的研究想法,它并不像会议论文那样要经过严格的审稿。会议论文的接收率一般在8\%到30\%,而研讨会论文的接收率却有60\%到80\%。 我们系的大多数教授都不主张学生往研讨会投稿,因为论文一旦被接收(这通常也是很容易的一件事),教授就得从他们的经费中拿出大约1500美元,来承担学生参加研讨会并作报告产生的车旅费、住宿费和注册费。送一个学生去参加研讨会的费用已经几乎和参加一个会议的费用相当了,但发表会议论文对学生和教授来说却又更有声望。因此,顶级的计算机科学教授会强烈建议学生发表更多的优质会议的论文,同时也要避免投稿到研讨会。
我问了问Robert为什么他的导师会建议他把初期的想法投稿到一个研讨会,而不是再深入挖掘一下,日后再投稿到一个学术会议。他说部分原因也是出于方便,因为这个研讨会就在圣何塞\footnote{San Jos\'e,加利福尼亚州城市,距离斯坦福校园不足一小时车程。——译者注}举行。他们整个组都准备去参加这个研讨会,圣何塞离斯坦福也就20英里的路程,所以他也想在那做一个论文报告。
出于好奇,我浏览了一下那个研讨会的主页,看一看组织者们对哪些话题感兴趣。虽然这是一个关于数据溯源(Robert的研究领域)的研讨会,它的话题列表里却包含了这么一点:“高效/增量式再计算”。我心里暗想:\emph{嗯,IncPy为Python程序员提供了高效的增量式再计算,所以如果我以合适的方式推广我的论文,也许还正好契合这个研讨会!}由于我不需要长距离奔波就能参加这个会,所以如果我的论文被接收,我也就不用忐忑地去找Dawson 让他帮我报销注册费了。我发邮件给Dawson告诉他我准备往这个研讨会投稿的计划,他不冷不热地回复了我。不出所料,他对研讨会提不起多大的兴趣,但是觉得我要想投稿过去也可以,因为他很敬重这个研讨会的程序委员会的联合主席,一名名叫Margo的哈佛教授(她后来也扮演了一个至关重要的角色,帮助我得以毕业)。
时间也正合适:我还有两个半月来加班加点地实现出第一个能够工作的IncPy原型,然后写一篇研讨会论文并投稿。由于我知道研讨会的接收门槛比会议论文的低很多,所以我的压力也没那么大。我只需要让一个基本的IncPy原型能够合理地运行,并且生动地讨论一下这个经验就行了。我发现这种找到并为自己设定短期目标的策略出奇地有效,也让我能够在我后来的博士生涯中一直保持专注。如果没有一系列自我设定的截止日期,很容易就会陷入倦怠期并且患上拖延症。
\href{http://www.pgbovine.net/projects/pubs/guo_tapp10_camera_ready.pdf}{我的论文}最终被接收了,还获得了不错的审稿意见,我在2010年2月参加了那个研讨会并做了个半小时的报告。值得一提的是,我的论文还很荣幸地得到了程序委员会联合主席Margo的赞扬,她还指出了我的论文是如何与她的学生Elaine正起步的一个基于Python 的新项目产生关联的。Elaine没有来参加这次研讨会,不过Margo给了我Elaine的邮件地址并建议我们联系一下。
起初,我担心Elaine会成为我的直接竞争对手,还可能在我之前发表会议论文,这会使得我发表一篇关于IncPy的会议论文变得更为困难:因为在学术界成为第一人是很被珍视的,一旦其他研究者在你之前发表了一篇类似你的想法的论文,你再想把你的想法发表出来就会变得更难了。但是经过几次试探性的邮件接触和视频聊天之后,我发现她并没有把这个工作作为会议论文投稿的打算,这让我放松了一些。而且,她的工具也没有全自动的能力,而这正是把IncPy和其他类似工作区分开来的特点。当我们意识到彼此不是竞争对手后,我们立马成为了朋友。我很高兴在接下来的几年里,我还和Elaine保持了联系。后来我和Margo重新取得联系,让我能够奔向博士征途的终点,部分也要归功与Elaine。
\breakline
即使做这样一个有关IncPy的研讨会论文报告有利于获得反馈,尤其还让我有机会能和Margo会面,但那篇论文对我的博士论文而言并不算做是“真正”发表的论文。我知道我仍然还需要将这个工作发表在我们系教授所认可的会议上。研讨会论文和会议论文最大的区别就是一篇会议论文必须有一个有说服力的\emph{实验评估}来体现论文中所描述的工具或者技术的高效性。一篇论文的评估章节可以是多种形式,包括从对运行时间的测量,到用户行为的控制性实验研究。由于很多研究者都提出了相似的想法,所以审稿人会仔细地审查这些想法是如何被实现出来的,以及试验评估是如何设计的,从而决定哪些论文可以接收,哪些论文应该拒绝。
虽然在IncPy项目开始时,我就知道展示一个令人信服的实验评估是很困难的,因为我想说明的论点——IncPy 可以提高计算型研究者的生产力——是一个主观且模糊的概念。在读了一些同样也提出生产力的提升这一论点的论文之后,我设计了一个可分为两部分的评估策略:
\begin{enumerate}
\item \textbf{案例研究:}从各种计算型研究者处收集一些用Python语言编写的程序,并进行模拟,看看如果研究者们采用IncPy而不是常规的Python 后,生产力可以提升到什么程度。
\item \textbf{部署:}找一些研究者来让他们在日常工作中使用IncPy而不是常规的Python,之后再让他们报告是否IncPy提升了他们的生产力。
\end{enumerate}
下一个相关会议的论文提交截止日期在七个月之后,我计划在那之前准备好论文。我花了很多时间来寻找用于案例研究的程序样本和用于部署的潜在用户。没有这些,就没有评估,也就没有会议论文,也没有博士论文,更别说毕业了。(当然,我还是把我大部分醒着的时间花在了恼人的写代码、调试,以及测试上,从而来实现IncPy。)
我学着扮演一个一半推销员一半乞求者的角色,坚持不懈地询问同学是否有Python 程序可以拿来给我用作案例研究,或者更好的是,是否愿意安装并使用IncPy,以此作为日常工作的基础,并向我提供他们的使用感受。如我所料,我得到的回答多半是否定的,但我还是礼貌地询问了他们能否给推荐其他一些我可以联系联系的人。我也到许多研究组的组会上做了不少报告来招徕大家对IncPy的兴趣。历经了几个月的“乞求”之后,我获得了来自不同领域的近十个研究者的Python程序,足够我进行案例研究了。我感激当时帮助过我的每一个人,毕竟他们除了来自一个素不相识博士生的善意请求外,没有得到任何东西。
\breakline
虽然案例研究对我论文中评估的那一个章节来说已经足够了,但我真心希望的还是\emph{部署}我的原型工具—— 让真正的研究者使用IncPy。这不仅是因为我觉得通过部署我能够做一个更有力的评估,而且更重要的是,我发自内心地相信IncPy可以提升计算型研究者们每日工作的生产力。大多数研究型原型工具的搭建都是为了证明一个新颖的想法,但之后就被抛弃了,但我想让IncPy 成为一个实用且能被沿用下去的工具。我并不是为了发表论文才凭空想出IncPy 这个点子的,创造它的灵感来自于我研究时碰到的真真正正的实际的编程问题,所以我希望人们也能够在实际中使用它。
尽管我追求理想主义,但我也理解为什么几乎没有研究型的原型工具成功地得到部署使用。这背后的原因是因为人们往往不愿意去尝试一个全新的工具,除非他们看到这个工具有很多立竿见影的好处,而且没有一点缺点;研究者们却通常没有足够的时间和资源来让他们的原型工具运行得足够好,从而满足这些严苛的条件。尤其对我而言,我的目标用户对使用常规的Python很满意——即使它存在一些低效问题,他们也不愿意冒险转移阵地到IncPy上来。为了说服某个人试一试使用IncPy,我就必须保证IncPy在任何情况下都比常规的Python表现得要好。尽管这在理论上是可以保证的,但实际上IncPy 只是一个仅由一个学生维护的研究型原型工具,所以它一定会存在很多漏洞。相反,官方版的Python是一个有二十余年历史的项目,而且同时还有几百个经验丰富的程序员在维护它,所以它更加稳定和可靠。只要有一个人发现了IncPy的一个漏洞,大家立马就会觉得IncPy 是靠不住的,转而回去使用常规的Python。 我知道胜算不站在我这边,但我不在意。
在斯坦福寻找人来安装和使用IncPy未果后,我转而在附近的大学来寻找愿意第一个吃螃蟹的人。2010年3 月,我给UC Davis\footnote{UC Davis是加州大学戴维斯分校(University of California, Davis)的简称。——译者注}的几个博士生发了封冷邮件,他们都是和我同在MSR实习的一位同学的朋友。感谢他们无私奉献的精神,在我这个研究生亟需援助时拉了我一把,还邀请我去宣传我的IncPy。 几个和蔼的教授甚至还同意和我会面,包括一个我在数据溯源那个研讨会上碰到的教授。尽管我得到了不少有帮助的反馈,我还是没能找到人作我案例研究或者部署的实验对象。
那天晚上我待在了UC Davis,打算第二天早上回斯坦福。突然,我有了个冲动的想法—— 给Fernando发封冷邮件,他是UC Berkeley\footnote{UC Berkeley是加州大学伯克利分校(University of California, Berkeley)的简称,出于习惯,下文将简称其为“伯克利”。—— 译者注}的一个研究科学家,他非常热心于将Python投入到计算型研究中。几个月前,一个来听我作报告的研究生同学给我发了封邮件,里面有一个Fernando的一篇博客的链接,我当时就记下了一个备忘录,准备在将来某个时候联系一下Fernando。现在似乎正好是一个合适的时机:伯克利正好处于UC Davis和斯坦福之间,我回学校的路上可以顺便去他办公室拜访他一下。我给Fernando发了冷邮件,询问他明天早上是否有时间和我聊一聊。这是一个不太会成功的尝试,不过他最终还是答应了和我见一面。我和Fernando欢快地聊了一个小时;有这么一位资深的高级科学家能支持我IncPy的想法,我感到非常高兴。
第一次与Fernando会面最重要的一个收获就是他邀请我接下来这个月回伯克利做一个有关IncPy的报告。他说我的听众中会有使用Python进行计算型研究实验的神经科学家。在我那个一小时报告的过程中,我被三个研究员稍稍吓了一跳,他们老是打断我,反复纠缠一些IncPy在实际中表现如何的细节问题。一开始,我觉得这几个人实在是太过追根究底了,不过报告后他们过来向我表达了试用IncPy的强烈兴趣。他们抱怨的所遭受的低效问题正好是我创造IncPy的初衷!看来他们并不是在我报告时添乱;他们是真真正正想了解其中的细节,以此来评估将IncPy部署到他们实验室的计算机上去是否真的可行。
拥有第一批用户的这种可能性让我很激动。我和他们邮件交流了几次,还专门驱车去伯克利协助他们安装和设置IncPy。我的第一封邮件采用了一种谨慎乐观的语气:
\begin{quote}
非常感谢您有兴趣成为我的IncPy记忆式Python解释器的第一个用户!我非常期待能将IncPy做成一个您能在日常工作流中使用的工具。我觉得最大的问题应该是安装、设置、配置中恼人的工作,我会很乐意解决这些问题,从而给您最流畅的用户体验。
\end{quote}
在我尝试给伯克利这些神经科学家的电脑上安装IncPy之前,我已经搭建和测试了几个月,所以我很自信也能给他们安装成功。然而,安装之后没一会儿,我们就发现IncPy与这些科学家天天都在使用的很多第三方Python插件(称为\emph{拓展模块})并不相容。我自己测试的时候,只测试了一些基本用例,而没有考虑到这些扩展模块。这给了我一个关于现实部署的深刻教训:失败可能以你没有料到的形式出现,而一旦给用户留下一个不好的第一印象,就全完了!就像绝大多数研究者只在象牙塔里闭门造车做原型工具一样,我绝不会想到这个不可预见且不起眼的拓展模块问题,会让我在第一次部署的尝试中出局。
但我并没有放弃。我花了接下来几个星期的时间重新设计和实现了IncPy中一个关键部分的代码,使它能够与任何Python拓展模块一起完美工作。我又给伯克利那几位神经科学家发了封邮件,希望他们再给我一次机会,但我没有得到任何回复。唉,我曾经有一个绝佳的机会,可我却挥霍了它。
\breakline
这个惨痛的经历驱使我不断地从实际的角度出发来不断完善IncPy:一边修补了几个不明显的漏洞,一边我还制作了一个\href{http://www.pgbovine.net/incpy.html}{IncPy的项目网站},上面包含一个短短的演示视频,文档以及新手教程。做这些东西的几百个小时对我原本的研究没有丝毫贡献,但这对我获得实际用户的事例,从而在将来投稿时完成论文的评估章节来说却是必须的。
几个月以后,来自世界不同地方的三个陌生人通过这个网站发现了IncPy,他们下载了IncPy,并将其用来提升他们研究中一些编程工作的速度。虽然三个人只是一个可怜的用户总数,但也总比零好,而大多数研究型原型工具用户数就是零。IncPy已经达到了一个打磨得还不错的状态,我很满意——这多亏了我从伯克利回来之后的做的改进——这几个陌生人现在可以不需要任何人工指导就能使用IncPy了。这三个人发邮件告诉了我IncPy是如何在他们的一些工作中起到帮助的。这些事迹虽然并不是IncPy高效性的强有力证据,但也聊胜于无。
2010年9月,在我的第四年博士生涯接近尾声的时候,我把我IncPy的论文投稿到了一个顶级会议,论文的评估章节包含了案例研究和三个简要的部署实例。这个会议之前一年的接收率只有14\%。所以我知道我的论文很有可能被拒收,既因为它极低的接收率,也因为我的IncPy 并不能很好的契合任何一个传统的子领域。尽管这样,先以顶级会议为目标,之后有必要再重新投稿到二级会议仍是一个明智的选择,毕竟顶级会议的论文发表在将来毕业的时候会占到更大的权重。
我仍然还没拥有一条通往毕业的康庄大道,但我至少能开始自我管理自己的研究内容,而不是跟着别人一起做他们的研究项目了。我在过去这一年还是挺开心的,我把脑海中灵光一现的IncPy想法变成了一个半实用的工具,还让三个下载它的陌生人从中受益。虽然这只是一个很小的成就,而且对我的毕业没有丝毫帮助——教授们更看重理论上的新颖性,而非实际中的部署情况——但在我博士的第四年末尾时,这多少还是有一点让人满意的。
%%% Year Five: Production
\mychapter{第五年:峥嵘岁月}
我的博士第五年(2010年9月)刚开始的时候,我还没有任何东西可以放到我的(还未存在的)博士论文里去。这时,我的大多数同学都以第一作者身份发表了至少一篇博士论文水准的会议论文。而我却一篇都还没有(IncPy的那篇论文当时还处于评审阶段),因此我很担心我将需要七八年才能顺利毕业。
然而在接下来的十二个月中,我发表了四篇会议论文和一篇研讨会论文(均为第一作者),这也铺平了我通往毕业的道路。毫无疑问,我的第五年是博士生涯中最高产的一年,我不懈地保持着专注。
\breakline
2010年的夏天进行到一半的时候,IncPy项目正按部就班的进行着,我也正准备着在九月的截止日期前投一篇论文。但我知道对于博士论文来说,IncPy还不算是一个实质性的工作。所以除了继续努力准备投稿而外,我也花了一下时间想了想下一个项目要做什么。
我希望可以把我的头脑风暴说成是受纯粹的学术精神所激励,但事实上我是受日益增长的恐惧所驱使:我担心我不能在一个能接受的时间内顺利毕业,所以我逼迫我自己去想一些有希望发表出来的新想法。我也知道一篇论文被接收发表可能会花两到三年,因此我要是想在第六年结束时毕业,就得在今年提交几篇论文,并祈祷其中有至少两篇会被接收。我感到了一种紧迫感,因为我的外源奖学金只持续到这一年结束。等我的经费一到期,要么我就得去从教授那里获取经费支持并面对一些强制性的限制(例如再一次在Klee上投入工作),要么我就得长期地担任助教,而这会更加推迟我的毕业期限。时间真的不多了。
2010年7月29日,几乎就是我想出IncPy的初始创意正好一年之后,我又有了一个相关的想法,同样也是受计算型研究者分析数据时碰到的实际问题的启发。我注意到由于研究者们经常以一种自发的“马虎”的方式写程序,他们的程序就会常常由于一些低级错误而崩溃,没能产生任何一点分析结果,让人垂头丧气。我的想法就是通过改变Python 语言的运行时环境(\emph{解释器}),我可以消除掉这种崩溃,让这些马虎的程序能产生出一部分的结果,而不是什么结果都没有。我把这个Python解释器的修改版命名为“SlopPy”,代表\emph{\textbf{Slop}py \textbf{Py}thon}\footnote{``sloppy''一词意为马虎、不谨慎的,所以作者的项目全称是“马虎的Python”,而缩写也是“马虎的”。——译者注}。
虽然SlopPy和IncPy是非常不同的两个想法,但我都是通过改变Python解释器的行为来实现它们的。过去一年为了做IncPy,我花了近一千个小时来研究(修改)Python 的解释器,这让我有信心能够轻易地实现出SlopPy。只用了两个月,我就做出了一个能工作的基本版原型工具,跑了一些初始的实验,并提交了一篇论文到一个二级会议。我以那个会议为目标,既是因为它的截止时间比较合适,也是因为我觉得SlopPy 这个想法还不足够“大”来让它被顶级会议接收。
\breakline
到了2010年10月的时候,我有两篇论文都处于评审中。这时,我已经放弃了找一份大学教授工作的想法,毕竟我连一篇能用到博士论文里的论文都还没发出来;有竞争力的计算机教职候选人在博士生涯的这个时候都已经发了很多篇饱受赞誉的第一作者论文了。所以除非奇迹发生,要不然我是找不到一个一流大学的研究工作了,因此我把完成工作够得上毕业定为了我的目标,都不再去担心我的简历字面上好不好看了。
我收到的结果是奇迹的反面:我IncPy和SlopPy的论文都被拒收了。我感到有点失落但也并不震惊,因为在这之前我已经习惯了论文被拒。对我论文的批评意见都是合情合理的,所以解决这些问题可以强化我之后的投稿。
最值得注意的是,我介绍IncPy时采用了一种不太明智地包装策略,这使得我的论文被安排给一些来自对我的研究理念不太“友好”的子领域的学者来审阅。理论上来说,专业论文应该只基于它的内容来评判,但实际上,审稿人有着自己不同的主观品味和理念差异。所以我彻底地重写了开头用来自我推销的部分,希望获得更多友善的审稿人的赞同,我还将它重新投稿到了一个二级会议,以此来进一步增加它被接收的机率。我的计划奏效了,2011年年初,我\href{http://www.pgbovine.net/projects/pubs/guo_issta11_camera_ready.pdf}{IncPy的那篇会议论文}的第二次投稿被接收了,尽管评审意见有点冷淡。
后来我又修改并重新提交了SlopPy的那篇论文到一个研讨会,这个研讨会正好和我要作报告介绍IncPy 的那个会议在一起举行。这个策略很有效,因为想让一篇论文被一个研讨会接收比被一个会议接收实在是容易太多了。而且,Dawson也不用花额外的钱让我去参加这个研讨会,因为我本来也是要去同期举行的那个会议上做IncPy 的报告的。\href{http://www.pgbovine.net/projects/pubs/guo_woda11_camera_ready.pdf}{SlopPy 的论文}和我料想中的一样被接收了,尽管它不“作数”,只能算作我博士论文外的额外成果,但至少也比没有论文发表好;我希望能把这篇论文吸收到我的博士论文中去作一个小章节,以此作为那些来自会议论文的更重要章节的补充。
\breakline
2010年10月,我刚把IncPy和SlopPy两篇论文投出去的时候,我问了Dawson我要毕业的话需要达到什么条件。不出所料,他回答我说我需要发表一些论文来证明我工作的合理性。不过他还有一个更为具体的建议:另一个能到达博士论文水准的项目,就是能够把我对Python的兴趣以及他所喜爱的类似Klee的想法结合起来,从而做出一个能够自动查找Python程序中漏洞的工具。由于我对回到任何形式的Klee项目都不太感兴趣,所以我没采纳他的建议,而是继续思考IncPy和SlopPy还有没有什么可拓展的东西,可以形成一篇后续论文提交出去。
这时,我博士论文主题的初期构想已经开始在我脑中萌芽:IncPy和SlopPy都是\emph{提升计算型研究者生产力的软件工具}。因此,思考接下来一个项目要做什么的时候,我仍接着去寻找计算型研究者在工作中会碰到什么样的问题,然后设计新的工具来解决这些问题。
具体来说,我注意到研究者们每天运行计算实验时,都要编辑并执行他们的Python程序几十上百次;在有一个重大发现之前,他们往往要重复这个过程几周或者几个月。我觉得把每一次程序执行之间的变化记录下来并进行比较,会对调试程序和获得思路有帮助。为了便于进行这种比较,我打算拓展IncPy,使之能够记录下当一个Python程序执行时,哪部分代码和数据被存取了的细节,从而维护一个计算型实验的详尽历史记录。我也觉得如果研究者之间能够共享这种\emph{实验历史记录}的话那就太棒了,这样他们就能够从中知道哪些实验尝试是奏效的,哪些是不行的。
我的直觉告诉我按这个思路发展出来的想法肯定是新颖的,而且能够发表出来,但我还没有形成一个清晰的研究亮点;我的思路还都是模糊的一团。我觉得思维有点被卡住了,于是我又寻求和Fernando见一次面,就是我博士第四年在伯克利一个实验室的组会上作报告介绍IncPy时见过一次面的那位研究科学家。Fernando把与我的会面排入了日程,我们这个小时的交谈为我的下一个项目播撒下了种子。
\breakline
我一把我拓展IncPy来记录基于Python的实验历史的想法告诉Fernando,他立马饶有兴致地给我介绍起了一个我从没听过但却很吸引我的话题:\emph{可重复性研究}。
实验科学的根基之一就是任何一个人的研究发现应该能够让同行验证、比较,并且以此为基础继续发展。在过去的十年中,来自不同领域越来越多的科学家都在通过编写计算机程序来分析数据和获得科学发现。每年都有几千篇充斥着以数据、图像、表格作支撑的定性结果发表出来。然而,现代科学中大家都心知肚明的一个令人遗憾的事实就是,想重复或者验证他人的发现几乎是不可能的,因为他们的原始代码和用来产生结果的数据集几乎很难得到。这造成的结果就是,大量论文中包含的触目惊心的错误——有的的确是无心之失,但有的却是公然造假——变得无法被检验,有的甚至变成了导致人员丧命的科学论断。最近几年,诸如Fernando这样的改革派科学家们正竭尽全力唤起大家对计算科学中可重复性研究重要性的重视。
为什么可重复性在实际中如此难以实现呢?一部分有很强竞争力的科学家故意不公开他们的代码和数据,以此来避免潜在的竞争,但大多数人还是愿意在别人有需要时分享给他们代码和数据的。然而,主要的技术壁垒还是仅仅获得了别人的代码和数据,还是不足以重新运行和产生他们的实验。每个人的代码都需要一个高度特殊化的\emph{环境}来运行,任意两台计算机上的环境——即使它们有相同的操作系统——还是会有一些细微且互不兼容的差别。所以,如果你把你的代码和数据发给你的同行们,他们还是有可能没法重新运行你的实验。
Fernando很喜欢我IncPy的记录实验历史的想法,因为这样可以记录下一个实验最初出现时,有关其软件环境的信息。之后,使用Python的研究者就可以把他们的代码、数据和环境发给想要重复他实验的同行。会谈出来以后我感到非常振奋,我找到了我想法的一个具体应用。可重复性研究的这个动机似乎也足够吸引人,可以组成我第二篇基于IncPy 论文的故事情节,还能成为我博士论文的一部分。
正当我把更多的细节草记下来的时候,一个极为清晰的念头瞬间袭来:\emph{为什么只把实验记录限制在Python程序上呢?}有了我头脑中的一些想法,我可以做出一个工具,能够轻松重复任何语言写的计算型实验。头脑还十分混乱的我草拟了一个计划,我准备设计一个新工具,名字就叫“CDE”,也就是\emph{\textbf{C}ode, \textbf{D}ata, and \textbf{E}nvironment}\footnote{意为“代码,数据,环境”。——译者注}的意思。
\breakline
当我把我的想法告诉Dawson时,他非常支持,还鼓励我再想得大胆一点:\emph{为什么只把CDE瞄准在科学家的代码上?为何不做一个针对所有种类软件程序的多用途工具包?}这的确是字字珠玑。一大批软件的创建人和贡献者——不只是科学家——都遇到过让别人运行自己的程序时,由于同样的环境不兼容问题带来的烦恼,这一现象被亲切地称为“依赖地狱”。依赖地狱问题在基于Linux的操作系统中尤为广泛,因为用户使用的不同变种的Linux之间存在大范围的不完全兼容现象。在一个用户的Linux 计算机上能运行的程序不一定也能在另一个用户的稍有不同的Linux计算机上运行。只要把我的原始想法稍加改进,CDE就能帮用户打包他们的程序,从而让其他用户能够成功运行,而不再用担心环境不一致的问题。我感到十分激动,因为CDE 有可能缓解Linux 里存在了十余年的依赖地狱问题。
按惯例要进行实际调研,于是我在网上搜索了相关工作,看看有没有什么研究型原型工具和成熟产品级别的工具有着类似的功能。让我欣慰的是,已有的工作并不算多,而且CDE在这个宽松的竞争环境中有两方面显得尤为突出:首先,我将CDE设计得比类似的工具更容易上手使用。作为用户而言,你要新建一个自洽的代码、数据和运行环境的包,就只需要运行你希望打包的程序就可以了。因此,如果你在Linux计算机上运行了一套程序,那么CDE就能让其他人在他们各自的计算机上都能返回到这一相同的程序,而不需要其他的安装或者配置。第二,CDE所采取的的技术机制——一种叫\emph{系统调用重定向}的技术—— 使它在各种各样复杂的实际情况中,比其他相关的工具更为可靠。
这时,CDE还只是以一堆笔记和设计提纲的形式存在,但当我意识到它比所有现存的工具概念上都更简单,更易于使用,且更为可靠时,我还是感受到了它的巨大潜力。我身体里的一部分感到震惊和激动:\emph{居然之前没有人实现过这个东西?!回想起来这个想法这么显而易见!}一个令我惧怕的之前没人做类似CDE工具的原因可能就是,要搞清楚所有的细节并让其在实际中高效工作几乎是不可能的。可能CDE也是一种论文上看起来不错但却实际中不可行的创意。我于是觉得除了自己亲自实现一遍CDE这条路而外,没有其他更好的办法把这件事弄清楚了。
在横跨2010年10月到11月那紧张的三个星期中,我都在为创建出CDE的第一个版本而高度研磨。正如我所怀疑的那样,虽然CDE背后的研究创意是很直截了当的,但要让CDE 在真正的Linux程序上工作,还有很多编程相关的脏活累活要干。那几个星期我与CDE 生活甚至呼吸都是在一起,生活中的其他事都被我抛之脑后。我夜以继日地编写程序,还常常在梦里思考我需要解决的代码中错综复杂的细节问题。每天早上,我刚醒来就跳起来编程,生怕今天我会遇到一个难以逾越的障碍,最终证明让CDE在实际中工作是不可能的。不过这一天迟迟没有到来 ,我也离我的第一个里程碑越来越近:证明CDE是如何能让我在两台Linux计算机之间毫不麻烦地传递一个复杂的科学程序,并重复一个实验的。
在经过三周靠咖啡驱动的高强度研磨之后,我感到狂喜,我终于让CDE在我的一个科学程序演示样本上正常工作了。这时,我知道如果我继续测试并不断改进代码,那么CDE 有在多种实际的Linux程序上起作用的潜力。我制作了一个十分钟的介绍CDE的演示视频,搭建了一个包含视频和CDE下载拷贝的\href{http://www.pgbovine.net/cde.html}{项目网站},并把网址发给了我的几个朋友。我不知道的是,有一个朋友还在著名的计算机极客论坛Slashdot上帮我发了这么一个广告:
\begin{quote}
斯坦福的研究者Philip Guo开发了一个名叫CDE的工具,可以自动将Linux程序及其所有依赖环境(包括系统级的库,字体等等)打包,并能直接在另一台Linux计算机上运行,而不需要做设置库和程序版本,或者解决版本依赖地狱问题这些工作。他已经上传了二进制文件、源代码和视频截图。看起来应该对集群/云部署和程序共享有很大帮助。
\end{quote}
还不到24小时,Slashdot论坛上的那个帖子就有几百个回复了,我也开始收到几十封邮件,都是来自世界各地下载并试用了CDE的Linux热衷者的。其中有一些珍贵的来信,比如:“我就是想说你太棒了!这个创意能够实际起作用实在是令我折服。我会在我们墨西哥提华纳哲理\footnote{邮件原文为``hear'',是``here''(这里)的常见混淆词,两者发音相同,故翻译采用了“这里”类似发音的“哲理”。——译者注}的Linux社区里推荐使用这个工具。”这些来自实际用户的未经修饰的、随感而发的赞誉,比起那些来自研究同行们对我之前创意或者论文的表扬,对我而言意味着更多。
\breakline
从科研的角度来看,我的使命现在已经完成了:我成功地创建了CDE的一个初始原型工具,并证明它在一个实际用例上是可行的。大多数应用工程领域里的通常观念认为,像CDE这样的研究型原型工具就只是用来证明新颖想法的可行性的。研究者的工作就是创建出原型工具,实验性地评估它们的效率,写论文,然后开始又一个项目。作为研究者,期待人们像使用真实产品一样使用你的原型工具其实是很天真的事情;如果你的创意很好,那门专业的工程师自然会适当地修改它,形成他们公司未来的产品。最好的情况是,其他一些研究组可能会把你的原型工具作为基础,搭建出他们自己的原型工具然后撰写论文并引用你的论文(例如,有十几个其他大学的研究组拓展了Klee工具,并将他们改进的地方写成了论文)。但却几乎很少听到非科研工作者在他们的日常工作中会使用原型工具。总之,学术研究的目的是做出被验证了的想法,而不是精美的产品。
所以,当时正确的行动路线应该是提交一篇关于CDE的论文,然后开始想一个新想法,实现出一个新原型工具,提交一篇新的论文,再如此反复直到我有足够的内容来组成我的博士论文。我也确实提交并发表了两篇关于CDE的会议论文(\href{http://www.pgbovine.net/projects/pubs/guo_usenix11_camera_ready.pdf}{一篇介绍性的短论文}和\href{http://www.pgbovine.net/projects/pubs/cde_LISA.pdf}{一篇后续的长论文})。但我之后并没有像一个深谋远虑的研究者那样开始一个新项目,而是将我博士第五年的大部分时间都投入到将CDE转变成一个有产品质量级别的软件这一工作上去了。
我有很强烈的意愿让CDE使尽可能多的人受益。我并不愿意让CDE就此没落下去,沦为又一个刚够得上发论文的劣质原型工具。我知道改善CDE所付出的汗水将不会在科研界得到任何好处,甚至还有可能令我延期毕业,毕竟我本可以用这些时间来开发一个博士论文里的新想法。但我不在意,因为这一年剩下的时间我仍然有外源奖学金支持,拥有绝对的自由去花时间做一个公益性质的软件维护者,而不是一个被研究基金所累的传统型研究者。
回看我的第四年,我极度渴望地想让人们使用IncPy,这也是为什么只有可怜的三个用户时我还是很激动。尽管最终几乎没人接着使用IncPy,我想把它做成一个实际世界中工具的不理智愿望还是促使我接触到了伯克利的Fernando,而且也正是Fernando启发我做出了CDE。现如今,在2010年11月,我第五年开头的时候——在我的演示视频出现在Slashdot 网站上的几天内——CDE就已经有了几十个用户,而且还可能拥有得更多。从之前的反馈邮件来看,我意识到我做出了一个人们在多种我未曾预料到的情况下都想使用的东西。一言以蔽之,CDE引起了各种被依赖地狱所折磨的Linux用户的共鸣。
\breakline
我把第五年中的大部分时间都花在了修复CDE的漏洞上,使其能够在纷繁复杂的Linux程序上顺利工作;润色说明文档、用户手册,以及常见问题,使得它更易用;与世界各地的用户们邮件交流甚至是电话沟通;还做了不少报告,并发了些“营销”邮件来吸引新用户。
这时(2012年夏),CDE已经被超过10000人下载和使用了。我收到了用户们的上百封邮件,里面包括反馈、新特性要求、漏洞报告,还有一些有趣的轶事。尽管对商业软件产品来说,这并不是一个很大的数字,但对仅由一个研究生维护的免费开源软件来说,这已经是一个很大的数字了。
给我发了邮件道谢,并述说他们是如何在日常工作中利用CDE消除Linux的依赖地狱问题的轶事的用户有以下这么几类:
\begin{itemize}
\item NASA\footnote{NASA,即美国国家航空航天局(National Aeronautics and Space Administration)的简称,是美国联邦政府的一个行政机构,负责制定、实施美国的民用太空计划与开展航空科学及太空科学的研究。——译者注}研究员(Ames和JPL研究中心\footnote{NASA华盛顿指挥部为NASA的最高管理机构,此外NASA还下设多个研究中心,Ames和JPL分别为埃姆斯研究中心(NASA-ARC),和喷气推进实验室(NASA-JPL)。——译者注})
\item 来自诸如植物生物学和医学信息学这些领域的科学家
\item 将计算型实验部署到欧洲网格分布式计算架构\footnote{欧洲网格架构(European Grid Infrastructure)这一计划致力于利用网格计算技术在欧洲提供高通量计算资源。——译者注}中的科学家
\item 软件公司进行实验代码原型设计的工程师
\item 开源软件创建人和贡献者
\item Linux计算机系统管理员
\item 在各种基于Linux的非兼容操作系统变种上运行程序的Linux爱好者
\item 大型反病毒软件公司的计算机安全分析师
\item 非营利性技术项目“每个孩子一台笔记本电脑”中的程序员志愿者
\item 需要发布他们的研究原型工具的计算机系的博士生
\item 大学里开发诸如医学可视化和蛋白质结晶软件的程序员
\item 大学里需要打包编程作业的助教
\end{itemize}
那几个月是到那时为止我博士生涯最愉快的一段时光,即使我知道我维护软件的这些工作对我的博士论文不会有一点贡献。CDE取得了初步成功之后,我不再在意我是否会因为没有更多的论文,而延期一年或者几年才能毕业;得知了我发明的软件提升了这么多人的计算体验,我感到非常满意。
\breakline
CDE还让我实现了我长期以来的一个书呆子梦想:在谷歌做一个由YouTube在线直播的科技报告\footnote{谷歌科技报告(Google Tech Talks)是谷歌在视频网站YouTube上的一个草根节目,用来向技术社区分享有趣的信息。——译者注}。因为从读研究生一开始,我就喜欢在线看有关各种学科的Google科技报告。我梦想着有一天我也能做这么一个报告,但我也没抱太大希望,因为谷歌似乎只会邀请一些知名的教授或者工程师——而不是不知名的研究生——来做报告。
有一天我正在网上搜索和CDE相关的项目时,偶然发现我2007年暑假在谷歌实习时的实习经理最近在一个可重复性研究研讨会上发了一篇论文。我给他发了封邮件,把CDE作为一个使可重复性研究变得方便的工具推荐给了他,并询问他的同事们是否有兴趣试用一下。让我惊喜的是,他给了我一个以眨眼笑脸结尾的回复,并邀请我去做一个报告:“我看了看你的这个工具。看起来很有意思啊!你有兴趣来谷歌做一个科技报告吗?我会帮忙组织和宣传。不过不知道会有多少人来听,可能有100个,也可能一个都没有;-)”
比起先前的报告,我花了更多的时间来准备在谷歌的科技报告,因为我知道这次报告会被录像。\href{https://www.youtube.com/watch?feature=player_embedded&v=6XdwHo1BWwY}{我的报告}进展得很顺利,而且讲完以后谷歌的一个工程经理(我之前从未与他谋面过)还把我拉到一边,问了一些更细节的后续问题。看得出他对缓解公司内部的Linux依赖地狱问题很感兴趣,这也是为什么他喜欢我的报告的原因。他还给我提供了一个实习生职位,我可以在即将来临的这个暑假来谷歌开展有关CDE的工作。
我很高兴他能给我提供这个实习职位,也花时间深思熟虑了一番。我们系的教授通常不鼓励博士后半期的学生去实习,因为他们希望学生们能更专注于完成他们的毕业论文。并且,获得这个实习职位时,我还没有发表过哪怕一篇能够用到博士论文中的第一作者论文(有几篇论文正处于审稿阶段),所以我有点担心暑假离开斯坦福会给Dawson留下一个我并没有认真对待发表论文和毕业的印象。然而,我内心的直觉又认为这是一个我不能拒绝的绝无仅有的合适时机:我可以获得一份很不错的薪水,在暑假里继续开展我自己的开源项目工作。相反,几乎所有的实习生——包括我2007年实习时——都只能在经理分派的公司内部项目上开展工作。我和Dawson聊了聊我这一左右为难的感受,他很支持我去实习,于是我接受了这个实习邀请。
我在谷歌度过了很棒的2011年暑假,把我几乎所有的工作日都投入到提升CDE、获得新用户、找到Google内的一些独创性的用途上去了。那个暑假的部分时间,我还和一个谷歌工程师开展了紧密的合作,他觉得CDE对他的日常工作很有帮助,这也是我修复新漏洞、改善文档的一大动力。这时,我也没再继续想和CDE相关的新研究想法了:我只是研究细节并继续改善CDE。在暑期实习结束、我博士第六年开始时,我最终停止了在CDE上的全职工作。
在构成我博士论文的五个项目当中,CDE是我最喜爱的,因为这一简单优雅的创意最终变成了一个拥有超过10000个用户的实用工具。它是目前为止从科研角度来说最不复杂的一个研究想法,但却是工作起来最令人满意的一个,因为它和实际世界有着紧密联系。
\breakline
回到我第五年开始时——那时距我IncPy、SlopPy和CDE的论文发表还有很长一段时间——我计划了一个备份方案,以防我自己的项目失败。我给我们系里的一个和我研究兴趣相仿的新任助理教授Jeff发了封冷邮件,询问他是否愿意和我合作一个能够用到我博士论文里去的项目。我提到的两个关键“卖点”是我有自己的资金支持,而且也愿意把投论文到他喜欢的顶级会议作为自己的目标。而作为交换,他需要担任我的论文委员会的成员。
和料想中的一样,他接受了我的提议。对他来说这是一个极佳的协议,毕竟我们的出发点十分契合:我是一个需要发表论文来毕业的高年级学生,而他是一个需要发表论文来获得终身教职的助理教授。更好的是,他不需要使用他的研究经费来负担我的开销。而最好的一点则是我愿意做任何他想要我做的项目,因为我原来的那些个人项目已经给了我一直渴望的研究独立性。
我用这个计划来规避赌博的风险:如果我IncPy、SlopPy和CDE的想法不能得以发表的话,那我至少还有论文委员会成员Jeff批准的一个“正当”项目。Jeff和我认为对我来说最好的策略就是,以他的另一位学生去年创建的交互式数据格式重建工具Wrangler为基础,继续开展工作。
在第五年的末尾,我停止了在CDE上的工作,并花了两个半月来新做了一些Wrangler的拓展功能。我的这个增强版本叫做“ProWrangler”,代表\emph{\textbf{Pro}active \textbf{Wrangler}}。 在实现了ProWrangler,并请同学来做控制性的用户测试从而评估了它的效率之后,我在Jeff和原始版Wrangler工具的几个原创者的帮助下,写了一篇论文并投稿到了一个人机交互的顶级会议。
在2011年暑假进行到一半的时候,我收到了我们\href{http://www.pgbovine.net/projects/pubs/prowrangler_uist11_camera_ready.pdf}{ProWrangler的论文}被接收且审稿意见很不错的好消息。到这时为止,这个成果最大的贡献者就是Jeff在论文中引言和评估结果解释部分的撰写工作。我们的用户测试其实并没有展示出我们原本所期待的生产力提升效果。但不可思议的是,Jeff的专业写作和议论的谋篇布局技巧把这个几乎失败的工作变成了一个惊喜的胜利。审稿人们很欣赏我们诚实地承认了评估环节的缺陷,并从中提取出了有价值的东西的这一做法。毫无疑问,如果没有Jeff在写作修辞方面的老练,我们的论文绝不会被接收。他有很多实践经验,在还是一个博士生的时候,他就发表了19 篇基本全都是顶级会议的论文,这是一个普通博士生发表数的五到十倍。这也是获得一个像斯坦福这样一流大学的教职所需要的硬性条件。
\breakline
在我的整个第五年中,我一直得为四个项目——IncPy、SlopPy、CDE和ProWrangler——来仔细地分割时间来发展思路、实现原型工具、提交论文、修改论文、再次提交论文,这四个项目的相关会议的论文提交截止时间遍布于整个这一年中。虽然我花了不少时间来培育CDE项目,但当论文提交截止日期来临的时候,我还是得转而专注到其他项目的工作上去。2011年暑假时,这四个项目的论文都成功发表了,它们大都经过了好几轮的论文修改。我也终于松了口气,因为我复杂的计划终于有了回报,而且一个完整的毕业论文也似乎触手可及了。
%%% Year Six: Endgame
\mychapter{第六年:尘埃落定}
在我第五年快结束时——我去谷歌夏季实习之前——我和Dawson见了一面并问了问如果我想在接下来这一年毕业需要些什么。那时,IncPy和CDE都作为二级会议论文发表了,SlopPy是一篇研讨会论文,ProWrangler的论文还在审稿中。Dawson表达了担忧,他认为我的论文发表记录还不足以毕业,所以我需要一个或者多个更实质性的贡献来形成我的博士论文。他的期待似乎也是合理的,所以我的计划是在秋季回到斯坦福,花几个月来做一些能够完成我的博士论文的新研究。但我担忧的是我已经在过去几年的高度研磨中变得精疲力尽,再没有新的创意萌芽了。所以我又回到了计划模式,想想有什么方法能完成最后这未知的、能使我毕业的工作。
作为我策略的一部分,我还需要找到第三个(也是最后一个)能够为我的毕业做强有力担保的的论文委员会成员。我们系大多数的博士生不用计划这么多,因为他们做的都是教授批准的项目。他们不用为其他两个论文委员会成员是谁而感到压力,因为他们的导师会为他们的毕业担保,而其他委员会成员通常也是会同意的。然而,我的情况却很特殊,因为我并没有做Dawson有热情的项目,所以我也不可能指望他能由衷地认可我的工作。有Jeff在我的委员会里能起到一点帮助,毕竟他个人也参与到了我们ProWrangler的项目中,并且可以为它的合格性负责。但我仍然还需要一名同意我毕业的委员会成员。
我最先给我之前在MSR的经理Tom发了邮件,向他提出了我的想法,希望在2011年秋季到MSR实习几个月,做一个能够放到我的博士论文里去的新项目。我希望他加入我的论文委员会,这样我就可以把2009年暑假实习时和他发表的三篇论文也放到我的博士论文里去。可惜他似乎对我的这个想法不太感兴趣,我也就没有再进一步劝他了。
之后我又想了想将SlopPy从一篇研讨会论文拓展成一篇完整的会议论文的可能性,这样它就“算得上”是我博士论文里的一个实质性贡献了。之前在我第五年的时候,我和MIT的教授Martin聊过一次,正是Martin有影响力的论文直接启发了SlopPy这个创意,我和他谈了谈关于一起合作把SlopPy拓展成一篇会议论文的事。他对这个合作很感兴趣,但是当时我们并没有安排出时间表,因为我在这一年的末尾一直忙于CDE和ProWrangler的工作。不过现在,我发现如果我能利用第六年开始的几个月时间和Martin合作,并让他加入我的论文委员会的话,这也许可以成为我毕业的通行证。Dawson也喜欢这个计划,因为(意料中的)他也曾经想过如何把Klee之类的想法和SlopPy结合起来。我准备在暑假中期给Martin发邮件提出这个合作建议,不过在此之前,另一个更好的机会出现了,于是我也没再继续这个计划。
当我在谷歌开始我最后一次暑期实习时,我期望我可以在这无忧无虑的三个月里完善CDE,但我还是感到了一丝担忧,因为回到学校以后我的毕业问题还是没有保证。我需要再有一个灵感的爆发,而这个灵感最后来源于一个意想不到的地方。
\breakline
2011年夏天,我最终决定了毕业后就从学术界“退休”:我并不知道我会选什么来作为自己的职业,但我并不打算在接下来这一年申请终生制的大学教职工作。
我做出这个决定有两个原因:首先,我感觉我当前的论文发表记录还不够令人印象深刻来让我获得一份不错的终生制教职工作。几个月之后当我悲伤地看到几个发表记录比我更胜一筹的同学竟然都没有获得任何工作时,我的这种感觉更为坚定了。当然,我还是可以试着做几年博士后(博士之后的临时研究员),发更多的文章,然后再次申请教职工作。
但第二个、也是更为重要的一个原因让做博士后也对我毫无意义:我特别有热情的那几类研究主题并不那么容易获得研究基金,因为它们不太被现在的学术机构所认可。没有经费,就不可能给学生付工资。没有上进的学生来在艰苦的苦力劳动中研磨,就不可能获得被认可的论文。而每年没有足够量的发表数量,就不可能获得终生教职。就算是我获得了终身教职,我还是需要新的经费来给新的学生发工资,来让他们帮助我实现出我的想法;申请经费的这个循环永无止境。考虑到我的研究兴趣,我内心并没有准备好在这些硬战中作斗争,来让经费机构认真考虑我的提案。为了说服同行审稿人接收我的论文,我已经度过了足够困难的一段时间;而经费审查人会更严苛,因为他们掌管着几百万美元,也更愿意把钱拨给那些做计算机科学科研中主流研究的同行们。
几年来我一直在思考离开学术界,而现在我觉得我有了合理的原因来这样做:我领教了计算机科学中的“学术游戏”是怎么玩的,也知道我并不想再继续玩下去了。在一封发给我的一位即将履新的助理教授朋友的邮件中,我总结了一下我的感受:“通过过去的五年,我发现我更愿意做一个科研的旁观者,作为一个新研究的持续不断的生产者的负担对我来说实在是太重了。”
因为我的母亲是一位极其成功的教授,我的父亲也非常认同学术界,所以告诉他们我的这个决定还是有些困难的。我觉得他们不能真正理解我的想法;我怕他们觉得我是在现实中放弃自己,低估自己;我不把当一个教授作为一个实际目标也有几年了。经常说到的学术界一大好处就是创造性自由的诱惑,但我离开学术界的决定却实际上也在博士最后一年和找工作时解放了我的思想,让我能在追寻我真正的职业热情时更富有创造性。
\breakline
决定离开学术界后,随之而来的一个影响就是,在夏季我要出席做报告介绍IncPy、SlopPy和CDE的三个学术会议上,我不用再忧愁该如何去“交际”。学术会议上高年级博士生、博士后,还有即将获得终身教职的教授都会争相攀谈,以此来给资历深的同事们留下一个好印象。对这些资历较浅的研究者来说,会议上的职业交际也是一个需要认真对待的全职工作,因为他们初期的职业生涯和学术声誉都依赖于在这方面的良好表现。但由于我已经从这种学术游戏中脱身,我也就不用再在意这些事,可以尽情享受自我,不用再紧张和圆滑。
在其中一个会议的中间休息时,我发现Margo独自坐在那里,在她的笔记本电脑上做些什么。读者可能还记得,我博士第四年的时候去圣何塞的研讨会做报告,介绍我最初的IncPy 论文时,第一次遇见了Margo。我内心辩论了一下要不要过去和她打个招呼,并重新自我介绍一下。我内心有些担心她已经不记得我是谁了,况且我也没有什么有意思的东西告诉她。但由于我马上就要从学术界“退休”了,我也没有什么闲谈的议程,所以就算这个对话最后搞砸了,我也没有什么损失。于是我走了过去打了个招呼。我提醒了她一下我们之前是如何见过面的,她也似乎还记得我。我简要地告诉她我马上就要去做一个报告介绍我新的CDE项目,然后就要赶一班飞机飞回加利福利亚。我们简短地花五分钟聊了聊CDE,然后我就跑去做我的报告去了。当天晚上到家之后,我给她发了封后续邮件,里面附了一个\href{http://www.pgbovine.net/cde.html}{CDE项目网页}的链接,因为想到可能她的学生会有兴趣在科研中使用CDE。这只是我向同行们推荐CDE时常规的礼貌性邮件,因此我其实并没期待她的后续关注。
两周之后,我惊喜地收到了一封来自Margo的邮件,她说她和她的学生Elaine聊了一下我。他们两个都希望我博士毕业以后到哈佛大学去,以博士后身份和他们一起工作几年。围绕IncPy和CDE项目的宽泛研究主题,正好与Margo创建帮助计算型研究者更高产的工具的兴趣相一致。我很高兴她给我提供这个职位,但这个机会对我来说没有多大意义,因为我已经决定要离开学术界。再做一个博士后对我来说也没什么用,因为做博士后的主要目的一般都是提升个人简历,以此增加获得大学教职工作的几率的。
这时灵感又来了。由于我毕业前正迫切需要一个更实质性的项目和一个论文委员会成员,我向Margo提出了这个反转提议:我询问我是否可以在2011年秋季访问哈佛四个月,与她一起在一个项目上开展工作,而不是博士毕业后去做博士后。我和她可以在2012年1月提交一篇论文到一个会议,并把这个项目作为我博士论文的最后一个组成部分。我还问了她是否可以担任我论文委员会的最后一个成员。Margo很喜欢这个想法,但她已经没有足够的经费来支持我了,因为她还需要用经费支持她自己的学生。我和Dawson聊了下,他很大度地愿意出经费支持我这几个月,即使我没有在Klee上开展工作(我的外源奖学金那时已经到期了)。Margo很高兴地同意了这个安排,于是在2011年9月我结束暑期实习之后,我就去了马塞诸塞州的波士顿,开始了我研究生的第六年、同时也是最后一年的生活。
如果我没有积极地抓住幸运地降临在我身上的这些机会的话,研究生最后的这段征途也不会变成可能。如果两年前Robert没有告诉我圣何塞的那个研讨会,如果我没有投稿并做报告介绍了IncPy的论文,如果Margo不喜欢我的论文并且也没有把我介绍给Elaine,如果我没有一直和Elaine保持联系,如果我在上个夏季介绍CDE的会议上没有主动和Margo再一次打招呼,如果她没有给我发一封亲切的后续邮件,而我也没有冒险向她提出不寻常的反转提议的话,那么我现在还在斯坦福,挣扎着四处寻找最后一个项目和论文委员会的成员。
\breakline
作为一个访问研究员,我在波士顿度过了非常快乐和高产的四个月。景色的改变很提神:我可以高强度地专注于科研,回到家后也没有那些通常的生活杂事。Elaine帮我找到了一处绝佳的一居室公寓住宅,距离我的办公室只有五分钟的步行距离,我还可以很容易地在校园里或者哈佛广场买到食物。这个完美的起居安排让我得以全神贯注于我的工作,不受任何的打扰。
我的第一个月基本都用来和老同学老朋友们社交了,因为我的母校MIT就在哈佛附近。我还和Margo会面了几次,讨论了可能的研究想法。她对我在她宽松的指导氛围下做自己的项目持开放态度,所以我也得到了几乎全部的思考自由。然而,我也在头脑风暴中采取了一个务实的方式,因为我想让她对我的项目感到兴奋,并强有力地支持我把它放到我的博士论文中去。因此,我也读了她最近的一些论文和资金申请书来了解她的科研理念,从而我可以让我的想法去迎合她的品味。这时,我已经懂得了保持与老资历的合作者(以及论文审稿人)的主观偏好相一致的重要性,即使我是在一个所谓客观的技术领域内做科研。
想了几个创意之后,我提出了个Margo喜欢的东西:一个用来监视研究人员基于计算机活动并帮助他们组织实验和记录实验笔记的工具。这是传统型电子实验室笔记本的一个创新性转折。Margo开玩笑地建议到把“BurritoBook”作为临时的研发代号来描述我们计划的这个工具,因为它无缝地覆盖到了对用户常规工作流的活动监视中的很多层\footnote{``Burrito''意为墨西哥卷饼,是一种将肉、豆、生菜、碎奶酪等食品和各种酱料放在墨西哥薄饼上,并把饼卷起来完全包紧的食物。Margo取名的含义应该是比喻这个项目涵盖了用户工作流中很多不同的方面,正像卷饼中包含了各种食材一样。——译者注}。后来Elaine把它简称为“Burrito”,我也渐渐习惯这个简称,最终它也成为了官方的项目名称。
当时,我还以为我Burrito的创意自发地来源于对自己的想法和Margo的偏好这二者的结合,但当我回顾了我之前的一些笔记后,我意识到类似的创意其实已经在我脑里酝酿几年了。早在研究生二年级,当我想监控人们是如何编程时,我就最初想到了类似Burrito的创意,后来在第五年一开始我想拓展IncPy来记录基于Python的编程历史时,我又有了更为具体的想法。我的研究生从始至终,我都一直以多种专门的形式记着研究实验的笔记,来记录搭建原型工具和运行试验的过程,因此我个人也体会到了和笔记记录相关的低效问题带来的痛苦。最后,虽然我并不是一个HCI(Human-Computer Interaction,人机交互)研究者,但我第二年与Scott和Joel、第五年与Jeff工作时的人机交互训练给了我对于用户需求的敏锐敏感性,这对我对Burrito的设计也影响深远。
我花了几个星期拟出了Burrito的高层面计划,并与Margo讨论了下初期的设计细节。很多对初始想法的改进来自于我对计算型研究者工作时的观察,和对他们管理各种各样的实验笔记、代码,以及数据文件时所面临挑战的采访;我大多数的观察样本都是Elaine在MIT和哈佛的多个科学实验室的朋友。在Rob领导的实验室组会上做了一个关于Burrito 方案的报告之后,我还获得了一些有用的早期反馈,这位Rob就是在我博士二年级刚开始时鼓励我去和Scott与Joel工作,追寻我的人机交互兴趣的那个MIT教授。
\breakline
社交时间结束之后,就是研磨的时间了。在2011年11月初,我在研究生阶段最后一次转变成编程的野兽,来把我Burrito的想法实现成一个能工作的原型工具。我连续72天进行了编程工作,在这两个半月中只间歇性地休息了5天。这是迄今为止我所承受的最长的、几乎是痛苦级别的、不停歇的、高强度工作。我第五年时初始时CDE的爆发式工作也才是21天的研磨而已,而这次却几乎是那次的三倍。我工作一直贯穿了感恩节、圣诞节、新年夜,不顾一切地专注于让Burrito工作得足够好的目标,从而能在2012年1月之前提交一篇会议论文。
这几个月里,我变成了一个反社会、坏脾气的人,躲避一切纷扰,深深地沉浸在自己的工作中。我所思考的一切就只有计算机代码;除了每周与Margo会面报告进展时,我几乎不说连贯的英文句子。虽然我的外表和动作都像一个准人类(即,不修边幅、衣冠不整),我的内心状态却是欣喜若狂的。我每天都要编程和调试十余个小时,但我的脑子还是很放松的,因为我的技术技艺应付所面对的挑战已经是游刃有余了。这时我已经积累了足够多的经验来设计、实现和“营销”研究型原型工具了,我也有信心我的能力能让这个项目成功工作。一路上我都获得了Margo的极好反馈和支持,因此我觉得她会强烈支持我把Burrito放到我的博士论文中去。经历了研究生早期在不确定并且失败的项目上数年的研磨之后,我现在感到精力充沛,并朝一个我知道能够实现的目标紧张地工作着。
2012年1月中旬前,Burrito原型工具已经具有了个良好的状态,于是我进行了一个非正式的评估,撰写了一篇论文,并按计划将其投稿到了一个会议。我休息了几天,重回正常人的状态,与波士顿的朋友们告别,然后飞回到加利福利亚,迎接我博士生涯的尾声。
\breakline
关于一篇博士论文是如何形成的普遍观念是,一个学生灵光一现,受到启发,提出了某个有洞察力的聪明的想法,然后就花几年时间,边啜饮上百杯的拿铁和卡布奇诺,边撰写鸿篇巨著。在众多科学和工程领域,这种看法是完全不准确的:“撰写”工作仅仅是把一个人已发表的论文合辑成一个单独的文档,并填充一些引导性和总结性的章节内容。在一个学生坐下来“写”毕业论文之前,所有的挥洒汗水的辛苦劳动其实都已经做完了。
在我们系,一个博士生生涯最重要的里程碑就是他们的导师向他们\emph{竖起拇指}、让他们开始撰写论文的那一刻。这个手势代表这个学生已经做了足够的工作——通常是发表了主题一致的两到四篇会议论文——并且有资格在几个月内毕业了。
当我2012年1月回到斯坦福时,我的目标就是尽快获得Dawson那至关重要的\emph{竖起的拇指}。我写了一个短文档,列举了一些证据表明为什么我觉得我做的工作够得上毕业了。我的论据很简单:我创建了五个新颖的软件工具来改善计算型研究程序员的工作流——IncPy、SlopPy、 CDE、 ProWrangler和Burrito——并从我的身体力行的工作中发表了1 篇顶级会议论文,3 篇二级会议论文,以及3篇研讨会论文(Burrito的那篇会议论文投稿最终被拒收了,所以我们重新投稿并发表在了\href{http://www.pgbovine.net/projects/pubs/guo_burrito_tapp_2012.pdf}{一个研讨会上})。还有一个额外的收获就是,我的另外两个论文委员会成员,Jeff和Margo,都会认可我的毕业,因为我和他们一起成功地完成了项目(分别为ProWrangler和Burrito)。我把这个文档通过邮件发给了Dawson,然后焦急地等待这他的回复。我觉得我的理由还算挺充分的,但我还是不确定他会不会希望我再多做一些工作才同意我毕业。让我大松一口气的是,他很快就向我\emph{竖起拇指},也是这时我知道我已经实质上完成研究生的学业了。
我花了接下来两个月的时间把我的论文合并成一个230页的题为\emph{促进研究型编程的软件工具}的文档。以下是我博士论文第一页的摘要(总结):
\begin{quote}
研究型编程是一种编写程序,以期对数据进行深入理解为目标的编程活动。上百万名科学、工程、商业、金融、公共政策以及新闻业的从业人员,还有众多的学生和计算机爱好者,都在日常的工作中进行着研究型编程。
我的论文即是,理解了研究型编程中所面临的独特挑战后,就有可能应用动态程序分析,混合主导推荐系统,和操作系统级别的追踪技术来使研究型编程更高产。
本论文刻画了研究性编程的过程,描述了研究型编程所面临的典型挑战,并提出了五个我所开发来解决一些关键挑战的软件工具。1)ProWrangler是一个交互式的图形工具,可以帮助研究型程序员在分析前对数据进行格式重置和清洗。2)IncPy是一个Python解释器,可用来加速数据分析脚本循环,并帮助程序员管理代码和数据的依赖。3)SlopPy是一个Python脚本,可以自动地使已有脚本容错,从而也使数据分析脚本循环提速。4)Burrito是一个基于Linux的系统,可以帮助程序员组织、标注和回顾之前实验中的洞察力。5)CDE是一个软件打包工具,它使得部署、存档和代码共享更加容易。综上所述,这五个工具使得研究型程序员能够通过减轻计算机数据管理和数据起源方面的负担,来更快地迭代和发现可能的洞察力。
\end{quote}
我花了很多精力来增添一些导入性和总结性的章节,让我的论文不仅仅是五个我前几年搭建的单独工具的说明。在我的撰写过程中,Jeff和Margo都给了我很好的反馈,告诉我应该如何以一个更实质性的知识角度来搭建叙述我研究贡献的框架。尽管我知道最终不会有什么人来读我的博士论文——构成博士论文的那些单独的论文共容易获得——我还是很满意能将我所有的创意、洞察力、工具说明和评估结果聚集在一起,形成\href{http://www.pgbovine.net/projects/pubs/guo_phd_dissertation.pdf}{一篇紧密结合在一起的文档}。
\breakline
我把我的口头答辩安排在了2012年4月23日。最大的挑战是找到一个五位教授(我的三个论文委员会成员和另外两个答辩委员会成员)都有时间的两小时。Margo那一周正好来加利福利亚参加一个会议,所以我围绕她的日程来安排答辩。在我们系,口头答辩的形式是学生先做一个小时的公开报告,总结他的毕业论文研究,接着的一个小时是私下会议环节,由委员会询问测试性的问题。之后,委员会投票决定是否通过这个学生的毕业论文。实际上,几乎没有人的答辩会不通过,除非他的表现实在是太差了:委员会通常会先通读一遍学生的毕业论文,同意之后才让会学生参加答辩,所以这应该不会有什么意外。
在口头答辩上我没有足够的时间介绍全部五个项目,因此我选择介绍三个项目,其中每一个都是和论文委员会中的一个成员合作的:与Dawson合作的IncPy,与Jeff合作的ProWrangler,还有与Margo合作的Burrito。大多数博士生都只和他们的导师合作发表文章,所以能够展示和所有三位委员会成员合作的研究是一份难得的荣幸。我也很高兴很多朋友和之前的同学——包括Scott、Joel、Peter、Robert、Greg和Fernando——都来出席了我的答辩。
尽管我研究生期间已经做过了十几个学术报告,我答辩时还是比以往更紧张,因为我认识听众里的每一个人。很奇怪,当一个房间里都是陌生人而不是熟悉的面孔时,我反而感觉更轻松一些。私下会议环节没有我预想中的那么累人,但我的委员会确实提出了一些最终帮助我改善了毕业论文的问题和建议。
我通过了答辩以后,我的委员会成员和朋友们都很有礼节地以一个亲切也是预想中的方式向我表示了祝贺。我最为珍视道贺来自于一个我只和他说过一次话的资深教授。他出现在我的答辩会上时我还有一丝惊讶,因为我觉得他不会对这个主题感兴趣。答辩之后,他发邮件赞扬了我的报告:“我想说我非常喜欢你的答辩,一部分是因为这个工作的创造性,一部分是因为这是一个准备充分的报告,还有一部分是因为我前一年都在做研究型编程工作。”
\breakline
从科研的角度来看,在我那一年的26个斯坦福计算机系的博士毕业生中,我觉得我是极其平庸的一个,因为我大多数的论文都只是二级会议,也没有很好地被学术圈所认可。我的博士论文也是尴尬地横跨了几个计算机子领域——编程语言、人机交互和操作系统——因此我的工作也没有被其中任一领域的顶级学者认真对待。
尽管没有得到主流的认可,我还是觉得我的博士生涯画上了圆满的句号,因为我成功地让我的创意结出了果实,并且以一个我十分引以为豪的博士论文成功毕业。我的博士采取的是一个高度创业型的路线——伺机地寻找项目和合作者,在非传统和遵守惯例二者中间又辟出了一条路使得我的论文得以发表。我感到非常幸运能够以一种富有创造性的方式来安排我的博士生涯;如果没有在斯坦福六年中前五年的外源奖学金支持,我不会有如此多的自由。
最终,我的博士论文也像大多数博士论文那样,将人类知识的边界向外拓宽了非常非常小的一点。我做的这五个原型工具包含了一些有意思的想法,可以被将来的研究者们加以改进。其实,如果将来的研究人员能够引用我的论文作为粗糙的初始研究的例子,并以此说明为什么他们的技术更高端,那么我将非常荣幸。这也是科学研究是如何一步一步向前推动的:后一代总是在前一代想法的基础上建造自己的工作。
然而对我来说,我论文最重要的贡献不是那五个特殊的原型工具,而是我发现了一个普遍的问题——迎合大量且日益增长的计算型研究程序员的需求的软件工具非常缺乏——并提出了一些人们可以用来提升生产力的早期原型解决方案,据我所知,我是第一批这样做的计算机科学专业的博士生之一。我相信这些思路在接下来的十年会变得尤为重要,但由于我要从学术界退休了,我也就不再致力于直接推销它们了。
因为我的博士论文主题离成为主流还有很长一段距离,所以想以它里面的想法为基础,继续发展自己学术生涯的初级教授或者科学家需要奋力拼搏,来获得资金会机构的认可,因为这些人是新项目立项的把关人,还需要获得他们老资历同行的认可,因为这些人是论文发表和终身制审核的把关人。如果有任何人想投入到这个荣耀的战役中去,我很愿意帮助他,但我却不够勇敢把我自己的生涯放到这上面去。相反,我现在计划去追求一个完全不同的职业热情,可能某一天它会成为我另一本书的主题:-)
\breakline
在准备撰写本书的过程中,我翻阅了很多原来的研究笔记。有一天,我发现了如下这个关于一个我有兴趣深入研究的话题的小片段:
\begin{quote}
研究一下开发一些工具来提供给非软件工程师,或者说是工作中需要编程的科学家、工程师和研究人员——他们不会在意参数、模型检验等等——他们只需要实用、轻量级、并且概念上简单的工具,能够随时就能拿来用。
\end{quote}
让我吃惊的是这个笔记是我六年前写的,也就是2006年夏天我即将要开始我在斯坦福的博士生项目的时候。这是一段漫长、迂回、而且不可预料的旅程,但我还是由衷地高兴我能够把这一宽泛的话题——这几年来吸引我的若干话题中的一个——变成了我的博士毕业论文。如果没有罕见的各种好运组合在一起,没有我个人的主动性,没有来自慷慨的朋友们那些富有洞察力的推动,以及接近一万个小时的研磨,这个成就不可能变为现实。
%%% Epilogue
\mychapter{结语}
\emph{如果你不打算做一个教授,那为什么还要受累读一个博士呢?}这个常见问题非常重要,因为大多数博士生都不能获得一份像他们大学里的指导者以及行为榜样——终身制教授—— 一样的工作。空缺的教职职位并不多,因此大多数博士生是在为一份他们永远不会得到的工作而训练。(想象一下,如果医学院或者法学院的毕业生不能分别得到医生和律师的工作,那该多令人惶恐。)
那么为什么会有人在不打算做教授的情况下,还花六年甚至更多的时间来攻读一个博士学位呢?每个人的动机不尽相同,但一个可能的答案是,博士生项目给某种类型的人提供了一个安全的环境,驱使他们超越他们精神上的极限,最终变得更强。比如,我六年的博士训练让我比起还是一个研究生新生时,变得更加智慧、有悟性、坚韧、刚毅、专注、有创造力、有口才、感觉敏锐,并且专业地高效。(两个明显的警示:不是每一个博士生都能如此受益——很多人也因挣扎而变得厌倦、疲惫不堪。当然,也有很多人在没有读博士的情况下,同样培养出了这些积极的品质。)
有个不太恰当的类比:\emph{为什么有人会花数年的时间训练,来在类似铁人三项这样的比赛中超过他人——铁人三项是一项极度折磨人的比赛,包括2.4英里的游泳,112英里的自行车骑行,以及26.2英里的长跑——而却不打算成为一个职业的运动员?}简而言之,这种经验驱使人们突破他们身体上的极限,最终变得更强。从某种意义上来说,读博士就是智力上的高强度体育训练。
\breakline
下面是我博士生涯中学到了最值得记住的二十条经验。我分享出来的原因不是为了主动给学生们提供一些建议,毕竟每个博士生的经历都有很大的不同;也不是因为要鼓励大家去读博士,毕竟这些经验可以来自多种地方。这个章节其实是作为我读博士过程中收获的总结。
\begin{enumerate}
\item \textbf{结果胜过目的:}如果一个人做出了很好的结果,那么没有人会去问他一开始的目的是什么。我研究生阶段从来没有过所谓的纯粹知识上的动机:我开始读博士是因为我对工业界工作的不满意,给自己施压来想出项目是出于对不能按时毕业的忧惧,帮助Scott、Joel以及Jeff做人机交互的项目是为了对冲我赌博的风险。但我最终成功了,因为我做出了结果:五个原型工具和若干篇论文。在这个过程中,我培养起了我对项目的热情,并为我的项目感到自豪。相反,我知道一些有着最理想主义目的的学生—— 梦想着并热切地希望彻底变革他们的领域——但他们没做出什么结果,最终他们的幻想也破灭了。
\item \textbf{输出胜过输入:}获得博士学位的唯一途径就是成功地产生科研输出(例如,发表的论文),而不仅仅是靠上课或者读他人的论文这些吸收来输入。当然,一个人能产出成果之前的吸收也是有必要的,但也很容易过分吸收。我第一年时就曾掉入过这种陷阱,我漫无目的地读了几百篇论文——一种狂欢式的吸收——却未从这一没有方向的阅读中综合出任何有用的东西。相反,对毕业论文项目的相关工作文献的搜索则有效得多了,因为我的阅读是紧紧朝着一个清晰的目标的:找出竞争者,以及可以修改加到我自己的项目中的好创意。
\item \textbf{找到相关的信息:}我的博士训练教给了我如何在每一个时刻,高效地找到我所需要的最相关的信息。与传统的课堂学习不同,当我做科研的时候,我并没有教材,没有课堂笔记,没有授课教师提供给我的标准答案。有时候我工作所需要的东西会在一篇研究论文里,有时候会在一段陈旧的计算机代码里,有时候会在一个隐蔽的网站上,有时候又会在某个需要我找到并寻求帮助的人的大脑里。
\item \textbf{创造幸运的机会:}整个研究生阶段,我获得了好几次不可思议的好运,最后一年我得以到哈佛和Margo一起工作时,是我好运的顶点。但如果我没有反复地把我自己和我的工作展示给他人的话——作报告,和同行们交流,寻求并提供帮助,表达谢意,这些幸运的机会也并不会出现。其实我的大多数努力最终都没有变成意外的收获,但如果我没有持续尝试,那么我可能也不会这么幸运。
\item \textbf{博弈游戏:}作为一个博士生,我处于社会等级的底层,没有能力去改变这个“学术游戏”。具体而言,尽管我惧怕我的论文一次又一次地被拒,我也没有其他办法,只能继续学着怎么尽自己所能去玩发表论文的游戏。然而,我很高兴我在我研究生的后半期,用自己独特且有创造力的方式来玩这个游戏,从事着很多非传统的项目,与此同时也很好地遵守着发表和毕业的“规则”。
\item \textbf{从底层做起:}在了解了年长博士生、教授以及其他老资历同事们的动机和个性之后,我也能够把我自己的研究动机提上他们的日程了。例如,当我通过阅读Margo的论文和资金申请书,知道了她的研究品味之后,我想出了一个我和她都很有热情的项目创意(Burrito)。如果我对她的兴趣一无所知,那么想出一个她也喜欢的创意就会困难得多了。
\item \textbf{教授也是人:}尽管这一点听起来十分显然,但大家却很容易忘记教授并不是无情的科研生产机器这一点。他们也是正常人类,有着自己的品味、偏好、兴趣、动机、不足和恐惧。即使是备受尊敬的科学智者也有他们主观的、不理性的怪癖。从一个学生的角度来说,由于教授是学生发表论文、毕业和未来工作的把关人,因此对教授既是专家也是人类这一点心领神会很重要。
\item \textbf{争取受人欢迎:}当我和喜欢我的人一起工作时,我更高兴也更高产。当然,让所有同事都喜欢自己是不可能的,因为大家的个性不可避免的有着差异。总的来说,我努力地找出天性就和我相处融洽的那些人,然后再花时间来培养这份关系。
\item \textbf{尽一些义务:}作为一个资历较浅的实验室成员,尽一些义务、做一个“好士兵”是很有必要的,而不是从第一天就开始提一些蛮横的要求。当还是MIT的本科生和硕士生的时候,我就履行了我的义务,我在一个教授同意的、有资金支持的项目上工作了两年半,而不是尝试创建自己的项目;我得到了满意的回报,被排名最高的几个博士生项目录取,还获得了两个外源奖学金,可以用来支付我五年的研究生费用。后来,当我刚来到斯坦福时,我也履行了义务,在Klee 项目上工作了相当长的一段时间,直到最后退出。我也花了几年时间来弄清楚什么时候要听从权威人士安排,什么时候可以稍稍自私地推进自己的议程。
\item \textbf{拒绝不好的默认安排:}默认安排通常没有为底层人员(例如博士学生)的最大利益考虑,所以知道什么时候拒绝,并请求换一个不同的安排是很重要的。当然,并不会有针对学生的邪恶阴谋;默认的安排只是自然地设定下来使当权者收益。举个例子,像Dawson这样的知名终身教授,很轻松就可以获得为期数年的资金来支持学生,让他们在类似Klee的“默认”项目上开展工作。只要不时的有论文发表出来,那么这个教授和他的项目都会被认为是成功的,而不会有人在意有多少学生在路途中摔倒和失败。学生们必须自我判断他们被默认安排的项目是否有前景,如果没有的话,就需要想办法以一种合适的方式退出这个默认项目。
\item \textbf{知道什么时候该退出:}在第三年结束时退出Klee项目是我研究生阶段最关键的一个决定。如果我没有退出Klee,那么就不会有IncPy,不会有SlopPy,不会有CDE,不会有ProWrangler,也不会有Burrito;有的只会是三年或者更长时间的痛苦的增量式进展,以及随之而来的一个“勉强的毕业”。
\item \textbf{从失败中站起来:}失败在研究生阶段是不可避免的。我前三年所做的东西都没有被放到我的毕业论文中去,并且我后三年尝试的很多方向也都是死路一条。研究生院是一个锻炼从失败中重新站起的安全环境,因为比起实际工作中的失败,研究生阶段失败带来的风险是比较低的。在博士阶段的前几年,我经常因科研失败而忧虑、心烦意乱、失去勇气。但当我变得成熟后,我学会了化悲愤为力量,也就是我所说的\emph{想要做出结果的狂怒}。每一次被拒、怀疑和批评都鞭策我更加努力地工作来证明那些否定我的人是错误的。研究生头几年的失败是我后几年的成功之母。例如,第二年时我没能在一旁观察专业程序员的经历教会我应该向谁、且如何寻求这方面的帮助,所以我后来就成功地观察了计算型研究者的工作,这也对我的博士论文工作有所启发;还有,我没能获得大批用户来使用IncPy的失败经历也教会我应该如何更好地设计和推荐自己的软件,因此我才获得了10000个CDE的用户。
\item \textbf{与圈内人结盟:}当我与专业的圈内人合作时,我发表论文变得更为容易了,比如我第二年时与Scott和Joel的合作,在MSR实习时与Tom的合作,还有第五年时与Jeff的合作。他们知道在各自的子领域发表论文所要求的各种交易技巧;我和这几位圈内人共同撰写的五篇论文全都是第一次投稿就被接收了。然而,作为一个圈外人奋力拼搏——第二年与Dawson的经验性软件衡量研究,和之后我独自的毕业论文项目——也是很有收获的,尽管也更令人沮丧,因为论文总是一次又一次地被拒收。
\item \textbf{多做报告:}在整个博士阶段中,我做了二十余个科研报告,从在大学实验室组会上的非正式报告,到大型酒店舞会厅的会议报告。例如我在IncPy 的项目初期的非正式报告,就有助于我获得设计灵感和意见反馈;我在提交论文前做的报告,有助于我发现需要在论文中修改的公认的缺陷。此外,每次报告也是个绝佳锻炼机会,有助于我提升我的公共演讲技巧,和应对偶尔带有敌意的提问的技巧。最后一点,作报告有时候还能点燃一些后续讨论的火花,进一步获得一些意外的收获:比如,听了我关于IncPy的第一个报告之后,一个研究生同学通过邮件发给我了一个Fernando一篇有关科学中的Python的博文链接;那封邮件鼓励我去接触一下Fernando,也正是Fernando后来启发了我改进IncPy,然后又创造出了CDE。过了一年之后,我介绍CDE的谷歌科技报告直接给我带来了非常棒的2011年暑期实习机会。
\item \textbf{推销,推销,再推销:}我把大部分研究生生活的时间都花在了埋头苦干、辛苦研磨、实现出研究创意上,但我意识到令人信服地将自己的工作推销出去才是发表、获得任何、顺利毕业的关键。因为论文发表这一游戏中有着白热化竞争的天性,将接收和拒收区分开来的因素往往就是一篇论文的“营销技巧”是如何吸引审稿人的品味的。因此,如果没能将自己研究重要性的蓝图适当地推荐给目标听众——资历深的学术界同行,那么上千个小时的研磨就可能会付之东流。更为普遍的是,一个领域中有很多人都有好多想法,而更好的推销者会更有可能让他们的创意被现有圈子所接受。作为一个地位较低的学生,将我的想法“推销”出去的一种最行之有效的方法,就是让有影响力的人(比如像Margo 这样的知名教授)对我的项目足够有热情,让后让他代表我去宣传提升它们。
\item \textbf{慷慨地提供帮助:}博士生经历中我最喜欢的一个特征就是我并没有一直处于和同学们的竞争中;并不是他们做得越好,我就会做得越差,反之亦然。因此,我们中的大多数都慷慨地互相帮助,尤其是在遭受外部审稿人严厉的批评之前,就互相给予关于想法和论文草稿的反馈。
\item \textbf{寻求帮助:}在过去的六年里,我变得善于决定何时、找谁、以及如何来寻求帮助。具体地说,每当感觉受困时,我就会去寻找能够帮我脱离困境的专家。寻求帮助可能只需要简单地找一个系里的朋友,也可能需要有人介绍,或者甚至需要发冷邮件给陌生人。
\item \textbf{表达诚挚的感谢:}这些年来,我学会了向给予过我帮助的人表达感谢。尽管获得博士学位几乎是一个人的战斗,但没有其他十多个同学的慷慨帮助,我也不能完成这一任务。人们发现他们的建议或者反馈带来了具体的益处之后会感到很高兴,因此只要可能,我都会努力答谢每一个人具体的贡献。甚至一个简短的感谢邮件也会很有帮助。
\item \textbf{想法唤起想法:}正如我第一年结束时发现的那样,凭空想出一个实质性的想法几乎是不可能的。想法总是构建在其他想法之上,所以找到一个坚实的起点很重要。比如,IncPy和SlopPy的动机都来自于我2009年在MSR实习时所碰到的恼人的和编程相关的低效问题。一年之后,我的一部分拓展IncPy的想法,再加上Fernando对可重复性研究的洞察力,还有Dawson对Linux依赖地狱的点拨,一起促成了CDE的创建。当然,创意有时候也需要数年时间才会开花,通常是在经过了几次错误的开端之后:我在第二年期间和第四年末尾时都考虑过类似Burrito的想法,但直到第六年我才得以把这些模糊的想法固化起来,形成一个真正的项目。
\item \textbf{辛苦且聪明地研磨:}这本书的书名叫\emph{\bookname},因为没有哪个博士生未经过上万小时单调乏味、讲究实际的研磨。这段旅程让我明白,如果没有极端的努力来将创意变成现实,那么富有创造力的想法也毫无意义:出现在办公室,一屁股坐在位置上,开始辛苦地研磨,保持不大但是持续的进展,休息一下来反思和恢复精神,接着又一天天地循环往复,连续超过两千天。然而,聪明地研磨和辛苦地研磨同等重要。看见有的学生盲目地拼命完成不会得到有利结果的任务真令人悲伤:从一个错误的角度切入一个科研问题,使用错误的工具,或者做着无用的差事。聪明地研磨需要有感知力、直觉和一种乐于寻求帮助的意愿。
\end{enumerate}
\breakline
我回答一个含F开头单词的问题来结束这一章:\emph{读博士有趣(fun)吗?}
博士生经历的某些方面非常有趣:提出新的想法很有趣;在白板上写下软件设计的草稿很有趣;和同事一起喝咖啡、探讨想法很有趣;会议期间和有意思的人一起聊天很有趣;作报告并激起热烈的讨论很有趣;收到来自世界各地CDE用户的热情洋溢的邮件很有趣。但我可能六年中只花了几百个小时在这些活动上,还占不到我全部工作时间的百分之五。
相比之下,我花了近万个小时独自在计算机前研磨——编程,调试,运行实验,琢磨软件工具,查找相关信息,以及撰写、修改和重写研究论文。任何经历过开创性工作的人都知道日复一日的研磨基本没什么乐趣:它需要高度集中的注意力,严格的纪律性,对细节的敏锐注意力,高度的耐受性,还有对做出伟大工作的执着追求。
那么,\emph{这有趣吗?}
我用另一个含F开头的单词来回答:\emph{它有时候是有趣的,但更重要的是,它是充实的(fulfilling)。}有趣通常是琐碎、短暂,并且易得的,但是充实却只有在克服了巨大且有意义的挑战后才会获得。攻读博士学位是我生命中最充实的体验之一,我也感到很幸运有机会能在这期间变得富有创造力。
%%% Afterword
\mychapter{后记}
自发布的第一个月(2012年7月)开始,有上万个人阅读了\emph{\bookname},还有几百个读者给我发了有关本书的个人邮件。最吸引人的是,读者们根据他们自己的生活体验,对这本书有着不同的解读。正如一句老话所说,\emph{仁者见仁,智者见智}。例如:
\begin{itemize}
\item \textbf{本科生}知道了博士生活会包含什么,这帮助他们调整了内心对博士生活的期待。一个学生通过邮件写信给我:“我必须得说,尽管我是一个考虑明年申请博士的本科生,但你还是让我明白了我接下来几年的生活中会发生什么。我待在实验室实习做项目(其实我做的工作就是读了你的书),以及在有关博士的一些漫想中变得迷茫,但这些时间都是值得的。”另一个读者提到\emph{\bookname}是“一个让普通人也可以深入了解攻读博士这件事的优质资源$\cdots\cdots$这本书中导师的选择、资金等等博弈,带有些‘政治’意味游戏的视角是很难得的。”
\item \textbf{已经工作而没有攻读博士的人们}感谢我让他们更加坚信,他们当初没有选择读研究生是一个无比正确的决定。一位刚毕业、马上就要成为工程师的读者写道:“当选择我这一生要做什么时,我只有两个选项:成为一名教授,或者是成为一名专业工作者。考虑到一些综合因素,我最终选择了后者,但最重要的原因是,我觉得我不能牺牲掉我生活中日常交际和非学术的那一部分,来投入到科研所必须的奉献上。我一直在想我的选择是否正确。你的书让我知道了要是读博士我的生活会是怎样一番景象,我想我当时做出了正确的决定。”
\item \textbf{博士早期的学生}大都涉及我研究生头几年不得不经受的那些无聊且不需动脑的研磨工作。有些学生很振奋,因为他们发现如果在接下来几年辛苦且聪明地研磨的话,他们的未来看起来还是很光明的。一个一年级的博士生告诉我:“你的意志力真强。我刚刚经历了一年的博士研磨,就觉得永无出头之日了。你的工作真的让我感到振奋,我现在感到非常有激情和决心。(至少在我读了你书的那一天是这样!)”一个二年级博士生给我说:“我在今天这一博士的关键阶段发现了你的书。我的博士生资格考试\footnote{博士生资格考试:准备攻读博士学位的学生通常需要在研究生的第一年或者第二年参加的资格考试,通过了这个考试后,才会被允许继续攻读博士学位。——译者注}就要来了,但我觉得我的工作缺乏实质性,所以当我开始读了你的书后,我准备扔掉我先前的工作。我不知道博士生活会是什么样,但我很喜欢它。这正是我需要的那种驱动力,哥们。”
\item \textbf{博士中期的学生}对中间章节描述的那种“炼狱”般的精神状态很有共鸣。一个读者给我说:“我看见过许多其他领域所共有的事情。看到你描述的第三年时对项目的冷漠我不由失笑$\cdots\cdots$我花了更多时间才到达这个阶段。我有资金支持,但我的导师并不怎么管我,所以我有时候也和你一样,四处寻找灵感,因为小幅的改进并不能解决根本问题。”
\item \textbf{成功退出博士的学生}通过我研究生的整个经历也间接地体验了一番研究生生活,并从中获得验证,他们提前退出博士生涯的选择是正确的。例如,一位第一年就离开博士学习的斯坦福计算机科学的博士生写道:“感谢你让我确信做博士时选择退出是我做过的最好的决定。”
\item \textbf{博士后期的学生}对我因学术界的论文发表游戏而受挫很有共鸣,因为他们也一次又一次地面对过论文被拒,而被拒的原因似乎都是他们不可控制的。有个读者说:“持续回归到发表论文这一主题——或者更确切地说,迎合子领域中一小部分专家的口味来发表文章——真正切中了要害。”其他博士后期的学生希望想办法为下一代的学生减轻一点这个过程中的痛苦:“有时候,我为你所经历的一些事感到生气,或者说沮丧,因为其中大多数都是不必要的,然而我也同样经历过这些事。我们可以探讨一下,如何才能让博士头几年的经历变得不那么令人沮丧,然后告诉将来的研究生,我觉得这会很有意思。”
\item \textbf{教授们}很欣赏我故事中的努力拼搏和最终胜利的喜悦心情,因为他们在研究生阶段都获得了成功。斯坦福一个资历较深的教授在Twitter上说:“我们班的大多数人(包括我)都想在第二年退出博士学习!读博士很苦,但也很值得!”另一个年轻的教授写到:“最终,博士学习对我来说是一个收获颇丰的旅程,他帮助我成长了许多,我工作更加努力,更执着、强大和自信。这个转变才是博士生项目的真正产出,而不是那一堆发表的论文。”最后,我还想分享选择性阅读本书的读者里最为直接的一个代表,一个教授高度赞扬了我的整本书,说他如何如何喜欢我的这本书,并且非常高兴我最终还是决定去做一个大学教授!不过至少可以这样说,她对最后几个章节的理解是极其有创造性的。
\item \textbf{普通读者们}也很乐于看一看他们读博士的朋友或家庭成员的生活可能是什么样的。一位母亲写道:“我不是一个博士生,但我却对书中的很多事情产生了共鸣,因为我的女儿也是一个博士生,她现在已经是一个终身制系列的教授了。要是你早点写出这本书来就好了!”还有一位同学告诉我:“我把这本书发给了我的奶奶,她很喜欢。我是我们家第一个获得博士学位的人,所以她对这个过程有着很多问题,而你的回忆录可以回答她的疑问,这样我就不用再回答她了:)”
\end{itemize}
\breakline
我也收到了一些读者的常问到的问题,我在这一小节里做一个回答。
\emph{问:为什么你一直执着于发表论文?我Z时期在Y大学读了X专业,并且在没有发表任何论文的情况下成功毕业了。}
我专注于发表论文这个话题,是因为努力发表论文几乎占据了我还有我们系的同学们博士生活的大部分。2012年前后,斯坦福计算机系的学生需要在毕业前发表二到四篇论文。甚至我的导师也给我说了很多次,我至少得发表两篇被认可的论文,他才会让我毕业。读者朋友们也告诉我,在其他领域,发表论文对博士生而言没这么重要;其实在过去,就算是计算机科学的博士生也没有面临这么大的发表压力。然而,对我和我的同学们而言,我们的感觉就是“要么发论文,要么走向灭亡”。这并不代表我赞同这种强烈地由论文驱动的研究风格(它有正面也有负面的影响),可它就是我获得博士学位必须要玩的游戏。
\emph{问:我是一个计算机科学教授,我想指出,你关于获得教职工作和资金项目所需条件的观点是有一些误导性的。为什么不提供更精确的信息呢?}
我完全承认我的观点是短浅和片面的,因为我从来没有在教师招聘委员会和资金审查委员会里工作过。然而,我基于我六年博士生阶段所看到的,把我认为这些过程是如何进行的最诚实的解释写了出来。
\emph{问:我是一名学生,需要一些建议。我应该攻读博士学位吗?我该退出我的博士项目吗?我要不要换导师?我该不该试着当一个教授?}
\emph{\bookname}是一本描述我自己经历的回忆录,而不是给广大学生的一般性建议。由于你所处的环境可能和我的有很大不同,我觉得我没有资格给你提供建议。欢迎你以任何合理的方式来理解我的话,然后用你最好的判断力来决定。祝你好运!
\emph{问:你本书的目的是对学术界的批判,或者是对学术界改革的呼唤吗?}
绝对不是。除了尽可能诚实地讲述我自己的故事而外,我别无其他用意。
\emph{你为什么要离开学术界?你的科研视野和发表记录也很优秀,所以你应该能获得一份体面的教职工作,而且如果你足够努力工作的话,还能获得终身职位。}
这本回忆录的目的是讲述我博士阶段的故事,而不是解释我为什么决定离开学术界。我不追求学术工作的完整原因已经超出了这本书的范围。但是,如果非要我给出一个一句话的答案的话,那么可以这样说:\emph{我就是非常不想做教职工作。}
\emph{问:那么你讨厌学术界吗?你觉得学术研究是不是一个无用的游戏?}
不,恰恰相反,我很敬重学术界,而且深刻地理解它在推进创新的过程中所扮演的角色。尽管同行评议的发表规则是一个不甚完美的游戏,我也没有一个能够控制质量的更好的解决方案。正如我在研究生最后一年发给一位教授的邮件中总结的那样:“通过过去的五年,我发现我更愿意做一个科研的旁观者,作为一个新研究的持续不断的生产者的负担对我来说实在是太重了。”
\emph{问:我认为博士生要上课,教课,经历磨人的资格考试,还要做很多和科研无关的事。为什么你没有描述其中任何一个呢?}
因为这些是都和获得博士学位无关的活动。我选择排他性地把我的回忆录聚焦在做科研的过程上,因为这才是博士经历的核心。
\emph{问:你在研究生六年期间交了朋友吗,或者参加社交活动了吗?}
答案是肯定的,不过你可能对我个人生活的细节不太感兴趣。再次说明,我排他性地把我的回忆录聚焦在做科研的过程上。
\emph{问:这本书里的其他人物都是单一维度的。为什么你不把他们的背景介绍得更细一点呢?}
因为我觉得代表别人发表观点不太好。我可以自信地谈论我自己的感受。我的同事可以写他们自己对\emph{\bookname}的理解和响应,我也很乐意到时候给出他们文章的链接。
\emph{问:你怎么知道你博士阶段研磨超过了一万个小时?}
我采取了一个非常保守的估算方式,每天研磨5个小时,乘以每年工作的335天(有30 天是“假期”),再乘以6年,大约就是10000个小时。不过大多数博士生可能工作得比这个数目还要长。
感谢阅读,欢迎给我发邮件告诉我更多的反馈和问题!
\clearpage
\clearpage
\end{document}