為什麼那麼多公司不用 .NET,而選擇 PHP、JSP,是 .NET 有什麼缺點嗎?

有什麼優劣嗎


看了一大圈,只有@翁偉一個答案是靠譜的。.net在互聯網圈使用率低是事實,而且原因基本和技術本身優劣無關,就是生態環境和人才的問題。

單從語言特性上講,C#早就把風格近似的Java遠遠拋在了身後(我從03年開始兩者交替用,C#進步極其明顯),與各種現代編程語言比一圈的話都絕對不輸。相反,很多看低.net的人其實對它並不了解,拿出來說的很多缺點根本就是七八年甚至十幾年前的成見,都不值一駁。

問題就出在人才結構上。據我所了解,國內政府、傳統企業、銀行、工廠等.net應用最廣泛的領域中,存在大量水平低劣、不思進取、恨不得只會拖拽控制項和百度搜代碼就自稱程序員的人。他們對計算機原本就沒興趣,編程的目標是儘快不再編程,想在三年內轉管理或售前,可惜失敗了。高不成低不就,又幹不了別的,只好迷茫地繼續不思進取,編寫bug叢生的代碼。

這種人想跳到工資較高的互聯網圈都困難。除了加班強度之外,根本就跟不上需要快速學習新知識、新語言和框架的節奏,自己還恨不得學一次吃一輩子呢。

我在十幾年的工作生涯里這種人見得太多了。有的2013年仍然在維護Windows Server 2003;有的時至今日都只熟悉 .net Framework 1.1那一套,連反射和泛型都不知道怎麼用;演算法更是像聽天書一樣,不提二叉樹、有向圖了,拿冒泡排序都能掃倒一大片。一點都不誇張。

至於為什麼只有.net而不是其他語言變成了這樣?無他,門檻太低而已。Java只比它難一點,就濾掉了一大堆垃圾程序員。而且.net是能在Windows下部署的,要知道這些人根本連linux命令行都懶得學,能省一點是一點……

其實過去幾年的App熱潮導致大批零基礎培訓三五個月就上崗的iOS和安卓「程序員」湧入業界,那個代碼質量之慘不忍睹,跟早年這批.net程序員剛入行時有一拼。但他們之所以有人肯要是因為沒有代替品。而.net在Web端要跟一百多種伺服器語言競爭,這幫人的下場可想而知。也只有在慢節奏、靠市場關係不靠技術吃飯的企業有活路了。

當然,並不是所有.net程序員都水平低下到這程度,有很多也是有熱情、肯學習的,但越往上升發現方向越窄,很多就乾脆去了微軟。如果不去的話,發現可去的地方越來越少,既然都是要學習,學別的語言也沒問題啊,就這麼換到別的平台去了。

整個.net生態圈(特指國內)的情況是,高水平的大神不少,越往下,良品率越以驚人的速度下降。如果你打算打造一支開發.net的團隊,那不好意思了,可能會招到一個不錯的Leader,但招底下幹活的人時,篩選成本一下子就變成了其他語言平台的好幾倍。時間和人力都是錢啊。

這種惡劣環境不知道什麼時候會有轉機。我倒覺得.net core現在正處於一個很好的節點上:根據微軟的東西第三個版本才能用的原則,配合VS2017的.net core已經足夠可用和完善了,既能發揮出C#的優秀特性、又有開放的平台。最重要的是,如果有人正在研究它的話,說明肯定是個有足夠熱情和動力吸收新知識的程序員啊,比很多傍著熱門平台吃老本的強多了。


先說結論:.net目前最大的問題就是缺乏足夠多靠譜的工程師。

我自己做過七年的 .net,從純技術的層面看,我是覺得 .net 各方面都蠻好的,完全可以做出非常好的系統,開發效率高,整體投入成本也低的。

如果我自己去做單人開發就能搞定的系統,我很可能會選擇 .net core + azure去做。

純技術層面的優劣,我覺得不需要爭辯。對於不了解 .net 的童鞋,我會建議去試試使用 VS code,去體驗微軟把這個編輯器做得怎麼樣。

覺得優秀的話,然後再可以深入去了解微軟的其他技術。

但如果是公司層面的話,考量就完全不一樣了。

招聘是技術選型的一個重要考量因素。

一個技術再怎麼好,如果無法建立起足夠大的團隊,那麼就是白搭。我司研發在上海,原先的技術棧是純 .net的。

