软件开发报告(范文大全)

时间:2019-05-13 19:46:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《软件开发报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《软件开发报告》。

第一篇:软件开发报告

负载均衡器软件

开发报告

院系: 班级: 成员:

目录

1.可行性分析报告..........................................................................................................................1 1.1 项目背景..............................................................................................................................1 1.2产品分析...............................................................................................................................1 1.3 结论意见..............................................................................................................................2 2.项目开发计划..............................................................................................................................2 2.1 总体功能要求......................................................................................................................2 2.2 软件开发平台要求..............................................................................................................2 2.3 软件项目的开发实施过程管理要求...................................................................................2 3.软件开发......................................................................................................................................2 3.1 软件的需求分析..............................................................................................................3 3.3软件的详细设计...................................................................................................................4 3.4 软件的编码..........................................................................................................................5 3.5软件的测试.........................................................................................................................31 3.5.1测试计划.....................................................................................................................31 3.5.2 软件测试....................................................................................................................31 4.项目开发总结报告....................................................................................................................32

I

1.可行性分析报告

1.1 项目背景

面对庞大的数据流量,面对集中性的访问,是不是觉得网络服务器岌岌可危呢?不用怕,负载均衡器就能帮你缓解这个问题。负载均衡器通过虚拟IP地址方法,解决了轮流排程所面临的许多问题。使用了负载均衡器集群系统,在外部看来,像是具有一个IP地址的单一服务器一样,当然,这个IP地址是虚拟的,它映射了集群中的每一台机器的地址。所以,在某种程度上,负载均衡器是将整个集群的IP地址报漏给外部网络。

当请求到达负载均衡器时,它会重写该请求的头文件,并将之指定到集群中的机器上。如果某台机器被从集群中移除了,请求不会别发往已经不存在的服务器上,因为所有的机器表面上都具有同一个IP地址,即使集群中的某个节点被移除了,该地址也不会发生变化。而且,internet上缓存的DNS条目也不再是问题了。当返回一个应答时,客户端看到的只是从负载均衡器上所返回的结果。也就是说,客户端操作的对象是负载均衡器,对于其更后端的操作,对客户端来讲,是完全透明的。

1.2产品分析

服务器一致性负载均衡器读取客户端发出的每一个请求中所包含的cookies或url解释。基于所读出的这些信息,负载均衡器就可以重写报头并将请求发往集群中合适的节点上,该节点维护着相应客户端请求的会话信息。在HTTP通信中,负载均衡器可以提供服务器一致性,但并不是通过一个安全的途径(例如:HTTPS)来提供这种服务。当消息被加密后(SSL),负载均衡器就不能读出隐藏在其中的会话信息。

通过故障恢复机制获得高可靠性故障恢复发生在当集群中某个节点不能处理请求,需将请求重新导向到其他节点时。主要有两种故障恢复:

请求级故障恢复。当集群中的一个节点不能处理请求时(通常是由于down机),请求被发送到其他节点。当然,在导向到其他节点的同时,保存在原节点上的会话信息将会丢失。

透明会话故障恢复。当一个引用失败后,负载均衡器会将之发送到集群中其他的节点上,以完成操作,这一点对用户来说是透明的。由于透明会话故障恢复需要节点具备相应的操作信息,因此为了实现该功能,集群中的所有节点必须具有公共存储区域或通用数据库,存储会话信息数据,以提供每个节点在进行单独进程会话故障恢复时所需要的操作信息。

既然所有的Web应用请求都必须经过负载均衡系统,那么系统就可以确定活动会话的数量,在任何实例访问中的活动会话的数目,应答的次数,高峰负载

次数,以及在高峰期和低谷期的会话的数目,还有其他更多的。所有的这些统计信息都可以被很好的用来调整整个系统的性能。

1.3 结论意见

虽然此项目存在一定的技术难度和风险,但我们对项目要达到的目标十分清楚,对所要开发系统将要实现的功能也非常了解。而且有一些成品作为参考,并且在项目的实施过程中我们能够获得帮助,我认为只要我们能够认真思考、仔细规划、明确分工,我们可以承担此项目的开发。

2.项目开发计划

2.1 总体功能要求

1.扩展网络设备和服务器的带宽 2.增加吞吐量

3.加强网络数据处理能力 4.提高网络的灵活性和可用性

2.2 软件开发平台要求

Visual c++ 6.0 SQL Server 2008 C++ Builder 网络架构:

完全支持TCP/IP协议

2.3 软件项目的开发实施过程管理要求

3.软件开发

3.1 软件的需求分析

1.DNS负载均衡最早的负载均衡技术是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的。DNS负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态。

2.代理服务器负载均衡 使用代理服务器,可以将请求转发给内部的服务器,使用这种加速模式显然可以提升静态网页的访问速度。然而,也可以考虑这样一种技术,使用代理服务器将请求均匀转发给多台服务器,从而达到负载均衡的目的。

3.地址转换网关负载均衡 支持负载均衡的地址转换网关,可以将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的。

4.协议内部支持负载均衡除了这三种负载均衡方式之外,有的协议内部支持与负载均衡相关的功能,例如HTTP协议中的重定向能力等,HTTP运行于TCP连接的最高层。

5.NAT负载均衡NAT简单地说就是将一个IP地址转换为另一个IP地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP地址间进行转换。适用于解决Internet IP地址紧张、不想让网络外部知道内部网络结构等的场合下。

6.反向代理负载均衡普通代理方式是代理内部网络用户访问internet上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到internet上服务器的连接请求发送给代理服务器处理。反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。反向代理负载均衡技术是把将来自internet上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。

7.混合型负载均衡在有些大型网络,由于多个服务器群内硬件设备、各自的规模、提供的服务等的差异,可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务(即把这多个服务器群当做一个新的服务器群),从而达到最佳的性能。将这种方式称之为混合型负载均衡。此种方式有时也用于单台均衡设备的性能不能满足大量连接请求的情况下。

3.2软件的概要设计

软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一

个或多个附加软件来实现负载均衡,DNSLoadBalanceCheckPointFirewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。

