【转载】代码重构与灵活交付

软件重构方法的研究(吉林大学博士学位论文) 吉林大学博士学位论文 关键词:软件重构方法;软件维护;程序转换;行为保留;程序结构改善;基本重 构方法;复合重构方法;Java语言接口;面向方面范型;横切关注点;方面挖掘; 静态模型;动态模型;逆向软件工程;对象状态模型. 立即下载

百度技术沙龙第56期回顾:代码重构与灵活交付(含资料下载)

作者 黄丹 发布于 2014年11月18日 | 讨论

http://www.infoq.com/cn/news/2014/11/baidu-salon56-summary

2014年11月15日,由@百度主办、@InfoQ负责策划组织和实施的第56期百度技术沙龙活动上,来自的百度资深敏捷技术教练马波、冯上以及资深敏捷教练蔡晓鸥,敏捷教练、软件开发顾问申健这四位老师给大家分享了代码重构以及灵活快速交付的故事。其中,马波和冯上以对口相声的方式参与本次分享,看点十足。本文将对“ 网页搜索核心模块架构重构”、 “ 商业变现创业产品快速交付的故事”、“银行中的跨国研发团队如何快速交付”这三个主题分享做下简单的回顾,同时提供相关资料的下载。

主题一:网页搜索核心模块架构重构(下载讲稿)

重构的是什么?

首先来了解一下百度要重构的东西是什么。冯上和马波提到:它简称C模块,是百度搜索引擎诞生以来核心的模块。前前后后有九年的历史,每年几乎有两百名工程师在上面修修补补。是各种服务搜索的结果汇集点,它跟所有的模块几乎都有交互。所以也导致它的逻辑非常复杂。

它还有一个比较显著的特点,就是开发非常密集,最近一年半有206个人贡献过代码,它处在快速开发的模块,这种模块我们说要改变软件的代码结构有两种方法,一种方法是干脆扔掉重新写,另外一种方法是慢慢重构,这种模块在这种开发的密度下不可能说重新扔掉另起炉灶,因为它在不停的迭代。所以最终采取的是一个渐进的过程,即真正重构的过程。

重构的项目背景

大家知道重构是在不改变产品功能的前提下,改变它内部的设计。百度最近几年来也在逐渐的沿用工作人才,他们有很好的意识,这种部门和工程效率部进行头脑风暴,我们发现有很多情况,八次是有六次是代码逻辑错误,是因为写差了,这样把内部的质量问题曝露成外部的质量问题。

比如说这个模块是C++和C语言混的模块,内存、指针这样的问题,很多错误是因为代码,当然业务逻辑本身不复杂,但是在问题本质复杂程度之上,重构的目的就是把它的随意性降低到业务本身就可以了。

项目成果展示

冯上提到:“上图是我们前几个月做的东西,下面我们会逐渐根据分析交互这部分的重构,讲讲具体是怎么做的。我们只改了其中1/4到1/5的代码。还移除了很多无用的代码。指导思想就是小步快跑、演进式设计、SOLID原则。实现细节就是设计层面、编码层面、工具层面,我们在重构的时候也不知道它的理论模型是什么样的,看代码已经看不到它的运行模型,所以没有一个大的架构设计的过程,直接进到代码里面。比如说直接放到该放的类里面,这样慢慢的它的架构反而会清晰起来。”

在设计层面上,如何通过演进的过程使架构由混乱变成清晰。主要是做好词性分析,词性分析模块的交互,我们把这部分功能单独提出来做了一个单独的类。做两种通信平台进行通信,把原来的代码揉在一起,通信平台A一个类,通信平台B的用另一个类,原来的类干掉了。在这个过程当中,两个通信平台的行为非常像,等数据包回来以后,这部分代码和概念完全是重用的。

还有一部分,在看代码的过程中,你会发现规定非常复杂的函数在各个阶段都出现过。因为有同步查、异步查的,还有分阶段查的。通过不断的运用代码的方法,抽出单独的类,然后把他们放进去,经过这个过程之后,你会发现的很复杂的逻辑会变成一个很简单的东西。

