原創作品轉載請註明出處《軟件工程(C編碼實踐篇)》MOOC課程http://mooc.study.163.com/learn/USTC-1000002006
軟件工程(C編碼實踐篇)》,課程的主要是講授軟件工程相關知識。孟寧老師並沒有侷限於傳統軟件工程科的授課方式,而是通過實現一個C語言小項目,不斷的改進、演化來呈現無設計代碼、模塊化設計的代碼、可複用的代碼和回調函數等接口設計,以及可重入函數、線程安全等較深入的設計問題。並且課程給出的代碼很全且詳細,通過跟隨模仿來訓練工程化代碼的編寫能力,辨識代碼的工程質量差異。
不同於其他的課程,這次的軟件工程採取的線上線下課程,讓我受益良多。由於是通過完善一個項目來不斷推進對軟件工程思想的理解,在學習的過程中並沒有感覺到枯,反而有了極大的興趣,使得我對軟件工程有了更深入的理解。同時,實踐的過程中不需要在自己的電腦上搭建環境,給自己負載滿滿的電腦帶來了極大的解放。
老師很幽默,每次看視頻的時候,都會打開記事本,寫下老師所說的內容,或者關鍵代碼。筆記截圖如下:
同時,視頻看完後也會立馬去完成線上的實驗,在線下實驗的時候,就會回顧本實驗的內容,並且通過go語言實現。在完成實驗後,會認真的寫實驗報告,記錄下自己實驗過程與思想,以及遇到問題。所寫的實驗報告得到了同學們的認可。
一、學習心得
好的軟件工程代碼是講究代碼的規範,設計的規範,模塊化思想,需要保證線程安全的,子系統的可重用。學習到諸多知識,僅列出其中的這一部分知識。
1. 在代碼的規範上,需要項目組統一格式,函數和變量的命名方式,每個語句前是用tab鍵還是用4個空格 等等都需要規範!寫代碼一定要考慮錯誤處理,編碼中的功能實現與錯誤處理符合20/80規律,大多數時間是寫錯誤處理使得代碼更健壯。
2. 在設計規範上,要保證代碼是高內聚,例如一個函數只做一件事,一個模塊只做一類事的,實現功能儘量用庫函數;還有要遵循“不和陌生人說話”的原則,以保證除了類提供的接口,別人無法訪問類的其他內容。同時要合理使用數據結構、控制結構等來簡化代碼。
3. 在模塊化的思想中,講究高內聚低耦合,接口要規範,代碼要注意通用性,接口定義了軟件單元對外提供的服務,函數名、參數和返回值是接口的三個顯性要素。
4. 在處理多線程問題中,需要關注函數是否是可重入的,使用互斥鎖,讀寫鎖以保證多線程安全。一個函數是可重入的,一個模塊是可重入的概念,若每個函數是可重入的,但整個模塊也有可能是不可重入的。
5. 在子系統的設計當中,要設計出可重用的接口。即使是makefile文件,也需要考慮到可重用性。
二、實驗報告
1. 實驗一:寫一個hello world小程序
實驗思路:a. 使用mkdir lab1創建一個文件夾,並在目錄下創建一個hello.c文件;
b. 使用vim打開的hello.c文件;
c. 在hello.c文件中寫入代碼並使用:wq命令保存;
d. 使用git add 、git commit和git push提交寫好的代碼到代碼庫;
實驗報告:https://www.shiyanlou.com/courses/reports/1270279
2. 實驗二:命令行小程序V1.0
實驗思路:a. 使用vim ~/.vimrc更改vim配置文件
b. 創建實驗文件夾lab2,創建menu.c
d. 使用vi menu.c,打開文件寫代碼
實驗報告:https://www.shiyanlou.com/courses/reports/1272283
3. 實驗三:內部模塊化的命令行菜單小程序V2.0
實驗思路:a. 首先將所有程序代碼寫在menu.c一個文件中
b. 待運行成功之後,將menu.c文件拆分爲3個文件:分別爲linklist.c, linklist.h, menu.c;
linklist.h文件中存放程 序的結構體定義和函數聲明;
linklist.c存放linklist.h聲明函數的實現;
menu.c存放具體的每個指令函數的實現
c. 重新運行程序成功
實驗報告:https://www.shiyanlou.com/courses/reports/1273261
4. 實驗四:用可重用的鏈表模塊來實現命令行菜單小程序V2.5
實驗思路:a. 首先創建linktable.h文件,寫入函數名以及宏定義
b. 創建linktable.c文件,寫入函數的具體實現
c. 創建menu.c文件,寫入對具體命令的操作等
d. 編譯執行文件
實驗報告:https://www.shiyanlou.com/courses/reports/1274961
5. 實驗五:用callback增強鏈表模塊來實現命令行菜單小程序V2.8
實驗思路:a. 在se_files目錄下通過命令tar -zxvf命令解壓lab5-1.tar.gz
b. 解壓完後出現lab5.1文件夾,進入該文件夾;
編譯linktable.c,linktable.h,menu.c三個文件,運行menu,發現quit命令無法使用
c. 打開linktable.c,修改語句,使程序能夠正確運行
d. 通過命令cp -r se_files/lab5.1/. Code/shiyanlou_cs122/lab5
將幾個文件拷入到lab5文件夾下進行接下來的實驗
e. 對linktable.h,lintable.c,menu.c三個文件進行修改,重新編譯運行
實驗報告:https://www.shiyanlou.com/courses/reports/1276057
6. 實驗七:將menu設計爲可重用的子系統
實驗思路:a. 首先像之前實現menu程序的接口,按照這次實驗要求封裝接口;
b. 修改命令行參數的方式,定義一個函數將命令行轉換成argc和argv;
shell將命令行解析成argc和argv傳遞給執行程序;
c. 將自己編寫的具體指令處理函數使menu程序接口定義在test.c文件中;
d. 編寫Makefile文件。
實驗報告:https://www.shiyanlou.com/courses/reports/1278273
三、總結
1. 對軟件工程的思想有了更進一步的認識,知道了函數的可重入性,線程安全等知識;
第一次懂得了如何在真正項目中應用軟件工程思想。
2. 同時在課程實踐過程中,對linux系統的一些指令和c語言有了進一步瞭解。
3. 懂得了如何使用makefile文件來編譯文件
遺憾:遺憾的是由於自己選的課不均衡,導致課都在下半學期,沒能夠上臺跟老師和同學分享知識。還有就是沒有更多的機會來實踐軟件工程思想,希望自己以後能夠將軟件工程的思想應用到自己所做的項目中。