其实想写这篇文章也是因为在这段时期内看了阿里架构师(文初)的blog,我浏览的顺序是从他久远的一篇blog开始看起到最新的一篇,每篇文章都看了,除了技术设计类的文章外,还包含了许多的生活记录以及培训的一些文章,但是不管是什么文章,从中可以看出他个人的职业规划是非常清晰的,他正在努力成为一个更好的架构师!
那么如何符合一个架构师的基本要求呢?这里要说中国中小软件企业的一个误区,很多开发人员做了几年开发后直属上级或者自己认为自己有能力可以脱离项目常规的编码工作,实现转型向更高级别的职位前行,大部分开发人员转型两个方向:管理(项目经理、部门经理等),设计(系统设计、架构设计等),但是恰恰在这个时候大部分的研发人员其实是不具备这个条件的,不是他们不了解自己,不是他们高估自己,而是他们不了解、认不清管理和设计所具备的条件。
管理我简单说说,毕竟没有正规的实际经验,其实管理无外乎几点:计划(资源计划(人、财、物等)、项目或者产品的阶段计划(里程碑计划等)、采购计划等)、风险(风险识别、控制等)、控制监督(阶段成果和计划是否一致的管理等)、协调组织(与客户的协调、与项目组成员的沟通、与其他有关联项目或产品的协调、与其他小组的协调(什么测试、实施啊)等等)、开发经验(不求深入,但求够用),当然很多人会说自己其实具备上述描述的能力,但是我反问一句,你这个能力到达什么程度?或许只有小弟不才,小弟认为上述能力小弟只是了解,还不具备任何能力值,或者你真的具备了!
其实我这篇文章想说的是架构设计师,架构设计师不是所谓的任意研发人员工作几年以后就理所当然成为的,即使你的开发功能能力再快、bug在少、效率在高、运用到项目组提供了开源或者商业的第三方软件,其实你还是一个开发人员,当然这个时候的你不能否认是一个合格的研发人员,但是离架构设计师还是有差距的,差在哪里?
我打个比方,假设现在有这么几种场景(当然下述只是些简单的场景下来实现,并非什么数以TB、PB级别、国防安全性级别):
1、需要在一个项目中做一个安全性高的功能,你如何下手?如何设计?
2、需要做一个简单对日志进行分析的功能,你如何下手?如何设计?
3、需要做一个自定义的job管理器,你如何下手?如何设计?
解决方法是baidu、google来找方法实现,当然这个最快、最方便、不用动脑筋针对性的改吧改吧就符合要求了,在说在baidu和google上能找到的东西几乎千篇一律的雷同,真正核心内容能在baidu和google上找到的很少,当然不排除还是有些文章也是相当有价值的,但是你学到了什么??就好比你在一个项目中从头做到尾,运用了这个牛X的框架,或是什么nosql、数据挖掘、什么高级数据库啊,请问,你又学到了什么???? 对,你学会了应用,你学会了认识,你认识了你的项目用了哪些技术,你用这些技术实现了你的项目功能达到各户满意度,仅此而已!当然这些对工作经验不丰富的人是一种成长,经验的积累,但是我要说的是经验丰富的人,你学到了什么?? 你不要说什么国外的人大把工作10年的人还做开发,是的,不可否认,国外确实这样,但是他们所谓的开发和你所谓的开发内容是在一个级别上吗??
扯淡了半天,说说上面3个设计吧
1、外部和内部安全性
外部无外乎客户端对系统的访问安全:
登录控制:比如登录失败次数控制,异常用户登录即时报警、登录访问日志等
ip控制:对系统内部设定的ip进行屏蔽系统访问,对某些ip进行hash散列访问指定的服务器以及指定的表等
访问链接的控制:控制对直接在ie中输入链接地址进行强制访问
外部无外乎登录成功的用户对系统的访问安全:
页面功能的访问控制、审计功能跟踪等
这个我参考的是oracle、spring security的一些思想,这里只是简单的设计
2、日志分析的功能
我们首先要分析日志的特点:可能大文件、可能非结构化的数据格式
从上述特点我们可以知道要解决的问题,灵活配置,高效性(任务分解,并行执行),那么我我们大致可以分为以下几个步骤:
1)检查日志来源目录,锁定分析的文件
2)产生分析输入(分析的文件大小是否可以采用分片进行并且异步执行来降低输出线程的等待时间
3)检查、定制优化分析输入队列
4)hash分析结果服务器的选择
5)分析结果合并、输出
6)清理分析的日志
这里我参考的是hadoop的思想
3、自定义的job管理器
存储job基本信息内容表、配置job的规则(频率,间隔,执行次数,结束时间、已执行次数等)、task记录表(开始时间,job名称,服务名称,前面几张表的id,这张表中的信息每一条就代表一条被执行的任务,有些已经被执行了有些还未被执行,都通过表中的字段可以区分出来)
这里我参考的是Quartz的思想
其实上述几种场景对于架构设计师而言都是简单的工作,在大项目或者产品中架构师面对的问题绝对不是这么简单的(比如海量数据的处理,terracotta、memcached、readis的选择),那么如何去通过这些问题,想到合理、几乎完整的解决方案呢?即使就是这些简单的工作要想做到最优、效率最高、配置灵活,又何尝容易。
其实到文章的结尾,我其实不想用什么硬性的条件来衡量一个架构师的标准,毕竟成功的方式千万种,我个人觉得想成为架构设计师必须要做到:
1、在做项目的时候首先要知道为什么要用某些开源\商用软件,为什么不选择其他的,还有哪些和这些开源/商用软件类似
2、到底这些开源\商用软件是个什么东西,这就需要深入了解现有项目中运用到的这些开源软件的源代码,起码也要略读几次,了解设计原理以及实现原理
3、只有知道为什么,是什么,才能知道如何去把它放在什么样的场景中来实现优势最大化,来实际体验一把
4、经过实际体验以后,就应该深入的了解了这些开源软件的特点,那么在下次:
1)实现某些简单功能或者需求的时候,就可以自己提炼出一些设计思想,来完成自己的架构
2)实现更为复杂的功能或开源软件无法满足现有项目的时候,来扩展开源软件的代码,实现目标
当然,这个是一个长久的过程,冰冻三尺,技术总在变化,但是思想只会越来越成熟,思想的成熟可以应对任何技术的变化,希望各位目前仍然是程序员身份或者即将转型的程序员踏踏实实沉下去,热爱自己的职业,珍惜自己的生活