1. 程式人生 > >高階軟體工程實踐總結

高階軟體工程實踐總結

一、請回望第一次作業,你對於高階軟體工程課程的想象

1.對比開篇部落格你對課程目標和期待,“希望通過實踐鍛鍊,增強計算機專業的能力和就業競爭力”,對比目前的所學所練所得,在哪些方面達到了你的期待和目標,哪些方面還存在哪些不足,為什麼?

  • 通過一個學期對軟體工程的學習和實踐,我的程式碼編寫能力,Bug定位能力,環境搭建能力,軟體測試能力,書面表達能力,團隊組織能力等都得到了鍛鍊和提高。此外還有很重要的一點是讓我在課堂上和實踐中更加深刻地感受到了軟體工程這個專業的博大精深以及實踐的精髓所在。這些都是我在開篇時所期待的,如今反觀並思考,這些方面確實達到了我的期待和目標。
  • 在程式碼編寫方面,由於本科並非科班出身,我所經歷的程式設計訓練過少,因此該方面能力較弱。很感謝這次軟體工程實訓和平時的設計模式作業,給了我很好的鍛鍊機會。在遇到困難時,有同學的幫助,有老師的指點,大家不僅幫助我解決問題還慷慨地分享了曾經相似的經歷以及總結出的經驗,讓我不僅排除了難題而且學到了更多的技巧和知識。面向物件設計原則規範了我的程式設計過程,設計模式讓我學到了諸多精妙的設計思路,軟體工程實踐訓練讓我將這些所學應用到實實在在的開發工作中,一方面加深了對面向物件設計原則和設計模式的認識和理解,另一方面提高了我的程式碼質量並且提升了程式碼的邏輯合理性。
  • 在Bug定位方面,我的能力也得到了很大的提高。一方面歸功於實踐量的增多,累積經驗也越來越豐富,很多常見的bug(有些出於環境問題,有些出於程式碼編寫疏忽)都能夠很快地找到並修復。另一方面藉著開發實踐的機會,我在部落格園上搜了不少關於bug查詢地帖子,學習技術達人的bug定位技巧,並且運用在開發過程中,爭取儘快地掌握其中技巧和精華。
  • 之前一直覺得搭建開發環境就是裝軟體,看看安裝教程就能搞定。而隨著使用工具的增多,慢慢意識到這其實是一門很深的學問,能否順利安裝好一款開發軟體,有時候是對開發者的能力和知識基礎的考量。這次軟體工程實踐應用的主要開發工具是MyEclipse和MySQL,前者的搭建很順利,而在搭建後者時遇到了較多的問題比如:MySQL安裝完畢後無法正常啟動,檢視日誌發現缺少data目錄,解壓資料夾中缺少my-default.ini配置檔案,以及在window7作業系統下開啟tomcat的可執行檔案時提示Unable to open等。好在有隊友的幫助和自己的鑽研精神,最終通過不斷嘗試解決了這一難題。雖然問題解決了,但是該過程也反映了搭建環境能力不足,這與知識積澱和開發經驗直接相關,說明在往後的學習過程中要注意完善和提高。
  • 軟體測試方面,軟體測試的目的是為了發現軟體設計和實現過程中疏忽所造成的錯誤,本次實踐的軟體測試是我做的第一個軟體測試。起初的測試僅僅是人工隨機測試,這種測試方式不僅測試進度慢,而且測試效果也不好,然後我們才意識到應該系統地瞭解一下軟體測試方面的方法、工具和專業流程。軟體測試中有測試策略,有系統測試,還有除錯技巧,其中系統測試又包括:恢復測試、安全測試、壓力測試、效能測試和部署測試。我們最終選用的測試工具是robotframework,這是一款python編寫的功能自動化測試框架,具備良好的可擴充套件性,支援關鍵字驅動,可以同時測試多種型別的客戶端或者介面,可以進行分散式測試執行。robotframework工具幫助我們發掘出許多bug,我們在此基礎上修繕系統,測試效率明顯提高,系統性能大大提高。
  • 不足之處:專案中還有好幾個創新點沒有能夠實現,以及部分可優化的地方沒有來得及在提交專案之前完成改善工作。出現這個情況的原因一方面是開發效率不夠高,尤其是在前期階段,由於開發經驗不足走了很多冤枉路;另一方面,因為團隊是剛剛組建的,大家之間的默契程度不夠高,在開發過程中慢慢磨合後,才有了越來越好的配合效果。所以,在今後的工作學習中應當注重動手實踐,多多經歷以積累經驗,並且在正式開發前預估可能遇到的問題,合理且彈性地安排時間。

