【現(xiàn)代軟件工程課件】
源代碼管理 -- 以實(shí)踐促進(jìn)學(xué)習(xí)
移山軟件學(xué)院的學(xué)生果凍問老師: 為啥需要源代碼管理? 我自己寫代碼多爽,別人要,就用QQ 傳過去好了。
老師問:原始人怎么建房子?
果凍:或者找一個(gè)洞,或者自己挖一個(gè)洞,上面搭個(gè)棚子擋雨...
老師問:現(xiàn)代人怎么建房子?
果凍:那就要有樓房,當(dāng)然還要搭腳手架,還要升降機(jī),起重機(jī),等等工具。
老師問:如果原始人穿越到現(xiàn)在,要蓋房,是否可以不要腳手架,大家直接搬磚從一樓砌墻,然后站在一樓砌二樓,然后站在二樓砌三樓... 砌到十樓么?
果凍:這有很多問題:
- 人力搬磚效率底下,人的體力有限,必須有工具幫忙。
- 如果墻砌歪了,沒有人來看,砌到五樓才發(fā)現(xiàn)從二樓開始就歪了,怎么辦?
- 現(xiàn)代房屋有各種成型的模塊(門框,窗框,各種預(yù)制板,各種管道線路),沒有工具,光憑人力根本搞不定。
老師:對(duì),我們需要腳手架,升降機(jī),起重機(jī),水泥攪拌車,各種檢測(cè)工具來保證一個(gè)大樓能順利建好。 我們說過,
軟件 = 程序 + 軟件工程
軟件的質(zhì)量 = 程序的質(zhì)量 + 軟件工程的質(zhì)量
軟件工程的質(zhì)量要靠軟件工具和軟件流程來保證, 大家看過正在建設(shè)中的高樓, 半完工的樓頂上矗立著巨大的塔吊。這個(gè)塔吊不是用戶需求的一部分 (用戶希望完工的樓房上面沒有塔吊?。?,但是,這是建筑工程上不可缺少的環(huán)節(jié),那么怎么把塔吊順利地安裝上,隨著樓房的增高而增高(動(dòng)畫, 迪拜塔的建設(shè)),讓塔吊高質(zhì)量地工作,怎么做安全檢查,防止它倒下來? 這就是工程的要求。
軟件工程中,也有類似腳手架,塔吊這樣的工程系統(tǒng),工具和流程。 軟件的源代碼管理工具(source code control system),加上構(gòu)建系統(tǒng) (build system), 能保證一個(gè)復(fù)雜軟件能在多個(gè)角色,多個(gè)團(tuán)隊(duì)的合作下,按時(shí)以合適的質(zhì)量發(fā)布。 如果你寫一個(gè)Hello World 程序, 當(dāng)然不需要這些工具, 就像你用兒童積木搭房子過家家,你自己高興,但這不是建筑工程。
源代碼管理的10 個(gè)實(shí)踐問題:
源代碼管理的重要性無需贅述,但是在實(shí)際中, 很多團(tuán)隊(duì)都是小和尚念經(jīng) - 有口無心。 嘴上說重要,但是實(shí)際上還是通過QQ 傳遞源代碼,或者演示一結(jié)束, 源代碼立刻沒有可以工作的版本。 我們請(qǐng)各個(gè)團(tuán)隊(duì)舉出例子,說明自己是用什么樣的源代碼系統(tǒng) (subversion, CVS, github, TFS, etc) ,如何處理團(tuán)隊(duì)開發(fā)中可能會(huì)遇到的各種問題。如果團(tuán)隊(duì)還是用QQ 傳遞代碼,請(qǐng)說明QQ 如何解決下列的問題。
每個(gè)團(tuán)隊(duì)寫一個(gè)博客,回答下列問題,(每個(gè)回答要加上截屏顯示):
0. 在吹牛之前,先回答這個(gè)問題: 如果你的團(tuán)隊(duì)來了一個(gè)新隊(duì)員,有一臺(tái)全新的機(jī)器, 你們是否有一個(gè)文檔,只要設(shè)置了相應(yīng)的權(quán)限,她就可以根據(jù)文檔,從頭開始搭建環(huán)境,并成功地把最新、最穩(wěn)定版本的軟件編譯出來,并運(yùn)行必要的單元測(cè)試? (在這過程中,不需要和老隊(duì)員做任何交流)
1. 你的團(tuán)隊(duì)的源代碼控制在哪里?用的是什么系統(tǒng)?如何處理文件的鎖定問題?
場景: 程序員果凍正在對(duì)幾個(gè)文件進(jìn)行修改,實(shí)現(xiàn)一個(gè)大的功能, 這時(shí)候,程序員小飛也要改其中一個(gè)文件,快速修復(fù)一個(gè)問題。怎么辦?
一個(gè)代碼文件被簽出 (check out) 之后,另一個(gè)團(tuán)隊(duì)成員可以簽出這個(gè)文件,并修改,然后簽入么?
有幾種設(shè)計(jì),各有什么優(yōu)缺點(diǎn)?
例如,簽出文件后,此文件就加鎖,別人無法簽出; 或者, 所有人都可以自由簽出文件
2. 如何看到這個(gè)文件和之前版本的差異? 如何看到代碼修改和工作項(xiàng) (work item),缺陷修復(fù) (bug fix) 的關(guān)系。
場景: 程序員果凍看到某個(gè)文件被修改了,他怎么看到這個(gè)文件在最近的修改究竟改了哪些地方? (
例子)
場景: 程序員果凍看到某個(gè)文件在最新版本被改動(dòng)了100 多行, 那么和這100多行對(duì)應(yīng)的其他修改在什么文件中呢? 這個(gè)修改是為了解決哪些問題而作的呢? 那些問題有工作項(xiàng) (work item,issue),或者bug 來跟蹤么?
3. 如果某個(gè)文件在你簽出之后已經(jīng)被別人修改,并且簽入了,那么你在簽入你的修改的時(shí)候, 如何合并不同的修改(merge)? 你用了什么工具來幫助你?
4. 你有20個(gè)文件都是關(guān)于同一個(gè)功能的修改,你要如何保證這些文件都同時(shí)簽入成功(修改的原子性),或者同時(shí)簽入不成功?
場景: 程序員果凍要簽入 20 個(gè)文件,他一個(gè)一個(gè)地簽入, 在簽入完5 個(gè) .h 文件之后, 他發(fā)現(xiàn)一些 .cpp 文件和最新的版本有沖突,他正在花時(shí)間琢磨如何合并... 這時(shí)候, 程序員小飛從客戶端同步了所有最新代碼, 開始編譯, 但是編譯不成功 - 因?yàn)橛胁煌降?.h 文件和 .cpp 文件! 這時(shí)候, 別的程序員也來抱怨同樣的問題,果凍應(yīng)該怎么辦?
5. 你的PC 上有關(guān)于三個(gè)功能的修改, 但是都沒有完成,有很多文件處于半完工的狀態(tài),這時(shí)你要緊急修改一個(gè)新的 bug,如何把本地修改放一邊,保證在干凈的環(huán)境中修改這個(gè) bug, 并成功地簽入你的修改 --- changelist management。
6. 規(guī)范操作和自動(dòng)化
你的團(tuán)隊(duì)規(guī)定開發(fā)者簽入的時(shí)候要做這些事情:
- 代碼復(fù)審 (要有別的員工的名字)
- 和這次簽入相關(guān)的issue 編號(hào), 任務(wù)/task, 缺陷/bug 編號(hào),等等, 以備查詢。
請(qǐng)問你的團(tuán)隊(duì)有這樣的自動(dòng)化工具讓開發(fā)者方便地一次性填入所有信息然后提交么? (高級(jí)功能, 代碼提交之后, 相關(guān)bug 的狀態(tài)會(huì)改動(dòng)為 “fixed”, 并且有鏈接指向這次簽入。)
7. 如何給你的源代碼建立分支?
場景:你們需要做一個(gè)演示,所以在演示版本的分支中對(duì)各處的代碼做了一個(gè)臨時(shí)的修改, 同時(shí),主要的分支還保持原來的計(jì)劃開發(fā)。 你們?cè)趺醋龅降模?在演示之后,演示版本的有些修改應(yīng)該合并到主分支中,有些則不用,你們是怎么做到的?
場景: 你們的軟件發(fā)布了,有很多用戶,一天,一個(gè)用戶報(bào)告了一個(gè)問題,但是他們是用某個(gè)老版本,而且沒有條件更新到最新版本。 這時(shí)候,你如何在本地構(gòu)建一個(gè)老版本的軟件,并試圖重現(xiàn)那個(gè)問題?
8. 一個(gè)源文件,如何知道它的每一行都是什么時(shí)候簽入的,為了什么目的簽入的 (解決了哪個(gè)任務(wù),或者哪個(gè)bug)?
場景: 一個(gè)重要的軟件歷經(jīng)幾年,幾個(gè)團(tuán)隊(duì)的開發(fā)和維護(hù),忽然出現(xiàn)在某個(gè)條件下崩潰的事故, 程序員果凍經(jīng)過各種debug手段,發(fā)現(xiàn)問題是在某一個(gè)文件中有一行代碼似乎顯然出了問題, 但是這個(gè)模塊被很多其他模塊調(diào)用, 這行代碼是什么時(shí)候,為了什么目的,經(jīng)過誰簽入的呢? 如果貿(mào)然修改, 會(huì)不會(huì)導(dǎo)致其他問題呢? 怎么辦?
9. 如何給一個(gè)系統(tǒng)的所有源文件都打上標(biāo)簽,這樣別人可以同步所有有這個(gè)標(biāo)簽的文件版本?
代碼每天都在變, 有時(shí)質(zhì)量變好,有時(shí)變差,我們需要一個(gè) Last Known Good (最后穩(wěn)定的好版本) 版本, 這樣新員工就可以同步這個(gè)版本, 我們?nèi)绻枰l(fā)布,也是從這個(gè)版本開始。 那么如何標(biāo)記這個(gè) Last Known Good 版本呢?
10. 你的項(xiàng)目的源代碼和測(cè)試這些代碼的單元測(cè)試,以及其他測(cè)試腳本都是放在一起的么? 修改源代碼會(huì)確保相應(yīng)的測(cè)試也更新么?你的團(tuán)隊(duì)是否能部署自動(dòng)構(gòu)建的任務(wù)?
在簽入之前,程序員能否自動(dòng)在自己的機(jī)器上運(yùn)行自動(dòng)測(cè)試,以保證本地修改不會(huì)影響整個(gè)軟件的質(zhì)量?
在程序員提交簽入之后,服務(wù)器上是否有自動(dòng)測(cè)試程序, 完成編譯,測(cè)試,如果成功,就簽入,否則,就取消簽入?
團(tuán)隊(duì)是否配置了服務(wù)器,它自動(dòng)同步所有文件,自動(dòng)構(gòu)建,自動(dòng)運(yùn)行相關(guān)的單元測(cè)試,碰到錯(cuò)誤能自動(dòng)發(fā)郵件給團(tuán)隊(duì)
作業(yè)題,分析比較各種軟件構(gòu)建環(huán)境:
就像一個(gè)廚師要分析各種廚房用具,挑選適合自己的工具組合, 一個(gè)軟件團(tuán)隊(duì)也要挑選適合自己的源代碼管理和其他配套工具,請(qǐng)選擇至少三種,比較各自的優(yōu)點(diǎn)缺點(diǎn),成本:
- github
- https://gitee.com/education
- coding.net
- code.csdn.net
- gitcafe.com
- www.visualstudio.com
- code.taobao.org
- Visual Studio Team Foundation Server
- gitblit, 在Windows系統(tǒng)下構(gòu)建 git 服務(wù),帶網(wǎng)頁端管理…
- Visual Source Safe (VSS)
- 自己搭建系統(tǒng)