我試了近半年,拉勾、獵頭、甚至直接去github搜上海 + .net,等等方式,就硬是無法招聘到足夠多靠譜的 .net 工程師。

請注意,我是說靠譜的 .net 工程師少,而不是 .net 工程師少。

市場上 .net 工程師是不少的,某大廠過來我司面試的 .net 工程師大概有十幾個,但我一個offer都沒敢發出去,全部都太!差!了!

連最基礎的可以用O(N^2)暴力解決的演算法題都搞不定,都沒能讓我有機會問優化。

資料庫索引也毫無概念。

git不會用。

沒聽說過 .net core也就罷了,泛型都說不清楚。

基本上都只會用IDE拖拽去幹活吧;給我強烈的『培訓班製造』的工程師的感覺。

曾經問其中一個願意降薪跳槽的候選人說為什麼願意這樣,他說:『如果我再不出來,恐怕以後就再也找不到工作了』。

思量再三,我還是沒敢給他發offer。

.net社區存在大量這樣的工程師,推崇使用『拖拽』、『簡單搞定』等等概念,硬生生把技術工作變得沒有技術含量,造就了一批沒有技術能力的工程師,或者說,只能搬固定磚塊的碼農;環境、條件稍微變化一下,他們就搞不定。

當然,.net 靠譜的工程師也是有的,但他們要麼被那幾家大廠包養著,要麼直接在微軟。完全沒法挖。

況且,挖到一個兩個又怎麼樣?遠遠不夠。

我就想問,知乎上,自覺聰明 + 努力,渴望成為靠譜的工程師的童鞋裡面,有幾個願意選擇 .net,然後去微軟之外的公司工作的?

選擇 .net 的靠譜工程師少,讓公司又怎麼敢選 .net?

選了也只能忍痛遷移掉,比方說我司。

==============

若然 .net core能健康發展,微軟重新成為工程師心目中的『酷公司』,以後靠譜的 .net工程師會多起來吧?但那可能得等五年後。

PS: 我司後端轉的是go,而不是java:

ezbuy招聘-前海煦逸信息技術(深圳)有限公司招聘-拉勾網

go是另一個很好玩的情況:工程師雖然不多,但靠譜率非常高。當然,招聘只是技術選型的考量之一,更重要的是要看團隊是否有能力掌控這麼一門技術,我搞得定go。


有些人的偏見真是嘖嘖嘖

更新#1

.NET的問題就在於不能有效提高使用者的智商。

這句話我非常贊同。然後整體偏見也就是這樣來的

第二個我才懶得跟你斗那個數據呢。Linux里有用的好的,CI,自動維護什麼都做得很好的,不代表Windows里沒有。但是你前面的例子都是有問題的,並不能夠成為事實情況。

你跟我說無法全面自動化?事實上你真正在Windows Server上會用到的都會提供CLI和其他介面供遠程管理。

還老程序員了,產業在變化都不完全清楚……

你跟我講錢?呵呵呵呵呵。真正會用的都是悶聲發大財的。

已拉黑,不送。

----------------------------------------------------------------------

原回答

卧槽還真的有人會一台一台伺服器RDP過去啊……

如果你只維護10台以內的內網 windows,可能你並不覺得有什麼不妥。

上百台上千台 Windows 伺服器分布在全國不同的機房,還有國外機房,維護的時候一台一台遠程桌面過去,打開個記事本gui都要反應半天,你不覺得這是在開玩笑么?

不知道加域後本地開Remote Server Manager然後很多事情就解決了么……所有伺服器狀態在眼前一清二楚,誰讓你用RDP來管理了,WinRM和Remote PowerShell是什麼都不知道啊,而且現在很多Windows Server設置是沒有GUI的必須通過PowerShell Module來完成就當著不知道還反過來對吧

你是不知道Active Directory的存在嗎

Windows Server Remote Server Manager這裡是有的,隨便給個傳送門:

http://www.microsoft.com/en-us/download/details.aspx?id=39296

nginx跑在windows上慢的可憐,redis就直接不能在 windows 下面跑(雖然有個port,但是功能不全),各種大型資料庫,在 Windows下水土不服,kafka, spark, 這些常用的東西,在 windows 下就跑不起來。還有很多依賴的框架和庫,直接無法編譯,cygwin雖然可以編譯一些,但 cygwin 那個卡呀,卡出翔來了。

