主頁 > 後端開發 > C語言為何不會過時?你需要掌握多少種語言?

C語言為何不會過時?你需要掌握多少種語言?

2020-10-27 01:20:04 後端開發

01

為什么C語言不會過時

評價任何一門編程語言,都是招人罵的,永遠是這樣,就像是春寒料峭的季節, 街上穿棉襖和穿單衣的擦肩而過,雙方一定是同時在心里出現了兩個字:“s b!”這個在心理學上有個專業的名字:叫做“二b”現象!

先說一個表,這個就是著名的TIOBE語言排行榜,目前它是一個最權威的一個語言流行度的排行榜,從這個排行榜上看,你會得到一個最直觀的結論,Java和C都在下降,而下降的部分被第三名以后的語言所瓜分,

而就在5月,時隔5年,C語言再次領先Java,榮登TIOBE編程語言排行榜第一!

排名前十的分別是:

C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL和R,

有沒有發現亮點?沒錯, 第一易主了,C 語言反超了 Java ,要知道,C 語言上次第一還是在 5 年前,是什么原因讓其“東山再起”了呢?

時隔五年,C語言重回榜首,受冠狀病毒的影響,

據TIOBE CEO Paul Jansen 的猜測,“這聽起來可能很不可思議,但是某些編程語言確實可以從這種情況中受益,"

嵌入式語言(C 和 C++ 等)越來越流行,因為它們被用于醫療設備軟體中,


 

對所有的編程語言,他們的最后的目的其實就是兩種:提高硬體的運行效率和提高程式員的開發效率,

遺憾的是,這兩點是不可能并存的!你只能選一樣,在提高硬體的運行效率這一方面,C語言沒有競爭者!舉個簡單的例子,實作一個串列,C語言用陣列int a[3],經過編譯以后變成了(基地址+偏移量)的方式,對于計算機來說,沒有運算比加法更快,沒有任何一種方法比(基地址+偏移量)的存取方法更快,

C語言已經把硬體的運行效率壓縮到了極致,這種設計思想帶來的問題就是易用性和安全性的缺失,例如,你不能在陣列中混合保存不同的型別,否則編譯器沒有辦法計算正確的偏移量,同時C語言對于錯誤的偏移量也不聞不問,這就是C語言中臭名昭著的越界問題,

C語言自詡的“相信程式員”都是漂亮的說辭,它的唯一目的就是快,要么飛速的運行,要么飛速的崩潰,C語言只關心程式飛的高不高,不關心程式猿飛的累不累,就是這樣!

現在來看看那些非C的語言,他們的長處都在于提高程式員的開發效率上,或者支持動態的串列,或者支持安全的串列,但是加入任何的中間層,加入任何的安全檢驗,它不可能比(基地址+偏移量+無檢驗)的方式更快,這個世界上不存在“開發容易,運行快”的語言,開發容易畢竟來源于對底層的一層一層又一層的包裝,


 

現在回答兩個最普遍的問題:

硬體這么便宜了,有必要讓軟體更快嗎?有這種疑問的人大部分都是網吧的固定客戶,他們理解的計算機只在電腦城,他們理解的計算只是游戲和播放硬碟中的小電影,不要玩個游戲開個掛就樂得不行不行的,別忘了還有全實景仿真,還有3D渲染,還有自動駕駛,

人在開車的時候,每秒要收集60個不同的物體,然后根據這60個物體的不同組合和反映來做20個最重要的決定,然后從這20多個決定中選一個執行,所以就算用上最快的硬體,自動駕駛現在還不敢說能像人那樣開車,就算是自動駕駛成功了,下一步還要自動飛行呢?因為我們老早就預言了:你咋不上天呢!

所以說:計算速度永遠是不夠的!因為新的應用會越來越復雜,越來也實時,對了!我還忘了一個更重要的限制:計算的能耗!NASA飛行器上的CPU最多就是32位的,說出來你可能不信,國際空間站上沒有一個CPU是64位的,我猜一個最主要的原因是航天員不愛看硬碟小電影吧,

