C程序员从校园到职场

978-7-115-38849-0
作者: 周兆熊
译者:
编辑: 陈冀康
分类: C语言

图书目录:

详情

本书主要包括以下章节的内容:第1章,概述。第2章,从学校走向单位。第3章,基于编码规范来书写C语言程序。第4章,C软件开发项目中常用的函数。第5章,软件开发中C语言的高级议题。第6章,软件开发项目中的问题排查示例。此外,在附录中,对C语言中常用的文件操作函数、软件代码检查单进行了描述,并回答了读者的部分问题。

图书摘要

版权信息

书名:C程序员从校园到职场

ISBN:978-7-115-38849-0

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


要成为一名合格的C程序员,仅仅依靠课堂上的所讲所学是远远不够的,实际的软件开发对从业者提出了更高的要求。本书重在讲述从学生成长为一名职业化C程序员的必备技能和关键要素。

本书共11章,从C语言的发展历程讲起,然后分析了学校和职场的不同,并结合丰富的代码实例讲述了程序的样式、变量和函数、内存操作、文件、指针和结构体、算法和协议、程序重构、SQL语句和Shell命令以及程序问题排查等诸多C程序开发中的典型问题。

本书适用于在校计算机相关专业的学生阅读,也适用于刚入职的应届毕业生参考。


在刚入职的时候,我与一个工作多年的老员工之间有以下一番对话。

老员工:“你的C语言功底如何?”

我:“还可以,考试考了九十多分。”

老员工:“你觉得编码规范重要吗?”

我:“什么编码规范?我之前没听说过呢。”

老员工:“你觉得把代码写完并运行通过,你的工作就算结束了吗?”

我:“差不多吧,在学校里面程序运行没问题就OK了。”

老员工:“对于测试,你是怎么理解的?”

我:“测试就是看程序运行是否正常,看输出结果是否正确。”

也不知道当时那位老员工听了我的回答,是什么感受。如今回忆起来,那时的我对自己将要从事的工作的理解是很不成熟的。

本书写作目的

在工作的过程中,我发现我们在学校里面学到的很多东西比较片面肤浅,根本达不到岗位的要求。像编码规范、研发流程等学校里几乎不提及的知识,在实际的软件开发项目中却恰恰是异常的重要。

在学校里面,我们欠缺的教育主要包括以下几个方面。

第一,对编码规范的要求。在计算机编程课上,老师只要求学生能够编写程序实现既定的功能即可,几乎不会对编码规范提出要求,而编码规范是一般软件项目中最基本的要求。

第二,对动手能力的要求。学校里面学完一门课程之后,只要考试通过就行了,至于这门课程有什么实际的用途,很少有人关心。这就导致很多人考试得了高分,但让他们动手编写一个程序却出现了困难。一般的软件公司对个人的动手能力是十分看中的,这就是为什么他们喜欢招有工作经验的人的原因。

第三,对研发流程的讲授。软件开发并不仅仅是编写代码那么简单。学校里的老师只会教学生怎样写出代码,但很少会教他们一个实际的软件项目是怎么回事。其实,编码只是软件研发中一个很小的部分,而诸如设计、测试等还会占据很大一部分时间。

第四,对团队精神的培养。老师一直教导我们要独立完成作业,考试的时候不要交头接耳。而公司里面,我们是在一个团队里面工作,我们要与各个成员合作来完成任务或解决问题。在很多时候,我们编写的模块要与其他模块配合来实现特定的工作,这也是在考验团队之间的协作是否有默契。

第五,对情商的培养。学校的一个主要任务是让学生学到专业知识,让学生有一技之长,除此之外的其他方面都是次要的。但在工作岗位上,除了工作,我们要与不同的人打交道,还会遇到很多问题,这些都是对个人情商的考验。很多人在学校里面表现得很优异,但在工作中一遇到困难就怨天尤人、哀声叹气的,这就是因为缺少在情商方面的锻炼。

当然,我也是一样,在走出校门的时候踌躇满志,以为世界尽在我手中。但在工作上遇到一系列问题之后,我逐渐改变了自己对软件开发的很多看法。作为过来人,我有义务将所学到的经验分享给大家,让大家在软件开发这一条道路上走得更顺畅一点。

本书组织结构

本书主要包括以下章节的内容。

