|
本书的作者是一个在外包行业奋战多年的资深程序员,经过近十年的磨砺,作者从一个开始靠个人只身接单的码农,成长为一个带领十几人的团队承接大型软件项目的领头人。在这些年中,作者经历了被人骗包、被人甩单、被人拖欠尾款等等各种磨练,从这些经验教训中总结出了一套行之有效的接单技巧,并成功地承接了总价值达上千万的软件项目。为了给广大的程序员朋友在接项目时提供一些指导,作者特写成此书,作为献给程序员朋友们的一份礼物。
前言
本人原来也是一名普通的程序员,也就是人们口中经常提到的“码农”。从计算机系一毕业,就进入一家软件公司任职,过着朝九晚五的日子。一开始觉得生活非常惬意,上班在有空调的办公室对着电脑编编程序,晚上回宿舍看看电视打打游戏,小日子还是蛮不错的嘛。但是过了一年后,感到压力来了,因为国内的物价特别是房价一路飞升,而我当时工资不到2000元,照这样下去,自己得不吃不喝攒钱攒到40岁才能买到房子娶上老婆。这样一想,我就觉得应该利用自己的一技之长快速致富,于是就想到了利用业余时间接外包项目。八、九年干下来,房子到手了,老婆也娶回了家,还组织了一个十几人的不大不小的团队,下一步就是打算自己成立一家软件公司了。自己虽然已经干出了一些名堂,但是看着周围的程序员朋友们在外包的道路上走得很迷茫,所以有心想要帮上一把。大家都知道,程序员都有几个通病,一是把自己关闭在电脑桌前这么一个狭小的范围内,除了眼前的屏幕,满世界都是挺陌生的。由于接触不到外面的世界,客户没办法认识你,更别说把项目交给你做了。二是思维严重的程序化,常常用技术来看待问题,一就是一,二就是二,太过于程序化看待问题了,不懂得变通,其实很多社会上的很多事情是需要懂得人情世故才能处理好的,如果你太过于执着,就只能自己吃苦头。三是沟通能力不行。我周围有很多技术很牛的程序员,但就是不会说话,不善于交流。与客户谈判时比较死板,给客户的感觉就是书呆子的形象。在如今这个客户就是上帝的世界中,不能与客户交流就不能拉来项目,再牛的技术也没有用。本人是学理科的,写文章不是很在行,不懂得玩什么文字游戏,反正是有什么就说什么,把自己肚子里的“干货”抖出来就行了。闲话少叙,现在我就进入正题了。
一、接项目前的准备工作
有人会觉得奇怪了,接项目前还要做什么准备工作?不就是直接去找客户谈项目就行了?我原来一开始也就是这么干的,结果吃了不少亏走了不少的弯路。俗话说得好,“磨刀不误砍材工”,接项目也是这样,一开始先不要忙着去承接项目,先做好以下几项准备:
1、组织一个团队
有的人会说了,接项目嘛我一个人就够了,干嘛还要费劲去组织一个团队?我原来也是这样想的,开始的一年我都是一个人单干,自己去找项目、谈项目、做项目,结果项目没有接到多少,倒把自己累了个半死。一个人在外包的道路上打拼是很辛苦的,没有人交流,没有人分享,埋头苦干很难出成绩,典型的吃力不讨好。要知道现在早已不是个人英雄主义年代,一人独闯天下的历史早已一去不复返了。就算你Pascal、C、C++、C#、Java、ASP、ASP.NET、Perl、PHP、SQL、FORTRAN、VisualBasic.NET、Delphi这些编程语言你全都熟悉,你懂得谈项目吗?连项目都谈不来懂得再多的编程语言又有什么用呢?要知道一个人总是有自己的特长也有自己的短处的,没有任何一个人是十全十美、样样精通的,只有能力不同的人组成一个团队才能功半事倍地承接项目。大家作为程序员一般都学过电路的原理,而学过电路的人都知道,单独的电子元器件个体,无论是电阻、电容,还是电感,乃至电子管,晶体管,都是没有多大用途的。唯有把它们按照一定技术要求,相互组合,形成一定的电路,做成电器,方才显示出它们独特的应用价值。当然团队不可能像软件公司那样项目经理、需求分析师、开发工程师、构架师、测试工程师、界面设计师、产品设计师、项目实施人员、市场和销售人员样样齐全,但是几个必备的成员还是一定要有的。在创建一个团队的时候,不仅仅要考虑相互之间的关系,最重要的是考虑成员之间的知识、资源、能力或技术上的互补性,充分发挥个人的知识和经验优势。成员的知识结构越合理,创业的成功性越大,这种互补将会有助于强化团队成员间彼此的合作。史上最好的团队当属唐僧师徒四人的西天取经团队,取经团的领导者唐僧虽然能力不足,肩不能挑手不能扛,生就一双肉眼凡胎,遇见妖精只会帮倒忙,但终极目标十分明确,并且意志坚定,尽管多次差点就被妖怪们当延年益寿的补品煮来吃掉,仍然百折不饶,朝着西天的目标勇往直前,是一个合格的团队领导者;团队的精英骨干力量孙悟空,既有一对火眼金睛又懂得七十二般变化,一个筋斗十万八千里,上得天庭下得地府,见妖捉妖见鬼打鬼,虽然桀骜不驯性格散漫,经常开罪顶头上司,但团队领导唐僧的挟制(紧箍咒)让他渐渐步入正轨;作为取经团队中的落后分子八戒来说,他是团队中的情感调节器,他出身良好、能力中上,是团队中感情最外露的一个,经常出来插科打诨,使得枯燥的取经过程变得趣味盎然;沙僧是团队中最老实忠厚的成员,能力一般但是脚踏实力任劳任怨,那副西游的时候最沉重的担子总是压在他的肩头,并且对领导者忠心耿耿。悟空经常闹着要回花果山,八戒动不动就说要回高老庄,没有听沙僧说过要回流沙河。设想一下,如果没有唐僧,这个团队根本就组织不起来。如果三个徒弟都是孙悟空,那谁还服谁,唐僧这个师傅还管得了吗?恐怕最终也是一哄而散,剩下唐僧个光杆司令。如果三个都是沙僧,听话是听话,那谁来降妖除魔?还不早都给妖怪吃了。猪八戒别看缺点一大堆,但大师兄临时不在的时候他的钉耙还能顶个一阵子,况且八戒是个活宝,少了他这漫漫取经路上不少了许多乐趣吗?
所以说,这师徒弟四人每个人都有自己的用处,缺了谁还都不行。在一个团队中,必须要有一个组织者,也叫领头人,就是类似于项目经理之类的人,由他来统一管理这个团队,协调团队成员之间的合作,领导团队准时、优质地完成项目,这个人要有丰富的软件项目管理能力,否则这么多人的日常管理、项目进度控制都会是个大问题,会让你头大的。领头人还需要有亲自带头干的能力,否则别人也不会那么拼命好好工作,要能起一个领头羊的作用。
再次是必须要有一个商务人员,商务人员要有比较强的表达能力、说服能力、讲道理的能力,否则客户不会把上万元的软件项目包给你来做。他的职责是与客户沟通,在平时负责寻找潜在客户,与客户谈判,争取客户信任并取得项目,拿到项目后还要了解项目的整体需求,与客户保持一定的联系,即时反馈阶段性的成果,即时向团队反馈客户提出的合理需求。在接项目的初期团队规模不大时,领头人与商务人员可以由一人来担当,但当团队扩大后,一定要有所分工。
再次就是具体的编程人员,编程人员的组成要由团队的业务范围来定。不要以为外包就是能做什么就都接过来,杂七杂八的项目接了一堆,往往导致团队项目精力被分散,无法在同一领域内积累足够的经验,这不利于团队竞争力的形成,同时,由于项目太杂,还容易在管理及项目交付上出现问题,无法使得客户满意。另外也不利于团队口碑的形成,因为只有专注才能专业,这是人人都懂的道理,客户自然也不例外。如果你说自己的团队样样都能做,客户肯定会掉头就走。具体的团队编程人员要看团队的业务来定,比如一个网站建设团队,就必须包括PHP程序员、ASP.NET程序员以及负责网页设计的美工等,总之,团队成员要各有所长,优劣互补,成员的知识结构越合理,创业的成功性越大。有一个问题又来了,我上哪去找这些团队成员呢?其实很简单,就从你身边的人来开始寻找,主要包括:亲戚、同事、同学和朋友。亲戚是团队成员的首选,因为选择亲戚值得信任,一般来说亲戚都是知根知底,和自己利益休戚相关,俗话说:“打仗亲兄弟,上阵父子兵”,亲戚之间最容易同心协力一起拼。问题是,亲戚不一定是你想要的技术人才,他也许根本就不是IT行业的,根本就不懂得什么是软件什么是编程,所以局限性比较大。
次要考虑的是同事,同事多是与你一样的程序员,大家因为平时在工作上就相互配合过,所以也很最有可能与你形成合作伙伴关系,因为大家都是为了共同承接项目而一起奋斗,分工比较明细,所以合作的风险最小;但是同时,这种关系也最脆弱,因为这种合作伙伴是建立在纯粹的利益共同体基础上,一旦发生危机,为保自己的那一份利益,大家会容易散,所以,这种合作一定要双方绝对的信任,但这一点很重要。
同学或朋友大多是接受过共同的教育和熏陶,或想法相似,价值观一致的同类人,这样的团队组合在实际的生活中非常多,双方都有了一定程度的了解,在合作中最容易互相理解,因为接受的文化一样,沟通起来也比较顺畅,沟通在团队的发展中是团队的最重要的素质,但是在选择过程中也要对同学和朋友进行长期的考察和磨合,因为一起做项目毕竟和同学聚会或朋友聚会不一样,合作就会经常有摩擦,所以大家首先一定要有明确的分工和合作制度。总而言之,你要找自己身边非常熟悉的、对其长处和短处也一清二楚的人来做团队成员,用网上一朋友的话来形容就是:一个教室学习过的校友,一个战壕战斗过的战友,一个赌场玩过的赌友,一个监狱服刑过的狱友,一个房间嫖过的嫖友,呵呵。千万记往:创业团队不需要陌生人!以前也有人在网上发帖或在QQ群征集团队成员,最后都是不了了之,就我所知还没有一个成功的例子。关于团队的利益分配问题,老实来说,我是很想回避这个问题的,因为这个问题既很容易回答,又是最难回答的。为什么说很容易回答,因为换了任何一个人都会这样说:“利益分配有什么难?按劳分配不就行了?多劳多得、少劳少得、不劳不得嘛”。但其实,这个问题也是最难回答的,因为团队不像公司那样有正规的考核制度,你说你为了完成项目连续几天通宵加班劳动比我多,我还说我为了拉到项目跑东跑西求爷爷告奶奶嘴皮子都磨破了呢,凭什么我得的就要比你少?争执起来,这是一个无法解决的问题,只能伤了大家的和气。
所以我认为在一个团队的起始阶段,团队成员干脆把所得的利益平均分配算了,这也是一个不得已而为之的临时之举,因为这样无异于是吃大锅饭,不利于调动团队成员的积极性。所以待到团队发展到了一定的阶段,还是要在民主讨论的基础上,根据大家的平时表现,商议出一个合理的分配方案。因为经济利益始终是一个无法绕过的坎,大家不就是为了这个才走到一起来的吗?在这里我想提一下,作为团队发起人的你,不要因为是团队的组织者就摆出一幅老大或者领导的派头,要求拿利益的大头。相反你应该放下架子,主动要求与大家平分收入,这样才有利于在团队的创业初期形成一股凝聚力。在创业的初期因为团队的收入还不稳定,还没有谁敢贸然辞职出来加入团队,所以一开始大家都是利用业余时间来完成项目。你一摆老大的架子,人家最多是拍拍屁股走人,回去照样日常上班没有一点损失,而你辛苦组建的团队却面临散架子的危险。
2、准备必要的框架
接过项目的程序员都知道,一般的客户都是极不耐烦的那一类,对工期的要求都是比较紧,恨不得3天就能拿到一个大型的ERP软件或一个行业门户网站。经常是你这边忙着打代码,那边还要忙着应付客户催命一样的电话。所以在接项目之前,团队就必须提前准备好一些统一的快速开发框架工具,也就是建立一个统一的基础开发平台。这样不但能满足客户的工期要求,也可以最大程度上节约开发成本和时间。时间就是金钱,缩减成本和节约时间都是赚钱。在这种开发环境下,我们务必要使用更快速的开发框架。尽管实际接项目时可能客户的需求不尽相同,代码实现也千差万别,但毋庸置疑的是,其中存在的共性也非常多,比如,数据表的增、删、改、查询,报表,权限,流程等都能够凭直觉感觉到大量的相似性。如果我们一旦能用有效的方法,把这些共性提取出来,构建一套快速开发框架,就能够灵活应对各种不同的需求变化,这样就会使项目的开发效率大大提高。要是每个项目都要从基础代码开始开发的话,那你就得做好每天通宵打代码的准备,时间一长不累得吐血才怪。而即使吐血了客户还要骂你,说你耽误了工期而不给任何费用。
这种开发框架的要求是,首先如果不是特别有技术要求的项目,任何一个初级的程序员只要套用这个框架都可以“按时”完成任务。其次,要有自由的代码,条条大路通罗马,不要求就是简单,自由就是快速。再次,所谓快,目前仅仅局限于开发速度快,至于运行效率快否并不是首要考虑因素。使用应用框架有五大优点:模块化,可重用性,可扩展性,简单性,可维护性。模块化就是把应用分割成多个组件或模块。这样,团队成员就可以采用各个模块互不影响的方式使用应用框架。希望使用应用框架某个组件的开发者,不会受到框架其他组件潜在变化的影响。代码的可重用性是应用开发中最重要和最令人期待的目标。应用框架能为基于其上构建的应用提供这种可重用性;而且,不仅应用框架的类和代码被重用了,其设计也被重用了。有了应用框架,我们就能将大量重复代码和通用的解决方案从应用层移到框架层。这样一来,程序员编写和维护的重复代码的数量减杀了,开发效率也大幅度的提高了。可扩展性是往现有的框架中增加自定义功能的能力,它使开发者不仅能够“即拆即用”地使用框架组件,还能够改变组件,以适应特定业务场景的需要。可扩展性是框架的重要特征。每一个业务应用都有独一无二的业务需求,架构和实现。虽然框架本身容纳所有这些具体情况是不可能的,但是,框架采取了支持客户化的思路;这样,不同的业务应用依然能够使用框架的通用功能。
简单性的含义不仅仅是“简单”。简单性指的是一种方法:框架通过封装处理流程的控制逻辑,使它对开发者透明,来简化开发工作。可维护性是业务需求改变之后,其应用便于修改的能力,它是代码重用带来的一个受欢迎的效用。框架组件通常会被多个应用或单个应用中的不同部分共享。因此,让框架的不同层包含不同级别的业务知识,能够减少因改变业务需求和业务规则所带来的连锁反应。这也使得维护成本减低,因为只需维护因业务规则改变所影响到的代码。至于要准备好哪些必要的框架,就要根据你的业务范围来定。所以说接外包项目要有重点,要根据你们团队的长处来确定接一些什么样的项目,不能不管三七二十一有项目就接下来,那样只能把自己搞得焦头烂额。比如你准备接ASP.NET项目,那么就可以准备好ASP.NET的三层架构,就是数据访问层,业务逻辑层和表示层。其中数据访问层是用来访问数据的,业务逻辑层是用来处理一些系统的业务逻辑的,表示层就是把内容呈现出来给用户,与用户进行交互的。划分三层的好处就是每一层都是独立的,修改其中一层一般不会影响其他层的代码,这样就大大的方便了日后的维护和升级。有了这么一个框架,接到项目后,只需要根据客户的要求修改三层中的相关部分就行了,极大地提高了编程的效率。所有团队成员都使用这个统一的开发框架,这样就可以高度代码重用,避免重复工作,统一编程思想。至于怎么才能拿到这些框架,那就发挥你们团队中所有成员的能动性吧,把他们以前学习中、工作中所能得到的所有有用的源代码,都拿出来整理一下,应该可以总结出一些好用的框架作为团队接项目的基础。总之平常要特别注意框架的积累,形成自己的一套框架,做起项目来就会事半功倍。
3、准备一些案例
在正式接项目前还要做好的一个准备是,要整理好一些给客户展示的案例。作为一个客户,最担心的事情是:我的项目你有没有能力承接啊?你是否有这方面的技术能力啊?做出的东西能不能达到我的要求啊?你能不能按时完成我的项目啊?这其实是最正常不过的想法,换了你是客户,也同样会考虑这样问题。我们作为承接者,就是要千方百计打消客户的这种疑虑。
而打消客户顾虑的最好的办法,就是给他看你以前做过的类似项目的案例。俗话说,事实胜于雄辩,把你以前做过的类似的项目的案例给他看,好过你一遍遍空口的承诺。因为软件开发的过程中谁也不能保证一点问题不出,相比较而言,一个有经验的开发团队会更容易得到客户的信任。因为你已经有和客户的项目功能接近的案例,无疑会缩短开发周期,技术上有更好的保障,因此客户也更乐于把项目交给你。所以,作为一个团队,在接项目之前就必须花点时间和精力,搜集整理以前自己做过的项目案例,并把它们分门别类地整理出来,遇到同类项目的客户,就可以给客户进行演示,这样客户就会放心把项目交给你了。另外,把团队组成人员、技术能力、经验等客户看重的东西整理出来并给客
户看,也能够对争取到项目起很大的作用。这里大家会问一个问题,既然团队还没有开始承接项目,哪里来的案例啊?这个就只能从你打工的公司入手了。既然团队的成员都是公司的程序员,就肯定会干过不少的项目,可以先用这些案例来证明自己的实力。当然,有人会问,那是以别人公司名义开发的项目,不敢假冒是我们团队开发的。这个是自然,你可以向客户说明是你在以前公司做过的作品,你曾经亲自参与过就好了,反正只要证明你有这个能力可以承接客户的项目就可以了。
俗话说,“万事开头难”,在团队创业的最初阶段,接项目确实是比较难的,但是随着团队承接的项目越来越多,作为团队领头人的你,平常就应该多花点时间和精力,搜集整理以前自己团队做过的项目案例,并把它们分门别类地整理出来,遇到同类项目的客户,就可以给客户进行演示,这样客户就会放心把项目交给你了。能让客户完全信任你,这才是运用案例的目的。因此,所选案例一定要要具有启发性、鼓动性。
项目到底好不好,在对方看了你的案例之后,能够实实在在,清清楚楚地了解到你们团队的能力。因
此,你搜集的每一个案例,都要本着能够打消客户忧虑、为客户放心把项目交给你找到更多的理由、
促使客户做出正确决定的原则去选。
二、该上哪儿去找项目
做好了必要的准备后,该是时候去接项目了。但是,该上哪去找项目呢?本人一开始也被这个
问题深深地困扰,没有项目来源,有再好的团队、再充分的准备,也是无济于事。很多团队的失败
就是因为这一点,找不到项目做,人心涣散,团队也变成了名存实亡。所以,作为团队领头人的你,
一定要解决好这个问题,必须给团队提供稳定的项目来源。本人经过近十年的实际外包实践,终于
摸索出了几个可靠的途径,下面就一一介绍给大家。
1、通过朋友的介绍
这应该是很多开发者接外包项目时最先想到的渠道之一,优点是朋友间容易建立信任度,项目接下来的成功率较高,缺点是机会比较偶然,项目数量不稳定。俗话说:“在家靠父母,出外靠朋友”,在我们大学还没有毕业,未走出校门之前,我们都还是父母眼中的小孩,家人即使再苦再累也会支撑着我们,而当我们长达成人之后——通常是指大学毕业后,就不能事事还依靠父母,很多事情都得靠自己想办法去解决。在走出校门之后,我们会知道处理事情除了自己的能力外,还有很多资源是可以利用的,这个资源中除了亲人,还有很重要的就是朋友了。
没有人能独自生活,我们的日常生活和工作都离不开朋友。你要么与朋友共处,要么与敌人为伴,此外别无选择。“多个朋友多条道,多个敌人多堵墙”,要广交朋友,即使他不能成为你的密友,至少可以成为你的支持者。认真选择朋友,他们当中有些人会成为你一生中的福星。很多程序员朋友在工作后,整天埋头编写代码,不但不结交新的朋友,连过去的同学朋友都疏远了,这其实是很不可取。程序员也要学会多交朋友,不要沉迷在一行行代码里面。技术固然重要,但友情也不能忽视。写得一手好的代码,固然值得称赞,但结交一些值得信任的朋友,在你困难的时候能给你伸出援助之手,才是更为重要的事情。特别是,如果你有幸结交的朋友,有朝一日当上了某国营公司或政府部门的负责人,那就要恭喜你有了一个稳定的项目来源了。还有一个渠道,是把客户转化为朋友,这个说
起来很难,其实也很容易,只要你做到这几点,客户也能变成你的朋友。首先要给客户满意的结果。
与客户的合作,特别是第一次合作,是最为重要的,如果你能完满地完成客户交给你做的项目,让客户对于你百分之百地满意,这就为你们之间成为朋友打下了一个良好的基础。其次是要替客户着想,我们与客户合作一定要追求双赢,特别是要让客户也能漂亮地向上司交差。我们是为团队做事,别人也是为单位做事,他也希望自己办的事情办得漂亮。因此,我们在合作时就要注意,尽量减少客户不必要的开支,不要一心只想着多赚钱而使客户对你产生反感。再就是多做些业务之外的事情,就是客户有什么事情时你可以主动帮忙,比如他们需要某些资料又得不到时,我们就会帮他搞到。甚至,他们生活中碰到的一些困难,只要我们知道又能做到时,就一定会帮助他们,这样,我们与客户就不再是合作的关系了,更多的就是朋友了。这样,一旦有什么大的项目时,他们一定会先想到我们。
2、通过外包网站接单
我身边有很多的程序员,对外包网站不屑一顾,他们认为:所有的外包网站都是假的,骗人的,上面的信息没有一个是真实的。就如同那些受到过打击的女人,经常挂在嘴边的一句话就是:“天底下没有一个男人是好东西!”诚然有一些外包网站是在提供虚假的或过时的项目信息,但也不能因此就认定所有的外包网站都是这样的。这里我们要有一个鉴别的方法,依照我近十年的接项目的经验,只有那些开办时间长(我的标准是超过十年)的外包网站才值得可信。为什么这么说呢?因为一个外包网站开办时间长,说明他们已经有了稳定的项目来源,而且经营状况良好,可以为客户提供源源不断的项目。而那些盲目跟风的新开办的外包网站,则基本上百分之百是提供不实的信息。原因很简单,新网站根本没有人知道,怎么会有什么人在上面发布项目?而为了网站的浏览量,这些新网站的主办者就只好发布一些虚假的或是从其他网站抄来的项目信息。
更为可怕的是,这些新的外包网站,为了吸引人的注意往往打着免费的旗号,吸引大批贪图便宜的程序员去上面承接所谓的项目,而当大家去竞争这些虚假的项目时,往往既浪费了宝贵的精力还浪费了宝贵的时间。这就给程序员朋友造成了一个错觉,所有的外包网站都是靠虚假项目信息骗人的。绝大多数的程序员,即使愿意去外包网站接项目,但是一听说是这个网站是要收费的,立马就拍拍屁股走人了。他们总想着免费接项目的好事情,其实,天下永远没有免费的午餐,凡是给你提供有价值的东西的,总是要收取一些相应的费用。就比如阁下您吧,你愿意免费替别人开发项目吗?恐怕不肯吧,如果有愿意免费开发的,请立即联系我,有多少这样的人我收多少,我还正愁找不到人来做项目呢。
|
|