為什麼要在Windows下跑nginx?如果做反代用IIS ARR就好了,或者單獨部署前端反代。用nginx+FastCGI跑PHP之類的東西就是個笑話,性能不知道低到哪裡去,比Apache還不如。

IIS ARR跑反代的性能沒nginx好

你叫這種東西叫常用的東西你不知道平台差異性嗎你不一定要用到這種東西

各種大型資料庫整個納斯達克都在用SQL Server 2014呢

部署難道還是一台台電腦過去啊。不應該從CI里就完成這件事情啊。

用過 KVM, OpenStack, Docker 的人都知道,雲計算時代,計算資源動態擴充,系統實例在不同的硬體上備份、遷移,對於管理上千台伺服器來講,是一件多麼重要的事情。Azure 相當於 KVM,但 OpenStack, Docker 的便利性,在 Windows 上還沒有替代的方案。

當Windows Server Nano不存在一樣,當Hyper-V不存在一樣,果然是沒用過Hyper-V和Azure

但是沒幾年,越來越多的 Linux成功案例使大家都看透了 IBM的謊言,所以今天大型機基本都快消失了,最終的結果就是 IBM 自己都開始支持 Linux。

哪天哪個開源組件又被爆了看把你們搞得怎麼樣,這種案例已經不是第一次了

IBM神坑又不是不知道,M$良心多了,不信?去看一下Windows Server 2012 R2 Datacenter的虛擬化許可費用。

比如你做 web開發,你選一門語言,python,語言就做好語言的事情。

我給你講個笑話,知乎

.net就是在學校和培訓機構比較火點,企業應用比較小眾,一個服務做出來頂多幾十個人同時訪問

你當Bing是什麼,你當StackOverFlow是什麼,你當整個Microsoft Online Services是什麼,你當Office 365上的所有服務是什麼,你當新浪的後端是什麼

真的來說不用.NET無非因為已經用了現有的技術、偏見、錢導致的

有些人怎麼就是不懂呢!?


只是絕大部分做架構的都不懂.net怎麼玩。

---

就開發來說.net是很爽,但是運維部署卻不是很好做。.net 運行環境為windows ,一般公司的部署環境為linux ,為了統一環境,直接php,不是更好嗎,而且windows上自動化運維,自動化部署也不好搞。期待.net core吧。


.NET的問題就在於不能有效提高使用者的智商。

譬如說這種問題,你就會發現很多人,在使用Windows的時候,從來沒有聽說過PowerShell,從來不知道遠程管理,從來沒用過雲服務,從來沒用config文件配置過IIS。

一旦使用Linux,立馬各種命令行用的飛起,自己裝各種組件服務折騰一天都不覺得累,馬上就領悟了拷貝配置文件和批處理來部署伺服器。

Linux對人的智商提升簡直太明顯。

還有Java也是,很多人用.NET的時候從MSDN搜個API Reference都費勁,要去CSDN伸手才能弄個一知半解的。一用Java立馬各種開源軟體有的沒的都能搜出來,還立馬領悟了各種使用方法。


微軟的技術和linux上的那些技術都是主流技術,學哪個都不虧,至於技術選型請公司cto操心吧,只要是主流的技術我都OK啊。現在我上班c++,c#,Java

都用,這種問題已經看的淡了。


瞎說句大實話。

不用付費只認開源,理由其實只是你的應用連個授權費都賺不出來!


那些拿版權費用說事的,有沒有考慮過人工成本的問題?正常情況下,人工成本比版權費用貴多了。如果非要節省版權費用,折騰mono也是可以的啊。
那些拿維護說事的,好意思說自己是做程序開發的嗎?覺得遠程桌面效率不高,不能自己寫個服務處理?
一個完整無縫可擴展的解決方案不好嗎?非要自己拿一些亂七八糟的零件組裝在一起,然後換來換去,有意思嗎?系統跑得好好的,性能與功能需求都沒有問題,沒事瞎折騰是要幹嘛呢?
兼容性低與.NET有什麼關係?誰規定了.NET使用的資料庫必須裝在windows伺服器上面?再說框架和庫的兼容性問題,應該找作者,而不是windows。難道你的linux兼容windows的框架和庫?

.NET真正的劣勢是市場認可度,這是業界態度決定的。

.NET的優勢是開發效率(自動化)與良好的可維護性,首頁 - C# 高性能自動化服務端框架 - 凹凸架構,用好了能節省大量人工成本,當然能用好的也不多。


