estimation只是一个开始,不是结束.好的estimation不是developer估的好,还要靠BA大人们来管理scope,不然就算developer牛成马了,estimation还是一坨.
相对于给出一个精确的绝对值来说,维护内在的相对关系更重要,一致性为王.
story写得不好,再estimate也是枉费功夫.
不要总是关注story的大小,把一些story加起来构成一个完整feature的大小也很重要.对于客户来说,他们往往关注在feature级别.
一个feature的大小,往往还取决于BA对它写了多少了个story.
没有"一天"的story,请慎用最乐观的情况 ...
这个例子很老啦,在之前的Domain Model的争论中被广泛引用(参见:http://www.javaeye.com/topic/11712)。我再来炒炒冷饭。
这个Domain可以简化为这样:
public class Item {
private Set<Bid> bids = new HashSet<Bid>();
}
public class Bid {
private User bidder;
private int amount;
}
现在我们要添加一个行为叫placeBid。于是我们可以写出如下的贫血代码:
...
好老的话题啦。拿出来炒炒冷饭。各位见谅。
——————————————————————
Domain Model贫血是说属于Domain Model的逻辑没有放在Domain Model中。那是哪些逻辑没有放到Domain Model中,从而导致贫血一说呢?原因有很多,但是我认为最主要是Service中的那些逻辑。而这些逻辑又有一个共同的特点就是依赖于DAO,或者说需要查询数据库。Robbin的帖子:http://www.javaeye.com/topic/57075,举了一个很好的例子。我取其中的一个部分在这里做演示用。
public class Employee {
pri ...
Windows
Win32 API (pywinauto, autoit)
MS Accessbility (?)
UI Automation (eft, white)
In CLR object model (Sharprobo)
WEB
In browser DOM, Using frame (Selenium)
In browser DOM, Using proxy (Sahi)
Out browser DOM, Using specific browser pluggin (Watir)
Java
In JVM object model/java.awt.Robot (abbot) ...
Pain Point 1: XAML always create the controls by its default constructor
This means, you need to have a default constructor for you control, and the constructor will always be used by XAML. So, you can not use constructor dependency injection to pass things like services, gateways to your control. ...
Lesson 1: trust it
Everything could cause problem. There is no API could be really stable. Even it is stable itself, the interop and version difference or mis-use could cause problems as well.
Lesson 2: rely on 3rd party vendor
Add-in express is causing lots of troubles. Should be no feature rely ...
Outlook的对象模型中,很多对象都有一个MAPIOBJECT属性。这个属性可以用来获得对应的MAPI对象。最简单的应用可能就是取得MailItem上的一些额外属性,比如取得Attachment的ContentId。
要正确使用这个属性不容易。首先,不要在进程外取得属性的值,也就是说不能用Office Automation来启动Outlook,必须是在AddIn中取值。用伪代码,示例如下:
Marshal.GetIUnknownForObject(attachment.MAPIOBJECT)
Marshal.QueryInterface(pUnk, ref IID_IMAPIProp, ...
有三个主要的障碍:
1、服务器解析不到客户端的assembly,因为callback的代码在客户端的assembly中
2、TypeFilterLevel默认不是Full
3、普通callback代码不能访问客户端的变量,因为不是serializable的
解决办法:
1、利用AppDomain的AssemblyResolve事件,让自己来处理assembly的查找逻辑。并且让客户端在开始的时候把自己的assembly位置发给服务器。
2、
BinaryServerFormatterSinkProvider serverFormatter = new BinaryServerFormat ...
让控件更灵活的Data Template
GridViewColumn gvcName = new GridViewColumn();
gvcName.Header = "Name";
DataTemplate nameTemplate = new DataTemplate();
FrameworkElementFactory nameFactory = new FrameworkElementFactory(typeof(ContactPropertyLabel));
...
这是被测的应用程序:
应用.NET 3.0提供的UIAutomation,我们可以用以下步骤来进行测试:
1. 启动应用程序
string path = @"The Path To The Application";
Process process = Process.Start(path);
2. 获得主窗口对应的AutomationElement
Thread.Sleep(1000);
AutomationElement aeMainWindow = AutomationElement.FromHandle(process.MainWindowHandle) ...
今天早上一时兴起,去网上下载下来JMock,EasyMock最新版本来玩玩。用来测试的行为很简单。就是有一个窗体,上面有一个文本框,一个按钮。如果点击按钮,就会把文本框的内容设置为“Hello”。应用MVP模式,这个行为应该在Presenter中,而View接口应该是这样的:
public interface View {
public void setText(String text);
public void addActionListener(ActionListener actionListener);
}
我这里就不TDD了,直接给出Presenter的实现,然 ...
引言
最近杂七杂八地思考了不少东西。但是很惊异地发现这三三两两的杂思竟然彼此互相联系。隐隐地道出了一个共同的主题。这个主题就是重构。修饰词是被动的。
主动重构就是我们所熟悉的重构。比如说在Eclipse中按下Shift+Alt+R,出现一个对话框提示你输入新的名字,然后Eclipse把要改名的类或者方法本身改名,以及所有对这个名字的引用都改成新的。那么什么是被动重构呢?
所谓被动重构就是你不直接告诉你所使用的工具,你要做重构。相反,是由工具来检测到你做了什么改动。其余的都基本一样。比如就上面这个例子,如果用被动重构来做的话,就是在改名之前check一次,然后你来改名字,改完之后再chec ...
ajoo同学的酒窝有.NET版本啦!
项目主页:
http://dotnet.dimple.googlepages.com/home
存在意义:
快速制作测试用的stub。手工继承,mock框架之外的第三种选择。
简单使用:
public class StubDbCommand
{
public object ExecuteScalar()
{
return "Hello";
}
public static DbCommand N ...
二进制文件和源代码可以从这里下载到:
http://naive.container.googlepages.com/home
存在的意义:
最简单原始的组件装配
使用:
public class Susan : ContainerBound
{
public void FallInLove()
{
Console.WriteLine("Susan has fallen in love with " + Get<Boy>().Name);
}
}
public class ...
创建对象有很多种方式,可以用工厂,可以用容器装配。所以不在乎再多一种啦。。。在C#上写了一种古怪的创建对象的方式,给大家kk。
首先,这是配置代码。意思是说在Lily的宇宙中(每个人都有一个小宇宙,圣斗士。。。),她的Boy是tom,也就是我的眼中只有你。相应的在Lucy的眼中只有joy。
Tom tom = Void.GiveMe<Tom>();
Joy joy = Void.GiveMe<Joy>();
Void.UniverseOf<Lily>().Exist(tom);
Void.UniverseOf<Lucy>().Exist(joy);
然 ...
谁动了我的assembly?
你有没有曾经把.NET的用对象变成过COM对象?你有没有用过.NET Remoting?那你有没有两者同时用呢?如果你有,可能你也遇过同一个问题。.NET抱怨说,找不到要序列化的Assembly。因为COM对象被执行的时候,其所处的位置是宿主的位置,而不是Assembly所在的位置了。由于Binary Formatter查询Assembly的一个小问题,导致了这个错误信息。在MSDN论坛上抄来如下代码,解决了问题:
private static Assembly CurrentDomain_AssemblyResolve(object send ...
微软在Smart Document技术中第一次引入了Task Pane这个自定义的可能。但是由于Smart Document需要XML Expansion Pack,所以部署会比较麻烦一点。而且Smart Document是基于COM技术的,并且其上也只能放一些标准的控件,所以使用的人也许并不多。
后来的Visual Studio Tools for Office 2005(VSTO2)中包括了一个叫做Actions Pane的技术。该技术就是基于Smart Document的Task Pane来实现的。应用了Actions Pane的Code Behind Document都会attach上 ...
我要讲的这个“茴”字是什么呢?其实是excel的用户自定义函数(udf)。
excel从4.0开始提供了第一种添加udf的方式:XLL。这个本质上是一个DLL。但是只要这个DLL暴露了excel规定的一些函数,并暴露出来,再把xll注册到excel就能让excel把你写的udf添加进去了。
后来excel又支持了vba。这个时候臭名远扬的“宏”就出现了。在excel中,用vba写的sub(没有返回值的函数)被称作宏,而function(有返回值的函数)可以被用作udf。所以“茴”字的第二种写法是vba。一个变种是把vba做成XLA文件,然后注册。包装成XLA之后,就可以把udf分发了,不然则和 ...
我很不喜欢中国大学中的程序设计入门课程的教学方式。那完全是填鸭式的。上来就是一些难懂晦涩的概念。学生在学习过程中抓的是细枝末节,根本没法体会为什么要学习程序设计,学习无动力且充满挫折感。这不是我个人的感受,但是我相信这是大部分在大学才接受程序设计的入门教育的同学的感受。
与我有相同观点的不少同志,开始了探索的道路。一个明显的流派是对一本书的推崇。这本书是MIT出版的 “Structure and Interpretation of Computer Programs”,简称SICP。毋庸置疑,这是一本相当好的书,对于函数式程序设计,乃至整个程序设计领域的方方面面的问题都有高屋建瓴又深入浅出的 ...
下面是一段从selenium rc 的官方网站的文档中摘抄出来的代码:
import com.thoughtworks.selenium.*;
import junit.framework.*;
public class GoogleTest extends TestCase {
private Selenium sel;
public void setUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http://www.google.co ...
嗯,俺就是和静态类型干上了。这次实现了两个东西,Mixin和Service Locator。代码说话:
public interface Kisser {
void kissYourKissable();
}
public interface Kissable {
void kiss();
}
public class Boy implements Kissable {
public void kiss() {
System.out.println("kiss");
}
}
public abstract class KisserMixi ...
实验了以下内容:高阶函数,Currying,Lazy Evaluation,无穷流,Monad。都是很基本的东西。实现也是基于内部类的。没啥是了不起的。只是在给Lazy Evaluation造语法糖的时候,用了一下bytecode动态增强。给Lazy函数的lambda定义内部的所有的局部变量的读取操作前加了Lazy Evaluation过程。
private final static F<Boolean> TRUE = $(true);
private final static F<Integer> ONE = $(1);
private final static F&l ...
最近跟强类型干上了,呵呵。拿JAVA5的语法和CGLIB小试了一把,试验成果如下:
public abstract class DemoPage implements XHTMLToolkit {
public Element content(String pageTitle) {
return html(xmlns("http://www.w3.org/1999/xhtml")).$(
head().$(
title(pageTitle)
),
body().$(
table()
)
);
}
pub ...
这几天潜心研究了一下Hibernate, Spring, ASM, Java5 Instrumentation。 恩,大概列出了这些技术来,明眼人就知道我要干啥了。没错,万恶的元编程,我最痛恨的元编程要登场了。我痛恨元编程,是因为我认为它的能力超越了人类大脑的范围。但是,Java想要在语法上能有超越,唯一的办法就是元编程了。在Java中做元编程有两种方式:
1、操作字节码
比如 AspectJ
2、用动态派生的类替换基类
比如 Spring AOP,Hibernate的Lazy Loading
后者能够达到的能力基本上已经被利用尽了。我感觉,要想突围,不妨就像AspectJ一样,走到字节码这个 ...
100%的测试覆盖率
这是一个很显而易见的答案。但是我不认为这是正确的答案。下面是一个小例子:
private int[] map = new int[] {
1, 3, 5, 8};
public int oddNumber(int index) {
return map[index - 1];
}
写一个简单的测试
@Test
public void first_odd_number_should_be_one() {
assertEquals(1, oddNumber(1));
}
这个测试是不是覆盖了100%的代码呢?我认为是覆盖了的。但是是不 ...
- 浏览: 81552 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
step2
共 6 张
共 6 张
最近加入圈子
最新评论
-
汉语编程,有搞头
就E语言算巴 没用过也没计划用 CHTML不错哈哈
-- by lwwin -
关于estimation的闲言碎语
1. BA是Business Analyst的缩写,就是写story的人.2. ...
-- by taowen -
关于estimation的闲言碎语
请教:1.BA是什么意思?Business Analyzer?2.“好的esti ...
-- by movingboy -
计划经济体制的CMM,市场 ...
有创意,有启发性。顶!!
-- by estest -
贫血的Domain Model
看了这么久的领域模型,争论的真是没完没了。 难道就不能跳开这个领域模型或者还领域 ...
-- by hunter001201






评论排行榜