<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_CoolCode</title><subtitle type="text">编程的艺术世界曾经是一个只懂得绘画艺术的我,如今追求编程的艺术.</subtitle><id>http://feed.cnblogs.com/blog/u/50790/rss</id><updated>2012-05-29T04:26:19Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/50790/rss"/><entry><id>http://www.cnblogs.com/coolcode/archive/2012/05/29/Bingocloud.html</id><title type="text">从设计思想看BingoCloud[转载]</title><summary type="text">我一直以为，要想用好一个产品，一定要理解好这个产品的核心思想，就像当年在南航的OA，一个流程能够真正覆盖整个南航的使用，而且不仅能让一个庞大的体系每个人都觉得不是太复杂，而且在一切变化的过程中也能很容易的适应，这就是设计师，从产品到实施的深刻体会。</summary><published>2012-05-29T02:01:00Z</published><updated>2012-05-29T02:01:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2012/05/29/Bingocloud.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2012/05/29/Bingocloud.html"/><content type="html">&lt;p&gt;原文链接：&lt;a title="http://blog.sina.com.cn/s/blog_85db449101010sln.html" href="http://blog.sina.com.cn/s/blog_85db449101010sln.html"&gt;http://blog.sina.com.cn/s/blog_85db449101010sln.html&lt;/a&gt; &lt;p&gt;我一直以为，要想用好一个产品，一定要理解好这个产品的核心思想，就像当年在南航的OA，一个流程能够真正覆盖整个南航的使用，而且不仅能让一个庞大的体系每个人都觉得不是太复杂，而且在一切变化的过程中也能很容易的适应，这就是设计师，从产品到实施的深刻体会。而再往后，随着对工作流引擎的不断复杂化，以及对用户需求的不断妥协，最后，复杂的惨不忍睹。 &lt;p&gt;那么云平台呢？ &lt;p&gt;一直觉得BingoCloud是一个真正的云平台产品，好过VCloud。当然很多人可能要反对，没关系，这只是品高人在对自己产品充分了解后的自信。 &lt;p&gt;VMWare是从下往上搭的，它有无与伦比的虚拟化引擎，在虚拟化的世界里，它太强大了。支持各种客户端、支持各种机型、支持各种终端、满足着全世界客户带个虚拟环境到处跑的需求，在这十多年的发展中，它还增加了集中的管理、监控，把管理员的各种要求都放了进去。因此，从系统管理员角度，基本无法突破，无法抗拒。但是，它是云吗？ &lt;p&gt;云不是Vmware提出来的了，Vmware只是在云发展到一定阶段才追过去的，而且，它并不是重新规划了一个产品，而是加了几个新的服务器产品，跟原有的客户端通讯后，似乎达到了云的功能。但是为什么不彻底研发一个云产品呢？因为它不懂？它习惯了产业合作要照顾合作伙伴？还是有历史包袱？我不知道！那么看看BingoCloud的思想吧。 &lt;p&gt;BingoCloud使用虚拟化引擎：Xen、KVM不重要，关键是能够稳定可靠运行，经过Amazon等公有云的使用，大概全世界没有人再怀疑开源虚拟化引擎的稳定性。另外一个更加重要的是，不能靠植入，来获得虚拟机内的信息，比如内存信息等，否则，客户完全可以质疑你是否植入了一个不安全代码！VMware走在前面，是一个例外，但是我们不能。所以，VMware只能做技术提供商，如果它真的做运营商，我们敢把系统放在它上面吗？ &lt;p&gt;如果说Vmware做了一个完美的管理员超级工具来管理大量服务器，那么BingoCloud是希望做一个Matrix，一个母体、一个公平公正的云中决策者，我们认为真正的云平台就是一个Matrix。让我们从使用者的角度来看看，他们各自是怎么工作的。 &lt;p&gt;1、Vmware创建一个虚拟机的时候，管理员通常会指定在哪台服务器上，创建一个多大的虚拟机（核、内存、硬盘），当你觉得不够，只要硬件条件具备，可以直接升级。BingoCloud呢？开始，我们要告诉云平台，我们准备给5种规格，小规模是1核2G，中规模是X核XG......然后我们说创建一个中等规模的虚拟机，要改变怎么办？哦，太麻烦了，它居然不能随便直接改，居然要告诉云平台我要改成哪个规模，然后云平台可能需要找到一个位置（或许是本机也或许是新的），再重新生成一遍。是的，你再想想，如果有个Matrix，是不是要这样？如果我们都直接操作了，自己调内存、调cpu，恐怕Matrix就糊涂了。 &lt;p&gt;2、VMware的管理员一定觉得很爽，他们有很好的监控工具，看着每个物理机、虚拟机的使用状态、变化状态，BingoCloud也有一些，但是我们希望他们用不着，因为我们听说，Amazon一个管理员要管理1000个机柜，我们相信他们肯定不会去盯着那些使用状态看，没有问题，看来干嘛？我们相信VMware的使用效率一定很高，因为机器的智商肯定没有人高，当管理员看到，这台物理机虽然已经使用了15个核，还剩1个核，但是我们看到那15个核一般都用的很少，我们聪明的人类，还可以再给他们分配2个核。但是BingoCloud不给，Matrix不会骗人，除非你事先告诉她，我们可以超售，我们把16个核，当成17个核来卖。但是，我们不保证，如果大家用的很满，会不会影响效果？ &lt;p&gt;3、Vmware的管理员拥有无上的权力，他们过去的习惯是要管理每一个虚拟机，而BingoCloud说，管理员的工作不应该太多，他们仅仅管理配额就行了。因此，BingoCloud不断的告诉客户，你需要的是自助服务平台。什么是自助服务平台？不是管理员的，是使用者的。她更简单、更易用。虚拟机不是管理员管的，是自助服务平台的用户用的。因此，BingoCloud才能做公有云，因为，管理员没有那么大的权限，用户花了钱，就是这个资源的绝对拥有者。 &lt;p&gt;4、VMware确实是个很强大的公司，他们跟EMC共享存储、跟思科整合网络，所有这些公司，都把跟VMware的整合作为一个重要的战略方向，但是，1、用得起吗？2、用起来方便吗？3、一定要吗？BingoCloud说，不用的，如果这么用了，还谈什么云计算是第四次产业革命？还谈什么云计算是廉价？BingoCloud说，有了我，不用EMC了，我有云存贮，不用网络管理了，我自己带了VLan的管理。甚至不用F5了，在虚拟化环境中，如果你想用F5做均衡负载，那可是非常之昂贵的选择哦。唯一的问题是，都要用BingoCloud来管理平台。 &lt;p&gt;5、VMware足够强大，强大到所有的方案都有合作伙伴，但是唯一的问题是，谁懂得把这么复杂的环境整合在一起。然而，Amazon告诉我们，其实一切皆有解决之道，比如，用CloudWatch和AutoScale两个服务就可以完成弹性的功能，自助增加、减少计算能力，当然，有了Beanstalk和CloudFormation才能真正做到软件的弹性，不要一切都想着各种商业产品的整合。不断增加的服务，足以让一个企业完成所有SOA的需求。这才是架构师的魔力，这才是第四次产业革命。于是，BingoCloud不断的往上发展，实现了CloudWatch、实现了AutoScale，实现了Beastalk、CloudFormation，甚至实现了RDS，对数据库的弹性、弹性MapReduce，对大数据的弹性，凡是对软件的支撑有作用的，BingoCloud都一点一点实现了。 &lt;p&gt;如果你仅仅把BingoCloud当成虚拟化，OK，没有问题，我们也可以做。但是，迟早有一天，你会发现，你多么需要一个Matrix！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2523508.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2012/05/29/Bingocloud.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2012/02/14/ease_easy_mvc1_helloworld.html</id><title type="text">Ease &amp;amp; Easy ASP.NET MVC 开发框架(1) Hello World</title><summary type="text"/><published>2012-02-14T03:17:00Z</published><updated>2012-02-14T03:17:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2012/02/14/ease_easy_mvc1_helloworld.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2012/02/14/ease_easy_mvc1_helloworld.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;本文介绍Ease&amp;amp;Easy开发框架如何简单搭建应用系统，通过Html.Grid的例子向大家逐步展示（如下图）。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100006327361.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/20120210000641794.png" width="677" height="411"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;1. 新建一个asp.net mvc项目，起名EaseEasy-Demo。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100006528329.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007066750.png" width="680" height="435"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;2. 通过NuGet获取Ease&amp;amp;Easy开发框架包。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007083044.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007122950.png" width="354" height="243"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;3. 搜索“CoolCode”可看到有3个package。下载CoolCode.ServiceModel即可，它包含其他两个组件（CoolCode.Core和CoolCode.Web.Mvc）。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007206350.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007343866.png" width="699" height="450"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;4. 新建EF实体和DbContext，用于测试框架的Grid控件。 &lt;/p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DemoContext &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;DbContext &lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DbSet&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Blog&lt;/span&gt;&amp;gt; Blogs { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color: blue"&gt;public static void &lt;/span&gt;SetInitializer() {&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Database&lt;/span&gt;.SetInitializer(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DemoContextInitializer&lt;/span&gt;());&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DemoContextInitializer &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;DropCreateDatabaseIfModelChanges&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;DemoContext&lt;/span&gt;&amp;gt; {&lt;br/&gt;        &lt;span style="color: blue"&gt;protected override void &lt;/span&gt;Seed(&lt;span style="color: #2b91af"&gt;DemoContext &lt;/span&gt;context) {&lt;br/&gt;            &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; 102; i++) {&lt;br/&gt;                context.Blogs.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Blog &lt;/span&gt;{&lt;br/&gt;                     Title = &lt;span style="color: #a31515"&gt;"MVC 框架"&lt;/span&gt;+i,&lt;br/&gt;                     Author = &lt;span style="color: #a31515"&gt;"Bruce Lee"&lt;br/&gt;                &lt;/span&gt;});&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Blog &lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Title { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Author { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;5.Application_Start方法调用 DemoContext.SetInitializer();&lt;/p&gt;&lt;p&gt;6.Web.config 配置数据库连接字符串DemoContext。&lt;/p&gt;    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;DemoContext&lt;/span&gt;" &lt;span style="color: red"&gt;connectionString&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Data Source=.; Initial Catalog=EaseEasyDemo;User ID=sa;Password=xx;Persist Security Info=true&lt;/span&gt;" &lt;span style="color: red"&gt;providerName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Data.SqlClient&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt; &lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;7.添加Controller，命名为DemoController。添加Action，返回IQueryable&amp;lt;&amp;gt; 类型数据源。&lt;/p&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;Index() {&lt;br/&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;db = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DemoContext&lt;/span&gt;(); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;View(db.Blogs);&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;8.添加View，命名为Index.cshtml。Html.Grid会根据Model生成表格，默认支持分页。&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;link &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="&lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;Url.Content(&lt;/span&gt;&lt;span style="color: #a31515"&gt;"~/Content/EaseEasy.css"&lt;/span&gt;&lt;span style="color: blue"&gt;)" &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="stylesheet" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/css" /&amp;gt;&lt;br/&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;EaseEasy: Hello World!&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: yellow"&gt;@(&lt;br/&gt;&lt;/span&gt; Html.Grid&amp;lt;Blog&amp;gt;().Columns(c =&amp;gt; {&lt;br/&gt;     c.Column(x&lt;font color="#c0504d"&gt;=&amp;gt;x.Id&lt;/font&gt;).Width(102).Sortable(&lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;br/&gt;     c.Column(x&lt;font color="#c0504d"&gt;=&amp;gt;x.Title&lt;/font&gt;).Width(102).Header(&lt;span style="color: #a31515"&gt;"标题"&lt;/span&gt;).Sortable(&lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;br/&gt;     c.Column(x&lt;font color="#c0504d"&gt;=&amp;gt;x.Author&lt;/font&gt;).Width(102).Header(&lt;span style="color: #a31515"&gt;"作者"&lt;/span&gt;).Sortable(&lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;br/&gt; })&lt;br/&gt; .IsAjax(&lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br/&gt;&lt;span style="background: yellow"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;p&gt;9.添加样式表及相应图片就大功告成了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007356756.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/20120210000737575.png" width="226" height="170"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;10.编译，运行 &amp;amp; Good Luck！&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007448303.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100007534211.png" width="674" height="409"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;相关代码：&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/downloads/coolcode/free/demo-1-HelloWorld.zip"&gt;&lt;font style="font-weight: normal" size="2"&gt;demo-1-HelloWorld.zip&lt;/font&gt;&lt;/a&gt;&lt;font style="font-weight: normal" size="2"&gt; — 开发示例 Hello World&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="https://github.com/coolcode/free/tree/gh-pages/demo" href="https://github.com/coolcode/free/tree/gh-pages/demo"&gt;https://github.com/coolcode/free/tree/gh-pages/demo&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2350178.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2012/02/14/ease_easy_mvc1_helloworld.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2012/02/13/ease_easy.html</id><title type="text">Ease &amp;amp; Easy ASP.NET MVC 开发框架</title><summary type="text">一件产品的生命力一般不会很长，但产品所代表的理念可以无限延长。我希望一个开发框架也能够这样，一出来并没有枝叶茂盛，但它所在的理念能够保持长春。</summary><published>2012-02-13T15:12:00Z</published><updated>2012-02-13T15:12:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2012/02/13/ease_easy.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2012/02/13/ease_easy.html"/><content type="html">&lt;p&gt;曾几何时，我构思中的开发框架就像是航空母舰，海陆空全能型。但它庞大，无边无际，并非一般人可驾奴的。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132251338934.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132253032871.png" width="883" height="576"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;后来，经过无数的尝试、失败、跌倒、爬滚、站立、再尝试……周而复始的尝试之后，终于如白雪公主吻到了青蛙王子那样，让我见识了诸多影响世人的产品——iPhone，iPad，Facebook，Twitter。它们各自的诞生都有各自不同的传奇故事，也为各自不同的理念成长，但它们有一个共同点——&lt;strong&gt;&lt;font size="3"&gt;Ease &amp;amp; Easy&lt;/font&gt;&lt;/strong&gt;。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100049162621.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100049201348.png" width="214" height="161"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100049492434.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100049578865.png" width="307" height="197"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100050079432.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100050105028.png" width="205" height="157"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100050555323.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202100051026639.png" width="183" height="155"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Ease&lt;/font&gt;&lt;/strong&gt;——舒适、悠闲、自在、放松。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/20120213225333816.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132253532157.png" width="660" height="245"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;Easy&lt;/strong&gt;&lt;/font&gt;——容易、简单就是美。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132254204440.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132254313054.png" width="295" height="237"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;一件产品的生命力一般不会很长，但产品所代表的理念可以无限延长。我希望一个开发框架也能够这样，一出来并没有枝叶茂盛，但它所在的理念能够保持长春。&lt;/p&gt; &lt;p&gt;Ease &amp;amp; Easy ASP.NET MVC 开发框架最早原型始于2009年，从MVC1.0、2.0一直到3.0，虽然它一路成长并跟着时代发展甚至日渐精益求精，但框架基本上都是从来未与公众见过面。终于在2012的春节期间茅厕顿开，好产品必须能够经历大众的批评及指导，也只有大众的推动才能铸造伟大的产品。&lt;/p&gt; &lt;p&gt;于是乎，我把这个半成品（可以美其名曰框架，也可以称之为一坨组件或代码集中营）放到大名鼎鼎的开源网站GitHub。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132254442871.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132254539336.png" width="782" height="419"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;而组件的发布我采用了NuGet的方式，便于安装及版本升级，你通过VS即可搜索到。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132255127729.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132255237805.png" width="782" height="419"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Ease &amp;amp; Easy ASP.NET MVC&lt;/font&gt;&lt;/strong&gt; 开发框架依赖于下列开源框架组成，但除了ASP.NET MVC以外，其他依赖并不是强制性的。&lt;/p&gt; &lt;p&gt;&lt;img src="http://img.ddvip.com/2008_10_06/1223280543_ddvip_9992.jpg" width="453" height="262"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/2012021322554450.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132255497514.png" width="191" height="244"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132255576944.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256028585.png" width="355" height="215"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256272131.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256282754.png" width="244" height="59"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256318657.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256329595.png" width="244" height="96"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256368006.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256365008.png" width="168" height="79"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;另外，Ease &amp;amp; Easy “猎取”了很多牛人的智慧及代码——&lt;a href="http://haacked.com" target="_blank"&gt;Haacked&lt;/a&gt;，&lt;a href="http://www.hanselman.com" target="_blank"&gt;Hanselman&lt;/a&gt;，&lt;a href="http://jeffreyzhao.cnblogs.com/" target="_blank"&gt;Jeffrey Zhao&lt;/a&gt;，&lt;a href="http://www.dotnetage.com" target="_blank"&gt;dotnetage&lt;/a&gt; ……sorry，我已经记不住这么多了。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256427554.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256452029.png" width="244" height="83"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132256586239.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257036485.png" width="244" height="227"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257047423.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257059191.png" width="244" height="47"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257083392.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257107527.png" width="244" height="107"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Enjoy yourself！&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257281328.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="thinking in ease and easy" border="0" alt="thinking in ease and easy" src="http://images.cnblogs.com/cnblogs_com/coolcode/201202/201202132257504752.png" width="949" height="643"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;相关链接&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;开源地址：&lt;a title="https://github.com/coolcode/free/" href="https://github.com/coolcode/free/"&gt;https://github.com/coolcode/free/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;NuGet：&lt;a title="http://nuget.org/packages?q=coolcode&amp;amp;sortOrder=package-download-count" href="http://nuget.org/packages?q=coolcode&amp;amp;sortOrder=package-download-count"&gt;http://nuget.org/packages?q=coolcode&amp;amp;sortOrder=package-download-count&lt;/a&gt;&lt;/p&gt; &lt;p&gt;开发文档：&lt;a href="http://www.cnblogs.com/coolcode/category/354398.html"&gt;http://www.cnblogs.com/coolcode/category/354398.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2350174.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2012/02/13/ease_easy.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2011/06/16/godhorse_programmer.html</id><title type="text">教你如何成为一名不合格的程序员</title><summary type="text">本文教你如何成为一名不合格的程序员，已经成为或即将成为或具有该潜质的童鞋可以看看，复习一下，也请不吝赐教。其他的认为一辈子都无法达到这种境界的童鞋，可以以此文作为茶余饭后的笑料。1. 永远要两次跳进同一个坑里。2. 让你的Leader重复他/她说过的话。</summary><published>2011-06-16T14:57:00Z</published><updated>2011-06-16T14:57:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2011/06/16/godhorse_programmer.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2011/06/16/godhorse_programmer.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;本文教你如何成为一名不合格的程序员，已经成为或即将成为或具有该潜质的童鞋可以看看，复习一下，也请不吝赐教。其他的认为一辈子都无法达到这种境界的童鞋，可以以此文作为茶余饭后的笑料。&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-thumbsup" alt="太棒了" src="http://images.cnblogs.com/cnblogs_com/coolcode/201106/201106162256338348.png"&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;1. 永远要两次跳进同一个坑里。&lt;/p&gt; &lt;p&gt;2. 让你的Leader重复他/她说过的话。&lt;/p&gt; &lt;p&gt;3. 每件事情只做好一半，但要跟Leader说：差不多了。&lt;/p&gt; &lt;p&gt;4. 永远不要对自己做过的事负责。&lt;/p&gt; &lt;p&gt;5. 要写出连自己都看不懂的代码，这样才显得自己与众不同。&lt;/p&gt; &lt;p&gt;6. 编码规范神马的都是浮云，哥的代码才是标准：变量名用abc，方法名大小写等都是即兴表演。&lt;/p&gt; &lt;p&gt;7. 不管什么问题绝对不要跟Leader说，以免他/她知道你的不足。&lt;/p&gt; &lt;p&gt;8. 你的编程知识已经可以应付一切项目了，啥学习或培训都不用啦，空余时间泡妞玩游戏已经够累啦。&lt;/p&gt; &lt;p&gt;9. 多犯一些低级错误，反正Leader也是闲着没事干，让他/她看看我的“杰作”刺激一下神经多好啊，不是吗？&lt;/p&gt; &lt;p&gt;10. 如果运气不好不小心参加了公司的开发培训，在课堂上左耳进右耳出就可以了，然后在开发过程中不断去提问吧。&lt;/p&gt; &lt;p&gt;11. 像神父传教一样多向周围的程序员宣传“技术无用论”。&lt;/p&gt; &lt;p&gt;12. 上班时间打打酱油，下班时间加加班，这是必须的！&lt;/p&gt; &lt;p&gt;13. 干完一项任务别告诉Leader，一旦让他/她知道就会分配其他任务来的。&lt;/p&gt; &lt;p&gt;14. 拿着一个锤子干活就足够了，其他神马的都是钉子而已。&lt;/p&gt; &lt;p&gt;15. 别去看人家的博客，甭管它有多优秀；买书籍？又不能当饭吃！等有问题，在论坛上发帖跪求就KO了。&lt;/p&gt; &lt;p&gt;16. 你不会写的代码都是因为Leader没有提供一个可以供你Copy的版本而已。&lt;/p&gt; &lt;p&gt;17. 提交一些不能编译的代码到代码服务器吧，很有趣的。&lt;/p&gt; &lt;p&gt;18. 注释是多余的。&lt;/p&gt; &lt;p&gt;19. 未来想做项目经理，所以不用学技术，开发前不用搞什么计划，开发后也不用总结。&lt;/p&gt; &lt;p&gt;20. 多信信什么什么哥之类的，他能让你原地复活，挂几次也不怕，就是不要常挂在一个公司上。&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smilewithtongueout" alt="吐舌笑脸" src="http://images.cnblogs.com/cnblogs_com/coolcode/201106/201106162256339776.png"&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2083164.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2011/06/16/godhorse_programmer.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2011/06/08/IQueryBuilder_v2.html</id><title type="text">QueryBuilder ： 打造优雅的Linq To SQL动态查询(支持EF、.Net4)</title><summary type="text">大概两年前我写了篇《QueryBuilder ： 打造优雅的Linq To SQL动态查询》，赢得不少厚爱，如今它还是我博客访问量最高的一篇（即使只有可怜的5500点击量，比一些大牛们少一位数）。时过境迁、岁月不饶人，当年得意之作现在看起来不值一文。收集一下朋友的反馈，主要有下列问题：不支持 Entity Framework不支持.Net 4Equals(c=&gt;c.xx, null) 之前是被忽略掉，实际上应该解析成 c.xx is null。Between 没有考虑字符串的情况，例如 Between(c=&gt;c.xx, ”A” , ”Z”) 则解析会报错。部分不支持Nullable类型其他没实现的功能：大于、小于、或…——现在——QueryBuilder已经发生翻天覆地的变化，但对于使用者来说，使用接口还是一成不变的，并且完全兼容上一版本。当然，它依旧是开源&amp;免费的！</summary><published>2011-06-08T13:58:00Z</published><updated>2011-06-08T13:58:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2011/06/08/IQueryBuilder_v2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2011/06/08/IQueryBuilder_v2.html"/><content type="html">&lt;p&gt;大概两年前我写了篇《&lt;a href="http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html" target="_blank"&gt;QueryBuilder ： 打造优雅的Linq To SQL动态查询&lt;/a&gt;》，赢得不少厚爱，如今它还是我博客访问量最高的一篇（即使只有可怜的5500点击量，比一些大牛们少一位数）。时过境迁、岁月不饶人，当年得意之作现在看起来不值一文。收集一下朋友的反馈，主要有下列问题：&lt;/p&gt; &lt;ol&gt; &lt;ol&gt; &lt;li&gt;不支持 Entity Framework&lt;/li&gt; &lt;li&gt;不支持.Net 4&lt;/li&gt; &lt;li&gt;Equals(c=&amp;gt;c.xx, null) 之前是被忽略掉，实际上应该解析成 c.xx is null。&lt;/li&gt; &lt;li&gt;Between 没有考虑字符串的情况，例如 Between(c=&amp;gt;c.xx, ”A” , ”Z”) 则解析会报错。&lt;/li&gt; &lt;li&gt;部分不支持Nullable类型&lt;/li&gt; &lt;li&gt;其他没实现的功能：大于、小于、或…&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;——现在——&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;QueryBuilder已经发生翻天覆地的变化，但对于使用者来说，使用接口还是一成不变的，并且完全兼容上一版本。当然，它依旧是开源&amp;amp;免费的！&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;queryBuilder = &lt;span style="color: #2b91af"&gt;QueryBuilder&lt;/span&gt;.Create&amp;lt;&lt;span style="color: #2b91af"&gt;Orders&lt;/span&gt;&amp;gt;()&lt;br/&gt;    .Like(c =&amp;gt; c.Customers.ContactName, txtCustomer.Text)&lt;br/&gt;    .Like(c =&amp;gt; c.Customers.CompanyName, txtCustomer.Text)&lt;br/&gt;    .Between(c =&amp;gt; c.OrderDate, &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Parse(txtDateFrom.Text), &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Parse(txtDateTo.Text))&lt;br/&gt;    .Equals(c =&amp;gt; c.EmployeeID, &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(ddlEmployee.SelectedValue))&lt;span style="color: green"&gt;&lt;br/&gt;    &lt;/span&gt;.In(c =&amp;gt; c.ShipCountry, selectedCountries);&lt;br/&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;技术分析&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Lambda表达式的参数作用域&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;难点在于不同查询条件之间的参数作用域是相对独立的，如果直接使用 Expression.AndAlso来拼接是行不通的。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201106/201106082150089216.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201106/201106082150148588.png" width="776" height="100"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上一版本用Expression.Invoke解决，但Invoke在EF下不支持。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/201106/201106082150166471.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/201106/201106082150254467.png" width="949" height="177"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;解决办法是改用 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expressionvisitor.aspx" target="_blank"&gt;ExpressionVisitor&lt;/a&gt;，重写VisitParameter，返回新的参数表达式。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ParameterExpressionVisitor &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ExpressionVisitor&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ParameterExpression &lt;/span&gt;newParameterExpression;&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;public &lt;/span&gt;ParameterExpressionVisitor(&lt;span style="color: #2b91af"&gt;ParameterExpression &lt;/span&gt;p)&lt;br/&gt;    {&lt;br/&gt;        newParameterExpression = p;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;ChangeParameter(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;exp)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;return &lt;/span&gt;Visit(exp);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;VisitParameter(&lt;span style="color: #2b91af"&gt;ParameterExpression &lt;/span&gt;p)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;return &lt;/span&gt;newParameterExpression;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;也即是获取第一个Lambda表达式的参数，把后面的表达式用该参数替换。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;GetMemberExpression&amp;lt;T, P&amp;gt;(&lt;span style="color: #2b91af"&gt;IQueryBuilder&lt;/span&gt;&amp;lt;T&amp;gt; q, &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, P&amp;gt;&amp;gt; property)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(q.Parameters == &lt;span style="color: blue"&gt;null &lt;/span&gt;|| q.Parameters.Length == 0)&lt;br/&gt;    {&lt;br/&gt;        q.Parameters = property.GetParameters();&lt;br/&gt;        &lt;span style="color: blue"&gt;return &lt;/span&gt;property.Body;&lt;br/&gt;    }&lt;br/&gt;     &lt;br/&gt;    &lt;span style="color: #2b91af"&gt;ParameterExpressionVisitor &lt;/span&gt;visitor =&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ParameterExpressionVisitor&lt;/span&gt;(q.Parameters[0]);&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;memberExpr = visitor.ChangeParameter(property.Body);&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;memberExpr;&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;旧版本的In操作不支持EF，改成通过反射获取泛型方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;……&lt;br/&gt;       &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;P[], P, &lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; InExpression = (list, el) =&amp;gt; list.Contains(el);&lt;br/&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;methodExp = InExpression;&lt;br/&gt;       &lt;strike&gt; &lt;span style="color: blue"&gt;var &lt;/span&gt;invoke = &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;.Invoke(methodExp, constant, property.Body);&lt;/strike&gt;&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; lambda = &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;.Lambda&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt;(invoke, parameter);&lt;br/&gt;……&lt;br/&gt;&lt;p&gt;其中有重载的泛型方法的获取比较麻烦，大家可以观摩一下代码，看看有无好建议。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: green"&gt;//var method = typeof(Enumerable).GetMethod("Contains");  //因为有重载，这样获取不到&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodInfo &lt;/span&gt;method_Contains =&lt;br/&gt;                (&lt;span style="color: blue"&gt;from &lt;/span&gt;m &lt;span style="color: blue"&gt;in typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Enumerable&lt;/span&gt;).GetMethods()&lt;br/&gt;                 &lt;span style="color: blue"&gt;where &lt;/span&gt;m.Name.Equals(&lt;span style="color: #a31515"&gt;"Contains"&lt;/span&gt;)&lt;br/&gt;                     &amp;amp;&amp;amp; m.IsGenericMethod&lt;br/&gt;                     &amp;amp;&amp;amp; m.GetGenericArguments().Length == 1&lt;br/&gt;                     &amp;amp;&amp;amp; m.GetParameters().Length == 2&lt;br/&gt;                 &lt;span style="color: blue"&gt;select &lt;/span&gt;m&lt;br/&gt;                ).First();&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Like操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;旧版本的Like操作使用SqlMethods.Like，也不支持EF。新版本改成字符串的Contains。&lt;/p&gt;&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;).GetMethod(&lt;span style="color: #a31515"&gt;"Contains"&lt;/span&gt;, &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;[] { &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;) })&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Between操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;旧版本的Between不支持字符串，例如 Between(c=&amp;gt;c.xx, ”A” , ”Z”) 则解析会报错。新版本增加新的扩展方法单独处理字符串的情况。&lt;/p&gt;Between&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IQueryBuilder&lt;/span&gt;&amp;lt;T&amp;gt; q, &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; property, &lt;span style="color: blue"&gt;string &lt;/span&gt;from, &lt;span style="color: blue"&gt;string &lt;/span&gt;to)&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很难得两年写的东东在今时今日还能保持原有接口不变并成功重构啊，已经激动到内牛满面&amp;amp;裸奔ing…&lt;/p&gt;&lt;p&gt;源代码下载 &lt;a href="http://files.cnblogs.com/coolcode/CoolCode.Linq.V2.rar"&gt;CoolCode.Linq.V2.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html" href="http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html"&gt;http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2075749.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2011/06/08/IQueryBuilder_v2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2011/05/17/from_baby_to_project_management.html</id><title type="text">从换纸尿片到项目管理</title><summary type="text">温馨提示暂无小孩的朋友等将来有小孩后再来看这篇文章会更有意思。感想今日换纸尿片突发奇想，激发项目管理的灵感，兴高采烈，赶紧磨墨写文，存此流芳百世。</summary><published>2011-05-16T17:54:00Z</published><updated>2011-05-16T17:54:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2011/05/17/from_baby_to_project_management.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2011/05/17/from_baby_to_project_management.html"/><content type="html">&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.jiangkang365.cn/uploadfile/200905/8/00115426486.jpg" width="400" height="345"&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;客户&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王（闺女的别称），出生10天。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;原始需求&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;为小霸王换纸尿片。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;需求细化&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;换纸尿片，擦干净屁股，不能着凉，舒服。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;客户满意度&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王不哭，屁股要干净。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;项目角色&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;在前几个项目，我都是担任助理工程师，如在换尿片项目中端水、拿垃圾桶等细活。但由于参与整个项目过程，慢慢领会项目各阶段的奥秘，立马晋升成项目经理，现已成功实施3个项目经验，也是客户满意度最高的几个。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;约束条件&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王怕冻；不懂技术语言，只会发3个音——咿呀哇。无法把握客户需求有一部分原因是，当她哇哇叫时，是要换尿片呢还是要喝奶呢。因为对于客户看来，换尿片和喝奶都是同一样东西，因此她表达都一样，需要不断细化才能准确把握真正的需求点。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;项目风险&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;预估项目风险有利于降低项目风险。换尿片的风险其一是小霸王容易着凉，会导致整个项目失败，是最高风险；其二是换纸尿片时，小霸王的黄金可能会漏出来，导致项目成本增加——拖地。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;项目启动会&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王叫了，确认换尿片角色——我担任项目经理，兼项目实施；小霸王妈妈担任高级换尿片工程师。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;团队激励&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;换纸尿片项目是客户面前最关注的一个项目，成功实施会向全省BB推广。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;项目估算&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;工作量：2人8分钟；资源：2人、取暖器、爽身粉、盆子、暖水、垃圾桶、纸尿片、毛巾、手帕（擦屁股用）。专家评估法：关羽阿妈评估5分钟、刘备阿妈评估9分钟、张飞阿妈评估10分钟，最后汇总得出结果是8分钟。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;需求分析&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王怕冷，要关好窗户，开取暖器以防着凉。擦屁股在保证擦干净的前提下，力度得适中，擦的舒服。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;技术准备&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;准备取暖器、爽身粉、暖水、垃圾桶、纸尿片，关好窗户，并精通尿片使用指南。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;项目设计&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;关窗，取暖器温度适中，暖水接近体温。脱小霸王的裤子、原纸尿片放入垃圾桶，用暖水擦屁股，用毛巾擦干，刷爽身粉，换上新的纸尿片，穿裤子，关暖气、开窗，清理现场。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;项目实施&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;按设计流程和要求实施，并增加环节：在整个换尿片过程，用各种办法分散小霸王的注意力。如果实施过程不合客户的要求，她会发飙，哇哇乱叫——老爸！你手脚还不快点，想要我的小命是不？！&lt;/p&gt; &lt;p&gt;&lt;strong&gt;团队协作&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王妈妈抽掉旧尿片后，反馈并说明可以进行擦屁股流程。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;客户验收&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;小霸王愉快地睡觉。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;项目总结&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这个换尿片项目等到客户的一致好评，准确把握客户需求，成功控制取暖器的温度和擦屁股的力度。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;过程改进&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;降低成本，如在保证小霸王舒适度的前提下减少纸尿片的支出；提高效率：减少换尿片的时间。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;团队建设&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;提高团队协作能力，换纸尿片各环节的配合；提高工作效率，快速地帮小霸王宽衣穿衣。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;知识库管理&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;项目成员总结项目经验并且文档化，启动新成员。如本文。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;产品化&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;出书《高效换尿片的45个习惯》、《走出换尿片的作坊》，开发换尿片机器人等。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;温馨提示&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;暂无小孩的朋友等将来有小孩后再来看这篇文章会更有意思。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;感想&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;今日换纸尿片突发奇想，激发项目管理的灵感，兴高采烈，赶紧磨墨写文，存此流芳百世。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2048305.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2011/05/17/from_baby_to_project_management.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2011/05/13/lower_management.html</id><title type="text">基层管理杂谈</title><summary type="text">几乎每种行业都有基层主管（或基层管理人员），而软件行业的基层主管一般是项目经理、技术经理、开发经理、组长等。其职责是资源协调、风险预估、项目管控、团队建设，说白一点大多数的企业现状就是项目负责人带领团队攻下一个又一个项目的过程。很多公司以项目成败作为项目负责人考核的唯一标准，因为项目规模、成本、客户满意度等容易量化，并且是直接跟公司的利润有很大关系；而相反团队建设却难以衡量，如何衡量一个普通技工晋升成高级技工到底是基层主管的培养还是原员工本身就具备高级技工的技能。因此，难免出现以项目额度论英雄的局面，这样往往造成一将功成万骨枯的悲壮场面，并不利于团队的发展。卡耐基曾经说过，带走我的员工，把我的工厂留下，不久后工厂就会长满杂草；拿走我的工厂，把我的员工留下，不久后我们还会有个更好的工厂。我的观点是，从短期目标来看，项目成功是解决温饱问题的指标，如果温饱问题未解决，还如何谈吃得好，如团队经常疯狂加班赶项目就是温饱尚未解决的一种表现；从长远角度来看，团队建设是迈向“吃得好”的改进过程，或着说是一种手段。</summary><published>2011-05-12T17:27:00Z</published><updated>2011-05-12T17:27:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2011/05/13/lower_management.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2011/05/13/lower_management.html"/><content type="html">&lt;p&gt;几乎每种行业都有基层主管（或基层管理人员），而软件行业的基层主管一般是项目经理、技术经理、开发经理、组长等。其职责是资源协调、风险预估、项目管控、团队建设，说白一点大多数的企业现状就是项目负责人带领团队攻下一个又一个项目的过程。很多公司以项目成败作为项目负责人考核的唯一标准，因为项目规模、成本、客户满意度等容易量化，并且是直接跟公司的利润有很大关系；而相反团队建设却难以衡量，如何衡量一个普通技工晋升成高级技工到底是基层主管的培养还是原员工本身就具备高级技工的技能。因此，难免出现以项目额度论英雄的局面，这样往往造成一将功成万骨枯的悲壮场面，并不利于团队的发展。卡耐基曾经说过，带走我的员工，把我的工厂留下，不久后工厂就会长满杂草；拿走我的工厂，把我的员工留下，不久后我们还会有个更好的工厂。我的观点是，从短期目标来看，项目成功是解决温饱问题的指标，如果温饱问题未解决，还如何谈吃得好，如团队经常疯狂加班赶项目就是温饱尚未解决的一种表现；从长远角度来看，团队建设是迈向“吃得好”的改进过程，或着说是一种手段。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;一只狮子带领一群绵羊的团队会战胜由一只绵羊带领一群狮子的团队&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果你是一只绵羊，配备一群狮子般的团队也是枉然。说到这里，我曾经从一个电视节目看到十多只年轻狮子攻击一头河马，由于缺乏领队，结果导致河马成功逃过一劫并且一头狮子牺牲这样难以置信的场面。后来，同样这群狮子在一只经验丰富的狮子带领下，战胜比河马更强壮更凶猛的对手。&lt;/p&gt; &lt;p&gt;基层主管往往来自基层的优秀员工，在成功转型之前必须先把自己的宝剑磨利。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;在NBA赛场上，5个科比组成的球队可能会输给联盟任何一只球队&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;一个项目一般需要若干个成员组成团队——售前、需求、设计、开发、测试、部署等。而现实情况往往是，要么项目急、要么人员未到位，或者两种情况都有，那么开发人员由于在公司所占比例大，可能会兼做需求和测试。这样造成的后果是，需求把握不明确，测试不到位导致软件质量差，客户不断投诉。&lt;/p&gt; &lt;p&gt;正如下象棋一样，必须了解各种棋子的角色和作用，以及它们应该摆放的位置。否则拿车当兵使，后果可想而知。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;当项目出现危机，基层主管的第一反应是？&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果第一反应是“这个问题是哪个兔崽子造成的”，意味着该主管的思维是先追究责任。有一次，需要向客户演示现有的开发成果，由于各种原因导致离演示的前一天发现很多功能都未完善，如果照这样演示给客户看的话简直是演猴戏。当时，基层主管唯有向上汇报，而高级主管的第一反应是，评估完善这些功能需要多少时间？现在增加资源是否能够缩短工期？需要哪些资源才能完成？并且在该项目所有成员目前表示，他不想追究任何一个人的错误，首要任务是先分析如何能够解决问题。事后，他再向基层主管了解如何改进才能避免同类问题的发生，通过这种方式相当于给基层主管上了一次深刻的管理课程。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;聆听团队的意见&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;善于聆听是良好沟通的铺垫。如果你的团队成员在他岗位上老老实实的干了几个月，突然他有一天告诉你（或者从其他成员了解到），他觉得自己的工作没意思。这其实不完全是分工的问题，很大程度上是沟通出现问题。试问，他是觉得没意思，而不是不合适，即他胜任这份工作，可惜觉得缺少了什么，可能是缺少锻炼机会、想换个项目等等。主动去了解团队成员的意向，因为把他们放在感兴趣的岗位会发挥他们潜在的能力。当然并不是每个人都能找到适合自己的岗位，恰当的给予激励会鼓舞士气，保持工作的热情。某些基层主管把开空头支票当激励，结果失信于团队。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;最大限度地发挥团队的力量是每个基层主管的职责&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;最大限度地发挥团队的力量的前提是得深入了解每个团队成员的技能和喜好。特别是软件工程师，很多不善于语言表达也不会表现自己，更多的需要基层主管去观察。如A君喜欢钻研技术但是缺乏经验，如果有技术难度较高地先分配给他，帮他分析解决方案，更重要的是给他信心。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;不要说我以为&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;基层主管不同于普通员工，一旦犯错就勇于承担。如果说“我以为…，想不到会…，结果造成…”，是一种借口，是不成熟的表现。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;让团队主动反馈&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;基层主管要了解他管理的不是一群机器，是一支优秀的队伍。如果把团队训练成机器，最终会累死基层主管。例如，你需要挨个挨个的去问他们工作进展的怎么样，或者索性让他们写日报周报来反馈。这样得到的结果就是一切看起来很美好，而实际情况就可能隐藏一个个定时炸弹。如果并非团队成员的主动反馈，“被反馈”往往是走走形式，例如某某说“A功能完成了，B功能差不多了”。到了第二天、第三天还是“B功能差不多了”。主动反馈是简要说说工作的问题和解决方法，如某某说“A功能解决方案是…，B功能遇到…问题，C功能预计明天可完成”，并且更重要的是，不是等到你去问他才反馈。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;以上纯粹是自己对基层管理的个人看法，也是自己一些微薄经验的一个小结，思维有点混乱。这里抛砖引玉，希望听到更多的建议。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/2045028.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2011/05/13/lower_management.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2011/03/15/recruit_and_employ.html</id><title type="text">面试者与面试官</title><summary type="text">作为初入职场，特别是对于刚踏入社会的热血青年，其实很希望，即使是得到那么一丁点的指引，也足以让他们少奋斗一段历程。作为过来人，我为那些工作一两年仍然停留学生阶段的朋友感到惋惜，与其勉强为了专业对口而从事自己不擅长的工作，倒不如索性转行来得痛快。</summary><published>2011-03-15T14:45:00Z</published><updated>2011-03-15T14:45:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2011/03/15/recruit_and_employ.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2011/03/15/recruit_and_employ.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;目前公司挺缺人才，其实一直都缺。一个多星期下来，我面试了不少开发人员，他们的表现实在不敢恭维。想起一年前这个时候，作为应聘者的我再怎么逊也不至于这样，一年前的面试故事请&lt;a href="http://www.cnblogs.com/coolcode/archive/2010/04/01/1702570.html"&gt;猛击这里&lt;/a&gt;。 &lt;p&gt;作为初入职场，特别是对于刚踏入社会的热血青年，其实很希望，即使是得到那么一丁点的指引，也足以让他们少奋斗一段历程。作为过来人，我为那些工作一两年仍然停留学生阶段的朋友感到惋惜，与其勉强为了专业对口而从事自己不擅长的工作，倒不如索性转行来得痛快。 &lt;p&gt;下面总结面试者和面试官两者应该具备的基本要求—— &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;面试者应该了解&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1. 笔试题做得好，不代表什么；但做不好，往往给面试官第一印象就不太好。即使卷面不合格，也不用妄自菲薄，因为说不定做得比你差的大有人在。 &lt;p&gt;2. 自我介绍不要三言两语就结束，即使是刚毕业的大学生也不至于这样吧？ &lt;p&gt;3. 你不用长得帅气或迷人，但请保持应有的仪态和谈吐。 &lt;p&gt;4. 永远永远不要把你的简历折得皱巴巴，因为它是你的敲门砖。 &lt;p&gt;5. 尽量保持微笑，以及眼睛注视对方，特别是当面试官提问的时候。 &lt;p&gt;6. 专业基础知识一定要扎实，不要告诉面试官你因为工作的原因而忘记了，因为这些知识不应该是用来记的。 &lt;p&gt;7. 当面试官问你是否掌握某方面技术，不要明明没了解过也说自己掌握，否则被问了一个很基础问题就哑口无言。 &lt;p&gt;8. 最好不要被动回答问题，面试官其实很想听听你独到的想法。 &lt;p&gt;9. 最好准备两个以上问题，礼貌地向面试官提问。 &lt;p&gt;10. 最后，如果你面试失败，其实有可能你不适合这个公司而已。 &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;作为面试官，希望在这里抛砖引玉&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1. 永远记住：发掘面试者的潜能是你的职责。 &lt;p&gt;2. 私人问题不要问，唯一一个例外就是：问面试者为何离开上一家公司。 &lt;p&gt;3. 不要带有感情色彩去面试，如果那天实在无法调整自己的情绪，把这重任交给其他人。 &lt;p&gt;4. 对于不合格的面试者，绝对不要有半点吝惜。 &lt;p&gt;5. 在面试者眼里，面试官代表公司形象，不要表现强势不可一世，否则毁了公司形象。 &lt;p&gt;6. 不要招聘心术不正之人，甭管他技术胜人一筹。 &lt;p&gt;7. 了解面试者自我学习和解决问题的能力。 &lt;p&gt;8. 不要光凭笔试题目为面试者打分。 &lt;p&gt;9. 真正有才华的人凤毛麟角，因此给自己更为面试者开一条路：你要招的只是合格者而已，将他与公司同等职位的人作比较是最合适不过。 &lt;p&gt;10. 最好一点，也是最重要一点：不要以为只有面试者在面试前要准备，面试官也不例外。 &lt;p&gt;&amp;nbsp; &lt;p&gt;每年招聘或应聘的高峰期又如期而至了，祝找工作的如愿以偿，招聘的招到千里马或潜力股。 &lt;img src="http://www.cnblogs.com/coolcode/aggbug/1985459.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2011/03/15/recruit_and_employ.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2010/11/07/Agile.html</id><title type="text">敏捷全球之旅 - 广州</title><summary type="text">今天广州天气阳光明媚，我很高兴能参加“敏捷全球之旅”的讲座，亲临Scrum大师Vernon Stinebaker（中文名：史文林）的精彩演讲。趁着身上尚有敏捷的“余温”，记录一下今天的体会。</summary><published>2010-11-07T15:11:00Z</published><updated>2010-11-07T15:11:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2010/11/07/Agile.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2010/11/07/Agile.html"/><content type="html">&lt;p&gt;今天广州天气阳光明媚，我很高兴能参加“敏捷全球之旅”的讲座，亲临Scrum大师Vernon Stinebaker（中文名：史文林）的精彩演讲。趁着身上尚有敏捷的“余温”，记录一下今天的体会。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;Vernon Stinebaker 的背景&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;博克软件杭州的技术与架构总监。他是目前国内仅有的两位Scrum联盟的认证Scrum培训师（CST）之一，具有资格通过培训颁发CSM及CSPO认证。&lt;/p&gt; &lt;p&gt;Vernon 能讲一口流利的普通话，但他在中国已经待了很长时间，学会了中国人的谦虚文化，只说自己“会讲一点普通话”。这次讲座为了不让外国嘉宾打瞌睡，他全程中英双语作演讲，将自己对Scrum的看法以及自身运用Scrum的经历分享给大家。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Scrum&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;他强调的Scrum的几个特点&lt;/p&gt; &lt;p&gt;1. 持续集成&lt;/p&gt; &lt;p&gt;2. 每日例会一定要站起来开&lt;/p&gt; &lt;p&gt;3. Sprint Review&lt;/p&gt; &lt;p&gt;4. 强调人&lt;/p&gt; &lt;p&gt;&lt;strong&gt;其他讲师&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;后续几位讲师的演讲的主题也不错。如李华北的“CMMI中的敏捷方法”介绍CMMI和敏捷的异同，以及两者可以并存改善软件过程；陈庆春的“敏捷需求面面观”提到软件的45%功能最终客户是不会用到的；谭小鹏的“需求-想得到你的心很难”提出需求并不是简单的事情，同时也结合自己的经验介绍如何取得用户的&lt;strong&gt;有效&lt;/strong&gt;需求……&lt;/p&gt; &lt;p&gt;&lt;strong&gt;疑问&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;会后和几位同事交流了这次讲座的体会，普遍产生一些疑问：&lt;/p&gt; &lt;p&gt;1. 敏捷是否适合自身公司？ &lt;/p&gt; &lt;p&gt;2. 敏捷是否会带来高项目成本？ &lt;/p&gt; &lt;p&gt;3. 敏捷的纪律性问题会带来风险吗？&lt;/p&gt; &lt;p&gt;4. TDD适合哪些类型项目？&lt;/p&gt; &lt;p&gt;据我所知，有两家中小型公司已经在用Scrum（尚处于Scrum的入门阶段），目前情况比较乐观，至少没有产生以上的问题。TDD基本上还没见到谁在用。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;随便说说&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;反观自己，已经3个月没更新博客了。一方面，是我关注的知识越来越多；另一方面，确实我的工作越来越忙。希望日后能挤出那么一点时间，多抛几块砖上来。&lt;/p&gt; &lt;p&gt;顺便推荐《Scrum敏捷项目管理》是本不错的书！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/1871360.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2010/11/07/Agile.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolcode/archive/2010/07/26/jstree_add_event_for_node_dblclick.html</id><title type="text">jquery.jstree 增加节点的双击事件</title><summary type="text">本文基于 jsTree 1.0-rc1 版本增加节点的双击事件。jsTree 是基于jquery的树插件，支持拖放、复制、删除、快捷键、多选、自定义节点图标、自定义右键菜单、跨页面保存状态等等，总之我想到的它基本上都有了，而且最值得表扬的是它让人感觉一点都不慢哦。</summary><published>2010-07-26T11:59:00Z</published><updated>2010-07-26T11:59:00Z</updated><author><name>CoolCode</name><uri>http://www.cnblogs.com/coolcode/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolcode/archive/2010/07/26/jstree_add_event_for_node_dblclick.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolcode/archive/2010/07/26/jstree_add_event_for_node_dblclick.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;jstree&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;本文基于&amp;nbsp; &lt;a href="http://jstree.com/" target="_blank"&gt;jsTree&lt;/a&gt; 1.0-rc1 版本增加节点的双击事件。&lt;/p&gt; &lt;p&gt;&lt;a href="http://jstree.com/" target="_blank"&gt;jsTree&lt;/a&gt; 是基于jquery的树插件，支持拖放、复制、删除、快捷键、多选、自定义节点图标、自定义右键菜单、跨页面保存状态等等，总之我想到的它基本上都有了，而且最值得表扬的是它让人感觉一点都不慢哦。&lt;/p&gt; &lt;p&gt;jsTree有节点选择事件，即&lt;/p&gt;.bind(&lt;span style="color: #a31515"&gt;"select_node.jstree"&lt;/span&gt;, &lt;span style="color: blue"&gt;function&lt;/span&gt;(e, data) {&lt;br/&gt;             &lt;span style="color: green"&gt;//alert(data.rslt.obj.attr("id") + ":" + data.rslt.obj.attr("rel"));&lt;br/&gt;        &lt;/span&gt;})&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;其实我认为它更像是节点的&lt;strong&gt;单击&lt;/strong&gt;事件，因为每次点节点的时候它都会触发，不管之前该节点是否已经被选中。&lt;/p&gt;&lt;p&gt;近日做个文件管理的东东，需要用到节点的双击事件，如双击某个节点打开该节点的编辑页面。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/coolcode/WindowsLiveWriter/jquery.jstree_10B97/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/coolcode/WindowsLiveWriter/jquery.jstree_10B97/image_thumb.png" width="228" height="221"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;jstree虽然有双击事件，但是并非针对节点的，而是你双击树所在区域就会触发，如上图任何一个地方。&lt;/p&gt;&lt;p&gt;离&lt;strong&gt;节点双击事件&lt;/strong&gt;最接近的应该就是&lt;strong&gt;节点选择事件&lt;/strong&gt;，因此又是“照葫芦画瓢”啦。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;分析&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在第833行 this.get_container() 后是节点的单击事件&lt;/p&gt;.delegate(&lt;span style="color: #a31515"&gt;"a"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"click.jstree"&lt;/span&gt;, $.proxy(&lt;span style="color: blue"&gt;function &lt;/span&gt;(event) {&lt;br/&gt;                        event.preventDefault();&lt;br/&gt;                        &lt;span style="color: blue"&gt;this&lt;/span&gt;.select_node(event.currentTarget, &lt;span style="color: blue"&gt;true&lt;/span&gt;, event);&lt;br/&gt;                    }, &lt;span style="color: blue"&gt;this&lt;/span&gt;))&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;同样我再这里插入节点双击事件&lt;/p&gt;.delegate(&lt;span style="color: #a31515"&gt;"a"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"dblclick.jstree"&lt;/span&gt;, $.proxy(&lt;span style="color: blue"&gt;function&lt;/span&gt;(event) {&lt;br/&gt;    event.preventDefault();&lt;br/&gt;    &lt;span style="color: blue"&gt;this&lt;/span&gt;.dblclick_node(event.currentTarget, &lt;span style="color: blue"&gt;true&lt;/span&gt;, event);&lt;br/&gt;    }, &lt;span style="color: blue"&gt;this&lt;/span&gt;))&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接着，我再实现 &lt;strong&gt;dblclick_node&lt;/strong&gt; 方法就可以了。&lt;/p&gt;&lt;p&gt;在第928行找到 select_node 的代码，比较复杂。但里面90%对于双击来说是没有用处的，如处理单选、多选、保存选择结果到cookies等。因此 &lt;strong&gt;dblclick_node&lt;/strong&gt; 方法的实现要比 select_node 简单很多。&lt;/p&gt;dblclick_node: &lt;span style="color: blue"&gt;function&lt;/span&gt;(obj, check, e) {&lt;br/&gt;    obj = &lt;span style="color: blue"&gt;this&lt;/span&gt;._get_node(obj);&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(obj == -1 || !obj || !obj.length) { &lt;span style="color: blue"&gt;return false&lt;/span&gt;; } &lt;br/&gt;    &lt;span style="color: blue"&gt;this&lt;/span&gt;.__callback({ &lt;span style="color: #a31515"&gt;"obj"&lt;/span&gt;: obj }); &lt;br/&gt;},&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;OK，就这样了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;使用例子&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;跟 select_node 用法一样&lt;/p&gt;.bind(&lt;span style="color: #a31515"&gt;"dblclick_node.jstree"&lt;/span&gt;, &lt;span style="color: blue"&gt;function&lt;/span&gt;(e, data) {&lt;br/&gt;             &lt;span style="color: green"&gt;//alert(data.rslt.obj.attr("id") + ":" + data.rslt.obj.attr("rel"));&lt;br/&gt;        &lt;/span&gt;})&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;改造后的代码下载&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/coolcode/jquery.jstree.js"&gt;jquery.jstree.js&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;顺便说说&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;jstree 跟另一个插件jquery &lt;strong&gt;validate &lt;/strong&gt;是水火不容的，当两者共存时，jstree虽然也可以构造树出来，但如僵尸一般不能展开。这里mark一个，日后试试能否修改。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolcode/aggbug/1785514.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolcode/archive/2010/07/26/jstree_add_event_for_node_dblclick.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
