技术债务,是指匆忙的实现一个功能,却对现有的程序库造成了破坏(在实现的过程中污染了代码库的设计),这对于一些项目经理/客户来说就像是天书奇谈。也许他们是明白的,只是不愿意承认罢了,我估计是这样的。不管怎样,我想起来一个小故事,当下次遇到这种情况,需要向他们解释增加某些新功能的代价时,也可用讲这个故事给他们听。
技术债务
如何杀死一头龙
有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
下面是各种语言如何想办法将公主从巨龙手中营救出来的。
如果老婆和女朋友她们是程序
去年,我的一位朋友和他的 GirlFriend 6.0 升级到 Wife 1.0 (也就是他们步入婚姻殿堂了)。婚后他发现,结婚就是只留给其他应用少量系统资源,自己却狂占内存的进程。老婆还要生成子进程(Child Processes),子进程会在将来消耗更多的资源。虽然产品说明书或手册里没有提及这种现象,但大家都知道这些都源于自然规律。
开发与研发
这几天我一直在写这篇东西,本来是胸有成竹,没想到后来越写越发现自己在这个题目下有太多话想说,而以我现在的能力又不能很好地概括总结,以至于越写越长,文章结构也变得混乱,到后来修改的时候每次都要考虑好久才能下笔,所以决定拆成两部分来发,以便阅读。这篇写得我心力交瘁,质量不算好,凑合着看吧。
直接插入排序
将待排序列看做左右两个子序列,左子序列有序。则一趟直接插入的排序过程为:对于右侧序列的第一个记录,在左侧有序序列中找到一个合适的位置,插入。从后向前查找合适的位置,同时向后移动记录。
直接选择排序
将待排序列看成左右两个子序列,左子序列是有序的,右子序列是无序的,并且左序列中最大关键字(在左序列的最右边)小于右序列的最小关键字。排序的过程为:定义某个变量i指向最大关键字的下一个位置,在右序列中找到最小关键字k,将i和k交换。
Linux:黑客传说
今年,Linux 迎来了它的20岁生日。据称从4月开始,全球各地都在筹划着如何庆祝这一生日。但到底哪一天才是这款史上惟一可与Windows比肩的电脑操作系统确切的 诞生之日,众说纷纭 ,有人说是1991年8月25日发明者本人李纳斯·托沃兹(Linus Torvalds)宣布项目启动那天,还有人认为应该是1991年10月5日Linux Kernel 0.02发布之日。“教父”本人在今年4月接受采访时倒是提出了4个有意义的日子:7月3日、8月25日、9月17日、10月5日,并且说,“哪天都可以”。看来,要给Linux一个不漏地过生日,得需要4个生日蛋糕!
一个优秀的提交应该包含什么
首先我们来听一个令人恶心的例子。
你看到问题 F00-123 被解决了。这是关于一个你自己很熟悉的子系统的Bug,所以直觉告诉你造成这个Bug最可能的原因。为了证实你的怀疑,你决定看看这个bug是怎么被解决的。你花了很长时间搜索了整个版本历史,直到把这个bugfix的范围缩小到了4个连续的提交,它们分别的提交信息是:dao小调整(dao tweaks)、moar、Fixes, 还有删除一些调试信息(remove debug stuff)。每个提交的修改集看起来都很大,多达十几个文件的几百处修改。“我艹尼@#$%%^&”,你准备骂娘但还是停住了,没有骂出你脑中那句最难听的粗口。”这个bugfix不应该超过三行代码!”。
胡言乱语之LINK、DEFINE、DECLARE、EXTERN、STATIC
最早的C是没有声明的,只有定义,声明主要是提供给连接器(link)用的,现在好像C编译器也用到声明。(这句话我不太确定,你当作耳旁风好了)
定义就是给出一个函数的明确功能,比如:
优质代码的十诫
DRY: Don’t repeat yourself.
DRY 是一个最简单的法则,也是最容易被理解的。但它也可能是最难被应用的(因为要做到这样,我们需要在泛型设计上做相当的努力,这并不是一件容易的事)。它意味着,当我们在两个或多个地方的时候发现一些相似的代码的时候,我们需要把他们的共性抽象出来形一个唯一的新方法,并且改变现有的地方的代码让他们以一些合适的参数调用这个新的方法。