2011年8月23日

为什么不给程序员配好电脑 [翻译]

有人抱怨很多技术公司愿意给程序员上百元的小时工资,但是却不肯给程序员配价值上万的好电脑,只能配和只是用用Office软件,浏览网页的工作人员一样 的烂PC,导致程序员在编译等情况下只能做漫长的等待,而这些等待的时间足够买很多好电脑,于是在网上发布信息咨询这个问题。有人如下回复这个问题:

很多公司在这一点上脑子是毫无疑问地坏掉了。

真的,如果你咨询一万个技术经理,“加入你支付迈克尔*舒马赫一个亿,你认为它能够骑自行车赢得F1比赛的胜利吗?” 可能没有人会说“是”。

然而就是同样的这批人却认为高薪聘请的程序员在垃圾环境下使用垃圾工具编码的速度和质量能够和在舒适环境下使用好电脑保持一样,当然,那些懒惰的不可理喻的程序员那么高的工资,理所当然的应该可以把"自行车"骑得更快些。

当然,所谓的好工具也要根据具体需要做的工作来确定,比如写Linux内核的人对硬件的要求肯定和网页设计人员不一样。但是对于公司来说,只要出得起钱,不给自己的员工配能够尽量提高她们生产率的硬件实在是不可理喻。

有人曾经在一家有9G源代码(C语言为主)的公司工作,工作中最困扰大家的事情就是编译速度。但是不幸的是,大家多数还在使用5年之前标配的计算机工作, 因而都不愿意和当年一样频繁编译,进而导致低生产率,较多的质量问题和编译失败。虽然公司有足够的钱更新硬件,但却坚持地在这方面很小气。去年夏天在多次 没能如期交付软件后他们最大的两个客户不再跟他们继续合作,造成了超过上亿的损失,只能关门了事。公司曾经问大家如何才能增加效率,此人提出了这个建议并 分析了成本-收益,但却管理层以“分析肯定有问题 - 我们没有那么笨”,可惜数据是不会说谎的

另外还有一家公司给程序员提供了不错的电脑,却坚持每个人都必须要在一个没有分割,人挤人的大牛棚里面超级迷你的小桌子上工作。这样就会导致问题,因为很 多员工是做脆弱的原型硬件工作,由于只有很小的地方来访这些原型,人们走过的时候很容易挂到他们甚至碰到地方去。他们浪费了VC近5千万美元的投资却连个 屁也没有搞出来。

当然也不是说单单差工具和工作环境就能把公司毁掉,但是一定要强调付给员工高薪就期望能够保持高产,不管给他们使用的工具合适与否。这中缘木求鱼的做法最终会导致公司在竞争中含恨离场。

一般而言,影响程序员效率的第一杀手就是打扰,其次就是缓慢的编译。比如经常有程序员抱怨说点了"编译并调试"后,由于编译需要5分钟才能完成,此时程序 员就设个闹钟然后去做其他事情了,比如去倒杯咖啡或者阅读一些其他材料比如本文,等到闹钟响了才回来开始做测试,当然有些时候会过很长时间才会回来。但在 这些无意义的消耗时间的活动的时候,公司仍然需要按照工作的价格来付薪酬。对员工来说把这些钱扔到硬件上避免大家陷入这些困境要有意义的多,而且对公司来 说也是一样。但人的本性就是这样,大家还是承认并接受对于老大们来讲每个人都需要向超人一样能够控制自己


翻译自

 

posted @ 2011-08-23 07:22 流云之心 阅读(23) 评论(0) 编辑

2011年8月21日

SQL Server中对XML操作

博客园的账号密码忘了,先放这儿吧

1.    检查XML中节点是否存在
SELECT xmlContent.exist('/Samples/Sample'),
    * FROM xmlTable
WHERE xmlContent.exist('/Samples/Sample') = 1

SELECT xmlContent.exist('/Samples//Name'),
    * FROM xmlTable
WHERE xmlContent.exist('/Samples//Name') = 1


2.    检查节点值是否存在
SELECT TOP 100    *
FROM  xmlTable
WHERE xmlContent.exist('/Samples/Sample[Value=1]') = 1

3.    获取XML某个节点的内容 (类似DOM的OutterXML)
SELECT TOP 100   xmlContent.query('/Samples/Sample/Name'),
   *
FROM  xmlTable

4.    获取指定XML块的内容 (类似DOM的innerText)
SELECT TOP 100   xmlContent.value('(/Samples/Sample/Name)[1]', 'varchar(100)'),
   *
FROM  xmlTable


