願c#和Java之爭暫得平息,雖然不抱希望

我在剛開始學編程的時候就經常來博客園,當時博客園基本是C#的天下,從那時開始C#和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之外的通信協議?

現在在爭c#和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哪個好麼?


分享到:


相關文章: