人人都是架构师
在程序员这个行业里,一直就是不停学习,不停进步的过程,一般的成长路线为:初级程序员->高级程序员->架构师。当然也有的人在半路转行了。
程序员进化图
每个真正的程序员,可能从一开始学习编程,一入门,就会有一个最终目标,就是成为架构师。在这个行业里,架构师给人的感觉就是全知全能,技术过硬,没有任何问题能对架构师构成威胁。
为了能变身成为架构师,大部分人都是不停的学习吸收新知识,广泛接触各个行业,做多种不同类型的项目,以达到融汇贯通,进而编码功力得到提升的目的。
在修炼成架构师这条路上,有太多的人努力,也有太多的人放弃,但是却不知道我们人人都是架构师。
为什么这么说?
可以留意一下架构师的工作,无非就是找到合适的技术路线,然后组织适当的资源,去完成客户的需求。
解决问题的方法
这样一想就会发现,就算是刚入门的初级程序员也是一个小小的架构师,他的工作也是选择合适的技术路线,然后组织资源,去完成客户的需求。
只不过因为刚入门,技术路线比较狭隘,会局限在当前所学编程语言的范围内,能用的资源也比较少,相对来说需求也很明确,功能也少,涉及到的其它功能更少,而面对的客户,就是高级程序员,所有的接口呀,功能定义呀都已经确定,小小的初级程序员只是按照这些要求,选择一个合适的算法去实现而已。
就算是这样一个小小的动作,也已经算是完成了一次架构工作,初级程序员这时候不会意识到这是在做架构相关的事情,只是觉得就是完成一个函数,一个功能模块。如果深入思考一下,在完成这个函数,这个功能模块的时候,会不会考虑代码的实现逻辑,会不会考虑变量的类型,声明位置,哪怕是一个循环,也要考虑初始值,终止条件这些问题。
这时候手头上的资源,就是所用语言的特性,编写代码的过程,也就是灵活的运用这些内容。只有真正的灵活运用这些特性了,才会有可能从初级程序蜕变而成高级程序员。
一般来说初级程序员解决问题的方式是从点到面,从下而上,从细节到整体。而且可以说,只要初级程序员多写写代码,多看点书,认真总结一下自己的知识体系,总会成为高级程序员。
做为高级程序员,就不只是对语言的熟悉,而是了解的领域更多,可使用的资源更多,面对的问题更复杂,这时候,高级程序看问题的角度更全面,从库的级别开始分析问题,从整体角度思考程序的运行模式,以及可能遇到的难题。
高级程序员的方法论
高级程序员这时候做的事,已经接近于大家认为的架构师应该做的事。他会根据需求写出程序的架构分析文档,会有一套自己解决问题的思路,会有一些成熟的自己的代码来套用到不同的项目中。这个时候的程序员,对其它知识了解的够多,已经能够担当起某个方向的大型任务,为上级领导提供稳定的、可靠的技术支撑。
在高级程序员解决问题的过程中所用到的资源,包括了对入门时语言的了解,对其它语言的了解,对所用功能库的了解,对系统其它功能模块的了解。这些方面的了解情况,都决定了这个高级程序员是不是还能再向上走。可能有些人认为已经什么都会,什么都懂,不过我要说,这时候可能只是知其然,而不知其所以然。如果在这时满足了骄傲了,就会止步于此,在余下来的时间中蹉跎。
另有一些人,始终保持着对技术更深入了解的兴趣,始终有着研究新东西的兴奋感,或是对程序的运行更有兴趣而深入思考,他就会再向前走一步,迈过高级程序员这个坎,拥有架构师的能力。
疯狂学习的程序员
架构师要做的事其实就是上面所说的内容,为项目确定技术路线,组织适当的资源。当然这里的技术路线,就不是使用什么算法,什么语言这种问题了,他面对的是不同的系统构成,面对的是不同的平台这样级别的问题,在这些不同的系统之间,平台之间的程序,使用什么开发方法让它们能联合工作起来。这里的资源,可能是指不同的工作组,不同语言编写的程序。架构师已经不局限于什么语言,什么框架,而是用最直接的方法,最合适的语言来解决问题,哪怕是两个相同的功能,如果运行环境不同,也可能会用不同的方法解决。
通过上面这些分析不难看出,我们人人都是架构师,只是在不同阶段所掌握的技术不同,能使用的资源不同,解决问题的复杂度不同。这样来说,在每个阶段都要注意自己的架构能力的锻炼。面对问题时,善于把大问题分解为小问题,把复杂问题分解为简单问题。因为每个大问题,都是无数小问题的集合;每个复杂问题,都是无数简单问题的集合。在掌握了统筹解决更复杂问题能力的同时,也就向更高一层次迈进了一步。
可能在这时候,有些人会觉得分解问题不是难事,但这也正是架构师之所以是架构师的原因,架构师掌握的不是固定的套路,而是分析问题的一个方法,不是某个语言框架,而是整合这些框架的能力。他会深刻的知道哪些框架能做什么事,为什么能做这些事。在他们解决问题时,看似没有规律可循,其实是他们只用合适的方法,只从最直接的地方入手。他们可以从最根本上对问题进行分解,分解为一个个简单的小问题,从而最终完成整体设计。
分解问题
拿一个分布式文件系统的例子来说,整体看上去是可以整合无数机器的运算能力,达到无限存储的功能,细分来说,也就是网络通讯、上传文件、下载文件、备份防丢失、原子操作保证同步等功能,然后再给出一个简单易用的接口。这些小功能堆积起来,就是一个强大的分布式文件系统。
总的来说分解问题的能力,就是区别一些程序员能力的根本所在,说到底,就是一个方法论。因此可以说,架构师不难修炼,也不神秘,只要从最基本处着手,不停的壮大自己的知识体系,拓展自己的眼界,增强自己分析问题,解决总是的能力,自然会有修炼成功的那一天。