我在剛開始學編程的時候就常常來博客園,當時博客園基本是.Net的天下,從那時開始.Net和Java哪一個好就一直在打,這些年沒怎麼看博客園了,回來發現到了今天竟然還在爭論,讓我不禁得想來分析一下這個問題,這裏只考慮技術層面,而不談什麼大道理。前端
第一是你們關心的總體薪資分佈,做爲工程師或高級工程師,決定薪資的因素不少時候不光決定於你的技術,也決定於公司規模和制度,好比996拿得相對多天然付出的也多,因此單純看月薪統計數據恐怕意義不大,這一般取決於你的貢獻,再者薪資冒尖的一部分人一定不僅會一門技術。python
第二點是薪資的增幅,以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有什麼本質區別麼?docker
吐了一堆槽,想說的是不少時候你要面對的問題,並非Java哪一種new字符串的姿式更科學,你非糾結這個的話翻翻面試寶典抄一個行不行?也不是.Net和Java哪一個快,你能以一己之力撬動整個公司的決策的話,想必你也不會糾結哪一個語言好了。我已經染指過不少門主流語言了,誠實地說,你問我這些語言的for循環怎麼寫,我確定告訴你「複製粘貼」。django
學編程,我認爲能夠多思考這種東西,下面隨想隨寫,單拿編程語言一個範疇舉幾個例子: 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仍是從前打到後、怎麼運維、負載如何、怎麼應對未來變化、機器學習是本身訓練仍是拿人家的、這部分本身作仍是外包、數據處理流程是什麼、安全管理怎麼作、持續集成用什麼、如何控制成本、這些東西怎麼複製到下個項目裏...你寫的每一行代碼長得再醜,背後都是滿心的糾結flask
回到上面說的幾點問題後端
第一點,對於碼農來講,薪資天花板不是語言帶來的,而是你能解決問題的複雜度,.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哪一個好麼?