天天看點

C#、C++、Java、Python 選擇哪個好?

首先排除Python,光動态語言一個理由,就已經萬劫不複了。無論有多少所謂優勢,在這一個缺點面前,都顯得微不足道。

動态語言是為了七八十年代的古董計算機而設計的,那個年代的電腦作業系統還不到1MB,比如MS-Dos,Unix,Amiga等,是以絕大多數動态語言都是古董語言。Python在其中算是相對“年輕”的,但也是30年前的技術了。

除了Lua,Julia等極少數90後之外,絕大多數動态語言都是無法操縱線程的。因為那個年代的CPU是單核的,作業系統不僅是單線程的,有些系統甚至是單程序的。

雖然後來很多動态語言加入了協程,但其實還是隻能操縱一個線程的,連“治标”的問題都沒能完全解決,更别說“治本”了。很多初學者以為這是“快”與“慢”的問題,會随着硬體性能提升而逐漸改善,然而恰恰相反,硬體性能越提升,與動态語言越脫節。因為這些動态語言能有效發揮的CPU性能,始終停留在單線程的時代。

當時的主要儲存媒體是軟碟,就是那種正方形的塑膠小卡片,最大容量隻有1.44MB,為了能夠裝在軟碟裡面,所有動态語言的語句都特别簡短。用今天Python圈兒裡的話說,當時幾乎所有的程式設計語言,全都非常“優雅”。

後來硬碟容量變大,windows誕生,計算機完全進入圖形化時代,程式變得越來越龐大,一個程式從原本的幾KB,瞬間增大到幾十幾百MB,乃至GB。

從此,為了編寫kb級項目而設計出來的動态語言,越來越難以勝任軟體的編寫任務,被視為落後技術,除了JS之外,幾乎所有主要工作都被靜态語言取代,一大半動态語言從此滅絕了,活下來的動态語言則隻用來編寫腳本,才有了“工程語言”和”腳本語言”一說。

動态語言隻适合寫非常小的東西,項目越小,寫起來就越爽,越大就越抓狂,且非常難以維護。網上各種不到一百行代碼的“小項目”來證明Python如何如何優雅,而你去工作之後會發現,這樣的“小項目”今天隻存在于三個地方。

1,教育訓練機構的教學計劃中

2,各種教程的案例中

3,粉絲們互相洗腦的言論中

實際生産中,你見到的“小項目”代碼行數都是以萬為機關的,如果對Python代碼進行封裝的話,維護難度幾乎是在挑戰人類耐性的極限,無時無刻不抓狂,當然,也确實有個别使用Python寫成的“大項目”,但無一例外,都是靠大量注釋硬磨出來的。注釋的行數比代碼的行數要多得多。這時候就已經不是“寫代碼加注釋”,而是“寫注釋加代碼”了,編寫體驗就像是在寫一部”超長篇中文說明書,其中摻雜着少量代碼”,但你不把“長篇說明書”看完,這些曾經由自己親手寫出的“少量代碼”,就死活看不懂。

而且寫完代碼,确定不需要修改之後,還有一步工作要做,就是把那些浩如煙海的注釋,删掉絕大部分。否則注釋實在太多,會墊高運作成本,一個耗費大量精力編寫的項目,剛寫完時超過1GB,注釋删光之後,還剩100多MB,内心裡數不清的草泥馬。

另外三個都是不錯的選擇,它們都是靜态語言。若想開發一個中型以上的項目,而且希望可以有效維護的話。使用靜态語言來開發,才能讓你避免抓狂。

就像鐵鍬與挖掘機,如果給寵物挖個廁所,挖掘機顯得既難學又難用,一學就是兩年起步,考一堆資格證,還各種不熟練。鐵鍬簡直太棒了,分分鐘秒懂,掄起來就開挖。挖掘機還沒熱好車,用鐵鍬三五下就挖好了。鐵鍬顯得各方面都很完美,挖掘機簡直一無是處。但如果你想挖一座水壩,并指望長期靠這門手藝混飯吃,還是先去中國山東找藍翔,把“既難學又難用的挖掘機”學好再說吧。