一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵。本地负载均衡能有效地解决数据流量过大、网络负荷过重的问题,并且不需花费昂贵开支购置性能卓越的服务器,充分利用现有设备,避免服务器单点故障造成数据流量的损失。其有灵活多样的均衡策略把数据流量合理地分配给服务器群内的服务器共同负担。即使是再给现有服务器扩充升级,也只是简单地增加一个新的服务器到服务群中,而不需改变现有网络结构、停止现有的服务。

全局负载均衡主要用于在一个多区域拥有自己服务器的站点,为了使全球用户只以一个IP地址或域名就能访问到离自己最近的服务器,从而获得最快的访问速度,也可用于子公司分散站点分布广的大公司通过企业内部互联网来达到资源统一合理分配的目的。

3.3软件的详细设计

1.轮转法:轮转算法是所有调度算法中最简单也最容易实现的一种方法。在一个任务队列里,队列的每个成员(节点)都具有相同的地位,轮转法简单的在这组成员中顺序轮转选择。在负载平衡环境中,均衡器将新的请求轮流发给节点队列中的下一节点,如此连续、周而复始,每个集群的节点都在相等的地位下被轮流选择。这个算法在DNS域名轮询中被广泛使用。

轮转法的活动是可预知的,每个节点被选择的机会是1/N,因此很容易计算出节点的负载分布。轮转法典型的适用于集群中所有节点的处理能力和性能均相同的情况,在实际应用中,一般将它与其他简单方法联合使用时比较有效。

2.散列法:散列法也叫哈希法(HASH),通过单射不可逆的HASH函数,按照某种规则将网络请求发往集群节点。哈希法在其他几类平衡算法不是很有效时会显示出特别的威力。例如,在前面提到的UDP会话的情况下,由于轮转法和其他几类基于连接信息的算法,无法识别出会话的起止标记,会引起应用混乱。

而采取基于数据包源地址的哈希映射可以在一定程度上解决这个问题:将具有相同源地址的数据包发给同一服务器节点,这使得基于高层会话的事务可以以适当的方式运行。相对称的是,基于目的地址的哈希调度算法可以用在Web Cache集群中,指向同一个目标站点的访问请求都被负载平衡器发送到同一个Cache服务节点上,以避免页面缺失而带来的更新Cache问题。

3.最少连接法:在最少连接法中,平衡器纪录目前所有活跃连接,把下一个新的请求发给当前含有最少连接数的节点。这种算法针对TCP连接进行,但由于

不同应用对系统资源的消耗可能差异很大,而连接数无法反映出真实的应用负载,因此在使用重型Web服务器作为集群节点服务时(例如Apache服务器),该算法在平衡负载的效果上要打个折扣。为了减少这个不利的影响,可以对每个节点设置最大的连接数上限(通过阈值设定体现)。

4.最低缺失法:在最低缺失法中,平衡器长期纪录到各节点的请求情况,把下个请求发给历史上处理请求最少的节点。与最少连接法不同的是,最低缺失记录过去的连接数而不是当前的连接数。

5.最快响应法:平衡器记录自身到每一个集群节点的网络响应时间,并将下一个到达的连接请求分配给响应时间最短的节点,这种方法要求使用ICMP包或基于UDP包的专用技术来主动探测各节点。

在大多数基于LAN的集群中,最快响应算法工作的并不是很好,因为LAN中的ICMP包基本上都在10ms内完成回应,体现不出节点之间的差异;如果在 WAN上进行平衡的话,响应时间对于用户就近选择服务器而言还是具有现实意义的;而且集群的拓扑越分散这种方法越能体现出效果来。这种方法是高级平衡基于拓扑结构重定向用到的主要方法。

6.加权法:加权方法只能与其他方法合用,是它们的一个很好的补充。加权算法根据节点的优先级或当前的负载状况(即权值)来构成负载平衡的多优先级队列,队列中的每个等待处理的连接都具有相同处理等级,这样在同一个队列里可以按照前面的轮转法或者最少连接法进行均衡,而队列之间按照优先级的先后顺序进行均衡处理。在这里权值是基于各节点能力的一个估计值。

3.4 软件的编码

#include #include #include #include “conn.h” #include “log.h” #include “fdwrapper.h”

conn::conn(){ m_srvfd =-1;m_clt_buf = new char[ BUF_SIZE ];if(!m_clt_buf){ throw std::exception();}

m_srv_buf = new char[ BUF_SIZE ];if(!m_srv_buf){ throw std::exception();} reset();}

conn::~conn(){ delete [] m_clt_buf;delete [] m_srv_buf;}

void conn::init_clt(int sockfd, const sockaddr_in& client_addr){ m_cltfd = sockfd;m_clt_address = client_addr;}

void conn::init_srv(int sockfd, const sockaddr_in& server_addr){ m_srvfd = sockfd;m_srv_address = server_addr;}

void conn::reset(){ m_clt_read_idx = 0;m_clt_write_idx = 0;m_srv_read_idx = 0;m_srv_write_idx = 0;m_srv_closed = false;m_cltfd =-1;memset(m_clt_buf, '', BUF_SIZE);memset(m_srv_buf, '', BUF_SIZE);}

RET_CODE conn::read_clt(){ int bytes_read = 0;while(true){ if(m_clt_read_idx >= BUF_SIZE){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “the client read buffer is full, let server write”);return BUFFER_FULL;}

bytes_read = recv(m_cltfd, m_clt_buf + m_clt_read_idx, BUF_SIZEm_clt_write_idx)> 0)? OK : NOTHING;}

RET_CODE conn::read_srv(){ int bytes_read = 0;while(true){ if(m_srv_read_idx >= BUF_SIZE)

{ log(LOG_ERR, __FILE__, __LINE__, “%s”, “the server read buffer is full, let client write”);return BUFFER_FULL;}

bytes_read = recv(m_srvfd, m_srv_buf + m_srv_read_idx, BUF_SIZEm_srv_write_idx)> 0)? OK : NOTHING;}

RET_CODE conn::write_srv(){ int bytes_write = 0;while(true){ if(m_clt_read_idx <= m_clt_write_idx){ m_clt_read_idx = 0;m_clt_write_idx = 0;return BUFFER_EMPTY;

}

bytes_write = send(m_srvfd, m_clt_buf + m_clt_write_idx, m_clt_read_idxm_srv_write_idx, 0);if(bytes_write ==-1)

{ if(errno == EAGAIN || errno == EWOULDBLOCK){ return TRY_AGAIN;} log(LOG_ERR, __FILE__, __LINE__, “write client socket failed, %s”, strerror(errno));return IOERR;} else if(bytes_write == 0){ return CLOSED;}

m_srv_write_idx += bytes_write;} } #ifndef FDWRAPPER_H #define FDWRAPPER_H

