文档章节

[转]如何开发不可维护的软件

阿信sxq
 阿信sxq
发布于 2015/12/23 22:28
字数 1860
阅读 49
收藏 0
点赞 0
评论 0

        本文是转载,原文是英文,这是原文地址,博乐在线的乾龙翻译,这是译文地址

        我从别人遗留的的技术性债务中获得报酬。在我的日常工作中,我见到了很多难以维护的代码,并且我一次次地看到了很多相似的并可以避免的问题。

        我专门从事调试、修改、维护、扩展遗留软件系统这类工作,我的典型客户一般都有一个或多或少可以运行的网站或者软件,但是其开发者都因为各种原因不 再维护了,因为商业需求改变导致软件无法跟上需求;或者我的客户有一些“几乎快要完成”的软件,但是因为预算用光或者计划有变与开发者分道扬镳。通常这种 软件会缺少一系列的功能并有一坨bug。

        我那些客户通常被其他程序员告知,需要废弃已有的所有代码从头开始。大部分程序员不喜欢维护代码,尤其不喜欢维护别人开发的代码。当程序员写代码 时,当他们谈论到可维护性时,程序员经常会问一些错误的问题——想了解这种情况是如何发生的,请参看Matt Duvall的文章《可维护性的神话 |The myth of maintainability》。

        以下是一些你可以在你自己的软件工程中做的“好”事,因为这些事可以帮我找到活干。

不要用版本控制软件

        我经常很惊讶的发现,在过去的几年里编写的大型软件工程竟然不在源代码版本控制中。如果你不使用版本控制,下一个承接你项目的程序员就没法确定哪些文件属 于你当前的系统,哪些是淘汰的以及哪些是备份文件,他也无法从提交信息或者修改日志中获得任何关于代码的历史信息。我在我的文章《面向卑鄙的编程介绍 | Introduction to Abject-Oriented Programming》中,介绍了“如何不使用版本控制”。

大量定制你自己的开发环境

        千万不要让承接你项目的程序员轻易的开始工作。开发软件时,一定要用特殊版本的编程语言、工具,确保它们与一起交付的操作系统有冲突。像疯子似的定 制你的Eclipse、VisualStudio或者vim环境,然后编写只能在你定制的环境下才能工作的宏或者脚本。不要制作硬盘镜像或者脚本以复制你 的开发环境,并且不要费劲巴拉写任何说明文档——这太直观啦。

创建一个精心制作的构建和部署环境

        把网站部署到一个测试或者产品服务器上的方法,应该看起来像这样:

svn up
git pull
hg pull

        程序员可以与简洁性和优雅作斗争,然后反过头构建精心制作的巴洛克式的构建和部署环境。这是一项不受控制的事,程序员可以在不面对客户的情况下,或 者项目经理不审查或者不理解的情况下完成,所以很容易失控。当你把八种不同的工具用不同的脚本语言链接起来时,记得不要写文档。

 

不要设置测试/分段平台

        修改产品系统是很令人兴奋地事。不要费劲巴拉的搭建测试/分段平台,相反要保留秘密登录入口和后门URL,以测试新的特性。把测试数据和真正的数据混合起来放到数据库中,

        既然你不使用版本控制软件,保存软件旧版本的副本,以防万一。不要把日志信息插入到代码中。在测试过程中,不要禁止传出电子邮件,信用卡授权信息等等。

从头编写所有模块

        不要费劲巴拉使用像Django、Rails或者CakePHP一样很容易理解的框架,你可以自己写一个更好的模板引擎,ORM,排序或者哈希算 法。每当我看到代码中诸如”比已有字典算法要快“或者”替换了PHP库函数,因为那些函数参数顺序太烂了“的注释时,我都忍不住的想弄死自己。

 

增加对特殊版本的库和资源的依赖

        尽可能的加入第三方代码,在你需要时链接尽可能多的共享库。我曾经见过依赖于很大的外部库文件只为了使用其中一个函数的代码。修改第三方库文件源代 码,这样就可以保证在有新版本出现时,那些第三方库就不会自动更新,但不要把你修改的版本置于版本控制中,我会用diff命令比对你的版本和最原始版本, 并发现其中不同的。

……但是不要保护或者编写依赖性说明文档

        因为更新和升级错误给我打紧急电话的,是所有工作电话中最多的。一个看似无害的WordPress升级,Linux包更新,或者新的jQuery发 布将会引发一系列的错误。不要让你的代码自动检查特定版本或者你修改的外部资源副本或者第三方库文件,甚至不要添加注释以提醒你自己。

 

