已经很久很久没有发博客了,自从上次解决完实习招聘的事之后,就一直忙于学习上的事了,最近考完了最恶心的算法分析与设计,总算是有点时间来写写有关于技术,项目的事了。在这一个月左右的时间了,我做了两个很小的,相当于课程设计的大作业,两个都是B/S结构,一个是物品销售的系统,实现销售商和生产商在网页上操作数据,因为是软件质量保证和测试的大作业,所以我们还用了qunit和loadui进行了代码测试,这会在我另外一篇文章。另一个就是我要说的网页在线聊天的大作业,这里主要用到了websocket实现双向通信,百度地图API实现位置定位这两门技术,不难。
这里主要是和大家分享一下做这个大作业的感悟,当然不能和大公司,或者一个大项目相提并论,毕竟还是一个学生,对于项目开发和管理的经验就那么点,所以如果要喷,请就事论事,勿涉及双方的父母。
以前我一直觉得,技术第一,我掌握了很多的技术,我就能开发好一个项目,请原谅我这种想法,我也上过很多有关于项目管理,项目开发,软件工程的课,老师也会一直指出要分需求分析,概要设计,详细设计,编码,发布这五部骤,但是从没有重视过,开发么,实现功能就可以了。但是真的不一样,只有自己真的作为一个leader开始开发一个项目的时候才会有所感悟。先说说这个项目开发的基本情况,我们是三个人,其中一个人是酱油,对于编码不太会,可以偶尔负责写一些文档(大家都懂的),另一个人会一些后台开发,但是也不是很靠谱,还有一个我。
大作业的题目是我定的,因为我觉得会比较有趣,而且难点都在前端,我是负责前端开发的,这样保证起码这个作业可以做完。在分工上,我定义了那位酱油同学X负责写文档,实际上到后来,文档都是有我和另一个同学Z写完的,这是后话了。另一个同学负责建立数据库和编写后台基础代码(enity,DAO),然后我负责前台开发,当时我估摸着最后也会是我来负责前后台的交互,即编写action类。事实上也是如此。
定义完分工之后,我开始估算这个大作业的大小,这时候,其实是初略的估计大作业的功能模块。当时初步构想是好友管理,聊天,地图,管理员管理四个主要的模块。
然后分析技术难点,好友管理那块如果时间来不及,就直接拖一个表格控件,技术都已经成熟了,应该没有问题;
聊天那块,websocket交互没有做过,但是听室友说挺简单的,这里定义一个优先解决的困难点,因为这时基础模块;
地图那块,百度地图api用过一次,基本的流程都还有点印象,而且写过一些demo,正好可以用上,实现的时候,可能有些困难,但是应该都可以解决,划分为第二需要解决的困难点;
管理员管理那块,懒一点就类似于好友管理,直接拖datatable控件解决;
经过上面的一阵分析,估计到个人的能力,觉得这个大作业是可行的,就是可能到时候自己要累一些。接下来就开始正式的需求分析阶段
需求分析,其实说白了,就是写文档,写需求分析文档,在和同学Z讨论了一下,一起分析设计了大作业的功能模块,用户功能(用户基础功能,用户核心功能,用户附近功能),开发顺序也是依次。管理员功能(用户管理,公告管理)。
在定义完需求之后,我们又马上开始定义概要设计和详细设计了,这其中包括数据库设计,项目总的文档结构,所用的技术,然后开始写文档,这里要说一下,不要太急着开始详细设计,很可能需求还会变,这会付出惨重的代价的,这次大作业我深刻的体会了为什么程序员讨厌写文档,实在是因为写文档可能会耽误很多的开发时间,我们这个大作业最后的文档有70多页,20000左右的字数,幸好有些地方是复制粘贴的,但是那也是很蛋疼的一件事,因为实在是分不开身再写文档了,说一句哦,本人其实不讨厌写文档,相反还是觉得写文档很好,有利于理清思路,但是在特殊情况下,实在是觉得有些讨厌了。
在偷懒以及直接忽略概要设计文档和详细设计文档之后,我直接开始了前端页面的开发,Z同学也是不久之后就直接开始建立数据库,然后开始写enity,dao层。在网上找到了一个不错的开源的desktop模版,然后试着将所需要的页面集成进去,这样可以省去自己设计的一些时间,主要是设计这块不太会,css写的也不好,让我写出漂亮的页面不太现实,所以只有直接套用现有的,然后再此基础上改,相信很多同学也是这样的,但是带来的一个问题是,有时候你可能根本找不到应该在哪里改样式,哪里改js代码。这可能跟经验相关了,看你的直觉了,一般css代码,可以选择用chorme打开,按f12,然后放大镜,选中页面的某一模块,然后你就可以在调试器中看到css代码了。
回到正题,这样我们的项目提前开始了,因为只有两个人,而且时间也比较紧了,开始开发,留给我们的时间只有5天了,其中包括一个周末,这时候,我开始首先解决我的技术难点,实现websocket,在网上找了一份代码,调试更改之后,在tomcat7下运行成功了,然后分析源码,找到了到时候需要更改的部分,这样第一个核心技术解决了,然后开始第二个技术难点,地图,通过查看官网上的demo,然后自己的demo,功能都差不多实现了,到时候只需要从后台读取数据,然后显示出来就可以了,这时候就发现,当初的数据库设计有些问题,需要改,老实说,这时候代价已经挺大的,好吧,解决完上述两个最主要的问题,基本上心里已经有底了,这时候已经是星期六的晚上了,还有三天,星期天,我就开始整合阶段了,将Z同学已经写的东西和起来,然后自己开始actio层的编码,当然不用想,dao层肯定需要更改的,这时候项目的开发人员就已经只剩一个了。我开始集中代码开发阶段了。最终项目怎么样其实就取决于我一个人了,我不是想说自己有多厉害,其实我一直觉得每个人都是可以在一个项目中找到自己的位置的,关键在于leader怎么管理,这里就是我管理的一个问题,为什么不能定义好统一的数据交互接口,为什么刚开始的分析设计的时候不详细一些,这时候也不需要将所有的重任都压于一个人身上。这就是个bug。
虽然最后项目差不多完成了,效果也还不错,有关于项目的技术总结,看情况吧,其实也没什么好说的,都是一些简单的技术,稍微学一下,研究一下就会了。关键在于项目的管理。通过这个项目我有一些体会,与各位共勉:
1. 需求分析阶段,尽量慢一些,和概要设计,详细设计有一定的间隔,这样可以有时间反映,修改需求分析,不至于让概要设计和详细设计做出太大的变更
2. 应该分配合适的工作给合适的人,每个人在项目中都是可以有所作为的,关键在于你怎么去管理他。
3. 定义统一的数据交互接口很重要,大家有一份接口文档,就差不多可以实现前后台分离开发,我相信一些真正的项目也肯定是这么做的
4. 一般晚上,夜深人静的时候,头脑比较清楚,适合进行需求分析,详细设计,还有一个人永远是想不全的,需要集思广益。
5. 写代码最好的就是在先解决完所有的技术难点之后,进行集中开发,一天,两天就一直在开发代码,效率不错,bug也少。
6. leader必须适当的关注一下小组内各个成员的进度,还有不要催的太严,注意交流和处理问题,矛盾,分歧,其实主要是做人了。
7. 小的项目可以先从页面开发开始,先进行页面原型设计,因为一旦页面确定,基本上的功能也就确定了,所以谁说web前端不适合项目架构,其实前台分析的好,对于整个项目的架构是很有好处的。我就想成为这样的人,由前台转向项目架构,当然我不仅仅会web前端,后台也会一些。
8. 项目管理真的是一门学问。