#include #include #include

int setnonblocking(int fd){ int old_option = fcntl(fd, F_GETFL);int new_option = old_option | O_NONBLOCK;fcntl(fd, F_SETFL, new_option);return old_option;}

void add_read_fd(int epollfd, int fd){ epoll_event event;

0 1

event.data.fd = fd;event.events = EPOLLIN | EPOLLET;epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event);setnonblocking(fd);}

void add_write_fd(int epollfd, int fd){ epoll_event event;event.data.fd = fd;event.events = EPOLLOUT | EPOLLET;epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event);setnonblocking(fd);}

void closefd(int epollfd, int fd){ epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, 0);close(fd);}

void removefd(int epollfd, int fd){ epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, 0);}

void modfd(int epollfd, int fd, int ev){ epoll_event event;event.data.fd = fd;event.events = ev | EPOLLET;epoll_ctl(epollfd, EPOLL_CTL_MOD, fd, &event);

} #endif #include #include #include #include “log.h”

static int level = LOG_INFO;static int LOG_BUFFER_SIZE = 2048;static const char* loglevels[] = { “emerge!”, “alert!”, “critical!”, “error!”, “warn!”, “notice:”, “info:”, “debug:” };

void set_loglevel(int log_level){ level = log_level;}

void log(int log_level, const char* file_name, int line_num, const char* format,...){ if(log_level > level){ return;}

time_t tmp = time(NULL);struct tm* cur_time = localtime(&tmp);if(!cur_time){

1

return;}

char arg_buffer[ LOG_BUFFER_SIZE ];memset(arg_buffer, '', LOG_BUFFER_SIZE);strftime(arg_buffer, LOG_BUFFER_SIZELOG_EMERG ]);

va_list arg_list;va_start(arg_list, format);memset(arg_buffer, '', LOG_BUFFER_SIZE);vsnprintf(arg_buffer, LOG_BUFFER_SIZE-1, format, arg_list);printf(“%sn”, arg_buffer);fflush(stdout);va_end(arg_list);} #include #include #include #include #include #include #include #include #include #include #include #include #include #include

1

#include #include

#include “log.h” #include “conn.h” #include “mgr.h” #include “processpool.h”

using std::vector;

static const char* version = “1.0”;

static void usage(const char* prog){ log(LOG_INFO, __FILE__, __LINE__, “usage: %s config_file]”, prog);}

int main(int argc, char* argv[]){ char cfg_file[1024];memset(cfg_file, '', 100);int option;while((option = getopt(argc, argv, “f:xvh”))!=-1){ switch(option){ case 'x': { set_loglevel(LOG_DEBUG);break;} 4 [-v] [-h] [-f

case 'v': { log(LOG_INFO, __FILE__, __LINE__, “%s %s”, argv[0], version);return 0;} case 'h': { usage(basename(argv[ 0 ]));return 0;} case 'f': { memcpy(cfg_file, optarg, strlen(optarg));break;} case '?': { log(LOG_ERR, __FILE__, __LINE__, “un-recognized option %c”, option);usage(basename(argv[ 0 ]));return 1;} } }

if(cfg_file[0] == ''){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “please specifiy the config file”);return 1;} int cfg_fd = open(cfg_file, O_RDONLY);

1

if(!cfg_fd){ log(LOG_ERR, __FILE__, __LINE__, “read config file met error: %s”, strerror(errno));return 1;} struct stat ret_stat;if(fstat(cfg_fd, &ret_stat)< 0){ log(LOG_ERR, __FILE__, __LINE__, “read config file error: %s”, strerror(errno));return 1;} char* buf = new char [ret_stat.st_size + 1];memset(buf, '', ret_stat.st_size + 1);ssize_t read_sz = read(cfg_fd, buf, ret_stat.st_size);if(read_sz < 0){ log(LOG_ERR, __FILE__, __LINE__, “read config file error: %s”, strerror(errno));return 1;} vector< host > balance_srv;vector< host > logical_srv;host tmp_host;memset(tmp_host.m_hostname, '', 1024);char* tmp_hostname;char* tmp_port;char* tmp_conncnt;bool opentag = false;char* tmp = buf;char* tmp2 = NULL;char* tmp3 = NULL;

met met

char* tmp4 = NULL;while(tmp2 = strpbrk(tmp, “n”)){ *tmp2++ = '';if(strstr(tmp, “”)){ if(opentag){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config file failed”);return 1;} opentag = true;} else if(strstr(tmp, “”)){ if(!opentag){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config file failed”);return 1;} logical_srv.push_back(tmp_host);memset(tmp_host.m_hostname, '', 1024);opentag = false;} else if(tmp3 = strstr(tmp, “”)){ tmp_hostname = tmp3 + 6;tmp4 = strstr(tmp_hostname, “”);if(!tmp4){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config

file failed”);return 1;} *tmp4 = '';memcpy(tmp_host.m_hostname, strlen(tmp_hostname));} else if(tmp3 = strstr(tmp, “

”)){ tmp_port = tmp3 + 6;tmp4 = strstr(tmp_port, “”);if(!tmp4){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config file failed”);return 1;} *tmp4 = '';tmp_host.m_port = atoi(tmp_port);} else if(tmp3 = strstr(tmp, “”)){ tmp_conncnt = tmp3 + 7;tmp4 = strstr(tmp_conncnt, “”);if(!tmp4){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config file failed”);return 1;} *tmp4 = '';tmp_host.m_conncnt = atoi(tmp_conncnt);}

tmp_hostname,else if(tmp3 = strstr(tmp, “Listen”)){ tmp_hostname = tmp3 + 6;tmp4 = strstr(tmp_hostname, “:”);if(!tmp4){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config file failed”);return 1;} *tmp4++ = '';tmp_host.m_port = atoi(tmp4);memcpy(tmp_host.m_hostname, tmp3, strlen(tmp3));balance_srv.push_back(tmp_host);memset(tmp_host.m_hostname, '', 1024);} tmp = tmp2;}

