Sep 12, 2008

我的实习之旅(暑期实习论文)

首先声明:原创。无剪刀浆糊之举。如有雷同,肯定是别人抄我的,嘿嘿~~~
                    由于要上交学校,所以,情节有做很小很小的改动
 

                                            我的实习之旅

 

2008年的暑假是我过得最充实的一个暑假,转眼间将要大四,此时的我在经过一段时间的考虑后选择了毕业就业这条道路。为了使自己尽快的适应以后的工作环境,我决定慎重对待自己的暑期实习。于是,我来到了成都盛景栋力信息技术有限公司进行我为期两个月的暑期实习计划。

 

我一直相信,放弃了考研,转而打算从事计算机程序类工作的我想在三年内比我的研究生同学们学得更多,变得更强,我只有几种选择:第一是进一个大型公司,如百度,华为等,在强手如云的环境中迎难而上,慢慢的充实自己历练自己;第二种是进入一家中小型的公司,这里有比大型公司更多的机会留给你,这里你能够把自己的才能尽可能的发挥,同时还有机会学到一些管理方面的技巧;最后就是自己创业,可是我和一些同学讨论过,如果对某一行业理解不够深入,贸然创业很容易失败的,虽然有很多成功的案例,可是我们没有看到那些没有被报道出来的失败案例的。

 

是的,很长一段时间这三条以后我可以走的道路都一直在我脑海中萦绕,我很像找到答案,究竟什么是最适合我的,究竟我想要什么,究竟我该怎么做。如何得到答案,当然只有到实践中去。这次暑期实习,针对自己以后想要从事的行业,我找到了成都盛景栋力信息技术有限公司公司的负责人,经过一段时间的商谈之后,我很幸运的得到了实习的机会。这是一家规模不大的公司,但是员工很团结踏实,其中不乏高手,是一个比较好的工作环境。在实习的过程中我也不断的在思考,从而有了新的感悟。现在,就让我细细道来。

 

学习不仅仅是咬文嚼字的过程,至少对于编程一类的工作,实践往往更显得重要。我首先要声明以下言论不是攻击现有的教学制度或教材,纯属个人感受。我自己学习技术已经有两年多了,学习的过程中给我的最大体会就是你的学习如果只是根据教材上的例子做那你一般不会出错,因为谁都不会把错误教给别人,教材上的例子都是经过一次次调试确定可以通过没有错误后才放上去的,最多只是一些印刷错误。同时,由于教材教的都是一些基本的知识而很少深入(至少对于大部分书籍来讲是这样),教材注重人人都可以理解,太多人咀嚼过的东西就显得淡而无味;另外,教材上的知识一般是注重教学的,也就是说,大部分的实际意义并不大,也许很多年前老掉牙的问题教材上照样讨论得津津有味。所以,作为一个学生相当忌讳的一件事是学完教材上的东西,就自以为学富五车,才高八斗了,而实际扔给你一个题目让你实现一个功能,你就会发现原来很多问题是你不曾发现的。是的,真正到了要你完全自己动手的时候面对突如其来的许多问题,你很快就会觉得自己很无助,进而感到有那么一点绝望,有那么一点受挫,如此这般之后,你会想重新审视一下自己的所学所想。现在社会上有一些声音是批评我们大学生的,说我们是商品教育的产物,实际动手能力差得可以。刚开始听到这种言论的时候我感到及其不舒服,但是又想不到反驳的理由,总不能把责任推卸给学校吧。然而做了一些实际的项目之后我发觉其实那些觉得大学生大而无用的人其言论固然偏激,可是不无道理。于是我学会了谦卑,老老实实的检讨了自己的能力不足这一问题,同时在项目中慢慢补足,这样的过程对大学生是有益的。我最后还是要声明以上言论不是攻击现有的教学制度或教材,纯属个人感受。

 

这里我想引入一句话:“工作中所学的东西和在学校里学的是不一样的”——不只一位前辈这样告诉我。在实习过程中,我也确实发现了这一点。

 

