声明:本文为本人在软考系统架构设计师备考期间的练手写作,不保证内容的原创性与正确性,仅供参考,请勿照抄和用于学术论文等正规场合,因不当使用产生后果一律自负。

摘要

  2019年3月,我单位联合某高校研发了《程序在线评测比赛考试系统》。系统以程序代码在线提交自动评测功能为核心,分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等,支持对接教务平台。在项目中我担任系统架构师,负责架构设计工作。
  本文以该系统为例,主要论述了基于构件的软件开发技术在项目中的具体应用。系统基于Spring Cloud微服务框架来进行构件化开发,在构件获取阶段通过对接现有系统、使用构件库、集成第三方软件来实现需求,在构件开发阶段使用了多种设计模式来保证构件的可重用性,在构件组装阶段使用了同步消息、异步消息、工作流方式来实现不同业务类型下构件的组合。最终项目顺利上线并稳定运行,获得用户一致好评。

正文

  笔者在一个专为高校建设计算机专业智能教学一体化平台的单位任职,过往成果有《计算机组成原理仿真实验系统》等。2019年3月,我单位联合某大学研发了《程序在线评测比赛考试系统》项目(以下简称为“OJ系统”),以取代原有传统的编程上机考试平台。
  系统以程序代码的在线提交自动评测功能为核心,主要分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等。题库模块主要负责试题和测试用例的管理,用户根据试题要求编写程序代码提交到系统,系统将测试用例与程序代码发送给评测机模块,由评测机自动编译、执行、判分,并将结果发送给其他相关模块进行统计;实验作业模块用于在线布置作业,从题库中选取试题,设置截止日期等要求;考试模块用于学生在线考试,按教师预先设置的参数自动从题库随机抽题生成试卷,以及向教务平台上传考试成绩;比赛模块主要用于ACM竞赛的培训;抄袭判定模块用于鉴定代码与他人代码雷同率;用户管理模块负责用户信息的管理。在这个项目中,我担任了系统架构师的职务,主要负责系统的架构设计相关工作。
  构件技术是指通过组装一系列可复用的软件构件来构造软件系统的软件技术。通过运用构件技术,开发人员可以有效地进行软件复用,减少重复开发,缩短开发时间,降低软件的开发成本。主流的构件技术有三种:CORBA、EJB和COM。CORBA分为对象请示代理、公共对象服务和公共设施三个层次,优点是大而全,互操作性和开放性好,缺点是庞大且复杂,技术标准更新缓慢;EJB基于Java语言,支持跨平台,提供了远程访问、安全、持久化和生命周期等机制,支持分布式计算,缺点是服务治理能力差,逐渐被Spring Cloud等轻量级框架取代;COM基于Windows平台,功能强大、效率高,有一系列开发工具支持,缺点是跨平台性差。基于构件的软件开发过程主要分为模块划分、构件标识、构件获取、构件组装与测试、构件管理等步骤。
  OJ系统采用了基于Spring Cloud的微服务架构开发。这里重点从构件获取、构件开发、构件组装三个阶段说明本系统采用构件化开发的过程。

1. 构件获取

  在OJ系统中,可复用的功能需求和非功能需求从实现方式上分为三类。第一类需要对接现有系统实现,比如需要将学校在用的OA、教务管理两套系统中的学生信息与课程信息同步到OJ系统中,我们通过访问OA、教务管理的开发商网站,联系开发商,取得了相关接口调用的SDK。第二类是常见信息系统中共同具备的用户管理、角色权限管理、日志记录、内容维护、消息中心等基本功能,我们通过取用单位过往项目开发中所积累的构件库中的相应构件(例如RBAC权限管理框架)来实现。第三类需要集成第三方的软件来实现,例如微服务注册中心、API消息路由网关、负载均衡机制、程序评测时调用的编译器、代码抄袭判定的文本比对功能等,无需另行开发,我们使用了Spring Cloud中的Eureka框架来作为微服务注册中心,Nginx反向代理来作为负载均衡机制,GCC、JDK等作为编译器,针对文本比对功能,我们使用了GitHub上的开源程序。此外我们还根据OJ系统的使用场景,重新开发了一些功能构件,以支撑本系统特定的用户需求。

