接触编程到现在已经有5个年头了(2005-2010),从最初对计算机的一无所知,对各种技术的一路彷徨走到现在懂得如何去分析开源代码,慢慢看清各种技术路线走过太多的弯路,到现在自己也许仍然称不上是一名合格的程序员,只是庆幸的知道了努力的方向。记录下这条成长之路,以此纪念那些逝去的日子。
学习计算机大多是从编程开始,因此搞IT的也多半被人看成是程序员。程序员是学习计算机的一个阶段,而且是一个比不可少的重要阶段,好比是一栋楼房的地基,将决定着你所能达到的高度。然而对于如何成为一名合格的程序员却有多种不同的看法,有人认为会用一种编程语言编写程序就能称为程序员,也有人认为程序员必须精通多种语言,精通算法和数据结构等等,这些观点无所谓对错,皆在各自的理解。因此也在此谈谈自己的理解,一家之言。
学习编写软件我觉得大体上可分为以下几个阶段:Coder,Programmer,Engineer,Architect,Consultant。
Coder阶段为最初接触编程,学习一门语言的时期,这个阶段主要是尝试用一种语言来编写程序,接触和习惯采用计算机的方式来思考问题。学习一门容易的语言能让这个过程走得更愉快,如果不小心选了一门很艰难的语言,有可能一开始就感到沮丧而放弃。Coder阶段一般会在1年左右,当然视不同的情况,也有可能1-2个月就能度过了。在整个阶段,随着对程序代码的逐渐熟悉,慢慢的会关注一些代码风格或样式,以及代码重构方面的问题,这是实现模式方面的一些思考和觉悟,同时也意味着将要进入Programmer阶段了。
Programmer阶段是大多数人最熟悉的阶段,也是停留比较久的一个阶段。这个阶段需要学习的东西很多。首先需要尝试去理解和领悟一种或多种编程思想,目前面向对象编程受到最多的关注,因此面向对象编程思想将作为此处讨论的主要领域。同时在这个阶段需要去掌握一些计算机的基础知识,学习程序的核心-数据结构和算法,了解程序是如何被编译成机器代码,并且被计算机中的硬件所执行。掌握了这些对于理解和编写程序有很大帮助。这个阶段也会接触到不同的编程语言,去了解和分析它们之间的区别和各自的特点,从而了解一种语言的使用场景,从而掌握根据应用场景来选择开发语言。这个阶段一般需要2年左右的时间,编写5万行代码以上。在整个阶段中,随着对程序中类和对象的逐渐熟悉,慢慢会关注对象之间的关联和交互,以及程序的可扩展性和可重用性等问题,这是设计模式方面的一些思考和领悟,从而可以迈入下一个阶段。(Programmer阶段是一个计算机专业本科生所应该达到的)
Engineer阶段(软件工程师)是公司中大多数编程人员所处的阶段。这个阶段将更多的关注软件工程开发方面的知识,关注如何团队协作而不是单兵作战,关注如何在有限的资源和时间内开发出满足要求的软件系统而不是一个小的应用程序。这个阶段将学习和掌握相关的软件开发工具,开发方法,开发过程。工程化软件开发三个最基础的技术是版本控制,自动构建和单元测试。然后还需要掌握一种建模语言(最常用的为UML语言)作为不同开发人员之间交流的基础。对于开发工具的熟练掌握可以提高效率,对于开发过程的有效实施可以确保项目的成功验收。同时还需要了解不同的技术体系,如J2EE体系和.NET体系。在这个阶段中,随着对软件的不断理解,将逐渐关注组件之间的分工和协作,并且开始有了架构模式方面的一些思考。从这个阶段开始将出现一个岔路,偏技术的将上升为Architect阶段,而偏管理的将上升为Consultant阶段。(Engineer阶段是一个计算机专业研究生应该达到的)
Architect阶段将开始关注软件架构方面的设计,而一个软件的架构跟其应用场景是紧密相关的,因此设计一个好的软件架构必然需要了解这个软件所应用领域的相关知识,深入了解软件的需求和运行环境,平衡软件的功能和性能,提高软件的可维护性和可复用性。这个阶段需要掌握一些常用的架构,如MVC和OSGI,以及一些常用的框架,如Spring,Structs等。
Consultant阶段关注的就比较偏管理,经济法律,行业知识等,属于学IT的一个转型,不是很了解,也不多说了。
在纵向分析了这些个阶段之后,再来看看这些阶段之间的横向联系,也就是其学习路径。如下所示,在成长过程中,关注的焦点基本上依次是程序,方法,过程,工程,组织。
同样在整个学习过程中深入了解和掌握几种技术体系也是非常重要的。目前最常见的一些应用软件技术体系有J2EE体系,.NET体系;在分布式计算领域,有CORBA体系,Web服务体系。
开始学习编程5年来,也就只是对上述内容有了一个大致的了解,很多内容也只是一知半解,或仅只其名,想想又感到一阵汗颜,自己不了解的东西还是太多了。
从07年开始接触一个项目以来,在学习编程方面自己走了不少弯路,最终弄明白一些事情也是花费了很大时间和精力的,但值得庆幸的是在这个过程中慢慢学会了独立思考的能力和解决问题的能力,这应该算是最大的收获吧。
这几年的编程,基本上是使用Java语言进行面向对象编程,非常的单一和狭窄,仅有的收获也就是在面向对象方面的一些思考吧。
面向对象的学习,这几年基本上经历了四个阶段:
1)学会如何封装;此阶段学会使用类来封装代码,但仍然是面向过程的思想。
2)学会如何继承;此阶段学习通过面向对象的思想来对现实世界进行建模,开始思考类之间的联系。
3)学会设计模式;此阶段学习如何灵活的组合使用类之间的几种关系来为一个特定的问题提出解决方案。
4)有原则无模式;设计模式本质是遵循设计原则的一个特定问题的解决方案,因此模式是器,而原则是道。面向对象编程的最高层是遵循原则设计自己的模式。
面向对象设计原则简单说可概括为“高内聚低耦合”。高内聚:对象内的数据和方法是紧密相关的;低耦合:对象之间的依赖应当比较小,一个对象发生改变时,不应当对不相关的对象产生影响;
回顾和总结过去是为了更好的前进,经验是对过去的思考而不是重复。
PS:本还想续写些关于面向对象方面的文章,但一由于这方面的文章太多了,二是在看了EricZhang的系列文章后,感觉其理解和叙述都比自己要好,因此也就搁笔,在此引用下其文章,有兴趣可拜读下。
OOA&D实践之路 http://www.cnblogs.com/leoo2sk/archive/2008/12/08/1350243.html
OO真经——关于面向对象的哲学体系及科学体系的探讨 http://www.cnblogs.com/leoo2sk/archive/2009/04/09/1432103.html
面向接口编程详解 http://www.cnblogs.com/leoo2sk/archive/2008/04/10/1146447.html