框架,公共模块,unified思想
最近两周一直在加班加点refactor代码,贡献了2014年最后一个周末和2015年元旦三天假期,终于赶在了sprint结束之前完成。
可见,这个sprint做的并不理想!
项目逻辑本身并不复杂,从数据库取数据,进行相关分析计算,然后在前端以图表的形式呈现结果。用的是Django框架,前端图形采用jqplot实现。
项目有三个平行的模块,各模块都要实现数据呈现,报表导出,图片下载功能,但各模块之间互不相关,额外的要求是三个模块都要有很强的可扩展性,以便以后增加新的查询选项,能快速实现。
三个人分别负责一个模块,而且在plan meeting的时候,确保了每个人都了解自己模块的功能需求。
大家都开始了自己模块的设计与实现,第一个星期:基础架构和核心代码实现,第二个星期:前端数据呈现和下载图表实现,第三个星期:互相测试和code review,第三个星期三开始:推倒,重构。。。
就是这么的无奈,在功能都实现了的前提下,又几乎重新编写了后端代码和重新修改前端template。
问题出在了unified思想上:
三个人分别在三个层次实现了unified:template数据呈现一致性,View层数据处理一致性,modle层参数化查询数据库一致性。
每一个模块都为了自己的unified实现做了相应的代码架构,别的模块想复用其代码很麻烦,甚至到了后期,因为命名不一致,连js代码都没法重用,只能眼睁睁的看着非常好的实现无法移植到自己模块中,从而,没法能够做到整个项目的unified。甚至,以后维护代码反而增加了复杂度,如果三个模块添加同样的查询条件,反而要分别进行三套不同的实现,而且因为不同的template元素id,同样的逻辑要写好几个功能相同的js方法。
为什么出现如此结果:
团队成员分布在不同的城市,没有及时沟通机制,交流不畅肯定是造成问题的一个原因。
在项目plan的时候对如何实现并不是很清楚,也没有人发表意见和建议,进行深入的讨论,导致摸着石头过河,每个人都按照自己的想法摸索,以完成功能为主,并未重复考虑,特别是整体考虑项目的架构和可扩展性。
三个人当中有一个比较熟悉项目逻辑,可是没有能够站出来主动负责承担公共代码实现,比如统一呈现数据的前端实现,相应的js验证代码,从而导致前端实现五花八门,甚至没有统一的命名规范。
总之,问题很多,没有及时有效的交流,没有做到充分的思考,没有搭好框架,没有公共处理模块的统一控制。。。
不是敏捷团队,但是按照敏捷的模式去推进,可是没有sm,没有daily stand up meeting等机制保障,只是靠着user story,靠着task去跟进项目,只会导致代码实现杂乱无章,大家只focus在自己的user story上,缺乏体眼光,只快速完成task,没有考虑集成。最终导致了代码的大量重构和返工,同时也增加了软件的熵。
框架,公共模块,unified思想的更多相关文章
- Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)
介绍: 本软件系列到此,我已经全部写完了. 项目练习目标 : 1.Java应用程序基本分析 2.培养面向对象编程的基本思想 3.Java基本设计模式综合应用 4.掌握分层和接口的基本设计 5.构建合理 ...
- Thinkphp5笔记六:公共模块common的使用
common模块属于公共模块,Thinkphp框架,默认就能调用. 实际用处:任何模块都可能用到的模型.控制.事件提取出来放到公共模块下. 一.公共事件 apps\common\common.php ...
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- Util应用程序框架公共操作类(七):Lambda表达式公共操作类
前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...
- Atitit 图像处理 公共模块 矩阵扫描器
Atitit 图像处理 公共模块 矩阵扫描器 1.1. 调用说明对矩阵像素遍历处理调用1 2. 矩阵扫描器主题结构1 2.1. 主要说明 从像素点开始填充矩阵1 2.2. 得到模板中心点所对应的图像坐 ...
- Util应用程序框架公共操作类
随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...
- (三):C++分布式实时应用框架——系统管理模块
C++分布式实时应用框架--系统管理模块 上篇:(二): 基于ZeroMQ的实时通讯平台 一个分布式实时系统集群动辄上百台机器,集群的规模已经限定这将是一个"封闭"的系统.你不可能 ...
- 谈谈CommonsChunkPlugin抽取公共模块
引言 webpack插件CommonsChunkPlugin的主要作用是抽取webpack项目入口chunk的公共部分,具体的用法就不做过多介绍,不太了解可以参考webpack官网介绍: 该插件是we ...
- jQuery系列 第八章 jQuery框架Ajax模块
第八章 jQuery框架Ajax模块 8.1 jQuery框架中的Ajax简介 Ajax技术的核心是XMLHTTPRequest对象,该对象是Ajax实现的关键,发送异步请求.接收服务器端的响应以及执 ...
随机推荐
- White Rectangles[HDU1510]
White Rectangles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- BZOJ2773 : ispiti
首先询问i相当于询问a[j]>=a[i],b[j]>=b[i]的j 如果b[j]==b[i],那么a[j]>a[i],这种情况先用set处理掉 如果b[j]>b[i],那么a[ ...
- velocity 判断 变量 是否不是空或empty
原先的 #if($mobile) 这种写法是不准确的 ,请换成 "$!{ mobile}"!="" 说明 : #if($mobile) 这种写法 只能 ...
- TYVJ P1037 阶乘统计2 Label:坑
描述 n的阶乘定义为n!=1*2*3*……*n 如3!=6 n!通常最后会有很多0,如5!=120 最后有一个0,现在统计n!去除末尾的0后,最后k位是多少 输入格式 第一行包括两个数n,k 输 ...
- get和post方法的区别
在form表单提交数据的过程中,method属性提供了两个值:get,post,默认为get方式[参1] 即一种为get提交,一种是post提交.那么这两种提交方式有什么不同呢? 查询了一些资料后,总 ...
- 李洪强-C语言5-函数
C语言函数 一.函数 C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用. 二.函数定义 目的:将一些常用的功能封装起来,以供日后调用. 步骤:确定函数名,确 ...
- java实现吸血鬼数字
public class Vempire { public static void main(String[] arg) { String[] ar_str1, ar_str2; ; int from ...
- windows下的mongodb分片配置
1. 分片服务器设置mongod -port 10001 -dbpath=F:/DbSoft/mongodb/rs_data/master -directoryperdb --shardsvr -re ...
- 每天php函数 - list()给一组变量赋值
array list ( mixed $varname [, mixed $... ] ) 像 array() 一样,这不是真正的函数,而是语言结构.list()用一步操作给一组变量进行赋值. var ...
- SVN客户端常用命令
1. 将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如: cd /home/www #进入准备获取的项目路径 svn checkout svn: ...