再其次则是相对比较传统一点的部分,不管从哪里开始迭代,总是要切分前端后端的职责,设计彼此交互的接口,要区分出来哪些是纯工具型的模块(比如日志),哪些是基础设施型的(比如用户管理与权限),哪些是可以彻底进行迭代的(比如具体的某个功能)。这些东西之间是有一种内在的时序关联的,不是简单一句:我们迭代吧,我们测试驱动开发吧,就可以的,那会导致很大的混乱,所以这里也是架构师要扮演角色的地方。传统上管这个叫概要设计,虽然这词现在不怎么用了,但这词其实还不错的。当然架构师不一定要一个人搞定所有这些事情,而是要肩负起协调大家搞定这些事情的职责。这个地方依赖于产品的类型对业务知识的要求程度不同:一般来讲越是面向个人的产品,在业务知识上要求越低;越是面向企业的产品业务知识的要求越高。简单讲做天气应用的时候可能直接做就行了,但做财务应用时了解财务的某些知识就挺必须的。 最后一项则是分工后的一种协作的方法,这里面包含着分支策略,持续集成策略等。 显然的,下面两种分支策略下,团队的协作方式不一样.。 图片来自网络(出处) 这是又一个全局性的工作,干活前需要预先定下来应该也是没疑问的,但是不是架构师搞定这事上,不同人的认知可能会不一样,有的人会认为应该是项目经理类的角色来搞定这事情。我个人则坚持认为理想情形下应该架构师搞定这事,因为分支策略等受技术的约束更大。 这就是我理解中架构师的要干的三类活:选择Tech Stack,概要设计来确立分工的基础,确立协同的方式。 在开发产品时,这三样事情不搞定,迭代都不好迭代。抽象点来看是这样:假设说在现有人员的基础上,预先搞定某问题需要耗费的成本为X,而迭代后,事到临头再处理,其耗费的成本为Y,那么无疑的Y>X的问题都应该是尽可能预先处理的问题,而不能以迭代为借口堂而皇之的进行忽视。而上述三方面问题,基本上是Y>X这类。 如何成为架构师? 首先想说的是程序员不一定要成为架构师的,优秀的程序员一样很有价值,但关键要看技术领域,我在程序员可以只关心技术么? 专门说过这事,这里不再展开。真要想成为架构师事实上总是有两类方法,这两类方法倒不局限于架构师的学习,而是普适于任何学习。 一种是从概念规则到实践,一种则是从实践总结出概念和规则。数学更近似前者,而历史更近似后者。当我们试图先抽象出什么是架构设计,架构设计又有那些原则,之后再让大家了解现实中的架构设计如何做时,无疑的采取的也是前者的方式,也就是数学的方式。这种方式在现实中比较常见,但在逻辑上是有问题的:正是因为对架构设计的不理解,才尝试学习架构设计,即如此想学习的人天生在了解架构设计的概念与原则会遭遇困难。 出于这样一种考虑,最好的办法其实是先了解一些最基本概念,比如前面说的那些,再了解一些最基本的原则,比如:正交,信息隐藏等。之后就不在抽象概念层面打转了。而了解多个现有典型产品的架构,比如上面说的Trello,WordPress等。这时候最好对产品归类,在特定类别下抽象出来一些典型的架构模式。比如:软硬一体产品的架构,CMS的架构等。这样一来,如果一个人可以主要学习其中之一,顺道了解其余,那就可以比较迅速的掌握架构设计的知识,至少是上面说的架构设计中的前两类知识:Tech Stack的选择与概要设计。在开源的时代里,这已经成为一个人坐在家里就可以完成的事情了。 一点呼吁 最后做一点呼吁。现在各种架构设计的课程还是比较多的,但基本上都是按照第一条思路来的,比如:讲架构设计时会去尝试把架构设计分解为逻辑架构,运行架构等。从身边人的效果来看,普遍不太理想。有实力的培训机构可以尝试总结架构的模式,以一个总纲带领几个典型领域的架构分析,比如:CMS就参照WordPress来讲架构,基础JavaScript库就参照Backbone这种等。也不用太多,覆盖典型的4~5个领域就可以解决很大的问题了。这应该会更有效果,但课程创建上会比较吃力些,真想做的人要有思想准备。我个人曾经尝试和南京的TalenCamp按照第二条路来设计课程,但由于各种原因暂时进展不太大。 作者介绍:李智勇,V众投发起人,《完美软件开发:方法与逻辑》作者。目前正在免费发布《程序员生存定律》,微博:李智勇SZ,微信:vfacebook。 |