if(balance_srv.size()== 0 || logical_srv.size()== 0){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “parse config file failed”);return 1;} const char* ip = balance_srv[0].m_hostname;int port = balance_srv[0].m_port;

int listenfd = socket(PF_INET, SOCK_STREAM, 0);assert(listenfd >= 0);

int ret = 0;struct sockaddr_in address;

1

bzero(&address, sizeof(address));address.sin_family = AF_INET;inet_pton(AF_INET, ip, &address.sin_addr);address.sin_port = htons(port);

ret = bind(listenfd, sizeof(address));assert(ret!=-1);

ret = listen(listenfd, 5);assert(ret!=-1);

//memset(cfg_host.m_hostname, '', 1024);//memcpy(cfg_host.m_hostname, “127.0.0.1”, strlen(“127.0.0.1”));//cfg_host.m_port = 54321;//cfg_host.m_conncnt = 5;processpool< conn, host, mgr >* pool = processpool< conn, host, mgr >::create(listenfd, logical_srv.size());if(pool){ pool->run(logical_srv);delete pool;}

close(listenfd);return 0;} #include #include #include #include #include #include

0

2(struct sockaddr*)&address,#include #include #include #include #include #include #include #include #include

#include #include “log.h” #include “mgr.h”

using std::pair;

int mgr::m_epollfd =-1;int mgr::conn2srv(const sockaddr_in& address){ int sockfd = socket(PF_INET, SOCK_STREAM, 0);if(sockfd < 0){ return-1;}

if(connect(sockfd,(struct

sockaddr* sizeof(address))!= 0){ close(sockfd);return-1;} return sockfd;1)&address,}

mgr::mgr(int epollfd, const host& srv): m_logic_srv(srv){ m_epollfd = epollfd;int ret = 0;struct sockaddr_in address;bzero(&address, sizeof(address));address.sin_family = AF_INET;inet_pton(AF_INET, srv.m_hostname, &address.sin_addr);address.sin_port = htons(srv.m_port);log(LOG_INFO, __FILE__, __LINE__, “logcial srv host info:(%s, %d)”, srv.m_hostname, srv.m_port);

for(int i = 0;i < srv.m_conncnt;++i){ sleep(1);int sockfd = conn2srv(address);if(sockfd < 0){ log(LOG_ERR, __FILE__, __LINE__, “build connection %d failed”, i);} else { log(LOG_INFO, __FILE__, __LINE__, “build connection %d to server success”, i);conn* tmp = NULL;try { tmp = new conn;} catch(...)

2

{ close(sockfd);continue;} tmp->init_srv(sockfd, address);m_conns.insert(pair< int, conn* >(sockfd, tmp));} } }

mgr::~mgr(){ }

int mgr::get_used_conn_cnt(){ return m_used.size();}

conn* mgr::pick_conn(int cltfd){ if(m_conns.empty()){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “not connections to server”);return NULL;}

map< int, conn* >::iterator iter = m_conns.begin();int srvfd = iter->first;conn* tmp = iter->second;if(!tmp)

enough srv

{ log(LOG_ERR, __FILE__, __LINE__, “%s”, “empty server connection object”);return NULL;} m_conns.erase(iter);m_used.insert(pair< int, conn* >(cltfd, tmp));m_used.insert(pair< int, conn* >(srvfd, tmp));add_read_fd(m_epollfd, cltfd);add_read_fd(m_epollfd, srvfd);log(LOG_INFO, __FILE__, __LINE__, “bind client sock %d with server sock %d”, cltfd, srvfd);return tmp;}

void mgr::free_conn(conn* connection){ int cltfd = connection->m_cltfd;int srvfd = connection->m_srvfd;closefd(m_epollfd, cltfd);closefd(m_epollfd, srvfd);m_used.erase(cltfd);m_used.erase(srvfd);connection->reset();m_freed.insert(pair< int, conn* >(srvfd, connection));}

void mgr::recycle_conns(){ if(m_freed.empty()){ return;}

2

for(map< int, conn* >::iterator iter = m_freed.begin();iter!= m_freed.end();iter++){ sleep(1);int srvfd = iter->first;conn* tmp = iter->second;srvfd = conn2srv(tmp->m_srv_address);if(srvfd < 0){ log(LOG_ERR, __FILE__, __LINE__, “%s”, “fix connection failed”);} else { log(LOG_INFO, __FILE__, __LINE__, “%s”, “fix connection success”);tmp->init_srv(srvfd, tmp->m_srv_address);m_conns.insert(pair< int, conn* >(srvfd, tmp));} } m_freed.clear();}

RET_CODE mgr::process(int fd, OP_TYPE type){ conn* connection = m_used[ fd ];if(!connection){ return NOTHING;} if(connection->m_cltfd == fd){ int srvfd = connection->m_srvfd;

2

switch(type){ case READ: { RET_CODE res = connection->read_clt();switch(res){ case OK: { log(LOG_DEBUG, __FILE__, __LINE__, read from client: %s“, connection->m_clt_buf);} case BUFFER_FULL: { modfd(m_epollfd, srvfd, EPOLLOUT);break;} case IOERR: case CLOSED: { free_conn(connection);return CLOSED;} default: break;} if(connection->m_srv_closed){ free_conn(connection);return CLOSED;} break;

”content

} case WRITE: { RET_CODE res = connection->write_clt();switch(res){ case TRY_AGAIN: { modfd(m_epollfd, fd, EPOLLOUT);break;} case BUFFER_EMPTY: { modfd(m_epollfd, srvfd, EPOLLIN);modfd(m_epollfd, fd, EPOLLIN);break;} case IOERR: case CLOSED: { free_conn(connection);return CLOSED;} default: break;} if(connection->m_srv_closed){ free_conn(connection);return CLOSED;} break;

2

} default: { log(LOG_ERR, __FILE__, __LINE__, “%s”, “other operation not support yet”);break;} } } else if(connection->m_srvfd == fd){ int cltfd = connection->m_cltfd;switch(type){ case READ: { RET_CODE res = connection->read_srv();switch(res){ case OK: { log(LOG_DEBUG, __FILE__, __LINE__, read from server: %s“, connection->m_srv_buf);} case BUFFER_FULL: { modfd(m_epollfd, cltfd, EPOLLOUT);break;} case IOERR: case CLOSED: { modfd(m_epollfd, cltfd, EPOLLOUT);

”content

connection->m_srv_closed = true;break;} default: break;} break;} case WRITE: { RET_CODE res = connection->write_srv();switch(res){ case TRY_AGAIN: { modfd(m_epollfd, fd, EPOLLOUT);break;} case BUFFER_EMPTY: { modfd(m_epollfd, cltfd, EPOLLIN);modfd(m_epollfd, fd, EPOLLIN);break;} case IOERR: case CLOSED: { /* if(connection->m_srv_write_idx connection->m_srvread_idx){ free_conn(connection);

==

} else { modfd(m_epollfd, cltfd, EPOLLOUT);} */ modfd(m_epollfd, cltfd, EPOLLOUT);connection->m_srv_closed = true;break;} default: break;} break;} default: { log(LOG_ERR, __FILE__, __LINE__, “%s”, “other operation not support yet”);break;} } } else { return NOTHING;} return OK;}

