随笔-50  评论-724  文章-1  trackbacks-0
  置顶随笔
摘要: 一件产品的生命力一般不会很长,但产品所代表的理念可以无限延长。我希望一个开发框架也能够这样,一出来并没有枝叶茂盛,但它所在的理念能够保持长春。阅读全文
posted @ 2012-02-13 23:12 CoolCode 阅读(702) 评论(3) 编辑
  2012年2月14日
摘要: 阅读全文
posted @ 2012-02-14 11:17 CoolCode 阅读(1751) 评论(6) 编辑
  2012年2月13日
摘要: 一件产品的生命力一般不会很长,但产品所代表的理念可以无限延长。我希望一个开发框架也能够这样,一出来并没有枝叶茂盛,但它所在的理念能够保持长春。阅读全文
posted @ 2012-02-13 23:12 CoolCode 阅读(702) 评论(3) 编辑
  2011年6月16日

 

本文教你如何成为一名不合格的程序员,已经成为或即将成为或具有该潜质的童鞋可以看看,复习一下,也请不吝赐教。其他的认为一辈子都无法达到这种境界的童鞋,可以以此文作为茶余饭后的笑料。太棒了

 

1. 永远要两次跳进同一个坑里。

2. 让你的Leader重复他/她说过的话。

3. 每件事情只做好一半,但要跟Leader说:差不多了。

4. 永远不要对自己做过的事负责。

5. 要写出连自己都看不懂的代码,这样才显得自己与众不同。

6. 编码规范神马的都是浮云,哥的代码才是标准:变量名用abc,方法名大小写等都是即兴表演。

7. 不管什么问题绝对不要跟Leader说,以免他/她知道你的不足。

8. 你的编程知识已经可以应付一切项目了,啥学习或培训都不用啦,空余时间泡妞玩游戏已经够累啦。

9. 多犯一些低级错误,反正Leader也是闲着没事干,让他/她看看我的“杰作”刺激一下神经多好啊,不是吗?

10. 如果运气不好不小心参加了公司的开发培训,在课堂上左耳进右耳出就可以了,然后在开发过程中不断去提问吧。

11. 像神父传教一样多向周围的程序员宣传“技术无用论”。

12. 上班时间打打酱油,下班时间加加班,这是必须的!

13. 干完一项任务别告诉Leader,一旦让他/她知道就会分配其他任务来的。

14. 拿着一个锤子干活就足够了,其他神马的都是钉子而已。

15. 别去看人家的博客,甭管它有多优秀;买书籍?又不能当饭吃!等有问题,在论坛上发帖跪求就KO了。

16. 你不会写的代码都是因为Leader没有提供一个可以供你Copy的版本而已。

17. 提交一些不能编译的代码到代码服务器吧,很有趣的。

18. 注释是多余的。

19. 未来想做项目经理,所以不用学技术,开发前不用搞什么计划,开发后也不用总结。

20. 多信信什么什么哥之类的,他能让你原地复活,挂几次也不怕,就是不要常挂在一个公司上。吐舌笑脸

posted @ 2011-06-16 22:57 CoolCode 阅读(3184) 评论(48) 编辑
  2011年6月8日

大概两年前我写了篇《QueryBuilder : 打造优雅的Linq To SQL动态查询》,赢得不少厚爱,如今它还是我博客访问量最高的一篇(即使只有可怜的5500点击量,比一些大牛们少一位数)。时过境迁、岁月不饶人,当年得意之作现在看起来不值一文。收集一下朋友的反馈,主要有下列问题:

    1. 不支持 Entity Framework
    2. 不支持.Net 4
    3. Equals(c=>c.xx, null) 之前是被忽略掉,实际上应该解析成 c.xx is null。
    4. Between 没有考虑字符串的情况,例如 Between(c=>c.xx, ”A” , ”Z”) 则解析会报错。
    5. 部分不支持Nullable类型
    6. 其他没实现的功能:大于、小于、或…

 

——现在——

 

QueryBuilder已经发生翻天覆地的变化,但对于使用者来说,使用接口还是一成不变的,并且完全兼容上一版本。当然,它依旧是开源&免费的!

 

var queryBuilder = QueryBuilder.Create<Orders>()
    .Like(c => c.Customers.ContactName, txtCustomer.Text)
    .Like(c => c.Customers.CompanyName, txtCustomer.Text)
    .Between(c => c.OrderDate, DateTime.Parse(txtDateFrom.Text), DateTime.Parse(txtDateTo.Text))
    .Equals(c => c.EmployeeID, int.Parse(ddlEmployee.SelectedValue))
    .In(c => c.ShipCountry, selectedCountries);

 

技术分析

 

Lambda表达式的参数作用域

难点在于不同查询条件之间的参数作用域是相对独立的,如果直接使用 Expression.AndAlso来拼接是行不通的。

image

 

上一版本用Expression.Invoke解决,但Invoke在EF下不支持。

image

 

解决办法是改用 ExpressionVisitor,重写VisitParameter,返回新的参数表达式。

 

