应用程序研发之基础知识分层与进化
1:全文概要
应用程序研发依赖基础知识:编程语言,开发框架,虚拟机,基础组件,网络,操作系统,计算机硬
件,产品需求。有这些基础知识才能运用自己的技能实现出符合要求的应用程序。
基础知识间是存在上下依赖关系的,即分层。 每一层基于一层的api实现,并提供更高的抽象为上层服
务。
各层技术都在进化,进化的目的就是为了提高效率,包括执行更快,或更简单,让人更方便。
人类对生产效率最求不止,技术进化不止。
2:垂直分层
2.1 多角度分层
当前应用程序主要开发形式为,采用某种主流高级编程语言提供的抽象api进行开发。程序或直接运行在
操作系统上或运行与某个虚拟平台或引擎中(常用高级语言如 c系列,go,java ,.net ,js,python)。
虚拟机运行在操作系统上, 操作系统运行又需要计算机硬件支持。计算机间再通过网络连接。
分层关系:
各技术间在垂直方向上分为多个层,每一层完全基于其下一层进行设计,并为上层提供抽象。一般没有进行隔层的直接调用。
程序运行依赖:应用程序->虚拟机->操作系统->计算机硬件
计算机间通过网络与相连。
软件本身也可分为多层
如分为基础支撑的软件及使用基础支持软件完成任务的软件。微信小程序->微信平台->微信平台支持软件,如数据库。
这种应用软件的分层是一种服务调用,但不是完全面向这个层进行设计。
比如软件依赖数据库,但不是面向数据库进行设计的。
分层应用软件的设计的目标是在某一个领域提供一中抽象,让其他软件可以直接使用。
2.2 分层的目的与发展
分层目的
每一层使用下一层的抽象(下层接口),基于下一层接口,做更高一层的抽象,抽象后提供给上层使用。每一层抽象的目的就是给上一层可以更简单高效的完成任务。分层目的是分工与重复利用,专业的人做专业的事做的可以更好,成果给更多的人重复使用,这些人的效率就更高。
分层垂直方向的发展
技术在垂直分层上的进化可能是在目前高层上再出现一层,或在某些层间添加一层。将某些原来上层需要处理的事简化了。如java虚拟机 简化应用程序对内存管理,docker 对操作系统做一层抽象,简化部署。
2.3 多角度了解上下多层
从不同角度(目的)了解各个层:上层,本层,下层-,上层的上层,下层的下层。
2.3.1 直接上层
仔细服务直接上层,明晰自己的服务对象才能提供更符合要求的服务。
上层就是自己服务的对象,工作的目标就是让服务对象更简单高效的完成他们的工作。
应用程序开发的目标如果是提供给用户使用,帮用户更简单高效完成某个作业,就需要了解用户的作业流程,如何封装部分处理逻辑,方便用户。
程序开发的目标如果是给其他程序服务(某些功能的抽象),如中间件软件,就要了解其他程序对这个功能的需求。提供易用高效的功能服务。
虚拟机,编程框架,操作系统也是同样的逻辑。为上层服务。
对直接上层要了解详细的需求与原因。
2.3.2 上层的上层...
密切关注上层的上层...-(用户的用户-上帝的上帝是谁)
上层的上层才是本层变革的真正驱动因素
如果上层采用本应用的目的是给其他人提供服务。驱动就在上层的上层。
如用户更优质画面游戏的需求驱动游戏软件做更好的画面,再驱动显卡的技术进步。就是典型用户的需求驱动软件,再驱动硬件的进步。游戏用户是硬件的上层的上层。
密切观察用户的用户新需求动向,调整自己的发展方向。
如软件服务端的目标客户的客户量增加可能要考虑自己在性能上数据量支持上升级。
生活上同理:
如新冠发展严重,生成熔喷布的就赶快上产能,如果疫苗出现了,就下产能。
如果用户的用户要玩完,你要赶快更换用户。消费要萎靡,生产商也要出问题,原材料供应商就要赶快调整。
直接上层如果是天气,上层的上层就是季节,气候。生产及购买夏装是根据季节不是天气。
对上层的上层要了解趋势与变动方向。
2.3.3 直接下层
熟悉直接依赖层的抽象模型与能力
对直接依赖下层要熟悉其的接口并了解其核心能力与逻辑,才能更好的实现本层。
应用程序开发,直接依赖的是基础组件与操作系统。编程语言与框架可理解为对这种抽象在常用的地方又提供了一层方便的翻译接口。用编程语言开发熟悉接口虽然看似在语言api上,但映射的逻辑模型在操作系统上。语言映射的进程,线程,存储空间管理,数据模型,这些其实本质还算操作系统提供的抽象级别。
目前很多框架与高级语言也在os上做越来越多的抽象,掩盖了操作系统的模型,编程过渡到面向编程框架与os编程。
应用程序在os上:要了解os的接口与逻辑模型 ,线程,内存,网络等资源管理,计算能力,资源能力的限制。
应用程序使用数据库就需要熟练数据库提供的语言SQL,并了解数据库的核心能力:事务机制,存储效率指标,存储结构,模型。
直接下层知识是必须熟悉的,熟悉程过程也分为几个程度(阶段),从了解与熟悉接口阶段,到了解熟悉核心逻辑与原理阶段。
熟悉部分主要接口就可以使用期进行工作了,达到会用程度。如果深入会出现很多情况下用的不好,需要了解其核心逻辑与实现原理,达到用好的阶段。
具体阶段
1:了解主要api--可用其工作阶段
2:了解了更多的api-可用其做绝大部分工作阶段
3:了解其核心逻辑与原理,优缺点--可恰如其分的使用,并能解决疑难问题。针对各个特性不仅知道有哪些特性及特性的含义,还明白为什么有这些特性(实现原理)
有些人在第一阶段就止步:觉得已经搞懂会了
有些人在第二阶段止步:觉得很熟悉,精通了。
部分人在第三阶段:知其所以然。用其优,藏其拙。
2.3.4 下层的下层...
明白根基与能力边界-下层的下层...
下层是建立在更下层基础之上的,能力边界有时是受最基础的支撑环境限制的。
下限是自己能控制提高的,上限反而不是自己能控制的,受自己的根基(底层)限制。升级根基能提高自己的上限
下层并不能隔绝对更下层的依赖,而是简化。真正的发展限制可能是在更下一层。
比如:程序运行在操作系统上,但也运行在计算机硬件上。
依赖的不是下一层而是下面的所有层。
程序优化不止针对操作系统的特点,很多深入的优化是根据硬件特点进行设计与优化
1:根基决定上限
比如:
数据库的读写性能受限文件系统与网络性能,文件系统又受限与硬盘存储限制,硬盘存储受限于其采用的材料特性。
应用程序受限操作系统性能,操作系统受限于硬件能力。
最快的程序能计算多快?目前最快计算在纳秒级别,因为CPU的频率在GHZ级别。
如果 CPU的频率是1GHZ(一秒1 000 000 000次电脉冲),
软件单个计算的速率上限(一个计算的耗时)也不能低于1ns(1秒=
1 000 000 000 ns)。
谁在为你的服务者服务,服务者的本领受为其提供服务的服务者限制。
生活上:
主要一级材料的生命期是1年,加工的中间件,最终商品的使用寿命上限就难超过一年。
钢筋水泥的寿命是50年,你对水泥房上的租房协议能超过50年?
2:升级根基提升能力上限
升级根基与更换根基是突破能力值的重要方法。
如:
数据库读写能力提升-不用更换文件系统,将机械盘换为固态盘-升级根基的能力。
数据库读写能力提升--用内存数据库替换传统数据库(redis在局部替换mysql)-更换根基。
系统间传输速度提升不上去,优化程序也没有再大提升,可考虑下是否是可升级网卡与接入光纤。
升级下CPU,程序不做任何调整,性能也可以大幅提升。
决定下限的是努力(自我),决定上限的是选择(环境)。
2.4.5 总结
程序开发方面
应用程序开发的目的是提供给用户使用(某项用户作业的抽象)或服务他应用程序(某项功能的抽象),设计程序采用的编程语言及编程平台,下一层是操作系统或虚拟机,执行引擎等。下一层的特性比如虚拟机又依赖操作系统,操作系统的特征又受限于硬件的限制。
带着目的去了解各相关层,了解上层为提供更准确好用服务,了解底层知道限制在哪里。
升级程序上限不要忘记升级程序的支撑基础环境。
个人感悟
了解的层次越多,看问题也更全面,通透,不会受限,从而遇到问题不知所措,或力气用偏了。方向走错。
精力有限如何掌握各个问题的多个层次,各个层次解决问题的思路都有相同之处,或大家其实都是从生活与其他知识上借鉴来解决当前遇到的问题的。理解通了一个,在理解其他的会越来越快,了解的越多,再去看新的领域就会越快。--(这里的了解是了解其原理而是表面的接口,原理有很多相通的,接口是人随意编制的,学再多也无大用)
天下武功无非内功与招式,内功与招式的原理其实是有限的,到具体招式与各门派的内功数量是很多的。
懂了九阳神功易筋经,其他内功是否也相通,懂独孤九剑核心思维,可看透天下武功的招式。
再看其他武功一看就懂,并能发现对方的破绽与优点,遇到问题可也自创武功。--学到精髓就不用学了,就是遇到问题解决-可见招拆招===孤独求败
了解新技术--
1:要解决的是什么问题
2:如果自己设计应该怎么设计
3:他们是具体怎么设计的,这么设计好吗,有啥特性?有哪些优点与缺点?
4:如何进一步优化
3:水平进化
各层技术都在不断的进化。
3.1 进化的目标(驱动)
进化目标:高效,包括系统与人两个方面提升效率。
1:系统性能上更高,人使用更简单(抽象的模型简单)
2:系统提高执行速度,实现更快。
接口与模型更简单,人可更快实现实现目标(减轻技术人员工作复杂度)。
3.2 进化的手法
手法:更精细,更复杂,更抽象
更精细的设计
更细粒度的分工
更复杂的配合。
更高级的抽象
比如:
CPU用更精细复杂的电路,添加高速缓存,多核-更复杂设计满足执行更高效
编程进化:汇编,面向过程,面向对象,基于虚拟机的执行平台。
---更高级的抽象,提高程序开发效率
3.3 进化的目的冲突
进化的两个目的有时是有冲突的,会为了性能增加复杂度,也会为了简单牺牲性能。
如:
CPU多核与高速缓存为了提高执行性能,但编程模型也会更复杂。
虚拟机方便了编程模型对内存管理,但执行性能有损耗。
进化原则及冲突选择依据:
性能满足不了的情况下才会选择增加人的复杂度
只要性能可接受尽量减少人的复杂度。
如:
研发中如果可以用简单技术手法实现,性能也满足要求就别去引入更复杂的技术。单节点能解决就不用分布式,单线程能搞定就不搞多线程。数据库性能就满足性能就不引入缓存。单点性能满足不了只能集群与分布式。数据库性能满足不了引入缓存。
人本性是懒的,不会主动给自己找麻烦,只有为了可以更懒才会去干活。辛苦造汽车是为了少走更多的路。
版权声明: 本文为 InfoQ 作者【superman】的原创文章。
原文链接:【http://xie.infoq.cn/article/dfc1ffbd91e18bea82cca7246】。文章转载请联系作者。
评论 (1 条评论)