本文是北京航空航天大學計算機學院軟件工程課程的我的博客做業。本次做業的主要目標在於,經過通讀教材《構建之法》,造成對軟件工程這門學問的初步理解,對於不理解的地方,提出困惑之處,在以後這門課程的學習中,經過實踐反覆印證與體會書中方法,找到問題的答案。html
項目 | 內容 |
---|---|
這個做業屬於哪一個課程 | 博客園班級連接 |
這個做業的要求在哪裏 | 我的博客做業 |
我在這個課程的目標是 | 得到成爲一名軟件工程師的能力 |
這個做業在哪一個具體方面幫助我實現目標 | 造成對軟件工程的初步理解 |
書中第二章介紹了單元測試的方法,我在面向對象課程中也使用過java的單元測試,不過僅僅流於形式,象徵性完成課程的目標。在作編譯課設的時候,也想過沒寫完一個模塊都要作單元測試。可是我發現了一個難點,有時只有最開頭的輸入數據好構造(甚至能夠構造),那麼如何對中間一個單元作單元測試?java
好比在測試編譯器的第一個模塊詞法分析的時候,構造數據輸入就特別容易,由於是第一個模塊,直接輸入字符串就能夠了。可是從第二個模塊語法分析開始就麻煩了,它的輸入時詞法分析的輸出,這個輸出是我定義的一個Class的實例,只有在跑完詞法分析以後才能獲得。若是我要對語法分析作單元測試,單元測試代碼裏就必須先跑詞法分析獲得輸入,這跟直接測試整個程序就同樣了,還叫單元測試嗎?git
除了輸入之外,輸出也是問題,有些時候,程序的運行結果人腦很難算出來甚至算不出來,我寫程序的目的其實就是想把他算出來,那麼我怎麼能獲得正確的輸出來測試個人程序呢?好比寫編譯器時,中間的某些結果靠人腦就要花很長時間的推演。咱們一般是靠和其它同窗對拍來作測試,可是實際生產中,可能這一個模塊只有一我的寫,就無法對拍,這種狀況下如何方便地獲得測試標準結果呢?github
還有一個問題就是單元測試要拆分到什麼程度?代碼短的單元沒有測的必要,代碼長的單元定位又不精準。我是以函數/方法爲單元來測,仍是以一個功能塊爲單元測,尺度如何把握?web
書中在講代碼管理的時候,提到要儘量多的提交當前的修改,哪怕是隻改了一個小bug,也要及時提交。我在使用git管理代碼的時候,常常遇到這樣的狀況,在寫git commit -m ""的message信息時,總不知道應該寫什麼,愣了半天寫了一句「fix some bugs「或者之類的話。可是這種作法在須要版本回退的時候是很是痛苦的,真的不知道當時修了什麼bug,若是去挨個diff分析本身改了什麼又很低效。數據庫
因此這個message相當重要,可是對我而言有時寫message又真的很難用語言表達我所作的修改,有沒有什麼技巧可以簡潔清楚地描述修改了什麼、目的是什麼從而讓版本回退時一目瞭然?xcode
這個問題是我以前寫代碼時遇到的,在讀書中代碼管理時提煉了出來。描述以下:安全
好比要開發兩個連續流程A、B、C、D,順序開發完ABCD,並commit。在開發完D並commit後,發現A中有bug,此時應該怎麼作?是直接在D中改了,無論以前的A的正確性了?仍是回退到A,改bug,commit到新的A‘,以後merge A’ 和D保證D的正確性?服務器
分析一下,這二者都不太合理,首先第一種,若是我以後想版本回退,ABC版本都包含這個bug,那時候可能已經忘了這個bug了。第二種只能保證回退到A'是正確的,BC都無法正確回退。那麼若是把BC也都改了呢?一個問題的是提交的message怎麼寫,"B1:B fixed bug xxx"? 假如以後再發現別的bug呢?用B一、B2這麼編號好嗎?另外一個更難搞的是假如AD之間不僅有BC,而是有幾十個commit咋辦?git的管理機制彷佛沒提供在以前某個提交的版本上修改,後面的提交自動改的方法(或者我不知道hh,git太難了)。事實上按照git的機制咱們根本不能修改某次提交,最可能是像從A分出一個改過bug的A‘。最終這個commit樹就變成這樣了,非常蛋疼。網絡
但願經過以後對git的進一步理解,可以更優雅地解決這個問題。
當Apull下來解決merge衝突,並測試無誤以後,想要push,發現又有人push過了,這就還得再pull下來,解決衝突,並測試。這個無疑很浪費時間,可是彷佛也沒辦法,書中提到了用一些寬和嚴的制度來規定這個處理方法。我以前沒經歷過多人合做開發,實際遇到這個問題時咱們應該怎麼辦呢?
在11.6的討論中,若是有隊員的基礎差怎麼辦,好比你們要用C#開發,但我不會C#,得現學現用,致使開發效率低,且容易出bug。軟工課上要怎麼解決這個問題呢?讓基礎差的同窗作PM或者測試嗎?他們不肯意怎麼辦?
在閱讀第16章創新的時候,書中有這樣一個論斷,當一個產品要發佈的時候,一般都留有一些已知的bug而不去改。一方面緣由是產品要即便發佈纔能有盈利,另外一個緣由是爲下一階段的產品迭代留有餘地,團隊會更有幹勁。
這裏涉及到一個把握平衡的問題,若是你尚未解決一些問題就發佈,這個產品可能沒法獲得用戶承認;可是若是一味追求解決全部技術問題,永無止境地作技術創新和技術改進,而不去經營營銷,這樣又無法盈利。因此如今有很多由技術出身的人辦的初創公司面臨着這個平衡的問題。有些公司一味地追求改進技術,忽略了經營營銷的重要性,這樣也是不可取的。那麼如何找到這個平衡點呢?但願軟件工程課能給我一些體會。
讀完了整本書,涵蓋的內容十分繁雜,設計的領域也很是多,包括計算機,軟件,經濟,管理,方法論等等。也針對不少特定的問題給出了軟件工程的解決方案。那麼,有沒有軟件工程無法解決的問題呢?有沒有人類使用了軟件工程方法也無法實現出的軟件?軟件行業目前面臨的痛點在哪?軟件工程應該針對這些痛點提出什麼新的方法呢?...
這些問題可能用一生的軟件開發經歷都不能徹底回答,可是我但願經過軟件工程這門課,加之從此軟件開發的經歷,可以認真思考這個問題,爭取爲軟件工程的發展進步提出本身的看法。
術語"軟件"(Software)的最先發表記錄是在1958年John Wilder Tukey發表的論文"The Teaching of Concrete Mathematics"中。然而沒有證據能證實是Tukey發明了"Software"這個詞,其最先發明時間可能更早,在1953年Richard R. Carhart曾在engineering context中使用過這個詞,是目前最先的"Software"術語的使用記錄。
Tukey(1915-2000)是美國的數學家,其最知名的成就是發明了快速傅里葉變換(FFT)和箱型圖(box plot)。1947年,在貝爾實驗室工做的Tukey發明了術語"bit",並且還有諸多術語都是以Tukey命名的,如Tukey's range test, Tukey lambda distribution, Tukey's test of additivity, Tukey's lemma, 和 Tukey window
術語"軟件工程"(Software Engineering)被認爲是在1968-1969年與NATO組織的會議上提出的。在60年代,因爲大的複雜的系統開發困難,人類面臨"軟件危機"(Software Crisis)。所以人們提出引入工程化方法指導軟件開發,從而下降軟件開發的成本,提高開發效率。
在NATO會議正式提出"軟件工程''術語以前,就曾有屢次提出此術語的嘗試,早在50年代 Douglas T. Ross 在MIT的講座中就曾提到軟件工程這個詞,以後 Margaret H. Hamilton正式命名了這個術語。
Hamilton是著名的美國女性計算機科學家,系統工程師和企業家。她最重要的貢獻就是曾擔任MIT儀器實驗室軟件工程部主管,幫助開發阿波羅計劃中航天器搭載的飛行軟件。其編寫的程序都以最大程度防止崩潰爲目的,從而防止了阿波羅11號登月計劃中綴。
微軟2001年推出WindowsXP系統時,好不容易想好了廣告語「prepare to fly」,911事件發生了。沒辦法,微軟只好把「帶你飛」,臨時換成「你能行」。這一換,前期砸進去的兩億美圓宣傳費,就正式打水漂了。
控告之路,1994年蘋果公司把微軟告上法庭,理由是侵權。對此比爾蓋茨是這麼說的「咱們有一個富鄰居——施樂,他家有一臺電視。當咱們想偷的時候,發現早就被喬布斯偷走了,可他卻說咱們是小偷。」什麼意思呢?EyeOpener簡單「翻譯」下,就是「你也是偷別人(施樂)的,好意思出來告我?」。在微軟被告時,施樂以類似的理由把蘋果也告了,固然最後的結果是:原告們都輸了官司。
Bitbucket是Atlassian公司提供的一個基於web的版本庫託管服務,支持Mercurial和Git版本控制系統。Bitbucket既提供免費賬號,也提供商業付費方案。Bitbucket提供的服務相似於GitHub(僅支持Git)。BitBucket的目標用戶是開發專有軟件的專業開發者,在2010年它被Atlassian收購後此定位更加明確。
優勢:支持Hg同時支持Git。
缺點:GitHub私有倉庫再也不收費後市場減小。
是一款用於軟件缺陷的追蹤管理網絡程序,由Mozilla計劃開發和應用。1998年,網景公司開放其源代碼後,以Mozilla公共許可證協議許可。有許多組織採用其做爲旗下軟件(特別是自由軟件)的產品缺陷追蹤系統。
優勢:是bug管理工具,比較出名的開源軟件。
缺點:只能管理缺陷,界面效果差。
請按照最近一兩年使用人數的多少, 從多到少排序並說明各自有多少用戶
Name | User |
---|---|
GitHub | 31,000,000 |
Bitbucket | 5,000,000 |
Launchpad | 3,965,288 |
SourceForge | 3,700,000 |
GitLab | 100,000 |
GNU Savannah | 93,346 |
OSDN | 54,826 |
Ourproject.org | 6,353 |
目前用戶量最大的源代碼管理工具,我使用的比較多,上圖是從github上clone了一個倉庫,而後再本地切換分支,修改並提交。
Mercurial 也是一款經常使用的代碼管理軟件,利用conda或pip就能夠安裝,方便易用。
如圖所示,clone了一個遠端的倉庫到本地,修改,並經過add和commit的操做進行提交。
能夠看出Mercurial的用法和git很像,可是因爲使用範圍沒有git廣,因此我並無深刻研究它。