脱离语言之家

我的程序员之路(2)——学生时代2

2010/10/08 Share

我的大学——入行期(1)

研究生九月份开学,我七月底就到了长春。五月份来长春面试时去找过一家软件公司,我说我写过一些小游戏之类的程序,希望读研期间可以到他们公司工作,回复是不接收学生(研二又查这家公司的信息,公司地址换了,可能是家小公司,没精力雇吧)。本科毕业前,又联系到一个人,做手机游戏的,他说看过我写的小游戏了,还不错,所以七月底就来长春了,希望可以尽快做软件方面的工作。意料之外,原来是个光杆司令,就他一个人,他做游戏策划,我做游戏开发,他妹做游戏销售,晕,而且没有工作场地,让我参考北京浮生记的游戏(没有美工,我又做不了美工,这款游戏可以没有图片,全文本就行)做个买卖股票的游戏,他再来长春跟我合作。只能这样了,已经大老远到长春了怎么能再回去。做手机游戏用的是JAVA,没办法,学JAVA吧。网吧查资料,书店买书,J2ME买了两本,J2SE的买了两本,先看J2SE。由于有代码经验,七天用JAVA的APPLET做了个俄罗斯方块(学一门语言写俄罗斯方块最能练手了,研二学JS时就是用俄罗斯方块做为练习的),发给他,结果他什么都不懂,居然要放到手机上运行。然后又写J2ME的俄罗斯方块,没美工,只能用红色矩形表示小方块。没电脑,每天都在网吧写代码,每次都要先安装JDK,很麻烦。8月31号,买了台笔记本,不买不行啊,要写的代码很多,不能老去机房或网吧写啊。

 

研究生九月份开学,开学后继续做他的炒股游戏,九月底终于按照他的要求做好了,等他妹去销售吧。其实我心里清楚,那东西卖不出去的,也就懒的要什么薪水之类的报酬了。然后选导师,本想选个数据挖掘方向,结果有头脸的导师已经被本校生选完了。我被分到外聘的导师了,某软件公司董事长。期间跟另个同学弄乱了,原来他也选外聘的导师了,刚开始分的他,最后外聘导师居然给我打电话要我过去一下,我说没选上,导师又找的学校才改回来。

研究生三年,只第一年有课,一个学期分前十周后十周。上课跟本科差不多,老师在上面讲,学生在下面听。我算是比较能发言的了,可能跟大学有关吧,大学是工商管理专业,有案例课,老师讲一个案例,针对某个方面学生发言,我一向比较活跃。政治英语课就不必说了,第一学期印象比较深的就是《模式识别》、《人工智能》、《自然语言理解与自动机理论》。模式识别和自然语言理解很像编译原理,理论上有了很深的理解,印象最深的就是有限自动机,因为会用代码实现啊。其中一个问题是说,求任何长度的二进制串表示的整数能否被3整除,余数是多少?肯定不能先将二进制串转换为整数再取余来做啊,这里就得用有限自动机,编译原理真是太有用了,可惜我现在还没能把理论应用到实践(代码)中。然后就是人工智能了,人工智能分了四部分,我对搜索学的是最通的了,还是因为代码,我能用代码实现,所以学的最通了。书上讲过八数码的问题,广度优先、深度优先、有界深度优先、A*之类的,应用如流,我自己就做过,而且还帮广州工业大学个学生做过完整版的。只八数码就设计过好几个版本,刚开始是申请3*3数组作为状态图的,而且搜索的状态树越来越大,速度越来越慢,因为要每次都要比较看当前状态是否已经搜索过,太慢了。然后改进,由于状态是有限的,所以改一次申请完所有的状态,根据状态本身又能计算出状态的存储位置,所以查看当前状态是否搜索过的判断时间就省出来了。进步很多啊,对树的深度广度遍历,小菜,不用递归哦(代码中要回避递归啊,不然要递归很多很多层怎么办啊?也太占内存了)。这学期依然在学Win32 API,《WINDOWS程序设计》下册,做个录音机、声波显示、桌面时钟之类的。上海大学居然开这课,用的就是《WINDOWS程序设计》这本书,太强了,帮上海大学的网友做过游戏,打外星人的,她的PS学的很好,美工做的不错;也帮武汉一大学网友做过打字的游戏,用的是单文档单视图了,属于MFC,不过还不怎么熟,下学期才又学的MFC。学计算机图形学,做个图案显示啊,很漂亮的几何图案,还有2维图形变换啊,用线性代数的,这会儿才知道线性代数的应用了。

