<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你已經(jīng)是個(gè)成熟的985大學(xué)了,請(qǐng)不要在大一教 C 語(yǔ)言!

          共 5315字,需瀏覽 11分鐘

           ·

          2020-11-13 16:31

          昨天晚上回家后突然在朋友圈發(fā)了個(gè)問卷,看下國(guó)內(nèi)大學(xué)第一門語(yǔ)言到底有多少是用的 C 語(yǔ)言。

          結(jié)果也是很符合預(yù)期,使用 C 語(yǔ)言做第一門編程語(yǔ)言課的大學(xué)達(dá)到了 90% 以上。

          之前在知乎看見一個(gè)問題,問為什么還有985高校給大一上 C 語(yǔ)言課,如下:

          原問題

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

          現(xiàn)問題

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

          接下來我們就聊聊 985 大學(xué)為什么還是給大一上 C 語(yǔ)言課。

          一、為什么要學(xué) C 語(yǔ)言?

          首先,我們學(xué)的是 Computer Science,而不是 Programming Language,語(yǔ)言真的真的真的不是重點(diǎn)。

          語(yǔ)言只是工具,工具沒有優(yōu)劣,只有各自適用的場(chǎng)景不同。

          所以,以下所有討論皆不涉及語(yǔ)言優(yōu)劣,一切論述以怎樣才是有利于學(xué)好 ?Computer Science 為原則(求生欲滿滿

          大學(xué)教育,尤其是 985、211 這種國(guó)內(nèi)最頂尖的一批高校,應(yīng)該注重通識(shí)教育而不是專項(xiàng)教育,在專業(yè)上更要注重基礎(chǔ)、底層、偏向原理。

          只有掌握了最核心的東西,學(xué)起那些偏技能的東西才會(huì)很快很輕松。

          我記得當(dāng)時(shí)大二需要寫爬蟲,大概看了一天左右的 Python 教程,會(huì)基本的循環(huán)、判斷、控制流、一些 builtin 函數(shù)和類,然后學(xué)了下 requests 庫(kù)就直接開干了。

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

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

          所以這種語(yǔ)言完全沒必要開一學(xué)期的課來學(xué),倒是非常適合放在計(jì)算機(jī)導(dǎo)論課程中,成為其中一個(gè)章節(jié)。

          比如 Berkeley 開設(shè)的導(dǎo)論課 CS 61A 就是以 Python 作為練習(xí)語(yǔ)言,但是似乎國(guó)內(nèi)很少有高校開這種導(dǎo)論課。

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

          先說一下學(xué)習(xí) C 語(yǔ)言的目的,上面我說語(yǔ)言不是重點(diǎn),這也包括 C 語(yǔ)言。

          但是 C 語(yǔ)言特殊就特殊在它可能是唯一最適合用來學(xué)習(xí)一系列計(jì)算機(jī)基礎(chǔ)課的工具和媒介。

          比如操作系統(tǒng),實(shí)驗(yàn)幾乎都是用的純 C 寫的 lab;

          又比如匯編,學(xué)習(xí)的時(shí)候可以和 C 語(yǔ)言對(duì)應(yīng)起來,了解if、for、while、數(shù)組訪問等對(duì)應(yīng)匯編是怎么樣的;

          又比如學(xué)習(xí)計(jì)網(wǎng),這里面有很多的網(wǎng)絡(luò)協(xié)議,會(huì)有不同的 header 定義,這些 header 中很多都是按 bit 來劃分字段的,用 C 語(yǔ)言的 union 和 struct 是最好操作這些字段的,Java 和 Python 等語(yǔ)言雖然也能表示,但是可控性會(huì)差很多,以前嘗試過用 Python 去組裝 IP 包頭,非常的麻煩也不優(yōu)雅。

          并且 C 語(yǔ)言本身抽象層次非常低,語(yǔ)法也很簡(jiǎn)單,沒什么語(yǔ)法糖,很貼近操作系統(tǒng)。

          而其它很多解釋型語(yǔ)言會(huì)存在虛擬機(jī)這一層,虛擬機(jī)對(duì)我們算是一個(gè)黑盒,不利于透過語(yǔ)言去理解計(jì)算機(jī)的一些行為。

          所以我之前在《如何成為一個(gè)計(jì)算機(jī)知識(shí)體系完整的畢業(yè)生》中把 C 語(yǔ)言也列為計(jì)算機(jī)專業(yè)的基礎(chǔ),而且是程序員必學(xué)的知識(shí)。

          二、C 語(yǔ)言的優(yōu)點(diǎn)

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

          在日新月異的計(jì)算機(jī)行業(yè),一個(gè)歷經(jīng)四十多年任然流行的技術(shù),才是需要我們?nèi)リP(guān)注和學(xué)習(xí)的經(jīng)典。

          我在那篇文章中說 C 語(yǔ)言是最適合用來理解計(jì)算機(jī)系統(tǒng)底層機(jī)制的語(yǔ)言,那今天就詳細(xì)說說,這些底層機(jī)制都有哪些:

          • 內(nèi)存

          一名合格的程序員必須了解內(nèi)存,學(xué)習(xí) C 語(yǔ)言是了解內(nèi)存布局最直接、有效的途徑,大家可以看到之前講解指針那篇文章--深入理解內(nèi)存和指針,全部都是從內(nèi)存、內(nèi)存布局出發(fā)進(jìn)行講解。

          • 堆棧

          理解不同的內(nèi)存分配和管理方式,一種編譯器自動(dòng)管理,一種是手動(dòng)管理。

          • 函數(shù)調(diào)用棧、返回值

          理解函數(shù)調(diào)用的本質(zhì),即跳轉(zhuǎn)指令,理解返回值是怎么返回的。

          • 系統(tǒng)調(diào)用

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

          • 指針

          指針也是其它語(yǔ)言中引用的基礎(chǔ),深入理解指針對(duì)于理解引用也有很大幫助。

          就拿文件來說,在 C 語(yǔ)言 中經(jīng)常會(huì)接觸到 read、write 系統(tǒng)函數(shù),清楚操作的打開文件對(duì)應(yīng)的是文件描述符。

          而文件描述符是有限的,所以你知道用完 fd 后要及時(shí)關(guān)閉。

          甚至用到 socket 網(wǎng)絡(luò)編程的時(shí)候會(huì)發(fā)現(xiàn),socket 返回的也是 fd,居然網(wǎng)絡(luò)數(shù)據(jù)也能通過 read、write 去讀寫。

          深刻的體會(huì)到 Unix 哲學(xué):一切皆文件。

          而在 Java、Python、PHP 這些語(yǔ)言中,打開一個(gè)文件只需要調(diào)用 File.open 或是 open,然后就可以拿到一個(gè)對(duì)象,然后對(duì)這個(gè)對(duì)象去調(diào)用讀寫方法進(jìn)行操作。

          但這時(shí)候文件對(duì)于我們更像是一個(gè)資源,全部的細(xì)節(jié)都被對(duì)象屏蔽了,而老師說資源是有限的,所以用完了要及時(shí)釋放。

          而你也不知道如果不釋放這些資源會(huì)有什么后果,只是聽老師說用完的資源及時(shí)釋放是個(gè)好習(xí)慣。

          在這里,操作系統(tǒng)的文件系統(tǒng)、進(jìn)程等很多實(shí)現(xiàn)機(jī)制就被 JVM、Python 虛擬機(jī)所隱藏了。

          而和操作系統(tǒng)等密切相關(guān)的底層機(jī)制也只有通過學(xué)習(xí) C 語(yǔ)言才能透徹地理解它們。

          這里又有個(gè)矛盾,上面說的這些內(nèi)容其實(shí)不單單是 C 語(yǔ)言課所教的,其中還包括《組成原理》、《匯編》、《操作系統(tǒng)》等。

          所以就出現(xiàn)了很多同學(xué)說的,就算上了 C ?語(yǔ)言課,上面這些很多原理也還是不知道呀。

          當(dāng)然,這些內(nèi)容是需要在大二、大三上專業(yè)課逐漸補(bǔ)齊的,但是先學(xué) C 語(yǔ)言給學(xué)習(xí)這些內(nèi)容打下了一個(gè)基礎(chǔ),大一把內(nèi)存和指針理解透徹就好了,這就是前置條件。

          而如果大一不上 C 語(yǔ)言,那么后續(xù)需要用到 C 語(yǔ)言的時(shí)候,自學(xué)的難度會(huì)高于自學(xué) Python、Java 等語(yǔ)言。

          比如有些學(xué)校在操作系統(tǒng)課會(huì)引入一些國(guó)外的 Lab,諸如 MIT 6.828 xv6 那樣的 mini os,需要學(xué)生動(dòng)手去完成一些內(nèi)存管理、多線程實(shí)現(xiàn)、文件系統(tǒng)等操作系統(tǒng)核心模塊。

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

          如果沒 C 的基礎(chǔ),連實(shí)驗(yàn)都沒法繼續(xù),而這些實(shí)驗(yàn)算是操作系統(tǒng)課程的精髓了。

          所以這才是我認(rèn)為大一先上 C 語(yǔ)言的核心原因:

          一是語(yǔ)法簡(jiǎn)單,更加貼近計(jì)算機(jī)本質(zhì)的一些東西,學(xué) C 也不是簡(jiǎn)單的學(xué)語(yǔ)言本身,而是想透過 C 語(yǔ)言去理解一些如寄存器、內(nèi)存、函數(shù)調(diào)用、跳轉(zhuǎn)等東西。

          二是為大二、大三階段的專業(yè)課打下一個(gè)基礎(chǔ),當(dāng)然很多同學(xué)說我不學(xué) C 一樣可以學(xué)操作系統(tǒng)、計(jì)網(wǎng)呀。

          當(dāng)然,這些和 C 沒必然關(guān)聯(lián),只是很多實(shí)驗(yàn)?zāi)愦_實(shí)不好繼續(xù)做,除非你只打算看看概念,背背什么是進(jìn)程、線程。

          三、如何正確的打開 C 語(yǔ)言?

          我認(rèn)為 C 語(yǔ)言最為核心的有三塊:

          • 指針
          • 內(nèi)存
          • 系統(tǒng)編程

          首先指針和內(nèi)存是需要在學(xué)習(xí) C 語(yǔ)言過程中就理解、搞定的,推薦兩本書:

          《C程序設(shè)計(jì)語(yǔ)言》、《C和指針》

          如果你覺得初學(xué)看書過于困難,那么可以去中國(guó)大學(xué) MOOC 上浙大翁凱老師的 C 語(yǔ)言課,可以直接去 B 站搜。

          視頻結(jié)合書一起看,相信會(huì)理解得更加深刻。

          然后,學(xué)習(xí)完了 C 語(yǔ)言基本語(yǔ)法后,你會(huì)發(fā)現(xiàn)似乎只能開發(fā)在黑窗口里運(yùn)行的程序,寫不出那些漂亮的 GUI。

          確實(shí),C 語(yǔ)言本來就不擅長(zhǎng)做這些,C 語(yǔ)言擅長(zhǎng)的是開發(fā)系統(tǒng)組件來支撐上層應(yīng)用。

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

          1. 找一些 C 語(yǔ)言的圖形庫(kù),比如 easyx,借助這些圖形庫(kù),你完全可以實(shí)現(xiàn)一些圖形界面的游戲。
          2. 繼續(xù)去學(xué) Python、Java 這種語(yǔ)言,然后學(xué)習(xí) Web 開發(fā),寫寫網(wǎng)頁(yè)。

          當(dāng)然了,如果你對(duì)那些可視化的東西沒那么大興趣,甚至還挺喜歡黑窗口的,那么恭喜你,你有成為大佬的潛質(zhì)。

          當(dāng)你熟悉完 C 語(yǔ)言基本的語(yǔ)法以后,建議去學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,用 C 語(yǔ)言去實(shí)現(xiàn)鏈表、樹、二叉樹、堆、排序、搜索等等。

          推薦看看《算法:C語(yǔ)言實(shí)現(xiàn)》這本書。

          如果能通過 void 指針實(shí)現(xiàn)一些泛型數(shù)據(jù)結(jié)構(gòu)就更棒了,比如標(biāo)準(zhǔn)庫(kù)里的 qsort 就能支持任意可比較結(jié)構(gòu)體排序。

          然后,時(shí)間應(yīng)該很快來到了大二、大三,這時(shí)候你應(yīng)該學(xué)習(xí)系統(tǒng)編程,什么是系統(tǒng)編程呢,其實(shí)就是 CSAPP 這本書上所講授的內(nèi)容。

          系統(tǒng)編程其實(shí)就是學(xué)習(xí)如何用 C 語(yǔ)言編寫出真正可用的軟件,比如像 http server、redis 這種,會(huì)涉及到:

          • 如何在 Linux 環(huán)境下編程
          • 系統(tǒng)級(jí)接口(system-level interface)究竟是什么
          • Linux 內(nèi)核和 C 標(biāo)準(zhǔn)庫(kù)提供了哪些能力
          • Linux 的系統(tǒng)調(diào)用是怎樣實(shí)現(xiàn)的
          • 都有哪些系統(tǒng)調(diào)用,如何使用
          • 其它諸如mutex、signal、select、epoll、ipc、socket、thread、process(fork)等等

          當(dāng)然,還有一些同學(xué)會(huì)選擇繼續(xù)學(xué)習(xí) Java 這種,比如 JVM、多線程、Java Web 等等,這也是沒問題的。

          但是,相信我,就算你以后不會(huì)用到 C 去編程,利用大學(xué)大把的時(shí)間去深入學(xué)習(xí)一些底層的知識(shí)。

          也是對(duì)深入學(xué)習(xí) Java 有好處的,比如你學(xué) Netty、 Java 的 NIO 最終都要回到 Linux 系統(tǒng)的 epoll、select 上。

          系統(tǒng)編程推薦《深入理解計(jì)算機(jī)系統(tǒng)》、《Unix網(wǎng)絡(luò)編程》、《Unix高級(jí)環(huán)境編程》,Windows 下的我基本沒學(xué)過,所以就不推薦了。

          虛擬機(jī)之下的世界

          這就是 Java、Python 之下的世界,相信 Javaer 都學(xué)習(xí)過 JVM 的原理,了解過 GC、類加載機(jī)制、運(yùn)行時(shí)數(shù)據(jù)區(qū)等知識(shí)。

          但實(shí)際上,JVM 也只是介于操作系統(tǒng)之間的一個(gè)中間層。

          很多時(shí)候 JVM、Python 解釋器等本身都是需要 Native 本地方法棧去和 OS 打交道的,去和系統(tǒng)調(diào)用接口交互。

          所以 Linux 系統(tǒng)編程對(duì)于深入學(xué)習(xí)編程一定是繞不開(因?yàn)楹芏喾?wù)端程序都是運(yùn)行在Linux上的,所以忽略了Win/Mac

          而這是 C 語(yǔ)言的世界:

          C

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

          不少 Java、C#、PHP、Python 程序員工作幾年后會(huì)遇到瓶頸,有些會(huì)回來學(xué)習(xí) C 語(yǔ)言,重拾底層概念,尋求新的突破。

          這里不是在否定其它非 C 程序員就沒技術(shù),實(shí)際上我本身也不寫 C,我只是想表達(dá)如果你想學(xué)習(xí)底層機(jī)制、操作系統(tǒng)等,請(qǐng)學(xué)習(xí) C 語(yǔ)言。

          編程學(xué)到一定的時(shí)候,你就需要了解底層系統(tǒng)的機(jī)制,否則,知其然不知所以然。

          真正的高手往往都是有很強(qiáng)的系統(tǒng)性基礎(chǔ)知識(shí)的,表面的東西永遠(yuǎn)是膚淺的。

          所以利用大學(xué)的時(shí)間恰恰是打好這些基礎(chǔ)的關(guān)鍵時(shí)間,等到工作了,大家都是更傾向于學(xué)習(xí)快速上手業(yè)務(wù)的技能。

          所以,在大學(xué)里先學(xué)什么語(yǔ)言不重要,你可以先學(xué) Python、Java,但是無論如何,如果你想學(xué)好 Computer Science,C 語(yǔ)言一定繞不開。

          也許以后實(shí)際工作中你完全沒有機(jī)會(huì)去寫 C,但是這并沒關(guān)系,打好了基礎(chǔ),學(xué)其它也會(huì)學(xué)得很快、很透徹。

          對(duì)于計(jì)算機(jī)專業(yè)的同學(xué),還是建議學(xué)好 C 語(yǔ)言,與其它課程相結(jié)合,多懂一點(diǎn)程序背后的實(shí)現(xiàn)原理。

          最后上兩張圖,什么叫真正的技術(shù)?。☉?zhàn)術(shù)后仰

          培訓(xùn)班

          還教微服務(wù),這種不是玩概念么?

          不去公司上手真正的微服務(wù)項(xiàng)目,在學(xué)校、培訓(xùn)班搭微服務(wù)?

          這種東西學(xué)習(xí)下概念和思想就好了,這些東西根本就是應(yīng)用層的東西,學(xué)習(xí)起來根本不費(fèi)勁的好吧。

          我敢保證,沒有一個(gè) 985 會(huì)教微服務(wù)這種東西,分布式理論倒是可能會(huì)單獨(dú)開一門課。

          不過我相信上面圖片里的這個(gè)分布式一定不會(huì)教CAP、Raft、Paxos 這些東西,大概率是用 Springboot + Dubbo + Zookeeper 在幾臺(tái)機(jī)器搭建一個(gè)服務(wù)。。。

          科班

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

          不過講道理兩張圖片,殊途同歸,最后都是碼農(nóng),只不過大概率決定了你在哪里敲代碼。

          總結(jié)一下,BB 了這么多,就想表達(dá)一個(gè)意思,C 語(yǔ)言很重要,如果你正在大學(xué)學(xué) C,一定要掌握好,不要懷疑學(xué) C 有沒有用。

          最近寫的一些干貨,每篇都很用心,歡迎各位小伙伴閱讀/點(diǎn)贊/分享:

          1. 怒肝1.3w+字給學(xué)姐講明白計(jì)算機(jī)專業(yè)大學(xué)四年到底該學(xué)什么?

          2. Spring Boot搭建的一個(gè)在線文件預(yù)覽系統(tǒng)!支持ppt、doc等多種類型文件預(yù)覽

          3. ?一份熱乎的 SpringBoot 前后端分離后臺(tái)管理系統(tǒng)分析!分模塊開發(fā)、RBAC權(quán)限控制...

          4. 要想代碼寫的好,這幾款I(lǐng)DEA插件你離不了!

          5. 系統(tǒng)設(shè)計(jì)面試題指北

          6. ?大二逃課總結(jié)的1.2w字的計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)!掃盲!

          7. ?不太喜歡“只要錢給夠就行,我愿意加班”這句話

          8. ?5分“白嫖”我使用Github 5 年總結(jié)的這些騷操作


          我是Guide哥,Java后端開發(fā),會(huì)一點(diǎn)前端知識(shí),喜歡烹飪,自由的少年。一個(gè)三觀比主角還正的技術(shù)人。我們下期再見!

          瀏覽 49
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久在线| 精品国无人区一品二品三品 | 黄色片日逼操骚逼 | 靠逼视频网站在线观看 | 国产婬乱片A片AAA毛片下载 |