草庐IT

百人研发架构体系建设-高效能研发体系构建概论【原创】

车江毅的博客 2023-03-28 原文
背景
    技术管理者(技术总监/经理/CTO)都会面临公司战略执行,公司业绩的压力,以及业务对技术团队支撑能力的期望和诉求。如何打造一支快速响应,高效能,能打硬仗的技术团队?是技术管理者的挑战和必须完成的任务。
 
痛点
    1)技术选型混乱,大量基础技术组件代码重复构建,使用方式不一样;一些坑大家都需要重复踩一遍,关键是踩完了还不能复用经验可能还会在其他项目重复发生。
    2)项目最终被业务追着跑,产品设计没有路线图, 整体业务架构没有规划,最终演变成大量业务基础服务重复建设,业务边界不清晰,业务服务职责不清晰。
    3)线上事故不断,同一个问题可能重复发生或者一个事故发生后只有用户人为反馈后才能感知。解决和排查问题原因,需要很久分析才能解决。
    4)线上服务器管理混乱: 公共服务重复建设,服务器权限不清晰, 发版断服,服务不能动态扩容等。运维忙于处理线上故障和版本发布。
    5)研发流程,故障处理流程等标准化制度缺失或不明确; 人员的效能,团队的效能和组织效能无法量化,只能靠直觉和经验。
 
目标
    打造一支快速响应,高效能,能打硬仗的技术团队。
    1)技术人员效能提升50%, 整体人员成本降低50%。
    2)业务迭代周期提升30%, 实现秒级发布秒级回滚。
    3)故障响应速度提升90%,线上稳定性提升90%。
 
研发体系构建
 

 

 

1)业务一体化构建
    业务的一体化(或者称为业务中台),本质是基于功能抽象复用、架构合理性和业务统一管理的视角,通过适度的业务逻辑抽象、弹性的复用功能设计,将产品方案进行抽象、复用和下沉,打造企业级一站式功能服务平台。而这个过程非常考验产品的统筹规划设计能力,架构师的业务理解和服务拆分能力。
    个人比较推荐采用ddd的战略设计能力,产品与架构师和业务一起参与事件风暴,并梳理业务的核心流程,明确业务领域中的核心领域,支撑领域,通用领域,以及各个领域的上下文边界,并据此进行合理的业务微服务拆分,并反复验证业务领域模型和细节设计(也可同时采用传统的经验设计进行验证)后实施。同时个人也推荐在落地业务中台的时候,可以考虑把业务中台做“薄”一些,业务的前台做“厚”一些,这样可以保持前台业务的最大灵活性,帮助新业务快速度过探索期。
    假如在业务架构顶层设计时候领域拆分不合理,会在未来造成很多的业务架构技术负债而且项目迭代的效能会大大降低。而这些负债越到后面的业务发展,改动越难,影响越大。合理的领域服务拆分,服务调用链路应该是理想的树状或者可预期的规律调用链路。而在实操过程中,我们可以通过观察pinpoint或者skywalking追寻调用链路是否是网状无规律的循环调用结构?此时我们要确认服务拆分是否合理,是否需要重新梳理业务进行优化。
    虽然实际上每家公司的业务形态都不一样,若假设业务架构拆分合理(至少满足1-3年左右的业务架构演变),规划好产品技术路线图,项目迭代效能应该可以提升20%~30%。
 
业务领域图例:
 

2)技术一体化构建
    技术的一体化(不仅仅只称为技术中台),主要解决的是“业务开发人员”使用技术的统一标准化,比如是技术编程语言统一(如java,.net,python),技术选型统一(如分布式的技术选型统一,框架统一),技术使用标准统一(如日志规范),项目脚手架统一(如项目结构,项目文档统一)等。
我们在实践过程中通常会构建bsf(base service framework)基础服务框架,business framework 基础业务框架及bsf-demo基础业务脚手架去解决业务开发人员的技术问题。
    【bsf基础服务框架】解决框架使用,技术选型,性能优化,日志规范及中间件监控等标准。让业务开发人员无需关注底层框架实现,只需按照标准技术规范,专注本身领域的业务开发实践,专注本身领域的业务价值实现。(bsf框架层优先兼容新旧技术选型,推进技术演变,业务开发无需改动代码;同时为运维一体化,监控一体化,管理一体化提供框架级支撑)
