天天看點

團隊作業Week14

0. 在吹牛之前,先回答這個問題: 如果你的團隊來了一個新隊員,有一台全新的機器, 你們是否有一個文檔,隻要設定了相應的權限,她就可以根據文檔,從頭開始搭建環境,并成功地把最新、最穩定版本的軟體編譯出來,并運作必要的單元測試? (在這過程中,不需要和老隊員做任何交流)

  我們團隊采用TFS來進行源代碼管理,以及VS2013進行開發,由于我們是進行資料的處理,不同于web伺服器的搭建,我們對于環境的配置以及搭建沒有特殊的要求,主要是集中于對于TFS的使用以及VS的操作,是以我們能夠保證在新加入隊員的情況下仍然能夠把源碼編譯出最後穩定的釋出版并且可以運作必要的單元測試而不需要和老的隊員做任何交流。

1. 你的團隊的源代碼控制在哪裡?用的是什麼系統?如何處理檔案的鎖定問題?

   場景: 程式員果凍正在對幾個檔案進行修改,實作一個大的功能, 這時候,程式員小飛也要改其中一個檔案,快速修複一個問題。怎麼辦?

    一個代碼檔案被簽出 (check out) 之後,另一個團隊成員可以簽出這個檔案,并修改,然後簽入麼?有幾種設計,各有什麼優缺點?例如,簽出檔案後,此檔案就加鎖,别人無法簽出;  或者, 所有人都可以自由簽出檔案

  

  對于TFS的簽入簽出産生的沖突通過團隊内規範來解決,具體方法如下:

  1. 開始工作前的行為(每天開始工作先簽出代碼)
    • 根據需要,簽出你所需要修改的代碼(注:在簽出代碼時,你的簽出檔案會和伺服器同步)不要簽出所有代碼
    • 修改代碼時,不要改動你簽出檔案中他人的方法,如必需改動的,請與該方法作者協商
    • 方法體不要太長,盡量不要超過20行,多進行重構
    • 當一個方法完成時,請馬上建構單元測試,并測試通過
    • 單元測試需可重複測試,不要出現隻能測試一次,下次測試必須修改資料庫才能再測試的問題
  2. 每日簽入的行為(每天需簽入當日全部開發代碼)簽入步驟:
    • 簽入代碼前先選擇“擷取伺服器上最新版本(遞歸)”(不會對你的已簽出檔案覆寫)
    • 編譯解決方案下所有工程
    • 解決編譯沖突
    • 運作單元測試
    • 送出簽入你的簽出檔案
  3. 版本控制行為(代碼commit的要求和發生沖突的解決辦法)
    • 出現沖突時自動合并
    • 自動合并解決不了的請選擇解決按鈕,選擇手工合并
  4. 注意事項
  • 打開解決方案時在網絡環境允許的情況下一定要連接配接團隊開發伺服器
  • 禁止用Ctrl+A 後再到其它檔案中用Ctrl+C 、Ctrl+V的方式回寫覆寫代碼
  • 簽入代碼時請在說明欄寫簡單說明
  • 簽入代碼時關聯有效工作項,并根據目前情況選擇“關聯”或“解決” 

2. 如何看到這個檔案和之前版本的差異? 如何看到代碼修改和工作項 (work item),缺陷修複 (bug fix) 的關系。

   場景: 程式員果凍看到某個檔案被修改了,他怎麼看到這個檔案在最近的修改究竟改了哪些地方? 

   場景: 程式員果凍看到某個檔案在最新版本被改動了100 多行, 那麼和這100多行對應的其他修改在什麼檔案中呢? 這個修改是為了解決哪些問題而作的呢? 那些問題有工作項 (work item,issue),或者bug 來跟蹤麼?

3. 如果某個檔案在你簽出之後已經被别人修改,并且簽入了,那麼你在簽入你的修改的時候, 如何合并不同的修改(merge)? 你用了什麼工具來幫助你?

  這種情況通常不會發生,我們的任務計劃制定的較為合理,盡量保證每個成員的代碼分工是明确的,盡量将一段時間内的工作安排不同人操作不同的代碼,即不會讓兩個人同時修改同一個檔案中的代碼,來避免産生沖突,這樣即使有沖突也都在可以接受的範圍之内。如果出現該情況,首先考慮自動合并,對于無法自動合并的則需要人工的來合并以解決沖突。

4. 你有20個檔案都是關于同一個功能的修改,你要如何保證這些檔案都同時簽入成功(修改的原子性),或者同時簽入不成功?

    場景: 程式員果凍要簽入 20 個檔案,他一個一個地簽入, 在簽入完5 個 .h 檔案之後, 他發現一些 .cpp 檔案和最新的版本有沖突,他正在花時間琢磨如何合并... 這時候, 程式員小飛從用戶端同步了所有最新代碼, 開始編譯, 但是編譯不成功 - 因為有不同步的 .h 檔案和 .cpp 檔案!  這時候, 别的程式員也來抱怨同樣的問題,果凍應該怎麼辦?

  這個問題我們是這麼解決的:在擷取之前先保證自己的能編譯通過,保證自己不出問題,然後在擷取其他人的更改,解決沖突後再編譯,驗證其他人的更改,如果編譯通過則簽入,如果編譯失敗,發現是某個人的送出未完成時候,找到他解決送出問題之後,再重複擷取編譯直至通過後再簽入。并且所有人都遵循這個約定。

