天天看點

軟體工程實踐總結

不知不覺軟工實踐已經結束了,在結束實踐課程的後一段日子裡,也驗證了棟哥在這門課一開始就說的一句話:“别人正準備開始奮力趕軟工的時候,我們就已經結束了可以全身心地投入複習”,舍友每天晚上趕軟工,而我每天晚上可以趕複習。

除了高數、資料結構等一些硬課程,軟體工程實踐是為數不多的能夠真正使用自己感興趣的語言進行程式設計開發,并且實實在在地學到知識的一門課程,幾乎所有的實踐都投入到了實踐課程之中,每天下課吃完飯回到宿舍就開始沉迷于代碼無法自拔,其實不是因為時間趕,而是自己想做,是以學到了挺多知識。

一、開學初對于軟體工程課程的想象、期望

對比現在的你和開學初部落格開篇的課程目标和期待

在我的第一篇部落格《軟體工程的實踐項目課程的自我目标》中有對這門課的期望和規劃,對比現在:
           
  1. 對項目有總體的把握
“之前做項目的時候隻是項目負責人每個時間段安排某個任務,就直接開始做而沒有一開始對項目有個比較清晰的認識和把握,在項目初期有個清晰的架構對後期的細節修改有很大的幫助”
對比:這個預期總體上來說是達成了,因為和資料庫打交道,是以對需求是十分的熟悉,對資料庫的結構也比較了解,對每個使用者覺得也有總體的把握,該實作什麼功能、如何實作等等。
           
  1. PHP深度學習
“PHP是一種很優秀的語言,通過項目來學習各種架構,進而使PHP架構能夠更加輕便的整合到項目中,為開發帶來更大的便利,并且使整個項目的結構目錄清晰,例如TP的MVC模式等等”
對比:經過兩個多月的PHP開發,也算是從小小白變成了小白,學會了多元數組處理、檔案打開/讀取/建立/寫入、Cookies、Session等等,算法處理、Excel導入導出等等,也算是達到了預期的目标
           
  1. 前端深入學習
“背景和前端是不可分割的部分,雖然背景和前端的開發可以同時進行,但是如果對前端HTML\CSS\JS沒有了解學習的話,和前端的配合會很不默契,在後期功能的疊代上也會有較大的修改”
對比:沒有對比就沒有傷害,前端是個大坑慎入!寫了四個個人資訊的前端界面,但是自适應問題沒有解決,倒是JS的基本知識學會了比較多,打算寒假繼續學習
           

