如何学好C语言

2011年3月29日 发表评论 阅读评论 216,587 人阅读    

有人在酷壳的留言版上询问下面的问题

keep_walker :
今天晚上我看到这篇文章。
http://programmers.stackexchange.com/questions/62502/small-c-projects

我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!

我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:

  1. 虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
  2. 大量的封装好的类库也屏蔽了很多实现细节。

一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。

下面是我给这位朋友的一些建议:

  • 鼓励并为你叫好。我鼓励你想要去学C语言的想法和精神,很多人都觉得C语言好学,其实并不然。(你可以看看《C语言的迷题》)现在的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术如果能够流行40多年,这才是你需要去关注和学习的技术,而不是那些刚出来的技术(过度炒作的技术Windows编程史)。这才是踏踏实实的精神。
  • 不要找借口。这一条路走下来并不容易,不要给自己找借口。我最不喜欢听到的就是“很忙,没有时间”这样的借口。我以前在银行做项目,早9点到晚10点,周一到周六,我一样可以每天抽1个小时来看书和专研,一年下来也能精读5、6本书。我现在的工作项目和招聘任务很紧张,刚生的小孩只有自己和老婆两人带,还需要准备讲课,但是我还是能够找到时间看文章写文章维护酷壳。所以,我可以告诉你,“时间就像乳沟,只要你肯挤,就一定会有”。

如果你能在2-3年内精读完这些书,并全部融会贯通,那么你就明白什么是一览众山小的感觉了!我足足花了5年时间才算是真正全部读完这些书的。最后,祝你好运!努力!

——-更新:2011/03/29 20:00——-

我想,这篇文章主要想告诉大家这么几件事:

  • 编程编到一定时候,你就需要了解底层系统的机制,否则,知其然不知所以然。
  • 我没有否定非C的程序员的逻辑,真正的逻辑是——如果你想要了解底层机制,请学习C语言和操作系统。
  • 40多年的Unix/C影响深远。包括影响了Windows。如果你想一通百通,一定要了解Unix。那是计算机文化真正的根。
  • 不要肤浅地去思考问题。比如,不要以为一个DBA就不会考虑数据库引擎的内存页面的问题。也不要以为Web程序员就不需要了解后台的服务器和脚本的运行性能以及TCP/IP的问题。

高手往往都是有很强的系统的基础知识的,表面的东西永远是肤浅的。


关注CoolShell微信公众账号可以在手机端搜索文章

