<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[架构师的职责 王泽宾]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sat, 10 Apr 2010 17:57:42 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp; 近来看到CSDN上有个CTO俱乐部，里面聊得是不亦乐乎。我怀着无比崇敬的态度，拜读了一下牛人们的发言。里面有个哥们发起一个话题：“CTO, 你多久没有写程序了？”。有人回答：“不写代码的CTO,属于......这公司问题大了!”。看到这里，我就赶紧撤了，怕忍不住反驳几句，反而遭到牛人们的群殴。试想，一个上点规模的IT公司，还得靠CTO来写程序的话，那是不是才叫问题大了呢。当然，我没有做过CTO，所以我有我的不同看法，而且还愿意表达出来，无知者无畏。我情愿相信：我所理解的CTO跟这位CTO所理解的是两回事。所以我想，如果有人能把CTO的职责给标准化了，也许就不会有这么多的争论了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;同样的道理，关于架构师的定义，大家也有着不同的理解。什么是架构师？架构师有哪些职责？我觉得有必要提前明确一下，要不然大家沟通起来也会产生类似问题，子说子理，卯说卯理，但是压根说得不是一码子事。<br/><br/> <br/><br/><br/>3.1 什么是架构师<br/><br/><br/><br/>曾经有这么个段子：<br/>甲：我已经应聘到一家中型软件公司了，今天上班的时候，全公司的人都来欢迎我。<br/>乙：羡慕ing，都什么人来了？<br/>甲：CEO、COO、CTO、All of 程序员，还有会计、司机都来了。<br/>乙：哇，他们太重视你了，人才啊，这么多人迎接你！<br/>甲：没有啊，就一个人！<br/>乙：靠，#%￥$%...<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;很多的创业公司，一人身兼数职的情形还是很常见的。至少，我是经历过的，一个人包办了所有的开发过程，连测试我都做了，绝对的一条龙，但是经常踩钢丝、骑独轮车总会有失足的时候，结果有一次，从我手里发出去的光盘母盘，含有病毒僵尸，以至于被迫收回已经推上市场的2万张光盘，从那之后，我的心脏就开始变得无比坚强，现在就是整个后台服务都瘫痪了，我也只是微微一笑。其实，一个人身兼架构师和程序员，甚至多种角色，没什么不妥，后面还会讲这个话题，这种现象不是中国特色，跟国外是完全接轨的。我曾经跟米国的一个工程师在msn中聊过类似的话题，发现他们跟咱们没什么不同，在IT这个行业，我们跟他们的差距只有1天，他们刚出来的东西，我们保准第2天就能找得到。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师这个称呼不是你我杜撰出来的，是有国际标准（ISO/IEC 42010）可查的。架构师是软件开发活动中的众多角色之一，它可能是一个人、一个小组，也可能是一个团队。微软对架构师有一个分类参考，他们把架构师分为4种：企业架构师EA(Enterprise Architect)、基础结构架构师IA(Infrastructure Architect)、特定技术架构TSA(Technology-Specific Architect)和解决方案架构师SA (Solution Architect)。微软的这个分类实际上是按照架构师专注的不同方向和领域划分的。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;EA的职责是决定整个公司的技术路线和技术发展方向。盖茨给自己的Title就是首席软件架构师，网易丁磊也喜欢这么称呼自己，这实际上就是一个EA的角色；IA的工作就是不断地提炼和优化技术团队积累和沉淀形成的基础性的、公共的、可复用的框架和组件，这些都是一个技术型公司传承下来的最宝贵的财富之一；特定技术架构师TSA，他们主要从事类似安全架构、存储架构等专项技术的规划和设计工作；SA的工作则专于解决方案的规划和设计，“解决方案”这个词在中国已经到了严重泛滥的程度，大忽悠们最喜欢把它挂在嘴边。所谓解决方案，就是把产品、技术或理论，不断地进行组合，来创造出满足用户需求的选择。售前工程师一般都是带着它到客户那里去发挥的。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;大公司会把各种类型的架构师分得很清楚，小公司一般就不那么讲究了，架构师多数是是IA+TSA+SA，一人包打天下，所以说大公司出专才，小公司出全才。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;实际工作中，我们也经常会见到另一种比较简单的分类方式，把架构师分为软件架构师和系统架构师。软件架构师基本上是TSA+IA，这也是程序员最容易突破，最可能走上的一条道路，比如JAVA架构师、DotNet架构师、LAPM架构师等等，我后面所讲的内容都是与软件架构师的相关的话题。系统架构师实际上是SA+TSA，更着力于综合运用已有的产品和技术，来实现客户期望的需求。系统架构师要求通晓软、硬件两方面的知识，所以它的知识体系相对庞杂。关于系统架构师的话题，我们可以稍后再作讨论。<br/><br/> <br/><br/>3.2 架构师的职责<br/><br/>架构师需要参与项目开发的全部过程，包括需求分析、架构设计、系统实现、集成、测试和部署各个阶段，负责在整个项目中对技术活动和技术说明进行指导和协调。 <br/>架构师主要职责有4条： <br/><br/><br/>1、确认需求<br/>&nbsp;&nbsp;&nbsp;&nbsp;在项目开发过程中，架构师是在需求规格说明书完成后介入的，需求规格说明书必须得到架构师的认可。架构师需要和分析人员反复交流，以保证自己完整并准确地理解用户需求。<br/><br/><br/>2、系统分解<br/>&nbsp;&nbsp;&nbsp;&nbsp;依据用户需求，架构师将系统整体分解为更小的子系统和组件，从而形成不同的逻辑层或服务。随后，架构师会确定各层的接口，层与层相互之间的关系。架构师不仅要对整个系统分层，进行“纵向”分解，还要对同一逻辑层分块，进行“横向”分解。<br/>&nbsp;&nbsp;&nbsp;&nbsp;软件架构师的功力基本体现于此，这是一项相对复杂的工作。<br/><br/><br/>3、技术选型<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师通过对系统的一系列的分解，最终形成了软件的整体架构。技术选择主要取决于软件架构。<br/>Web Server运行在Windows上还是Linux上？数据库采用MSSql、Oracle还是Mysql？需要不需要采用MVC或者Spring等轻量级的框架？前端采用富客户端还是瘦客户端方式？类似的工作，都需要在这个阶段提出，并进行评估。<br/>架构师对产品和技术的选型仅仅限于评估，没有决定权，最终的决定权归项目经理。架构师提出的技术方案为项目经理提供了重要的参考信息，项目经理会从项目预算、人力资源、时间进度等实际情况进行权衡，最终进行确认。<br/><br/><br/>4、制定技术规格说明<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师在项目开发过程中，是技术权威。他需要协调所有的开发人员，与开发人员一直保持沟通，始终保证开发者依照它的架构意图去实现各项功能。<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师与开发者沟通的最重要的形式是技术规格说明书，它可以是UML视图、Word文档，Visio文件等各种表现形式。通过架构师提供的技术规格说明书，保证开发者可以从不同角度去观察、理解各自承担的子系统或者模块。<br/>架构师不仅要保持与开发者的沟通，也需要与项目经理、需求分析员，甚至与最终用户保持沟通。所以，对于架构师来讲，不仅有技术方面的要求，还有人际交流方面的要求。<br/><br/><br/>3.3 架构师的误区<br/><br/><br/>1、架构师就是项目经理<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师不是项目经理。项目经理侧重于预算控制、时间进度控制、人员管理、与外部联系和协调等等工作，具备管理职能。一般小型项目中，常见项目经理兼架构师。<br/><br/><br/>2、架构师负责需求分析<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师不是需求分析员。需求分析人员的工作是收集需求和分析需求，并与最终用户、产品经理保持联系。架构师只对最终的需求审核和确认，提出需求不清和不完整的部分，他会跟需求分析员时刻保持联系。架构师是技术专家，不是业务专家。<br/><br/><br/>3、架构师从来不写代码<br/>&nbsp;&nbsp;&nbsp;&nbsp;这是一个尚存争论的问题。目前有两种观点：<br/>观点1：架构师不写代码，写代码纯体力活，架构师写代码大材小用。架构师把UML的各种视图交给开发人员，如果有不明确的地方，可以与架构师随时沟通。<br/>观点2：架构师本来自于程序员，只是比程序员站的层面更高，比程序员唯一多的是经验和知识，所以架构师也免不了写代码。<br/>&nbsp;&nbsp;&nbsp;&nbsp;我个人觉得这两种说法是与架构师的出身和所处的环境有关。<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师首先是一个技术角色，所以一定是来自于技术人员这个群体，比如系统架构师，多是来自于运维人员，可能本身代码写得并不多，或者说写不出来很漂亮的代码。软件架构师多是来自于程序员，有着程序员的血统和情怀，所以在项目开发过程中，可能会写一些核心代码。我们的理想是架构师不用写代码，但事实上有时候过于理想。架构师写不写代码，可能取决于公司的规模、文化、开发人员的素质等现实情况。<br/><br/><br/>3.4 架构师的基本素质<br/><br/>周星驰有个片子《喜剧之王》，剧中的尹天仇整天揣着本《演员的自我修养》，一个好演员不仅需要天赋，也需要一定的理论指导，无师自通的人毕竟是少数。架构师的成长过程也是这样。从普通程序员到高级程序员，再到架构师，是一个经验积累和思想升华的过程。经验积累是一个方面，素质培养是另一个方面，两者相辅相成，所以我觉得有必要把架构师的所要具备的素质罗列一下，作为程序员努力的方向。<br/><br/><br/>1、沟通能力<br/>&nbsp;&nbsp;&nbsp;&nbsp;为了提高效率，架构师必须赢得团队成员、项目经理、客户或用户认同，这就需要架构师具有较强的沟通能力。沟通能力是人类最普遍性的素质要求，技术人员好像容易忽略，架构师不能忽略。千万不要抱着这样的观念：怀才跟怀孕似的，时间长了总会被人发现的。还是天桥上卖大力丸的哥们说得对：光说不练假把式，光练不说傻把式。看看你周围的头头脑脑们，哪一个不是此中高手，我们不要鄙视，认为是阿谀奉承、投机钻营，你要看到积极的一面，这的确是一种能力。我自认为自己是一个略内向的人，因为我是农村出来的孩子，总带有点自卑感，总想着是金子就会发光，职业道路中确实吃了不少亏。现在，我懂得了沟通的重要性，而且也很主动跟同事们，跟老大们定时沟通，工作起来顺畅多了。这一条我认为最重要，所以排在首位。我甚至于认为下面几条忽略都行，就是这一条得牢记，有意识的提醒自己。<br/><br/>2、抽象思维和分析能力<br/>&nbsp;&nbsp;&nbsp;&nbsp;架构师必须具备抽象思维和分析的能力。程序员如何具备这种能力呢？一是来自于经验，二是来自于学习。架构师不仅要具备在问题领域上的经验，也需要具备在软件工程领域内的经验。也就是说，架构师必须能够准确得理解需求，然后用软件工程的思想，把需求转化和分解成可用计算机语言实现的需求。经验的积累是需要一个时间过程的，这个过程谁也帮不了你，是需要你去体会的。但是，如果你有意识地去培养，不断吸取前人的经验的话，还是可以缩短这个过程的。这也是我写作此系列的始动力之一，这对我这个大龄青年来讲已经没有保留的意义了。当你是初级程序员的时候，我已经是高级程序员了；当你做高级程序员的时候，我已经是架构师了；当你是架构师的时候，我已经是首架了；等你首架的时候，我已经退休了；等你退休了，我又投胎了......。<br/><br/>3、领导能力<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;架构师能够推动整个团队的技术进展，并能在压力下作出关键性的决策，并将其贯彻到底。要提高效率，构架设计师和项目经理必须紧密协作。构架设计师主要负责解决技术问题，项目经理主要负责解决行政管理问题。构架设计师必须有权在技术问题上作出决定。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种能力与技术基本无关，但我为了使文章的看起来完整、严谨，还是加进来了。其实，你只要拿到最重要的人权和财权，再扯上一张“领导”的虎皮，采用“胡萝卜加大棒”的方式，基本上可以保证执行力，除非自己是个“蛋白质”。其它能力不写了，你慢慢体会吧。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 总而言之，一句话：架构师是项目团队中的技术权威。<br/><br/>面向过程和面向对象这两个概念，不仅架构师需要非常清楚，程序员也要清楚，这也是系统分析、设计和编码最基本的思维方式。我接触的程序员，很多人只停留在一种“似是而非”的程度，想要继续前进，就得把基础夯实，所以很有必要回回炉，补补课。<br/>---------------------------------------------------------------------------------------------------<br/>后记：在讲面向对象之前写了这么一篇，主要就是要把前面漏下的功课补上。<br/><br/>http://lightbluer.javaeye.com/blog/340936
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 架构师的职责 王泽宾]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>