在重构的过程中很依赖自动化的测试,如果没有自动化测试很容易出错误,一开始我们现有的测试是很慢的,大概跑一次到边缘和单测进行完需要三十分钟左右,对于我们整天想运行很多次重构根本是无法接受的。所以我们第一件事情不仅仅代码的重构,还要帮他们升级测试工具,怎么样用一些工具和方法提高单测运行时间。我们通过各种不同的手段大概提高到四分钟就可以跑完,这样我们可以快速获得反馈。

另外,还增加了质量监控,包括代码的复杂度和重复度,因为这个事情是要持续关注的,为了防止代码腐化的太快、太严重,以后也要关注。我们想让产品线的同学更多的用集成开发,尤其是做代码搬移,如果你不用这个是非常痛苦的。

主题二:商业变现创业产品快速交付的故事(下载讲稿)

蔡晓鸥首先介绍了凤巢的背景,随着4G时代的到来,视频广告在手机上播放是很常见的,百度也在尝试这种新的方式,在爱奇艺和百度视频上投放广告,依托的是凤巢的广告主,现在上线已经有三个月时间了,积累的广告主用户已经超过了十万,收入每天是三百万左右。据蔡晓鸥介绍这个项目挑战比较大,是跨团队项目,横跨三个事业部,内外部依赖是15个,还要串联一个子公司。这种创意产品在百度是非常少见的,初期开发的人数是2500人左右,时间比较紧,变更频繁。

首先分析一下研发模型,一共分三个子团队,第一个团队是业务端做的是给广告主用的系统,这个系统广告主会在上面制定一些广告的投放策略和性价。第二个是检索端,检索端是要匹配的用户,哪些用户是什么ID,这些ID跟大数据进行匹配,分析用户的行为,给他分配想看的广告。看看具体是怎么操作的。

如图,把检索当中的业务端要做的事情拆分成Story,一边是业务端,另一边是检索端。绿色代表以前端为主的开发,右边这个内部的依赖。找出Story以后,根据这些story,把内部和外部的依赖一起找出来,排出关键路径和整体的项目计划,制定合理测试方案。

之后,蔡晓鸥介绍了百度的研发工具链和CI的流水线,做集体的回归测试,部署测试环境。如果编译或者单测失败了,就在这个上面做了API测试,它会进入到下一个位置。剩下的就是在百度交付经理常规的工作,整体进度的推进。

主题三:银行中的跨国研发团队如何快速交付(下载讲稿)

区别于互联网企业,银行中的跨国研发团队快速交付又是什么样的?申健提到:

首先是要统一产品体验。大家知道,任何一家银行面临的市场都是不同的国家,每个国家有自己的法律法规、业务状况等,导致带来很大的维护性问题,并且不同团队之间要进行交叉协作就很困难。

当时我们的做法是引入灵活性,同时要兼顾能够按期的进行交付,之间做一个取舍。之后降低已有项目的维护成本,在软件开发阶段,你所投入的成本只是一部分,更大的成本在后面在维护阶段,但是我们往往做计划的时候有意或者是无意的忽略了这点。

主要是以下三个策略来完成整个快速交付的过程:

第一个策略是涌现式设计,涌现是大自然里普遍存在的一种现象,不要像传统一样预先的定义一些流程,而是不断的在当下的情况下,涌现出新的你可能想不到的情况和场景、做法,为了下一个迭代你能做的更好,你能够进化。

第二个是基于主干的开发,主干上面随时可以进行部署和交付,这是我们的方向和策略。从此没有项目的分支,只有个人临时的分支,我们将尽快的提交到主分支上。这是一个很重要的策略,需要进行沟通和配合。

第三个叫持续集成,首先有静态的语法检查,我们提取不同模块之间的代码,我们浅淡产品做的不是简单的手机界面,也是单页面的Web APP,你打开手机网页以后一次性几乎把所有的资源加载好了,不同的页码跳转是不会进行刷新的,这是我们在技术上进行的尝试。因为前段的需要压缩,进行一些代码的混淆,防止被认错代码。