總結這門課程的實踐給你帶來的提升

  1. 學習和使用的新軟體
    1. Github Desktop

      對于日常的commit和push、pull,圖形化界面的Github桌面版其實已經綽綽有餘了,在日常的送出我會使用圖形化界面,但是如果要合并分支、處理沖突、版本會退等等我還是會使用指令行進行操作。

    2. Mou

      Mac版本下的md編輯神器,我的每一篇部落格都是現在Mou上進行編輯,然後在釋出到部落格園上,操作簡單,而且左右兩邊可以實時檢視編輯情況。

    3. PhpStorm

      一款PHP內建開發工具,以前都是使用Sublime Text碼代碼,自從被安利使用了PhpStorm後就停不下來了,随時可以幫助我對編碼進行調整,運作單元測試,個人感覺對開發效率的提升幫助很大。

    4. ShadowsocksX

      有時候遇到問題需要FQ出去找資料的時候,使用的FQ神器,剛好有西二的“飛機票”,完美FQ。

      其實這些軟體都不算新學會的軟體吧,因為之前在開發項目的時候都有使用到,并且相對比較熟悉了

  2. 學習和使用的新工具
    1. Git Shell

      其實要學會使用Github,還是需要掌握Github指令行的使用,圖形化界面固然有它的友善之處,但是也有許多功能是圖形化界面無法實作的。Github是一門大學問,但是使用起來并不難,在看完教程後自己動手,經過一學期的軟工實踐也差不多能夠熟練使用指令行進行操作了,收獲點之一。

    2. Postman

      Postman其實不算一個工具吧,應該算一個插件,測試接口的神器,可以調試簡單的css、html、腳本等簡單的網頁基本資訊,還可以發送幾乎所有類型的http請求,但是使用有個前提,就是必須要下載下傳chrome。

      Postman在以前已經使用了比較多了,但是對Git Shell的了解和使用比較熟練了,以前使用圖形化界面操作比較多,軟工課因為代碼量較大,有時候會容易出現莫名其妙的沖突而圖形化界面無法解決,就學會使用shell來處理沖突等一些問題

  3. 學習和掌握的新語言、新平台
    1. PHP

      從大二下暑假開始學習的一門新語言,入門難度不大,暑假使用php進行項目開發後隻能說對php有個入門的了解,反到是在軟工實踐課程中,對php才有了更深入的了解。

    2. ThinkPHP5.0.1

      雖然以前使用過ThinkPHP3進行開發,但是ThinkPHP5版本的整個架構的布局完全颠覆了以前的版本,其中的語句也更加接近原生化語句,是以是一個新學到的知識,相比于以前的版本,效率更高,安全性更高,項目的布局也更加的合理。

    3. JS

      作為一名背景程式猿,怎麼能不懂一些JS呢!在開發過程中,才逐漸意識到背景程式猿也是需要懂得一些JS的知識的,有時候一些請求可以自己實作和測試,寒假決定好好學一學JS。

  4. 完成代碼量

    和偉炜負責系負責人的頁面和背景實作,因為是功能比較多的一個使用者角色,是以代碼量會比較大,我還實作四個使用者組的個人資訊界面和個人資訊修改界面的功能:

    1. 總代碼量:3274行 //包括注釋以及空行
    2. 有效代碼量:2800+行 //去除注釋及空行
    3. 完成的issues和commit紀錄統計:
  5. 學習和掌握的新方法

    以前嘗試過前後端完全分離和前後端半分離兩種開發模式,各有各的好處,但是在經過軟工實踐後,個人感覺前後端完全分離的開發模式可能比較合适,雖然程式猿的工作量會增大,但是整體的可移植性強,日後如果需要進行修改,改動的地方也不多,接口的可使用率更高。

  6. 其他的提升
    1. 團隊合作意識更強了,一個項目能否順利的進展是完全離不開團隊所有人的合作,學會如何和多個隊友進行合作開發
    2. 代碼的命名規範,尤其重要,不然很容易出現在自己這裡能夠運作,一到其他隊友那裡就無法正常運作的問題
    3. 許多php處理的技巧,比如字元串、Excel導入導出、算法調用和格式處理等等
    4. 解決bug的能力,查閱資料的能力都有得到提升

二、項目實踐中的經驗總結+執行個體/例證結合的分析

  1. 事先統一路徑,這是一個團隊的合作,不是一個人的戰鬥,每個人放項目的地方可能有所不同,不統一路徑的話是根本無法繼續往下開發的,當然這裡的統一路徑不是指所有人放項目的地方要一模一樣,而是相對路徑:
    1. 在我們的項目中,html頁面調用css、js樣式時,統一使用

      {{Think.const.OLD}}/css/xxx.css

      {{Think.const.OLD}}/js/xxx.js

      ,這樣在每個人都能正常顯示
    2. 而接口調用的話統一使用

      {{Think.const.PREFIX}}/控制器/方法名/參數

  2. 要寫詳細的接口文檔說明,前端程式猿在對接接口的時候才知道調用方式、所需參數、傳回資料等等資訊
    1. API接口文檔說明采用統一的格式
    2. 接口說明連結
  3. 不要多人同時對一個檔案進行操作,極其容易出現沖突,有一些檔案需要加入到忽略中,不然也極其容易出現沖突
    1. 我們将運作時産生的臨時檔案、上傳檔案、緩存等加入了忽略中,避免其他人在pull的時候出現沖突

