數據親和架構--領域語言

       在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上提供領域庫,可以是系統庫對應於運維繫統,可以是數學庫對應於人工智能和交易策略。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章