第1章 概述。本章对C语言的发展历史和主要特点进行了简单的介绍,之后对实际工作中软件开发工程师常用的工具软件进行了详细的说明。

第2章 学校到职场。走出校门,意味着一个漫长的学习过程的开始。本章首先以一个不规范的程序代码为例来让大家意识到自己所学C语言知识的不足;然后讲述了在从事实际的软件开发工作之前,我们需要破除哪些错误观念;最后描述了除专业技能之外的一些影响个人工作和发展的技能。

第3章 程序的样式。程序样式是给代码阅读者的第一印象。本章对头文件(.h文件)和源文件(.c文件)的样式,空格、空行、大括号和注释的使用进行了详细的描述。

第4章 变量和函数。本章首先介绍了基本数据类型的重定义;然后对变量和函数的命名进行了详细的说明;最后用程序示例讲解了一类特殊变量——静态变量的用法。

第5章 内存操作。本章详细描述4组与内存操作相关的函数的用法,它们是:memset和memcpy、strcat和strncat、strcpy和strncpy、strcmp和strncmp。

第6章 文件。文件在实际的软件开发中有着极其广泛的应用,本章首先介绍了常用文件操作函数及其用法,然后描述了与实际工作联系紧密的配置文件和makefile文件的使用方法。

第7章 指针和结构体。指针是学习C语言的难点所在,熟练掌握指针和结构体的用法是对每个软件开发工程师的基本要求。本章基于实际的程序,对指针和结构体进行了详细的描述。

第8章 算法和协议。算法是实现软件需求的方法,协议是多个模块通信的基础。本章分别详细介绍了软件项目实践中的算法和协议。

第9章 程序重构。对程序进行重构,几乎是每个软件开发工程师都会遇到的问题。本章介绍了程序重构的原因、原则和流程,并用实际的程序示例讲解了重构的整个过程。

第10章 SQL语句和Shell命令。对于经常与数据库打交道的软件,需要在程序中嵌套SQL语句。而对于基于Linux的程序开发者来说,几乎不可避免地要与Shell命令打交道。本章介绍了在C语言中执行SQL语句和Shell命令的方法。

第11章 程序问题排查。程序难免会出现问题,而在解决问题的过程中,程序开发者的能力也得到了锻炼和提升。本章首先介绍了日志,然后用4个示例来详细描述了程序问题排查的整个过程。

本书特色

本书组织架构清晰,内容简洁明了,主要有以下特色。

第一,各个章节内容条理清晰,通过丰富的图形和示例来讲述,以更加直观的方式来加强读者对C语言的理解。

第二,书中有诸多的源代码,均是严格按照编码规范进行书写,这有利于读者参照它们来规范自己的相关程序代码。

第三,本书并不局限于对C语言的讲解,同时也对实际的软件开发项目(如测试、问题排查等)进行了描述。读者可以通过本书,对软件开发有一个全面的了解。

本书目标读者

作为一本入门级的软件开发指南,本书的目标读者主要包括以下3类。

第一类 在校计算机专业学生。通过对本书的学习,可以加强对相关课程的理解,并提前对软件开发工作有一定的认识。

第二类 计算机专业应届毕业生。本书可以为你的面试或培训添砖加瓦,让你在就业或求职的道路上快人一步。

第三类 刚步入职场的应届毕业生。通过对本书的阅读,你可以提前了解软件开发项目对编程规范的要求以及项目中存在的一些问题,让你的工作更加得心应手。

作者联系方式

在阅读本书的过程中,读者有任何的疑问或建议,都可以通过以下方式与本人交流:

CSDN博客:http://blog.csdn.net/zhouzhaoxiong1227?viewmode=contents

独立博客:www.zhouzhaoxiong.com

邮箱:zhouzxi@126.com

QQ(微信):245924426

微博:http://weibo.com/zhouzxi?topnav=1&wvr=5

IT行业发展到今天,软件种类繁多,不同种类的软件之间差别相当大,没有一种规范适用于所有的软件开发项目。而本书中的内容提炼于作者本人所从事的软件开发工作,因此必然会存在局限性。加之作者本人的水平有限,本书中的内容难免会有所纰漏,还请各位读者和同行海涵。对于大家针对本书提出的宝贵的意见,作者将洗耳恭听并尽量采纳。大家可以通过上面的任何一种方式表达你们的建议,作者保证会在第一时间给予回复。