0 3

3.5软件的测试

3.5.1测试计划 功能部分将使用单元测试来确定其适合符合需求,性能部分将使用自动化测试来检验。主要测试为: 运行测试;逻辑测试; 3 业务处理能力测试; 4 系统安全性测试; 5 性能测试; 6 高负荷下工作测试; 7 稳定性测试; 8 易用性测试;

3.5.2 软件测试 1.运行测试

在进行该项测试过程中,按照按照《用户操作手册》对软件进行了全面详细的操作测试,对软件所罗列出的所有功能模块进行了精细的操作,发现了一些容错和反馈信息方面的问题,以及部分功能模块无法实现或出错。2.逻辑测试

在进行该项测试过程中,主要对软件的逻辑设计方面进行了深入评判,检查软件设计是否在某些方面有悖于正常的逻辑思维,是否在实际情况相符。发现了一些诸如单个包间可容纳客人数无限制、同一服务员可服务客人数无限制等逻辑错误。

3.业务处理能力测试

在进行该项测试过程中,主要针对系统对业务的处理能力进行测试,检查了业务处理的连贯性、全面性和正确性,并检查业务处理结果是否满足客户需求。4.安全测试

在进行该项测试过程中,检查了系统的安全登录,查看了系统内资料的安全保密性,以及系统会不会有漏洞容易遭受外部的攻击。5.性能测试

在进行该项测试过程中,对于系统的运行速度、加载速度、业务处理速度等进行了测试。结果发现如果数据库中有大量数据,此时进行数据库访问,性能将会下降。

6.高负荷下工作测试

3

在进行该项测试过程中,对于当数据库有大量数据,并长时间运行时,软件的运行速度、性能和资源使用情况进行了检查。通过性能监视器分别对服务器的内存、CPU、硬盘的I/O速度等系统资源的使用情况进行观察,发现系统的资源使用有所提高,查询性能有所降低,但不影响正常使用。7.稳定性测试

在进行该项测试过程中,主要看软件是否会出现死机、操作系统或者网络瘫痪、程序崩溃等问题。8.易用性测试

在进行该项测试过程中,考察了本软件的界面设计布局是否合理,外形是否美观,操作是否简单无歧义,帮助文档是否简单易懂。

4.项目开发总结报告

在对该项目进行开发的过程中,我们遇到了很多的困难。在于我们对于市场的研究和可行性考量的过程中。虽然我们明确了设计的目的,但国内以及国际市场的广阔性使我们在对客户需求的分析中走入了迷雾中,因此耽误了很多时间。但是,幸好最后我们还是完成了该项目。而从对该项目的开发中,我们也学到了以下几点。

我们要尽量的让客户也参与到项目的开发团队中来,也就是说我们要使客户把自己也纳入到项目的开发团队中来。如此一来,我们掌握客户需求的真实性、可靠性就会大大的提高,也就不会为项目的后期功能开发埋下陷阱。

在项目确立后,我们就需要做好项目开发计划,需求调研用时,开发用时,测试用时,实施用时,维护用时。在我们做好了计划后,我们要随时的跟踪计划任务的完成进度,从而使我们的项目进度掌控在我们的开发周期范围之内,今日计划、行动,明日成功。

在其他行业中,人与人的之间的沟通是很重要的。项目开发也不例外,很好的沟通能够加快项目的进度,这就要求我们每一个开发人员要学会和善于沟通于客户和同事之间。在一个项目的开发过程中,我们与客户的沟通是一个不断交流和沟通的过程。在开发到一定的阶段,我们就需要和客户沟通已有功能,尽量的去避免一些隐藏的问题,及时的发现问题,解决问题,从而按时或者提前完成项目的开发。

3

3

第二篇:软件开发实习报告.

软件开发实习报告

一、实习的目的与意义

在本科教育中,实习是一个重要的实践性教学环节。通过实习,可以使我们熟悉外贸实务的具体操作流程,增强感性认识,并可以进一步了解、巩固与深化已经学过的理论和方法,加深对专业理论知识的理解,培养和提高实践操作问题、发现先问题、分析问题以及解决问题的能力,使综合运用所学理论知识与编程实践紧密结合,为毕业后从事计算机工作打下良好的基础。实习要达到以下目标:

a)在实习过程中学会为人处事能力,学会以各种方式学习,学会团结合作共收益,提高自己的多方面能力和整体综合素质。

b)将在校所学的知识运用到实践中,提高观察问题、发现问题、分析问题、解决问题的能力,强化编程能力,提高计算机专业水平。

c)在规范有序的实习中培养吃苦耐劳、努力钻研、求真务实的精神。在具体实习过程中,能够了解软件开发的具体流程,需求分析过程及任务的分配、完成、提交、审核等各个方面,还能对行业深入彻底地了解并能切身体会到行业的竞争力,工作的重要性及自身在工作中的角色,还能了解自身存在的不足,并积累一定的经验,为将来走上工作岗位打下良好的基础。

二、实习时间

2012年1月9日(星期一)—2012年1月13日(星期五)

三、实习地点

XX大学网络中心

四、实习内容