2.總結這門課程的實踐總結和帶來的提升,包括以下內容:

(1)統計一下,你在這門高階軟體工程實踐中,完成了多少行的程式碼

程式碼量來自兩個方面,一是軟體工程實訓,二是平時的設計模式作業,其中前者是主體部分,累計約1.2萬行。

(2)高階軟工實踐的各次作業分別花了多少時間?(做一個列表)

作業 花費時間 作業 花費時間
軟體工程第一次作業-準備 6h 專案Alpha衝刺Day8 9h
軟體工程第一次作業 2h 專案Alpha衝刺Day9 13h
軟體工程第二次作業 3h 專案Alpha衝刺Day10 11h
設計模式第一次作業 5h 專案Alpha衝刺Day11 13h
設計模式第二次作業 7h 專案Alpha衝刺Day12 9h
設計模式第三次作業 9h 專案Alpha衝刺測試隨筆 3h
團隊展示 3h 專案Alpha衝刺總結隨筆 5h
選題報告 4h 專案Alpha衝刺集合隨筆 0.5h
選題報告ppt 8h 專案Alpha衝刺事後諸葛亮 3h
選題報告評審表 1h 專案Beta衝刺預備 3h
選題部落格隨筆 1.5h Beta衝刺第一天 12h
需求分析部落格隨筆 5h Beta衝刺第二天 10h
需求分析PPT和評審表 8h Beta衝刺第三天 9h
需求分析報告 8h Beta衝刺第四天 12h
專案Alpha衝刺Day1 10h Beta衝刺第五天 13h
專案Alpha衝刺Day2 12h Beta衝刺第六天 10h
專案Alpha衝刺Day3 11h Beta衝刺第七天 11h
專案Alpha衝刺Day4 11h Beta衝刺總結 5h
專案Alpha衝刺Day5 12h 使用者調查報告 6h
專案Alpha衝刺Day6 9h Beta衝刺集合 0.5h
專案Alpha衝刺Day7 12h 專案驗收PPT 12h
個人實踐總結 10h

(3)哪一次作業讓你印象最深刻?為什麼?

讓我印象最深刻的是alpha衝刺的中期階段。由於在alpha前期遇到了很多沒有預見的問題,多花費了很多時間在解決這些問題上,導致接下來的後幾天(也就是alpha衝刺的中期階段)一度處於趕進度的狀態,由於院樓大門晚上10點半關閉,所以那段日子(將近一個禮拜)大家都是翻窗戶離開院樓的,回到宿舍一般是0點多。為了不影響整體的程序,故有一些天的當天任務沒有完成,回到宿舍後要繼續加班。那段時間確實是很艱難的一段時光,能睡夠六個小時已經是很奢侈、很享受的事了。現在可以帶著微笑回想這段時光,給這段歲月貼的標籤也從艱難換成了奮鬥。之所以能夠如此,是因為堅持,是因為自己的不拋棄不放棄和大家的互相鼓勵。也好在那個階段的奮鬥,很快地趕上了進度,給alpha的後期減輕了不少工作負擔,也增強了我們每個人的信心,讓我們更加相信這個團隊的潛力,相信這份潛力在敏捷開發思想的指導下能夠爆發出很大的能量。

(4)累計花了多少個小時在高階軟工實踐上?平均每週花多少個小時?

軟體工程實踐方面所花時間約230小時,衝刺持續3周,平均每週約77小時。

(5)學習和使用的新軟體

  • 開發軟體:MyEclipse 2014
  • 資料庫軟體:Mysql
  • MyEclipse企業級工作平臺是對EclipseIDE的擴充套件,利用它可以在資料庫和JavaEE的開發、釋出以及應用程式伺服器的整合方面極大的提高工作效率。它是功能豐富的JavaEE整合開發環境,包括了完備的編碼、除錯、測試和釋出功能,完整支援HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate。MyEclipse 是一個十分優秀的用於開發Java, J2EE的Eclipse 外掛集合,MyEclipse的功能非常強大,支援也十分廣泛,尤其是對各種開源產品的支援效能好。MyEclipse可以支援Java Servlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC資料庫連結工具等多項功能。
  • MySQL是一個關係型資料庫管理系統,是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體。MySQL是一種關係資料庫管理系統,關係資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

(6)學習和使用的新工具

