浅谈老系统维护

今天聊一个老话题,如何维护一个老系统,尤其是一个很重的老系统,少则3-5个年头,多则7-8个年头,第一版代码早已不知是哪些人编写,

这个老系统迎来送走了一批有一批程序员,可谓是看尽公司的浮沉沧桑,如今,它既是公司的功臣,也是公司的包袱,每个公司都或多或少有一些样的老系统。

开发新的项目替代老系统,需要很大的人力物力,还要经过一段时间去磨合它的稳定性,新的就一定比旧的好用吗?项目失败的概率依然很大,没人愿意去承担这样的风险。相比之下,维护一个老系统,面对新的需求,升级老系统,虽然保守,但很稳健,风险很低。怎么说呢?存在即有道理,否则早就推翻重来了。

这个时候,自然就苦了老系统的维护人员。

你能想象,一个既没有数据库表设计说明书,没有任何需求和设计文档,代码风格迥异没有几个注释,同一个开源框架多版本共存,没有任何分层设计的老系统带给维护人员的是什么吗?

不说,希望你懂。

笔者最近也在维护一个这样的系统,既然没得选,只能接受,还要在之中找出乐趣,获得经验,取得进步,不是吗?

项目背景:开发平台,其他项目组开发的项目都是以这个开发平台做的,而我的任务就是不停地给这个开发平台打补丁加功能,还要为其他项目组提供平台方面的支持。

感悟之谈,仅供参考。

1、如果你不想被后边接手这个项目的人骂,请在修改的时候,一定要注释上修改说明,越详细越好,比你修改的代码行数还要多都不为过。甚至你可以修改点同一个目录下附上一个说明文档,相信后来人会对你感恩戴德的。

2、没有数据库说明书,没有文档,没有注释,那怎么改?先别苦恼,很多程序员都和你面对同样的问题,公司招你不是让你喝茶看报纸的。遇到这样的问题,镇定!先和提需求和提bug的人员深入的沟通:第一、一定要改吗?能不能说服客户不改。讲清其中的利害关系。第二、客户买你的软件,自然就是上帝,没办法必须改,那好,落实到文字上,让客户把自己的问题描述清楚,开发人员能看懂,两者进行过切实的沟通。如果开发人员面对的是实施人员,就更要多次深入的沟通,防止做无用功,出来的东西不是客户要的玩意,得不偿失。

最后沟通,必须改,改成什么样子,心里有数了,再开始动手,沟通,沟通,还是多沟通。

3、备份,还是备份。不要以为有SVN,你就高枕无忧,做梦吧。因为很多时候,SVN里面的代码跟客户现场部署的根本不是一个东西,很多修改都是在客户现场做的,压根就没有反馈到公司SVN服务器上。你以为修改错了,SVN里还有,再下载一份就OK了,压根就不是那么回事。所以,修改之前,请手动备份,并写好备份日期,当前处于什么版本,为什么备份,如何还原该备份,操作人。

4、有时候有人会就你维护的项目问一些问题,日子久了,重复的问题总是一遍一遍的被问到,那好吧,你会想我写文档,放到公司内网上,这样我就省事了,我只能说,你只做了一半。慢慢地,你会发现,大家还是会问你相同的问题,明明那里有文档,大家不去看,依然直接电话过来问题。原因呢?第一,大家不知道那里有文档;第二,不如直接问人来得迅速,因为你每次都一一解答了。所以,你写了文档要通知大家,如果大家依然问你,那好,你可以尝试告诉他,稍等下,我给你发封邮件,千万不要发文档,直接发一个链接就好了,顺带温馨提醒一句,以后遇到问题,可以去哪里找。大家的习惯有时候是你惯出来的,同时也是你培养的。

5、接下来再说点技术细节上的吧:1)打补丁,尽量写成独立的函数,在该插入的地方调一下,少动原来代码,就是少引入bug。2)尽量避免全局变量,引入全局变量对于系统来说是很危险的,很多程序员同胞都应该理解。3)每个版本,你都修改了什么,要有个文档说,这样你想还原回去或者找针对某个客户的版本会很从容。4)不要急着向所有的项目推出这个补丁,先先推一个项目组,经过一段时间证明补丁稳定,再大面积推,你懂得。5)有很多文本对比工具可以使用,做维护必不可少的工具 。6)做功能,要尽可能减少联动出发,能不用主从表就不要用主从表,能拆成单表就拆成单表,能用弹窗就不要在一个表单上维护两张表等等,总之,功能越单一,越不容易引入问题,越容易维护。

6、改bug会改得窝火难受,甚至夜不能寐,请多喝水,放宽心。

