1. 程式人生 > >《軟體工程》學習總結

《軟體工程》學習總結

劉洋 原創作品轉載請註明出處《軟體工程(C編碼實踐篇)》MOOC課程http://mooc.study.163.com/course/USTC-1000002006 ”
  • 學習心得

        首先,必須要宣告一件事,這是一門非常有用且實用的課程。說實話,本以為這門課可能是對著某本書照本宣科一番,學習一些看上去非常高大上但是實際上用處不大的學術名詞……咳,但事實證明這確實是我想的太多。這門課是以做一個簡單的命令列選單小程式來說明一個軟體在程式碼編寫時如何做到更標準,更規範。而且在這門課中,我更是深刻地體會到了程式碼規範的好處,線下課中老師也強調了在實際工作中合作開發和其他後續工作的普遍性和重要性,其中最基礎的一點自然是規範的程式碼,這包括程式碼書寫規範,註釋清晰明瞭等等內容,在實驗中能夠詳細體現出來。

        其次,在程式碼模組化方面我受益匪淺。在本科時就學習過程式模組化的優點和重要性,在平時自己寫程式碼的時候也是很注意,希望儘量把程式做到模組化。然而這種所謂的模組化非常淺顯,只是簡單地儘量把程式功能分開,而沒有發現模組化更深層的要求,至少是不知道怎麼做到高內聚低耦合……這門課則清楚明瞭地向我們展示了最基礎的模組化怎麼設計,程式碼怎麼編寫,特.別.實.用。

        在上面的基礎上,還學習了什麼是可重入,怎麼去實現一個可重用的子系統,這些也都是非常實用的內容,我將在下一部分實驗中詳細敘述。

        作為第一部分的結語,我真心感謝學校要求必修這門課,真的獲益不淺啊~

  • 實驗列表

實驗一 寫一個helloworld小程式

實驗報告在這裡:實驗一

實驗要求

  • 寫一個hello world小程式:
  • 實驗樓Linux環境使用C語言編寫,編譯後執行輸出"Hello,World!";
  • 實驗和實驗報告務必在實驗樓linux下完成,課程視訊是在本地虛擬機器上操作的,除了目錄環境和作業提交方式不同外,基本的命令和編輯操作方式是一致的。

    這個實驗主要目的是要求我們熟悉實驗樓和git的操作,因為特別不熟悉,學習了實驗樓官方的教學,連結在這裡:Git實戰教程

    這幾次實驗下來,養成了儲存版本程式碼的習慣。在做了那麼多次實驗以後,我已經非常習慣於使用git來儲存程式碼了,相比較於之前有過的“辛辛苦苦一整天,一秒回到解放前”的經歷,這個儲存程式碼的習慣非常要得。並且儲存版本程式碼也是非常實用的行為,非常有助於程式碼的進一步開發和回顧,咳咳,當然也清晰明瞭地看到了自己的進步,非常有成就感。

    至於程式碼部分……恩,下一個。

實驗報告在這裡:實驗二

具體要求(參照視訊中的具體實驗過程):

  • 實現一個命令列的選單小程式,執行某個命令時呼叫一個特定的函式作為執行動作,實現的命令個數不少於8個;
  • 類似ftp的help目錄或者bash的help目錄;
  • 程式迴圈、接收使用者的命令,如help、others等命令;
  • 可以廣泛通用的命令列選單子系統元件,可方便地定製而嵌入到其他系統;

    這個實驗主要強調了程式碼書寫規範,養成正確的程式碼書寫習慣真的非常重要……作為一個輕微強迫症,我已經養成了奇怪的習慣……寫個文件都要前面空四個空格……但是結局實在是非常好,現在寫出來的程式碼非常清晰明瞭,可讀性upup~

    此外,對於vim編輯器的實用我也有了更深入的瞭解,具體使用的內容報告裡有寫,這裡就不再贅述。這裡感謝部落格:vim的使用方法,非常清楚明瞭。

    具體程式碼的難度不高,老師在教學視訊裡也描述地非常清楚,不多說,只把重要的程式碼書寫規範寫一下:

  • 縮排: 4個空格
  • 行寬: <100字元
  • 括號: 在複雜的條件表示式中,用括號清楚地表示邏輯優先順序
  • 程式的分界符‘{’和‘}’應獨佔一行並且位於同一列,同時與引用它們的語句左對齊
  • 分行: 不同的變數的宣告定義都不要放在一行
  • 命名: 下劃線用來分隔變數名字中的作用域標註和變數的語義; 型別/類/函式名常用Pascal形式,變數常用Camel形式;
  • 註釋和版權資訊: 註釋解釋程式做什麼(What),為什麼這樣做(Why),以及要特別注意的地方的; 複雜的註釋應該放在函式頭; 註釋(包括所有原始碼)應只用ASCII字元;每個原始檔頭應有版權描述等資訊
  • 空格: 程式碼行內要適當多留空格,如操作符前後、引數之間等

實驗三 內部模組化的命令列選單小程式V2.0

實驗報告在這裡:實驗三

