三月 2007


随心所欲14 Mar 2007 11:25 am

学生信息管理平台开发心得

 

这个项目的开发对我来说是一个极大的挑战。整个项目的复杂性对我来说还是第一次,而且自己的工作贯穿了整个软件开发的整个流程。在这个漫长的过程中也走了很多弯路,当然最后系统的顺利完成对我来说是个极大的欣慰和鼓舞。在这里我也把我整个项目的心得写下来。

 

开发软件是团队的工作

       企图一个人进行软件开发那绝对是件自虐的事情,除非那是个天才。

       开发工作不仅仅是写代码,还包括需求分析,软件设计,软件测试等,写代码也分为写前端(视图层),后端(业务逻辑层,数据持久层)代码,两者代码是截然不同的,前台使用的语言可能又包括htmljspjavascript等等。如此多的工作由一两个人完成,这的确是件很不容易的事情。

       所以在一个项目还是应该由一个项目组进行开发,在这个团队中每个人都会用所专长,首先必须有人能够有着较强的沟通能力、语言表达能力、耐性与客户进行沟通,并写成需求分析文档,并且需要与向团队中的每一个人介绍整个系统的应该要实现的功能,团队根据需求分析讨论出实现功能的最佳方法,然后必须有人熟悉将要使用在项目中的开发技术以及应用框架,并且有着类似的开发经验,由他对整个系统的开发进行框架构造,分清层次模块,以对团队其它成员进行分工。然后团队中熟悉对应工作的开发者专心从事于自己熟悉的工作。

       比如3个人是一个典型的小团队,那么这三个人之间也应该根据特长进行分工,首先应该定义好一个好的开发框架,定义好层次之间的接口,并由三个人分别予以实现,最后拼装在一起。那么对于软件工程流程中的分工,我认为可以共同进行需求分析,软件测试,软件设计工作。或者在编写代码时,其中一位开发者负责项目进程的控制以及软件测试。

       团队的开发工作是很有必要的,一个优秀的团队才能保证写出有质量的代码,有质量的软件项目。

 

写代码不能光靠脑子

以前写代码总是把思路都记在脑子里面,但是在做这个项目的时候,脑子的容量实在不够了,整个项目分为很多模块,而模块之下也有很多的子模块,模块与模块之间,业务逻辑层,视图层,数据持久层之间都应该存在有很多接口。

在一开始写管理活动模块时,考虑到这个模块接口及方法时就忽略了其他模块的接口方法或者其他功能在这个模块中的应用,导致在写的代码的复用性不强,不易于以后的修改。导致再定义该模块其他功能的时候必须重新写一段代码来实现新的功能。当一个模块中的方法定义很多时,整个模块的结构就会显得很杂乱。

在写管理奖学金管理模块时,虽然整个流程与活动模块的流程相近,但是由于整个模块过于复杂,使得脑子里面对于活动模块的整个结构很是杂乱,已经不能够将整个设计迁移到新的类似模块中。

所以在发现这个问题之后,就决定将整个活动模块重整了一遍,理清结构,接下来按照这个结构类似定义其他的几个模块,很明显开发这几个模块非常的迅速,而且不存在什么逻辑上的问题。

所以不要过分地相信自己的脑子,必须先有设计然后才可以进行编码,虽然之前增加了这么一个步骤,但是,非常有利于有效率的开发,有利于写出有质量的代码。

 

编码规范很重要

写了很多代码之后,出现了很多作用域不同的变量以及方法,再回头查看对变量以及方法的调用时,因为命名并不统一,比如管理活动信息模块以及管理奖学金信息模块中查看自己的列表功能,业务逻辑层所使用的页面文件一个是activity.jsp,另外一个是scholarship_home.jsp,很明显两个页面文件的文件名所表达的意义很难看出是一致的。另外有意个例子活动信息模块中的actapply.jsp,和奖学金模块中的schapply.jsp,从文件名的结构看,两个信息所展现的功能是一致的。如此定义才能方便后续的开发,重构工作,以及项目交付之后的维护升级工作。

特别是一个团队中每一个程序员的编码风格都是不一致的,而团队工作中程序员之间的工作是有交叉的,包括之后可能出现的程序员之间的工作顶替,或者日后的维护升级工作,整个项目所使用的编码会有很多风格,这样会很不利于后续的开发维护工作。

所以在一个团队形成之初,就应当定义一整套的编码规范,哪怕是一个人进行开发,都应该明确自己的编码规范,特别是命名标准。每一个成员都应当按照编码规范进行编码。

 

重构的是很有必要的

