经历
作为一名工作多年Linux的系统工程师,我的大部分工作都是维护Linux系统服务。对于底层的实现知之甚少。其实搞了很多年,自认为也就是个操作员而已,写几个简单脚本,感觉就是啥都会啥都不精。从最初的CentOS5到现在的Cloud,Kubernetes,Docker,Prometheus,技术细节被封装的越来越好,了解的内部的东西越来越困难。技术发展的速度越来越快,从最初的init管理到systemd,从编译源码包到现在的yum/apt。很多东西都在变,有时候变的让你力不从心。
但是静下来心来想想貌似技术也没有发生本质的变化,只是对于之前的版本进行改进和修复。Unix从发行到现在将近50年了,基本设计思路没有太大的变化,TCP/IP模型也没有太多的变化。变化的只是不断的优化。
所以,我才有了系统学习Linux的想法。学习Unix/Linux的第一个拦路虎就是C,所以学习好C是理解的关键。
对C的看法
大学的时候学习过一段时间C,当时的主要是应付考计算机2级,不知道现在这个考试还是否存在。当时教程是谭浩强编写的那本书,我不想做过多的评价,反正不推荐。
工作后,也是学学停停,没有坚持下去。
直到学完了《C Primer Plus》,才发现C语言并不是很难,而且读起来就和在读别人的文章似的。稍后我会说明一下,为什么这边书好。
从学习Linux角度出发,我自认为(各抒己见嘛!):重点是函数,数组,指针,结构体,联合体就可以了。当然数据结构,算法如果明白更好。
对C语言的一些误区
-
算法
我为什么推荐《C Primer Plus》,因为这本书从始至终都没有去给你讲算法。我看了很多C的书,一讲递归就是汉诺塔,费波纳茨数列。这些东西让你看的云里雾里(我也就是一般人,如果你水平高就不要拍砖了)。
我认为,程序本身就是和写文章类似,先学会写字,然后是逻辑,最后是修辞。这边书只是教你写字。这个逻辑呢,就是流控和数据结构,至于修辞呢,就是算法。
所以,算法并不那么重要,你的复杂度高一些,运行慢一点,那就等等嘛。但是要是连字都写不出来,逻辑都错的话,再等也没用用。 -
汇编
有人会认为学习C必须学习汇编。我个人的看法是汇编会让你更理解C语言的内部,但是不是充分必要条件。我也学习过汇编语言,曾经也学习的如痴如醉。汇编语言的着重点就是CPU内部寄存器和内存操作,但是我花了一下午的时间也就写出来printf,先不谈效率问题。关键是移植性很差,寄存器不同就要改关键字,所以不推荐学习汇编。汇编可以让你很快理解C的指针问题,其实也就是汇编的地址管理(汇编开头就讲这个)。如果你非要为C学,那么只要学前面的汇编的地址管理即可。
-
数学
只要你的学习目的不是用来数学,加解密,压缩的研究,估计也不太用到数学知识。
-
运行速度快
这个真不见得,除非你一开始就使用好的算法,使用合理的数据结构。学习它只是为了能够读懂别人写的代码,如果你非要写出和别人一样高效的代码,那你还是需要学习上面不推荐你学习的东西。
当然上面的技能如果有,自然会让你拥有一览众山小的感觉,即便没有也无所谓,也不会耽误你成为一名优秀的系统工程师。
C语言的缺点
-
C源语法规则比较灵活,而且C的原则是相信你是个好程序员,你可以操作所以你想操作的,即便操作是错误的
-
C是个单进程程序,不支持多程序,平行操作和同步
-
尽管C的关键字很少, 但是由于约束很少,所以C代码比价难懂
-
C 不是一个面向对象的编程语言,不支持面向对象的特征
学习步骤
很简单,看书,思考,实操, 如此反复。
这是我的C语言的第一篇帖子,后面我会坚持每天都发一篇关于当天的练习帖,希望自己能坚持下去。
推荐教材
按照由浅入深的次序是:
《C Primer Plus》
《C:From Theory to Practice》
《C编程技巧-117个问题解决方案实例》
《C 和指针》
《C 专家编程》
《C陷阱与缺陷》
《C程序设计的抽象思维》
《Linux/Unix系统编程手册》
《TCP/IP详解 卷2:实现》