實驗要求(參照視訊中的具體實驗過程)

  • 注意程式碼的業務邏輯和資料儲存之間的分離,即將系統抽象為兩個層級:選單業務邏輯和選單資料儲存
  • 要求:1)遵守程式碼風格規範,參考借鑑程式碼設計規範的一些方法;2)程式碼的業務邏輯和資料儲存使用不同的原始檔實現,即應該有2個.c和一個.h作為介面檔案。
    這個實驗主要就是簡單地把程式分成邏輯和資料兩個模組,這是最基礎的模組化的案例,為了更深入地瞭解模組化的思想和方法,我還參考了這兩個部落格:程式為什麼要模組化軟體模組化設計軟體模組化設計,基本講解了模組化的基本原則和設計方法~

    至於程式碼部分,難點沒有太多,比較順利地完成了。

實驗四 用可重用的連結串列模組來實現命令列選單小程式V2.5

實驗報告在這裡:實驗四

實驗要求(參照視訊中的具體實驗過程)

  • 用可重用的連結串列模組來實現命令列選單小程式,執行某個命令時呼叫一個特定的函式作為執行動作;
  • 連結串列模組的介面設計要足夠通用,命令列選單小程式的功能保持不變;
  • 可以將通用的Linktable模組整合到我們的menu程式中;
  • 介面規範;

    這次實驗也不是很難,但是非常重要,重點就在於介面的設計,介面定義了軟體單元對外提供的服務:函式名、引數和返回值是介面的三個顯性要素;五個要素:介面目標(purpose),介面假定(precondition),介面協議(protocols),介面後置條件(postsconditions)比如返回值,介面規範(quality attributes)。在工作中,介面常常用到,但是我從未思考過介面怎麼設計才標準易用……本科的時候學到的……早就忘光了。這次的實驗既是回顧又是學新,雖然老師講的非常明瞭,我也又看了一些資料,但是忘了是哪些了……下次一定不會隨手就關掉。

    程式碼部分難度也不大,簡單基礎,除了因為我之前為選單設計了二級選單這裡修改的需要麻煩一點,其他的和老師的實驗流程差距不大。

實驗五 用callback增強連結串列模組來實現命令列選單小程式V2.8

實驗報告在這裡:實驗五

實驗要求(參照視訊中的具體實驗過程)

本實驗在提供的程式碼基礎上進行

  • 給lab5-1.tar.gz(在實驗樓Linux虛擬機器環境下~/se_files/目錄下)找bug,quit命令無法執行的bug
  • 利用callback函式引數使Linktable的查詢介面更加通用
  • 注意介面的資訊隱藏

    非常有用的部分來了,本科的時候也學習過callback,但是因為非重點內容,老師一帶而過,我們也是聽聽就算了,一直沒弄明白callback函式到底是怎麼回事。這次課上講了以後,發現回撥的用法真是非常精巧,來來回回看了好多遍,實在是非常佩服第一個想到的人。在老師講解了這次實驗以後,我明白了回撥函式的使用優勢,簡單原理,但是落實到使用上還是有點蒙圈,所以又找了幾篇文章看:C/C++回撥函式,這篇文章通過簡單的例子,也清晰地說明了回撥函式的使用方法~

實驗六 函式的可重入性

    這次課沒有實驗內容,不過老師用非常有趣生動的例子講解了函式的可重入性與執行緒安全問題,讓人記憶猶新……我這輩子都不會忘了這個了~另外,執行緒安全與可重入也講的非常簡潔明白,記錄下來。

實驗七 將menu設計為可重用的子系統

實驗報告在這裡:實驗七

實驗要求(參照視訊中的具體實驗過程)

  • 為menu子系統設計介面,並寫使用者範例程式碼來實現原來的功能;
  • 使用make和make clean來編譯程式和清理自動生成的檔案;
  • 使menu子系統支援帶引數的複雜命令,並在使用者範例程式碼中自定義一個帶引數的複雜命令;
  • 可以使用getopt函式獲取命令行引數
    這次的實驗內容很豐富,首先是Makefile部分,這個以前沒有接觸過,也很新奇,參考資料在這裡:跟我一起寫Makefile,一共十四篇,非常非常詳實,有需要的童鞋可以移步過去看一下。

    另外還是介面設計,這部分的重要性在前面已有體現,不再贅述。

    還有一個非常重要的內容在於命令列引數,argc和argv。這部分老師也講的非常詳細。因為我一起沒有進行過命令列相關的研究,非常陌生且茫然,不過經過學習和實踐,已經有了很清楚的瞭解了。另外一些參考資料在這裡:C++ main函式中引數argc和argv含義及用法int main(int argc,char *argv[])中引數的意義,講的也很實用,非常有助於我對引數的理解。此外,這裡還具體實用了字串操作相關的函式還有getopt()函式,雖然網上有很多講解,一搜都是,我這裡還是想推薦一篇Linux下getopt()函式的簡單使用,作者很是風趣幽默,咳,也是忘不了系列哈哈~

  • 課後總結
    總之,經過這麼長時間的學習,對我最大的影響不在於學習了多少新的知識,而是在實踐中讓我不知不覺地養成了更好的程式碼編寫習慣,不僅是書寫更加規範,命名更加明瞭,還養成了儲存版本程式碼的習慣,這點最贊。此外,因為要找很多資料進行進一步的學習,我也養成了隨手儲存標籤的習慣,這也簡直不能更有用。作為一個對Linux不怎麼熟悉的未來程式設計師,在這次的實驗過程中還順帶學習了很多Linux系統相關的知識。萬事最怕有心人,真正的財富正是這些不起眼的小習慣,這麼一說,對未來更有信心了呢哈哈哈~
    過兩天再把線下的go語言部分放上來,和大家一起學習~以上。