一次设计出完美的结构或者写出完美的代码,那是不可能的。在开发过程中,当发现现有的设计已经不满足后续的开发需求,或者设计明显存在不合理之处。在这个时候就必须对代码进行重构。

不要舍不得之前写代码花费的精力,之间的过程只不过是给自己增加一段新的反面经验。对代码进行重构之后,将会很有利于后续的开发。有利于给系统形成一个良好的体系结构,这样也有利于性能的控制。

重构的过程同样也是对代码进行进一步检查的过程,在这个过程中,可以发现一些新的不合理的地方,进一步减少系统发生错误的可能性。

 

项目的开发计划很重要

一个项目不是几天就能开发完毕的,整个开发过程一定要有一个好的计划,第一步做什么,第二步做什么。比如a模块需要定义接口123b模块需要定义接口456,在开发过程中应该要避免按照自己的意愿顺序定义这一批接口,不能想到哪就做到哪,如果是这样进行操作,很有可能遗漏了某个接口的定义。而且如此安排即脑子里面没有好的设计模式,结构杂乱,当然不能写出一个高质量的接口。

所以在项目的开始即应该制定详细的开发计划,在每一个子模块开发之前也应该针对子模块中的逻辑制定详细的开发计划。在开发过程中,严格的按照开发计划进行定义。这样才能够有效率地进行开发。

 

 

写代码之前一定要有一个好的设计框架

       在开发一个项目的过程中,最好的参考资料不是成堆的技术图书,而是一个良好的设计文档。

在一个项目中最重要的应该是这个设计框架,或许一个小规模的项目,不需要重构或者制定详细的开发计划而避免增加开发的成本。但是一定要有一个好的设计框架。

比如整个系统的层次分割,模块的划分,层次之间的接口,模块之间的调用,这些都是应该在设计中体现的。这些也是进行团队分工的基础。根据框架定义好接口之后,就可以将工作分给团队中其他的成员开发。一个好的框架有利于制定项目的开发计划,以及测试计划。这样才能够进行有效率的团队开发。

设计文档也是节省脑力活动的重要工具。

比如上面一例中,相同功能的模块的开发,有了设计文档之后,用户不必在脑子中记住整个模块的结构,而当开发第二个模块的时候只需要查阅设计文档,就能够快速地开发出新的模块,甚至,开发完第一个模块之后,完全能可以交给另外一个成员开发,这个成员只需要查阅设计文档,就可以了解到第一个模块中使用的设计结构,再进行快速的开发。

 

要设计好一个系统必须有足够的经验和知识

自己曾经尝试着使用Google Web TookitGooglejava程序员开发的一套实现ajax的框架)做了一个版本的学生信息管理系统。但是开发完之后,发现这个设计非常得杂乱,自己再需要对某个模块的功能进行修改的时候,显得非常得复杂。性能也不高,页面也不够友好。原因是自己对gwt框架并不是很了解,只是一个新手,而且gwt是新出的开发工具,还没有足够的开发类的文章供参考,更多的需要自己去探索。一个新手拿自己并不熟悉的工具来开发一个具有一定规模的系统很明显是力不从心的。

当时对mvc三层架构的设计模式并不是很了解,对于ajax技术也只是略知皮毛,结果并没有将ajax的长处发挥在异步数据传输上,更多的只是客户端的javascript的应用。所以第一版本整体被自己否决了,浪费了很多宝贵的时间。但是也增加了一个教训。

于是在新版本的系统中,我选用Struts。虽然在开发初期,对于Struts并不是很了解,但是因为Struts已经十一个非常成熟的框架了,有很多的资源可以参考。于是我利用了一段时间迅速入门,并投入开发,开发的过程中,为了增加客户端的体验,我还迅速学习了javascrpit以及css

在对struts以及jscss有一定了解之后,眼前逐渐明朗起来。整个开发的结构也逐渐浮出水面。

所以要设计好一个系统必须要有足够的经验和知识。

 

 

本次srtp经历对我来说的确受益匪浅。所获心得我也必将使用在以后的项目之中。

 

秦岭

2007-3-12

随心所欲14 Mar 2007 11:24 am

    准备了很久的Srtp项目,昨天第一批三个组结题,排在最后一个答辩,不过最后是优秀,还是比较欣慰的。毕竟自己还是付出了很多的。听闻05级的同学正在为此事头疼,所以发此文分享一些经验。