第一天,老师进行了软件开发实习总动员,强调了软件开发是一个复杂的过程,他需要软件开发人员有强大的耐力,耐得住繁杂的程序代码,耐得住寂寞,同时也强调了软件开发的重要性,软件开发是适应现代科技的飞速发展,以及满足人们的日常需求必不可少的高科技技术。

第二天,老师讲解了软件开发必不可少的工具,如SQL server数据库等编程语言,而在编制数据库时必须注意的是数据库的表与表之间的联系、表与表之间的连接、实体与属性之间的关系、主键、唯一键以及外键等数据库相关的知识。在这天老师主要讲解了数据库的后台知识。

第三天,老师对基于Subversion和TortoiseSVN的版本控制系统做了简单介绍。版本控制是软件配置管理中的重要一环,主要功能是记录开发过程的每一次修改,让开发工作可以随时检查过往的历史和获取正确的版本,是系统的“成长记录”。

第四天,参观沈阳建筑大学学校的网络中心,通过老师讲解和学生亲自动手操作,了解网络中印中用到了哪些开发的软件,同时讲明最后一天的实习内容。

第五天,项目实践,熟练掌握SQL server数据库等开发工具,开发一个软件。从整体出发,一步一步实现,需求整理到分析设计到后来的代码编写与测试等,并了解软件开发大致流程:

a)需求分析(前期规划):明确软件需要实现哪些功能,即公司的需求。b)概要设计:以项目为中心的开发流程。c)详细设计:设计数据流图及E-R图等。

d)具体编码:业务流程、具体模块的开发,编写程序代码。

e)调试、跟踪与测试:对编写的程序、模块功能等进行检查,保证开发的软件可用。

五、心得体会

实习是每一个大学生必不可少的一段学习经历,在这短短的一周时间里,不仅在学习方面学到了很多,除此之外,我还学到了如何与人相处,如何与人更好的交流,开发一个项目通常是需要一个团队的队员共同合作完成的,因此大家的交流沟通显得尤为重要,如何更好地与别人沟通,如何将自己的想法清楚明白的告诉队友,如何更好地去陈述自己的观点,如何说服别人认同自己的观点同时又不伤害其他的队友的面子,这些在我的实习生活中都有一些体会,对我来说受益非浅。作为一个即将踏入社会的我来说,现在的实习对我今后踏入新的工作岗位是非常有益的,相信这些宝贵的经验会成为我今后成功的最重要的基石。

作为大三的学生,经过两年半的在校学习,对程序设计有了一些基本的理性的认识和理解。在校期间一直忙于理论的学习,没有机会也没有经验来参与项目的开发,所以在实习之前软件开发对我来说是非常抽象的,因此很高兴有这样一个参与到软件实际开发的机会。通过这次实习,我发现从学校走向社会我们还存在着很大的不足,对工作我们也缺少经验,我认识到我们要认清自身定位,特别是加强英语学习。在大部分的工作和活动中无一例外涉及到英语,项目中好多名词都是英语的缩写,不然要天天百度英文的意思,这样工作效率会大大降低,而且,在软件开发的过程中,数据库的建立也尤为重要,对表的操作,如表与表之间的关系、表与表的连接、实体与属性之间的关系等知识都需要明确地掌握。因此在以后的学习中必须加强对英语与数据库的学习,不断强化自身,并充分认识自己,避免眼高手低,增加实际动手能力,在社会这个大学校里,不断完善和学习。

这次实习是对我两年半的学习的一个检验,虽然项目中很多知识我们在日常的学习中都没有学到,这同时提醒我:要想成为一个合格的程序员就要具备一种自学能力,在工作中会遇到很多从未接触过的问题,当有了问题时就要去解决,在你不断努力,寻找答案的过程中,自己的能力也在潜移默化的提升。对于计算机的知识我们也要不断加强锻炼,特别是实际应用,多写写代码,多看看程序,并自己亲身实践,这样你才会发现你对代码是多么生疏,写一行代码就错误百出,只有理论知识没有实践经验是不行的,计算机就是一个需要不断实践的行业,更新速度很快,稍不留神你就落伍了,所以要常常补充知识,这样才会有用武之地。

在这次实习过程中,我深刻体会到,走出校门,只是万里长征的第一步,我们在工作经验上、社会历练上以及人际交往上体现出来的稚嫩,在这一次的实习中完全表露出来,而且我们所缺乏的还不仅仅如此,所以在以后的生活和工作中,我要不断的充实和丰富自己,不放弃任何能够锻炼自己的机会,使自己能迅速的成长为一名合格的软件开发人员。

总之,这次实习的意义,对我来说已不再仅仅是完成学分、完成软件开发实习的任务,而是在开启“生命之旅”大门的过程中迈出了第一步,它使我在实践中了解社会,让我学到了很多在课堂上根本就学不到的知识,也开拓了视野,增长了见识,为我以后更好地服务社会打下了坚实的基础。我一定会好好地珍惜这次实习的经验,并为自己所喜爱的软件开发科技贡献自己的聪明才智,感谢老师在这段时间里对我的指导和教诲,我从中受益匪浅,整个的实习过程是紧张而愉快的。作为我在踏出社会之前的为数不多的几次实践中,这次的实践的确给予了我很多。今后,我将继续保持认真负责的学习与工作态度,高尚的思想觉悟,进一步完善和充实自己,争取在以后的学习中更好的发挥自己的特长,在以后的实践中更好的运用自己的知识,做一个合格的大学生,将来做一名对社会有用的人。

第三篇:软件开发述职报告(范文模版)

软件开发述职报告

软件开发述职报告

本人于xxx年x月份加入xxx发展有限公司,入职后在工程部工作,任土建工程师,作为一名加入公司的新人,最重要的就是要在最短的时间内度过“适应期”,尽快适应工作环境,快速转换角色。

一、新的岗位,新的挑战

来到公司的第一天,给我最大的感受就是公司的规范化的管理,不光体现在工作中,同时在企业形象、个人形象中同样能够得到体现。土建工程师是一个对实际工作经验要求很高的职位,而我正是在这方面有所欠缺,我将通过工作中锻炼自己、提高自己、塑造自己。这种学习是一种见机行事,是让自己适应工作中的知识技能,使自我希望通过学习能增强自己的竞争力,同时也增强公司的竞争力。

二、规范自己的言行,做合格的职员

