01:软件项目开发合同的订立,合同需要对将来几个月甚至几年需要做的事情有个明确的定义说明,限定好工作范围、工作内容、承担的责任、项目总费用,每个阶段支付的费用都需要有明确的说明甚至付款条件等都需要一清二楚,很多东西都没讲明白是将来合作不愉快的导火索,这些都需要白纸黑字写清楚,其实从合同上也能看出甲乙双方的水平在什么层次上的。
02:软件开发过程中,往往会发生客户不按时支付费用的事情,因为软件开发不只是脑力活儿,也是强度非常大的体力活儿,难免会遇到不能按时交付软件的可能性,除非遇上非常有经验的能相对准确评估工作量、工期的管理人员,参考历史的开发经验、再按自身团队的开发技术能力、协调工作效率,计划出一个合理的工期计划来,因为整个公司都需要考虑到资金安全、开发风险,需要有一定的水平能说服客户及时付款,至少可以支付大部分款项的人,在开发软件项目的过程中往往会发生需要垫资几十万的事情,其间需要做好防备工作需要防止资金链断裂了。
03:软件开发人员中途离职也是家常便饭,相对规范的公司,一年也大概也会有10%的人员流动性,若薪资待遇也不怎么样、公司管理也不规范,开发人员也学不到知识、业务也不稳定的,那估计有50%的流动性也是很正常的事情,连微软、Google都会有开发人员离职现象,更何况一个不知名的公司,人员离职是很正常的现象,但是人员离职了就得需要有后备开发人员,公司管理人员需要在最短的时间内招聘到合适的人员,这也需要必备的技能。
04:现在已经不是单枪匹马就能搞定中型软件系统的年代了,一个软件项目开发过程中往往需要N多人参与,客户对软件项目的质量要求,功能要求也越来越高,不只是需要把程序写好,还需要有各种配套文档,测试都需要跟上,所以这些人的协调工作、及时沟通也是很大的问题,若一个项目经理的沟通能力有问题也很容易遇到很多没必要的麻烦,也会使得项目进展会很不顺利的局面,甚至到有敌对力量产生的程度,一个公司,一个项目最怕的是内耗,我们国家其实很多东西也都浪费在内耗上了,若没几千年封建王朝的内耗,我们应该会发展的比美国强大很多。
05:合理的安排工作计划、有目的有计划的做事情,很不容易,项目里需要完成的工作NN多,需要协调的人员NN多,需要设计实现的功能NN多,做一个软件项目并没有学习编程那么轻松愉快,更不项打网络游戏一样输了还可以从头再来,软件项目开发是不允许输了再来的,输了就需要按合同进行经济赔偿、又要丢人、又容易吃官司、还无法在这个圈子里继续生存了,至少会口碑很差了。
06:进度的把控比制定工作计划更难,我们可以制定个计划2012年开发好操作系统、2013年开发好数据库、2014年开发好编译器、开发环境,看上去很美,其实更本没那个能力实现这个计划,计划计划难免会有变化,计划目标需要不断地调整,但是调整得太大,那说明这个计划有问题不符合实际甚至是有些空洞的计划瞎搞搞而已,开发项目过程中需要分工合理,有一定的稳定性,例如今天让你ASP开发,明天PHP开发,后天C#开发,大后面又是JAVA开发,估计没几个开发人员不会被折磨疯了,工作分配也是一个道理,需要有一定的稳定性。
及时的验收确认好工作安排也是需要有水平的,若开会问大家任务完成了吗?大部分都会说“快好了”,快好了可以理解为,已经完成了10%?已经完成了90%?但是剩下10%是技术难题,超级复杂的功能,那其实这并不是完成了90%,虽然开发人员理解为90%,但是可能10%都不到而已。
07:高效的会议,解决问题需要有效率,特别紧急时需要有站立式会议,项目紧急时也需要安排每天的会议,会议不适合超过20-30分钟,甚至10分钟内开好会议是最理想的,例如我们10个人参加会议,会议开了1天,那其实是超级浪费生命,如何高效的指挥大家,如何开一个高效的会议,责任明确的,能解决问题的会议是需要有一些水平的,若以前参与过牛B管理人员主持的会议,那很容易有经验了,参考别人的好处多多。
08:及时的强有力的测试,人都不可能自己找出自己的缺点,写程序也一样,能自己找出自己缺点的,能自己测试出自己程序错误的人,都是牛人,啥叫牛人?就是这样的人不多才叫牛人,普通人是还是需要别人来测试出问题,反馈给大家的,这个就是生产里的一个工序,笔记本生产线上少了一个测试检验的,那会惹来多少麻烦?天天有客户投诉,天天有人退款,天天折腾更换本本的事情来回快递来回折腾,何必呢?增加一个测试环节,减少很多后期麻烦的产生。
09:成熟的功能设计套路、函数命名套路、窗体命名、变量命名等等,也会大大的减少项目的开发周期,项目前期需要把例子程序都写好,适当的进行一些培训工作,然后让大家模仿例子程序就可以了,例子程序不适合写得超级复杂,功能超级强大,只要能把主要核心思想都表明了就可以了,最好还是拿个投影讲一下比较好,这样大家的印象也会更深刻一些。
10:成熟的数据库设计套路,其实数据库设计也是一门学问,看起来简单,真正想设计好也需要有硬功夫,也需要手艺精湛、技艺高超的。数据库基本上还是目前开发各种管理系统必不可少的组成部分,甚至现在还是稳定的管理信息系统的基石,所以数据库设计是否合理、至少30-40%的项目是否顺利稳定的分量是有的。
11:代码规范,代码质量检查,由于项目不是一杆子买卖,往往还担负着后期的维护,甚至部分运行工作,若项目的代码质量不好后期会有无穷无尽的痛苦,把一些问题扼杀在摇篮里,总比把问题培养大了,再去消灭得麻烦、头大,所以项目的中后期一定要安排严格的代码质量检查工作,可以找个工作效率非常高,做事情又相对仔细认真的人,来个地毯式轰炸,从头到尾把扫一眼,很多有SQL注入漏洞、有重复功能的代码、命名不合理的代码等等还是会被发现很多,毕竟项目开发中参与的人多,人多了就很容易啥鸟都有了。
12:系统架构重构上也花费蛮多时间,由于客户是要求在分布式环境里运行系统,开发时又往往是单机上开发调试,又没充足的时间慢慢勾画、慢慢设计,工作安排往往是排得满满的,系统的架构有时候需要进行一些调整,若刚开始开发时就架构不明确、思路不严谨,到项目的中后期,整个项目就会大乱,更本经不起系统架构的重构,当然这里的架构架构重构更多的是小调整,若真的是大调整那说明刚开始的架构就是非常失败的,项目由于不是1个人开发的,若是一个人开发项目那还好说,想怎么调整就调整,现在是多个人开发项目,虽然不能比喻是航空母舰,至少像个护卫舰,想怎么拐弯就怎么拐弯不是那么容易的。
13:技术疑难为题外包,项目过程中遇到了一些WCF配置相关的疑难问题,前后解决了10多个问题,还是无法顺利搞定信息加密传输、电子证书SSL安全配置等等,甚至两台电脑之间的TCP方式通讯上也遇到了问题,由于手上有300多个付费用户,而且他们都是开发人员,所以把这个信息一发布,马上就有专家响应,人家2个小时就搞定问题了,支付了500元辛苦费,钱虽然少也是个心意,我也把问题搞定了,我的付费客户也从我这里赚到辛苦钱了,2个小时若都能赚500元,而且是自己擅长的事情,我想也足够可以了,有时候选择花钱办事比花时间办事更爽。
14:项目经理的带头作用是不可低估的,若碰上一个天天吃喝嫖赌、天天游手好闲的项目经理,那这个项目的最后的结局就是等着赔款就可以了,其他人员看到项目是这样的人没几个SB会拼命干了,大家顶多装装样子,混混日子找找那里有更好的前途了,这里就是不是久留之地的念头没几天就产生了,我自己曾经就遇到过这样的情况,我没到半年就跑路了,公司没两年就关门大吉了,因为这样的领导不是真正干事的,顶多就是转了空子碰到到了*运而已长久不来。
15:采用成熟的软件组件也会大大的促进软件项目的开发进度,这次我们工作流自己开发了一套B/S的,在网页上拖拖拉拉就可以设定好工作流的,自己也比较满意的效果,但是现在想想有接近足足开发了5个月,这个开发成本算 开发人员的工资 + 公司的房租、办公费用 +相应的管理费用 + 测试成本 ,远远超过了6万以上的成本,只是这个钱没一次性拿出,而是每个月一点点的往外付出而已。而且还花费了5个月时间,还不能确保没任何错误,其实到真正稳定好用,至少要烧掉10万了。若从项目开始开发就用合理的价格购买了一套,不用5个月时间自己开发,而是用1个月时间学会怎么用,然后剩下的4个月时间放在核心的业务系统的开发上,项目会相对来说更轻松、更顺利一些,毕竟战线就缩短了很多了,可以集中优势兵力重点突破。兵力分散乃大忌也。
16:软件在开发测试阶段往往会有客户的需求变更,甚至有可能会有大面积的需求变更,每变更一次需求,客户会觉得这个是简单的变更,开发人员会说是超级复杂的需求变更甚至会说前面的工作都白做了,这时候需要有超级强的沟通能力,一方面尽量阻止客户发生没必要的变更,甚至彻底想清楚了再变更,每次变更都有文档记录,好向客户追加软件开发费用,其实这个除了大客户、实际强的客户外,想追加费用是难于上天的事情。只能是跟客户处理好关系、下次客户还能找你就不错了,客户的钱也不是飘来的,预算也是有限的,所以若不想把客户得罪了,还只能按着客户的变更来、顶多是把事情都讲清楚,这部分变更带来了多少工作量等等,至少按合同支付费用时,能有个协商的筹码对吧。
开发人员这里,有再大的牢骚也是没办法的事情,为人民服务、为客户服务,客户是上帝,让客户满意,让客户用我们的软件更舒服、爽一些,只能按客户的要求重新调整程序,若水平高怎么调整都没事,例如用通用权限管理系统组件来说,我还真希望客户能提改进意见,那会开心死了,怎么调整都不怕,因为维护了7-8年,经得起折腾,再说我的开发技能也是顶呱呱的,不怕客户折腾,经得起折腾,因为这东西是铜墙铁壁地。
客户是上帝、客户既然选择了我们,客户烧了钱找我们做软件开发了,我们就得让客户把这钱烧更舒坦,得更爽。
昨天晚上调试优化程序又住在办公室了,今天还得继续战斗,等项目结束了出去旅游一下,放松几个月再战斗。
谢谢大家补充完善、有不足之处请指点。