在刚入职的时候,我与一个工作多年的老员工之间有以下一番对话。
老员工:“你的C语言功底如何?”
我:“还可以,考试考了九十多分。”
老员工:“你觉得编码规范重要吗?”
我:“什么编码规范?我之前没听说过呢。”
老员工:“你觉得把代码写完并运行通过,你的工作就算结束了吗?”
我:“差不多吧,在学校里面程序运行没问题就OK了。”
老员工:“对于测试,你是怎么理解的?”
我:“测试就是看程序运行是否正常,看输出结果是否正确。”
也不知道当时那位老员工听了我的回答,是什么感受。如今回忆起来,那时的我对自己将要从事的工作的理解是很不成熟的。
在工作的过程中,我发现我们在学校里面学到的很多东西比较片面肤浅,根本达不到岗位的要求。像编码规范、研发流程等学校里几乎不提及的知识,在实际的软件开发项目中却恰恰是异常的重要。
在学校里面,我们欠缺的教育主要包括以下几个方面。
第一,对编码规范的要求。在计算机编程课上,老师只要求学生能够编写程序实现既定的功能即可,几乎不会对编码规范提出要求,而编码规范是一般软件项目中最基本的要求。
第二,对动手能力的要求。学校里面学完一门课程之后,只要考试通过就行了,至于这门课程有什么实际的用途,很少有人关心。这就导致很多人考试得了高分,但让他们动手编写一个程序却出现了困难。一般的软件公司对个人的动手能力是十分看中的,这就是为什么他们喜欢招有工作经验的人的原因。
第三,对研发流程的讲授。软件开发并不仅仅是编写代码那么简单。学校里的老师只会教学生怎样写出代码,但很少会教他们一个实际的软件项目是怎么回事。其实,编码只是软件研发中一个很小的部分,而诸如设计、测试等还会占据很大一部分时间。
第四,对团队精神的培养。老师一直教导我们要独立完成作业,考试的时候不要交头接耳。而公司里面,我们是在一个团队里面工作,我们要与各个成员合作来完成任务或解决问题。在很多时候,我们编写的模块要与其他模块配合来实现特定的工作,这也是在考验团队之间的协作是否有默契。
第五,对情商的培养。学校的一个主要任务是让学生学到专业知识,让学生有一技之长,除此之外的其他方面都是次要的。但在工作岗位上,除了工作,我们要与不同的人打交道,还会遇到很多问题,这些都是对个人情商的考验。很多人在学校里面表现得很优异,但在工作中一遇到困难就怨天尤人、哀声叹气的,这就是因为缺少在情商方面的锻炼。
当然,我也是一样,在走出校门的时候踌躇满志,以为世界尽在我手中。但在工作上遇到一系列问题之后,我逐渐改变了自己对软件开发的很多看法。作为过来人,我有义务将所学到的经验分享给大家,让大家在软件开发这一条道路上走得更顺畅一点。
踏出校门,对于我们整个学习生涯来说,只是“万里长征走出了第一步”。为了使得之后学习和工作的道路走得更加顺畅,我们需要认清自身所学知识的不足,我们需要破除一些有关软件开发的错误观念,我们更需要在学校里面就未雨绸缪地开始培养工作所需的一些技能。
“认清自身不足”
我在走出校门的时候非常“轻狂”,认为自己在学校里面已经学得够多了,工作就只是“小菜一碟”。但在工作中屡次碰壁之后,我才发现自己当时的很多想法都是不成熟的。我们踏上工作岗位,一切几乎都要从零开始。
对于大家“非常熟悉”的C语言来说,我们在学校里面学到的只是皮毛,远远不能满足实际软件开发工作的要求。
我们在学校里面学到的典型的C语言程序如下:
对于以上程序,至少存在如下几个问题。
第一,变量命名不规范,而且没有初始化。对于该程序,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语言的基本技能,我们需要破除哪些错误观念呢?如图1.1所示。
图1.1 我们需要破除的错误观念
错误观念一:我的C语言学得很好。
很多刚走出学校的、准备从事软件开发的人都持有这样的观念,因为他们在学校考试都得了高分。但想法是美好的,现实是残酷的。真正到了工作岗位,你就会发现,自己在学校学的那些知识是十分有限的,根本不足以应对工作。例如,C语言中的指针、结构体、异常保护这些,学校里面讲得很少或者不深入,大家也没有太注意,只是应付了考试,但工作中我们需要时时与它们打交道。你还说自己学得好吗?
因此,为了个人的技术积累和职业发展,我们一定要谦虚,要虚心学习。
错误观念二:编程是很简单的事情。
持这种观点的人,也是受到了学校教育的影响,因为书本上面的代码都很短,而且比较简单。但在工作中,也这么简单吗?非也。
我总结了一下,教材上的程序与实际工作中的程序至少有以下几点不同。
第一,代码行数的多少。
教材中的代码一般为几十行,多则一两百行,大家当然会觉得简单;而工作中的代码少则几千行,多则上万行,两者根本不是同一个数量级的。我最开始拿到程序的时候,脑袋就晕了:怎么这么多代码呢?我从没看到过。
第二,变量及函数的命名。
这是两者的最大不同,也是“专业”和“业余”的重要区别。在教材中,经常的命名有这几个:“int i;”、“char *p;”、“float f;”、“int f(int a,int b)”等,大家都已经习以为常了。但在实际的开发中,命名方式却大有不同。在工作中,我们要严格按照编程规范来办事,对变量及函数的命名不能想当然。这在后续的章节中会有详细的说明。
第三,程序的注释。
这也是很让人头痛的事情。教材上面的程序比较短,因此注释少,这也给大家引入了一种错觉:注释的有无和多少不重要。但在工作中,我们要时刻记住:在一些重要的程序语句附近,一定要有注释。不仅如此,注释的写法也有多种,在不同的地方,写法是不一样的。简短而清晰的注释可以提高大家阅读代码的速度,进而提高了工作效率。
第四,输入/输出语句。
在教材上,几乎每个程序都有“scanf”和“printf”这两个函数,用于读入和输出数据,大家用得是津津有味,如果哪个程序没有这两个函数,反而会觉得奇怪。但在实际的项目代码中,几乎不存在这两个函数的,而代之以其他方式来进行输入和输出。在刚开始的时候,你也许会觉得难以接受,但慢慢熟悉之后,你就会知道这是什么原因了。
第五,程序的样式。
在教材上,一段程序没有什么样式可言,只要实现需要的功能即可。这也给大家带来了误解,认为编程只注重功能,其他什么的都可以“随心所欲”。但在工作中,对于程序的版式、布局都是有严格规定的,哪里应该缩进(以及缩进几个空格)、哪里应该留空格、哪里应该留空行,都是要注意的。这就像一个人一样,光说自己肚子里“有货”还不行,还需要注意外表,要让大家看起来觉得很舒服,所谓的“内外兼修”,就是这个道理。
错误观念三:我只要把代码写好就行了,其他的就不用管了。
大家也许会认为,开发工程师只负责写程序,其他的什么测试啊、写文档啊,就不必自己操心了。其实不然。
在工作中,开发工程师的工作是很多的,编写代码只是一小部分。在编写代码之前,我们要对软件进行详细设计;在代码写完之后,不能马上把它交给测试人员来测试。很多新手写完代码就了事,这是不对的。我们要首先进行自测,这会花费比较长的时间,甚至比写代码的时间还要长很多,等自测无误之后,才能正式提交。
除了写代码和自测,我们还要编写相关的开发文档。你也许会认为写文档是文档工程师的事情,非也,这是开发工程师要干的。
另外,我们从开始写代码到最后提交,都要严格遵守项目的管理流程,不能放任自流,要在规则之下来做事情。
错误观念四:公司会安排好我的职业道路。
每个人进入公司,都会有相应的入职培训,这其实就是公司对应届毕业生进行所谓的“洗脑”的过程。培训老师会给大家讲,公司是多么多么好,公司会针对每个员工制定好培养计划,让大家在适合自己的职业轨道上发展。
但是,当你发现坐在你旁边的员工已经入职10年,可是还做着和你一样的工作时,你对公司美好的幻想瞬间就破灭了。确实,不管是在学校,还是在工作单位,我们不要指望学校或公司能够将未来的道路给安排好,而要靠自己不断地努力去实现自身的价值。
科学技术日新月异,新的软件开发技术层出不穷。从事软件开发这一行,我们就要马不停蹄地学习,任何寄希望于他人或公司的想法都是不可取的。
“磨刀不误砍柴工”,在树立了正确的观念之后,我们学习工作中的C语言就容易多了。
“工作所需软技能的培养”
在新员工刚进入公司的时候,一般都会有一段时间的试用期,也叫做培训期。对于大部分IT企业来说,这个试用期大体分为3个阶段:第一阶段,企业文化、办事流程、公司业务范围等的培训;第二阶段,工作所需专业知识的培训;第三阶段叫做“以师带徒”,也就是由一位老员工带着来从事具体的开发工作。
但是,我们不能奢望通过这个短短的培训期就能够将工作中所需的技能全部掌握,因为学习重在长期的积累,个人习惯的改变更是一个漫长而痛苦的过程。这就需要我们在学校里面就有目的性地培养工作所需的方方面面的东西。
总的说来,工作所需的一些软技能(即除专业技能之外的一些影响个人工作和发展的技能)如图1.2所示。
图1.2 工作所需的一些软技能
那么,我们如何在学校里面有针对性地培养如图1.2所示的各种能力呢?
第一,对于实践性较强的一些课程(如程序设计课程、算法课程、网络课程、数据库课程等),一定不能只求考试通过,要多问为什么、多动手编写程序。
有一位学弟发来邮件向我咨询一些问题,其中有个问题是这样的:
看书学技术的时候有时还是很有成就感的,特别是敲代码实现一些小的算法的时候,感觉很舒服。但是看得时间长了偶尔就会感觉枯燥,耐不住寂寞。
想必很多人都有类似的感触。我的答复是这样的:
如果你在学校写点程序就会觉得枯燥的话,在工作中你会觉得更枯燥。如果你从事软件开发工作,那么几乎每天都要和程序打交道,需要相当大的韧性才能坚持得住。
如何才能既学到技术,又不感觉到枯燥呢?根据我个人的经验,可以参考图1.3。
图1.3 一个学习的良性循环
打个比方来说,你要学习C语言,那么首先要选一本好的参考书,对于书上的程序或课后的习题,你要亲自敲到电脑里面来运行。慢慢熟悉之后,你对编程会有一些心得体会,这时你就可以将这些心得体会写成博客发表出去。写博客又会促使你去学习新的东西,别人的评论也会让你受益。如此不断地循环(根据个人的经验这是一个良性循环),自身能力会不断提高,你会发现学习技术是一件很有趣的事情。
如果你觉得书本上的题目太简单,可以利用我们最强大的老师(网络)去寻找一些实际的软件开发项目来做。此外,很多开源社区也是一个很不错的选择。
“问渠那得清如许,为有源头活水来”,我们只有不断地输入和输出知识,才能让自身充满活力。
第二,适当地参加一些社团活动或集体活动,利用假期(如寒假或暑假)到外面去做兼职。
很多学生做兼职的目的就是去挣钱,而不管所做的工作的内容是怎样的,这就有点舍本逐末了。通过恰当的兼职及社团活动,我们不仅能够学到一些书本上没有的知识(或者是能够看到书本知识在实际中的应用),还能够培养自己与人打交道的能力以及调节工作压力的能力。当然,在校学知识是最主要的,要在不影响学习的情况下去做兼职和参加课外活动。
第三,打好专业基础,在高年级的时候争取能够到企业里面去实习。
绝大部分学生在学校学习的最终目的是就业,也就是要走出校门,进入企业。因此,如果你在毕业之前能够有一段到企业里面去实习的经历,那么这必将丰富你的人生经历,让你在毕业求职的路上快人一步。
能够去单位实习,从侧面来说也是对你在校学习成果的一种认可。因此,大家一定要将自己的专业课学好,让企业认为你是一个可以培养的人。
通过一份比较有份量的实习,我们不仅能够学到专业知识、企业运作流程,还能够提高自己的动手能力、表达能力、团队协作能力等,同时也可以为自己的简历增加亮点。李开复老师也多次强调了大学生实习的重要性。
从认清自身所学C语言知识的不足入手,接着让大家破除几个有关软件开发的错误观念,然后让在校学生有意识地培养工作所需的一些软技能。认清自身的不足让人谦虚,破除错误观念让人不惑,培养技能让人信心百倍。现在,我们可以正式开启软件项目实践中C语言的学习征程了。
本文摘自《C程序员从校园到职场》
《C程序员从校园到职场》
周兆熊 著
要成为一名合格的C程序员,仅仅依靠课堂上的所学所练是远远不够的,实际的软件开发对从业者提出了更高的要求。本书重在讲述从学生成长为一名职业化C程序员的必备技能和关键要素,为众多同道中人指点迷津。
本书从C语言的发展历程讲起,分析了学校和职场的不同,并结合丰富的代码实例讲述了程序的样式、变量和函数、内存操作、文件、指针和结构体、算法和协议、程序重构、SQL语句和shell命令以及程序问题排查等诸多C程序开发中的典型问题。帮助读者形成良好的编码规范,增强其动手能力,深入了解软件研发流程及团队合作的重要性。
更多程序员职业生涯规划书单
扫码查看
今日互动(仅限微信客户端参加)
职场中对你影响对大的人是谁?为什么?截止时间6月15日17时,留言+转发本活动到朋友圈,小编将抽奖选出3名读者赠送纸书1本和2张e读版80元异步社区代金券,(留言点赞最多的自动获得一张)。
推荐阅读
长按二维码,可以关注我们哟
每天与你分享IT好文。
在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程
点击阅读原文,购买图书《C程序员从校园到职场》
阅读原文