學會使用RobotFrameWork測試工具對系統進行測試。Robot Framework是一款python編寫的功能自動化測試框架。具備良好的可擴充套件性,支援關鍵字驅動,可以同時測試多種型別的客戶端或者介面,可以進行分散式測試執行。主要用於輪次很多的驗收測試和驗收測試驅動開發。

(7)學習和掌握的新語言、新平臺

對Java語言的掌握更加到位,同時也學到了html、css、js、jQuery的基礎語法,能夠實現一些普通的功能。學習了github平臺的使用方法,在組內實現協同開發,提高了開發效率。GitHub是開原始碼庫以及版本控制系統,作為一個分散式的版本控制系統,在Git中並不存在主庫這樣的概念,每一份複製出的庫都可以獨立使用,任何兩個庫之間的不一致之處都可以進行合併。

(8)學習和掌握的新方法

  • 掌握了多種設計模式的使用方法,主要是策略模式、介面卡模式、工廠方法模式、模板模式等。
  • 學習了mybatis框架的使用方法。MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java物件)對映成資料庫中的記錄。

(9)其他方面的提升

主要是讓我更加清楚地意識到如何成為一名合格的開發者。通過這次實踐,在和其他組員的合作中我更加深刻地感受到一名合格的開發者應該具有個人責任感,這對整個團隊而言至關重要,每個人應當盡力實現對同伴、隊伍的承諾。一名合格的開發者應該具有奉獻意識。要樂於與組員分享經驗和心得,幫助他們解決困難,提高整體的水平和效率。一名合格的開發者應當具有敏銳的意識,能夠注意到專案的進展趨勢和瓶頸所在,根據環境的變化和組員的工作情況靈活地調整自己的行為。一名合格的開發者應當能夠承受一定的壓力,需求的增加、環境的苛刻、同伴的失誤、截止日期的迫近都是專案開發中常有的壓力來源,在這種壓力環境下一名合格的開發者應當儘可能合理、妥善地處理好這些情況。最後,一名合格的開發者應當有良好的洞察能力,留心細節,這有利於在關鍵時刻做出準確判斷和重要決策。

二、寫下屬於自己的人月神話——個人或結對或團隊專案實踐中的經驗總結+例項/例證結合的分析

  • 軟體需求分析的一個重要部分是問題分解,在確定軟體範圍的活動中,不必想著把問題拆分完全,只要分解部分主要方面即可,如必須交付的功能和內容(訊息)及使用的過程。面對複雜的問題,我們常用的策略是分而治之,即把一個複雜的問題劃分為若干個更容易處理的小問題。在對問題進行預估之前,應儘可能對軟體範圍中所描述的軟體功能進行評估和細化,以提供更多的細節。因為成本和進度估算都是立足於功能,所以對功能進行某種程度的分解是十分必要的。
  • 軟體具有不確定性和互操作性,這些特性會給開發帶來很多問題。為了有效地處理這些問題,必須建立切實可行的方法來協調小組成員之間的關係。為了滿足這一要求,必須建立團隊成員之間的溝通機制。溝通交流可以分為正式的交流和非正式的交流。正式的交流包括報告、會議等,非正式交流包括日常的討論和協商。前者需要制度規範,嚴格按照一定標準執行,後者則相對靈活,根據個人或團隊習慣採取合適的方式進行,可以提高效率為目標進行方式選擇。
  • 團隊負責人是團隊中的關鍵角色。優秀的負責人應當鼓勵每一位成員,給每個人合適的平臺供其發揮其最大價值和才華,並且促進組內交流,激勵大家互相學習,取人之長補己之短,提高團隊整體實力。負責人還需要有敏銳的洞察力,能夠時時感知到專案的瓶頸所在以便於及時調整開發任務的分配。優秀的負責人必須有能力理解語言和非語言訊號,並對發出這些訊號的人要求做出反應,應當在高壓環境下保持良好的控制能力和應變能力。
  • 軟體工程實踐給予我們理論聯絡實際的鍛鍊機會。從理解問題(溝通和分析)、策劃解決方案(建模和軟體設計)到實施計劃(程式碼生成)及檢查結果的正確性(測試和質量保證),這個完整地過程提高了我們每個人的綜合能力,包括資訊檢索能力,程式碼編寫能力,文案撰寫能力,知識梳理能力和溝通交流能力等。敏捷開發使我們深刻認識到團隊的力量遠遠大於簡單的累加求和。我們不應該低估自己的潛力,只是大多數時候我們缺少的是咬緊牙關的堅持和背水一戰的決心。這次軟體工程的實踐雖然已臨近尾聲,但這段經歷帶給我們的鍛鍊和啟示會伴隨我們往後的學習,我們會將軟體工程實踐的精髓和敏捷開發的經驗融入生活和工作,創造更多的價值。

