欢迎订阅文章最新更新

再谈自主开发与企业IT管理

前两天写《自主开发与带兵打仗》分析了一下自主开发的利与弊,得到了园内不少朋友的反馈,但我觉得还有很多东西没有交待东西,可能有很多朋友也跟我一样在公司的IT部门,有自己的研发团队也有很多外购的系统或产品。IT部门其实很多情况下对于一个公司其实很多情况下是一个很尴尬的部门,更多情况下在老板的印象里是一个管管机器、管管系统的部门,而所谓的做出点成绩却是要投入大量的成本,而所谓的创新更是无稽之谈。因此我觉得对于一个IT部门来在研发方面很遇到很多问题,而这些问题可能更多跟公司的行业、决策者对于信息化的认知等息息相关的。

其实作为集团下属IT公司的研发团队组建到现在超过三年的时间了(公司的时间要更长点),我刚好有幸经历过了这三年大变革的阶段,从最初的纯PHP团队到纯JAVA团队再到JAVA+.NET团队几乎每年都会有大的调整,大的人员结构变化,可以说在这三年的时候里栽了不少跟斗,而我们自己的印象是公司老在调整,不管是目标还是人员,老板的印象是投了那么多钱却没有什么效益产出。

来看看IT部门的场景吧:

老板:你看咱们有这么多公司,有这么多需求是吧,你们IT这边搞出些系统把这些解决了,对于你们来讲以后就有自己独立发展的可能了,内部公司就作为你们的第一批客户是吧。另外现在市场是有这么多开源的产品你把这些产品整合整合起来不就是自己的系统了嘛。现有很多东西都不需要自主开发了,你搞出一个平台来了有很多人能帮你来开发,说着说着就手起手上的iPad跟我们说上,你看iPad有这么多软件这些都是苹果写的吗?不是,那都是别人帮苹果写的,所以说世界上有这么多聪明的人,你不可能把这些都招聘过来工作,但是如果你有平台的话那么他们就有可能在你的平台上来为你服务,你还不需要给他们付钱,是吧。好吧,咱们就做个平台,这个平台要包含XX、XX、XX、XX、XX、XX、XX、XX、XX、XX、XX,你看你们多久可以搞出来嘛。。。。

IT: 老板这个我们得评估一个系统功能、工作量、人员另外还有一部分人在您上次交待的项目上得做完了才能抽出来。。。

说不到一半老板打断了。。。

老板:我跟你们说你们这种工作方式是不行的,你做不完的工作你可以拆分成任务包嘛,是吧,你可以把这个任务包指派给别人,还可以定一个价格,以后咱们公司就通过任务包来统计工资跟绩效。至于上次那个项目嘛先别做了,现在这是大的概念做好了就可以把上次那个给涵盖到了。所以那个项目的人员从现在开始就调过来好吧。还有工作包的事我觉得这样也不要太久,7天!好吧。为啥七天呢因为上帝创靠人类是用了7天的。所以以后每个工作都要拆成七天。

两个月后,老板又通知IT开会,那个。。咱们现在要搞一个大的XX平台,这个平台可以OOXXOOXXOOXX。。。。,你们看你们IT把人员的都组织一下从现在就开始做这项工作,每周跟我汇报。。。

一年后,老板要求IT提交年度分析报告,汇报刚到一半老板就开始说我投了这么多钱养你们这些几百号人,也没搞出几个像样的产品来出。。。过年前半个月公司开始裁员,开春老板又想了一个新的平台,又开始招人倒腾起来了。。。。

其实我觉得这里面的矛盾有点类似于“我国现阶段的主要矛盾是人民群众日益增长的物业文件需求与社会生产对相对落后的矛盾。”,以上的场景里老板提了很多目前主流的思想,比如:项目产品化、平台接口化、分包、互联网化等等概念。因为随着技术、产品、概念更新得越来越快,很多时候作为公司内部IT已经很难再跟上主流的技术、产品、管理方式。但是由于主流技术或产品又传播得太快导致了IT部门越来越难满足老板的胃口,比如老板刚买了个iPad就想要在上面办公了,而之前的系统其实有很多是不兼容的,修改起来费时费力。当然除了IT部门的原因我觉得很多情况下公司文化主要是决策者(老板)的认识是有很多关系的。我觉得作为内部研发团队会有以下几个问题:

1. 投资不够

其实从一个需求自主开发到一个成熟是一个相对漫长的过程,而在此期间又需要不断的投入以对人员、产品进行调整以优化。但很多情况下作为公司决策者或者业务部门只看到眼前的利益。一个项目如果超过半年以上的话就很难再得到有效的支持了。

2. 团队素质

我们大家都知道“一分钱一分货”,作项目的团队跟做产品的其实从人员技能要求来讲是有很大差距的,但是很多公司往往又无法投入如此大的资源来构建产品团队,更多情况下在严格的成本控制下面很难招到能满足“产品化”要求的人员,如果人员不能满足的话那么就无从谈起产品化了。

3.没有主导权

IT部门在公司里面基本都是“二流”部门,所以很难避免受到公司或者业务部门战略调整的影响,很多IT项目或者人员不得不因为调整而调整。而有时候如果IT部门觉得跟些解决方案其实可以的为业务部门服务,但得不到业务支持的话其实很多情况下也会半途而废。

当然作为IT部门的我们肯定也希望起走这样的困境,毕竟信息化的价值谁都不敢否定,这也是为什么存在的基本理由。初步考虑我觉得以下的一些方面是不是可供参考或借鉴的:

1. 自主开发决策原则

如《自主开发与带兵打仗》里讲到的,其实我们并不是所有的产品或系统是需要自主开发的或者说是值得自主开发的,我觉得如果要决定自主开发来做的话主要是考虑是不是主要的业务方向以便能获取长期的支持,也能积累和提升相应的业务经验与价值,至于这个系统自己有没有能力做或者性价比高不高我觉得倒是其次的了。

2.基础与积累很重要

公司很多项目都需要开发,那么开发的话我觉得不需要一个一个的重头开始做,更不能从PHP、JAVA、.NET整批整批的换,这样的代价太高了。要找准主要方向,管理好相关的代码、文档,当然最重要的还是团队要稳健。还有我最近在考虑要不要用一些像微软的Sharepoint 之类的产品来提高基础平台的能力。这样很多时候开发就不会从头开始了。但是SP的人员成本还满高的可能有待商榷,不过应该是一个方向。

3.新事务要小而快

除了日常的IT及研发工作之后还要对于新事务要采取“小而快”的原则,觉得值得试一试就要快速的组建一个小团队快速的发布成果,并在公司内部培养。

4.规划很重要

很多公司的IT都没有什么规划,或者有的话就只有一年的规划,其实IT建设是一个相对漫长的过程。我觉得主要的规划以三年为一个周期比较合适,然后每年还有一个相对详细的规划。并且这个规划一定要得到决策者的支持。规划里面除了IT和研发的事项之外其实还要考虑到非IT人员的培训、软、硬件重要的升级等事项。比如全员升级到Win7之类的。不然你以后开发系统体魄得考虑IE6的问题。

5.开源值得尝试吗

公司内部的项目除了使用一些开源的解决方案之外有没有办法可以把自己的研发成果开源出去,以便构建社区,提高产品化的可能性。这种方式在互联网公司里面比较普遍,不知道这个否适合于企业研发领域。

 

总结

好了,我觉得我了解到的还有我的想法交待得差不多了,以上只是个人的小观点,可能有很多夸大或者不考谱的成份,等着拍砖。。。。

最近文章列表

JS调试笔记

在调试我们系统前台脚本的时候,由于使用了太多的第三方框架并且也不是本人写的因此在遇到比如点击按钮没有反应,页面宽度计算不正确等问题时有时不知道都哪些JS被调用了,需要跟踪调试等,以下介绍几个简要的方法,工具是IE9的IE Developer 。

1.跟踪哪些方法被调用

按F12打开IE9的调试工具,到Profiler时点击Start Profiling

image

当我们做一些JS操作时就可以按Call Tree或Functions的方式来查看哪些方法被调用了。