“活到老,学到老”,这句话对于软件工程师来说,是再恰当不过的了。那就让我们一起学习,一起经历工作中的酸甜苦辣,一起书写不一样的程序员人生吧!

雄关漫道真如铁,而今迈步从头越!


本章介绍C语言的发展历史和主要特点,以及实际项目工作中软件开发工程师常用到的工具软件。

C语言是1972年由美国贝尔实验室的计算机科学家Dennis Ritchie(丹尼斯·里奇)设计发明的。因此,Dennis Ritchie被誉为“C语言之父”(他已于2011年10月9日去世,享年70岁)。图1.1所示的人物就是Dennis Ritchie。

图1.1 “C语言之父”Dennis Ritchie

Dennis Ritchie曾在哈佛大学学习物理学和应用数学,1967年进入贝尔实验室工作。作为计算机科学家,在他身上有很多可贵的、值得我们学习的品格,例如:第一,他对所做的事十分有兴趣;第二,跳出舒适区工作,不断挑战自己;第三,有创新思维,不拘泥于条条框框;第四,喜欢分享,不藏匿自己的核心技术。

Dennis Ritchie对计算机科学的贡献主要有以下几个方面:第一,作为“C语言之父”,他最大的贡献当然是发明了C语言;第二,1973年他与Ken Thompson合作,把UNIX 90%以上的内容用C语言改写,因此也被誉为“UNIX之父”;第三,1978年他与Brian W. Kernighan一起出版了名著The C Programming Language(《C程序设计语言》),此书已被翻译成多种语言,成为C语言方面最权威的教材之一。

基于Dennis Ritchie的杰出成就,1983年他与Ken Thompson一起获得了图灵奖。1999年,Dennis Ritchie和Ken Thompson因为在发展C语言和UNIX操作系统方面所做出的贡献一起荣获了美国国家技术奖章。

作为在国际上广泛使用的计算机编程语言,C语言的发展简史如图1.2所示。

C语言到底有多少人在用?C语言的受欢迎程度如何?如图1.3所示为CodeForge网站公布的2014年11月“我最喜爱的编程语言”排行榜。

这个排行榜来自2014年11月对56000多名软件工程师的问卷调查。该排行榜非常清楚地反映了在世界不同国家和地区各种编程语言的流行程度,可供软件工程师及IT相关行业人士参考。

从图1.3可以看出,在全球范围内,C语言的受欢迎程度位居排行榜的榜首。因此,C语言使用得非常广泛。

图1.2 C语言的发展简史

图1.3 2014年11月“我最喜爱的编程语言”排行榜

C语言是一种功能强大的、被广泛应用的面向过程的编程语言,可用于编写系统软件和应用软件。

C语言的主要特点如图1.4所示。

如图1.4所示,C语言的诸多特点使其越来越受到广大软件开发人员的青睐,也使其成为了使用人数最多的计算机编程语言之一。学习好C语言,对于深入学习计算机科学的其他课程都是很有好处的。

图1.4 C语言的主要特点

有一次,我打开电视机准备随便看看,无意中被一部战争片吸引住了。成千上万的战士搭起云梯,想攻破一座城池。但是城楼上面的敌人负隅顽抗,拼了命地阻击进攻。双方的伤亡都很惨重,但城就是攻不下来。眼看剩下的人不多了,突然不知从什么地方开出一辆坦克,两炮就把城门轰开了。战士们趁势攻入城中,将敌人全部歼灭了。

这类电视剧比较常见,相信大家看了不止一次。但是,我看完之后,那个场景还一直留在我的脑海里。成千上万的人不如一辆坦克来得直接,说明了什么问题呢?我立马想到了一句俗语:工欲善其事,必先利其器。

的确,工具对于软件开发工程师来说,真的是很重要。好的工具能够提高开发的效率,进而缩短产品的研发周期。那么,在实际的软件研发项目中,软件开发工程师常用的工具软件有哪些呢?

Microsoft Visual Studio(VS)是美国微软公司的开发工具包系列产品。它是一个较为完整的开发工具集,包括了整个软件生命周期中所需要的大部分工具,如集成开发环境(IDE)等。

