写点什么

前搜狗搜索技术负责人郭昂指出:大多数重构可以避免

  • 2013-03-09
  • 本文字数:2189 字

    阅读完需:约 7 分钟

郭昂,前搜狗网页搜索效果负责人、前搜狗搜索广告算法负责人,现任职马可波罗采购搜索技术副总裁。他在自己的博客上写了一篇文章《漫谈重构》,提到重构要解决的问题,以及自己的感受。

郭昂在前后两家公司的工作中,主持和经历十余次重构,涉及代码和架构。在他看来,如果不做重构,任代码随意膨胀,就会产生糟糕的架构,其恶劣影响包括:

首先是开发效率的降低,在糟糕架构下加进新功能,会受之前代码的影响,可能存在意想不到的改动点和问题点,开发和调试时间都会大大增加;其次是故障率的提升,在质量低下的代码中,总是容易藏着很多不易发现的坑,这些都会成为故障的隐患;同时,架构也会使得需求的完成大打折扣,使得设计好的目标,因为架构限制或者性能等原因,只能完成 80% 甚至更低。

接下来,他列出了重构要解决的各种问题:

  • 结构糟糕:五千行以上的文件,三千行以上的函数,面对这样子的代码,对其进行修改和继续开发是件很艰难的事情。
  • 安全隐患:很多代码,为了快速完成功能,对很多潜在安全风险置之不管,如内存管理、异常处理、模块接口等,迟早有一天会爆发。
  • 性能问题:对于很多大型服务,性能高一点可以节省很多服务器费用。性能的核心问题大多在出代码上。
  • 功能扩展:有的模块,开始设计时只是实现一些很基本的功能,而随着产品功能不断增强,需要进行重构以让其能够实现新赋予的任务。
  • 协同开发:大系统需要多人一起开发,如果需要改同一个类甚至同一个函数,往往是冲突不断,而代码的整合往往也会存在更多问题。这时候需要很好的架构能够支持多人共同开发和修改。
  • 模块调试:大系统中有很多子模块互相关联,假如某个模块的调试需要启动整个大系统,或者会受到其他模块稳定性的影响,效率非常低。通过重构建立调试层,或者开发调试工具是更好的选择。
  • 模块复用:不同项目或模块重复开发相同功能子模块,在很多公司都很常见。将公共部分抽象出来,能够将这部分做得更好更精,从整体上,往往能大幅度提高开发效率和效果,往往也能优化算法性能。
  • 算法使用不当:使用不恰当的数据结构或者相关算法,会使得性能或效果出现问题。这种情况,甚至要将原有的体系结构推倒重来,重新设计算法和数据结构,达到尽可能好的匹配效果。
  • 承载规模不够:一些系统有其设计的容纳规模,例如瞬间访问量、同时在线人数,当超过一定量级时,很多时候并非简单通过加服务器能解决,有时需要重新设计架构。

接下来,他总结了自己重构经历的经验和感受,指出“第一道难关是如何过领导这道关”:

很多领导都要背着产品指标和任务,重构这种事情,在很多时候,有可能是“费力不讨好”的代名词,因为在大多情况,无法帮助领导完成指标。

他的建议是:

让重构与某些技术或产品指标挂钩,例如完成新产品、改进效果、提高性能等,相当于是重构伴随着其他改进搭帮上线,那么这种情况可以比较顺利的完成重构。

……

而如果单纯为了架构的合理性而去重构的话,就需要去说服领导,为什么原来的架构会降低开发效率,新做的架构能带来哪方面的提升。一定要让领导明白,这个能带来实实在在的长期收益,不管性能、效率、安全等都可以,而并非只是“看着不爽”而进行的重构。

在团队规模有保证的前提下,郭昂建议可以分工,一部分开发新架构,另一部分进行架构改进,保证长期目标和短期目标都可以落实:

值得注意的就是,不管从代码还是设计角度上来看,都要让现有做的事情能够复用,而不是新架构上线之后就会被废掉。

对于渐进式重构,郭昂建议:

以月为单位,快速的迭代,能够很快的看到效果,并且小规模投入使用。

对于重构中新架构的设计,郭昂指出:前瞻性、复用性、避免技术完美主义、避免使用过多未经广泛使用的前沿技术,这都应该注意。

他认为:重构的负责人非常重要。

作为重构时的负责人,一定要紧跟代码开发的过程,并随时进行指导,一般情况下,不要相信写出糟糕代码的人,经过略加指导就能写出漂亮代码了。……重构的工作一定要做细,迭代中的代码检查也是必不可少的。

在文章最后一部分,郭昂指出:

