雖然不抱希望但也願.Net和Java之爭暫得平息
我在剛開始學程式設計的時候就經常來部落格園,當時部落格園基本是.Net的天下,從那時開始.Net和Java哪個好就一直在打,這些年沒怎麼看部落格園了,回來發現到了今天居然還在爭論,讓我不由得想來分析一下這個問題,這裡只考慮技術層面,而不談什麼大道理。
第一是大家關心的整體薪資分佈,作為工程師或高階工程師,決定薪資的因素很多時候不光決定於你的技術,也決定於公司規模和制度,比如996拿得相對多自然付出的也多,所以單純看月薪統計資料恐怕意義不大,這通常取決於你的貢獻,再者薪資冒尖的一部分人必定不只會一門技術。
第二點是薪資的增幅,以Java來說,作為一個學生會不會用SpringBoot體系或者說用得好不好可能是五千和一萬的差別,但是如果你已經月薪兩萬開外了,再去學一個PHP或者django之類的框架對你的薪資增幅毫無疑義,且你會發現你學會這些東西需要投入的成本可能不到一週,但是你學第一門可能花了之少好幾個月,也就是說在同一個開發範疇之內(比如Web開發)對具體語言或框架在戰術層面的投入帶來收益的增速是衰減的(二階導數為負),最終會逼近一個天花板,你不得不另謀出路。
第三是職業分工,我不懂為什麼很多程式設計師都喜歡標榜自己是“Java程式設計師、Node程式設計師、.Net程式設計師、python程式設計師“等等,你們都是”Backend Engineer“,五嶽能不能並派啊?不會觸類旁通的只能說是瘸腿工程師或者圖樣,我還真不信讓一個只寫過.Net的人在一週內用flask做個API他做不了,我也不信什麼能搞EF的搞不了JPA,能自給寫出一套Spring的人會怕.Net換Java麼,撐死了抽一天看看動態代理而已。嚴重依照技術棧招聘的,我只能說要麼技術部門現在缺這麼個人,要麼在某種程度上來說能反應公司整體的管理風格和業務特點,好比賣OA的一般Java或.Net系統比較成型了,而高吞吐量的公司可能要招Node、Golang之流,然而你能說這倆東西Java工程師稍微學一學搞不來麼?
第四是一些通的東西,以B/C模式開發整個技術棧來說,前端/微信之類的平臺、移動開發、服務端開發、大資料端開發/BI開發、DevOps、和可能涉及到的機器學習,每一個裡面都是一大套體系,又不是一個語言一個框架的事,我不敢說這裡面哪一樣只懂個.Net或者Java就能搞定你的工作,雖然有些東西是通的,比如這些裡面很多都要用Redis,那Java和.Net的SDK有什麼本質區別麼?
吐了一堆槽,想說的是很多時候你要面對的問題,並不是Java哪種new字串的姿勢更科學,你非糾結這個的話翻翻面試寶典抄一個行不行?也不是.Net和Java哪個快,你能以一己之力撬動整個公司的決策的話,想必你也不會糾結哪個語言好了。我已經染指過很多門主流語言了,誠實地說,你問我這些語言的for迴圈怎麼寫,我肯定告訴你“複製貼上”。
學程式設計,我認為可以多思考這種東西,下面隨想隨寫,單拿程式語言一個範疇舉幾個例子:
1.拿for迴圈來說,我想到for迴圈,就想到迭代器,拿到任何語言,我就會找類似於iteratable的介面,進而想到函式式的foreach匿名函式之流,會留意集合的不可變性和併發問題,哦,記得Flux裡也對不可變有要求,等等,這些東西放到任何語言裡皆準
2.現在重新看Java設計模式,我會想起Scala的單例物件、lazy關鍵字、iOS的delegate實現、C#的委託實現,不再會糾結各種什麼工廠而是知道把new的邏輯單拿出來拾掇拾掇,自己寫個什麼IoC,寫個什麼連線池任務池,知道抽象能自聚合實現鏈式呼叫等等,放到任何語言裡皆準
3.想異常處理,會考慮異常在架構上的邊界和異常管理,Golang的強制返回err是不是比Java的try更安心,有什麼能彼此借鑑的,想到監控日誌報警一條龍
4.看到JS有事件佇列,安卓和iOS有時間迴圈,就考慮接Web請求的程式是不是也能自給弄個守護執行緒之類的
5.看到JS的引用計數在前端造成記憶體洩漏,就思考iOS的自動釋放池機制,就去對比JVM的GC,在Hadoop之類的場景為什麼會GC時間過長等等,大資料框架為什麼要選JVM語言?
6.這個語言的併發包有柵欄工具、換個語言也有,這個語言能把執行緒當物件管理,換個語言我能不能很好地監控執行緒,換了協程咋弄,換了bash咋辦
7.bash既然那麼噁心我能不能換python?這個專案的後端要搞大把JavaBean還要寫一堆for處理資料我能不能換pandas?
8.C#的IL是把linq這種函式式用OO實現了一把,拿來對比JS的實現,再考慮python,再反觀Java7,最後為何不投奔Scala?
9.要說真麻煩的,還真是各種語言的環境配置和依賴管理了,那就讓他們HTTP通訊,docker怎麼樣?能不能考慮JSON之外的通訊協議?
現在在爭.Net和Java的人,將來你面對的工作可能是這樣的:這個專案的特性是什麼,我們選什麼語言、DB或元件、雲服務元件,這個語言的什麼框架好,要什麼API、如何組織它們協作,如何結合team現狀拆分人員,怎麼管元資料、版本、異常監控、要不要強制TDD、是DDD還是從前打到後、怎麼運維、負載如何、怎麼應對將來變化、機器學習是自己訓練還是拿人家的、這部分自己做還是外包、資料處理流程是什麼、安全管理怎麼做、持續整合用什麼、如何控制成本、這些東西怎麼複製到下個專案裡...你寫的每一行程式碼長得再醜,背後都是滿心的糾結
回到上面說的幾點問題
第一點,對於碼農來說,薪資天花板不是語言帶來的,而是你能解決問題的複雜度,.Net也好Java也罷,無非就是個工具,除此之外還有很多工具,能砍掉PM需求的腦子和嘴皮子也是個工具,不要把某一個工具看得過於當看的,鄙視鏈就是個鬧劇噱頭,居然會有人當真?
第二點,作為後端工程師為了推遲天花板的到來,應該帶著現有的技術跳去其他技術領域,比如Java可以跳大資料會迫使你跟進Python或Scala,比如去做高負載高併發的內容可能迫使你學習Golang、微服務、乃至bash,再走向DevOps,而做大資料也需要Ops,而做前端的不妨從Nginx開始從網路領域滲透到後端,另外像爬蟲和資料分析這種東西如果不求太精則是誰都能去玩的,但是這裡不建議往移動開發這種相關性低的領域跳。當你在技術上的投入帶來的技術成長逐步趨於平緩之後,由於之前的充分綜合積累,自己能發揮的價值還是會不斷增加的。
第三點,深度是建立在廣度的基礎上的,我認為碼農在一年後,發展應該先有一定廣度,在這個基礎上找一個領域深挖,就好比從大學讀到博士,專業面雖然逐漸縮小,但也是建立在廣度之上的,沒有相對全域性的視野,戰術上的勤奮偶爾也會讓你一時走錯路,何況你不知道各種聰明的碼農在愁煩什麼的話,也別談管人了。相比對於廣度的投入來說,對某一個具體框架原始碼的研究帶來的整體收益可能很小,這種事情並不在98%的需求範圍內,除非你投入開源,或者進了阿里這種要自己寫架構的廠寫架構。
第四點,說到分工範疇,雖然不要求跨領域面太廣,而我不敢想象一個.Net的OA開發人員一輩子都搞這個學生都能玩的CRUD夕陽產業,除非他把自己禁錮在這個領域,而不把自己真正當作一個後端工程師來看。而不論轉什麼都有一些通識,比如模式DDD、TDD、ORM原理、多執行緒、FP、資料結構效能估算等等,加之DB優化、網路協議、分散式原理等非程式語言內容也是通的,而換一種語言無非換一層皮,廖雪峰的python教程能讓你兩天看懂,不就是因為你有通識麼?一個自稱前端工程師的人我也不相信他只會JS不會其他TS等,一個自稱資料工程師的人也不至於徹底不沾染機器學習。
有時候需要站在一個34歲有幸沒有被開除還混到開發部經理的人的角度反過來看程式設計師的技術成長,而不是站在現在的位置歪歪將來如何。
如果你能忍耐著看到這裡,現在可以回答我.Net和Java哪個好麼?