摘要:缓存在系统设计中占有非常重要的地位。对于构建大型系统,缓存的使用非常重要。一般,缓存的目的都是为了将那些耗时又耗资源的东西,临时的保存在一个能够快速获取的地方,以此来减少资源的消耗,让我们可以更快的得到那些东西。简单的情况,比如我们可以把从数据库里取到的数据放到一个hashtable中,比如以sql为条件。在一定时间内,只要去数据库里取一次,然后就可以重复利用多次。这是个非常简单的缓存利用场景。但是随着系统规模的增长,这种缓存机制就慢慢的不足以应付我们的需求。因为hashtable的这种方式,决定着这个hashtable肯定是与我们的应用放到同一个进程的。如果系统规模大了,我们可能要部署多个应 阅读全文
assertThat, assertEquals, assertTrue
2011-09-03 13:27 by 横刀天笑, 26481 阅读, 3 推荐, 收藏, 编辑
摘要:昨天晚上是AgileChina 2011的Open House活动,我是Coding环节的志愿者。Coding环节主要是想让参会的开发人员体验一下结对编程、测试驱动开发以及重构的过程。我们准备了四个不同类型的编程题目,公司会有八九位同事和参会的同行一起来体验这个过程在最后一轮Pair当中,一位同学问到:为什么不使用assertEquals呢?我看到你们都是在用assertThat,好像不怎么提倡用assertEquals和assertTrue等。
当时因为活动快结束了,我们要去拍合照,所以简单的回答了一下。这里再详细回答一下这个问题。 阅读全文
简单设计
2011-08-31 08:10 by 横刀天笑, 5809 阅读, 6 推荐, 收藏, 编辑
摘要:XP(极限编程)里除了大名鼎鼎的TDD,重构等最佳实践外还有一些不怎么被人注意的实践,比如本文想谈的简单设计(Simple Design)。
我们常常说设计要简单,简单即美。甚至敏捷软件开发的四个要素(沟通、反馈、简单、勇气)简单也位于其中。那到底什么是XP开发者眼中所认为的简单呢?
在Kent Beck所著的《解析极限编程》里对简单设计有四条“简单”的描述,通常也被大家称为简单设计四原则 阅读全文
给Cuke4Duke添加一个AfterAll标签(一):使用Cuke4Duke
2011-08-31 07:08 by 横刀天笑, 2679 阅读, 0 推荐, 收藏, 编辑
摘要:我们团队使用的Cucumber作为我们的功能测试框架。Cucumber是一种BDD(Behaviour driven development)测试框架。感兴趣的读者可以去Cucumber的官网了解BDD和该框架更详细的信息:点击这里。在这里我就不详细描述了。 那么这和本文要说的Cuke4Duke有什么关系呢?实际上Cucumber是ruby编写的,原生的也只对ruby编写测试提供支持。而Cuke... 阅读全文
做Java开发这一年
2011-06-28 11:57 by 横刀天笑, 73332 阅读, 57 推荐, 收藏, 编辑
摘要:从去年到现在,从.NET转向Java开发(只是因为项目原因,绝对与平台好坏没有关系)差不多有一年的时间了。通过这一年时间也有些感触,想从几个面比较一下这两个平台。希望能做到客观公正。 阅读全文
自动垃圾回收学习笔记-垃圾回收算法
2011-05-28 15:06 by 横刀天笑, 6172 阅读, 6 推荐, 收藏, 编辑
摘要:既然是自动垃圾回收,那么平台肯定得采取一种方式发现垃圾,然后清除。这就是垃圾收集算法所关注的问题。垃圾收集算法的任务就是将活动的对象和已经死掉的对象分别出来,然后将死掉的对象的内存回收,而且为了更好的利用内存,有的算法还会对内存碎片进行压缩。下面会对常用的垃圾收集算法进行介绍 阅读全文
自动垃圾回收学习笔记-我们为什么需要自动垃圾回收
2011-05-21 12:57 by 横刀天笑, 2055 阅读, 1 推荐, 收藏, 编辑
摘要:现代的虚拟运行时平台基本上都提供了垃圾回收的机制,其实垃圾回收是一个非常古老的技术,可以追溯到Lisp。 那么为什么要使用垃圾回收呢?这个要和显式的内存分配和释放相比较。我们或多或少的接触过或学习过这样的代码: 1: struct Node{ 2: ElementType Element; 3: Node* Next; 4: } 5: 6: Node* node = malloc(sizeof(Node)); 7: 8: //do something 9: 10: free(node);这里的malloc和free就是程序员显式的从堆上分配内存和释放不再使用的内存,将其归还给堆。这种让程序员控 阅读全文
自动垃圾回收学习笔记-一些基本概念
2011-05-21 12:53 by 横刀天笑, 1874 阅读, 1 推荐, 收藏, 编辑
摘要:栈和堆 首先要明确的是,这里所说的栈和堆与数据结构里所说的Stack和Heap不是一个概念。当然,这里的栈和堆的表现形式或实现形式跟数据结构里的Stack和Heap可能是一模一样。 栈 栈是跟线程相关的。比如在Windows平台上,默认情况下,你创建一个线程会给你1MB的内存空间当做栈(对于Native Code来说这1MB是按需提交的,而对于Managed Code来说是创建线程的时候就提交)。这1MB一般来说会用来干这么几件事儿: 线程执行方法时传递参数,方法的局部变量,方法的返回地址等都会保存在这个栈上。 对于线程执行的每个方法都会在这个栈上占一帧,这就是所谓的栈帧。随着线程的执行,栈就 阅读全文
C#’s ~ vs Java’s finalize
2011-05-14 10:50 by 横刀天笑, 1547 阅读, 0 推荐, 收藏, 编辑
摘要:本文是上周写一个功能测试时,期望在测试结束时,利用Java的析构函数来关闭浏览器发现的问题,当然,这种方式是不建议采用的。因为我的背景是.NET开发,因此对Java的析构函数产生了误解。 作为一个C# Programer我们都知道,垃圾回收会帮我们回收托管资源,但那些非托管资源(比如文件句柄,数据库连接)垃圾回收是不会帮我们回收的,所以我们必须显式的回收这些资源。比如很多使用了非托管资源的类型都实现了Dispose方法,他们期望使用这些类型的开发人员能够显式的去调用这个方法来释放非托管资源,不过如果你没有显式调用那不就产生资源泄露了?别怕,还有最后的安全屏障:终结方法(不过终结方法会带来其他很 阅读全文
页面片段缓存(二)
2011-05-08 09:44 by 横刀天笑, 5142 阅读, 2 推荐, 收藏, 编辑
摘要:在上一篇文章中,我介绍了我们用土法炼钢的方法,使用Velocity提供的自定义标签实现片段缓存。这样的方式虽然也解决了我们的问题,但还是引出了一些bug。而且还有点hack的味道(虽然我喜欢hack)。实际上对于片段缓存,业界有成熟的解决方案,还有一个所谓的W3C标准:ESI(Edge Side Include) 阅读全文