谈企业应用项目的软件开发过程

【canvas】canvas基础使用(七):绘制图像 学习canvas如何绘制图片或视频。给定一个图像,一般使用drawImage()方法绘制。Canvas 2D API 中的 CanvasRenderingContext2D.drawImage() 方法提供了多种在画布(Canvas)上绘制图像的方式。 语法: 指定绘制位置快速绘制: drawImage(image, dx, dy); 指定绘制位置宽高快速绘制: drawImage(image, dx, dy, dWidth, dHeight); 指定图像被绘制区域和绘制区域绘制: drawImage(im 阅读详情

    谈企业应用项目的软件开发过程
                                             ——一个PRM系统实施的经验与教训
  

本文以一个PRM项目为例, 探讨了目前国内软件开发企业在软件开发过程中,尤其是企业应用系统项目开发中,面临的问题以及如何利用敏捷软件开发方法的解决方案。

  一、 项目与公司背景

  该项目是一个PRM (Partner Relationship Management)系统,为世界著名的快速消费品品牌在中国大陆的合作伙伴提供订单管理以及其它辅助功能。该系统原来是基于PHP实现的,已经运行将近2年的时间,但是由于系统功能问题,需要对系统进行重新开发,新的系统基于J2EE框架实现。

  项目预期情况如下:

    项目开始时间: 2002年7月1日

    预期交付时间: 2002年9月1日

    项目金额: 70万RMB

  项目开发商是亚洲领先的电子商务解决方案供应商,在J2EE架构的项目执行方面有丰富的经验,结合RUP与Web Software Engineering形成了自己的一套电子商务项目实施方法论,并在多个项目中成功进行实施。

  二、 项目实施情况

  项目由于客户预算等原因,原有的软、硬件系统继续使用,同时,应用系统平台也采用开源项目。

  项目部署时的系统情况如下:

    硬件:

    操作系统: Solaris

    主频: 400M

    内存: 1G

    硬盘: 20G

    应用平台:

    Web服务器: Apache 1.3.21

    应用服务器: Tomcat 4.0.6

    数据库服务器: Oracle 8.1.7

  项目人员配置与项目规模:

    项目团队

    项目经理: 1

    技术经理: 1(兼)

    客户经理: 1

    开发人员: 4

    测试人员: 2

    HTML人员: 1(兼)

    项目规模

    Use Case: 32

    代码行数: 65000

    JSP页面: 198

  项目真实执行情况:

    开始日期: 2002/7/1

    交付日期: 2002/9/2

    验收日期: 2003/5/8

    维护时间: 230 人小时

    目前项目盈利: 20000

  目前,项目由于性能问题,仍然没有验收,维护时间日益增长,目前仍然有30万左右的尾款没有收到;更为严重的是,目前项目开发商正在投标的另一快速消费品行业著名客户的合作伙伴与该客户有很大的重叠,因此,对于潜在项目的招标造成一定的影响。

  三、 经验与教训

  从项目规模中可以看出,该项目的时间还是比较紧张的;另外一方面,项目交付是在合同规定日期之前完成,而且通过了所有的功能测试。从一定意义上的讲,项目的开发是取得了一定的成功的。

  3.1 经验

  在项目开发前,项目开发商已经通过其它项目,实施了以XP为代表的敏捷软件开发方法的部分最佳实践,并取得了很大的成功。因此,在该项目的执行过程中,项目开发商继续采用了XP的部分实践以及其它软件开发方法中的推荐做法[1][2]:

  每日晨会:在项目实施过程中,每天早晨开发小组都要参加一个持续15分钟左右的会议,由项目经理主持,听取每个成员的进度,并根据进展情况,对于进度和资源进行调整。

  由于会议是每天进行的,PM很容易从中获得真实的项目情况-"掀开地毯下面的东西"[4],从而对风险有了较好的控制。

  交叉审核:项目组在最初的时候原本是想采取"成对编程"的实践,但是没有获得物理和管理上的支持,因此,只能采取交叉审核的方式进行。

  需求获取:由PM和一名对于原有系统较熟悉的开发人员进行需求获取和SRS (Software Requirement Specification) 的撰写。技术经理和其它开发人员进行需求的审核。

  分析与设计:由一名开发人员进行系统框架的设计,其它人员进行审核;在系统框架设计进行过程中,由于系统去除订单处理以外的其它部分比较独立,因此,将其它模块分配给开发人员,而将核心部分交与技术经理进行分析与设计。开发人员在每个迭代周期内,都会在分析与设计做完后,每2人一组进行审核。

  编码:每天下班前,2人一组,对对方的代码进行Review,发现问题及时解决。代码Review的时候,语法与规则的检查,通过Check Style的工具进行;开发人员将审查的重点放在功能实现与性能优化等方面。

  测试:在需求文档形成以后,2个测试人员分布编写分配模块的Test Case;而在具体测试的时候,两人交叉测试对方的模块和更新文档。

  在系统开发Verification的各个阶段,都有Check List,详细的信息请查看参考文献[3]。

  测试先行:测试在软件开发中的重要作用已经得到了越来越多的重视,但是,由于习惯势力的影响和对于"Test-Driven Development"的不熟悉,开发小组并没有实施完全意义上的测试先行。

  对于系统框架的核心类设计过程中,项目小组采取了TDD的方式进行开发。在后续的系统开发中,每个开发人员在进行开发前,首先要完成一个功能测试 ( Function Test ) 列表,将要完成的Use Case中的主要业务逻辑以及关联逻辑都要罗列出来,在提交测试人员进行集成测试之前,开发人员需要保证完成Function List中的所有选项。

  在每个开发人员的模块完成并通过个人的功能测试后,测试人员进行集成测试,同时编写测试脚本,并通过自动测试工具 (Rational Robot) 进行记录。每天下班之前,测试人员会启动测试工具,进行回归测试。在第二天向PM和技术经理提交测试报告并将Bug提交至Bug Trace系统(Rational Clear Quest),由PM进行Bug的分发。每个开发人员需要在下一个迭代周期完成前,修正前一个迭代内分配的Bug。

  持续集成:在测试先行的基础上,开发一组平均每天都会进行已经完成模块与以后系统的集成。集成由专门的人员,在开发人员将已经通过功能测试的源码Check in到源码控制系统 (ClearCase) 中以后进行,在部署应用结束以后,通知测试人员进行集成测试。

  小步发布:项目有专门的测试与发布服务器,每天都有集成的系统在运行和接受测试。由于没有现场客户,对于已经发布的系统,是由"客户领域专家"(这个项目是由Business Development人员来充当这个角色)来进行审查的。他对于系统的意见和发现的问题,在经过PM和技术经理审核后,进入ClearQuest,分配给开发人员进行修改。

  由于项目一开始就注意组织内部以及与客户的沟通和交流,同时采用了很多敏捷软件开发过程的实践,项目如期交付使用。

  3.2 教训

  项目在交付以后,最初的两个订货季节没有出现功能与性能上的问题。但是,由于合同中有数据迁移的条款,在项目交付2月后,项目开发商将旧应用系统中的数据导入新系统以后,在下一个大的订货季节中,持续的出现性能上的问题。在代码修改和硬件环境提高以后,系统性能目前获得了一定的改善。

  从项目验收日期的日益推迟中,我们可以看出,该项目还是有很多地方做的不够,例如:

  系统二次开发效应:"第二个系统效应"是Brooks在《人月神话》中提出的一个普遍的问题,一般而言,第二个系统会倾向于过分设计[4]。

  对于这个项目而言,没有犯这个错误,却发生了另外一种情况:旧系统中,对于订单信息以及产品信息的展示,不管是多是少(系统页面最多显示上千条记录),都是在一个页面中显示。这对于没有明显的层次结构,直接在Script中调用数据库记录的PHP来说,性能还是可以接受的。但是,新系统的设计中客户提出考虑系统用户习惯一致性的问题,就照搬了旧系统的页面设计;同时,在架构设计上,对于这种页面显示大量数据的情况,也没有给予充分的考虑,为后来的性能问题,埋下了伏笔。

  教训一:没有考虑新平台的影响,照搬旧系统的功能以及页面设计。

  非功能性需求:项目合同中主要描述的是系统功能性的需求,而没有非功能性需求的规定;同时,在需求获取解决,也没有明确的了解系统的性能指标等非功能性需求。主要原因在于项目开发商之前没有大规模业务系统开发的经验,对于非功能性需求没有足够的重视;同时,在测试阶段,也没有对于系统负载和性能做过测试。

  因此,在项目交付以后,由于旧系统数据迁移后,数据量有了很大的增长,同时,在秋季的定购高峰中,有大量的并发用户访问,出现了下列问题:

  数据库死锁;

  大量数据计算与显示页面速度很慢,页面要经过5~10分钟才能够完全显示;

  上述两种情况在少量负载的单元测试和集成测试中是不可能出现的。

  教训二:对于企业应用系统,尤其是业务系统,没有切实注意负载、性能等非功能性需求。

  效率与设计:在J2EE中,已经成功的运用了很多设计模式的思想,为系统的开发提供了一个很好框架。但是,在项目的架构设计中,除了考虑可维护性、可复用性等问题以外,还要考虑代码执行效率的问题[5]。

  随着计算机硬件技术的发展,"莫尔定律"被一再的验证,系统硬件的价格逐渐降低。对于很多使用J2EE架构或者JAVA技术的项目来说,解决性能与效率问题的解决方案就是增加硬件方面的投入。而实际上,软件开发过程中优劣算法之间的差距是靠硬件的投入平衡不了的。

  该项目在系统维护期间,对代码进行走查,修改了很多对于性能有影响的语句;同时,在框架设计中,尤其是数据库操作方法,利用Cache原理,从一定程度上解决了性能的问题。

  教训三:系统框架设计只考虑面向对象和可维护性,没有在完美的设计与高效率的代码之间做出权衡。

  数据库设计:JAVA是纯粹的面向对象语言,利用J2EE开发的项目,也强调首先进行OOAD的分析,首先有对象,然后再有数据库的设计。DBA在项目中的作用,已经远远没有传统的结构性编程中重要。而实际情况却是远非如此:大部分的业务系统,如果要对系统的性能做出优化,对数据库层或者SQL语句进行优化是关键的步骤之一。

  对于这个PRM系统,在数据库的设计上并没有经过DBA的审查就开始进行开发;而在性能问题出现以后,客户增加了512M的内存,也没有请求DBA对Oracle的参数做相应的调整,造成了很大的资源浪费。

  在项目维护过程中,依靠DBA的帮助,开发商对于数据库系统参数、索引、存储过程和SQL语句都做了一定的调整,这对于系统性能的提高起了很大的作用。

  教训四:在面向对象的软件系统构建中,忽视数据库设计以及DBA的重要作用。

  客户参与:在传统的软件开发过程中,一般情况下,客户在签订合同后,项目交付前是很少有机会看到系统的,这样就造成了系统交付后,客户抱怨很多的情况;而在以XP为代表的敏捷软件开发方法中,强化了客户在软件开发中的重要作用,XP更是提出了"现场客户"的实践,将客户作为项目小组的一员,客户对于项目的发布计划、内容和优先级等方面有绝对的控制权。

  对于这个PRM项目,由于客户的原因,不可能采取"现场客户"的实践,但是,开发商的BD对于该客户十分熟悉,完全可以作为客户代表参与到项目中来,因此,开发商将客户经理作为项目组的一员。

  实际情况是:开发过程中,客户经理由于业务拓展的原因,并没有在项目上分配多少时间进行审查;而客户在交付前也没有花费很多的时间研究系统,也没有提交很多的反馈报告。在系统交付出现性能等问题后,客户经理与开发人员一起对于系统需求进行审查,提出了很多有参考性的意见。如果从一开始,就强化"现场客户"的最佳实践,就可以很早发现问题。

  教训五:客户或者客户经理对于项目的参与力度不够。

  四、 结论

  在基于J2EE的企业应用项目开发中,要注意以下问题:

  权衡系统设计与性能指标,关注非功能性需求;

  采取敏捷软件开发过程,关注人(客户和开发人员)在项目实施中的重要作用,如果可以的话,联合实施XP的所有实践;

  五、 参考文献

  [1] Agile Software Development Alistair Cockburn

  [2] Extreme Programming Explained - Embrace Change Kent Beck

  [3] Software Verification and Validation for Practitioners and Managers Steven R. Rakitin

  [4] The Mythical Man-Month Frederick P. Brooks Jr.

  [5] Expert One-To-One J2EE Design and Development Rod Johnson
 
 

Canvas入门(3):图像处理和绘制文字 9个JQuery和5个JavaScript经典面试题 阅读详情

相关推荐

使用HTML Canvas API的drawImage方法绘制图像

在HTML5中,Canvas元素提供了一个强大的绘图环境,允许我们使用JavaScript代码绘制图形、图像和动画。其中,drawImage方法是Canvas API中的一个重要函数,用于在Canvas上绘制图像。上述代码创建了一个Canvas元素,并使用drawImage方法在Canvas上绘制一张图像。需要注意的是,由于图像加载是一个异步过程,我们需要在图像加载完成后再绘制图像,以确保图像已经加载完毕。方法的第一个参数是要绘制的图像对象,第二个和第三个参数分别是图像在Canvas上的起始坐标。

PmtxPhp的博客 153

【企业级开发模型】企业级开发流程 | 系统环境开发

【企业级开发模型】企业级开发流程 | 系统环境开发

m0_74841364的博客 1525

基于STM32的智慧农业大棚监测与控制系统设计与实现

摘要:本文设计了一种基于STM32F103C8T6单片机的智慧农业大棚监测与控制系统,集成多参数环境监测、智能控制和远程管理功能。系统可实时采集光照、CO2、温湿度和土壤湿度等参数,通过OLED显示并采用双模式控制机制:自动模式下根据阈值调节设备,手动模式下支持APP或按键控制。通过ESP8266模块接入机智云平台实现数据云存储和远程控制。测试表明系统具有高精度(温度±0.5℃、CO2±50ppm)、快速响应(<2s)和稳定运行(30天无故障)等特点,有效解决了传统大棚调控不及时等问题。创新点包括多参

444

企业级软件开发流程

前后端分离开发,就是在项目开发过程中,对于前端的代码专门由前端的开发人员开发,后端代码由后端人员负责,这样可以做到分工明确、各司其职,进而提高开发效率,前后端代码并行开发,加快项目开发进度前后端分离开发方式被各大公司使用,成为项目开发的主流开发方式推荐给你一些实战项目作为练手~这回不用愁找不到项目啦!中、大型or开发平台SaaS项目(任选其一学习,助力获取行业经验)**学完可快速构建企业级微服务应用项目,达到中、大型or开发平台SaaS工作技能要求。1.品优购【电商项目

weixin_51689029的博客 5151

软件工程-企业软件开发基本流程

回顾一下企业软件开发的一般流程以及一些感受。

nxrsdh的博客 1511

企业软件开发流程

软件开发最后压缩成7个文档(开发实现步骤) 1.可行性研究报告 2.项目开发文档 3.概要设计说明书模板 4.详细设计报告模板 5.数据库设计报告模板 6.测试报告模板 7.用户使用手册说明书

qq_45821255的博客 776

互联网软件开发企业软件开发

<br /> <br />     听到一位朋友说当今的软件开发可以分为两个方向,一个是企业软件开发,通常表现为一个个订制的项目;另外一个是互联网开发,比如那些用户百万,千万,甚至亿万的门户网站,电子商务网站等。两个方向差异很大,几乎是两个行业。<br /> <br />    他说的很在理。企业软件开发讲究的是快速实现企业的业务需求。需求是非常复杂并且多变的,所以要求快速开发,良好的扩展性和可维护性。典型的例子是SAP的ERP系统。ERP有强大的定制模块,开发之外的业务分析,调研是关键。当然更多的是其他大

kevin的专栏 1910

HTML5 Canvas drawImage图像绘制

  HTML5中引入新的元素canvas,其drawImage 方法允许在 canvas 中插入其他图像( img 和 canvas 元素) 。drawImage函数有三种函数原型: 语法: drawImage(image, dx, dy) drawImage(image, dx, dy, dw, dh) drawImage(image, sx, sy, sw, sh, dx, dy, dw...

xpp02的专栏 242

【图像与视频】HTML5 Canvas 图像的绘制 drawImage()绘制图片或视频帧

我的处女作《Canvas系列教程》在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作。 教程介绍、教程目录等能在README里查阅。 传送门:https://github.com/827652549/CanvasStudy 介绍 HTML5 Canvas提供了极为丰富的图像支持。首先让我们从最简单的做起:“如何在Canvas上绘制图片或视频帧”。 在...

苏一恒 2238

html5 图片虚化 js,javascript – HTML5 – Canvas,drawImage()绘制图像模糊

我试图将以下图像绘制到画布,但尽管定义了画布的大小,但它看起来很模糊.正如您在下面所看到的,图像清晰而清晰,而在画布上,图像模糊且像素化. 它的外观如下(左边是原始的,右边是绘制的画布,模糊不清.) 我究竟做错了什么?console.log('Hello world')var c = document.getElementById('canvas')var ctx = c.getContext('...

weixin_30994645的博客 457

canvas的drawImage方法参数详解

引言: canvas很有意思的一项特性就是图像操作能力。可以用于动态的图像合成或者作为图形的背景,以及游戏界面(Sprites)等等。浏览器支持的任意格式的外部图片都可以使用,比如PNG、GIF或者JPEG。 你甚至可以将同一个页面中其他canvas元素生成的图片作为图片源。 一旦获得了源图对象,我们就可以使用drawImage方法将它渲染到 canvas 里。 drawImage方法有三种形态: drawImage(image, dx, dy) 在画布指定位置绘制原图 drawImage(i...

编程界明世隐的博客 3万+

【HTML5】Canvas图像

注:getContext("2d");是一个内置的HTML5对象,拥有多种绘制路径、矩形、圆形及添加图形的方法。注:这里的Img必须是一个图像对象。

lmrylll的博客 131

canvas绘制图像-drawImage

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>canvas绘制图像</title> <style> body{margin: 0;.

caoxinjian423的博客 332

Canvas 帧动画,绘制图像(drawImage())

demo.html:&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Title&lt;/title&gt; &lt;style&gt; canvas {

houyanhua1的专栏 3554

html5绘制div,HTML5 Canvas 绘制图像

canvas可以引入图像,它可以用于图片合成或者制作背景等。只要是 Gecko 支持的图像(如 PNG,GIF,JPEG等)都可以引入到 canvas 中,而且其它的 canvas 元素也可以作为图像的来源。获取图像的方式我们可以通过 document.images 集合、document.getElementsByTagName(canvasName||imageName) 方法又或者 docu...

weixin_39641876的博客 1235

html5图像绘制过程,HTML5使用drawImage()方法绘制图像

一、绘制图像使用drawImage()方法绘制图像。绘图环境提供了该方法的三个不同版本。drawImage(image,x,y) : 在canvas中(x,y)处绘制图片。drawImage(image,x,y,width,height) : 在canvas中(x,y)处绘制图片,并将其缩放到指定的宽度和高度。drawImage(image,sourceX,sourceY,sourceWidth,...

weixin_36206388的博客 429

使用Canvas绘图(4)-绘制图像

2D绘图上下文内置了对图像的支持。如果你想把一幅图像绘制到画布上,可以使用drawImage()方法。根据期望的最终结果不同,调用这个方法时,可以使用三种不同的参数组合。最简单的调用方式是传入一个HTML&lt;img&gt;元素,以及绘制该图像的起点的x和y坐标。例如: var image=document.images[0]; context.drawImage(image,10,10);...

跟着信仰走 1776

银河麒麟桌面系统 必会操作 | 加装双系统(麒麟桌面系统+Windows系统)的详细方法(含常见故障和解决方法)

装好麒麟桌面操作系统的电脑上、再加装Windows 操作系统的详细方法;和在已经装好Windows系统的电脑上、再加装麒麟桌面操作系统的详细方法;含加装双系统过程中常见问题的解决方法。

qq_33216613的博客 2186

LLM API统一管理系统设计与实现(源码+论文)

LLM API统一管理系统是一个基于Go与React技术栈构建的智能API管理与分发平台,专为毕业设计项目开发提供完整解决方案。该系统通过统一API适配机制,实现了对OpenAI、Azure、Anthropic Claude、Google Gemini、DeepSeek、字节豆包、ChatGLM、文心一言、讯飞星火、通义千问、360智脑、腾讯混元等主流大语言模型的集中管理,为开发者提供了便捷的API接入与分发服务。系统采用分层架构设计,结合API网关模式与适配器模式,实现了高度模块化的系统结构。在技术实现上,后端使用Go语言开发,前端采用React框架构建用户界面,通过Node.js进行中间件处理,并支持Docker容器化部署。系统核心功能包括API密钥管理、流量控制、计费统计、多租户支持、实时监控等,能够满足企业级应用和个人开发者的多样化需求。该毕业设计项目特别适合计算机科学与软件工程专业的学生作为毕业设计选题,系统设计完整,技术栈前沿,文档齐全。系统采用工厂模式实现不同API提供商的动态加载,通过适配器模式统一接口规范,使用单例模式确保核心服务的唯一性。系统支持一键部署,提供单可执行文件和Docker镜像两种部署方式,开箱即用,大大降低了部署复杂度。在应用场景方面,该系统可广泛应用于AI应用开发、教育科研、企业服务等多个领域。对于需要接入多个LLM API的开发者而言,该系统提供了统一的管理界面和API端点,简化了开发流程;对于API服务提供商,系统支持二次分发功能,便于构建自己的API服务平台;对于学术研究,系统提供了完整的源码和设计文档,可作为学习分布式系统、微服务架构、API设计等技术的优秀案例。本资源包含完整的系统源码、详细的设计文档、部署指南和毕业设计论文模板,为学生完成高质量的毕业设计提供了全方位支持。系统代码结构清晰,注释完整,便于学习和二

上一篇: 项目过程分析
下一篇: 管理格言集
sumongh_pan
博客等级 码龄20年 9粉丝 53原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值