写给C语言初学者的话

我一个好朋友,Linux C方面的高手,有很多经验可以和大家分享,下面是他的一些经验,对于C语言初学者来说,应该会有不少帮助的。

学习C语言不要心急,要循序渐进,须知欲速则不达的道理。千万不要盲目的写大量的代码,这样做只会堆出大量的低档次代码,同时使你形成不好的代码习惯。先买本基础的教材来看看,使得对C语言有个初步的认识,其实我现在手头上还放着《The C Programming Language》和《C程序设计(第二版)》(大学教材)呢,有些时候我还会为了一些基本性的概念来翻翻看呢。

如果你的身边有高水平的开发人员,那么再好不过了,多多向别人请教。但是就我了解的情况来看,大部分的初学者并没有在进入IT行业后得到一个资深的软件工程师的指导,而恰恰是在入司后就被推向前线,替老板们骗取客户口袋里的钱,在这个过程中很多人都是在苦苦的堆代码,赚着可怜的薪资。尽管我也是在拿着可怜的钱,但是有一点我是幸运的,因为我在我的第一家公司里遇到了带领我走向Unix和C语言领域的导师,正是他的一句“Unix和C语言是你一生都要去学习的技术”让我狂热的爱上了它们,正是他的一句“你有root口令,并不是你有root口令这么简单,更多的是一种责任”(说这句话的前提是我用root口令进入SUN服务器后删除了别人的东西,因为我认为这些是无用的东西)使我对责任这两个字有一个非常具体的认识。所以在这里请广大读者允许我用一些篇幅来对我neusoft的导师yuhj表示深深的感谢。同时也对CU的朋友们表示深深的感谢,可以说,你们是我的第二导师,我已经离不开你们了。

希望大家都比我幸运,没有得到幸运之神垂青的朋友们也不要灰心,多上CU上来和大家交流交流,讨论讨论吧,但是注意在论坛上讨论的时候不要刨根问底,很多事情不是一句话就说的清楚的,别人只能给你一个指引,再具体的只有靠自己多研究研究、琢磨琢磨。闲暇的时候去精华区看看,你会有意外的收获的。

千万不要一看到英文就头大,尽管我也是这样,并不是看不懂(毕竟也接受过CET4、6级哑巴英语的教育,还是能看懂的)。man的帮助是最好的教材并且很多国外的论坛对技术的描述是很清楚的,也是很简单的,更重要的是,你会在上面看到些在国内论坛上看不到的东西(计算机的技术一直都是由西方向东方传递,希望有朝一日老外都到我们中国的论坛上来寻找技术资料)。

学习C语言有一件事情也是必须要学的,而且最好是同时学,有的朋友可能已经猜出来了,没错,是Unix。Unix和C语言可以说大家提的很多了,有Unix的地方就有C语言,同时也正是有了C语言,才有了Unix(我们还是先讨论讨论鸡生蛋还是蛋生鸡的哲学问题吧,谁拿西红柿打我),甚至有人说C语言就是为了Unix而设计的,可见Unix和C语言之间的非同寻常的关系。学习Unix现在容易多了,以前Unix都是运行在大型的服务器上的,可是现在有了Linux(按照GNU的意思,Linux就是Linux还不能叫Unix),大家可以在自己的PC上装一套Linux来学习,注意学习Linux不要拿Linux和Windows来比较,它们不可同日而语。Linux会让你知道什么是经典,永远让你在一个方向上大展宏图,Windows只会让你在别人的套子里耍上大刀,不时的还要换一个套子耍耍。下面罗列了一些我在学习Unix的一些经验:

1、学习Unix和C语言,先向大家推荐一本书《Unix高级环境编程》,这本书是学习Unix和C的经典之作,尽量把书中提到的系统调用都写个练习程序,先感性的认识一下Linux系统提供给用户的系统调用都是干什么的,怎么用。系统调用是内核提供给用户的功能用以申请内核服务,对于Linux内核的学习,从系统调用入手是个不错的办法。学习过程可以参看Linux的联机帮助,和网络上的资料。当你觉得差不多了的时候,那我给大家出一道联系题目吧:实现一个ftp服务器和客户端的功能,完全可以自己定义一些应用层的协议,只要能实现用简单的命令传输文件就可以了。

这个题目可以使你练习到TCP/IP的基本编程方法和文件操作的基本方法对于后面学习内核的文件系统会有帮助的。

