在十二年前, 我从高考失败的阴影中走出来, 作为计算机专业的入学新生, 来到南方一所并不知名的综合大学. 刚入学的时候, 对于我的专业, 基本上是不甚了解. 只知道是个高科技的东西, 但是它离我似乎既远又近. 印象深刻的是高考之后, 在家附近出了一间最间的"网吧", 其实还算不上是真正的网吧. 只能玩局域网游戏, 并不能联上互联网. 那是QQ还是未来之物呢. 见识了帝国时代和红色警戒, 真的是很颠覆性的直观认识啊. 之前也听说过一点编程啊, 代码之类的术语, 又觉得好神秘不可亲近. 第一次亲临计算机面前时, 面对图形化的计算机有点目瞪口呆, 和本来想象中的黑底白字截然不同. 对于光驱, 鼠标这些个新鲜玩意, 真的是又好奇, 又有点不知从何下手的感觉. 看着桌面上的内容在老生面前有如彩蝶翻飞, 真个是心潮澎湃.
不过第一次和专业有点关系的课程, 计算机基础, 给了我当头一棒. 不知道是老师真的水平太高还是故弄玄虚, 给我们这些初入大学的新生们, 大讲了一通数理逻辑, 什么与或非, 头晕脑涨, 不知所云. 真的是个下马威, 杀威棒, 立时觉得计算机专业真个有如登天之难了.
在大学一年级我开始上的第一门程序设计课是Pascal. 恐怕现在新入学的同学已经比较小接触这样的语言了. 虽然我只学了一个学期, 而且后来也没机会一直用下来, 但是给我的影响却是很深刻的. 让我理解了很多基本的程序设计与开发理念, 最简单的数据结构和基础知识. 现在想起来也很感激我的这位启蒙老师. 只记得是姓刘的女老师, 惭愧得紧, 当年一考完试就忘了人家的姓名... ... 鄙视一下自己.
但是很多问题在学习的过程中会冒出来, 现在想起来, 觉得很简单而且幼稚了. 比如为什么用main来作为函数的开始, main函数是如何被调用的. 操作系统是个什么东西? 有黑白窗口的DOS和有漂亮界面的Windows95有什么区别呢? 恐怕这些问题连普通非计算机专业, 有点计算机基础的同学也能说个八九不离十. 不过对于我们那一代的同学, 这种现象还是挺普遍的. 比如我的上铺同学, 还曾问过键盘旁边那个连着跟线, 象个馒头一样的东西是干什么的(鼠标)
不过我觉得, 有问题总是件好事,有问题说明你是在思考. 回答不出来问题, 是咱们的能力问题, 知识积累的问题. 这些可以通过努力都提高和改进的. 但是如果没有问题, 那就比较糟糕, 是态度问题呢. 对于这些问题的思考和回答, 步步上升, 才能提高自己的水平.
后来学过C语言, 老师当然讲得很神了, 比如说起了微软操作系统的核心就是用C语言来实现. 还可以和硬件结合进行编程, 它的执行效率是在汇编语言之外等等. 最高但是象牙塔中的教育, 总是难免有点空对空的缺憾, 只是提了一点知识概念, 对任何具体的说明都没有. 对我们来说, 真的是蜻蜓点水, 除了知道自己什么都不知道, 就真不知道还有什么其他. 现在想来老师的课程有点不合理的地方, C语言和数据结构是分开来讲. 而且讲语言时, 总是围绕着基本的语言特性, 比如{}有什么好处, 语句之后用;作为代码的结束符之类的内容. 这些细枝末节的东西, 如果是与实际的操作相结合, 那就上手容易得多. 说三遍不如动手作一遍. 用C语言来实践一下数据结构, 比如堆栈链表什么的, 该有多好. 而且当时已经推出了VC++6.0, 已经有了基本的类型库, 自己掌握之后, 再来比较一下类库是如何实现, 从性能和效率上来梳理自己的知识体系. 学习效果和掌握程度要高得多. 当然也许现在这么说对当时的老师也有点要求过高了, 那会儿大家面对VC++6.0都还是刚开始认识和了解, 连本好点的参考书都没有. 老师也没有能力规划得如此好吧. 还记得有老师对我们解释什么是面向对象的开发就是就是作GUI的程序, 面向过程的开发就是作命令行窗体程序.
在实验课上,我们还是用C语言总在做些输出字符串, 打印hello world之类, 只能体现思想, 但是和实际的需求没有什么关联的实验性质的程序. 功能点也是剥离的, 这样生吞活剥地学下去, 虽然也记住了不少函数, 但是没有一个实战的检验, 到底也少不了赵括纸上谈兵之后的惴惴不安.
98年刚出 VC++6.0, 当时的主流开发框架是MFC. 那时看过一个Petzald写的Windows程序设计. 记不太清楚名字了, 反正是一本很经典的C++ Windows可视化编程的书. 在那时, printf, sprintf用得还不是很熟练的时代, 对于面向过程开发, 面向对象开发还缺乏基本概念的时候, 猛然看这样的书, 只觉得天书, 天书, 还是天书. 不过也想起来一位老师对于面向对象与面向过程开发的解释, 面向过程就是黑窗体的命令行程序, 面向对象就是可视化有窗体按钮编辑框的开发. 也曾经一度深信不疑. 现在想起来, 对自己当时虔诚的信仰不免有些好笑. 不过, 我不认为这位老师说的有什么太不靠谱. 毕竟, 当时对于C++的理解, 似乎还是一个蛮荒时代, 很多后来被奉为经典的书籍还正在酝酿之中, 苛求那位老师也是不公平的. 而且我认为能在那时大家基础都近乎空白的情况下, 可以用很直观, 很形象的解释给我们建立一个基本的印象, 把复杂问题用简单的语言表述出来, 也是件了不起的事. 正如我们现在的人, 没有必要去笑欧几里得几何太粗浅一样.
当时看 Windows程序设计时, 满眼的术语和定义, 一无所知, 根本不知所云. 比如Unicode, 句柄, 函数注册什么的. 这些基本的内容没有解决, 对于整体书的理解, 就完全成了问题. 当时的学习环境比起现在来说, 是艰苦多了,MSDN ? 这是什么东西? 到百度上google一下, 更是闻所未闻. 现在回忆起来, 我们没有一个具体明确的程序语言的学习路线, 才会出现这样的问题. 先看什么, 后看什么, 有个由浅入深, 循序渐进的过程. 而当时就是核桃西瓜一口吞.
有些动手能力很强的同学, 自己买了电脑, 在VB环境下调试一下应用程序, 加加图片, 操作文件, 数据库访问, 很是让人羡慕. 不过, 也许是我个人的惰性吧, 当时有了一点Pascal和C语言的基础之后, 对于大小写不区分的代码, 风格不统一, 生成了一种天生的偏见, 无法接受. 仍然在Console窗体中, 和C语言的printf作着亲密接触.
在上大三时, 学校也开始教授C++. 不过是个选修课, 由于知识体系的继承性, 我很自然地对C++青睐有加. 不过学校里的教学方式, 不得不承认带着深厚的应试教育的风格, 课堂上对C++的解释是一堆知识点的罗列, 最多只能回答"怎么做","how to do", 而背后的因果, 结构, 为什么却是只字未提. 结果是很多人听得一头雾水, 对于我也只是知其然, 不知其何以然. 有的时候向老师提问, 还记得代课的耿姓女老师也被问得一头汗的场面. 那时深深地痛苦着, 为什么要用虚函数的继承来实现多态??? 那时的水平仅仅达到能实现功能的要求, 对于多种C++语言特性, 没有直接使用的动机, 就很难去深刻地理解它. 那时出版的关于C++的书, 实在是差劲的多, 精华的少. 现在想起来, 有些书说得不客气点, 就是在骗钱呢. 一些从MSDN上查询得到的内容, 也当作个重点来介绍. 把VC++6.0上一些基本的界面操作也连篇累牍地讲述. 无语了. 多年之后, 我的建议是, 学习C++, 只看大师. 不是说国内的作家不行, 是我认为, 看国外的大师就足够了. 等你能把国外的大师经典读明白, 你已经上了层次, 没有必要再看国内的这些C++"科普"书了. 另外就是WROX出版社推出的红皮书系列, 真是很经典. 涉及的知识面也很宽. 想起来就要顺便表达一下感谢了.
现在看到读大学的本科同学们, 无论是否计算机专业, 也基本上是人手一台笔记本电脑, 真是羡慕得命. 那时条件有限, 家里每月也就是三五百元的生活费, 除了吃饭, 买几本书, 基本上是剩余无几, 买个属于自己的电脑, 真是天方夜谭. 不过我们学校的计算机室还是很棒的. 正常是两块钱一小时去上机. 那会儿上网刚刚开始时髦起来, 很多人都去上QQ, 或者是带着光盘上机去看电影, 日剧什么的. 不过我还算抓紧, 用有限的资源一方面也去接触一下互联网这个新生事物, 一方面去写些自己的程序. 金钱有限, 所以上机编译程序之前, 要好好地作准备. 这也迫使我在行动之前, 在思想世界里尽可能地仔细地把握程序本身. 这样从另一方面带来一个好处, 那就是尽可能在上机之前有足够的问题, 在问题的驱动之下, 更有目的性. 这里顺便插入一句我对互联网的评论. 现在从网络上获取有用的信息, 比起过去实在是方便多了, 但是同时也存在着太多的无用信息. 如果大家没有一个明确的目标, 自己想清楚, 我要干什么, 我要获取什么信息就泡在互联网上时, 反而很容易被信息牵着鼻子走, 看点这个, 看点那个, 脑子跟着鼠标走, 鼠标跟着网络走. 反而很容易花了大量的时间, 却不知道自己在干什么, 甚至成了浪费时间. 我是很不赞同的. 在一开始就养成一个良好的上网习惯, 多么重要. 当然, 如果有人就是喜欢上网聊天, 玩网络游戏, 看电视剧什么的, 那就是另外一回事. 对我来说, 计算机是工作用的工具, 而不是娱乐的设备.
在毕业设计时, 已经对C++的基本用法已经有了一点心得, 在选题时, 看到很多题目都是自己不熟悉的内容, 比如当时比较时髦的ERP, 数据库, 进销存系统等. 但是觉得自己对于领域知识的了解还非常有限, 与其这时就和业务相捆绑, 还不如继续打技术基础. 这时看到有个题目COM技术的应用, (Component Object Model), 接触了一段时间的COM技术, 不过当时学习的师资水平还非常有限, 就连给我们授课的老师(只记得是姓蒋的一位女研究生), 对于设计模式的了解也非常有限. 但是类厂模式, 代理模式在COM中是如此重要, 以至于没有它们, 有些基本的COM概念就很难解释得清楚. 现在回忆起当时学COM, 其实是对自己C++基础知识中, 以接口为基本概念进行的一次重新梳理, 终于有比较直观的印象来理解C++所体现的基本三要素, 封装, 继承和多态. 当然, 这还只是当时的理解, 其实, 后面还会大幅的再次改变对C++的认识.
本科毕业之后, 我也参加了研究生考试, 很不幸, 我心仪的学校并没有接受我, 不过所幸我在毕业设计期间的表现还比较突出, 给我当时的辅导老师留下了深刻印象, 她正好也是我们学院的研究生导师, 在她的帮助下, 我又重回母校, 投入她的门下进行研究生阶段的学习. 回到一个师资力量比较薄弱的学习读研, 是件比较浪费时间的事. 不过不幸之中的万幸, 我的老师虽然在技术上没有给我很直接的指导, 但是她对我作人, 作技术的认识, 产生了很深刻的影响, 在此, 回忆起她的谆谆教导, 仍然是感激不尽. 同时老师也给我提供了一些很好的实习机会, 一个我校与日本某公司合作的IT小公司. 现在想起来, 这段实习经历对我的影响非常深远, 实实在在地在一个项目上投入, 去思考, 去反思自己的学习方法和工作方法, 为以后的工作起了一个很好的头. 同时也小小地积累了一点与同事合作的经验.
想起的一点例子就说一说. 当时去公司实习的一共有同期同学七人. 大家的想法和出发点并不一样. 比如我就比较单纯, 当时已经认定技术是自己日后的唯一出路, 所以带着很个的热情和积极性. 可是有些同学已经是工作几年, 是打算通过考研来改变一下自己的方向, 比如变成老师什么的. 还有的是立志于读博士, 走学究这条路. 还有干脆就是通过读研, 再来享受几年大学生活而已. 不同的目的, 就会反映到不同的态度和行动上. 这对于我日后反思自己的行动, 有了初步的参考.
在公司实习了大约一年半, 也结识了几位朋友, 喜欢钻研技术的同道中人. 不过当时作的项目都是基于ASP.net平台的办公室自动化还有土建的工程项目管理平台. 所以也投入了很多的时间和精力去学习.net平台, 以及在此平台基础上的相关技术, 比如ado.net, asp.net, C#等等. 在这段经历中, 我感觉到, 有着明确目标的学习, 要比为了成绩学习, 有更大的驱动力. 目的是因, 行动是果. 给我很深的感触. 而且现在回忆起来当时的学习方法, 非常学生气, 还带着分章节, 划重点这样的应试风格. 而且笔记作得非常之多, 多却无用, 大部分是抄书, 或者是技术书籍的"缩写版本". 虽然一本一本写下来很有成就感, 但是, 没有真正体会其中的意义, 简单的抄写没有什么意义. 现在这些笔记, 除了留一两本作为当年纪念之外, 基本上已经被我用作草稿本了. 呵呵.
补充一句, 别怕吃苦, 因为我上的不是什么名校, 没有很好的学历背景, 那么让自己能在竞争激烈的地方站稳脚跟, 就只能靠自己的业务能力了. 有点危机感, 总是件好事情. 不过不得不承认, 高水平的学校, 无论是知识层面还是知识宽度, 都是我们这些弱校所不能比拟的. 学校给的资源有限, 只要通过努力, 还是可以把这个差距弥补上的. 另外我也看到有名校的学生, 没有充分利用自己所处环境的优势和资源, 以至于没有把自己从高考中获取的领先优势保持下来, 这是件非常可惜的事.