最后,申健总结到:我们通过三大部分策略、架构和团队,我们最后达到效果是显而易见的。需要改的代码越少,交付速度越高。通过不断的重构和调整,每次加新的项目越多,收益越大,需要改的代码也越少。敏捷就是这样迭代不断添加的过程,为了保证新的改动不影响前面已经好的功能,你的单元测试持续集成一定要跟上。

圆桌讨论环节:

为了促进参会者与我们每期的嘉宾以及讲师近距离交流,深入探讨在演讲过程中的疑问,本次活动设置了圆桌讨论环节。在此环节中,在重构、交付、敏捷方法论、团队建设等方面的探讨比较多,四位老师分别对参会者提出的问题给出了详细的解答。

会后,一些参会者也通过微信分享了他们的参会感受:

@雷魁:敏捷方法简单,如何让团队真正敏捷起来才是最关键的。

@建生:重构就是尽量解耦,产品的快捷交付就需要回归小团队,模糊各模块团队的职责,重在沟通。

@灰太狼:任何一个团队都需要“打鸡血”的热情。尤其一种“正能量的鸡血”,能够提高工作效率,激发大家热情,团队全员工作目标明确,充实并且满足。

@倪建龙:刚刚查百度,的确有ember js 刚刚看屏幕代码,我以为是angularjs,感觉挺像的,学习应该是免费的,商用好像是要付费的。

有关百度技术沙龙的更多信息,可以通过新浪微博关注@百度技术沙龙,或者关注InfoQ官方微信:infoqchina,InfoQ上也总结了过往所有百度技术沙龙的演讲视频和资料等,感兴趣的读者可以直接浏览内容。

特别提示:第57期百度技术沙龙将在12月21日在车库咖啡举行 ,欢迎关注@InfoQ、@百度技术沙龙获取后续的活动信息。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

【 ArchSummit北京2014】解读“双11”背后淘宝、京东、一号店的技术支撑。年末的技术盛宴,CTO与架构师的大Party。11月30日前报名享受9折优惠, 了解详情。
redhawk:Low Power Analysis 1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容 阅读详情

相关推荐

避坑指南:MTK平台Widevine L1密钥安装全流程详解(含SP META工具使用与Log分析)

本文详细解析了MTK平台实现Widevine L1认证的全流程,涵盖密钥申请、格式转换、安全烧录等关键步骤,特别针对Trustonic TEE环境下的SP META工具使用与日志分析提供实用指南。帮助开发者规避常见错误,确保DRM密钥安全部署,满足高端内容保护需求。

weixin_27219587的博客 476

对软件重构的认识与重构原则

一、什么是重构重构就是在不改变软件的可观察行为的前提下,对代码进行修改,改进程序的内部结构。有两层含义:二、为什么要重构技术不断发展,程序会慢慢老化,老程序会存在以下问题:当一个软件产品出现了以上问题的,就需要重构该软件产品了。三、重构的好处四、重构的分类重构有多个层次,每一层的重构意义不同:具体的重构类别:...

代码充实生活的博客 2828

深入浅出横向联邦学习、纵向联邦学习、联邦迁移学习

深入浅出解析横向联邦学习(Horizontal Federated Learning)、纵向联邦学习(Vertical Federated Learning)和联邦迁移学习(Federated Transfer Learning)有多个机构(比如几家不同的银行,或者几家医院)都拥有一些数据,他们希望联合起来训练一个更强大的机器学习模型,但出于隐私保护或法规要求,他们不能直接把数据共享出来。联邦学习就是为了解决这个问题而提出的。它的核心思想是“数据不动模型动”,即数据保留在本地,参与方共同训练模型。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2466

软件设计与重构的六个原则

软件设计与重构的六个原则 再读《重构》和《架构整洁之道》 目录 开放封闭原则 --- OCP 依赖倒置原则 --- DIP 单一职责原则 --- SRP Liskov替换原则 --- LSP 接口隔离原则 -- ISP 迪米特法则(最小知识原则) -- LOD 一、开放封闭原则 --- OCP 软件中的基础结构(函数、类或模块)对于功能扩展是开放的,但是对于修改是封闭的。 可实施的具体行...