5. 你的PC 上有關于三個功能的修改,但是都沒有完成,有很多檔案處于半完工的狀态,這時你要緊急修改一個新的 bug,如何把本地修改放一邊,保證在幹淨的環境中修改這個 bug, 并成功地簽入你的修改 --- changelist management。

  這個問題在大型軟體開發中可能會涉及,在我們的軟體開發過程中,還沒有遇到過這種問題,是以暫時未進行考慮。

6. 如何給你的源代碼建立分支?

    場景:你們需要做一個示範,是以在示範版本的分支中對各處的代碼做了一個臨時的修改, 同時,主要的分支還保持原來的計劃開發。 你們怎麼做到的? 在示範之後,示範版本的有些修改應該合并到主分支中,有些則不用,你們是怎麼做到的?

    場景: 你們的軟體釋出了,有很多使用者,一天,一個使用者報告了一個問題,但是他們是用某個老版本,而且沒有條件更新到最新版本。 這時候,你如何在本地建構一個老版本的軟體,并試圖重制那個問題?

   

在Visual Studio中進行分支操作,十分友善,首先我們建立一個分支:

  • 在源代碼管理器視窗中,選中一個要對其進行分支的項目,然後右鍵點選選擇“分支”,在這裡,可以選擇分支的名稱、對主分支的最新版本還是指定版本進行分支,是否建立新分支的本地副本(也就是将新分支從TFS伺服器上下載下傳到本地工作區中)
  • 點選确定按鈕後,開始建立分支的操作,建立成功後,我們在源代碼管理器視窗中,可以看到主分支和新分支之間有一個雙向箭頭的圖示表示了它們的關系。
  • 先試着在新的分支中修改一下代碼,然後簽入修改,接下來我們示範合并分支的操作:在源代碼管理器視窗中,選擇一個分支,将其合并到主分支,右鍵點選後,選擇“合并”。
  • 在源代碼管理合并向導中,選中的分支作為源分支,目标分支會自動被識别出來,點選下一步按鈕,向導會提示你,選擇源分支的哪個版本進行合并,确定以後,向導提示你可能需要解決沖突,點選完成按鈕,如果合并的分支之間有沖突,則會提示你要先解決沖突後,才能合并。點選解決按鈕,提示*.cs檔案存在沖突。
  • 點選比較按鈕,在比較視窗中,會顯示兩個分支中,同一個檔案的差異,選擇“在合并工具中合并修改”,并點選确定按鈕,背景會為你啟動合并工具,稍等片刻,在合并工具中可以選擇一邊的更改加以應用,如果有多個不一緻的地方,則可以通過“上一個更改”和“下一個更改”進行友善的導航。
  • 選擇一個更改的内容後,你還可以在最下面的編輯視窗中,進行最後的修改,然後點選确定即可,提示沖突已經解決,是否儲存檔案,點選是,當所有沖突都已經解決後,點選關閉,退出沖突處理,完成合并操作。
  • 這個時候,我們打開合并的目标分支,因為修改的内容合并到了目标分支,目标分支的對應檔案處于挂起的更改“合并,編輯”,需要對其進行簽入操作,才能将最新的内容送出到TFS伺服器上。

7. 一個源檔案,如何知道它的每一行都是什麼時候簽入的,為了什麼目的簽入的 (解決了哪個任務,或者哪個bug)?

   場景: 一個重要的軟體忽然出現崩潰的情況, 程式員果凍經過各種debug手段,發現問題是在某一個檔案中有一行代碼似乎顯然出了問題,但是這個子產品被很多其他子產品調用,這行代碼是什麼時候,為了什麼目的,經過誰簽入的呢?如果貿然修改,會不會導緻其他問題呢? 怎麼辦?

8. 如何給一個系統的所有源檔案都打上标簽,這樣别人可以同步所有有這個标簽的檔案版本?

   代碼每天都在變, 有時品質變好,有時變差,我們需要一個 Last Known Good (最後穩定的好版本) 版本, 這樣新員工就可以同步這個版本, 我們如果需要釋出,也是從這個版本開始。那麼如何标記這個 Last Known Good 版本呢? 

9. 你的項目的源代碼和測試這些代碼的單元測試,以及其他測試腳本都是放在一起的麼? 修改源代碼會確定相應的測試也更新麼?你的團隊是否能部署自動建構的任務?

    在簽入之前,程式員能否自動在自己的機器上運作自動測試,以保證本地修改不會影響整個軟體的品質?

    在程式員送出簽入之後,伺服器上是否有自動測試程式, 完成編譯,測試,如果成功,就簽入,否則,就取消簽入?

    團隊是否配置了伺服器,它自動同步所有檔案,自動建構,自動運作相關的單元測試,碰到錯誤能自動發郵件給團隊