附:做测试用的数据表和数据的生成SQL
-- 创建测试表
CREATE TABLE [xmlTable](
    [xmlId] [int] IDENTITY(1,1) NOT NULL,
    [xmlName] [varchar](50) NOT NULL,
    [xmlContent] [xml] NOT NULL,
    [xmlDescr] [varchar](2000) NULL
)

-- 初始化数据
-- truncate table xmlTable
DECLARE @iRow int,
        @xmlContent xml,
        @xmlName varchar(50),
        @xmlId int

SET @iRow = 0
SELECT @xmlId = max(xmlid) from xmlTable

if(@xmlId is null)
    SET @xmlId = @iRow + 1

While @iRow < 5
BEGIN
    SET @xmlName = 'Sample' + Convert(varchar(10), @xmlId + @iRow)
    SET @xmlContent = '<Samples><Sample><Name>' + @xmlName+ '</Name><Value>'+ CONVERT(varchar(20), @xmlId + @iRow)
        + '</Value></Sample></Samples>'
    INSERT INTO [xmlTable]
           ([xmlName]
           ,[xmlContent]
           --,[xmlDescr]
           )
     VALUES
           (@xmlName
           ,@xmlContent
           --,<xmlDescr, varchar(2000),>
           )
      SET @iRow = @iRow + 1
END

posted @ 2011-08-21 14:13 流云之心 阅读(119) 评论(0) 编辑

2010年6月27日

开发常用小工具介绍

在开发中有很多小工具能够很高效的提高效率,感觉做开发的人员都会或多或少用到这些工具,这里就算抛砖引玉,看看大家是不是还有其他更好用的小工具 :)

 

1. 微软 SysinternalsSuite 系列工具

  这套软件可以从technet直接下载,地址为http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx。 开发人员常用的工具有以下几种

  a. DbgView.exe

  Debug Viewer 用来查看代码中trace信息。当然比不上windbg功能强大,但是在开发中基本上都是够用了。倒是性能调优的时候还是windbg比较有效

     b. procexp.exe

  Process Explorer,可以看做任务管理器的升级版,可以找出进程打开了哪些文件、注册表项和其他对象以及已加载哪些 DLL 等信息

     c.procmon.exe

  Process Monitor 实时监视文件系统、注册表、进程、线程和 DLL 活动

  d. TCPView.exe

  TCP Viewer, 查看TCP端口

另外提一个好玩的小东西,BlueScreen.exe,  是个屏幕保护程序,不仅精确模拟“蓝屏”,而且也模拟重新启动,包括进行磁盘检查等动作,可以用来吓唬老板同事 :)

 

2. IETester

针对国内用户存在大量使用IE的现状,可以通过IETester模拟各种IE版本查看效果

 

3. IE Developer 【IE8中已经包括进来】

    用来调整CSS, JS的好工具,可以直接在客户端更改后查看效果

 

4. Firebug [Firefox]

功能基本上同IE Developer, 只不过针对Firefox。可以利用它除错、编辑、甚至删改任何网站的 CSS、HTML、DOM、与 JavaScript 代码,

 

5. HttpWatch

跟踪客户端发出的Request和接受的Response的好工具,可以通过这个工具发现客户端究竟发出了那些请求,并可以看到Cookie,Header里面的相关信息

6. Fridler

功能基本上和HttpWatch一致,针对.net平台,好处是免费的

 

 

posted @ 2010-06-27 23:09 流云之心 阅读(67) 评论(0) 编辑

2010年2月1日

设计模式一 - Simple Factory, Factory Method, Abstract Factory以及Builder模式简述

虽然现在博客园上关于设计模式的文章已经有很多,但还是写一篇来凑下热闹,也算是对自己多这几种模式得使用总结。

Factory Pattern 工厂模式和 Builder Patter 建造者模式都是通过定义接口来将类的定义和实现区分开来。下面一步一步来做说明

 

1. Simple Factory 简单工厂

 简单工厂只是将类简单抽象化,以Pizza为例,我们定义好Pizza的接口,实现继承Pizza的类PizzaA和PizzaB,然后简单工厂提供方法根据传进来的参数类型确定像调用者返回PizzaA或者PizzaB的实例

 

代码
    public interface Pizza
    {
        
void DoPizza();
    }

    
public class PizzaA : Pizza
    {
        
public void DoPizza()
        {
            Console.WriteLine(
"pizza A");
        }
    }

    
public class PizzaB : Pizza
    {
        
public void DoPizza()
        {
            Console.WriteLine(
"pizza B");
        }
    }
   
public static class SimplePizzaFacotry
    {
        
public static Pizza Create(string type)
        {
            
if (type == "PizzaA")
                
return new PizzaA();
            
else
                
return new PizzaB();
        }
    }

    
