那些台灣軟體產業所缺少的 – 版本控制系統

這幾年來,多多少少接觸了不少業界的人,雖然我自己還不算有真正待過業界太久,但是這期間看到不少業界的現象都令我挺驚訝的,例如在聊天時提到你們公司用的版本控制系統是什麼,有很多人都會回答 「那是什麼?」,一直以來這些在國外的主流開發環境都基本常識或是標準配備的東西台灣業界居然很多都連有那樣的工具存在都不知道,或著是對於某些東西有錯誤的認知,所以我想大略提一下常見的幾個問題

版本控制系統

我想這是最常見的毛病,很常發現很多公司在開發軟體時從來都不使用版本控制系統,最誇張的狀況就是管它三七二十一直接修改

 

除此之外,常見的土法鍊鋼有聽說過資料夾複製,然後將資料夾名稱命名為版本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

Git & Mercurial

接著時間來到了現代,分散式版本控制系統成為了新興專案的主流,在這些新的系統中,檔案庫不在是集中式的,而是分散式的,原本commit都要集中送到中央檔案庫,現在不同的檔案庫之間可以互相傳送對方沒有的commit,如此一來讓開發更加容易,即使沒有網路也可以在本地端commit之後再送給遠端的檔案庫,除此之外,它們引入的新特性也讓合併兩個分支之類的事變得更加容易,個人推薦如果你還沒有用過版本控制系統,可以直接學這些現代的工具,以前的工具大多都已經很少人在使用,可用的資源也在變少中

Git 的簡介

Git是Linus Torvalds開發用來管理Linux核心程式碼用的系統,特色是這套系統以效率為設計的考量,並且支援很多較低階的檔案歷史處理,支援的主流免費檔案庫有

Github.com

Bitbucket.org

原先Bitbucket只支援Mercurial,這幾天也支援Git了,而Github和Bitbucket的差別在於,Github如果想開私有的檔案庫要錢,而Bitbucket不用,而且是無限個數

如果你想學Git,個人推薦讀

Git pro

裡面講得非常清楚而且詳細,也有圖說明系統的運作,相對的,如果是讀其它的文件,大多數都很難懂,因為都是寫給geek看的,看不懂是很正常的,整體看起來,Git比Mercurial還難學,除此之外還有一個缺點就是對於Windows的支援較差

Mercurial的簡介

Mercurial是基於Python的分散式版本控制系統,特色是以較簡易使用,並且很重視檔案修改的安全性為考量的工具,像是Git有很多指令,一下錯你改的檔案可能因此而遺失,這類情況在Mercurial中較少,大部份指令都會幫你自動備份,如果弄錯指令通常還有救

主流的檔案庫平台是

Bitbucket.org

如果你想學Mercurial,個人推薦看Joel寫的

Hg Init 教學

個人較喜歡Mercurial的原因是它的GUI介面工具較為豐富,像是有

TortoiseHg

MacHg

SourceTree

等好用的GUI工具

最後

我在大學教過的教學用投影片,可以參考看看,未來有空的話或許我可以寫一些這方面的教學,因為畢竟中文資源很少,似乎也沒專門的書在講這些工具的使用

This entry was posted in 中文文章, 分享, 嘴砲 and tagged , , , . Bookmark the permalink.

8 Responses to 那些台灣軟體產業所缺少的 – 版本控制系統

  1. 咖哩葉 says:

    裡面文章好像有錯誤,我記得有一篇文章說git不是linus發明的,
    他一開始是用某個商業公司的版本控制系統來卡發linux,
    過後社群就逆向工程那套系統,開發出來的版本就是git

  2. dem0n says:

    如果你公司安排的時程很緊湊,像這種輔助開發的工具

    很難會有多餘時間讓你去了解 或 採用

    即使是自行開發,在小眾環境下很難找到志同道合的人

    台灣的環境不是很好,很多人下班完後就趕快去放鬆心情了。

  3. victor says:

    @咖哩葉

    喔? 有文章連結嗎? 我想看一下

    @dem0n

    我的看法是相反的,正因為沒時間,才更需要用工具來幫忙,手動copy資料夾,用Excel記版本更新,FTP上傳下載的溝通與協調,這些全都是時間與昂貴的人力,更不用說出錯之後,要加多少班把那些錯誤修正,出於自己或是公司的角度,我都認為這些工具是必不可少的

    想快一點下班去放鬆,我認為更應該要花一點時間在工具上,說真的,學會Git或Mercurial花不了你一天,大不了花個一週的下班時間學一下,在這之後你省下的是數百小時、數千小時,別人還在找改錯哪一行時你已經commit完成,也push到了BitBucket上,除非你的電腦和BitBucket的資料中心同時炸掉,不然你完全不擔心弄丟你的程式,這才叫放鬆,沒有版本控制系統,請問你敢放心地去改你的程式嗎? 你不會擔心我這一改,不小心改到重要的幾行,結果程式掛掉了,我也忘記先前的程式長怎樣嗎? 我也這樣擔心過,在我學會用版本控制系統之前,所以,我可以很明確地告訴你,使用版本控制系統開發才叫輕鬆,用資料夾copy或FTP那叫惡夢

    像駝鳥一樣,把頭塞在洞裡,看不見外面的世界,覺得與我無關,只要照我現在會的東西做法去做就比較輕鬆,真的,台灣的軟體產業要提升,光靠這種心態,永遠都是只會加班到死,因為不懂得用工具而累死的情況,而不是把生產力放在刀口

  4. CJ Cat says:

    推一個。

    我個人就是因為開始使用Google Code搭配TortoiseSVN之後才敢放膽做framework的大翻修 :)

  5. TAMALU Family says:

    版本控管是外商audit ODM廠的指標之一, 但國內尚有大廠停留在 LKK 的手動控管。

  6. toppy368 says:

    我本身不太寫程式,但為了Wordpress的佈景,有時候會改佈景檔的php程式及CSS檔案,請問像我這樣的使用者可以用這些版本控制軟體嗎?

  7. ygtw says:

    toppy368:

    可以,任何檔案都可以!

  8. Jeffrey Chang says:

    在Windows 下使用 SourceTree 搭配Dropbox, 將原本 \TEST folder 中 source code copy 至 \Dropbox\TEST folder 下進行Git 版本管理.
    請問接下來該在 那裡進行程式修改? \Dropbox\TEST folder ?

Leave a Reply