第一篇:软件项目阶段性总结报告
xxx
Xxxxx 阶段性总结报告
有限公司xxxCO., LTD
项目阶段性总结报告
1.引言 a)编写目的
说明编写这份项目开发总结报告的目的,指出预期的阅读范围。
b)背景
本项目的名称和所开发出来的软件系统的名称
此软件的任务提出者、开发者、用户及安装此软件的计算中心
c)定义
列出本文件中用到的专门术语的定义和外文首字母组词的原词组
d)参考资料
列出要用到的参考资料,如:
本项目的已核准的计划任务书或合同、上级机关的批文;
属于本项目的其他已发表的文件;
本文件中各处所引用的文件、资料,包括所要用到的软件开发标准。列出这些文件 的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源
2.实际开发结果 a)产品
说明最终制成的产品,包括:
程序系统中各个程序的名字,它们之间的层次关系,以千字节为单位的各个程序的 程序量、存储媒体的形式和数量;
程序系统共有哪几个版本,各自的版本号及它们之间的区别; 每个文件的名称;
所建立的每个数据库。如果开发中制订过配置管理计划,要同这个计划相比较 b)主要功能
逐项列出本软件产品所实际具有的主要功能和性能,对照可行性研究报告、项目开发计划、功能需求说明书的有关内容,说明原定的开发目标是达到了、未完全达到、或超过了
c)基本流程
用图给出本程序系统的实际的基本的处理流程
d)进度
列出原定计划进度与实际进度的对比,明确说明,实际进度是提前了、还是延迟了,分析主要原因
e)费用
列出原定计划费用与实际支出费用的对比,包括: 工时,以人月为单位,并按不同级别统计
计算机的使用时间,区别CPU时间及其他设备时间; 物料消耗、出差费等其他支出。
明确说明,经费是超出了、还是节余了,分析其主要原因
3.开发工作评价
a)对生产效率评价
给出实际生产效率,包括:
程序的平均生产效率,即每人月生产的行数; 文件的平均生产效率,即每人月生产的千字数; 并列出原订计划数作为对比 b)对产品质量评价
说明在测试中检查出来的程序编制中的错误发生率,即每干条指令(或语句)中的错误指令数(或语句数)
。如果开发中制订过质量保证计划或配置管理计划,要同这些计划相比较 c)对技术方法评价
给出对在开发中所使用的技术、方法、工具、手段的评价 d)错误原因分析
给出对于开发中出现的错误的原因分析 4.经验与教训
出从这项开发工作中所得到的最主要的经验与教训及对今后的项目开发工作的建议
第二篇:软件项目总结报告
XXXXXXXXXXXXXXXXXXXXXXX系统
项目总结报告
XXXXXXXXX 2017/7/27 项目概要信息
XXXXXXXXXXXXXXXXXXXXXXX系统的技术团队由11人组成,其中项目经理1人,需求分析师1人,UI设计师1人,开发人员6人,测试人员2人。
本项目的前期工作从2017年5月19日开始,历时16个工作日,于6月9日完成需求分析等准备工作。开发阶段从2017年6月12日开始,历时22个工作日,于7月10日完成全部开发工作,进入外部业务人员验证测试阶段,目前,可使用XXXXXXXXXXXXXXXXXXXXXXX的二级域名进行访问,详细信息如下:
用户资助申报地址:XXXXXXXXXXXXXXXXXXXXXXX 用户审核管理地址:XXXXXXXXXXXXXXXXXXXXXXX
本项目的开发过程有5个关键的里程碑,具体时间及内容如下: 2017年06月21日:项目初次全新功能开发完成;
2017年06月29日:项目初次内部功能测试、安全测试、性能测试完成; 2017年07月04日:需求变更,准备进行二次开发; 2017年07月10日:项目二次开发全部完成;
2017年07月11日:项目二次内部测试完成,等待外部业务人员验证测试。项目经验
因为是初次担任项目经理的角色,我最初找不到切入点,领导和同事在整个的过程中给了我很多的指导和建议。实际的项目管理工作使我对自己已学的理论知识有了更深刻的体会。所谓理论指导实践,实践验证理论,回想整个项目开发过程,至少可以总结了以下几点经验: 2.1 沟通讨论 信息交换要及时
沟通讨论是贯穿整个项目生命周期的活动,团队成员间信息交换是否及时,更是项目成功的关键。虽然不同角色承担不同工作,但都是以达成项目目标为指导的,团队成员只有始终保持沟通讨论,保证接收到最新的、一致的项目需求信息,才能使得开发工作顺利进行,避免出现信息交换不及时而导致的返工。
对于沟通,结合实际来说,如果需求分析师不能将变更的需求信息及时传递给UI设计人员,就会导致不符合用户需求的设计,更会使开发人员写出无用的代码,这必然导致重设计、重编码,甚至会延误整体项目进度。
对于讨论,尤其是像我这样缺少经验的项目经理,不论是制定计划,还是工作量识别,都必须向有经验的同事请教,接受正确的建议,才能得到合理的安排。2.2项目范围 功能边界要清晰
项目经理以需求文档为依据,将项目范围及边界清晰罗列,是把控项目开发进度的先决条件。
对于XXXXXXXXXXXX系统来说,其功能并不复杂,且开发周期短,所以在确定项目范围并进行任务细化时,可精确到接口、页面。把一个大任务分解成一个个的小任务的好处是,可以帮助我们更加精确的估计出它们的工作量,并暴露出很多可能一时无法想到的工作量,也可以保证后续进行项目开发过程的状态跟踪,更加精确。2.3时间计划 人员分配要合理
以前总认为写计划比写代码容易的多,其实恰恰相反。一份合理的项目计划需要经过思考、沟通、权衡、询问、倾听的过程,要知道,用来分析解决问题需要花费的时间,远远大于单纯的写代码时间。
项目进度计划必须将分解出来的小任务,综合考虑时间、难易程度、人员能力,估出工作量并进行合理分配。2.4代码开发 功能验证要同步
当日的开发任务结束后,作为项目经理应该对现有开发成果做验证,即对已完成的功能做验证,及时发现缺陷或其他问题,次日找对应的开发人员做修复。
因此,代码开发和功能验证的同步进行,既可以保证软件质量,同时也可以保证项目进度。当然,应该根据实际情况同步调整项目进度计划,预留处理缺陷的时间。
2.5进度执行 问题修复要反馈
项目成员必须及时反馈当日任务完成情况,及前一天遗留缺陷的修复情况,才可以保证项目经理对整体进度的把控,准确跟踪项目状态。2.6
需求变更 文档修改要记录
开发过程中的任何变更,都应做记录,作为项目成员之间沟通交流的依据,也可以避免重复修改,增加无谓的工作量。项目教训
3.1计划应当先于执行
项目计划必须要尽可能周全,并且在项目经理的可控范围内,可以根据实际情况及时做调整,但一定要保证,具体工作的开展是在计划范围内,因为没有计划直接执行会直接导致项目进度不可控,状态无法跟踪。3.2沟通应当注意技巧
高效沟通是项目成功的决定因素。因缺乏高效的沟通技巧。对内,在与开发人员进行需求沟通、代码实现方式设计等方面沟通时,并不能快速准确表达自己意图;对外,在与业务人员协商问题时,会不自觉的使用技术术语等业务人员不易理解的词汇,导致双方无法在较短时间内达成一致意见。希望自己以后有更多的锻炼机会,学习弥补这方面的欠缺。
第三篇:软件项目开发总结报告模版
武汉理工大学《软件开发工具》论文报告
火车票系统的开发
1引言
研究报告(1.研究计划;2.完成的研究内容、研究方法、研究过程与结论、成果;3.比照研究计划,分析超过或未达到预定目标、进度、研究内容的原因;4.参考文献等。)
随着人们生活水平和经济水平的提高,网络科技的全球化的发展,出游和出差的频率越来越多。这大大的激发了交通水平的发展。其中,火车这种又方便有便宜的交通工具作为人们的首选,火车站的客运列车增加,客运量也随之增加。原有的售票的方式已经不再能满足旅客的需求了。为了方便旅客售票系统不仅仅只能售票也能够了解列车的各种信息。这样才能成为现在网络社会的真的适应者。
2需求分析
该售票系统是融合了火车票销售、退票、列车管理、车票管理、售票员管理、列车管理信息,以及售票信息查询为一体的综合系统。该系统主要编写的功能是列车和售票信息的查询及售票功能。
2.1用户
该系统主要有两类用户:管理员和售票员。管理员主要工作有车次管理,车票管理和售票员管理。对于每项功能都有添加,删除和修改的功能。售票的主要工作是售票和退票。
2.2主要功能
该系统从功能方面可以分为四个方面: 登录。不管你是管理员还是售票员必须登录以后才可以进行系统允许的操作。当然要登录的管理员和售票员都必须是再数据库中已经发布的。
基本设置:该模块主要是修改售票员的相关信息,修改列车的相关信息和修改车票的相
武汉理工大学《软件开发工具》论文报告
关信息。这一块的功能只有管理员才可以操作。其他的售票员是不可以对他进行操作的。
售票和退票:这部分工作主要是售票员来操作的。售票员根据买票人员提出的要求进行查询。查询的方式有两种:一是根据车次查询;一是根据目的地来查询。退票主要是将已经出售的车票在列车开出之前再一次的返回到数据库中,并继续出售。
列车和车票查询;当需要查询列车信息或者是车票信息是所做的操作。
2.3基本流程
3开发过程
3.1内容
该程序包括三个部分数据库的设计、通用模块的实现、各个模块的实现。
3.1.1 数据库的设计:
将本系统所需的所有的数据都存储到数据库中。需要在数据库中管理员表、售票员表、列车信息表和车票信息表。如图所示:
武汉理工大学《软件开发工具》论文报告
管理员表:
售票员表:
列车信息表:
武汉理工大学《软件开发工具》论文报告
车票信息表:
3.1.2通用模块的实现:
通用模块为了减少代码的重复。在该系统中,对经常使用的操作进行封装,如将多次需要调用的数据库和操作数库的增、删、改和查等操作进行封装。使代码有很好的重用性,即使出现错误也很容易调试。如本程序中的Conn.java
import java.sql.*;public class Conn {
private static Connection con;private static final String DRIVER = “com.mysql.jdbc.Driver”;private static final String URL =“jdbc:mysql://localhost:3306/newdatabase”;private static final String NAME=“root”;private static final String PASSWORD=“021702190804”;static{
} public static Connection getConnection(){
} public static void closeCon(Connection con){
try { if(con!=null)con.close();try {
} return con;con=DriverManager.getConnection(URL,NAME,PASSWORD);e.printStackTrace();} catch(SQLException e){ try {
} Class.forName(DRIVER);e.printStackTrace();} catch(ClassNotFoundException e){ } catch(SQLException e){ 4
武汉理工大学《软件开发工具》论文报告
}
} public static void closePt(PreparedStatement pt){
} public static void closeRs(ResultSet rs){
} try {
} if(rs!=null)rs.close();try {
} if(pt!=null)pt.close();} e.printStackTrace();} catch(Exception e){ e.printStackTrace();} catch(Exception e){ e.printStackTrace();
用户登录界面的设计、主界面的设计、基本设置模块、销售及退票模块和列车及车票查询模块。
用户登录模块:该部分是通过设计login.java来实现的。这部分代码的作用是用户首先选择自己的登录的是管理员还是售票员,然后输入账号和密码。单击登录,用户先判断用户登录的类型,然后给sql变量赋SQL语句值,系统调用DAO.java类的login()传入sql变量。.Login 代码是:
import org.eclipse.swt.SWT;import org.eclipse.swt.events.*;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.layout.*;import org.eclipse.swt.widgets.*;
import com.huizhi.dao.DAO;public class Login {
private Text nameText;
private Text passText;
private Combo combo;
private String type;
private Display display = new Display();
private Shell shell = new Shell(display);
public Login(){
FormLayout layout = new FormLayout();
武汉理工大学《软件开发工具》论文报告
layout.marginHeight =40;
layout.marginWidth =40;
shell.setLayout(layout);
shell.setText(“login”);
Image image = new Image(display,“2.jpg”);
shell.setBackgroundImage(image);
setUIControl();
shell.pack();
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private void setUIControl(){
Label username = new Label(shell, SWT.NONE);
username.setText(“username”);
nameText = new Text(shell, SWT.SINGLE | SWT.BORDER);
Label password = new Label(shell, SWT.NONE);
password.setText(“password”);
passText = new Text(shell, SWT.SINGLE | SWT.BORDER| SWT.PASSWORD);
// passText.setEchoChar('*');
Label select=new Label(shell, SWT.NONE);
select.setText(“ select
”);
Button submit = new Button(shell,SWT.PUSH);
submit.setText(“login ”);
submit.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
type=combo.getText();
String name=nameText.getText();
String pass=passText.getText();
String sql=null;
boolean flag=false;
MessageBox box=new MessageBox(shell,SWT.OK);
if(“".equals(type)||”“.equals(name)||”“.equals(pass))
{
box.setMessage(”please input all the information“);
box.open();
return;
}
武汉理工大学《软件开发工具》论文报告
DAO dao=new DAO();
if(”users“.equals(type)){
sql=”select * from users where username='“+name+”' and password='“+pass+”'“;
}else if(”admin“.equals(type)){
sql=”select * from admin where username='“+name+”' and password='“+pass+”'“;
}
flag=dao.login(sql);
if(flag)
{
shell.dispose();
new Main(type);
}else{
box.setMessage(”wrong name or password“);
box.open();
}
}
});
Button reset = new Button(shell, SWT.PUSH);
reset.setText(”cancel“);
String value[]={”users“,”admin“};
combo=new Combo(shell,SWT.DROP_DOWN);
combo.setItems(value);
FormData data = new FormData();
data.top = new FormAttachment(30,0);
username.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(username,0,SWT.CENTER);
data.left = new FormAttachment(username,10, SWT.RIGHT);
nameText.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(select,0,SWT.CENTER);
data.left = new FormAttachment(select,10, SWT.RIGHT);
combo.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(username,10, SWT.BOTTOM);
password.setLayoutData(data);
武汉理工大学《软件开发工具》论文报告
data = new FormData();
data.top = new FormAttachment(password,0,SWT.CENTER);
data.left = new FormAttachment(nameText,0,SWT.LEFT);
passText.setLayoutData(data);
data=new FormData();
data.top=new FormAttachment(password,10,SWT.BOTTOM);
submit.setLayoutData(data);
data=new FormData();
data.top=new FormAttachment(submit,0,SWT.CENTER);
data.left=new FormAttachment(submit,20,SWT.RIGHT);
reset.setLayoutData(data);
}
public static void main(String[] args){
new Login();
} } DAO.java的login()代码:
public boolean login(String sql){
boolean flag=false;
con=Conn.getConnection();
try {
pt=con.prepareStatement(sql);
rs=pt.executeQuery();
if(rs.next()){
flag=true;
}
} catch(SQLException e){
e.printStackTrace();
}finally{
Conn.closeRs(rs);
Conn.closePt(pt);
Conn.closeCon(con);
}
return flag;} 图示为;
武汉理工大学《软件开发工具》论文报告
实现主界面:
import org.eclipse.swt.*;import org.eclipse.swt.widgets.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.events.*;
public class Main {
private String type;Display display=Display.getCurrent();Shell shell=new Shell(display);public Main(String type){
this.type=type;
shell.setText(”Train ticketing system“);
shell.setLayout(new FillLayout());
Menu menu=new Menu(shell,SWT.BAR);
//第一个菜单
MenuItem basic=new MenuItem(menu,SWT.CASCADE);
basic.setText(”Basic Settings“);
if(”users“.equals(type))
{
basic.setEnabled(false);
}
Menu filemenu=new Menu(shell,SWT.DROP_DOWN);
MenuItem train=new MenuItem(filemenu,SWT.PUSH);
train.setText(”Trains Management“);
train.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
new TrainManage();
}
});
MenuItem ticket=new MenuItem(filemenu,SWT.PUSH);
ticket.setText(”Tickets Management“);
武汉理工大学《软件开发工具》论文报告
ticket.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){
new TicketManage();} });MenuItem users=new MenuItem(filemenu,SWT.PUSH);users.setText(”Users Management“);users.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){
new UsersManage();} });MenuItem exit=new MenuItem(filemenu,SWT.PUSH);exit.setText(”quit“);basic.setMenu(filemenu);exit.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
display.dispose();} });//第二个菜单
MenuItem market=new MenuItem(menu,SWT.CASCADE);market.setText(”Sales and Refunds“);Menu editMenu=new Menu(shell,SWT.DROP_DOWN);MenuItem marketItem=new MenuItem(editMenu,SWT.PUSH);marketItem.setText(”Sales Tickets“);marketItem.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){
new XiaosTicket();} });MenuItem refundItem=new MenuItem(editMenu,SWT.PUSH);refundItem.setText(”Refunds Tickets“);market.setMenu(editMenu);refundItem.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){
new TuiTicket();} });//第三个菜单
MenuItem find=new MenuItem(menu,SWT.CASCADE);find.setText(”Trains and Tickets query“);Menu taiMenu=new Menu(shell,SWT.DROP_DOWN);MenuItem trainFind=new MenuItem(taiMenu,SWT.PUSH);
武汉理工大学《软件开发工具》论文报告
trainFind.setText(”Trains query“);
trainFind.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
new FindTrain();
}
});
MenuItem ticketFind=new MenuItem(taiMenu,SWT.PUSH);
ticketFind.setText(”Ticket query“);
find.setMenu(taiMenu);
ticketFind.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
new FindTicket();
}
});
shell.setMenuBar(menu);
shell.setSize(500,400);
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
} }
图示为:
基本设置模块包括车次管理,车票管理和售票员管理。
车次管理主要是是对于列车的增加,删除和修改等操作。其中包括它的相关的信息等。它是由TrainManagement.java.代码如下: import java.util.List;11
武汉理工大学《软件开发工具》论文报告
import org.eclipse.swt.SWT;import org.eclipse.swt.events.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.widgets.*;
import com.huizhi.dao.DAO;import com.huizhi.vo.Train;
public class TrainManage {
Display display=Display.getCurrent();
Shell tmshell=new Shell(display);
final Table table=new Table(tmshell,SWT.SINGLE|SWT.H_SCROLL|SWT.V_SCROLL|SWT.H_SCROLL|SWT.BORDER|SWT.FULL_SELECTION);
TrainManage tm=this;public TrainManage(){
RowLayout rowLayout=new RowLayout();
rowLayout.pack=true;
rowLayout.wrap=true;
rowLayout.justify=false;
rowLayout.marginTop=20;
tmshell.setLayout(rowLayout);
final TableColumn column1=new TableColumn(table,SWT.LEFT);
column1.setText(”Train ID“);
column1.setWidth(80);
final TableColumn column2=new TableColumn(table,SWT.LEFT);
column2.setText(”TrainNum“);
column2.setWidth(80);
final TableColumn column3=new TableColumn(table,SWT.LEFT);
column3.setText(”TrainType“);
column3.setWidth(80);
final TableColumn column4=new TableColumn(table,SWT.LEFT);
column4.setText(”Starting“);
column4.setWidth(80);
final TableColumn column5=new TableColumn(table,SWT.LEFT);
column5.setText(”startingTime“);
column5.setWidth(80);
final TableColumn column6=new TableColumn(table,SWT.LEFT);
column6.setText(”terminal“);
column6.setWidth(80);
final TableColumn column7=new TableColumn(table,SWT.LEFT);
column7.setText(”terminal Time“);
column7.setWidth(80);12
武汉理工大学《软件开发工具》论文报告
final TableColumn column8=new TableColumn(table,SWT.LEFT);column8.setText(”is kongtiao“);column8.setWidth(80);final TableColumn column9=new TableColumn(table,SWT.LEFT);column9.setText(”price“);column9.setWidth(80);final TableColumn column10=new TableColumn(table,SWT.LEFT);column10.setText(”middleStation“);column10.setWidth(80);final TableColumn column11=new TableColumn(table,SWT.LEFT);column11.setText(”yzNum“);column11.setWidth(80);final TableColumn column12=new TableColumn(table,SWT.LEFT);column12.setText(”rzNum“);column12.setWidth(80);final TableColumn column13=new TableColumn(table,SWT.LEFT);column13.setText(”ywNum“);column13.setWidth(80);final TableColumn column14=new TableColumn(table,SWT.LEFT);column14.setText(”rwNum“);column14.setWidth(80);table.setHeaderVisible(true);table.setLinesVisible(true);freshData();table.setSize(800,200);Button add=new Button(tmshell,SWT.PUSH);add.setText(”add trains“);add.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
new AddTrain(tm);
} });Button update=new Button(tmshell,SWT.PUSH);update.setText(”modify“);update.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
TableItem[] selection=table.getSelection();
TableItem selectedRow=selection[0];
Train train=new Train();
train.setId(Integer.parseInt(selectedRow.getText(0)));
train.setTrainNum(selectedRow.getText(1));
train.setTrainType(selectedRow.getText(2));
train.setStarting(selectedRow.getText(3));13
武汉理工大学《软件开发工具》论文报告
train.setStartingTime(selectedRow.getText(4));
train.setTerminal(selectedRow.getText(5));
train.setTerminalTime(selectedRow.getText(6));
train.setIskongTiao(selectedRow.getText(7));
train.setPrice(Float.parseFloat(selectedRow.getText(8)));
train.setMiddleStation(selectedRow.getText(9));
train.setYzNum(Integer.parseInt(selectedRow.getText(10)));
train.setRzNum(Integer.parseInt(selectedRow.getText(11)));
train.setYwNum(Integer.parseInt(selectedRow.getText(12)));
train.setRwNum(Integer.parseInt(selectedRow.getText(13)));
new UpdateTrain(train,tm);
}
});
Button delete=new Button(tmshell,SWT.PUSH);
delete.setText(”cancel“);
delete.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
MessageBox box=new MessageBox(tmshell,SWT.YES|SWT.NO);
box.setMessage(”Are you sure to cancel?“);
int num=box.open();
if(num==128)
return;
TableItem[] selection=table.getSelection();
TableItem selectedRow=selection[0];
DAO dao=new DAO();
String sql=”delete from train where id=“+selectedRow.getText(0)+”“;
int i=dao.update(sql);
if(i>0){
box.setMessage(”succeed“);
box.open();
table.remove(table.getSelectionIndex());
}else{
box.setMessage(”failure“);
box.open();
}
}
});14
武汉理工大学《软件开发工具》论文报告
tmshell.setSize(1200,400);
tmshell.setText(”train Management“);
tmshell.open();
while(!tmshell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
tmshell.dispose();} public void freshData(){
table.removeAll();
try{
DAO dao=new DAO();
List list=dao.getAllTrain();
int number=list.size();
for(int i=0;i Train train=(Train)list.get(i); final TableItem item[]=new TableItem[number]; item[i]=new TableItem(table,SWT.None); item[i].setText(new String[]{Integer.toString(train.getId()),train.getTrainNum(),train.getTrainType(),train.getStarting(),train.getStartingTime(),train.getTerminal(),train.getTerminalTime(),train.getIskongTiao(),Float.toString(train.getPrice()),train.getMiddleStation(),Integer.toString(train.getYzNum()),Integer.toString(train.getRzNum()),Integer.toString(train.getYwNum()),Integer.toString(train.getYwNum())}); } }catch(Exception e){ e.printStackTrace(); } } } 在该段代码中调用了DAO.java类中的getAllTrain()方法来获得所有的车辆信息,然后以表格的形式显示出来。DAO.java类中的getAllTrain()和update()方法如下: public int update(String sql){ int i=0; con=Conn.getConnection(); try { pt=con.prepareStatement(sql); i=pt.executeUpdate(); } catch(SQLException e){ 15 武汉理工大学《软件开发工具》论文报告 e.printStackTrace();}finally{ Conn.closePt(pt); Conn.closeCon(con);}return i;} public List getAllTrain(){ List list=new ArrayList();con=Conn.getConnection();try { pt=con.prepareStatement(”select * from train“); rs=pt.executeQuery(); while(rs.next()){ Train train=new Train(); train.setId(rs.getInt(1)); train.setTrainNum(rs.getString(2)); train.setTrainType(rs.getString(3)); train.setStarting(rs.getString(4)); train.setStartingTime(rs.getString(5)); train.setTerminal(rs.getString(6)); train.setTerminalTime(rs.getString(7)); train.setIskongTiao(rs.getString(8)); train.setPrice(rs.getFloat(9)); train.setMiddleStation(rs.getString(10)); train.setYzNum(rs.getInt(11)); train.setRzNum(rs.getInt(12)); train.setYwNum(rs.getInt(13)); train.setRwNum(rs.getInt(14)); list.add(train); } } catch(SQLException e){ e.printStackTrace();}finally{ Conn.closeRs(rs); Conn.closePt(pt); Conn.closeCon(con);}return list;} 其中的update的功能是,首先连接数据库,然后用传递过来的SQl语句在列表中删除某辆列车的信息。getAllTrain()方法是显示所有的列车的信息。图示如下: 武汉理工大学《软件开发工具》论文报告 在车次管理中的对于列车信息添加的功能是通过AddTrain.java 来实现的。代码如下: import org.eclipse.swt.SWT;import org.eclipse.swt.events.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.widgets.*;import com.huizhi.dao.DAO; public class AddTrain { Display display=Display.getCurrent();Shell tmshell=new Shell(display);TrainManage trainmanage=null;public AddTrain(TrainManage tm){ trainmanage=tm;GridLayout gridlayout=new GridLayout();tmshell.setText(”add trains information“);gridlayout.numColumns=2;gridlayout.makeColumnsEqualWidth=true;tmshell.setLayout(gridlayout); GridData gd = new GridData(GridData.FILL_BOTH);Label l=new Label(tmshell,SWT.LEFT);l.setText(”trainNum“);l.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text trainNum=new Text(tmshell,SWT.NONE);trainNum.setSize(50,60);trainNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l1=new Label(tmshell,SWT.LEFT);l1.setText(”trainType“);l1.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text trainType=new Text(tmshell,SWT.LEFT);17 武汉理工大学《软件开发工具》论文报告 trainType.setSize(30,40);trainType.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l2=new Label(tmshell,SWT.LEFT);l2.setText(”starting“);l2.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text starting=new Text(tmshell,SWT.LEFT);starting.setSize(30,40);starting.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l3=new Label(tmshell,SWT.LEFT);l3.setText(”startingtime“);l3.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text startingTime=new Text(tmshell,SWT.LEFT);startingTime.setSize(30,40);startingTime.setLayoutData(gd);Label l4=new Label(tmshell,SWT.LEFT);l4.setText(”terminal“);l4.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text terminal=new Text(tmshell,SWT.LEFT);terminal.setSize(30,40);terminal.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l5=new Label(tmshell,SWT.LEFT);l5.setText(”terminaltime“);l5.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text terminalTime=new Text(tmshell,SWT.LEFT);terminalTime.setSize(30,40);terminalTime.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l6=new Label(tmshell,SWT.LEFT);l6.setText(”iskongtiao“);l6.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text iskongTiao=new Text(tmshell,SWT.LEFT);18 武汉理工大学《软件开发工具》论文报告 iskongTiao.setSize(30,40);iskongTiao.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l7=new Label(tmshell,SWT.LEFT);l7.setText(”price“);l7.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text price=new Text(tmshell,SWT.LEFT);price.setSize(30,40);price.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l8=new Label(tmshell,SWT.LEFT);l8.setText(”middleStation“);l8.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text middleStation=new Text(tmshell,SWT.LEFT);middleStation.setSize(30,40);middleStation.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l9=new Label(tmshell,SWT.LEFT);l9.setText(”yzNum“);l9.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text yzNum=new Text(tmshell,SWT.LEFT);yzNum.setSize(30,40);yzNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l10=new Label(tmshell,SWT.LEFT);l10.setText(”rzNum“);l10.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text rzNum=new Text(tmshell,SWT.LEFT);rzNum.setSize(30,40);rzNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l11=new Label(tmshell,SWT.LEFT);l11.setText(”ywNum“);l11.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);19 武汉理工大学《软件开发工具》论文报告 final Text ywNum=new Text(tmshell,SWT.LEFT);ywNum.setSize(30,40);ywNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l12=new Label(tmshell,SWT.LEFT);l12.setText(”rwNum“);l12.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text rwNum=new Text(tmshell,SWT.LEFT);rwNum.setSize(30,40);rwNum.setLayoutData(gd);Button b=new Button(tmshell,SWT.LEFT);b.setText(”add“);b.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ MessageBox box = new MessageBox(tmshell ,SWT.OK); if(”“.equals(trainNum.getText())||”“.equals(trainType.getText())||”“.equals(starting.getText()) ||”“.equals(startingTime.getText())||”“.equals(terminal.getText())||”“.equals(terminalTime.getText()) ||”“.equals(iskongTiao.getText())||”“.equals(price.getParent())||”“.equals(middleStation.getText())||”“.equals(yzNum.getText()) ||”“.equals(rzNum.getText())||”“.equals(ywNum.getText())||”“.equals(rwNum.getText())){ box.setMessage(”please input the right information“); box.open(); return; } DAO dao=new DAO(); String sql=”insert into train(trainNum,trainType,starting1,startingTime,terminal,terminalTime,iskongTiao,price,“ + ”middleStation,yzNum,rzNum,ywNum,rwNum)values('“+trainNum.getText()+”','“+trainType.getText()+”','“+starting.getText()+”',“ + ”'“+startingTime.getText()+”','“+terminal.getText()+”','“+terminalTime.getText()+”','“+iskongTiao.getText()+”',“ + 20 武汉理工大学《软件开发工具》论文报告 ”'“+price.getText()+”','“+middleStation.getText()+”','“+yzNum.getText()+”','“+rzNum.getText()+”','“+ywNum.getText()+”','“+rwNum.getText()+”')“; int i=dao.update(sql); if(i>0){ box.setMessage(”add“); box.open(); fresh(); } } });Button b1=new Button(tmshell,SWT.LEFT);b1.setText(”quit“);b1.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ tmshell.setVisible(false); } });tmshell.layout(); tmshell.setSize(500,450); tmshell.open(); while(!tmshell.isDisposed()){ if(!display.readAndDispatch()) display.sleep(); } tmshell.dispose();} public void fresh(){ trainmanage.freshData();} } 图示为: 武汉理工大学《软件开发工具》论文报告 修改列车功能是在UpdateTrain.java.类中实现的。代码如下: import org.eclipse.swt.SWT;import org.eclipse.swt.events.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.widgets.*; import com.huizhi.dao.DAO;import com.huizhi.vo.Train; public class UpdateTrain { private Train train;Display display=Display.getCurrent();Shell utrainshell=new Shell(display);TrainManage trainmanage=null;public UpdateTrain(Train train,TrainManage tm){ this.trainmanage=tm;this.train=train;GridLayout gridlayout=new GridLayout();utrainshell.setText(”modify train information“);gridlayout.numColumns=2;gridlayout.makeColumnsEqualWidth=true;utrainshell.setLayout(gridlayout); 武汉理工大学《软件开发工具》论文报告 GridData gd = new GridData(GridData.FILL_BOTH);Label ll=new Label(utrainshell,SWT.LEFT);ll.setText(”train ID“);ll.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text num=new Text(utrainshell,SWT.NONE);num.setText(Integer.toString(train.getId()));num.setEnabled(false);num.setSize(50,60);num.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l=new Label(utrainshell,SWT.LEFT);l.setText(”TrainNum“);l.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text trainNum=new Text(utrainshell,SWT.NONE);trainNum.setText(train.getTrainNum());trainNum.setSize(50,60);trainNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l1=new Label(utrainshell,SWT.LEFT);l1.setText(”TrainType“);l1.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text trainType=new Text(utrainshell,SWT.LEFT);trainType.setText(train.getTrainType());trainType.setSize(30,40);trainType.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l2=new Label(utrainshell,SWT.LEFT);l2.setText(”starting“);l2.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text starting=new Text(utrainshell,SWT.LEFT);starting.setText(train.getStarting());starting.setSize(30,40);starting.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l3=new Label(utrainshell,SWT.LEFT);l3.setText(”startingTime“);23 武汉理工大学《软件开发工具》论文报告 l3.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text startingTime=new Text(utrainshell,SWT.LEFT);startingTime.setText(train.getStartingTime());startingTime.setSize(30,40);startingTime.setLayoutData(gd);Label l4=new Label(utrainshell,SWT.LEFT);l4.setText(”terminal“);l4.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text terminal=new Text(utrainshell,SWT.LEFT);terminal.setText(train.getTerminal());terminal.setSize(30,40);terminal.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l5=new Label(utrainshell,SWT.LEFT);l5.setText(”terminalTime“);l5.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text terminalTime=new Text(utrainshell,SWT.LEFT);terminalTime.setText(train.getTerminalTime());terminalTime.setSize(30,40);terminalTime.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l6=new Label(utrainshell,SWT.LEFT);l6.setText(”iskongtiao“);l6.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text iskongTiao=new Text(utrainshell,SWT.LEFT);iskongTiao.setText(train.getIskongTiao());iskongTiao.setSize(30,40);iskongTiao.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l7=new Label(utrainshell,SWT.LEFT);l7.setText(”price“);l7.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text price=new Text(utrainshell,SWT.LEFT);price.setText(Float.toString(train.getPrice()));price.setSize(30,40);24 武汉理工大学《软件开发工具》论文报告 price.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l8=new Label(utrainshell,SWT.LEFT);l8.setText(”middleStation“);l8.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text middleStation=new Text(utrainshell,SWT.LEFT);middleStation.setText(train.getMiddleStation());middleStation.setSize(30,40);middleStation.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l9=new Label(utrainshell,SWT.LEFT);l9.setText(”yzNum“);l9.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text yzNum=new Text(utrainshell,SWT.LEFT);yzNum.setText(Integer.toString(train.getYzNum()));yzNum.setSize(30,40);yzNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l10=new Label(utrainshell,SWT.LEFT);l10.setText(”rzNum“);l10.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text rzNum=new Text(utrainshell,SWT.LEFT);rzNum.setText(Integer.toString(train.getRzNum()));rzNum.setSize(30,40);rzNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l11=new Label(utrainshell,SWT.LEFT);l11.setText(”ywNum“);l11.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text ywNum=new Text(utrainshell,SWT.LEFT);ywNum.setText(Integer.toString(train.getYwNum()));ywNum.setSize(30,40);ywNum.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH);Label l12=new Label(utrainshell,SWT.LEFT);25 武汉理工大学《软件开发工具》论文报告 l12.setText(”rwNum“);l12.setLayoutData(gd);gd = new GridData(GridData.FILL_BOTH);final Text rwNum=new Text(utrainshell,SWT.LEFT);rwNum.setText(Integer.toString(train.getRwNum()));rwNum.setSize(30,40);rwNum.setLayoutData(gd);Button b=new Button(utrainshell,SWT.LEFT);b.setText(”modify“);b.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ MessageBox box = new MessageBox(utrainshell ,SWT.OK); if(”“.equals(trainNum.getText())||”“.equals(trainType.getText())||”“.equals(starting.getText()) ||”“.equals(startingTime.getText())||”“.equals(terminal.getText())||”“.equals(terminalTime.getText()) ||”“.equals(iskongTiao.getText())||”“.equals(price.getText())||”“.equals(middleStation.getText())||”“.equals(yzNum.getText()) ||”“.equals(rzNum.getText())||”“.equals(ywNum.getText())||”“.equals(rwNum.getText())){ box.setMessage(”please input right information then modify “); box.open(); return; } DAO dao=new DAO(); String sql=”update train set trainNum='“+trainNum.getText()+”',trainType='“+trainType.getText()+”',starting1='“+starting.getText()+”',“ + ”startingTime='“+startingTime.getText()+”',terminal='“+terminal.getText()+”',terminalTime='“+terminalTime.getText()+”',iskongTiao='“+iskongTiao.getText()+”',“ + ”price='“+price.getText()+”',middleStation='“+middleStation.getText()+”',yzNum='“+yzNum.getText()+”',rzNum='“+rzNum.getText()+”',ywNum='“+ywNum.getText()+”',rwNum='“+rwNum.getText()+”' where id='“+num.getText()+”'“; int i=dao.update(sql); if(i>0){ 26 武汉理工大学《软件开发工具》论文报告 box.setMessage(”succeed“); box.open(); fresh(); }else{ box.setMessage(”failure“); box.open(); } } });Button b1=new Button(utrainshell,SWT.LEFT);b1.setText(”quit");b1.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ utrainshell.setVisible(false); } });utrainshell.layout(); utrainshell.setSize(500,450); utrainshell.open(); while(!utrainshell.isDisposed()){ if(!display.readAndDispatch()) display.sleep(); } utrainshell.dispose();} public void fresh(){ trainmanage.freshData();} } 车票管理主要包括对车票的增加,删除和修改的操作。由TicketManagement.java 实现。代码类似上面的:(具体看压缩包)。其中的查询列车表和售票表调用的DAO.java类中selectTicket()方法。图示为: 武汉理工大学《软件开发工具》论文报告 售票员管理是对售票员进行增加、删除和修改进行操作。由UserMannage.java类来实现。代码类似以上。在该类中调用了DAO.java 类中getAllUser()方法。图示为: 武汉理工大学《软件开发工具》论文报告 售票及退票模块包括两部分:火车售票和退票。售票系统是xiaosTickect.java 实现的。图示如下: 退票是售票员根据用户提供的车票信息在系统中进行售票。主要是由TuiTicket.java来实现的。在该类中涉及到DAO.java类中的selectTrain()方法.图示如下: 列车及车票查询系统主要功能包括两部分:查询列车信息和查询车票信息.有FindTrain.Java和FindTicket.java 实现.图示如下: 武汉理工大学《软件开发工具》论文报告 4学习心得 我是再没有接触eclipse之前就接触了java,我自己都先用记事本编写java程序,然后在doc下进行编译和运行。后来安装了ecplise这个集成环境,但是只把它当成一个运行java的集成环境。 后来经过开发工具的学习和相关书籍的查看,开始深入的理解了什么是ecplise。其实整个ecplise体系结构就像一个大的拼图,可以不断地向其中添加插件,同时在现有的插件上还可以再增加插件。可以说,在ecplise中一切都是插件。这里有一张图片很形象的说明了ecplise的体系结构: 在我学习ecplise的工程中,我觉得它跟一般的软件比起来有很大的优势:在编写代码的过程中,如果有编译错误的话系统马上会提醒,我们很容易就会会发现。而且它会给你提供一些解决问题的方法,虽然有些解决方法有一些笨,但是这对于一些想我们这样的初学者来说,无疑是雪中送炭。而且在编写代码的过程中,我们使用一些类的对象的方法的过程中系统给予一定的提示。这大大的减少了我们出错的机会,并且我们也可以顺便了解一下该类的其他方法。加快我们的学习进度。 武汉理工大学《软件开发工具》论文报告 对于ecplise的具体的功能的学习感悟:对于调试器板块该环境提供了很多的功能包括单步执行、设置断点和值、检查变量和值以及暂挂和恢复线程的能力。在我们课堂上只学习了本地调试中的断点。断点提供了一种强大的工具,使我们能够在需要的时间和位置挂起执行。与逐句或逐条指令的检查代码不同的是,可以让程序一直执行,直到遇到断点。然后开始调试。这大大的加快了调试过程。没有这个功能,调试大型程序几乎不能完成。至于远程的调试对于现在学习的程度来说有一点难。所以先放弃,以后再研究。 对于JUnit,包括模块接口测试、局部数据结构测试、路经测试、错误处理测试、边界测试。它的核心类主要有jnuit.framework包下的TestCase、Testsuite和TestResult,junit.runnier包下的BaseTestRunner类。而我们现在用到的只有断言Assert。在这里有一点原则是需要注意的它的测试名要很容易与应用类区分开来。 我觉得学会用ecplise来创建的基于SWT的图形应用程序十分的重要。这个要源于它的开发缘由。在这之前,使用的awt是原生窗口部件,但是它一直未能突破LCD。为了解决这个问题,又开发了swing。它使用的是仿真窗口部件,不存在LCD问题。但是消耗太多的内存等。为了彻底解决 上述问题,IBM开发了SWT。在基于Windows的ecplise中,SWT通过DLL形式的本地库与操作系统交互;在UNIX下,SWT可通过的GTK运行。 最近的学习和看书,让我觉得自己的真的就像在软件的最顶层。自己现在学习的东西在软件 中真的是基础中的基础。我们还有很长的路要走。真的要加油,好好学习啊! 5.参考文献 [1]java核心技术卷1:基础知识 叶乃文 邝劲筠 杜永萍 2008.5 机械工业出版社 [2]eclipse 3.0 程序开发技术详解 吴越胜 李新磊 2010.10 清华大学出版社 西安科技大市场创新云服务股份有限公司 项目总结报告 XXXXXXXXXXXXXXXXXXXXXXX系统 项目总结报告 XXXXXXXXX 2017/7/27 / 4 西安科技大市场创新云服务股份有限公司 项目总结报告 项目概要信息 XXXXXXXXXXXXXXXXXXXXXXX系统的技术团队由11人组成,其中项目经理1人,需求分析师1人,UI设计师1人,开发人员6人,测试人员2人。 本项目的前期工作从2017年5月19日开始,历时16个工作日,于6月9日完成需求分析等准备工作。开发阶段从2017年6月12日开始,历时22个工作日,于7月10日完成全部开发工作,进入外部业务人员验证测试阶段,目前,可使用XXXXXXXXXXXXXXXXXXXXXXX的二级域名进行访问,详细信息如下: 用户资助申报地址:XXXXXXXXXXXXXXXXXXXXXXX 用户审核管理地址:XXXXXXXXXXXXXXXXXXXXXXX 本项目的开发过程有5个关键的里程碑,具体时间及内容如下: 2017年06月21日:项目初次全新功能开发完成; 2017年06月29日:项目初次内部功能测试、安全测试、性能测试完成; 2017年07月04日:需求变更,准备进行二次开发; 2017年07月10日:项目二次开发全部完成; 2017年07月11日:项目二次内部测试完成,等待外部业务人员验证测试。项目经验 因为是初次担任项目经理的角色,我最初找不到切入点,领导和同事在整个的过程中给了我很多的指导和建议。实际的项目管理工作使我对自己已学的理论知识有了更深刻的体会。所谓理论指导实践,实践验证理论,回想整个项目开发过程,至少可以总结了以下几点经验: 2.1 沟通讨论 信息交换要及时 沟通讨论是贯穿整个项目生命周期的活动,团队成员间信息交换是否及时,更是项目成功的关键。虽然不同角色承担不同工作,但都是以达成项目目标为指导的,团/ 4 西安科技大市场创新云服务股份有限公司 项目总结报告 队成员只有始终保持沟通讨论,保证接收到最新的、一致的项目需求信息,才能使得开发工作顺利进行,避免出现信息交换不及时而导致的返工。 对于沟通,结合实际来说,如果需求分析师不能将变更的需求信息及时传递给UI设计人员,就会导致不符合用户需求的设计,更会使开发人员写出无用的代码,这必然导致重设计、重编码,甚至会延误整体项目进度。 对于讨论,尤其是像我这样缺少经验的项目经理,不论是制定计划,还是工作量识别,都必须向有经验的同事请教,接受正确的建议,才能得到合理的安排。2.2项目范围 功能边界要清晰 项目经理以需求文档为依据,将项目范围及边界清晰罗列,是把控项目开发进度的先决条件。 对于XXXXXXXXXXXX系统来说,其功能并不复杂,且开发周期短,所以在确定项目范围并进行任务细化时,可精确到接口、页面。把一个大任务分解成一个个的小任务的好处是,可以帮助我们更加精确的估计出它们的工作量,并暴露出很多可能一时无法想到的工作量,也可以保证后续进行项目开发过程的状态跟踪,更加精确。2.3 时间计划 人员分配要合理 以前总认为写计划比写代码容易的多,其实恰恰相反。一份合理的项目计划需要经过思考、沟通、权衡、询问、倾听的过程,要知道,用来分析解决问题需要花费的时间,远远大于单纯的写代码时间。 项目进度计划必须将分解出来的小任务,综合考虑时间、难易程度、人员能力,估出工作量并进行合理分配。2.4 代码开发 功能验证要同步 当日的开发任务结束后,作为项目经理应该对现有开发成果做验证,即对已完成的功能做验证,及时发现缺陷或其他问题,次日找对应的开发人员做修复。/ 4 西安科技大市场创新云服务股份有限公司 项目总结报告 因此,代码开发和功能验证的同步进行,既可以保证软件质量,同时也可以保证项目进度。当然,应该根据实际情况同步调整项目进度计划,预留处理缺陷的时间。2.5进度执行 问题修复要反馈 项目成员必须及时反馈当日任务完成情况,及前一天遗留缺陷的修复情况,才可以保证项目经理对整体进度的把控,准确跟踪项目状态。2.6 需求变更 文档修改要记录 开发过程中的任何变更,都应做记录,作为项目成员之间沟通交流的依据,也可以避免重复修改,增加无谓的工作量。项目教训 3.1 计划应当先于执行 项目计划必须要尽可能周全,并且在项目经理的可控范围内,可以根据实际情况及时做调整,但一定要保证,具体工作的开展是在计划范围内,因为没有计划直接执行会直接导致项目进度不可控,状态无法跟踪。3.2 沟通应当注意技巧 高效沟通是项目成功的决定因素。因缺乏高效的沟通技巧。对内,在与开发人员进行需求沟通、代码实现方式设计等方面沟通时,并不能快速准确表达自己意图;对外,在与业务人员协商问题时,会不自觉的使用技术术语等业务人员不易理解的词汇,导致双方无法在较短时间内达成一致意见。希望自己以后有更多的锻炼机会,学习弥补这方面的欠缺。/ 4 附件4-6 项目开发总结报告 引言...............................................................................................................................3 1.1 1.2 1.3 1.4 2 编写目的............................................................................................................3 背景....................................................................................................................3 定义....................................................................................................................3 参考资料............................................................................................................3 实际开发结果................................................................................................................4 2.1 2.2 2.3 2.4 2.5 产品....................................................................................................................4 主要功能和性能.................................................................................................4 基本流程............................................................................................................4 进度....................................................................................................................4 费用....................................................................................................................5 开发工作评价................................................................................................................5 3.1 3.2 3.3 3.4 对生产效率的评价..............................................................................................5 对产品质量的评价..............................................................................................5 对技术方法的评价..............................................................................................5 出错原因的分析.................................................................................................6 经验与教训....................................................................................................................6 引言 1.1 编写目的 说明编写这份项目开发总结报告的目的,指出预期的阅读范围。 1.2 背景 说明: 1)本项目的名称和所开发出来的软件系统的名称; 2)此软件的任务提出者、开发者、用户及安装此软件的计算中心。 1.3 定义 列出本文件中用到的专门术语的定义和外文首字母组词的原词组。 1.4 参考资料 列出要用到的参考资料,如: 1)本项目的已核准的计划任务书或合同、上级机关的批文; 2)属于本项目的其他已发表的文件; 3)本文件中各处所引用的文件、资料,包括所要用到的软件开发标准。列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。2 实际开发结果 2.1 产品 说明最终制成的产品包括: 1)程序系统中各个程序的名字,它们之间的层次关系,以千字节为单位的各个程序的程序量、存储媒体的形式和数量; 2)程序系统共有哪几个版本,各自的版本号及它们之间的区别; 3)每个文件的名称; 4)所建立的每个数据库。如果开发中制订过配置管理计划,要同这个计划相比较。 2.2 主要功能和性能 逐项列出本软件产品所实际具有的主要功能和性能,对照可行性研究报告、项目开发计划、功能需 .求说明书的有关内容,说明原定的开发目标是达到了、未完全达到、或超过了。 2.3 基本流程 用图给出本程序系统的实际的基本的处理流程。 2.4 进度 列出原定计划进度与实际进度的对比,明确说明,实际进度是提前了、还是延迟了,分析主要原因。2.5 费用 列出原定计划费用与实际支出费用的对比,包括: 1)工时,以人月为单位,并按不同级别统计; 2)计算机的使用时间,区别CPU时间及其他设备时间; 3)物料消耗、出差费等其他支出。 明确说明,经费是超出了、还是节余了,分析其主要原因。开发工作评价 3.1 对生产效率的评价 给出实际生产效率,包括: 1)程序的平均生产效率,即每人月生产的行数; 2)文件的平均生产效率,即每人月生产的千字数; 并列出原订计划数作为对比。 3.2 对产品质量的评价 说明在测试中检查出来的程序编制中的错误发生率,即每干条指令(或语句)中的错误指令数(或语句数)。如果开发中制订过质量保证计划或配置管理计划,要同这些计划相比较。 3.3 对技术方法的评价 给出对在开发中所使用的技术、方法、工具、手段的评价。3.4 出错原因的分析 给出对于开发中出现的错误的原因分析。经验与教训 列出从这项开发工作中所得到的最主要的经验与教训及对今后的项目开发工作的建议。第四篇:软件项目总结报告
第五篇:附6 软件项目开发总结报告