项目经理修炼手册
跟多请见http://home.cnblogs.com/supper3000/
2.1 项目经理的来源
首先,你要清楚项目经理的基本来源,通常情况下,项目经理有两种基本来源:
一种是从公司内部提拔上来的。通常我们认为一般一个公司里的技术人员干了3到5年,对公司内部的流程比较熟悉,而且技术过硬能力出色,就有可能被提拔成为项目经理。
另外一种情况是空降而来的,一个人也许在一个公司内没有做过项目管理,但是通过朋友推荐外带编造美好的简历也有可能空降到其他公司当项目经理。一夜之间完成这个从小兵到项目经理的变化。
不过在资讯发达的今天,后者成功的机会已经开始微乎其微,所以要想成为一个项目经理,首当其冲的是要在自己公司内做得出色,得到提拔。但是究竟怎么做才算出色呢,让我给大家一一道来。
2.1.1 程序员的基本功
首先一点是要有良好的计算机软件基础素质,什么是基础素质呢,我在下面给出一个说明。
现在的很多朋友大学刚刚毕业的时候为了应对找工作的压力,在网上看了些最新最酷的技术,然后自己找了一台机器实践了两三下,也能做出一些个人网站或者应用软件,于是就欣欣然起来,自我感觉很良好,这种心态其实是可以理解的。毕竟现在微软的开发工具已经变得非常人性化,开发应用软件也从原来的大量堆砌代码成为了现在的拖拖拽拽控件,这些工具容易易学易用,不需要怎么特别的努力,甚至不需要了解一些概念就可以成为快速开发人员了。
具备以上素质的人,大体上可以算是具有基本的程序员素质了,但是想从程序员成为项目经理,必然还需要有一点进步,那额外的这些素质都有哪些呢?
曾经有人力资源的朋友问我要人,我介绍了几个技术上很不错的人,他也给做了推荐,但是用人单位面试之后反应不好,说这些人缺乏项目经理的经验和技巧。这时候我也才意识到,我推荐的都是程序大拿,或者说技术大拿,却从来不是项目大拿,更不是项目管理的良好人才。项目管理人才和高级技术人才的区别在哪里呢?
还是说回我踢球的那个往事,我们队由于有薛申这样的半职业球员在前场进攻,又有我这种铁闸后卫,在小组赛脱颖而出,但是到了复赛的时候,我们遇上了回民中学队,回民中学队是一批回民中学初二学生组成的球队,我当时已经上高二,薛申大概比我大一岁,总之在身体发育程度上我们队是绝对占上风的,但是比赛一开始就呈现一边倒的情况,对方凭借着娴熟的传接配合多次轻松洞穿我们的球门,我更因为防守动作过大被红牌驱逐出场,这是一段非常糟糕的记忆。我想通过这个例子告诉大家的是,在今天软件开发已经成为一种团队运动,个人能力在其中的重要性已经相当有限,作为一个新人,进入一个软件项目团队,最重要的事就是要了解和熟悉团队流程,尽快的和团队其他人员配合好,只有如此才能够体现自己的价值。
我在博客园和CSDN常常看到一些新加入工作的朋友抱怨公司的流程有多么的差劲,公司的技术经理“什么都不懂”,同事都只会“三,五年前的技术”,软件开发流程“一点也不正规”,然后抱怨自己进入了错误的公司,觉得自己在这里是蹉跎岁月耽误青春。每次在看到这样的帖子的时候,我都注意到另外一个有趣的现象,这些朋友通常都不能在文章中给出一点对公司有益的改进意见,也不知道那些“什么都不懂的”的技术经理们每天都在做什么,对那些“只会三五年前的技术”的同事们所做的工作内容也不完全不感兴趣,尤其是不能说出自己拿最新的技术怎么完成那些三五年前技术所完成的工作。
还有些人抱怨公司的软件开发流程不正规,没有需求文档,没有集中代码管理方式,没有软件功能说明书,没有全职的测试人员,却同时也说不出怎么写需求文档,用什么方法做代码管理,怎么去写功能说明书,又怎么去进行测试。我们在这些朋友嘴里只能看到抱怨,坦白说,这些抱怨就算全对,对抱怨者个人也没有任何好处,因为任何公司都不需要一个只会提出问题的人。公司需要的是能主动发现问题,同时能解决问题的人。以公司没有需求文档的事情来说,即使别人都不写需求文档,你也可以自己写,哪怕开始的时候格式很混乱,但是一点一点的记录软件功能的需求变化,每周汇总一次这周的软件需求并整理成文档,对自己来说也是一笔宝贵的财富,再比如说没有软件代码集中管理,你可以把自己写的代码放到一个自己的版本控制CVS服务器上,然后每次自己修改的时候做签入和签出,顺便练习了CVS服务器的部署和使用,还养成了代码编写注释的良好习惯。每件事情在抱怨的时候都应该相处解决方案,我们在这里不是说不能抱怨,而是要告诉你在没有实践过解决方案的之前,请不要抱怨。
一个新人如果只是按部就班的完成公司交给的工作,即使他再兢兢业业一丝不苟,在短期内也很难得到提升,得到提升的人不但是能被动完成交托工作的人,更是那些善于在工作中发现问题,并解决问题的人。一般来说新人想要迅速提升,就需要在工作之外善于观察,首先要观察公司的流程,无论何种公司,公司组织结构都是公司的基础命脉,不了解公司组织结构就无法开展任何工作。除此之外就要不断观察公司的与自己有关的业务的流程,作为一个软件项目开发人员,熟悉公司的软件开发流程,是至关重要的,如果能从这个流程中发现问题的话,那么可以说你的机遇就要来了,但是需要注意一点的是,要甄别那些问题是老板真正关心的问题,那些问题是书本上的问题。所谓书本上的问题是软件开发流程中与大学的软件工程教程不符的地方,很多刚刚毕业的软件开发人员都会把这些不符之处作为开发流程的问题,对其深恶痛绝,我建议遇到这种情况,广大开发着要保持审慎的态度,软件工程这门学问所适用的情况是有一些先决条件的,并非所有情况下都必须按照此类工作一丝不苟。我举个极端的例子,有个朋友在一家外地软件公司,给某地方上的某机构开发一个信息管理软件,这个朋友看到公司软件开发内部流程混乱不堪,代码质量低下,但是用户界面异常华丽,即使程序报错也都会给出一些漂亮的界面,这个朋友就很不理解,跑到老板哪里建议说增加一些代码测试人员,让程序少报错,UI不用经常更换。老板是我这位朋友的叔叔,笑呵呵听我朋友说完以后,告诉他这个事情已经知道了,让他回去以后安心工作,这个事情不用他过分操心。我朋友百思不得其解,后来偶然才知道,这里面的情况很多很复杂,因为软件项目预算是有限的,所以钱得花在刀刃上,这个用软件的机构对软件质量没太多要求,因为本来就是所谓个别人的“业绩工程”,只要界面好看,并且每年都更新一下界面,这工程就算大功告成,所以老板对软件的理解就是好看的界面就万事OK,再额外花钱弄内容上的东西,甚至优化代码一类,完全没有必要。这种特例当然不足取,但是不了解公司当前应用流程就盲目提建议可能画虎不成反类犬,给自己添麻烦。
老板关心的问题其实一点也不难挖掘,你可以换个角度想,那些方法能让老板多挣钱那些问题能导致老板少挣钱,凡是能让老板多挣钱的都是好办法,凡是能让老板少挣钱的都是严重问题。比如软件代码质量低下这个问题,如果公司不是那种营销特牛的公司,代码质量确实会影响公司的软件销售,这时候你要是有办法能提高软件代码质量,那老板就会看重你。但是要记住,在你跟老板说这个问题之前,你应该先有一个实践过的解决方案,然后再某些场合小心翼翼的提出这个问题,等老板觉得这个问题严重,让你去解决的时候,你才一下子拿出那个你早有准备的答案,这样一来老板会觉得你能力非常出众,当然他不知道你是早有准备的。可以如何引导老板,又怎么才能和老板沟通好呢,请看本章下一节,如何与老板处好关系。
然而在这里我必须遗憾的告诉这些朋友,你拖拖拽拽弄出来的那个东西可能挺好看,也可能挺好玩,但是那个不能算做开发软件,只能算是简单的部署软件,这两者的区别有多大呢?举例来说,你喜欢踢足球,在适龄的同学中跑得快,算是身体素质不错的同学,于是每次在同学一起踢球的时候,你都会表现的非常抢眼,没准在学校踢比赛的时候还招惹了很多女同学的关注,但是请注意,你没有接受过专业的训练,一旦遇到职业体校的同学肯定会被踢得一败涂地。我举这个例子是有亲身体会的,我上学的时候就属于身高体壮一类,在球场上身体对抗很占优势,在学校里小有名气,由于司职后卫被冠以“小范志毅”的绰号,但是当我参加北京市级别的青少年足球联赛的时候,队友中有一个当时还没踢上职业联赛但是在体校训练的瘦瘦的青年,此人绰号“终点站”叫做薛申(喜欢足球的朋友可能知道,薛申后来成为了北京国安队的职业球员,再后来转会深圳,其人以脚法秀丽见长,但是身体单薄,对抗能力较差),但是薛申之所以叫做终点站,是因为一旦足球到了他的脚下,他就会凭借着熟练的盘带突破所有对手,把球送进对方的球网,在我们看来他简直是神乎其技,更不可思议的是当时我体重90公斤,他体重不到70公斤,但是每次身体对抗,我都会被顶到一边,这事我百思不得其解,后来问薛申,薛申告诉我说,身体对抗并不是比赛体重,而是比赛肌肉强度和韧性,这方面没有受过专业训练的人是无法和职业选手对抗的。
我讲这个故事其实是想告诉各位,在开发工具如此方便快捷的今天,能写一个小程序就像当年我踢足球一样,其实并不是什么难事,但是想靠写程序吃饭,就必须想薛申那样,经过严格的基本训练,程序员的基本功训练就是三个部分.
第一是熟悉计算机基础原理,了解CPU的工作方式,基本指令、寄存器、数据总线等等基本概念,只要了解了计算机的基本运行方式,无论以后你使用何种高级的开发语言和工具,你都能做到游刃有余。在这里我推荐阅读《深入理解计算机系统》这本书,从程序员的视角,看计算机系统!
本书适用于那些想要写出更快、更可靠程序的程序员。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境。而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。
本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构,程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书说明了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互连时,本书描述了并发服务器如何能有效地处理来自多个客户端的请求。
本书基于Intel兼容(IA32)机器,在Unix或者相关的操作系统(例如,Linux)上执行C程序。虽然书中包括了一些帮助读者将Java转化成C的提示,但是还是要求读者对C或者C++有一定的了解。
您可以通过本书的Web网站www.csapp.cs.cmu.edu获得完整的资料,包括实验和作业,授课笔记和代码示例。
本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。
本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。
本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
第二门基本功课就是数据结构和算法,这两门功课是程序开发的灵魂,如果不了解数据结构和算法基本上开发出一个好的应用程序是不太可能的,目前这两门功课也在被不断忽视,原因是各种应用语言的类库中都封装了对各种存储结构的基本操作,这样一来,广大开发者不再需要了解存储结构即可对各种数据结构进行使用了,但是这样的弊端就是,不明真相的开发者就会调用一种结构,而且偏执的执着于在各种情况下使用这种存储结构,我认识很多初学的朋友都有这种偏执。原因是他们不知道别的算法和存储结构,又或者不能理解使用别种算法的优劣或者别种数据结构的好处。
这其中,数据结构又是算法的基础,没有数据结构的概念则根本无法理解各种。所以掌握好数据结构是很重要的。
清华大学严蔚敏教授的《数据结构》算是这门功课里比较值得一读的书,因为是用中文写成,且配有习题集,所以很容易被大学掌握。本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。
当然,这本书也不是全无问题,主要是本书对C语言过于依赖,需要读者在阅读之前由较强的C语言基础。
算法的书籍较多,比较经典的有《编程珠玑》本书针对程序设计人员探讨了一系列的实际问题,这些问题是对现实中常见问题的归纳总结。作者虽然没有给出解决这些问题的具体代码,但始终非常富有洞察力和创造力地围绕着这些折磨程序员的实际问题展开讨论,从而引导读者理解问题并学会解决问题的技能,这些都是程序员实际编程生涯中的基本技能。为此,本书给出了一些精心设计的有趣而且颇具指导意义的程序,这些程序能够为那些复杂的编程问题提供清晰而且完备的解决思路,书中还充满了对实用程序设计技巧及基本设计原则的清晰而睿智的描述。
算法和数据存储结构的基本功是一个好程序员和一个爱好者的本质区别,掌握好了这两门学问,才可以算是在计算机行业具有入门的本领了。
第三个基本技术需求就是架构设计,很多程序员对这方面可能缺乏概念,刚刚入门的程序员对编码技术的理解可能还不能达到设计模式所提及的高度,对那些似乎是“脱了裤子放屁”的绕弯子做法不屑一顾,在这里我推荐大家做几个工作。首先有空的时候看看那些成名已久的程序员写的书,比如《编程匠艺》,比如《代码天书》,这些书都是那些经历过无数成功和失败的,老腕一生经验的总结,其内容可以说是字字血泪,所有内容都并非凭空而来,阅读这些书可以帮助读者建立一个良好的编码习惯,这对一个业余选手成为正规军尤为重要。其次就是要找一个或几个开源项目进行重点代码阅读,开源项目,尤其是大企业的开源项目,绝对是软件编码技术和工程管理的精品,所具有的特质很值得大家学习。最后就是分享与交流,闭门造车是信息时代绝对无法想象的事情,要想在技术上有所掌获,那么不断的参与交流,在提出观点->遇到挑战->修订观点的循环中螺旋式上升,是一个开发人员快速成长的最好方式。