三、對下一屆實踐的建議,或者對於開學初的你,對於大一的你,對於開學初的我,你有什麼想建議和告知的呢?

通過這個學期學習軟體工程的體驗,我想給後來者以下幾點建議:

  • 珍惜難得的鍛鍊機會。軟體工程這門課中的專案實踐環節從專案開題、使用者需求分析,到制定計劃,程式設計實現以及專案測試、使用者反饋等。這是一個完整的專案開發過程,也許有很多其他專業課也包括實踐環節,但很少有像軟體工程實踐這般、具有完整的實踐過程。而且之前很多時間都花在了課堂上,學了不少的理論知識,軟體工程實踐正是理論聯絡實際的平臺,不僅能鞏固知識,更重要的是讓實踐者知曉如何將知識轉化為實際的價值。故建議大家好好珍惜難得的鍛鍊機會。
  • 不要畏懼困難、逃避困難。專案開發的各個階段會遇到各種不同型別的問題。比如搭環境階段可能會遇到配置檔案出錯的情況,實施計劃的時候可能遇到了意料之外的問題而拖慢進度,程式設計時遇到bug找了很久卻沒能成功定位,專案測試時不會使用專業的測試軟體以及在組內討論意見不一時激烈的辯論……林林總總,都是正常的,是軟體開發的必經之路。如果被困難嚇退,那麼這段時光很有可能會成為開發的陰影;反之,解決困難、戰勝困難,不僅在日後回想起時能夠有成就感,而且大大增強了對自己能力的信心。
  • 有耐心。常言好事多磨,即使有認真完成專案的態度,在真正執行時還是會有很多心浮氣躁的時間段存在。其主要原因可歸結為兩點:一是開發過程中並不一帆風順,畢竟目前大家的專案經歷十分有限;二是除了軟體工程實踐外,大家還有科研、課程、考試等其他事情需要兼顧,若不巧事情集中在同一時間段,則難免會心生浮躁。故請大家保持耐心,這是做好軟工實踐以及其他事情的重要保障。
  • 保持良好的心態。虛心地向老師同學們請教,這比孤軍奮戰效率高得多。保持積極向上的態度,少一些抱怨和煩躁,會發現其實情況沒有那麼糟糕,問題也都是可以解決的。熱心幫助他人,這不僅有利於提高整體的效率 、加強自身對知識、技巧的掌握,而且能夠提升自身的價值。經歷過這些之後,會發現自己真的收穫了很多,程式設計能力、查錯能力、測試能力、寫作能力、表達能力等各方面能力都會有明顯的提高。
  • 藉此機會我還想分享一篇文章。這篇文章是老師在佈置第一次作業時推薦的。文章的標籤是:熱情、能力、選擇。我想表達的是有了熱情和興趣,無論是工作還是學習都會快樂很多。

    興趣和熱情只能讓你很執著,但並不一定能讓你走好這條路,只有你的能力和你的強項才能讓你走好這條路。
    你的路你的人生要你自己決定,不要輕易的讓人幫你決定,那怕是你的家人。
    -- 引用自《對程式設計師職業的一些建議