(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (106 人打了分,平均分: 4.92 )
Loading...
  1. 大刘
    2013年9月25日23:01 | #1

    写得不错,学习了。

  2. rdongxie
    2013年10月9日11:02 | #2

    @haoel
    《Unix高级环境编程》 这个书名错了。《Unix环境高级编程》

  3. shuxiang1990
    2013年10月26日19:22 | #3

    楼主,我有个疑问,我看《unix网络编程》的时候感觉得先把unix/linux的进程通信给搞懂,不然不好懂。看进程通信的时候又感觉得搞懂中断,包括那些系统调用内核是怎么实现的,所以到现在也是半懂不懂,你觉得有必要吗?
    第二个问题是,看开源的c代码的时候感觉没头绪,不知道怎么开始,希望楼主能给指教,谢谢!

  4. 边城
    2013年11月11日16:18 | #4

    做了将近8年的.net,最近正在往底层研究,谢谢楼主的指点

  5. 2013年11月14日09:34 | #5

    谢谢博主,
    最早了解博主是您的那篇《跟我学Makefile》,讲的很好。
    您的博主,都很受用。
    现在感觉对于PC上的编程书籍很多,
    指点很多,
    但是对于嵌入式的编程,
    单片机的编程,
    指点很少。
    这些上边,几乎只能用C(或许外加汇编)。

  6. Bubbly
    2013年11月16日16:09 | #6

    大三,个人会有个人的侧重点,当初学操作系统的时候就会自然的觉得那种底层的东西很高端的样子,但是如果要找工作的的话,是不是还是要会现在很常用的东西,毕竟本科毕业生是不会让你做那种很底层的东西吧,为了找工作,还是要学好一门语言吧,比如java。。。

  7. 菜鸟小L
    2013年11月25日16:36 | #7

    正在学习楼主推荐的《C程序设计语言(第2版·新版)》

  8. 2013年11月30日14:27 | #8

    文中提到的基础,根本就没有掌握。

  9. Yao + +
    2014年2月9日16:35 | #9

    刚刚看完谭浩强写的C++,感觉不能说是烂书吧,作为刚刚接触的初学者,对C++整体框架的建立还是很好的,这个时候没有必要对细节进行非常深入的理解。之后在有个整体概念之后,再去阅读C++primer等经典著作,最好是英文原版,我想效果更好,而且我也是打算这么做的!(ps:一直在看酷壳关于C++的文章,作为学习C++的有效指导,而且非常认同皓哥对底层的强调重视,真的非常感谢皓哥 =v=)

  10. 573742376
    2014年2月28日17:59 | #10

    确实是这样的啊

  11. 路客与刀客
    2014年4月5日17:56 | #11

    估计再看下去,连最基本的文件都搞不懂了,推荐MICHAEL KERRISK的书,基础整起来吧@shuxiang1990

  12. 2014年4月16日17:21 | #12

    确实,计算机编程是一个非常系统的工程,如果对底层不了解,一直用别人造的黑盒子,难以踏实!

    说到底,还是要对操作系统原理,编译器的基本原理,数据库存储引擎的实现等有比较清醒的认识吧!

  13. 2014年4月28日11:26 | #13

    2年java web开发,其中参与了android, ios 等的开发,都是些api调用, 都是一知半解,准备往底层学习

  14. 2014年7月18日13:00 | #14

    最新编程技术站点lippiouyangonline.info

  15. stevenlake
    2014年9月15日10:26 | #15

    最近正想学编程,就按照您的思路来学好了

  16. harkhuang
    2014年9月28日10:02 | #16

    作者给的这几本书 我一直都在读 虽然读了快3年了 只是读懂了很少 融会贯通 还要多思考 多做笔记 多总结
    这样才能记住旧的 获得新的 才回融会贯通 谢谢作者 而且作者推荐的这些书一直在读!

  17. longtzw
    2014年10月1日17:22 | #17

    请教博主,对“精读”你是如何定义的?

  18. wallace
    2014年10月2日22:50 | #18

    一不小心就大二了(我是科班学生),学校里实行大类培养的模式,计算机的专业知识还没开始学,想好好学习计算机,偶然发现了这个网站,能学到的东西挺多的,谢谢博主!

  19. fzyz.abc
    2014年10月17日15:50 | #19

    再次回温这篇文章,感触良多。之前我是去年9月6号看到这篇文章的,然后把心思都放在C语言上面学习。向楼主所说的,我学习了K&R,学习了《算法导论》的前十几章,还学习了类似《C和指针》,《数据结构:C语言实现》等等书籍,不过中间花了几个月的时间谈了一场恋爱,所以到现在才刚刚看完。我现在已经看了APUE,目前还把UDP卷1的基础部分也看完了。我的目标就是:学习完APUE,UNP两卷,TCP/IP详解三卷,然后自己实现一个TCP/IP协议栈。虽然自己从二流非计算机专业毕业,这两年感觉在Windows的MFC下开发,根本没学到什么东西。但是我依旧相信自己,日积月累的学习,总会有回报。相信自己!感谢楼主的这篇文章,算是启蒙文章,让我铁下心来,学习C,学习UNIX。

  20. 2014年11月6日10:27 | #20

    已经绝版了,还有替代的吗?

  21. 2014年11月7日13:27 | #21

    C的应用范围太广了,小到一块电路板,大到一群服务器,几乎无所不能。并且它自由、速度和优雅兼备。虽然已经有半个世纪的历史,但宝刀未老,依旧犀利!

  22. zhou
    2014年11月25日22:28 | #22

    C 语言的科学和艺术@hilojack

  23. miral
    2014年12月24日11:32 | #23

    我在此留言,只为自己2年后的见证

  24. Jay
    2015年1月1日13:36 | #24

    谢谢耗子哥的指点

  25. heibuhei?
    2015年1月30日17:59 | #25

    C/C++,Java,perl,PHP,assembly…都学了。
    言语都大同小异,技术才是真本事。
    对C来说,无namespace(package)是缺点。
    理解了pointer和struct就去C++吧。理解不了就去Java,.NET。
    (真正的难关是从WIN32开始)

  26. tuyajie
    2015年2月9日13:13 | #26

    30岁了,作为一个转行做it的人,压力越来越大。以前总是浮于表面的学一些基本的,工作相关的东西,感觉良好,但是慢慢觉得自己基本功的匮乏。看了耗子的博客很久了,一直想坚持去学学,但是总是各种理由最后放弃了。
    现在岁数大了,学的慢了,但是知耻而后勇,笨鸟虽然没有先飞,但是至少我开始了。希望一切还来得及。
    也希望能从耗子哥这里得到更多的帮助。

  27. Zorro
    2015年2月10日20:53 | #27

    在这里留记号,精读完这些书。

  28. keng
    2015年2月28日14:26 | #28

    @heibuhei?
    win32…… 这是15年的回答?

  29. KW
    2015年3月2日21:06 | #29

    留爪,受益!

  30. daniel
    2015年4月17日07:49 | #30

    最近也是发现遇到瓶颈了,对很多底层都是一只半解,前段时间也刚回顾了计算机网络和TCP卷1,接下来还是看看C语言的网络编程吧。受益了,谢谢!

  31. 川藏线
    2015年5月4日21:26 | #31

    今天留名,决心学好C.以后回来见证!!!加油!

  32. miral
    2015年5月19日13:07 | #32

    @miral
    已经半年了,换了工作,还是做java,虽然是“高级”,但是C只是能够使用最基本的东西
    数据结构和算法完全不懂

  33. NiceCp
    2015年7月20日15:33 | #33

    谢谢耗子叔,读起来如沐春风~~哈哈

  34. Jackoh
    2015年9月16日18:38 | #34

    在這留名,希望一步一步學好C和網路編程(最後學Lisp)

  35. 小木虫
    2015年9月23日09:20 | #35

    非常感谢楼主的指点~

  36. toto
    2016年1月4日22:38 | #36

    05年看您的文章长大,感谢。

  37. jesee
    2016年2月13日21:42 | #37

    常来看看

评论分页
1 3 4 5 4102
  1. 2013年9月29日18:14 | #1
  2. 2013年11月10日16:47 | #2
  3. 2013年11月10日23:27 | #3
  4. 2013年11月26日22:46 | #4
  5. 2013年12月4日21:06 | #5
  6. 2014年4月14日14:15 | #6
  7. 2014年8月15日18:53 | #7
  8. 2014年9月3日10:30 | #8
  9. 2015年3月25日08:48 | #9
  10. 2015年4月14日23:20 | #10
  11. 2016年5月3日18:44 | #11
  12. 2016年5月10日22:10 | #12
  13. 2016年5月11日08:20 | #13