當然,“不适合”與“不能”是兩回事。畢竟僅憑雙手都能磊出萬裡長城,用鐵鍬又怎會挖不出水壩?隻要有愚公移山的精神,動态語言當然也能寫出大型程式,隻要玩命加注釋就可以了。可問題就在于,僅為了“簡單易學”這麼個優點,而在漫長的職業生涯中反複不停的“移山”,值嗎?

既然說Python,當然要提一下人工智能,這确實是Python最大的存在價值。在熟練掌握一門靜态語言的前提下,确實可以抽時間學一下。但如果你連一門靜态語言都還沒掌握,隻學了學Python便指望可以去搞人工智能開發,那真是想太多了,因為現實情況是一環扣一環的。人工智能水壩很高端,但你得先把水壩挖出來才行,否則用卷積神經網絡能存水嘛?人工智能就像一件太空服,确實是進階貨,但要發展航天,需要優先考慮的問題,卻是如何造出一枚運載火箭?如何造出飛船?如何培養宇航員?當一切條件完備之後,才适合考慮太空服的問題,否則就是本末倒置。若連宇航員都還沒有,太空服給誰穿?沒有飛船,又何來宇航員?沒有運載火箭,飛船又怎麼上天?

既然說完了“為何要用挖掘機,而排除鐵鍬”的問題,下面就該說說“挖掘機技術哪家強”了。

三門靜态語言的文法是高度相似的,尤其是Java和C#,簡直是太像了,學會其中一門,另一門你就會了八九成(隻論文法部分)。完全可以在幾天之内,從一門語言過渡到另外一門語言。是以若想同時學會三門語言,其實一點都不難,但我不建議這樣做,因為這基本是在浪費時間。

因為“學會語言”和“勝任工作”之間,有着一道巨大的鴻溝。幾乎沒有多少回頭路可以走。比如我一開始是用Java做web開發的,由于工作需要,我需要學會“用C#做遊戲”。憑借Java的底子,我隻用了兩三天的時間,就學會了C#語言。之後我用了一個星期左右的時間,學會了用C#做web開發。可是,當我決定使用C#轉向遊戲開發的時候,我花費了兩年的時間學習,才勉強做出一個很小的項目。

用Java做Web開發,轉換到用C#做web開發,就像從右手寫字,轉換為左手寫字。并沒有新的知識要學,僅僅是改變了握筆的習慣。雖然很容易,但卻是在浪費時間。因為若要寫字,隻用一隻手就夠了。

之後,我試着學習用C#做遊戲,就像從寫字,轉換到畫畫。握筆的習慣沒有變,但所學的知識卻完全不同了。是以即便我用了兩年,但時間并沒有絲毫浪費,因為我每天都在學習“之前不懂的知識”。

是以選擇語言的關鍵,并不在于語言本身,而在于你要先想清楚,自己準備從事哪個行業。換一門語言非常容易。而換一個行業,就不是那麼容易了。

在這三門靜态語言當中,Java的使用者數量一定是最多的,崗位數量也是最多的,但競争壓力也是最大的。因為Java的就業崗位,幾乎全都集中在網際網路行業,主要就是用ssh做web開發,安卓項目也有一些,但非常少,基本可以忽略。好的方面是,在網際網路行業是最大主流,隻要不挑肥揀瘦,找工作不是問題,而且在很長一段時間内,這種情況都應該不會有太大變化。壞的方面是,嚴重依賴網際網路行業,隻要選了Java,就必須一門心思做網站,因為Java在其他行業的崗位數接近于零。網際網路高速增長,Java的雪球也就越滾越大。但如果哪天網際網路行業不行了,Java就要做好陪葬的準備了,轉型到其他行業的可能性微乎其微。這也是我轉而去學C#的原因,根本目的就是為了在“程式設計”和“做網站”之間實作解耦。讓“程式設計”可以做到更多的事情,否則你如何證明自己是個程式員,而不是個“網站制作員”?Java的親爹“日公司”還活着的時候,個人是個鐵杆Java粉,畢業後就找了份ssh增删查改的工作,一幹就是七八年,但後來Java被甲骨文這個拿資料庫當幌子,冒充IT公司的律師事務所收購之後,就開始變得不思進取了。除了整天上法院,在法律戰方面大顯神威之外,就隻能蹭網際網路的熱度保持增長。這麼多年來,始終無法在網際網路之外的領域,拓展出哪怕一丁點兒用途。Java是我使用時間最長的語言,我從高中時代就開始學習它了,還專門因為它,才決定報考計算機專業。我原以為自己會寫一輩子Java。可離開它之後,我卻開始反問自己”當初為何沒有早點離開?”。