三、對下一屆實踐的建議、期許

  1. 強烈推薦還不會項目開發但是又想學會如何開始的同學選軟工實踐課。這門課會一步步的帶你走進項目開發的大門,從最開始的需求确定、原型設計、程式設計、測試,了解一個項目的開發流程是什麼樣的,什麼階段該開展什麼工作,課程會指明一條學習的道路。
  2. 強烈推薦想提升團隊合作意識的同學選軟工實踐課。要在一個多月内開發出一款能用的app或者網頁,光靠一個人是遠遠不夠的,需要六七個人的通力協作,每個人的程式設計風格不同,學會如何合作是很重要的,這在以後的工作崗位上是很實用的。
  3. 推薦想要提升項目開發能力的同學選軟工實踐課。在項目中可能會碰到各種千奇百怪的bug,或者你從來都沒有實作過的需求,要想解決這些問題,就需要不斷的查找資料、學習和嘗試實作,對程式設計能力的提升也是巨大的。
  4. 強烈不推薦隻希望混分數混學分的同學選軟工實踐課。就算找到了大腿,分數中還是有很大的比例是需要自己單獨完成的,而且在團隊程式設計中,每個人的個人分數都是由老師根據PM給的分工比例來給分的,是以想混過去時很難的。

四、我的團隊 - 我說的都隊

  1. 成員:陳燊、許玲玲、胡心穎、王婷婷、陳齊民、黃偉炜、鄭揚濤
  2. 團隊特色:有四人是西二線上工作室成員,兩位acm算法大佬,服務外包國賽中拿到好成績的大牛,每個隊友都是大腿,在開發過程中緊緊的抱住隊友的大腿不放
  3. 團隊發展:
    1. 萌芽階段:在新學期還沒開始的時候,選課階段我們就初步組建好了團隊了,//先下手為強,每個人對其他人的能力和技術都沒有很好的認知,是以期初每個人有簡單的介紹自己會的東西;因為一開始的軟工課主要是以個人作業和結對程式設計作業為主,是以團隊的磨合并未開始。
    2. 磨合階段:磨合階段其實是我們團隊最困難的一個階段,曾經出現兩次“危機”,一次是在選題的時候,因為每個人有每個人想做的東西,導緻遲遲沒有定下來開發什麼;/但是這個問題在我們決定做導師配置設定系統後就迎刃而解了/;另一次是在決定要做導師配置設定系統的安卓端還是PHP端的時候,但是兩次“危機”我們都協商後解決了,在接下來的合作中也是愈挫愈勇。
    3. 規範階段:這個階段是最重要的階段,我們團隊在這個階段付出了極大的努力;詳細的撰寫了軟體需求規格說明書,介紹自己所會的東西,PM根據每個人的能力進行了角色安排、總體的任務分工,制定了PHP、JavaScript、HTML的編碼規範,每個人對自己的位置和任務都十厘清楚,團隊向前邁進了一大步!
    4. 創造階段:PM的創造能力太可怕了,每天郵箱都會發來好幾封郵件:“PM為你建立了一個新的issue”,隊友的創造能力也是可怕,每天工作進度彙報的時候都完成了許多的任務,尤其是在團隊屢次拿到好成績的時候,我都覺得我還能大戰代碼三百回合;在Alpha版本和Beta版本的示範中我們組都完成了預期的功能,由于PM的“極度完美強迫症”,我們也考慮到了許多細節之處。創造是一種從無到有的過程,創造的不僅僅是項目的開發,還有内心的成就感和團隊的“戰友情”。

五、有關代碼品質的的經典論文的閱讀筆記