另外一個流行的疑問是:我可以發明一種同樣快的語言,但是沒有C語言那么多的坑,想法是可以的,而且還真巧有這個語言,真巧它的名字叫D語言,真巧沒有太多的人用!這是因為一個基本的事實,

現在有太多,太多太多的C代碼,他們大部分都在正常作業,就像Linux, Window, MacOS,Unix,Vxworks,你沒有看錯,這些作業系統的內核都是C,我雖然不確定C在Window中所占的比例,但是我相信微軟的人不會傻到用C#去全部改寫一個作業系統的內核,你想讓這些人去用你的全新的語言,這就不是“有點”很傻,很天真了!

而且有些代碼,我們根本就不能改!NASA一個簡單的5個CPU飛控軟體撰寫完畢后,要進行一種“全覆寫”測驗,如果CPU A壞了會發生什么?如果CPU A,B壞了呢?如果CPU A,C壞了呢,,,,?

如果你愿意,你可以做個簡單的數學組合,測驗完畢后,別說重寫,就算加個注釋都不行,因為主管payload的大媽會非常嚴肅的質問你,為什么你上報的東西數量增加了,但是質量沒有增加?你需要和她詳細的解釋:硬體和軟體是不同的,硬體是那種摸起來硬硬的東西,但是軟體不是那種摸起來軟軟的東西,

看著大媽鄙夷的眼神,這個時候你會非常后悔自己手欠加入的哪一行注釋,你還別不當真,這個是NASA的真實故事,

哪為什么C語言還下降這么多呢?很簡單,有些任務本身就不是C語言的,我上學的時候還用C語言編過視窗界面呢?然后很快微軟的人就推出了MFC,就是一大堆宏把底層的C windowAPI包裝了起來,

再后來這個技術也過時了,因為微軟的人認識到,帶有視窗的應用程式說到底不是C語言的本職作業,再這么一層一層包下去就有露餡的危險,于是他們發明了一個全新的語言C#來負責這個任務,

Java也是這樣,突出網路,易用,安全,跨平臺,無論是Java, c#還是python, 他們都有意避開提高硬體的運行效率這個問題,因為這個問題上沒辦法和C競爭,也無法撼動Linux, Unix,GNU tool這些已有C代碼的位置,

剩下的就只是提高程式員的開發效率上大作文章,這對C語言是好事,把自己不善長的東西去掉,讓自己跑的更快!

伴隨著嵌入和實時系統的興起,AI,機器人,自動駕駛等,這些都是C語言的核心應用,而且在這種應用上面,C語言沒有競爭者,所以我感覺C語言會穩定在自己核心的應用中,并開始逐步回升,(碼農翻身注:趙老師預料對了,果然回升了,)

但是Java語言我個人不樂觀,小型和靈活性上,Python更勝一籌,一行python代碼后,你根本不知道自己還是不是duck型別?平臺領域,每個平臺都推出自己專屬的語言,Windows會繼續支持C#,蘋果偏愛Swift, Android推出Kotlin,Google用go,Java宣稱自己可以自由到每家做客,但是無論是到誰家,都會發現客廳里面坐著一個親兒子,這個時候自己這個干兒子多多少少有點尷尬,所以我猜測,最后Java會穩定在對跨平臺有嚴格要求的,大型非實時應用上,

最后說點閑話,C++不會淘汰C語言,有了物件后你會發現再簡樸的物件也耗費資源,而且有了物件以后,總是不由自主的去想繼承這個事,一但繼承實作了,你會發現繼承帶來的麻煩遠超過你的想象,Java的發明人James被問到如果可以從新設計Java語言的話,第一個要做什么事?他說:“去掉物件”!作為一個已婚,有兩個孩子的程式猿,我感同身受,


 

如果你看到這里,還什么都沒記住,那就只記住一點:沒人能預測未來,

? 全世界只需要五臺電腦 -IBM創始人

