軟件開(kāi)發(fā)的本質(zhì)
從本質(zhì)上來(lái)說(shuō),軟件開(kāi)發(fā)過(guò)程就是問(wèn)題空間到解決方案空間的一個(gè)映射轉(zhuǎn)化。

“問(wèn)題空間”就是系統(tǒng)要解決的“領(lǐng)域”問(wèn)題。因此,也可以簡(jiǎn)單理解為一個(gè)領(lǐng)域就對(duì)應(yīng)一個(gè)問(wèn)題空間,是一個(gè)特定范圍邊界內(nèi)的業(yè)務(wù)需求的總和。
“領(lǐng)域模型”就是“解決方案空間”,是針對(duì)特定領(lǐng)域里的關(guān)鍵事物及其關(guān)系的可視化表現(xiàn),是為了準(zhǔn)確定義需要解決問(wèn)題而構(gòu)造的抽象模型,是業(yè)務(wù)功能場(chǎng)景在軟件系統(tǒng)里的映射轉(zhuǎn)化,其目標(biāo)是為軟件系統(tǒng)的構(gòu)建統(tǒng)一的認(rèn)知。
每個(gè)軟件系統(tǒng)本質(zhì)上都解決了特定的問(wèn)題,屬于某一個(gè)特定領(lǐng)域,實(shí)現(xiàn)了同樣的核心業(yè)務(wù)功能來(lái)解決該領(lǐng)域中核心的業(yè)務(wù)需求。領(lǐng)域模型在軟件開(kāi)發(fā)中的主要起到如下作用。
- 幫助分析理解復(fù)雜業(yè)務(wù)領(lǐng)域問(wèn)題,描述業(yè)務(wù)中涉及的實(shí)體及其相互之間的關(guān)系,是需求分析的產(chǎn)物,與問(wèn)題域相關(guān)。
- 是需求分析人員與用戶交流的有力工具,是彼此交流的語(yǔ)言。
- 分析如何滿足系統(tǒng)功能性需求,指導(dǎo)項(xiàng)目后續(xù)的系統(tǒng)設(shè)計(jì)。
代碼藝術(shù)家
“根本沒(méi)有藝術(shù)這種東西,唯有藝術(shù)家而已”。(貢布里?!端囆g(shù)的故事》)
這句話的意思是,藝術(shù)其實(shí)就是藝術(shù)家的一種表達(dá)方式、情緒和價(jià)值觀。藝術(shù)家在哪里,藝術(shù)就在哪里;藝術(shù)在哪里,美就在哪里。
禪是什么?計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)又是什么?
我想說(shuō),這個(gè)程序設(shè)計(jì)的藝術(shù)也是不存在的,只有程序員而已——我們不妨稱之為“代碼藝術(shù)家”好了。程序員在哪里,程序設(shè)計(jì)的藝術(shù)就在哪里,人類的智慧跟創(chuàng)造力就在哪里。
軟件研發(fā)是技術(shù)也是藝術(shù),不僅要有一行行的代碼,還要有主題思想、想象力、宏觀架構(gòu)。
我有一個(gè)夢(mèng)想,我寫(xiě)的代碼,可以像詩(shī)歌一樣優(yōu)美。我有一個(gè)夢(mèng)想,我做的設(shè)計(jì),能恰到好處,既不過(guò)度,也無(wú)不足。
軟件的復(fù)雜性
然而,現(xiàn)實(shí)卻是——
“不管你們有多敬業(yè),加多少班,在面對(duì)爛系統(tǒng)時(shí),你仍然會(huì)寸步難行,因?yàn)槟愦蟛糠值木Σ皇窃趹?yīng)對(duì)開(kāi)發(fā)需求,而是在應(yīng)對(duì)混亂?!?Robert C.Martin)
“軟件的復(fù)雜性是一個(gè)基本特征,而不是偶然如此?!?Frederick P.Brooks.Jr《人月神話》 )
問(wèn)題域有其復(fù)雜性,而軟件在實(shí)現(xiàn)過(guò)程中又有很大的靈活性和抽象性,導(dǎo)致軟件具有天然的復(fù)雜性。缺少技藝?!皩?xiě)代碼”作為一種技能,入門并不是很難。但是要像高手那樣優(yōu)雅地“寫(xiě)好代碼”并不是一件容易的事,需要持續(xù)地學(xué)習(xí)和實(shí)踐。
匠人精神
把簡(jiǎn)單的事情做到極致,功到自然成,最終“止于至善”。
秋山利輝《匠人精神》
軟件設(shè)計(jì)不僅是“技術(shù)”(Technique),更是一門“技藝”(Craftsmanship)。要想控制復(fù)雜度,防止系統(tǒng)腐化,我們不能只滿足做一個(gè)搬磚的“碼農(nóng)”,而是要堅(jiān)持自己的技術(shù)夢(mèng)想和技術(shù)信仰。
懷有一顆“匠人”之心,保持專注、持續(xù)學(xué)習(xí),每天進(jìn)步一點(diǎn)點(diǎn)。唯有如此,我們才有可能“從碼農(nóng)走向工匠”!
代碼自律精神
破窗效應(yīng)(Broken Windows Theory)是犯罪心理學(xué)中一個(gè)著名的理論,由JamesQ. Wilson和George L. Kelling提出,刊于The Atlantic Monthly 1982年3月版中一篇題為“Broken Windows”的文章。此理論認(rèn)為:環(huán)境中的不良現(xiàn)象如果被放任存在,就會(huì)誘使人們仿效,甚至變本加厲。以一幢有少許破窗的建筑為例,如果破窗不被修理好,可能將會(huì)有破壞者破壞更多的窗戶。最終,他們甚至?xí)J入建筑內(nèi),如果發(fā)現(xiàn)無(wú)人居住,也許就在那里定居或者縱火。一面墻,如果出現(xiàn)一些涂鴉而沒(méi)有被清洗掉,那么很快,墻上就布滿了亂七八糟、不堪入目的東西;一條人行道有些許紙屑,不久后就會(huì)有更多垃圾,最終人們會(huì)視若理所當(dāng)然地將垃圾順手丟棄在地上。這個(gè)現(xiàn)象,就是犯罪心理學(xué)中的“破窗效應(yīng)”。
“第一扇破窗”常常是事情惡化的起點(diǎn)。
從“破窗效應(yīng)”中我們可以得到這樣一個(gè)道理:任何一種已存在的不良現(xiàn)象都在傳遞著一種信息,會(huì)導(dǎo)致不良現(xiàn)象無(wú)限擴(kuò)展,同時(shí)必須高度警覺(jué)那些看起來(lái)是偶然的、個(gè)別的、輕微的“過(guò)錯(cuò)”,如果對(duì)“過(guò)錯(cuò)”不聞不問(wèn)、熟視無(wú)睹、反應(yīng)遲鈍或糾正不力,就會(huì)縱容更多的人“去打爛更多的窗戶”,極有可能演變成“千里之堤,潰于蟻穴”的惡果。
在軟件工程中,“破窗效應(yīng)”可謂是屢見(jiàn)不鮮。面對(duì)一個(gè)混亂的系統(tǒng)和一段雜亂無(wú)章的代碼,后來(lái)人往往會(huì)加入更多的垃圾代碼。這也凸顯了規(guī)范和重構(gòu)的價(jià)值。首先,我們要有一套規(guī)范,并盡量遵守規(guī)范,不要做“打破第一扇窗”的人;其次,發(fā)現(xiàn)有“破窗”,要及時(shí)地修復(fù),不要讓事情進(jìn)一步惡化。整潔的代碼需要每個(gè)人的精心呵護(hù),需要整個(gè)團(tuán)隊(duì)都具備一些工匠精神。
KISS 哲學(xué)
KISS:Keep It Simple and Stupid。Less Is More。一個(gè)方法只做一件事情。單一職責(zé)原則(SingleResponsibility Principle,SRP)。
Robert C. Martin有一個(gè)信條:函數(shù)的第一規(guī)則是要短小,第二規(guī)則是要更短小。
真正的“簡(jiǎn)單”絕不是毫無(wú)設(shè)計(jì)感,上來(lái)就寫(xiě)代碼,而是“寶劍鋒從磨礪出”,亮劍的時(shí)候猶如一道華麗的閃電,背后卻有著大量的艱辛和積累。真正的簡(jiǎn)單,不是不思考,而是先發(fā)散、再收斂。在紛繁復(fù)雜中,把握問(wèn)題的核心。
Less Is More:維護(hù)過(guò)遺留系統(tǒng)、受過(guò)超長(zhǎng)函數(shù)折磨的讀者應(yīng)該深有體會(huì),相比于3000行代碼的“龐然大物”,肯定是更短小的函數(shù)更易于理解和維護(hù)。有時(shí)保持代碼的邏輯不變,只是把長(zhǎng)方法改成多個(gè)短方法,代碼的可讀性就能提高很多。超長(zhǎng)方法是典型的代碼“壞味道”,對(duì)超長(zhǎng)方法的結(jié)構(gòu)化分解是提升代碼可讀性最有效的方式之一。
“我不是一個(gè)偉大的程序員,只是習(xí)慣比較好而已?!保↘ent Beck)
只有養(yǎng)成精益求精、追求卓越的習(xí)慣,才能保持精進(jìn),寫(xiě)出好的代碼。
SOLID :5大設(shè)計(jì)原則
5個(gè)原則分別如下:
- Single Responsibility Principle(SRP):?jiǎn)我宦氊?zé)原則。
- Open Close Principle(OCP):開(kāi)閉原則。
- Liskov Substitution Principle(LSP):里氏替換原則。
- Interface Segregation Principle(ISP):接口隔離原則。
- Dependency Inversion Principle(DIP):依賴倒置原則。
SOLID 設(shè)計(jì)原則最早由Robert C. Martin在2000年的論文“Design Principles and DesignPatterns”中引入。 SOLID 是開(kāi)頭字母的縮寫(xiě),其本身就有“穩(wěn)定的”的意思,寓意是“遵從SOLID原則可以建立穩(wěn)定、靈活、健壯的系統(tǒng)”。
設(shè)計(jì)模式
With patterns, you can use the solution a million times over, without everdoing it the same way twice.
利用模式,我們可以讓一個(gè)解決方案重復(fù)使用,而不是重復(fù)造輪子。
克里斯托佛·亞歷山大《建筑的永恒之道》。Christopher Alexander, 是當(dāng)代建筑大師。在對(duì)建筑理論的探索過(guò)程當(dāng)中,亞歷山大形成了自己的有關(guān)建筑、自然和生活的哲學(xué)。
視覺(jué)思維:想象力與抽象思維
如果你能閉上眼睛,讓算法在你的眼前舞動(dòng)——這就是視覺(jué)思維。如果,你能牛逼到,能看到01字節(jié)的跳動(dòng)(ByteDance),那你就是編程界的“天神”般的存在了。
“人類之所以成為人類,是因?yàn)槿祟惸軌蛳胂蟆薄#ê绽度祟惡?jiǎn)史》)
“想象力比知識(shí)更重要,因?yàn)橹R(shí)是有限的,而想象力概括著世界的一切,推動(dòng)著進(jìn)步,并且是知識(shí)進(jìn)化的源泉?!保◥?ài)因斯坦《論科學(xué)》)
抽象思維以詞為中介來(lái)反映現(xiàn)實(shí)。這是思維的最本質(zhì)特征,也是人的思維和動(dòng)物心理的根本區(qū)別。
正是抽象思維幫助人類從具體事物中抽象出各種概念,再用這些概念去構(gòu)筑種種虛構(gòu)的故事。這些概念包括經(jīng)濟(jì)(例如貨幣、證券)、文學(xué)、藝術(shù)和科學(xué)等,都是建立在抽象的基礎(chǔ)之上的。
“所有事物都要經(jīng)過(guò)兩次創(chuàng)造的原則,第一次為心智上的創(chuàng)造,第二次為實(shí)際的創(chuàng)造”。(柯維《高效能人士的七個(gè)習(xí)慣》)
先想清楚目標(biāo),然后努力實(shí)現(xiàn)。不管是人生大問(wèn)題,還是階段性要完成的事情,都需要目標(biāo)清晰、有的放矢。
平衡的藝術(shù):Rule of Three
Rule of Three 也被稱為“三次原則”,是指當(dāng)某個(gè)功能第三次出現(xiàn)時(shí),就有必要進(jìn)行“抽象化”了。這也是軟件大師Martin Fowler在《重構(gòu)》一書(shū)中提出的思想。三次原則指導(dǎo)我們可以通過(guò)以下步驟來(lái)寫(xiě)代碼。(1)第一次用到某個(gè)功能時(shí),寫(xiě)一個(gè)特定的解決方法。(2)第二次又用到的時(shí)候,復(fù)制上一次的代碼。(3)第三次出現(xiàn)的時(shí)候,才著手“抽象化”,寫(xiě)出通用的解決方法。這3個(gè)步驟是對(duì)DRY原則和YAGNI原則的折中,是代碼冗余和開(kāi)發(fā)成本的平衡點(diǎn)。同時(shí)也提醒我們反思,是否做了很多無(wú)用的超前設(shè)計(jì)、代碼是否開(kāi)始出現(xiàn)冗余、是否要重新設(shè)計(jì)。軟件設(shè)計(jì)本身就是一個(gè)平衡的藝術(shù),我們既反對(duì)過(guò)度設(shè)計(jì)(OverDesign),也絕對(duì)不贊成無(wú)設(shè)計(jì)(No Design)。
參考資料
愛(ài)因斯坦《愛(ài)因斯坦文集》
Frederick P.Brooks.Jr《人月神話》
克里斯托佛·亞歷山大《建筑的永恒之道》
赫拉利《人類簡(jiǎn)史》
秋山利輝《匠人精神》
《禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》 / 陳光劍 目錄
第一性原理
什么是禪?
什么是計(jì)算機(jī)?
什么是程序設(shè)計(jì)?
什么是藝術(shù)?
宇宙之起源
物質(zhì)之形成
半導(dǎo)體材料
納米光刻
二極管、三極管
太極陰陽(yáng)與二進(jìn)制
布爾代數(shù)與數(shù)字邏輯系統(tǒng)
模擬電子電路系統(tǒng)
信號(hào)與處理
信息論
圖靈機(jī)模型
馮諾依曼模型
計(jì)算機(jī)演化史
什么是編程?
編程語(yǔ)言進(jìn)化史
程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法
模型關(guān)系思維
真理與模型
建筑工程、機(jī)械工程、電氣工程與軟件工程
CPU架構(gòu)設(shè)計(jì)
緩存思想
計(jì)算機(jī)科學(xué)中的中間層理論
從01機(jī)器碼到匯編指令到高級(jí)編程語(yǔ)言:一切皆是映射
美妙的遞歸
用計(jì)算機(jī)畫(huà)一張分形圖
分層思想
硬件驅(qū)動(dòng)
操作系統(tǒng)
通信原理:TCP/IP 與 HTTP 協(xié)議、WIFI無(wú)線協(xié)議
互聯(lián)網(wǎng)簡(jiǎn)史
數(shù)據(jù)的存儲(chǔ):從ROM、RAM到寄存器到L1/L2 Cache 再到磁盤(pán)文件
索引原理:來(lái)自大自然的啟示 Tree 結(jié)構(gòu)
人類社會(huì)數(shù)字化
人工智能
虛擬現(xiàn)實(shí)
技術(shù)、藝術(shù)與禪道
// TODO ...... 待續(xù)