當前位置:
首頁 > 知識 > 關於「編程的本質」的探討

關於「編程的本質」的探討

提出問題

如果你去面試,被大公司工作20年的資深技術總監問一個問題「說說你對軟體工程的理解」,你會怎麼回答呢?是不是會像我一樣一臉懵逼,一個問題就讓人回到了小學。沒有經年的編程和架構經歷,沒有對問題本質的深入探究,恐怕任何回答都會顯得非常蒼白。


探索歷程之編程本質

有了問題和好奇心之後,令你印象深刻的問題就會在一段時間內充斥你的腦海。讓我回答對軟體工程的理解,可能我會先從「軟體工程」的定義說起,他應該是一個一級學科,下面包含的範圍非常廣泛,比如計算機科學、光電信息工程、媒體信息工程、自動化控制、通信工程等。

我自己比較熟悉的是計算機科學相關,而計算機科學又是包羅萬象,日常工作可歸之為「編程」一類,寫的業務代碼居多,中間件和架構也佔一部分。

拿自己熟悉的編程來說,問題就變成了「什麼才是編程的本質」,我如果把這個問題回答好了,以點破面,也算是能勉強回答總監提出的問題了。

那麼什麼是編程的本質呢,看到左耳聽風的一篇專欄文章(強烈推薦耗子大神,專欄地址),大致觀點如下:


編程 = 演算法 + 數據

演算法 = 邏輯 + 控制

用圖來表示:

關於「編程的本質」的探討

如果對一個表單做驗證,用邏輯+控制的思想,可以這麼寫:

var meta_create_user = {
form_id : "create_user",
fields : [
{ id : "name", type : "text", min_length : 3 },
{ id : "password", type : "password", min_length : 8 },
{ id : "repeat-password", type : "password", min_length : 8 },
{ id : "email", type : "email" }
]
};
var r = check_form(meta_create_user);

上面meta_create_user是「要做什麼」,也就是邏輯。下面check_form是「怎麼做」,也就是控制。

這個觀點對我有非常大的啟發,引發了我很多思考。

探索歷程之架構設計

根據上面的觀點,那麼在架構設計層面,邏輯+控制的思路能否行得通呢?

正好我最近被另一個問題困擾,那就是隨著業務的複雜,架構如何才能不僵化?比如一個企業服務CRM系統,多租戶、多業務線,而且業務線之間耦合還非常重,隨著業務線的增多,代碼開始變得錯綜複雜,無數線頭糾纏在一起,剪不斷、理還亂。再把多租戶考慮進去,就相當於在線頭上又掉上了油漆。

老人扎進了修復bug的海洋,新人理不清業務線。出現這種情況,問題源頭也好找:架構沒做好。

可是架構怎麼做?面向對象的五大原則(SOLID,即單一職責原則,開閉原則,里氏替換原則,介面隔離原則和依賴倒置原則)說起來頭頭是道,設計模式用起來得心應手,SOA的理念爛熟於心,分層的思想也面面俱到。還能要求架構師什麼呢?

雖然很委屈,但也很焦急。

人找不到答案的時候,往往是視野出了問題,也就是視野太窄造成困於原地。

放出去看看業界有什麼樣的解決方案么?那些聰明勤奮的人恐怕早遇到過這樣的問題。

還真被我找到了,這就是領域驅動設計,簡稱DDD。這種思想簡直讓我大開腦洞,印象最深刻的有兩點:1、程序員要深入了解業務,了解業務之後建模;2、建模是構建一種共同的語言,這種語言架構師、領域專家、產品經理都能看得懂,而且就用這套語言溝通並一起完善它。

這種思想好啊,熟知領域知識說不定還能在代碼層面進行微創新,真是振奮人心。

有了綱領,就是有了方向,接下來要考慮的就是怎麼在編程層面的落實了。

還是老辦法,這個思想出來了這麼久,肯定有聰明人做過落實的這個事兒啊,何不參考之?麻煩就麻煩在有很多人做了實現,但開源的卻太少。

在Github上找一找,真發現了一個阿里同學寫的框架:https://github.com/alibaba/COPA

看過他的設計和博客文章後,也是驚為天人,非常感謝significantfrank的分享!


探索歷程之融合

如果你和我有一樣的困擾,建議你認真看一下COPA的理念。

接下來我們再來看領域驅動設計和邏輯+控制之間存在什麼關係呢?

其實想要踐行DDD,必然要熟練的應用到很多設計模式,我們以設計模式中比較經典的策略模式來看一下他們之間的關係,比如一個商品優惠的策略:

關於「編程的本質」的探討

有三種優惠方式,分別是普通打折(比如9折),滿減,期限內的特價。我們看到Strategy下的三個實現就是邏輯,而Context的組合拼裝就是控制。

策略模式比較簡單,回到領域建模,在COPA框架中分了三層,其中Service Facade可以看成是控制,Domain里都是邏輯,Infrastructure里則是數據了。現在再來看,從微觀到宏觀,編程 = 演算法 + 數據 ,演算法 = 邏輯 + 控制 這種思想可謂是歷久彌新!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

程序員成熟的標誌,八個點概括!
在Linux上增加swap空間的技巧

TAG:程序員小新人學習 |