// Usage
    public class SimplePizzaFacotryOrder
    {
        
public void OrderPizza()
        {
            Pizza pizza 
= SimplePizzaFacotry.Create("PizzaA");
            pizza.DoPizza();
        }
    }

 

 

2. Factory Method工厂方法 

工厂方式是在简单工厂模式基础上进一步抽象来符合OO设计的要求。这里将Factory抽象化为接口或抽象类,然后继承类负责具体实现。此时增加一个FactoryManage来负责返回那个工厂类实现的实例。代码示例如下 

代码
// Pizza, PizzaA, PizzaB继续使用简单工厂定义

    
public abstract class PizzaFactory
    {
        
public abstract Pizza Create();
    }

    
public class PizzaAFactory : PizzaFactory
    {
        
public override Pizza Create()
        {
            
return new PizzaA();
            
//throw new NotImplementedException();
        }
    }

    
public class PizzaBFactory : PizzaFactory
    {
        
public override Pizza Create()
        {
            
return new PizzaB();
            
//throw new NotImplementedException();
        }
    }

    
public abstract class PizzaMethodManager
    {
        
public static PizzaFactory Factory = new PizzaAFactory();
    }
    
    
//usage 
    public class FactoryMethodPizzaOrder
    {
        
public FactoryMethodPizzaOrder()
        {
            Pizza pizza 
= PizzaMethodManager.Factory.Create();
        }
    }

 

  3. Abstract Factory 抽象工厂

 抽象工厂和工厂方法基本上一样,区别在于此时抽象工厂可以来实现一系列相关类的实现。继续用Pizza举例,这里将Pizza分为Dough和Sauce即面团和酱,然后定义HutPizza和PapaPizza的面团Dougn, Sauce以及Pizza的实现。示例如下

代码
    public interface IDough
    {
       
void DoDough();
    }

    
public interface ISauce
    {
        
void DoSauce();
    }

    
public class PapaDough : IDough
    {
        
public void DoDough()
        {
            Console.WriteLine(
"Papa Jone's Dough");
        }
    }

    
public class PapaSource : ISauce
    {
        
public void DoSauce()
        {
            Console.WriteLine(
"Papa Jone's Sauce");
        }
    }

    
public class HutDough : IDough
    {
        
public void DoDough()
        {
            Console.WriteLine(
"Pizza Hut's Dough");
        }
    }

    
public class HutSource : ISauce
    {
        
public void DoSauce()
        {
            Console.WriteLine(
"Pizza Hut's Sauce");
        }
    }

    
public interface IPizzaFactory
    {
        IDough PrepareDough();
        ISauce AddSauce();
    }

    
public class PapaPizzaFacotry : IPizzaFactory
    {
        
public IDough PrepareDough()
        {
            
return new PapaDough();
        }

        
public ISauce AddSauce()
        {
            
return new PapaSource();
        }
    }

    
public class HutPizzaFacotry : IPizzaFactory
    {
        
public IDough PrepareDough()
        {
            
return new HutDough();
        }

        
public ISauce AddSauce()
        {
            
return new HutSource();
        }
    }

    
public abstract class AbstractPizzaManager
    {
        
public static IPizzaFactory Facotry = new PapaPizzaFacotry();
    }

    
// Usage
    public class OrderPizzaAbstract
    {
        
public void OrderPizza()
        {
            IDough dough 
= AbstractPizzaManager.Facotry.PrepareDough();
            ISauce sauce 
= AbstractPizzaManager.Facotry.AddSauce();
            dough.DoDough();
            sauce.DoSauce();
        }
    }

 

  

 4. Builder Pattern 建造者模式

 Builder和抽象工厂类似,也是建立一系列对象的实现。区别在于Builder建立的一对象有依赖关系而Factory的对象只是有关联。依旧以Pizza为例,pizza的做法是先做面团(饼底),然后放Sauce(Cheese或者其他的东西),然后放Topping(火腿,香肠之类的)。举例如下

代码
    class PizzaBD
    {
        
public string Dough { getset; }
        
public string Sauce { getset; }
        
public string Topping { getset; }
    }
     
    
abstract class PizzaBuilder
    {
        
public PizzaBD pizza { getprotected set; }
     
        
public void CreatePizza()
        {
            pizza 
= new PizzaBD();
        }
     
        
public abstract void BuildDough();
        
public abstract void BuildSauce();
        
public abstract void BuildTopping();
    }
     
    