申请的有两个级别,一个是校srtp项目,一个是院级的课外研学项目,二者形式基本一样,也都能拿到学分,不同的是校级的项目学校在最后应该都会有资金 的包销,而 院级项目还要“争取”。申请的时候,填写都是一样的申请,申请提交给院里之后,院里要经过筛选,将一些有价值,有新意的项目报给学校作为校级的SRTP项 目,而所申请的资金不是都能批下来的,一般什么什么系统之类的一个组能批下300-400元,但是这些钱不是一开始就给项目组的,是要在最后项目组凭发票 报销的,所以开发过程中,一定要注意保留原始发票,特别是一些打印的材料,交通费这些。而书籍有一种说法是如  果你要包销,书就要上交,这个说法尚未得到证实。
我以我本人为例,一开始申请的时候,申请了一个什么教室资源管理系统,结果给  了一个院级项目,说实话这个项目的题目实在是不怎么新颖,所以只能留在院里。不过 后来我自己把题目改掉了,改成了自己比较了解的学生工作范畴的“学生信息管理平台”,但是这个时候已经不能再申请了,只能留在院里面作为课外研学项目了, 也就是有可能得不到资金的。
这就涉及到了开题的问题,很多人盲目开题,在自己没有任何开发经验或者技术储备的情况下,不做任何的可行性及复杂度分析盲目开题。从我们这一届的情况 看,申请审批下来的项目,特别是校级项目里面有不少题目感觉很不错,很有难度,但是看看做的人,于是就对这个项目不报什么信心了。
选题非常重要,个人认为要注意几点,各位后来者在确定自己题目的时候一定要问自己以下几个问题
1.我的这个项目有没有实用价值
2.这个项目针对哪些用户群体
3.对于这些用户群体他们目前在用什么样的系统
4.他们目前用的这套系统和我们要开发的系统相比,我们到底胜出多少,或者说我们到底能改善多少使用的便利,或体验
我有一个案例,有个小组开发了一套也是面向辅导员服务的系统,在这套系统中提供了学生成绩管理,课表查询,还有其他的小功能比如计算器,万年历这些。在 老师评审的时候直接指出了目前的教务处的系统已经为辅导员提供了这个服务,而且这个服务已经很成熟了,如果没有很大用户使用,安全性,整体性能上的提高的 话,根本没有必要再做这么一套系统,另外一个系统要做专,你可以只包括一个成绩管理,就叫学生成绩管理系统,那你就必须把这一块做专,不要以为这个很简 单,在做这么一套系统的时候要充分考虑到这套系统对于以有系统的创新点和优势,以及整个系统的特殊要求,比如说安全性。为什么难?主要还是因为目前已经存 在的系统已经很成熟了,想超越他,一个字——难。
另外就是你既然把课题定向为面向辅导员服务,那你得好好想想这些人群到底最需要什么,虽然说做需求分析很麻烦,但是个人觉得还是很有必要的,一个辅导员 目前可能对学生的动态情况想有一个好的把握,比如学生的缺勤情况,参加过活动的情况,是不是应该找个时间跟学生交流交流(日程安排)等等等等,所有这些都 是目前还是空白的地方的。所以要知道那些地方是空白,问问你的系统定向的人群。
关于所使用的技术,我也谈一些
我的项目做了两个版本,之前使用的是Ajax的框架GWT,但是因为GWT是一个新家伙,网上的参考资料,开发的经验都少,所以自己边做边研究,结果做 出来整体的感觉很不好,而且在功能上还有一些定位错误,于是在做好之后忍痛割爱,pass掉了,最后结题的时候用到的技术/知识主要是JSP (JSTL),Struts,Javascript,XML,Dom,CSS。刚才这几项都是目前都很成熟的技术,如果你还不是很了解,我稍微解释一下 jsp不用说了吧,关于JSTL,在写JSP的初期阶段,每个人都在页面里面写过Java代码,但是要知道,这样是很不好的,如果你了解HTML,那你就 应该知道里面其实都是成对的标签比如<html></html>,<td></td>等等,而如果我们 直接写了Java代码,那就破坏了这样的结构,在维护起来就非常不方便,另外很重要的一点,就是如果这么些那么你的层次就非常的不明确,你可能在jsp里 面直接写从request里面获取attribute,然后作判断,再作处理,但是要知道这样该属于业务逻辑,不适合出现在页面里面,而JSTL就可以解 决这些。关于Struts,是目前J2EE的一个轻量级的框架,很成熟,可以用它来负责业务逻辑层,表现层,网上有很多资料,经常用来和这个相配合的是 Spring 和 Hibernate,Spring负责逻辑层,Hibernate负责数据持久层。
JavaScript这个家伙这两年已为Ajax的流行而开始转变名声,之前JavaScript经常用来做一个花俏的菜单,放一个时钟,或者在状态栏 变换文字等等,而现在JavaScript已经成为改善用户客户端体验的重要工具,目前的ajax技术全程就是异步的JavaScript and XML,使用Javascript在客户端页面局部修改,使用XML进行数据异步传输,使得用户就像在使用一个桌面应用程序一样。Dom全称是文档对象模 型,对于一个html来说可以利用DOM来解析他,得到HTML的每一个结构,用Javascript调用dom,就可以动态的修改页面上的东西,比如当 我正在填一个表单,当我填完一项,文本框失去焦点的时候,客户端自动对所填的格式进行验证,这个时候只要在textbox的onblur属性里面调用已经 定义的javascript函数,在函数中使用dom来获取这个文本框的引用然后进行格式验证。所谓CSS就是样式表,我在css里面定义了很多样式,然 后在写jsp的时候就直接使用这些样式,很重要的!
以上就是我自己用到的技术。当然这是J这一头的,相信肯定有人使用.net,我自己也不是很熟悉,就不说什么了。
不管你使用哪种技术,哪怕你现在什么都不会,都来得及。当然不要拖到最后。
如果你的项目是定位于将目前已有的系统使用新的技术进行重新架构。那就应该考虑到使用目前比较流行的框架,或者改善客户端体验(Ajax)。
在这里我说一下Ajax,Ajax这两年因为google而火起来,其实是新瓶装老酒。Ajax也是web2.0中的主要力量。上面提到过使用Ajax 就好像使用本地的桌面应用程序一样。使用过Gmail,163,yahoo等邮箱的同学都能有所体验。就好像在控制自己及其里面的程序一样。要想有更多的 体验,你可以多访问google的一些东西,Google Map(百度也有了),Gmail,还有个性化主页等等,利用Ajax可以轻松的实现拖拽等功能。比如一个注册表单,我们都有这么一个经验,我们申请一个 用户名,还要判断一下有没有已经注册了,那我们得把注册停下来,单击一个检察按钮,然后等他的返回结果,如果我们使用了Ajax,我们不必停下来,只要继 续填写,Ajax会利用异步传输,得到结果返回在页面上。
在以下的几个技术里面从左到右,与常规的桌面应用程序的相似度依次提高            php,asp,jsp->>Struts->>JSF,Shale->>Ajax
而目前还有一个很热门的Ruby,Ruby on Rails对Ajax的支持特别的好(虽然我自己没做过,都这么说),能够很方便的开发出Ajax的系统。如果你不懂JavaScript怎么办,现在有 很多框架,比如我所使用的GWT,是google出的可以在code.google.com下载到。这个框架是给java程序员的。你只要写Java就行 了,框架会自动生成js,还有很流行的一个框架是DWR也是给java程序员的,另外网上还有很多ajax的标签,可以用来改造现有的系统,有兴趣也可以 去看一下。用.net的也不要急,微软毕竟是大牛,他有他自己独特的东西叫ATALAS,微软的人叫它为阿塔拉斯,在微软的网站上可以下到,中文的教程目 前只有一本。

