精华内容
下载资源
问答
  • 架构师职责 架构师不是一个人,他需要...按 TOGAF 定义,架构师职责是了解并关注实际上关系重大但未变得过载一些关键细节和界面,架构师角色有:理解并解析需求,创建有用模型,确认、细化并扩展模型,...

    架构师职责

    架构师不是一个人,他需要建立高效卓越的体系,带领团队去攻城略地,在规定的时间内完成项目。

    架构师需要能够识别定义并确认需求,能够进行系统分解形成整体架构,能够正确地技术选型,能够制定技术规格说明并有效推动实施落地。

    按 TOGAF 的定义,架构师的职责是了解并关注实际上关系重大但未变得过载的一些关键细节和界面,架构师的角色有:理解并解析需求,创建有用的模型,确认、细化并扩展模型,管理架构。

    从业界来看对于架构师的理解可以大概区分为:

    • 企业架构师:专注于企业总体 IT 架构的设计。
    • IT 架构师-软件产品架构师:专注于软件产品的研发。
    • IT 架构师-应用架构师:专注于结合企业需求,定制化 IT 解决方案;大部分需要交付的工作包括总体架构、应用架构、数据架构,甚至部署架构。
    • IT 架构师-技术架构师:专注于基础设施,某种软硬件体系,甚至云平台,提交:产品建议、产品选型、部署架构、网络方案,甚至数据中心建设方案等。

    阿里内部没有在职位 title 上专门设置架构师了,架构师更多是以角色而存在,现在还留下可见的 title 有两个:首席架构师和解决方案架构师,其中解决方案架构师目前在大部分 BU 都有设置,特别是在阿里云和电商体系。

     

    image

    解决方案架构师

    工作方式理解

    • 了解和挖掘客户痛点,项目定义,现有环境管理;
    • 梳理明确高阶需求和非功能性需求;
    • 客户有什么资产,星环(阿里电商操作系统)/阿里云等有什么解决方案;
    • 沟通,方案建议,多次迭代,交付总体架构;
    • 架构决策。

    职责

    1.从客户视图来看:

    • 坚定客户高层信心:利用架构和解决方案能力,帮忙客户选择星环/阿里云平台的信心。
    • 解决客户中层问题:利用星环/阿里云平台服务+结合应用架构设计/解决方案能力,帮忙客户解决业务问题,获得业务价值。
    • 引领客户 IT 员工和阿里生态同学:技术引领、方法引领、产品引领。

    2.从项目视图看:

    • 对接管理部门:汇报技术方案,进度;技术沟通。
    • 对接客户 PM,项目 PM:协助项目计划,人员管理等。负责所有技术交付物的指导。
    • 对接业务部门和需求人员:了解和挖掘痛点,帮忙梳理高级业务需求,指导需求工艺。
    • 对接开发:产品支持、技术指导、架构指导。
    • 对接测试:配合测试计划和工艺制定。配合性能测试或者非功能性测试。
    • 对接运维:产品支持,运维支持。
    • 对接配置&环境:产品支持。
    • 其他:阿里技术资源聚合。

    3.从阿里内部看:

    • 销售方案支持;
    • 市场宣贯;
    • 客户需求Facade;
    • 解决方案沉淀。

    架构师职责明确了,那么有什么架构思维可以指导架构设计呢?请看下述的架构思维。

    架构思维

    自顶向下构建架构

    要点主要如下:

    1.首先定义问题,而定义问题中最重要的是定义客户的问题。定义问题,特别是识别出关键问题,关键问题是对客户有体感,能够解决客户痛点,通过一定的数据化来衡量识别出来,关键问题要优先给出解决方案。

    2.问题定义务必加入时间维度,把手段/方案和问题定义区分开来。

    3.问题定义中,需要对问题进行升层思考后再进行升维思考,从而真正抓到问题的本质,理清和挖掘清楚需求;要善用第一性原理思维进行分析思考问题。

    4.问题解决原则:先解决客户的问题(使命),然后才能解决自己的问题(愿景);务必记住不是强调我们怎么样,而是我们能为客户具体解决什么问题,然后才是我们变成什么,从而怎么样去更好得服务客户。

    5.善用多种方法对客户问题进行分析,转换成我们产品或者平台需要提供的能力,比如仓储系统 WMS 可以提供哪些商业能力。

    6.对我们的现有的流程和能力模型进行梳理,找到需要提升的地方,升层思考和升维思考真正明确提升部分。

    7.定义指标,并能够对指标进行拆解,然后进行数学建模。

    8.将抽象出来的能力诉求转换成技术挑战,此步对于技术人员来说相当于找到了靶子,可以进行方案的设计了,需要结合自底向上的架构推导方式。

    9.创新可以是业务创新,也可以是产品创新,也可以是技术创新,也可以是运营创新,升层思考、升维思考,使用第一性原理思维、生物学(进化论--进化=变异+选择+隔离、熵增定律、分形和涌现)思维等哲科思维可以帮助我们在业务,产品,技术上发现不同的创新可能。可以说哲科思维是架构师的灵魂思维。

     

    image

    自底向上推导应用架构

    先根据业务流程,分解出系统时序图,根据时序图开始对模块进行归纳,从而得到粒度更大的模块,模块的组合/聚合构建整个系统架构。

    基本上应用逻辑架构的推导有4个子路径,他们分别是:

    1. 业务概念架构:业务概念架构来自于业务概念模型和业务流程;
    2. 系统模型:来自于业务概念模型;
    3. 系统流程:来自业务流程;
    4. 非功能性的系统支撑:来自对性能、稳定性、成本的需要。

    效率、稳定性、性能是最影响逻辑架构落地成物理架构的三大主要因素,所以从逻辑架构到物理架构,一定需要先对效率、稳定性和性能做出明确的量化要求。

    自底向上重度依赖于演绎和归纳。

    如果是产品方案已经明确,程序员需要理解这个业务需求,并根据产品方案推导出架构,此时一般使用自底向上的方法,而领域建模就是这种自底向上的分析方法。

    对于自底向上的分析方法,如果提炼一下关键词,会得到如下两个关键词:

    1.演绎:演绎就是逻辑推导,越是底层的,越需要演绎:

    • 从用例到业务模型就属于演绎;
    • 从业务模型到系统模型也属于演绎;
    • 根据目前的问题,推导出要实施某种稳定性措施,这是也是演绎。

    2.归纳:这里的归纳是根据事物的某个维度来进行归类,越是高层的,越需要归纳:

    • 问题空间模块划分属于归纳;
    • 逻辑架构中有部分也属于归纳;
    • 根据一堆稳定性问题,归纳出,事前,事中,事后都需要做对应的操作,是就是根据时间维度来进行归纳。

     

    image

    领域驱动设计架构

    大部分传统架构都是基于领域模型分析架构,典型的领域实现模型设计可以参考DDD(领域驱动设计),详细可以参考《实现领域驱动设计》这本书,另外《UML和模式应用》在领域建模实操方面比较好,前者偏理论了解,后者便于落地实践。

    领域划分设计步骤:

    1.对用户需求场景分析,识别出业务全维度 Use Case;

    2.分析模型鲁棒图,识别出业务场景中所有的实体对象。鲁棒图 —— 是需求设计过程中使用的一种方法(鲁棒性分析),通过鲁棒分析法可以让设计人员更清晰,更全面地了解需求。它通常使用在需求分析后及需求设计前做软件架构分析之用,它主要注重于功能需求的设计分析工作。需求规格说明书为其输入信息,设计模型为其输出信息。它是从功能需求向设计方案过渡的第一步,重点是识别组成软件系统的高级职责模块、规划模块之间的关系。鲁棒图包含三种图形:边界、控制、实体,三个图形如下:

     

    image

    3、领域划分,将所有识别出的实体对象进行分类;

    4、评估域划分合理性,并进行优化。

    基于数据驱动设计架构

    随着 IoT、大数据和人工智能的发展,以领域驱动的方式进行架构往往满足不了需求或者达不到预期的效果,在大数据时代,在大数据应用场景,我们需要转变思维,从领域分析升维到基于大数据统计分析结果来进行业务架构、应用架构、数据架构和技术架构。这里需要架构师具备数理统计分析的基础和 BI 的能力,以数据思维来架构系统,典型的系统像阿里的数据分析平台采云间和菜鸟的数据分析平台 FBI。

    上述四种思维,往往在架构设计中是融合使用的,需要根据业务或者系统的需求来选择侧重思维方式。

    有了架构思维的指导,具体有没有通用/标准化的架构框架以更好的执行架构设计?请看常见的架构框架。下述的架构框架其实本身也包含了重要的一些架构思维。

    推荐一个Java高级技术进阶群:976203838,文章运用到的架构技术都会在群里分享,都能免费下载。有兴趣学习的猿猿可以加一下。

    常见架构框架

    TOGAF

    TOGAF 是 The Open Group Architecture Framework 的缩写,它由 The Open Group 开发,The Open Group 是一个非盈利的技术行业联盟,它不断更新和重申 TOGAF。

    TOGAF 强调商业目标作为架构的驱动力,并提供了一个最佳实践的储藏库,其中包括 TOGAF 架构开发方法(ADM)、TOGAF 架构内容框架、TOGAF 参考模型、架构开发方法(ADM)指引和技术、企业连续统一体和 TOGAF 能力框架。

    ADM

    ADM是一个迭代的步骤顺序以发展企业范围的架构的方法。

     

    image

    架构内容框架

     

    image

    参考模型

     

    image

    ADM指引和技术

    1、架构迭代阶段:

     

    image

    2、在不同水平运用ADM:

     

    image

     

    image

    3、利益相关者分类:

     

    image

    企业连续统一体

    架构指导及支持解决方案:基础 通用系统 行业组织特定

     

    image

    image

    能力框架

     

    image


    (更多内容可以参考《TOGAF标准9.1版本》或者

    https://www.opengroup.org/togaf

    Zachman

    第一个最有影响力的框架方法论就是 Zachman 框架,它是 John Zachman 首次在1987年提出的。

    Zachman 框架模型分两个维度:横向维度采用6W(what、how、where、who、when、why)进行组织,纵向维度反映了 IT 架构层次,从上到下(Top-Down),分别为范围模型、企业模型、系统模型、技术模型、详细模型、功能模型。横向结合6W,Zachman 框架分别由数据、功能、网络、人员、时间、动机分别对应回答What、How、Where、Who、When 与 Why 这六个问题。

     

    image

    ITSA

    ITSA诞生于1986年的惠普,世界最早的企业架构框架(IT战略与架构)。建模原则就是“Everything you need, and nothing you don’t”,只放你要的东西。

     

    image

     

    image

     

    image

     

    image

    DODAF

    DODAF 是美国国防部架构框架,是一个控制“EA开发、维护和决策生成”的组织机制,是统一组织“团队资源、描述和控制EA活动”的总体结构。

    DODAF 涵盖 DoD 的所有业务领域,定义了表示、描述、集成 DoD 范围内众多架构的标准方法,确保架构描述可比较、评估,提供了对 FoS (系统族)和 SoS (体系)进行理解、比较、集成和互操作共同的架构基础,提供开发和表达架构描述的规则和指南,但不指导如何实现。

    DODAF 核心是8个视点和52个模型。

     

    image

    1.全景视点 AV

    与所有视点相关的体系结构描述的顶层概貌。提供有关体系结构描述的总体信息,诸如体系结构描述的范围和背景。范围包括体系结构描述的专业领域和时间框架。背景由构成体系结构描述背景的相互关联各种条件组成,包括条令,战术、技术和程序,相关目标和构想的描述,作战概念(CONOPS),想定和环境条件。

     

    image

    2.能力视点CV

    能力视点(CV)集中反映了与整体愿景相关的组织目标,这些愿景指在特定标准和条件下进行特定行动过程或是达成期望效果的能力,它们综合使用各种手段和方式来完成一组任务。

    CV 为体系结构描述中阐述的能力提供了战略背景和相应的高层范围,比作战概念图中定义的基于想定的范围更全面。

    这些模型是高层的,用决策者易于理解的术语来描述能力,以便沟通能力演进方面战略构想。

     

    image

    3.作战视点OV

    作战视点(OV)集中反映了完成 DoD 使命的机构、任务或执行的行动以及彼此间必须交换的信息。描述信息交换的种类、频度、性质,信息交换支持哪些任务和活动。

     

    image

    4.服务视点 SvcV

    服务视点(SvcV)集中反映了为作战行动提供支撑的系统、服务和相互交织的功能。DoD 流程包括作战、业务、情报和基础设施功能。SvcV 功能和服务资源及要素可以链接到 0V 中的体系结构数据。这些系统功能和服务资源支撑作战行动,促进信息交换。

     

    image

    5.系统视点 SV

    系统视点(SV)集中反映支持作战行动中的自动化系统、相互交联和其他系统功能的信息。随着对面向服务环境和云计算的重视,在 DoDAF 的未来版本中也许不会有系统视点。

     

    image

    6.数信视点 DIV

    数据和信息视点(DIV),简称数信视点,反映了体系结构描述中的业务信息需求和结构化的业务流程规则。

    描述体系结构描述中与信息交换相关的信息,诸如属性、特征和相互关系。
    必要时,本视点模型中用到的数据需要由多个架构团队来共同考虑。

     

    image

    7.标准视点 StdV

    标准视点(StdV)是用来管控系统各组成部分或要素的编排、交互和相互依赖的规则的最小集。其目的是确保系统能满足特定的一组操作需求。

    标准视点提供技术系统的实施指南,以工程规范为基础,确立通用的积木块,开发产品线。

    包括一系列技术标准、执行惯例、标准选项、规则和规范,这些标准在特定体系结构描述中可以组成管控系统和系统/服务要素的文件(profile)。

     

    image

    8.项目视点 PV

    项目视点(PV)集中反映了项目是如何有机地组织成一个釆办项目的有序组合。
    描述多个采办项目之间关联关系,每个采办项目都负责交付特定系统或能力。

     

    image

    TOGAF,Zachman,ITSA 和 DODAF 是非常不错的架构框架,尤其前两者应用很广泛,TOGAF 还有专门的架构认证。当我们掌握了这些框架,我们是不是需要一些架构原则来指导更具体的设计?请看下文。

    架构原则

    设计原则就是架构设计的指导思想,它指导我们如何将数据和函数组织成类,如何将类链接起来成为组件和程序。反向来说,架构的主要工作就是将软件拆解为组件,设计原则指导我们如何拆解、拆解的粒度、组件间依赖的方向、组件解耦的方式等。

    设计原则有很多,我们进行架构设计的主导原则是 OCP(开闭原则),在类和代码的层级上有:SRP(单一职责原则)、LSP(里氏替换原则)、ISP(接口隔离原则)、DIP(依赖反转原则);在组件的层级上有:REP(复用、发布等同原则)、CCP(共同闭包原则)、CRP(共同复用原则),处理组件依赖问题的三原则:无依赖环原则、稳定依赖原则、稳定抽象原则。

    1.OCP(开闭原则):设计良好的软件应该易于扩展,同时抗拒修改。这是我们进行架构设计的主导原则,其他的原则都为这条原则服务。

    2.SRP(单一职责原则):任何一个软件模块,都应该有且只有一个被修改的原因,“被修改的原因“指系统的用户或所有者,翻译一下就是,任何模块只对一个用户的价值负责,该原则指导我们如何拆分组件。

    举个例子,CTO 和 COO 都要统计员工的工时,当前他们要求的统计方式可能是相同的,我们复用一套代码,这时 COO 说周末的工时统计要乘以二,按照这个需求修改完代码,CTO 可能就要过来骂街了。当然这是个非常浅显的例子,实际项目中也有很多代码服务于多个价值主体,这带来很大的探秘成本和修改风险,另外,当一份代码有多个所有者时,就会产生代码合并冲突的问题。

    3.LSP(里氏替换原则):当用同一接口的不同实现互相替换时,系统的行为应该保持不变。该原则指导的是接口与其实现方式。

    你一定很疑惑,实现了同一个接口,他们的行为也肯定是一致的呀,还真不一定。假设认为矩形的系统行为是:面积=宽*高,让正方形实现矩形的接口,在调用 setW 和 setH 时,正方形做的其实是同一个事情,设置它的边长。这时下边的单元测试用矩形能通过,用正方形就不行,实现同样的接口,但是系统行为变了,这是违反 LSP 的经典案例。

    4.ISP(接口隔离原则):不依赖任何不需要的方法、类或组件。该原则指导我们的接口设计。当我们依赖一个接口但只用到了其中的部分方法时,其实我们已经依赖了不需要的方法或类,当这些方法或类有变更时,会引起我们类的重新编译,或者引起我们组件的重新部署,这些都是不必要的。所以我们最好定义个小接口,把用到的方法拆出来。

    5.DIP(依赖反转原则):指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

    跨越组建边界的依赖方向永远与控制流的方向相反。该原则指导我们设计组件间依赖的方向。

    依赖反转原则是个可操作性非常强的原则,当你要修改组件间的依赖方向时,将需要进行组件间通信的类抽象为接口,接口放在边界的哪边,依赖就指向哪边。

    6.REP(复用、发布等同原则):软件复用的最小粒度应等同于其发布的最小粒度。直白地说,就是要复用一段代码就把它抽成组件,该原则指导我们组件拆分的粒度。

    7.CCP(共同闭包原则):为了相同目的而同时修改的类,应该放在同一个组件中。CCP 原则是 SRP 原则在组件层面的描述。该原则指导我们组件拆分的粒度。

    对大部分应用程序而言,可维护性的重要性远远大于可复用性,由同一个原因引起的代码修改,最好在同一个组件中,如果分散在多个组件中,那么开发、提交、部署的成本都会上升。

    8.CRP(共同复用原则):不要强迫一个组件依赖它不需要的东西。CRP 原则是 ISP原则在组件层面的描述。该原则指导我们组件拆分的粒度。

    相信你一定有这种经历,集成了组件 A,但组件 A 依赖了组件 B、C。即使组件 B、C 你完全用不到,也不得不集成进来。这是因为你只用到了组件 A 的部分能力,组件 A 中额外的能力带来了额外的依赖。如果遵循共同复用原则,你需要把 A 拆分,只保留你要用的部分。

    REP、CCP、CRP 三个原则之间存在彼此竞争的关系,REP 和 CCP 是黏合性原则,它们会让组件变得更大,而 CRP 原则是排除性原则,它会让组件变小。遵守REP、CCP 而忽略 CRP,就会依赖了太多没有用到的组件和类,而这些组件或类的变动会导致你自己的组件进行太多不必要的发布;遵守 REP、CRP 而忽略 CCP,因为组件拆分的太细了,一个需求变更可能要改 n 个组件,带来的成本也是巨大的。

    除了上述设计原则,还有一些重要的指导原则如下:

     

    image

    1.N+1设计:系统中的每个组件都应做到没有单点故障;

    2.回滚设计:确保系统可以向前兼容,在系统升级时应能有办法回滚版本;

    3.禁用设计:应该提供控制具体功能是否可用的配置,在系统出现故障时能够快速下线功能;

    4.监控设计:在设计阶段就要考虑监控的手段,便于有效的排查问题,比如引入traceId、业务身份 Id 便于排查监控问题;

    5.多活数据中心设计:若系统需要极高的高可用,应考虑在多地实施数据中心进行多活,至少在一个机房断电的情况下系统依然可用;

    6.采用成熟的技术:刚开发的或开源的技术往往存在很多隐藏的 bug,出了问题没有很好的商业支持可能会是一个灾难;

    7.资源隔离设计:应避免单一业务占用全部资源;

    8.架构水平扩展设计:系统只有做到能水平扩展,才能有效避免瓶颈问题;

    9.非核心则购买的原则:非核心功能若需要占用大量的研发资源才能解决,则考虑购买成熟的产品;

    10.使用商用硬件:商用硬件能有效降低硬件故障的机率;

    11.快速迭代:系统应该快速开发小功能模块,尽快上线进行验证,早日发现问题大大降低系统交付的风险;

    12.无状态设计:服务接口应该做成无状态的,当前接口的访问不依赖于接口上次访问的状态。

    架构师知道了职责,具备很好的架构思维,掌握了通用的架构框架和方法论,使用架构原则进行架构设计,不同的业务和系统要求不一样,那么有没有针对不同场景的系统架构设计?下文就针对分布式架构演进、单元化架构、面向服务 SOA 架构、微服务架构、Serverless 架构进行介绍,以便于我们在实际运用中进行参考使用。

    推荐一个Java高级技术进阶群:976203838,文章运用到的架构技术都会在群里分享,都能免费下载。有兴趣学习的猿猿可以加一下。

    常见架构

    分布式架构演进

    初始阶段架构

     

    image

    特征:应用程序,数据库,文件等所有资源都放在一台服务器上。

    应用服务和数据服务以及文件服务分离

    image

    说明:好景不长,发现随着系统访问量的再度增加,webserver 机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台 webserver。

    特征:应用程序、数据库、文件分别部署在独立的资源上。

    使用缓存改善性能

     

    image

    说明:系统访问特点遵循二八定律,即80%的业务访问集中在20%的数据上。缓存分为本地缓存 远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。

    特征:数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。

    使用“应用服务器”集群

     

    image

    说明:在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了。突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看 webserver,发现apache 阻塞了很多的请求, 而应用服务器对每个请求也是比较快的,看来是请求数太高导致需要排队等待,响应速度变慢。

    特征:多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。

    描述:使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。

    数据库读写分离

     

    image

    说明:享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢。

    特征:数据库引入主备部署。

    描述:把数据库划分为读库和写库,通过引入主从数据库服务,读和写操作在不同的数据库服务处理,读库可以有多个,通过同步机制把写库的数据同步到读库,对于需要查询最新写入数据场景,可以通过在缓存中多写一份,通过缓存获得最新数据。

    反向代理和CDN加速

     

    image

    特征:采用CDN和反向代理加快系统的访问速度。

    描述:为了应付复杂的网络环境和不同地区用户的访问,通过 CDN 和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN 与反向代理的基本原理都是缓存。

    “分布式文件”系统 和 “分布式数据库”

     

    image

    说明:随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作

    特征:数据库采用分布式数据库,文件系统采用分布式文件系统。

    描述:任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。

    分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。

    使用 NoSQL 和搜索引擎

     

    image

    特征:系统引入 NoSQL 数据库及搜索引擎。

    描述:随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如 NoSQL 和分数据库查询技术如搜索引擎。

    应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。

    业务拆分

     

    image

    特征:系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。

    描述:为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。

    纵向拆分:将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的 Web 应用系统纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。

    横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。

    分布式服务

     

    image

    特征:公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。

    描述:随着业务越拆越小,应用系统整体复杂程度呈指数级上升,由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。

    分布式服务的问题和挑战:

    (1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

    (2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

    (3) 服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

    (4) 服务多了,沟通成本也开始上升,调某个服务失败该找谁?服务的参数都有什么约定?

    (5) 一个服务有多个业务消费者,如何确保服务质量?

    (6) 随着服务的不停升级,总有些意想不到的事发生,比如 cache 写错了导致内存溢出,故障不可避免,每次核心服务一挂,影响一大片,人心慌慌,如何控制故障的影响面?服务是否可以功能降级?或者资源劣化?

    针对这些问题,下述的单元化架构,微服务架构以及 Serveless 架构可以一定程度解决,另外针对业务系统,需要做到业务与业务隔离、管理域和运行域分开、业务与平台隔离方可解决上述问题。

    单元化架构

    1、什么是单元化:单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。

    2、单元化的必要性:随着硬件的不断升级,计算机硬件能力已经越来越强,CPU越来越快,内存越来越大,网络越来越宽。这让我们看到了在单台机器上垂直扩展的机会。尤其是当你遇到一个性能要求和容量增长可以预期的业务,单元化给我们提供另外的机会,让我们可以有效降低资源的使用,提供更高性能的服务。

    更高性能更低成本是我们的主要目标,经过单元化改造,我们得以用更少(约二分之一)的机器,获得了比原来更高(接近百倍)的性能。性能的提升很大部分原因在于服务的本地化,而服务的集成部署又进一步降低了资源的使用。除了性能收益,还有很多收益,比如更好的隔离性,包括请求隔离和资源隔离,比如更友好的升级,产品可以灰度发布等。单元化改造后对高峰的应对以及扩容方式等问题的解决。

    3、如何做到单元化:先看下图传统的服务架构,服务是分层的,每一层使用不同的分区算法,每一层都有不同数量的节点,上层节点随机选择下层节点。

     

    image

    在单元化架构下,服务虽然分层划分,但每个单元自成一体。按照层次来讲的话,所有层使用相同的分区算法,每一层都有相同数量的节点,上层节点也会访问指定的下层节点。

    SOA架构

    SOA(Service-Oriented Architecture,面向服务的架构)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是 SOA 的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。

    SOA的实施具有几个鲜明的基本特征。实施 SOA 的关键目标是实现企业 IT 资产的最大化作用。要实现这一目标,就要在实施 SOA 的过程中牢记以下特征:

    (1)可从企业外部访问
    (2)随时可用
    (3)粗粒度的服务接口分级
    (4)松散耦合
    (5)可重用的服务
    (6)服务接口设计管理
    (7)标准化的服务接口
    (8)支持各种消息模式
    (9)精确定义的服务契约

    为了实现 SOA,企业需要一个服务架构,下图显示了一个例子:

     

    image

    在上图中, 服务消费者(service consumer)可以通过发送消息来调用服务。这些消息由一个服务总线(service bus)转换后发送给适当的服务实现。这种服务架构可以提供一个业务规则引(business rules engine),该引擎容许业务规则被合并在一个服务里或多个服务里。这种架构也提供了一个服务管理基础(service management infrastructure),用来管理服务,类似审核,列表(billing),日志等功能。此外,该架构给企业提供了灵活的业务流程,更好地处理控制请求(regulatory requirement),例如Sarbanes Oxley(SOX),并且可以在不影响其他服务的情况下更改某项服务。

    推荐一个Java高级技术进阶群:976203838,文章运用到的架构技术都会在群里分享,都能免费下载。有兴趣学习的猿猿可以加一下。

    微服务架构

    先来看看传统的 web 开发方式,通过对比比较容易理解什么是 Microservice Architecture。和 Microservice 相对应的,这种方式一般被称为 Monolithic(单体式开发)。

    所有的功能打包在一个 WAR包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI 等所有逻辑。

     

    image

    优点:

    • 开发简单,集中式管理;
    • 基本不会重复开发;
    • 功能都在本地,没有分布式的管理和调用消耗。

    缺点:

    • 效率低:开发都在同一个项目改代码,相互等待,冲突不断;
    • 维护难:代码功功能耦合在一起,新人不知道何从下手;
    • 不灵活:构建时间长,任何小修改都要重构整个项目,耗时;
    • 稳定性差:一个微小的问题,都可能导致整个应用挂掉;
    • 扩展性不够:无法满足高并发下的业务需求。

    常见的系统架构遵循的三个标准和业务驱动力:

    • 提高敏捷性:及时响应业务需求,促进企业发展;
    • 提升用户体验:提升用户体验,减少用户流失;
    • 降低成本:降低增加产品、客户或业务方案的成本。

    基于微服务架构的设计:

    目的:有效的拆分应用,实现敏捷开发和部署。

     

    image

    关于微服务的一个形象表达:

     

    image

    • X轴:运行多个负载均衡器之后的运行实例;
    • Y轴:将应用进一步分解为微服务(分库);
    • Z轴:大数据量时,将服务分区(分表)。

    SOA和微服务的区别:

    • SOA喜欢重用,微服务喜欢重写;
    • SOA喜欢水平服务,微服务喜欢垂直服务;
    • SOA喜欢自上而下,微服务喜欢自下而上。

    Serverless 架构

    1、思想:无服务器是一种架构理念,其核心思想是将提供服务资源的基础设施抽象成各种服务,以 API 接口的方式供给用户按需调用,真正做到按需伸缩、按使用收费。

    2、优势:消除了对传统的海量持续在线服务器组件的需求,降低了开发和运维的复杂性,降低运营成本并缩短了业务系统的交付周期,使得用户能够专注在价值密度更高的业务逻辑的开发上。

    3、内容:目前业界较为公认的无服务器架构主要包括两个方面,即提供计算资源的函数服务平台 FaaS,以及提供托管云服务的后端服务 BaaS。

    函数即服务(Function as a Service):是一项基于事件驱动的函数托管计算服务。通过函数服务,开发者只需要编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数代码运行在无状态的容器中,由事件触发且短暂易失,并完全由第三方管理,基础设施对应用开发者完全透明。函数以弹性、高可靠的方式运行,并且按实际执行资源计费,不执行不产生费用。

    后端即服务(Backend as a Service):BaaS 覆盖了应用可能依赖的所有第三方服务,如云数据库、身份验证、对象存储等服务,开发人员通过 API 和由 BaaS 服务商提供的 SDK,能够集成所需的所有后端功能,而无需构建后端应用,更不必管理虚拟机或容器等基础设施,就能保证应用的正常运行。

     

    image


    三个less感觉很好:

    • Codeless 对应的是服务开发,实现了源代码托管,你只需要关注你的代码实现,而不需要关心你的代码在哪,因为在整个开发过程中你都不会感受到代码库和代码分支的存在。
    • Applicationless 对应的是服务发布,在服务化框架下,你的服务发布不再需要申请应用,也不需要关注你的应用在哪。
    • Serverless 对应的则是服务运维,有了 Serverless 化能力,你不再需要关注你的机器资源,Servlerless 会帮你搞定机器资源的弹性扩缩容。

    架构师在完成上述架构设计后,最终是需要协同利益相关方一起按项目化运作落地拿结果,那么应该如何保证利益相关方在项目落地的满意度,如何保证按照架构很好的拿到项目成功的结果呢?架构管理能力是架构师非常重要的能力。

    架构管理

    架构共赢模型

     

    image

    架构结果管理

     

    image

    参考资料:

    https://developer.alipay.com/article/8538
    https://www.cnblogs.com/wintersun/p/8972949.html
    https://www.atatech.org/articles/95466
    https://www.atatech.org/articles/104688
    https://yuque.antfin-inc.com/tmf/documents/how-to-desigin-domain

    声明:本文部分内容参考阿里内部和外部一些文章,详情见上述参考资料;撰写本文的重点是系统体系化地总结认识架构师的工作,以便于更好的互动学习和成长,部分观点是个人观点。

    转载于:https://www.cnblogs.com/AIPAOJIAO/p/11189695.html

    展开全文
  • 优秀管理团队获奖感言 各位领导、老师、同学: 大家好!我是13组xx成员,xx。 为期三周公司创建与运营校内实训即将结束,虽然我们不是比赛最终胜利者,但整个过程中全组成员都尽心尽力,完美配合,积极参与公司...
  • 「技术主管」是开发团队某位程序员需要对一起创建系统整个开发团队负责时所承担角色。通常他既要对最终交付软件系统负责,另外也会像一个程序员一样去开发实现系统。 一个技术主管 60% ~ 70% 时间...

    「技术主管」是开发团队中的某位程序员需要对一起创建系统的整个开发团队负责时所承担的角色。通常他既要对最终交付的软件系统负责,另外也会像一个程序员一样去开发实现系统。

    一个技术主管的 60% ~ 70% 的时间可能花在了开发任务分解分配、开发实践、技术架构评审、代码审核和风险识别上,而余下的 30% ~ 40% 的时间则花在为了保障系统按时交付所需的各种计划、协作、沟通、管理上。和团队管理者不同的是,技术主管的大部分管理工作都是针对具体研发任务和技术事务的。

    接下来基于我在技术TL这个角色上,在开发规范、开发流程、技术管理与规划等方面我的一些心路历程,和大家共勉。

     

    开发规范

    我当时负责的业务是集团收购一家子公司的业务,在整体技术标规范上与集团的技术标准存在很大的差异。开发规范可以说是我来到这个团队干的第一件事,我当时面对的问题是API接口格式混乱,没有标准的RPC服务化,代码没有统一标准的开发规范,技术框架组件非标准化等一系列问题,作为一名业务上的新人,我第一时间制定了一套相对标准、全面的技术开发规范,边写代码边梳理开发规范,引领团队走向统一标准化开发道路。

    针对团队研发规范暴露的上述问题,主要制定了如下规范:

    命名规范

    我自己非常注重搭建项目结构的起步过程,应用命名规范、模块的划分、目录(包)的命名,我觉得非常重要,如果做的足够好,别人导入项目后可能只需要10分钟就可以大概了解系统结构。

    具体规范包括包命名、类的命名、接口命名、方法命名、变量命名、常量命名。

     

    统一IDE代码模板

    约定了IDEA/Eclipse IDE代码的统一模板,代码风格一定要统一,避免不同开发人员使用不同模板带来的差异化以及代码merge成本。使用IDEA的同学可以安装Eclipse Code Formatter插件,和Eclipse统一代码模板。

     

    Maven使用规范 

    所有二方库、三方库的版本统一定义到parent pom里,这样来所有业务应用工程统一继承parent pom里所指定的二方库、三方库的版本,统一框架与工具的版本(Spring、Apache commons工具类、日志组件、JSON处理、数据库连接池等),同时要求生产环境禁用SNAPSHOT版本。这样以来升级通用框架与工具的版本,只需要应用工程升级parent pom即可。

     

    代码Commit规范 

    基于Angular Commit Message规范生成统一的ChangeLog,这样一来对于每次发布release tag非常清晰,Mac下都需要安装对应的插件,IDEA也有对应的插件,具体可以参考阮一峰老师的《Commit message 和 Change log 编写指南》。

    此刻忽然想起Linus面对pull request里的骚操作所发的飚:

    Get rid of it. And I don’t ever want to see that shit again. ——Linus

     代码的commit的规范对团队非常重要,清晰的commit信息生成的release tag,对于生产环境的故障回滚业非常关键,能够提供一些有价值的信息。

     

    统一API规范 

    统一Rpc服务接口的返回值ResultDTO,具体代码如下: 

     

    success代表接口处理响应结果成功还是失败,errorCode、errorMsg表示返回错误码和错误消息,module表示返回结果集,把ResultDTO定义到common-api顶层二方库,这样以来各个应用不需要来回转换返回结果。

    Http Rest接口规范约定同ResultDTO相差无几,需要额外关注一下加解密规范和签名规范、版本管理规范。

     

    异常处理规范

    异常处理不仅仅是狭义上遇到了Exception怎么去处理,还有各种业务逻辑遇到错误的时候我们怎么去处理。service服务层捕获的异常主要包括BusinessException(业务异常)、RetriableException (可重试异常) 到 common-api,定义一个公共异常拦截器,对业务异常、重试异常进行统一处理,对于可重试的异常调用的服务接口需要保证其幂等性。

    另外其他业务层有些特殊异常不需要拦截器统一处理,内部可以进行自我消化处理掉,根据场景对应的处理原则主要包括:

    • 直接返回

    • 抛出异常

    • 重试处理

    • 熔断处理

    • 降级处理

     

    这又涉及到了弹力设计的话题,我们的系统往往会对接各种依赖外部服务、Api,大部分服务都不会有SLA,即使有在大并发下我们也需要考虑外部服务不可用对自己的影响,会不会把自己拖死。我们总是希望:

    • 尽可能以小的代价通过尝试让业务可以完成;

    • 如果外部服务基本不可用,而我们又同步调用外部服务的话,我们需要进行自我保护直接熔断,否则在持续的并发的情况下自己就会垮了;

    • 如果外部服务特别重要,我们往往会考虑引入多个同类型的服务,根据价格、服务标准做路由,在出现问题的时候自动降级。

     

    推荐使用Netflix开源的hystrix容灾框架,主要解决当外部依赖出现故障时拖垮业务系统、甚至引起雪崩的问题。目前我团队也在使用,能够很好的解决异常熔断、超时熔断、基于并发数限流熔断的降级处理。

     

    分支开发规范 

    早期的时候源码的版本管理基于 svn,后来逐步切换到 git,分支如何管理每一个公司(在Gitflow的基础上)都会略有不同。

    针对分支开发规范,指定如下标准:

    • 分支的定义(master、develop、release、hotfix、feature)

    • 分支命名规范

    • checkout、merge request流程

    • 提测流程

    • 上线流程

    • Hotfix流程

     

    虽然这个和代码质量和架构无关,按照这一套标准执行下来,能够给整个研发团队带领很大的便利: 

    • 减少甚至杜绝代码管理导致的线上事故;

    • 提高开发和测试的工作效率,人多也乱;

    • 减少甚至杜绝代码管理导致的线上事故;

    • 方便运维处理发布和回滚;

    • 让项目的开发可以灵活适应多变的需求,多人协同开发。

     

    统一日志规范 

    日志是产品必不可少的一个功能,具备可回溯性、能够抓取问题现场信息是其独一无二的优点,尤其在生产系统上问题定位等方面具有不可替代的作用。

    这里着重强调一下针对异常的日志规范:

    • WARN和ERROR的选择需要好好考虑,WARN一般我倾向于记录可自恢复但值得关注的错误,ERROR代表了不能自己恢复的错误。对于业务处理遇到问题用ERROR不合理,对于catch到了异常也不是全用ERROR。

    • 记录哪些信息,最好打印一定的上下文(链路TraceId、用户Id、订单Id、外部传来的关键数据)而不仅仅是打印线程栈。

    • 记录了上下问信息,是否要考虑日志脱敏问题?可以在框架层面实现,比如自定义实现logback的ClassicConverter。

     

    正确合理的使用日志,能够指引开发人员快速查找错误、定位问题,因此约定了一套日志使用标准规范,现在可以更多的参考《阿里经济体开发规约——日志规约》。

    统一MYSQL开发规范

    表的设计和 Api 的定义类似,属于那种开头没有开好,以后改变需要花10x代价的,我知道,一开始在业务不明确的情况下,设计出良好的一步到位的表结构很困难,但是至少我们可以做的是有一个好的标准。

     

    统一工具与框架

    对开发过程中所用到的公共组件进行了统一抽象与封装,包括 dao 层框架mybatis、cache 组件 jetcache、httpclien t组件、common-tools (公共工具),同时抽取出全局唯一ID、分布式锁、幂等等公共组件,把以上公共组件进行集成到各个应用,进行统一升级、维护,这样以来方便大家将更多的精力集中到业务开发上。

     

    开发流程

    目前团队的开发模式还是基于传统的瀑布开发模式,整体开发流程涉及需求评审、测试用例评审、技术架构评审、开发与测试、验收与上线,这里主要基于TL的角度从需求管理、技术架构评审、代码评审、发布计划评审几个关键重点环节进行探讨,欢迎拍砖。

     

    需求管理 

    美国专门从事跟踪IT项目成功或失败的权威机构 Standish Group的CHAOS Reports 报导了该公司的一项研究,该公司对多个项目作调查后发现,百分之七十四的项目是失败的,既这些项目不能按时按预算完成。其中提到最多的导致项目失败的原因就是"变更用户需求"。另外从历年的 Standish Group 报告分析看,导致项目失败的最重要原因与需求有关。Standish Group 的CHAOS 报告进一步证实了与成功项目最密切的因素是良好的需求管理,也就是项目的范围管理,特别是管理好项目的变更。

     

    产品因需求而生,在产品的整个生命周期中,产品经理会收到来自各个方面的需求,但是每一个需求的必要性、重要性和实现成本都需要经过深思熟虑的分析和计划,避免盲目的决定需求或者变更需求,这样很容易导致工作混乱,技术TL如果不能正确的对需求进行把控,会导致整个项目偏离正确的轨道。

     

    需求管理的第一步就是要梳理不同来源的需求,主要包括从产品定位出发、外部用户反馈、竞争对手情况、市场变化以及内部运营人员、客服人员、开发人员的反馈。首先技术TL对产品有足够认知和把控,简单来说就是我的产品是为了满足哪些人的哪些需求而做,产品需求一定要根植于客户的需求、根植于客户的环境。每款产品必定有其核心价值,能够为客户创造更多的价值,基于此考虑往往能得到一些核心需求,摒除价值不大的需求。

     

    需求管理中最重要的就是对发散性需求的管理,往往因此也会导致产品在执行过程中不断的变更或增加需求。由于人的思维是发散性的,所以往往在产品构思的过程中会出现各种新鲜好玩的想法,这些想法可能来自领导或者产品经理自己,但是这些想法往往都是和产品核心方向不相关的,但是由于这些想法能够在当时带来诱惑,因此这些不相关的需求会严重干扰了技术团队的精力,打乱或者延误产品原本的计划。同样技术研发同学也需要建立对产品的深度思考,不要把自己定位成产品需求的实现者,同样需要对需求负责。

     

    很多时候需求的变更或增加是因为我们面临太多选择和想要的太多,没有适当的控制自己的欲望,并以自己的喜好来决定需求,这些因素很容易导致产品没有明确的方向、团队成员疲于奔命,但是却没有实际的成果。所以技术TL一定要能够评估出重新审视产品和筛选需求的优先级,识别每一个需求的必要性、重要性和实现成本。通过深思熟虑给团队明确方向并专注,聚焦资源的支配,确保团队的精力都聚焦在产品的核心需求上。

     

    技术架构评审

     

    互联网时代,大家提倡敏捷迭代,总嫌传统方式太重,流程复杂,影响效率,什么都希望短平快,在扁平化的组织中,经常是需求火速分发到一线研发,然后就靠个人折腾去了,其实技术架构评审这同样是一个非常重要的环节。架构评审或技术方案评审的价值在于集众人的力量大家一起来分析看看方案里是否有坑,方案上线后是否会遇到不可逾越的重大技术问题,提前尽可能把一些事情先考虑到提出质疑其实对项目的健康发展有很大的好处。

     

    基于架构评审,我们的目标核心是要满足以下几点:

    1.设计把关,确保方案合格,各方面都考虑到了,避免缺陷和遗漏,不求方案多牛,至少不犯错。

    2. 保证架构设计合理和基本一致,符合整体原则。

    3. 维持对系统架构的全局认知,避免黑盒效应。

    4. 通过评审发掘创新亮点,推广最佳实践。

     

    架构设计既要保证架构设计的合理性和可扩展性,又要避免过度设计。架构设计不仅仅是考虑功能实现,还有很多非功能需求,以及持续运维所需要的工作,需要工程实践经验,进行平衡和取舍。

    架构评审需要以下几点: 

    1. 技术选型:为什么选用A组件不选用B、C组件,A是开源的,开源协议是啥?基于什么语言开发的,出了问题我们自身是否能够维护?性能方面有没有压测过?这些所有问题作为技术选型我们都需要考虑清楚,才能做最终决定。 

    2. 高性能:产品对应的TPS、QPS和RT是多少?设计上会做到的TPS、QPS和RT是多少?而实际上我们整体随着数据量的增大系统性能会不会出现明显问题?随着业务量、数据量的上升,我们的系统的性能如何去进一步提高?系统哪个环节会是最大的瓶颈?是否有抗突发性能压力的能力,大概可以满足多少的TPS和QPS,怎么去做来实现高性能,这些问题都需要我们去思考。

    3. 高可用:是否有单点的组件,非单点的组件如何做故障转移?是否考虑过多活的方案?是否有数据丢失的可能性?数据丢失如何恢复?出现系统宕机情况,对业务会造成哪些影响?有无其他补救方案?这些问题需要想清楚,有相应的解决方案。

    4. 可扩展性:A和B的业务策略相差无几,后面会不会继续衍生出C的业务策略,随着业务的发展哪些环节可以做扩展,如何做扩展?架构设计上需要考虑到业务的可扩展性。

    5. 可伸缩性:每个环节的服务是不是无状态的?是否都是可以快速横向扩展的?扩容需要怎么做手动还是自动?扩展后是否可以提高响应速度?这所有的问题都需要我们去思考清楚,并有对应的解决方案。

    6. 弹性处理:消息重复消费、接口重复调用对应的服务是否保证幂等?是否考虑了服务降级?哪些业务支持降级?支持自动降级还是手工降级?是否考虑了服务的超时熔断、异常熔断、限流熔断?触发熔断后对客户的影响?服务是否做了隔离,单一服务故障是否影响全局?这些问题统统需要我们想清楚对应的解决方案,才会进一步保证架构设计的合理性 

    7. 兼容性:上下游依赖是否梳理过,影响范围多大?怎么进行新老系统替换?新老系统能否来回切换?数据存储是否兼容老的数据处理?如果对你的上下游系统有影响,是否通知到上下游业务方?上下游依赖方进行升级的方案成本如何最小化?这些问题需要有完美的解决方案,稍有不慎会导致故障。

    8. 安全性:是否彻底避免SQL注入和XSS?是否有数据泄露的可能性?是否做了风控策略?接口服务是否有防刷保护机制?数据、功能权限是否做了控制?小二后台系统是否做了日志审计?数据传输是否加密验签?应用代码中是否有明文的AK/SK、密码?这些安全细节问题需要我们统统考虑清楚,安全问题任何时候都不能轻视。

    9. 可测性:测试环境和线上的差异多大?是否可以在线上做压测?线上压测怎么隔离测试数据?是否有测试白名单功能?是否支持部署多套隔离的测试环境?测试黑盒白盒工作量的比例是怎么样的?新的方案是否非常方便测试,在一定程度也需要考量。

    10. 可运维性:系统是否有初始化或预热的环节?数据是否指数级别递增?业务数据是否需要定期归档处理?随着时间的推移如果压力保持不变的话系统需要怎么来巡检和维护?业务运维方面的设计也需要充分考虑到。

    11. 监控与报警:对外部依赖的接口是否添加了监控与报警?应用层面系统内部是否有暴露了一些指标作监控和报警?系统层面使用的中间件和存储是否有监控报警?只有充分考虑到各个环节的监控、报警,任何问题会第一时间通知到研发,阻止故障进一步扩散。

     

    其实不同阶段的项目有不同的目标,我们不会在项目起步的时候做99.99%的可用性支持百万QPS的架构,高效完成项目的业务目标也是架构考虑的因素之一。而且随着项目的发展,随着公司中间件和容器的标准化,很多架构的工作被标准化替代,业务代码需要考虑架构方面伸缩性运维性等等的需求越来越少,慢慢的这些工作都能由架构和运维团队来接。一开始的时候我们可以花一点时间来考虑这些问题,但是不是所有的问题都需要有最终的方案。

     

    代码评审 

    代码质量包括功能性代码质量和非功能性代码质量,功能质量大多通过测试能够去发现问题,非功能性代码质量用户不能直接体验到这种质量的好坏,代码质量不好,最直接的“受害者”是开发者或组织自身,因为代码质量好坏直接决定了软件的可维护性成本的高低。代码质量应该更多的应该从可测性,可读性,可理解性,容变性等代码可维护性维度去衡量,其中 CodeReview 是保证代码质量非常重要的一个环节,建立良好的 CodeReview 规范与习惯,对于一个技术团队是一件非常重要核心的事情,没有 CodeReview 的团队没有未来。

    每次项目开发自测完成后,通常会组织该小组开发人员集体进行代码 review,代码 review 一般 review 代码质量以及规范方面的问题,另外需要关注的是每一行代码变更是否与本次需求相关,如果存在搭车发布或者代码重构优化,需要自行保证测试通过,否则不予发布。

    CodeReview 我会重点关注如下事情:

    1. 确认代码功能:代码实现的功能满足产品需求,逻辑的严谨和合理性是最基本的要求。同时需要考虑适当的扩展性,在代码的可扩展性和过度设计做出权衡,不编写无用逻辑和一些与代码功能无关的附加代码。

    在真正需要某些功能的时候才去实现它,而不是你预见到它将会有用。 —— RonJeffries

    2. 编码规范:以集团开发规约、静态代码规约为前提,是否遵守了编码规范,遵循了最佳实践。除了形式上的要求外,更重要的是命名规范。目标是提高代码的可读性,降低代码可维护性成本。
    3. 潜在的BUG:可能在最坏情况下出现问题的代码,包括常见的线程安全、业务逻辑准确性、系统边界范围、参数校验,以及存在安全漏洞(业务鉴权、灰产可利用漏洞)的代码。。
    4. 文档和注释:过少(缺少必要信息)、过多(没有信息量)、过时的文档或注释,总之文档和注释要与时俱进,与最新代码保持同步。其实很多时候个人觉得良好的变量、函数命名是最好的注释,好的代码胜过注释。
    5. 重复代码:当一个项目在不断开发迭代、功能累加的过程中,重复代码的出现几乎是不可避免的,通常可以通过PMD工具进行检测。类型体系之外的重复代码处理通常可以封装到对应的Util类或者Helper类中,类体系之内的重复代码通常可以通过继承、模板模式等方法来解决。

    6. 复杂度:代码结构太复杂(如圈复杂度高),难以理解、测试和维护。
    7. 监控与报警:基于产品的需求逻辑,需要有些指标来证明业务是正常work的,如果发生异常需要有监控、报警指标通知研发人员处理,review业务需求对应的监控与报警指标也是Code  Review的重点事项。
    8. 测试覆盖率:编写单元测试,特别是针对复杂代码的测试覆盖是否足够。

    实际上维护单元测试的成本不比开发成本低,这点团队目前做的的不到位。
    针对以上每次代码review所涉及到的经典案例会统一输出到文档里,大家可以共同学习避免编写出同样的Ugly Code。

     

    发布计划评审

    涉及到10人日以上的项目,必须有明确的发布计划,并组织项目成员统一参加项目发布计划review,发布计划主要包含如下几点: 

    1)明确是否有外部依赖接口,如有请同步协调好业务方;

    2)发布前配置确认包括配置文件、数据库配置、中间件配置等各种配置,尤其各种环境下的差异化配置项;

    3)二方库发布顺序,是否有依赖;

    4)应用发布顺序;

    5)数据库是否有数据变更和订正,以及表结构调整;

    6)回滚计划,必须要有回滚计划,发布出现问题要有紧急回滚策略;

    7)生产环境回归测试重点Case。

     

    技术规划与管理 

    我在带技术团队的这些年,对团队一直有一个要求,每周都要做系统健康度巡检,未雨绸缪、晴天修屋顶,避免在极端场景下某些隐藏的bug转变成了故障。

    系统健康度巡检 

    为什么要把系统健康度巡检放到技术管理里,我觉得这是一个非常重要的环节。像传统的航空、电力、汽车行业都要有一定的巡检机制,保障设备系统正常运转,同样软件系统也同样需要巡检机制保障业务健康发展。 

    随着业务的不断发展,业务量和数据量不断的上涨,系统架构的腐蚀是避免不了的,为了保障系统的健康度,需要不断的考虑对系统架构、性能进行优化。

    系统的监控与报警能够一定程度发现系统存在的问题,系统存在的一些隐患需要通过对系统的巡检去发现,如果优化不及时在极端情况会导致故障,巡检粒度建议每周巡检一次自己所负责的业务系统。

    系统巡检重点要关注如下几点:

    • 系统指标:系统CPU、负载、内存、网络、磁盘有无异常情况波动,确认是否由发布导致,还是系统调用异常。

    • 慢接口:通常rt大于3s的接口需要重点关注,极端并发场景下容易导致整个系统雪崩。

    • 慢查询:MYSQL慢查询需要重点关注,随着数据量上涨,需要对慢查询进行优化。

    • 错误日志:通过错误日志去发现系统隐藏的一些bug,避免这些bug被放大,甚至极端情况下会导致故障。

     

    技术规划 

    技术规划通常由团队的TL负责,每个财年TL需要从大局的角度去思考每个季度的技术优化规划,去偿还技术债,技术债也是有利息的,因为利息的存在,技术债务不及时偿还的话,会在未来呈现出非线性增长,造成始料不及的损失。

    这里的技术规划包括如下几点:

    • 架构优化:一些结构不良、低内聚高耦合的代码则会使得哪怕是微小的需求变更或功能扩展都无从下手,修改的代价很可能超过了重写的代价。同样系统之间的耦合也需要重点去关注,遵循微服务化的原则,系统也要遵循单一职责原则,对于职责不清晰的系统去做解耦优化,进行一些模块化改造、服务隔离、公用服务抽象。 

    • 性能优化:基于财年对于业务量、数据量的发展评估,根据目前系统服务的QPS\RT,需要提前规划对系统性能进行一些升级策略,包括重点关注对一些慢接口、慢查询的优化。

    • 弹性与可靠性:系统提供的服务需要保障括数据一致性、幂等、防重攻击,同时也需要从熔断降级、异地多活的角度去考虑存在哪些问题,目前系统的SLA指标是否能够达到高可用,需要做哪些优化保障系统的高可用。

    • 可伸缩:应用服务是否保证无状态,关键节点发生故障能够快速转移、扩容,避免故障扩大化。

     

    总结

     

    大家不知道有没有类似的经历,某个时间段突然一些线上故障频发,各种技术债、业务债被业务方穷追猛打要求还债,如果出现这种现象很大程度这个TL已经失位了,这个团队失控了。也曾经有人跟我吐槽他的TL把活都分给他们,而TL自己什么都不干!这个技术TL真的什么都不干?曾经有一段时间我也在思考技术TL的核心职责到底是什么?技术TL应该具备哪些素质?

     

    首先技术说到底是为业务服务的,除非技术就是业务本身,必须体现它的商业价值。在很多公司里技术研发真的就成了实现其他部门需求的工具,我觉得这样的技术TL肯定是不合格的。首先它不能影响业务发展,需求提出方会经过很多转化,如果不是不假思索传递需求,整个过程会失真。

     

    第二个,我认为最最重要的是架构设计的能力,可能管理能力还次之。对于管理能力我认为最重要的是对团队的感知能力,因为一旦到了技术TL这个级别,不能脱离一线太远,业务细节可以不清楚,大的方向必须要明确。如果没有很细腻的感知能力,很多的决策会有偏差。

    如果他不是一个业务架构师,不是一个能给团队指明更好方向的人,他最终会沦为一个需求翻译器,产品经理说怎么做就怎么做。他更多的只是负责保证产品的质量、开发的速度,最终被肢解成一个很琐碎的人。一旦团队上了一定的规模,团队就会从单纯的需求实现走向团队运营,而运营是需要方向的,业务架构就是一个基于运营和数据的一种综合的能力。

    关于技术层面,技术TL需要具备如下素养:

    • 技术视野良好,解决问题能力与架构设计能力出色。

    技术TL要有良好的技术视野,不需要各种技术都样样精通,但是必须要所有涉猎,有所了解,对各种技术领域的发展趋势,主流非主流技术的应用场景要非常了解。知道在什么场景应用什么技术,业务发展到什么规模应该预先做哪些技术储备。产品架构的设计要有足够的弹性,既能够保证当前开发的高效率,又能够对未来产品架构的演进留出扩展的余地。

    • 动手能力要强,学习能力出色。

    技术TL并不需要自己亲自动手写代码,但是如有必要,自己可以随时动手参与第一线的编码工作,技术TL不能长期远离一线工作,自废武功,纸上谈兵。否则长此以往,会对技术的判断产生严重的失误。另外,技术TL也应该是一个学习能力非常出色的人,毕竟IT行业的技术更新换代速度非常快,如果没有快速学习能力,是没有资格做好技术TL的。

    技术TL除了管人和管事之外,其他还有很多事情要做包括建立团队研发文化、团队人才培养与建设、跨部门协调与沟通等,这样以要求技术TL也同时也需要具备良好的沟通和管理能力,以上观点仅是个人的一些思考和观点,仅供参考。

    转载于:https://www.cnblogs.com/kaleidoscope/p/10445439.html

    展开全文
  • 敏捷CSM认证:优秀的开发团队应该具备五大特点! 开发团队包含各种专业人员,负责在每个Sprint结束时交付潜在可发布并且“完成”的产品增量。在Sprint评审会议上,一个“完成”增量是必需的。只有开发团队成员才能...

    敏捷CSM认证:优秀的开发团队应该具备五大特点!

    开发团队包含各种专业人员,负责在每个Sprint结束时交付潜在可发布并且“完成”的产品增量。在Sprint评审会议上,一个“完成”增量是必需的。只有开发团队成员才能创建增量。
    开发团队由组织组建并得到授权,团队自己组织和管理他们的工作。由此产生的正面效应能最大化开发团队的整体效率和效用。
    在这里插入图片描述

    开发团队的特点

    •他们是自组织的。没有人(即使是Scrum Master)有权告诉开发团队应该如何把产品待办列表变成潜在可发布的功能增量;
    •开发团队是跨职能的团队,团队作为一个整体,拥有创建产品增量所需的全部技能;
    •Scrum不认可开发团队成员的任何头衔,不管其承担何种工作(他们都叫开发人员)。
    •Scrum不认可开发团队中所谓的“子团队”,无论其需要处理的领域是诸如测试、架构、运维或业务分析;
    •开发团队中的每个成员也许有特长和专注的领域,但是责任属于整个开发团队。

    开发团队的规模

    开发团队最佳规模是足够小以保持敏捷性,同时足够大可以在Sprint 内完成重要的工作。
    少于3个人的开发团队,成员之间没有足够的互动,因而生产力的增长不会很大。
    过小的团队在Sprint中可能会遭遇到技能上的约束,进而导致开发团队无法交付潜在可发布的产品增量。
    超过9人的团队则需要过多的协调沟通工作。对经验过程而言,大型开发团队会产生太多的复杂性而变得无用。产品负责人和Scrum Master角色不包含在此数字中,除非他们同时也参与执行Sprint 待办列表中的工作。

    内容来源:《Scrum 指南™》2017,由Scrum创始人Ken Schwaber和Jeff Sutherland开发并维护。

    展开全文
  • 使用自选择创建团队

    2017-11-20 18:00:00
    在企业中,自选择用于在团队间重新分配员工。使得开发人员有机会参与到...\\自选择(Self-selection)一词最早是在Sandy Mamoli和David Mole合著创建伟大团队:自选择是如何打造优秀员工》(Creating Great T...

    在企业中,自选择用于在团队间重新分配员工。使得开发人员有机会参与到战略决策中,并很好地理解业务需求。使用自选择,将赋予员工去承担困难的权利,并告知他们具体的决策情况。那么无论决策是多么艰难,员工都会积极主动参与其中。

    \\

    自选择(Self-selection)一词最早是在Sandy Mamoli和David Mole合著的《创建伟大团队:自选择是如何打造优秀员工的》(Creating Great Teams - How Self-Selection Lets People Excel)一书中提出的。前期,InfoQ曾采访了Mamoli和Mole。在这次采访中,这两位作者对自选择给出了如下的描述:

    \\
    \

    Mamoli: 自选择是一种让人们选择共事于哪个团队的方法。它是一种促进流程,实现人们自组织成小型、跨职能团队。这是最快速和最有效的形成稳定团队的方法,并基于一种信念:如果人们能够选择从事的内容和共事的同事,那么他们将是最幸福和最有生产力的。

    \\

    Mole: 非常简单。在大部分企业里,通常是数个管理者集中一起决定如何组建团队,自选择是一种最熟悉的选择团队方法的替代方案。在流程定义和谈论自选择优势时,我们认为我们不仅提供了一个可行的替代方案,而且当企业尝试这种方法选择团队时,他们将会发现难以置信的优势,并且不会再回到过去。

    \
    \\

    Serena Caruso和Antonia Greensides在Agile 2017剑桥大会上就授权团队自选择做了一次演讲。他们均为cr360/UL-EHSS公司的流程经理(Scrum Masters)。InfoQ以问答、总结和文章报道了本次大会的全程。

    \\

    InfoQ采访了Caruso和Greensides,采访内容涉及他们是如何使用自选择创建团队,以及他们在此过程中得到的经验教训。

    \\

    InfoQ:是什么使你们采用了自选择去定义团队?

    \\
    \

    Serena Caruso:这是根据部门的扩张和扩充开发队伍的需要,我们现在是通过与技术领导和管理层的多次会议,决定团队的人员配置。通常的做法是,一些人会预先分配给团队,余下的团队成员的选取类似于在学校中挑选运动队员那样。没有人会认为这样做挺好的。

    \\

    Antonia Greensides:当要求我们给出一种替代解决方案时,我们曾考虑使用个性分析为基础,但这种方法并不符合我们的敏捷原则。在我们看来问题是,“为什么重造轮子?”,并且不同团队的人一定会有不同的看法。由此,我们做了一些研究,看看在组建团队上是否有直接可用的图书,或是一些经过测试的技术。最后我们发现了Sandy Mamoli和David Mole撰写的《创建伟大团队》一书。

    \
    \\

    InfoQ:你们是如何说服管理层的??

    \\
    \

    Greensides: 在开始按这本书做事之前,我们找了一名开发经理,声称我们发现了一个好方法,并认为该方法是组建敏捷团队的一种很好方式,需要在团队成员一开始介入时就对他们授权。我们是否可以考虑尝试一下这个方法,还是应该马上放弃它?

    \\

    值得庆幸的是,该经理准备考虑这一替代方法,并要求我们准备一个方案,以便于他们做出决定,确定公司是否可以实际尝试一下。

    \\

    我们通读了整本书,研究了一些参考案例,并做了一个简短的幻灯片,提交给关键决策者。之后我们多次讨论了这一过程,以发送幻灯片副本的方式跟进每次研讨会。正如预期的那样,不少回应是“在理论上听起来很棒,但是你们如何确保它会取得成功?”

    \\

    Caruso: 为了说服管理层,我们必须确保对研讨会的设计能够解决一些业务限制问题。

    \\

    “最坏的情况”是我们的最强论据之一。如果在研讨会上没有达成协议,那么“最坏的情况”就是我们可以很好地了解人们的需求,以及人们是如何共同工作的。每个人终会明白,是难以让每个人都感到高兴的,并且需要采用自上而下的选择方法。

    \\

    在等待大家赞同的过程中,我们也没有闲着,我们尽可能去做好各种准备工作,从准备团队、常见问题列表,到打印图片和所需的材料。因此一旦由于业务压力,的确需要将团队分割为更有效的单元时,我们在一个星期内就完成了。

    \
    \\

    InfoQ:在将自选择介绍给产品负责人(PO,Product Owner)和团队时,你们是如何做的?

    \\
    \

    Caruso: 为了使产品负责人参与进来,我们采用了与使管理层参与进来的相同方式。因为这一方法强调的是在框架的自组织本质内,如何解决业务限制的方式。

    \\

    Greensides: 在向管理层提出这个想法的同时,我们也将这个想法介绍给了与我们合作的团队。如果连团队都不喜欢这个想法,那就它就没有任何意义了。谢天谢地,我们得到了很多很好的反馈意见,并表示愿意尝试新的方法。

    \\

    Caruso: 团队很快就参与进来,因为新提供的方案具有显而易见的优点,将用可决定未来工作的机会替代盲目的自上而下的管理决策,并有机会理解和亲眼目睹,为什么你的一些想法并不能成为团队工作中的最佳业务策略。在自选择中,开发人员将感到自己被是被视为成年人的,并能参与到真正的战略决策中,了解企业的需求。

    \
    \\

    InfoQ:自选择过程是如何进行的?

    \\
    \

    Greensides: 我们做了大量的准备工作,并了解了其他组织是如何应对挑战的。但一旦有事件发生,我们并不知道会发生什么。我承认,这对我们来说是一个可怕的时刻。

    \\

    大家具有很高的热情,直至我们面对了第一次拖延。这时我们意识到,尽管我们已经做了大量的准备来处理杂音和争论,但却没有办法处理沉默。

    \\

    Caruso: 下一步是我们犯的最大的错误,即管理层。是的,没错,我们没有按照那本书的建议去让管理人员置身度外。我们而是对拖延采取了一个大胆的决定,建议其中一名开发人员应该换一个团队。现在回头看,这一决定有一定的作用,让事情再次运转起来。但是可能还会有一些不同的处理方式。在团队看来,这是研讨会中的一个不足之处。

    \\

    Greensides: 研讨会开了大约两个小时,最终我们得到了预期的结果,可以重新分配团队。大家很高兴这样的操作,并非因为这意味着每个人都有选择的自由,而是因为团队在需要做出一个艰难的决定上保持了充分透明。

    \
    \\

    InfoQ:在推行自选择的过程中,你们得到了哪些经验教训?

    \\
    \

    Caruso: 遵循前人的建议!如前所述,我们不应该诱导管理层陷入其中,而应该让他们置身度外。

    \\

    如果我们可以决定再次推行自选择,那么我们会有一个更好的计划来防止拖延,并会提前与团队分享。

    \\

    我们了解到,如果我们能赋予员工承担困难并做出明智决定的权力,那么他们将会接受这种权利,并且无论所做的决定有多艰难,他们都会积极主动地参与其中。

    \\

    Greensides: 如果你发现了另外一种与规范方式不一样的工作方式时,即便你担心可能很难做到,但是去做吧!

    \\

    难道还能发生什么更糟糕的事情吗?

    \
    \\

    查看英文原文: Using Self-Selection to Create Teams

    展开全文
  • 优秀团队Smashing获奖感言 各位领导、老师、同学: 大家好!我是13组Smashing成员,XX。 为期三周公司创建与运营校内实训即将结束,虽然我们不是比赛最终胜利者,但整个过程中全组成员都尽心尽力,完美配合,...
  • 优秀团队奖获奖感言 各位领导、老师、同学: 大家好!我是13组smashing成员,苏婷。 为期三周公司创建与运营校内实训即将结束,虽然我们不是比赛最终胜利者,但整个过程中全组成员都尽心尽力,完美配合,积极...
  • 优秀团队获奖感言范文4篇 在这个世界上,任何一个人力量都是渺小,只有融入团队,只有与团队一起奋斗,你才实现个人价值最大化,你才能成就自己卓越!下面有小编整理的优秀团队获奖感言范文,欢迎阅读! 优秀...
  • 最新优秀团队获奖感言精简篇 团队的力量是无可估量,下面是小编精心整理最新优秀团队获奖感言精简篇,希望能给大家带来帮助!最新优秀团队获奖感言精简篇一 各位领导、老师、同学: 大家好!我是13组Smashing...
  • 「技术经理」是开发团队某位程序员需要对一起创建系统整个开发团队负责时所承担角色。通常他既要对最终交付软件系统负责,另外也会像一个程序员一样去开发实现系统。 一个技术经理 60% ~ 70% 时间...
  • Leangoo介绍:Leangoo(中文名:领歌)是一款非常优秀的敏捷项目管理软件。Leangoo核心是看板,团队可以使用Leangoo看板进行项目或产品的需求、任务、问题、缺陷的可视化管理和协作,随时随地跟踪团队工作进展。...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 163
精华内容 65
关键字:

如何创建优秀的团队