? 640K記憶體足夠了 -微軟創始人 

? 沒必要在家里用電腦-DEC創始人 

? 如果再有人對你說C語言已經過時了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑,

網友對于C語言這樣評價

1、航空、軍工領域不是大眾所能接觸的;

2、現在很多工業領域也很多使用64位處理器吧(人工智能技術的成熟和普及) 3、消費領域就更不用說了;

4、作為普通程式猿,主要還是工業領域或者消費應用領域,c語言適合底層開發,c++的物件其實也沒有多么耗資源,c++物件模型這本書有詳細介紹,雖然有些過時,但是設計理念基本還是延續著,c、c++會繼續有一席之地,但是這個范圍是不是會繼續縮小到一個極點也不好說,淘汰,我個人看法應該不會,

5、范圍縮小了,小眾了,可能工資回報也不會大幅變化,

6、會不會有更適合底層開發、比c更有優勢的語言出現,這個敢說,但是前段時間使用了一下rust語言,還是讓我眼前一亮,而且大廠也在關注這門語言,畢竟是后來設計的,會總結前人的經驗,可能會更佳優秀,越往上層應用,開發平臺和語言越是封裝很好、使用很方便、更佳接近人類的思維方式(以前的開發語言很像是控制計算機的具體指令,慢慢的在發展)


 

02

為什么 C 語言仍然占據統治地位?

于一種計算機行業的技術來說尤其如此,自1972年誕生以來,C語言一直保持生龍活虎的狀態,時至今日它仍然是我們用來搭建軟體世界的基礎建筑材料之一,

但有時一種技術能夠長期存在,只是因為人們還沒有來得及發明新的東西來取代它而已,在過去的幾十年里,出現了許多其他語言——其中一些明確地被設計用于挑戰C的主導地位,有些語言試圖憑借自己的人氣慢慢瓦解C語言的統治地位,

為C需要被替換掉的觀點爭辯是簡單的,編程語言研究和軟體開發實踐都暗示了如何比C更好地去做事,但歷經數十年的研究和開發,C語言的地位卻依舊穩固,很少有其他語言能夠在性能、裸機兼容性或通用性等方面擊敗它,不過,2018年C是如何與那些明星編程語言競爭的呢,其中細節仍值得一看,

C vs. C ++

當然了,C最常被拿來與C ++進行比較,正如其名稱本身所暗示的那樣,C++作為對C語言的擴展而被創建出來,C ++和C之間的差異可以概括為C++更加廣泛(褒)或更加寬泛(貶),具體取決于這個問題你是問的C還是C++程式員,(笑)

雖然C ++的語法等方面仍然是類C的,但它提供了許多在原生的C中本不可用的非常實用的功能:命名空間(namespace),模板(template),例外(exception),自動記憶體管理(automatic memory management)等等,需要頂級性能的專案,例如涉及資料庫,機器學習系統的專案通常是用C ++撰寫的,以便專案能盡可能地榨取以及利用到每一點性能,

此外,與C相比,C ++在持續地更加積極地擴展,即將推出的C ++ 20會帶來更多功能供開發者享用,包括模塊,協同程式,同步庫,以及概念,這些使模板更易于使用,C standard的最新版本只進行了少量更新,并側重于保持向后兼容性,

事實上,C ++中的所有附加功能同樣也可能成為累贅,而且是很大的累贅,您使用的C ++專屬功能越多,引入的復雜度就越高,對結果的修正就越困難,將自己局限于僅一個C ++子集的開發人員可以避免許多開發中嚴重的坑和額外負擔,但是有些團隊想要從根兒上防范C ++的過度復雜性,堅持使用C能迫使開發人員將自己局限于一個子集,例如,Linux內核開發團隊就直接避開了C ++,

選C而不選C++對您——以及任何將會維護你代碼的開發人員——來說都是可行的,通過采用強制簡約主義來避免與C ++的復雜性糾纏,當然,C ++擁有豐富的高級功能,這是有它自己的道理的,但如果極簡主義更適合當前和未來的專案——以及負責專案的團隊——那么還是選C更明智一些,

