引言:JavaScript 应用变得越来越庞大。这是因为使用JavaScript能做的事情远比我们大多数人所需求的要多得多。我们不能仅因为技术上可行,就去考虑软件系统的扩展问题。为一个不需要扩展的系统增加扩展性是不值得的,尤其对最终用户来说,这只会使系统显得更加笨重。
本文选自《大型JavaScript应用最佳实践指南》。
作为JavaScript 开发者和架构师,必须承认并了解影响扩展性的因素。虽然不是所有JavaScript 应用都需要扩展,但总有一部分是需要的。比如,我们很难确认某个系统不需要扩展,不需要为它的可扩展性花费时间和精力。除非我们开发的系统不需要后期维护,否则总会有对增长和成功的预期。
从另一方面讲,JavaScript 应用并非天生成熟的可扩展应用,而是逐步积累、进化成的可扩展应用。对于JavaScript 开发人员来说, “可扩展性的影响因素”是一个有效的工具。我们不希望一开始就过度设计,更不希望被早期设计绑住手脚,限制了可扩展性。
对可扩展的需要
扩展软件是一种基于反应的活动。考虑可扩展性的影响因素可以帮助我们积极地做出准备。在应用后端等系统中,这种“扩展活动”通常是被自动处理的,可能是短暂的访问高峰。例如,激增的用户请求导致负载骤增,这时负载均衡器介入,将负载均匀地分派到后端服务器。在某些极端情况下,系统可能会在需要时自动准备新的后端资源来应对变化,当不再需要时将这些资源自动销毁。
但是前端不一样,前端的扩展活动通常发生的时间周期较长,而且更加复杂。JavaScript应用的独特一面在于,浏览器能获得的硬件资源就是它能使用的全部硬件资源,它从后端获取的数据可以很好地按比例增长,但这不是我们需要考虑的。随着软件的不断演进,我们要想成功做点什么,就必须关注“可扩展性的影响因素”。
上图自上而下地展示了可扩展性的影响因素。首先是用户提出软件需要实现的功能,接着功能尺寸、与其他功能的关系等因素会直接影响开发团队的构成,沿着箭头自上而下影响相应地增长。
不断增长的用户
如果构建的应用只服务于一个用户,就没有必要这么大费周章了。基于典型用户的需求来构建的应用将会为更多用户提供服务。所以在应用进化过程中,应该预见到用户的增长。尽管并没有确切的目标用户数量,不过,基于应用自身的特点,仍然可以使用http://www.alexa.com/这类工具作为基准,设定活跃用户数量的目标值。比如,如果我们的应用是任何人都可以访问的,就会希望有大量的注册用户;但如果仅针对个人安装,那么加入系统的用户数量的增长就会比较缓慢。但即使如此,我们还是希望部署数量不断增加,以提升软件的用户总量。
与前端界面交互的用户数量是扩展应用最大的影响因素。每增加一个用户都伴随着各种架构层面上指数级的增长。如果自上而下地看,用户决定一切。应用的存在终归是为了服务用户。JavaScript 代码越易于扩展,就越能取悦用户。
添加新功能
也许能够取悦用户的功能就是用户基数庞大的成功软件最显而易见的附带产物。软件的功能会随着用户数不断增长,尽管新功能显而易见,但还是经常被忽视。明明知道增加新功能不可避免,但我们还是很少思考如何合理地在代码中实现源源不断的新需求。正是缺少这样的思考,阻碍了我们继续发展。
这在软件交付初期非常棘手。软件开发商会竭尽全力吸引新的用户,但由于初期阶段能够吸引用户的功能有限,导致收效甚微。没有足够多的成熟特性,没有庞大的开发团队,也没有机会去打破用户习惯。当没有这些限制条件时,比较容易能够实现一些功能让已有或潜在用户感到眼花缭乱。但是我们如何才能在早期决策时迫使自己考虑周全?如何才能在提供更多功能的前提下确保没有限制我们扩展软件的能力?
你也许会发现,不管是开发新功能还是增强已有的功能,都是可扩展JavaScript 架构始终需要考虑的问题。我们需要考虑的不仅仅是软件推广文案中罗列的各种功能,还要考虑这些功能的复杂度、各个功能之间的共性以及各个功能有多少“移动部件(MovingParts)”。当自上而下审视JavaScript 架构时,如果用户是第一层级,那么各个功能就是下一个层级。从这个层级开始扩展变得纷繁复杂。
使功能变复杂的,并不是某一个单独用户,而是一群需要这个功能的用户。从这个角度讲,我们不得不思考使用软件的用户的特征或者角色,以及哪些功能提供给哪些角色。对这种组织结构的需求在一开始并不明显。直到后期,我们先前的决策使得引入基于角色的特性难以实施时,它才会显现出来。并且,这还取决于我们的软件是如何部署的,有时可能需要支持多种不同的用例。比如,可能几个大机构用户,都有各自的部署方案,并且很可能有各自独特的用户结构上的限制。这是十分具有挑战性的,如果希望做到可扩展,架构就需要支持这些组织结构迥然不同的需求。
雇佣更多的开发者
实现软件的各种功能需要可靠的JavaScript 开发人员,并且他们应该知道自己在做什么。能有一个这样的开发者团队是非常幸运的事情。团队组建不是自发的,在团队可以开发出优秀代码之前,需要在某种程度上建立起彼此之间的信任和尊重。一旦开始,我们就处于一个良好的状态。再看一下前面提到的自上而下的可扩展性影响因素,我们要开发的功能会直接影响团队的健康。这之间的平衡基本上是无法维持的,但是可以尽量接近。缺少人手但又有太多的功能要实现,这会让团队成员倍感压力。当如期交付毫无希望时,大家就不会努力尝试了。另一方面,如果开发人员过多,要开发的功能有限,就会带来更多的沟通负担,而定义职责又很困难,所以当大家对职责没有共识时,离失败就不远了。
相对于拥有太多的开发人员,开发人员不足反而更易于功能的开发。当面临巨大的功能开发压力时,是一个很好的时机来退后想一想:“如果我们有更多的开发者,会与现在有哪些不同呢?”这个问题经常被忽略掉,直接去招更多的开发者。而让大家惊讶的是,招聘到新人后功能的产出并没有立竿见影的效果。这就是为什么我们需要一个没有愚蠢问题、责任分配明确的研发文化。
团队组织结构和开发方法并没有定式,开发团队需要有针对性地处理开发中的情况,最大的问题无疑就是功能的数量、规模和复杂度。所以,这些才是我们在建立团队之初,以及团队成长过程用应该考虑的。后一点尤为重要,因为当功能大量增加后,初期的团队结构是无法适应的。
鉴于这些扩展影响因素会随着时间推移而改变,我们以架构的角度来调整设计或者修改产品,以应对扩展所面临的挑战。
若要进一步讨论这些影响扩展的各项因素,深入了解它们并准备一个核对清单,以帮助我们实现可扩展的JavaScript 应用来响应这些事件,可见《大型JavaScript应用最佳实践指南》一书。
本文选自《大型JavaScript应用最佳实践指南》,点此链接可在博文视点官网查看此书。
想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
影响JavaScript应用可扩展性因素的更多相关文章
-
【转】性能测试,影响 TPS 的一些因素
首先我们要先了解下TPS的具体含义: TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位. 下面 ...
-
mysql中影响数据库性能的因素讲解
mysql中影响数据库性能的因素讲解 在本篇文章中我们给大家讲述了mysql中影响性能的因素以及相关知识点内容,有兴趣的朋友参考下 关于数据库性能的故事 面试时多多少少会讲到数据库上的事情,“你对数据 ...
-
seo优化入门教程:影响关键词排名的因素
很多人都说网站优化,但是怎么个优化法?优化什么东西?很多人都不知道.虽然我们优化的是我们的网站,但是提升的却是我们的关键词排名. 我们不管去优化哪一个网站,得到的搜索结果,他都会去触发关键词排名的因素 ...
-
影响ERP成功实施的因素及实施方法
一.影响ERP实施的因素 1.企业自身管理和认识上的问题.在ERP实施过程中没有用变革管理的理念和方法来策划和管理ERP的实施是导致ERP失败的主要原因. ERP作为一种管理工具他的实施本身就是操作手 ...
-
[经验交流] 影响 kubernetes 稳定性的因素
使用k8s已有近一年的时间,版本从1.2到1.5.1.6.1.7,期间出现并解决了不少问题,下面是我总结的影响k8s集群稳定性的因素: 1. 安装环境 *kubelet版本最好与kube-apiser ...
-
影响mysql性能的因素
一.服务器硬件. CPU不够快,内存不够多,磁盘IO太慢. 对于计算密集型的应用,CPU越可能去影响系统的性能,此时,CPU和内存将越成为系统的瓶颈. 当热数据大小远远超过系统可用内存大小时,IO资源 ...
-
SEO初步学习之影响网站排名的因素
本文介绍一些比较明显的因素,一些隐藏较深的原因还有待发掘: 1.采集网站内容,即抄袭其他网站的内容. 2.新站上传后建议不要有大的改动. 3.标题频繁修改. 4.大量投放垃圾外链. 5.不做友链,交友 ...
-
影响Arcmap运行效率的因素
在使用ArcMap的过程中,总觉得ArcMap运行起来非常慢,目前发现了两点原因: 一.渲染太多图斑 比较常见的,我们在打开矢量图层时,Arcmap会自动渲染加载进去的图斑,进行符号化.在渲染的过程中 ...
-
select语句中会影响查询效率的因素
1.没有创建索引,或者没有正确使用索引;2.存在死锁的情况,从而导致select语句挂起; 3.返回不必要的列,如很多人喜欢在程序中使用select * from 这样会查询表或视图中的所有字段,如果 ...
随机推荐
-
html学习第三天—— 第13,14章
颜色值缩写 关于颜色的css样式也是可以缩写的,当你设置的颜色是16进制的色彩值时,如果每两位的值相同,可以缩写一半. 例子1: p{color:#000000;} 可以缩写为: p{color: # ...
-
开发Android必知的工具
程序开发有时候非常依赖使用的开发工具,好的完备的开发工具可以让开发人员的工作效率有大幅度的提高.开发Android也是如此,大家可能都离不开Eclipse或Android Studio这些工具,但他们 ...
- ios 图片尺寸
-
javaWEB总结(1):第一个servlet程序
1.新建一个javaWeb工程,工程的目录如下 2.在com.dao.chu的包下新建一个HelloServlet.java类 package com.dao.chu; import java.io. ...
-
疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
-
Django__Ready
Python WEB框架 : DJango : 大而全 flask : 小而精 tornado : 下载DJango : PIP3 INSTALL DJANGO 创建DJango项目 : django ...
-
kubernetes进阶(02)kubernetes的node
一.Node概念 Node是Pod真正运行的主机,可以物理机,也可以是虚拟机. 为了管理Pod,每个Node节点上至少要运行container runtime(比如docker或者rkt). kube ...
-
【Java基础】【20IO(字节流)】
20.01_IO流(IO流概述及其分类) 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操 ...
-
linux下安装python dlib依赖
dlib是主要用于机器学习的库,封装了机器学习算法,可以非常方便的实现比如人脸识别,车辆识别,物体检测以其他很多功能,dlib默认使用C++进行开发,另外图像识别有一部分支持python接口开发,上手 ...
-
算法之DP
一般DP 都是有模板的,先初始化,然后找到不同状态下数值的关系,使得某个状态可用另一个状态由一个固定的方式转移而来,列出状态转移方程,这就是DP: 例题 P1216 [USACO1.5]数字三角形 N ...