




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程概述及学习要求内容课程的时代背景软件定义一切的时代当前软件系统的特点课程特点和要求课程特点和学习要求教学目标和授课内容课程的考核方式课程考核要求和方法课程教学的支撑平台1.1软件不可或缺信息系统组成微电子芯片、计算机硬件与体系结构、计算机网络与通讯计算(速度)、存储(容量)、传输(带宽和速率)计算机软件处理数据、实现功能、提供服务软件所扮演的角色不可或缺、核心和关键的要素没有软件的手机和PC会怎样?如果你的计算机、手机和Pad上没有软件会怎样?软件的关键性和重要性软件对一个国家的全球竞争力、创新和国家安全至关重要世界运行在软件之上,软件是国家的关键基础设施软件赋能能力创新软件是安全攸关系统的脊梁软件是生态系统重要组成部分软件定义一切时代的特点地位:无处不在的软件形态:人机物三元融合的软件复杂:大规模、持续演化的软件开发数量越来越多交付速度越来越快质量要求越来越高运维能力越来越强渗透到社会经济文化生活各行各业,从工业生产到国防科技,从衣食住行到娱乐软件渗透到了哪些领域?是否有领域没有软件?软件的持续创新和积累至今人们已经开发出了数量庞大的软件系统操作系统Linux、Ubuntu、麒麟、鸿蒙、OpenEuler等数据库系统MySQL、PostgreSQL、MongoDB、Redis等开发平台Eclipse、Junit、SonarQube、Kubernetes等人工智能Tensorflow、Opencv、Caffe、Deeplearning4j等网络安全Nmap、curityOnion、Suricata、Bro等开源50年积累的代码总量约100TB,而人类5000年文字藏书总量约23TB软件是一种创新形式和赋能工具社会交流软件推动了各个行业的变革和发展,改变了世界软件体现了基于数字化技术解决问题的方式支付方式火车购票软件带来的深刻影响交通出行12306、携程等代替排队等候资料查询G和B代替调研在线教育MOOC和腾讯会议代替课堂教学网上购物淘宝、京东代替逛商场办公方式Word和PPT代替手写和幻灯片支付手段微信、支付宝代替纸币和支票软件给你的学习、生活和娱乐等带来什么样的影响?没有软件你会怎样?软件是军事装备和信息系统的核心信息化武器装备中的嵌入式软件业务信息支援系统中的软件各类参战人员作战部队指挥控制系统中的软件大型复杂软件系统部署在各类平台和终端提供多样化功能和服务连接装备和人员形成体系和能力成为关键基础设施越来越多的软件表现为人-机-物共生的一类复杂系统示例:机器人是一类由软件驱动的物理系统机器人是由软件驱动、由软件来定义的软件密集型信息物理系统负责底层管理和控制、高层规划和决策、全局适应和优化等软件是整个系统的核心和关键高层任务软件系统物理和社会环境决策产生决策产生规划和行为作用与影响感知与反馈闭环自主机器人系统控制运行物理设备示例:软件在武器装备中的地位和作用80%的装备功能由软件来实现软件密集型系统的数量不断增长计算机软件在美军装备中的比例以及军用软件的规模DavidF.Rico,PMP,ACP,CSM,Lean&AgileSoftwareMethods,2012.由软件实现的装备功能软件的规模(百万代码行)思考和讨论个人计算机你的设备安装了哪些软件?它们提供哪些功能和服务?手机iPad哪些行业和领域需要软件?它们提供哪些功能和服务?1.2软件形态变化不是单一孤立的系统,而是系统之系统诸多系统联盟和组合而成不是纯粹技术系统,而是社会技术系统社会、信息、物理等要素共存不是同构系统,而是异构多样系统联盟要素异构,客观存在,也是必然不是封闭系统,而是动态适应和持续演化系统要素、关系、联盟等持续变化,边界不明确IanSommerville,etc.,Large-ScaleComplexITSystem,CommunicationofACM,2012.1.3软件的规模和复杂性日趋增长社会保障信息系统金融系统智能交通控制指挥控制系统智能电力系统大规模协作系统功能数据实体代码量接入人员连接设备运行进程……示例:软件规模的快速增长1960sF-117飞机程序10万行1970sP-3C飞机程序50万行1980sB-1B飞机程序100万行E-3A飞机程序100万行空间站发射程序约8000万行现代化作战飞机约2500万行宙斯盾驱逐舰约需5000万行现代汽车中有数亿行的软件越来越多的设备由软件加以定义,如软件定义的汽车软件变得越来越复杂软件环境的复杂性软件表现为人机物三元融合复杂系统软件需要与物理环境、社会环境等进行持续交互软件所在的环境开放、动态、不确定和不可预测软件规模带来的复杂性大量的软件实体、数据、交互、进程等带来的复杂性软件需求的复杂性软件需求不可知、不确定和动态变化软件运维的复杂性软件需要在使用的同时持续演化12306软件、智能交通控制软件等就是一类复杂软件系统,具有上述复杂性特征大规模和复杂软件带来的挑战?用户方、学术界、产业界共同面临的问题和挑战!软件复杂性表现在哪些方面?如何来开发复杂的软件系统?需要哪些方面的知识和技能?1.4美国对软件及软件工程的认识从软件到软件工程超大规模软件未来软件挑战,CMU,2006软件定义战争,CSIS,
2022构筑未来软件工程CMU,2021软件现代化战略DoD,2022认识到软件变得越来越重要、越来越复杂和难控,需要寻求有效的软件工程美国政府对软件的认识美国总统信息技术顾问委员会软件是最迫切的需求,因为:对软件的需求:超出了我们现有的开发能力;现有软件是脆弱、不可靠,且很难进行设计、测试、维护和升级所以:软件是当前社会核心产品与核心问题应绝对优先发展超大规模软件未来软件挑战,CMU,2006美国军方对软件的认识美国军方向软件工程学术和产业界提出的问题我们的士兵依赖软件并且将越来越多的依赖软件军队的成功依赖于软件以及软件企业我们需要更好的工具来满足未来的挑战,我们的政府和企业并没有致力于如何让事情做的快速和廉价如果我们不能解决今天的问题,我们如何能可靠地构建未来可能具有十亿行代码的系统面临具有十亿行代码规模的软件,这样的系统今天的技术力所不能及超大规模软件未来软件挑战,CMU,2006国际上软件工程研究重要机构-CMUSEI软件工程领域的著名研究机构软件生产线、体系结构、管理等美军软件工程方面的智囊军方资助,解决美军提出的问题为军方提供战略性和前瞻性的解决方案许多著名的研究成果E.g.,软件生产线E.g.,能力成熟度模型CMM应该引起我们的高度关注已有成果、关注问题、前瞻研究URL:CMUSEI开展的工作关注CMU的研究与实践学术界对计算机软件的认识计算机软件是一种逻辑产品,有其特殊性不同于硬件,非常复杂、成本高、风险大、维护困难与很多的内在规律和逻辑尚不清楚缺乏相关的理论,基于统计分析的结果软件开发是一项由多人参与、基于智力的协同活动多人、智力、协同采用工程化的方法和途径似乎是有效的不能采用硬件开发的方法不能采用手工、作坊式的方法过程和步骤、工具、产品、评审和检查、质量、进度…工业界对计算机软件的认识计算机软件的开发效率、速度、质量远远无法满足用户日益增长的需求需求多变性、易变性、不明确性成本难以估算、质量达不到要求、进度无法按期推进也称“软件危机”在不断摸索中进行总结、在持续实践中发现规律实践是检验真理的唯一标准实践先于理论,寻求最佳实践不同的企业有不同的手段和实践1.4成功的软件项目和产品比尔盖茨的Microsoft系列产品
从Windows到Office系列,从VisualStudio到CopilotXInstagram(abbr.Instanttelegram)软件:基于移动设备的照片和视频共享、在线服务软件成立于2010年10月,2012年被Facebook以10亿美元收购社交软件微信、TikTok、QQ、Facebook、Twitter等失败的软件项目失败软件项目的特点没能按时交付成本超出预算软件缺陷太多,无法按照当初的设计正常运行产品没有得到市场认可,没有人使用失败软件项目的案例美国银行规划研发信托软件系统,项目预算2千万美元,开发时长9个月;进度超出2年,投入6千万美元,仍然未能投入使用英国银行软件系统的建设,投入大量的经费,最终软件项目失败,导致整个银行倒闭,成为软件开发的“烂尾楼”思考和讨论现代软件有何复杂性和形态特点?如何理解人机物三元融合系统?如何来开发软件系统?软件开发难在哪里?软件工程课程就是要回答这些问题!内容课程的时代背景软件渗透性和复杂性当前软件系统的特点课程学习要求课程特点和学习要求教学目标和授课内容课程考核要求课程考核要求和方法课程教学的支撑平台*2.1软件工程是一门特殊课程一门课程一个专业一个学科“软件工程”这门课程有其特殊性!(1970s)(1980s)(2011)软件工程既是一门课程,也是一项专业,还是一个学科被赋予更多内涵和知识的课程具有“工程”性质和要求课程“实践性要求”非常高的课程面向“复杂问题求解”的课程适合多种能力和素质培养课程不同于“离散数学”、“编译原理”、“操作系统”等课程软件工程课程的特点内容“虚”和“广”思想性和抽象教学内容广域和交叉的课程知识发展“快”和“新”产业界开发实践进步快多维度、全方位的发展要求“实”和“高”能用工程方法开发软件解决工程开发复杂问题计算机科学、管理学、数学等多学科知识实践经验的总结软件开发的实践教学是课程教学的关键实践要体现工程化的要求和水平各种新技术、新方法、新工具不断出现如DevOps、智能化开发、Copilot等软件工程课程教学的难点难讲透(教)知识点内容抽象难以讲清和讲明教学成效难保证,课程教学需要适应课程特点,解决教学难点难学好(学)理解知识点不易知其所以然困难做更难(做)开展软件开发难达成工程要求难不仅要知其然,更要知其所以然不仅要讲授是什么(What),更要诠释为什么(Why),如何做(How)不仅要做的出,更要做的好(质量)软件工程课程学习的重点“工程”意味着要开展实践,并且要采用”工程化”方法系统化、规范化和可量化“工程”意味着要实践对象要有规模,要关注质量等因素上规模、一定复杂度、高质量“实践教学”是课程教学的重点,也是上好这门课的关键教学不能停留于知识讲授,不能纸上谈兵学好课程的关键在于做好课程实践2.2软件工程课程教学的目标和定位理解软件开发问题,软件工程思想、原则和方法运用运用软件工程过程、方法和工具来开发分析分解、组合、建模、设计和验证软件评价评估评价软件质量、评估方法等创新运用软件工具来解决实际问题BLOOM模型培养学生多方面的能力和素质达成高阶的教学目标如何学好这门课:课堂要认真听讲交流与讨论内容基于教材但不局限于教材内容组织不完全对应于教材认真听讲勤于思考参与讨论经常提问如何学好这门课:做好课程实践是关键讲授分析实践讲评讲授分析实践讲评讲授分析实践讲评讲授分析实践讲评讲授-老师实践-学生实践、实践、再实践!课程实践将贯穿于课程学习的全过程如何学好这门课:持续投入、独立解决和不断总结利用课内和课后时间,持续实践投入开发、讨论、演示、总结、汇报、撰写参加和贡献务必自己动手去做务必独立解决问题务必开展交流合作务必做到精益求精务必要不断的总结要收获必须要投入如何学好这门课:追求卓越持续改进讲评考评持续改进、提升质量精益求精、追求卓越汇报和讲评根据老师的讲评不断改进你的实践成果,提升实践的质量如何学好这门课:不断进行总结、交流和讨论在知士荟上进行提问、回答、评论、分享和总结/#/spaces/146要求每周1篇技术博客,要在学习社区进行交流和分享看看往届学生的学习心得、体会、感受和成果2.3对学生提出的基本要求课上要听懂知其然且知其所以然下课做的了运用所学知识来开展软件开发实践课后有交流问题、回答、评论、经验投入有保障投入足够的时间,迎难而上,勇气和信心目标要远大工程能力:规范、文档、设计、质量、……职业素养:严谨、专业、交流、讨论、……2.4本课程将让你学到…认识软件系统及复杂性特点理解软件系统开发面临挑战领会软件工程的思想和方法掌握软件开发的技术和工具基于团队来组织和开发软件独立解决软件开发中的问题获得和积累软件开发的经验……2.5课程教学目标深入理解和认识“软件”概念及其特点系统掌握软件工程的原则、方法和思想熟练运用各种技术、工具以及管理手段持续开展软件开发实践以积累相关经验深刻认识软件工程方法及开发存在问题不断培养多方面的能力和软件工程素养2.6课程教学组织与实践安排软件工程(48学时)软件体系结构与设计(48学时)春季学期秋季学期贯穿二个学期和二门课程的综合实践课程教学内容程序及质量保证方法软件及其特点软件工程概述软件过程模型敏捷软件开发方法群体化软件开发方法需求分析基础获取软件需求面向对象软件需求分析软件设计基础软件体系结构设计用户界面设计软件详细设计编写程序代码软件测试软件部署软件维护与演化软件项目管理完成二项课程综合实践阅读、分析和维护开源软件(10000行代码)2人组成一个实践团队秋季学期《软件工程》课程开发上规模、有创意和高质量的软件(10000行代码)4人组成一个实践团队春季学期《软件体系结构与设计》课程课程综合实践1:阅读、分析和维护开源软件学习对象:高质量开源软件学习内容:高质量代码,高水平设计、开发技能和经验学习方式:阅读、标注、分析、模仿和应用以维护软件学习开源代码,要求学以致用!阅读标注分析维护设计模型代码标注质量报告高质量代码高质量开源代码往届学生的实践情况
每个结对平均最多最少每周课外投入(小时/周)10204编写代码量(行)5001000200复用开源代码(行)120020000添加注释量(行)8002000200Git提交次数(次)142153131小米便签开源代码代码总量:8887LOC;文件数:39注释总数:5627LOC;
注释行数:
2706;
注释率:30.4%问题数量:
1654LOC涵盖从需求分析、软件设计、编码实现、软件测试等方面的实践内容及要求课程综合实践2:软件开发实践任务开发有创意、上规模和高质量软件要求创意、规模、质量、综合、系统结果模型文档代码演示等创意性问题、需求、解决方法系统性集成物理系统、遗留系统、开源软件规模性>15000行程序代码综合性运用多种技术、语言、工具和平台高质量模型、文档和代码等实践成果质量高实践教学是关键,要为“软件工程”这把牛刀准备相适应的“实践内容”往届学生的实践示例(1/3)创意性:问题及基于机器人的解决方法集成性:机器人、APP及4个开源软件系统综合性:3种语言及多种技术与平台规模性:66000(开源50000+)LOC分布性:部署在手机、机器人、服务器等高质量:模型、代码和文档质量优SE+PL+Robotics+网络传输+模式识别等
往届学生的实践示例(2/3)开发技术机器人操作系统ROS、AndroidAPP开发、网络编程程序语言Java、Python、C开发工具AndroidStudio、SonarQube、Junit开源社区CSDN、GitHub、StackOverflow、OSChina开源软件Roconremocon科大讯飞智能语音包OpenNILinphone软件文档UML模型程序代码宣传彩页演示视频总结PPT技术博客创意构思+知识学习+开发实践+解决问题+成果展示+语言/文字表达
iCAN国际创新创业大赛总决赛一等奖中国高校计算机大赛全国总决赛一等奖泛珠三角计算机作品赛总决赛金银奖网络技术挑战总决赛一等二等奖珠三角计算机作品赛总决赛最佳实用奖计算机作品赛湖南省赛区特等和一等奖长沙市创新创业比赛二等奖……开发许多有创意的课程实践作品,近5年获30项竞赛奖项往届学生的实践示例(3/3)内容课程时代背景软件渗透性和复杂性当前软件系统的特点课程学习要求课程特点和学习要求教学目标和授课内容课程考核要求课程考核要求和方法课程教学的支撑平台*3.1课程考核形式考核组成成绩比例考核方式课程考试50%开卷考试,个人综合实践40%团队+个人技术博客5%个人交流讨论5%个人课程试卷开题设计原则不考“死记硬背”的内容(what)概念是什么,方法是什么如软件有何特点要考对知识点的理解、认识和运用为什么(Why)、如何(How)需要建立在课程实践的基础之上课程实践考评原则课程实践的质量(文档、模型和代码)课程实践的规模(如功能点、代码量)课程实践的创意(如新增功能的创意)泛读代码代码标注质量代码开源维护10%20%30%40%平时成绩考评原则每周提交技术博客的质量(5%)在知士荟平台上参与交流和讨论情况(5%)3.2课后实践要求知士荟平台:交流和讨论/#/spaces/146,交流、讨论、分享等每周一篇技术博客,加入到本班级的学习群组EduCoder平台:实训和实践/paths/1944,线上实训,相关内容讲完后头歌上实践课堂及作业,创建和关联项目、协同开发、提交作业课程学习的教学资源
课件、视频、试卷、案例等内容往届学生对课程的评价学习过程很艰难,学完之后成果超预期,学到了许多超出书本、真正有用的东西,受益匪浅、收获很大,有成就感大学学习期间收获最大的一门课程,我们本科阶段最有挑战性最有收获的课程软工这门课真正意义上激发了我作为一个计算机专业学生的专业思维。这门课对我来说意义匪浅,不仅让我自己有机会证明自己的能力,同时开拓了我的视野,拓展了我的知识域,让我更加有一名计算机专业学生的样子了。这门课程是切实值得认真学习的一门课程,绝不是简单的代码编写,更多的是提供了一种工程化的思维,我认为这种思维对于指导实践是非常有价值的。这门课程我收获很大,提高了实践能力,锻炼了敢于解决困难的精神。这一年地软件工程课程学习收获还是很大吧,可以说是最精彩的一门课。访问/#/spaces/146/resources,了解往届学生学习心得和收获学生的认识(1/3)软件工程重在“工程”而非“软件”,这就决定了它的本质要求是实践。只有动手实践,即自己写代码、写博客、查资料、读源码,才能把别人的东西转化为自己的理解与经验,真正学进去并为自己所用不能过于害怕实践,一定要放心大胆地去做这一年的磨练全方面、大幅度提高个人的能力水平,这是让一门真正体会到“大学”二字的课程团队协作与按时完成非常重要学生的认识(2/3)学习了这门课我渐渐的改变了自己的编程习惯,按照编程规范写代码,写注释,检测代码质量,我认为这是我从了解编程转变为开始懂编程这门课教会了很多东西,不管是技术上,管理上,还是精神上,我相信在这门课中的学习实践会影响我之后的学习在上课之前就有学长跟我说,在科大学的最有用的一门课就是毛新军教员的软件工程,现在想想确实如此不论遇到多大的困难,都要尽自己最大的努力去克服,只有坚持不懈的努力才能战胜苦难,成就最好的自己学生的认识(3/3)这一年的学习真的是受益匪浅,虽然饱受痛苦,但也在不断地学习中战胜困难,不断成长
一年前,从17级学长那里传出一句话:大三有一门课叫软件工程,一门顶三门经过课程实践一以后,自己对课程的知识才有了一点朦胧的感觉在这一学年的学习中,实践一直是重中之重,也只有通过实践,我们才能深入地把知识吃透。在整个实践过程中,遇到了数不清的困难,每一步都走得很艰难软件工程课程教材毛新军等,软件工程:理论与实践,高等教育出版社,2024年1月,ISBN:978-7-04-061010-9.
101计划核心教材毛新军等,软件工程实践教程:基于开源和群智的方法(第二版),高等教育出版社,ISBN978-7-04-052423-9.2024年10月,101计划核心实践教材主教材实践教材软件工程主教材软件工程:理论与实践,高等教育出版社,ISBN:978-7-04-061010-9,2024年1月.教育部101计划核心教材.内容先进引入新技术新方法新实践连接专业教育与产业实践融合工程范式与群智范式组织科学从程序及其质量保证入手重新组织知识章节和内容由易到难、由具体到抽象诠释深入利用身边软件和思政案例完整深入人机物融合案例模板、模型、文档、代码强化实践设计二类综合性课程实践明确综合实践任务和要求综合性实践具有可操作性软件工程实践教材软件工程实践教程:基于开源和群智的方法,高等教育出版社,2019.8,ISBN978-7-04-052423-9.明确实践要求规模性、系统性、综合性、创意性、高质量二类实践任务阅读、分析和维护开源软件开发有创意、上规模和高质量软件系统完整实践案例小米便签开源软件空巢老人看护软件新颖实践方法学开源、用开源、利用群智有效考评方法考为辅、评为主、以评促改、持续改进3.4往届课程学生实践作品的视频演示无人值守图书馆空巢老人看护系统多无人机联合搜救系统基于增强现实的导航软件Arnavigator基于语音交互的老人看护机器人系统DrivingAssitant……问题和讨论Git使用介绍内容分布式版本管理概述分布式版本控制的基本思想何为Git?Git的基本理念、功能和服务Git使用Git的操作问题提出如何将多人开发的不同代码管理起来程序代码存储代码冲突处理代码版本变更程序代码追踪工作量的统计……需要对代码进行版本控制(RevisionControl)张三李四王五版本控制的重要性版本控制是有效管理程序文档、提高协作效率的重要手段多人协作(横向视角)版本迭代(纵向视角)开发者1开发者2开发者3开发者4项目管理者v1v2v3v4版本控制概念版本控制是对软件制品(程序、文档、数据等)的更改和管理,它是软件配置管理的重要组成部分组织和保护软件制品:源代码和文档实现跨区域、多人的协同开发
记载和追踪一个或者多个文件的历史记录跟踪记录软件开发过程统计软件开发工作量版本控制的二种方式集中式与
分布式集中式版本控制集中式版本控制版本库集中存放在中央服务器之中开发前先从中央服务器取得最新版本开发完再把自己的工作推送给中央服务器中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完后再放回图书馆特点高度集中、难以有效支持协同开发典型系统:CVS、SVN、ClearCase版本库开发者开发者开发者分布式版本管理分布式版本控制有一个中央仓库开发前在本机上拷贝一个完整软件仓库开发完把自己工作提交到本地仓库中需要同步给协作者时再递交到中央仓库版本库分步存储于各协作者电脑中优点不依赖中央服务器、可在本地开发、有效支持协同开发典型系统:Git中央仓库本地仓库本地仓库本地仓库本地仓库版本控制的发展RCS(1982)CVS(1990),SVN(2001)Git(2005)BitKeeper(1999)何为Git?Git是一种分布式的版本控制系统支持存储代码、跟踪修订历史记录、合并代码更改等,可在需要时恢复较早的代码版本,可实现团队的高效协作LinusTorvalds研制和开发为了帮助管理Linux内核开发而开发的一个开源的版本控制软件成为行业标准Git是目前世界上最先进的分布式版本控制LinusTorvaldsGit采用分部式管理模式分布式版本管理本地拥有完整版本库,支持离线操作有效应对了中心服务器崩溃带来的影响有效支持代码审查、持续集成等开发活动Git的基本功能
版本管理管理各种源代码和文档、切换不同版本等
过程管理跟踪开发过程、查阅历史记录等代码评审可视化评估代码质量,决断是否合并代码等;扩展功能企业DevOps自动化、代码Issue联动管理;……
Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Git的仓库构成远端仓库本地端仓库本地仓库暂存区工作区Remote:远程仓库Git版本管理的基本概念仓库(Repository)软件所有文件的完整修订历史版本(Revision)代码库的编号方案,如Tag0.1分支(Branch)对代码库并行修改时的代码库副本如master,develop,branch1,…提交(Commit)对分支的一次修订下拉(Pull)将远程的一个分支读取并保存到本地分支推送(Push)将本地分支代码发送到远程某个分支合并(Merge)将对相同文件在不同分支的修改合并到一个分支中冲突(Conflict)当两个分支中存在对同一文件的不同修改,并试图合并这两个分支时,就会发生冲突Tag0.1Tag0.2Tag1.0Commit#ab892nCommit#lm2671spullpushmaster和develop是标准分支,master是缺省的主分支Git各项操作本地仓库暂存区工作区Git分支的理念和操作使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线masterbranch2branch1createmergecommitcreatemergecommit分支本地操作分支本地操作Git的使用分支管理流程:初始化过程(组长)1创建版本库(默认master分支),push初始代码2创建远程develop分支分支管理流程:基本过程(组员)3克隆代码,切换到develop分支4新建自己的分支my_branch(各组员分支名不同)5修改my-branch:正常开发,修改完成后将修改的内容推送到远程my_branch分支合并分支:基本过程(组长)6切换develop分支,pull代码7合并组员的分支(my_branch)到develop分支8解决冲突,然后将合并好的develop分支推送到远程9将develop分支合并到master分支(这一步可以按实际需求,master上一般为稳定版本)组长组员创建版本库push代码创建develop分支创建自己分支masterdevelop自己分支自己分支创建自己分支提交、push代码提交、push代码合并分支解决冲突合并分支合并developPull最新代码Pull最新代码1.创建本地版本库命令:gitinit在执行完成gitinit命令后,Git仓库会生成一个.git目录,该目录包含了资源的所有元数据使用当前目录作为git仓库,直接在当前目录进行初始化使用指定目录作为git仓库,在初始化命令之后加上指定目录路径,如gitinitnewrepo2.克隆远程版本库gitclone<repo><directory>将远程仓库中的代码拷贝项目到本地仓库其中repo表示远程仓库目录,directory代表本地仓库目录3.在暂存区添加/撤销文件gitadd
[file1][file2]...or
[dir] 将文件添加到暂存区gitcheckout[file1]撤销不需要的修改 4.提交修改到本地仓库gitcommit-m[message]gitcommit[file1][file2]...-m[message]将暂存区内容添加到本地仓库中gitlog查看commit提交日志5.添加远程版本库gitremoteadd“远程仓库名”“远程仓库地址”添加远程版本库6.推送本地内容到远程仓库
gitpush远程仓库名本地分支名远程分支名将你的修改推送到远程仓库,便于测试或者和团队中其他人协作推送本地内容时,会将所有未推送至远程仓库的内容,都提交到远程仓库7.拉取远程分支到本地gitpull远程主机名远程分支名:本地分支名在团队协作中,如果别人对项目做了修改,而你需要将这些修改合并到你本地时,需要使用gitpull命令gitpull远程主机名远程分支名:本地分支名-f如果远程分支和本地分支对同一内容做了修改,这将导致将远程分支修改合并到本地分支时会发生冲突可以选择直接强制拉取,使用远程分支的修改,覆盖本地分支的修改。强制拉取需要用到-f参数
Git关键操作的总结本地仓库远程仓库pushpullcommitcommitswitch合并请求TortoiseGit软件工具一种开源的Git版本控制系统客户端软件采用Windows图形化界面,使用Git变得更加简便和易于操作安装访问TortoiseGit官网()供阅读的相关技术博客git入门/#/spaces/146/resources-docs/6423实操视频知士荟->学习空间:软件工程课程教改及培训【教师】/#/spaces/402/resources/21291拓展阅读【技术博客干货】一篇文章让你入门git/#/spaces/146/resources-docs/6423相关书籍课后作业和课程实训访问/paths/1944完成第一章“软件工程概述”的实训闯关任务小结Git是一个分布式版本控制软件工具提供了仓库、分支、Pull/Push等基本功能和服务Github、头歌等提供了Git的功能和服务软件项目的分布式版本管理TortoiseGit是一个支持Git的可视化软件工具为开发者提供友好的界面操作问题和讨论程序及其质量保证和分析方法软件工程内容程序及质量要求程序及其内部和外部质量程序质量保证方法编码规范、设计方法、代码重用、结对编程程序质量的分析方法人工审查、自动化分析、代码测试编写程序需要解决的问题需要工程化的方法支持配套教材毛新军等,软件工程:理论与实践,高等教育出版社,ISBN:978-7-04-061010-9,2024年1月,教育部101计划核心教材毛新军等,软件工程实践教程-基于开源和群智的方法,高等教育出版社,ISBN978-7-04-052423-9,2019年8月1.1何为程序?程序(Program)是由程序设计语言所描述的、能为计算机所理解和处理的一组语句序列用程序设计语言(ProgrammingLanguage)来描述的如Java、C、C++、Python程序严格遵循程序设计语言的各项语法和语义规定确保程序代码能为程序设计语言的编译器所理解,进而编译生成相应的可运行代码程序代码可表现为二种形式源代码(SourceCode):用程序设计语言所描述的代码可执行代码(ExecutableCode):可执行的二进制或中间码程序代码示例用Java语言编写的代码1.2程序组成-语句程序中的语句声明、定义、控制、计算等实现特定的功能用程序设计语言来描述计算机可以理解可编译成二进制代码代码在计算机上可执行程序组成-模块由诸多相互交互的模块组成包(Package)类(Class)方法(Method)每个模块实现特定功能示例:小米便签中的模块170个文件、471个方法程序模块包示例:小米便签开源软件模块结构1.3程序如何编写?编写程序要实现的功能采用编程语言逻辑思考推理程序设计经验程序代码逻辑思考、认知和推理的过程你是如何编写程序的?程序的编码、编译、部署和运行编码编译部署与运行源代码可执行代码编程语言编译器运行平台基于用户需求产生运行结果如何保证质量问题?!确保程序质量是编码的首要工作!产品的质量问题外在:用户直接可以感觉到的使用用户:圆滑、手感好、美观、不死机、操作便捷内在:用户无法直接感触到的维修人员:易于维护、易于更换内在外在1.4程序的利益相关者及其质量要求用户程序的运行展示功能和性能满足和实现用户的需求程序员编写、阅读和维护程序发现和修改程序中的缺陷程序编码编译用户程序员程序使用编写和维护对程序的不同质量需求正确性高效性可靠性友好性……用户角度程序员角度可理解易修改可维护可重用……用户和程序员会对程序质量分别提出什么样的要求?为什么?使用编写和维护程序质量的内在和外在体现外在质量(ExternalQuality)
–用户的视角对外可展示,用户可直接感触到、所关心的使用流畅性、响应速度、界面美观、操作简易性、运行可靠性等正确性、友好性、可靠性、易用性、高效性等内在质量(InternalQuality)
–程序员的视角体现在程序的内在方面,程序员可以感触到的、所关心的易于理解、结构清晰、易于修改、可重用好等可理解性、可维护性、可扩展性、可重用性等你是否对你或他人编写的程序有质量方面的要求和抱怨?示例:从用户和程序员视角看程序质量这段代码如何?易于理解吗?易于修改吗?结构清晰吗?……运行效果如何?可靠吗?易于操作和使用吗?……用户角度程序员角度讨论:程序的质量这段程序写的如何?正确吗?易于理解吗?结构清晰吗?易于修改吗?……思考和讨论你觉得什么样的程序是高质量?你编写程序时是否考虑了质量问题?你所写的程序质量如何?如何才能编写出高质量的程序?内容程序及质量要求程序及其内部和外部质量程序质量保证方法编码规范、设计方法、代码重用、结对编程程序质量的分析方法人工审查、自动化分析、代码测试编写程序需要解决的问题需要工程化的方法支持2.1程序质量的语法和语义体现代码风格规范-语法语法和结构层次明确如何来规范程序的书写表现为是否易于阅读和理解代码设计规范-语义语义和内涵层次明确如何来组织和封装程序语句表现为良好的结构和易于重用程序质量保证方法遵循编码风格采用程序设计方法开展代码重用进行结对编程2.2遵循编码风格良好的编程行为在编码过程中,程序员对代码符号进行良好的组织、合理的命名、提供必要的注释,那么将可增强代码的可读性和可理解性,进而提高代码的可维护性和可重用性,提升代码的内部质量何为编码风格程序员在编码时要遵循特定的样式及要求,以规范程序员的编程行为以及所产生程序代码的样式示例:遵循编码风格没有遵循编码风格遵循编码风格编写代码的基本原则易读,一看就懂理解代码的内涵和意图望文生义的符号、缩进和括号、代码注释,遵循编码风格简明,减低复杂度避繁就简、不用goto语句、减少嵌套层数、简单算法易改,便于维护便于修改程序代码、增加新的代码封装、参数化、模块化、隐藏、常元无二义,不产生歧义不要让人产生误解编码风格-代码布局缩进,用好Tab键用括号来表示优先级断行处的{}if(condition){ DoSomething();}else{ DoSomething();}一行至多只一条语句不要在一行定义多个变量编码风格-代码组织按一定次序来说明数据按字母顺序说明对象尽可能避免使用嵌套结构采用统一的缩进规则单入口单出口编码风格-命名规范采用有意义、一目了然的命名方式变/常/函数/方法/类/包一看就懂,望文生义无意义的命名i,j,x,y有意义的命名szPathvPrintName()bReturn编码风格-命名命名通则使用英文单词或缩写,不要使用拼音望文知义原则,含义清晰、明确命名不要过长尽量使用全称,少用缩写不规范的命名DaYinWenJian与PrintFile编码风格-命名命名和大小写类/类型/变量:用名词和名词短语,所有单词第一个字母大写函数/方法:动词或者动词短语,第一个单词小写,随后单词第一个字母大写示例:Member,ProductInfo,getName(),setName(),renderPage()不规范的命名变量:print;方法:Print()编码风格-代码注释帮助理解程序注释要说明程序:(1)做什么;(2)为什么这么做;(3)注意事项无需解释程序如何做注解位置类头、函数/函数头、关键语句块头、关键语句尾有效、必要、简洁的注释太少和过多均不可取注释要可理解、准确、无二义随代码的修改而修改编码风格示例注释命名布局结构编码风格的相关书籍C++编程风格Java编程风格代码整洁之道推崇CleanCode不同程序设计语言有不同的编码风格要求讨论:编码风格这二段代码风格如何?哪些做的好,还存在哪些问题?你编写代码时注意风格了吗?2.3采用程序设计方法语句设计模块化设计高内聚度、低耦合度原则代码设计规范-语句设计单入口单出口少用goto语句加强对异常处理分析和验证输入参数正确性,如名字不为空,年龄大于0少于150执行结果处理,设置必要断言来分析
如p=AllocateNewSpace(); Assert(p!=NULL); if(p!=NULL){ …… }处理异常语句Try{…}catch(Exceptione){…}将更多的时间、精力和代码放在处理异常上代码设计规范-模块化设计模块是逻辑上相对独立、具有良定义接口的编程单位模块可表现为函数、过程、方法、类、程序包等将程序代码封装为一个个独立的模块代码设计规范-高内聚度模块内各要素紧密相关,仅实现单一功能如果模块内多个要素关系不密切,需分解产生多个模块ABCABCD分解模块D内部包含若干关系松散的要素经过分解得到若干松耦合的模块代码设计规范-低耦合度模块间的关系应设计的非常松散如果多个模块间的关系非常密切,可将这些模块合并为一个模块BACABC经过合并得到内聚度高的模块D若干关系紧密的模块示例:采用程序设计方法语句设计模块化高内聚度低耦合度2.4代码重用何为代码重用在编写代码过程中,充分利用已有和现成的代码,并将其集成到程序之中,从而来实现程序功能代码重用有何好处由于被重用的代码经过多次反复的使用,代码质量得到充分检验,因而代码重用不仅可提高编程效率,而且还可有效提升程序质量为什么代码重用可以提高代码的质量?示例:函数、类和软构件重用C函数库MFC类库(MicrosoftFoundationClasses)Java软件开发包机器人操作系统(ROS)的节点软构件MFC类库示例:代码片段重用寻找他人实现某些子功能的代码片段可在StackOverflow上寻找到有价值的代码片段,并加以重用开源代码重用到Github中找到粗粒度的代码开源几万、甚至几十万的程序代码重用开源代码来实现粗粒度的功能完成诸如数据库管理、图像识别、语音分析等功能思考和讨论你在编程时是否有软件重用?你开展了那些方面和粒度的软件重用?2.5结对编程(Pair-Programming)两位程序员(或智能体)坐在同一工作台前一起开发软件一人扮演“领航员”角色,负责具体编写工作,如写程序一人扮演“观察者”角色,负责观察行为及结果,如看程序,发现问题二者相互讨论,共同完成编程任务大模型时代基于智能体的结对编程软件开发智能体软件工程师人机协同开发Copilot等基于智能化的编程助手(如CopilotX),人机协同编程会成为趋势越来越多程序员使用CopilotX等智能化工具进行软件开发,AIPair编程正在成为新的编程范式,帮助程序员编代码、单元测试、调试、写文档等个体开发的局限性个体知识和技能的局限性没有人无所不能有专长,但很难做到面面俱到总会有不懂、不会的个体开发行为的局限性人总是会犯错误的,错误很难避免老虎也有打旽的时候,注意力不集中就会犯错误很难看到或者看清自身的错误软件开发是集体性/群体性行为团队开发多人参与、具有共同目的、明确任务分工合作开发相互支持、互相配合、共同解决问题群体开发利用大众的力量、借助大众的智慧和成果抛弃个人主义/英雄主义单枪匹马难成大事、单干/蛮干容易出事现实世界的结对示例驾驶员作战员驾驶员领航员如何实现结对编程职责明确一人写设计文档、编写程序和单元测试等等一人审阅文档、复审程序代码、考虑单元测试的覆盖率、是否需要重构、解决具体的技术问题等等互换角色不要连续超过工作1小时,提高效率主动参与开展讨论、解决问题、做出贡献编程行为及其特点快速完成尽快得到可运行软件系统、尽早交付给用户、快速应对需求变化多种技能工具和环境程序设计语言业务领域知识编码规范和设计规范质量要求正确性、可读性、可维护性等编程包袱:效率和质量问题结对写程序任务编写程序代码方式一人写一人复审规范性、正确性、可读性等讨论改进与提高如增加注释、更改名称等结对编程中的代码复审结对编程是一个不断“复审”代码的过程每一行代码都被二双眼睛看过,被二个脑子思考过代码随着改动不断地被复审每个人的一举一动(编码行为)不断地被另一个人审查,确保过程和活动置于监督之下,迫使认真工作,防止随意行为促进“频繁”交流,提高个人能力和素养结对写文档任务撰写计文档方式一人写一人复审规范、正确、合理性等讨论改进和完善如文档格式、语言表达、图表、错别字结对做测试任务软件测试方式运行测试用例,收集测试结果一人写一人复审和帮助完整性、代表性、适当性等讨论完善和提升结对编程带来的好处提高程序质量提供更好的设计质量和代码质量合作解决问题能力强,1+1>2提升开发效率开发人员更加信心有效地避免了闭门造车更易于发现问题和纠正问题促进学习交流有效的学习,做中学效果更好相互学习和分享经验更好应对人员流动,一个走了另一个人可以替换上结对编程可以获得更高的投入/产出比思考和讨论如何在阅读、分析和维护开源软件实践中应用结对编程的方法?有何实践经验可供分享?内容程序及质量要求程序及其内部和外部质量程序质量保证方法编码规范、设计方法、代码重用、结对编程程序质量的分析方法人工审查、自动化分析、代码测试编写程序需要解决的问题需要工程化的方法支持3.1程序代码中潜在的质量问题质量问题编写不合理
–没有遵循编码规范设计不合理
–没有遵循设计规范代码有错误–代码编写的不正确
原因受软件开发人员经验和水平的限制人可能会犯错误,人为引入错误
你编写的代码是否存在问题?存在哪些方面的问题?代码质量分析的常用方法人工审查(CodeReview)方法自动化分析方法(AutomatedAnalysis)程序测试(Test)方法3.2人工审查代码方法描述阅读和理解代码发现缺陷和问题提出改进的建议方法特点人工审查效率低难以发现一些深层次问题难以全面地进行系统分析人工审查些什么?代码是否符合编程规范代码中是否存在缺陷逻辑错误,“+”写成“-”算法错误,不够优化、边界条件没有处理好潜在错误,当前修改导致以前修复的错误重现从质量的角度哪些代码需要改进包括内部质量和外部质量读别人编写的高质量代码能让你受益匪浅读低质量的代码能让你非常痛苦人工审查-谁负责审查自我复审,效果不一定好同伴复审,常用方法
结对编程团队复审,团队成员参加3.3自动化工具审查-代码静态分析由计算机软件来自动完成代码审查无需运行被测代码,仅通过分析或检查程序的语法、结构、过程、接口等来检查程序30%-
70%的代码缺陷可通过静态分析发现分析什么找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等程序遵循编码规范的程度特点快速定位、有效发现隐藏的错误和缺陷自动化代码分析工具SonarQubeCheckStyleFindBugsPMDJtestCodeArtsCheck(华为)SonarQube概述基于Web、用于管理程序代码质量的代码静态分析工具可以插件的形式集成到众多的软件开发环境(如Eclipse)支持二十多种程序设计语言代码的质量分析SonarQube可分析的质量问题是否违反编码规则是否存在静态常规缺陷模块、方法、类的复杂度是否过高是否存在重复的代码代码的注释是否恰当和充分统计和分析代码的单元测试覆盖率判断软件体系结构设计是否合理SonarQube分析发现的问题类别Bug(错误)中等影响如参数不够Vulnerability(脆弱点)影响大如漏洞CodeSmell(代码异味)影响小如风格SonarQube分析报告代码审查后要做的工作理解发现和指出的问题修改和更正有问题代码对于无法很快更正的错误,要把错误的信息记录下来,以便适当的时候能够更正3.4软件测试技术程序本质上是对数据的处理设计数据(测试用例)
运行测试用例(程序来处理数据)
判断运行结果(是否符合预期结果)运行代码程序代码等设计测试数据结果评价预期结果软件缺陷为软件测试而设计的数据称为测试用例(TestCase)测试用例实际结果软件测试的目的和任务2356417缺陷尽可能多找出软件中缺陷软件系统软件缺陷可能隐藏的比较深,难以发现软件测试示例一个加法器程序功能:给定二个数字,将其相加,然后输出设计测试数据<1,2,3><-1,1,0><0,0,0>运行测试程序输入数据,查看运行结果,判断是否与预期结果一致如果不一致就意味着有错误思考和讨论在你的编程实践中,你是采用何种方式来检查代码质量、发现代码问题的?内容程序及质量要求程序及其内部和外部质量程序质量保证方法编码规范、设计方法、代码重用、结对编程程序质量的分析方法人工审查、自动化分析、代码测试编写程序需要解决的问题需要工程化的方法支持程序编写面临的挑战!程序功能从何而来?谁以及如何来确定软件功能?软件规模很大怎么办?500LOCvs1MLOC软件功能变化如何改写代码?在哪里改、如何改?如何保证程序质量?能否想到代码的质量问题,如何保证光靠脑子思考能解决程序编写的问题吗?思考和讨论如何明确功能、划分模块?如何编写代码、确保质量?对于规模较大应用能行吗?面临什么样的困难和问题?需要寻找系统化、工程化的方法指导!
软件工程拓展阅读软件科学与工程-学科发展战略,梅宏等著,高等教育出版社,2021.人月神话(40周年中文纪念版,Frederick,P.Brooks[美],清华大学出版社,2015.课后作业和课程实训访问/paths/1944完成第二章“从程序到软件”的实训闯关任务本章知识图谱小结程序的多种质量要求外在和内在、语法和语义确保代码质量的方法编码规范、设计方法、代码重用、结对编程分析、发现和审查代码人工审查、静态分析、程序测试学会编写高质量的程序代码需要借助行之有效的、系统化方法的指导课后的实践任务开展基于结对的代码分析和维护实践阅读和掌握编码风格Java、C/C++编程风格,要求学以致用熟练掌握SonarQube工具安装和使用,分析开源软件的代码质量开展课程实践阅读、理解和分析开源软件的代码质量提交代码的质量分析报告思考:如何编写高质量的程序代码综合实践一任务:选取或指定待阅读、分析和维护的开源软件。方法访问Github、码云Gitee、SourceForge等开源软件托管平台,从中检索到符合上述要求的开源软件,下载或克隆开源软件代码,阅读开源软件的相关文档来安装、部署和运行开源软件。以二人为一组、采用结对方式来开展本综合实践要求所选取或指定的开源软件要求功能易于理解、代码质量高、规模适中(5000-20000行代码量),也可以直接指定“MiNote”便签管理开源软件作为阅读、分析和维护的对象。结果:获得开源软件源代码,并可运行和操作该开源软件。综合实践二任务:查看和分析开源软件方法访问Github、SourceForge、Gitee等开源软件托管平台或Apache、Eclipse等开源软件基金会平台,从中检索自己感兴趣的开源软件,阅读相关的软件文档,下载安装开源软件要求结合自己的兴趣,查看有那些开源软件,分析这些软件的功能和定位、存在的缺陷和不足结果:掌握开源软件托管平台的使用方法,大致了解感兴趣的开源软件情况思考和讨论你是否意识到程序质量的重要性?你认为高质量的程序应该是什么样的?怎样才能得到高质量的程序代码?问题和讨论软件及其特点软件工程内容软件软件的概念、特点、组成及生命周期开源软件开源软件实践,托管平台和社区,开源许可证软件质量软件质量要素及模型软件特征的变化地位、运行环境、形态、复杂性建设狗窝和建设大厦的区别建设狗窝的特点简单质量要求不高一个人就可完成建设大厦的特点复杂质量高要求很高需要团队合作才能完成简单、小规模程序规模在万行代码量复杂、大规模程序数十万行以上代码量1.1从程序到软件-工程开发的启发应用(如火车票购买、酒店预订、网上购物)编写程序通过一个步骤就将程序写出来不现实了解需求设计图纸进场施工采用工程化的方法来解决工程开发的问题编写出程序需要经历诸多的步骤应用(如火车票购买、酒店预订、网上购物)分析软件需求设计软件系统编写程序代码文档数据代码不可或缺相互依存要编写出高质量的程序需要循序渐进地开展工作运行维护程序1.2何为软件?软件(Software)是指在计算机系统的支持下,能够完成特定功能与性能的程序(Program)、数据(Data)和相关文档(Document)
文档数据代码++从开发的角度看软件的构成软件制品(SoftwareArtifact)何为文档?记录软件开发活动和阶段性成果、软件配置及变更的阐述性资料定义和理解软件记录软件开发成果辅助不同人员间的交流有哪些方面的文档软件需求文档–记录需求软件设计文档–记录设计软件测试文档–记录测试软件用户手册–记录使用……阐述性资料为什么需要文档?原因软件开发牵涉多方面的工作,需要记录下来任何事都记在脑子里,记不住,不便于保存任何事都放在脑子里,理不清,不便于分析任何事都存在脑子里,讲不明,不便于交流编写文档目的阐述清楚:内容、逻辑性、条理性发现问题:完整、一致、矛盾开展交流:便于各种人员的交流促进管理:管理软件开发成果编码活动的成果记录为程序代码其他活动的成果记录为软件文档示例:软件设计文档空巢老人智能看护系统设计文档何为数据?数据是程序的加工处理对象和结果需要处理哪些数据如何来获得这些数据如何来表示这些数据如何来存储和检索数据如何来传输数据网上商城中的手机及其数据数据示例数据形式用户、订单、交易、日志数据数据处理表示、获取、存储、检索、分析软件运行的本质就是对数据的处理,有些数据是用户提供的,有些数据是软件产生的思考和讨论:12306软件的数据哪些数据是由用户提供的?以用户注册和购票为例哪些数据是由软件产生的?以用户注册和购票为例没有数据软件会怎么样?从开发者的角度看软件的构成可执行部分不可执行部分文档数据数据文档程序构成软件的三类成分作用不同,但都不可或缺1.3软件概念给我们的启示软件程序软件涉及更多制品这些制品间有关联、相互依赖开发软件编写程序软件开发需要做更多事情对软件提出更高的要求软件开发的再认识开发具有一定规模和复杂性的软件系统与编写一个简单的程序不一样建设简单平房vs建设高楼大厦挖一条小沟vs建设一条南水北调渠道软件的规模和复杂性意味着要采用行之有效的方法—工程方法何为工程化方法?开发软件vs编写程序1.4软件生命周期万物均有生命周期(Lifecycle)人:婴儿、幼儿、儿童、少年、…树:发芽、育苗、结果、枯萎、死亡、….青蛙:受精卵、蝌蚪、去掉尾巴的青蛙…软件生命周期(SoftwareLifecycle)软件从提出开发开始到最终灭亡所经历的时期不同阶段具有不同的特征©CopyrightXinjunMao198软件生命周期(1/2)从提出开发开始到开发出系统、运行维护以及最终退役的全过程软件的生命周期(2/2)每个阶段会产生不同的软件制品What软件需求是什么How如何构造出软件How编写程序代码软件是否缺陷部署软件运行软件的本质软件的目的性:服务于客户或用户,满足他们的要求软件的组成性:程序+文档+数据软件的系统性:软件是一类系统,有诸多相关联的要素软件的驻留性:依赖于计算系统的软硬件设施来支撑运行示例:软件的驻留性和系统性1.5软件特点逻辑性逻辑产品,思维活动(而非物理活动)的结果、不会磨损和老化设计开发是设计开发而成的,不是生产制造而成的易变性需求经常变、难以把控,影响软件的制品即开发过程复杂性规模大:代码行、模块、介入人员、进程、数据等数量非常大运行复杂:状态很难追踪和复现缺陷的隐蔽性缺陷隐藏在逻辑代码中,不像硬件系统那样直观显现,很难被人们所发现和排除讨论:对比软件和硬件对比软件和硬件的特点表现形式开发范式需求变化复杂性系统缺陷软件系统硬件系统vs军用软件的特殊性运行环境更复杂和多样与物理系统(如飞机)紧密联系在一起对实时性和质量(如可靠性)提出更高要求对自身防护能力(如安全性)提出更高要求需具备更强的灵活性、适应性和健壮性军用软件:导弹中的飞行控制软件、指挥信息系统、后勤保障软件等1.6软件的分类应用软件面向特定应用领域的专用软件。它们针对相关行业和领域的特定问题,为其提供基于计算的新颖解决方案。示例:淘宝、12306、携程、微信、QQ等软件系统软件对计算机资源进行管理,为应用软件的运行提供基础设施和服务的一类软件。从计算服务的视角,系统软件介于计算机硬件和应用软件之间。示例:操作系统、数据库管理系统、编译软件、软件中间件等支撑软件辅助软件开发和运维,帮助开发人员完成软件开发和维护工作的一类软件示例:SonarQube、VisualStudio、Eclipse等软件的分类类别服务对象软件的功能发挥的作用应用软件行业和领域应用的用户为特定行业和领域问题解决提供基于软件解决方案,创新应用领域的问题解决模式提供更为便捷、快速、高效的服务系统软件各类应用软件为应用软件运行和维护提供基础设施和服务,如加载、通讯、互操作、管理等作为应用软件的运行环境支撑软件软件开发者和维护者为软件系统的开发和维护提供自动和半自动的支持提高软件开发效率和质量讨论:你所知道的各类软件系统系统软件应用软件支撑软件内容软件软件的概念、特点、组成及生命周期开源软件开源软件实践,托管平台和社区,开源许可证软件质量软件质量要素及模型当前软件特征的变化地位、运行环境、形态、复杂性*2.1闭源软件何为闭源软件软件代码不对用户开放的一类软件,购买软件时只提供可运行软件或服务,没有提供源代码以许可证(License)的方式授权用户使用软件闭源软件带来的问题无法掌握软件内部实现情况(如是否存在安全漏洞和恶意代码),也无法对软件进行修改和完善,极大影响了开发者的创新自由示例微软的Windows、Office软件,典型企业:微软、IBM、Oracle等2.2开源软件何为开源软件一种源代码可以自由获取和传播的计算机软件,其拥有者通过开源许可证赋予被许可人对软件进行使用、修改和传播海量、高质量和有影响力的开源软件操作系统Linux、Ubuntu、麒麟、鸿蒙、OpenEuler等数据库系统MySQL、PostgreSQL、MongoDB、Redis等开发平台Eclipse、Junit、SonarQube、Kubernetes等人工智能Tensorflow、Opencv、Caffe、Deeplearning4j等网络安全Nmap、curityOnion、Suricata、Bro等……你能枚举出其他的开源软件吗?开源软件正逐步替代闭源软件服务器操作系统领域Linux、FreeBSD等==》Unix桌面操作系统领域Linux、麒麟等==》Windows操作系统数据库领域MySql、PostgreSQL等==》Oracle、DB2浏览器领域Chrome、Firefox等==》IE、开发工具领域Eclipse、Sonar等
==》VisualStudio开源软件与闭源软件的对决你能枚举出其他方向的开源软件与闭源软件的对决快速增长的开源软件数量Github上的开源软件仓库()2023年Github上有3亿多的开源软件仓库开源软件带来的好处源代码可自由传播免费使用降低成本激发创作者的热情快速开发搭建系统开源软件的推动者政府组织NASA开源200多软件项目,美国和印度等政府鼓励采用开源软件我国政府将开源列入十四五国民经济和社会发展五年规划纲要开源组织Apache基金会、Linux基金会、Eclipse基金会、OpenSourceInitiative开放原子开源基金会(
)IT企业Google、Microsoft、IBM、Oracle等国外企业以及华为、腾讯、阿里巴巴、百度、浪潮、联想等国内企业软件开发者LinusTorvalds,Github上有6500多万的程序员Apache软件基金会组织特点成立于1999年的非盈利性组织所管理的开源软件项目都遵循Apache许可证组织构成管理有约2.27亿行代码和350多个开源软件项目拥有800多名基金会成员,4万多代码贡献者,48万个体代表性开源软件ApacheHTTPServer、Derby、Hadoop、Lucene、Tomcat、Ant、Maven等Google主导的开源软件项目移动操作系统Android机器学习系统TensorFlow容器集群管理系统Kubernetes网站前端开发工具集MDLWeb前端框架Angular基于Chrome浏览器的开发环境SparkJava常用库Guava、Java编译器Traceur…..开放原子开源基金会
2020年6月在北京成立,由阿里巴巴、百度、华为、浪潮、360、腾讯等多家龙头科技企业联合发起开源项目孵化平台科技公益性服务机构打造开源开放框架搭建国际开源社区典型的开源项目OpenHarmony(华为)TencentOSTiny(腾讯)……
/思考和讨论开源软件会带来什么好处?为什么那么多的企业和个人关注和参与开源软件?开源软件是如何开发出来的?2.3开源软件托管平台托管服务创建软件仓库支持协同开发软件质量保证……
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新能源产业股权代持风险防范与化解协议
- 智能化住宅小区安防监控系统建设与全面维护协议
- 数据安全事件应急响应责任保证合同
- 节庆活动市场代理补充协议
- 智能电网新能源汽车充电站建设与运维服务协议
- 户外活动专用临时舞台租赁与活动效果评估服务协议
- 购买商品混凝土协议书
- 旅行社与景区旅游基础设施共建合作协议
- 联营转租赁协议书
- 招投标代理协议书
- 实测实量方案交底
- 银行客户经理之情绪管理
- 生产良率系统统计表
- 用TOC理论提高生产制造的竞争力课件
- SketchUp (草图大师) 基础培训PPT课件
- 生命线安装方案
- 代理机构服务质量考核评价表
- 电厂保安人员管理制度
- 2018年泸州市生物中考试题含答案
- ge核磁共振机房专用精密空调机技术要求
- 新干县人民医院血液透析治疗患者告知书
评论
0/150
提交评论