持续更新就是给软件上医保

简介:

其实软件很像房子。

想让你的房子整洁舒适,你必须每周打扫。随着时间的流逝,有些东西会出问题,你必须修理它或换新的。但大多时候你需要做的只是简单的给门或窗刷一道漆就行了。

如果房子料理的好,人们就会喜欢住在里面。
screenshot

但想象一下,你现在要离开这个房子。刚开始,这个房子还会保持不错的外观,室内一切正常。可是,一旦不再有人打扫地板或清理垃圾,房子就开始落灰积沉。一段时间后有些东西开始出问题。起初只是一些小的、不重要的东西出问题,但有一天一场暴风袭击了它,毁坏了很多东西。
screenshot

如果这些毁坏的东西没有人来修理,房子就会持续破败。
screenshot

一段时间后,房子变得破败不堪,没有人再愿意去哪里。人们会告诉你,与其去修好它,不如盖个新的。

对任何软件产品来说,道理是一样的。

假设一个项目由你们7个人的团队来开发。每周你们会往里面增加新功能或修改bug。随着项目的变大,你们会做一些重构来保持软件架构的健康。你们会做一些迁移工作。时不时的升级软件包来修补bug、安全漏洞和新功能。

之后,开发工作突然停止了。也许是上级的某个人决定不再往这个项目上投入更多的资金。决策者说:“这个软件运行的很好。我们只需要它保持这样,我们不会再花钱来添加新功能。”

于是,你们这个团队被分配了其它任务,这个项目变成了没人照料的项目。系统目前还是正常运行,每天都在给现实生活中的人们提供着服务。

几年后,突然里面的支付系统出现异常。发生了什么?多少年都没有人碰过这些代码了。它怎么会突然的就不能用了呢?怎么可能?

无人照料,一场风暴来临了…

你 需要知道,如今的软件不再是一个自我封闭的世界。基本上所有的软件都会和外部世界进行交互。软件要依赖操作系统,硬件,很可能还会有个数据库或其它后台服 务。甚至还依赖一些外部API。它们全部是动态的,不停的在变化。所以,你的软件也需要跟着变化,这样才能保持正常运行。

在我们的这个例子中,是因为欧盟通过了一个新协议来统一货币。这导致老的支付API不再受支持。

这看起来不像是个大问题。我们的上级决策者决定招聘一个Ruby程序员来解决这个问题。这是一个Ruby on Rails + MySQL项目。很普通。Ruby程序员很快就招到了,而且估计出大概一两天就能解决问题。

然后,Ruby程序员开始查看项目代码,发现这是一个很老的项目,使用的是Rails 2.x,不是Rails 3.x或4.x。不,比当前的版本低两个大版本号。他从来没有用这么老的Rails版本开发过。

而 接着的另一个让他惊奇的事情是,MySQL是4.0版的,不是5.0或5.5。不,低一个大版本号!项目中的MySQL驱动gem使用的是一个本地 (native)扩展,无法在他的开发机上编译,因为他的gcc太新了。他必须降级gcc编译器版本,才能安装老的数据库驱动。

我只打算讲到这里。估计你已经知道我想表达的是什么了。

因 为这个项目多年无人维护,导致现在即使一个很小的改动也变得异常痛苦。一个根本用不了一天的小bug修改,现在用去了一周时间。而且这个Ruby程序员非 常不喜欢他现在干的活儿。其他程序员都可以使用Rails4.x里像“Turbolinks”这样有趣的功能,而他还在跟这些老破烂打交道。他宁愿建议扔 掉这个项目,利用现在的最新技术重新开发一个。

教训是清楚的。如果你离开你的房子几年之久,你应该请一位家政每周清扫一次,而在软件开发世界里,这意味着你每周都应该花一点时间检查系统并更新相关依赖。

很多时候都是没有更新可用,外部世界没有任何变化。这种情况下,5分钟你就能维护完。

很多时候你会发现软件包出现了一个新的补丁或小版本升级。这时,你必须进行升级,看看测试是否仍然能通过,系统是否能正常运行。这种事情通常会花20分钟,完全值得投入,因为这些升级会修补bug,弥补安全漏洞,带来新功能特征。有些还会带来内存和速度的优化。

一 般每过几个月,你依赖的数据库或API等软件包都会有一个大版本号的升级。替换他们可能会花数小时,甚至数天。但这是值得的,因为这些升级会让你的软件保 持最新技术,这是用来吸引有天才的程序员最好的途径,他们都是喜欢最新的技术,而不是一堆老代码。有时候这些更新是必须的,如果不更新,你的应用就无法运 行。

持续更新是为了让软件常年保持生命力,健康和新鲜血液。这能保证即使有业务逻辑上重大修改也能在合理的预算内、可以接受的时间里完成。持续更新就是你的软件项目的医疗保险。

文章转载自 开源中国社区 [http://www.oschina.net]

相关文章
|
区块链 开发者
教程(1):关于如何上链的简单直接的操作教程
这是一篇关于如何上链的简单直接地操作流程。
1932 0
教程(1):关于如何上链的简单直接的操作教程
|
8月前
|
JSON 自然语言处理 数据格式
速卖通 item_get 接口对接全攻略:从入门到精通
速卖通item_get接口是获取商品详情的核心工具,支持跨境电商分析、比价选品等场景。本文详解接口认证、参数组装、签名生成、代码实现及错误处理,提供Python完整示例,涵盖令牌管理、多规格解析与最佳实践,助力开发者高效对接。
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
11月前
|
机器学习/深度学习 数据采集 监控
MyEMS开源能源管理系统实际案例分析
MyEMS开源能源管理系统已在制造业、商业地产、医疗、工业园区等多个领域成功应用,通过设备级监控、工艺优化、智能调度等手段,帮助企业实现节能降耗、提升能效与管理透明度。结合AI预测、多系统协同及ISO标准适配,助力企业达成绿色转型与合规目标。
400 0
|
监控 网络协议 安全
Socks5协议原理分析及实现对比与问题排查实践
这篇文章《socks5协议原理分析及实现对比与问题排查实践》将深入探讨Socks5协议的工作原理,并对其与其他网络协议的实现进行详细比较。作者还将分享在实际应用过程中所遇到的问题及排查方法。对于想要提高系统安全性和性能的开发人员,本文提供了丰富的案例分析与实践经验。 在这篇文章中,读者将了解Socks5协议的基本概念、工作原理、具体实现方式以及常见问题与解决方案。这不仅有助于开发人员更好地理解Socks5协议,还能增强他们在开发与部署中应对复杂网络环境的能力,让我们一同探讨这些关键技术。
1084 0
Socks5协议原理分析及实现对比与问题排查实践
java使用Stream流找出集合对象中最小值
java使用Stream流找出集合对象中最小值
829 1
|
Java 开发者
Java文档注解中@link与@see的使用详解
Java文档注解中@link与@see的使用详解
2709 0
|
小程序 测试技术 数据库
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)
|
存储 人工智能 Java
进制转换在C/C++/Java/Kotlin中的应用(详细版)(上)
进制转换在C/C++/Java/Kotlin中的应用(详细版)
378 0
|
搜索推荐 数据可视化 算法
海南旅游景点推荐系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
海南旅游景点推荐系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
548 0