汽车租赁管理系统的设计与实现毕业设计论文.doc
毕业设计论文汽车租赁管理系统的设计与实现摘要:汽车租赁业被称为“朝阳产业”,它因为无须办理保险、无须年检维修、车型可随意更换等优点,以租车代替买车来控制企业成本,这种在外企中十分流行的管理方式,正慢慢受到国内企事业单位和个人用户的青睐。将买车、养车的包袱全丢给汽车租赁公司,而把主要财力和精力放在自己的主业上,这是当今国际跨国公司流行的做法。据统计,一年下来,像桑塔纳2000这样的普通车,购车要比租车多花费10000元修理费,即以租车代替买车,成本就可以下降3成。另外,租车还为企业节省一笔管理成本,其根本原因在于对企业管理上“成本可控”理念认可采用租赁,随时可以调整开支,风险小,灵活性强,是降低成本的最好办法。那些对中国地方性法规制度不熟悉的商家可以减少诸如汽车上牌、年检、缴费、违章事故的处理等一系列不必要的麻烦。客户们还可以自由地选择租赁汽车的品牌,从经济型车到高档车,所有汽车均有完备的手续。汽车租赁的五个优势一、 车型可随时更新随着人们消费水平的提高,对高档消费品有不断更新的欲望。在欧美人们平均8个月更换一次车型。假如现在花费三十多万元购买一台轿车,因社会经济发展很快,一年后汽车的性能、外观改进很多,而价格却会大幅下降。一年后,如果想换新车型,老车可能15万元就很难卖出。这意味着,一年中车价损失接近20万元。但假如租赁一台三十多万元的车,只需10余万元。而且,可随时租用最新车型。从目前人们经常更换手机的状况就能预料到几年后,经常换新车,将是人们的新时尚。二、 解除车辆维修、年度检验的烦恼自购车辆后对车辆的维修和保养及一年一度的车辆年检要耗费很多财力和精力。但如果租车,就不存在这些烦恼,无论是车辆维修还是其它原因,车辆不能正常使用时,租赁公司都会及时提供替代车,保证用车。三、可充分提高资金利用率 如果自购车辆要一次性支付30万元,消费者具有一定经济实力。也就是说租车和买车相比至少可节省一次性投资20万元。消费者用这20万元去经营,可赚取一笔可观的利润。四、可保证你良好的财务状况自购车辆必然会造成固定资产增加、借款增加、流动资产减少使财务出现不良状况,而租赁车辆将有效回避上述风险。五、有利于提高成本观念,减少浪费自购车辆使用时随心所欲,特别是单位公车,私自用车现象较多,造成不必要的浪费,而如果租赁车,一是可根据业务需要随时调控用车数量,二是用车人知道自己的用车成本,可直接减少不必要的用车,有效地提高员工的成本观念。第1章 开发环境 1.1 开发所需工具Tomcat 6.0 , Windows XP , EditPlus , Dreamweaver MX 2004 ,IE 6.0 , Firefox火狐浏览器 ,Oracle 10g等。 1.2 Tomcat Tomcat服务器是一个免费的开放源代码的Web 应用服务器,目前最新版本是6.0.18.Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。 1.3 JSPJSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。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与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。 JSP的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet 是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。 自JSP推出后,众多大公司都支持JSP技术的服务器,如IBM、Oracle、Bea公司等,所以JSP迅速成为商业应用的服务器端语言。 1.4 ServletServlet是一种独立于平台和协议的服务器端的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编写,Servlet API具有完善的标准。因此,为IPlanet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者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.6 JDBCJDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,同时,JDBC也是个商标名。 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。 Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。而 JDBC 正是作为此种用途的机制。 JDBC 扩展了 Java 的功能。例如,用 Java 和 JDBC API 可以发布含有 applet 的网页,而该 applet 使用的信息可能来自远程数据库企业也可以用 JDBC 通过 Intranet 将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有 Windows、 Macintosh 和UNIX 等各种不同的操作系统)。随着越来越多的程序员开始使用Java 编程语言,对从 Java 中便捷地访问数据库的要求也在日益增加。 1.7 OracleOracle是殷墟(Yin Xu)出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思。与无压缩格式下存储数据相比,新的Oracle数据压缩技术能够确保以较小的开销节省三倍以上的磁盘存储空间。这一点比仅节省磁盘空间要具有更大的优势,因为它能够使企业节约更多的开支,以便有更多的资金来巩固自己的地位。自动诊断知识库(Automatic Diagnostic Repository,ADR)是专门针对严重错误的知识库。该知识库基本上能够自动完成一些以往需要由数据库管理员来手动完成的操作。作为ADR的一部分,SQL性能分析器(SQL Performance Analyzer,SPA)是最让人惊喜的特性之一。SQL性能分析器是一个整体调整工具,管理员可以通过该工具在数据库上定义和重演(replay) 一个典型的工作负载,之后管理员可以调节整体参数来使数据库尽快的达到最佳性能而这一任务同样也是许多年以来由数据库管理员手动完成的。 由于获得了最优的初始参数,数据库管理员就不需要调整数以万计的SQL语句。管理员需要做的就是给定一个典型的负载 ,由SAP根据历史记录来决定SQL的最终设置,而不用管理员来检测哪一个SQL设置是最合理的。 多年以来,甲骨文公司一直在努力完成地另一个新特性便是“联机更新”(在不down机的情况下更新软件)。实际上,很难从软件工程的角度来设计一个运行时能自动升级的软件。由于真正的应用集群(Real Application Clusters ,RAC)特性,甲骨文公司再一次对其他的数据库供应商造成了更大的压力。在实际的使用过程中,数据库产品的用户总是希望产品有持续的高可用性,这并不是说只需满足下次补丁更新之前的3年的时间就够了。 自动内存管理特性可以追根溯源至Oracle 9i,那时甲骨文公司推出首款自动调节存储池的工具。AMM工具其实就是一种探测机制。实际上,Oracle 11g 有很多随机访问存储池,当AMM探测到某个存储池中已满时,它将整个RAM从一个区域分配到其他相对合适的区域。 第2章 系统后台设计 2.1 系统的主要技术分析2.1.1. Browser/Server系统的三层体系结构在Browser/Server的系统中,用户可以通过浏览器向分布在网络上的许多服务器发出请求。Browser/Server结构极大的简化了客户机的工作,客户机上只需安装、配置少量的客户端软件即可,服务器将担负更多的工作,对数据库的访问和应用程序的执行将在服务器上完成。在Browser/Server三层体系结构下,表示层(Presentation)、功能层(Business Logic)、数据层(Data Service)被分割成三个相对独立的单元:第一层-表示层: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名称中文名称物理名称字段类型主键字段名IDUserid(PK)Number是字段名登录名UsernameVarchar2(30)否字段名身份证IdentityNumber否字段名姓名FullnameVarchar2(30)否字段名性别SexNumber否字段名地址AddressVarchar2(30)否字段名联系电话PhoneNumber否字段名职位PositionVarchar2(30)否字段名用户类型UserlevelNumber否字段名密码UserpwdVarchar2(30)否表3-1 用户表功能关系图如下:用户管理添加用户修改用户密码查询用户修改用户删除用户分配权限图3-1 功能关系图 3.3 客户表结构客户表用来反正真实客户在数据库内所有属性,包括:客户ID,身份证号,姓名,性别,地址,电话,职业,密码等。客户表: Customers名称中文名称物理名称字段类型主键字段名IDCust_id(PK)Number是字段名身份证IdentityNumber否字段名姓名CustnameVarchar2(30)否字段名性别SexNumber否字段名地址AddressVarchar2(30)否字段名电话PhoneNumber否字段名职业CareerVarchar2(30)否字段名密码CustpwdVarchar2(30)否表3-2 客户表结构功能关系图如下:客户管理添加客户修改客户密码查询客户删除客户修改客户图3-2 功能关系图 3.4 汽车表结构汽车表用来反正真实汽车在数据库内所有属性,其中包括:汽车ID,车号,车型,颜色,价值,租金,押金,租用情况,简介等.汽车信息表: Cars名称中文名称物理名称字段类型主键字段名IDcarid(PK)Number是字段名车号carnumberVarchar2(30)否字段名型号cartypeVarchar2(30)否字段名颜色colorVarchar2(30)否字段名价值priceNumber否字段名租金rentpriceNumber否字段名押金depositNumber否字段名租用情况isrentingNumber否字段名简介descriptionVarchar2(50)否表3-3 信息表功能关系图如下:汽车管理查询汽车信息删除汽车信息添加汽车信息修改汽车信息图3-4 关系图 3.5 出租单表结构反映出租单情况,包括出租单编号, 预付金, 应付金, 实际交付金额, 起租日期, 应归还日期, 归还日期, 出租单状态, 客户号, 车号, 服务人员编号等.出租单信息表: Rentable名称中文名称物理名称字段类型主键字段名出租单编号tableid(PK)Number是字段名预付金ImprestNumber否字段名应付金shouldpaypriceNumber否字段名实际交付金额PriceNumber否字段名起租日期BegindateDate否字段名应归还日期shouldreturndateDate否字段名归还日期ReturndateDate否字段名出租单状态RentflagNumber否字段名客户号custid(FK)Number否字段名车号carid(FK)Number否字段名服务人员编号userid(FK)Number否表3-4 信息表3.6 检查单表结构反映检查单实际情况,包括检查单号, 检查时间, 属性, 问题, 赔费, 检查员, 出租单编号等.检查单信息表: checktable名称中文名称物理名称字段类型主键字段名检查单号checkid(PK)Number是字段名检查时间checkdateDate否字段名属性FieldVarchar2(30)否字段名问题problemVarchar2(30)否字段名赔费payingNumber否字段名检查员checkuserid(FK)参照用户表Number否字段名出租单编号Rentid(FK)参照出租单表Number否表3-5 检查单信息表客户租车流程图: 图3-5 客户租车流程图客户请求业务出租汽车查询是否存在此客户生成出租单并修改数据库汽车信息数据库内修改该客户信息记录租车记录客户还车流程图: 图3-6 客户还车流程图客户归还汽车查询出租单生成检查单修改客户租用状态修改汽车租用状态修改出租单状态1.1. 连接数据库通过JDBC连接到ORACLE,利用JAVA的反射机制来寻找ORACLE提供的JDBC连接方法源代码节选:/* * 连接数据库抽象类 * 作为工具提供其他类直接调用Connection连接数据库 * 含有关闭数据库连接方法 */Class.forName(ConnectionImport.driver);/ 反射机制获取数据库驱动!conn = DriverManager.getConnection(ConnectionImport.url,ConnectionImport.user, ConnectionImport.password);/ 回滚操作。第4章 建立数据库 4.1 数据库建模通过建模工具建立数据库中所有数据模型UML图如下: 图4-1 UML数据模型 4.2 数据库建表利用SQL语句建立数据库表,利用数据库表的互相管理来反映具体事务的真实关系。由于表太多,这里也就不一一列举了。权限与目录表的SQL语句如下:create table OA_ROLES_MENUS ( ROLE_ID NUMBER not null, MENU_ID NUMBER not null, constraint ROLES_MENUS primary key (ROLE_ID, MENU_ID) 2. 系统前台设计2.1. 系统登入界面:界面如下图: 图5-1 登陆界面源代码节选:String name = request.getParameter("username");/ 获取用户名String password = request.getParameter("password");/ 获取密码String role_id = request.getParameter("role");/ 获取用户等级int id = Integer.parseInt(role_id);LoginDAO login = new LoginDAO(name, password, id);boolean flag = login.checkUser();if (flag) / 建立回话User user = login.getUser();HttpSession session = request.getSession();/ 在会话中将用户操作目录和所能操作的功能做保存session.setAttribute(Constants.KEY_SESSION, user);response.sendRedirect("default.jsp");/ 跳转生成目录 else / System.out.println(flag);request.setAttribute("msg", "err");request.getRequestDispatcher("wrong.html").forward(request,response);2.2. 动态生成菜单每次登入时自动访问数据库查询角色所对应的功能菜单如图所示图5-2 功能菜单2.3. 查询界面如图所示图5-3 查询界面通过查询数据库生成数组进行遍历产生结果集,利用分页技术展示给用户使用。代码节选:根据角色ID查询角色对应的菜单conn = JdbcUtil.getConnection();stat = conn.prepareStatement(sql);stat.setInt(1, id);set = stat.executeQuery();while (set.next() menu = new Menu();如果没有父目录,则将父目录设为-1int menuid =set.getInt("id");FunDAO fun = new FunDAOImpl();List<Fun> funs = fun.findFunByMenu(menuid);menu.setId(menuid);menu.setName(set.getString("name"); 目录名int fatherid = set.getInt("father_id");if (fatherid < 1) fatherid = -1;menu.setFatherid(fatherid); 父目录IDmenu.setUri(set.getString("uri");menu.setFuns(funs);list.add(menu);2.4. 角色添加如图所示添加角色是比较关键的部分,修改角色对应的目录和功能,通过修改中间表.并且不通过UPDATA来修改,只能将原有数据删除然后重新插入代码如下:String sql1 = "delete from oa_roles_menus where role_id=?"/ 刪除菜单语句String sql3 = "delete from oa_roles_funs where role_id=?"/ 刪除功能语句String sql2 = "insert into oa_roles_menus values(?,?)"/ 插入菜单语句String sql4 = "insert into oa_roles_funs values(?,?)"/ 插入功能语句stat = conn.prepareStatement(sql1);/ 刪除菜单关联stat.setInt(1, role.getRole_id();/ 插入刪除值stat2 = conn.prepareStatement(sql3);/ 刪除功能关联stat2.setInt(1, role.getRole_id();/ 插入刪除值stat.execute();stat2.execute();stat3 = conn.prepareStatement(sql2);/ 批量插入菜单对应关联参考文献1.孙卫琴 .Java网络编程精解M.北京:电子工业出版社,2007.32.林胜利.连旦晖 Java开发经典模式与实例M. 北京:中国铁道出版社,2007.13.张洪伟 .Tomcat Web开发整合应用M.清华大学出版社,2006.3.4 闫静,钟斌.Dreamweaver MX 2004与ASP动态网页基础与范例M.北京:机械工业出版社,2004.1-280.5邱旭东,刘文浩.基于JSP的MVC开发模式研究及应用J.中国科技术信息2006 6汪孝宜等.JSP数据库开发实例精粹M.电子工业出版社2005 7孙卫琴.精通Struts:基于MVC的Java Web设计与开发M.电子工业出版社2004 8 屈文军,孙林夫,赵慧娟,屈喜龙.ASP服务平台身份认证技术研究J.计算机应用研究,2006(5).9 刘丽平,王文杰.基于Web的自适应性智能试题库的设计J.计算机系统应用,2006(4).9 刘明,蒋朝慧,李燕华.基于J2EE标准ASP服务平台的实现J.计算机应用与软件,2006(4).10Russel Winder Graham Roberts著.Java软件开发M.人民邮电出版社200411Gary Bollinger,Bharathi Natarajan著.JSP程序设计指南M.清华大学出版社2002 附录The Art of Trade-offsHow do you Develop Software?There seems to be a common misunderstanding among netizens who create software for a living. There are those who proclaim loudly that one must model the whole world before committing to code-and that those who jump into code early are merely code-like-hell'' hackers. Then there's the crowd that says, Hey, wait a minute. You can't learn enough from a simple model up front. You have to explore with code of some type. Otherwise, you could very easily miss important details, or even create a model that can't be built! The One True AnswerSo which camp is correct? Those who prefer hacking around in code, or the those who insist on fully modeling their perception of the world before even thinking about code? Well, in a way, they are both right. At least, they are trying to solve the same problem-gaining sufficient knowledge to correctly implement a system. See, a software project is unlike projects in other engineering disciplines. Software projects are inherently projects of discovery. You and your team will learn more as time goes by. Your knowledge of the customer, the application, the environment, the sponsor-yo