Microsoft Visual C++ 6.0(VC或者VC6.0),是微软推出的一款C++编译器,将“高级语言”(如C、C++等)翻译为“机器语言”的程序。它是一个功能强大的可视化软件开发工具,已成为大多数专业程序员进行软件开发的首选工具之一。现在的最新版C++编译器集成在Microsoft Visual Studio 2015软件里面。

用Microsoft Visual C++ 6.0软件打开的代码如图1.5所示。

图1.5 用Microsoft Visual C++ 6.0软件打开的代码

鉴于使用Microsoft Visual Studio/Microsoft Visual C++ 6.0进行软件开发的人员很多,有热心人士为其开发了一款叫做Visual Assist X的插件。Visual Assist X是一款非常好的Microsoft Visual Studio/Microsoft Visual C++ 6.0插件,支持C、C++、Java等语言,能够自动识别各种关键字、系统函数、成员变量,同时能够自动给出输入提示、标示错误、更正大小写错误等,有助于提高开发效率。

Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C、C++、Java等程序的分析。它能够分析你的源代码,并自动为你显示有用的上下文信息。

Source Insight不仅是一个强大的程序编辑器,还提供了最快速的对源代码的导航信息。该工具被视为如今最好用的语言编辑器之一。

用Source Insight软件打开的代码如图1.6所示。

图1.6 用Source Insight软件打开的代码

Notepad++是一款很有特色的Windows环境下免费开源的代码编辑器。除了可以用来制作一般的纯文字说明文件之外,也十分适合用作代码程序的编辑器。

Notepad++极具特色的一个功能就是语法的高亮度显示,方便了对关键词语的阅读。它支持的语言包括C、C++、Java等。

用Notepad++软件打开的代码如图1.7所示。

图1.7 用Notepad++软件打开的代码

1.Araxis Merge

当程序代码比较多(成千上万行)的时候,我们想要了解最新代码与之前某个时期的代码的不同之处,并不是一件容易的事情。这样,代码比较工具就应运而生了。Araxis Merge和Beyond Compare是两款用得较多的代码比较工具。

Araxis Merge是一个可视化的文件比较、合并和同步的软件,能够方便地被软件工程师用于快速精确地比较不同版本的源文件。此外,它还能被用于进行版本和质量控制。

用Araxis Merge软件进行代码比较如图1.8所示。

2.Beyond Compare

Beyond Compare是一套由Scooter Software推出的软件,主要用于文件之间的比较。对于软件开发工程师来说,它可以用来发现不同版本代码或文档的不同,使用起来非常方便。

图1.8 用Araxis Merge软件进行代码比较

用Beyond Compare软件进行代码比较如图1.9所示。

图1.9 用Beyond Compare软件进行代码比较

Evernote(印象笔记)是2012年5月10日由Evernote公司推出的一款产品,具有储存重要资料、剪辑网页、图片搜索等功能。

对于软件开发工程师来说,Evernote可用于记录阅读过的重要技术书籍的笔记、在工作过程中的一些想法,以及软件实践或论文等。

Evernote软件的界面如图1.10所示。

图1.10 Evernote软件的界面

在工作过程中,我们会不时地需要用FTP工具来上传或下载一些东西。FileZilla是软件开发工程师用得较多的FTP工具之一。

FileZilla是一款免费的、开源的FTP软件,分为客户端版本和服务器版本两种。它具备所有的FTP软件功能,使用起来非常方便、快捷,曾在2002年11月获选为当月最佳推荐专案。

FileZilla软件的操作界面如图1.11所示(在使用的时候,需要输入正确的主机IP地址、用户名和密码,端口号一般使用默认的21)。

图1.11 FileZilla软件的操作界面

在实际的软件开发过程中,UltraEdit也是一款经常会使用到的工具软件。它是一款功能十分强大的文本编辑器,可以用于编辑文本、十六进制、ASCII码等。当然,用它来编写C/C++代码也是十分方便的。

用UltraEdit软件打开代码之后的界面如图1.12所示。

好的工具对于软件开发工程师来说,就像优良的战斗武器对于战士一样重要。善于利用优秀的工具,可节省开发时间、提高我们办事的效率,进而提高软件产品的质量。因此,掌握一些常用软件的使用方法是非常重要的。

图1.12 用UltraEdit软件打开代码

