為什麼好多公司的開發語言從C#變成了JAVA
今天這篇文章不黑也不吹,就和大家嘮嘮一些我的所見及所聞,如有不妥之處請各位看官見諒。
從我之前的一些部落格文章看,大家也能知道之前是一個微軟技術棧的程式設計師,也就是主要C#,.net MVC的東東,後來換了工作,算是國內的一二線的一些網際網路公司,所以在技術方向和儲備上都有一些調整,開發語言也慢慢跳出微軟技術棧,工作中使用了其他的開源開發語言,新專案基本是開源語言,框架也使用了不少,所以就.net 和 類java一樣的開源語言框架都有一定的瞭解,今天有時間就談談為什麼好多公司的開發語言慢慢從C#變成了JAVA了。
其實也是希望大家能夠討論一下,如果是討論的話我們就會建立一個基本的討論標準,所以這篇我主要討論的標準有兩個:
公司定義:我們定義的是網際網路公司,TO-C的那種,不是to-B的,也不是軟體公司,因為軟體公司這種併發和QPS一個請求走9次IO也是正常的,儘管我們不應該這麼做,但是還是有人這麼做,因為他們主要關注點是能完成一些複雜業務;
專案定義:有的同學說微軟,百度,騰訊也在用C#啊,這個就沒有討論的意義,隔壁廣場舞大媽也可以去google做保潔,但是做產品和研發肯定不行,所以這個專案的定義還是建立在一套核心系統之上,這套核心系統的主要任務是為公司創造收入,而不是起職能作用,只有面對網際網路的產品才有可能去解決ddos攻擊,要做反扒系統,要做反垃圾系統,要做使用者增長系統,要做分散式事務控制,要做a/b test系統,要做大資料日誌收集系統,要做支付系統,專案多了,伺服器多了我們才要建立自動釋出/運維繫統。
所以希望園子裡面的同學能基於上面兩點進行討論,光是語言之爭我也沒有必要寫這篇文章了,如有光就語言本身進行無意義的爭論,這篇文章就沒有價值,我會刪掉的。
基於上面兩點可以讓大家真正認識到不同語言在不同領域的作用,也希望挖掘出國內用.net比較好的團隊在用.net做什麼東西,如果有好的經驗的話可以在這裡分享,讓更多的人和團隊可以將.net放在一些核心和商業系統之上,促進.net在國內偏技術而不是業務領域的發展。
好的程式設計師不會簡單的把自己仍在簡單的語言之爭的,因為好的程式設計師應該知道君子性非異也,善假於物也,我們系統中也會用多種語言,java主要做api和支付,兩方面原因,java有成熟的開發框架包括日誌,大資料,全文檢索,成熟的mq堆疊等等,這樣我們有更多的時間去做核心功能,而不是花大量時間做基礎整合和搭建。我們會用node做長連線,還有h5的後端api分發,也有團隊用go做底層通訊的封裝,我還是習慣用C#寫一些批處理的控制檯命令,python寫一些map/reduce的東西,主要是因為可以網上找到最好的例子,如果純用一張語言幹這些事情,肯定相當頭疼,效率不會太高。
架構師 and CTO
這個因素其實會佔很大的比重,小的公司初始的技術框架選擇都是由架構師確定的,後來就很少改變了,公司大了之後,引入CTO,CTO肯定不會就具體的框架和模組發號施令,更多的是在一個全域性的角度去看公司現有的一些核心系統,比如商城系統的訂單及資料中心的日誌資料系統這些巨集達的模組。
在公司架構來看,每一個專案都是部門級別的,最後不太可能每個公司每個部門有不同的開發語言,自設鴻溝,核心系統之間語言和通訊肯定是相同相似的。
當然我們的職能部門,如OA系統,運營系統,更多的是給公司內部人員或者職能人員使用,可以使用另一種語言,因為這兩套系統基本在核心繫統之外,不太需要和其他系統聯絡起來,最簡單的我們想不到公司資料平臺接入OA系統有什麼戰略意義。
於是問題來了為什麼架構師和CTO會選JAVA作為第一語言呢?
其實選擇.net的語言的架構師和CTO也不少。
混到架構師和CTO的基本都是工作多年,而混到多年的基本大浪淘沙就剩大部分JAVA少部分C#(歷史原因)。
由於這部分架構師和CTO過去的經歷是使用JAVA開發語言所以熟悉,這個就用了。
比較有影響力公司的CTO或者架構師參加一些QCon大會,為了有面子,基本傾向於公司使用JAVA等架構,這也是我們很少能見到國內一些技術大會有人分享.net架構的,除了stackoverflow。
總結而來就是 CTO架構師過去的技術經驗基本決定了公司技術的選型,在架構師CTO這個圈子,大家都在用JAVA順勢而為。
框架及生態
首先一個發展的比較好的公司或者成長經歷了擴張的公司,都會衍生出好幾個核心系統,而不是簡單的一套三層架構搞定的。
多個系統在之後會經歷SOA等服務化的分割,然後需要通訊,需要事務管理,需要日誌監控,需要非同步處理,然後在網上一搜,發現基本每個方向的優秀解決方案都是有java的影子,或多或少會影響我們的選型,單就RPC框架來說開源生態就有好幾種,並且背後的推手都是雅虎,google,facebook這樣的一等一的網際網路公司,但是.net背後基本也就是網際網路能力不夠的微軟和算不上2線的stackoverflow了吧。
生態大家也都知道就是mysql+linux+tomcat 對抗 sqlserver+windows+iis,微軟收費大家知道,跨平臺這件事java完勝,最後發現搭建一套虛擬機器叢集linux是多麼的順手,一套win的虛擬機器叢集即傷財又傷神。
總結:框架開源語言豐富,並且好多框架背後都有facebook,google這樣的巨頭做推手,.net的後盾就少很多。linux在虛擬化這件事基本完勝win,高昂的授權費如果有上千臺伺服器的話,這將是一大比費用。
技術的激進性
就是說不同圈子社群對於新技術的敏感性,由於開源社群受眾眾多,一個新概念的出現,開源社群就會如雨後春筍般出現文章及概念或者框架DEMO了,微軟社群除了官方的推進,其餘都屬於打醬油,而且微軟主要精力基本在他的AZure上了。
以炒了一年多的微服務,兩年多的大資料為例,我們已經將大資料用在了生產環境中,docker也在測試中,這些激進的想法和實踐在.net方向上肯定很難這麼快推進吧。
微服務有spring boot等概念,先不說效果怎麼樣,起碼社群在推進,但是基本沒有聽過微軟針對於微服務有什麼新框架出來。
總結來說,不黑不吹,過去兩年公司和專案的需要,自己學習了java web,spring這一套,研究了hadoop,hive的大資料框架,正在學docker,正式環境嘗試前後端分離快速開發h5介面,這些嘗試在之前的經歷中都是沒有的,可能是隨著工作經驗增長,能力有所提高就比較自信敢在生產環境嘗試,之前也是受限於.net的系統本身業務方向原因,更多的經歷耗費在了業務上,而不是處理技術問題吧。
相信微軟在解決跨平臺這件事,社群積累出現優秀框架,整個微軟技術將會更加優秀。
有同學批評我對於.net的觀察還停留在5年前,確實最近兩年很少寫.net了,但是這個5年確實也不影響,node出來也就5年吧,objectC也是最近5年比較火,包括hadoop,docker最近兩年才火起來的,我也用react,angular這些前端框架,我會追新技術的,新事物的誕生是為了解決老事物的問題而來,而且我們用的架構在市面上應該是最通用的,其實架構這件事5年真不算老,記得之前看<<打造facebook>>這本書,提到了facebook工程部門2010年做的工具和框架,就有a/btest框架,增長框架,結果我們去年才做,也就是說比facebook延遲了5年,只能說他們太優秀了。知道自己的不足,才能快速前行。
我們是為了找到問題,然後解決問題,好多人習慣性的上來就吵,這個肯定不是一個適合進步的思維,程式設計師也不會被一種語言吊死,勇於去嘗試不同,勇於接收挑戰,特別是工作多年之後會發現同樣工作年限的人能力差距是很大的,經常聽到走出舒適區,卻鮮有人做到,可以先從思維開始,看看有有什麼不同,踏實是說出自己的觀點,共同討論共同進步,還是基於兩個前提:
網際網路公司:因為他們會面對更多的問題,更大的併發量,每次修改都是在奔跑的火車上換輪子,每一次異常,每一次停頓都會損失大量的金錢的;
核心商業系統:因為這樣的系統是直接在公司產生價值的系統,這樣的系統要像寶寶一樣呵護,肯定是由公司最優秀的人和團隊,以及最好的架構資金支援的;
</div>