研一下学期了,不能老用API,学学MFC,《MFC程序设计》,还是微软的经典书。MFC就是把API用类封装了,API基础学的还不错,所以学起MFC来很快,用MFC改造以前用API写的程序,俄罗斯方块,双打的,八数码之类。学过人工智能了,就想写个人机对战的俄罗斯方块,先不管电脑玩的怎么样,至少让电脑自己能玩啊;第二步就得有所提高了,智能水平要提高啊,千辛万苦的研究,终于出来了。还是搜索,出现一个新方块,要把所以可能的情况都搜索一遍,看最后状态,哪种情况好,就按哪种方案操作方块。最后看别人代码,查一些资料,才知道就是这么设计的。尽管做出来的慢些,但这是我自己研究出来的啊,还跟他们的思路一样,说明我对软件的理解是正确的,就算以后工作需要研究,我也有研究出成果的底子啊。然后五了棋,人机对战的,水平不怎么样,可整体的设计思路有了啊,要我设计一个程序,知道从哪下手,设计成什么样,其他设计为什么不行,心里有底了,不能算工作经验,但代码经验就很丰富啊。计算机图形学,做个三维方块啊,三维变换。随着代码写的越来越多,我才知道为什么计算机图形学为什么要讲直线生成算法等等很“白痴”的算法。像很多初学者一样,一般编译器都会提供图形库画直线、画曲线,计算机图形学讲那有什么用?拿卡丁车来说,动画效果很好啊,地图、人物都是变化的,肯定不能用图片简单的贴上去啊,得用代码画一些图形;要画的太多了,刷屏是肯定的了,怎么办?双缓冲?双缓冲仅仅能解决刷屏的问题,游戏会很卡很卡啊,怎么办,用图形库就不好使了,就得用算法在内存中的图像区直接画线、填充图形了,然后贴到屏幕上(这一点很重要,以后遇到图像展示方面的速度问题,就有解决问题的思路了,现在的工作中就遇到了)。下学期也有课,有一门很有意思,《神经网络》,感知机什么的,只实践过一个简单的数字识别,再复杂点的没做过了,只懂些理论了。七月份进入暑假了,问导师实习的事,导师忙就安排给师兄了,做JAVA还是数据挖掘。JAVA学过,当时用的eclipse,很不方便,没有VC++6.0方便;而且没数据库基础,只看过数据库方面的教程,就选择数据挖掘了。数据挖掘需要学C#,而且用API做动态库太麻烦了,听说C#很方便,就学学C#吧。于是七月份开始学C#,还是先做俄罗斯方块之类的小游戏练练手,C#太容易上手了。