C vs. Java

幾十年了,Java仍然是企業軟體開發的主力軍之一——并且也是寬泛而言的開發的主力軍之一,許多最重要的企業軟體專案都是用Java撰寫的——包括絕大多數Apache Software Foundation專案——而Java仍然是開發企業級需求專案的可行語言,

Java的語法從C和C ++中借鑒了很多東西,但是,與C不同的是,Java默認情況下不會編譯為本機代碼,相反,Java運行時環境,JVM,JIT(實時)編譯Java代碼以在目標環境中運行,在適當的情況下,JIT編譯后的Java代碼可以接近甚至超過C的性能,

Java背后的“一次撰寫,隨處運行”的理念也允許Java程式在目標架構上進行相對較少的調整即可運行,相比之下,雖然C已被移植到許多架構中,但任何給定的C程式仍可能需要重新量身定做才能在,打個比方,Windows與Linux,兩種不同的os之間正常運行,

這種可移植性和強大性能的結合,以及龐大的軟體庫和框架組成的生態,使Java成為構建企業應用程式的首選語言,

Java輸給C的地方是一個Java從未打算競爭的領域:靠近底層結構運行,或直接與硬體打交道,C代碼被編譯成機器代碼,由行程直接執行,Java被編譯成位元組碼,這是一種隨后會被JVM解釋器轉換為機器代碼的中間代碼,此外,盡管Java的自動記憶體管理在大多數情況下都是個優點,但C更適合于必須充分利用有限記憶體資源的情況,

也就是說,在某些方面,Java在速度方面可以接近于C,JVM的JIT引擎在運行時根據程式行為優化例程,允許進行許多型別的優化,而這些優化是在未提前編譯的C中無法實作的,雖然Java運行時自動執行記憶體管理,但一些較新的應用程式可以解決這個問題,例如,Apache Spark部分地通過使用繞過JVM的自定義記憶體管理代碼來優化記憶體中處理,

C vs. C#和.Net

在推出近二十年后,C#和.Net 框架仍然是企業軟體世界的主要組成部分,有人說C#和.Net是微軟對Java的回應——一個托管代碼編譯器系統和通用運行庫——C和Java之間的許多種對比也適用于C和C#或.Net之間,

與Java(以及某種程度上來說Python也是如此)一樣,.Net提供跨各種平臺的可移植性和龐大的集成軟體生態系統,考慮到.Net世界中有多少面向企業的開發,這些都是不小的優勢,當您使用C#或任何其他.Net語言開發程式時,您可以使用為.Net運行時撰寫的大量工具和庫,

.NET另一個類似Java的優勢是JIT優化,C#和.Net程式可以按照C語言提前編譯,但它們主要由.Net運行時進行即時編譯,并使用運行時資訊進行優化,JIT編譯允許對無法在C中執行的運行著的.Net程式進行各種就地優化,

與C一樣,C#和.Net提供各種直接訪問記憶體的機制,堆,堆疊和非托管系統記憶體都可以通過.Net API和物件訪問,開發人員可以使用.Net中的unsafe模式來實作更高的性能,

但這些都不是沒有代價的,托管物件和unsafe物件不能被任意交換,并且它們之間的編組會降低性能,因此,要最大化.Net應用程式的性能需要將托管和非托管物件之間的變動保持在最低限度,

如果您無法承擔托管與非托管記憶體之間變動造成的性能損失,或者.Net運行時對于目標環境(例如,內核空間)來說是一個糟糕的選擇,或者可能根本不可用,那么C就是你所需要的,與C#和.Net不同,C被默認可以解鎖對記憶體的訪問權,

C vs. Go

Go的語法很大程度上借鑒了C——花括號作為定界符,陳述句以分號結束,等等,精通C的開發人員通常可以毫不費力地直接使用Go,甚至算上Go的獨有功能,如命名空間和包管理,對開發人員來說也并不困難,

