九月第二週,我(加入)了工學院的(機器人)(專案)。實驗室在(地下室),白板上寫著今年的(目標):明年四月在鄰州舉行的農業機器人競賽。
(團隊)(一共)四個人。組長馬可是博士班二年級,莉亞(負責)(硬體),(大學部)的山姆負責機身,再加上剛來美國三週的我。
第一次開會,馬可把筆電接上投影機。畫面上是一台(小小)的履帶機器人,比賽的時候,它要在一座(模擬)的穀倉裡(找到)每一個飼料槽。
「每個槽前面(停)三秒,把那一格的配給(放下),」馬可說,「然後再(爬行)到(下一格)。整場十分鐘。」
他把工作分下去。導航的核心模組是他寫的,莉亞管感測器和所有的(裝置),山姆負責(履帶)。
輪到我的時候,他想了一下。「(新成員)先(寫)測試吧。清單上有十七項,照著寫就好,核心的(程式)先不用碰。我們(以前)的新人都是這樣開始的。」
他的語氣很(親切),不是故意要看輕誰。我沒有(猶豫),點頭說好。
(說實話),回宿舍的路上我有點沮喪。(大學)四年我修了(很多)程式設計的課,到這裡卻只能寫測試。(室友)(打電話)來,問我第一次開會怎麼樣,我說還好,組長人(不錯)。
掛了電話,我很快就(想通)了。要寫測試,(首先)得知道這台機器人到底要做什麼。我也不想太(衝動),第一週就去跟組長(爭)。
那天晚上,我把(競賽)規則從第一頁(讀)起。規則一共三十二頁,寫得很(冗長),前面幾頁都在講報名費和場地尺寸。
第三頁有一段(比較重要)。上面寫著,每一場比賽(開始)前,裁判會用(隨機)的方式(擺放)乾草捆,隊伍事先不會知道(位置)。
我(打開)(測試)清單(對照)。十七項測試裡,有九項在測(障礙物),可是乾草捆每次都放在同樣的四個位置。換句話說,(現在)的測試都是人為安排好的場地。
我(繼續)往下讀。第二十九頁的字比較小:比賽期間,若有(人員)(進入)場地,機器人必須在一秒內(減速)到原本速度的一半。(同時),它要把(警示)訊號傳送到(操作員)的(筆電)上。沒有做到的隊伍,該場成績取消。
清單上沒有(任何)一項在測這件事。
我沒有(改)(核心)模組,那不是我的工作。我只是在清單(最後)加了一項,編號是(第十八)。
第十八項測試做兩件事。每次執行前,先用程式隨機產生乾草捆的位置;跑到(一半),(再)讓一個人形紙板在任意時間移進場地。
紙板是我從系館(回收)(區)拿來的(紙箱),用美工刀剪下一個人的(輪廓)。莉亞看到的時候笑了,幫它貼了一張(反光)貼紙,讓感測器比較容易識別。
我(利用)星期三晚上(實驗室)沒人的時間,連續跑了三十次。地下室很安靜,只聽得到(履帶)的聲音和我自己的(呼吸)。樓上有(一群)大學生在辦活動,偶爾傳來笑聲。
(結果)很(清楚)。平均每四次,就有一次(撞上)乾草捆,而且(幾乎)都在同一個角落。紙板移進場地的時候,機器人一次都沒有減速。(到了)(第三十)次,它又撞上了那個角落。
(第一次)看到它撞上,我心裡其實有一點興奮感,好像終於(摸到)了什麼。我(坐)在地上思索了一會兒,又把那幾次的(紀錄)重看一遍。
撞的(原因)並不複雜。(導航)模組在(轉彎)時,(只)看前方的感測器;乾草捆碰巧放在側邊,它就看不到。以前的測試從來沒有把乾草捆放在那裡,所以(問題)一直沒有(發生)。
我把三十次的結果整理成一張(表),存在團隊共用的(磁碟)裡,檔名就叫「第十八項」。我想低調一點,沒有在(群組)裡說什麼,只在週四的(會議)(議程)上加了一行:測試結果報告,五分鐘。
我對自己的(英文)沒有那麼有(自信)。要在博士班學長面前說他的模組有(問題),還是需要一點(勇氣)。
星期四下午,(指導教授)歐文斯也來了。馬可先在固定的(場地)上(展示),機器人順利跑完全程,十個飼料槽都停得很準。山姆在旁邊(錄影),說要放上實驗室的(部落格)。
教授點點頭,(問):「比賽的時候,乾草捆是(隨機)擺的吧?」
馬可說是。(教授)轉向我:「那新的測試(跑過)了嗎?」
我把筆電(連接)上投影機,打開那張表。三十次裡有八次(撞上),(紙板)進場的三十次,一次都沒有減速。
「第二十九頁,」我說,「(有人)進場時,要在一秒內減速。沒有(做到),那一場的成績取消。」
會議室裡安靜了幾秒。馬可把(規則)翻到那一頁,(仔細地)讀了(一遍)。
「顯然我讀得(太快)了,」他說,「我一直以為那段是(安全)說明,跟程式沒有關係。」
(教授)請我們(直接)到場地上試。我把四個乾草捆搬到(側邊),莉亞把紙板立在(入口)。機器人轉第二個(彎)時,履帶擦過乾草捆,整台(卡住)了。紙板(移進來),它還是照原來的速度往前。
山姆(小聲)說:「跟表上一樣。」
馬可(蹲下來),看了很久那個角落。然後他(站起來),對著大家說。
「上週我說,(新成員)先寫測試,核心的程式先不用碰。那句話我(收回)。」他停了一下,「第十八項找到的,正是核心模組的問題。減速的那一段,柏宇,你跟我(一起)寫。」
教授什麼也沒說,只在(筆記本)上記了一行。莉亞對我比了一個讚。
(會後),馬可把導航模組的權限開給我。他說轉彎時要(加上)側邊感測器的判斷,(以免)再撞上;減速的(部分),他(希望)由我先構想一個(版本)。他(承諾)星期一前把側邊的部分寫好。
「我原本覺得測試只是表面的(工作),」他說,「(諷刺的是),這個專案最大的問題,是測試找到的。技術上不(難),難的是知道要(修)哪裡。」
我說測試清單本來就(不充分),規則又寫得太長,不是誰的錯。他笑了一下,(承認)自己(以前)也很厭倦讀規則,總是(理所當然地)以為(舊的)測試夠用。
那天晚上,我又回到實驗室,(泡)了一杯(咖啡)(提神)。我到場地取回紙板,把第十八項再跑了一次,這次換了新的乾草捆(位置)。
機器人頂上的(指示燈)一閃一閃地發光,慢慢爬過每一格。地下室很(寧靜),螢幕右下角,第十八項的(圖示)還是紅色的。我把紙板(扶正),(放回)入口旁邊。