本章对C语言的发展历史、C语言的主要特点,以及软件开发工程师常用到的工具软件进行了详细的介绍。本章对后续章节起到了一个抛砖引玉的作用。


踏出校门,对于我们整个学习生涯来说,只是“万里长征走出了第一步”。为了使得之后学习和工作的道路走得更加顺畅,我们需要认清自身所学知识的不足,我们需要破除一些有关软件开发的错误观念,我们更需要在学校里面就未雨绸缪地开始培养工作所需的一些技能。

我在走出校门的时候非常“轻狂”,认为自己在学校里面已经学得够多了,工作就只是“小菜一碟”。但在工作中屡次碰壁之后,我才发现自己当时的很多想法都是不成熟的。我们踏上工作岗位,一切几乎都要从零开始。

对于大家“非常熟悉”的C语言来说,我们在学校里面学到的只是皮毛,远远不能满足实际软件开发工作的要求。

我们在学校里面学到的典型的C语言程序如下:

#include <stdio.h>
void main()
{
   float fac(int n);
   int n;
   float y;
   printf("input an integer number: ");
   scanf("%d", &n);
   y = fac(n);
   printf("%d!=%10.0f\n", n, y);
}
float fac(int n)
{
   float f;
   if(n<0)
   {
      printf("n<0, dataerror!");
   }
   else
      if(n == 0 || n == 1)
      f=1;
   else
      f=fac(n-1)*n;
   return(f);
}

对于以上程序,至少存在如下几个问题。

第一,变量命名不规范,而且没有初始化。对于该程序,main函数里的变量n、y,fac函数里变量f的命名均不规范,不能让人一眼就看出它是什么意思、要做什么操作。这对于一小段程序来说,影响还不是很大,但如果代码行数达到数千行甚至上万行,那么阅读起来就比较的费力。另外,以上3个变量只是定义了,并没有初始化,这在实际项目中也是不允许的。

第二,函数的命名不规范,且没有在主函数开始之前进行声明。本程序中的fac函数要做什么操作?通过阅读代码,我们知道该函数的功能是计算一个整数的阶乘。在实际项目中,函数命名非常重要,因为很多项目涉及函数个数较多,如果不能通过函数名称来了解其作用,而必须通过阅读代码才能获悉,那么工作效率是很低的。此外,我们一般不在函数调用者的内部来对被调函数进行声明,而是将声明放在外部,最好新建一个头文件(.h文件)来对程序里出现的函数进行声明。

第三,程序代码排版不工整,“ if…else”语句书写不规范。在fac函数中,代码的排版不工整。第一个if语句下面的大括号应该与“if”关键字保持在同一列上,第二个“else”关键字应该与第二个“if”关键字保持在同一列上,“f=1;”和“f=fac(n-1)*n;”应该再缩进4个空格。另外,“if”和“else”关键字下面的执行语句不管有多少行,都应该用“{}”括起来,以方便阅读。

第四,程序注释过少,函数开头没有注释。一般说来,在程序的关键语句的前面或右边,都应该添加适当的注释,这对程序的理解有辅助的作用。函数fac的前面应该加注释,说明此函数的功能、输入/输出参数、返回值、修改记录等。在整个程序的开头也要添加版本信息、修改记录等注释信息,以方便日后查阅。

第五,程序中出现了“printf”、“scanf”和“main”函数。这是大家都习以为常的,但在实际的项目中,几乎不可能出现这3个函数。因为很多公司都有自己的开发平台,而且代码都达到数千行,甚至上万行,再加上大部分都不是基于VC开发的,你在哪里去输入,又在哪里去看输出呢?我一进公司,最开始看到程序,就想去找“printf”、“scanf”和“main”,但这是徒劳的,因为根本就没有。关于输入/输出,开发中会有专门的消息处理流程来处理,大家需要知道的就是一个完整的代码工程中不一定非要有上面的3个函数(但本书为了给大家介绍C语言的相关知识,在程序仍然使用这3个函数)。

短短的几十行代码,就出现了这么多大家“没有想到”的问题。

看到以上的分析,也许你会很惊慌:我以前的C语言难道是白学了?