参考(部分开源版): https://gitee.com/chejiangyi/free-bsf-all/ https://gitee.com/yhcsx/csx-bsf-all
    【business 业务基础框架】 解决业务之间公共通用使用的类库,比如业务的通信协议,业务的状态码标准(错误状态码)等等,同时也解决一些新旧架构兼容等业务兼容问题。
    【demo标准脚手架】 解决业务框架标准化项目结构(或ddd项目标准结构)及文档,让开发人员1分钟生成项目3分钟进入项目开发。
参考(部分开源版): https://gitee.com/yhcsx/csx-bsf-demo
 
基础框架集成顺序:
 
标准脚手架结构图:
 
    通过技术一体化的实践,我们比较完美的做到剥离业务开发的(与业务无关的)技术,让业务专注业务的实践,同时底层技术演进和实践,业务开发人员无需关注和配合。那么业务线高级开发人员的比例可以减少50%+,研发效能提升10%+。(当然架构师依旧会深入在某个业务线领域协助业务优化自身的业务架构(如分库分表),让业务性能和稳定性得到进一步的提升。)
 
3)监控一体化构建
    监控一体化的目的在于自动化的产出项目质量报告,并进行实时的预警机制,让业务开发人员只关注业务实践,无需关注线上性能问题(因为一旦有问题,我们就会自动监测)。
 
监控中心概要图
 
    我们构建一个监控体系用于基础采集指标的收集,其中包含开源的一些采集系统,自建的一些采集指标(插件行使)补充,或第三方商业的工具(如听云等),同时也会动态多维度的项目性能质量分析报告及动态评分和评级,同时根据策略实时进行性能及异常预警到特定人员。
    一方面将我们对常见的性能及稳定性问题的分析经验沉淀,形成自动化的监控和报警系统,彻底解放运维人力监控、人力分析预警;另一方面我们自动化的形成质量报告,实时分析出项目的质量情况和相应的解决方案建议(经验沉淀),推进项目质量改进和分析。
    最终实现秒级性能及异常报警,实时质量分析报告,1分钟内精准定位问题,解放重复的性能分析和排查,研发效能可提升5%+。
 
4)运维一体化构建
    运维一体化的本质在于彻底解放运维日常的工作,让运维更加关注服务器性能的提升,成本的降低。
在我们实践的认知中,我们认为运维和架构是一体的(至少也是难以分离),假如项目架构和技术层面没有做到统一(各自采用不同的技术选型和项目结构),那么在运维层面也难以做到统一,整体运维的工作量随着项目的数量,不断增加,甚至大部分场景都要单独维护,那么重复性和不必要的工作重复做。
运维自动化概要图
 
    运维的工作是技术中较为繁杂的(包含环境管理,权限管理,网络安全建设,资产管理等等),我们期望在基础设施服务一体化,云原生容器化,运维一站式,CICD一体化,发布自动化这几块就做到运维的一体化。
    【基础设施服务一体化】架构和运维推进并在设计初级做到技术选型的统一和项目结构的统一,技术内部团队中只允许使用一套基础设施服务和一套基础技术选型标准,比如分布式相关的基础服务,监控体系,研发管理体系和发布体系。
    【云原生容器化】容器化可以有效的节省服务器成本,快速扩缩容和服务持续可用,在技术体系统一的情况下,实践虚机到容器化迁移非常迅速,实际可节省服务器成本约30%左右;同时我们也推进所有的基础设施服务全部用云原生方式替代,进一步降低成本和快速部署能力。
    【CICD一体化】在技术一体化的基础上,采用一套部署脚本和机制,满足一键发布服务,一键回滚服务,所有服务版本化,所有服务秒级发布。开发人员无需关注线上部署脚本情况,无需关注服务启动切换,无需关注线上服务运行环境(虚机还是容器)。
    【运维一站式】所有运维的定时/监控等脚本分发执行,所有服务器,资产及成本等关键性的运维工作进行统一的管控及自动化平台。
    【发布自动化】在技术一体化的基础上,通过可视化流程形式构建整套发布流程和回滚流程,构建审批流程,将版本发布工作交还给项目团队,彻底解放运维的日常项目迭代发版的协同工作。
    按照两家公司的不同技术团队(150-200人左右)同等规模下实践对比,运维一体化实践较好的公司运维仅需1-2人,而另外一家公司运维约7人左右,而对整个技术团队的效能提升应该在5%~10%左右。
 
5)管理一体化构建
    管理一体化的目标在于建立数字化,标准化的管理方式,将经验和理念沉淀到系统中,通过数据去指导及验证管理决策,提升整体研发人员能效;同时我们期望将“人治”逐步变成"系统化",让管理者精力更加聚焦业务价值实现。
 
