最低成本的程式協作: CoProgramming

By Shaform, Tue 05 March 2013, in category Projects

CoProgramming, Google Drive, 軟體開發

緣起

在程式課堂,團隊合作常常是件頭痛的事,若是每個人各自工作,常會產生許多難以整合的版本。即使是一起到電腦教室討論,也常是一個人寫程式,其他人在旁邊看。雖然有版本控制系統等等合作工具,然而我從來沒有成功在一堂課中讓隊友學會其運作(應該說是幾乎,僅有在雙方都早已會使用,或者是由我做所有merge時才曾使用),事實上,像 git, hg 等等複雜的系統,是否真的適合這種小型專案也尚有可懷疑的地方,尤其,有些作業所有的程式碼都在同一個檔案中,使得版本控制系統用起來十分不順手。

我突然想起在《Here Comes Everybody》書裡看過的說法:Wikipedia 的貢獻者中,絕大多數可能只有編輯過一兩行的文章。一家公司如果大部分的員工都只做一點工作,則這家公司多半無法生存。可是在 Wikipedia 的例子裡,合作的成本被降的很低,所以原來不可能利用的小量付出,也能被整合成一個共同成果。

這確實就是我們遇到的情況,有時在課堂中的程式作業規模是如此的小,任何的合作成本都太過高昂。而且,這種只存在一學期的臨時團隊,根本難以形成向心力。而要求任何人為了一學期的作業學會複雜的版本控制系統更是完全不實際的想法。

如果要成功整合大家一起完成這種小型的合作、如果要在每個人只寫幾行程式的情況下依然可以合作,唯一的可能性就是要將合作成本壓到極端的低。可是,要怎麼做呢?我的腦中浮現起從前透過 EtherPad 或者是 Google Docs 教人寫程式時的場景,這就是了。像這樣即時同步的作法在專業的程式開發中或許會因為無法預期其他人的修改而造成不少問題,但對於小型合作而言,這就是最簡單的協作形式。

沒有錯,只要在 Google Docs 上協作程式,然後再加上即時編譯執行的功能,免去不斷在 IDE 與 Docs 間不斷複製貼上的成本,就足夠了。這個非常簡單的專案將目標鎖定在程式新手的小型合作,最好的使用情境其實就是兩人互相坐在電腦教室裡,同時使用兩台電腦,邊討論邊寫程式。再也不會有一個人寫程式,其他人在旁邊看的情形了!腦中有了想法後,我就開始試著把他實做出來。

經過

理論上這應該是個非常簡單的專案,而我其實也只是抱著展示想法的心情,所以是以快速開發作為原則,然而最後卻花了不少時間。問題出在 Google Drive SDK 並沒有支援 C/C++,所以一開始選擇語言時我走了些歧路,原本想採用 Python,可是開發到一半才覺得我不太熟悉用 Tkinter 製作圖形界面,且效果也不是很好,再考慮到一般 Windows 使用者並沒有安裝 Python 函式庫,py2exe 好像也有些 .dll 的問題,所以就放棄了。

雖然知道 Java 是個不錯的選擇,可是印象中 Java 簡單的程式總要寫一大堆程式碼,實在提不起勁來。這時,我發現 Go 是個很有趣的語言,雖然他主要是用在系統開發,可是也有人開發圖形界面的函式庫,加上是個編譯語言,很符合我希望使用者能簡單使用這個軟體的需求,於是就決定來學一下 Go 了!這確實是個很簡單易學的語言,我花了一天的時間就讀完基本的教學,準備開始開發。只是突然發現那個圖形函式庫其實根本編譯不起來,而且功能也有限,所以最後我還是決定改用 Java 了。為了使用者的方便,我也打算採用 launch4j 來製作可執行檔,並包入 TDM-GCC 以及 Code::Blocks 的 cb_console_runner,讓使用者測試程式結束時視窗不會立即結束。

目前程式碼可在 coprogramming@github 觀看。

本來想製作包裝好的執行檔,但因為不知為何有時編譯出來的程式會被測出木馬(雖然可能是誤判),為了避免真的把木馬包進去,所以我決定只放上主程式,想參考研究的朋友可自行下載 TDM-GCC 安裝到 MinGW 子資料夾即可使用,另外如果把 JRE 安裝到 jre7 子資料夾,則可在未安裝 JRE 的電腦上直接執行主程式。

包好的壓縮檔目前可在 download page 下載。

已知問題

由於專案本身只是想要展示想法,所以目前有不少問題:

結語

其實早就有線上編譯的服務,理論上要做到線上協作、編譯、測試程式應該也可以,且對於使用者而言或許會更加方便。或者可以做一個本機端的伺服器程式,專門接收程式碼與編譯,而將界面寫成 Google Chrome 的擴充套件,這樣就可以使用該套件開啟特定文件,解決目前必須要求存取所有檔案的問題了!(因為本機程式沒有辦法讓使用者針對特定檔案給予權限,我猜測寫成擴充套件應該就可以實做在 Drive 界面裡,在檔案上按右鍵以該套件開啟的功能了吧。)

這個想法是因為他專門針對新手的小型專案而特別,可是這種合作方式真的只適合新手嗎?即使在專業的環境中,若是在任何檔案上按下右鍵,就能即時同步分享於 Drive 之上,然後在請教同事時,他也能即時在檔案中編輯,而在他編輯的同時,本地端程式碼即時同步,隨時可用原本的方法編譯,這或許也有方便之處?