囧囧的年终奖-反思做了一年的项目遇到的问题

今天真是好日子,发工资的日子,今天真不是好日子,下班的时候被告知,年终奖没了。今年部门的业绩据说还行,不过由于和香港、台湾一起计算后,利润就很低了,低到不足以发年终奖,我们一帮悲催的兄弟姐妹盼了一年的bonus,居然是这样的结果。郁闷归郁闷,公司没钱,也没有办法,不过好好想一下,这一年多我们的项目的确做得不算好,现在回想很多地方都有改进的空间。

项目做了一年多了,到现在延时5个多月,严重超出预算,bug一大堆,改了几个月才慢慢稳定,代码混乱,现在都没人敢去重构,也没有时间允许我们重构,造成这样的后果有多方面的原因,现在总结一下,以为后者鉴之。

1. 项目初期对项目的复杂度估计不足,因为是将一个原有的系统使用新的技术和框架进行升级,所以理所当然的认为很简单;

2. 忽略了技术风险,因为采用了SCA来架构,大家对SCA完全一无所知,maven,websphere对于大家来说也都没有什么经验,导致在SCA和websphere上花的时间太多;

3. 业务复杂度被低估,虽然是升级系统,但是由于文档严重不足,原有代码经过二十多年的维护十分的混乱,没有人对需求完全了解,而客户也没有给我们足够的时间来了解这些业务,我们的PM认为有代码,所以也没有重视这方面的风险,结果很多人直接从老系统拷贝代码,甚至连老系统的逻辑都没有弄明白,拷过来如果能运行就一切OK,导致最后大家还是对业务不熟悉;

4. 前期有要求大家写单元测试,并且使用sonar进行代码规范,但是由于项目进度催得太急,大家又没有写单元测试的经验,对单元测试的重要性也认识不足,所以最后没有坚持下来,现在的单元测试很不完整,有的完全是应付任务了事;

5. 团队沟通太少,知识分享不足,团队工作效率不高。

针对以上问题,要如何应对呢?

1. 前期的分析一定要详细,特别对于我们这种中大型项目,如果信息不足,可以试着做一个小的原型。

2. 如果引入了新的技术,且大部分团队成员对这种技术不熟悉,那么一定要想办法找一些熟悉的人来做一些指导,如果找不到这样的资源,那么团队成员一定要有一部分人提前学习这种技术,并且及时给出一些对该技术风险的判断,PM一定要及时和这些队员沟通。

3. 绝对不能在需求不明确的情况下开发,像拷贝代码这样的事情,其实也是因为催进度催得太急,大家做出了妥协,现在想来这种妥协太致命了,一发而不可收拾,这应该要一开始就杜绝的,程序员一定要学会说NO,不能因为PM催就草率应付了事,一定要对自己的代码负责,做为team leader更要帮助队员顶住这种压力,并且与PM多做沟通,讲明历害关系,不能叫做什么都是Yes。由于需求不清楚,拷贝过来代码甚至不知道是做了什么事情,所以单元测试完全无从写起,由于时间紧,更有理由不写单元测试,最后的结果就是集成测试的时候bug一大堆,改一个bug又引出另一个bug,代码质量没有保证,没有单元测试又导致不敢重构,所以最后延时非常严重,一直不能发布最终版本。

因此,team leader绝对要是能担当责任,自信,敢于说NO的人。单元测试一定要认真完成,不一定要测试驱动,但是每一个复杂的方法一定要有单元测试,能写出单元测试说明你完全明白你写的代码是做了什么,同时如果有问题通过单元测试也能较早的发现,后期的bug会少很多。重构的时候风险也小很多,每次重构完成跑一遍单元测试可以及时发现是否有影响到别的代码

4. 团队的沟通,协作能力很重要,team leader不能只是分配任务,督促任务完成,更要在平时多关心大家,经常在一起开些小会,了解大家的情况,经常和队员沟通,了解他们的情况 , 是否对公司有什么建议,或是有什么困难,及时的把这些反馈给PM或是更高层的领导。经常性组织一些培训,可以让大家轮流的分享技术或是业务知识,每周花一小部分时间,这样大家都一起提高。


今天想到了这些,记录下来,希望在以后的项目中能记得这些经验和教训,不能在犯同样的错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图:提供一种方法顺序访问一个聚合对象中的每个元素,而又不想暴露该对象的内部表示。应用:STL标准库迭代器实现、Java集合类型迭代器等模式结构:心得:迭代器模式的目的是在不获知集合对象内部细节的同时能对集合元素进行遍历操作
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的N
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定义一系列算法,把他们封装起来,并且使他们可以相互替换,使算法可以独立于使用它的客户而变化。应用:排序的比较方法、封装针对类的不同的算法、消除条件判断、寄存器分配算法等。模式结构:心得:对对象(Context)的处理操作可
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。应用:作用于编译器语法树的语义分析算法。模式结构:心得:访问者模式是要解决对对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方
命令模式(Command)命令模式(Command)[Action/Transaction]意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。对请求排队或记录请求日志,以及支持可撤消的操作。应用:用户操作日志、撤销恢复操作。模式结构:心得:命令对象的抽象接口(Command)提供的两个
生成器模式(Builder)生成器模式(Builder)意图:将一个对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 应用:编译器词法分析器指导生成抽象语法树、构造迷宫等。模式结构:心得:和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用C
设计模式学习心得《设计模式:可复用面向对象软件的基础》一书以更贴近读者思维的角度描述了GOF的23个设计模式。按照书中介绍的每个设计模式的内容,结合网上搜集的资料,我将对设计模式的学习心得总结出来。网络上关于设计模式的资料和文章汗牛充栋,有些文章对设计模式介绍生动形象。但是我相信“一千个读者,一千个
工厂方法模式(Factory Method)工厂方法模式(Factory Method)[Virtual Constructor]意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实力化延迟到子类。应用:多文档应用管理不同类型的文档。模式结构:心得:面对同一继承体系(Produc
单例模式(Singleton)单例模式(Singleton)意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。应用:Session或者控件的唯一示例等。模式结构:心得:单例模式应该是设计模式中最简单的结构了,它的目的很简单,就是保证自身的实例只有一份。实现这种目的的方式有很多,在Java中
装饰者模式(Decorator)装饰者模式(Decorator)[Wrapper]意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。应用:给GUI组件添加功能等。模式结构:心得:装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口
抽象工厂模式(Abstract Factory)抽象工厂模式(Abstract Factory)[Kit]意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。应用:用户界面工具包。模式结构:心得:工厂方法把生产产品的方式封装起来了,但是一个工厂只能生产一类对象,当一个工厂需要生
桥接模式(Bridge)桥接模式(Bridge)[Handle/Body]意图:将抽象部分与它的实现部分分离,使他们都可以独立的变化。应用:不同系统平台的Windows界面。模式结构:心得:用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现
适配器模式(Adapter)适配器模式(Adapter)[Wrapper]意图:将类的一个接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。应用:将图形类接口适配到用户界面组件类中。模式结构:心得:适配器模式一般应用在具有相似接口可复用的条件下。目标接口(Targ
组合模式(Composition)组合模式(Composition)意图:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。应用:组合图形、文件目录、GUI容器等。模式结构:心得: 用户(Client)通过抽象类(Component)提供的公用接口统一
原型模式(Prototype)原型模式(Prototype)意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。应用:Java/C#中的Clonable和IClonable接口等。模式结构:心得:原型模式本质上就是对象的拷贝,使用对象拷贝代替对象创建的原因有很多。比如对象的初始化构
什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。