天天看點

對于《軟體工程》的總結

軟體工程課程總結

一、對前期提出的問題的回答

      學了一個學期的《軟體工程》之後再回顧自己第一天的部落格,重新再看當初提出的問題,如今都在學習和實踐中找到了自己的答案。

   1.為什麼我們不能隻精通一種語言?

     回答:

     我總結一下自己大學三年的經曆說一說吧。曾經大一的我以為精通C語言就夠了,直到後來學習了Java,後來我發現Java還能寫網站挺不錯,直到發現部署windows太麻煩大三上個學期後又學習了C#,于是乎我以為C#就夠了,結果發現網頁很醜,然後又要學習了HTML/CSS,後來發現這樣還不夠炫,這個學期又有了J2EE的學習。于是就這樣我跟着學校的課程學了一樣有一樣的技能,學的東西越多就會發現,好像自己會的東西越來越不夠用。 

      是以我覺得分階段來說:首先,要做的是,搞定一門語言,我們不說精通,因為沒有幾個人能精通一門語言,說自己精通XXX的,大多是吹噓的。首先要搞定一門語言,如果知道好多門語言,結果做起項目來,稍微深一點的東西就做不了了。其次,你的主要語言周邊的一些東西,開始接觸别的語言。但是,需要注意的是,永遠都是,學一個東西,就要讓這個東西能工作,不然就是浪費時間。  

      我以為我們應該掌握至少兩門語言(當然這隻是個人意見,僅供參考):面向過程的和面向對象的!(1)c語言是面向過程中最好的語言了,而且也比較好學,容易入手! (2)Java是面向對象中最好的語言了,而且現在大部分程式設計都用用的Java。但是這門語言比較難入門,要有耐心。對于專業課當然要學好,資料結構和資料庫當然要學好啦,學不好這些以後的課就很難看懂了!

  2.什麼是單元測試?

    回答:

      單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。對于單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個菜單等。總的來說,單元就是人為規定的最小的被測功能子產品。單元測試是在軟體開發過程中要進行的最低級别的測試活動,軟體的獨立單元将在與程式的其他部分相隔離的情況下進行測試。

     經常與單元測試聯系起來的另外一些開發活動包括代碼走讀(Code review),靜态分析(Static analysis)和動态分析(Dynamic analysis)。靜态分析就是對軟體的源代碼進行研讀,查找錯誤或收集一些度量資料,并不需要對代碼進行編譯和執行。動态分析就是通過觀察軟體運作時的動作,來提供執行跟蹤,時間分析,以及測試覆寫度方面的資訊。 

      我認為測試應該是一個挺招程式員嫌棄的一個過程。測試到底有什麼用呢?在我看來測試不可能保證一個程式是完全正确的,但是測試卻可以增強我們對程式完整的信心,測試可以讓我們相信程式做了我麼期望它做的事情。測試能夠使我們盡早的發現程式的 bug 和不足。一個 bug 被隐藏的時間越長,修複這個 bug 的代價就越大。在日常的開發中,代碼的完工其實并不等于開發的完工。如果沒有單元測試,那麼如何保證代碼能夠正常運作呢?測試人員做的隻是業務上的內建測試,也就是黑盒測試,對單個的方法是沒有辦法測試的,而且,測試出的 bug 的範圍也會很廣,根本不能确定 bug 的範圍,還得去花時間來确定 bug 出在什麼地方。難道這就不浪費時間了嗎?甚至,這樣的方式,時間浪費的會更多。

    我的老師在上課的時候曾經警告我們:最後才修改一個 bug 的代過價是在 bug 産生時修改它的代價的10倍。我想正因為是這樣單元測試才顯的重要。它旨在強調在開發功能代碼之前,先編寫測試代碼。也就是說在明确要開發某個功能後,首先思考如何對這個功能進行測試,并完成測試代碼的編寫,然後編寫相關的代碼滿足這些測試用例。然後循環進行添加其他功能,直到完成全部功能的開發。

  3.如何讓自己的代碼更簡潔?

      我在之前的部落格上曾經明确的表達過自己觀點:自己的才華應該表現在設計良好的結構和模式,表現在幹淨易懂的代碼,表現在對空間的尊重,對代碼的尊重。這樣您才能赢得别人的尊重!代碼不是一次性的,需要重複的修改和重構,是以我們很多時候是在為未來寫點代碼。     

      我的總結了幾個步驟,依其重要順序:

       (1)能通過所有測試;(2)沒有重複代碼;(3)展現系統中的全部設計理念;(4)包括盡量少的實體,比如類、方法、函數等。

        這裡我還有兩個小技巧可以分享:

       (1)空語句:清理垃圾代碼的最後一步就是删除空語句,空語句就是名額簽間不存在任何内容的空語句。

     (2)注釋語句:我們在添加注釋語句時,就會要盡量避免添加那些即使删除後也不會影響網頁源代碼可讀性的注釋語句。 

  4.軟體開發領域都有那些思想?

        對于軟體開發來說大緻上可以分成兩種思想:(1)分層思想;(2)子產品思想。

    5.如何開發出符合使用者需求的軟體?

       在學習《軟體工程》的過程中我了解到,軟體開發是根據使用者要求建造出軟體系統或者系統中的軟體部分的過程。軟體開發是一項包括需求捕捉、需求分析、設計、實作和測試的系統工程。軟體一般是用某種程式設計語言來實作的。 軟體設計思路和方法的一般過程,包括設計軟體的功能和實作的算法和方法、軟體的總體結構設計和子產品設計、程式設計和調試、程式聯調和測試以及編寫、送出程式。

        要制作出使用者符合客戶需求的軟體,其中需求捕捉和需求分析都顯得尤其重要。在軟體工程中,需求分析指的是在建立一個新的或改變一個現存的電腦系統時描寫新系統的目的、範圍、定義和功能時所要做的所有的工作。首先調查組織機構情況,包括了解該組織的部門組成情況,各部門的職能等,為分析資訊流程作準備。然後調查各部門的業務活動情況,包括了解各個部門輸入和使用什麼資料,如何加工處理這些資料,輸出什麼資訊,輸出到什麼部門,輸出結果的格式是什麼。協助使用者明确對新系統的各種要求,包括資訊要求、處理要求、完全性與完整性要求。确定新系統的邊界,确定哪些功能由計算機完成或将來準備讓計算機完成,哪些活動由人工完成。由計算機完成的功能就是新系統應該實作的功能。