public class ParameterExpressionVisitor : ExpressionVisitor
{
    private ParameterExpression newParameterExpression;

    public ParameterExpressionVisitor(ParameterExpression p)
    {
        newParameterExpression = p;
    }

    public Expression ChangeParameter(Expression exp)
    {
        return Visit(exp);
    }

    protected override Expression VisitParameter(ParameterExpression p)
    {
        return newParameterExpression;
    }
}

 

也即是获取第一个Lambda表达式的参数,把后面的表达式用该参数替换。

 

private static Expression GetMemberExpression<T, P>(IQueryBuilder<T> q, Expression<Func<T, P>> property)
{
    if (q.Parameters == null || q.Parameters.Length == 0)
    {
        q.Parameters = property.GetParameters();
        return property.Body;
    }
     
    ParameterExpressionVisitor visitor =new ParameterExpressionVisitor(q.Parameters[0]);

    Expression memberExpr = visitor.ChangeParameter(property.Body);

    return memberExpr;
}

 

In操作

旧版本的In操作不支持EF,改成通过反射获取泛型方法。

 

……
       Expression<Func<P[], P, bool>> InExpression = (list, el) => list.Contains(el);
        var methodExp = InExpression;
        var invoke = Expression.Invoke(methodExp, constant, property.Body);
        Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(invoke, parameter);
……

其中有重载的泛型方法的获取比较麻烦,大家可以观摩一下代码,看看有无好建议。

 

//var method = typeof(Enumerable).GetMethod("Contains");  //因为有重载,这样获取不到
private static MethodInfo method_Contains =
                (from m in typeof(Enumerable).GetMethods()
                 where m.Name.Equals("Contains")
                     && m.IsGenericMethod
                     && m.GetGenericArguments().Length == 1
                     && m.GetParameters().Length == 2
                 select m
                ).First();

 

Like操作

旧版本的Like操作使用SqlMethods.Like,也不支持EF。新版本改成字符串的Contains。

typeof(string).GetMethod("Contains", new Type[] { typeof(string) })

 

Between操作

旧版本的Between不支持字符串,例如 Between(c=>c.xx, ”A” , ”Z”) 则解析会报错。新版本增加新的扩展方法单独处理字符串的情况。

Between<T>(this IQueryBuilder<T> q, Expression<Func<T, string>> property, string from, string to)

 

 

小结

很难得两年写的东东在今时今日还能保持原有接口不变并成功重构啊,已经激动到内牛满面&裸奔ing…

源代码下载 CoolCode.Linq.V2.rar

 

参考

http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html

posted @ 2011-06-08 21:58 CoolCode 阅读(2436) 评论(29) 编辑
  2011年5月17日

 

客户

小霸王(闺女的别称),出生10天。

原始需求

为小霸王换纸尿片。

需求细化

换纸尿片,擦干净屁股,不能着凉,舒服。

客户满意度

小霸王不哭,屁股要干净。

项目角色

在前几个项目,我都是担任助理工程师,如在换尿片项目中端水、拿垃圾桶等细活。但由于参与整个项目过程,慢慢领会项目各阶段的奥秘,立马晋升成项目经理,现已成功实施3个项目经验,也是客户满意度最高的几个。

约束条件

小霸王怕冻;不懂技术语言,只会发3个音——咿呀哇。无法把握客户需求有一部分原因是,当她哇哇叫时,是要换尿片呢还是要喝奶呢。因为对于客户看来,换尿片和喝奶都是同一样东西,因此她表达都一样,需要不断细化才能准确把握真正的需求点。

项目风险

预估项目风险有利于降低项目风险。换尿片的风险其一是小霸王容易着凉,会导致整个项目失败,是最高风险;其二是换纸尿片时,小霸王的黄金可能会漏出来,导致项目成本增加——拖地。

项目启动会

小霸王叫了,确认换尿片角色——我担任项目经理,兼项目实施;小霸王妈妈担任高级换尿片工程师。

团队激励

换纸尿片项目是客户面前最关注的一个项目,成功实施会向全省BB推广。

项目估算

工作量:2人8分钟;资源:2人、取暖器、爽身粉、盆子、暖水、垃圾桶、纸尿片、毛巾、手帕(擦屁股用)。专家评估法:关羽阿妈评估5分钟、刘备阿妈评估9分钟、张飞阿妈评估10分钟,最后汇总得出结果是8分钟。

需求分析

小霸王怕冷,要关好窗户,开取暖器以防着凉。擦屁股在保证擦干净的前提下,力度得适中,擦的舒服。

技术准备

准备取暖器、爽身粉、暖水、垃圾桶、纸尿片,关好窗户,并精通尿片使用指南。

项目设计

关窗,取暖器温度适中,暖水接近体温。脱小霸王的裤子、原纸尿片放入垃圾桶,用暖水擦屁股,用毛巾擦干,刷爽身粉,换上新的纸尿片,穿裤子,关暖气、开窗,清理现场。

