一个老程序员写给C语言初学者的话

转载 2012年06月28日 16:59:28
前些天我写了一篇“Unix 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字方针:
  1、函数要小    尽量的把函数弄的通用点,代码行少点,一个函数只完成一个简单的功能,一眼就能看出来此函数有没有代码错误,每个函数都是健壮的,那么你的程序就是健壮的。
  2、代码要少    完成一个功能的时候在逻辑清楚的情况下代码越少越好,千万不要比代码谁写的多啊。
  3、算法要好    在完成一个功能的时候要考虑效率,目前计算机的内存很大,所以内存已经不是首要考虑的因素了,但是在某些特殊的地方效率还是很重要的。有效率高的算法,就不用效率低的算法,看看本版有一篇精华贴子是关于把一个字符窜两边的空格去掉的帖子(trim),很多人都提出了算法,但是有一个算法是最好的,效率最高,代码最少,是算法要好的最好体现。
  4、命名要清    命名要清楚,最要用汉语中的谓宾结构如set_buffsize()。
  5、文件要多    尽量把一个大的程序安功能分成多个文件,一个文件尽量不要超作1000行,这样就很清楚的知道那个文件代码是健壮的,那个文件有可能有隐患,在代码检查的时候可以有针对性的检查某几个文件。

-----------------------------------------------------------------------------------------------------------------------------------------------来源:chinaunix 作者:ldap

Linux基础
1、《Linux与Unix Shell 编程指南》
C语言基础
1、《C Primer Plus,5th Edition》【美】Stephen Prata著
2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)著
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux应用程序开发详解》

Linux内核
1、《深入理解Linux内核》(第三版)
2、《Linux内核源代码情景分析》毛德操 胡希明著
研发方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP详解》
3、《Linux内核编程》
4、《Linux设备驱动开发》(LDD)
硬件基础
1、《ARM体系结构与编程》杜春雷著
2、S3C2410 Datasheet
英语基础
1、《计算机与通信专业英语》

系统教程
1、《嵌入式系统――体系结构、编程与设计》
2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明著
3、《Building Embedded Linux Systems》
理论基础
1、《算法导论》
2、《数据结构(C语言版)》
3、《计算机组织与体系结构?性能分析》
4、《深入理解计算机系统》【美】Randal E. Bryant David O'Hallaron著
5、《操作系统:精髓与设计原理》
6、《编译原理》
7、《数据通信与计算机网络》
8、《数据压缩原理与应用》


还记得那些年学过的C语言吗?(写给自己和C的初学者)

说起C语言,大学一年级作为一门通识教育课,填鸭式地接受了C,那时也不知道它能干嘛,老师讲什么就跟着学什么,考试也就是把一本习题集做完背背就能通过。到现在5年过去了,由于现在研究生阶段的研究方向,又不得...

写给C语言初学者的话 (转载)

本文转载自:http://bbs.chinaunix.net/viewthread.php?tid=246771&extra=page%3D2%26filter%3Ddigest 前些天我写了一...

黑马程序员_C语言类型方面初学者容易忽视的几个知识点

------- IOS培训、java培训、期待与您交流! ----------

C语言初学者:使用CreateWindow创建一个窗口

看着MFC向导生成的程序,总归是一头的雾水,看不清,搞不懂. 还是老老实实的学下C语言吧. 但是只学C语言的的内容是很单调的,于是要结合window的基础编程一起学习. 这样才能学以致用.  ...
  • aasmfox
  • aasmfox
  • 2012年12月30日 00:11
  • 4893

C语言初学者:使用CreateWindow创建一个窗口

以下内容转自http://blog.csdn.net/aasmfox/article/details/8451950,多谢博主aasmfox 看着MFC向导生成的程序,总归是一头的雾水,...

一个javafx初学者实现国际象棋简单方法(很粗暴)棋子实现不再提供 没有使用java编程思想用的很基础的c语言思想

没有使用java编程思想用的很基础的c语言思想 如果想改写可以使用接口 写一个棋子接口各种不同的棋子实现类 既可以实现java编程思想 提供的主要是虚拟棋盘的想法...

对C语言的写文件操作fwrite的一个初学者常见误解

文件内容原本是:abcdefghijlmn;我们期待:abcAAfghijlmn;但是却变成了:^@^@^@AA.fwrite不是如我们误以为的数组这样的流,而是在fopen时决定了,会对文件系统有些...

一个C语言初学者写一个查找替换程序的历程

本人大一,正式接触C语言刚刚三个月
  • imred
  • imred
  • 2014年05月17日 14:09
  • 1216

一个老程序员写给换行业的朋友的信

换行业的两种办法,解决换行业后的心态问题
  • znsoft
  • znsoft
  • 2017年06月05日 01:52
  • 333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个老程序员写给C语言初学者的话
举报原因:
原因补充:

(最多只允许输入30个字)