作品:《Quantitative evaluation of software quality》
摘要:品質保證、軟體品質、軟體測量和評估品質名額、品質特性按目标管理軟體标準、軟體可靠性測試,本文報告的研究建立了一個概念架構和一些關鍵的初步結果在軟體品質的特性分析。其主要結果和結論是:明确關注軟體品質特性可以大大節省軟體生命周期成本。目前的軟體狀态對我們自動和定量評估軟體品質的能力施加了特定的限制。開發了明确定義的,良好分化的軟體品質特性的确定層次。其進階結構反映了軟體品質評估的實際用途;其較低級特性與可以執行的實際軟體度量評估密切相關。已經針對其潛在益處,可量化性和易于自動化而定義,分類和評估了大量軟體品質評價度量。已經确定特定的軟體生命周期活動對軟體品質具有顯着的影響。最重要的是,我們認為本文中報告的研究首次提供了一個清晰,明确的架構,用于通過一緻的和互相支援的定義.
  1. 就像論文中所說的,軟體的品質特性可以大大節省軟體生命周期的成本,而軟體品質的高低很大程度上取決于代碼品質的高低,我們在進行Alpha版本開發前,團隊就針對JS、PHP、HTML做了詳細的編碼規範,旨在從一開始就為編碼品質做好規範,但是即使按照編碼規範來進行開發,難免還是會有一些出入,代碼品質不僅僅取決于程式設計人員的素質,也取決于團隊合作中是否能夠很好的制定編碼規範以及是否能夠很好的遵循規範進行開發。
  2. 一個好的接口具備穩定性、可擴充性,使用起來要簡單友善效率高,是以對代碼品質的要求其實是很高的,在Beta版本的開發中我也有注意到這個問題,遇到一個問題就寫一個接口的方式極大的增加來資料庫的負擔,而且接口也不夠優雅,是以在接口的設計上需要細細琢磨,比如在設計導師清單和學生清單接口的時候,可以設計成一個接口,通過請求的參數來傳回不同的資訊,這樣的接口才更佳靈活,而不是寫成兩個接口。

六、我學會了軟工實踐

  1. 研發出符合使用者需求的軟體

    導師智能配置設定系統的使用時間在每一年級的大二下學期近期末,是以目前所處的階段仍然在于測試階段,我們已經模拟測試過計算機實驗班73名同學的選島,導師選擇/拒絕學生,檢視結果,對結果進行調整,結果導出等功能,并且也讓身邊的部分同學試用選導系統,基本上沒有發現重大的bug。

  2. 有計劃、有安排的項目開發

    在項目開始前,組長對項目有總體的規劃,進行了詳細的需求說明分析讨論,再确定需求之後進行原型設計,經曆Alpha版本和Beta版本的開發,并且在兩次版本釋出之後對項目都進行了維護,修改一些細節bug;在Alpha版本和Beta版本的整個開發過程中,每個人都有自己的任務分工,每個人都需要按時完成issues,并對完成issues進行說明,因為PM的合理分工,基本沒有熬夜,也沒有延遲傳遞軟體,都預留了2-3天的時間進行項目測試。

  3. 軟體可維護、可繼續發展
    1. 項目Github連結 安裝php環境後,把倉庫拉下來後就可測試,項目已放置在伺服器上,也可以直接登入網站進行測試
    2. 接口說明連結 有接口說明文檔,請求方式、所需參數、傳回資料格式及說明
    3. Github中有提供使用者使用手冊,詳細地說明每個使用者組的功能和操作步驟、流程:
    4. 代碼中複雜的部分都有做注釋,即使有新的程式猿接手項目,也能很容易的看懂代碼,接着項目繼續開發:
      軟體工程實踐總結

七、一隻需要代碼拯救的程式猿

我是陳齊民,“我說得都隊”中的一隻患有重度強迫症的程式猿,和其他程式猿不同的是我熱愛體育,完全不喜歡宅在宿舍,但是每當進入代碼的世界,我又沉迷代碼無法自拔,一心隻想解決bug;完美主義者讓我的代碼非常的整齊,以後看到整潔明了的代碼,那就一定是我寫的了!

軟工課雖然結束了,但是程式設計開發的路還需要我一直走下去,我要扛着這代碼一路拼下去,加油!