1. 程式人生 > >軟體工程之路(一)——概論

軟體工程之路(一)——概論

概論

前言

從本科階段開始接觸計算機,到現在也2年多了,但大都是自己盲目的學習走馬觀花一般,沒有什麼系統性。最近接觸到Winform開發,在師兄的帶領下學到了很多東西。然而地痞流氓般的半路出家終歸不如系統學習過的人考慮的全面。這可能就是常說的有操作,沒意識(活該青銅…)。鄒欣老師的《構建之法——現代軟體工程》是不可多得的一本好書,內容生動有趣,乾貨滿滿,可以說是相當驚豔了。把東西寫下來一方面是把學到的以及體會整理一下,方便查閱,還有就是激勵自己,不斷學習,不斷進步。

一些建議

個人與團隊

軟體工程的學習是一個循序漸進的過程,注重在過程中體會學習,實戰比理論更重要。意識的培養不是空談出來的,需要針對例項,看如何一步步進行開發得出經驗教訓提升自己的水平。

  • 軟體開發分個人開發、團隊開發。個人開發就比較簡單了,只能是自我激勵,不斷總結。而如果是團隊開發,考慮的可能要多一點,綜合來說可以參照以下幾點:
    • 人員分工——分配任務具體到個人有利於提高作業效率,防止南郭先生的出現。
    • 明確的規則——這個規則包括流程中的規則,過程中獎罰的規則,以及標準的制定。分工合作,不同人之間能順利的完成交接,我認為這是衡量規劃是否恰當的一個指標。
    • 截止期限——事實證明,你永遠不知道你自己的潛力有多少,換句話說,人的潛力是無窮的,或者待開發的。這些行為需要一臺發動機來驅動,如果發動機熄火了,但不代表車就跑不動了。開不了那就外力來推。對每一階段的任務規定一個期限,並進行成果彙報或檢核。這樣的檢查通常難以讓人把任務堆到最後。
    • 注重使用者體驗——一個專案的開發,不以使用者體驗為主,那也是相當失敗了。你使用者體驗賊爛,那你完了,口碑下降不說,你廢大勁搞的東西沒人用不就尷尬了。一問就是這玩意太難用了,不會用。那優化軟體介面,做好與使用者的互動,必要時還要有單獨的文件說明,儘可能的傻瓜式操作,畢竟這群上帝們不是來幫你調bug的。
    • while(1) 總結、改進——開發的過程一方面是把自己的知識進行實體化,另一方面也可以不斷提升自己。要做到及時總結,認真體會,汲取經驗教訓,進一步完善專案,包括功能拓展,bug修復等,都是需要好好琢磨的地方。

開發的流程可以抽象為下面兩個階段

Alpha階段

  1. 開始維護以前開發出來的程式,理解它,然後!!理解使用者的痛點。
  2. 找Bug,改Bug,重構小部分程式碼;一部分同學可以開發測試用例。
  3. 在現有版本的基礎上做少部分增量開發,快速釋出並收集使用者反饋。

Beta階段

  1. 根據Alpha版本的反饋,進一步分析需求,估計實現需求的難度(此時應該能理解客戶需求是什麼)。
  2. 設計→開發(重構)。
  3. 迴歸測試(用到上面開發的測試用例)。
  4. 釋出,收集使用者反饋,看看新的版本是否真的解決了使用者的問題。
  • 迴圈進行Alpha、Beta階段。一開始的開發過程較為艱難,從Alpha階段入手,學習前人的方法,然後尋找bug,再做進一步開發。這有前人還是好的,大多數情況下都是從0開始,如何去設計也是個不小的問題,bug也是一直嗶嗶的閃。找bug的過程實則為深入理解這個專案的過程,那什麼是bug呢?
  • 在開發過程中,我們首先獲取到的是需求,有了需求我們才能去構思用什麼方式實現,需要具備哪些功能,bug也就隨之而來。
  • 對於bug,中文可以理解為缺陷,但bug並不代表就是錯誤,他可以理解為當用戶提供了指令或其他情況下該軟體產生了不符合設計初衷的一些行為。這樣看的話,軟體的開發又是一個不斷拓展可實用功能的過程。

一個簡單的程式

說是實現一個可以出30道加減法題目的程式。(大佬說一袋煙的功夫搞定,說實話太渣了,用了好幾個小時才勉強過關。)開發還是要從需求入手,使用者提了一點小小小小的要求:

  • 題目避免重複
  • 可定製數量和列印方式
  • 可以控制下列引數
  • 是否有乘除法
  • 是否有括號
  • 數值範圍
  • 加減有無負數
  • 除法有無餘數
  • 是否支援分數(真分數、假分數……)
  • 是否支援小數(精確到多少位)
  • 列印中每行的間隔
  • 用隨機數來生成題目中的每一項,並可以指定範圍。
str = random.Next(0, 20).ToString();//生成一個在0~20以內的隨機數,20可從外部獲取
  • 用checkedlistbox來控制題目中要用到幾種演算法,包括有無乘除法
    在這裡插入圖片描述
    該控制元件有一GetItemChecked方法,返回bool,檢查某一項是否被選中。
  • DataTable類中包含一個comput方法,用以計算字串型表示式。
  • 可以通過輸入答案與標準答案的對比來判斷結果的正確性。
  • 對已經做過的歷史題目儲存並顯示出來。
  • 將當前生成題目與前面出現的題目進行對比,如果一樣,就重新生成。
  • 如果答不出來可以跳過此題,提高容錯率。

軟體雛形如下
在這裡插入圖片描述

軟體開發類比成製作飛機有著不同階段

階段
玩具階段 紙飛機、航模,從思想上先進行轉變,先有了這種想法
業餘愛好階段 有了興趣就想著實現,比如用氦氣球帶著自己上了天
探索階段 萊特兄弟的飛天夢,雖然很短暫,卻是全人類大膽的一次嘗試
成熟產業階段 一個合格的產業機構,已經實現了從設計到實施的完整體系,包括種種保障,更加註重使用者體驗。

軟體工程是什麼

軟體工程是把系統的、有序的、可量化的方法應用到軟體的開發、運營和維護上的過程。
——鄒欣. 構建之法:現代軟體工程.

軟體的開發注重以下幾點:

  • 研發出符合使用者需求的軟體:需求來自於實際,而不是自己想象出來的“需求”或者人云亦云的需求。
  • 通過一定的軟體流程,在預計的時間內釋出足夠好的軟體:這個軟體不是為了應付而急忙趕出來的,而是應該經歷了一定的軟體流程,通過全體團隊成員的努力,在任務計劃內逐步完成的。
  • 通過一定方式展現所開發的軟體是可以維護繼續發展的:例如,對使用者需求有詳細的分析,包括對將來這類軟體發展的趨勢的分析。主要功能都有設計文件,原始碼完整,有修改記錄,並有最後版本。對於已知的bug和將來的工作都有詳細的記錄。

努力切實做到上述幾點!!