工程师忽略的隐形成本

原文地址(source):http://www.theeffectiveengineer.com/blog/hidden-costs-that-engineers-ignore

原文作者:Edmond Lau

有时候我们说,“实现这个功能,我只花了几个小时”。但是完成之后,我们发现每隔几周,我们要么在修复该功能的bug、向另一个工程师解释,要么做客服回答问题、以解释其工作原理。维护该功能总的投入时间要远远超过最初开发的几个小时。

软件开发中内化的最艰难教训之一就是额外复杂度所带来的隐形成本。有时候,复杂度在问题领域只是固有的。为了匹配乘客和司机,通过调整价格来平衡供求是一个复杂和痛苦的问题。因此,在扩大一个社区和维护社区质量的时候,把问题和答案疏通到喜欢回答和看问题的人们那里,也是如此。或者像是开发一个兼容所有设备的富文档编辑器以支持实时协作。这是固有的复杂度,我们需要根据产品做出调整以取得成功。

但是其它时候,和我们较劲的复杂度恰恰是我们自己产生的复杂度。我们用新编程语言写代码,很少人了解它,现在我们不得不维护它。或者我们增加了额外的基础架构,因为我们尝试从Hacker News看到的、热门新技术,但是它失败了,这是我们当初没有想到的。或者我们引入了一个很少人使用的功能,但是修复和bug报告就花掉了极不对称的大把时间。

额外的复杂度暴露了很多隐形成本。在开发软件时,我们所做的决定不只是决定了我们当前的开发速度。它们还要反映出我们花在维护上的时间和努力程度。

复杂度的隐形成本

太多复杂度增加了认知负荷,并产生了做完事情的额外阻力。它以很多不同的方式渗入到团队里——大部分是直接渗入到代码、系统和产品复杂度里,但是间接地渗入到了组织的复杂度里。我们逐个看看这几种不同类型复杂度的隐形成本。

代码复杂度

代码复杂度不只是随着代码行数的线性函数而增长——它组合式地增长。在复杂的代码库里,每行代码可能与其它很多行代码交互和影响。我们对于组合式增长难以有足够的认识,这就是为什么我们倾向于严重低估完成大型软件项目所需要的时间。这也是重写项目有时候会大幅延期的主要原因。

当代码过于复杂的时候,它将变得难以扩展、难以理清其中缘由、难以修复bug,很难理清追踪错误来源的依赖和数据流向。工程师或许会积极地避免代码库最复杂的部分,即使它是可以做某种修改的、最有逻辑的地方,也要选择绕弯来解决。他们或许避免把那些地方都组合起来,即使这项工作有着很大的影响。

系统复杂度

...

决定成功与否的中心轮子

原文地址(source):https://queue.acm.org/detail.cfm?id=2559901

非我所创”【注1】综合症不是IT界独有的。

HealthCare.gov的网站最初由平价医疗法案【注2】启动,创建网站的成本有五亿美元,当我第一次看到该声明时,我不敢相信这个数字。做一个网站是不可能花这么钱的。但是实际数字貌似不是低于一个数量级,正如我对报告的理解,对于性能、功能或总体质量,该网站没有要展示的太多东西。

这很难成为IT界独有的经历。事实上,它更像是定律而非意外。

在丹麦,我们绝不是没有受影响:POLSAG,是丹麦警察的一套新的案件管理系统,投入了一亿美元,没有什么有用的东西可展示,之后就被废弃了。我们很快排除了因为政治家要求了错误的系统、已经不能胜任和/或贪婪的公司乐于强制的这些种类的错误。虽然这可能是事实的一部分,但是它不够充分。

对IT界的传统反应是,下一个大事件(the Next Big Thing)会处理好,下一个大事件拥有一些列、不计其数的概念,比如高级语言、结构化编程、关系型数据库、SQL、第四代语言、面向对象编程、敏捷方法论等等令人作呕的东东。没有哪样技术在IT项目的成功/失败率上有着明显的不同,我认为这是客观的。很明显,它们让我们开发更大的项目,但是实际的成功/失败率貌似非常相等。

同时,有一些令人惊奇的成功案例,一群大学生用他们的Google信息评分算法改变了我们对于信息获取的思考方式,或者一群朋友用他们的Twitter信息分发系统改变了我们交流的方式。

姑且不论政客的崇高言论,为什么政府的IT应用程序从来不会出现这种情况?很明显,我们错过了什么、做错了什么,甚至都没有去思考。这种特定的错误相当普遍,它应该就是所谓的“知识经济”。

独轮手推车的教训

[caption id=”attachment_1477” align=”alignnone”...

怎样重定向网页

原文地址(source):http://css-tricks.com/redirect-web-page/

网页重定向是指,当网页访问某个特定的URL的时候,它变成了一个不同的URL。例如,一个人在浏览器里访问“website.com/page-a”,他们却被重定向到“website.com/page-b”。如果我们想把某个页面重定向到一个新的地址、修改网站的URL结构、移除URL中“www.”的部分、甚至把用户完全重定向到另一个网站(在此不一一列举),那么这是非常有用的。

假如我们想迁移网站,并关闭旧网站。然而,我们不想让旧网站上的所有网页都出现可怕的“404 Not Found”。这些旧链接就需要重定向到新网站上的同样内容。

举个例子:我们想让old-website.com/blog/post重定向到new-website.com/blog/post,所有其它的posts都是使用相同的URL格式。如果我们的重定向能反馈给搜索引擎,说这个变化是永久的,便于它们相应地更新索引,就太好了。

我们该怎么操作呢?在此之前,我们需要学习一点儿HTTP知识。

HTTP响应码

每当我们输入一个URL或从浏览器发出请求时,我们都正在使用超文本传输协议(HTTP)。虽然它在科幻的警察电影里像是个非常酷的名字,但是,它实际上是我们请求服务器上CSS、HTML和图片之类的资源的过程。在我们发送请求之后,这些资源会给出响应,类似“嘿,我在这里,来了!”(响应码是 HTTP 200 OK)。有很多不同种类的HTTP响应码,最熟悉的可能是 404 Not...