STACK OVERFLOW基本上是全套的MS組件:c# .net sqlserver等等,沒看到有什麼性能問題。MS架構的一大主要劣勢就是多節點licence的成本,所以SO都極力限制橫向擴展,用縱向提升硬體性能來應對負載。兩年前看過一篇博客,那時整個stack exchange網站群才只有十幾台伺服器,這是SO引以為豪的一點,難以想像他們做了多少優化才有這樣的成績。有興趣去看看Joel Sposky的博客,好像他有詳細講過這件事。


我原來公司的有幾款遊戲伺服器是使用.net,跑在Linux.....


伺服器端LAMP這套東西還是挺不錯的。便宜好用(開源),易於開發(輕量),方便集成(拼湊)。

基本沒啥特殊理由不考慮微軟技術了。授權費用先擋住一票人。


高級人才難招!高級人才難招!高級人才難招!

好不容易培養一個,馬上就被挖走了。


1、公司最早的技術團隊是java和php的。

2、技術負責人不會選擇自己不熟悉的語言。

3、說win伺服器貴的,有點扯淡。你會在乎買根麻辣串的錢嗎?

4、大公司一般都是多語言技術共同支撐。你說的只片面與php/jsp那說明還不是大公司。外包公司吧

5、老闆和我說,不選擇.NET,因為.NET開源晚,我會一個耳刮子過去,我專揍矯情的老闆。

(僅供參考...)


因為java的框架和解決方案都是現成的

spring .net ,Nhibernate等等都是從java移植到 . net的 (知乎的編輯框太蠢了,自動給我加超鏈接)


我一個安卓的崗位三天三百個人投。一個C#崗位三天三個人投。

安卓崗位再多培訓班出來的也總有幾個正規軍。

C#崗位全是大專沒畢業,說自己有三年工作經驗那種。


如果Mono的規範程度和性能等等趕上微軟.Net Runtime,Java分分鐘被戰翻。。。。。。


掃了一遍答案,其實現在Azure基本把這些問題都解決了。申請一個trial或者bizspark體驗一下吧。


維護成本

如果你只維護10台以內的內網 windows,可能你並不覺得有什麼不妥。

上百台上千台 Windows 伺服器分布在全國不同的機房,還有國外機房,維護的時候一台一台遠程桌面過去,打開個記事本gui都要反應半天,你不覺得這是在開玩笑么?

是的,Windows是有 PowerShell 命令行和自動化,但是 Windows下並不是所有功能都能用命令行完成,特別是很多第三方軟體和服務,非GUI操作不可。無法做到全面自動化。

可替換性

選擇非 .net技術,在於靈活性和可替換性,是四處皆可替換的東西。比如你做 web開發,你選一門語言,python,語言就做好語言的事情。外部的網路框架,可以用 django,flask, web.py等等,介面可以用 fastcg / cgi / wsgi / uwsgi / apache_mod, 而外部的伺服器,可以用 apache, nginx, lighthttpd。清晰的被分成:語言層、框架層、協議層、服務層 四個不同的層次,每個層次若干備選方案,互相兼容,web.py過時了,我換 flask,apache過時了,我換nginx。每個產品都專註做好自己的事情,並前後適配其他層次的方案,python出問題了,我換 ruby,換php,協議任然用 apache_mod或者 fastcgi,這就是每個層次都可以替換的設計。

這樣的情況在.net技術體系里很難出現,這些技術運行到windows下水土不服不說,微軟自己就不讓你選:你要寫asp .net,那語言你就用 c#(vb比較小眾),用了aspnet 你就要用iis,而iis只能跑在 windows下。外部的人很難兼容進來,本來微軟就不太願意支持其他技術。那麼好,一開始可能領先,但是隨著時間推移,這麼長的鏈條中間一環出問題,可能會導致其他的跟著他一起被人拋棄。

虛擬技術

用過 KVM, OpenStack, Docker 的人都知道,雲計算時代,計算資源動態擴充,系統實例在不同的硬體上備份、遷移,對於管理上千台伺服器來講,是一件多麼重要的事情。Azure 相當於 KVM,但 OpenStack, Docker 的便利性,在 Windows 上還沒有替代的方案。

兼容性低

