中国软件架构师语录
摘自:http://news.csdn.net/n/20090306/123867.html
梁永昌(趋势科技研究部和软件系统架构部副总裁):
软件架构师在工作的范围和责任上与盖房子的建筑师很类似,必须知道他要盖的是什么房子,有多少预算,施工期有多长,现在要的是两层楼,但以后会不会要加盖上去,厕所要几个,厨房在哪里,哪里要设门,哪儿要开窗,梁柱要多粗,要用什么材料?因为,盖四合院和十层大楼是不一样的。
同样,软件架构师必须知道他要设计的是什么软件,将被什么样的客户在什么样的环境下使用,可使用系统资源限制是多少,兼容性要求高不高,安全要求是什么等级,会不会有下一个版本,下一个版本又将增加什么功能,模块和模块之间的关系是什么,每一个不同的考虑都会影响设计,软件架构师就是要在考虑过种种因素后决定软件的架构和使用技术。
其实商业软件架构师最大的挑战还是在折中的拿捏上。人力总是不足,时间永远不够,面对现实状况的压力,当完美设计(每个人都如此自认)无法如愿被全盘采用时,讨论(或争吵)就不可避免,效能可不可以让步,安全等级能不能降低些,哪些项目可以改变,哪些又该坚持到底,这些都是要做出的决定,而且更重要的是要能让大家充分了解你做此坚持是出自何种考虑。
软件架构师的工作伙伴大都也是技术人员,就像自古文人相轻一样,技术人员彼此的尊敬只会建立在技术能力的优越性上,软件架构师必须要有深厚的技术底子和宽广的业界信息,再加上一点口才和亲和的态度,这才容易获得其它工程师的认可和尊敬,也才不会你画你的十层楼,他盖他的四合院。
廖恒毅(佳软公司董事长):
当然,软件复杂度的问题其实比这个问题(指数爆炸问题)更加难解,所以我们到现在为止,还没有找到软件中的这个对数算法。但是,基于目前软件界的认知,我们多少有了一些解决方案:对象编程,组件模型,多层结构……,已经为软件设计提供现实可行的方法。问题是,这些概念理解起来也非常不容易。大家都说着同样的词汇,却有可能干着完全不同的事情,所以才会有误解,才会有争执。软件架构师是一个靠无数经验积累的结果。尤其是优秀的软件架构师,跟所有别的能够成为“师”的职业一样,在对自己的行业有了基本的了解之后,在自己不断成长的过程中,并没有一定的套路的。靠的是领悟力,靠的是对这个现实世界哲学性的思考。当用哲学的眼光来观察这个世界的时候,就离一个优秀的软件架构师不远了。
一个优秀的软件架构师,如果他愿意学的话,同样应该能够做出很香的饭菜来,因为软件架构师和厨师有相通的地方。大家以为如何?师者,通也。
何健(金算盘CTO,首席架构设计师):
架构师是客户需求和开发者之间的桥梁。在软件行业中,一般提到的架构师是技术架构师,而实际上产品架构包括业务架构和技术架构,只有技术架构和业务架构紧密结合才有可能真正创造出一个好的系统。
产品架构是现代应用开发领域最重要的课题。在这个课题里,没有终结答案可寻,惟有恒久的问题存在。在纷繁的问题中,最重要和最“真”的问题是产品竞争力问题。除此之外,软件架构的目的还包括满足既有客户需求和提高开发效率,并且要求产品架构能更好地支持商业流程,有利于企业业务集成。
首先,架构是技术。按照摩尔定律的推断,软件业的技术也同样在日新月异地发生着变化,我们已经见证了开发工具越来越短的生命周期。从VB到ASP.Net,从C到Java,无论采用什么新的语言,都体现了不同时期的架构要求。架构已经跨越了简单的过程模型,对象-时间模型,而今更多的是谈论MDA,模型的快速建立,使得软件能够快速适应用户变化成为了可能。而采用先进的技术,使得软件能够更加深度地满足客户需求。技术本身的发展是无止境的,如何使得软件能够适配新技术,成为一种更为重要的技术。采用各种模式的设计、逻辑分层、降低技术耦合使得技术的融合成为可能,也成为一项高难度的技术。
其次,架构是艺术。产品架构师需要捕捉技术和业务这个完整拼图里的某一块或某个脉络作为设计的线索。架构师永远不是先知,而是“存在的探索者”,产品架构的结果要在产品开发周期完毕时才能被印证。产品架构既要反映对技术的需求,使得架构满足对技术的适配,对发布模式能够提供多样化支持,能够满足性能的要求,还能够满足对业务管理的需要,要适应目标应用的业务特性。这样的架构,才是为应用服务的软件架构,而不仅仅是一个简单的可重用的技术工具。更重要的是它具有软件的管理基因,正如平台能够得到大量客户认可,其中最主要的就是它为客户提供了技术平台、管理工具、基础业务,并使得它们有机地高效地结合在一起。如同流淌的艺术作品一样,充满了生机和互动。
同时,架构是质量。好的架构可以使得软件产品成为一棵常青树。在和国内外软件产品对比分析的时候,经常有这样的感悟,其实好多国外的软件产品,采用的技术并不是最先进的,但是它具有非常优秀的质量,产品稳定可靠,同时还具有良好的技术适配能力,从而使得产品适应技术变化的能力非常强。这样,投资人对软件的投资价值能够得到最充分的体现,这是国内职业经理人非常值得关注和学习的。
陈小群(互信互通信息技术有限公司研发主管):
软件架构对软件系统来说就象建筑结构对建筑物、人骨架对人一样,是其它成分的基础,是满足功能和性能需求的关键,因此,软件架构师对软件研发项目的成败具有决定性的作用。
软件架构师并不像他的名字所提示的那样仅仅负责架构的设计,通常他的工作还包括,作为技术专家负责协助开发部门、技术支持部门、产品规划部门等各方解决技术问题。因此,他的管理和沟通能力是同样重要的。其它主要的知识和技能还包括分析和解决问题的能力、将需求转化为设计的能力、对系统未来发展的预见能力等。
一个优秀的程序员会是一个优秀的软件架构师吗?不一定。对于一个复杂的软件系统来说,架构设计通常都不是一个人就可以完成的任务,需要一组具有不同知识的工程师协作完成,在这个过程中,架构师要做大量的解释、说服、协调、总结、归纳、妥协等工作。一个没有担任过负责人的程序员缺乏这方面的经验。
同时,国内一种普遍的现象是,大量缺乏编程经验的博士、硕士、项目经理负责软件架构设计,并声称不需要学习编程也能搞好软件架构设计。计算机科学是一门实验的、技能性的学科,许多概念必须在编程实践中体会,技能更是必须要操练才能提高。很难想象一个不懂编程的人会理解设计模式,而不懂设计模式的人会是一个优秀的软件架构师!一个看了很多棋谱但从没有实战过的人声称自己是布局高手,你会信吗?
在非技术方面,沟通能力特别重要,你要将你的设计思想传达给开发团队,这件事情已经很不容易了,更困难的是,你还要传达给技术支持人员,甚至一些非技术人员。有的时候,你还必须妥协,采用一些其他成员支持的、也许不是最好的解决方案,以保持团队的士气。
总之,管理、沟通、经验、分析问题和解决问题的能力是一个软件架构师必备的素质。对于一些所有工程师都应该具有的素质,比如,工作热情、责任心、迎接挑战的勇气等,就不用多说了。
许式伟(金山软件WPS产品架构师):
从性格角度来讲,软件构架师需要心思细腻而严谨;从职业特征来看,软件构架师要充分理解和尊重软件产品的需求。由需求引导设计而不是相反。因此,需要特别强调产品需求的重要性。记得GOF有这样一句话:“设计应该支持变化--获得最大限度复用的关键在于对新需求和已有需求发生变化时的预见性,要求你的系统设计要能够相应地改进”。每个程序员都希望能够写出最好的程序,并使自己的程序更能适应变化。但事实表明,程序能力尤其是框架设计能力并不是天生的,而是取决于程序构架师对需求的理解程度。如果在不了解系统需求的前提下,就开始进行设计,那么即使是天才,也不能设计出完美的框架。
从另外一方面讲,软件构架师的设计只能应付可预测的变化,而构架师本身的技术积累和对需求的理解程度,往往会决定所设计的框架对需求变化的应变能力。大多数的设计人员都趋向于追求完美,大多对“开闭法则” (OCP:Open Close Principle,注:Software Entities should be open for extension,yet close for modificaiton.:程序应该可扩展但又不可修改)非常认同。而这是一个理想状态,但又不可太过,一味地让系统应付位置的变化,会让自己套上一个无形的枷锁,更为正确的做法是:让自己知道的尽可能多,当设计新版本WPS Office V6的整体框架时,通常会参考Microsoft Office和旧版本的WPS Offfice,有时甚至会看PDF对同一功能的支持情况,对同类产品的研究和比较,有助于很好地设计新产品的程序框架。
此外,作为软件构架师,一定要善于听取和接纳不同的意见,能够包容新的思想,愿意了解最新的技术和想法。优秀的软件工程师,他应该具有创新的理念和兼容并包的胸怀,比如:C#、AOP等。尽管我最喜欢C++的自由,但并不排斥去了解Java、C#等语言对其的改进,很多新的事物,会让我获得共鸣与灵感。
正如上面所讲,软件工程师需要更强的技术积累和更缜密的思维,以及对需求的深刻理解、兼容并包的创新意识和胸怀,软件构架师的职责顾名思义,从事的主要工作职责就是设计软件产品的程序构架,也就是要,对他最终设计的结果--软件产品的程序框架负责。可操作性和系统的应变能力是软件构架师的主要职责和工作重点。
我虽不是计算机专业,却是一位计算机狂热爱好者,对C语言有着深刻的领悟,被同学们戏称“C狂”,曾独立开发、与同学合作开发软件。我对于感兴趣的东西,总是去探索它内在的实质性内容。从小就酷爱数学的我,在推理的严谨上对自己要求非常高。我相信一个观念:严谨绝对不是创造的对立面,而是创造性思维的必备条件。
王栋(盛世龙吟数字科技):
软件架构师是团队中的一员,和其他项目成员没有什么区别,只不过承担的职责要大些,因为毕竟架构设计师所作的工作比较重要。架构设计师的具体工作是为系统设计架构,做技术的决策。而国内对于各种角色分工不明确,通常架构师都有项目管理的职责。
一个成功的架构设计师一定是不仅精通设计工作而且精通实现工作的。缺乏了设计的实践,就缺少了对系统整体的把握;缺乏了实现的实践,则缺少了对系统中某些重要技术点的全面了解。在和团队成员的交流当中,特别是讲述自己的设计思想时,设计图固然重要,但设计图只能提供一个概念模型,真正的设计还是需要用源代码体现。为了更好的设计和实现还要掌握各种工具和类库的使用,因为架构设计师有时还是技术咨询顾问。
在系统设计和技术决策时,最难做到的就是平衡和取舍。在规定的时间内,团队内部人员的技术水平和状态、技术的成熟稳定度、技术实现的难易程度等因素都会影响系统架构的最终实现。比如去年四月底—正是SARS在北京闹得最凶的时候,我们接到了国家疾病预防控制中心的《非典型肺炎个案调查报告管理系统》的开发任务,由于国家疾病控制中心没有一套基于互联网的疾病申报系统,给这种突发性的传染性疾病申报工作带来一些困难。全部基于传真和电话的申报信息必须经过人工处理才能形成报告上报,而面对神秘的SARS,申报的内容在不断的调整,上报的流程也在不断地更改,如果我们仍然按照通常的应用程序开发方法,可能很快就能完成这样简单的数据提交工作,但是如果任何地方稍有改变,程序开发人员必须在现场完成程序更改。由于当时的特殊情况,我们的开发团队也不可能保持特别大的规模,而时间要求又极其苛刻——一周之内系统要测试上线。经过权衡,认为必须满足可实时动态定制申报内容以及定制的查询统计,我们承担着巨大的压力,最后决定采用简化的模型实现系统,用项目成员最熟悉的技术和概念,完成保证系统运行的最小功能集合。
对于一个系统或产品,还需要有不断改善它的耐心,有时还需要推翻重新实现的勇气。上边提到的项目第一阶段,在疯狂的加班加点中基本完成了。不过,由于时间仓促系统还是有改进和提高的余地。在接下来的几个月时间内,我们做的就是不断对这个系统细化,深化,修改,调整。这时候,其他相关项目也要启动了,启用我们的核心引擎后,经过很短时间的定制,都分别上线运行了,充分体现了原有模型的设计重用性和系统的可扩充性。但精益求精,针对新的需求,我对原有的一些设计缺陷有了新的认识,界面不够灵活、流程不能定义、结构稍显混乱,等等。
随着又一个项目,所有上次积累下来想修改的东西都有了机会重新实现,这是多么美好的感觉。国家质量认证中心的业务系统,有更多表单要填写,有更多的复杂流程要实现,有更多的组织机构和角色要定义,需要更灵活的表现形式和配置功能。以前的系统引擎就不能满足了,就决定使用更新的结构、更新的工具甚至是更新的过程来实现。这回我们做到了每一个工作流可以用户自定义,每一个工作流节点中的表单用户可以自定义,每一个查询都可以自定义。随着时间推移,这套系统也在不断演进中。
作为软件架构师,学习的能力和态度、敏锐的观察能力是非常重要的。必须通过各种途径学习和观察。对于目前国内的应用状况和互联网应用的不断深入,在不断的学习和观察中我觉得不管在哪些方面都需要整合,不管是企业内部的各种信息孤岛还是互联网上的各种应用。如何去整合资源,为最终用户服务,这个问题让我自然想到了Portal,这将是我们公司下一个重要发展方向。面对Portal世界中纷繁的技术,下一波的学习和实践就要启动了。
一个软件架构师,要勤于学习、观察、思考,决不放弃对最底层实现技术的掌握同时需要把握好系统框架的平衡,学会正确的取舍,并且要有耐心和勇气面对自己的设计,不断进行改进甚至重新实现。
周恒(浪潮软件技术研究中心):
补充基础理论知识。IT的技术发展是非常快的,新技术层出不穷,但是各种技术之间很多原理是一样的,是相通的,重要的是要把原理搞通。
扩宽知识面。最初,我的知识面还是太窄,当时对于网络、存储、大小型机、大型数据库几乎都没有深入的接触和使用。对于构建一个全新大型的基于J2EE的企业应用系统来说,架构师需要熟悉数据库技术、操作系统技术、存储、网络技术,J2EE体系架构,MVC框架,Java程序语言,还需要熟悉一到两个应用服务器、一到两门大型数据库。
架构师需要具备扎实全面的技术,掌握广泛的开发技能,超离于程序语言之上,熟悉多种系统架构,有丰富的开发经验,能选择并设计合理的方案。
要深入。深入到本质里面去,绝对不能浮躁。不光要了解表象,还必须了解隐藏在表象里面的本质。架构师不只是使用者,更多的是建造者,创新者,每一个决定都可能会影响几十个开发人员和成百上千的使用者,因此必须深入熟悉技术的本质,了解原理,才能灵活运用,不可能临时抱佛脚,现学现卖。
浮躁只会让人一事无成。曾见过一些人,写了两月程序,就嫌写程序低级要去做设计,刚写了两月设计,就嫌设计低级,就要去搞需求分析,刚搞了两天分析,又觉得搞技术没前(钱)途,就要去搞管理或者搞市场。也见过一些人,搞了三月嫌工资低,跳一下涨点工资,再搞三月又跳跳涨点工资。跳来跳去,开始还能往“上”跳, 到后面只能被赶着往下跳了。
加强交流和沟通。曾经闷头苦学,希望能学得很牛,把什么都研究透了,然后可以教徒弟,可以带出一批人来。在这个过程中总是碰到一些槛,虽不至于灰心丧气,但也挺郁闷。头告诉说不要指望一个人都干完了,再厉害也不可能把啥都搞明白,一方面要形成一个学习的气氛,大家都很厉害,水涨才能船高,另外一方面要加强和业界尖端人士的交流,共同提高。
学习能力对于一个搞IT的人来说非常重要,如果没有很强的学 习能力,很难快速适应技术变化的能力。
有一年只做了一个物流管理系统一个单,基于J2EE的单子,一切都是从头做,单子额不大内容却不少。虽然最后顺利完成,却因为广泛使用了应用服务器提供商提供的一个不成熟的扩展包而吃尽了苦头。虽说架构师不纠缠于细节,但是忽略了细节却可能造成严重的后果。对于7X24小时系统,一个细节不处理好,就会造成停机和严重的损失。细节就是追求完美,架构师既要有好的大局观,也不能忽略细节,要求我们不仅对原理搞明白,很多时候必须对具体技术实现有透彻的了解。
架构师要对系统的功能负责,对系统的成熟度负责,对系统的成本负责,架构自软件始而始,自软件终而终。架构师需要参与拟定项目的各种标准和规范,要指导大家,要和低层设计人员探讨一些难点的设计问题,他不仅仅是一个技术高手,还要充当技术的领导者,因此,学习一些软件工程的知识和提高领导力是绝对有必要的。
在项目组中,架构师是一个角色,不一定就是一个人,可能是一个小组。
架构师虽然不要忽略细节,也要警惕过分追求完美,架构师学会放弃,在系统的功能、成熟度、成本中取得平衡,从客户的角度和开发者的角度来考虑问题。特别是要警惕技术情结,不能一味追求最新的不成熟的技术,对于难以完成的功能,也需要暂时舍弃。不可能一下造成最完美的系统,
袁德俊(软件工程师 自由职业):
软件架构师可细分为应用架构师和技术架构师,应用架构是软件本身作为一个应用而存在的结构,技术架构是使应用能够运转的支撑架构。就像软件是为社会为生活服务一样,技术架构是服务于应用架构的。
有不少新员工,因为基本是从大学毕业的人,学习接收新东西的能力都挺快,但是成就迥然有别。有的人,也具有强烈的好奇心,但为了学习而学习,敝帚自珍,不愿意应用到开发和工作中去,这种人,学到一定程度就很难再提高,学习能力只能算是不及格。
而且,还有一些立志做J2EE架构师的程序员,不但不愿意深入学习Java虚拟机规范,对于API也只是一知半解。问其理由,答曰,犯不着搞明白,到用的时候查查API就行了。天哪,到用的时候查查API就行了,如果你是一个摩天大楼的建筑师,到盖高楼的时候现查查各种建材的参数规格指标就能盖起大楼来了么?就能把水、电、梁、管、消防等搭配得合情合理么?想想看,我们做的架构可能也会影响大批设计师和程序员,影响大批使用的用户,岂是现查API就能行的?
因此,我们可以说:架构是一门科学,更是一门艺术,触类旁通,除了掌握深厚的技术知识以外,要尽可能多地掌握领域知识。成为架构师,没有速成的办法,唯有实践+努力。