眾所周知,Python、Ruby甚至Java都是在解決業務問題,屬於面向應用的語言,主要側重於解決業務邏輯,但是還有壹個領域是系統,偏於網絡層和底層操作。我壹直在尋找這方面的優雅解決方案,C++被我先淘汰了。C的開發效率太低,但Java更適合,就是太臃腫,缺乏系統編程的基因。畢竟它。
最後我選擇了Erlang,因為它在網絡層有著出色的性能,良好的容錯性和健壯性,它的虛擬機是唯壹可以和JVM抗衡的,OTP是壹個超級重量級的武器,幾乎可以秒殺網絡層應用,但是根據我的總結,它有壹個硬傷,也有壹個軟肋,後面會開發。可以說,Erlang是目前我所知道的最好的解決方案。
直到有壹天我認識了Golang,我才知道Golang其實挺早的。大約在2008年,我知道谷歌正在開發壹種奇怪的語言。隨後幾年,以老莫為代表的很多人都在嘀咕Golang。其實我從來沒怎麽關註過。我從ROR中學到的經驗是,成熟度對業務非常重要,越來越多的產品是基於Golang開發的。我必須研究它,我知道這是我夢寐以求的蟒蛇。效率和性能達到了最佳平衡。對Go了解的越多,就越不想用Erlang寫代碼。主要原因是:
1,Erlang的硬傷在於代碼的可讀性和表現力。我舉個小例子。例如,如果妳為妳的系統軟件構建壹個RESTFUL接口,我們可以對代碼風格有壹個大致的了解。先不說二郎。無論妳是c/c++/python/ruby/java出身,妳是否對圍棋有壹種久違的感覺?為什麽是硬傷?因為對於壹門語言來說,語法不太可能有大的變化,也不會有大的變化。不知道有沒有人看過松本幸弘的《編程世界》,裏面把道理解釋得很清楚。真正好的編程方法是人主宰計算機而不是計算機。感覺二郎在我的編程思維上有點占優勢(我本身視力就不好,還在殺眼睛!),編程首先是邏輯,其次是工程,最後是數學,這讓我想起了吳軍的《數學之美》。人工智能在上個世紀壹直在走彎路,期待機器高度圖靈,而忽略了人類現有的文明和統計歸納的應用。
2.Erlang的軟肋在於缺乏高質量的庫。雖然有很多殺手級的應用,但是Go在這方面也是壹個軟肋。這對於壹門不到五年的語言來說可以理解,但是對於壹門二十多年的語言來說就有點說不過去了。比如用json解析庫,很多人都是從mochiweb這個基本不更新的庫裏提取的。我覺得json之類的東西可以集成到語言標準庫中,因為未來商業軟件的api趨勢越來越明顯。說白了,壹個倚老賣老,壹個與時俱進。反正我壹點都不擔心Golang的圖書館。目前易經已經很好了,遠遠好於Ruby/Python的前五年。請參考現有優質庫列表。
3.Erlang不合群,主要體現在和其他語言的交互上。當然還有深層次的原因。Erlang本身有自己的哲學,比如錯誤恢復機制。如果妳用另壹種語言整合壹些東西,這個賬就不好算了,就像妳堅持讓壹個喝咖啡的人和壹個吃大蒜的人坐在壹起壹樣。簡而言之,妳寫壹個Erlang端口遠比Go復雜。甚至比Python/Java還要復雜,導致Erlang的底層編程效果不太好,也無法利用linux的很多優秀成果。我壹直認為Erlang不需要任何mysql/pg/oracle驅動。Erlang必須是壹個自容器應用,只要用別的東西,按照木桶理論,不敢叫九個九,用系統的眼光看問題。我認為壹個系統的健壯性不能依賴於某個組件,這也是愛立信本身的Erlang應用沒有被廣泛使用的原因。
4.先說數據類型。聽到1以上的人說Erlang處理字符串不好。它把字符串當成了列表,其實也是應該的。但是,還是那句話,違背了以人為本的理念,應該做壹些DSL,比如:=在Golang是糖衣,相當於var xx yyy = zzzz。程序員輸入更少的字符非常方便。在Golang中,字符轉換基本類似於python。切片貼圖功能非常強大,支持lambda條件。雖然Erlang的基本類型很少,但是結構很多。所謂的結構相當於Golang中的復雜結構。這也很奇怪。就是覺得二郎結構傷眼睛好嗎?可能是括號的比較吧,我覺得沒必要。很明顯,二郎缺少DSL的基因,這和二郎出生的年代有關。不誇張的說,自從用了二郎,我的視力下降了65,438+000度左右。我不太喜歡lisp提到的符號,但可能和函數式編程有關:形式演繹遠大於邏輯演繹。
5.其實我最不在乎的就是性能,因為有了摩爾定律,壹個單位計算單元的性價比會無限高。但既然Golang提出了性能接近C,我還是提壹下吧。當然Erlang也可以,雖然比Java慢,但是和Python在壹個級別上。
6.再來說說報錯機制,因為Erlang的報錯信息太糾結了。壹開始以為不會看錯誤信息,後來用了Sasl,還是不夠直觀。有時我甚至需要使用工具分析崩潰文件來定位問題。還是和二郎的哲學有關。在Erlang中壹切都是並行的,所以它根本不在乎物理的哪壹條線是錯的。和演員綁定就行了,然後告訴妳演員的ID和錯誤碼。可以自己憑經驗分析。這樣做的好處是可以很容易定位並行發生的問題,但壹切都是相對的,有點矯枉過正。根據我的經驗,很多時候我只是想先指出哪壹行對我來說是錯的,好嗎?甚至用完整的英語句子打印出順序回溯,好嗎?至於並行錯誤,在命令式多線程語言中並不常見。雖然也不是沒有,但是遇到錯誤我還是會盡力調試。但並不是所有的邏輯都用並行思維來定位問題。我甚至認為,壹個系統並不是完全平行或串聯的,就像我們不能簡單地用唯物主義或唯心主義來衡量世界壹樣。Golang做了很好的妥協。在不需要並行的時候,可以老老實實寫串行代碼。
7.再說招人。之前從C招過幾個人。說實話,水平很不錯。我可以在壹周內完成壹個小組件。libevent很熟悉。後來我逼著人家用Erlang,結果把人家趕走了。我還是很後悔,把自己壹廂情願的想法強加給別人真的不合適。但是可以說我從純二郎招人比從objc招人更難。沒有人。空談技術的優雅壹開始不靠譜,再看看郵件列表。Golang的活躍度明顯比Erlang高很多,基本接近Ruby。更重要的是,我壹點也不擔心Golang的天賦,因為只要熟悉Python/C/Ruby/或者C++,基本上半天就能上手,然後就可以壹邊工作壹邊搜索資料了。雖然有足夠的深度,但是門檻極其溫和,工程師可以重用很多現有的。Erlang其實和第壹點有關。大部分人都是疑惑壹周。每個人的抽象思維和世界觀不都壹樣嗎?所以,雖然函數式編程並不比命令式語言起步晚,但總是很少有人學。這是歷史。對於大多數人來說,他們更喜歡解決問題,創造價值,而不是用數學去推導。
8.最後,我建議如果妳玩c/c++,現在是學習Golang,用壹種可靠的語言成長的最好時機。這種感覺太棒了。妳用Erlang折騰了1個應用,恐怕妳用Go完成了10個開源項目。當然也要結合自己的口味。Golang是崇高的文字,Erlang。
相信自己的判斷,相信自己的邏輯,贏就是贏,輸就是輸。
轉載僅供參考,版權歸原作者所有。祝妳有愉快的壹天。滿意請采納。