代碼可讀性是Go的指導設計目標之一:讓開發人員可以輕松掌握任何Go專案,并在短時間內熟練掌握代碼庫,C代碼庫可能很難理解,因為它們很容易聚集大量專屬于某個專案或某個團隊的宏和和#ifdef,Go的語法及其內置的代碼格式以及專案管理工具旨在避免這種結構性問題,

Go還提供了諸如goroutine和channel之類的附加功能,用于處理并發性和組件之間的訊息傳遞的語言級別的工具,C需要開發者手動完成或由外部庫提供,但Go提供了開箱即用的這些功能,使得構建需要這些功能的軟體變得更加容易,

Go與C最深層次的不同之處在于記憶體管理方面,默認情況下,Go的物件會被自動管理并自動進行回收,對于大多數編程作業來說,這非常方便,但這也意味著任何需要確定性處理記憶體的程式都會更難撰寫,

Go確實包含了用于繞過Go的某些型別處理安全性的unsafe包,例如使用Pointer型別讀取和寫入任意記憶體,但unsafe會附帶一個warning說用它撰寫的程式“可能是不可移植的,并且不受Go 1兼容性指南的保護,”

Go非常適合構建命令列實用程式和網路服務等,因為這些很少用到太過細致的操作,但是,如果是低級設備驅動程式,內核空間作業系統組件以及其他需要嚴格控制記憶體布局和管理的任務,那么就最好用C來創建,

C vs. Rust

在某些方面,Rust是對C和C ++創建的記憶體管理難題的回應,也是對這兩種語言的許多其他缺點的回應,Rust編譯為本機機器代碼,因此就性能而言,它被認為與C相當,但默認情況下,記憶體安全才是Rust的主要賣點,

Rust的語法和編譯規則可幫助開發人員避免常見的記憶體管理錯誤,如果程式有一個不符合Rust語法的記憶體管理問題,它就不會被編譯,剛接觸這種語言的新手,特別是以前用C語言的開發者,由于C語言為這類bug提供了充足的容錯空間,所以他們接觸Rust的第一步是學習如何安撫編譯器,但Rust的支持者認為,這種短期的痛苦有一個長期的回報:更安全的,不會級訓速度的代碼,

Rust還通過其工具改進了C語言,默認情況下,專案和組件管理是Rust提供的工具鏈的一部分,與Go相同,有一種默認的,推薦的方法來管理包,組織專案檔案夾,以及處理C需要單獨處理的其他許多事情,每個專案和團隊以不同的方式處理它們,

然而,在Rust中被吹捧為優勢的東西對于C開發者來說可能并沒有太大吸引力,Rust的編譯時安全功能無法禁用,因此即使是最小的Rust程式也必須符合Rust的記憶體安全限制,默認情況下,C可能不太安全,但在必要時它更靈活,更寬容,

另一個可能的缺點是Rust語言的大小,即使考慮到標準庫,C的功能也相對較少,Rust功能集非常龐大并且還在不斷增長,與C ++一樣,較大的Rust功能集意味著更強大的功能,但也意味著更高的復雜度,C是一種較小的語言,但更容易在頭腦中進行建模,因此可能更適合那些對Rust來說太小,不值得大動干戈的專案,

C vs. Python

當今,每當談論軟體開發時,Python似乎總是能出現在對話中,畢竟,Python是“對所有專案的第二佳語言”,毫無疑問是最通用的語言之一,擁有數千個第三方庫,

Python強調的,以及它與C最不同的地方,是有利于開發速度而不是執行速度,一個可能需要一個小時才能用另一種語言寫出來的程式——比如C——可能用Python幾分鐘內就能寫好,另一方面,該程式在C中執行可能需要幾秒鐘,但需要一分鐘才能在Python中運行完,(一個很好的經驗法則:Python程式通常比它們對應的C語言程式運行速度慢一個數量級,)但是對于現代硬體上的許多作業,Python已經足夠快了,這是它如今廣泛應用的一個重要原因,