class HawaiianPizzaBuilder : PizzaBuilder
    {
        
public override void  BuildDough()
        {
            pizza.Dough 
= "Cross";
        }
     
        
public override void BuildSauce()
        {
            pizza.Sauce 
= "Mild";
        }
     
        
public override void BuildTopping()
        {
            pizza.Topping 
= "Ham+Pineapple";
        }
    }
     
    
class SpicyPizzaBuilder : PizzaBuilder
    {
        
public override void BuildDough()
        {
            pizza.Dough 
= "Pan Baked";
        }
     
        
public override void BuildSauce()
        {
            pizza.Sauce 
= "Hot";
        }
     
        
public override void BuildTopping()
        {
            pizza.Topping 
= "Pepperoni+Salami";
        }
    }
     
    
class Cook
    {
        
public PizzaBuilder PizzaBuilder { getset; }

        
public PizzaBD Pizza { get { return PizzaBuilder.pizza; } }
     
        
public void MakePizza()
        {
            PizzaBuilder.CreatePizza();
            PizzaBuilder.BuildDough();
            PizzaBuilder.BuildSauce();
            PizzaBuilder.BuildTopping();
        }
    }
     
    
// usage 
    public class CallBuilder
    {
        
public void OrderPizza()
        {
            Cook cook 
= new Cook();
            cook.PizzaBuilder 
= new SpicyPizzaBuilder();
            cook.MakePizza();
            cook.PizzaBuilder 
= new HawaiianPizzaBuilder();
            cook.MakePizza();
        }
    }

 

  5. Facade Pattern 外观模式

 提到了Builder模式,也就顺便提一下Facade模式。两者类似处在于都是建立一系列对象,区别在于Builder模式创建一系列有依赖关系的子类,而Facade模式则是建立一个将复杂的子类简化和集中化的通道。还是以Pizza为例,客户吃完付款,需要Waiter收取现金/卡,然后财务做账/transfer之后打印发票,返回。对客户来说后端多的一系列动作他并不关心,PizzaPayFacade提供给客户一个Pay方法,方法里面完成这一系列的动作[可能包括类的实现]。代码稍后提供。大家可以先参考First We try, then we trust的Facade说明的代码示例 http://www.cnblogs.com/zhenyulu/articles/55992.html

 

 

posted @ 2010-02-01 13:25 流云之心 阅读(1370) 评论(3) 编辑

2009年12月17日

强制休息程序 - EyeGuardian 眼睛守护者 Beta测试版

最近在空余时间随手写的一个小程序,欢迎大家试用,有什么意见建议请留言。


版本更新:

增加多语言支持

增加对全屏事件检测,在全屏玩游戏,看电影的时候不在计时

 

没有做安装程序,下载Bin包直接解压即可用。

程序和源代码下载

http://eyeguardian.sourceforge.net/

posted @ 2009-12-17 20:44 流云之心 阅读(147) 评论(0) 编辑

2007年12月20日

定时计划任务方案比较以及通过脚本创建计划任务(SchTasks命令)

posted @ 2007-12-20 16:18 流云之心 阅读(2509) 评论(1) 编辑

2007年12月6日

javascript 将页面上的Table导出保存为Excel (无格式)

摘要: 接受参数:Table的 IDfunctiontableToExcel(tblName){functionString.prototype.Trim(){returnthis.replace(/(^\s*)|(\s*$)/g,"");}try{vare=document.getElementById(tblName);vars=""for(varj=0;j<e.rows.length;j++)...阅读全文

posted @ 2007-12-06 14:43 流云之心 阅读(1657) 评论(0) 编辑

2007年12月5日

Excel Programming (C# + VBA) Part III

摘要: Step 6 Import the data in excel to databasea. Create excel app object and open the uploaded fileMicrosoft.Office.Interop.Excel.ApplicationxlsApp=newApplicationClass();Workbookwb=xlsApp.Workbooks.Open(...阅读全文

posted @ 2007-12-05 22:17 流云之心 阅读(245) 评论(0) 编辑

2007年12月4日

Excel Programming (C# + VBA) Part II

摘要: 2. Step 2 Generate an Excel template to fill with source data in C#a. Create excel application objectMicrosoft.Office.Interop.Excel.ApplicationxlsApp=null;Workbookwb=null;b. Open the template and Save...阅读全文

posted @ 2007-12-04 23:02 流云之心 阅读(224) 评论(0) 编辑

2007年12月3日

Excel programming (C# + VBA) Part 1

摘要: Excel programming (C# + VBA)Here is the secario of a full process of solution to use excel to submit information. Clarify the requirement and create the Excel template (VBA) Generate an Excel template...阅读全文

posted @ 2007-12-03 20:00 流云之心 阅读(428) 评论(0) 编辑