众所周知,javascript有全局作用域和函数局部作用域(没有c,c++,java等强类型语言中的块作用域)。那下面一段代码的结果是什么呢?

var scope = "global";
function f(){
  alter(scope);
  
  alter(scope);
}
f();

这段代码的执行结果为:

undefined
local

输出local很容易理解,应用局部作用域的变量覆盖了全局作用域。但是输出undefined就有点奇怪了?

这是由于函数作用域的特性导致的,局部变量在整个函数体中始终有定义,也就是说,在整个函数体中局部变量遮挡了全局变量,但是只有程序执行到var语句时局部变量才会被赋值。因此,上述过程等价于将函数内的变量的声明“提前”到函数体顶部,而变量的初始化仍然保留在原来位置,也就做“声明提前”。因为php也只有全局作用域和函数局部作用域,因此php的表现和javascript是一致的。

敏捷软件开发又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方 法,是一种应对快速变化的需求的一种软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也 更注重软件开发中人的作用。

下面分别分析敏捷开发与传统的瀑布开发方式的不同。

1.瀑布式开发流程:

传统的瀑布式开发流程

瀑布式开发流程特征如下:

1.基于阶段(文档)
前一个阶段的输出就是下一个阶段的输入,文档是个阶段衔接的唯一信息。管理人员喜欢瀑布模型的原因是把文档理解为开发的速度,可以方便地界定不同阶段的里程碑,由此量化团队工作效率。
2.基于一次性需求和前期设计
没有迭代与反馈。瀑布模型对反馈没有涉及,所以对变化的客户需求非常不容易适应。瀑布就意味着没有回头路。 

近几年各大公司开始刮起了敏捷风。敏捷软件开发是一个开发软件的管理新模式,用来替代以文件驱动开发的瀑布开发模式。 敏捷开发宣言:

个体的交互    高于   流程与工具
工作的软件    高于   详尽的文档
客户的合作    高于   合同谈判
响应变化      高于   遵循计划

敏捷开发要素:

三个角色:Scrum master(SM),Product Owner(PM),Team(RD,QA,FE)
四个仪式:迭代计划会,每日站立会,Show Case,迭代回顾会
三个工作:产品backlog,迭代backlog,燃尽图

从一张图基本可以理解scrum流程。

scrum示意图