1. 程式人生 > >軟體工程(C編碼實踐篇)學習總結

軟體工程(C編碼實踐篇)學習總結

軟體工程(C編碼實踐篇)學習總結

班級:軟設三班,學號:SA17225363,姓名:王世卿,網易雲暱稱:王世卿

一、學習心得

  雖然我本科是軟體工程出生的,但是從孟寧老師所講授的軟體工程(C編碼實踐篇)中還是學到了許多知識。孟寧老師作為中國科學技術大學的老師,上課認真,通俗易懂,思路清晰。在本門課程中,他帶著我們從寫一個簡單的“Hello World!”小程式,不斷的結合github程式碼託管平臺

模組化可重用連結串列模組Callback執行緒安全Makefile工程檔案高階軟體工程的思想,最終實現了一個可重用的選單子系統,使得我們受益匪淺。

  本門課程的學習主要分為兩大部分,第一部分是視訊講課,學習理論知識,第二部分是線上實驗,利用實驗樓這一平臺進行實際操作,下面針對每一部分說明我自己的個人收穫和理解。

1、理論知識

每一週老師都會放出一節課程,每一節課老師都會主講一個核心內容,從程式碼風格規範講到程式碼背後的軟體工程相關的設計思想,中間的課程會圍繞我們自己實現的命令列選單小程式來做一理論講解,這裡我就挑選其中印象很深刻的部分著重說明。

  • 程式碼風格規範,對於我個人覺得以下部分需要多注意:

    • 程式碼縮排4個空格
    • 程式碼給誰看?程式設計師
    • 程式碼風格規範在團隊協作和交流中有重要作用。
    • 行寬以前80,現在100
    • 程式碼風格的原則:簡明、易讀、無二義性
    • 不要把多條語句和多個變數定義放在同一行
    • 註釋使用英文,不要用中文,保持原始碼是ASCII字元格式檔案。
  • 模組化思想 :

    • ”開-閉”原則,對擴充套件是開放的,對修改是封閉的。
    • 業務邏輯層和資料儲存層。
    • 將系統模組放在不同的原始檔。
  • 程式碼設計中的一些常見方法:

    • KISS(keep it simple & stupid)
    • using design to frame the code(matching design with implementation)
    • including pseuducode
    • 不要和陌生人說話原則
    • 合理利用Control Structures、Data Structures來簡化程式碼
    • 一定要有錯誤處理
  • 介面的五個要素:

    • Purpose 比如函式名錶明瞭介面的目的
    • Preconditions 比如介面函式呼叫前已經做好了哪些準備
    • Protocols 比如引數和返回值的型別,指標指向的資料格式等
    • Postconditions 比如返回值、printf函式介面的效果是螢幕顯示了字串
    • Quality attributes 比如介面函式的執行時間限制在1s內
      前置條件和質量屬性是介面的兩個隱含屬性。
  • 可重入和執行緒安全

    • 可重入函式和不可重入函式,以及它們和執行緒安全之間的關係
  • Makefile工程檔案
    • make 從Makefile的第一個目標all開始執行
    • Makefile檔案不支援空格代替Tab鍵
    • Makefile工程檔案也是程式碼,也要考慮可維護性。

2、線上實驗

每一節課程之後都對應一個實驗,但整個線上實驗的主題都是圍繞著如何實現一個“可重用的選單子系統”。為了實現這個目標,孟寧老師在授課中指引我們運用軟體工程的思想,通過不斷地迭代,從一個簡單的列印“Hello World!”的字元輸入輸出程式,變成了一個具有複雜結構,功能強大的可重用的選單子系統。

  • 實驗一:寫一個hello world小程式
    • 加深自己對C語言編碼的實踐能力,同時對git指令進行復習和鞏固。
  • 實驗二:命令列選單小程式V1.0,具體要求參見視訊

    • 程式碼風格的原則:簡明、易讀、無二義性
    • 用表示式作為判斷條件,不要用布林變數做比較
  • 實驗三:內部模組化的命令列選單小程式V2.0

    • 學習了模組化的程式設計思想
    • 提高了menu程式的重用性
    • 掌握學習了c程式的編譯除錯方法
    • 程式碼設計中的一些常見方法
  • 實驗四:用可重用的連結串列模組來實現命令列選單小程式V2.5

    • 體會到介面使程式碼開發效率更高
    • 提高了menu程式的重用性
    • 掌握學習了c程式的編譯除錯方法
  • 實驗五:用callback增強連結串列模組來實現命令列選單小程式V2.8

    • 回撥函式是把函式的指標作為引數傳遞給另一個函式,回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
    • 回撥函式可以允許使用者把需要呼叫的函式的指標作為引數傳遞給一個函式,以便該函式在處理相似事件的時候可以靈活的使用不同的方法。
    • callback函式的使用提高了程式碼的重用性,實現了更鬆的耦合。同時將一些內部結構介面隱藏,簡化了使用者介面,更保證了使用安全,減少誤操作。
  • 實驗七:將menu設計為可重用的子系統
    • Makefile方法能夠減輕執行程式時繁瑣的指令輸入過程,尤其是在Makefile檔案中,程式碼必須以Tab鍵規範格式,不可以用四個空格鍵。
    • gets()方法有緩衝區溢位的問題,為了防止緩衝區溢位攻擊的危險,使用fgets()方法更好。
    • shell將命令j解析成argc 和 argv傳遞給執行程式,可以使用getopt函式獲取命令列引數。
    • 修改menu之後,能夠擴充套件功能,支援對新功能的新增。

二、實驗報告索引

三、總結

  學習了孟寧老師的這門軟體工程(C編碼實踐篇)課程,使我受益匪淺,雖然課程作業有點多,但是的確能收穫知識。縱觀整個線上課程的安排以及線上實驗的設定,孟寧老師匠心獨運,一步一步的指引了我們如何運用軟體工程的設計思想通過不斷迭代去實現一個“可重用的選單子系統”,其中軟體工程思想和C編碼實戰相結合,理論聯絡實際,有利於我們更好的掌握軟體工程的思想。本門課程具有完整的體系和完備的設計思想,使得我對軟體工程有了更深入的認識和理解。

最大收穫

   本門課程使得我對軟體工程有了更深入的認識和理解,將軟體工程的思想運用到C編碼實戰之中,最大收穫就是,程式碼規範很重要!程式碼規範很重要!程式碼規範很重要!此外,對之前比較模糊的執行緒安全和可重用函式有個清晰的認識,受益匪淺。

最大遺憾

  如果說遺憾的話,唯一的遺憾就是沒有能接觸到設計模式的思想。畢竟,設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

建議

  • 網易雲課堂和實驗樓來回跑確是有點麻煩,建議同學們本地裝個虛擬機器,然後實驗完成後直接將實驗程式碼實驗報告(READMD.md)提交到Github或者碼雲上,這樣就很直觀,清晰明瞭。此外,附上我的github
  • 希望之後孟寧老師在之後的課程中,能夠將設計模式的思想和C++(或Java)編碼實驗相結合,將會吸引更多的同學進來學習。

  • 祝孟寧老師的課程越辦越好,受益更多人!