image

2. 查看对像绑定的事件

<script  type="text/javascript" language="javascript">
  function attach(){
      document.getElementById("AA").onclick=function(){
      alert("A按钮注册事件!");
 };
 /*
    document.getElementById("AA").onclick+=function(){
      alert("AA按钮注册事件!");
 };
 */
 document.getElementById("BB").attachEvent("onclick",click);
 document.getElementById("CC").attachEvent("onclick",function(){
      alert("C按钮注册事件!");
 });
  }
 
  function click(){
      alert("B按钮注册事件!");
  }
</script>
 
    <input onclick="attach()" value="test" type="button" />
 <input id="AA" value="AA" type="button" />
 <input id="BB" value="BB" type="button" />
 <input id="CC" value="CC" type="button" />

以上代码经过测试,可惜只能查看到第一种类型的绑定事件,第二和第三种绑定之后的事件都看不到。

image

MVC3+EntityFramework实践笔记

最近项目想做一个员工统一工号生成的系统,本来可以直接让开发人员来做的,不过大家都在项目上忙不开,刚好也可以练练手于是就接过这个项目。之前虽然一直对MVC和Entity Framework有点了解,但是实际使用的时候还是有很多问题。本文只是是记录一些碰到的问题及解决办法。

1. DataContext的选择

image

遇到的第一个问题就是DtaContext的选择,之前以为根据生成的EDMX就可以直接选择Model生成Controller及View了。 不知道还需要Data context。好吧,初步查了一下Data Context是相关的底层数据连接、数据集定义的。

所以在生成Controller 的时候就选择表的类及创建时生成的Entity即可。

 

2. 数据校验

MVC提供了比较多的数据校验功能,但是很多提示是英文的

        [Required(ErrorMessage = &quot;必填&quot;)]
        [DataType(DataType.Text)]
        [IDCardCheck]
        [Display(Name = &quot;身份证号&quot;)]
        public string PersonalID { get; set; }

一个简单办法就是声明ErrorMessage值,输入中文的错误提示信息。

如果需要自定义的验证的话,如上代码中的IDCardCheck,可以继承ValidationAttribute来实现

 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class IDCardCheckAttribute : ValidationAttribute
    {
        CheckHelper checkHelper = new CheckHelper();
        SSOEntities SSODB = new SSOEntities();
 
        public override bool IsValid(object value)
        {
            if (null == value)
                return false;
 
            try
            {
                string personalID = value.ToString();
                if (checkHelper.CheckIDCard(personalID))
                {
                    int count = (from p in SSODB.t_UserInfo where p.PersonalID == personalID select p).Count();
                    if (count &gt; 0)
                    {
                        ErrorMessage = &quot;该身份证号码已存在!&quot;;
                        return false;
                    }
                }
                else
                {
                    ErrorMessage = &quot;请输入正确的身份证号码&quot;;
                    return false;
 
                }
 
                return true;
            }
            catch (Exception exp)
            {
                ErrorMessage = &quot;请输入正确的身份证号码&quot;;
                return false;
            }
        }
    }

3. 映射存储过程

EDMX支持将存储过程映射到实体类的添加、删除、修改中。

image

image

映射之后调用的时候还是可以用类似于SSODB.t_UserInfo.AddObject(xxx);这种方式来调用但是实际执行的时候是执行存储过程了。

3. 导入存储过程方法

如果你想在存储过程里直接使用存储过程的方法,那么可以在Model Brower里的 Function Imports里导入存储过程。

image

在代码里直接使用:

SSODB.DeleteEmployee(id, currentUser);

 

4. CodeFirst 实现

