软件开发的发展进程就像是一个“搭积木”的过程。不论什么语言,什么框架,发展趋势都是“模块化”、“组件化”,本质就是像让写代码跟搭积木一样,可复用,简单快捷。
机器指令
最小的粒度肯定是二进制的机器吗,当年计算机还是庞然大物,纸带打点的方式操作。
此时,一个复杂的计算被用许多个指令来实现。
此时,计算机多用于课学计算。
代码指令
发展到汇编时代,编程粒度最小的就是指令了。
此时一个复杂的功能被拆分为许多个汇编指令来实现。
此时,计算机多用于课学计算或机器控制。
代码行
出现高级语言后,C语言是其中的翘楚,因为当今世界上所有的操作系统都是C语言写的,C是无愧的老大哥。这时最小粒度是代码行。
此时,计算机开始普及,作为民用。
流程控制语句
顺序,条件,循环三种流程控制语句奠定了编程的基础,是代码行的一个封装。
函数或方法
由代码行和流程控制语句组成的一段代码片段,用来实现某个特定的功能,叫做函数或者方法。此时一个复杂功能被拆分为多个函数实现。
对象的时代
由于现实世界过于复杂,人类的大脑处理能力有限,不能够把复杂问题完整拆分为多个函数或方法。聪明的前辈就提出了“面向对象”的哲学解决方案,世界上所有的事物都可以用对象来表示,世界就是由对象和对象见的交互(关系)组成的。
这个时代是C++和Java的天下,C++完整兼容C并支持面向对象,故到今天为止仍然是编程界的霸主。Java去掉了C++复杂的功能,提供了更简洁易用且工程化的编程方式,故到今天为止仍是首屈一指的编程语言。
此时,互联网和计算机成为人类世界的基础服务和必需品。
线程
单线程运行,时间成本太高,某些场景接受不了,故出现了多线程。线程是另一种维度的“积木”封装。操作系统最小的运行粒度是线程。
携程
由于操作系统创建线程的成本(耗费资源)过高,人们引入了携程,以go语言最具有代表性。操作系统并不支持携程,只是语言层面的一种对线程的封装,意义是时间快、资源占用少。
进程
操作系统把多个线程的封装叫做进程。多进程是另一个维度的“积木化”体现。此时是服务器的天下,Tomcat或Apache是这个时代的巨无霸。
到目前为止,各个“积木”之间的交互或通信方式只有一种,就是通过内存交互数据。程序也只能固定运行在某台特定的物理机器上。
此时应用间的数据交换可以通过磁盘变相的使用内存交换。多进程可以把数据保留到磁盘,然后再读取到内存进行数据交互。
依赖
jar包或者组件库等依赖是零一维度的“积木化”,方法写的越来越多,人们发现公共的方法能提炼出来的,就封装成了工具库,随着工具库的增多,人们发明了Github,Maven,npm等分享代码或依赖的网站或工具。
一些特定的功能被封装成依赖,供大家使用。
“约定大于配置”的思想是这个时代的主流,Maven,npm等包管理工具是这个时代的代表。
框架
某些问题的解决方案被封装成了一个有一个的框架,每种语言都有几十种热门框架。
尤其应该指出的是,Spring框架发扬推广的一种对象创建方式,IOC,对象的创建由自己new转为框架提供自动注入。DI和IOC改变了编程方式,引领了一个时代的潮流。
应用
单应用无法解决问题了,多应用就出现了,多应用迭代了很多年,从SOA到现在的微服务,本质上是单应用无法满足需求,演变成了多应用。当下是微服务的时代,微服务是必然趋势和历史潮流。
微服务本质是多应用,多应用的本质是解耦,解耦的本质是分工,是对人的一种解耦,一人一个应用,一人一个功能,一人负责解决问题的一部分。
此时应用之间的交互或通信变成了通信协议,终于跨越了内存和操作系统的限制,应用可以由任何语言,任何框架,部署在任何操作系统上。应用之间使用通信协议交互数据。
此时,Java语言的SpringBoot框架+HTTP协议是这个时代的主流。因为SpingBoot提供了免费的完整的解决方案,各企业使用该方案成本最低,而且该框架的通信协议使用了HTTP协议。当然也有一些其他框架或语言,也有之间使用TCP协议或变种协议。单其都没有SpringBoot和HTTP的影响范围广。
软件开发模式由此开始发生转变。
Devops,云原生,云计算,大数据,人工智能等等开始涌现……
此时的软件开发特点:
- 人分工:一个应用由上百人甚至上千人共同完成
- 接口API变得最为重要,甚至胜过编程语言或框架,编程的粒度首次由方法调用(使用框架或者依赖)改为接口调用。在通信协议的基础上进行数据交互,网络的作用首次大于内存,数据交互不仅仅局限于内存交互,通过网络,数据可以和任意应用进行交互。
- 云计算真正来临,开发开始分层,底层是IAAS云厂商提供基础计算资源,专业的厂商封装IAAS提供PAAS平台服务,其他企业使用PAAS提供SAAS软件服务,k8s(docker)是PAAS的代表,首次将应用和应用的运行环境封装成一个image镜像,使得计算和存储分离成为现实,云原生时代来临,应用可以跟物理机器分离,物理机器或硬件变得不在重要,软件变得更为重要,软件开始出现生命,生于云上,长在云上,消失在云上。
- C/C++提供基础服务,做IAAS,Go语言分布式开发,提供PAAS服务,Java做为SAAS层面的首选开发语言,js/Android/IOS等作为前端开发语言。分功明确,岗位明确。
集群
微服务时代,单计算机已经不重要,集群时代来临。计算机集群是另一种“积木化”的表现形式,K8s绝对是这个时代的翘楚。FAAS
当下是微服务到FAAS的过渡期,FAAS函数即服务,人们不关心语言,不关心框架,不关心计算资源(物理机,操作系统等等等等)只关心把自己的想法实现。
这个时代js绝对是翘楚。js+nodejs可以做任何事,而且成本足够低。js的缺点和弱势被开源界和云厂商封装掉,包装掉,甚至优化掉。人们只需要用一门足够简单易用的编程语言去实现自己的想法。编程像写作一样简单,变成人人都可以做的事情。js符合这个时代,当然底层云厂商还是使用C/C++,Go,JAVA等等变成语言实现。只是用户终端的语言都会变成js。未来肯定会发生的事情:
- 终端会变成一个屏幕,只有很少的计算资源。也就是说,开发人员打开浏览器写写js,把自己的想法转成代码,所见即所得的拖拽界面简单修改代码后便完成一个应用的开发,云计算按需供给资源(计算,内存,网络,存储等等),帮你把代码运行,按需计费。当下一部分已经成为现实,不信去看看阿里云的函数计算,打开浏览器写写代码,自动运行。未来
AI的发展,会让高级语言,比如普通话变成编程语言,未来人们只需要说几句话,计算机就能理解,完成编程构建应用。比如当下的语音机器人就已经实现了部分功能,只是目前比较弱智,但智能只是时间问题,早晚会实现。