2. 构件开发

  构件的优势体现在其粗粒度的重用性,因此为最大限度保证构件的可重用性和重用力度,保持其高内聚、低耦合的特性,我们在开发中用到了一些经典的设计模式,例如装饰器模式、策略模式、工厂模式等。在题库构件中,存放了全部的试题数据,包括题目介绍、测试用例等公共内容,同一试题在自由练习、实验作业、考试、比赛等不同使用场景下,需要增加不同的扩展功能。我们使用了装饰器模式,来给试题对象动态添加不同职责。在评测机构件中,需要同时支持对C语言、C++、Java、PHP、Python等多种常用编程语言程序的评测,不同语言对应的编译与执行方法存在较大差异。我们使用了策略模式,将不同语言的编译和执行方法封装起来,并使它们可以相互替换。在数据库连接构件中,因不同的业务需求,需要同时支持不同种类型的数据库,包括MySQL、Oracle、SQL Server三种。我们使用了工厂方法模式,有效解决了不同数据库类型对软件程序的影响,具有很好的可扩展性。这样的设计有效地体现了构件的优势。

3. 构件组装

  OJ系统中不同的业务类型,需要采用不同的构件组装方式。在本系统的开发过程中,我们用到了以下三种方式。首先是同步消息方式,以考试功能为例,用户进入考试时,考试构件需要核验考生信息,然后调取题库中的试题信息组成试卷,在此过程中,考试构件使用同步方式,依次向考生构件、题库构件请求数据,等待返回结果后再加工、组合,提供给调用者。其次是异步消息方式,以程序代码的在线提交评测功能为例,评测机构件对代码的编译、执行、判分过程,相比于其他构件的数据处理过程,属于耗时操作,这时如果采取同步方式,将引起调用者阻塞,严重影响了用户体验,甚至出现雪崩效应。因此采用了异步消息队列,代码提交后写入消息队列立即返回原程序执行,待评测机评测完成后再异步显示评测结果。最后是基于工作流的方式,能够通过图形化的界面,动态编排系统构件之间的交互和依赖关系,灵活改变多个构件之间协同工作的顺序,通过简单构件的组合,以实现复杂功能的定制。

总结

  系统自2019年10月正式上线已运行一年有余,在学校的日常教学考试和竞赛培训中投入使用,截至目前已有3000以上的学生用户、评测了70000条以上的程序代码,获得了单位同事领导和学校教师们的一致好评。
  实践证明,OJ系统项目能够顺利上线,并且稳定运行,与系统采用了基于构件的开发方式密不可分。经过这次构件化开发的方法和实施的效果后,我体会到了软件元素重用对开发过程的重要价值。从软件开发的方式看,由机器语言、汇编语言,到面向过程开发、面向对象开发,再到现在基于构件、面向服务的软件开发,软件元素在两个维度上呈现进化趋势:内部功能越来越强大、全面,对外的接口越来越简单、标准。最终各领域软件可在一个统一标准下无缝组装,届时面向协作的软件开发、基于职能的软件开发等新技术都将出现,上层应用功能的实现也将变得异常简单,计算机软件将会无所不在,数字化生活、智能地球等现在还处于概念阶段的事物,将会走进现实。这个目标值得我们每一位软件从业人员为之努力奋斗。

