上一讲中,分享了当前 3 个技术发展趋势,以及其对编译技术的影响。本日我们把其中的云计算和编程模式、编译技术的之间的关系、前景再睁开探讨一下。
总的来说,现在编写步伐是越来越云化了,以是,我们简单地称作云编程就好了。
关于云编程,有许多有趣的题目:
1. 编程自己是否也能上云?在云上编程会跟本地开辟有什么不同?
2. 如何编写云应用,来充分发挥云平台的能力?分为哪些不同的模式?
3. 为什么编写云应用那么复杂?如何降低这些复杂度?云原生应用的开辟平台,能否办理这些题目?
本节就带你深入讨论这些题目,希望借此资助你对编程和云计算技术的关系做一个梳理,促使你更好地使用云计算技术。
起首,来看看如何实现云上编程。
实现云上编程
90 年代初,宿舍几个人合买了一台 386 电脑。那个时候,记得自己不太喜好微软提供的 MFC 编程框架,这和 386 电脑没有浮点运算器,编译起来比较慢有关,编译一次使用 MFC 框架的,C++ 步伐的时间,充足我看一页报纸的了。
喜好编程的人,为了获得流畅的性能,电脑配置总是很高,固然这足以满足 C/C++ 时代的编程需要,但进入 Java 时代后,因为应用结构越来越复杂,工程师们偶然需要在条记本或桌面电脑上,安装各种复杂的中间件,甚至还要安装数据库软件,这时,电脑的配置即便再高,也很难安装和配置好这么复杂的环境。那么到了云计算时代,挑衅就更大了,好比,你能想象在电脑上安装 Hadoop 等软件,来做大数据功能的开辟吗?
实在,编写一个小的应用还好,但现在的应用越来越复杂,所需的服务端资源越来越多。以最近参与的一个项目为例,这个项目是采用微服务架构的一个企业应用,要想实现可扩展的性能、更好的功能复用,就要用到数据库、消息队列、容器服务、RPC 服务、分布式事务服务、API 服务等等许多底子办法,在自己的电脑上配置所有这些环境,是不大可能的。
因此,工程师们已经习惯于,在云上搭建开辟和测试环境,如许,可以随需获取各种云端资源。
因为编程跟云的关系越发紧密,有些开辟工具已经跟云平台有了肯定的整合,方便开辟者按需获取云端资源。好比,微软的 Visual Studio 支持直接使用 Azure 云上的资源。
再进一步,IDE 自己也可以云化,我们可以把它叫做“云 IDE”。你的电脑只负责代码编辑的工作,代码自己放在云上,编译过程以及所需的类库也放在云上。Visual Studio Code 就具备 UI 和服务端分离的能力。还有一些服务商提供基于浏览器的 IDE,也是实现了前后端的分离。
我以为,未来的 IDE 可能会越来越云化,因为云 IDE 有许多优势,能给你带来许多好处。
1. 易于管理的编程环境
编程环境完全配置在云上,不用在本地配置各种依靠项。
这一点,会给编程教育这个范畴,提供很大的资助。因为,学习编程的人能够根据需要,打开不同的编程环境,立刻投入学习。反之,假如要先做许多复杂的配置才气开始学习,学习热情就会减退,一些人也就因此止步了。
实在,在软件开辟团队中,你经常会看到如许一个现象:新加入项目组的成员,要花很长的时间,才气把开辟环境搭建起来。因为他们需要安装各种软件,开通各种账号等等。那么,假如是基于云 IDE 开辟的,这些麻烦都可以省掉。
2. 支持跨平台编程
有些编程所需要的环境,在本地很难配置,在云中开辟就很简单。好比,可以用 Windows 电脑为 Linux 平台开辟步伐,甚至你可以在云上,为你的无人机开辟步伐,并下载到无人机上。
在为手机编程时,比较复杂的一项工作是,适配各种不同型号的手机。这时,你只需要通过云 IDE,整合同样基于云的移动应用测试环境,就可以在成百上千种型号的手机上测试你的应用了。
3. 更强的计算能力
有些软件的编译非常斲丧 CPU,好比,完整编译 LLVM 可能需要一两个小时,而充分使用服务器的资源可以让编译速度更快。假如你从事 AI 方面的开辟,体会会更深,AI 需要大量的算力,而且 GPU 和 TPU 都很昂贵,我们很难自己去搭建如许的开辟环境。而基于云开辟,你可以按需使用云上的 GPU、TPU 和 CPU 的计算能力。
4. 有利于开辟过程的管理
开辟运动集中到云上以后,会有利于各种管理工作。好比,许多软件项目是外包开辟的,那么你可以想象,基于云编程的平台,甲乙两边的项目管理者,都可以获得更多关于开辟过程的大数据,也更容易做好源代码的掩护。
5. 更好的团队协作
越来越多的人已经习惯在网上编写文档,平心而论,线上文档工具并没有本地的 Office 软件功能强大,是什么因素让我们更加偏爱线上文档工具呢?就是它的协作功能。团队中的成员可以同时编辑一个文档,还可以方便地将这个文档在团队中分享。
而我比较希望见到如许的场景,那就是,步伐员们可以基于同一个代码文件,进行点评和交互式的修改,这相当于基于云的结对编程,对于加强团队的知识分享、提升软件质量都会有好处。
基于上述几点,个人猜测:编程这项工作,会越来越与云紧密结合。如许一来,不仅仅能方便地调取云端的资源,越来越多的编程环境也会迁徙到云上。
既然提到了在云上编程的方式,那么接下来,我们从编译技术的视角,来探讨一下,如何编写能充分运用云计算强大威力的应用,如许,你会对云计算有一个更加全面的认知。
如何编写云应用?
学习编译原理,你可能会有一个感受,那就是编程可以在不同的抽象条理上进行。也就是说,你可以通过抽象,把底层复杂的技术细节转换成上层简单的语义。
步伐员最早是直接编写机器码,指令和寄存器都要直接用 0101 来表示。后来,冯·诺依曼的一个学生,发明了用助记符的方法(也就是汇编语言)简化机器码的编写。用汇编语言编程的时候,你仍旧要使用指令和寄存器,但可以通过名称来引用,好比34 讲中,用 pushq %rbp 如许的汇编指令来表示机器码 0x55。这就增加了一个抽象条理,用名称代替了指令和寄存器的编码。
而高级语言出现后,我们不再直接访问寄存器,而是使用变量、过程和作用域,抽象水平进一步增加。
总结起来,就是我们使用的语言抽象水平越来越高,每一次抽象对下一层的复杂性做了屏蔽,因此使用起来越来越友好。而编译技术,则帮你一层层地还原这个抽象过程,重新转换成复杂的底层实现。
云计算的发展过程跟编译技术也很雷同。云计算服务商们希望通过层层的抽象,来屏蔽底层的复杂性,让云计算变得更易用。
而且,通常来说,在较低的抽象条理上,你可以有更大的掌控力,而在更高的抽象条理上,则会获得更好的方便性。
假造机是人们最早使用云资源的方式,一台物理服务器可以分割成多个假造机。在需要的时候,可以创建同一个假造机镜像的多个实例,形成集群。因为假造机包含了一套完整的操作体系,以是占据空间比较大,启动一个实例的速度比较慢。
我们一般是通过编写脚本来管理软件的摆设,每种软件的安装摆设方式都不相同,体系管理的负担比较重。
最近几年,容器技术变得盛行起来。容器技术可以用更轻量级的方式,分配和管理计算资源。一台物理服务器可以运行几十、上百个容器,启动新容器的速度也比假造机快了许多。
跟假造机模式相比,容器摆设和管理软件模块的方式标准化了,我们通过 Kubernetes 如许的软件,编写配置文件来管理容器。从编译原理的角度出发,这些配置文件就是容器管理的 DSL,它用标准化的方式,代替了原来对软件配置进行管理的各种脚本。
无服务器(Serverless)架构,或者叫做 FaaS(Function as a Service),做了进一步的抽象。你只要把一个个功能写成函数,就能被平台调用,来完成 Web 服务、消息队列处理等工作。这些函数可能是运行在容器中的,通过 Kubernetes 管理的,而且按照肯定的架构来协调各种服务功能。
但这些技术细节都不需要你关心,你会因此丧失一些掌控力,好比,你不能自己去天生许多个线程做并行计算。不过,也因为需要你关心的技术细节变少了,编程效率会提高许多。
上面三个条理,每一级都比上一级的抽象条理更高。就像编译技术中,高级语言比汇编语言简单一样,使用无服务架构要比直接使用假造机和容器更简单、更方便。
但纵然到了 FaaS 这个条理,编写一个云应用仍旧不是一件简单的事情,你还是要面临许多复杂性,好比,处理应用步伐与大容量数据库的关系,实现跨公有云和私有云的应用等等。那么能否再进一步抽象并简化云应用的开辟?是否能通过针对云原生应用的编程平台,来实现这个目标呢?
为了探究这个题目,我们需要进一步审视一下,现在云编程仍旧有哪些,需要被新的抽象条理消除掉的复杂性。
对云原生编程平台的需求:能否办理云应用的复杂性?
在《人月神话》里,作者把复杂性分为两种:
一种叫做本质复杂性(Essential Complexity),指的是你要办理的题目自己的复杂性,是无法制止的。
一种叫做附属复杂性(Accidental Complexity),是指我们在办理本质题目时,所采用的办理方案而引入的复杂性。在我们现在的体系中,90% 的工作量都是用来办理附属复杂性的。
经常会被问到如许的题目:做一个电商体系,成本是多少?而我给出的回答是:可能几千块,也可能许多亿。
假如你理解我的答案,那意味着比较理解当前软件编程的复杂性题目。因为软件体系的复杂性会随着规模急剧上升。
像阿里那样的电商体系,需要成千上万位工程师来维护。它在双 11 的时候,一天的成交量要达到几千亿,担当几亿用户的访问,在性能、可靠性、安全性、数据同等性等维度,都面临巨大的挑衅。最告急的是,复杂性不是线性叠加的,可能是相乘的。
好比,当一个软件服务 1 万个用户的时候,增加一个功能可能需要 100 人天的话;针对服务于 1 百万用户的体系,增加同样的功能,可能需要几千到上万人天。同样的,假如功能不变,只是用户规模增加,你同样要花费许多人天来修改体系。那么你可以看出,整体的复杂性是多个因素相乘的效果,而不是简单相加。
这跟云计算的初志是相悖的。云计算最早答应,当我们需要更多计算资源的时候,简单增加一下就行了。然而,现有软件的架构,实在离这个目标还很远。那有没有可能把这些复杂性解耦,使得复杂性的增长变成线性或多项式级别(这里是借助算法复杂性的理论)的呢?
再带你细化地看一下附属复杂性的一些构成,以便加深你对造成复杂性的根源的理解。
1. 底子办法的复杂性
编写一个简单的步伐,你只需要写写业务逻辑、处理少量数据,采用很简单的架构就行了。但是编写大型应用,你必须关心软件运行的底子办法,好比,你是用假造机还是容器?你还要关心许多技术构成部门,好比 Kubernetes、队列、负载平衡器、网络、防火墙、服务发现、体系监控、安全、数据库、分片、各种优化,等等。
这些底子办法产生的复杂性,要花费你许多时间。像无服务器架构如许的技术,已经能够帮你屏蔽部门的复杂性,但还不敷,仍旧有许多复杂性因素需要找到办理方案。举个例子。
大多数商业应用都要很小心地处理跟数据库的关系,因为一旦数据堕落(好比电商平台上的商品代价堕落),就意味偏庞大的商业损失。你要根据应用需求设计数据库结构;要根据容量设计数据库分片的方案;要根据数据分析的需求设计数据仓库方案,以及对应的 ETL 步伐。
一个经常出现的情况是,数据处理的逻辑分布在几个微服务中,要让它们对数据的修改满足事务特性,以是你要在代码里添加与分布式事务有关的逻辑。
那么,能否由云原生的开辟平台来自动处理所有这些事情?我们只需要做业务对象(好比订单)的逻辑设计,把上述所有技术细节都隐蔽起来呢?
2. 摆设复杂性
大型软件从编写代码,到摆设,再到生产环境运行,是一个复杂的过程。
源代码可能有多个分支,需要进行合并;
需要能够正确地编译;
编译后的效果,要打包成可摆设的对象,好比容器镜像;
要对需要发布的模块进行测试,确保不会因为这次发布而造成许多 bug;
要对数据库的结构、底子数据等做必要的修改;
新版本的软件上线,偶然候不是全部上线,而是先让一部门用户使用,然后再针对所有用户;
假如上线的特性出现题目,需要能够回滚到原来的版本。
是不是很复杂?那么,如许的复杂性,是否也可以由云原生的开辟平台隐蔽起来呢?
3.API 的复杂性
我们在写云应用的时候,需要通过 API 来调用别的服务。你需要处理与之相关的各种题目,包罗 API 访问的权限、访问次数的限制、错误处理、不同的 RPC 协议和调用约定,以及相同的功能在不同的云平台上使用不同的 API。
那么我的题目是:能否让 API 调用跟平凡语言的函数调用一样简单,让开辟平台来处理上述复杂性呢?
回答上面 3 个题目,并不简单。但是,根据计算机语言的发展规律,我们总是会想办法创建更高的抽象条理,把复杂性隐蔽在下层。就像高级语言隐蔽了寄存器和内存管理的复杂性一样。
如许看来,办理云计算的复杂性,要求新的编程语言从更高的一个抽象条理上,做编译、转换和优化。我们只需要编写业务逻辑就可以了,当应用规模扩大时,真的只需要增加计算资源就行了;当应用需求变化时,也只需要修改业务逻辑,而不会引起技术细节上的许多工作量。能办理这些题目的软件,就是云原生的编程语言及其底子办法。
而现在的技术进步已经提供了很好的底子,容器技术、无服务器架构、处理大数据的 Map/Reduce 架构等,为云原生的编程语言准备好了素材。
我信赖,在许多应用范畴,我们实在可以降低对掌控力的要求,从而获取更大的方便性的。好比,对于大多数企业应用来说(好比 ERP、CRM 等),进行的都是以业务数据为核心的处理,也就是以数据库为核心的处理。
这些应用都具备相对同等的模式,通过更高的抽象条理,去除各种附属复杂性是有可能的。像如许的针对数据库编程的特定范畴的云原生编程平台,会比较容易成功。
课程小结
本节带你围绕“云编程”这个话题,剖析了云计算技术怎样和编程结合。希望以下几个观点会对你有所开导:
1. 编程环境会逐渐跟云平台结合起来,不仅仅是调用云上的资源,还可能实现编程环境自己的云化。
2. 编译技术能够在不同的抽象条理上,处理计算题目,云计算技术也有雷同的不同级别的抽象条理。一般来说,抽象条理越高,对技术细节的掌控力就越低,但是获得的便利性就越高。
3. 附属复杂性会让成本和工作量呈指数级上升,云原生编程平台的核心任务是去除附属复杂性。而我对于在特定范畴,成功应用云原生编程平台,持乐观态度。
一课一思
那么,假如以后的编程环境都搬到云上,你会喜好吗?为什么?别的,你的实际项目中遇到过哪些复杂性题目属于附属复杂性?你以为该如何办理这些复杂性?
云计算技术对编程模式的影响及其与编译技术的关系是本文的重要讨论内容。作者指出,云编程将带来许多优势,包罗易于管理的编程环境、支持跨平台编程、更强的计算能力、有利于开辟过程的管理以及更好的团队协作。文章通过讨论云上编程的实现方式和优势,为读者提供了对云计算技术的全面认知。从编程抽象条理的演变到云计算的发展历程,文章以编译技术为线索,阐述了云计算服务商们希望通过层层的抽象来屏蔽底层的复杂性,让云计算变得更易用。文章末了提出了进一步抽象并简化云应用开辟的题目,引发了对针对云原生应用的编程平台的思考。通过对云编程的发展历程和未来趋势的探讨,为读者出现了云计算技术的前沿动态和发展方向。文章深入探讨了云计算中的附属复杂性题目,并提出了对云原生编程平台的需求,以办理云应用的复杂性。文章以此引发读者对云计算复杂性题目的思考,并探讨了云原生编程平台的潜伏办理方案。文章内容丰富,深入浅出,对云计算技术的发展趋势和应用前景进行了全面而深入的阐述。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |