我在2008年~2009年第一次创业(当然,那次创业应该是失败的,但让我突破了当时自己的天花板。),当时看到自己技术团队的一些问题,并且结合亲身经历,写下了http://blog.sina.com.cn/s/blog_40c02edd0100f8pk.html。
不管如何,觉的这篇文章对当下的技术菜鸟还有用,所以就放到这里吧,权当一个从前创业失败、现在又上路的人对技术和人的一些经验总结吧。
工作已经7年了,作为一个IT技术人员,从刚毕业的初级程序员,做到现在创办自己的公司,这期间经历了各式各样的项目,遇到了不少的各种个这样的技术人员,自己也有不少的长进和体悟。
就技术领域而言,我所涉及的面相对广泛,因为毕业前3年所从事的都是用C/C++做比较底层的工作,比如支持多用户、多线程对一个DLL的调用的并 发,写过COM和ActiveX,封装过线程库、Socket库,各种协议栈的通信处理等,基础的的C/C++代码超过10万~15万行(第二年负责的一 个核心模块就有6万多行代码),所以很幸运自己能够在一开始就能打下这么扎实的基础,使以后对技术的把握可以更加得心应手,最让我自豪的是这期间我创造了 SCS。后来我逐渐偏向上层应用,经历了各种Web网站,基于J2EE的银行系统,VoIP,3~3.5G的流媒体等一系列项目的历练,使用了一些现在流 行的ACE,Xerces,Web Service,EJB3,Spring,Asterisk,Flex,J2ME等框架和平台,除了积累了很多项目经验,在管理团队上也逐渐得心应手—— 可以说,现在年近30的我,已经逐步找到了一个技术人员的定位。
这7年下来,在我身上,或者在我接触的技术人员或者自称为技术人员的身上,不断发现了各种各样的问题,最近正好不忙,本着有则改之的态度,做一些总结,希望对自己,对大家都有所帮助。我说的这些问题,不包括所谓程序员孤僻寡言的性格之类的。
***************************************************************
一、技术功底不扎实
当时我在学校的时候,自己对很多技术就有了初步的研究,买过过一些软件的书籍,看过其中大部分,也做过一些实际有外快的项目,在省级软件竞赛上也获 得过奖。记得当时大三,我每天坚持到图书馆看《Windows核心编程》,那时候看起来比较吃力,但还是做了笔记,现在笔记还在我的书架里,而且这本书对 我以后在Windows上的开发帮助很大,对我理解其他操作系统的帮助也很大。另外在学校也学习了C++,很早就学会了VS 6这个IDE,可惜没有太大的项目给我练手。毕业很顺利,老师介绍我去了一家美国软件公司,后来在那里也比较闲,本职工作只是用Windows SDK和MFC开发一些界面,就先后按照当时Web的项目组的项目的原型,构造了一个PHP+XSLT+XML的网站,然后是一些JSP、Servlet 和Java Applet例子,后来自己找事情,开始学习COM,AtiveX和ATL,买了一些书,这些书让我对C++有了更加本质的认识,可以说已经开始有了对 C++内力的基础。
后来离开这家公司,我有过用VB和VC写一个电视点播自助系统的开发,让我体会到了开发的痛苦。
而后转入到移动中间设备的开发——这是我代码量产最多,也是我对计算机编程受益最大的时期,这期间,我主要负责核心交换模块的开发,在我离开这里之 前,我总结过,从核心交换等模块,几个AcitveX,还有一些基于XML的智能流量测试工具等辅助模块,大大小小,我用C++写过10多个模块,还用 J2SE写过一个底层交换的模块。在空闲,我还阅读过设计模式,分布式处理系统等书籍,让我对编程,对架构,对设计模式等很多东西都有了很深的认识。
之后我构思SCS(那时候叫软件活化技术),通过对非常底层的编译到上层的应用的开发,实现了SCS,让我对IT技术有了更加宏观的认识,那时候对SOA、Middleware等各种新的概念都理解的很快。(最近,我用重启了SCS的开发。)
之后我就逐渐转向上层的实际应用,很多项目都开始直接使用开源的库或者工具来是实现,先后进行了VoIP的一系列开发,一个3~3.5G手机视频系 统的开发,一个基于SOA和EJB3,Spring(EJB3和Spring分别应用在两个独立的模块,用Web Service进行整合)银行项目的开发等。这期间,看书少了,主要是通过搜索引擎来学习,很好的利用搜索引擎可以很快放大一个技术人员的知识和能力。主 要学习的方向也从具体的某个技术转向更高的框架和平台、以及管理和商务上的一些知识。
经过以上所描述的7年,我有了现在比较扎实的技术功底。反观这7年我所遇到的同事和同行,以及我现在和别人合作,或者招聘时遇到的一些人,我觉得国内的IT技术圈在技术上,大多数人的技术功底都不可靠,当然这只是我的一己之见,下面说说为什么我会这么认为。
首先,我遇到很多搞技术的,挡在一起工作的时候,他们很少和别人沟通技术,比如现在的新技术,新方法等,也很少去留意这些技术,他们只关注本职工 作,比如他们刚毕业,就需要跟着项目组用Stucts+Spring+Hibernate实现项目,他们就会去学习,然后用这些技术工作,对其他技术也不 再关心,以后就算换了工作,他们也会找Stucts\Spring\Hibernate的工作,你要问他们所掌握的技术在宏观上看,处于什么位置、那一 层,他们不知道;要问他们对这些技术的由来、底层的原理,他们也不知道。他们只是会用这些技术。我试图过分析他们,我是这么想的,他们对技术本身并没有什 么热爱,他们只是需要一个工资比较高,听上去比较好听的工作——比如做IT、做软件的,然后他们就死抱着自己的一技之长,在漫长的职业生涯中贷款买房、等 待退休……我觉得大多数IT技术人员都在这个范畴,要求他们要有扎实的技术基础,从而可以进行更高一个层次的工作,那是不现实的。
其次,是一个比较宏观的原因,联系到我们国内的实际情况,每年有大量的IT或者非IT行业的毕业生涌入IT技术开发这个行业,对于这些新手的需求, 永远是供大于求,这些新手的成本也就很低,那么前几年毕业的师兄不可避免的就要往上走,去当这些师弟师妹的师傅,逐渐走向领导岗位。我在2004年的接触 过上海的一家相当规模的门户网站,他们那时候招收了一个毕业才一年多的小伙子,做技术。2005年我再去他们那里,这个小伙子已经是一个团队的经理了。还 有一次是2006年,我遇到一个从上海交大毕业1年多的同行,我当时是Leader,他问我当Leader要不要写代码,他怎么才能当上Leader不写 代码,和他持有相同观念的人我接触到的不是一个两个。从我的角度,对于Leader的职责,不是在于他写不写代码,而是他能不能很好的带领团队去完成技术 任务,满足客户需求,但是当他的技术都不扎实,他所带领团队的技术又怎么让人信服呢?所以,当我们国内普遍有一些2~3年经验的人就当了技术部门的领导, 而且都不想写代码了,那么试问,我们的技术怎么会扎实呢?现在我们用的很多技术都是从国外舶来的,这些技术也都是国外那些在技术上扎实的大师,在不断的编 写代码中提炼出来的,如果我们没有一个扎实,可持续的技术环境,我们怎么去提炼我们的创新技术?
以上我所说的让我想起一个例子,在2006年~2007年的候,一个美国的工程师和我一起做项目,我下面还有一个9人的团队,这个美国工程师的敬业 让我非常敬佩,除了团队的管理方式,就很多代码、架构等基本的技术性细节他都自己亲自和我一起探讨,在我们这个团队遇到疑难问题时,他也都协助大家一起解 决;他还负责和美国客户的沟通。他在微软、赛门铁克等大公司都工作过……反观我所接触的国内所谓的中、高层技术人员,其实大都不写代码,甚至不接触技术很 久了,和他们谈话只感觉到一种空洞,这种人在国内技术中高层的充斥让人寒心。
最后,我想说的是一个更宏观的大环境,这个环境里,大学的高级教授不在做学问,而是利用国家、学校给予的资源带着弟子用J2EE、.NET等所谓国 外技术给企业开发应用赚钱,并且美其名曰:XX国家级实验室或者XX国家级研究中心……在这么一种浮躁的、金本位的环境里,有多少人可以踏踏实实的做技 术、做学问呢?我遇到一些刚毕业的技术人员,不能踏踏实实做事情,一开始写代码就叫苦不迭,给别人诉苦说自己不适合做技术,适合做销售,后来就做销售,也 做不好——最后不说一事无成,就连基本的一技之长也都没有。前年遇到合作的一个老总,他给我推荐一个技术高手,和这个高手一沟通下来,这位高手也老实告诉 我,他连一年技术都没有做满,现在只知道一些技术词汇,忽悠这些老总足够了,哈哈,这位老兄的坦率让人敬佩,但是这样的人多了,难免会对国内的整个技术圈 有很坏的影响!我想,这也不光是IT技术圈才有的情况。
二、对技术关注过于片面和过激,忽略人和实际需求
所谓“存在即合理”是一个很正确的哲学观念,所以技术的存在有其必定的合理性,其合理性就在于能够为人们提供各种有价值的应用。鲁迅讽刺孔乙己会4 个回字的写法,就是因为文字书写形式存在的合理性是为了方便人之间的沟通;而会写4种回字存在的合理性在于炫耀,一点也不实用,还招致别人反感。我见过一 些对技术有热情的同行,就陷入了种种技术上的不实际中。
我见过一些同行,对技术是非常投入的,但往往忽略了技术存在的本意是为应用而生。当他执着于一个技术时,就会偏激的反对一切,就算Team Leader已经都规划好了,他也会反对,并且表示如果不用某个技术,就不工作——哈哈,我在2004年的几个月,也有这么一股子走火入魔的境界,还好当 时我的Leader不错。
其实一个合格Team Leader在规划项目各个细节的时候,是从全局考虑的,会从资源、客户、团队的组成、时间等一系列因素去考虑,技术只在被考虑的因素中排在的第二梯队, 那些敏捷方法的大师们也是这么认为的。而一个过度的技术爱好者,因为处于对已有技术的热爱,或者对新技术的追捧而舍本求末。我认为,不光是Team Leader,任何IT技术人员都应该从实际应用角度选择适合全局的技术。我在想,那些脱离实际应用的技术狂人,一定很累,因为每天早上起来,就有一些技 术淘汰了,还有一些技术又诞生了,他们颇有一种在潮起潮落嬉戏的精神。
我觉得正确的方式,应该注重人和实际需求等大的环境,再考虑技术,而不是盲目的追求新的、高的技术。如果真的喜欢技术,那么就把技术用在适当的应用 上;在某些应用上因为片面和过激去使用一些不合适的技术,本身就是对这些技术的亵渎,就好像有个人很擅长打老虎,但是现在这个人却被派去杀猪——这是对这 个人的才能的亵渎。
三、对新技术应用的死搬硬套
前几年,看到网上一篇文章,说是使用XP编程(也就是极限编程,敏捷方法的一种,不是Windows XP),导致他们项目的失败,然后就一一罗列失败的原因,最后结论是:不是每个团队都适合XP编程云云,似乎挺有道理。
当我们在学习别人的思想的时候,我想最起码,也是最重要的就是要去了解别人的立意,别人到底想让你学习到什么。然而在这点上,我们很多人都有不足, 我前几年也是如此。就说这个XP编程,那些敏捷方法的大师们列出了XP编程的很多注意点,很多方式和流程,正确的学习和使用方式就是以人为本,灵活的取 舍,然后再加以应用。我自己就在2006年开始用XP编程(美国同事的指导下),效果都很好,我根据自己团队的情况,有选择的加入了很多XP编程的方式, 比如每两周一个Iteration;对于Acceptance Tests我们不是写的自动化测试工具,而是广义的使用了Excel,客户和我们的测试人员每天都在根据这个Excel测试,因为到底不是所有东西都能方 便的用测试工具,而且有些实现测试工具的成本本来就很高;对于结对编程,没有完全采纳……(有时间大家可以和我交流),结果项目进展是比较顺利的。反观写 前面我说的那篇文章的老兄,未免就有点死搬硬套了,敏捷方法不是流水线的规定流程,而是一系列方法的参考,更是一种对实事求是、应时而变的思想的贯彻。
说道具体的技术,这样的例子更多了,比如我刚毕业的时候,Web项目组把整个网站都用PHP+XSLT+XML+面向对象的数据库(那时候是 2002年前后,XSLT+XML的网站方式在国外提出也还不久,主要是能分离UI、业务逻辑和数据的开发)来实现,技术上非常好,而且是个很好的MVC 教学模型(比现在的Stucts都好),但是结果这个网站使用起来非常慢,而且开发周期也脱的非常长,网站维护也很麻烦,最后十几个月后,这个网站宣告失 败。类似这种的大大小小的例子,我相信你们还可以举出更多。
任何技术都有其定位和适合应用的领域,所以我们学习技术,更要学习如何的把这个技术用在合适的地方。网上有很多争论,比如C++还是Java好,真 是可笑,他们的产生有其各自的历史背景,不同的目的,这种比较就好像比较杀猪刀好还是水果刀好,准确的答案是杀猪的时候,杀猪刀好;削水果的时候,水果刀 好。但是很多人还是像真有那么一回事一般的列举自己的经验,引用国外或者台湾技术大师的语录来争论这个问题……哈哈,真是可笑,可笑之一在于,这个问题本 身的立意就有问题,还争先恐后的去回答;可笑之二在于,死搬硬套技术就行了,还死搬硬套技术大师的思想来证明自己的正确;可笑之三在于,当我们在争论的时 候,C++和Java两位老兄可能都在一起苦笑——苦笑他们怎么一直被误解,被伤害,被死搬硬套。当然,很现实的是,如果没有一定的经验和对C++和 Java的理解,是无法真正了解他们各自的真正擅长领域的,而且对于他们的选择,主要还是取决于项目、人、需求等客观因素,也就是判断你现在在杀猪还是在 削水果,怎么判断就看你自己的功力了。
四、只会使用,不会灵活创造
现在国内Java圈子越来越大,以前带团队的时候,一个成员进来就告诉我说,如果不能学习J2EE,就离开团队。而且随着这个圈子的扩大,越来越多 的应用都转移到了Java上面,而且越来越多的技术人员都以自己学习Java为荣,很多公司都用高薪来招揽Java开发人员……在这些现象背后的实质是什 么呢?其实是越来越多的开发人员加入到流水线,成为流水线的工人,为什么,试想,无论这些Java人员自认为多牛,他们都在使用别人搭建好的框架和平台, 比如Spring,Stucts,Hibernate,EJB3等,就算他们在学习这些框架和平台的时候,知道了很多设计模式的东西,但是在使用这些框架 和平台的时候,他们又有多少空间去实践这些设计模式呢?他们无非是在国外大师们用各种方法和模式积累搭建的框架和平台上做填充的流水线工人,他们已经很满 足了,还能指望他们去积累创造自己的东西吗?
其实国内很多公司都有自己的技术积累的,我认识是很好的积累,但是对于这些公司的人来说,他们看到的只是表面的市场收入。我接触过一个国内顶级的公 司,看过他们的源代码,涉及对多线程、原子操作、通信、协议栈等的各种封装,也都是这个公司的很多技术人员在开发项目的时候不断积累的,当逐渐的他们转向 Java的时候,这些积累就被放弃。当时我在想,为什么他们或他们的技术人员有针对性的拿出这些资源,成立国内的开源团体,为大家提供类似Boost、 ACE之类的框架和平台呢?而国外就有这么多开源项目和团队,特别是像Apache、Eclipse这种团体,得到各个公司的支持,有些公司还贡献出自己 的项目。我仔细想过,这里从上倒下,需要一系列产业环境的配套才行,我们都不具备,或者我们都还没有意识去向那个方向去走,对于这种情况,我们技术人员和 很多企业有很大责任,我们技术人员也需要一些动力。但我也很乐观的认为,5年以后,我们的情况会有很大的改观,我也看到国内有一些团体和个人正在向那个方 向努力。
现在网上习惯说大虾,大牛,所以我们有很多Java大虾、C++大虾、.NET大牛等,不一而足。大虾、大牛的叫法,非常风趣,被叫的人也很开心, 但是我这里想讨论的是,我们国内既然有这么多大虾、大牛的,但是怎么并没有多少诸如国外写出ACE、Sping、Linux内核、Lucene等框架和平 台的人?我想这是我们很多同行在问的问题,对于我自己而言,到不惭愧了,我有了自己写的SCS(也许要到2010年大家才会熟悉);对于国内的少数同行来 说,也不惭愧了,比如灰狐团队就有写了一些自己的给予Java的框架,还有一些PHP的开源的MVC框架等。但是问题在于,如果我们的同行没有普遍的把积 累转变为创造的意识,我们整个技术的大环境就不会好,相关的配套也就不会好,所以就算有少部分人有了自己的创造,也没有很好的支撑环境,履行艰难。我会在 后面逐步推进SCS的时候尽力做一些有利于我们大环境的事情,也希望大家都来推动,我也觉得我们的同行都有推动改善我们圈子环境的潜意识和动力,把这些大 牛、大虾的都组织起来做一下对大家、对国家、对世界都有益的事情,而不是内耗。
五、技术圈内的人?技术圈外的人?
经常一些圈外人找我聊,经常会兴奋的告诉我,说在什么地方发现一个技术高手,就好像说在什么地方发现了一个绝世恐龙那样。听到这些,我一般都会觉得 心里好笑,笑什么呢?不是笑这个圈外人受骗(见我后面的分析),而是笑,既然是圈外人,不了解技术,又是如何断定他发现了技术高手。当然圈外人是可以断定 技术高手的,这个唯一的判断准则是:这个圈外人熟悉这个做技术的人,而且确切知道这个技术人真正实现了有用的应用。但是这里,这些圈外人刚认识,或者只有 一面之缘就说别人是一个技术高手,无非两个原因:一是通过被人介绍说这个人多牛;二是这个人自己自吹自擂说自己多牛,但这些能作为这个圈外人断定这个人是 高手的依据吗?
上面只是一个例子,一个圈外人去评价圈内人的例子。其实类似的例子很多。很多圈外人找技术人合作,这些圈外人往往会从自己的角度去看这个项目、去看 这个过程、甚至是妄下断言去评判这个技术人。比如,他们会希望一个月就拿出一个很复杂的系统;他们会对开发进程指手画脚;他们甚至会对正在写代码的程序员 说你该怎么怎么做……
为什么会发生上面说的情况?难道都是圈外人的错?不是!两方都有错,这里的唯一问题在于沟通。而我们技术人员的一个弱项就是沟通。我们技术人员在工 作中,会遇到很多非技术人员,面对这些圈外人,我们可能会合作、会谈判、会发生买卖关系等,圈内和圈外的人是很难找到共同的语言去沟通的。我的搭档有次告 诉我,我们刚合作的时候,我说的很多内容都有IT的专业术语在里面,他觉得我很专业,他也似乎能听懂,但是后来等把网站做出来,他发现和他原来和我沟通的 有很多出入。后来我们怎么解决这个问题的?就是通过沟通。沟通是个很深的学问,我现在能做到的就是从他的谈话去了解他说这句话的出发点,从而真正了解他的 想法,而且和非技术人员谈话,尽量用大家都能明确意思的、平常的语句;而不是动不动就说觉得这个人很笨,都听不懂我的话。
沟通的本质其实就是协助对方了解自己的意思,从这点出发,我们技术人员还有很大的改进空间。归根到底,如果沟通问题解决了,大家都会集中在做事情上,也就无所谓圈内和圈外了。
六、高手?低谁来定义?怎么来定义?
高手是什么?高手其实是虚名,是虚幻,是根本不存在的。好笑的是,很多人,甚至不是计算机专业的人,都因为高手二字,而进入IT圈。我在买电脑的时 候,年轻的攒机高手不屑于我的提问;我在教导刚毕业的年轻人时,这些年轻的软件编程高手不屑于我的教导……哈哈,我自己在年轻时也很在意高手二字。如果说 高手存在,那么只存在在年轻人的虚幻中。
高手既然是虚名,那么就不能自称,自称高手的人绝对不是高手,只是狂妄之徒,狂妄之徒一般都是初出茅庐的小子,我自己刚毕业1年多的时候,也觉得自己是不容置疑的高手。如果年纪大了,还觉得自己是高手,那么事实上不是偏执狂,就是神经病。
如果高手存在,那么高手也是其他人对一个有天赋、刻苦、掌握技巧的人的尊称,而其他人看不到这些,只看到这个人一下子就很专业的结果,而这个人自己 才明白长时间努力的艰辛和理所当然的收获,就好像任何高深的科技,如果把原理公布出来,众人都会说原来是这样,或者说原来要经过这几十年的锻炼……被别人 成为高手的人,是要付出之前长时间努力代价的。世界就是这样,谁都喜欢看表面的风光,能看到别人背后艰苦奋斗的就凤毛麟角。
但是,现实是,我们在工作生活中,撇去商业炒作的高手不算,不难发现还有很多高手的存在。虽然我们高手只是我们在追求其他主要目的的时候,附带想实 现的一个目的,但为了这么一个附带的目的,我们付出了一些不可察觉而且不低的代价,这是值得我们IT技术人员去思考。为什么不能踏踏实实,自然而然的做事 情呢?为什么圈内人和圈外人都不能更重视一下实际的过程和结果呢,而去在乎高手、低手呢?我自己的体悟就是,没有高手、低手,只有会做事情的人和不会做事 情的人,把事情做出来才是最实际的。
七、谁来帮有创新技术的技术人员实现梦想?
我在2005年第一次去给别人说SCS(那时候是软件活化技术和ComEgg)的时候,我还是一个单纯的技术人员,然后就经历了一些所谓技术牛人的 嘲讽和陷害,也看到了一些国家重点试验室在挂羊头卖狗肉……让我不得不得出结论,如果我想成功的推进SCS并且有所成果,比如同时具备以下条件:我既要懂 技术,也要懂商务,还要懂人情世故,还要提防不能被骗,然后还要会忽悠,最后如果真的想做点事情,还要自己写一些代码……其实我也是开个玩笑,我想真正说 的是,我们技术人员走出去,除了自己的胆识和能力,还需要大环境的配套,比如企业家的意识、国家的支持、我们技术人员的团结等。
其实就这个问题而言,我自己也在摸索,也在前行。这里我只提出这个问题,让大家一起来思考。
***************************************************************
就此停笔,写了也有许多,虽然发现问题若干,又在这里罗列了其中问题若几,但是我一直是一个乐观主义者,我乐于看到事情都是有节奏的一步一步向前改进和发展的,我有理由相信我们国内的IT技术圈正在日趋合理,我们的大环境也日趋合理。
|