1. 程式人生 > >資料親和架構--領域語言

資料親和架構--領域語言

       在IT屆,一談起程式語言之間的優劣,可以掀起一場世界大戰。即使已經封神的Torvalds也不能免俗,對C++數度開火,更別人說其他語言,壓根就不在火力範圍內。就我個人而言,啟蒙是C語言,用的多是C++,工作範圍主要網路、應用系統底層框架、高效能低延遲的應用,所以即使是寫C++程式碼,感覺也類似C語言,很少用高階特性。java、python、lua、php等都用過,因為要做的工作不多,所以多數都是淺嘗輒止。

        這些爭議的根源,我認為,在於這些爭議者忽略了程式語言和領域場景的適配程度。多數人在爭議程式語言的優劣的時候,少有人提及在某些場景。談及寫網頁,幾乎沒有人會想到用C/C++語言,除非在於一些資源緊張的嵌入式系統。說到寫作業系統,不會有人說要用Java,甚至C++都用得少,因為C是被證明過的解決方案。

        而會被爭論的場景是處於作業系統和網頁之間的中間地帶,主要是場景多樣的應用系統,也包括一些歷史原因遺留的。這些系統包括GUI介面,應用容器、商業邏輯的實現、中介軟體的實現。在一些公認的成熟領域,比如閘道器、資料庫普遍選擇C作為開發語言,諸如apache、nginx、mysql、postgrep等。而近年來興起的訊息中介軟體kafka、rocketmq和rabbitmq;以及hadoop族的諸多系統,再加上python族的openstack和人工智慧和剛流行的交易策略程式設計;還要再加上谷歌的go族系統,如k8s和docker。

        深入研究這些現象,一個理性選型的根本目在於確保系統成功,一般都要包含這個過程:

1、系統場景的需要哪些特性,安全、效能、使用者體驗還是其他,這是系統成功的要素;

2、現有的開發資源和允許開發時間,一般這些都是緊俏因素,能少儘量少,這和實驗室是不同的。

3、開發人員的技能熟悉程度,如果讓開發人員去熟悉一個全新的語言和功能,這個成本也要考慮;

4、程式語言是否符合場景,以及他本身的框架對新系統的支援程度,成熟的框架肯定優先考慮。

5、程式語言的周邊系統,是否已經足夠成熟的元件或者社群或者技術支援,來支撐該選型。

        對於一家實業公司來說,撇開本身的資源和系統場景,去討論程式語言的選型是一個不負責的做法。最核心的依然是成本和時間的考慮,能否用最少時間並且最低成本實現一個系統,往往能夠決定一個系統能否在市場上成功。一個有趣的案例是hadoop,最早是用java實現的,在市場引起強烈反響,獲得巨大成功,而之後因為本身的問題,不斷加入輔助系統為不斷髮展的業務需求提供支撐。但最終卻是c語言編寫的ceph成為了linux下的分散式檔案系統選型而不是流行的hadoop的底層儲存hdfs。

        ceph的案例是一個反例,他選用c語言作為程式語言,顯然違背了成本和時間的原則。我們深入考慮ceph開發時的市場背景,不然發現,hadoop在此時已經有眾多的應用場景和周邊支撐,還有大公司的支援,唯一的突破點,就是他本身固有的缺點,比如可擴充套件性、效能等。ceph作為後入者,專注於底層儲存,與HDFS競爭,比如在使用者體驗上更勝一籌,那麼選型c顯然要優於java,其他反而不重要。於此相似的是阿里的rocketmq,他沒有用scala語言改進kafka,而是用java重寫了類似的系統。

        對於一家實業公司來說,即使是要和成熟產品競爭,會在成本和時間上做出妥協,但最終也會迴歸到這兩點,不可能無限投入和延時。我們考察下最流行的java,可以發現java的庫範圍覆蓋之廣,令人髮指,只要你能想到基本都有,這當然和java語言設計有關係,容易開發,方便管理,才促進了java庫的繁榮,又反過來推進java的發展。C/C++發展了幾十年了,專案同樣不少,但問題在於每個專案都各有自己的風格,你要在自己專案中引入其他專案,簡直要痛不欲生,除了幾個經典專案。

        python在早期多數被限制在運維管理專案,直到最近人工智慧的流行,大神吳恩達親自出面推介,再倒最近的交易策略程式設計也流行用python,之前多用VBS。想想也不奇怪,人工智慧和交易策略從業人員要麼數學或者金融專業出身,讓他們學習計算機知識顯然浪費時間;其次原來面向運維人員的Python,學習曲線就平滑得多;再次,數學庫的豐富,谷歌神器tensorflow都支援python了;最後,解釋性語言可以邊寫邊看結果,特別適合要演算法研究工作,畢竟每改一次都要編譯半天的編譯語言太浪費時間了。

        之上所說的一切都在於表明,每一個領域場景都會有對應的,符合理性選型的,一個或者多個程式語言。在符合領域場景特性下,成本和時間會成為關鍵的選型要素。領域語言比通用性語言的優勢在於他更符合領域場景特性,擯棄不需要的特性。有適合場景的系統庫支撐,如python的數學庫;也有適合開發人員的語法和使用習慣。領域語言的優勢在於使用者體驗,縮短系統成型時間,也同樣降低了研發成本。

        領域語言劣勢在於,需要對應的程式設計環境,因為領域多樣,語言也多樣,特性也多樣,所以要支撐這種多樣性,顯然是困難的。而一個有競爭性解決方案,就是一個同樣程式語言上,比如python上提供領域庫,可以是系統庫對應於運維繫統,可以是數學庫對應於人工智慧和交易策略。

        資料親和架構將系統研發限定在資料處理,以及對應的業務處理邏輯,開發者在使用這種架構時,需要考慮的因素有限,因此,更容易實現領域語言,更有助於提高開發效率,縮短開發時間,降低開發成本。