2.總結本學期這門課程的體會

       我最初學習《軟體工程》的時候不知道什麼是軟體測試、代碼管理、甚至連如何規範代碼都不知道,更别提需求分析這些東西。可以說我對如何開發軟體一無所知。但是經過這個學期的學習和實踐我學到了許多東西。剛開始上課的時候,總是思考如何做好軟體項目。認為學校的課程和考核混亂,是以總是很郁悶,認為自己學不到東西,尤其是每次到到要自己獨立做東西的時候就感到自己什麼也不會。

    但是《軟體工程》這門課,卻給了我一個很好的指引。這門課程的教學方法也與往常不大一樣,使用微網誌來反應作業,而不是直接像往常一樣上交作品項目+報告總結的方式。這樣一來我們學生的自主能動性就提高了很多,而且由于有大量的模拟實踐的作業,使得我們學生能夠将之前學過的内容學以緻用,進而積累了不少解決問題的經驗。通過這次《軟體工程》的學習,我們拓寬了知識面,鍛煉了能力,綜合素質得到較大提高。安排課程設計的基本目的,在于通過理論與實際的結合、人與人的溝通,進一步提高思想覺悟。尤其是觀察、分析和解決問題的實際工作能力,我個人覺得這應該算是一門培養成為能夠主動适應社會主義現代化建設需要的高素質的複合型人才的課程了。

    回顧我們這一學期的微網誌,就可以發現老師的用心良苦和自己的點點進步。它的一個重要功能,在于運用學習成果,檢驗學習成果。把課堂上學到的系統化的理論知識,嘗試性地應用于實際設計工作,并檢驗學習成果,看一看課堂學習與實際工作到底有多大距離,并通過綜合分析,找出學習中存在的不足,以便為完善學習計劃,改變學習内容與方法提供實踐依據。對我們來說,實際能力的培養至關重要,而這種實際能力的培養單靠課堂教學是遠遠不夠的,必須從課堂走向實踐。現在我從一開始對軟體開發的兩眼一抹黑,到手慢腳亂地完成四則運算程式,到兩人結對編寫四則運算的合作項目,再到小組的共同制作的耿丹師生基本資訊管理系統的項目,學會了将如何将大一和大二學到的知識都運用到實際來,并且用其來創造出有實用價值的東西來。但是我認為我們學到的還有遠遠比這個更有價值的東西,就是學會了如何和與他人合作共同創作作品,和對自己的自信心。

     軟體工程課程雖已結束,但我知道對于我來說《軟體工程》的學習才剛剛開始。我很感謝這個學期以來老師們對我的教導和幫助,謝謝你們!

3.對課程的建議

      我其實十分喜歡這種寫部落格的教學方法方法。這種方法既能從時間上保證學習進度和學習效率,并能有效的從習慣上調動每個學生的積極性,我個人覺得這種教學方法還是值得采用的。