`
Dustin
  • 浏览: 309532 次
  • 性别: Icon_minigender_1
  • 来自: 广州/成都
社区版块
存档分类
最新评论

背后的路【2】

阅读更多

4

所谓同道中人,专业上的朋友可以称之为道友了。当然,道友们也是我很要好的朋友,不过除了一般的促膝谈心,我们之间还多了技术层面上的交流。某种程度而言,道友们对我影响要比老师们大得多,他们就在我的身边,即是我的朋友,也是我的榜样。

B和彭DY是我最早认识的两个师兄,因为我入学的时候他们已是学院里面的风云人物了,而且还言传身教,介绍经验,我们确实受益匪浅。为了提高我们的动手能力,两位师兄把我们组织起来,教我们如何做项目。我大一的时候参与过其中一个名叫ResourceOne的项目,第一次使用了Visual .NET这样的开发工具(当时这个IDE令我极其郁闷,不是IIS装不上,就是ASP运行不起,总之是伤透我的心了…)也第一次体会到了团队协作的感觉,对软件开发有了最初步的了解。林锐博士那本《高质量C/C++编程》就是在他们的推荐下看的,获益匪浅。

两位师兄都是ACM/ICPC的牛人,当时也鼓励我们积极练习。可惜自己当时兴趣不在此,很少参加,这不能不说是一大遗憾。现在两人都去了很好的大公司,这也是对他们付出的回报吧,十分感谢他们。

 YF是我本科时候的班长,人很聪明,成绩暴好。卢班长给我最大的感觉是做事很有主见,很自信,也很主动,这些都是我自叹不如的。当年这娃娃学C语言的魄力给我很深的印象,也唤醒了当时还茫然不知所措的我,平时还经常把电脑让给我来上机(当时自己还没买电脑,又懒得跑实验室),是个积极上进,团结同学的好同学,好领导 :)。此外卢同学在足球场上也是一把好手,凭着自己强壮的身体,惊人的体力在横冲直撞,攻城夺寨,虽然由于众所周知的原因,经常把球踢踢向了太空,飞向了宇宙……不过卢同学现在远赴北京,嫁入豪门,很少相聚了,感叹一个~

 Q当年是我们球队的一号门神,身手矫健,左扑右挡,风头一时无二。可惜近年屡屡缺席训练,赘肉剧增,已是老态龙钟,不复当年之勇。最为可恨的是还经常耍大牌,消极比赛,于球队的集体利益之不顾,实在让人咬牙切齿。这里,请允许我代表整个球队对其所作所为予以最高级别的BS(肯定掌声一片)。

熊总接触电脑很早,各种操作轻车熟路,自然就成为我们这些菜鸟的电脑的家庭医生,一来二往熟悉过后发现我们两个技术上面还是多投缘的。我们都喜欢以用带学,都喜欢面向对象,都喜欢新奇的技术,都喜欢挑战。于是我们开始一起做项目,从课程设计的小项目,到参加Linux开发大赛,还有一起做那个商业的Web项目。熊同学精于技术攻坚,项目的前哨战我们都可以放心的交给他,从项目环境的配置到最新技术的检验,无所不能。最为重要的一点是他还精于调试,一般自己半天没找出的Bug,有熊总在,肯定就没问题。很怀念以前一起讨论我们所谓的架构,一起编码,一起Debug,一起快乐,一起痛苦的日子,也期待我们下一次的合作。

5

   书山有路勤为径,学海无涯苦作舟。

1C语言

事隔5年,我和C语言又重逢了。教材用的是谭浩强的《C语言程序设计》,一个女老师讲的课。书是好书,但老师却让人痛苦不已:一上课就开始念PPT,直到下课。天啊,念书谁不会啊,这样我都可以当老师了。可是当时自己还是品行端正的乖娃娃,不管刮风下雨从不缺课,哎……

那时也开始有了上机课,用的是Turbo C。当时也不知道它是偶像Anders Hejlsberg所在的Borland公司做的,只觉得那蓝色的界面和以前编写QBase的界面特像,于是亲近感油然而生。一路下来,从Hello World到排序算法还是写了不少,但都没有不超过一百行的。当时也不觉得有什么,直到同学使用链表,结构这些“老师还没有讲”的“高级技术”编写出600多行的“学生成绩管理系统”时,自己才恍然大悟:大学里,老师只是给你指个方向,剩下的全靠自己了,自己的进度至少也要比老师快两章。这算是我大一上学期最大的收获了吧。

由于自己兴趣的关系,C语言不是用的很多。现在,也有很多学校直接使用C++或则Java作为学生的入门语言。但是,作为一个计算机学院的学生,我觉得认真学习C语言还是十分有必要的。先不说C语言本身的诸多优势,如使用灵活,性能优异等,单就它的流行程度而言,就已经不容忽视了,很多计算机书籍和文章上面的范例都是以C语言的形式提供的,缺乏C语言这方面的知识,难免会造成阅读上的障碍,这跟我们现实生活交流中英语的道理是一样的。此外,当前主流的开发语言都是在C语言的基础上发展而来的,如C++javaC#等,它们在语法上跟C语言都十分相近,学好C语言对对后续的学习十分有利。

还有就是编程环境的选择上,我觉得选用Linux + vi比较合适。学习阶段项目一般很小,也就一两个文件,vi就足够了。通过在命令行中进行编译和链接,我们可以获得程序从源代码变成可执行代码的直观感受,有助于理解。对程序员而言,我们不应该畏惧控制台操作,而且应该因为它的的直观和迅速而拥抱它。现在,我们都被IDE宠坏了,一切工作都under the hood。当然,这能大大提高工作效率,但是却降低了我们的学习效率。

语言毕竟是一个工具,只有在实践中才能体现自身的价值,否则就算C语言语法你烂熟於胸,它们也只会像是一个个孤零零的汉字,缺乏上下文,是没有灵魂的。而且,我们学习编程,有点阿Q精神是十分必要的,那点点滴滴的成就感是我们不断前进的动力。成就感何来?编一个能运行甚至有实用价值的小程序出来,心里何止是“美滋滋”的呢。Richard StevensUnix环境高级编程》(Advanced Programming in the UNIX Environment2ed)和 Unix网络编程》(Unix Network Programming,3ed)我觉得就是一个非常好的起点。原因有三:一是Stevens的书深入浅出,例子众多,而且全部用C语言实现,非常适合初学者。二是Unix/Linux本身就是用C语言实现的,系统调用的接口全部以C语言的形式提供的,不会造成混淆。如果在Windows平台下,单单区分系统调用,MFCVC++这几个概念可能将一个踌躇满志的未来IT精英赶回到CS(这里是Counter Strike啦)的怀抱中去。三是可以接触操作系统以及网络的一些基本概念。这一点有好有坏,学习C语言通常在大一,那时候还没有系统学习操作系统和计算机网络等相关课程,有些概念理解起来会比较吃力,意志薄弱者往往会“知难而退”,选择放弃。但是对于一些有主动学习能力的人,这却是一个很好的契机:开始学习操作系统和网络编程。不管最终结果如何,你已经走在很多人前面了。

然而,“吾生而有涯,而知无涯”,一个人精力毕竟有限,而计算机科学中各个知识点相互联系,相互交叉,组成了一张广袤的网,如果我们每一个知识点都想追本溯源,到头来很可能迷失在其中。因此,当有些问题百思不得其解时,不如先把它暂时放在一边,let it be。可能一个月过后,答案突然就展现在你眼前了。“走”“停”之间,后者往往更需要智慧。

 

2C++

   大一下学期学院开设了《面向对象程序设计》一课,课程名称还有个小标题“用C++描述”。说是讲面向对象程序设计,其实老师的重点也就是讲讲C++那庞杂的语法。也就是说,这门课讲在C++中,你该如何声明一个类,如何实现继承,什么是虚函数,该如何实现多态,但为什么要面向对象,为什么要用继承和多态等问题却是只字未提,也就是说,It tells you what and howbut not why。或许,课程的名称改为《C++程序设计》可能会更加名副其实。还有一点我到现在还不明白,既然C++并不是一门完全面向对象的语言,为什么还要用它来讲述面向对象思想呢?可能是以前编写教材时javaC# 或者 PythonRuby等还没出现或者流行吧,但今天看来,至少在教材的选择上,我觉得后面的选择更为合适。

      当然,这些都是后来才想到的,当时也只会屁颠屁颠跑去上课,不过,有了上学期C语言的经验,我已经事先把C++那本书看了大半,此时听课,只是查缺补漏,心中自有另一番感觉。所以啊,我们还是不要随便逃课,虽然有的老师讲课不知所云,让人昏昏欲睡,但老师毕竟是老师,怎么不济总有他对课程自身的了解,所在的高度也是我们不具备的。呵呵,这让我想起一句话:“这个世界不缺乏美,缺乏的是发现美的眼睛”。这是我们高中语文老师经常挂在嘴边的话,深表赞同。

      C++确实是个庞杂而美妙的东西,也构筑了很多美妙的东西。掌握一个精巧的东西肯定需要一个漫长的过程和不断的付出,而一本好的教程往往这个历程的良好开端。这里,钱能先生的《C++程序设计教程 2ed》无疑是一个不错的选择。钱老师的书以标准C++为背景,详细描述了C++的基本概念和基本用法,覆盖面很广,包括了C++异常处理和标准模板库。此外,这本书还把出现的概念全部都用英文标出,对我们今后阅读英文资料是很有好处的。可惜啊,当年我学C++的时候用的不是这个教材,学了半天连异常和STL都不知道,火星了。(当时也笨,不知道上网搜一下,当时已经有第一版了)

      说起C++,不能不提STL。如果你是把C++当成工具而不是玩具的话,STL是必须了解的,因为里面包含了世界上最厉害的算法大师和最优秀程序员的智慧结晶。初识STL是在跟师兄讨论排序算法的时候,说到排序算法的稳定性时师兄说STL就有稳定排序的方法。可怜我当时连数据结构都还没有看完,知道有现成方法可用当然高兴的不得了。回去一试,效果就是好,后来在网上又听说了不少关于它的传说,从此就成为其裙下之臣了。

STL领域,《标准C++模板库》一书地位颇高。作者用其德国人特有的严谨和精细将STL抽丝剥茧般展现在我们面前,让我们了解到什么是STL以及如何高效地使用STL。这种书,通读一遍,回味无穷;常备案头,终身受用。10分,5星!还有就是侯捷先生的《STL源码剖析》一书,如果你想深入学习STL的实现机制,领略C++的高级用法以及算法的具体实现,这本书将是不二之选。源码之前,了无秘密!

C++里面经典实在太多了,而经典中的经典不能不提《C++ primer》和 Effective C++》及其姊妹篇《More Effective C++》。Stallman一千多页的宏编巨著和Scott Meyers 一百条手术刀般犀利的“编程箴言”,足以让你对C++有一个全方位的认识。不过前者实在太过庞大,可能作为参考书比较合适,cover to cover的阅读可能是对耐心的一种考验哦。此外,Bruce Eckel的名著《Thinking in C++》也是必读书籍之一,不过听说翻译版本的“鸡蛋指数”暴高,建议大家读e文的吧。

 学习到一定阶段后,我已经不满足于控制台那黑乎乎的面孔,开始向往那花花绿绿的GUI生活了。虽然当时师兄给我说过:“简单就是美”,但我觉得自己不亲身体验又怎知其中的苦怒哀乐呢,还是决定放手一试。那时,Java还没有开始接触,Qt也不知道是何方神圣,唯一触手可及的就是WindowsVC++了。搞清楚VC++C++MFC这些令人昏头转向的概念后,我就开始了我的GUI之旅。谁知道我当时心高气傲,起手就看起了侯捷先生的《深入浅出MFC》。对于毫无VC++编程经验同时面向对象根基尚浅的我来说,无疑就像是没见过汽车就像了解汽车的内部构造,除了惊叹于其结构精巧复杂外,根本就摸不着头脑。不过,侯捷先生精彩的文笔给我留下了深刻的印象,书中扉页那方“山高月小,水落石出”依然历历在目(我当然知道是苏轼的名句)。一个技术工作者能够旁征博引,文采飞扬,言之有物,确实令人敬佩。就译者而言,我个人首推侯捷先生。只要是侯捷先生的译作,一般不需要到网上去查看“鸡蛋指数”,我相信侯捷先生的眼光和文笔。

 MFC里面提供了很多工具类,譬如文件操作,Collections等,这跟STL是有交叉的。如果项目中两者都可以使用,我会优先选择STL,因为这样程序的跨平台特性要好一点,其次,我不想自己的编程经验由于平台的不同而贬值。

大四毕业的时候我到一个公司实习,在里面和一个师兄一起实现了一个P2P文件分发系统,这是目前我用C++开发过的规模最大的一个项目。期间,体会到了C++的强大威力,也感受到C++的不足,如文件的引入,内存管理等。这算是对本科C++学习的一个总结吧。跟我一起工作的师兄是一个C/C++老手,编程效率很高,但是对面向对象设计这一套不太感冒。我当时正沉溺于面向对象那些“奇淫巧记”中,心中自然郁郁。但是,每当我在苦思冥想所谓的完美结构时,师兄已经将一个可运行的程序摆在面前了,而且事后也证明师兄构造的原型只需稍稍改造就能获得一个良好的设计。这对我触动很大,我们是该进行设计,但过犹不及,有时摸着石头过河也是一种方法。现在火热的XPeXtreme Programming)也推行这一观点,不过增加许多其他辅助手段予以可行性上的保障,如测试驱动,结对编程等。

3、 Java

大一暑假的时候,我买了第一本Java教程,也在电脑上装了第一个JavaIDE--Borland JBuilder。可惜当我打开这个功能强大但是界面复杂的庞然大物时,我半天没弄清楚该如何新建一个新的工程,也不知道怎么编译和运行了。那时唯一用过的IDE就是MSVC 6.0,那里根本不会强制要求我创建什么工程之类的,天啊,我只需要看到那个可爱的Hello World。失落万分,于是愤然将其抛弃,改用JDK,因为那本教材上就是用JDK当例子的,而且上面有环境配置的详细过程。对于新手来说,一个Step by Step的教程“就是光,就是电,就是唯一的选择”。JBuilder到现在也没主动采用过了,因为它的首次现身把我“脆弱的心灵”伤害的够呛的,可见第一印象是何等重要,呵呵。

照着书上的步骤,也不管PATHCLASSPATH是干什么的,编译,运行,终于看到了传说中的Hello World。从此,Java也就正式步入我的生命中了。Java给我的第一感觉是清爽,在Java的世界中,不再需要前置声明,不再需要繁杂的预编译指令,不再需要内存管理……而且,Java语言本身自带了许多功能强大的类库,这对于当时还不知STL为何物的我来说简直是一个致命的诱惑。

 大二课程比较多,而且都是比较重要的课,天天奔波在教室之间,没多少时间“潜心研究”。期间跟同学用Java编写了个所谓的日记本,也有几千行代码吧,用Swing来开发界面,实现编辑保存之类功能的,还用了多线程,后来当成Java的课程设计交了上去,结果分数还没有一个把从我们这里“借”来的小程序交上去的同学高,一股“怀才不遇”的凄凉感油然而生,郁闷了半天。

到了大二暑假,跟同学组队参加IBM Linux开发大赛,由于参与过师兄组织的一个Web项目的开发,Web应用,B/S结构,数据库等概念刚刚映入眼帘,心中也是跃跃欲试,于是决定用Java技术实现一个Web应用提交上去。那时候JSPServlet通通一概不知,参加的那个Web项目使用的是.NET技术,风马牛不相及。上网搜了半天,理了一下JSPASP的关系,就去图书馆抱了一大堆“JSP宝典”回来,项目就上马了。年轻就是资本啊!所谓无知者无畏,不得不服。

过程是艰苦的:机器性能太差,跑不起指定的开发环境WSAD,只好开发的时候把网线拔了,关掉防火墙和其它一切程序;没学习过数据库技术,数据库设计一塌糊涂,SQL语句不堪入目;没有Java Web项目开发经验,程序臭虫满布,调试没日没夜。

但是,最终我们还是坚持下来了,经过将近一个月的奋斗,我们把项目提交上去了,成为了我们这一年级唯一成功提交作品的小组,虽然没有获奖,但是我们却第一次体会到了程序开发的快乐与痛苦。

收获是巨大的:我们知道了UML,用过了Rational Rose,软件工程的种子开始在我们心中萌芽;我们知道了数据库的重要性,使我们在来年的数据库学习中更加有目的性;我们也体验了团体开发的快乐与忧愁。

所以实际项目最能锻炼人,遇到问题时,在“进”“退”之间,项目的压力会迫使自己继续前进,学到的东西往往更多,也更加的深入。既然学校是最后一个允许我们犯错的地方,我们不好好利用,岂不浪费?Just do it

 大三暑假是难忘的。放假之前一个熟人找我说要做一个网站,宏心壮志要做下一个**。自己当时也逛了不少论坛,新闻动态还是略知一二,心想泡沫都冒那么久了,怎么现在还来做这样的梦。但我心知某些东西里技术扮演的角色并不重要,也许人家就真有这样的能耐把它推广出来,因此也就接下来了。

找了其他三个同学,开始准备。那时“年少无知”,心比天高,也坚信自己是技术粉丝,技术选型尤其激进,当时网上StrutsHibernate正吵的火热,我们马上就认定这两个是秘方良药,于是买了几本书,准备再次摸着石头过河。“人有多大胆,地有多高产”,我们深信不疑。

那年学校那时软件工程刚刚学过,也知道需要先做需求分析,跟对方约了个时间长谈一下午,果然就是“这正是我说的,但我不知道我说的是不是就是我想要的”,后来他说你们就照着**来弄吧。It’s all。接下来就是界面开发,编码、调试,昏天暗地的。

那个暑假学校大兴土木,把宿舍楼前那条马路开膛破肚,泥巴放的到处都是。天气干燥的时候,大风一吹,尘土飞扬。可怜我们那时候住在一楼,正对那一堆堆的大泥巴,每天都要跟它们亲密接触,苦不堪言……开发到后期,很多功能有待确认,谁知道对方是个大忙人,久久定不下来。我是唯一的对外联系人,又要进行代码开发,身心俱疲。深感做人难,做程序员更难,既做程序员又做PM就难上加难了。

项目中我负责持久化部分,主要工具就是Hibernate,从相识到相知,其中的缠绵悱恻至今历历在目,也就在那个时候,知道了JavaEye这个网站。后来觉得,开始时选用StrutsHibernate这些框架也是有好处的,因为这样就算自己设计的时候并没有太认真的考虑,但是最终出来的程序的结构往往不会太差。这也是框架的威力的体现之一吧。

 直到某一天,我突然发现自己在Java世界中走得是那么的被动,那么的焦灼,那么的痛苦。每一次知识的更新都是外界左右的结果,这跟我C++的学习体验是完全不同的。以前,我在象牙塔里憧憬着世界的美好,聆听着世界大师们的教诲,却从来未将它们付诸于实践。Java一下把我拉到现实中来,内心也多了几分挣扎。这其中并无对错,也许两者都是我们必须经历的吧。但我想,人,还是应该主动点,而不应该被技术左右的。知己知彼,百战不殆,在与技术的纠缠中,我们不应该满足于WHAT and HOWWHY或许才是真正的重点。

毕业那年,我决定改变这种状况。《深入Java虚拟机》是我的第一步,买了很久的《Effective Java》也终于认认真真看了一遍,也开始了对JUnit的初步研究。同时我决定开始写博客,将我的点点滴滴记录下来。这是一个奇怪的体验,很多东西感觉已经掌握了,但诉诸笔端时却发现自己还有很多盲点,写出来未免贻笑大方。虽然并没有多少看客,但这也给与了足够的压力和动力。有时候写博客是一件很痛苦的事情,就像是在完成一次家庭作业,但我还是决定坚持下去。不然这么一天一天的过日子,有时候麻木得自己干了什么都不知道,想想心里空荡荡的,蛮可怕的。写写博客,当给自己留个纪念吧。

分享到:
评论
1 楼 crazycow 2007-06-11  
楼主有很多经历和我很像,希望能交个朋友,呵呵:)

相关推荐

Global site tag (gtag.js) - Google Analytics