先写这么多吧。

祝所有暂时做维护的人员工作顺利,心情愉快。

时间: 2024-09-27 04:34:41

浅谈老系统维护的相关文章

[nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体温计.耳温枪.皮肤水分计等), 再到智能家居等领域均占有一席之地. 而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议. 随着上一股智能消费类电子大潮的到来,BLE的各种应用也像雨后春笋般在市场上铺开. 如果想 紧跟蓝牙协议的最新动态 ,可以在https://www.b

浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)——requirejs + angular + angular-route>探讨了angular+requirejs的一个简单架构,这一篇继续来看看backbone如何跟requirejs结合. 相同地,项目架构好与坏不是说用了多少牛逼的框架,而是怎么合理利用框架,让项目开发更流畅,代码更容易管理.那么带着这个目的,我们来继续探讨backbone. 首

浅谈移动前端的最佳实践(转)

前言 这几天,第三轮全站优化结束,测试项目在2G首屏载入速度取得了一些优化成绩,对比下来有10s左右的差距: 这次优化工作结束后,已经是第三次大规模折腾公司框架了,这里将一些自己知道的移动端的建议提出来分享下,希望对各位有用 文中有误请您提出,以免误人自误 技术选型 单页or多页 spa(single page application)也就是我们常常说的web应用程序webapp,被认为是业内的发展趋势,主要有两个优点: ① 用户体验好 ② 可以更好的降低服务器压力 但是单页有几个致命的缺点:

递归算法浅谈

递归算法 程序调用自身的编程技巧称为递归( recursion). 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题类似的规模较小的问题来求解,递归策略仅仅需少量的程序就可描写叙述出解题过程所须要的多次反复计算,大大地降低了程序的代码量. 注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递增归策略时,必须有一个明白的递归结束条件,称为递归出口. 一个比較经典的描写叙述是老和尚讲故事,他说从前有座山,山上有座庙,庙里有个

浅谈HTTP响应拆分攻击

在本文中,我们将探讨何谓HTTP响应拆分以及攻击行为是怎样进行的.一旦彻底理解了其发生原理(该原理往往被人所误解),我们就可以探究如何利用响应拆分执行跨站点脚本(简称XSS).接下来自然就是讨论如果目标网站存在响应拆分漏洞,我们要如何利用这一机会组织CSRF(即跨站点伪造请求)攻击.最后,我们一起来看看哪些预防措施能够抵御这些攻击行为.如果大家对这个话题感兴趣,不妨继续读下去. 什么是HTTP响应拆分? 首先让我们设想一下某个具备多种语言选项的页面.该页面的默认语言为英语,但其中同时具备一个下拉

python浅谈正则的常用方法

python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去找内容,因为容易理解也方便,),而是正则用好用精通的很难(看过正则表的应该都知道,里面符号对应的方法规则有很多,很灵活),对于接触编程不久的朋友们来说很可能在编程的过程上浪费很多时间,今天我把经常会用到正则简单介绍下,如果不是很特殊基本都覆盖使用. 1.正则的简单介绍 首先你得导入正则方法 impo

浅谈mysql innodb缓存策略

浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb bufferpool怎么工作,和利用它读取频繁访问的数据,是mysql优化重要的方面. 理想状况下,把bufferpool的大小调整到足够大,留下足够的内存空间给其他该服务器上的进程(使其无缺页即可).bufferpool越大,innodb 月表现为内存型数据库,从硬盘上一次读取数据,之后并成了从内存中读取数

浅谈JS之AJAX

0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HTTP和web服务器进行数据交换(用户不知道也感觉不出来,就跟桌面应用程序似的进行数据交互),它不会导致页面重新加载,这样才有更好的用户体验. Ajax是基于以下开放标准: javascript(DOM) css html xml(json) 通俗的说就是使用了javascript(DOM)的XMLH

浅谈RPM

浅谈RPM [先絮叨下编译啊] 1. 库:其实就是一个程序模块(它没有执行入口,不能独立执行,只能被能独立运行的程序调用时执行)你可以把它想象成工具螺丝刀,可执行的程序是就是你自己:螺丝刀能自己干活吗?没有螺丝刀能拧螺丝吗?或者说你现在制作一个?螺丝刀可以实现这个功能但需要你来执行这个动作. 2.静态编译:将程序所需要的所有的库都编译进二进制程序,不依赖于共享库运行:就好像随身携带螺丝刀一样. 3.动态编译:程序所依赖的共享库并不会被编译进整个二进制程序,运行环境依赖于共享库:需要找到螺丝刀才能