Ning's profile人牲一笑PhotosBlog Tools Help

Blog


    September 24

    大鱼吃小鱼

    打开“开心网”,偶然发现和“土豆”合办的“平民百万富翁”活动。
    Web2平台提供商和服务提供商终于开始联手落地了。
    新的合作模式,盈利模式和技术创新尽在于此……
    大鱼吃小鱼,看来,国内Web2就要分出三六九等了。

    January 22

    终章:关于创业

    创业,市场、产品、企业、人。可理性参照的理论,可理性归纳的社会人,可理性分析的市场,可理性设计的产品,可理性管理的企业,可理性实现的技术……
     
    对外开市场、拓业务、走营销,对内升迁、管理、评估,不论策略如何,打交道的对象是“人”,个体的“人”。运筹也罢,博弈也罢,理论的使用者也是“人”。人是会犯错误的!运气,不可预知的“混沌”;机会,差之毫厘、谬以千里,所谓的“蝴蝶效应”。
    天时、地利、人和。天时不如地利,地利不如人和。
    与天斗,其乐无穷;与地斗,其乐无穷;与人斗,其乐无穷。
     
    如果没有做好斗争的准备,不要创业;如果没有一个良好合作关系的创业团队,不要创业;如果创业团队没有打拼“天时地利人和”的能力,不要创业。
    如果没有抢占市场的能力,不要创业;如果没有优势产品的规划,不要创业;如果没有细致周密的分析能力,不要创业。
    如果没有丰富的行业经验,那就需要深厚理论功底;如果没有深厚理论功底,那就需要强大的学习能力和积极的实践能力。
    顺着理一遍。
    IQ高的人可以雇佣,EQ高的人需要发现。将兵易,将将难。
    分析而发现市场盲点或新需求,进而规划产品,进而抢占市场。
    经验派、理论派、实战派,至少需要有其中一样。当然,理论可以在实践中归纳、经验也可以在实践中积累,代价问题而已。
     
    不然,不叫“创业”,叫“皮包公司”,叫“圈钱”!
     
    胡子胡诹一句话,站住了,活下去,求发展。
     
    IT创业,相对学院派气息浓重些,技术门槛高一些,……准备工作,可也不少啊。一笑,呵呵。
    January 20

    曲目四:附录、“变态”C代码的手工阅读

    // 原始代码
    #include <stdio.h>
    char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
    main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
    main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
    "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
    :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
    :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
    "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

    // 把代码格式化一下
    #include <stdio.h>
    char *a; // can be omitted due to function field
    main(int t,int _,char* a){
     return !0<t ?
      t<3 ?
       main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
       :1
      , t<_ ?
       main(t+1,_,a)
       :3
      , main(-94,-27+t,a)&&t==2 ?
       _<13 ?
        main(2,_+1,"%s %d %d\n")
        :9
       :16
     :t<0 ?
       t<-72 ?
        main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
        :t<-50 ?
         _==*a ?
          putchar(31[a])
          :main(-65,_,a+1)
         :main((*a=='/')+t,_,a+1)
       :0<t ?
        main(2,2,"%s")
        :*a=='/'||main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1)
     ;
    }

    // 翻译成常规语言
    // condition ? true : false ; a,b,c generate step
    #include <stdio.h>
    main(int t,int _,char* a){
     // 逻辑运算优先级,便于理解
     if(!0<t){
      if(t<3)
       main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a));
      else
       1;
      if(t<_)
       main(t+1,_,a);
      else
       3;
      if(main(-94,-27+t,a)&&t==2){
       if(_<13)
        return main(2,_+1,"%s %d %d\n");
       else
        return 9;
      }else
       return 16;
     }else{
      if(t<0){
       if(t<-72){
        return main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       }else{
        if(t<-50){
         if(_==*a)
          return putchar(31[a]); // pointer compile a[b] with b[a]
         else
          return main(-65,_,a+1);
        }else{
         return main((*a=='/')+t,_,a+1);
        }
       }
      }else{
       if(0<t)
        return main(2,2,"%s");
       else
        // condition compile step a||b
        return *a=='/'||
         main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
      }
     }
    }

    // 除去不需要的,重构if语句
    #include <stdio.h>
    main(int t,int _,char* a){
     if(1<t){
      if(t<3)
       main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a));
      if(t<_)
       main(t+1,_,a);
      if(main(-94,-27+t,a)&&t==2){
       if(_<13)
        return main(2,_+1,"%s %d %d\n");
       else
        return 9;
      }else
       return 16;
     }else if(t<0){ // 根据语义,可进一步重构
      if(t<-72){
       return main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
      }else if(t<-50){
       if(_==*a)
        return putchar(a[31]); // 指针编译原理a[b]和b[a],注意是char*
       else
        return main(-65,_,a+1);
      }else{
       return main((*a=='/')+t,_,a+1);
      }
     }else if(0<t){
      return main(2,2,"%s");
     }else{
      if(!(*a=='/'))
       return main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
      else
       return 1; // 等于(*a=='/')
     }
    }

    // 编译环境main入口,CRTO.C for main(__argc, __argv, _environ);
    // 方法的编译原来,返回值的寄存器状态
    // 变量的类型转换reinterpret_cast
    // 使用一个新的main方法,将旧的用一个新方法'decode'表示
    // 根据题设,本程序执行方式为无命令参数,即,argc==1
    // 变量的声名规约,改变变量名以方便理解
    // 进一步重构if语句
    #include <stdio.h>
    int decode(int arg1,int arg2,char* sCodec){
     if(1<arg1){
      if(arg1<3)
       decode(-79,-13,sCodec+decode(-87,1-arg2,decode(-86,0,sCodec+1)+sCodec));
      if(arg1<arg2)
       decode(arg1+1,arg2,sCodec);
      if(decode(-94,-27+arg1,sCodec)&&arg1==2){
       // 内部递归,无后续分支,可展平为递推方式
       if(arg2<13)
        return decode(2,arg2+1,"%s %d %d\n");
       else
        return 9;
      }else
       return 16;
     }else if(arg1<-72){
      // 可根据arg1范围代入。本条件代入后略
      return decode(arg2,arg1,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
     }else if(arg1<-50){
      // 内部递归,无后续分支,可展平为递推方式
      if(arg2==*sCodec)
       return putchar(sCodec[31]);
      else
       return decode(-65,arg2,sCodec+1);
     }else if(arg1<0){
      // 内部递归,无后续分支,可展平为递推方式
      return decode((*sCodec=='/')+arg1,arg2,sCodec+1);
     }else if(0<arg1){ // arg1 == 1,初始情况,根据arg1取值取舍
      return decode(2,2,"%s");
     }else{ // arg1 == 0
      if(!(*sCodec=='/'))
       // 内部递归,无后续分支,可展平为递推方式
       return decode(0,decode(-61,*sCodec,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),sCodec+1);
      else
       return 1;
     }
    }
    int main(int argc, char* argv[], char** _environ){
     return decode(argc,(int)argv,(char*)_environ);
    }

    // 分析出递归顶层返回值。
    // 注意所有return的含义,9/16/1/putchar(),Non Zero -> TRUE
    // 分析arg1的内容,重构方法,有些坳,自己试着理解吧
    #include <stdio.h>
    int decode(int arg1,int arg2,char* sCodec){
     if(1<arg1){
      if(arg1<3){
       decode(0,-86,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       decode(1-arg2,-87,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       decode(-13,-79,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
      }
      if(arg1<arg2)
       decode(arg1+1,arg2,sCodec);
      decode(-27+arg1,-94,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
      if(arg1==2){
       while(arg2<13){
        arg2 ++;
        sCodec = "%s %d %d\n";
        // 上方条件代入
        if(arg1<3){
         decode(0,-86,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
         decode(1-arg2,-87,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
         decode(-13,-79,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
        }
        if(arg1<arg2)
         decode(arg1+1,arg2,sCodec);

        decode(-27+arg1,-94,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       }
      }
     }else if(arg1<-50){
      // 判断条件可达,取舍
      char* s = sCodec;
      while(!(arg2==*s)){
       s ++;
      }
      putchar(s[31]);
     }else if(arg1<0){
      for(;arg1<0;arg1+=(*sCodec=='/'))
       sCodec ++;
      decode(0,arg2,sCodec+1); // 条件合并
     }else if(arg1 == 0){
      while(!(*sCodec=='/')){
       // 条件合并
       decode(-61,*sCodec,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry");
       sCodec ++;
      }
     }
     return 1; // return TRUE only
    }
    int main(int argc, char* argv[], char** _environ){
     decode(2,2,"%s");
     return 9;
    }

    // 分析条件,重构2
    #include <stdio.h>
    int decode(int arg1,int arg2,char* sCodec){
     if(1<arg1){
      if(arg1<3){
       // arg1 <= 0
       decode(0,-86,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       decode(1-arg2,-87,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       decode(-13,-79,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
      }
      if(arg1<arg2)
       // 1 < arg1 < 13(max arg2)
       decode(arg1+1,arg2,sCodec);

      // arg1 <= 0,下同
      decode(-27+arg1,-94,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
      if(arg1==2){
       while(arg2<13){
        arg2 ++;
        sCodec = "%s %d %d\n";
        if(arg1<3){
         decode(0,-86,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
         decode(1-arg2,-87,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
         decode(-13,-79,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
        }
        if(arg1<arg2)
         decode(arg1+1,arg2,sCodec);

        decode(-27+arg1,-94,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
       }
      }
     }else if(arg1<=0){
      // 单一条件代码组
      int border = (arg1<0);
      for(;arg1<0;arg1+=(*sCodec=='/'))
       sCodec ++;
      if(border)
       sCodec ++; // 边界条件,注意
      while(!(*sCodec=='/')){
       char* s = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
       while(!(*sCodec==*s)){
        s ++;
       }
       putchar(s[31]);
       sCodec ++;
      }
     }
     return 1;
    }
    int main(int argc, char* argv[], char** _environ){
     decode(2,2,"%s");
     return 9;
    }

    // 分析arg2代码流向,重构3
    // tip.arg1 in function decode always '> 1'
    // the usage of arg1, arg2, sCodec. Can be omitted.
    #include <stdio.h>
    void decode2(int arg1){
     char* sCodec = "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
     int border = (arg1<0);
     for(;arg1<0;arg1+=(*sCodec=='/'))
      sCodec ++;
     if(border)
      sCodec ++;
     while(!(*sCodec=='/')){
      char* s = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
      while(!(*sCodec==*s)){
       s ++;
      }
      putchar(s[31]);
      sCodec ++;
     }
    }
    int decode(int arg1,int arg2){
     // 考虑初始条件的 arg1 == 2, arg2 == 2,代码合并
     // 内部递归,展平为递推方式,注意边界条件和递归嵌套的调用特点
     if(arg1<3){
      decode2(0);
      decode2(1-arg2);
      decode2(-13);
     }
     if(arg1<arg2)
      decode(arg1+1,arg2);

     decode2(-27+arg1);
     if(arg1==2){
      while(arg2<13){
       arg2 ++;
       if(arg1<3){
        decode2(0);
        decode2(1-arg2);
        decode2(-13);
       }
       if(arg1<arg2)
        decode(arg1+1,arg2);

       decode2(-27+arg1);
      }
     }
     return 1;
    }
    int main(int argc, char* argv[], char** _environ){
     decode(2,2);
     return 9;
    }

    // 最终结果
    #include <stdio.h>
    void decode2(int arg1){
     char* sCodec = "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
     int border = (arg1<0);
     for(;arg1<0;arg1+=(*sCodec=='/'))
      sCodec ++;
     if(border)
      sCodec ++;
     while(!(*sCodec=='/')){
      char* s = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
      while(!(*sCodec==*s)){
       s ++;
      }
      putchar(s[31]);
      sCodec ++;
     }
    }
    int decode(){
     int arg1, arg2;
     for(arg2=2;arg2<=13;arg2++){
      decode2(0);
      decode2(1-arg2);
      decode2(-13);

      for(arg1=arg2;arg1>=2;arg1--)
       decode2(-27+arg1);
     }
     return 1;
    }
    int main(int argc, char* argv[], char** _environ){
     decode();
     return 9;
    }

    // 额外写段代码,看一下。对照之后推一下原始代码的结果吧。
    #include <stdio.h>
    int main(int argc, char* argv[], char** _environ){
     char a[]="@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
     char b[]="!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
     for(int i=0;i<sizeof(a);++i){
      for(int j=0;j<sizeof(b);++j)
       if(a[i]==b[j]){
        a[i]=b[j+31];
        break;
       }
     }
     printf("%s",a);
     return 1;
    }
    On the /first/second/third/fourth/fifth/sixth/seventh/eigth/ninth/tenth/eleventh/twelfth/ day of Christmas my true love gave to me
    /twelve drummers drumming, /eleven pipers piping, /ten lords a-leaping,
    /nine ladies dancing, /eight maids a-milking, /seven swans a-swimming,
    /six geese a-laying, /five gold rings;
    /four calling birds, /three french hens, /two turtle doves
    and /a partridge in a pear tree.

    /

    January 19

    曲目四:程序员胡子的N项修炼

    程序员胡子,零零碎碎学了不少,不过简历里的Skill Set一向只写C/C++/Java。其他的只能说是应急而拿来“用”罢了。不谈。
    此处谈的是“能力”,而不是具体的“语言”使用,算是胡子的程序员“理论”吧。

    人人对话,人学机话!

    语言学习能力。学语言实际是换位思考,真正了解自然语言的词法,语法。那么对于严密的自适应逻辑语言的学习是差不多的。胡子总结了三点。
    语言语法、句法规约。胡子学Basic用了三年,到Java只用两天看完Thinking in Java就拿来用了;
    语言所体现的概念、思想。POP/OOP/...语言的思想才是最重要的,需要深刻的学习和理解。不然,只能算是“拿来用用”罢了;
    图灵语法归纳进而编译原理。追本溯源,可在学会用一种语言之后再进行。真正了解语言是如何练成的!
    听说读写,此谓之“听”!

    语言表达能力。实际是换位思考的一个锻炼途径,作为学习计算机逻辑语言的一个中间步骤。学说话,多说就可以了。称为“伪代码”过程,不求编译通过,甚至不必经过电脑,只需要逻辑说得通。用纯逻辑(计算机)的脑袋“说”!


    人机对话!

    编译运行环境学习。
    编译规则/步骤。由C/C++而言。入口,命令行参数,make(如何make),link(如何link)。而后的java作为高端的二维机器语言主要编译环境在虚拟机的配置上,在了解虚拟机工作机制之外就没有进一步研究了,不细谈。
    运行规则。主要是编译器编译运行的规约。如C++ / Java子类父类实例化过程。
    准备工作,找到“桌子”、“纸”和“笔”了!

    编码阅读能力。慢慢道来。“读”!
    静态编码阅读能力。主要是语法规约、句法阅读、理清逻辑、从逻辑语言映射到自然语言中。当然,有高人是直接用逻辑语言思考的,需要大量的实践和锻炼。一个几年前看到程序分享一下(长得很像,似乎是那个,今天刚从网上搜的),当时好像折腾了胡子一个多小时。权且作为一个简单的C测试吧。

    #include <stdio.h>
    char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
    main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
    main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
    "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
    :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
    :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
    "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

    调试能力、动态跟踪能力。把这归到代码阅读里面来,因为是基础的基础,后面测试debug就是这项能力的最大用途。当然,此道终极就是可执行程序反汇编分析。很多私有协议分析家,程序机制分析家甚至一些黑客都是此道高手!需要经验,需要耐性,需要数学功底和严密的逻辑。最后一点,需要兴趣。胡子一个朋友Shrek就是一牛!胡子自己?仍然只是高级语言(C/C++)级的应用者而已。
    编码阅读能力的一个培养方法就是学习《深入浅出MFC》;把MFC动态跟一遍,再读一遍。然后再自己跟一遍ATL,潘爱民《深入解析ATL》。(基础,java什么的就不清楚了,找些开源的代码吧,struts不错;.NET不知道,MONO?!循序渐进,慢慢来吧)

    编码能力。“写”!
    编码规范能力。养好习惯,编码规范,不细说了。合格的程序员必经的一关;
    精简编码能力。实际是对自己逻辑思维和分析能力的抽象提纯过程。能用一句完成的不用两句;
    编码优化能力。对编码性能的要求。需要对编译器和软件底层了解,对编译环境的辅助能力有了解。如,*2和<<1、t=a;a=b;b=t;和a^=b;b^=a;a^=b;、循环中的idx--;、C的一些lib中那些函数可以复用等。进一步的,需要“理解”,“为什么”,看看组成原理和一些虚拟机的代码吧;
    再进一步的,称为“重构”能力,稍后谈;
    Debug能力。自己开发的程序很多知识、思维盲点,操作失误而造成bug。为达到满足需求的自适应能力,debug必不可少,不过重点只是基本功的运用而已,注意自身盲点(当年跟过两天一夜的DDK代码注入在MFC一个静态变量前被block掉的bug案例。窃以为豪!);
    寻求帮助的能力。学会自己解决问题,很多问题你不是第一个发现的!学会查msdn、学会google……这是一项能力,需要修炼的。最后才是询问高手,也希望高手不吝赐教。

    测试设计能力。这个不精通,简写。“检查”!
    功能测试。仍然是换位思考,重新根据需求设计测试案例。避免实现盲点,需要严谨的思维和丰富的经验;
    压力测试。实际是另一类型的编码,专门测试软件的应用。不会,不多说;
    以测试的思维进行编码。已经不算是一种新的理论了,测试驱动。
     
    新理论和新技术学习能力。学会分清是真正的新理论还是“新瓶旧酒”。新技术往往是新理论的实现。因为人的立场,新理论往往是现实世界到软件世界中的映射。一维的POX,二维的OOX,三维的AOX,整合业务理念后现在大热的SOX……学会转换角色思考,理论理解才是技术理解的保障。也许,下一个理论就是你发现的。
     

    站在二维的高度设计,站在三维的高度架构。展示人类生存的世界给可爱的计算机们……

    根据业务(需求规约)抽象、映射能力。基础,模块源起。闭上眼睛,慢慢体验……
    模块设计能力。《设计模式》,二十四式也罢,四十八式也罢。可惜用得多了之后,胡子已经忘了那些个名称、分类了,只知道根据要求排列组合了;
    系统设计能力、公共模块抽象能力、系统阅读能力……


    天地四方曰宇,往古来今曰宙。四维的软件工程思想!
    软件工程能力。不说了,看书、自己印证……


    人与自然,算是自我充电吧!
    业务阅读能力。
    学会调节,学会放下,学会玩,放开纯理的思维。人即是人,机即是机。人可役机,机不可役人。


    打住,写不动了,就虎头蛇尾吧。一笑,呵呵。

    千头万绪,如何取舍,听君自便。
    如果不能成为创造理论的大师,那就老老实实成为“专家”。无他,唯手熟尔!
    “勿在浮沙筑高台!”

    January 18

    曲目三:右脑思考的程序员……

    脑袋瓜,分两片,左边理来右边感。
    “左脑主要完成语言、逻辑、分析、代数的思考认识和行为,以及记忆;右脑则掌管音乐、声音、绘画、图形、色彩、感情、空间认识、想象、创造,以及第六感”。
    程序员,作为一类经过多年学习、锻炼、实践成长而来的数学功力深厚严谨的逻辑语言的使用者、组织者,往往不自觉的转换成为“理性机器”……技术无止境,数学远未穷根溯源,语言体系也大有精简完善的余地,但是现在系统越做越大,分析设计、统筹规划、体系理论,如何才能发挥作为“人”的优势?兄弟们,学会使用你们的右脑!
    除了感情、创造和第六感。右脑的形象思维完全可以帮助程序员见识到软件世界的丰富多彩、理解软件体系,甚至——胡子称之为“软件生态圈”。
    (题外话。发展至今,重建软件生态圈!可以么?不可以么?需要么?不需要么?一般情况来说,不逾矩!矩者,已有的规则、协议、语言限制等等。创造者可以是大师,但是创造世界的还是人!)
    以空间为例。
    现在的系统设计,已经由原来的二维平面设计,一维编码,提升抽象到立体空间的层次结构,三维空间架构。而对应的理论体系也是立体的(POX》OOX》AOX)。
    软件之“道”,千变万化,胡子胡诹曰“将四维的世界以三维的架构通过二维的设计由一维的编码实现出来。既完成,而实无完成者也”。
     
    右脑,帮助理解业务,配合分析设计“大系统”……
     
    右脑思考的程序员,也许不是那么纯粹了。不过,对于遇到瓶颈、寻求突破的兄弟们,不妨用起你们的右脑吧。
     
    结束语,这篇文章应该是在右脑“创造”加上“无聊的感情”活动的产物,当然也有左脑语言和逻辑能力的功劳。一笑,呵呵。
    January 15

    曲目二:软件行业的职业规划——给新进者

    做软件的,胡子自做主张归纳一下。有些提法是自创的,便于理解,如有雷同,纯属巧合,就不花费时间去Google验证了。

    目前做软件的简单来说两个方向,搞研究的(底层研究)、搞应用的(高端应用)。

    前者为计算机本身理论体系服务,胡子认为,归根究底可称为CAH(Computer Acts Human)。
    通过研究人的行为使计算机模拟人(进而学习人的本质),一些语言特性归纳,理论体系(包括实现,如OS生态圈、中间件高端调度平台等),模式识别,编码方式(如交互时信源、信道编码等),人工智能等;
    或者提高人机交互能力,如三维成像,语音识别等。

    任何一项研究的结果都需要转化为实际的生产力(利润点、产品等等)。所以,后者在享受前者成果基础上,进行组合,利用计算机的优势,结合现有物理世界理论为现实服务,姑且统称为CAX(Computer Aids XXX)。这部分核心为“为业务服务的”产品,或者由产品二次开发而成的产品。目前几乎80%的面向市场参与竞争的产品都可归到这一类。

    就此打住,术业有专攻,不半瓶水逛荡了。

    那么简单来说现在有两条大路,可以作为技术出生的新进者一点个人发展规划的参考。简述之。
    一条是研究路线,称为开创世界的人,走的是专家路线,成果对高端应用来说,甚至可理解为透明的。受现实世界的影响,能力够还需要对应知识积累、工作机会的影响……走在这条路上的需要很多的机遇。限于人生已走的旅程,胡子不是这一块的,只是兴趣到了看看玩玩而已(算作爱好了,有空把些瞎想的也写下来分享分享)。不多谈。

    另一条应用路线,可称为研究成果产品化的路线。姑且一探。列举几条,不分高下,分工不同。

    技术专家路线,使用现有工具,跟踪现有理论的人才。对于新技术,有一部分算是跟着技术最前沿的人,是先行者,部分可以慢慢转向底层研究领域,使新技术成熟、完善起来。但是,出于几乎所有产品对于稳定性的要求,技术的应用以“稳”、“精”为主,真正的专家,也许不是走在最前沿的,而是若干单一技术领域研究透彻的权威!他们是稳定产品的保证!因为“专”,所以成为“家”。做个简单的类比,所谓“时尚”,所谓“跟风”,那些柜子里成堆的衣服有多少穿了超过十次的?区别是技术“跟风”消耗的是时间和精力;

    业务/领域专家路线。产品是以技术为手段,解决业务问题的。技术在一定程度上限制了产品的表现。产品体现的业务能力可以作为产品优劣的依据之一。领域专家由此而来,如果对技术发展遇到瓶颈(往往受企业策略影响),那么可以寻求适当转型。业务成为另一突破口。是“懂业务的技术人员”还是“懂技术的业务设计人员”?自己选择;

    管理路线。管理是另一门学问。随着企业的发展(扩充、组织架构调整等),一部分“老资历”的人能够被公司提升到管理层。算是一个大的转型了。(是否转型?是需要决策的!当然,有魄力实现决策是十分可贵的。权利和名号还是比较诱人的。某些公司的专家职级等同于项目经理甚至是部门经理,是十分科学的。)需要实现思考方式的转变和处事方法的转变,不然可就“尸位素餐”了。小提一下,原相关项目的项目经理》任意项目的项目经理》平衡项目的部门经理》规划战略、决策的更高层次管理者……视能力而定;

    大转型,不穷举。比如转型做销售,转型做业务拓展……很多这类转型是由于公司的上层战略改变或者结构调整,使技术员感到迷惘和郁闷。但是,对于技术遇到瓶颈、失去热情(或者以为热情其实不是),EQ不错,外向等等性格特点的未必不是一条好路。世界上最好的一类销售人员80%是做过产品技术的……当然,也有部分转型的是早就定位好的,为这类同行们的勇气和预见性致敬!

    转出去还是走回来?那是一个问题……

    最后,有两点必须注意的。世界并非理想,计划不如变化,很多事情看机遇,需要学会接受和调整;技术并非所有,受很多价值观影响,金钱、权利……了解自己,需要考虑在内。
    就这么多了,列为看官,你们准备好了么?一笑,呵呵。

    断断续续写的,思维不连贯,有些地面比较迷糊,有空再改吧。

    January 14

    曲目一:项目经理做什么(软件)

    题记:公司梯队建设,胡子准备大放阙词一把。由于原创,在自己的Blog中备份一把,分享。应该会发展成一个小系列的吧。

    为现在愈行愈烈的外部项目而开,主要是项目经理,顺便巩固一下理想状况中的外包组织架构模型。普通软件项目也可参考。
    注,可以称为胡子“窥斑见豹”,在小几年经验基础上,部分是自己瞎琢磨的,姑且一看,未必适用所有,甚至有思维盲点及误区。
     
    如何定位,由完整项目的角色定义而来。简要归纳一下。
    项目过程(及监督人员);项目人员;客户;项目管理人员(项目经理);横向辅助实体(水平服务部门等);高层管理人员(部门经理等)。
     
    项目过程及监督人员一般体现为过程改进常设部门及QA,以现有软件工程理论为指导,参考实际企业水平而作调整、归纳;
    项目人员贯彻项目过程,根据项目进程涵盖各方面项目人才,一般情况下包括需求、分析、架构、设计、实现、测试等环节;
    客户,包括项目预算(普遍体现在时间及金钱);业务需求提出,是项目白盒入口;项目过程监督和项目产品验收;
    项目管理人员,实际涵盖几个细分角色:管理角色,项目对外沟通管理角色,项目内部管理角色。稍后详细归纳;
    横向辅助实体,一些项目相关的支持,包括环境预算,领域专家,财政,人力等方面的支持,在组织架构模型是作具体描述;
    高层管理人员,负责项目监控,防止新进项目(经理)走偏,项目横向沟通的调控,以及不同项目等级、项目特权的批准等。
     
    由此产生理想状况下的外包组织架构模型,以提供直观理解,不详述。大致思想可参考“横向池模型高效项目方法论”(那篇有些乱写,多担待)
    组织架构图:

    项目关系图:

     
    下面详谈一下项目经理的能力和要求。
    项目经理的管理角色,太多相关的描述了,就照本宣科,再分享一张以前“珍藏”的图片吧,不详述了。稍提一句,别走太远,切合公司文化啊!
    韦尔奇的4E+1P(可参考印证,可能受文化局限性,列位看官自己斟酌):
    Energy 积极向上的活力(有所作为的行为精神)
    Energize 激励别人的能力(鼓舞、分享、唤醒团队精神)
    Edge 决断力(对是非问题的决定勇气N种备选方案)
    Execute 执行力(落实的能力,如何把决定成为行动)
    Passion 激情(衷心而强烈的真实兴奋感)
    另一个关于管理者的特质直观图片如下,各自理解吧。

    项目经理的对外沟通管理角色,
    项目需求的理解加上项目代价的评估以满足项目收益。对于多变的项目,不能保证项目经理对所有业务领域进行精深的了解(不排除专一领域的项目经理),需要在业务领域专家的帮助下对项目需求进行完善的理解。并且在此基础上进行项目代价评估,评估内容包括对项目人力资本和工作代价的评估,注意在领域专家和技术专家的帮助下对项目风险进行大致评估;
    合理的外交手段,包括对于项目预算、收入和资源利用的协商和合作过程中交互的能力。进一步的,需要在协商过程中体现企业文化,并对于客户文化进行一定的了解;
    合理利用项目过程中对于项目监控的能力以为客户提供合理合适的项目切入点。

    项目经理的内部项目管理角色,
    对于参与项目过程水平合作部门的合作能力,QA、专家组、水平服务部门等;
    对于项目过程的理解、选择和应激能力;
    对于项目技术的理解,以对项目技术进行评估,并且进一步对项目团队成员的能力进行确认,以最大程度的发挥人才能力;
    对于内部人才池人才能力的了解、信任和控制能力。对于单一固定团队,则表现为对团队成员的了解、信任和控制能力;
    对于公司内部资源的了解以保证横向沟通的能力,节约项目时间成本。

    最后,必须提一点,项目经理只是技术人员发展的一个方向(胡子有空,可能再写篇小博),可以领导技术人员,必须对技术和业务领域“博”(知道做什么)、“准”(知道怎么做的过程并预估成果)。但是,由于“博”,导致不太可能都“精”(知道怎么做的细节)。所以,在深刻了解、理解风险控制的理论上,认识到这一点,“项目经理和团队成员甚至专家小组,只是工作过程中不同分工的一种合理的组合。勿在浮沙筑高台!”
    项目经理们:请对技术人员和领域专家给予必要的尊重!