定位到用户的角色
现在说说这点,就是做项目的时候要充分考虑到用户的角色,也就是说你的使用必须方便,必须傻瓜化,任何人都能够使用,而不仅仅是计算机/软件专业的人, 你不可能让用户写一条sql语句添加一条新的纪录。所以整个系统必须考虑完整了。再举上面那个案例,成绩管理,课表查询,难道让辅导员自己往里面输课表 吗,这是明显很不现实的事情。再者如果想优秀的话,你的使用说明书也要写好噢。
关于IDE的使用
j的当然首推Eclipse+Myeclipse了,当然如果你时间足够的话,想多学一点可以直接用Eclipse,然后自己到相应的网站上去下开发包,自己配制。
.net的显然vs2005,其他的就不谈了。

补充一点,就是测试的环境,BS的结构一定要试一下Firefox,IE6,和IE7,这三者对W3C的标准都有不同的支持。所以自己好不容易定义出来的页面极有可能,换一种浏览器就乱七八糟了。

下面给大家推荐J方向的几本书
JSP:Beginning JavaServer Pages (Wrox-人民邮电出版社) 中文(JSP高级程序设计)55rmb   还有一本初级的(jsp程序设计)。
Struts:Struts In Action (Struts实战),Struts基础教程(Apress-人民邮电出版社)45rmb
CSS:CSS Mastery Advanced Web Standards Solutions 精通CSS(Apress-人民邮电出版社) 39rmb
Ajax:Ajax in Action(Ajax 实战) Manning-人民邮电出版社 69rmb, Ajax基础教程 Manning-人民邮电出版社 ,Atalas基础教程 人民邮电出版社
Javascript宝典  太贵了 99好像