danxibaoxxx的博客 4308

网络可视化工具netron详细安装流程

netron安装目录1.netron 简介2.不同操作系统下的安装使用方式2.1 在线版本:只要有浏览器就可以2.2 不同操作系统安装使用3.netron支持的网络框架4.netron测试演示 1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构。如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构。 这时,就可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。 2.不同操作系统下的安装使用方式 2.1

江南研习社 12万+

WPS Office 2019 For Linux二次开发全流程:从源码下载到Demo运行

本文详细介绍了在Linux环境下进行WPS Office 2019 C++二次开发的全流程,涵盖从开发环境准备、源码获取、核心依赖(Qt与WPS)安装配置,到最终编译运行官方Demo的完整步骤。文章重点解析了环境搭建中的常见问题与解决方案,旨在帮助开发者快速上手WPS二次开发。

weixin_29001423的博客 390

一次性买断、交付源代码,别说你不心动

编者按:提到软件开发,相信业内人士都曾经有过被开发服务商“挟持”的经历,想要修改功能?加钱!想要二次开发,加钱!虽然已经买了软件,后续却还要源源不断地投入成本,不可谓是不难受。但恰恰就是在这样的大环境下,却仍然有诸如天翎等等的一些厂商愿意走一次性买断的模式,交付所有源代码,本文讲为您详细介绍低代码平台源代码交付的重要性,以及它能为企业带来什么样的便利。 低代码开发平台简述 什么是低代码? 低代码是一种快速设计和开发软件应用程序、并且手动编码极少的开发方法。简单来说,它一种用于应用程序开发..

DDM_saodiseng的博客 3057

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

重构与模式:改善代码三部曲中的第三部

转载自:http://blog.youkuaiyun.com/hguisu/article/details/7658644 一、改善代码的三部曲    《设计模式》-> 《重构》-> 《重构与模式》。也就是设计->重构->重构出新设计。    《设计模式》主要详细说明20几种模式,为我们带来了常见设计问题的经典解决方案,从而改变了整个面向对象开发的面貌。为设计而著。    《重

自由理想的足迹 1699

akamai3简单分析

akamai流程的简单分析

记录一些web逆向的过程 918

Mamba-YOLOv8深度解析:基于状态空间模型的下一代目标检测架构(含完整代码与实战部署)文末含资料链接!

通过本文的完整指南,您将掌握从理论创新到工程落地的全流程技术细节。立即动手实践,开启目标检测的新纪元!

FJN110的博客 519

重构的概念

  重构的定义   重构(名词):对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本.   重构(动词):使用一系列重构准则(手法),在不改变"软件之可察行为"前提下,调整其结构.   两种定义都强调是在不改变"软件的外部行为"前提下,不改变"软件之可察行为"就是说让修改不影响外部使用程序(程序员),在个外部来看,程序的行为和结果没有任...

baodi7426的博客 476

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 650

代码重构简介

一.重构原则 1.重构的定义 重构(名词):对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本. 重构(动词):使用一系列重构准则(手法),在不改变"软件之可察行为"前提下,调整其结构. 两种定义都强调是在不改变"软件的外部行为"前提下,不改变"软件之可察行为"就是说让修改不影响外部使用程序(程序员),在个外部来看,程序的行为和结果没有任何...

weixin_30725467的博客 72

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[转]代码重构简介

一.重构原则 1.重构的定义 重构(名词):对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本. 重构(动词):使用一系列重构准则(手法),在不改变"软件之可察行为"前提下,调整其结构. 两种定义都强调是在不改变"软件的外部行为"前提下,不改变"软件之可察行为"就是说让修改不影响外部使用程序(程序员),在个外部来看,程序的行为和结果没有任何的变...

weixin_30319097的博客 78

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ITIL 4 持续交付流水线:一种典型的IT服务价值流实践