C#是我的新歡,我實在特别喜歡它,至少目前是這樣的。最重要的原因是,它能做的工作比Java多很多,PC裝置內建,遊戲開發,ios和安卓開發,序列槽裝置通信,gis,工業控制,ao與erp系統,以及web開發全能做,而且學習效率和開發效率都很高。如果希望用最小的學習成本,獲得最大的技術回報,它一定就是最佳選擇。由于曾經不跨平台,錯失了網際網路崛起的時機,是以工作崗位并不像Java那樣,全都集中在網際網路行業,而是分布在各行各業。缺點是崗位太分散,崗位其實非常多,隻比Java略少一些,但分布到各行各業之後,就顯得沒什麼存在感了,在每個行業都不是老大,尤其在網際網路行業非常弱勢,也許連Java的零頭都不到。C#的名字也不好,總讓人聯想到C++,以為它是門很古老的語言,其實C#是個00後,論輩分和Go語言差不多,尚處于“小屁孩”階段,崗位數量能有如此規模,其實已經很了不起了。優點是,萬金油,哪個行業都能幹,又不依賴其中任何一個行業。如果哪天網際網路行業不行了,很容易轉型到各種行業。另外在遊戲開發方面是主流,Unity,寒霜3,CE5等衆多遊戲引擎,均使用C#開發遊戲。近幾年在網際網路方面的改進也還不錯,有了.NetCore,終于可以跨平台了。優點是性能非常棒,是常見的後端架構中速度最快的,具體可參照TechEmpower的性能測試。缺點是.NetCore出來的太晚了,盡管有技術優勢,但市場已經被Java占的穩穩的了,是以短期内Java必然還是唯一的主流。不過對我來說無所謂,能做網站的語言多如狗。“啥都能幹”才是我選C#的理由。我想我可能會寫一輩子C#。。。。。吧?

C++的牛逼之處,就是跑的特别快,而且理論上能做的事情比C#更多。尴尬之處就是無論做什麼,都不能隻會寫C++,還需要一堆專業知識配合使用,語言層面和應用層面,得分開學。比如市面上C++的工作,大部分要和各種裝置打交道。除了會寫代碼之外,還要懂電子電路,電氣電磁,儀器儀表之類的知識。我大學的同學們,學生時代大部分都傾向于C++,學霸們專注ogre,次優生擅長opencv,學渣們也多少會點MFC和QT,結果一找工作,無論學霸還是學渣,全都跪了。要麼是變壓器廠的裝置開發崗位,要麼是蓄電池廠的技術研發部門,甚至還有造直升機的軍工企業,全都要求懂裝置。難得有個金蝶軟體公司,招聘财務軟體開發的工作,不要求懂裝置,但卻要求數學能力,需要會微積分。十幾号同學排着隊去了,結果人家當下招了兩個,幾天之後又辭退了一個,最後隻留了一個。剩下的同學幾乎全都改行了,有的幹了銷售,有的開了飯館。。。本人沒走這個路子,再多的也就不敢亂說了。

我個人建議,

想長期在網際網路行業混下去,且沒有中途跳船的可能,選Java,前期重點放在MVC模式的了解和資料庫增删查改,中期重點放在伺服器負載均衡與CND分流加速,後期側重資料庫優化。

想創造更多的可能性,選C#,重點放在.NetCore(跨平台後端開發)和Unity3D(VR,AR,遊戲開發),并根據自身行業,選擇關注Azure(雲計算),WPF(桌面軟體開發),Blazor(Web前端架構),ML.Net(人工智能架構),Focas(工業機器人程式設計),MasterCAM(數控機床控制),Xamarin(安卓與IOS跨平台開發)等技術的發展情況與細節。

如果你是學霸,有電氣,機電等專業的知識背景,并有活到老,學到老的決心,學C++。