大家好,最近有小夥伴在後臺問我,大一新生學校在教C語言,是不是已經過時了?第一門語言應該學什麼比較好?大學期間什麼課程對於畢業之後的從業幫助比較大呢?
今天這篇文章就和大家簡單聊聊這個問題。
關於我
最後給大家講講我自己的一些情況吧,掐指一算才發現,從我初學程式設計至今已經超過十年了。
我是高中的時候學習程式設計的,那時候我們學的是Pascal。大家沒聽說過是很正常的,這是一門非常古老的語言。這門語言古老到什麼程度呢?古老到它的IDE都是藍屏的,看起來就像是當機了一樣。大概長這樣,當時我們在機房裡寫程式碼的時候,一片藍光,跟進了鬼片現場似的。
當時學Pascal也是淺嘗輒止,只是學了一些基礎的用法,連結構體我都不太會用。很多人都說Pascal是一門非常適合新手入門的語言,不知道是不是我太菜了,我至今也沒get到。從那之後我又陸續學過很多語言,比如C/C++,Java、Python、JS還有最近學的Go。十年前學的Pascal的語法早已忘得精光,當時的程式設計習慣也都很挫,基本上也改得差不多了。
如果非要說學了Pascal對我現在有什麼幫助的話,唯一的幫助應該是它讓我學C語言的過程變得非常簡單。基本上只是簡單看了一下C的語法,做了一些練習就掌握了。其實這也是大多數人學習的第一門語言的意義,不是為了學到了就能上手做事情,更多的是為以後學習其他的內容打基礎。
所以嚴格說起來C語言是我第二門學習的語言,但是我第一門掌握得比較完善的語言。
C語言適合入門嗎
關於這個問題我是有過翻轉的,我曾經有一段時間覺得是不合適的。因為學習C語言的過程就是面對一個黑框框寫各種數學題的過程,挺枯燥和無聊的,很多人都是這樣被勸退的。如果是Python、JS等語言的話,則可以做的事情就很多,學習者會有極大的熱情繼續學習下去,這樣入門的門檻可能會低一些。
我想很多人也是這麼覺得的,因為學習了C語言會有一種無處施展的感覺。我們花了很大精力學了程式設計這麼黑科技的東西,搞半天居然除了對著黑框框做題什麼也做不了,這太不炫酷了。你看看Python,學會了之後又可以爬圖片又可以處理文件,難道不香嗎?還有些人可能也不太懂,就覺得Python、Java這些新興語言要比老舊的C語言厲害一點。
最近幾年我的看法又再次翻轉了回來,我現在覺得C語言其實挺適合初學者入門的,它也是有很多其他語言沒有的好處的。同樣Python、Java這些看起來濃眉大眼魅力十足的語言,其實也是有很多缺陷的。
C語言最大的好處是什麼?我個人覺得有兩點,第一點是它的語法很乾淨,C語言當中基本的語法幾乎都能在其他所有語言當中找到。這一點在Go語言上同樣有所體現,精簡到極值,多餘的一點也沒有。也就是說你在C語言上積累的程式設計功底換了其他的語言基本上都能用上,但像是Python這樣的語言可能就不是如此。Python當中的新特性非常多,換一門語言可能就玩不轉了。
第二點是C語言區分了引用和指標,瞭解這點對於初學者而言非常重要。引用和指標直接關係到傳參以及函式內的變數處理邏輯,但很多語言這兩者只涉及一個,比如Java當中就只有引用,Go語言當中就只有指標。如果搞不清楚引用和指標的區別會埋下很多隱患,比如引數傳遞的時候寫錯了邏輯,再比如完全沒有記憶體使用的概念,寫出來的程式碼記憶體洩漏嚴重。
當然C語言存在的問題也不少,比如應用場景太少,庫函式也不多,寫起程式碼來非常費勁。但這不妨礙它非常適合培養程式設計思想以及良好的程式設計習慣,對於初學者而言,擁有一個好的習慣和意識,其實要比具體學到的內容更加重要,從這點上來說,大一新生的第一門語言課上C語言其實是沒有問題的。
語言的選擇
當然,也有一些學校給大一新生開設Python或者是Java的(比如MIT和史丹佛),難道這些學校就錯了嗎?
其實也沒有,這是一個取捨問題。比如Python學起來可能比較有趣,對於有些學院而言可能更加看重學生的興趣。再比如Java一切物件導向,從Java開始可能更加有利於之後物件導向的學習。還有些大牛是從JS入門的,因為會比較方便之後從事前端。這些其實都沒有問題,並沒有一條規定的所謂正確路線。語言本身並沒有高下之分,有的只有適用的範圍不同。
所以說,其實我們選的不是語言,而是方向。比如你想要以後從事演算法,那麼Python顯然是必學的,不僅需要學還需要比較深入。比如你想要做開發,那麼就比較推薦Java,入門的門檻相對較低,並且崗位缺口很大,學得好不愁找不到工作。比如想要做前端,那麼顯然Python、Java這些都用不上,HTML+CSS+JS三件套才是王道。
也就是說語言是和我們方向掛鉤的,我們想要成為什麼領域的工程師,就需要相應地進行該領域內的學習和鑽研。嚴格來說並沒有一門語言是普適的,是不管什麼方向的工程師都需要掌握的。
另外一點是到了後期學習一門語言遠遠不像大家想的那麼費勁,其實熟悉了程式設計的核心邏輯之後,語言之間基本上只有語法的差異。打個比方來說好了,我在剛入職的時候為了完成入職測驗,在3天內學習了go語言,並且從無到有用go語言寫了一個簡單的後臺程式。說起來好像3天學完一門語言很誇張,其實不然,我只是看了基礎的語法就開始上手了,邊看邊查而已。這並不是我的特殊能力,實際上大部分入職的新人都做到了這一點。
第一門的語言選擇重要,但也沒那麼關鍵,關鍵還是以後能不能找準方向。
成長路線
說到方向估計很多人一聽到就頭疼,尤其是學生黨,很多人可能完全不知道之後要做什麼,也不知道這些崗位有哪些能力要求。這其實也很正常,因為學校的教育少了工程師培養的部分。它只負責授課,並不負責工程師的培養,這是這個問題的核心原因。
那我們怎麼辦呢?
我想你們一定很想知道答案,但很遺憾的是,每個人的成長路線需要自己找,誰也不知道你究竟適合做什麼。不過話雖如此,但還是有一些比較萬金油的方法的。
如果你學了C/C++之後不知道學什麼,那就學Java就好了。學了Java之後用Java踏踏實實做兩個專案,提升一下專案能力。不管是什麼崗位,工程能力都是必須的。而且有了這兩個專案經驗之後,其實也算是一個保底,最起碼畢業了以後找個Java後端的工作基本沒問題了。並且這兩個專案做下來,你會對自己有一個比較清晰的認知,這樣寫程式碼、除錯程式尋找問題的工作究竟是不是你喜歡的。
而且關於做專案還有一個小技巧,我們做專案也不是盲目做,專案之間是有高低之分的,和公司實際業務越接近的專案面試的時候吸引力越大。比如你親自做過一個推薦系統、搜尋系統,即使做得很簡陋,只是勉強能用,這樣的專案在面試的時候一樣是非常非常具有價值的。要比做XX管理系統有含金量得多,而且這樣的系統也算是和演算法相關,既可以面演算法的崗位,也可以面工程的崗位,可以說是一舉兩得。
其實個人成長這件事和寫文章的邏輯是一樣的,首先要有一個主線,然後一個好的開頭。之後呢,需要結合主線適當地發散,該覆蓋的點都要覆蓋到。當然寫文章的時候,我們是在寫之前就有了主線,而成長的路途中可能一開始的時候一直是一個尋找主線的過程,尋找主線其實並沒有問題。對於學生來說,還年輕,擁有大把的青春,做一些工程專案進行適當性的試水完全沒有問題。即使以後選了演算法或者其他的方向,當初的付出和努力也一樣是有用的。
今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發)