阅读后感
軟件工程期中作業(yè)(閱讀和提問(wèn))
本來(lái)打算每篇文獻(xiàn)寫(xiě)一份讀后感來(lái)著,讀了”There is a Silver Bullet”,借鑒其中把模塊的復(fù)用作為銀彈的做法,決定把經(jīng)歷總結(jié)和讀后感穿插成一篇去寫(xiě)。
part1 主要關(guān)于經(jīng)驗(yàn)總結(jié)
在寫(xiě)這一篇之前,我已經(jīng)經(jīng)歷了一次alpha階段的開(kāi)發(fā)(對(duì)聯(lián)項(xiàng)目),beta階段換了一個(gè)組(Julia-AI),此時(shí),beta階段也已經(jīng)經(jīng)歷了一半。
在alpha階段的開(kāi)發(fā)中,主要做的是前端的一個(gè)demo界面,這里一方面是對(duì)前端的工作不熟悉,另一方面是在開(kāi)發(fā)開(kāi)始的時(shí)候就定下來(lái)這次的開(kāi)發(fā)是以一個(gè)demo界面為主,不太需要考慮之后的發(fā)展(也就是篤定了之后要重構(gòu)的)這樣的念頭,所以基本也沒(méi)有做到對(duì)原型進(jìn)行很好的設(shè)計(jì)
- Simplicity-the design must be simple, both in implementation and interface. It is more important for the implementation to be simple than the interface. Simplicity is the most important consideration in a design.
- Correctness-the design must be correct in all observable aspects. It is slightly better to be simple than correct.
- Consistency-the design must not be overly inconsistent. Consistency can be sacrificed for simplicity in some cases, but it is better to drop those parts of the design that deal with less common circumstances than to introduce either implementational complexity or inconsistency.
- Completeness-the design must cover as many important situations as is practical. All reasonably expected cases should be covered. Completeness can be sacrificed in favor of any other quality. In fact, completeness must sacrificed whenever implementation simplicity is jeopardized. Consistency can be sacrificed to achieve completeness if simplicity is retained; especially worthless is consistency of interface.
- cited from"Worse is Better"
關(guān)于worse is better里面這樣的設(shè)計(jì)理念,我是覺(jué)得很好的。一方面來(lái)說(shuō),盡量好的設(shè)計(jì)可以滿足大部分常見(jiàn)情況下的需求,也就是說(shuō)幾乎可以滿足市場(chǎng),另一方面,這種做法可以合理的劃分主次,把主要精力放在攻克主要的領(lǐng)域上,同時(shí)又足夠的簡(jiǎn)單,可以說(shuō)是在“多快省”這三個(gè)方面權(quán)衡下的最好設(shè)計(jì)方式了。但是這種方法會(huì)對(duì)編程人員的項(xiàng)目經(jīng)驗(yàn)和架構(gòu)能力與洞察力有比較高的要求。在這次10天的alpha沖刺,這個(gè)原型的設(shè)計(jì)確實(shí)是被我忽視了的,只做到了足夠的簡(jiǎn)單,完成了一個(gè)算是完成各項(xiàng)功能模塊的demo,但是正確性和持續(xù)性幾乎是完全忽視了的。這也造成了最后的前后端邏輯是一個(gè)大泥球。
Therefore, focus first on features and functionality, then focus on architecture and performance
("Big Ball of Mud")
這篇文獻(xiàn)相當(dāng)于是給出了一個(gè)系統(tǒng)變成一個(gè)大泥球(一個(gè)雜亂無(wú)章的系統(tǒng))和如何進(jìn)行解決的方法。
反思,在沖刺的過(guò)程中做了什么事情讓這個(gè)系統(tǒng)變成了泥球了呢?首先像上面引用的那樣,只關(guān)注系統(tǒng)的功能,而對(duì)架構(gòu)缺乏設(shè)計(jì),這個(gè)可以說(shuō)是最根本的原因了。其次的一些原因,
Therefore, produce, by any means available, simple, expedient, disposable code that adequately addresses just the problem at-hand. “Big Ball of Mud”
開(kāi)發(fā)的時(shí)候確實(shí)抱著最后再進(jìn)行整理的心態(tài),但是到了后期整合各個(gè)部分的時(shí)候,發(fā)現(xiàn)由于缺乏前期的整體設(shè)計(jì),最后將各個(gè)模塊整理到一塊(比如接口調(diào)整等)就花費(fèi)掉了最后的沖刺時(shí)間。這就是在時(shí)間規(guī)劃上出現(xiàn)的問(wèn)題。做增量式改進(jìn)的時(shí)候,也就是每次對(duì)需求作出改進(jìn)的時(shí)候,過(guò)于急于看到效果,做的是最不經(jīng)大腦的修改,沒(méi)有考慮到各個(gè)模塊之間的解耦和對(duì)可擴(kuò)展性的支持。到了后期增加新的功能往往需要改動(dòng)的函數(shù)就會(huì)變得很多。不過(guò)beta階段整體架構(gòu)和代碼都在進(jìn)行重構(gòu),也是符合“Big Ball of Mud”中的重新讓項(xiàng)目有條理的做法的。
在沖刺的過(guò)程中,為了提升開(kāi)發(fā)的效率,很多模塊功能的實(shí)現(xiàn)并不是依靠自己去認(rèn)真的翻庫(kù),而是通過(guò)尋找功能類似的代碼去進(jìn)行復(fù)用,也就是寄希望于銀彈來(lái)提升開(kāi)發(fā)的效率。確實(shí),這樣效率是提高了不少,但是,像這篇“有人負(fù)責(zé),才有質(zhì)量:寫(xiě)給在集市中迷失的一代”中闡述的那個(gè)樣子,現(xiàn)在的開(kāi)源部分的代碼更多的像是一個(gè)大集市,很多代碼的質(zhì)量是沒(méi)有辦法保證的,特別是網(wǎng)上那些發(fā)布了代碼但是作者仿佛忘記了自己的賬號(hào)密碼的博客中對(duì)應(yīng)的代碼,經(jīng)常可以見(jiàn)到有人在下面評(píng)論在運(yùn)行過(guò)程中遇到了什么問(wèn)題但是并沒(méi)有能夠解決,但是往往過(guò)了一兩年這樣一條還是了無(wú)音信(當(dāng)然,也和提問(wèn)的人詢問(wèn)的方式有關(guān))。然后這些代碼彼此依賴,從一方面來(lái)說(shuō),給項(xiàng)目的代碼中增加了許許多多沒(méi)有必要的冗余代碼,從另一方面,這些代碼(尤其是作者失蹤的)更多的是只是應(yīng)付在某一種特定情況下的功能,并不會(huì)有任何的設(shè)計(jì)構(gòu)造或者是異常處理可言,盲目的復(fù)用代碼之后使得自己的代碼更加像一個(gè)泥球。綜上而言,在實(shí)現(xiàn)demo原型的階段,復(fù)用是一個(gè)很好的提高效率的方式,但是做一個(gè)成熟的項(xiàng)目的時(shí)候,代碼復(fù)用要考慮的事情應(yīng)當(dāng)會(huì)有很多。包括對(duì)于使用的庫(kù)函數(shù)也應(yīng)當(dāng)有合理的挑選,比如之前的圣誕節(jié)圖標(biāo)狗啃事件。如果全部考慮(比如使用限制,應(yīng)用大小,可擴(kuò)展性等等),感覺(jué)代碼復(fù)用并不能夠非常顯著的提高效率?
在利用已經(jīng)成熟的模塊時(shí)候,我遇到的兩個(gè)問(wèn)題:
此外,
And for us who are concerned with the success of object-oriented programming, this is chilling—the future will be in the hands of the worst of our fruits. "Is worse really better"
簡(jiǎn)單的,考慮的情況比較少但是又相對(duì)足夠全面的代碼相對(duì)于設(shè)計(jì)實(shí)現(xiàn)復(fù)雜,為了一個(gè)很少用到的功能而大費(fèi)周章去設(shè)計(jì)的代碼來(lái)說(shuō)應(yīng)當(dāng)是更容易被閱讀和理解的,也就是更容易被入門的人去接受閱讀的,也就是受眾是更廣的。(這里沒(méi)有什么依據(jù),只是看到之前資料收集的時(shí)候,看到大家對(duì)一個(gè)功能的實(shí)現(xiàn),互相轉(zhuǎn)載的博客中更多的是實(shí)現(xiàn)方法比較簡(jiǎn)單的做法而做出了的一個(gè)假設(shè)。)那么相對(duì)而言,加上軟件工程的教育和練習(xí)在初學(xué)者中普及不充分這樣一個(gè)情況,更多的項(xiàng)目容易陷入一個(gè)泥團(tuán)的局面。
part2 如何學(xué)習(xí)軟件工程
一點(diǎn)牢騷
這個(gè)方面,我想更多的聚焦于學(xué)校里的軟件工程課。因?yàn)楦鞣N原因,我是自己上過(guò)一節(jié)軟件工程課,同時(shí)通過(guò)聽(tīng)同學(xué)吐槽的方式旁觀了第二學(xué)期的軟件工程課。這門課里我聽(tīng)到最多的吐槽是哪幾個(gè)呢?回想起來(lái),是
為什么計(jì)算機(jī)系的老師教不好軟件工程水平的編程這樣一篇文章里,作者吐槽了軟件工程這門課沒(méi)啥鍛煉的東西,老師教學(xué)仿佛是一種應(yīng)付差事。這篇文章里,有這么一句話
就我們系來(lái)說(shuō),在學(xué)習(xí)軟件工程這么課之前,好像一直都處于理論學(xué)習(xí)的階段,平時(shí)的作業(yè)都只是一些簡(jiǎn)單的練習(xí)。甚至有些課程,現(xiàn)在都還不知道自己該在什么地方去應(yīng)用它們,感覺(jué)真是白學(xué)了。
在某些程度上,這句話似乎可以解釋一下大家會(huì)覺(jué)得軟件工程這門課無(wú)聊的原因。因?yàn)檎n程上很多東西是從理論的角度出發(fā)的或者是方法論一樣的東西,而這兩個(gè)東西,理論的東西需要大量實(shí)踐的驗(yàn)證,方法論的共鳴也是需要很多實(shí)踐,經(jīng)驗(yàn)一樣的東西才可以有同感。在缺乏共鳴的時(shí)候就像是給原始人講流水線生產(chǎn)是多么高效一樣。在這篇博客中,團(tuán)隊(duì)成員對(duì)于如何學(xué)好programming摘出了幾個(gè)意見(jiàn):
這三個(gè)方面的建議都是很有道理的,但是如果按照重要性排序的話可能我會(huì)選擇2,3,1這樣的順序。經(jīng)驗(yàn)豐富的開(kāi)發(fā)者開(kāi)設(shè)的programming課程,如果針對(duì)的還是第一篇博客中提到了“感覺(jué)自己白學(xué)了“這樣的同學(xué),可能純理論的東西又會(huì)被抱怨無(wú)聊,做偏工程的項(xiàng)目又會(huì)被抱怨課程難度大。這是一個(gè)兩難的局面。從自身出發(fā)來(lái)說(shuō),軟件工程的困境一方面是來(lái)自于可能部分老師脫離工業(yè)環(huán)境,導(dǎo)致某些方面讓人感覺(jué)說(shuō)服力不強(qiáng),另一方面(更大的方面)是來(lái)自于學(xué)生本身的矛盾性。這個(gè)矛盾性主要是體現(xiàn)在所有的課程要求的結(jié)題項(xiàng)目更多的是demo性質(zhì)的而非一個(gè)真正的有要求的軟件工程,而被突然施加了很多要求的軟件工程無(wú)疑是走出舒適區(qū);另一方面就是傳統(tǒng)的浮躁,想要短期內(nèi)提高軟件能力而又缺乏足夠的自覺(jué)動(dòng)手能力。
軟件工程教學(xué)最好的方式應(yīng)該還是做中學(xué),兼顧基礎(chǔ)好和不好的兩種情況(關(guān)于ddl重疊這種情況,按照道理來(lái)說(shuō)并不應(yīng)當(dāng)成為一個(gè)顧慮,但是這個(gè)顧慮往往是真實(shí)存在的,尤其是在看重績(jī)點(diǎn)的地方),以下的思考是建立在不存在ddl重疊并且大家真實(shí)想學(xué)不依賴大腿的情況下。
軟件工程和計(jì)算機(jī)科學(xué)的gap在哪里?
CS != SE,這應(yīng)該是一個(gè)公認(rèn)的道理,相對(duì)而言,計(jì)算機(jī)科學(xué)更偏向于理論,而軟件工程更偏向于更稱,軟件工程的東西相對(duì)而言更和人相關(guān),沒(méi)有一些很嚴(yán)謹(jǐn)?shù)难芯糠绞健T陂喿x這篇博客的過(guò)程中,作者對(duì)計(jì)算機(jī)科學(xué)和軟件工程的區(qū)別有著更明確的定義,計(jì)算機(jī)科學(xué)嚴(yán)謹(jǐn),并且各種理論相對(duì)比較固定,算法有著嚴(yán)格的分析,而軟件工程中的各種不確定性大大增加,而且缺乏明確的定義。理論更新?lián)Q代速度很快,需要人不斷的根據(jù)實(shí)踐去調(diào)整理論分析的方法,軟件工程是一種將計(jì)算機(jī)科學(xué)的相關(guān)成果轉(zhuǎn)換成為人類可以使用的軟件的一種粘合劑,也就是說(shuō),軟件工程是直接和人所打交道的。是一種和人類相關(guān)的,包括創(chuàng)意人文等多學(xué)科的綜合系統(tǒng),而非傳統(tǒng)的軟件工程。這篇文章解釋了一個(gè)長(zhǎng)久以來(lái)的疑惑,為什么大學(xué)里很多學(xué)習(xí)的材料都是一些比較老舊的東西,比如知乎經(jīng)常吐槽的一個(gè)問(wèn)題,為什么大學(xué)的C語(yǔ)言教學(xué)還在使用VC6.0這樣一個(gè)過(guò)時(shí)的編譯器。因?yàn)榇髮W(xué)更多的偏向于一些理論知識(shí)的教學(xué),大學(xué)內(nèi)的教學(xué)包括實(shí)驗(yàn)部分,更多的是注重于促進(jìn)對(duì)計(jì)算機(jī)科學(xué)的理解,比如可計(jì)算性,編譯原理,計(jì)算算法的復(fù)雜度等等,所以,從工業(yè)的角度來(lái)看,大學(xué)里面的很多東西是非常過(guò)時(shí)落后的,而且學(xué)生受到的訓(xùn)練是可以忽略不計(jì)的,也就是“動(dòng)手能力極差“。這些東西都是不涉及人的,甚至可能不涉及團(tuán)隊(duì)合作的有關(guān)內(nèi)容(不過(guò)很多時(shí)候大學(xué)的團(tuán)隊(duì)合作更多的也都是一人帶飛一對(duì)人),也就是和人打交道的部分形同虛設(shè)。哪怕是大作業(yè),也就是開(kāi)發(fā)一個(gè)軟件項(xiàng)目,更多的也都是小打小鬧性質(zhì),沒(méi)有達(dá)到一定的規(guī)模,不需要軟件工程相關(guān)的理論指導(dǎo),不需要考慮軟件的架構(gòu)等等。那么,如何去準(zhǔn)備軟件工程的有關(guān)內(nèi)容呢?計(jì)算機(jī)科學(xué)的內(nèi)容,教學(xué)安排都是顯然地顯示在教學(xué)大綱上的,比如密碼學(xué)圖論等等。如果想成為一個(gè)軟件開(kāi)發(fā)者應(yīng)該去培養(yǎng)學(xué)習(xí)啥技能嘞?
軟件工程應(yīng)該教什么?
"What Should We Teach New Software Developers? Why?"闡述了軟件工程和正常教學(xué)之間存在的問(wèn)題,分析了學(xué)術(shù)和工業(yè)之間存在的gap,指出學(xué)術(shù)界更關(guān)心一些計(jì)算機(jī)科學(xué)的核心理論知識(shí)點(diǎn),工業(yè)界則更希望一些有經(jīng)驗(yàn)的開(kāi)發(fā)者,理論和實(shí)踐之間如何取得一種平衡是教學(xué)過(guò)程中需要關(guān)注的重點(diǎn)。關(guān)于教學(xué)的方案,針對(duì)教授的四年本科時(shí)間僅僅只夠教完計(jì)算機(jī)科學(xué)的理論知識(shí)點(diǎn),目標(biāo)是軟件工程師的人應(yīng)該需要一個(gè)master學(xué)位而有志于計(jì)算機(jī)科學(xué)研究的人則應(yīng)該去學(xué)習(xí)一個(gè)PHD。但是計(jì)算機(jī)科學(xué)的最終目標(biāo)是進(jìn)行得到一個(gè)更好的系統(tǒng),所以編程的技能是無(wú)論從事學(xué)術(shù)研究還是工業(yè)開(kāi)發(fā)都不可或缺的。關(guān)于如何培養(yǎng)一個(gè)軟件工程師,我覺(jué)得這篇參考文章的闡述更加的詳細(xì)一些,也更有一些共鳴。也就是,用工作室的方式來(lái)進(jìn)行學(xué)習(xí),換成現(xiàn)在常見(jiàn)的做法,也就是實(shí)習(xí)這樣一種方式來(lái)參與實(shí)踐。在這篇文章里,作者指出軟件工程是一種可以通過(guò)實(shí)踐加反思來(lái)自我感悟自我提高的學(xué)科。通過(guò)工作室的方式參與實(shí)踐,學(xué)習(xí)軟件開(kāi)發(fā)過(guò)程中架構(gòu)設(shè)計(jì),與團(tuán)隊(duì)成員溝通等多方面的技能,在經(jīng)驗(yàn)豐富的工程師引導(dǎo)下對(duì)自己的軟件開(kāi)發(fā)流程進(jìn)行反思,通過(guò)接觸新的項(xiàng)目,考慮很多實(shí)際的問(wèn)題,同時(shí)錘煉與人合作的技能等,在這樣一個(gè)邊學(xué)邊反思的過(guò)程中,可以讓人一步步的脫離舒適區(qū),通過(guò)一種百煉自得地方式獲取軟件工程所需要地各項(xiàng)技能。軟件工程應(yīng)當(dāng)是與建筑等學(xué)科無(wú)異的一樣的實(shí)踐方式。從個(gè)人地角度來(lái)說(shuō),在學(xué)校中所做地項(xiàng)目一方面更像是展示自己所學(xué)地demo,也就是所謂地三無(wú)產(chǎn)品,無(wú)用戶,無(wú)反饋,無(wú)維護(hù)。做完就丟掉,也不需要管運(yùn)行速度之類地東西。然而在實(shí)習(xí)地過(guò)程中,通過(guò)scrum等方式去聽(tīng)成熟地軟件工程師對(duì)一個(gè)實(shí)際項(xiàng)目地見(jiàn)解,考慮的方方面面的要素,在自己工作的過(guò)程中去詢問(wèn)學(xué)習(xí)的方式,會(huì)更快的去領(lǐng)會(huì)該如何去真正的開(kāi)發(fā)一個(gè)軟件。做中學(xué)的方式,而不是開(kāi)發(fā)一個(gè)玩具去自?shī)首詷?lè)的方式,更容易讓人在這樣一個(gè)偏工程的學(xué)科中獲得成長(zhǎng)。
轉(zhuǎn)載于:https://www.cnblogs.com/Annbless/p/10205937.html
總結(jié)
- 上一篇: Ansible自动化运维工具使用
- 下一篇: alter修改表