EF4.1 开始引入了Model First/Database First/Code First 等功能,由于这个项目是在之前项目的项目上改过来的。所以没有完全用Code First来做。不过在找解决办法的过程中还是试了一下Code First。以下为 Code First相应的Model Class及Data Class的代码:

    public partial class UserIDInfo
    {
        [Key]
        public int UserId { get; set; }
        public string Name { get; set; }
        public System.DateTime CreateTime { get; set; }
        public Nullable<int> CreateUser { get; set; }
        public string status { get; set; }
        public string Sex { get; set; }
        public string PersonalID { get; set; }
        public string StaffNumber { get; set; }
        public Nullable<system.datetime> EntryDate { get; set; }
        public Nullable<int> SequenceNumber { get; set; }
    }
 
    public class UserIDContext : DbContext
    {
        public UserIDContext()
            : base(&quot;UserIDInfoConnect&quot;)
        {
 
        }
        public DbSet<useridinfo> UserIDInfos { get; set; }
 
    }

Web.Config的配置

  <connectionstrings>
<add name="UserIDInfoConnect" connectionstring="data source=.\SQLEXPRESS;Integrated Security=SSPI;initial catalog=SSO;User Instance=true" providername="System.Data.SqlClient" />
  </connectionstrings>

5. 代码云存储

特别需要说明的是这次使用酷盘+TFS的方式来管理代码。因为我在公司和家里总共有两台电脑,家里的网络又连不到TFS,因此需要代码同步,但是用U盘拷来拷去的太不方便了。因此想到了用酷盘作为代码文件的同步。当然我把数据库文件也作为同步的项了。这样在公司写完代码如果还想回家写的话直接到家打开电脑即可。还有最重要的一点是酷盘有版本控制的功能。这个项目里由于我脱离了TFS开发了好长时间,后来想把最新的代码迁到TFS上,倒腾了半天把好几个重要的文件都给弄丢了。还好在酷盘的已删除里找到了,不然就白努力了。

因此推荐给大家这个工具 访问地址:http://kb.vc/qCgf (通过该链接访问我可以增长点免费空间,感谢您的支持!),我使用过Dropbox/SkyDrive/微盘/快盘等几个工具,觉得在国内访问速度还有空间还是酷盘最好。

image

不过有一点需要提醒的是光有酷盘可能还是行。因为你无法为代码生成结构化的版本,比较打标签之类的。因此还要结合TFS来做代码的管理。

 

6.总结

通过小一周的开发体验觉得MVC+Entity Framework对于.NET 的Web开发来说还是强大了不少,当然由于开发时间紧以上的概念之外我可能说得不太准确,欢迎大家批评指证,以后得继续努力学习。

自主开发与带兵打仗

自主开发与带兵打仗两个好似毫不相干的东西在最近的工作中越来越觉得两者有着越来越多的相似之处。好吧说说目前的情况,我公司是个集团下属的IT公司,有几十名自己的研发团队。有比较多自主开发失败的情况,所以公司内部老是在讨论我们到底是应该自己开发还是直接外购系统或外包出去。刚好前一段时间看了《三国》,想想自主开发跟带兵打仗还是有很多相似的地方。

1. 成本高

俗话说“养兵千日,用兵一时”,要培养一支训练有素的军队不容易,它要花费很长时间和大量物力。在企业里面也是一样,一个研发人员的待遇一般可以养得起2-3个业务/行政之类的人员了,因此研发团队成本对一个企业来说是一个不小的负担,对于管理水平低的企业来说更是如此。

2. 风险高

一但决定了要自主开发了那么就需要人力、物力、精力不断的往里投,而且还不见得能能搞出来,搞不好可能搞了百千万进去了最后也没搞出个像样的东西,然后团队一解散,竟然只给公司剩下几台“破”电脑(所谓的代码如果没有人的驾驭是没有价值的,暂且忽略)。打仗也一样,“兵马未动,粮草先行”,仗还没开始打呢就要先运吃穿住的东西了,而且有时投了很大的力气,仗却打败了。

3.心态是一样的

我觉得研发人员很像古代的将士,即所谓的“一将功成万骨枯”,作为将士只有“战死沙场”方显英雄本色,作为研发团队的我们肯定也是通过一个个成功的项目、一个个成功的产品来实现自己的价值,(当然失败的项目和产品大家一般都不会说的,至少在简历里是这样的,呵呵)遇到什么问题很喜欢通过自主开发的方式来解决,当然非研发人员其实更倾向于成熟的产品(如果市面上并且价格还能接受的话),也就是所谓的“外交渠道”来解决问题。