nginx跑在windows上慢的可憐,redis就直接不能在 windows 下面跑(雖然有個port,但是功能不全),各種大型資料庫,在 Windows下水土不服,kafka, spark, 這些常用的東西,在 windows 下就跑不起來。還有很多依賴的框架和庫,直接無法編譯,cygwin雖然可以編譯一些,但 cygwin 那個卡呀,卡出翔來了。

人才招聘

.net就是在學校和培訓機構比較火點,企業應用比較小眾,一個服務做出來頂多幾十個人同時訪問,用什麼都一樣,但直接面向公眾的大型服務解決方案對技術的要求完全不一樣,你說的jsp,php在這方面都是成熟的技術,有大把人才供招聘。

而 Windows 的大規模解決方案,放眼望去,可能我孤陋寡聞:微軟自己,stackoverflow,協程,csdn。。。。少得可憐,下面有一張 2015年服務端操作系統比例,一看便知:

所以從人才招聘的角度上來講,更容易招聘 Linux的人才,而從自身來講,後端工程師使用 linux 更容易找到工作。

活躍站點網頁服務端分布:

全球前一百萬最繁忙的站點排序

駭人聽聞

IBM的銷售經常嚇人,說免費的東西風險大,沒保障,後期的維護成本比收費的大型機還貴,最終免費的東西實際使用價格更貴。IBM的銷售掛在嘴邊的就是某某企業用了開源方案數據丟失,損失上億等等駭人聽聞的故事。早年是有一批人被 IBM 的銷售給嚇到了,紛紛購買大型機。但是沒幾年,越來越多的 Linux成功案例使大家都看透了 IBM的謊言,所以今天大型機基本都快消失了,最終的結果就是 IBM 自己都開始支持 Linux。

微軟也一樣用同樣的說法來嚇別人使用 Windows,企業應用技術低,很多人是被嚇到了,但非企業應用,普通 2C的公司管理幾千台 Linux 伺服器,一個10人組的 SA 團隊就足夠了,穩定的跑幾年,並沒有那麼多駭人聽聞的 「故事」,而且 Linux 的系統管理員還特別好招聘。

所以別說 mono和 .net 開源的事情了,改變不了上面的現狀。

工作機會

.net 高收入職位數

10000到15000(104)
15000到20000(26)
20000到30000(4)

java 高收入職位數

10000到15000(729)
15000到20000(277)
20000到30000(60)
30000到40000(19)

php高收入職位數

10000到15000(418)
15000到20000(68)
20000到30000(20)
30000到40000(4)

windows高收入職位數

2000以下(135)
2000到3000(123)
3000到4000(251)
4000到6000(272)
6000到8000(110)
8000到10000(86)
10000到15000(54)
15000到20000(20)
20000到30000(5)

linux高收入職位數

2000以下(247)
2000到3000(105)
3000到4000(236)
4000到6000(527)
6000到8000(279)
8000到10000(285)
10000到15000(238)
15000到20000(76)
20000到30000(22)
30000到40000(9)
40000到50000(1)

騰訊:首頁 | Tencent 騰訊招聘 :搜索.net 10個職位,java 334個,php 165個。python 203個

阿里:http://job.alibaba.com .net 4 個職位,java 490個職位,php 70個職位,python 140個

以上數據我只是隨便搜索一下,並不能完全反應總體情況,但也可見一偶,其他公司和職位感興趣的自己搜索。

-----------

服務端操作系統佔有率圖表就在上面,這麼明顯的事實,評論區為啥還有那麼多人爭論呢?



在下機械專業自學轉的.net,誤打誤撞搞了兩年,之前跟我公司一多年javaer說轉java的事,他也做.net,他說其實差不多,轉起來容易,我想說,大部分人其實也願意轉,只是轉是需要成本的,沒做過任何java開發,憑著.net的項目經驗,找工作也會煩死的吧。話說之前看過一段時間c++,真心不喜歡這語言本身,話說找.net工作公司都好小啊,高級工資到是也不錯,轉or不轉?


推薦閱讀:

如果婚姻制度消失,世界會怎樣?
為什麼獨立顯卡上也有一套視頻輸出介面?
計算機二級證書在找工作時有哪些作用?
為什麼即使在微軟當年的鼎盛時期,科技媒體對微軟的反對聲音也很大?
信息熵是描述確定的信息的還是描述不確定信息的?

TAG:程序員 | 信息技術IT | NET | 系統架構 | 互聯網行業 |