2、当你对Unix系统有了些了解后,同时对于大部分的系统调用(关键是关于文件的系统调用,对于Linux系统的内核来说从文件系统入手相对容易一些)也有了清楚的认识后,再推荐你一本书《Linux内核情景分析》,该书是关于Linux内核的经典之作唯一美中不足的是没有关于网络子系统的详细介绍。你可以从文件系统的系统调用入手,慢慢的你就会对Linux有了一个更深入的认识。同时注意很多经典的方法和思想在Linux中的运用。你会认识到为什么Unix把所有的东西都看成文件,对什么东西操作都是对文件操作,你会慢慢体会到Unix的经典之处了。

3、当你对Linux内核有了些了解后,你就可以找个方向来专门发展了,如果你想对眼下流行的网络编程感兴趣,那么再推荐你一本书《TCP/IP详细解释》,这本书是关于TCP/IP协议的经典之作。你会学习到TCP/IP协议栈是如果实现的,为什么,各层协议之间是如何工作的。你看完了这本书后,你就可以自己写一个dos攻击程序和sniffer了。

我说的简单,其实我提到的每本书至少都够你研究很长时间的,所以希望初学者别着急不骄不躁,相信只要努力过,一定会成为高手的。

在写代码的时候大家要注意养成好的代码习惯和风格还有抽象能力。

下面给出大家在写代码的时候的20字方针:

函数要小
尽量的把函数弄的通用点,代码行少点,一个函数只完成一个简单的功能,一眼就能看出来此函数有没有代码错误,每个函数都是健壮的,那么你的程序就是健壮的。

代码要少 完成一个功能的时候在逻辑清楚的情况下代码越少越好,千万不要比代码谁写的多啊。

算法要好 在完成一个功能的时候要考虑效率,目前计算机的内存很大,所以内存已经不是首要考虑的因素了,但是在某些特殊的地方效率还是很重要的。有效率高的算法,就不用效率低的算法,看看本版有一篇精华贴子是关于把一个字符窜两边的空格去掉的帖子(trim),很多人都提出了算法,但是有一个算法是最好的,效率最高,代码最少,是算法要好的最好体现

命名要清 命名要清楚,最要用汉语中的谓宾结构如set_buffsize()