4.相似的“政治”

小时候看故事的时候经常会有这样的情节就是:将帅(主角)在前线拼死拼活的打仗,但是背后朝廷里却有不少人在告状,最终导致“出师未捷身先死,长使英雄泪满襟!”,虽然在企业里没有那么残酷,但是由于不同人员他们所站的位置是不一样的,因此导致了不同的价值观及事情的判断,如果项目进度再遇到点问题那么这种反面的声音就会越来越强烈,而老板可能也会想投了这么多钱却没出啥成果干脆Close掉得了,导致了项目的失败。

以上列举了这么多弊端,凡事都是有两面性的,其实大家是多少有点明白的,不然也不会有这么多的公司有着自己的研发团队,下面来说说好处吧。

1.枪杆子里面出政权

众所周知,如今要在信息化高速发展的信息里如果没有自己靠得住的研发团队的话是很难在激烈的竞争中取得优势的,特别是对于产品或研发型的公司。所谓的“枪杆子里面出政权”,就是“只有掌握自己的武装力量才能以革命的武装反对反革命的武装”,你看那些成功的大的公司哪家没有几百上千号人的研发团队,他们能在本行业的信息化、互联网化当中不断的取得先机与主动,拼的就是的研发啊!所谓的外包、最佳实践都是忽悠的,信息化走在前头的公司都清楚,其实这些都是只能参考而以,本行业的信息化还是自己最清楚。

2.打下来的才是牢靠的

从很多故事里我们了解打的要比谈的靠谱,如果产品是自己研发出来的那么肯定也比直接外购的考谱(当然我说的是投入是差不多一个水平上的,你别说是光投了2个开发的就要跟人家MS的产品去比较)。有源码在手,又是专门定制开发的,团队还能够比较清楚的了解系统。以后想整合的话想改哪就改哪,做过企业应用整合项目的肯定对此都深有体会。

 

总结

其实之前很多情况下我也是比较主张自主开发的,但是有一次看了一家公司的产品(特定行业),功能无比强大,价格还无比便宜(小几万块钱)。想想之前我们自己开发的一些产品的经验。如果我们想要做出同样功能的话起码成本得贵上十几倍,而且可能还需要有一个相对长点的迭代周期。所以其实无论是自己开发还是外购,其实主要还是要看自己的需求与市场上产品的满足程度,如果确实有很成熟的产品了那么其实外购也无可厚非,如果再想稳妥点的话能把源码给谈下来更好了。那么如果是决定自己开发的话也别什么都是自己做,其实IT真的很贵,用不好会伤身的,当然用得好了可以强身健体。呵呵!

额外的工作

每天都会有工作不是在计划范围内,当然有些工作是段时间就可以解决的,但有时候工作却是需要花很长时间才能够干完,但最气人的肯能是你付出了时间跟努力之后却发现原来只是被忽悠了。
上周接到一个需求,说是我负责的一些公司需要上一套OA系统,其实根据我的判断其实这些公司还很小(几十号人,大老板是不上系统的),但是由于是大老板的一个得力干将跟我讲的,而且他还说这是大老板的意思。我当时没有过多过问就答应下来了,然后开始就花了好几天去准备相应的方案。但今天跟大老板开会讲方案时,老板反而反问我这些公司还这么小上OA系统干嘛。而之前跟我讲的那个人却在旁边不说话。而我只能硬着头皮编几个不太专业的理由应付过去。当然最终的结果可想而知。老板最终没通过这个方案。

其实现在想想这件事情还是有很多解决方案的,首先需要先搞清楚他的目的,他其实也不是要故意耍我,只是角度不同,因为他负责的部门需要经常向这些小公司下发文件、通知之类的,如果有一个平台给他那么就能减少他的工作量。由于如果他向老板汇报的话说服力不强,老板可能不会同意,所以他想通过IT的渠道来推动这个事情,但由于他又怕如果直接这么跟我说的话我会拒绝,所以就跟我耍了个把戏说是老板要的。因为平时他跟老板很近,我们很多工作也得通过他才能向老板汇报,我也没有当面质疑他。当然如果这件事情我”帮”到这个程度也算是仁至义尽了。但是这样就有个问题,底下的员工会觉得老板不能体察民情,不知道底下员工的工作压力。所以现在想想其实解决这个问题还是有不少办法的。