在工程部工作,免不了要与上下左右及社会各界联系,我将始终牢记自己是公司的一员,言行举止都注重约束自己。对各级领导,做到谦虚谨慎,尊重服从。但是服从并不代表盲从,对于有利于项目的开展的合理的意见也要及时的反馈给领导,做事大胆,不避讳上下层的关系,真正做到对工程负责,对公司负责,要把自己真正的当成公司的主人。

三、加强学习,提高现场工程管理水平

在对施工单位的管理上,以合同、规范为依据,按照《工程管理手册》向施工单位灌输我公司的管理方法和理念,立好规矩,制定好标准,树质量、安全文明标兵从而带动后进的单位,同时增强服务意识,进行充分的沟通、协调是做好对施工单位管理的基础。

对监理公司的管理,首先应充分支持监理的工作,其次要检查、督促、指导监理的工作,对待监理日常工作不到位的地方及时指出,在对施工单位的管理上有时可借助监理的力量,往往可以取得良好的效果。

在工程协调上坚持以合同为依据,站在公司利益的立场上处理事情,坚持原则,但又要有一定的灵活性,协调的目的是保证工程进度更快,质量更好更有保证,造价最低,整体效果最好。

在三控两管上,做到有计划有跟踪有落实,紧盯合同目标制定关键控制节点,在总体进度计划的基础上把计划分解到每季、月、周,制定相应的考核制度;质量控制做到事前、事中、事后控制,关键是过程控制;投资控制上严格审查各种签证和变更资料,确认其合理性、必要性,避免增量多报和减量漏报;在合同管理上,充分熟悉合同条款,落实合同条款的执行情况,严格按照合同执行;在信息管理上做到规范、系统、统一、有条理。

四、尽心履职,全心全意当好称职的土建工程师

作为工程部的一名土建工程师,我的理解,没有什么谋求利益和享受待遇的权力,只有承担责任、带头工作的义务。在平时的工作中,对领导交办的工作,从不讨价还价,保质保量完成;对自己分内的工作也能积极对待,努力完成,做到既不越位,又要到位,更不失职。在同办公室其他几位同事的工作协调上,做到真诚相待,互帮互学。

最后,我想说的是,我需要做到的就是成为一个优秀的员工。

软件开发述职报告

通过一年学习实践,在以下技能上面有了较大进步:

1)对研发、生产各项环节的更清晰认识。经过2x2 Triplexer、ECAN CNU、ECAN CLT几个案子的历练,增进了对设计预研,设计验证,设计导入生产等环节的熟悉程度;同时,更多参与与各部门间的交流,沟通能力得到锻炼,增加了处理各种问题的经验。对产品的研发历程和成本产生等有了一个比较完整的认识。

2)对网络的更深认识。年初花了不少时间对Triple play相关技术的规格,以及实现方案做了很多调研工作。在实现方案调研过程中,查漏补缺,让我对网络的认识更加的完善。硬件上主要有,对OSI七层网络结构模型的更深认识,对PON网络结构有较清晰了解,Ethernet产品的一般实现方案有较深了解,知道了一些路由及交换产品的一般实现方案,还了解到VoIP产品的构成及实现方案等等;软件上主要有,对Linux系统的更深认识,对SIP协议的细节认识,对Router软件实现的认识的加深,以及SIP服务器的移植、使用等。

3)对产品可靠度设计的更深刻认识。包括de-rating,ESD,Hi-pot等设计考虑的深入学习。

4)对硬件基本调试方法的更深刻认识。包括使用万用表,示波器,网络分析仪等设备对产品各参数的测量,并bug shooting等。5)一些基本的PCB Layout常识学习。对如Signal Integrity,Designe For Manufacturing,PCB Fabrication,PCB过流能力考虑等等,都有了一个初步的认识。

6)对一些元件的更认可认识。在制作采规及元件选用时,及时对各种器件的基本知识做了整理,对电阻、电容、二极管、Power IC等元件有了更加全面的认识。

硬件方面:

1)学习硬件调试、维修。增加数字电路调试经验,单片机常用外围单元调试、设计经验等。

2)继续完善各种元件的基本知识。

3)增加PCB Layout经验

Linux编程方面:

4)Linux Makefile编程、及shell编程继续学习,以提高工作效率。

5)Linux应用编程继续练习。争取明年一年能熟练Linux应用编程!

6)继续熟悉Linux系统,可简单进行移植,裁剪,驱动编程。

以上,结合公司project,重点进行强化。

嵌入式技术应用广泛,比如,可作为设备的控制模块,CATV编解码终端中的应用,各种网络设备中的核心控制器模块。嵌入式技术在增加产品附加价值,如易用性、界面友好性等方面表现突出;同时,嵌入式技术又可以快速集成现有技术,IC,或IP以形成新产品,来满足市场需求。

综合公司业务范围,嵌入式技术优势,以及个人所学专业知识,未来2~3年内,定位为嵌入式工程师,努力学习相关知识。

第四篇:软件开发讲座报告

软件开发公司专家报告会

一、实习时间:

2010年8月27日

二、实习地点:

中国矿业大学银川学院A2阶梯教室

三、实习目的:

了解软件业状态、发展方向以及开发过程,听取软件开发经验、软件工程知识。

四、实习内容:

周五下午,我们在A2报告厅听了宁夏方达电子公司的周总为我们做的报告,这次报告中主要为我们介绍了以下内容。

1、宁夏软件业

·银川方达电子系统工程有限公司: CMMI三级认证资质、涉密资质三级、系统集成三级,拥有自主知识产权的产品20余种,医疗信息软件在宁夏市场占有率达70%,在区内第一个开创软件外包业务,业务领域涉及应用软件、系统集成网站运营、三维影像建模,广告宣传、游戏开发和外包。

·宁夏希望信息产业有限公司也具有CMMI三级认证资质、涉密资质三级、系统集成三级等。

2、软件业发展方向

·差异化竞争,获得行业垄断化优势,引领标准和方向;

·大型化,产品深度挖掘;

·引进外来技术,学习外包现金管理经验;

·软硬结合,以服务业向工业领域扩展;

·平台多样化

·资本运营。

3、软件开发技术

·面向过程C,Pascal,VB