文件要多 尽量把一个大的程序安功能分成多个文件,一个文件尽量不要超作1000行,这样就很清楚的知道那个文件代码是健壮的,那个文件有可能有隐患,在代码检查的时候可以有针对性的检查某几个文件

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
14 Responses
  1. tom says:

    博主,你好,我现在还是一个学生,在网上游荡搜索unix的时候无意看见了你写的“写给C语言初学者的话 ”,很受用的感觉,我是计算机专业的,现在觉得要学的,想学的好多好多,经常也有疲累的感觉,唉,多看看前辈的建议会很受用,看了你的建议,觉得不错,呵呵,外加看见你的那段“电梯”艳遇之后,我决定给你回个信,以表对你这两篇文章的表扬,嘻嘻,要是那个女的是25,而且未婚,那该多爽啊,呵呵

  2. Michael says:

    [Comment ID #3506 Will Be Quoted Here]

    呵呵,欢迎常来交流!
    看到您在QQ上给我的留言,对于临将毕业的大学生来说,目前国内的形势的确不是很好,不过事情尽量往长远点看,不应该着眼于毕业后两三年能有什么大飞跃或者创造什么神奇,一定给自己一个精准的定位,毕业后的两三年都是自己适应和学习社会能力的必经阶段,如果能摆正自己的心态和位置,那么三年后您一定能收获比别人多,原来在各个公司经历不少刚出校门的学生,很多大学生初出学校心高气傲,如浮萍一样,不但得不到企业的认同,而且还让自己被社会越来越抛弃,最后自己三年后明白了其中的道理,此时再重新找准定位就等于已经浪费了不少时间。

    您能够在离开校园前有这样的想法,我认为是很不错的,对于计算机技术来说,其实没有什么更好和什么更差,只是各种技术应用的场景、适用的范围不一样,在每个技术领域,都有专家做得很不错,但是如果从长远来说,搞技术如同造房子,地基一定相当重要,什么是地基,这在我们工作多年后的理解非常深刻,大学里面最基础的几门计算机专业课就是地基,一个技术人员能够在这个领域里面走多远和多深,不是在于工作中他用了java还是C++或者别的什么,而是在于他对于计算机基础知识理论的理解有多透彻,这跟武侠小说里面的高手类似,真正的高手是内功扎实,动作简单,而一些注重套路讲究花拳绣腿的多半成不了大器。

    大学里面的几门课我希望您能在离开校园前重新读一读,包括计算机原理、编译原理、操作系统、数据结构,然后在自己工作中不断的用这些知识来解释和应用这些知识。这些知识是你在工作多年后能深刻体会到非常有用而又感到欠缺的,曾经有些同事,搞了多年的编程,结果从来没有用过类似B+树之类的大学课本里面基本的东西,你说这不是白学了吗?而且可以想象,他做东西一定不可能做到很深层次。

    说到这里,感觉说得有点太罗嗦了,看到你正在学习PHP&MySQL和Unix C,同时还在学习一些设计模式和架构的东西,一方面能意识到自己的不足,同时有比较强的学习愿望,这对你来说是个不错的开始。在这里我给你一点建议:
    1、重温一下前面提到的几门课程,现在回头去看应该能比上学时候更容易理解和更快一点。
    2、PHP&MySQL的使用并不难,你应该把更多精力花到Unix/Linux C方面,如果您把Unix C搞好了,PHP对你来说只是分分钟能上手和驾驭的,MySQL是一个不错的学习数据库知识的工具,你可以多用C配合MySQL做做练习,同时了解了PHP的原理后,尝试用C写一些PHP的扩展模块和函数。
    3、学习C的时候,建议你看看 《Unix环境高级编程第二版》 这个书有多经典不用我来说了。
    4、学习C的过程中,你要时刻问问自己遇到一些问题能否用大学课本里面的知识来解决,加深对那些基础知识的理解和应用。
    5、设计模式有非常经典的一本书《设计模式》,讲述了主流的二十一种设计模式,不过由于你更多的是和C打交道,那么面对对象的部分可以暂时不用看,就是先不考虑设计模式方面的东西。对于UML之类的也可以暂时先放放。
    6、不管你是坚持走面向过程的C还是面向对象的C++,我希望您都能对软件工程加深学习,有两本书可以看看《敏捷软件开发》和《重构》,这个阶段可能您没有具体的团队开发经验和产品开发经验,但是可以先抽空看看,今后再在工作中重温几遍,一定收获很多。
    7、您希望了解现在距离大企业之间有什么差距,这个比较明确的可以告诉您,任何企业需要的一定是有经验的高手,但是同时也会在企业发展过程中不断的培养自己有潜力的员工,如果您通过自己的努力进入到一个大企业,那么最好能把自己位置摆正,好好跟一些前辈学习学习、再学习,这个过程非常重要,我在yahoo一个老乡,刚毕业进入公司,可以说也就具备基础的C知识,但是跟着一个yahoo成熟的技术团队一起工作,从基础的开始学习和应用,现在三年过去了,已经是高手一名。
    8、可能您还会有个疑问,到底该走C的路还是C++的路,或者走微软平台还是Java平台,这个实际上没有什么好选择的,关键的不是他们谁能更有前途,而是您自己的爱好和能否在这其中的一个选择中坚持走下去,并且走到极致,他们每个都有各自的优势和应用范围,就我个人而言,更偏向走Unix/Linux C的路,虽然比较枯燥,但是比较扎实。我见到过目前为止称得上计算机专家的前辈,他们都是在C的道路上一直坚实的走了超过十年,现在他们具备的处理计算机技术问题的能力已经非常深厚,是各个大企业都非常渴求的高级人才。这同时也引出一个问题,那就是目前很多国人认为搞技术过了30多岁就没有前途了,其实国外很多大企业里面技术专家级别的高手,很多超过40多岁的,而国人有这样的担忧关键不是年龄问题,而是自己对技术的积累不够、技术的深度不够造成信心上的不足。
    9、最后一点,那就是谨记:学无止境、虚怀若谷、真正的美德如河流,越深越无声!

    说了不少,希望能对你有用,对一些和你一样的同学也能有点帮助,有些观点可能太过我个人,还得看你自己把握。

  3. diogin says:

    Michael,真的非常感谢您这番指点!昨天回寝室后想了想您的这番话,理解深了一层,今天回来看又是受益良多。

    之前的我就如您说的那样,如浮萍一般。而转眼间到了大四,忽然发现自己不会的东西实在太多太多,于是在一夜间似乎自己变得非常沉默,褪去了往日的浮躁,开始静下心来踏踏实实争分夺秒地学。

    我现在对自己的定位还算比较明晰,虽然大学几年理论看了不少,但真正的实践技能我还非常欠缺,所以我现在是安心地从基层做起,一步一个脚印地走过来。我不是计算机科班学生,我学的是电子,但感兴趣的是计算机,也因此平时看的都是计算机方面的书,三年来基本上把计算机专业必修课都看过一遍,我想,比起一些对本专业没什么兴趣的科班学生来说,我应该不会比他们差多少的。

    编程语言和操作系统选择上我的想法应该还是好的,记得哪位OO大师说过,面向对象语言是必要的,但更关键的是面向对象思想。这种说法跟您说的注意内功有异曲同工之妙:) 我现在是在同时学PHP的面向对象编程和FreeBSD下的C编程,所以前面跟您说的设计模式、UML我想现在可能不适合放下,也许因为受面向过程编程语言的影响太深,现在我急需OO思想来充实吧:) 对于C语言本身,在看过《C程序设计语言》、《C陷阱与缺陷》、《C专家编程》和《深入理解计算机系统》之后,我对它有了比较深的熟悉,然而毕竟只是熟悉语言本身,没有用它做过大的系统,平时也只是用来写写链表和一些小型的处理程序而已,所以实在不敢说自己真的掌握了C语言。您说的《Unix环境编程》是一部很好的书,事实上我书架上有这本书:) 只可惜没看多少,因为一直抽不出完整的时间来看,接下来的时间我会调整好尽量去完整地结合实践把它读一遍。

    总地来说,现在我自己的感觉是,理论学习不是很深,同时实践经验也比较缺乏,而剩余的在校时间也已经不多,一时间对自己的路有点迷茫..这个暑假帮老师做一个PHP项目,最初我是想用自己所学的软件工程知识来实践的,在需求不明确的情况下打好了一个灵活的框架。可惜老师并不看重我的这些准备工作,而是要马上就看到东西,我觉得很不合理,但也没办法..堆代码的感觉,就像是在犯罪似的。不过这一个多月来多少也接触了点真实软件开发的过程,应该还算有收获:)

    您推荐的几本书,我会尽量多看,事实上我是个书迷,每天晚上不看书就会觉得不踏实,呵呵:)

    每次来您的blog看看都有一种被激励的感觉,感谢Michael!

  4. Michael says:

    能有点帮助让我感觉很欣慰,我自己也是理工大学里面学微电子的,大学期间自学计算机,也是从那之后到今天一直就搞计算机了,我说的有些话其实也是我自己走过弯路后的经验。

    有句话比较适合你现在的心态:感觉自己渺小的时候,才是巨大收获的开始!

  5. hawking says:

    Michael :
    Admire your knowledge and manner very much, certainly have your personal technological ability, I must often come to Presence !

  6. qqlyj says:

    真的是一篇好文章啊,包括评论都很经典,对我们刚毕业的学生有很大的启发,后悔发现你的BLOG太晚呀,呵呵,还是努力学习的好,不懂的再来请教~~

  7. read says:

    非常感谢分享这样的好文章。Michael的话给我们这些后辈还是启发了很多。

  8. 代码罐头 says:

    在中国这种环境下
    除非不以写程序谋生
    否则不可能静下来研究透一种语言
    新手不仅是一上来就被推到前线写代码
    更加会被每次硬塞给步枪,冲锋枪,破机炮,反坦克炮等等武器(C,CPP,PHP,ASP,VB等等,必要的时候,应用软件的程序员被叫去写网站程序是很正常的事情)

    更多情况下是环境造就人和改变人
    要不是我入行3个月就选择放弃程序员这个工作
    我至今也不可能有机会写自己想写的东西,或者只有自己想写的时候才写.

  9. Michael says:

    楼上的朋友节日快乐,共同学习,共同进步吧。

  10. justin says:

    我到覺得語言的學習就兩步:
    1.語法
    2.手冊
    3.動手

  11. Michael says:

    哈哈,这不是三步吗?

  12. Cucole Lee says:

    真是相见恨晚,我研究linux c 已经几个月了,
    听君一席话胜读十年书!

    有可能的话,希望能和你交个朋友!

  13. jacos says:

    我是一名软件学院的大二学生,说实话对未来存在很多迷茫的地方。喜欢你的博客!

Leave a Reply

Your email address will not be published. Required fields are marked *

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image