摘要:持续交付流水线是实现ITIL4价值流理念的工程化载体,通过自动化工具链连接开发、测试、部署等环节,打通传统交付断点。华为云DevOps流水线典型体现了价值流从需求到交付的全过程协同,其各阶段(编码、构建、测试、部署)与ITIL4价值链活动精准映射。流水线设计需兼顾灵活配置与质量控制,采用"自动优先,人工兜底"机制,并与度量体系深度绑定。落地建议强调以服务价值为导向,分阶段推进流程优化和工具整合,实现技术实践与管理效能的双提升。(150字)

m0_65087773的博客 955

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

三相PWM整流器双闭环Simulink仿真与SVPWM调制详解

三相PWM整流器作为电力电子领域的关键技术,能够实现输入电流正弦化与单位功率因数运行,广泛应用于变频调速、新能源并网和UPS等场景。双闭环控制策略通过电压外环和电流内环的分工协作,兼顾稳态精度与动态响应,而SVPWM调制技术则显著提升直流电压利用率并降低电流谐波。基于Matlab/Simulink平台,可以系统搭建整流器的仿真模型,完成坐标变换、PI控制器设计和SVPWM算法实现。本文从数学模型出发,结合实际工程实践,详细阐述双闭环控制结构、SVPWM调制原理以及PI参数整定方法,并针对仿真中的常见问题给出

weixin_34176694的博客 356

周级交付变分钟级?Aloudata CAN 指标平台营销活动分析实战

Aloudata CAN 指标平台基于 NoETL 语义编织技术,通过虚拟业务事实网络、配置化定义和智能物化加速三大核心重构,实现指标“定义即开发”。

Aloudata的博客 424

《重构_改善既有代码的设计》读书笔记

重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。 一、重构的好处1.能改进软件设计使软件更容易被理解。2.能帮你找到bug。3.提高软件的开发速度。 二、什么时候进行重构 三次法则:事不过三,三则重构.意思是说,一件事情,第一次只管去做,第二次做类似的事情会产生反感,...

weixin_30339457的博客 75

软件工程之美学习笔记二十七 26 | 持续交付:如何做到随时发布新版本到生产环境?

《软件工作之美》材料地址:https://time.geekbang.org/column/article/92587 集成、部署和交付的发展史 集成的原始阶段 从手动集成到自动化的持续集成 《重构》的作者 Martin Fowler 说过:“如果一件事很痛苦,那么就更频繁的做(if it hurts, do it more often. )” 部署和交付的发展史 部署指的是将代码发布到各...

alva_xu的博客 777

编写高质量代码改善C#程序的157个建议——建议154:不要过度设计,在敏捷中体会重构的乐趣...

建议154:不要过度设计,在敏捷中体会重构的乐趣 有时候,我们不得不随时更改软件的设计: 如果项目是针对某个大型机构的,不同级别的软件使用者,会提出不同的需求,或者随着关键岗位人员的更替,需求也会随个人意志有所变更。 如果竞争对手增加了新需求,我们也不得不为正在研发的新产品调整设计方案。 刚开始的架构太糟糕了,这可能源于设计经验的不足或者架构师的不负责任。 以上分别从外部和内部描...

weixin_30483495的博客 213

高效重构之模块化 [转载]

说起模块化,也许我们首先想到的是编程中的模块设计,以功能块为单位进行程序设计,最后通过模块的选择和组合构成最终产品。把这种思想运用到页面构建中,也已经不是什么新鲜事。相信很大一部分页面构建工程师都经历了这样几个阶段:第一阶段是在一个css文件中把多个页面按自己的习惯顺序从上往下编写样式,基本不考虑有无公用样式,以完成设计呈现为首要目的;第二阶段是提取不同页面中的通用样式,如公用颜色、图标、按钮等,

xiaoaifei2010的专栏 288
上一篇: [转载]vmlinux,vmlinuz,uImage,zImage,bzImage之间的异同
下一篇: [转载]基于ARM的linux内核裁剪与移植
tmcrazy
博客等级 码龄18年 21粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值