论基于构件的软件开发相关推荐

  1. 软考高级系统架构设计师系列论文七:论基于构件的软件开发

    软考高级系统架构设计师系列论文七:论基于构件的软件开发 一.摘要 二.正文 三.总结 一.摘要 本文以我主持开发的某公司生产经营管理系统为例,探讨了基于构件的软件开发问题.该系统是一个集原料采购.生产 ...

  2. 系统架构师论文-论基于构件的软件开发(测井资料处理与解释集成软件)

    论基于构件的软件开发 –测井资料处理与解释集成软件 [摘要] 去年初,单位承担了新立的"测井资料处理与解释集成软件"项目,目的是集成目前国内零敬的测井解释方法,我有幸参加该项目,并 ...

  3. 软考高级系统架构设计师系列论文三十六:论基于构件的软件开发

    软考高级系统架构设计师系列论文三十六:论基于构件的软件开发 一.摘要 二.正文 三.总结 一.摘要 本文以我主持的某商业银行交易监控分析系统项目为实例,探讨了作为开发方公司基于构件技术开发项目碰到的问 ...

  4. 系统架构师论文-论基于构件的软件开发

    论基于构件的软件开发 [摘要] 本文以我主持的某商业银行交易监控分析系统项目为实例,探讨了作为开发方公司基于构件技术开发项目碰到的问题以及解决的方法.文章首先解释了基于构件技术开发软件的基本概念,认为 ...

  5. 【软考 系统架构设计师】原创必过论文④ 论基于构件的软件开发

    >>回到总目录<< 文章目录 论基于构件的软件开发 范文 摘要 正文 论基于构件的软件开发 软件系统的复杂性不断增长.软件人员的频繁流动和软件行业的激烈竞争迫使软件企业提高软件 ...

  6. 软件工程导论08-基于构件的软件开发

    基于构件的软件开发 长期以来的软件开发状况 多数软件都是针对某个具体的应用系统从头进行开发的. 导致:出现了大量的同类软件重复开发,造成大量人力.财力的浪费,而且软件的质量也不高. 对比:汽车工业的生 ...

  7. 《基于模型的软件开发》——1.2 结构化开发

    本节书摘来自华章计算机<基于模型的软件开发>一书中的第1章,第1.2节,作者:[美]H. S.莱曼(H. S. Lahman)著, 更多章节内容可以访问云栖社区"华章计算机&qu ...

  8. 温故知新(一)——基于 RTOS 的软件开发理论

    目录 前言 1 RTOS的特点 2 任务设计 2.1 任务的特性 2.2 任务划分的方法 2.2.1 设备依赖性任务 2.2.2 关键任务 2.2.3 紧迫任务 2.2.4 数据处理任务 2.2.5 ...

  9. 【基于Android聊天软件开发-哔哩哔哩】 https://b23.tv/109B82i

    [基于Android聊天软件开发-哔哩哔哩] https://b23.tv/109B82i https://b23.tv/109B82i Android聊天软件开发(仿QQ) 要求: Android ...

  10. 认识基于中间件的软件开发方法

    与传统的软件开发方式相比,基于中间件的软件开发方法有什么突破呢? 一.体系结构 软件体系结构代表了系统公共的高层次的抽象,它是系统设计成败的关键.其设计的核心是能否使用重复的体系模式.传统的应用系统体 ...

最新文章

  1. 《数据竞赛白皮书·下篇》发布,开源办好一场数据竞赛的实践方法论
  2. 【VC基础】3、配置参数文件
  3. APPENDIX B-菜单计划和食谱-Pagano博士的七天菜单计划样例-未完待续
  4. Qt工作笔记-对QItemDelegate自定义委托的理解
  5. CLR via C# 读书笔记 5-5 预留大内存
  6. android 系统(143)---Android实现App版本自动更新
  7. 习题3.10 汉诺塔的非递归实现 (25分)
  8. 用CMarkup类创建xml文件的方法
  9. POJ 3581:Sequence(后缀数组)
  10. android gridview 选择变色 再点击还原 并支持多选。记录贴 01
  11. 张至顺道长羽化登仙+说修行(道经每日清修)
  12. 全息投影特效制作详解
  13. logstash grok mysql_日志分析logstash插件-grok详解
  14. 如何储存图片方法jpg格式png格式#ps教程#ps抠图
  15. 【空间统计之六】点数据集方向分布统计(标准差椭圆)
  16. debian改网卡速率_Debian网卡设置
  17. win10+gtx1050+tensorflow+cuda8.0+cudnn5.1配置踩到的坑(回忆)
  18. suse12搭建ntp服务器
  19. SD卡修复,无媒体,读不出来
  20. 教你实现windowsxp自动登录大法(转)

热门文章

  1. ARCGIS小工具(插件)免费版_自取_GIS插件_工具_其他
  2. 阿里云P10技术专家褚霸:我是一个程序员
  3. 简易网页音乐播放器制作
  4. 苹果手表计算机功能键,认识Mac的功能键,最值得你记住的苹果电脑快捷键列表...
  5. SLA打印机之打印机介绍
  6. pytorch的变量variable
  7. android 快速开发,GitHub - limedroid/XDroid: 轻量级Android快速开发框架
  8. 轻松搞明白:软切换和硬切换的区别
  9. python环境调用OpenModelica模型并进行仿真计算
  10. 怎么用python实现序列比对_生信学习笔记——Python+Mafft实现批量化多序列比对