考完期末,我们这级的所有人都要求到拓扑集团去实习,早在很久前就知道这个事,于是到处想师兄是姐打听,拓扑那边的情况,听了后就打不想去了,本来想在公司里开个证明给学院,但是老师不让,首先就郁闷了。
在去之前所有的人都选了实习方向,可选的有JAVA,DELPHI,C#,C++,网络,看了看实习内容,反正都得去,随便选一个吧,发现JAVA,DELPHI,C#清一色的都是配合数据库做MIS系统,晕~~最讨厌这活,技术含量想对较底,但是事情却多都不选,本来想选网络,好歹我也过了CCNA实习的动问题不大吧,但是更气人的,网络有人数限制,名额早被抢光了,看看C++(算是我的老本行了),做的网络通信和串口通信,虽然以前做游戏图形做的多,串口没怎么接触,不过总比去做MIS好(后来证明我的选择是正确的),就选这个了。
5号上午我们在做上学校的包车----5架4路工交车,向拓扑出发,由于车不知道怎么回事绕道走,结果到了那已经是9点过了,刚进那看到还不错,建筑挺好看的,我门在想报道点去的路上经过了一做叫“软件孵化基地”的楼,听老师说我们的讲座,开发都在这里完成。到了包名点开始分房间,这个时候我最害怕的事情发生了,那边的宿舍有的有空调有的没有,结果我果然被分到没空调的房间,我没语言了,没办法来都来了,别人能住,自己也能住。于是到寝室看了下,环境还不错,但是就是热,中间放着两个落地式风扇,天啊,12个人一个寝室,就两个风扇,这么过,着么热的天,刚放下东西把床整理好,就有人通知马上去“孵化基地”上课,于是又急冲冲的跑到腐化基地,教师在三楼,一二楼是机房。到3楼找到我们的教室,还不错,两个3P的空调,当时有种冲动,就在教室睡,不睡寝室:)。第一课是个姐姐上软件工程。就这样上了两三天的课,后来还讲了讲开发模型和WIN32以及网络和串口的东西,都很基础,毕竟时间有限。吃饭也比较郁闷,说实话其实伙食还是不错了,两天一个鸡腿,每顿都有荤有素,搭配的还可以,但是吃饭的地方离上班和寝室太远了,走到的时候都不想吃了,程序员本来时间就不够用,吃饭都紧张,把时间浪费在走路上太不值了。
到了第三天,开始做项目了,组是提前分好了的,来的时候我就发现我门这级所有的牛人选的都是这个方向,说是牛人但是真正做过商业项目的找不出几个,我还勉强装个高手,但是我明白这个班没有谁是菜鸟的,所以也很充满信心,所有的女生都在我们这组(本来女生选这个方向的我就很佩服她了),我想也好男女搭配,工作不累呵呵。后来也不知怎么的就当上项目经理了,这活可不轻松,以前看别人做不觉得,自己体会后才知道。我们做的项目是交通灯模拟,其实就是有3台计算机PC1,PC2,PC3,本来应该只要两台,但是由于没有LED显示屏没办法,只有用第三台PC来代替。PC1,PC之间通过SOCKET进行通信,PC2再把收到的信息通过串口转发PC3,让PC3上的服务器解析再显示相应的信号。我们花了半天的时间做需求,然后定制了我们的通信协议,然后开始编写,我们组中有个女生比较猛,没写过WIN32程序,我给她将了一会儿就上手了,佩服。我最先是负责的PC上的服务器和网络通信,我花了一下午写出了PC2Server,调试基本通过,当然自己做了个模拟的客户端,这个时候由于服务器和客户端是单对单,所以我也占时没发现什么问题,过去看看那位没女,客户端也出来了,效率还不错:),可是我和她的程序进行连接时却大跌眼睛,我打开她的代码一看,她用的是MFC的CSocket编写,(本来CSocket其实封装的很好,但是由于自己平时做游戏程序更习惯使用WIN32API,虽然很繁杂但是很灵活自己可以任意封装,所以我是直接用socket开发包),所以连接时肯定有问题,然后我让她看我写的模拟客户端和我的服务器通信没问题,于是我说干脆用我这边的写法,她同意了,于是返工,这个女孩真的不简单,第一次用VC写程序,不一会而又写完了,这次就对了,我和她的程序同信没问题,但是马上就又郁闷了,我发现服务器在开启后关闭再开启客户端就不能和服务器通信了,我立刻检查代码,我最先采取的是多线程来处理客户端的请求,问题就在这儿,我必须每一次建立一个额外的监听套节子来监听网络消息,而每次也必须释放原有的,而这些操作按照多线程的解决方案封装起来很难做,于是我想到了异步模式,我自定义了消息来处理网络事件,然后将窗口句柄传给异步函数,这样当网络上有消息来的时候消息就回自动传给窗口,窗口会自动调用消息响应函数,然后作出正确的处理,这样做有很多好处,首先全局只建立一个监听套节字,不用多线程,而且我用一个数组来保存客户端的连接,相当于一个队列,可以很稳定的 应付多个客户端的连接,当一个短开后,只需要从Socket队列中删除掉一个就可以了,很稳定,系统也不会有额外开销,我调试后解决了问题,总算是完成了一部分。接下来是串口通信,无非有两种实现方式,一种是用API直接操作串口,这种方法很灵活,唯一要注意的就是对数据的效验,着很重要,这个项目最后让我更加认识这点;另一种是用微软的ActiveX控件MSCOMM来操作,本来我想用API来实现,但是本组的另一个牛人,先用MSCOMM控件实现了通信,于是我就没有再写,开始级成,与此同时PC上的图形显示另一个人也在做。我们写代码和调试一共只用了一天半的时间,胜下的时间才是关键,才体现了团队的重要,而这当中最关键就是PC2Server和PC3的继承,也就是串口的通信,真正的战斗开始了,最初我的PC2通过串口转发的信号PC3能正确的接收到,我门很高兴,但是我们高兴的太早了,因为我们传的字节很小,所以串口可以很快的传输,但是后来我们经过多次调试发现有时候的数据传过来是乱码或者根本收不到,刚开始以为是线路问题,于是用超级终端测试,豪无问题,这不得不让我对串口的稳定自己的程序产生怀疑,我们写错了?到这个时候我们遇到了这个项目最大的问题,直到项目最后才真正的解决,郁闷自然是不用说了,但是我们组的每个人都没放弃,我花了两个晚上对串口通信进行调试,还是没找出真正的原因,只是觉得传输很不稳定,最后我们发现串口在通信时不是不稳定而是效率不高,方式也不象我们想的那么简单,我们甚至怀疑过MSCOMM的封装,我们是用2进制流进行发送的,而MSCOMM是ActiveX控件属于组件,所以只能处理双字UNICODE,于是我门准备把字节处理成双字然后收到后在PC3上进行重组,后来发现效果一样,我们陷入了密团,我们任然不放弃,至少我没有,我们有仔细单步调试,最后发现当缓冲区长度到一定或发送的字节朝过一定长度的时候信息正确,收到的就不正确了,比如我一次发送2K字节,PC3响应一次受到的可能只有前面1K,所以效验和肯定不对,所以受到的就不对,总是收到NAK,事件判断肯定为错(我们的流程大概是这样:首先PC2会把收到客户端的字节加上效验和转发收到,然后PC3收到和效验,无误的发送ACK到PC2然后调整接口参数显示,否则发送NAK等待,PC2收到ACK修改相应的标志位,继续等待客户端的命令,如果NAK则重发刚才的数据),最后我们单部跟踪,也找不出原因,没办法写个对话筐放在接受数据之前,编译执行(没有单步),发现有时候那个对话筐会弹出两次,这是我们恍然大误,总以为数据是一次发送的,就象SOCKET一样,不管你一读多少数据到缓冲区,TCP/IP协议固定一次数据的发送量最大不能超过一个值,为什么串口就没想到呢?失败~~~~~,于是我们用了个古老的办法,在发送前先将数据加上一个结束的标志(比如7E,7F什么的),然后接收的时候先建立一个临时缓冲区,收到的数据先放到这个临时缓冲区进行累加,知道发现数据中出现结束标志,再效验,这样就不会出错了,果然这样处理后就不会出现NAK,我门成功了!其实这个方法在网络通信中用的很多,由于串口本来就不熟悉,再加上思维上的定试,认为串口效率高,都是一次发送,没有考虑MSCOMM控件在底层做过手脚,哎~~~亏自己还做了些商业项目,总之失败啊~~,总之最后还是做出来了。接下来就是些小BUG的修改,其中我觉得最好笑,也最郁闷的就是显示的一个,由于设备很确我在写程序的时候是用的一个串口的模拟程序,在一台计算机上调试,当我们输入中文时,始终无法显示,这也让我们头痛,甚至想到用安全数组来改传输的格式,又检查程序,实在是不明白,最后还是实现串口的那位同时突然想到是不是模拟器的原因,于是我们马上换真正的串线路调试,faint~~~~,中文显示一点问题都没有,我都要吐血了,那个模拟程序是老外写的,没考虑中文的转换,哎,教训啊,这史我想起了平时做J2ME的和sybian的时候用模拟器调试一点问题都没有,一上真机问题就来了,最好少用模拟器。最后我们组是最先将所有功能实现的,我一共傲了两个3点和一个通宵,其他组员可能更多....,总之我们完成了,我们的那种喜悦是前所未有的。
到了评策那天其他组也基本做完了,具我所知其他组遇到的问题也和我们查不多,甚至更多,到我门讲的是时候,我首先介绍了我们项目的大提功能,然后没个模块由每个模块的负责人来讲解基本的实现,我们得的是优,虽然是实习,这个优确实得的也不容易。其他组也做的不错,至少界面都比我们友好,而且有个组在PC3上实现了点阵看上去确实要真实的多,我们只是用GDI简单的画出来了,但是我们的功能是最稳定的,有个组更牛,PC3用异型窗体画了个交通灯,时间真多.....,看来这个方向都是牛人呵呵。不过我想再多点时间让我来用我最拿手的DirectX画个好看的界面就更完美:),总子大家能在这么短的时间类完成,基本无BUG已经很不容易了,最重要的是我们体验了一起开发的酸甜苦辣,其他的都不重要了,我从心里很感激我的组员,真的,他们每个人都那么可爱,特别我觉得和我一起开发客户端的那个女孩,真的太可爱了,她叫邓春燕,也正是这个特别之处使我记住了她的名字(因为我在做东西也有点过于的挚捉),女孩做这个本来就不容易,而且她是第一次做一个完整的项目,不管我们项目遇到怎样的困难她都和我们一起想,一起郁闷,即使她想不出办法,也用一种很坚定的眼神看着我们,好象在默默的告诉我和其他组员,我门是最好的,我们一定能行,她相信我们。
临到要走的晚上了,大家都放松了,至少我们组的人,对与我来说去一样很平静,这个时候想起了CAKE,心中还有点伤感,于是把陈小东的《比我幸福》找出来听,过去的一些情景又在脑海里浮现,呵呵,没想到实习结束的晚上还是高兴不起来。这次实习我想对我来说,不是没收获,而是收获很大,有经验,更有教训,经验不光是项目上的,我再次认识到团队的重要,我可能永远也不会忘这次的实习,不会望了我的组员,不会望了我门的一起郁闷,我的一起喜悦,我门一起的交流,一起的玩笑,甚至是一起的微笑,那是一生不会多有的体验,真的很幸运有这次经历。