1. 程式人生 > >《高階軟體工程》學習心得

《高階軟體工程》學習心得

一.課程總結
  我本科是通訊工程的,沒有學過軟體工程,學習這門課之前,一直以為這門課都是理論知識,各種紙上談兵的條條框框,一學期課上下來,發現並不是這樣,孟寧老師將這門課變成了實踐為主的動手課,而且必要的理論知識也不是很無趣的在課上講,而是選擇讓大家上課自己講PPT,不僅調動了大家的學習熱情,而且增強了課程的趣味性和參與感。總之這門課是讓我收穫很大的一門課,越到後來越發現,其實這些看似繁瑣的條條框框會使自己寫程式碼更規範,更易維護。我很慶幸開始寫程式碼一開始就學習了這門課,不然等養成了很多不專業的壞習慣之後,再改正就很難了,我現在一開始就會使自己以一種專業,規範的素養學習寫程式碼,這對我以後的發展和進步有很大積極作用。

二.實驗總結

2.1 實驗目錄

實驗一:寫一個hello world小程式
實驗二:命令列選單小程式V1.0
實驗三:內部模組化的命令列選單小程式V2.0
實驗四:用可重用的連結串列模組來實現命令列選單小程式V2.5
實驗五:用callback增強連結串列模組來實現命令列選單小程式V2.8
實驗六:函式的可重入性(reentrant)及執行緒安全
實驗七:將menu設計為可重用的子系統

2.2實驗詳解

實驗一:寫一個hello world小程式
本次實驗較為簡單,對於有C語言程式設計基礎的人來說主要是熟悉實驗樓的環境和操作,為以後的實驗打下基礎。從小程式入手,才能逐步的過渡到大的軟體工程專案,而且讓我們學會使用程式碼庫來管理程式碼,對於今後的維護和管理很有幫助。
實驗二:命令列選單小程式V1.0

在這次試驗中,我學會了如何編寫一個命令列小程式,並可以實現一些功能。並注意了老師再視訊中所提到的程式碼風格的問題。比如縮排要四個空格,花括號要獨立一行並對齊等。程式碼風格的標準話對程式設計師來說尤為重要,這可以增加程式碼的可讀性。 另外,linux的vim編輯器我使用的實在是不6啊,有點小憂傷,需要不斷學習其中的博大精深!還有模組化程式設計的思想,這次實驗中我把資料結構和有關操作分出來單獨寫到linklist.c中,menu.c中專心處理功能的實現,這樣使程式碼可重用性更高,程式碼更容易維護和擴充。
實驗三:內部模組化的命令列選單小程式V2.0
在這次試驗中,我學會了如何編寫一個命令列小程式,並可以實現一些功能。並注意了老師再視訊中所提到的程式碼風格的問題。還有模組化程式設計的思想,這次實驗中我把資料結構和有關操作分出來單獨寫到linklist.c中,menu.c中專心處理功能的實現,這樣使程式碼可重用性更高,程式碼更容易維護和擴充。
實驗四:用可重用的連結串列模組來實現命令列選單小程式V2.5

實驗四仍然是在上一個實驗的基礎上進一步改進,在實驗四中,要求使用用可重用的連結串列模組來實現命令列選單小程式,執行某個命令時呼叫一個特定的函式作為執行動作,連結串列模組能夠簡化對於命令列選單小程式的功能呼叫,如果在遇到較大規模的軟體,可重用連結串列模組能夠使得整體結構更加清晰。
實驗五:用callback增強連結串列模組來實現命令列選單小程式V2.8

在這一部分,是為了學習callback函式,它是一種實現模組通用性的實現機制,能夠實現模組解耦功能,利用callback函式引數使Linktable的查詢介面更加通用,同時我們也必須要注意介面的資訊隱藏。

實驗六:函式的可重入性(reentrant)及執行緒安全
 可重入(reentrant)函式可以由多於一個任務併發使用,而不必擔心資料錯誤。相反,不可重入(non-reentrant)函式不能由超過一個任務所共享,除非能確保函式的互斥(或者使用訊號量,或者在程式碼的關鍵部分禁用中斷)。可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料。可重入函式要麼使用本地變數,要麼在使用全域性變數時保護自己的資料。
 執行緒安全問題都是由全域性變數及靜態變數引起的。若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行讀寫操作,一般都需要考慮執行緒同步,否則就可能影響執行緒安全。如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。
 可重入的函式不一定是執行緒安全的,可重入的函式在多個執行緒中併發使用時是執行緒安全的,但不同的可重入函式(共享全域性變數及靜態變數)在多個執行緒中併發使用時會有執行緒安全問題(可能是執行緒安全的也可能不是執行緒安全的)讀寫鎖可以有效解決這裡的執行緒安全問題。
實驗七:將menu設計為可重用的子系統

Makefile方法能夠減輕執行程式時繁瑣的指令輸入過程,menu子系統的引入,能夠支援帶引數的複雜命令,在使用者程式碼中定義一個帶引數的複雜命令。有遇到一個問題,make的時候遇到報錯,* missing separator. Stop.通過網上查詢資料,將命令列的空格,改成TAB鍵即可。因為在Makefile檔案中,命令必須以【tab】鍵開始。

三.課程總結

     這是軟體工程的最後一次作業,在此寫上我本學期以來的體會和總結。

    從四月至六月底,學習軟體工程將近三個月的時間。從一開始的個人專案到後來結對程式設計再到團隊專案,期間經歷了太多的困難與挫折,當然也有成功收穫。有時會熄燈後繼續熬到一兩點還在修改程式,當提交成功後心裡還是挺興奮的。雖然軟體工程已經結課並考完期末考試了,但我才能高中學習到了很多,除了個人專業技術知識外,還意識到了團隊合作的重要性,這裡還是有很多地方是值得肯定的。

    一開始是我先入為主了,認為軟體工程可能與其他專業課相似,學習課本上的知識,在動手編一些程式進行練習,其實不然。在我看來與其說軟體工程是一門課,倒不如說它是一種思想。是一個引導我們如何去分析問題,如何處理問題的過程。應該說其範疇已經遠遠超過了這門課本身,成為一個綜合的一個能夠解決問題的思想的集合。

    需求分析—概要設計—詳細設計—編寫程式碼—專案測試—專案完成—專案維護,這是軟體開發的一般程式和過程,我認為這是一份非常有實際意義的教學內容,它讓我們的工作模組化,從而更加嚴謹,也能提升整體的工作效率。當我們畢業之後,走進企業,這是我們要實際運用的一個非常重要的技能,而不是僅僅侷限於軟體工程的範疇。即使以後從事其他行業,但這是做事的思維和方法也是一生受用的,都是從需求設計開始,一步一步的有條理進行,最終完成作品。我覺得這才是這門課的意義所在,這也是我感觸最大的地方。

  最大遺憾大概是沒有輪上去講臺上分享ppt,我其實準備了PPT,但是大家分享的太踴躍 ,我就沒有輪上。

“楊瑞 SA16225381 + 原創作品轉載請註明出處 + 《軟體工程(C編碼實踐篇)》MOOC課程http://mooc.study.163.com/course/USTC-1000002006