项目实施

按设计流程和要求实施,并增加环节:在整个换尿片过程,用各种办法分散小霸王的注意力。如果实施过程不合客户的要求,她会发飙,哇哇乱叫——老爸!你手脚还不快点,想要我的小命是不?!

团队协作

小霸王妈妈抽掉旧尿片后,反馈并说明可以进行擦屁股流程。

客户验收

小霸王愉快地睡觉。

项目总结

这个换尿片项目等到客户的一致好评,准确把握客户需求,成功控制取暖器的温度和擦屁股的力度。

过程改进

降低成本,如在保证小霸王舒适度的前提下减少纸尿片的支出;提高效率:减少换尿片的时间。

团队建设

提高团队协作能力,换纸尿片各环节的配合;提高工作效率,快速地帮小霸王宽衣穿衣。

知识库管理

项目成员总结项目经验并且文档化,启动新成员。如本文。

产品化

出书《高效换尿片的45个习惯》、《走出换尿片的作坊》,开发换尿片机器人等。

 

温馨提示

暂无小孩的朋友等将来有小孩后再来看这篇文章会更有意思。

感想

今日换纸尿片突发奇想,激发项目管理的灵感,兴高采烈,赶紧磨墨写文,存此流芳百世。

posted @ 2011-05-17 01:54 CoolCode 阅读(2055) 评论(16) 编辑
  2011年5月13日
摘要: 几乎每种行业都有基层主管(或基层管理人员),而软件行业的基层主管一般是项目经理、技术经理、开发经理、组长等。其职责是资源协调、风险预估、项目管控、团队建设,说白一点大多数的企业现状就是项目负责人带领团队攻下一个又一个项目的过程。很多公司以项目成败作为项目负责人考核的唯一标准,因为项目规模、成本、客户满意度等容易量化,并且是直接跟公司的利润有很大关系;而相反团队建设却难以衡量,如何衡量一个普通技工晋...阅读全文
posted @ 2011-05-13 01:27 CoolCode 阅读(3011) 评论(35) 编辑
  2011年3月15日
摘要: 目前公司挺缺人才,其实一直都缺。一个多星期下来,我面试了不少开发人员,他们的表现实在不敢恭维。想起一年前这个时候,作为应聘者的我再怎么逊也不至于这样,一年前的面试故事请猛击这里。 作为初入职场,特别是对于刚踏入社会的热血青年,其实很希望,即使是得到那么一丁点的指引,也足以让他们少奋斗一段历程。作为过来人,我为那些工作一两年仍然停留学生阶段的朋友感到惋惜,与其勉强为了专业对口而从事自己不擅长的工作,倒不如索性转行来得痛快。 下面总结面试者和面试官两者应该具备的基本要求—— 面试者应该了解 1. 笔试题做得好,不代表什么;但做不好,往往给面试官第一印象就不太好。即使卷面不合格,也不用妄自菲薄,因.阅读全文
posted @ 2011-03-15 22:45 CoolCode 阅读(3200) 评论(23) 编辑
  2010年11月7日
摘要: 今天广州天气阳光明媚,我很高兴能参加“敏捷全球之旅”的讲座,亲临Scrum大师Vernon Stinebaker(中文名:史文林)的精彩演讲。趁着身上尚有敏捷的“余温”,记录一下今天的体会。 Vernon Stinebaker 的背景 博克软件杭州的技术与架构总监。他是目前国内仅有的两位Scrum联盟的认证Scrum培训师(CST)之一,具有资格通过培训颁发CSM及CSPO认证。 Vernon 能...阅读全文
posted @ 2010-11-07 23:11 CoolCode 阅读(1180) 评论(0) 编辑
  2010年7月26日
摘要: jstree 本文基于 jsTree 1.0-rc1 版本增加节点的双击事件。 jsTree 是基于jquery的树插件,支持拖放、复制、删除、快捷键、多选、自定义节点图标、自定义右键菜单、跨页面保存状态等等,总之我想到的它基本上都有了,而且最值得表扬的是它让人感觉一点都不慢哦。 jsTree有节点选择事件,即其实我认为它更像是节点的单击事件,因为每次点节点的时候它都会触发,不管之前该节点是否已经...阅读全文
posted @ 2010-07-26 19:59 CoolCode 阅读(2413) 评论(2) 编辑
  2010年7月18日
摘要: 传说中的dynamic dynamic是个不合群、不按规则办事的家伙,可以说是个异形,但更恐怖的是它又是无所不知的,任何事情都难不了它(咳咳,它似乎与Lambda表达式是死对头)。这令人想起《死亡日记》的怪异侦探L,行为怪异而智力超人,以至于离奇的案件不得不交给了他。dynamic可以看成是一切类型的化身,但并不是仅限于此,它像《未来战士》续集里面的T-1000型液体金属的终结者。噢~~~~似乎扯...阅读全文
posted @ 2010-07-18 17:46 CoolCode 阅读(3817) 评论(29) 编辑
仅列出标题  下一页