在实际做项目的时候,我经常的被一些大大小小的问题所困扰,而这些问题的出现根本是毫无征兆。比如用VC6.0做一个登陆对话框,想来挺简单,一个对话框,几个控件,然后写些代码就行了,其实不然。当然,这其中有一部分原因也许是因为我用的开发平台比较旧,如果是用VS.NET做的话,也许不会存在这么多问题。回到登陆对话框这里,我要做的那个登陆表单上面要求填入用户帐号,姓名,服务器IP,然后提供登陆和注册两个功能,点击注册则销毁当前对话框跳出一个注册对话框,注册信息填写无误后,直接连上服务器并进入主界面。仅仅这个功能我就被卡住好几次。比如,要在两个对话框间切换,而我要在哪里设置一个可以直接结束整个软件系统的进程的关闭功能(考虑到用户可能没有账号,想注册一个,后来又取消这个念头想关闭这个软件,而关闭的功能分成关闭整个程序进程;关闭登陆对话框进入注册对话框;关闭注册对话框返回登陆对话框;关闭登陆或注册对话框进入主程序,而关闭的函数很有限因此要仔细考虑用法);如何验证两个对话框的有效性(用户账号密码不能为空,是否为数据库中存储的已注册的账号,是否可以通过该IP连上服务器);如何保证用户登陆或注册成功后进入主界面(主要是对两个对话框的操作和验证问题),如何在MDI的环境下实现不同视之间的切换等等问题。仔细考虑后就是会有这么多的疑问,编写期间当然也会有疑问跳出来,总之,问题多多。

 

是的,这就是实际的项目,面向真正的客户的项目。这时的需求是客户提出的,也许会出现千奇百怪的要求,反正绝对不会像书本上教的那样,书本上教的全是作者假设出来的客户,假设出来的需求;而实际情况中,即要满足客户的需求,又要考虑到用户实际操作中的各种可能性(因为客户一般不是专门的程序员,他们最希望的他们付钱买的软件是完全傻瓜化的操作,越简单功能越丰富越好),所以实际做项目时,要注意很多问题。下面我就把先我亲身经历的一些开发过程写出来。

 

首先,设计系统时要全面的分析。需求说明书是开发人员和客户联系的第一座也是重要的一座桥梁。在接到项目以后一般会有一次会议,开发人员代表和客户代表一起坐下来谈项目,客户代表首先提出自己的需求以及对软件的一些设想;开发人员认真听取需求并从专业的角度来向客户阐述开发的流程和工作,并给出一定的意见。然后开发人员代表根据讨论的结果起草一份用户需求说明书,提交给客户代表,审阅通过后,用户需求说明书就成为后期软件开发的重要依据。用户需求说明书不仅仅是开发人员开发过程中的参考文档,也是项目验收期间用户的参考文档,同时,如果对于开发结果不满而产生一些纠纷,用户需求说明书也是一个可以参考的依据。软件工程中各种文档都已经形成标准,可以从网上下载到很多标准文档格式进行参考。

 

其次,由于我参与开发的是一个相对较小的项目,所以没有去遵循一些权威书籍诸如《代码大全 2》中所提出的大型软件工程项目所必须遵循的一些流程,而是简化了一些步骤。通过了需求说明书后,项目的负责人,兼首席软件架构师就开始写软件开发流程说明书,软件架构分析说明书。在其中会给出软件的功能需求,模块划分,开发周期和工作制度等等内容。团队里的所有程序员都必须认真阅读需求说明书和开发流程说明书,软件架构分析说明书。接下来一般会有一次团队内部的会议,会议内容再清楚不过,就是分配任务,把划分好的模块分配到具体的一个开发人员。当然,如果对这些说明文档里的内容有疑问,也可以当面提出来,团队内部讨论后决定是否更正部分内容。会议结束后,每个开发人员要干什么活一般都清楚了,接下来就是自行安排时间,能赶得上进度就好了。

 

再次,就是编写阶段了。相信很多人现在还认为编程就是写代码吧,刚开始学的时候我也这么认为,学了一阵子之后我就发现不是这么简单。编程不仅包括写代码,那些前期的准备工作,与客户的讨论和会议,编写过程中的纠正,模块间的联调,程序员间的交流等,这些都是编程。所以这个编写阶段,不是每个分配到任务的人把自己关进小黑屋子,对着电脑狂敲键盘的过程,这样写的代码根本就没用,很孤立。真正的编写是大家在一间窗明几净的工作室里完成的,所有人在一起工作,做各自的工作。实际编写过程中经常会有一些问题出现,这时就会有两三个人聚在一起讨论;或者是模块接口方面出现了一些问题,模块的编写人员在一起讨论解决方案;或者是某一功能模块不明确或者划分不当,向小头目反应后可能会有另外一个小会来解决这个问题。使得,真正的编程是一个很快乐的过程,很多人一起编写,一起讨论,互相学习,共同进步,真的是这样的,并不是套话而已。而必须要指出的是,编写阶段一般都不会总是和当初说明文档里面的设想相一致,可能的原因很多(架构师的经验问题,考虑的不全面等等),但是偏差也不会很大(否则那些说明文档就没有存在的意义了)。在实际的编写过程中你往往会对自己所用的某一门语言,某一个IDE有了新的体会,这是你一味的学习书本上的知识所没有的体会。

 