另一個主要區別是記憶體管理,Python程式完全由Python運行時進行記憶體管理,因此開發人員不必擔心分配和釋放記憶體的細節,但同樣,開發人員的輕松也是以運行時性能為代價的,撰寫C程式需要嚴格關注記憶體管理,但生成的程式通常是純機器速度的黃金標準,

但是,在二者的血脈中,Python和C共享一個深層的關系:Python運行時參考是用C語言撰寫的,這允許Python程式包裝用C和C ++撰寫的庫,第三方庫的Python生態系統的很多重要模塊,例如機器學習方面的庫,其核心是C代碼,

如果開發速度比執行速度更重要,并且如果程式的大多數高性能部分可以被隔離到獨立組件中(而不是遍布整個代碼),那么純Python或Python和C庫的混合使得會是比單獨使用C更好的選擇,否則的話,C仍然是老大,


 

 

03

C語言為何值得去學

1. 嵌入式領域,C語言依然是首選語言,嵌入式并沒有因為其他上層語言的發展而沒落,現在嵌入式依然還在其自身的領域展現強大的生命力,手機,電視機,機頂盒,空氣凈化器等等電子產品都是其領域范疇,從長遠看短時間內不可能被消失,而且智能機器人的崛起,C語言的使用頻率又開始加大了,

2. 作業系統內核代碼還是C語言為主打,就語言的靈活性以及執行的效率來看C語言還是最合適的語言,而且在系統層次的代碼,C語言還是首選語言,而且現在很多流行語言的底層絕大部分的C語言構建完成,從這個層面講C語言是永遠不會過時的,頂多算是應用范圍變窄,但其作用依然強大,

3. C語言的職位比例相對應用級語言是低了點,但是整個軟體行業在發展,絕對的C語言編程職位并沒有減少,而且對于有志于成為架構師層次的程式員來說,C語言還是必修課,構建軟體框架還是需要對底層有所了解,

退一步來講,即使覺得C語言方面的職位比例低一些,不好找作業,可以先從C語言入手,把自己的知識體系建立起來,編程語言屬于工具范疇,熟悉一種工具的使用,很容易觸類旁通,切換到別的語言也相對輕松些,而且給整個職業生涯起了個好頭,打好了基礎為更上一層樓做足準備,

C語言之所以流行這么年,生命力這么旺盛和本身鮮明的高效,方便靈活掛鉤,即使在上層語言使用概率變低,并不妨礙在系統級別繼續發揮作用,任何一種語言都有其存在的社會價值所在,C語言還是值得作為入門語言深刻的學習,

4.C/C++程式員的收入沒有受到影響,依據100offer的后臺資料顯現,現在經過100offer入職的程式員年薪最高達47W,最低22.4W,C/C++程式員的收入與其它編程言語的崗位相比處于相等狀況,沒有呈現下風,

跟著C++逐步變成某些特定公司和特定專案所需的言語后,高檔C++程式員的收入也會更具有競爭性,

5.在整個游戲產業和嵌入式上依然是主流,首先是游戲范疇,Milo Yip表示——程式員有必要運用C++結構/庫,如大多數游戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),盡管有些C/C++庫供給別的言語的系結,但通常原生的API性能最佳、最新,

 

其次是東西范疇,無論是網路安全仍是殺毒軟體,C/C++仍是干流言語,

某乎紅人vczh說:「我在上大學的時分簡直就只學習C/C++,后來實習的時分去了微軟,成果到了那里才知道,那個組是不必C/C++的,怎么辦?憑借著C++帶給我的富裕的功底,我準時完結了老板給我的"兩個星期內學會C#和WCF基礎知識"的作業,順暢開端作業,」

當然,這只是vczh的個人經歷,不具有普遍性,但不行否認的是C/C++仍具有不行代替性,某家創業公司CTO在承受采訪時表示:「即使有許多人唱衰C/C++,但在今世,仍有許多許多專案的目標渠道暫時只供給C/C++編譯器的支撐,僅從這一點而言,C/C++是不行能完全逝世的,」

