`
isiqi
  • 浏览: 16538986 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

不要轻易重头再来,可能的话,尽量优化而非重构——读《 Things You Should Never Do, Part I》后感

 
阅读更多

原文地址:http://joelonsoftware.com/articles/fog0000000069.html
[感想]
工程师总是喜欢另起一套东西,一套自己熟悉的东西。对于过往的代码,往往会因为可读性差而决定放弃使用他们,更宁愿重头再来重写一份代码。
其实很能理解。代码在长久的维护过程中,慢慢腐坏变得越来越丑陋是司空见惯的事,对于这样的代码,团队的老成员都会头皮发麻,团队新手进来就更难以溶入了。非常多的工程师在代码维护成本高达至不堪忍受时,都会想要放弃原代码从头再来。
还真是。我在接手站长天下代码,要将其改成淘宝外店时,也是觉得“非重构不可,我宁可从头再来”。接手web聊天室时,我、纯华、葛岩都非常想要重构,想要一份自己能够“掌控”的代码,而不是基于别人的代码进行维护。
代码为什么会变得越来越丑陋呢?前期构思不充分固然是可能的原因之一,但更大的可能性是因为有太多意料外的需求和bug。这不是前期构思不充分的错,前期不可能预测至所有的问题,只要主体架构搭得合理,前期的构思就算是成功的,小的细节问题是一定会存在的。这些细节问题只能在开发过程中发现,别无他法。每发现一个这种问题,就必须打一次补丁,补丁多了,代码就变得可读性越来越差。一直到那个无法再忍受的临界值达到为止,代码会越来越腐坏。然后终于要开始重构了,重头再来。
就像Joel Spolsky说的,重构的成本是非常大的。如果重构的团队还是之前那支团队,那还相对较好,如果团队是支新的团队,那效果未必好。你无法保证你的代码不会犯过去团队相同的错误,你在选择重构时,
丢弃了过往的累赘,但也丢弃了过往的经验。尽管过去的代码十分丑陋,但他们确确实实可以正常地在运转。如果要重构,你能保证你的代码不会像过去团队的代码一样,慢慢变丑陋吗?你面临同样的风险,而且,过去团队已经付出的时间成本,你还要再次付出一遍。
没有人愿意写出难看的代码,你们团队的实力也不一定会比过去团队更高明。在项目初期,大家的愿望一定都是好的,代码的组织结构也一定是满意的。在长期的维护过程中,意料外的事件是不可避免的。重要的不是重构,重要的是如何防止代码腐坏!这是最治本的,永远别说“稍后再来修改它”,因为“稍后”等于“永远”,代码就是在一次次这样的“稍后”中腐坏的。马丁说得对,永远要保证“签出”的代码比“签入”时更干净、更整洁。永远保证你的代码是高品质的输入,不要留任何坏的东西在代码库里,它会像破窗户原理一样,让你的代码越来越破,永远别打破那第一扇窗户。
如果代码已经很乱了,怎么办?重写吗?如果你的团队还是之前那支团队,你们已经有第一版的“经验”在了,我觉得是可以去重构的,这个风险在可控范围。但如果之前版本并非由你们来做,那么不要去重构,而是去读他们的代码,再难读也要去读,然后再去优化他们,而非重构。
也就是说,如果项目要交接给其他团队,不要寄希望于日后的新团队的重构,那成本实在太大。应该在交接的时候,交接清楚,我知道如果开发周期长,这个交接的过程并不容易,但即使如此,这个成本也是最小的,交接的过程不妨给长一些,保证质量。

分享到:
评论

相关推荐

    2020年下半年宏观经济及债券市场展望:千金难买牛回头,重头再来仍选债!.rar

    2020年下半年宏观经济及债券市场展望:千金难买牛回头,重头再来仍选债!

    20200620-中金公司-2020年下半年宏观经济及债券市场展望:千金难买牛回头,重头再来仍选债!.pdf

    20200620-中金公司-2020年下半年宏观经济及债券市场展望:千金难买牛回头,重头再来仍选债!.pdf

    从零开始带你成为MySQL实战优化高手PDF117-127.zip

    在MySQL的世界里,成为一个实战优化高手意味着你需要深入理解数据库的核心机制、掌握性能调优的技巧以及熟悉各种查询优化策略。这个压缩包文件“从零开始带你成为MySQL实战优化高手PDF117-127”可能包含了从第117讲...

    普通话易错字归纳.doc

    3. "投奔"的"奔"在这里读作bèn,表示向某个方向去,而非bēn,后者通常指奔跑。 4. "蹊跷"的正确读音是qīqiāo,形容奇怪或不寻常,避免误读为qī qiào。 5. "秘鲁"的"秘"应读作bì,国家名,不同于秘密的"秘"mì...

    清华大学研究生凸优化上机实验+大作业报告和代码.zip

    大作业则是课程的重头戏,通常会要求学生针对一个实际问题进行深入研究,并应用凸优化知识来提出解决方案。这类作业往往没有直接给出代码,而是提供数据集和要求学生撰写PDF报告。在这样的任务中,学生必须自主地...

    javascript写的YOKA时尚网7日重头戏Demo

    JavaScript编写的YOKA时尚网7日重头戏Demo是一个基于前端开发技术的示例项目,主要用于展示如何利用JavaScript和相关技术实现一个动态、交互性强的网页应用。这个Demo不仅涵盖了JavaScript的基础语法和特性,还可能...

    普通话水平测试模拟试题.docx

    首先,普通话水平测试的重头戏之一是读单音节字词。这项测试主要评估考生的普通话发音准确性。它不仅要求考生能够准确辨识每个汉字的声母、韵母和声调,还要求在发音过程中做到吐字清晰、发音准确。例如,字词“售”...

    2010年seo优化笔记

    SEO(Search Engine Optimization)是搜索引擎优化的简称,它是一门技术,旨在提升网站在搜索引擎自然搜索结果中的排名,从而增加网站的可见度和流量。2010年的SEO优化技术虽然与现在相比有些过时,但理解其基本原理...

    3d DirectX重头编

    这个“3D DirectX重头编”主题涵盖了几个关键概念,让我们逐一深入探讨。 1. **3D图形基础**:3D图形是通过计算机模拟三维空间中的对象和场景来创建的。在DirectX中,3D图形的基本构建块是顶点,每个顶点通常包含...

    js仿YOKA七日重头戏图片切换.zip

    8. **优化性能**:为了提高用户体验,避免不必要的DOM操作和计算,可以使用事件委托、缓存DOM引用、利用requestAnimationFrame等技巧来优化代码。 9. **用户交互反馈**:可以添加过渡效果、加载提示、鼠标悬停效果...

    YOKA时尚网7日重头戏 焦点图.zip

    【标题】"YOKA时尚网7日重头戏 焦点图.zip" 提供的信息暗示这可能是一个关于时尚网站的焦点图设计资源,很可能包含了一系列用于网站头部重要展示的图片或者CSS3代码示例。这个压缩包可能是设计师或开发者在YOKA时尚...

    YOKA时尚网7日重头戏.zip

    【标题】"YOKA时尚网7日重头戏.zip"是一个包含网页资源的压缩文件,主要用于展示YOKA时尚网站在过去一周内的重点内容。这个压缩包可能包含了该网站的焦点区域或者幻灯片展示部分的源代码和相关素材。 【描述】"YOKA...

    原生js YOKA时尚网7日重头戏图片滚动切换效果代码

    【原生JS YOKA时尚网7日重头戏图片滚动切换效果代码解析】 在网页设计中,动态的图片切换效果能吸引用户注意力并提升用户体验。YOKA时尚网7日重头戏的图片滚动切换效果是利用JavaScript实现的一个经典案例,它巧妙...

    面向真实场景的数据驱动决策优化2022决策智能在线峰会(公

    特别是在商业智能、产品开发、市场分析等领域,能够科学地分析数据,洞察趋势,对于把握市场动向、优化决策流程至关重要。在这样的背景下,“面向真实场景的数据驱动决策优化2022决策智能在线峰会”应运而生,旨在...

    电子:华为春季发布会重头戏—Mate Xs折叠屏来了.zip

    《电子:华为春季发布会重头戏—Mate Xs折叠屏来了》 华为作为全球领先的智能手机制造商,一直在技术创新上保持领先,特别是在折叠屏手机领域。2020年的春季发布会,华为推出了其备受瞩目的新款折叠屏手机——Mate ...

    华仔软件下载系统MX v1.0 版

    在这个案例中,开发者可能对v2.2版本的源码进行了重构,去除了不必要的函数、注释和重复逻辑,甚至可能使用了更高效的设计模式和编程技巧,使得新版本在保持功能完整的同时,降低了代码复杂度。 下载管理类软件的...

    如何重头通过conda安装tensorflo-2.10-GPU版本,配置环境

    如何重头通过conda安装tensorflo-2.10-GPU版本,配置环境

    js特效脚本含源码和说明YOKA时尚网7日重头戏

    js特效脚本含源码和说明YOKA时尚网7日重头戏本资源系百度网盘分享地址

Global site tag (gtag.js) - Google Analytics