编写好大部分代码后其实调试工作就已经要开展了。调试是一个很折磨人的过程,对于新手来说,更是“感觉像在地狱走了一回”。是的,调试就是DEBUGBUG就是软件中的不稳定因素,也可以概称为漏洞。BUG在刚写好的代码中肯定存在的(这间接证明了一个观点,那就是人肯定都会犯错误的),而BUG越早被发现越好。软件工程学中有一个观点,那就是问题在系统中存在得越久最后解决问题的成本也就越高,这是众人总结出来的观点,我认为是正确的。设想一下,一个BUG是在刚开始的几十行代码中容易被找到,还是在后来的几千行代码中容易被找到呢?答案不言而喻。而且,代码越多,就越可能出现一些编译器上的错误,还有其他的一些例如内存泄漏,访问越界等错误。这些错误如果叠加到一起,相信我,你肯定会觉得很郁闷的,郁闷到不能再郁闷,到后期BUG的出现往往令你措手不及,反复的调试过程极大的考验了你的耐性。如果能在联合调试前就尽量保证代码的质量,那就可以给后期的DEBUG过程减轻很多负担。这是让我感受很深的一个教训。我所经历的调试期虽然碰到了问题,可是问题都能很快被找出来,主要归功于各个开发人员的编程水平都经过了考验和平时多交流多探讨及时解决问题这些良好的习惯。这又给我一个启示,作为一名开发人员,提高自己的专业水平同时与他人共同进步,养成良好的开发习惯,这样对人对己都是有利无害的。

 

程序员的调试期结束后,就把编译后的软件交给客户试用调试。这就类似我们经常听到的一些字眼,“内测”和“公测”,还有软件发布中的“α版”和“β版”等,意思差不多,就是要说明一个道理,那就是软件是要经过一系列的测试的。如果程序员的调试做得好的话,用户一般是碰不到什么错误的。用户觉得满意了,项目验收就结束了,接下来就是一些结算的问题了,客户付钱,程序员收钱,这样,代码就换成银子了。这是以后我的工作,写代码的一个目的——维持生计。很实际的一件事,在以后我们工作了的时候都会这样。

 

这里我想对用户测试期说一些话。程序员把写好的软件程序交给客户使用,是一定会附上一份“用户手册”的。为什么呢,因为用户不是程序员,而且他们也没有参与编写这款软件,软件中的功能,菜单的级别,内部机制,快捷键的使用,程序员自然清楚,可是用户还不清楚啊。如果不把软件的使用方法告诉一个外行人,你认为他会用得好好的吗?肯定不会,他肯定要摸索上好一阵子才渐渐熟悉。日常生活中我们经常可以看到一些说明书,用户手册就是软件的说明书。买家电什么的都有一本用户说明书,买双耐克鞋,说明书就那么长了,何况一款软件。用户手册要怎么写呢?这就是说明文了,我们在日常生活中经常用到的文体,只要遵循一定的格式,写的时候困难不在于格式而在于你自己。我当初写用户手册时遭受了很大的困扰,总是有很多地方我认为没有必要写出来,是人都知道的事;很多地方我认为不需要特别标注,傻瓜才会犯错呢;很多地方我认为一笔带过,小处无关痛痒……现在想来那是纯粹的跟着感觉走,是一种危险的举动。我将我写的第一份用户手册交给小头目审阅,马上被打回来了,曰:“写给谁看呢,具体点”我这才把原先自以为是的地方给补上了。说明文就是这样,白菜内容,该具体的地方具体,不该具体的地方也不要简单得漏掉什么。

 

我感觉实际做项目有很多好处,首先实际的项目带给你的是更多的责任感。责任感可能来源于很多地方。因为你在做一个实际项目,你要对付你酬劳的客户负责。另外,你要对自己负责,不能再因为自己是学生而轻易的原谅自己。我想这样对个人而言是很好的,很利于成长;其次,实际做项目可以碰到很多原来没有机会碰到的问题,这些问题解决了之后你会对自己有了一种新的想法。这些问题也许会让你很受挫,但是正视这些问题,勇敢的解决它们,你会发现自己的技术有了新的提高;再次,实际做了些项目之后你会对某一行业的一些内部运行机制有了更清楚的了解,没有什么比亲身经历更让人难忘的了;最后,实际做了项目之后,很自然的你就会对这个社会有了新的理解,这和你在大学这个象牙塔里所看到的社会将会有所不同。而且随着你理解的深入,你会发现他们越来越不同。最终你会完成从一个大学生到一个职场人员的转变。

 

