你已經是個成熟的985大學了,請不要在大一教 C 語言!

2020-12-12 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫

昨天晚上回家後突然在朋友圈發了個問卷,看下國內大學第一門語言到底有多少是用的 C 語言。

結果也是很符合預期,使用 C 語言做第一門程式語言課的大學達到了 90% 以上。

之前在知乎看見一個問題,問為什麼還有985高校給大一上 C 語言課,如下:

不過這個提問方式未免有引戰嫌疑,所以被知乎管理員編輯為如下問題:

這樣顯然中立很多了,是在擺事實提問題。

接下來我們就聊聊 985 大學為什麼還是給大一上 C 語言課。

一、為什麼要學 C 語言?

首先,我們學的是 Computer Science,而不是 Programming Language,語言真的真的真的不是重點。

語言只是工具,工具沒有優劣,只有各自適用的場景不同。

所以,以下所有討論皆不涉及語言優劣,一切論述以怎樣才是有利於學好 Computer Science 為原則(求生欲滿滿

大學教育,尤其是 985、211 這種國內最頂尖的一批高校,應該注重通識教育而不是專項教育,在專業上更要注重基礎、底層、偏向原理。

只有掌握了最核心的東西,學起那些偏技能的東西才會很快很輕鬆。

我記得當時大二需要寫爬蟲,大概看了一天左右的 Python 教程,會基本的循環、判斷、控制流、一些 builtin 函數和類,然後學了下 requests 庫就直接開幹了。

其實像 JS、Python、Node、PHP 這些東西,科班學生幾乎都是自學,哪還用得上單獨開一門課呀。

自學是最基本的要求,需要用到的時候自己去看教程、文檔,直接就上手寫了。

所以這種語言完全沒必要開一學期的課來學,倒是非常適合放在計算機導論課程中,成為其中一個章節。

比如 Berkeley 開設的導論課 CS 61A 就是以 Python 作為練習語言,但是似乎國內很少有高校開這種導論課。

但是 C、C++ 這種語言,不學個一兩個月,連個像樣的程序都寫出來,這種才是適合開一門課。

先說一下學習 C 語言的目的,上面我說語言不是重點,這也包括 C 語言。

但是 C 語言特殊就特殊在它可能是唯一最適合用來學習一系列計算機基礎課的工具和媒介。

比如作業系統,實驗幾乎都是用的純 C 寫的 lab;

又比如彙編,學習的時候可以和 C 語言對應起來,了解if、for、while、數組訪問等對應彙編是怎麼樣的;

又比如學習計網,這裡面有很多的網絡協議,會有不同的 header 定義,這些 header 中很多都是按 bit 來劃分欄位的,用 C 語言的 union 和 struct 是最好操作這些欄位的,Java 和 Python 等語言雖然也能表示,但是可控性會差很多,以前嘗試過用 Python 去組裝 IP 包頭,非常的麻煩也不優雅。

並且 C 語言本身抽象層次非常低,語法也很簡單,沒什麼語法糖,很貼近作業系統。

而其它很多解釋型語言會存在虛擬機這一層,虛擬機對我們算是一個黑盒,不利於透過語言去理解計算機的一些行為。

所以我之前在《如何成為一個計算機知識體系完整的畢業生》中把 C 語言也列為計算機專業的基礎,而且是程式設計師必學的知識。

二、C 語言的優點

C 語言已經走過了四十多年的歷史,但是在今天,任然常年霸佔 TIOBE 程式語言排行榜前三,甚至榜首,這足以說明它是一門經久不衰的語言。

在日新月異的計算機行業,一個歷經四十多年任然流行的技術,才是需要我們去關注和學習的經典。

我在那篇文章中說 C 語言是最適合用來理解計算機系統底層機制的語言,那今天就詳細說說,這些底層機制都有哪些:

內存

一名合格的程式設計師必須了解內存,學習 C 語言是了解內存布局最直接、有效的途徑,大家可以看到之前講解指針那篇文章--深入理解內存和指針,全部都是從內存、內存布局出發進行講解。

堆棧

理解不同的內存分配和管理方式,一種編譯器自動管理,一種是手動管理。

函數調用棧、返回值

理解函數調用的本質,即跳轉指令,理解返回值是怎麼返回的。

系統調用

比如理解文件描述符,知道文件、socket 這些都被抽象成了fd。

指針

指針也是其它語言中引用的基礎,深入理解指針對於理解引用也有很大幫助。

就拿文件來說,在 C 語言 中經常會接觸到 read、write 系統函數,清楚操作的打開文件對應的是文件描述符。

而文件描述符是有限的,所以你知道用完 fd 後要及時關閉。

甚至用到 socket 網絡編程的時候會發現,socket 返回的也是 fd,居然網絡數據也能通過 read、write 去讀寫。

深刻的體會到 Unix 哲學:一切皆文件。

而在 Java、Python、PHP 這些語言中,打開一個文件只需要調用 File.open 或是 open,然後就可以拿到一個對象,然後對這個對象去調用讀寫方法進行操作。

但這時候文件對於我們更像是一個資源,全部的細節都被對象屏蔽了,而老師說資源是有限的,所以用完了要及時釋放。

而你也不知道如果不釋放這些資源會有什麼後果,只是聽老師說用完的資源及時釋放是個好習慣。

在這裡,作業系統的文件系統、進程等很多實現機制就被 JVM、Python 虛擬機所隱藏了。

而和作業系統等密切相關的底層機制也只有通過學習 C 語言才能透徹地理解它們。

這裡又有個矛盾,上面說的這些內容其實不單單是 C 語言課所教的,其中還包括《組成原理》、《彙編》、《作業系統》等。

所以就出現了很多同學說的,就算上了 C 語言課,上面這些很多原理也還是不知道呀。

當然,這些內容是需要在大二、大三上專業課逐漸補齊的,但是先學 C 語言給學習這些內容打下了一個基礎,大一把內存和指針理解透徹就好了,這就是前置條件。

而如果大一不上 C 語言,那麼後續需要用到 C 語言的時候,自學的難度會高於自學 Python、Java 等語言。

比如有些學校在作業系統課會引入一些國外的 Lab,諸如 MIT 6.828 xv6 那樣的 mini os,需要學生動手去完成一些內存管理、多線程實現、文件系統等作業系統核心模塊。

比如清華 OS 課程用的 ucore,哈工大 OS 課程用的 linux-0.11,這些都是純 C 寫的。

如果沒 C 的基礎,連實驗都沒法繼續,而這些實驗算是作業系統課程的精髓了。

所以這才是我認為大一先上 C 語言的核心原因:

一是語法簡單,更加貼近計算機本質的一些東西,學 C 也不是簡單的學語言本身,而是想透過 C 語言去理解一些如寄存器、內存、函數調用、跳轉等東西。

二是為大二、大三階段的專業課打下一個基礎,當然很多同學說我不學 C 一樣可以學作業系統、計網呀。

當然,這些和 C 沒必然關聯,只是很多實驗你確實不好繼續做,除非你只打算看看概念,背背什麼是進程、線程。

三、如何正確的打開 C 語言?

我認為 C 語言最為核心的有三塊:

指針內存系統編程

首先指針和內存是需要在學習 C 語言過程中就理解、搞定的,推薦兩本書:

《C程序設計語言》、《C和指針》

如果你覺得初學看書過於困難,那麼可以去中國大學 MOOC 上浙大翁凱老師的 C 語言課,可以直接去 B 站搜。

視頻結合書一起看,相信會理解得更加深刻。

然後,學習完了 C 語言基本語法後,你會發現似乎只能開發在黑窗口裡運行的程序,寫不出那些漂亮的 GUI。

確實,C 語言本來就不擅長做這些,C 語言擅長的是開發系統組件來支撐上層應用。

但是如果你迫切的想做出一些可視化、有趣的東西,那麼可以這樣做:

找一些 C 語言的圖形庫,比如 easyx,藉助這些圖形庫,你完全可以實現一些圖形界面的遊戲。繼續去學 Python、Java 這種語言,然後學習 Web 開發,寫寫網頁。

當然了,如果你對那些可視化的東西沒那麼大興趣,甚至還挺喜歡黑窗口的,那麼恭喜你,你有成為大佬的潛質。

當你熟悉完 C 語言基本的語法以後,建議去學習數據結構與算法,用 C 語言去實現鍊表、樹、二叉樹、堆、排序、搜索等等。

推薦看看《算法:C語言實現》這本書。

如果能通過 void 指針實現一些泛型數據結構就更棒了,比如標準庫裡的 qsort 就能支持任意可比較結構體排序。

然後,時間應該很快來到了大二、大三,這時候你應該學習系統編程,什麼是系統編程呢,其實就是 CSAPP 這本書上所講授的內容。

系統編程其實就是學習如何用 C 語言編寫出真正可用的軟體,比如像 http server、redis 這種,會涉及到:

如何在 Linux 環境下編程系統級接口(system-level interface)究竟是什麼Linux 內核和 C 標準庫提供了哪些能力Linux 的系統調用是怎樣實現的都有哪些系統調用,如何使用其它諸如mutex、signal、select、epoll、ipc、socket、thread、process(fork)等等

當然,還有一些同學會選擇繼續學習 Java 這種,比如 JVM、多線程、Java Web 等等,這也是沒問題的。

但是,相信我,就算你以後不會用到 C 去編程,利用大學大把的時間去深入學習一些底層的知識。

也是對深入學習 Java 有好處的,比如你學 Netty、 Java 的 NIO 最終都要回到 Linux 系統的 epoll、select 上。

系統編程推薦《深入理解計算機系統》、《Unix網絡編程》、《Unix高級環境編程》,Windows 下的我基本沒學過,所以就不推薦了。

虛擬機之下的世界

這就是 Java、Python 之下的世界,相信 Javaer 都學習過 JVM 的原理,了解過 GC、類加載機制、運行時數據區等知識。

但實際上,JVM 也只是介於作業系統之間的一個中間層。

很多時候 JVM、Python 解釋器等本身都是需要 Native 本地方法棧去和 OS 打交道的,去和系統調用接口交互。

所以 Linux 系統編程對於深入學習編程一定是繞不開(因為很多服務端程序都是運行在Linux上的,所以忽略了Win/Mac

而這是 C 語言的世界:

C

所以 C 的重要性不需要的多說了吧~

不少 Java、C#、PHP、Python 程式設計師工作幾年後會遇到瓶頸,有些會回來學習 C 語言,重拾底層概念,尋求新的突破。

這裡不是在否定其它非 C 程式設計師就沒技術,實際上我本身也不寫 C,我只是想表達如果你想學習底層機制、作業系統等,請學習 C 語言。

編程學到一定的時候,你就需要了解底層系統的機制,否則,知其然不知所以然。

真正的高手往往都是有很強的系統性基礎知識的,表面的東西永遠是膚淺的。

所以利用大學的時間恰恰是打好這些基礎的關鍵時間,等到工作了,大家都是更傾向於學習快速上手業務的技能。

所以,在大學裡先學什麼語言不重要,你可以先學 Python、Java,但是無論如何,如果你想學好 Computer Science,C 語言一定繞不開。

也許以後實際工作中你完全沒有機會去寫 C,但是這並沒關係,打好了基礎,學其它也會學得很快、很透徹。

對於計算機專業的同學,還是建議學好 C 語言,與其它課程相結合,多懂一點程序背後的實現原理。

最後上兩張圖,什麼叫真正的技術啊(戰術後仰

還教微服務,這種不是玩概念麼?

不去公司上手真正的微服務項目,在學校、培訓班搭微服務?

這種東西學習下概念和思想就好了,這些東西根本就是應用層的東西,學習起來根本不費勁的好吧。

我敢保證,沒有一個 985 會教微服務這種東西,分布式理論倒是可能會單獨開一門課。

不過我相信上面圖片裡的這個分布式一定不會教CAP、Raft、Paxos 這些東西,大概率是用 Springboot + Dubbo + Zookeeper 在幾臺機器搭建一個服務。。。

而這是科班的學習路線,先不說這些課程有多少是學過就忘了的,但至少你需要用到的時候知道去哪撿起來,怎麼撿。

不過講道理兩張圖片,殊途同歸,最後都是碼農,只不過大概率決定了你在哪裡敲代碼。

總結一下,BB 了這麼多,就想表達一個意思,C 語言很重要,如果你正在大學學 C,一定要掌握好,不要懷疑學 C 有沒有用。

我是小北,咱們周末見~

相關焦點

  • 用C語言編寫屬於自己的程式語言,大一學完C語言即可做!
    首先,明確一點,咱這個項目只是做一個簡單的腳本語言而不是編譯型語言!!!其次,本文不需要太多專業知識,所以不慌。最後,本文只是簡單實現腳本語言,雖然不牛X......實驗環境 : linux2.知識點 : 大一所學 C語言 知識二 要做功能:1.實現語法分析列印 hello-world
  • 這些985院校沒有A+學科!985院校的哪些專業在C+之下?
    今天幫幫給大家盤點7所沒有A+學科的985高校和32所c+及以下學科的985院校!   什麼是學科評估?   學科評估(China Discipline Ranking,CDR)是指一級學科整體水平評估。
  • 985、211大學,請家長不要盲目報考!高薪名企說:我這樣招聘……
    最近得到很多家長反饋說,孩子的高中班主任跟他們說,只有985,211大學畢業將來才能找到好工作,讓孩子十分沮喪特別消極!因為自己孩子的成績也就是一本線附近!這裡我想告訴各位家長!大家對此不必過分憂慮!985,211畢業並不一定是好就業的保障,普通大學畢業也能找到好工作!
  • 大二學姐:大學「最值得」參加的3個社團,大一新生不要錯過
    比如動漫社都是一些喜歡二次元的學生的集結地,文學社是喜歡用文字表達情感的學生交流的地方,但是如果沒有這些愛好,單純的想要鍛鍊自己,可以看看大二學姐推薦的幾個社團,參加進去學生鍛鍊的機會多,大一新生最好不要錯過。
  • C語言?c+?到底先學哪個才能更好的理解編程,這些你造嗎
    最近大一新生們剛剛結束第一個學期的學習,接踵而來的問題也越來越多,不同的學校有不同的學習節奏,但是基本上都是從C語言或者c++開始學起。現在越來越多的人對於「學習C語言還有必要嗎?」這件事比較糾結。
  • 大一新生如何適應大學生活?學姐教你五招,招招有效,不得不服
    大學生活是美好而難忘的,大學有四年的時間,如果問一個大學生,大學四年哪一年過得最慢,他可能會告訴你是大一,尤其是大一剛入學那會。因為大一是一個磨合期,面對陌生的環境跟同學,大一新生需要時間來適應。對於慢熱的學生來說,最難的就是適應了,所以這段時間註定會過得很慢。
  • 多所英國大學大一考試只分Pass和Fail!
    圖片來源英國衛生部 今日衛生部部長Matt Hancock表示,英格蘭地區已經成功召集了75萬NHS志願者。 特別針對大一本科生出臺考核方式。
  • 從東北末位985大學到C9名校的保研歷程!
    大一初來大學,一切都是新奇,學生會,社團,以及相信高中老師所言(大學不掛科就行),導致大一一年的成績很差,均分只有84左右,排名也只有20%出頭,更糟糕的事情是大一的學分佔據了保研的學分的近乎一半。所以有保研意願的孩子還是好好學習,多刷競賽最好(向去南大學碩的某RR學姐學習)。
  • 近兩年「分數偏低」的5個985大學!難題:選中國農大,還是中南大學?
    西北農林科技大學平均錄取在580分之間,很多人這樣的分數只能上個一般的211大學。 中國農業大學也在600分左右,河南的還高點是644分。而中南大學在寧夏提前批投檔線僅480分。
  • 大一和大四的區別,這五張圖說得清清楚楚,網友:簡直不要太真實
    有人說,大學是「鍛造廠」,進入校園的新生們可以在這裡重塑人格。也有人說,大學是「大染缸」,懷揣夢想的你會在這裡走失方向。那麼,四年之後,大四的你會和大一有多少區別?下面五張圖讓不少在校生看到了曾經的自己,短短五句話說得清清楚楚。網友:簡直不要太真實。
  • C語言怎麼樣?今天聊聊C語言的發展史!
    1966年,馬丁·理察德在劍橋大學,以CPL程式語言為基礎,發明了BCPL程式語言。 2.2B語言之父 此版本還看到了C語言的開始,該語言用於編寫一些命令。 此處的代碼僅是某些命令,某些庫函數和C編譯器的原始碼。c /中的文件來自 last1120c.tar.gz 磁帶,並構成了第二版Unix的有效C編譯器。
  • 男孩子上大學,學什麼專業比較好,985學長告訴你
    進入大學最重要的就是選擇專業,也要為以後的就業考慮一下,男孩子進入大學有很多專業可以選擇,學什麼專業比較好,985學長告訴你。當然要選擇自己喜歡的專業,現在很多人在選擇專業的時候,首先看看那個專業,賺錢,那個專業因為就業好,導致大學裡很多人學習熱情不高,大學裡的學習氛圍有所下降,上大學的人只需要辦畢業證,找對象,拓展人脈,我不承認那個,大學是追求真理的地方,不應該受到名利的影響,同樣是大學生的未來不是金錢而是夢想。
  • 令人眼花繚亂的大學社團中,這4個社團很不錯,大一新生可考慮
    導語:大學裡,含金量很高的4個社團,大一新生不可錯過 大學開學已經有一段日子了,大一新生正在適應大學生活過程中。大學生活跟高中生活是不同的。大學沒有那麼多的課程,課餘時間很多,大學生課餘時間做的最多的事情就是參加社團活動。大學社團種類繁多,令人眼花繚亂。
  • C語言編程核心要點
    我教過6個人編程,教過HTML,教過JAVA,也教過C++。最近,我在教我小孩編程,他只有十歲,很多人建議我選擇Python,但我最終選擇了C,因為C簡單且強大,現在看來,好像是個不錯的選擇。類型C是強類型語言,有short、long、int、char、float、double等build-in數據類型,類型是貫穿c語言整個課程的核心概念。
  • 大一須知:建議新生要學會的四個「拒絕」,不要覺得不好意思!
    截至目前為止,相信已經有很多的大學已經開學了,新生們也已經踏入了期待已久的大學校園。雖然新生們已經開始了夢寐以求的大學生活,但是在開學期間還是要建議新生學會這四個「拒絕」,不要覺得不好意思。1.沒意義的社團每年大一入學以後,學校的很多社團都會展開轟轟烈烈的掃樓行動,這掃樓當然不是搞衛生,而是指到大一新生宿舍去宣傳社團,拉新生進社團。對於這些社團招新掃樓,有一些社團其實是沒什麼意義的,整個社團也許根本就沒幾個人。所以,對於這些沒意義的社團,新生一定要學會拒絕。2.
  • 大一新生最容易掛科的兩門課程,學長教你順利通過!
    大一的學弟學妹們,見字如面。大一這一整個學年,充滿了驚險與挑戰,根據學長實際調查,發現大一是最容易掛科並且掛科最多的階段。因為同學們剛剛脫離高中生活,以為大學的學業可以放鬆一下,其實就在我們不重視的時候,掛科悄然而至。那麼大學裡,哪科掛科率最高呢?我們又該如何避免呢?
  • 「雙一流」卻不是985的3所大學!你絕對猜不到?
    茫茫人海,相識是一種緣分,請你隨手點擊一下右上角的關注,中學教師將隨時更新精彩教育類文章,讓我們一起來探討教育、暢聊教育吧!為了方便同學和家長填報志願,中學教師給大家介紹了22所很有特殊的985重點大學,歡迎朋友們去空間關注瀏覽。
  • 大學校園裡,「最值得」加入的3個社團,大一新生不要錯過
    具體而言,大學的社團可以說是相當正規,且具有規模,對於大一新生們來說,這是一個小團體,可以讓自己學到很多的東西。加入社團會不定期舉行各種比賽活動,大多數同學都可以參與進來。今天小編就給大家講一下,大學校園裡邊你最值得加入的3個社團,對於剛進入大學的你一定有用,大一新生不要錯過。
  • 985高校留學生保研省第一的山東大學日語專業
    今天給大家分享一篇山東大學的保研經驗貼,該同學最初報考的是山東大學日語語言文學專業,最後被日語筆譯專業錄取,恭喜這位同學成為山東大學的研究生,也十分感謝這位同學的慷慨分享~個人簡介:本人是某985院校日語專業的學生,有日本留學經歷,英語四六級飄過,沒有獲獎經歷,也沒有參加各種大賽的經歷
  • 西北工業大學地理位置不佔優,但學理工科,還是裨益良多
    西北工業大學簡稱「西工大」,位於陝西省會西安,是中國唯一一所以同時發展航空、航天、航海(三航)工程教育和科學研究為特色的全國重點大學,是國家985工程、211工程建設高校。剛來時,導員煞有介事地警告我們不要往秦嶺深處爬,以前出現過迷路報警的案例。大一剛來,學院導員要求早上籤到。那時早起挺苦的。早上有課還好,籤完到就去上課。上午沒課的,籤完到還得回去補了覺,有時還以為剛才的籤到不過夢一場,睡得有滋有味。我雖然成績很一般。