最优解决方案
在刚接到需求时就开门见山的跟他讲你的判断,把他最原始的需求与想法问出来,共同去解决问题。

不当替罪羊的办法
不主动去汇报方案,把方案跟他沟通,如果没有问题再让他跟老板汇报。自己不主动。

马后炮的解决办法
明天再去找他聊一下,重新找解决办法解决问题。

技术备忘录

写点几个自己认为非常看好的领域,让未来的我看到自己现在是多么的无知、愚蠢、2B、留下点证据。

1. Win8

微软的下一代操作系统,拥有了跨所有终端的优势。如果能在上面开发好的应用的话只要该系统一发布,配套的硬件一上市必火无疑。

4d086e061d950a7b33888b850ad162d9f2d3c936

2. 移动应用

作为已经这么热火朝天的行业,还是会有很大的发展空间,不管是在生活应用还是在电子商务方面。

1-110Z91220031a

3.云计算

云计算必然会对整个互联网及软件生态圈产生巨大的影响。必然会加快应用的创新。所以以后的所有开发工作必须要与云计算(平台及服务等)结合。

apple-icloud-logo-1

 

2012.4.12 于北京出租屋

1988:我想和这个世界谈谈 (韩寒)–笔记

image

========================================

这就是曰复一日机械的工作带给人们的恶果。他让人无 一例外地忘记自己最 初的理想。过去了一年,我因为工作认真和跑得快,牢牢地把守着我们这一个年级的这个职位,在四节的眼保健操里,我需要检查四个班级,在这一年的头几个月里,我总是盯着女生的裙子看,等到天气冷去,大家都开始穿裤子。我慢慢地开始看她们的脸,我最喜欢看她们做第三节眼保健操,那是揉四白穴。在揉四白穴的时候,每一个女孩的面貌都清晰可见,她们把自己的脸扯来扯去,更是可爱。到了第二年夏天来临的时候,我已经忘记了再看她们的裙子。我只是发现了这个年级里所有漂亮可爱的女孩子,我仔细地观察过她们,她们的每一个动作,她们每一次颤动自己的睫毛,但是她们从不知道这些。
========================================

我总觉得在所有的故事里,我只是一个旁观者,我总是想做一个参与者,但我总是去晚一步。

试试语音博客


深夜不敢入睡,碌碌而无为!

为何要与优秀的人合作

 

女友下班回来买回了一袋草莓说是只有5块钱一斤,尝了一下味道像吃萝卜一样。我就在想同样是种草莓为啥不种好一点的品种呢(之前看过一个节目知道草莓好不好吃其实跟品种关系最大),虽然没种过草莓,但是我们家是有种田的,所以我觉得种好或不好的草莓在花的时间、精力来说应该是差不多的。那为啥种品种好的草莓呢?不知道是否是因为种子不好找,还是已经习惯每年都种这种品种或者其他N种理由。
想到前几天跟一个在创业的朋友聊天,我跟他说创业团队更重要,看那国外的初创团队的作品(网站或APP应用)做得真不是一般的人做的。他说创业之后团队并不是那么好找的所以只能快速先实现基本功能再说。我理解他说的意思。但是我觉得就像种草莓一样你可以先找个一般的品种先种着看看但是收成已经在种子种下的时候预示着了。
不只我创业的朋友那样,其实我自己在公司上班的时候也是同样的问题,由于管理经验不只曾经竟然还幻想着不管给我任何的人我都能把他给利用和培养好,但是真的带了团队之后其实从头培养一个人需要很多的精力。以我目前的能力和项目的压力是无法实现的。每次给这些人交待工作的时候b脑袋都很大。后来就开始在招聘环节把关了,零缺毋滥。
因此其实不管你是在上班还是在创业都是要尽量与能找到的最优秀的人合作。同样是种草莓希望大家都能种出又大又甜的。。。。。