您的位置:首页 > 职场人生

好东西大家分享:程序员学习的三个境界

2007-08-09 16:44 381 查看
语出朝禅师青原惟信:“老僧三十年前未参禅时,见山是山,见水是水。及至后来,亲见知识,有个入处,见山不是山,见水不是水。而今得个体歇处,依前见山只是山,见水只是水。”

第一境界:见山是山,见水是水
内涵:初次接触,随意观察,表面印象,没有深入探讨。

对于我们程序员来说,初识一门程序语言,乃第一境界。了解这门语言的语法,如何声明和初始化变量,如何用三大基本结构:顺序、分支、循环,如何写函数,如何构造类,了解这门语言的函数库、类库……特别是对于我们计算机系的学生来说,课堂上讲的全部搞清楚,作业全部完成,考试轻松90,也仅是达到了第一境界而已。但是,很多计算机专业的同学却没有这样的意识,总以为课堂上学会了,就通了,牛先吹在前面,说“精通某某语言,同时还精通某某语言……”,让人“肃然起敬”。而真真开始做具体的项目了,却还是停留在“作业”阶段,一连串函数写到底,或者就是一个类通吃……不懂如何划分模块,不知道怎么设计类的结构,“高内聚低耦合”就更别提了……退而求其次,用软件流水线模式来分配任务,在编码阶段提供一个模块的功能、入口及出口,仅要求完成模块的功能吧,确实功能实现了,打开源码一看,程序结构一团糟,编码毫无风格可言,没有任何注释……曾经听过印度一个教授的讲座,印度计算机学校的高中生大都已经达到了在“第一境界”中游刃有余的地步,唉,感叹国内的计算机教育。

第二境界:见山不是山,见水不是水
内涵:进入怀疑、批判阶段,疑团满腹,眼前是假象。

一般,达到了“第一境界”后,初识了一门语言,是远远不够的,按理应该是继续深入下去。但是,对于我们计算机系的学生来说,却只能遵照计算机高等教育的要求,学完了C,就是汇编,然后就是C++或JAVA,抑或.NET,假如学网页,又是ASP、JSP、JavaScript、AS(Flash)……一个接着一个,都是表面印象,什么都懂,什么都做不来。是否会思考一下,难道计算机程序语言就那么回事么?语言间是否存在着什么本质关系?……假如有过如此思考,那么恭喜了,你已经在摸着石头过河,河对岸就是“第二境界”。
所谓“第二境界”,就是否定阶段,不断地怀疑、批判这些的表面印象,然后通过推理、思辨得出事物的本质。这些否定,或许感受不到,但却时刻隐藏在学习的过程中。那么程序语言的本质又是什么呢?思想。面向对象思想应该是耳熟能详了,其实面向过程有思想,编写程序代码的时候有思想,写文档的时候有思想,测试的时候有思想……思想无处不在,却悄无声息,如何把握就成了这个境界的关键。
对于面向过程来说,分层,划分模块,确定数据结构就是重中之重;面向对象的精髓就在于如何把现实世界抽象出一系列具体的模型,以及确定模型的各部分彼此之间的关系,然后具体到面向对象的技术,继承与组合,耦合与内聚,信息封装,消息传递,以及重构、设计模式等等;编写程序代码时,如何通过缩进、换行来使代码的阅读更为方便;实现具体功能时,如何对数据结构的进行合理的操作,以及算法的实现;写文档时,如何做到自己写的东西结构清晰,其他项目组的成员能够一目了然;测试的时候,单元测试、集成测试如何来做,测试应该在何时进行,是否需要TDD,软件的构建周期如何确定……
除了以上这些一目了然的思想、准则,我们计算机系的学生其实应该算是幸运的,因为每天,在课堂上,我们都接受着一系列计算机科学家们所总结的理论、技术、经验和思想。数据结构,算法,微机原理与接口技术,数据库,操作系统,软件工程……虽然我很重视这些课,有个计算机专家说的好,语言是外功,基础是内功。在大学里学习的时候,我们应该做到以内功为基础来练外功。但事实上,这些计算机基础课是否确实有用,还是存在不少争议。记得曾经某高校硕士就公开叫板教育部,说自己3年硕士白读,学了7年计算机理论,发现自己根本跟不上计算机技术发展的潮流,虽然这有点偏激了……还有在csdn上转悠,发现讨论高校计算机教育的帖子,最后大多都成了水帖……感叹,所以对于此,我持保留意见……但就从我自己的经验上讲,好好学还是不会错的。1年以前,我大二时做一个J2EE的项目(J2EE框架+Flex),确实把那些基础全部扔在了一遍,整天抱着Thinking in Java和Java API Specification,充其量还有一本数据库原理及UML参考资料;但是当我投入Linux的怀抱,学习系统编程的时候,微机原理,数据结构,操作系统,几本以前积了一层灰的书都放在了案头;做网络编程的时候,则是TCP/IP原理;现在涉及到了嵌入式Linux系统,要写设备驱动,微机原理与接口技术,逻辑电路,汇编语言,操作系统则是必备的参考资料。
对于计算机专业的同学们,今后到底从事什么方面基本还是未知数,所以应该为将来做好一切可能的准备,好好学习这些理论技术,要知道,任何前沿技术都是以计算机科学理论为载体的。

第三境界:见山只是山,见水只是水
内涵:分析后获得领悟和证明,用事物的本质重新看待原有事物。

这里的“只是”又回到前面那知识表面上了吗?不是,也没有落到第二阶段“不是”的层面上。这个“只是”就是看出事物真正实质性的东西,通过对它表面的东西的观察,看到它“只是”,再通过经验去推理、去分析,然后形成一种独有的理念,看出事物的另一面,也就是更深刻的一面。但是这还不够,还要在这种基础上再进一步观察,在某种高度上观察,此时会发现原来“只是”这个东西。
在学习编程过程中,当达到了第二境界时,你就会发现学习编程语言异常容易,本质相同,不同的仅是表面的语法结构和函数库而已。学好了C++,学好了面向对象思想,再学Java能不轻松么?至少我仅花了2天就学会了使用Java语言,但仅是使用而已。在这个时候,既然思想已掌握,入门很轻松,那么就要想着如何去使用认识到的思想来重新回归到学习语言的过程中,去精通一门程序语言,让其成为自己的立足之本。
选择一门最感兴趣的语言,熟练掌握标准库,熟悉编程细节和技巧,熟练使用与该语言相关的编译器、调试器,然后逐渐从语言层次向底层靠拢,程序的汇编码,VM Specification等等都要有所了解,这样才能从本质出发去使用编程语言及分析代码,查错也好,性能瓶颈分析也好,都有很大的帮助。当你可以说能够做到驾驭这门语言的地步,能够使用其来和谐地指导实践,那么说明,你已经合格了。
对于我们计算机系的同学们,无论学过了多少种语言,精通一门语言是非常必要的,这里所说的“精通”,当然是指使用这门语言达到了第三境界。
通过不断地学习、练习、实践(项目)的方式,我个人认为,要达到第三境界,应该是远在天边、近在眼前的事,主要就在于你自己,有没有这样的信念。

PS:最近在看一本关于“禅悟”的书,结合自己3年来计算机本科的学习实践,有了这样的一些感慨,就趁着还在大脑记忆曲线的波峰,写下了这些心得……关于“禅悟”,弟子愚昧,并不清楚到底参悟了多少。“道可道,非常道”,能用语言来表达,执着于文字表面,说明我离“道”还相去甚远呢。如此生动活泼的“禅”,却被我这个不知天高地厚的“褴外人”给荼毒了,在此谢罪……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: