前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >互联网开发模式二:敏捷与重构

互联网开发模式二:敏捷与重构

作者头像
韩伟
发布2018-03-05 16:02:53
1.3K0
发布2018-03-05 16:02:53
举报
文章被收录于专栏:韩伟的专栏韩伟的专栏

敏捷开发的意义和实践

敏捷开发是我们现在最常见的一个“开发模式”,然而很多时候,我们看到“敏捷”两个字,似乎就是让程序员多加点班,或者忽略一些过程加快把代码弄出来,而真正理解“敏捷”含义的并不多。实际上,敏捷并不会加快单位代码的开发速度!敏捷最主要的目标,是应对需求不明确和需求变更,而这两者正式互联网服务中最常见的情况。

需求变更的原因

在互联网服务中,由于没有直接的“客户”下单要求,所以很多需求,都是由公司内部的人“代表”的,最典型的就是我们的“老板”们了。正式因为没有明确的“下订单”的过程,所以很多传统的需求分析变得没法做了,因为不管是老板还是产品经理,都是面对着成千上万的客户去猜测他们的需求,如果他们自己能代表客户还好,如果猜错了,项目的代码肯定要修改。

很多互联网公司都非常重视“数据”,原因就是这些“数据”往往代表了用户对产品的看法,而这些看法成了互联网产品设计的唯一客观标准。然而这些数据本身,会包含了大量复杂性,由于统计方式、产品形态、季节时间等等,都会产生偏差。我们的项目需求,往往就是在这些偏差中确定。这就难免产生需求的变更了。

互联网的客户个体多,服务内容丰富,功能变化快,是互联网项目中需求变更很多的主要原因。因此这也让敏捷开发,成为互联网项目开发中最重要的方法。————敏捷强调的是用原型来验证需求,在互联网服务里就是,尽快推出服务,通过数据来验证想法。如果我们能越频繁的修正原型,就能越快的接近真正的需求,也就是说,如果我们的互联网服务能越快的修正各种问题,同时越快的推出新的版本,就能让用户越牢固的“黏在”这个服务上。

架构设计实体化:单元测试

敏捷开发讲究要快速的修改代码,我们往往会发现,代码修改的越频繁,BUG越多,这似乎是一个无法解决的矛盾。然而,在敏捷开发方法论中,有一个用来防止这种修改造成的BUG增加的重要措施,就是——单元测试

单元测试本质上,充当着自动的QA人员的角色,如果我们把所有的设计和需求,都先按单元测试的形式“固化”编写下来,那么我们在修改代码后,就能快速的、自动的、反复的去验证我们的代码有没有问题。如果这些测试足够全面和详细,那么我们是不会担心代码修改导致大量的BUG的,因为单元测试会自动帮我们支出问题所在。一旦我们知道了问题,修正起来反而变成是最简单的事情了。

假如一个项目的代码丢失了,但全面的单元测试都还在,那么要重建这个项目并不困难,因为所有的需求,都被蕴含在这些测试代码中,程序员们几乎不需要去重新啃文档,谈需求,他们只要把代码弄成能通过单元测试就好了。

这种需求的“代表物”不但是程序员开发的概念和目标,而且还可以自动的帮程序员去验证他们的实现。所以,如果你要使用敏捷开发,要尝试频繁修改原型,就一定要使用TDD(测试驱动开发),特别是高度重视单元测试的作用。

统一软件设计思路的重要性

曾几何时,我们认为,使用什么语言开发,用结构化编程,还是面向对象编程……这些一般人难以深入理解的事情,都是程序员这伙顽固的家伙的怪癖,基本属于私人喜好的范畴。外人既不应该深入干预,也没办法去影响,因为如果你不识好歹去在这些事情上冒犯程序员,他们随时可能一言不合就辞职。既然我们只需要可以运行的代码,我们为什么冒风险去激怒程序员呢?

然而,在互联网服务的开发过程中,代码本身并不是某一个固定的、静态的东西,它需要不断的与时俱进,需要跟随这业务的发展而变化,同时也会从某一个程序员手里,流向整个开发团队。在这种情况下,软件开发习惯、代码的风格、程序的设计思路,就变成一个非常重要的事情了。

代码交流:面向对象

确实现在还存在大量的讨论,说“面向对象不是万能的”。说得对,但是,世界上有什么东西是万能的呢?我只能说,在需求变更非常快的情况下,面向对象思想,是现在我们能选择的最好工具了。

在“数据结构+算法=程序”的时代,软件主要是以计算任务为主,电脑是为了代替人脑进行超乎想像的运算任务而存在。而在互联网时代,软件主要的任务已经变成了处理这个真实世界的信息了。信息的存储、交换的任务,已经远远超过了“计算”的任务数量。

虽然我们知道,所谓的信息处理,最底层还是依赖大量的“计算”,然而,我们的程序员们,早已不再需要编写大量“计算”的代码,我们面临的挑战,是如何用代码准确而快速的表达这个世界。

面向对象思想包括分析、设计、编码三个部分(OOA/OOD/OOP)。这些思想看起来繁文缛节,似乎非常啰嗦。然而,其核心思想却非常简单:从表达过程,转向表达对象。人类的思维中,对象、或物体,是一个个具备自己的信息特征的个体,而行为和过程,往往是依附于这些个体的。比如鸟会飞、账号会锁定、汽车会死火等等。

所以如果我们的代码,是以表达对象,把信息和行为统一起来,是最接近于我们的认识规律的。

在互联网开发领域,由于网络无处不在,涉及到的领域异常广泛,如果我们没有一个能把代码世界和现实世界联系的纽带,我们的项目将非常难以理解。——难以理解的项目,就难以变化,从而就失去了互联网最显著的特征。所以我认为,面向对象的思想,是每一个互联网开发人员都应该理解的,并且应该是面对大部分业务时,首先考虑选择的。

代码架构与重构

我见过无数的代码架构图,里面画满了进程和服务器的拓扑,各种线条上标注了通讯协议,编码格式,还有各种流程图和协作图,然而,这些架构设计,无一例外的对于需求变更毫无帮助。因为它们描述的是一种现状,甚至连现状都不是,只是一种关于现状的猜测。随着项目代码的不断变化,代码数量和关系都会膨胀,这种进程、通讯级别的结构,除了越来越复杂以外,根本对于指导项目如何应对各种“代码腐化”毫无用处。

因此我们想到了流行的“重构”,然而,如果我们只是重构进程的关系,通信的层次,那些错综复杂的代码调用关系一样存在。各种回调、事件、耦合还是让代码无法理解。我们只是在试图把混乱塞到一些瓶子里面,并没有解决混乱本身。

所以,我们需要的另外一个思想武器:代码结构。只有我们从另外一个角度,另外一个视图去观察代码,才能把握代码之间耦合的情况。正如建筑里的平面图和立面图,都是不可或缺的。

所以我们应该高度重视“代码架构”,也就是描述代码之间的关系的架构,而不是进程之间的关系的架构。在关注代码互相调用、耦合的关系上,我们能把混乱复杂的代码关系理清,整理出一个便于理解,便于修改的代码外观。

这些工作看起来完全是针对开发人员的,但是实际上,这些工作是能提高整个开发效率的。它能让代码从难以修改,变得容易修改,从而得以支持快速的业务需求变化,这是对业务、对产品最重要的支持能力。

明天将推送新这个系列最后一篇《持续集成与DevOps》,感谢关注。

感谢大家的阅读,如觉得此文对你有那么一丁点的作用,麻烦动动手指转发或分享至朋友圈。如有不同意见,欢迎后台留言探讨。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 韩大 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 敏捷开发的意义和实践
    • 需求变更的原因
      • 架构设计实体化:单元测试
      • 统一软件设计思路的重要性
      • 曾几何时,我们认为,使用什么语言开发,用结构化编程,还是面向对象编程……这些一般人难以深入理解的事情,都是程序员这伙顽固的家伙的怪癖,基本属于私人喜好的范畴。外人既不应该深入干预,也没办法去影响,因为如果你不识好歹去在这些事情上冒犯程序员,他们随时可能一言不合就辞职。既然我们只需要可以运行的代码,我们为什么冒风险去激怒程序员呢?
      • 然而,在互联网服务的开发过程中,代码本身并不是某一个固定的、静态的东西,它需要不断的与时俱进,需要跟随这业务的发展而变化,同时也会从某一个程序员手里,流向整个开发团队。在这种情况下,软件开发习惯、代码的风格、程序的设计思路,就变成一个非常重要的事情了。
        • 代码交流:面向对象
          • 代码架构与重构
            • 我见过无数的代码架构图,里面画满了进程和服务器的拓扑,各种线条上标注了通讯协议,编码格式,还有各种流程图和协作图,然而,这些架构设计,无一例外的对于需求变更毫无帮助。因为它们描述的是一种现状,甚至连现状都不是,只是一种关于现状的猜测。随着项目代码的不断变化,代码数量和关系都会膨胀,这种进程、通讯级别的结构,除了越来越复杂以外,根本对于指导项目如何应对各种“代码腐化”毫无用处。
              • 因此我们想到了流行的“重构”,然而,如果我们只是重构进程的关系,通信的层次,那些错综复杂的代码调用关系一样存在。各种回调、事件、耦合还是让代码无法理解。我们只是在试图把混乱塞到一些瓶子里面,并没有解决混乱本身。
                • 所以,我们需要的另外一个思想武器:代码结构。只有我们从另外一个角度,另外一个视图去观察代码,才能把握代码之间耦合的情况。正如建筑里的平面图和立面图,都是不可或缺的。
                  • 所以我们应该高度重视“代码架构”,也就是描述代码之间的关系的架构,而不是进程之间的关系的架构。在关注代码互相调用、耦合的关系上,我们能把混乱复杂的代码关系理清,整理出一个便于理解,便于修改的代码外观。
                    • 这些工作看起来完全是针对开发人员的,但是实际上,这些工作是能提高整个开发效率的。它能让代码从难以修改,变得容易修改,从而得以支持快速的业务需求变化,这是对业务、对产品最重要的支持能力。
                    相关产品与服务
                    项目管理
                    CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档