精华内容
下载资源
问答
  • 迭代器模式

    2018-06-10 12:03:40
    很多人认为今天看迭代器模式使用价值远不如学习价值了,Martin Flower 甚至在在自己的网页上提出撤销此模式。当然这种说法也不无道理,因为现在像高级语言如C# 、java 等已经把这个模式做在语言中了。但是这个模式就...

    很多人认为今天看迭代器模式使用价值远不如学习价值了,Martin Flower 甚至在在自己的网页上提出撤销此模式。当然这种说法也不无道理,因为现在像高级语言如C# 、java 等已经把这个模式做在语言中了。但是这个模式就真的如网上所言没有实用价值了吗?我并不认为是这样的。

        本文将介绍这种模式与其它模式搭配使用 适配器-迭代器模式。至于有没有用评判在你惊讶 希望于你有益~

    模式背景

        有两家餐厅A和B,餐厅A是一家早餐餐厅店,而餐厅B是一家午餐餐厅店。

        现在两个餐厅的大Boss决定将两家餐厅进行合并。在餐厅A中,菜单的逻辑实现是基于ArrayList的,而餐厅B的菜单逻辑实现则是基于数组的。如果去修改任何一家餐厅的菜单实现,都可能会引发一些不必要的修改,且这种修改可能还会导致不必要的Bug,所以A和B都不愿意去修改菜单的原始实现。

        现在的需求是,在不改变两家餐厅对菜单的实现上,再方便地对菜单进行遍历。

                                                                          -- 摘自《Head Frist设计模式》


    模式定义

    何谓迭代器模式?所谓迭代器模式就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。在实际的开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望在聚合对象的抽象接口层中充斥着各种不同的便利操作这个时候我们就需要这样一种东西,它应该具备如下三个功能:

          1、能够便利一个聚合对象。

          2、我们不需要了解聚合对象的内部结构。

          3、能够提供多种不同的遍历方式。

          这三个功能就是迭代器模式需要解决的问题。作为一个功能强大的模式,迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象这样做就简化了聚合的接口和实现,也可以让聚合更专注在它所应该专注的事情上,这样做就更加符合单一责任原则


    科普

        聚合对象:

    聚合(Cohesion)是一个模块内部各成分之间相关联程度的度量。

    这里有多个含义值得考虑。首先,聚合是对一个模块内部的度量,这也是许多情况下我们把聚合称之为内聚的原因。第二,这里出现的模块是广义的模块,它可能是子系统,可能是功能模块,也可能是功能模块中的某一个类。从不同的层次看,聚合的程度也会有所不同。至于为什么不同,后面会有解释。第三,模块的成分包括模块的行为和状态。要做到高聚合,那么模块内部的行为必须要与模块的内部状态紧密关联。通俗来讲,一个模块仅完成一个独立的功能,模块内部不存在与该功能无关的操作或状态。

    举一个生活中的例子。

    有两座城市Sidtown和Fredborough,连接两座城市的公路一天到晚总是拥堵不堪。经过"有关部门"调查之后发现,这两座城市中有两家公司Better Mousetrap和 Zokko Soda,Better Mousetrap的工厂建造在Sidtown,而该工厂的员工都居住在Fredborough,所以每天早上大批员工从Fredborough出发前往Sidtown,并在傍晚返回;类似的,Zokko Soda公司的运输车在每天的工作时间都需要在制瓶工厂和灌装工厂穿梭来往。


    很明显,如果Better Mousetrap的工厂和员工居住地都在同一城市,而Zokko Soda的两座工厂都建造在另一座城市,那么城市之间的交通状况将会明显改善。


    对比两图,上面两座城市间之所以出现交通的问题,是因为每座城市的"聚合性"都比较低:不相关的两个公司出现在了同一座城市,使得城市内部交通的利用率比较低,而城市之间的交通出现了超负荷。

    模式结构


    模式实现

    公共接口

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    public interface Menu {  
        public Iterator<MenuItem> createIterator();  
    }  

    迭代器的创建

    在上面的类图中我们可以找到BreakfastMenu和LunchMenu两个菜单类,它们都是实现了Menu接口的。可是,因为它们包含了不同的容器对象(BreakfastMenu包含了ArrayList,LunchMenu包含了数组),所以在创建迭代器的时候就会有所不同。

    BreakfastMenu创建迭代器

        

    package com.nchu.iterator;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class BreakfastMenu implements Menu {
    
    	private List<MenuItem> menuItems = new ArrayList<>();
    	
    	public void addMenuItem(MenuItem menuItem){
    		menuItems.add(menuItem);
    	}
    	
    	public void remove(MenuItem menuItem){
    		menuItems.remove(menuItem);
    	}
    	
    	public Iterator<MenuItem> createIterator() {  
            return menuItems.iterator();  
        }  
    }
    

    因为ArrayList自身就包含了迭代器的实现,所以这里就可以直接返回ArrayList的迭代器。

    LuchMenu创建迭代器

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    public class LuchMenu implements Menu {
    
    	private MenuItem[] menuItems = new MenuItem[30];
    	private int position = 0;
    	
    	public void addMenuItem(MenuItem menuItem){
    		menuItems[position++] = menuItem;
    	}
    	
    	public void remove(MenuItem menuItem){
    		int i = 0;
    		while(menuItems[i] != menuItem) ++i;
    	}
    	
    	public Iterator<MenuItem> createIterator() {  
                    return  new LunchIterator(menuItems, position);  
        }  
    }
    

    数组没有迭代器的实现部分,所以与上面的创建方式会有所不同,此时正是迭代器模式大显身手的时候。

    自定义迭代器

    由于数组本身不具备迭代的功能,所以我们就需要对其进行扩展。可是,如果想要“迭代”数组,其根本实现还是要依赖于数组的循环遍历。因为数组只有这一种方式可以依次提取元素。在迭代器中有两个核心方法:hasNext()和next()。所以,我们就利用这两个方法变相实现对数组的迭代。

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    
    
    public class LunchIterator implements Iterator<MenuItem>{
    
    	private MenuItem[] menuItems = null;  
        private int position = 0;
        private int index;
        
    	public LunchIterator(MenuItem[] menuItems, int index) {
    		this.menuItems = menuItems;
    		this.index = index;
    	}
    
    	@Override
    	public boolean hasNext() {
    		if(menuItems == null)
    			return false;
    		return position < this.index;
    	}
    
    	@Override
    	public MenuItem next() {
    		MenuItem munuItem = menuItems[position++];
    		return munuItem;
    	}
    
    	@Override
    	public void remove() {
    	}
    }
    


    迭代器组合

    这里说的迭代组合是针对迭代器之外,客户端的实现逻辑。假定我们有一个女服务员,她可以打印出客户所需要的菜单,而不用关心此菜单的实现方式。

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    public class Waitress {  
      
        private Iterator<MenuItem> iterator = null;  
        private Menu menu = null;  
          
        public Waitress(Menu menu) {  
            this.menu = menu;  
        }  
          
        public void printMenu() {  
            System.out.println("\n菜单:");  
            iterator = menu.createIterator();  
            while(iterator.hasNext()) {  
                System.out.println(iterator.next());  
            }  
        }  
    } 


    菜品类

    package com.nchu.iterator;
    
    public class MenuItem {
    
    	private String foodName;
    	
    	public MenuItem(String foodName) {
    		this.foodName = foodName;
    	}
    
    	@Override
    	public String toString() {
    		return this.foodName;
    	}
    	
    	
    }
    

    测试类

    package com.nchu.iterator;
    
    public class Client {
    
    	public static void main(String[] args) {
    		BreakfastMenu bm = new BreakfastMenu();
    		bm.addMenuItem(new MenuItem("a"));
    		bm.addMenuItem(new MenuItem("b"));
    		bm.addMenuItem(new MenuItem("c"));
    		
    		LuchMenu lm = new LuchMenu();
    		lm.addMenuItem(new MenuItem("d"));
    		lm.addMenuItem(new MenuItem("e"));
    		lm.addMenuItem(new MenuItem("f"));
    		
    //		Waitress wa = new Waitress(bm);
    		Waitress wa = new Waitress(lm);
    		
    		wa.printMenu();
    	}
    }
    

    使用场景

        1、访问一个聚合对象的内容而无须暴露它的内部表示。

          2、需要为聚合对象提供多种遍历方式。

          3、为遍历不同的聚合结构提供一个统一的接口


    模式优缺点

        优点
            1、它支持以不同的方式遍历一个聚合对象。

           2、迭代器简化了聚合类。

           3、在同一个聚合上可以有多个遍历。

           4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

            

        缺点

            由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。


    模式总结

            迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部数据。

        
    展开全文
  • 8.21: Hackday、慈善x快速迭代

    千次阅读 2015-08-24 22:33:44
    8.21: Hackday、慈善x快速迭代 过去总想着写点小日志什么的来记录一下日常的生活,难得有了点想法 + 实力终于可以做这件事了。当然,这不会是流水账,每天都会有个主题,直到20天以后。 于是,第天以Hackday...

    8.21: Hackday、慈善x快速迭代

    过去总想着写点小日志什么的来记录一下日常的生活,难得有了点想法 + 实力终于可以做这件事了。当然,这不会是流水账,每一天都会有一个主题,直到20天以后。

    于是,第一天以Hackday开始,因为很多idea就是这样变成一个产品的。

    HackDay

    Hackday是一个有意思的话题,毕竟人生苦短。身为一个程序员,我们总想创造一些有意思的东西。Hackday似乎就是这样的一个场景,然而多数的时候,我们还需要围绕着举办方的主题来构建Idea。

    过去参加过了那么几次的Hackday,而这次不一样的原因是主题离开了业务,以慈善为中心。

    慈善

    慈善在中国已然是惨淡的。。。,,至少在我看来目前这个词是贬大于褒。不过,这类东西主要是因为缺少透明度。

    我们的idea与之有一点点的小关系(说大话了)。实际上是再平常不过的O2O捐赠了,只是接口变成了微信,接口还是网页

    接着就来到了我们的主题——快速迭代。

    快速迭代

    我们只有两天不到的时间去实现我们的Idea。

    当时我们考虑到的现实是,对于多数人来说,掌握QQ和微信的速度比APP和网页快、而且普及度高,因此我们选择了微信来当作我们的入口。

    第一次Inception

    于是在前一天上午,我们五个人开始站会(不想会太长的小伙伴们,就站着开会吧)。

    说说我们的idea,首先我们需要有下面的微信界面

    wechat

    包含四个菜单:

    1. 我要捐。想要捐赠的人可以由此进,拍照并填写相应的捐赠信息。
    2. 我需要。那些需要捐赠的人可以在此填写相应的信息。
    3. 已捐赠。那些捐赠的人可以看到相应的信息,并可以分享到朋友圈blabla,然后还可以点赞。
    4. 谁需要。想捐赠的人可以在这里查看需要捐赠的人。

    而这个也需要有一个后台,考虑到因为需要后台,直接选用Django了。因为之前做过类型的东西,同时考虑到后期的数据量,以及学习成本。系统就会成了两部分:

    1. donate。这部分主要是网页代码,Django + Haystack + ElasticSearch来实现表单及展示。
    2. donate-wechat。 这部分代码主要是微信,实际上只是一些链接。

    接着,我们就划分了任务:

    1. Django 图片上传
    2. 尝试在前台用ElastiSearch进行搜索
    3. 微信公众平台

    由于我们是五个人,采用pair机制。作为一个有女朋友就Solo了,问题是剩下的两个单身汉子主动地pair了,于是两个妹子在pair,唉。。。

    快中午的时候,图片上传有结果了,微信公众平台在开始的十几分钟内有结果了,然后在下午开始的时候我们开始了第二次Inception。

    第二次迭代

    因为已经可以用Django上传图片了,所以剩下的就是修改表单和UI修改了。

    接着,开始Setup本地的开发环境了,因为之前我的本地环境和服务器环境都是已经Ready的状态。所以是我的挖的大坑,所以我只好默默地填好所有的坑:

    1. Django安装
    2. ElastiSearch安装
    3. Django Geo安装
    4. Python PIL

    由于,最后坑在Google Map对于地址的解析,所以只好先把这部分的功能去掉了,即Django Geo。好在痛苦了大概一小时之后 ,就不再痛了。随后花了大概十几分钟,快速讲了个Django、Haystack的Session。

    我们开始第二次划分任务:

    1. 我继续修改Form
    2. 添加”我需要”
    3. 尝试搜索功能

    在第一天结束的时候,勉强可以工作,然而我们并没有意识到微信是有问题的。。

    第二次站会

    在第二天的站会中,我们发现了微信的问题,即修改公众号菜单需要24小时才能生效。而在前一台,我们的几个链接都指向的是某中文搜索网站。

    同时,我们发现后台的审核需要加强。

    于是,我们开始了第三次划分任务:

    1. 因为有微信经验,所以我来负责这个
    2. 修改UI
    3. 修改索引

    所幸,微信的功能在半个小时内就完成了。便加入了后台管理功能,实际上只是两个Boolean,有万能的Django:

    admin.site.register
    

    后台都是小问题。

    第四次迭代

    于是,我们很快来到了第四次迭代。在下午的时候,基本上已经做完了。但是我们又重新分配了一下任务:

    1. 我开始了我最想做的海报
    2. 继续修改UI
    3. 准备PPT和ShowCase

    最后,还是拿了个三等奖~~。

    快速迭代的思考

    在进行的过程中,我一直在思考这个问题,因为我意味到了我们在快速的迭代。在不断地反馈问题中,我们丢掉了一些方案,才能更快地向目标移动。

    如果,我们在过程中被一些问题卡住,而没有试图用别的方式解决。如:

    1. 我们之前在尝试用ElasticSearch的前台搜索的时候,我们发现直接用后台更快。
    2. 我们在尝试创建成功创建”我要捐”页面的时候返回详细信息,一开始调用的是ES,后来发现我们可以用数据库解决——毕竟这时候是不需要索引的。

    那么,我们很容易影响到总体的进度。只有在不断获取反馈的时候,才能成长。

    而,这样的迭代,似乎在开放的团队中更容易看到?

    其他

    项目Github: icharity

    微信关注我: Phodal

    截图:

    Donate

    展开全文
  • 牛顿迭代

    千次阅读 2018-07-31 15:45:22
    牛顿迭代法 进入词条全站搜索帮助 声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。详情&amp;gt;&amp;gt; 首页 历史上的今天 百科冷知识 图解百科 ...

    牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
    中文名 牛顿迭代法 外文名 Newton’s method 别 称 牛顿-拉夫逊(拉弗森)方法 提出时间 17世纪
    目录
    1 产生背景
    2 牛顿迭代公式
    3 示例
    ▪ 欧几里德算法
    ▪ 斐波那契数列
    4 C语言代码
    5 C++代码
    6 matlab代码
    ▪ 定义函数
    ▪ 主程序
    7 Python代码
    8 Fortran代码
    产生背景编辑
    牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。
    牛顿迭代公式编辑
    设r是 的根,选取 作为r的初始近似值,过点 做曲线 的切线L,L的方程为 ,求出L与x轴交点的横坐标 ,称x1为r的一次近似值。过点 做曲线 的切线,并求该切线与x轴交点的横坐标 ,称 为r的二次近似值。重复以上过程,得r的近似值序列,其中, 称为r的 次近似值,上式称为牛顿迭代公式。
    用牛顿迭代法解非线性方程,是把非线性方程 线性化的一种近似方法。把 在点 的某邻域内展开成泰勒级数 ,取其线性部分(即泰勒展开的前两项),并令其等于0,即 ,以此作为非线性方程 的近似方程,若 ,则其解为 , 这样,得到牛顿迭代法的一个迭代关系式: 。
    已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。 [1]
    迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
    利用迭代算法解决问题,需要做好以下三个方面的工作:
    一、确定迭代变量
    在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
    二、建立迭代关系式
    所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
    三、对迭代过程进行控制
    在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。
    示例编辑
    欧几里德算法
    最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
    定理:gcd(a,b) = gcd(b,a mod b)
    证明:a可以表示成a = kb + r,则r = a mod b。假设d是a,b的一个公约数,则有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公约数
    同理,假设d 是(b,a mod b)的公约数,则 b%d==0,r%d==0 ,但是a = kb +r ,因此d也是(a,b)的公约数。
    因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
    欧几里德算法就是根据这个原理来做的,欧几里德算法又叫辗转相除法,它是一个反复迭代执行,直到余数等于0停止的步骤,这实际上是一个循环结构。其算法用C语言描述为:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int Gcd_2(int a,int b)/欧几里德算法求a,b的最大公约数/
    {
    if (a<=0 || b<=0)/预防错误/
    return 0;
    int temp;
    while (b > 0)/b总是表示较小的那个数,若不是则交换a,b的值/
    {
    temp = a % b;/迭代关系式/
    a = b;
    b = temp;
    }
    return a;
    }
    从上面的程序我们可以看到a,b是迭代变量,迭代关系是temp = a % b;根据迭代关系我们可以由旧值推出新值,然后循环执a = b; b = temp;直到迭代过程结束(余数为0)。在这里a好比那个胆小鬼,总是从b手中接过位置,而b则是那个努力向前冲的先锋。
    斐波那契数列
    还有一个很典型的例子是斐波那契(Fibonacci)数列。斐波那契数列为:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1)+fib(n-2) (当n>2时)。
    在n>2时,fib(n)总可以由fib(n-1)和fib(n-2)得到,由旧值递推出新值,这是一个典型的迭代关系,所以我们可以考虑迭代算法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int Fib(int n) //斐波那契(Fibonacci)数列
    {
    if (n < 1)/预防错误/
    return 0;
    if (n == 1 || n == 2)/特殊值,无需迭代/
    return 1;
    int f1 = 1,f2 = 1,fn;/迭代变量/
    int i;
    for(i=3; i<=n; ++i)/用i的值来限制迭代的次数/
    {
    fn = f1 + f2; /迭代关系式/
    f1 = f2;//f1和f2迭代前进,其中f2在f1的前面
    f2 = fn;
    }
    return fn;
    }
    C语言代码编辑
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    double func(double x) //函数
    {
    return x*x*x*x-3*x*x*x+1.5*x*x-4.0;
    }
    double func1(double x) //导函数
    {
    return 4*x*x*x-9*x*x+3*x;
    }
    int Newton(double *x,double precision,int maxcyc) //maxcyc 迭代次数
    {
    double x1,x0;
    int k;
    x0=*x;
    for(k=0;k

    include

    include

    using namespace std;
    int main()
    {
    double diedai(double a,double b,double c,double d,double x);
    double a,b,c,d;
    double x=10000.0;
    cout<<”请依次输入方程四个系数:”;
    cin>>a>>b>>c>>d;
    x=diedai(a,b,c,d,x);
    cout<

    include

    include

    using namespace std;

    vectorv;//stl vector链型数组
    vector::iterator it;//vector迭代器

    int x0=5;

    double a,b,c,d;

    double abs(double y){ while(y<0) y=-y; return y;}

    double f(double x){ return a*x*x*x+b*x*x+c*x+d;}

    double fd(double x){ return 3*a*x*x+2*b*x+c;}

    bool u;//用来判断是否重复

    void newton(int a1,int b1,int c1,int d1)
    {
    for(x0=-5000;x0<=5000;x0++)//在一个大区域中逐个点用牛顿法,可找出大多数3次方程所有根
    {
    double x1=x0;
    while(abs(f(x1))>0.001)
    {
    double x=x1;
    x1=x-f(x)/fd(x);
    }
    for( it=v.begin();it!=v.end();it++)
    {
    if(abs((*it-x1))<0.01) {u=1; break;}
    }
    if(u!=1&&x1<1000000000)
    {
    cout<

    展开全文
  • 敏捷开发-快速迭代

    万次阅读 多人点赞 2013-05-04 16:31:27
    今天跟大家分享的是“敏捷开发、快速迭代”。我们大都采用的是“瀑布开发模式”,有了问题,就得返工,虽然最终的产品会比较齐全完善,但是开发周期太长,开发人员会产生排斥,甚至厌恶的心理。经过YH系统的开发,也...

    今天跟大家分享的是“敏捷开发、快速迭代”。我们大都采用的是“瀑布开发模式”,有了问题,就得返工,虽然最终的产品会比较齐全完善,但是开发周期太长,开发人员会产生排斥,甚至厌恶的心理。经过YH系统的开发,也且生体会到了这一弊端。

    有问题就要去解决它!于是我想到了“敏捷开发”。借鉴敏捷开发模式,来改善软件开发过程,提高项目的开发效率。

    要想借鉴,首先得弄懂以下3个问题。

    1. 什么是敏捷开发
    百度百科中是这样解释的:敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

    我们可以这样认为,敏捷开发是一种面临迅速变化的需求快速开发的能力。要明确几点:
    敏捷不仅仅是一个项目快速完成、而是对整个产品领域需求的高效管理;
    敏捷不仅仅是简单的快,而是短周期的不断改进、提高和调整;
    敏捷不仅仅是一个版本只做几个功能,而是突出重点、果断放弃当前的非重点;
    敏捷不仅仅是随时增加需求,而是每个迭代周期对需求的重新审核和排序。

    2.如何进行敏捷开发?
    敏捷开发的体系建设主要有如下六个方面:
    1、组织建设
          也就是团队建设,建立以产品经理为主导,包含产品、设计、前后台开发和测试的team,快速进行产品迭代开发;扁平化的团队管理,大家都有共同目标,更有成就感;

    2、敏捷制度
          要找准适合自身的敏捷开发方式,主要是制定一个完善的效率高的设计、开发、测试、上线流程,制定固定的迭代周期,让用户更有期待;

    3、需求收集
          这个任何方式下都需要有,需求一定要有交互稿,评审通过后,一定要确定功能需求列表、责任人、工作量、责任人等;

    4、工具建设
          是指能够快速完成某项事情的辅助工具,比如开发环境的一键安装,各种底层的日志、监控等平台,发布、打包工具等;

    5、系统架构
          略为超前架构设计:支持良好的扩容性和可维护性;组件化基础功能模块:代码耦合度低,模块间的依赖性小;插件化业务模块:降低营销活动与业务耦合度,自升级、自维护;客户端预埋逻辑;技术预研等等;

    6、数据运营与灰度发布
          点击率分析、用户路径分析、渠道选择、渠道升级控制等等。

    有幸拾得某位牛人的敏捷开发经验,再结合自己的理解,一起拿出来与大家分享一下:
    1 、 重点明确,及时调整。
          通过分析需求的紧急性和重要性,做出优先级的判定,优先级从1排到10,没有重复;
          迭代中严格按照优先级顺序开发,即使最后时间不够,也能保证最需要的功能开发完成;
          每次迭代前重新调整需求的重要性,及时加入重要的业务需求和用户需求,将重要性不高的需求往后调整。

    2、倾听用户的声音、相信用户的直觉。
          在迭代中充分关注线上版本用户的反馈,并且主动联系用户了解困扰,在当个迭代或下个迭代快速优化;通过对用户反馈的及时响应获得用户的认可和口碑。
          这里就提到一个名叫“AB test”的开发模式,一个问题有A、B两种解决方案,不知道哪个更符合用户的需求,那么就让用户去选择,根据用户的反馈去迅速调整。
          有兴趣的话,可以看看这个视频,是我在找资料时看到的,里面讲到了这个问题,即小米MIUI产品经理许斐演讲的“快速迭代的互联网开发模式 ”。

    3、勇于创新、小步快跑。
          在迭代中勇于创新,快速实现创新想法,并在后续的迭代中不断优化。
          一直远离媒体视线的腾讯CEO马化腾,在“合作伙伴大会一周年”的活动上,也给合作伙伴和同行们“小步快跑,快速迭代”的建议,被赋予“一直在模仿,从未被超越”称号的腾讯开发团队,其实创新也是国内最多的。

    4、持续不断地发现问题,解决问题。
          通过每天的版本发布来检验团队在每日立会上做出的承诺;
          测试和验证功能的开发程度;
          对于功能的实现第一时间给出反馈,并能快速调整,而不会像瀑布式等到开发末期才发现实现上的问题。

    5、持续提升整个团队的产品能力。
          专门的团队面向一个产品领域;
          持续优化用户体验和产品流程;
          通过产品迭代的心跳保持产品团队的用户和市场敏感度;
          提升产品经理的产品感觉、提高技术团队的产品意识;
          团队伴随业务而成长,获得更高的成就感。

    更多具体的实施和经验分享,可以参考“项目管理专栏”。

    说了这么多,归结起来就是,产品通过不断的获取用户新需求,不断的更新迭代而愈加成熟。而快速迭代,则能提升团队的市场竞争力,从而快速占领市场。
    看过一幅图片:快速迭代,越变越美。那么如何快速迭代呢?

    3.如何快速迭代
    其实这个问题已经在第二个问题中回答过了,这里再单拿出来说,是为了强调一下。
    现在是互联网的时代,互联网产品的更新速度可谓是日新月异。互联网的开发模式也是主要围绕“快速迭代”的主题来开发产品的 在飞速发展的互联网行业里,产品是以用户为导向在随时演进的。因此,在推出一个产品之后要迅速收集用户需求进行产品的迭代——在演进的过程中注入用户需求的基因,完成快速的升级换代,裂变成长,才能让你的用户体验保持在最高水平。不要闭门造车以图一步到位,否则你的研发速度永远也赶不上需求的变化。

    可能我们做的不是互联网的项目,但是如果是大项目,依旧推荐使用敏捷开发。分级需求,快速迭代产品。让用户能在短时间内用户用上你的产品,短时间内使用到新功能。

    采用“短周期迭代法”,可以压缩项目开发实施周期,减少项目风险,简化管理,提高各个环节达成率,有效推进项目建设。

    快速迭代,版本更新快,所以要考虑降低项目风险,确保正确的方向。

    敏捷开发能够缩短项目的反馈周期,因其将项目分成了若干个迭代周期,每个迭代周期结束都能立即反馈。且通过不断的沟通,还能减少理解上的偏差,配合反馈,减少误解,从而降低修正错误的代价。且每个迭代周期的结束都能接受验证,从而能快速的适应变化,及时的适应新的需求,保证产品的正确性。

    那么迭代周期设定为多少合适呢,“小步快跑、快速迭代”,当然系统大小也会影响到迭代周期,所以把迭代周期一般设置为1-6周为佳。

    曾经跟QQ安全管家的一个开发人员聊过天,得知QQ安全管家是一星期一个beta版本,一月一个正式版。小米的MIUI更新周期,每天都有更新给荣誉开发组,每周都更新ROM包,提供给用户下载。百度每天都会有上百次更新升级上线,网页搜索的结果页每一天都有几十个等待测试上线的升级项目。可见快速迭代是多么许多公司都推荐的一种开发模式。

    还有一点要注意,快速迭代,不是说一定要做好了,才能上线,半成品也能上线。

    在没有上线之前,你怎么知道哪好那不好。所以半成品也是可以出门的,一定不要吝惜在家,丑媳妇才需要尽早见公婆。尽早的让用户去评判你的想法,你的设计是否可以赢得用户的喜爱。快速发出,紧盯用户反馈。百度完成了第一版的搜索引擎,也是让用户去做的选择。用百度CEO李彦宏(Robin)的话来说“你怎么知道如何把这个产品设计成最好的呢?只有让用户尽快去用它。既然大家对这版产品有信心,在基本的产品功能上我们有竞争优势,就应该抓住时机尽快将产品推向市场,真正完善它的人将是用户。他们会告诉你喜欢哪里不喜欢哪里,知道了他们的想法,我们就迅速改,改了一百次之后,肯定就是一个非常好的产品了。”

    简单地分享了一下对敏捷开发,快速迭代的理解。这里再给大家一个连接,51CTO的《专题:初探敏捷开发》,供大家参阅。




    展开全文
  • python 迭代器和生成器

    2021-03-14 11:20:45
    实现迭代迭代器应用场景,迭代的意义什么是生成器(generator)生成器的意义yield关键字实现个生成器生成器方法实现:生成器是如何执行的 可迭代对象 可迭代对象 有__iter__属性 def my_range(stop): # ...
  • MVP产品迭代流程

    千次阅读 2019-06-11 21:38:20
    关注公众号【程序职场】,专注于 Spring Boot+微服务,小程序,...怎么让产品快速迭代? 怎么让客户尽快体验产品? 这些问题一直困扰着创业公司?创业公司人员,资源有限,为了更好的抓住时机,需要快速的做好个...
  • 迭代式mapreduce

    千次阅读 2012-05-15 15:06:36
    董的博客:《迭代式mapreduce框架介绍》网址:http://dongxicheng.org/mapreduce/iterative-mapreduce-intro/ 小e的分享:《迭代式MapReduce解决方案》:...
  • <br /> 简单的说,敏捷开发是种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把个大项目...
  • 案列: 软件要求,从网络抓取各个城市气温信息,并依次显示: ...我们期望以'用时访问'的策略,并且能把所有城市气温封装到个对象里,可用for语句进行进行迭代,如何解决? import requests from collec...
  • 欢迎使用Markdown编辑器写博客最近组里老师做研究需求一些站点的水文数据,刚好最近在学习python,知道python中有很多方便的库用于网页抓取和网页分析,于是就着手写了个。勉强可以用吧,哈哈。 实现上,简单...
  • 传统的MapReduce框架(见我的博文:传统MapReduce框架)把个作业的执行过程分为两个阶段:map和reduce,在map阶段,每个map task读取个block,并调用map()函数进行处理,然后将结果写到本地磁盘(注意,不是...
  • 教你撸网页聊天室

    千次阅读 2020-01-19 16:19:17
    最近在学校比较闲,终于有这么块时间可以自由支配了,所以内心还是十分的酸爽舒畅的。当然了,罪恶的事情也是有的,比如已经连续周没有吃早饭了,其实现在回头想想,真的不能怪我啊,因为最近的天气实在是太!冷...
  • Q1: ... 然后运行Controller,设置用户数为100?...但是我需要说明的是测并发数的时候,本身就是模拟的虚拟用户,所以我认为不一定非要参数化100个用户,用个用户跑100遍也是可以的。当然你这样进行设...
  • C语言之单链表反转(递归,迭代),排序 前言 这篇会是关于单链表最后篇的介绍,之前还介绍过的文章分别是: 单链表及各项操作介绍 单链表初始化 单链表打印(遍历),查询,定位,插入,删除...从上面的图片可以
  • 文章目录前言、背景二、名词解释三、设计目标3.1 实现功能3.2 性能指标Ⅰ.数据精确度Ⅱ.时间特性Ⅲ.适应性四、系统环境4.1 相关软件和硬件4.2 数据规模预估五、系统设计5.1 基础介绍5.2 系统架构图5.3 系统流程图...
  • [Python] 打开字符串使像 open(file, 'r') 一样可迭代需求SolutionCore Code如何使用测试原理你将学到什么早期版本的 `__item__` 实现可迭代现代版本 python `__iter__` 实现可迭代yield 版本的打开 string 可迭代...
  • 从5月25号我们开始了为期两个月的实习,我们需要做个大型大数据项目,个项目由三个学生+个企业的项目经理完成。请大家持续关注我的专栏,我会每天更新。 专栏:大数据案例实战——大三春招大数据开发 专栏:...
  • 经常听到不少人说句话:“tomcat性能差,不如去用weblogic,websphere,jboss”,我想说,用什么东西得根据实际情况来吧,如果给个小公司的外包开发个普通的项目,给她用Oracle,Weblogic?在高速公路上,...
  • Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

    千次阅读 多人点赞 2019-10-18 10:18:37
    Python爬虫4.2 — ajax[动态网页数据]用法教程综述AJAX 介绍什么是AJAX实例说明请求分析获取方式实例说明其他博文链接 综述 本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万...
  • 在http://write.blog.csdn.net/postedit/78212814中介绍了同态滤波算法,本片继续总结retinex算法,不过开始之前先介绍一下色彩恒...人类有种不因光源或者外界环境因素而改变对某一个特定物体色彩判断的心理倾向,
  •   2019-01-07 22:50:18   ...有哪个TMT领域的企业,在过去...有哪个对媒体话题哪怕保持最低限度关注的适龄工作者,没听说或思索过AI会取代自己的可能呢?   我们见惯了云里雾里的“AI科普”,那些过于高...
  • 原因是它的网页结构相当规整,比较适合爬虫新手练习。下面我将详细展示爬虫的整个过程。 爬虫过程 网页链接分析 爬虫起点网页为豆瓣电影 Top 250,整个250部电影一共分10页,每页对应的链接如下: ...
  • 编者按:近日国际电信组织3GPP在美国举行全体会议,批准并冻结了5G独立组网功能标准,加上去年12月完成的非独立组网标准,5G第阶段的标准化工作全部完成。5G商用就要开始冲刺并有望明年实现商用试点。5G离我们更近...
  • 上节中提到了一些有关递归查询的内容,但说的很少,也很笼统,本节将会从原理和实例两方面入手分析DNS的递归以及迭代查询。  在此之前,我们需要了解一些背景知识,以便于更好的理解今天的主题内容。  在互联网...
  • 通常form中定义了个list对象...那么,当你需要输出其中的某一个属性时需要按如下代码:  <bean:define id="aa" name="_ndbpscsfForm" property="scsf12count"></bean:define> property="sc
  • 卡尔曼滤波 -- 从推导到应用()

    万次阅读 多人点赞 2013-12-30 01:26:46
    部分,结合例子,从最小均方差的角度,直观地介绍卡尔曼滤波的原理,并给出较为详细的数学推导。 第二部分,通过两个例子给出卡尔曼滤波的实际应用。其中将详细介绍个匀加速模型,并直观的对比系统状态模型的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,632
精华内容 9,452
关键字:

如何看某一网页的迭代