最近這一段時間園子里面有關ORM的話題被某大佬連續發的有關他的ORM框架的文章帶火了,不能不說不僅作者的框架備受推崇,源碼Star很多,作者的文章話題帶動能力也強,其中一篇文章回帖操過100樓。愚作為早期ORM框架開源的一員(PDF.NET,后來改名SOD),去捧場觀戰自然義不容辭,在與園友回帖討論過程中難免會提到自己的框架,無奈被原文作者以廣告嫌疑刪帖了,辛苦碼字的回帖說刪就刪,盡管愚一開始就申明SOD框架不僅僅是一個ORM框架,它是一個簡單的但又全功能數據開發解決方案,但是別人家的地盤別人做主,愚也不好指責什么,各人有各人的是非標准,別處不能說,索性就自己發一篇隨筆,來說說愚認為的重要問題:“簡單即是美”,對代碼完全掌控的重要性!
實際上,這個觀點不是我獨有,也不是我原創,至於是誰最先這樣說的無從考證,那么就只好看誰“志同道合”了,很幸運在上面說的某大佬文章回帖中,就有這樣一位朋友,請看下圖:
幸好愚認為這個觀點很重要,就截圖在我的QQ群里面分享了,要不然這個回帖被刪了甚是可惜。下面文字是上面圖片的內容,貼出如下:
引用--------------------------------------
@架構師修行之路
做了這么多年,始終覺得,對於數據庫持久化而言,簡單即時美,完全掌控才是王道。用過ef,不太喜歡,一個簡單的sql需要胚子和不少東西,可能我已經老了吧
回帖---------------------------------------
高度贊同,簡單就是美,完全掌控才是王道,這也是SOD框架的設計哲學。在Java開發領域,Hibernate不可謂不強大,然而很多開發員主要用的是mybatis就很能說明問題,Hibernate對於大多數Java開發人員而言太復雜了。
回到正文,為什么說簡單就是美,完全掌控才是王道。簡單的東西才容易駕馭,才容易完全掌控;完全掌控的事情才能最大程度保證成功而不依賴來運氣和人品。這個道理其實不僅僅是對數據庫持久化而言,對軟件項目,對任何事情都是成立的。
之前園子里面有一篇文章《[漫談] 軟件設計的目標和途徑》,作者說到:“軟件設計的目標是避免軟件的失控。那么是什么東西導致的失控? 你面臨的業務太復雜?項目遺留的代碼太爛?團隊成員水平參差不齊?工期太緊張導致你無暇做設計規划?也許吧,這些或多或少都確實是已經存在的事實。”經過一番分析,作者得出結論:“所以是什么導致的失控?現存的無力維護(bug、新功能都是維護)的代碼導致的失控,同時這也是失控的表現結果。那么你為什么會無力維護這些代碼,因為它的真實行為和你理解的行為出現了偏差,你覺得它不可控了。這時候就是真的失控了,代碼爛不爛其實並不是重點,只要你還能維護,這些都不是問題。”
對這個觀點,愚很認同,以前愚也常常維護別人寫的遺留項目,那種填別人挖的坑的感覺確實很無力,一個看似很小的Bug牽一發而動全身,尋找蛛絲馬跡猶如大海撈針,有時候這種Bug看起來就像是“薛定諤的代碼”--測試說有Bug而你怎么都不能復現,Bug修復了好像又沒有修復。如果這種代碼太多了或許這個項目真的就失控了,這種事情就曾經發生在筆者身上過,還好老板英明,又把原開發人員請回來兼職一段時間給我們講解系統到底有那些坑,找到了雷修復起來就很快了。這個案例說明,之所以很難維護別人的遺留系統,是因為你難以在有效的時間內完全掌控系統,對系統的設計原理和代碼運行流程不熟悉,也就不了解現有系統設計和代碼的缺陷在哪里,總之就是這個系統對於你來說太復雜了,無法完全掌控;如果是你設計開發的系統,你熟悉所有的細節,那么你會說“這個很簡單”,“那也很簡單”是不是?你沒有說過這樣的話也一定聽別人說過這樣的話。所以在一定程度上,“簡單”就等於“完全掌控”,你能完全掌控那就是簡單,但你認為簡單別人不一定覺得簡單,所以要讓大多數人都覺得簡單的事情,就變得非常不簡單了。著名科學家霍金有句名言:多寫一個公式就會嚇跑一半讀者。霍金在他的科普書里面幾乎沒有使用多少公式,將復雜的宇宙科學講得人人都能看懂,將宇宙寫得美輪美奐,他寫的《時間簡史》火爆全球,銷量經久不衰。愚認為“簡單就是美”一定是霍金寫科普書的“寫作哲學”;同樣,愚也將“簡單即是美"始終作為SOD框架的設計哲學--一個不需要反射、不依賴.NET高級特性(比如LINQ)、核心組件不依賴第三方框架,極度精簡的數據開發框架。
世界上有兩件最困難的事情:一個是你把你口袋里面的錢放到我口袋里面來,一個是我把我腦袋里面的想法放到你腦袋里面去。所以對本文的觀點你肯定不會那么容易相信,畢竟這是最困難的事情之一。如果你不信,請繼續聽我說。
話說一圖勝千言,圖樣圖森破,先看下圖:
(圖片來自網絡,侵刪)
上面是文章《“越復雜越不穩定”》的插圖,不規則的石頭一層堆砌一層,越來越高越來越小,總覺得搖搖欲墜,相反如果石頭堆砌矮一點就一兩層,或者石頭結構標准四四方方,這堆石頭就很穩定。堆砌的層數少我們堆砌石頭的工作簡單,石頭結構標准也就是石頭形狀簡單,簡單的方式讓我們對堆石頭這件事情上能完全掌控,這堆石頭就能非常穩定而屹立不倒。文章說道:“我們地球出現45億年,從單細胞動物發展到我們今天,成就了人類和成千上萬種生物,但存在更持久的還是最早的單細胞生物,在今天還有存活。而后來演化的很多生物卻在這過程逐步滅亡。即便是我們人類號稱自己牛逼,也不過是才存在了幾十萬年,要知道恐龍可是存在了上億年的歷史,但最終也逃不過物種滅絕。這理解起來就是越復雜越不穩定的物種進化案例。”
不論是小孩過家家堆石頭這樣的小問題,還是大到生物圈物種滅絕這樣的是問題,都說明簡單的重要性,越簡單越穩定,越復雜越不穩定。這個道理符合大多數人的認知,道理就是這樣,之所以讓我們認同,就是因為我們看到的現象可以用這個道理來解釋。當然這個道理在某些特殊場景下可能不成立,請參考另外一篇文章:《隨筆:關於系統穩定性的思考》。這個道理僅僅這樣說可能還不夠,有很多時候我們“眼見未必為實”,錯覺是常見的,所以現代科學更講究數理邏輯。假設系統整體最佳的穩定性為1,系統由N多節點元素相互依賴而成,系統整體的穩定性由系統內每一個節點的穩定性系數相乘而來。假設每一個節點的穩定性都是0.9,那么2個節點組成的系統穩定性是 0.9 * 0.9 =0.81,10個節點系統穩定性約等於0.3486784401,這么低的系統穩定性肯定沒法用了。將系統每一個節點的穩定性提高一個數量級達到0.99,那么2個節點組成的系統穩定性是 0.99 * 0.99 =0.0.9801,10個節點系統穩定性約等於0.904382,看起來系統穩定性還不錯,但是如果100個節點系統穩定性將下降到約等於0.36603也變得不可用。
如上圖復雜的系統節點關系,如果一個系統設計成這樣,在考慮上面的系統節點穩定性算法,這樣的系統幾乎就是不可靠性,穩定性非常差,如果一個項目代碼是這樣,那這樣的項目很容易失控。但是一個系統是由簡單的節點關系組成,並且節點可以遞歸定義,即一個節點又是一個簡單的子系統,那么系統整體結構上不僅依然很簡單,而且這樣一種結構圖還很優美,如下圖:
如上圖,一個規則的六邊形結構,通過節點組合的方式,最后組合成了一片優美的類似雪花樣子的結構形狀,這是不是“簡單既是美”很好的例子?無獨有偶,在軟件領域也有一個“六邊形架構”,或者類似的“整潔架構”,又叫“洋蔥架構”。有關這些軟件架構的介紹,可以參考愚寫的新書《SOD框架“企業級”應用數據架構實戰》里面的介紹。綜上所述,“簡單既是美”不管是從人的感性認知,還是從科學的數理邏輯層面,都證明了這是一個“金科玉律”,它跟墨菲定理、二八定律等一樣重要,這是人們認識世界、改造世界的最佳實踐,放在軟件領域,甚至放到前面說的ORM框架設計上,“簡單既是美”都應該成為一種設計哲學,SOD框架始終尊崇這一哲學,框架追求的目標是簡單與效率的平衡,這種平衡猶如太極圖,
體現在:代碼的精簡,開發、維護的簡單與追求極致的運行效率。(詳見框架官網)
再回到ORM的話題上,因為開發人員需要完全掌控自己的代碼,所以大部分Java開發人員舍棄了功能強大的ORM框架Hibernate轉而使用半ORM框架(甚至不能叫ORM)的MyBatis框架,寧願手寫SQL也不願用全功能的ORM,用這種簡單粗暴的方式來快速解決問題,這樣別人接手項目也能快速上手而不至於造成項目失控,大家如果不相信這個現象,可以去各大招聘網站看看有關Java技術棧的招聘,不論從Java開發人員還是到JAVA背景的CTO,幾乎沒有幾家要求熟練使用Hibernate的,幾乎全部要求熟練掌握MyBatis框架。在Java界如此,那么在.NET界也就能很好的理解為什么.NET的ORM這么多了,因為造一個ORM輪子簡單啊,這可能得益於.NET的強大而又好用的特性,微軟對開發人員一向是保母型的:)。不過,這也造成一個尷尬的情況,正如下面的朋友說的,我回復了這位朋友,不巧這也被本文開頭的那個ORM大佬給刪除了,請看當時回帖截圖:
回帖內容如下:
引用-------------------
@JulyLuo
哎,難怪人都說DotNetCore的人都再搞ORM,天天搞這些。。
回復--------------------
這可能是造一個ORM輪子門檻比較低,當然造一個強大的ORM還是不容易,需要時間和作者的毅力,比如像樓主這樣的毅力。不過,如果拋開ORM,去審視ORM背后的數據問題,就能發現一片寬闊的天地:數據、數據交互、數據控件、數據綁定、數據的分部、事務/分布式事務、數據同步、數據復制、數據清洗、數據緩存。。。。等等企業級應用開發需要處理的數據問題,SOD框架早就不是ORM框架了,它現在是一個簡單的但又全功能的數據開發與架構的解決方案,為此還寫了一本書:《SOD框架“企業級”應用數據架構實戰》。
----------------------------
回到正文,上面這位朋友說的的確有這樣一個現象,除了前面說的微軟是.NET開發人員的保姆使得使用.NET很容易造ORM輪子之外,愚想問大家,絕大多數用.NET的公司為什么用.NET呢?為什么很多國內的公司初創期間用.NET而成熟之后紛紛轉投了Java呢?大家可能說這是生態問題,而愚認為,原因不僅如此,.NET容易使用,開發效率高是主要原因,初創公司節約成本是王道,同樣的原因,小公司經不起折騰為了確保項目成功,開發簡單代碼能完全掌控也是項目負責人首要考慮的問題,后期公司成熟穩定了有錢了就可以選擇生態龐大技術復雜的JAVA技術棧了,有N多高大上的框架可以來玩,誰還會再去造“很低級”的ORM輪子呢?如果更全面的看,造一個ORM框架技術含量的確比較低,但對於普通的.NET開發人員,他們沒有接觸大數據、雲計算、機器學習、圖像識別等等高大上技術的機會,不造ORM輪子還能造什么呢?80%的開發人員天天都在CRUD(請參考《軟件開發中的“二.八定律”》之1.2 大部分時間都在做重復的增刪改查),也只有ORM輪子是最容易造的了,技術想進步很難,這是.NET開發人員最難越過的坎。這個問題更詳細的討論可以參考我寫的《數據背后的二八定律,揭示程序員擔憂的主要問題》一文。愚不才,為了解決這個問題寫了上面回答JulyLuo的一段話,想告訴大家雖然都是同樣每天在解決數據CRUD問題,但是思考角度不一樣就能發現另一片廣闊的天地,這就是我這本書里面寫的全部內容,歡迎了解。
本來是對某大佬文章讀者回帖的一個回復討論,沒想到大佬刪除了我的回帖,也算是塞翁失馬,於是才有了這篇隨筆,告訴大家“簡單即是美”,強調對代碼完全掌控的重要性,在真正復雜的企業級項目開發中,選擇什么框架一定要好好想想你能否完全掌控它,確保項目開發不走彎路,不要為了“面向簡歷編程”而匆忙上馬使用流行的框架技術,如果你不能很好的掌控它,就選擇一個簡單的框架,或者向領導申請給予足夠的技術預研/調研時間。感謝大家的閱讀,希望在數據開發領域,SOD框架能成為你正確的選擇!
-----------------分界線----------------------
本文發布后,有好幾位朋友回帖批評愚說造ORM輪子不高大上的問題,愚認為大家表面上關注是否高大上的問題,本質上是在關注自己技術高低的問題,有沒有貶損自己技術能力的意思。這里特別申明一下:
是否高大上 不等於 技術高低
推論:=>
造ORM輪子 不等於 技術低
愚的觀點是,是否高大上跟技術高低沒有關系,因為前者是一個心態問題,后者是一個技術問題,高大上更多的是跟收入、薪水、社會需求度、社會地位等相關。就像我回帖說的,在招聘市場,大數據、雲計算、人工智能、機器學習、圖像識別等這些熱門技術不僅職位多,並且薪水基本要比普通的CRUD職位高出很多,形成鮮明對比,不信大家可以去招聘網站看看。由於這些熱門技術需求量大、薪水又很高,用大家的話來說就是行業風口,高薪+光環,自然就是覺得高大上,不是嗎?這不是我一人的觀點,也是我跟朋友們交流說到的,見下圖:
最后,愚的SOD有ORM功能,愚也算是造ORM輪子的人,怎么可能自己瞧不起自己,說造ORM輪子很低級呢?這邏輯上是說不過去的,愚絕對沒有任何貶損大家造ORM輪子的意思。希望大家仔細讀讀我文章內容,多多思考。如果是因為愚的表達能力沒有把問題說清楚導致的誤會,誠懇的給大家道歉,愚本不才,能力有限,所以自稱愚便是此意,再次謝謝大家的支持!
PS:
本文的中心思想是討論【“簡單即是美”,對代碼完全掌控的重要性!】這個觀點,而不是討論刪帖是非問題,然而評論區的話題被人帶偏。前面開篇就說了要不要刪帖是別人的權力,愚沒有指責對方的意思,甚至要感謝對方給了愚寫此文的契機。愚都沒有討論這個刪帖是非問題,所以請大家也不要激動,讀文章抓住重點,找到中心,謝謝!