管理模式演变概要图
 
 
    在管理实践中,我们将“经验直觉”人治管理方式逐步演变成规范化标准化的人治管理方式(管理成本也逐渐增加),也期望逐步向“数据化”“自动化”的系统管理转变(更加精准,更加实时且直观的暴露问题),通过数据指标进行分析和对比,快速的决策和改进。
从项目初期,我们就推进各个环节的标准化(管理规范一体化),并制定关键核心规范并落地到各个项目中,但是效果不一定很理想。因为管理者在做业务价值和技术负债的取舍矛盾中,往往选择优先满足业务价值,本质是因为我们没有直观的量化的指标去衡量投入产出比,项目质量的变化,有效业务价值,这个也是最初数字化管理的需求痛点。
    管理要“以人为本”,管人要以“人性”为前提,但管理者要有财务思维。研发效能平台将组织架构,组织文化,项目管理工具(禅道/tapd),项目质量(监控一体化),标准规范(管理规范标准化),缺陷故障(线上bug/故障rca复盘),资源成本(服务器,资产,人员成本),周报管理,激励+成长+360考核等等已知研发体系信息进行分析。
    以“员工”为维度产出员工/管理者的职级,任务数,bug数,任务完成度,有效产出量,代码质量,工作时长,有效工作时长,线上故障数,工作饱和度,分享能力,学习能力,成长度,产品价值,技术价值,业务价值等等;
    以“项目”为维度产出项目/迭代的人员数,工时数,产品价值(达成率),技术价值(达成率),业务价值(达成率),人员投入成本,服务器投入成本;
    以“组织”为维度产出团队/组织的人员数,工时数,产品价值(达成率),技术价值(达成率),业务价值(达成率),人员投入成本,服务器投入成本,任务数,bug数,任务完成度,有效产出量,代码质量,工作时长,有效工作时长,线上故障数,工作饱和度,分享能力,学习能力,成长度等等。
    管理者最重要的事:制定目标,带领团队,拿出结果。我们期望通过将管理方法论沉淀为数据化,自动化的系统平台化管理,让管理者更加聚焦业务本身,通过一体化的量化数据增强管理和精准决策(验证管理成果),同时通过系统化降低管理(人员/职能)成本,(百人以上研发团队规模下)整体研发效能提升10%~20%。
 
总结
    通过研发体系的构建,五个维度的一体化建设,我们不断努力的实践并验证人员能效提升并聚焦业务价值;然而研发管理体系的建设并没有银弹,我们依旧在不断的沉淀,实践,总结,交流,打破,提升;欢迎一起交流分享!
 
 
by 车江毅

有关百人研发架构体系建设-高效能研发体系构建概论【原创】的更多相关文章

  1. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  2. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  3. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  4. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  5. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  6. ruby - Ruby 语言可以用来构建操作系统吗? - 2

    Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby​​解释器作为独立内核加载到内存中。一旦ruby​​解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大

  7. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  8. ruby-on-rails - 如何使用 ruby​​ on rails 构建 openid 提供程序 - 2

    我尝试了一些关于ruby​​onrails中openid利用率的搜索。然而,尽管出现了一组选项,例如omniauth、authlogic等,但这些gem通常用于构建接受openid身份验证的站点。换句话说,它们用于openid消费者设置。我也想构建自己的openid服务器。AssuggestedhereinOpenIdsite我发现了像Masquerade和local-openid这样的东西,不幸的是,它们不是非常活跃的项目,下载量很少。自建openidprovider服务器有没有其他设施可以推荐?非常感谢!!干杯,叶 最佳答案 虽

  9. ruby - 使用 Ruby 构建聊天应用程序 - 2

    我正在尝试构建一个纯粹使用Ruby的聊天应用程序。有一个similarquestion较早发布,但我有不同的相关查询。我看过thisexample(与之前发布类似问题的人所提到的相同)。示例中的代码似乎对我不起作用。在终端上运行ruby​​脚本,并连接到url:http://localhost:1234在我的浏览器中,我无限期地遇到“正在从本地主机传输数据...”消息。此处的1234是所提供示例中使用的端口号。我无法弄清楚我运行失败的原因是什么。可能是我需要在执行脚本时在命令行中指定一些东西,或者我应该通过其他地方(可能是浏览器)开始聊天(输入输出)。我无法弄清楚到底该做什么。你能帮我

  10. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

随机推荐