还剩29页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
毕业设计论文汽车租赁管理系统的设计与实现摘要汽车租赁业被称为“朝阳产业”,它因为无须办理保险、无须年检维修、车型可随意更换等优点,以租车代替买车来控制企业成本,这种在外企中十分流行的管理方式,正慢慢受到国内企事业单位和个人用户的青睐将买车、养车的包袱全丢给汽车租赁公司,而把主要财力和精力放在自己的主业上,这是当今国际跨国公司流行的做法据统计,一年下来,像桑塔纳2000这样的普通车,购车要比租车多花费10000元修理费,即以租车代替买车,成本就可以下降3成另外,租车还为企业节省一笔管理成本,其根本原因在于对企业管理上“成本可控”理念认可——采用租赁,随时可以调整开支,风险小,灵活性强,是降低成本的最好办法那些对中国地方性法规制度不熟悉的商家可以减少诸如汽车上牌、年检、缴费、违章事故的处理等一系列不必要的麻烦客户们还可以自由地选择租赁汽车的品牌,从经济型车到高档车,所有汽车均有完备的手续汽车租赁的五个优势
1、车型可随时更新 随着人们消费水平的提高,对高档消费品有不断更新的欲望在欧美人们平均8个月更换一次车型假如现在花费三十多万元购买一台轿车,因社会经济发展很快,一年后汽车的性能、外观改进很多,而价格却会大幅下降一年后,如果想换新车型,老车可能15万元就很难卖出这意味着,一年中车价损失接近20万元但假如租赁一台三十多万元的车,只需10余万元而且,可随时租用最新车型从目前人们经常更换手机的状况就能预料到几年后,经常换新车,将是人们的新时尚
2、解除车辆维修、年度检验的烦恼 自购车辆后对车辆的维修和保养及一年一度的车辆年检要耗费很多财力和精力但如果租车,就不存在这些烦恼,无论是车辆维修还是其它原因,车辆不能正常使用时,租赁公司都会及时提供替代车,保证用车
三、可充分提高资金利用率 如果自购车辆要一次性支付30万元,消费者具有一定经济实力也就是说租车和买车相比至少可节省一次性投资20万元消费者用这20万元去经营,可赚取一笔可观的利润
四、可保证你良好的财务状况自购车辆必然会造成固定资产增加、借款增加、流动资产减少使财务出现不良状况,而租赁车辆将有效回避上述风险
五、有利于提高成本观念,减少浪费自购车辆使用时随心所欲,特别是单位公车,私自用车现象较多,造成不必要的浪费,而如果租赁车,一是可根据业务需要随时调控用车数量,二是用车人知道自己的用车成本,,可直接减少不必要的用车,有效地提高员工的成本观念第1章开发环境
1.1开发所需工具Tomcat
6.0WindowsXPEditPlusDreamweaverMX2004,IE
6.0Firefox火狐浏览器,Oracle10g等
1.2TomcatTomcat服务器是一个免费的开放源代码的Web应用服务器,目前最新版本是
6.
0.
18. Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat5支持最新的Servlet
2.4和JSP
2.0规范因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache独立的进程单独运行的
1.3JSPJSPJavaServerPages是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准JSP技术有点类似ASP技术,它是在传统的网页HTML文件*.htm*.html中插入Java程序段Scriptlet和JSP标记tag,从而形成JSP文件*.jsp用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能JSP与JavaServlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览JSP的
1.0规范的最后版本是1999年9月推出的,12月又推出了
1.1规范目前较新的是JSP
1.2规范,JSP
2.0规范的征求意见稿也已出台JSP页面由HTML代码和嵌入其中的Java代码所组成服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器JavaServlet是JSP的技术基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点自JSP推出后,众多大公司都支持JSP技术的服务器,如IBM、Oracle、Bea公司等,所以JSP迅速成为商业应用的服务器端语言
1.4ServletServlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面它担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间而在Servlet中,每个请求由一个轻量级的Java线程处理而不是重量级的操作系统进程在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码在性能优化方面,Servlet也比CGI有着更多的选择Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现Servlet用Java编写,ServletAPI具有完善的标准因此,为IPlanetEnterpriseServer写的Servlet无需任何实质上的改动即可移植到Apache、MicrosoftIIS或者WebStar几乎所有的主流服务器都直接或通过插件支持Servlet不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的或只需要极少的投资
1.5静态网页与动态网页静态网页是标准的HTML文件,其文件扩展名是.htm或.html它可以包含HTML标记、文本、Jave小程序、客户端脚本以及客户端ActiveX控件,但这种网页不包含任何服务器端脚本,该页中的每一行HTML代码都是在放置到Web服务器前由网页设计人员编写的,在放置到Web服务器后便不再发生任何更改,所以称之为静态网页程序是否在服务器端运行,是动态网页的重要标志在服务器端运行的程序、网页、组件,属于动态网页,它们会随不同客户、不同时间,返回不同的网页,例如ASP、PHP、JSP、ASP.net、CGI等运行于客户端的程序、网页、插件、组件,属于静态网页,例如html页、Flash、JavaScript、VBScript等等,它们是永远不变的
1.6JDBCJDBC(JavaDataBaseConnectivityjava数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯JavaAPI编写数据库应用程序,同时,JDBC也是个商标名有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言所需要的只是Java应用程序与各种不同数据库之间进行对话的方法而JDBC正是作为此种用途的机制JDBC扩展了Java的功能例如,用Java和JDBCAPI可以发布含有applet的网页,而该applet使用的信息可能来自远程数据库企业也可以用JDBC通过Intranet将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有Windows、Macintosh和UNIX等各种不同的操作系统)随着越来越多的程序员开始使用Java编程语言,对从Java中便捷地访问数据库的要求也在日益增加
1.7OracleOracle是殷墟(YinXu)出土的甲骨文(oracleboneinscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思与无压缩格式下存储数据相比,新的Oracle数据压缩技术能够确保以较小的开销节省三倍以上的磁盘存储空间这一点比仅节省磁盘空间要具有更大的优势,因为它能够使企业节约更多的开支,以便有更多的资金来巩固自己的地位自动诊断知识库(AutomaticDiagnosticRepository,ADR)是专门针对严重错误的知识库该知识库基本上能够自动完成一些以往需要由数据库管理员来手动完成的操作作为ADR的一部分,SQL性能分析器(SQLPerformanceAnalyzer,SPA)是最让人惊喜的特性之一SQL性能分析器是一个整体调整工具,管理员可以通过该工具在数据库上定义和重演replay一个典型的工作负载,之后管理员可以调节整体参数来使数据库尽快的达到最佳性能——而这一任务同样也是许多年以来由数据库管理员手动完成的由于获得了最优的初始参数,数据库管理员就不需要调整数以万计的SQL语句管理员需要做的就是给定一个典型的负载,由SAP根据历史记录来决定SQL的最终设置,而不用管理员来检测哪一个SQL设置是最合理的多年以来,甲骨文公司一直在努力完成地另一个新特性便是“联机更新”在不down机的情况下更新软件实际上,很难从软件工程的角度来设计一个运行时能自动升级的软件由于真正的应用集群(RealApplicationClusters,RAC)特性,甲骨文公司再一次对其他的数据库供应商造成了更大的压力在实际的使用过程中,数据库产品的用户总是希望产品有持续的高可用性,这并不是说只需满足下次补丁更新之前的3年的时间就够了自动内存管理特性可以追根溯源至Oracle9i,那时甲骨文公司推出首款自动调节存储池的工具AMM工具其实就是一种探测机制实际上,Oracle11g有很多随机访问存储池,当AMM探测到某个存储池中已满时,它将整个RAM从一个区域分配到其他相对合适的区域第2章系统后台设计
2.1系统的主要技术分析
2.
1.
1.Browser/Server系统的三层体系结构在Browser/Server的系统中,用户可以通过浏览器向分布在网络上的许多服务器发出请求Browser/Server结构极大的简化了客户机的工作,客户机上只需安装、配置少量的客户端软件即可,服务器将担负更多的工作,对数据库的访问和应用程序的执行将在服务器上完成在Browser/Server三层体系结构下,表示层Presentation、功能层BusinessLogic、数据层DataService被分割成三个相对独立的单元第一层--表示层Web浏览器在表示层中包含系统的显示逻辑,位于客户端它的任务是由Web浏览器向网络上的某一Web服务器提出服务请求,Web服务器对用户身份进行验证后用HTTP协议把所需的主页传送给客户端,客户机接受传来的主页文件,并把它显示在Web浏览器上第二层--功能层具有应用程序扩展功能的Web服务器在功能层中包含系统的事务处理逻辑,位于Web服务器端它的任务是接受用户的请求,首先需要执行相应的扩展应用程序与数据库进行连接,通过SQL等方式向数据库服务器提出数据处理申请,而后等数据库服务器将数据处理的结果提交给Web服务器,再由Web服务器传送回客户端第三层--数据层数据库服务器在数据层中包含系统的数据处理逻辑,位于数据库服务器端它的任务是接受Web服务器对数据库操纵的请求,实现对数据库查询、修改、更新等功能,把运行结果提交给Web服务器从上面的分析中可以看出,三层的Browser/Server体系结构是把二层Client/Server结构的事务处理逻辑模块从客户机的任务中分离出来,由单独组成的一层来负担其任务,这样客户机的压力大大减轻了,把负荷均衡地分配给了Web服务器,于是由原来的两层的Client/server结构转变成三层的Browser/Server结构图2-1数据模型第3章数据库设计
3.1数据库模式数据库模式定义了数据库的结构、表、关系、域和业务规则数据库模式是一种设计,数据库和应用正是建立在此基础上的域是一列可能拥有的值的集合必须为每一个表的每一列确定域除了数据的物理格式外,还需要确定是否有些域对表来说是唯一的数据库模式的最后一个要素是业务规则,它是对需要反映在数据库和数据库应用程序中的业务活动的约束业务规则是模式的一个重要部分,因为他们指定了无论什么数据变化到达DBMS引擎,允许的数据值必须满足的约束不管无效的数据变化请求是来自窗体的用户、查询/修改请求还是应用程序,DBMS都应该拒绝遗憾的是,不同的DBMS产品用不同的方法实施业务规则在某些情况下,DBMS产品不具备实施必要业务规则的能力,必须以代码形式把它们编入应用程序
3.2用户表结构用户表用来反映用户在数据库内所有属性包括:用户ID,登入名,密码,身份证号,姓名,性别,地址,联系电话,职位以及用户类型.用户表Users名称中文名称物理名称字段类型主键字段名IDUseridPKNumber是字段名登录名UsernameVarchar230否字段名身份证IdentityNumber否字段名姓名FullnameVarchar230否字段名性别SexNumber否字段名地址AddressVarchar230否字段名联系电话PhoneNumber否字段名职位PositionVarchar230否字段名用户类型UserlevelNumber否字段名密码UserpwdVarchar230否表3-1用户表功能关系图如下:图3-1功能关系图
3.3客户表结构客户表用来反正真实客户在数据库内所有属性包括:客户ID身份证号姓名性别地址电话职业密码等客户表:Customers名称中文名称物理名称字段类型主键字段名IDCust_idPKNumber是字段名身份证IdentityNumber否字段名姓名CustnameVarchar230否字段名性别SexNumber否字段名地址AddressVarchar230否字段名电话PhoneNumber否字段名职业CareerVarchar230否字段名密码CustpwdVarchar230否表3-2客户表结构功能关系图如下:图3-2功能关系图
3.4汽车表结构汽车表用来反正真实汽车在数据库内所有属性其中包括:汽车ID车号车型颜色价值租金押金租用情况简介等.汽车信息表:Cars名称中文名称物理名称字段类型主键字段名IDcaridPKNumber是字段名车号carnumberVarchar230否字段名型号cartypeVarchar230否字段名颜色colorVarchar230否字段名价值priceNumber否字段名租金rentpriceNumber否字段名押金depositNumber否字段名租用情况isrentingNumber否字段名简介descriptionVarchar250否表3-3信息表功能关系图如下:图3-4关系图
3.5出租单表结构反映出租单情况包括出租单编号预付金应付金实际交付金额起租日期应归还日期归还日期出租单状态客户号车号服务人员编号等.出租单信息表:Rentable名称中文名称物理名称字段类型主键字段名出租单编号tableidPKNumber是字段名预付金ImprestNumber否字段名应付金shouldpaypriceNumber否字段名实际交付金额PriceNumber否字段名起租日期BegindateDate否字段名应归还日期shouldreturndateDate否字段名归还日期ReturndateDate否字段名出租单状态RentflagNumber否字段名客户号custidFKNumber否字段名车号caridFKNumber否字段名服务人员编号useridFKNumber否表3-4信息表
3.6检查单表结构反映检查单实际情况包括检查单号检查时间属性问题赔费检查员出租单编号等.检查单信息表:checktable名称中文名称物理名称字段类型主键字段名检查单号checkid(PK)Number是字段名检查时间checkdateDate否字段名属性FieldVarchar230否字段名问题problemVarchar230否字段名赔费payingNumber否字段名检查员checkuseridFK参照用户表Number否字段名出租单编号Rentid(FK)参照出租单表Number否表3-5检查单信息表客户租车流程图:图3-5客户租车流程图客户还车流程图:图3-6客户还车流程图
1.
1.连接数据库通过JDBC连接到ORACLE利用JAVA的反射机制来寻找ORACLE提供的JDBC连接方法源代码节选:/***连接数据库抽象类*作为工具提供其他类直接调用Connection连接数据库*含有关闭数据库连接方法*/Class.forNameConnectionImport.driver;//反射机制获取数据库驱动!conn=DriverManager.getConnectionConnectionImport.urlConnectionImport.userConnectionImport.password;//回滚操作第4章建立数据库
4.1数据库建模通过建模工具建立数据库中所有数据模型UML图如下图4-1UML数据模型
4.2数据库建表利用SQL语句建立数据库表,利用数据库表的互相管理来反映具体事务的真实关系由于表太多,这里也就不一一列举了权限与目录表的SQL语句如下createtableOA_ROLES_MENUSROLE_IDNUMBERnotnullMENU_IDNUMBERnotnullconstraintROLES_MENUSprimarykeyROLE_IDMENU_ID
2.系统前台设计
2.
1.系统登入界面:界面如下图:图5-1登陆界面源代码节选:Stringname=request.getParameterusername;//获取用户名Stringpassword=request.getParameterpassword;//获取密码Stringrole_id=request.getParameterrole;//获取用户等级intid=Integer.parseIntrole_id;LoginDAOlogin=newLoginDAOnamepasswordid;booleanflag=login.checkUser;ifflag{//建立回话Useruser=login.getUser;HttpSessionsession=request.getSession;//在会话中将用户操作目录和所能操作的功能做保存session.setAttributeConstants.KEY_SESSIONuser;response.sendRedirectdefault.jsp;//跳转生成目录}else{//System.out.printlnflag;request.setAttributemsgerr;request.getRequestDispatcherwrong.html.forwardrequestresponse;}
2.
2.动态生成菜单每次登入时自动访问数据库查询角色所对应的功能菜单如图所示图5-2功能菜单
2.
3.查询界面如图所示图5-3查询界面通过查询数据库生成数组进行遍历产生结果集,利用分页技术展示给用户使用代码节选:根据角色ID查询角色对应的菜单conn=JdbcUtil.getConnection;stat=conn.prepareStatementsql;stat.setInt1id;set=stat.executeQuery;whileset.next{menu=newMenu;如果没有父目录,则将父目录设为-1intmenuid=set.getIntid;FunDAOfun=newFunDAOImpl;ListFunfuns=fun.findFunByMenumenuid;menu.setIdmenuid;menu.setNameset.getStringname;目录名intfatherid=set.getIntfather_id;iffatherid1{fatherid=-1;}menu.setFatheridfatherid;父目录IDmenu.setUriset.getStringuri;menu.setFunsfuns;list.addmenu;}
2.
4.角色添加如图所示添加角色是比较关键的部分,修改角色对应的目录和功能,通过修改中间表.并且不通过UPDATA来修改,只能将原有数据删除然后重新插入代码如下Stringsql1=deletefromoa_roles_menuswhererole_id=;//刪除菜单语句Stringsql3=deletefromoa_roles_funswhererole_id=;//刪除功能语句Stringsql2=insertintooa_roles_menusvalues;//插入菜单语句Stringsql4=insertintooa_roles_funsvalues;//插入功能语句stat=conn.prepareStatementsql1;//刪除菜单关联stat.setInt1role.getRole_id;//插入刪除值stat2=conn.prepareStatementsql3;//刪除功能关联stat
2.setInt1role.getRole_id;//插入刪除值stat.execute;stat
2.execute;stat3=conn.prepareStatementsql2;//批量插入菜单对应关联参考文献
[1].孙卫琴.Java网络编程精解[M].–北京电子工业出版社,
2007.3
[2].林胜利.连旦晖Java开发经典模式与实例[M].–北京中国铁道出版社,
2007.1
[3].张洪伟.TomcatWeb开发整合应用[M].清华大学出版社
2006.
3.
[4]闫静,钟斌.DreamweaverMX2004与ASP动态网页基础与范例[M].北京机械工业出版社,
2004.1-
280.
[5]邱旭东,刘文浩.基于JSP的MVC开发模式研究及应用[J].中国科技术信息2006
[6]汪孝宜等.JSP数据库开发实例精粹[M].电子工业出版社2005
[7]孙卫琴.精通Struts:基于MVC的JavaWeb设计与开发[M].电子工业出版社2004
[8]屈文军,孙林夫,赵慧娟,屈喜龙.ASP服务平台身份认证技术研究[J].计算机应用研究,2006
(5).
[9]刘丽平,王文杰.基于Web的自适应性智能试题库的设计[J].计算机系统应用,2006
(4).
[9]刘明,蒋朝慧,李燕华.基于J2EE标准ASP服务平台的实现[J].计算机应用与软件,2006
(4).
[10]RusselWinderGrahamRoberts著.Java软件开发[M].人民邮电出版社2004
[11]GaryBollinger,BharathiNatarajan著.JSP程序设计指南[M].清华大学出版社2002附录《TheArtofTrade-offs》HowdoyouDevelopSoftwareThereseemstobeacommonmisunderstandingamongnetizenswhocreatesoftwareforaliving.Therearethosewhoproclaimloudlythatonemustmodelthewholeworldbeforecommittingtocode---andthatthosewhojumpintocodeearlyaremerely``code-like-hellhackers.ThentheresthecrowdthatsaysHeywaitaminute.Youcantlearnenoughfromasimplemodelupfront.Youhavetoexplorewithcodeofsometype.Otherwiseyoucouldveryeasilymissimportantdetailsorevencreateamodelthatcantbebuilt!TheOneTrueAnswerSowhichcampiscorrectThosewhopreferhackingaroundincodeorthethosewhoinsistonfullymodelingtheirperceptionoftheworldbeforeeventhinkingaboutcodeWellinawaytheyarebothright.Atleasttheyaretryingtosolvethesameproblem---gainingsufficientknowledgetocorrectlyimplementasystem.Seeasoftwareprojectisunlikeprojectsinotherengineeringdisciplines.Softwareprojectsareinherentlyprojectsofdiscovery.Youandyourteamwilllearnmoreastimegoesby.Yourknowledgeofthecustomertheapplicationtheenvironmentthesponsor---youwillcometoknowmuchmoreabouteachofthesetopicsasyougoalong.Andyoumustbepreparedtoactonthatnew-foundknowledge.Theerroroftheclassicwaterfallapproachisthatthereisntanyfeedback.Discoveriesmadeatthelowerlevelsofcodinghavenowaytoaffectrequirementsorarchitectureinawaterfallmodel.Yettheselowerleveldetailscanoftenhaveprofoundeffectsonyourunderstandingofthehigherlevels!MitigateRiskMitigationofriskisattheheartoftraditionalengineering.Whenyoubuildabridgeyoudontbuilditasaperfectstructurethatwillnevercollapse.Insteadyoubuildittowithstand500yearwinds200yearfloods300%expectedmaximumloadetc.Ifyoudidntmakethesedesigntrade-offseverybridgewouldbesolidconcretefromthedecktothegroundandwouldbesomethinglike500feetwide.Engineeringisallaboutmakingthesecompromisesandsoissoftwareengineering.Thedifferenceisthatwithsoftwareengineeringmuchoftheriskisintheprocessofbuildingitaswellasinthefinishedstructureduetothenatureofdiscovery.Knowingthatyouwillcontinuetomakediscoveriesasyouproceeditcomesdowntothefactthatyouwanttominimizetheriskofdiscoveringsomethingthatinvalidatestoomuchofyourexistingwork.Thosewhojumprightintohackingoutproductioncodearealreadyintroublebeforetheybegin:largechangesindirectionbroughtaboutbyincreasedknowledgearehardesttochangehereandarethemostexpensive.Thosewhoproposemodelingfullybeforedoinganyimplementationrunthesameriskofmakingimportantdiscoverieswhilecreatingproductioncode.Themodelbeinganabstractversionofrealitymustforfeitsomedetails.Andthedevilmaywellbelurkinginthosedetails.Thentherearethosewhotrytobalancethesetwoextremesbymodelingalittleandcodingalittleorbymodelingwithadisposableprototypeortracer-bulletcode.ManyoftheUsenetdiscussionsofthistopicseemtoboggeddowninthedetailshereofbreadth-firstversusdepth-first;whendoyoumodelandwhendoyoucodeandsoon.Differentmethodswillsuggestdifferentwaysofattackingthisproblem.MethodsRUseXtremeProgrammingisbasedonthepremiseofmitigatingriskandinawaysoarealltheotherpopulardesignmethodsoftheday---whethertheyadmittoitornot.Publishedmethodsattempttoanswerthequestion``HowdoIandmyteamgainthemostknowledgeabouttheproblemandsolutiondomaininthemosteconomicalwaypossibleinordertocreateasoftwaresystemClearlyriskisinherentinthediscoveryprocessofaproject.Butthatdiscoveryisongoingandwecantaffordtomakecrucialdiscoverieslateinthegame.Ideallywewanttodiscovereverythingwellneedtoknowup-frontandunderstanditperfectly.Itwillneverhappenthatwayofcoursesoeverymethodtriestocreateanenvironmentwhereyoucanmaketheimportantdiscoveriesasearlyaspossible.ThegoldenAnswerofaparticularmethodisbasedonhowtoloweryourriskofmakingcruciallatediscoveries.Butthoseanswerswillbedifferentforeveryone.Theanswerdependsonyourteamyourprojectyourexperienceyourproblemdomainyourworkenvironmentetc.Onceyouhavefoundamethodthatworkswellforoneprojectthereisnoguaranteethatitwillworkwellonthenext.Ifanyoftheselistedfactorschangeyourprocesswilllikelyneedrevising.ItaintPerfectYouseeunlikethepristinebeautyofanalgorithmorsequenceoftightly-codedmachineinstructionsitaintperfect.Processesandmethodsdependonpeopletocarrythemoutandtounderstandthematerialbeingexamined.Andpeoplearefallible.Sointheenditcomesbackaroundtotheideaofmanagingtrade-offs.Youcouldspendsixmonthsonaprojectdiddlingaroundwithanobjectmodelonlytodiscoverthatyoumisunderstoodthecustomersperformancerequirementsduringimplementation.Youcouldjumpintoimplementationtooearlyandlockyourselfintoadesignorarchitecturethatwontsupportimportantrequirementsthatyouhaventgottentoyet.Oryoucanweighthetrade-offstominimizeoverallriskandanalyzealittledesignalittleandcodealittle.Therelativeproportionofeachtasktheordertheamountoffeedback---allofthesewillbedifferentforeachprojectandeachpractitioner.Therearenorightanswersthatarecorrectallthetimeinallcontexts.Oncemustbepragmaticandmakethechoicethatfitsthecurrentproblemthecurrentteamthecurrentenvironmentandsoon.Sonexttimeyouenterintoadiscussionofcomputerasanengineeringexerciseversusanartconsidertheartoftrade-offs.Otherdisciplinesmustlivewithtrade-offsconcerningthephysicalworld;wemustlivewithtrade-offsconcerningourselves.Andthenwecanproceedtodevelopsoftware.文献翻译你是怎样开发软件的?在那些以编写软件为生的人们之间有一个常见的争执有些人坚持认为在编写代码前必须先要有一个完整的模型,那些过早进行编码的人只不过是一些“在地狱中编码”的hacker然后,就会有另外一群人说,嗨!等一下你无法从一个简单的预先模型中学到足够的知识你必须得编写某些形式的代码否则,你很可能会遗漏掉一些重要细节,甚至创建出一个无法构建的模型正确答案那么哪一方正确呢?是整天侵淫在代码之中的那一方呢?还是坚持在思考代码前必须先完整地建立对世界感知的模型那一方呢?嗯,他们在某种程度上都是正确的至少,他们在试图解决同样的问题--获取正确实现一个系统的足够知识请注意,软件项目和其他工程学科中的项目不同软件项目在本质上是以发现为中心的项目随着时间的过去,你和你的团队会学到更多的知识你对客户、应用、环境以及发起者的认识也会随着项目的进展而增加你必须得做好适应新发现的知识的准备典型的瀑布方法的错误就在于根本没有任何反馈在瀑布模型中,低层编码中的任何发现根本无法影响到需求和架构然而,这些低层细节对于理解更高层的东西来说常常具有深远的影响降低风险降低风险是传统工程的核心当建造一座桥梁时,你不会考虑把它建造成一座永远不会倒塌的完美桥梁相反,你只会考虑它能经受500年的风吹、200年的水淹、最大3倍于所期望的承重,等等如果不做这些设计权衡,那么所有的桥梁都将是从桥面到地面的实心混凝土,都将有500英尺宽工程的全部就是做这些折中,软件工程也是如此软件工程的困难在于大部分的风险都存在于构建它的过程以及所完成的结构之中原因就是其发现的本质知道了要在前进中不断地进行发现,那么问题的核心就在于要使所发现的东西使你已完成工作失效的风险最小化那些直接去拼凑产品代码的人在开始之前就已经陷入麻烦之中(由增加的知识所导致的)方向上大的变化此时更改起来最为困难,也最为昂贵那些建议在做任何实现之前要先建立完整模型的人,同样也冒着在创建产品代码期间会出现重要发现的风险作为现实抽象版本的模型,必然会失去一些细节而恶魔很可能就潜伏在这些细节之中于是,就有一些人试图在这两个极端之间进行平衡,他们建立一点模型,就进行一些编码,他们使用一次性的原型或者代码曳光弹进行建模Usenet中许多关于这个主题的讨论都集中在是宽度优先还是深度优先;何时建模以及何时编码等细节之上针对这个问题,不同的方法会给出不同的建议方法就是我们自己极限编程是基于降低风险的前提之上,当今所有其他流行设计方法在某种程度上亦是如此――不管它们是否承认这一点已公开的方法都在试图回答下面问题“为了创建一个软件系统,我和我的团队如何才能以最为经济的方法获取最多的问题领域和解决方案领域知识”很明显,风险固有地存在于项目的发现过程之中然而,该发现是一直在进行的,我们无法承受游戏后期的重大发现在理想情况下,我们希望能够预先发现我们希望知道的一切,并且完全理解它们现实肯定不会是这样的,所以每个方法都试图创建出一个环境,在其中你能够尽可能早地做出最重要的发现一个特定方法最有价值之处就在于它是如何降低在晚期出现的关键发现的风险的不过,这些答案对每个人来说都是不同的答案和你的团队、项目、经验、问题领域、工作环境等相关如果你曾经发现一个方法很适合于一个项目,谁也无法保证它会适合于下一个项目如果所列出的这些因素中的任何一个发生变化,很可能就要对过程进行修订它并不完美你已经看到,和算法或者坚固的机器指令序列的质朴之美不同,它并不完美过程和方法依赖于人去维持它们,去理解将被检查的要素而人是很容易犯错误的所以在最后,我们再回到对管理权衡的想法你可以在一个项目的对象模型上浪费6个月的时间,结果在实现期间却发现你错误的理解了客户的性能需求你可以很早就开始实现,把自己锁定在一个无法支持一些你还不知道的重要需求的设计和架构上或者,你可以对权衡进行评估以最小化总的风险,接着分析一点、设计一点、编码一点每个任务所占的相对比例、顺序、反馈的数量――所有这些对每个项目、每个实践者都是不同的不存在在任何时间、任何场合都正确的答案所以,一定要注重实效,作出最适合当前问题、当前团队、当前环境的选择所以,当你下次进行计算机是工程实践还是艺术的讨论时,请考虑一下权衡的艺术其他的工程学科必须要建立在和物理世界有关的权衡之上;我们必须要面对和我们自己相关的权衡然后我们就可以开始开发软件了用户管理添加用户修改用户密码查询用户修改用户删除用户分配权限客户管理添加客户修改客户密码查询客户删除客户修改客户汽车管理查询汽车信息删除汽车信息添加汽车信息修改汽车信息客户请求业务出租汽车查询是否存在此客户生成出租单并修改数据库汽车信息数据库内修改该客户信息记录租车记录客户归还汽车查询出租单生成检查单修改客户租用状态修改汽车租用状态修改出租单状态。