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

2020-12-06 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,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 有沒有用。

我是小北,咱們周末見~

相關焦點

  • 這些985院校沒有A+學科!985院校的哪些專業在C+之下?
    今天幫幫給大家盤點7所沒有A+學科的985高校和32所c+及以下學科的985院校!   什麼是學科評估?   學科評估(China Discipline Ranking,CDR)是指一級學科整體水平評估。
  • 從東北末位985大學到C9名校的保研歷程!
    大一初來大學,一切都是新奇,學生會,社團,以及相信高中老師所言(大學不掛科就行),導致大一一年的成績很差,均分只有84左右,排名也只有20%出頭,更糟糕的事情是大一的學分佔據了保研的學分的近乎一半。所以有保研意願的孩子還是好好學習,多刷競賽最好(向去南大學碩的某RR學姐學習)。
  • 大一新生最容易掛科的兩門課程,學長教你順利通過!
    大一的學弟學妹們,見字如面。大一這一整個學年,充滿了驚險與挑戰,根據學長實際調查,發現大一是最容易掛科並且掛科最多的階段。因為同學們剛剛脫離高中生活,以為大學的學業可以放鬆一下,其實就在我們不重視的時候,掛科悄然而至。那麼大學裡,哪科掛科率最高呢?我們又該如何避免呢?
  • C語言怎麼樣?今天聊聊C語言的發展史!
    1966年,馬丁·理察德在劍橋大學,以CPL程式語言為基礎,發明了BCPL程式語言。 二、BCPL、B、C語言 如果想要找到一種好的方式,來進行程式語言之間的比較的話,那麼非代碼莫屬。 1. 3種語言代碼示例 下面分別使用BCPL、B、C三種語言實現一個簡單的程序:程序將三個數字a、b、c相加,並將結果賦值給sum,最後列印總和。
  • 大學生因身體不適,放棄985轉普通本科,被吐槽:填志願時想啥了
    填報志願的時候,主要考慮這三點因素,首先是城市,經濟越發達越吸引人,因為就業機會多,發展空間大,然後是大學層次,名校有豐富的教育資源,找工作佔有一定的優勢,最後還要考慮專業的熱度,寒窗苦讀十多年,讀了一個不好就業的冷門專業,可就虧大了。最近一位大一新生的退學,引發熱議,甚至遭到網友吐槽,覺得這個原因太矯情,現在的孩子真是被慣壞了,到底是怎麼一回事呢?我們一起來看看。
  • 你已經是個成熟的GPA了,該學會自己達到4.0了!
    留學生的統一認知——在海外求學的過程從來都是苦逼而艱辛的:全英文的課程和教科書永遠是通往Happy University的攔路虎,克服語言差異實屬不易;更別提如今網課當道,在家學習的效率慘不忍睹,摸會兒手機再倒個水,一頓操作後發現PPT已經完全看不懂了;至於考試?
  • 為什麼一定要考985/211?殘酷的真相讓你明白高考的意義……
    圖書館要是錢不到位,你查資料基本就只能翻一堆上世紀80、90年代的「經典」了,想看新數據和資料?只能靠自己的百度搜索能力補充了... 而最能開拓文科生眼界的,還有前沿學術講座。講座能請到什麼樣的人來,可不是砸錢就能搞定,還要看學校老師的人脈!比如哈佛博士畢業的教授請個老同學來學校走一圈,學生們就可以輕鬆get到世界級最新的科研成果。
  • 985大學有幾所 985學校名單一覽表 985大學什麼意思
    一、985大學是什麼意思無論是考生、還是家長,在填報志願或者在生活中經常會聽到985大學、211大學等高校代名詞,但不少人比較疑惑的是這到底是是什麼意思呢,下面我們就來看一下985大學是什麼意思?中華人民共和國教育部表示「985工程」和「211工程」的規模已經穩定,將不會再新增高校,而是引入動態競爭機制,遴選已經是「211工程」建設且是中央部屬的頂尖行業特色型大學實施「985工程優勢學科創新平臺」項目。
  • 西北民族大學是幾本?211還是985?2019甘肅「雙一流」大學盤點!
    那麼,西北民族大學是幾本?211還是985?下面我們就一起來看一下吧!西北民族大學是幾本?根據西北民族大學招生辦最新公布的信息可知:西北民族大學在甘肅是第二批次招生,所以我們通常說西北民族大學是二本大學。
  • 普通大學和「985」「211」到底有多大的差距?
    普通大學跟」985「 」211「大學的區別:1.教育資源不同教育資源主要是教師、圖書資料、國際交流機會等,985高校的教師不乏有中科院院士、長江學者、國際知名教授等,而普通的大學的老師可能就沒有那麼好的學歷背景了,也不是說這些老師就一定比高學歷、背景好的老師優秀,但是整體上的差距還是有的
  • 深入理解C語言
    導讀:Dennis Ritchie過世了,他發明了C語言,一個影響深遠並徹底改變世界的計算機語言。一門經歷40多年的到今天還長盛不訓的語言,今天很多語言都受到C的影響,C++,Java,C#,Perl,PHP,Javascript等等。但是,你對C了解嗎?相信你看過本站的《C語言的謎題》還有《誰說C語言很簡單?》。
  • 什麼樣的孩子可以考上「985」大學?一般有五個特點!
    為什麼,同樣是一天坐在教室裡學習,同樣的老師在上課,就是有人能考上「985」大學,有人卻只能上個大專。那麼,這些考上「985」大學的孩子,又都有哪些特質呢?在回答這個問題之前,首先,我們一起看看考上「985」大學到底有多難?高考,考上「985」大學有多難?
  • 985大學提前保送的小秘密!985大學分檔排名
    這對於很多考生來說,是多麼的滋潤,當別人還在為了夢想大學努力時,你已經拿到了大學錄取通知書了,現在你想一想,都感覺到開心。那這種提前保送的通知書,怎樣才能拿到呢? 據說當年撒貝寧沒有參加高考,直接保送了北京大學。還有就是歌手李健,也沒有參加高考,直接保送了清華大學。
  • 從某985大學到Stanford University,我的2018申請之路!
    本科:某985大學,新聞學專業2014級GPA:91.19/100TOEFL:114 (speaking 26)GRE:162+166+4.0獎學金:三次專業二等獎學金科研:一次GCCX(新媒體環境下羌繡的傳承與發展研究)實習:外語教學與出版研究社詞典語料校對——3個月;中央人民廣播電臺——2個月;人民日報新媒體中心
  • 全國39所985大學排名及分布,看看哪三個省份985高校最多
    985是名校和重點大學的標籤,我國有3000多所高校,但是國家重點建設的985工程高校卻只有39所,都可謂是百裡挑一的學校,是中國一流大學的代表。國家開展985工程建設已有20餘年,這39所高校在國家扶持下,都取得了巨大發展,實力與名氣都與其它高校拉開了巨大的差距,其它非985高校想追上它們,短時期內非常難,幾乎不可能。
  • 985院校學生和二流大學學生的區別有哪些?
    他們一部分人熱衷於「鍛鍊自己」(家庭困難的是可以理解的,但是哪怕不缺錢,也有人想「鍛鍊自己」幹一些沒技術含量的活),卻不明白大學最主要的任務是什麼。他們很大一部分特別容易受到同學的觀點影響,沒有很高的批判性思維和獨立思考能力。他們很多沿襲高中的學習方法,成績不好只會更「努力」,不知反思總結或者學習更高效的學習方法。
  • 浙江這所非著名大學如何與985名校抗衡? ACM逆襲!
    當時只要高考正常發揮,憑藉自主招生上985名校十拿九穩。但是高考發揮失常的小崔,沒有圓成名校夢。  天性樂觀的崔倍寧,很快調整心態,決定選擇一所「打ACM氛圍好」的大學。眾所周知,信奧(OI)是中國 計算機協會主辦的,主要考的是編程、算法,在高中階段叫信奧,採取的是「一個人5個小時做3道難題」的考法。
  • 大學中這3個專業,只看學歷不看能力,學校不好千萬不要學
    其實,想要切實的了解一個專業怎麼樣,未來前景好不好,你只需要去看一下這個專業學生的起薪如何,校招難度如何。基本上就會有個比較全面的了解。下面我們就來告訴你,哪些專業,如果你的大學不是排名很靠前的話,千萬不要去學。
  • 中南大學是985高校,但你知道中北大學嗎?校園裡面跑火車!
    湖南省的中南大學是985高校,211高校,世界一流大學建設高校A類,在全國名氣很大。但其實在我國還有一首中北大學,在全國名氣可能不是很大,畢竟不是985高校,甚至也不是211高校。這所大學位於山西省太原市,是一所雙非院校,但歷史上名氣很大,被稱為兵工第一校,由我國的10大元帥彭德懷元帥建立。中北大學是國家二級保密單位,曾是國防八校之一,可能是由於保密的原因,所以知名度不夠高,不過現在的中北大學在山西省內也是排名三四位,更值得稱道的是校園裡面居然有火車站,當然公交車也有。
  • 這所211大學「太牛掰」,錄取分數超過多所985高校,實力不容小視
    比如:蘇州大學,北京郵電大學,西安電子科技大學等等,尤其是西安電子科技大學在今年的高考錄取分數線中,已經超過一小部分的985 高校。l 該學校的佔地面積為270萬公頃,學校的寬敞度不屬於985高校的校園面積,學校設有18個院系,9個博士學位授權一級學科,14個博士學位授權一級學科,有52個本科專業。可見學校的專業強度和學校的教學綜合實力,都不次於985高校,甚至有的特色專業比985高校的專業還要受歡迎。