從應用范疇來說,C/C++適用于高性能計算、嵌入式體系、開發服務器軟體、游戲、實時體系等,所以,短期內能完全代替C++言語并不存在,

C/C++在體系、圖形、網路等許多范疇都是不行代替的,它的光芒年月讓它的逝世速度得以減少,

當某一種編程言語在市場需要顯著比另一種言語更強時,強需要言語中的缺陷則簡單被淡化,闌珊的言語則不斷被人挑出致命硬傷,這種編程言語之間的比較并不公平,且沒有意義,

編程言語都是用來表達思想和完結需要的東西,跟著年代的開展,不一樣言語在不一樣范疇都做出了取舍,代替盡管存在,但不是必定景象,C/C++的需要跟著年代開展會不行避免地越來越少,但不行能完全不見,C/C++程式員也具有不行代替性,在市場上照舊有著競爭性,


 

04

除了C語言,需要掌握多種編程語言嗎?

簡述

我剛剛斷送了自己的職業生涯,沒錯,很多人都這樣對我說,

同事得知我即將離開公司的訊息,大多數對此表示理解,但讓他們困惑的是,我目前就職的公司是一家Windows商店,用C#.net撰寫代碼,而我要入職的崗位要求在Linux環境下進行開發,以Java為主要的編程語言,他們認為編程語言的改變會讓我丟失多年經驗,許多人都贊同他們的觀點,

編程語言很多,數以百計,有些很常見,例如:Java、C#、PHP、Ruby、Python、和JavaScript,而有些則比較邊緣化或是新興的,例如:Awk、Go、Julia、Rust,面對如此多的選擇,我們又該關注那種語言呢?因此,我開始思考這個問題 - 你真的需要掌握不止一種編程語言嗎?


 

想要掌握多種編程語言的9個理由

? 能用多種方式來解決同樣的問題,掌握不同的編程語言意味著擁有更多的選擇,畢竟,當你只有錘子時,一切看起來都像是釘子,

? 更有競爭力,擁有更多的就業機會,學習第二門編程語言,有時能加倍作業機會的數量,然而,這取決于你學習的語言種類,但無論怎么說,你將會有更多的合適機會,從而增加求職能力,

? 表明你具備學習新語言的能力,潛在的雇主會認為你并非是死板或者慣守成規的人,

? 學習是很有趣的,學習新的事物會讓你的頭腦保持興奮,這將有助于你在新領域的成長和提高,

? 緊跟當前的技術發展趨勢,了解哪個行業在獨領風騷,就可以永遠站在潮流的尖端,你的技能便不會過時,

? 這將提醒你為什么應該熱愛你的“主”語言,或者如何將事情做得更好,有時候,只有嘗試過新語言,才會知道主語言是何等的優秀,你會更加欣賞自己最愛的語言,與此同時,新語言可能會有一些驚人的特性,讓你深覺相見恨晚,

? 有助于成為一個更加優秀的程式猿,學習新的語言,有助于提高在所有語言之間通用的技能,例如:設計和架構演算法,或處理不同的資料結構,

? 針對作業選擇最佳的工具,尺有所短寸有所長 - 有的語言更善于處理某些特定方面的事情,掌握了多種語言,你可以在作業中選用最佳的工具

? 表明你的學習能力強,沒有任何事情比掌握第二語言更能證明你的學習能力,

 

不想掌握多種編程語言的9個理由

? 掌握一種語言更容易,通常,集中精力和全心投入才能精通某一事物,如果不斷地在多種語言之間進行切換,那么真正精通一門語言的概率就會降低,掌握一種語言也有助于你集中精力,

? 大多數人只需要一份作業,大部分公司只使用一種語言,在你被錄用后,掌握多種語言不一定會有所幫助,有時候,只要掌握專案所用的語言就夠了,

? 總有一些東西值得學習;有時候,這意味著要更深入地學習一種語言,

