朋友你好 预期将推出
“后端PHP开发人员”课程,传统上我们会与您分享有用材料的翻译。
该软件可以解决越来越多的日常任务,同时也变得越来越困难。 正如马克·安德列森(Mark Andressen)所说,它吞没了整个世界。

结果,在过去几年中,应用程序开发和交付方法发生了巨大变化。 这些都是构造尺度的变化,结果导致了一系列原则的出现。 实践证明,这些原则对团队建设,设计,开发以及将应用程序交付给最终用户很有用。
原理可以总结如下:
应用程序应该是小型的,联网的并且具有面向开发人员的架构 。 基于这三个原则,您可以创建一个可靠,全面的应用程序,该应用程序可以快速安全地交付给最终用户,并且可以轻松扩展和扩展。

每个拟议的原则都有许多方面,我们将进行讨论,以显示每个原则如何有助于最终目标的实现,即快速交付易于维护和使用的可靠应用程序。 我们将这些原则与它们的相反之处进行比较,以阐明其含义,例如,“确保您使用
小原则” 。
我们希望本文会鼓励您使用建议的原理来构建现代应用程序,从而在不断发展的技术堆栈中提供统一的设计方法。
通过应用这些原理,您将发现
自己正在利用最新的软件开发趋势,包括使用
DevOps方法开发和交付应用程序,使用容器(如
Docker )和用于容器编排的框架(如
Kubernetes ),使用微服务(包括
NGINX微服务体系结构)和微服务应用程序的
网络通信体系结构 。
什么是现代应用程序?现代应用程序? 现代堆栈? “现代”到底是什么意思?
大多数开发人员对现代应用程序的组成只有一个大致的了解,因此您需要对此概念进行清晰的定义。
现代应用程序支持多个客户端,无论是JavaScript React库上的用户界面,Android或iOS的移动应用程序,还是通过API连接到另一个应用程序的应用程序。 现代应用程序意味着存在无限数量的为其提供数据或服务的客户。
现代的应用程序提供了用于访问所请求的数据和服务的API。 API应该是不变的且恒定的,并且不是专门为来自任何特定客户端的特定请求而编写的。 可通过HTTP(S)访问该API,并提供对GUI或CLI中所有功能的访问。
必须以公认的兼容格式(例如JSON)访问数据。 API以清晰,有条理的方式提供对象和服务,例如RESTful API或GraphQL提供了不错的接口。
现代应用程序建立在现代堆栈上,而现代堆栈分别是支持此类应用程序的堆栈。 这样的堆栈使开发人员可以轻松地创建具有HTTP接口和清晰的API端点的应用程序。 选择的方法将使您的应用程序可以轻松地以JSON格式接收和发送数据。 换句话说,现代堆栈对应于
微服务的十二要素应用程序的元素。
这种堆栈的流行版本基于
Java ,
Python ,
Node ,
Ruby ,
PHP和
Go 。
NGINX微服务体系结构代表了以上述每种语言实现的现代堆栈的示例。
请注意,我们并非专门提倡微服务方法。 你们中的许多人需要处理需要发展的整体,而其他人则处理不断扩展和发展成为微服务应用程序的SOA应用程序。 还有一些正在转向无服务器应用程序,并且一些正在引入上述的组合。 本文中阐述的原理仅需少量更改即可适用于每个系统。
原则既然我们对什么是现代应用程序和现代堆栈有了共同的了解,是时候沉浸于体系结构和开发原理中了,这将为您很好地为现代应用程序的开发,实现和提供支持。
原则之一是“创建小型应用程序”,我们就称其
为小型性原则 。 包含大量移动组件的应用程序异常复杂。 反过来,使用小型离散组件构建应用程序可简化其设计,维护和整体使用。 (请注意,我们说的是“简化”,而不是“使其简单”。)
第二个原则是,我们可以通过帮助开发人员专注于开发的功能来提高开发人员的生产力,同时使开发人员在实施过程中无需担心基础结构和CI / CD。 因此,简而言之,我们的方法
专注于开发人员 。
最后,有关您的应用程序的所有内容都应连接到网络。 在过去的20年中,随着网络更快,应用程序越来越复杂,我们朝着网络化的未来迈进了一大步。 正如我们已经发现的,许多不同的客户端应该通过网络使用现代应用程序。 在架构中使用网络思维具有显着的优势,这与
小型化原理和
面向开发人员的方法的概念非常吻合。
如果在应用程序的开发和实现过程中牢记这些原则,那么您将在产品的开发和交付中拥有不可否认的优势。
让我们更详细地看这三个原则。
小原则人脑难以同时感知大量信息。 在心理学中,术语“认知负荷”是指将信息存储在内存中所需的精神努力总量。 减轻开发人员的认知负担是当务之急,因为在这种情况下,他们可以专注于解决问题,而不是牢记整个应用程序和正在开发的功能的当前复杂模型。
由于以下原因,应用程序被分解:
- 减轻开发人员的认知负担;
- 加快并简化测试;
- 快速交付应用程序中的更改。
有多种方法可以减轻开发人员的认知负担,而这正是小型化原则发挥作用的地方。
因此,有三种方法可以降低认知负荷:
- 减少开发新功能时应考虑的时间范围-时间范围越短,认知负担越低。
- 减少执行一次性工作的代码量-减少代码量-减少负载。
- 简化了对应用程序进行增量更改的过程。
缩短开发时间让我们回到
waterfall
方法作为开发过程标准的时代,并且开发或更新应用程序的时间范围从六个月到两年不等。 通常,工程师首先阅读相关文档,例如产品要求(PRD),系统参考文档(SRD),体系结构计划,然后开始将所有这些内容组合成一个认知模型,并据此编写代码。 随着需求以及架构的变化,必须做出认真的努力来通知整个团队有关认知模型的更新。 在最坏的情况下,这种方法可能会使工作瘫痪。
应用程序开发过程中最大的变化是敏捷方法的引入。
agile
方法的主要特征之一是迭代开发。 反过来,这导致工程师的认知负担减少。
agile
方法无需要求开发团队在一个较长的周期内实施应用程序,而是使您可以专注于可以快速测试和部署的少量代码,同时还可以接收反馈。 考虑到两周增加或功能更改的大量规范,应用程序的认知负担已从六个月的时间范围更改为两年,目的是对大型应用程序有更模糊的理解。
将重点从大型应用程序转移到可以在两周的冲刺中完成的特定小型功能上,从头一个下一个冲刺向前看不超过一个功能,这是一个重大变化。 这使我们能够提高开发效率,同时减少不断波动的认知负担。
agile
方法论假设最终应用程序将是原始概念的略微修改版本,因此最终开发点必然是模棱两可的。 只有每个特定冲刺的结果才能清晰准确。
小型代码库减少认知负担的下一步是减少代码库。 通常,现代应用程序非常庞大-可靠的企业级应用程序可以包含数千个文件和数十万行代码。 根据通信文件的组织以及代码和文件的依赖性,它们可能很明显,反之亦然。 甚至调试代码本身也会导致问题,具体取决于所使用的库以及调试工具在库/软件包/模块和用户代码之间的区别程度。
构建应用程序代码的有效思维模型可能会花费大量时间,并再次给开发人员带来巨大的认知负担。 对于存在大量代码,其功能组件之间的交互作用不清楚的单片代码库尤其如此,因为不遵守功能边界,因此关注对象的分离常常变得模糊。
减轻工程师的认知负担的有效方法之一是向微服务架构的过渡。 在微服务方法中,每个服务都专注于一组功能。 服务的含义通常是定义和可理解的。 服务的界限也很清楚-请记住,与服务的通信是使用API进行的,因此由一个服务生成的数据可以轻松地传输到另一个服务。
与其他服务的交互通常仅限于使用简单干净API调用(例如,使用REST)的多个用户服务和多个提供程序服务。 这意味着严重减轻了工程师的认知负担。 最困难的任务是了解服务之间的交互模型以及诸如事务之类的事情如何在多个服务中发生。 结果,微服务的使用减少了认知负担,减少了代码量,表明了服务的明确界限,并提供了对用户和提供者之间关系的理解。
小增量变化最小原则的最后一个要素是变更管理。 对于开发人员来说,查看代码库(甚至可能是他们自己的较旧的代码)并说:“这很糟糕,我们需要全部重写。” 有时候这是正确的决定,有时不是。 这给开发团队带来了全局模型更改的负担,这反过来又导致了巨大的认知负担。 工程师最好将精力集中在冲刺期间可以进行的更改上,以便以后及时地(尽管是逐渐地)推出必要的功能。 最终产品应该让人联想到预先计划的产品,但是要进行一些修改和测试以满足客户的需求。
重写大部分代码时,有时无法快速交付更改,因为其他系统依赖性在这里起作用。 为了控制更改的流程,您可以使用功能隐藏。 原则上,这意味着该功能已在生产中,但是使用环境变量(env-var)的设置或某些其他配置机制无法使用。 如果代码已通过所有质量控制流程,则可能处于隐藏状态。 但是,仅当最终启用该功能时,此策略才有效。 否则,它只会乱扔代码并增加认知负担,开发人员将不得不应对这些负担以进行生产性工作。 变更管理和增量变更本身可以将开发人员的认知负担维持在可承受的水平。
即使简单实现附加功能,工程师也必须克服许多困难。 在管理方面,合理的做法是减少团队的额外负担,使团队可以专注于职能部门的关键要素。 您可以做三件事来帮助您的开发团队:
- 使用
agile
方法来限制团队应专注于关键职能的时间范围。 - 将您的应用程序实现为多个微服务。 这将限制正在实施的功能的数量,并加强在工作期间承受认知负荷的边界。
- 优先选择增量更改而不是大而笨重的代码,而是更改较小的代码段。 即使添加后不立即可见,也可以使用功能隐藏来实现更改。
如果您在工作中应用小型化原则,那么您的团队将变得更加快乐,更加专注于必要功能的实现,并且更有可能更快地进行定性更改。 但这并不意味着工作不会很复杂,有时恰恰相反,引入新功能需要修改几种服务,并且此过程可能比单片体系结构中的类似过程更为复杂。 无论如何,采用小方法的好处是值得的。
第一部分结束。
很快我们将发布翻译的第二部分,现在我们在等待您的评论,并邀请您参加
开放日 ,今天将在20.00举行。