隐藏复杂性是软件开发进化的方向

IT的不可能三角:在固定生产力水平下,开发效率、资源利用率、稳定性三者不可能同时达到最优。

软件生产力的发展,经历了几个阶段。

  1. 1945-1965原始时期。小规模、不成体系的软件开发,初期甚至没有软件的概念,更没有软件工程的概念。
  2. 1965-1989程序系统阶段。开始有软件系统概念,引入多用户、人机交互等,第一代数据库。这个阶段人们对复杂项目管理的难度有了认知,提出“人月神话”、“没有银弹”等概念。
  3. 1990-1999因特网崛起。随着因特网的崛起,软件系统从单机和局域网扩展到广域网。搜索引擎出现。
  4. 2000年至今,互联网时代。互联网快速发展,从初期简单粗暴的系统到今天的云原生。

受益于理论和实践的发展,不同时期的整体生产力是不断上升的。与上个世纪相比,今天无论是开发效率、资源利用率还是系统的稳定性都有了长足的进步。但在某一时期,企业仍然需要在开发效率、资源利用率、稳定性之间做出权衡。
IT企业在成长期时,为了跟上业务发展,需要集中优化开发效率;稳定期,为了保障客户体验,优先保证系统稳定性;下降期,为了提升财务表现,需要优化资源占用,提升资源利用率。

如何才能尽可能减少这个不可能三角的影响?核心是逐步隐藏软件开发中的复杂性。我们拿近几年分布式系统的发展分析一下。

  1. 高质量中间件的涌现。中间件将原本业务系统需要处理的共性复杂逻辑抽离,沉淀,从而给业务开发提速。专注于处理复杂性的中间件,其开发效率和资源利用率也有所提升。
  2. 中台。中台虽然褒贬不一,但其在某些业务场景下还是有可取之处的,比如订单域和营销域。通过将复杂逻辑封装到中台,分离了稳定性和开发效率的责任方,其中稳定性由中台保证,开发效率则由业务开发保证。
  3. Serverless,FaaS。通过将微服务的控制平面抽离和将共性SDK抽离,将复杂性隐藏于框架层。

那要如何做到隐藏复杂性的同时少踩坑呢?

  1. 高质量抽象。抽离复杂性的抽象层,需要保证每个组件都能独立完成功能,提供明确且简洁的接口契约,尽量少地对外暴露内部细节。
  2. 对旧服务的兼容。要尽量让服务的部署做到环境无关,比如golang会将应用打包为单体,比如容器技术。旧服务的部署做到环境无关时,可以减少新抽象的历史包袱,从而跑得更快。