如何开发不可维护的软件?

标签: 开发 软件 | 发表时间:2013-10-24 22:03 | 作者:
出处:http://news.cnblogs.com/

    英文原文:  Greg Jorgensen

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

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

本文链接

相关 [开发 软件] 推荐:

软件吞噬软件开发

- - PingWest中文网
软件蚕食世界,自互联网特别是移动互联网连接线上线下服务后,已成为不可逆的趋势. 每一项实用的服务可以由小团队来完成. 以WhatsApp为例,这款被高调收购的IM应用,拥有4.5亿月活跃用户,70%的日活跃率,至今还保持每天新增用户1000万的速度. 但这些服务居然由32名工程师支撑下来了,所以有了业界八卦“每位员工价值20亿”的说法.

软件开发的核心

- - 博客园_知识库
  「我们一直这样做开发,时间做久了,便忘了当初的本意.   有关软件系统开发,我们谈些什么.   我们谈过程,编码规范、开发流程、同行评审、结对编程、持续集成,从瀑布到敏捷再到极限编程.   我们谈架构,企业级、J2EE、容器化、SOA(面向服务架构)、Microservices(微服务化).   我们谈规模,大容量、高并发、大数据.

开发软件有多贵

- - 透明思考
有个朋友的朋友想做一个公益的事. 因为出资的都是教育水平较高的精英人士,所以对项目的监控透明度要求比较高. 于是这个朋友的朋友就想了,信息时代嘛,IT工具不是可以促进交流提升效率么. 于是他对我说:我们想做个app,可以干这个这个这个……. 我打断他说,别着急,做软件很贵的,你不一定玩得起. 市场上定制开发软件的人工成本按一人月20,000人民币来算,平均每人天1,000人民币.

Facebook是如何开发软件的

- Felix - 互联网的那点事
Facebook的工作方式让我着迷. 那是一个非常独特的工作氛围,无法复制(也并不适用于其它公司). 下面的是我从很多在Facebook工作的朋友那里搜集到的关于这个公司如何开发和发布软件的只言片语. 看起来对Facebook感兴趣的大有人在. 这个公司以程序员为主导的企业文化受到人们的极大关注,很多公司都在努力现实这样的企业文化.

软件开发的“三重门”

- - 酷壳 - CoolShell.cn
自从上次写了“ 程序员技术练级攻略” 以来,就觉得似乎还有很多东西没有谈到,但当时没有继续思考了. 而春节前有人问我,是做底层技术,还是做业务. 这问题让我思考了很多,不由自主地回顾了一 下我这十多年的软件开发经历,并顺着整理分类了一下自己解决过的若干问题,还发散想了很多,经过了一个春节假期的发酵,产生了下面这篇文章.

软件开发的人文关怀

- - 博客园_知识库
  几年前,我从温伯格的《技术领导之路》中学到一点:技术人员往往更喜欢和机器打交道,因为他们“认为”自己更适合和机器打交道;但是,优秀的技术人员必须(也必然)具备好的沟通能力. 所以,温伯格鼓励各位技术人员多加练习和其他人打交道的能力. 温伯格的这个观点我是非常赞成的,好的技术人员一定需要“勇敢”面对他人,不能被“自实现的预言”局限在机器的世界里.

软件开发中的两种态度

- - 外刊IT评论网
一种态度认为,应该对程序员在软件开发中的行为进行约束( DirectingAttitude). 持这种态度的人认为大部分的程序员水平都不高(谣传说有50%的人低于平均水平),所以应该对他们所做的事情进行管教约束. 要防止他们做一些可能会给他们正在开发的系统带来危害的事情. 通常,这种态度体现在一些系统设计和工具中时,你会发现它们会试图阻止程序员去做某些事情,限制程序员的一些做法,以此避免他们陷入过于复杂的境况.

软件开发的人文关怀

- - 极客公园-GeekPark
我是极客公园黑板报认证值日生. [核心提示]软件可以没有活力,而软件开发却不能没有活力;程序可以像机器一样,程序员却不能像机器一样. 要改变这种状态,就应当增添更多的人文关怀,把开发人员当成活生生的人,而不是视为程序或者工具. 编辑注记:本文来自余晟的博客 乱象,印记. 作者从自己的经验出发,提出了一些给软件开发人员提供人文关怀的可行措施.

软件开发模型综述

- - CSDN博客推荐文章
                     软件开发模型概述. 最早出现的软件开发模型是1970年W·Royce提出的瀑布模型. 软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架. 软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段.

防火长城内的软件开发

- - Solidot
对于软件开发者来说,防火长城不只是屏蔽网站过滤流量这么简单——它是痛苦之源,尤其是如果你想开发针对中国市场之外的软件或想利用广泛使用的服务和软件库的话. 上海聊天机器人创业公司Rikai Labs的创始人DC Collier认为,中国的软件开发者写代码的时候一只手是绑在背后的. 防火长城的屏蔽范围日益扩大,这意味着越来越多的服务被永久性或不定期的屏蔽.