那些台灣軟體產業所缺少的 – 版本控制系統
這幾年來,多多少少接觸了不少業界的人,雖然我自己還不算有真正待過業界太久,但是這期間看到不少業界的現象都令我挺驚訝的,例如在聊天時提到你們公司用的版本控制系統是什麼,有很多人都會回答 「那是什麼?」,一直以來這些在國外的主流開發環境都基本常識或是標準配備的東西台灣業界居然很多都連有那樣的工具存在都不知道,或著是對於某些東西有錯誤的認知,所以我想大略提一下常見的幾個問題
版本控制系統
我想這是最常見的毛病,很常發現很多公司在開發軟體時從來都不使用版本控制系統,最誇張的狀況就是管它三七二十一直接修改
除此之外,常見的土法鍊鋼有聽說過資料夾複製,然後將資料夾名稱命名為版本1之類的方法,高級一點還有搭配Excel來記錄改過了什麼之類的
更進階的還有多人共同開發,還架了FTP來放這些檔案
但這些都有很大的問題,而且其會遇到的問題都正好是版本控制系統所要解決的,所以到底是什麼樣的問題非用版本控制系統不可?
首先,用資料夾copy有個很大的問題,一來是copy的過程很容易出錯,而且更糟的是出的錯很難發現,你怎麼從資料夾的內容來判斷這到底是哪個版本? 最常見的做法就是回想你到底在哪個版本改了什麼,然後去看對應的位置,是否有那些改動,但你有可能記得嗎? 要是程式不是你改的呢? 因此依賴資料夾名稱來得知檔案的版本是極度不可靠的做法,再者,如果你不幸改到錯誤的版本,辛辛苦苦改了半天,才發現改到舊版本了,那你要如何把你改的和正確的版本合在一起? 如果你只改了三行,這還好辦,但如果你改了三百行,那該怎麼辦? 用Excel來記錄改動的事項和版本一樣不會有幫助
那多人開發使用FTP來分享檔案呢? 老天,事情更慘了,原先只是你自己的開發,自己改錯了就算了,如今變成多人開發,有時出問題還不是你改的,這樣想好了,FTP上有個檔案
hello.py
今天張三載回去改了,變成
hello.py (張三版)
不幸的是,王五在張三上傳回FTP之前,也載回來改,變成
hello.py (王五版)
接著,張三把它的檔案上傳了,所以FTP上的檔案變成了
hello.py (張三版)
然後好戲發生了,王五也把它改的東西上傳了,所以FTP上的檔案被蓋掉,變成
hello.py (王五版)
發生了什麼事? 張三改的版本被蓋掉了,你可以想見張三在demo給老闆看時發現改的地方被蓋掉了,翻過辦公桌衝過去揍王五的情景了嗎? 像這樣還只是最簡單的情境,以這類土法鍊鋼的方式,還有太多太多預料不到的複雜情況會發生,什麼? 那你說,如果我們規定每人都得把資料夾以自己的名稱命名,加上版號,再上傳,這樣就不會錯了吧?
hello_project-王五-rev123/
拜託,何苦呢 ? 版本控制系統就是用來解決這些問題而開發出來的,學一套新工具有這麼難嗎? 常見的理由可能會有什麼沒時間學、不信任工具等等,事實上那些都不是理由,只要是程式碼的開發,都得使用版本控制系統,現在已經是2011年,如果你的軟體開發沒有使用版本控制系統,我說這不叫落後,這是原始
用了版本控制系統,最重要的好處是
你可以安心地放膽去改程式
什麼是版本控制系統?
講了那麼多,所以版本控制系統到底是什麼? 這麼來形容好了,如果你有玩過RPG遊戲,像是仙劍奇俠傳、軒轅劍等等,你一定知道遊戲打到一半可以存檔,然後也可以讀檔,接續先前的遊戲進度,如果你發現目前的等級太差了,打不贏魔王,你可以讀前面一點的檔案來重新練,或是前面的寶物忘記拿,也可以讀檔回去拿
而版本控制系統做的事情,就和RPG裡的遊戲存檔是一樣的概念,你可以將目前程式開發的進度的快照存下來,當你發現改的檔案有問題,可以回朔到以前的版本,除此之外,它還可以幫助你找出兩個版本的差異,你再也不怕不小心改了哪一行結果都不知道,也不怕你的同事幫你偷改了幾行結果你卻不知道,甚至還可以合併兩個不同的分支
版本控制系統有哪些? 我該用哪一套?
版本控制系統在幾十年前就已經有現成的工具,然而一直一路演進到今天,現在的版本控制系統已經相當先進且成熟,週邊的工具或是平臺也都相當齊全,從20年前的CVS看起,介紹一些最主流的
CVS
算是古董級的版本控制系統,主要用於open source的開發,特色是可以多人共同使用,缺點是如果多人要存取同個檔案,要先將檔案鎖起來,很多時候會鎖了忘了開,造成別人無法使用,雖然已經至古董了,但是因為很多大型的開源專案還在使用這系統,所以現在多少還看見有人使用,但不建議一般用途使用
Subversion
Subversion簡稱svn,約十年前出現,是CVS的繼承者,主要是改進CVS的缺點,像是最重要的改進,就是檔案鎖定的問題,SVN以試著自動合併檔案的方式來解決同時有兩人修改同一個檔案的問題,現今很多開源專案也還在使用SVN
接著時間來到了現代,分散式版本控制系統成為了新興專案的主流,在這些新的系統中,檔案庫不在是集中式的,而是分散式的,原本commit都要集中送到中央檔案庫,現在不同的檔案庫之間可以互相傳送對方沒有的commit,如此一來讓開發更加容易,即使沒有網路也可以在本地端commit之後再送給遠端的檔案庫,除此之外,它們引入的新特性也讓合併兩個分支之類的事變得更加容易,個人推薦如果你還沒有用過版本控制系統,可以直接學這些現代的工具,以前的工具大多都已經很少人在使用,可用的資源也在變少中
Git 的簡介
Git是Linus Torvalds開發用來管理Linux核心程式碼用的系統,特色是這套系統以效率為設計的考量,並且支援很多較低階的檔案歷史處理,支援的主流免費檔案庫有
原先Bitbucket只支援Mercurial,這幾天也支援Git了,而Github和Bitbucket的差別在於,Github如果想開私有的檔案庫要錢,而Bitbucket不用,而且是無限個數
如果你想學Git,個人推薦讀
裡面講得非常清楚而且詳細,也有圖說明系統的運作,相對的,如果是讀其它的文件,大多數都很難懂,因為都是寫給geek看的,看不懂是很正常的,整體看起來,Git比Mercurial還難學,除此之外還有一個缺點就是對於Windows的支援較差
Mercurial的簡介
Mercurial是基於Python的分散式版本控制系統,特色是以較簡易使用,並且很重視檔案修改的安全性為考量的工具,像是Git有很多指令,一下錯你改的檔案可能因此而遺失,這類情況在Mercurial中較少,大部份指令都會幫你自動備份,如果弄錯指令通常還有救
主流的檔案庫平台是
如果你想學Mercurial,個人推薦看Joel寫的
個人較喜歡Mercurial的原因是它的GUI介面工具較為豐富,像是有
等好用的GUI工具
最後
我在大學教過的教學用投影片,可以參考看看,未來有空的話或許我可以寫一些這方面的教學,因為畢竟中文資源很少,似乎也沒專門的書在講這些工具的使用