研二没课了,九月份就去导师公司实习了。刚去安排我做Silverlight,从WPF做起。做个画图器、相册,Blend太强了,做个渐变太容易了,很快就熟悉了。看别人做的个跟随鼠标漂移的小球很好玩,自己也做了个,还能换成自己的照片放到小玩上,很好玩。不懂Silverlight,是网页的,没做过网页编程,不喜欢做网页代码。Silverlight和WPF只做了不足一个月,十月份,经理让师兄做个基于Lucene的搜索引擎,第一步就要做网络蜘蛛。我以前只听过网络蜘蛛,具体怎么回事还不知道呢,师兄人很好,乐于把自己知道的教给别人(这种人很少了,大多数人都怕你学会了抢了他饭碗)。师兄把源代码给我,我很快看懂了,自己做了一个,获取一个内页的数据并识别网页上的链接,然后根据链接再获取网页,这个就是网络蜘蛛的原理了。需要用自动机了,如果用字符串的比较去识别,也太慢了,用自动机,一遍扫描就识别完了所有链接。下一步就是用Lucene建索引了,还是看了看别人的代码,很快就会Lucene的基本操作了。然后师兄就不管这块了,完全把搜索引擎交给我了。网络蜘蛛和Lucene结合,网络搜索引擎就出来了,百度就是这么个工作原理,经理们分析了一下,这个在项目上暂时用不上,让我做基于Lucene的数据库搜索引擎。不会数据库啊,查资料看代码学习,终于知道程序怎么操作数据库了,主要就是学学SQL语句了,数据库的设计用不上,先不学了。很快,数据库的搜索引擎出来了。实习两个月了,第二个月学了很多东西,经理推荐,我提前一个月申请到工资了(实习三个月后才有可能申请到工资,尽管不多,一月八百,但还没用程序赚过钱啊,太爽了)。第三个月的任务就是提高数据库搜索引擎的建索引速度了,先是用多线程解决;再减少IO的操作,不能建一个索引就保存到文件一次吧?需要内存索引,一亿零五百万行四个短字段建索引,周五下班运行,周一早上才能建完,太慢。研究发现,索引文件越大,速度越慢,改成创建多个索引文件,Lucene有索引合并函数啊,速度提高到14个小时,算是完成任务了,十一月中旬。经理安排要我做网页,要在网页上能用上搜索引擎啊。学ASP、JS,很麻烦,刚开始不懂哪些代码是在服务器执行的,哪些是在客户端执行的。终于明白了,客户的端的代码要学JS,学JS还是做俄罗斯方块练习。很快学会了。可做不了网页啊,太难看了,而且我还不懂什么样的颜色好看什么样的不好看。然后学C#的穿件编程,太容易了,做一个自己的控件太容易了。

很快寒假了,在家继续做代码,想把俄罗斯方块做成控件。哇,太强了,做成控件后,写一个俄罗斯方块,太容易了,拖一个控件,连接一些事件就OK了。双打的,拖两个控件,连接一些事件,还可以做个“下一个方块”的控件。下学期继续在导师公司实习,不过已经没什么任务了。新同事做Silverlight的,要做个树,点击到树结点可以收起子树,最主要的是结点要排列紧凑,难度挺大,不过还是被我解决了,我用WinForm做的,结点是画个矩形而已。第一种方案是先找到叶子结点(包括收起的树结点)进行排序,再向前推父结点的位置;还是不够紧凑,同事给我看了下微软做的,我研究了一下结点间的位置关系,终于解决了,叶子结点可以被挡住,但收起的树结点不能被挡住,难度挺大的,不信你试试。没学过计算机网络,想学学网络编程,哪怕是最简单的。还是查资料,看别人代码,很快的看懂了,设计自己的聊天程序(代码写多了学什么东西太容易上手了,所以我想,公司招程序员,应该招有代码经验的,而不是有工作经验的)。第一版是简单的聊天功能;第二版就有注册用户、登录、聊天等一些功能了,服务器端用SQL数据库,只有聊天功能的话,接收到的数据都是聊天的内容,功能多了,就必须有通信协议。前两版界面太难看了,没办法,也没人帮我设计界面啊,第三版就参考QQ了。QQ2008有皮肤包,所以就想做的程序直接导入QQ的皮肤包就好了。实现了才知道,只处理QQ的皮肤包数据不行,因为很多控件的位置是脚本处理的,要想完成识别QQ的皮肤包,必须做个脚本语言的解译器,这个难度也太大了吧。没办法,只能在腾讯的基础上修改数据了,修改成自己能识别的。皮肤有了,还有控件的开发啊,什么好友分组,好友的显示之类。第三版就有好友申请功能,系统提示功能了,很强大了,想来想去,没什么挑战,不做这种低级的代码了(其实现在还在做这种低级代码)

CATALOG