然而在实习中我也发现,某些人在工作之后就失去了学习的热情,变得很实际而没有太多的上进心。这对我而言是很可怕的。我总认为,不学习你就无法进步,更不能因为工作或者生活的重担,压力等等因素让你失去了学习的热情。我一直很认同一句老话“活到老,学到老”。不错,学习是一个不轻松的过程,身为学生我对此也颇有感触,但是学习带给你的感觉是任何感觉都无法比拟的。也许在学习和钻研的过程中你会感到痛苦,但是,不“吃得苦中苦”,怎能“方为人上人”?我也发现自己一个比较好的优点就是始终都想学习,以前是,现在是,将来也是,而且越长大,了解的东西越多,想要学习的也越多。学习使人丰富。我想我自己不会在工作中失去学习的热情的。

 

在实习过程中我另一个比较深的体会是团队合作的重要性。编写一个软件系统,不仅要保证所有主要的想法主要的方向统一,编写过程中也需要所有成员的交流。这就是说,一个好的团队应该首先所有的想法出自同一个大脑,其次它的四肢应该在服从大脑指挥的同时很好的协同工作。否则,我们做一个系统就好像找来一群互不认同的工匠盖房子,大家都各自盖自己的,因为彼此之间没有共同语言所以创造的过程是很枯燥的,大家都感觉自己在遵循总的原则,朝着一个总的方向前进,结果到了最后要把各自盖的部分组成一个完整的房子时才发现原来各个部分之间根本不能很好的组合在一起,排水系统,通风系统和屋子主体结构没法联合在一起,导致房子最终没法完成,只留下一堆烂摊子。是的,团队成员间的交流是重要的,特别现在的面向对象的编程过程中,都把一个系统分成几个模块,模块内再细分,然后将某部分的功能指派给一个程序员完成,模块间的通信都是通过接口实现的,如果不及时,合理的交流,两个类之间可能根本就无法通信,或者干脆就没有留有商议好的接口导致无法通信,工作当然也就完成不了了。我记得曾经有个神话传说,古巴比伦时代人们很聪明很团结,曾经他们想建一座通天塔去探索天上的秘密。这个举动惊动了天神,为了防止人类的团结危及他的统治,天神让那批建造古巴比伦通天塔的工人们彼此有不同的语言而无法向当初那样交流,最终让通天塔没法完成,人类探索天上秘密的脚步因此停住了。这样看来,天神真的很聪明,看出了人类的交流是多么的重要,交流的力量是多么的强大,让人类无法交流,人类就无法合作。而实际工作中,交流也一直占据着一个不可动摇的重要地位。

 

在实际中我也碰到了由于交流不够而产生的问题。比如在一个视上要接收用户的输入数据,然后要判定有效性和合法性(这几乎是交互时必须要做的事情了),先前这两个互留接口的模块编写人员没有好好交流,后来联调的时候会出现这个验证功能,或者两人都没写,或者两人都写了这样的情况。都写了那不是太大的问题,都没写的话问题可能就大了,可能会导致一些意料之外的错误,而调试人员要费好大的劲,绕了很多弯路才发现问题的出处。因为没有经过验证的数据会有潜在的危险,把没有通过验证的数据放行了,就好比给系统引入了一个没有钟表的定时炸弹,不知道它什么时候会爆炸,更不知道它会给系统带来什么样的破坏。所以下边的对话是大家都不愿意碰到的:

A:“哎,这怎么会溢出呢”

B:“我看看···”

过了好长一阵子,这是一段辛苦的摸索过程。

B:“你看,问题在这。这里接收的输入结构体在链表中的存储不对,你看,出现了部分非法数据,这怎么会是个这么大的负数嘛”

A:“怎么会这样,我填充了结构体后就传给你了。你接收我传过去的数据时没有验证吗”

B:“啊,我以为你写了,我就直接收了push到链表里了”

A:“……,知道了,原来是个谁都可以做的验证过程,只是我们都没有写而已”

B:“就这么个小问题浪费我们半天时间,哎,你写还是我写……改吧,早点调完早点解脱”

……