·面向目的4GL如SQL,Clipper,Foxpro

·面向对象Java,C#,Delphi,C++

单机——局域网——广域网

C/S:client/server

3-tier:client/application server/DB server

B/S:brower/web server

数据访问层DAL

业务逻辑层BLL

表示层 UI4、经验介绍

·坚持技术创新,掌握核心技术

·坚持技术积累,在积累上获得发展

·坚持技术管理的改进,先后通过ISO9000,CMMI 3级质量认证

·通过引进软件外包,引入国外先进开发管理经验深刻认识开发管理的各个环节

5、国内企业竞争环境

·缺乏准入机制,日本的做法有借鉴意义

·市场混乱:不是按能力而是靠关系

·税负重:33%的企业所得税,软件企业本身缺乏固定资产抵押,难以获得贷款扶持

·毕业生合格的少,转行的多

·恶性循环:缺钱——缺人——缺技术

6、软件业状态

3tier—>J2E—>SOA—>“云”(云计算、云存储……)

开发效率:Delphi>C#>Java

软件业:外面购源代码,拼凑项目套取资金,不去抓自己的核心技术

7、企业的核心力量分布

主力是60后、70后,80后还没起来,90后人数太少

1)不愿吃苦,耐受力差。很容易转行,很轻易给自己下结论,很容易被挫折打败,什么事都想捡现成2)缺乏创新精神

3)自主学习能力下降比较严重

4)跟同事交流和合作能力差

8、技术开发人员成分

现象1:出身专业出身:非专业出身:1:1

现象2:男女比例底层管理人员女生比较多

技术团队:60-70:0

技术开发不适合女生,从习惯上,思维方式上,体力上有差异

9、软件工程知识

专业技术员知识

Java的web开发框架

1)struts1.4,struts2,spring,hibernate

2)tapestry5,ibtas

3)EJBJ,JSF

4)Java script,html,css

五、心得体会

1、知识得以更新、以前的观念得以改变。

“知识改变命运,学习成就未来”总是在说 , 真正又有几时在做? “通过学习得到知识;知识改变人的思想;有了好的思想决定好的行为;好的行为养成优秀的习惯;优秀的习惯造就人的性格;最近‘性格决定人的命运’。优秀是一种习惯,一个成功的人之所以能成功,是因为他很早就具备了成功的习惯!”

2、通过这次讲座,让我在一次知道了,在学习中坚定自己的信念、了解细节是多么的重要;促使自己在学习软件开发的重要知识时 在学习得的 每时每刻都要注意细节的重要性;更明白了软件是个特殊的行业。

当然我们收获的还有很多、很多„„的确这次讲座使自己“知识得以更新、观念得以改变”,对今后的学习会有很大的启发。!

3在讲座结束的时候,让我感触最深的还是那句话“学习的目的在于应用”,我们学习的目的就是为了应用。学习是必然的,应该在用上多下功夫,用好比学好更重要,这就是我们应该树立的学习理念。另外重要的是学习,并不仅仅是这次的讲座,我们应该在以后要更该好好的去学习,只有不断的学我们才会进步,只有不断的进步我们才会有创新,才会有所突破。

六、报告编写时间:

08级机电工程系 计算机科学与技术专业

王则臻

2010年8月29日

第五篇:软件开发生产实习报告[模版]

软件开发生产实习报告

专业:

组员:

按照贡献大小列出每个组员的姓名、学号

信息科学与工程学院

2014年5月

1、项目概述

1.1 需求分析

正文使用这个字体。行间距为1.5倍行距。不得有3级标题。首行缩进2字符。

1.2 开发技术、环境与工具

2、软件设计

2.1 系统架构及功能模块

2.2 关键模块流程

2.3 数据库设计

2.4 业务流程

2.5 界面设计

3、软件实现

3.1 关键模块的实现

3.2 软件测试方案与结果

4、遇到的主要问题与解决方法

要求学生积累总结在实训过程中遇到的主要问题及其如何解决的;

5、学习心得与建议

下载软件开发报告(范文大全)word格式文档
下载软件开发报告(范文大全).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    软件开发述职报告(5篇模版)

    软件开发述职报告时间就如同白驹过隙般的流逝,回顾这段时间以来的工作,我们取得了不错的成绩,是时候认真地做好述职报告了。那么问题来了,述职报告应该怎么写?以下是小编整理的软......

    软件开发专业实习报告

    软件开发专业实习报告 软件开发专业实习的开展能使实习生们加深对自己专业的认识,确定自己以后的努力方向。以下是小编为大家精心整理的软件开发专业实习报告,欢迎大家阅读。......

    软件开发毕业实习报告

    xxxx学院毕业实习报告系别: 年级班级: 学号: 姓名: 指导教师: 实习类型: 实习单位: 实习时段:集中实习 关于在XX公司从事 软件开发的实习报告一、实习目的 进一步了解java开发的相关......

    Java软件开发实习报告(本站推荐)

    Java软件开发实习报告范文 同学们可以通过实习对java语言、JavaWeb、Oracle数据库应用设计及SQL语言的复习和锻炼,并且通过使用MyEclipse 开发平台设计库存管理系统项目,以达......

    软件开发实习生毕业实习报告

    软件开发实习生毕业实习报告 学 院:物理与信息工程 专 业:物联网工程 姓 名:陈xx 学 号: 11XX02 实习单位:xxxx时代教育科技有限公司 实习时间:XX.7.13-XX.9.26 实习单位(全称) xxxx......

    软件开发专业调查报报告范文

    人 才 需 求 调 查 报 告班级:计算机XX班 姓名:XXX 学号:08030100 时间:2009年2月5日 软件开发专业调查报报告1946年,世界上第一台电脑在美国诞生。1999年,中国大学扩招计算机专业......

    软件开发实习报告 [共5篇]

    通过这次在清华IT的实习,学到了很多东西,软件开发实习报告。也了解到了软件开发的真正价值。这次的实践让我真切体会到了我们前面所学知识的用处所在。以前总认为所学的知识只......

    Java软件开发实习报告(合集5篇)

    Java软件开发实习报告 Java软件开发实习的进行能使实习生们通过项目练习,对所学知识进行深化。下面是小编推荐给大家的Java软件开发实习报告,希望能带给大家帮助。 Java软件开......