By:成運暢+ 原創作品轉載請注明出處 + 《軟件工程(C編碼實踐篇)》MOOC課程http://mooc.study.163.com/course/USTC-1000002006
1.課程背景
? 軟件工程(C編碼實踐篇)時候本人作為研究生一年級的核心課程高級軟件工程課程學習的重要的一部分。該課程是在網易云課堂上開設的一門程序員基礎課程,整個學習過程是在線上完成的。而恰好該課程的網易云課堂制作人孟寧老師也是我們高級軟件工程的代課老師,這也使得我們有更多的機會能夠跟老師面對面交流課程問題和心得,盡管本科階段已經有了四年的軟件工程學習歷程,但這門課對我的幫助不可謂不大。
2.學習體會
? 課程初期,作為程序員基礎課程的該課程并沒有引起已經有四年軟工學習歷程的我過多的注意,但是越隨著課程的深入開展,我越是發現自己所欠缺的東西實在很多。本課程從最簡單的最細致程序員注意事項開始學起,通過一個小小的C語言項目的不斷演化,體現了許多工程化的思想和方法,從而讓我們更加深刻的理解軟件工程理論的內涵。通過跟隨模仿孟寧老師的代碼實現,從無設計代碼,模塊化設計的代碼,到可復用的代碼和回調函數等接口設計,提高了我們工程化代碼的編寫能力,讓我們能夠嚴格遵守代碼風格規范來編寫代碼。總之,這門線上課程重視實踐,可以使我們對軟件工程有一個直觀感性的認識。從編碼規范到項目設計和開發的準則,這些東西是我之前學習過程中從沒有重視和注意的,隨著對軟件工程學習和理解的不斷深入,越是發現這些準則和習慣的重要性,以及它們對合作開發的幫助和對學習效率的提高。該課程對于入門程序員幫助尤為明顯,從學習初期就養成規范標準的開發習慣將對整個學習工作生涯受益匪淺。所以該課程可謂高質量程序員入門必學的起跑線課程。
3.學習總結
? 該課程并沒有什么代碼量,老師在講授過程當中更加注重的是將軟件工程的思想表達出來,工欲善其事必先利其器,確立明確的設計和開發標準往往在軟件開發中占據著十分重要的地位。本課程介紹了代碼書寫的規范,介紹了一些模塊的設計準則,通過對其總結,大概明確了項目開發的基本步驟:
1)對所要完成的任務進行抽象,設計基本的數據結構;
2)進行模塊化設計,一個模塊只完成一類相似的任務,并且要具有可重用性;
3)對模塊的接口進行改進,使其達到高內聚低耦合;
4)對模塊進行封裝,信息隱藏。
這些模式跟語言無關,無論你的發展方向如何,這些都是基本而且必要的。本人之前是做Java開發方向的,仍然受益匪淺。當然實際應用過程中還是需要多多實踐,在自己的開發過程中真切的注意到這些方面,才能深入消化和理解所學。
4.課程實驗
實驗報告目錄:
實驗一:寫一個hello world小程序
? 主要是熟悉實驗樓環境,初步了解代碼規范,熟悉linux基本命令,包括cd、ls、mkdir等命令,vim基本命令,包括vi使用,一般模式、編輯模式、命令模式等模式切換,markdown的書寫,包括標題、插入鏈接、插入圖片、兩次enter等。
實驗二:命令行菜單小程序V1.0
實現了命令行的小程序,最主要的學習到很多代碼規范,包括:
縮進4個空格
變量命名采用lowCamel風格
類型/類/函數名用Pascal風格
類型/類/變量名用名詞或名詞組合
函數名用動詞或動賓短語
括號清楚地表示邏輯優先級
所有{和}獨占一行,且成對對齊
不要把多個語句和多個變量定義放在同一行
注釋、文件名、路徑等用英文ASCII字符,不要用中文和特殊字符
實驗三:內部模塊化的命令行菜單小程序V2.0
將程序內部進行模塊化,設置接口,使程序更加邏輯清楚
KISS(keep it simple and stupid)一個函數或者方法只做一件事
Using design to frame the code 設計與實現保持一致
Including pseuducode
不要和沒陌生人說話
合理運用Control Structure和Data Structure簡化代碼
一定要有錯誤處理 goto 語句的用法用數據結構簡化代碼
實驗四:用可重用的鏈表模塊來實現命令行菜單小程序V2.5
將數據結構抽出來獨立成一個通用模塊的技巧,linktable模塊與具體的數據類型無關,是一個通用的鏈表模塊,我們要用到模塊時,再具體定義數據類型。這樣就可以在C語言沒有泛型的情況下盡最大可能復用數據結構的代碼,這是非常厲害的技巧
用可重用的鏈表模塊來實現命令行菜單小程序,執行某個命令時調用一個特定的函數作為執行動作
鏈表模塊的接口設計要足夠通用,命令行菜單小程序的功能保持不變
可以將通用的Linktable模塊集成到我們的menu程序中
接口規范
實驗五:用callback增強鏈表模塊來實現命令行菜單小程序V2.8
學習利用callback函數參數使Linktable的查詢接口更加通用。
當我們向用戶提供接口的時候,要學會注意接口信息的隱藏,只提供給對方必要的信息,而不能完全暴露自己的信息,以免被別人攻擊,修改自己內部信息而造成不可預估的后果。
實驗六:函數的可重入性(reentrant)及線程安全(本次實驗內容無報告)
實驗七:將menu設計為可重用的子系統
將menu設計為可以重用的子系統,利用命令行參數argc/argv來處理命令參數,由于menu函數是提供給用戶使用的,它只需要向外提供一個執行命令的方法和一個初始化方法。
Makefile,這個我是新學到的,真的很好用,程序更加有套路,編譯程序更方便,相信以后會越來越多的用到,。
大概了解了函數getopt的用法,雖然基本實現了復雜命令參數,但是getopt函數里的定義的幾個全局變我并不太清楚其功能,在后續的編碼中,應該繼續完善
5.課程小遺憾
? 該課程作為程序員基礎課程難度足夠,但個人覺得對有一定基礎和開發經驗的程序員來說,更希望有一些項目實戰,希望老師能夠制作適合這一類程序員的進階版的軟件工程,十分期待。對老師幽默的教學風格十分喜愛~