非也!我举这个例子,不是为了给大家当头一棒,让大家觉得软件开发是多么高深和艰难。我只是想说明,对于C语言,我们还有很多不知道的东西,即使是自己知道的,也与实际工作存在较大的偏差,因此大家要虚心学习。我和大家一样,也经历了最开始的惶恐阶段,而后才逐渐去改变了自己“根深蒂固”的观念。“知错能改,善莫大焉”啊!

要让我们做事情的能力能够有所提升,观念的转变是关键。

从学生转变为职业人的过程是很艰难的,因为我们要与自己积累了多年的“老毛病”作斗争,这些“老毛病”包括:做事拖拉、不守时、不遵守规则、怕吃苦等。就像发射火箭卫星一样,摆脱重力的束缚所花费的燃料是最多的,一旦成功,那么以后的流程就会比较轻松了。所谓“万事开头难”,也就是这个道理。

那么,要想掌握工作中C语言的基本技能,我们需要破除哪些错误观念呢?如图2.1所示。

图2.1 我们需要破除的错误观念

错误观念一:我的C语言学得很好。

很多刚走出学校的、准备从事软件开发的人都持有这样的观念,因为他们在学校考试都得了高分。但想法是美好的,现实是残酷的。真正到了工作岗位,你就会发现,自己在学校学的那些知识是十分有限的,根本不足以应对工作。例如,C语言中的指针、结构体、异常保护这些,学校里面讲得很少或者不深入,大家也没有太注意,只是应付了考试,但工作中我们需要时时与它们打交道。你还说自己学得好吗?

因此,为了个人的技术积累和职业发展,我们一定要谦虚,要虚心学习。

错误观念二:编程是很简单的事情。

持这种观点的人,也是受到了学校教育的影响,因为书本上面的代码都很短,而且比较简单。但在工作中,也这么简单吗?非也。

我总结了一下,教材上的程序与实际工作中的程序至少有以下几点不同。

第一,代码行数的多少。

教材中的代码一般为几十行,多则一两百行,大家当然会觉得简单;而工作中的代码少则几千行,多则上万行,两者根本不是同一个数量级的。我最开始拿到程序的时候,脑袋就晕了:怎么这么多代码呢?我从没看到过。

第二,变量及函数的命名。

这是两者的最大不同,也是“专业”和“业余”的重要区别。在教材中,经常的命名有这几个:“int i;”、“char *p;”、“float f;”、“int f(int a,int b)”等,大家都已经习以为常了。但在实际的开发中,命名方式却大有不同。在工作中,我们要严格按照编程规范来办事,对变量及函数的命名不能想当然。这在后续的章节中会有详细的说明。

第三,程序的注释。

这也是很让人头痛的事情。教材上面的程序比较短,因此注释少,这也给大家引入了一种错觉:注释的有无和多少不重要。但在工作中,我们要时刻记住:在一些重要的程序语句附近,一定要有注释。不仅如此,注释的写法也有多种,在不同的地方,写法是不一样的。简短而清晰的注释可以提高大家阅读代码的速度,进而提高了工作效率。

第四,输入/输出语句。

在教材上,几乎每个程序都有“scanf”和“printf”这两个函数,用于读入和输出数据,大家用得是津津有味,如果哪个程序没有这两个函数,反而会觉得奇怪。但在实际的项目代码中,几乎不存在这两个函数的,而代之以其他方式来进行输入和输出。在刚开始的时候,你也许会觉得难以接受,但慢慢熟悉之后,你就会知道这是什么原因了。

第五,程序的样式。

在教材上,一段程序没有什么样式可言,只要实现需要的功能即可。这也给大家带来了误解,认为编程只注重功能,其他什么的都可以“随心所欲”。但在工作中,对于程序的版式、布局都是有严格规定的,哪里应该缩进(以及缩进几个空格)、哪里应该留空格、哪里应该留空行,都是要注意的。这就像一个人一样,光说自己肚子里“有货”还不行,还需要注意外表,要让大家看起来觉得很舒服,所谓的“内外兼修”,就是这个道理。

错误观念三:我只要把代码写好就行了,其他的就不用管了。

大家也许会认为,开发工程师只负责写程序,其他的什么测试啊、写文档啊,就不必自己操心了。其实不然。

在工作中,开发工程师的工作是很多的,编写代码只是一小部分。在编写代码之前,我们要对软件进行详细设计;在代码写完之后,不能马上把它交给测试人员来测试。很多新手写完代码就了事,这是不对的。我们要首先进行自测,这会花费比较长的时间,甚至比写代码的时间还要长很多,等自测无误之后,才能正式提交。

