? ? ? ? 在經(jīng)歷了2個(gè)星期對(duì)Linux C的學(xué)習(xí)之后,上個(gè)星期我著手開始進(jìn)行項(xiàng)目,項(xiàng)目的內(nèi)容是一個(gè)功能比較簡(jiǎn)單的網(wǎng)絡(luò)聊天軟件。這次的項(xiàng)目總體來說比上次的學(xué)生管理系統(tǒng)難得多,但是反而花費(fèi)的時(shí)間比上次要少一些,說明自己相比初學(xué)入門的時(shí)候更加熟練了,特別是學(xué)習(xí)期間總結(jié)出來的幾個(gè)方法讓我受益匪淺。在此我簡(jiǎn)單的和大家聊聊我進(jìn)行項(xiàng)目的過程,分享一下心得和感悟。
? ? ? ? 首先是對(duì)需求進(jìn)行分析。拿到項(xiàng)目文檔的那一天上午我們進(jìn)行了一場(chǎng)考試,所以我到下午開始才開始進(jìn)行準(zhǔn)備。首先我花了大概一天的時(shí)間進(jìn)行基本框架的構(gòu)思。受到教網(wǎng)絡(luò)編程的李彥昌老師的啟發(fā),我這次進(jìn)行項(xiàng)目設(shè)計(jì)時(shí)在筆記本上用畫圖的方式來輔助自己進(jìn)行構(gòu)思。這個(gè)項(xiàng)目分為服務(wù)器端和客戶端兩個(gè)部分,所以我將其拆成了兩個(gè)大塊,但同時(shí)這兩個(gè)模塊相互之間聯(lián)系緊密,必須同時(shí)思考兩者之間的數(shù)據(jù)往來狀況。所以我先從兩邊各自的功能需求入手,再?zèng)Q定如何實(shí)現(xiàn)功能。
? ? ? ? 但是當(dāng)我框架搭的差不多了,實(shí)際開始著手進(jìn)行編碼時(shí)我發(fā)現(xiàn)了一個(gè)問題,由于自己的經(jīng)驗(yàn)不足,我無法判斷自己的解決方案的可行性如何,必須通過之后的實(shí)際驗(yàn)證才能確定方案的可行性。所以實(shí)際上真正將方案敲定下來是周四的事情了。期間我做了大量的試驗(yàn)和調(diào)試,在確認(rèn)最終的效果能達(dá)到我想要的了之后,我決定使用服務(wù)器端多線程——select結(jié)構(gòu),客戶端使用單進(jìn)程select結(jié)構(gòu)來實(shí)現(xiàn)多用戶登錄功能。相比其他方案,select的好處是可以并行響應(yīng),形成一個(gè)I/O多路復(fù)用的架構(gòu),滿足我多用戶即時(shí)通訊的要求。但是由于我對(duì)select函數(shù)并不熟悉,上課時(shí)老師也沒有著重講,所以我又花了額外的時(shí)間在網(wǎng)上翻閱資料和研究別人寫的代碼示例,并最終在自己的項(xiàng)目上實(shí)現(xiàn)了,算是一個(gè)小小的收獲。
? ? ? ? 就結(jié)果而言,最終我還是變成了像第一次做項(xiàng)目那樣,一邊構(gòu)思一邊寫代碼的狀態(tài)。不過與上次不同,這次編碼過程中我大量使用了偽代碼,在編碼寫函數(shù)的過程中,先大致用偽代碼搭建參數(shù)進(jìn)出過程的邏輯,再用C語(yǔ)言替換,拜此所賜我的思路條理也更加清晰,出現(xiàn)bug的概率也下降了不少。我決定繼續(xù)優(yōu)化自己現(xiàn)在自己的編碼風(fēng)格,將好的習(xí)慣繼續(xù)保持下去。
? ? ? 由于時(shí)間比較緊張,外加自己還不夠熟練,直到周六我才完成大部分的基礎(chǔ)功能,相比其他人做的項(xiàng)目,我將聊天系統(tǒng)整合在一個(gè)模塊里,通過“@用戶”的方式實(shí)現(xiàn)不切換窗口即可完成對(duì)目標(biāo)的私聊。這是我認(rèn)為自己做得比較有創(chuàng)意的地方。然后就是在客戶端退出的時(shí)候還有點(diǎn)小bug,有待修復(fù)。
? ? ? ? 最后我再聊點(diǎn)自己的想法吧,首先是對(duì)之前同學(xué)提出的熬夜問題,我個(gè)人是不提倡熬夜的,因?yàn)樵谏钜惯M(jìn)行腦力消耗大的工作一是對(duì)身體不好,二是工作效率也不高,三是還會(huì)影響第二天的狀態(tài)。其次是關(guān)于動(dòng)力的問題,對(duì)我來說,最大的動(dòng)力莫過于有想要完成的事。我是自己心中有定好的目標(biāo)才能堅(jiān)持學(xué)習(xí)下去,我覺得其他的同學(xué)也可以花點(diǎn)時(shí)間思考一下自己想要完成的目標(biāo),強(qiáng)烈的愿望才是最好的動(dòng)力。