大多数的重构都是可以避免的,这需要从以下几个方面去提高。

  • 良好的编码风格,好的习惯往往很难天然形成,更多是在工作中不断的老带新中耳濡目染练出来的。
  • 初期的架构设计,也是非常重要。好的架构,对未来的开发以及发展,可以说是真真实实的“事半功倍”。
  • 更重要的是,需要的是不断的提高程序员的自我修养,不仅仅是能力上的,还有态度上的。不要只想最初开发时省事,而不考虑若干时间后的事情。

郭昂文中有一句话可作总结:

不管怎样,重构,一定不能是为了重构而重构,……最重要是找准其要解决的实际问题

在相关微博评论中, 王东 at 搜狗认为:

1,重构的负责人很重要,有完美主义情结是加分项;

2,在架构更加合理的同时,效果至少不能变差,所以重构的过程中,最好多次 review 效果,而不是一气呵成;

3,重构任务分期进行,先改框架,抽象函数或类,再优化数据结构和算法,最后按代码规范拆分文件、函数和语句,增加必要的容错和注释

百度知识搜索部工程师 TroyCheng 指出:

知道 qb 和 search 重构给我的感受亦是如此。有几点也是一直再强调的。重构或新模块第一版的结构设计,代码质量,程序员的自身修养,团队 code review 等。深有同感。

@万星很微薄说:

小重构可能每分钟都在做,中型重构在项目的某些阶段做,大型重构在产品的某些阶段做。

对此,王志华在西二旗的回复是:

每分钟都做好重构基本以后不需要重构,持续局部优化会导致整体优化

2013-03-09 01:144116
用户头像

发布了 479 篇内容, 共 179.4 次阅读, 收获喜欢 53 次。

关注

评论

发布
暂无评论
发现更多内容

软件测试学习笔记丨MyBatis 数据库与实体类属性对应

测试人

软件测试

一键自动化博客发布工具,用过的人都说好(51cto篇)

程序那些事

工具 自动发布

不容错过的邀请:《哈利·波特》全系列中英文版本上线华为阅读

最新动态

MySQL 给用户添加 ALTER VIEW 的权限

华为云开发者联盟

MySQL 数据库 华为云 华为云开发者联盟 企业号2024年5月PK榜

MyBatis如何通过拦截器修改SQL

源字节1号

开源 软件开发 前端开发 后端开发 小程序开发

Pencils Protocol 宣布再获合作伙伴 Galxe 的投资

加密眼界

报名倒计时|来蚂蚁C空间,参与一场开源隐私计算及 AI 技术与应用落地的探讨~

TRaaS

活动报名

2024-05-15:用go语言,考虑一个整数 k 和一个整数 x。 对于一个数字 num, 在其二进制表示中, 从最低有效位开始, 我们计算在 x,2x,3x 等位置处设定位的数量来确定其价值。

福大大架构师每日一题

福大大架构师每日一题

什么是ARP攻击,怎么做好主机安全,受到ARP攻击有哪些解决方案

德迅云安全杨德俊

vivo蓝心大模型登陆火山方舟,一站式方案实现智能普惠

新消费日报

8000-12000奖金等你拿,OpenTiny 开源之夏10大导师齐上阵,带你立刻get 项目详情!!!

OpenTiny社区

Vue 前端 低代码 组件库 OpenTiny

Python最容易犯的五个错误,你中了几个?

我再BUG界嘎嘎乱杀

Python 编程语言 开发语言

解锁高效创新:IPD策略如何重塑产品开发流程

IPD产品研发管理

项目管理 产品经理 IT IPD 产品研发

企业如何搭建API经济形成二次增长?

幂简集成

API API经济

必看!5个最实用TikTok运营工具分享!

Ogcloud

TikTok tiktok运营 tiktok直播

VALSE 2024合合信息 | 文档解析与向量化技术加速多模态大模型训练与应用

dvlinker

人工智能 机器学习 计算机视觉 多模态大模型 智能文档图像解析技术

记一次ThreadLocal中的用户信息混乱问题

不在线第一只蜗牛

Java 数据库 oracle ThreadLocal

企业级小程序技术平台与中间件提供商凡泰极客完成近亿元B轮融资

FN0

小程序 小程序化

软件测试学习笔记丨MyBatis 多条件查询和模糊查询

测试人

软件测试

数据库索引回表困难?揭秘PolarDB存储引擎优化技术

阿里云瑶池数据库

数据库 阿里云 polarDB 分布式,

结合多模态 AI 谷歌展示 AR 眼镜原型机;Meta 被曝开发带摄像头的 AI 耳机丨 RTE 开发者日报 Vol.204

声网

代购独立站一键代采:开启全球购物新纪元,无缝连接中国制造与世界市场

Noah

中文域名和英文域名有什么区别?中文域名有哪些优势?

防火墙后吃泡面

前搜狗搜索技术负责人郭昂指出:大多数重构可以避免_架构_郑柯_InfoQ精选文章