四、分析一下自己所處的團隊。軟體工程實踐是大學裡少有的認真的團隊協作經驗。《構建之法》上說團隊的發展有幾個階段,你的團隊都經歷過麼,最後到達了“創造”階段了麼?(參考《構建執法》第17章 人、績效和職業道德)

  • 團隊發展分為四個階段:萌芽階段、磨合階段、規範階段、創造階段。
  • 我認為我們團隊經歷了前三個階段,目前處於規範階段,還沒有到達最後的創造階段。從建隊到現在不超過四個月,能順利度過磨合階段進入規範階段要歸功於團隊裡每個成員的責任心和團隊意識。目前我們團隊僅僅做過軟體工程實踐一個專案,訓練量尚不足以支撐這個團隊進階至創造階段。
  • 記得在建隊不久剛開展專案時,擺在面前的第一個問題就是選題,看似簡單的定題過程在實際開展時湧現出了很多需要考慮的因素,而且也沒有好的思路,對團隊所能接受的專案工作量和難度也是心中沒底,也是因此走了不少彎路。幸虧有了老師的點評和提醒,讓我們明白做專案應該做實用的產品,故應從使用者需求的角度出發,考察市場需要什麼,據此來確定題目。根據這個思路,我們注意到日常工作學習的主要場所實驗室其實是一個事務繁多的地方,而不同的事情的處理往往需要藉助不同的工具和平臺去實現,目前尚無合適的管理系統對實驗室的學生和事務進行管理,我們分析之後認為這是一個可以值得立項的需求基礎,故擬定方案開展專案。
  • 在計劃安排之後進入動手實踐階段,層出不窮的問題一度打亂了我們的進度,加上其他方面事情的干擾,團隊在那段時間裡處於浮躁的狀態,而且每天站立式會議上討論時也時常出現意見不一的情形,激烈地爭論之後往往使氣氛凝重。好在大家能夠理性地分析問題,有責任心和團隊意識,儘可能從團隊利益角度和使用者需求角度出發優選合理的解決方案,最終達成一致。也正是經歷過這些考驗地洗禮,大家之間越來越有默契,因為每個問題都是認真對待,有了這些的鋪墊後續的工作進行得順利很多。這大概是對我們磨合階段的概括。
  • 雖然大家之間合作得效率越來越高,遇到的困難被也一個個攻克,但是規範化仍是一個問題。比如軟體測試和程式設計規範,這方面在前期都沒有加以重視。此外,對於敏捷開發提出的12條原則我們也沒有完全遵循。故在度過磨合期之後,我們在站立式會議上著重討論了規範化的相關問題,強調了規範的重要性,制定了要求及懲處措施以督促每一位成員嚴格規範自己的工作。在大家的共同努力下,我們團隊進入了規範階段。

五、怎樣證明你學會了軟體工程?

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

(必須公開發布,有實際的使用者,一定的使用者量和持續使用量 (3 天后能保持10 - 100個使用者);而不是: 做沒有使用者使用的軟體)

  • 我們在專案開發的收尾時期將相關程式碼在GitHub平臺上開源;
  • 在需求報告中提出的所有功能全部實現,並且通過測試,保證質量;
  • 專案測試並debug後的第二天我們就將該系統投入到團隊實驗室試用,涉及使用者數量50+。

(2)通過一系列工具,流程,團隊合作,能夠在預計的時間內釋出 “足夠好” 的軟體

(有專案規劃/需求/設計/實現/釋出/維護,有定時的進度釋出 ; 而不是: 通過臨時熬夜,胡亂拼湊,大牛一人代勞,延遲交付等方式糊弄)
從選題報告到使用者需求分析,及後續的專案設計、人員分工,alpha衝刺和beta衝刺的程式設計實現,專案測試,還有最後的使用者使用反饋,我們都認真對待,燃盡圖從滿到零,在計劃時間內完成任務。

  • 我們有明確的專案規劃和人員分工,若有調整會在當天的隨筆中記錄;
  • 我們的需求分析經過調研和分析,根據實際需求撰寫需求分析報告作為後續工作的指南;
  • 經過兩個階段的開發,我們實現了所有在需求分析中提到的功能;
  • 根據使用者的使用反饋,我們對系統中的前端介面佈局後後臺設計進行完善,實現維護;
  • 在每個階段開始前釋出預備隨筆,在開發階段的每一天釋出當日隨筆作為進度記錄;
  • 團隊分工明確,人人各司其職又相互合作、幫助,不存在一人代勞的現象;
  • 專案如期交付,沒有推遲延期。

(3)並且通過資料展現軟體是可以維護和繼續發展的。

(而不是:找不到原始碼,程式碼無文件,程式碼不能編譯,沒有task/bug 等專案的發展資料)
團隊的所有行動都在部落格園上有所記錄,主要包括以下幾個方面。

六、個性發揮,包括圖文、照片和創意等

完成專案之後,一篇一篇地點開每次隨筆和作業,回首一路走來的付出與收穫,重溫老師當時分享的文章,感觸良多。

加強實踐與執行力。不要欠生活,不要欠工作。出來混,總是要還的,你不會的知識,你懶於想通的東西,總是會在一個必要的時候提醒你、懲罰你。將沒有搞懂的、希望做到的東西,寫在紙上、貼在面前,認真實踐,當你做到的越來越多的時候,你就會越來越自信,你的層次會提高的。相信我,人與人之間的差距很大,原因在於自我控制力有差距。

-- 引用自《在失望中尋找希望

保持積極向上的心態,事在人為。