除了写代码和自测,我们还要编写相关的开发文档。你也许会认为写文档是文档工程师的事情,非也,这是开发工程师要干的。

另外,我们从开始写代码到最后提交,都要严格遵守项目的管理流程,不能放任自流,要在规则之下来做事情。

错误观念四:公司会安排好我的职业道路。

每个人进入公司,都会有相应的入职培训,这其实就是公司对应届毕业生进行所谓的“洗脑”的过程。培训老师会给大家讲,公司是多么多么好,公司会针对每个员工制定好培养计划,让大家在适合自己的职业轨道上发展。

但是,当你发现坐在你旁边的员工已经入职10年,可是还做着和你一样的工作时,你对公司美好的幻想瞬间就破灭了。确实,不管是在学校,还是在工作单位,我们不要指望学校或公司能够将未来的道路给安排好,而要靠自己不断地努力去实现自身的价值。

科学技术日新月异,新的软件开发技术层出不穷。从事软件开发这一行,我们就要马不停蹄地学习,任何寄希望于他人或公司的想法都是不可取的。

“磨刀不误砍柴工”,在树立了正确的观念之后,我们学习工作中的C语言就容易多了。

在新员工刚进入公司的时候,一般都会有一段时间的试用期,也叫做培训期。对于大部分IT企业来说,这个试用期大体分为3个阶段:第一阶段,企业文化、办事流程、公司业务范围等的培训;第二阶段,工作所需专业知识的培训;第三阶段叫做“以师带徒”,也就是由一位老员工带着来从事具体的开发工作。

但是,我们不能奢望通过这个短短的培训期就能够将工作中所需的技能全部掌握,因为学习重在长期的积累,个人习惯的改变更是一个漫长而痛苦的过程。这就需要我们在学校里面就有目的性地培养工作所需的方方面面的东西。

总的说来,工作所需的一些软技能(即除专业技能之外的一些影响个人工作和发展的技能)如图2.2所示。

图2.2 工作所需的一些软技能

那么,我们如何在学校里面有针对性地培养如图2.2所示的各种能力呢?

第一,对于实践性较强的一些课程(如程序设计课程、算法课程、网络课程、数据库课程等),一定不能只求考试通过,要多问为什么、多动手编写程序。

有一位学弟发来邮件向我咨询一些问题,其中有个问题是这样的:

看书学技术的时候有时还是很有成就感的,特别是敲代码实现一些小的算法的时候,感觉很舒服。但是看得时间长了偶尔就会感觉枯燥,耐不住寂寞。

想必很多人都有类似的感触。我的答复是这样的:

如果你在学校写点程序就会觉得枯燥的话,在工作中你会觉得更枯燥。如果你从事软件开发工作,那么几乎每天都要和程序打交道,需要相当大的韧性才能坚持得住。

如何才能既学到技术,又不感觉到枯燥呢?根据我个人的经验,可以参考图2.3。

图2.3 一个学习的良性循环

打个比方来说,你要学习C语言,那么首先要选一本好的参考书,对于书上的程序或课后的习题,你要亲自敲到电脑里面来运行。慢慢熟悉之后,你对编程会有一些心得体会,这时你就可以将这些心得体会写成博客发表出去。写博客又会促使你去学习新的东西,别人的评论也会让你受益。如此不断地循环(根据个人的经验这是一个良性循环),自身能力会不断提高,你会发现学习技术是一件很有趣的事情。

如果你觉得书本上的题目太简单,可以利用我们最强大的老师(网络)去寻找一些实际的软件开发项目来做。此外,很多开源社区也是一个很不错的选择。

“问渠那得清如许,为有源头活水来”,我们只有不断地输入和输出知识,才能让自身充满活力。

第二,适当地参加一些社团活动或集体活动,利用假期(如寒假或暑假)到外面去做兼职。

很多学生做兼职的目的就是去挣钱,而不管所做的工作的内容是怎样的,这就有点舍本逐末了。通过恰当的兼职及社团活动,我们不仅能够学到一些书本上没有的知识(或者是能够看到书本知识在实际中的应用),还能够培养自己与人打交道的能力以及调节工作压力的能力。当然,在校学知识是最主要的,要在不影响学习的情况下去做兼职和参加课外活动。