请不要觉得这段对话很搞笑,因为我做的是一个中小型的软件系统,所以出现这样的情况还是相对比较好解决的。如果是做一个大型系统,那么,如果这样的错误出现,很可能的情况是开发周期要往后推迟几星期,不幸的话,一两年都有可能,因为系统越大,问题越多,问题藏得也就越深,找到问题的所在所要花的时间和精力都将是巨大的,同时这一大段时间里大家都在为找出错误而忙的焦头烂额,同事之间的争吵和不和也油然而生,影响了团队的团结。长时间的延期也会给公司的形象造成相当一部分的损失,可能一些现有的或者潜在的客户听说了公司的某些延期项目之后会重新考虑和公司的合作,这样直接导致客户流失,公司付出的代价将是巨大的。所以,身为一个开发人员,在做项目做开发的时候一定要有一种严谨的态度,要和自己的工作伙伴合理的交流,防止这种缺少交流而出现的错误发生。

 

还有一点是必须要说明的,那就是:在实际的工作中是肯定会碰到问题的,碰到问题该怎么解决呢?以我这段时间的体会来看,我认为首先要自行求解,实在不弄不清楚再去请教高手,这是一种比较好的习惯。就像当初刚刚学习编程时候一位师兄的提醒一样,首先要自己试着去寻找答案,因为在这个寻找的过程中你往往能学习到很多知识,不管是与你的问题有关的或者是无关的知识,总之你又多学了一点。就算最后没找到答案,你已经比当初的你更丰富了;自己找不到答案,然后才拿去问别人,这是一种对待问题的比较好的方法。在实际工作中我发现网络是个很好的资源,充分利用的话足够你解决几乎所有的问题。因为网上有很多人提出了跟你或许相似的问题,也有很多人针对这些问题作了解答,这些解答有很多参考价值。回顾我的三年大学生涯(虽然还没结束),现在看来对于网络我一直没有把它用在该用的地方,虽然我不是堕落的人,但是大多数上网的时间我都是用来上浩方打DOTA(还好不是那种很浪费时间的网游例如魔兽世界之类的),聊QQ,看电影,看漫画什么的。在这次实习中我仿佛认识了一个新的网络一样。原来网络上有那么多我想要解决的问题的答案,还有那么多引导我解决问题思路的线索,有那么多牛人写的博客……原来我一直只是用了庞大的网络资源中小得可怜的一部分而已。我感觉自己是一条小鱼儿,一直一味网络就是我所游过的一条条小溪小河,如今突然闯进了汪洋大海,这才对自己之前的浅薄感到羞愧,这才有了一种相见恨晚的感觉,这才急切的想要去弥补自己的不足。

 

总的来说,这个暑假确实给我好好上了一课,让我对于这个社会,对于职业对于人生有了更多的思考和总结。写这份报告的时候,实习已经结束了,而我的心久久不能平静。大学眼看就要结束了,我是否准备好工作了;就要踏入社会了,我是否成为一个合格的社会人了;前方是哪里?我的未来将会是怎样的?一大串的新问题又出现了,但是我不会想当初那样的手足无措,我会一路前行,同时认真思考自己的前途。

 

现在我想自以为是的为自己解答几个在实习之初我问我自己的那些问题。

 

其一:究竟什么是最适合我的?

答曰:“这个地球不是以你为中心才会转的,很多时候你没法改变大环境。要寻找‘最’适合你的东西,那你是要付出很大代价而且风险也相当之大。所以,还是不要去寻找‘最’。前边提到的三条路,其实每条都可以走,但是可以先考虑前两条,有了社会经验和对某行业的谙熟这两个条件后可以再考虑创业。做事情要一步一步来。不过,目前看来有个相当适合你的存在,叫做‘学无止境’”

 

其二:究竟我想要什么?

答曰:“你不是那种甘心到老了还是个工程师的人,你想学很多东西,其中有你最喜欢的技术;同时你还想涉猎其他区域,如管理和人际,心理学等。‘池中之物’不是你最终的归宿,但是现在是重要的积累期,你要的就是一个更好的自己”

 

其三:究竟我该怎么做?

答曰:“对技术:求知的心和严谨的治学态度。

       对人:坦诚交流和互相帮助。

       对工作:认真和敢于承担起责任。

       对生活:毫无根据的热爱。”

 

最后,我衷心的祝福我的兄弟姐妹们。希望所有出国的同学们签证顺利,在国外能够过上安稳的生活;希望所有保研的同学们在这段时间辛苦过后能够保到一个好的导师名下,三年后能很好的成长;希望所有考研的同学们在残卷枯灯的考研征途上一路走好;希望所有即将找工作的同学们找到理想的好工作,同时也希望在自己以后的职业生涯中一路走好。

 

No comments:

Powered By Blogger