- 浏览: 1011909 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
第四步,解决问题的流程
理论上来说,经过二、三两步之后,大部分的问题都解决了,但是在我们的开发过程中,随着编码的深入、需求的变化、对原系统的了解、对业务的了解,我们常常会遇到各种各样的问题。
解决问题一个常用的工具是鱼骨图,当然,我写这篇博文的初衷是介绍一下我做老系统维护工作的一些心得,不希望里面充满了工具的堆积,所以对于鱼骨图就不介绍了。
《走出软件作坊》的作者说过,他常用的工具是 Word+Excel+PPT+脑图,我觉得很有道理。工具的目的是为了解决问题,贵在实用而不是多。
问题一般是技术上的问题,业务上的问题和协调上的问题。对于问题,我的做法是问 ->做 ->记。
首先是问 。很多问题是难者不会,会者不难,这时候问就很重要。
1)搜索引擎。常言道內事不决问百度,外事不决问 Google,要尽量利用搜索引擎的功能尽快解决问题;
2) 问相关同事。很多情况下我们遇到的问题可能其他的同事也遇到过,这样,通过问同事解决问题能够事半功倍。另一方面,很多问题是和业务紧密相关的,即使通过 Google也未必能有结果,这样问同事就很必要。咨询同事也要讲求策略:要以虚心的态度、要找对人、要找对时间、要认真听讲、要及时确认、要表示感谢;
3) 问专业论坛。每种语言每种技术都有自己的社区,在社区中通常能获得意想不到的收获。
再次是做 。
一般如果有可能我会请同事或者在同事的帮助下将问题立刻做个 Demo,以便能及时确认。对于业务上的问题要做个人机界面供业务同事确认。
“做”的过程没有太多可以说的。
最后是记。
“记”我认为是在解决问题的过程中最重要的一步。对于问题,第一次的时候不会我们可以原谅自己,但是如果第二次还不会就该检讨自己了。通过记录解决问题的方法和流程,能避免我们第二次再去问。
记录的目的是为了让我们第二次遇到相同问题的时候有解决问题的方法,因此要尽量写得相信,最少要让自己能够看懂。同时要为这些问题建立好目录结构,这能保证在以后更好地查找。
举例来说,我们公司有自己的报表控件和报表引擎,报表使用有固定的流程,下面是我的一个记录,用 Word写的一段配置报表的步骤:
第五步,制定计划
第六步,开发
第七步,测试
第八步,需求变更
这四部都是和开发有关,也是在时间上离得很近或者并行的过程,同时还可能是一个迭代的过程。其中制定计划可能要和客户、 Boss、业务人员、测试人员一起商定;开发则几乎是我们自己的事情;测试是测试人员的事情(如果大家够幸运有专职的测试人员协助的话);需求变更则可能来自客户或者业务人员或者市场变化或者公司的战略调整(归根结底是客户)。
这几个步骤是我们最熟悉的步骤,也是在以前可能占据我们 80%以上工作的事情,大家既然都熟悉,也就不详细说了,只是针对每个步骤说一下我的一些反思的结果。
制定计划 建议采用迭代的方式,持续给客户提供版本,这样,客户、我们心里都有底,除了问题也能够及时更正。迭代的频次有很多种软件方法论给出了不同的建议,我们部门去年采用 Scrum,以 4-6周作为一个迭代,取得不错的效果。我们的计划可以以正在进行和将要进行的两个迭代为主,制定详细计划,如果有可能,最好细化出每一天的具体计划。
开发 需要注意的是度的把握,我的建议是先完成主要路径,再考虑其他。主要路径指的是能够完成用户要求的最低标准,我们开始的任务一定是要完成这个要求,完成之后我们再考虑客户的使用体验、界面的美观甚至一些超出客户期望的功能(我们称之为添花)。
测试 是这次我做项目中的一个痛,由于我们任务的自身原因,我们并没有配备专职的测试,而是由我们的业务架构师大姐兼任,结果是严重占据了她的精力,测试也没有做得十分到位。对于测试我建议要配备专职的测试人员,同时要以一致的方式做测试的反馈和回归( TD或者一份共享的 Excel都是一个好工具),如果有条件,能够做自动化测试则更好。
需求变更 即影响开发也影响测试,结合我们兄弟部门的成熟经验,我的建议是使用一个共享的需求表格记录需求, SVN+Excel是值得推荐的好办法。
第九步,重构
产品上线了,经过严格的测试和补丁之后,产品终于可以稳定的在客户那里运行了,我们由于前一段时间的工作,对软件本身有了总体的把握,对软件的体系结构和代码都比较熟悉,虽然还会整天在骂真是一堆烂代码,但是现在即使出了问题也能够做到心里有底了。
终于可以不用加班,不用在客户和业务人员的埋怨中度日,不用晚上愁地睡不着觉,不用整天阴沉着脸好像自己受了天大的委屈 ——生活是如此的美好。
结束了吗?我们可以坦然接受来自客户、同事和公司的赞扬,甚至可以离开这个业务载誉而归,但是,事情真的结束了吗?
事实上,现在的工作只成功了一半,或者是失败了一大半。
我们在已经千疮百孔的产品上,为了完成客户的需求,改得代码更是支离破碎,甚至,加入了自己的烙印,让代码风格更加多样,一句话,我们将原本就很难维护的代码变得更加难以维护。
如果不希望这个产品在我们之后不久就因为难以维护被彻底的抛弃,不希望后面的程序员和我们一样骂娘,那么,趁热打铁,继续将这个产品做下去。
当然这个阶段最大的危险来源于公司,也许他们会觉得产品已经稳定了就调我们去做别的事情,这也是公司和公司之间的境界的差距。
假设,公司也支持我们进一步整理代码的工作,那么我们会面临着两种策略的选择:
1.重新架构,重新开发;
2.重构。
第一种选择,基于自己这段时间对业务的理解,对原有架构的不满,以及技术人员与生具有的创造精神:毕竟开发新系统比给别人擦屁股更有成就感,还能施展平生所学,将什么框架啊、设计模式啊、 OO啊全融进去。
第二种选择则更谨慎一些,对公司和自己造成的影响相对较小。
两种方法没有优劣之分,各有利弊,需要根据时间、资源、公司战略、自身能力等多个方面进行权衡,在这个项目中,我的选择是重构。
既然要重构代码,就首先制定一些原则,在进行重构的过程中要严格遵循这些原则:
1. 代码风格统一,如果自己难以做到,就找一些第三方的代码格式化工具;
2. 严格测试,正确性要保证在第一位;(这也取决于公司的支持,去年我们的一个部门对产品进行重构,投入了几十个开发人员和开发人员数目一般的测试人员,并且引入了敏捷开发和自动化测试,最终在年终取得了巨大的成功。一亿多人民币的收入的直接贡献者哦呵呵)
3. 做减法不要做加法。在重构的过程中,不给软件增加任何功能,对于不用的功能,能够确定的情况下,能砍就砍,事实证明,越简单出错的几率越低;
4. 使用 SVN做版本管理,每日构建,保证每天上传的版本都是可运行的版本,如果当天的版本无法调试通过,就干脆抛弃,第二天重新进行;
5. 不出现重复的代码;
6. 每个方法的长度不超过一屏。
其实还有很多原则,但是原则太多反而记不住。接下来开始重构工作。对于重构我们可以参考与设计模式齐名的《重构》这本书。
我觉得自己的能力难以同时处理多件事情,我的做法是从程序的起始点开始,一个功能一个功能,或者一个类一个类顺序进行,最小的重构单元是对“方法”的重构,基本上按照下面的步骤:
1. 修改代码使得风格统一,命名临时变量,查看全局变量,能变成参数就让全局变量成为参数;
2. 如果方法太长就看是否能够变成几个小方法;
3. 将类中重复的代码抽离出单独的一个方法;
4. 将类中的 Public方法进行整理,看是否需要 Public出去,保证 Public的部分尽量少;
5. 将类中没有用到的私有方法删除;
6. 如果一个类有太多责任就看能否分成几个具有单一职责的类;
7. 对类书写一些注释;
8. 将公用的方法和公用的类进行而并整理,放到公共单元中;
9. 重构和一个类关联的一些类;
10. 重构一个业务或者一个功能中的所有类;
11. 重构整个系统。
需要注意的是,这是一个漫长和辛苦的过程,也是一个不被人理解和不被重视的过程,更是一个容易让我们沮丧和容易放弃的过程。重构,非常非常不容易!
第十步,整理开发文档
我们在做老系统维护的时候,遇到最大的问题就是文档问题。可能大家都有这样的感叹:“如果能有一份文档该多好!”,“如果能有一份和当前版本一致的文档该多好!”。
作为程序员来说,大家应该都不喜欢写文档,特别是绷紧了神经开发之后,更不喜欢再耗费时间来整理文档。如果有一个称职的文档人员,当然是最大的幸运,如果没有,文档又是如此的重要,我们只能打起精神,来个善始善终。
对 于我来说,我比较欣赏敏捷的一种思路,写恰当的文档。那么什么是恰当的文档呢?我认为应该是我们在维护程序的时候不明白的地方都能从文档中找到,同时文档 里面没有太多的废话。至于文档的格式,如果公司有统一的要求还是按照公司的要求为好,如果没有就不要太拘泥于格式,而是将重点放在内容上。还有一个建议是 多用图或者表来表达思路,有的时候一幅简单的图也许能够代表一段复杂拗口的文字。
开发文档我觉得应该至少包括这些内容:
系统设计文档 。最好能使用图来表达系统的设计思想和架构;
数据库设计文档 。如果有可能,一个良好的 PowerDesigner文档能很好帮我们理清思路;
软件使用说明书 。良好的软件使用说明书能够帮助我们理清业务,明白软件中的流程,甚至能理解源代码中一些看起来不可理喻的写法;
系统需求列表 。一个自始至终的需求列表即能理清系统的功能,也是回归测试的依据;
公共函数库说明 。一些公共服务的类要介绍清楚,这样即能帮助我们理解之前的代码,也能让我们在以后的编程中能尽量复用之前的代码,避免重复劳动。一般来说,公共代码都是讲过检验并且成熟稳定的;
常见问题解决方法 。就像在步骤四中提到的那样,常见的问题也许之后维护这个系统的人也会遇到,一份清晰明了的列表能够让后面的同事少走弯路;
良好的注释 。注释的写法也是见仁见智,恰当准确的注释的作用,确实不言而喻的。
香气四溢的源代码 。最重要的当然是香气四溢的源代码了,经过我们重构过的代码,我们自己也会为它骄傲。
如果大家觉得还有重要的文档,欢迎和我讨论。
发表评论
-
eclipse使用SVN创建,合并分支[转]
2011-11-11 17:11 905之前一直使用"小乌龟"进行分支建立与 ... -
持续集成之“依赖管理”
2011-08-04 18:10 801来源: infoq 发布时间: 2011-0 ... -
持续集成理论和实践的新进展
2011-08-04 18:10 981作者: 肖鹏 来源: InfoQ 发布时间 ... -
Maven原理和Maven2新特性
2011-06-30 16:02 1039Maven的基本原理和Maven2的新特性 用Maven做项 ... -
结合Maven2进行J2EE项目构建
2011-06-29 21:13 1198一.背景 Maven2 的基本 ... -
用Maven做项目管理
2011-06-29 21:10 1031用 Maven 做项目管理 在 Java世界中我们 ... -
天生一对"Maven2+Jetty" -- Maven2创建并管理WebApp
2011-06-29 19:21 1291Maven2代比1代改进很多,其中主要强调的是--它不仅仅是个 ... -
Maven实战(四)——基于Maven的持续集成实践
2011-06-28 13:16 958Martin的《持续集成》 ... -
Hudson+Maven+SVN 快速搭建持续集成环境
2011-06-28 13:07 1015hudson 是一个可扩展的持续集成引擎,Hudson非常 ... -
敏捷开发、极限编程
2011-06-27 00:35 873什么是敏捷开发?一种以人为核心、迭代、循序渐进的开发方法。在敏 ... -
敏捷开发简介
2011-06-27 00:34 1183在软件工业界,敏捷开发已成为众多高效开发团队的制胜之道。它不仅 ... -
用SecureCRT连接VMware中的Linux系统
2011-06-16 22:03 1598一、预备知识: Secure: SecureCRT将S ... -
持续集成之路——Maven
2011-06-15 15:04 723写在前面 ... -
持续集成之路——Maven(续)
2011-06-15 15:02 857接上篇)在新创建了项目之后,可以看到目录结构: ... -
持续集成之路——搭建Maven私服
2011-06-15 15:01 1071在开发过程中,有时候会使用到公司内部的一些开发包,显然把这些包 ... -
Maven仓库管理-Nexus(转帖后加强版)
2011-06-15 15:00 2031前面我讲到为什么要使用Maven, Maven的安装,以及如何 ... -
maven下nexus的搭建,jar包上傳等注意事項
2011-06-15 14:58 2484nexus是用來搭建本地jar ... -
解决nexus下载maven索引的问题
2011-06-14 23:23 3162在上个周五在公司的一 ... -
Maven仓库管理-Nexus(转帖后加强版)
2011-06-14 00:50 1103前面我讲到为什么要使用Maven, Maven的安装,以及如何 ... -
Hudson+Maven+SVN 快速搭建持续集成环境
2011-06-08 01:04 847hudson 是一个可扩展的持 ...
相关推荐
遗留系统是企业历史遗留下来的老一代信息系统的统称,它们可能因为技术、业务、市场等多种因素需要进行更新或替换。根据系统的业务价值和技术水平,遗留系统可以分为四种策略: - 改造策略:适用于技术含量高、业务...
### 计算机系统维护之光驱维修详解 #### 光驱故障概述 光驱作为计算机的重要外设之一,在日常使用过程中难免会出现各种故障。针对光驱的常见故障及其维修方法,本文将从机械故障、光学故障以及电子部件故障三个...
三、维护老客户的策略 1. 建立客户数据库:系统记录客户信息,以便进行个性化的服务和沟通。 2. 特殊客户特殊对待:根据客户的不同需求和价值,定制专门的服务方案。 3. 定期总结:定期回顾与老客户的业务,了解他们...
磁盘格式转换是一项常见的系统维护任务,特别是在处理不同操作系统之间的兼容性问题时。通过使用Windows自带的`convert`命令或者第三方磁盘管理工具,可以轻松地将FAT32格式转换为NTFS格式。不过,在进行转换前,请...
虽然MD5已经不被认为足够安全,但在许多老系统中仍然被用作基本的密码保护手段。在Java中,可以使用`java.security.MessageDigest`类来实现MD5加密,对用户的原始密码进行处理,生成的哈希值存储在数据库中,登录时...
标题 "Fat32快速转换成Ntfs" 涉及到的是...总之,FAT32与NTFS的转换是一项重要的系统维护任务,可以帮助用户充分利用磁盘空间,提高系统的安全性。了解转换方法和注意事项,对于日常的电脑管理和数据保护都十分必要。
三、新系统的方案介绍 1、拟建系统的目标 目标是构建一个集客户信息管理、订单处理、销售分析、客户服务于一体的综合系统,实现业务流程的标准化和智能化。 2、系统规模及初步方案 预计系统将覆盖全国范围内的...
信息管理系统作业涉及到的是系统开发和管理的信息,涵盖了系统设计、模块化、耦合与内聚、系统测试、系统切换以及系统维护等多个方面的知识点。 一、系统设计 系统设计是将系统分析阶段产生的逻辑模型转化为可实施...
《商业编程:老枪二级域名系统朴素版源码解析》 在互联网的世界里,二级域名系统扮演着至关重要的...通过深入理解其架构和实现,我们可以更好地掌握如何在实际项目中构建和维护类似系统,提升网站的灵活性和可扩展性。
云计算提供弹性计算资源,大数据分析助力决策优化,人工智能则在预测维护、质量控制等领域发挥作用。报告以石油石化、电力、离散制造为例,指出了它们在数字化转型中的技术侧重点,如石油石化行业的物联网监测、电力...
数据抽取、转换和装载(ETL)是构建和维护数据仓库的核心环节,它涉及从不同源头获取数据,对其进行处理以适应目标系统,然后加载到数据仓库中。在本讲中,我们将深入探讨ETL的各个关键方面。 首先,ETL的重要性...
开发和维护串口驱动涉及到的知识点包括: 1. USB协议:理解USB的结构、设备类、传输类型和枚举过程。 2. 串行通信协议:如RS-232的电压电平、波特率、奇偶校验等参数。 3. 驱动程序开发:包括设备驱动模型、中断处理...
总结来说,转油站PLC变频控制系统的实践应用,能够实现输油的自动化,降低节流损失和压力损失,提高数据采集及泵控制的精确度,减少劳动强度,并通过稳定油田电网来降低维护费用。这种系统的广泛应用,对提升油田...
老黄历是中国传统的日历系统,包含了干支纪年、节气、吉凶宜忌等信息。在编程实现时,我们需要处理农历转换为公历的算法,同时还要考虑到节气和各种民间习俗。这通常需要对日期计算有深入的理解,并可能需要引入第三...
7. **头文件和库**:VC7引入了新的标准库实现,如STLPort,而在VC6中使用的是老版本的Microsoft STL。可能需要修改包含和链接库的路径,以指向VC6的版本。 8. **错误和警告**:VC7可能容忍的代码在VC6中可能产生...
【标题】"基于PLC的三辊对称上调式卷板机控制系统改造" 【描述】改造老旧进口卷板机控制系统,采用三菱FX2N系列PLC进行升级,实现上辊升降、压力控制、下辊驱动电机旋转、翻倒机构的正常操作,并引入PI和模糊控制,...
8. **系统维护与评价**:了解系统维护的重要性,以及如何对系统进行评价以确保其持续有效性和适应性。 9. **系统开发的项目管理**:讨论项目管理的关键要素,如软件能力成熟度模型、进度管理、质量管理、文档管理、...
《Windows系统安装及GPT详解》 ...GPT和MBR各有优劣,理解它们的特点和转换方法,将有助于我们更好地管理和维护计算机系统。在进行任何转换操作之前,一定要确保数据备份,以防止不必要的数据损失。
USB转串口驱动程序是计算机技术中用于连接和通信的一种重要工具,特别是在嵌入式系统、工业控制设备以及老式设备的现代化应用中。本文将深入探讨USB转串口驱动程序的工作原理、安装过程以及常见问题,以帮助读者更好...