第三,打好专业基础,在高年级的时候争取能够到企业里面去实习。

绝大部分学生在学校学习的最终目的是就业,也就是要走出校门,进入企业。因此,如果你在毕业之前能够有一段到企业里面去实习的经历,那么这必将丰富你的人生经历,让你在毕业求职的路上快人一步。

能够去单位实习,从侧面来说也是对你在校学习成果的一种认可。因此,大家一定要将自己的专业课学好,让企业认为你是一个可以培养的人。

通过一份比较有份量的实习,我们不仅能够学到专业知识、企业运作流程,还能够提高自己的动手能力、表达能力、团队协作能力等,同时也可以为自己的简历增加亮点。李开复老师也多次强调了大学生实习的重要性。

本章作为一个过渡章节,从认清自身所学C语言知识的不足入手,接着让大家破除几个有关软件开发的错误观念,然后让在校学生有意识地培养工作所需的一些软技能。认清自身的不足让人谦虚,破除错误观念让人不惑,培养技能让人信心百倍。现在,我们可以正式开启软件项目实践中C语言的学习征程了。


[1] 有关丹尼斯·里奇(Dennis Ritchie)的介绍:http://baike.baidu.com/link?url=z269tG9seetPYaYGAZ4IhiRzNBvqEJ3TsGpDR52A-O4h4ZH7MaIY_GmiEfeZpPqy-A6HNwDSODkd9kiuD1Gc2wS9pV4WRs3TehzE0vSmslwbdhPmx_p12rPfuY8pLglr.

[2] CodeForge网站公布的2014年11月“我最喜爱的编程语言”排行榜:http://developer.51cto.com/art/201411/458085.htm.

[3] C语言:http://baike.baidu.com/link?url=5SDVzLyztnJkKQNkNrrJIpalUFmr5CBgNMn0UUco8m1p31SeE72uMpnNRD4TqUZb5HRbzuFkQSzQ4W8rJ39S.

[4] PCLint:http://baike.baidu.com/link?url=2zP0DIrJu6-yIhMdY6YxKqRa6Our8sm-oH2JIW4SomjDa9yDMkA_AJw-mXtTegkAn449KR5ZC6rEA9QHlv__oa.

[5] 谭浩强.C程序设计(第4版).清华大学出版社,2010.6.

[6] 林锐,韩永泉.高质量程序设计指南:C++/C语言(第3版)(修订版).电子工业出版社,2012.10.

[7] [美]Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein.算法导论(原书第2版).机械工业出版社,2006.9.

[8] 陈慧南.算法设计与分析:C++语言描述(第2版).电子工业出版社,2012.8.

[9]结构化查询语言(SQL):http://baike.baidu.com/link?url=fMtSWxR4Jl9DzweXIQckJnNY6-V87BDcUBoSDReWdsljp5inSjzDrYw_WWGwPqvL3F1Z-qiglgo4v5Cm7iSQMSs5xkMnFi78fL1nCv2NXphRU1FiXfF0OQss4MSHroV3GcEEBwH5ZSdUPgPYUz6Yrq.

[10] [美]弗雷德里克•布鲁克斯.人月神话.清华大学出版社,2002.11.

[11] 吴军.浪潮之巅(第2版).人民邮电出版社,2013.7.

[12] 吴军.数学之美.人民邮电出版社,2012.5.

[13] 刘未鹏.暗时间.电子工业出版社,2011.8.

[14] 范钢.大话重构.人民邮电出版社,2014.4.

[15] 鸟哥.鸟哥的Linux私房菜基础学习篇.人民邮电出版社,2010.7.


相关图书

代码审计——C/C++实践
代码审计——C/C++实践
C/C++代码调试的艺术(第2版)
C/C++代码调试的艺术(第2版)
大规模C++软件开发 卷1:过程与架构
大规模C++软件开发 卷1:过程与架构
C/C++程序设计竞赛真题实战特训教程(图解版)
C/C++程序设计竞赛真题实战特训教程(图解版)
C/C++函数与算法速查宝典
C/C++函数与算法速查宝典
C程序设计教程(第9版)
C程序设计教程(第9版)

相关文章

相关课程