使用一坨不同的编程语言,跟上潮流

        每天HackerNews和Reddit都会对一些新又酷的编程语言唧唧歪歪,在你为客户编写软件时就可以试用那些语言。任何牛逼的程序员都应该瞬 间学会一门编程语言,所以如果继续承接你代码的程序员是个菜鸟那不是你的问题。不同语言的边界、不兼容的API和数据格式、不同服务器配置需要等,都是很 有意思的挑战,把这些贴到SackOverflow秀一下也是怪牛逼的。我确实看到过PHP网页中嵌入Ruby代码,因为每个人都知道PHP烂透了而 Ruby好太多。半生不熟的项目,中止的Rails和Node.js项目,尤其是NoSQL解决方案(这个伸缩性更强)都是我的菜。

 

编程建议:

        你的代码是否是完美面向对象并闪闪发光的,这没什么鸟用。当程序员不得不维护一个遗留系统时,他们几乎总是看到意大利面条式的代码。我很擅长使用 diff、grep和ctags等工具追踪代码、重构、调试,我终究会搞明白你的代码。如果不使用版本控制软件、代码有太多依赖和定制、没有测试/分层平 台,那些最漂亮优雅的代码依然非常难搞。这就像在满是囤积物的房子里,找一个装饰漂亮、干净的房间一样,就算找到了,有啥鸟意思?


本文转载自:http://blog.jobbole.com/50168/

共有 人打赏支持
阿信sxq

阿信sxq

粉丝 214
博文 80
码字总数 70640
作品 1
成都
后端工程师
5 个常用的软件质量指标

在软件开发中,软件质量是衡量软件是否符合需求、标准的重要体现。除了代码质量外,影响软件整体质量的因素还有很多。因此,要确保软件的整体质量,就需要在各个环节严格控制。 本文列出了衡...

老先生二号 ⋅ 2017/08/01 ⋅ 0

App开发需要了解的基本技术

本文针对小白用户对App做一个简单的介绍,首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己的需求选择不同的App开发。 一 App有哪些形式 WebApp:简单来说,Web App...

duduo丶 ⋅ 2016/05/09 ⋅ 0

《怎样成为优秀的软件架构师》解析

近来读了一篇《怎样成为优秀的软件模型设计者》的文章,感触颇深。仔细对比分析,发现原来我自己和周围的软件开发人员平常的一些自认为对的做法,有很多是有问题的。 1.人远比技术重要 你开发...

青夜之衫 ⋅ 2017/12/06 ⋅ 0

Windows的爱与恨 不得不防的网络安全隐患

  日前,爆出一则猛料。韩国政府发表声明称,韩国政府预计会在2020年之前完全斩断对微软软件的依赖性,改用国产的开源软件。消息一出,人们纷纷讨论,韩国为什么怒气冲冲的要与微软Windows...

技术小美 ⋅ 2017/11/07 ⋅ 0

软件工程--软件危机

1.1软件危机 1.1.1软件危机的介绍 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是不能正常运行的软件才具有的,实际上,几乎所有软件都有不同程度地...

孟栋 ⋅ 2014/05/15 ⋅ 0

下面简要介绍软件工程的七条原理

软件工程介绍 自从1968年提出“软件工程”这一术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。美国著名的软件工程专家巴利·玻姆(Barry Boehm)综合这些专...

Amamatthew ⋅ 2014/09/11 ⋅ 0

决定将代码开源之前要确定的四个问题

在任何一家公司的开源部门中,最常见的任务之一是评估内部软件,确定它是否可以作为回馈社区的开源项目。我们在 PayPal 进行相关评估时发现回答下面四个问题对我们的审查潜在的开源软件的过程...

oschina ⋅ 2016/01/22 ⋅ 3

Netflix 试图通过开发者自治调和大规模 API

最近在Netflix公司的技术博客网站上,该公司的工程经理Katharina Probst和Justin Becker合作撰写了一篇博客,内容是关于如何在API环境中维持开发者自治的问题。这篇发布于2016年8月23日的博客...

达尔文 ⋅ 2016/09/15 ⋅ 0

软件开发需要的十三类文档

  在软件项目开发过程中,应该按软件开发要求撰写十三类文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性!   1、可行性分析报告   说明该软件开发项目的实现在...

lch001 ⋅ 2016/08/25 ⋅ 0

怎样成为优秀软件模型设计者

转自 ; heartstill 我们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢? 将下列原则应用到你的软件工程中,你会获得立杆见影的成果。 1. 人远比技术重要 你开发软...

Hycomer ⋅ 2012/01/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部