? 大多數情況下,專家能提更高的薪資要求,因為人們更愿意為專家支付更多的薪水,John Sonmez在其視頻《 I’m Not Sure I Want To Be A Specialist》中談到為什么多面手并不總是最好的,

? 即便僅掌握一種語言,仍然可以被認為是一個偉大的開發者,是否是偉大的開發者與你掌握多少種語言無關,關鍵在于你創造的是什么,因為只涉及一種語言,所以你可以花更多的時間進行創造,

? 你只需要學習有限的軟體開發工具,大多數語言只有為數不多的一些工具,切換語言往往意味著要切換工具,只掌握一種語言,你就可以更快地掌握相關的工具,這將有助于提高作業效率,

? 更易于定位自己的市場,因為只掌握一種語言,基本上你只會朝這個方向安頓下來(即使不是出于自己的選擇),

? 你可以憑借任何一種語言解決大多數軟體問題,不管有多少人告訴你,大多數語言可以用于解決任何問題,如果解決問題是你的主要目標(本應當是),掌握更多的語言并不一定有助于實作這個目標,

? 深入理解一件事比表面了解十件事更好,

這并非是一個非黑即白的問題,和其他問題一樣,最好的解決辦法是取中間值:總有一片灰色地帶,如果你是一個初學者,那么學習一種語言,并將其應用到前十多個專案中會比較容易,但此之后,建議你成為一個「T形」軟體開發者,


 

如果你想加入我們程式員一伙——程式員學習基地【點擊進入】!

學習:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

程式員開發工程師,從這里開始!


 

編程入門資料:


 

?推薦學習書籍:


 

一個活躍、高逼格、高層次的編程學習殿堂;編程入門只是順帶,思維的提高才有價值!

 

什么是「T形」軟體開發者?

所謂「T形」軟體開發者在某一個特定的區域擁有很深的造詣,而且是一種語言的專家,T字母中的垂直線代表了這一點;此外,他們會繼續廣泛學習另一種技能,T字母中的水平線代表了這一點,

那么,這與軟體開發,特別是編程語言的學習,有什么關系呢?我的建議是精通一種編程語言,這將成為你以后的生計,并用于解決大部分問題,你應該盡你所能掌握這門語言,在此基礎上,可以學習最適合作業的第二種語言或技能,

T形軟體開發者是一個多面手,精通于某一領域,

在成為T形開發者的歷程中,你將靈活地掌握多種語言,同時具備某個領域專家的優點,

 

 

應該掌握哪種編程語言?

一個常見的問題是,應當學習哪種語言,或者說,假如你是初學者,應當首先學習哪種語言,通常,我會選擇有一定歷史的語言作為主要語言,這種語言應當用于多個行業,并且有廣泛的使用群體和大量的開發工具,符合這些標準的語言有:Java、C#、.NET、Ruby、Python和Swift,

TIOBE軟體基于這些標準持續跟蹤軟體語言的流行性,并編入索引中,你可以點擊TIOBE Index查看完整的編程語言串列,索引會每月更新,前20名中的大多數語言都是不錯的選擇,未來10年,這些語言還會流行嗎?我不確定,不過至少在未來四年內還是很可能保持流行的,我想,這對任何準備著手的專案都是夠用的,

? 是否需要掌握多種語言取決于你的目標

? 想開始新的業余專案或業務?或許你只需要掌握一種語言,

? 想換行業或駕馭技術發展趨勢?或許你需要掌握不止一種語言,

? 想在企業環境中作業?或許你只需要掌握一種語言,

? 想作業在前沿專案?或許你需要掌握不止一種語言,因為潮流總是在變化,

說實話,關于是否需要掌握更多的語言,其實并沒有絕對正確或錯誤的答案,最后的決定取決于你,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/192812.html

標籤:C

上一篇:netty-socketio報錯陣列越界錯誤,有沒有大佬給解答一下這是啥

下一篇:自學編程,看書還是視頻?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more