当前位置: 首页 > 科技观察

灵魂36题,让你快速熟悉一个系统

时间:2023-03-18 11:44:53 科技观察

面对一个完全陌生的系统,如何快速熟悉并上手?本文将从三个方面进行总结,提供一个系统的方法,也可以用来回顾现有的一些系统,查漏补缺。前言开发者经常面临以下场景:新人需要学习现有系统作为落地的一部分,如何学习?当他们被拉去参与陌生系统的迭代开发或系统维护(bugfix)时,如何快速上手?同事请假或者把系统转给你,怎么办?内心os:这是锅?这样的场景有很多,有必要梳理一下常见的问题和解决方案,方便以后遇到类似的场景快速应对。本文总结熟悉系统主要分为三个部分:业务学习、技术学习、实战。每个部分都会梳理出一些学习过程中需要回答的问题,这些问题需要随着经验的积累逐步补充完善。业务学习业务学习就是从业务的角度来学习系统。我们要了解系统的客户是谁,用户是谁,带来什么价值,系统提供什么功能。不懂业务,就不知道系统是干什么的。技术是为企业服务的。只有业务清晰了,才能知道如何用技术更好地为业务服务。所以业务学习的首要任务就是熟悉一个系统。这方面的主要学习方式包括与产品、运营、开发沟通,学习产品设计文档、PRD、自己使用系统,还有一些常用的图,比如产品功能架构图、业务流程图、功能树和用例图。常见问题:系统的行业情况如何?谁是系统的目标用户?比如,是不是由公司高层来做决定?用于运营或客户服务?还是针对互联网用户?平均有多少人在使用它?人们在使用它吗?系统有什么商业价值?哪些指标可以衡量系统的商业价值?系统有哪些功能模块?系统有哪些领域概念?梳理系统的领域模型。系统的关键业务流程是什么?关键业务流程是什么?系统的非功能性需求是什么?比如性能、质量、可扩展性、安全性等。系统未来的发展规划是怎样的?技术学习技术学习主要是学习系统的架构,如何实现,以及系统的运维。有一种五视图方法来描述系统的体系结构。五视图分别是:逻辑架构、开发架构、运行架构、物理架构、数据架构。逻辑架构逻辑架构关注的是功能需求,系统应该为用户提供什么样的服务,关注的是行为或职责的划分。常用的表达图形,静态图包括包图、类图和对象图,动态图包括时序图、协作图、状态图和活动图。逻辑架构的核心设计任务是模块划分、接口定义和领域模型细化。常见问题:有哪些子系统或模块?系统之间的关系是什么?对外上下游接口有哪些?谁是对接人?关键业务流程如何实现?开发架构开发架构门主要关注系统源码、第三方SDK、使用的框架、中间件、工具包等。常见问题:代码在哪里?包裹是怎么分的?如何分层?比如mvc,controller-service-dao。使用什么框架?比如ssh,dubbo。使用了哪些工具包?比如apachecommons,guava。使用了哪个中间件?比如metaq、tair、schedulerX、Diamond。您依赖哪些平台?如权限平台、流程引擎等。相关的并发、同步和通信。常见问题:系统能支持多少qps?峰值qps是多少?您如何与上游和下游系统交互?rpc?网址?同步还是异步?最终如何将运行时库和系统软件安装或部署到物理机上,如何部署机器和网络以满足软件系统的可靠性、可扩展性、持续可用性、性能和安全性要求。常见问题:系统是如何发布和部署的?什么是部署环境?系统中有多少台机器?系统是如何部署的?重点关注接入层和部署方式,如集群部署、分布式部署等。有容器化吗?有没有多机房部署?数据架构数据架构的设计以数据需求为中心,重点是持久化数据的存储解决方案,不仅包括实体和实体-关系数据存储格式,还包括数据传输和数据复制、数据同步等策略。常见问题:数据存储在哪里?用的什么数据库,比如oracle,mysql。整理出E-R图。有多少数据?有没有分库分表?使用了哪些nosql库?有哪些数据同步任务?大数据框架的使用情况如何?解决。常见问题:什么时候可能会出现问题?比如电商双十一,对系统的压力很大,这个时候很容易出问题。是否对关键功能进行监控?取决于系统配置了哪些告警项,监控了哪些方面。如何解决问题?日志在哪里?是否有完整的链接跟踪?是否有一些应急操作,比如交换机配置、降级、限流配置等。系统的缺陷是什么?找个开发同学回顾一下历史问题,避免踩坑。通过同事总结的案例,或者与负责的产品、运营、技术和了解。系统中总会有一些坑需要填补。历史代码经过多次迭代,总会导致高复杂度(多分支、多嵌套、多循环)、设计漏洞、性能风险等,难以维护。这些都需要我们重构。记得有一句话:填的坑越大,能力越大。运营和客服反馈的常见问题有哪些?在实践和熟悉了系统的业务和技术之后,就到了实践的时候了,通过实战进一步加深对系统的熟悉。实践中,你可以通过提出需求、修bug、重构的方式,自己编码、调试、测试、上线。总结一下,现有的系统通常都会经历从0到N搭建的过程,熟悉系统其实是一个逆向推导的过程,也是学习架构和阅读源码的过程。在学习的过程中,最好带上思考,比如为什么要这样设计,为什么要用这个中间件?有没有更好的编码方式?哪里可以优化等等,从而达到一个深入熟悉的过程。