做了个小调查,发现使用C语言做第一门编程语言课的大学达到了 90% 以上。

我认为大一先上C语言的核心原因:
▪ 一是语法简单,更加贴近计算机本质的一些东西,学C也不是简单的学语言本身,而是想透过 C 语言去理解一些如寄存器、内存、函数调用、跳转等东西。
▪ 二是为大二、大三阶段的专业课打下一个基础,当然很多同学说我不学C一样可以学操作系统、计网呀。
当然,这些和C没必然关联,只是很多实验你确实不好继续做,除非你只打算看看概念,背背什么是进程、线程。
如何正确的打开C语言?
我认为C语言最为核心的有三块:
▪ 指针
▪ 内存
▪ 系统编程
首先指针和内存是需要在学习C语言过程中就理解、搞定的,推荐两本书:
《C程序设计语言》、《C和指针》
如果你觉得初学看书过于困难,那么可以在职坐标学习C语言线上课程,结合书一起看,相信会理解得更加深刻。
然后,学习完了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高级环境编程》

这就是Java、Python 之下的世界,相信 Javaer 都学习过 JVM 的原理,了解过 GC、类加载机制、运行时数据区等知识。
但实际上,JVM 也只是介于操作系统之间的一个中间层。
很多时候JVM、Python 解释器等本身都是需要 Native 本地方法栈去和 OS 打交道的,去和系统调用接口交互。
所以Linux 系统编程对于深入学习编程一定是绕不开(因为很多服务端程序都是运行在Linux上的,所以忽略了Win/Mac
而这是C语言的世界:

所以C的重要性不需要的多说了吧~
不少Java、C#、PHP、Python 程序员工作几年后会遇到瓶颈,有些会回来学习C语言,重拾底层概念,寻求新的突破。
这里不是在否定其它非C程序员就没技术,实际上我本身也不写C,我只是想表达如果你想学习底层机制、操作系统等,请学习C语言。
编程学到一定的时候,你就需要了解底层系统的机制,否则,知其然不知所以然。
真正的高手往往都是有很强的系统性基础知识的,表面的东西永远是肤浅的。
所以利用大学的时间恰恰是打好这些基础的关键时间,等到工作了,大家都是更倾向于学习快速上手业务的技能。
所以,在大学里先学什么语言不重要,你可以先学Python、Java,但是无论如何,如果你想学好 Computer Science,C语言一定绕不开。
也许以后实际工作中你完全没有机会去写C,但是这并没关系,打好了基础,学其它也会学得很快、很透彻。
对于计算机专业的同学,还是建议学好C语言,与其它课程相结合,多懂一点程序背后的实现原理。