软件工程第一次作业:博客初体验
软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
在现代社会中,软件应用于多个方面。典型的软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,如工业、农业、银行、航空、政府部门等。这些应用促进了经济和社会的发展,也提高了工作效率和生活效率 。
二、软件工程是什么
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。
软件工程和下列的学科相关:计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、软件人体工学、系统工程、工业设计和用户体验设计。
人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到- 一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。那么,软件开发流程有哪些呢?请看本书第5章“团队和流程”中的详细介绍。
光有各种流程的思想是不够的,我们还要有一系列的工具来保证这此思想能够在实践中有效率地运作。软件工具有很多:有工程师自行开发的工具,有软件团队独有的工具,也有许多公开的软件工具,例如编译工具、源代码管理工具、源代码编辑工具;也有一些软件工具系统, 例如Microsoft Visual Studio、GitHub、 Eclipse、 ClearCase 和ClearQuest,等等。
三、软件工程的特点
1. 复杂性(Complexity )
软件可以说是人类创造的最复杂的系统类型。大型软件(操作系统、办公软件、搜索引擎)有超过百万行的源代码,上万个不同的文件。而软件工程师的肉眼通常一次只能看到30 -80 行源代码(相当于显示器的一屏),他们的智力、记忆力和常人差不多,在过去的几十年中并没有大的提高。软件的各个模块之间有各种显生或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长。而理解运用这些复杂性的人并没有太大的变化。2. 不可见性( Invisibility )
软件工程师能直接看见源代码,但是源代码不是软件本身。软件以机器码的形式高速运行,还可能在几个CPU核上同时运行,工程师是“看”不到自己的源代码如何具体地在用户的机器上被执行的。商用软件出现了错误,工程师可以看到程序在出错的一瞬间留下的一些痕迹(错误代号、大致的目标代码位置、错误信息),但是几乎无法完整重现到底程序出现了什么问题。当工程师回过头来看源代码时,它们还是安静地排列在屏幕上。
3.易变性(Change ability )
软件看上去很容易修改,修改软件比修改硬件容易多了。人们自然地期待软件能在下面两种情况下“改变”: a)让软件做新的事情b)让软件适应新的硬件。但是与此同时,正确地修改软件是件很困难的事情”。
4. 服从性(Conformity )
软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求(例如银行利率的变化)。
5.非连续性( Discontinuity)
人们比较容易理解连续的系统:增加输人,就能看到相应输出的增加。但是许多软件系统却没有这样的特性,有时输人上很小的变化,会引起输出上极大的变化。
四、计算机专业术语
1、软件=程序+软件工程2、软架构架(Software architecture)2、软件设计及实现( Software Design and Implementation)3、源代码管理( Source Code Control )4、配置管理( Software Confguration Management)6、质量保障( Quality Assurance)7、需求分析( Requirement Analysis)8、程序理解( Program Comprehension)9、软件维护(Software Maintenance)10、服务运营(Service Operation)11、生命周期(oftware Lute Cydle, SLC)12、软件项目的管理( Project Management )13、用户体验( User Experience )14、国际化和本地化( Globalization & Localization )15、计算机科学( Computer Science)16、计算理论 ( Theoretical Computing )17、信息和编码理论( Information and Coding Theory )18、算法和数据结构( Algorithm and Data Structure)19、形式化方法( Formal Methods )20、程序设计语言 (Programming Language )21、计算机体系结构( Computer Architecture )22、计算机体系结构( Computer Architecture)23、并行计算和分布式系统(Conuren, Pal and Dstributed System)24、实时系统和嵌人式系统( Real Time and Embedded System )25、操作系统(Operating System)26、计算机网络( Networking)27、科学计算(Scientific Computing)28、安全和密码学 (Security and Cryptography )29、人工智能( Artificial Intelligence )30、模式识别(PatternRecognition)31、机器学习( Machine Learning)32、数据挖掘( Data Mining)33、信息提取( Information Retrieval)34、计算机图形学(ComputerGraphics)35、计算机视觉(ComputerVision)36、多媒体( Multimedia )37、数据库和大规模数据处理( Database and Large Scale Data Processing )38、万维网( World Wide Web )39、自然语言处理和语音( Natural Language Processing and Speech )40、人机交互( Human Computer Interaction )41、软件工程( Software Engineering )
五、18-2
问题:在一周之内, 快速看完整部教材,列出你不懂的5-10个问题,发布在你的个人博客上。
1、在每个问题后面,请说明哪一章 节的什么内容引起了你的提问,提供些上下文。2、列出一些事例或资料,支持你的提问。3、说说你提问题的原因,你是因为自己的假设和书中的不同而提问,还是不懂书中的术语,还是对推理过程有疑问,还是书中的描述和你的经验(直接或间接经验)相矛盾?
问题1: 软件工程是教不会写程序的人开发软件吗
答:软件工程是教那些不会开发复杂项目的人怎样去编程的学科。当学习一门编程语言时,我们会在学习过程中试着编写一些小程序,这些程序可能只有几十行代码,而当我们编写的程序变得复杂,需要成千上万行代码和复杂的逻辑结构时,我们会发现自己变得又不会编程了;你可能试着像以前一样按自己所想去实现这个复杂的程序,但是当程序的代码越来越多,结构越来越复杂时,会发现出现的错误也越来越多,同时很难去修改,甚至可能会出现不能修复的错误。所以,一个复杂系统的开发,需要一套规范的管理方法去管理这个开发的过程,软件工程就是关于怎样管理开发过程的学科。软件工程会使你知道怎样去做需求分析以了解程序需要实现的功能,怎样去做系统设计以构建程序的框架,怎样测试以验证程序功能的正确等。你可以通过软件工程的指导去实现一个结构清晰、可维护和健壮的程序。软件工程会教给你如何从工程的角度去完成一个项目的开发,如何处理开发过程中的各种问题,如何创造一个完美的软件系统。
问题2: 硬编码是什么
答:硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。 硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,尽管可以使用调试器或十六进制编辑器在内存或磁盘上进行更改。 硬编码的数据通常表示不变的信息,例如物理常量,版本号和静态文本元素。 另一方面,软编码数据对用户输入,HTTP服务器响应或配置文件等任意信息进行编码,并在运行时确定。
问题3 :源代码版本控制是什么
答:这是软件开发中一个十分重要的工程手段,几乎是必须的一个Process(过程)。很多作坊式的开发团队在采用软件工程的一些方法的时候,第一个要进行改进或增加的,往往就是这个过程。对初学者学习而言,建议在开始进行实践小项目的阶段即进行源代码版本控制,因为这在以后的工作中,是一定会用到的。
问题4 :测试人员做什么
答:1 、使用各种测试技术和方法来测试和发现软件中存在的软件缺陷。测试技术主要分为黑盒测试和白盒测试两大类。
其中黑盒测试技术主要有等价类划分法、边界值法、因果图法、状态图法、测试大纲法以及各类典型的软件故障模型等;白盒测试的主要技术有语句覆盖、分支覆盖、判定覆盖、基本路径覆盖等;
2 、测试工作需要贯穿整个软件开发生命周期。完整的软件测试工作包括单元测试、集成测试、确认测试和系统测试工作。
单元测试工作主要在编码阶段完成,由开发人员和软件测试工程师共同完成,其主要依据是详细测试。集成测试的主要工作测试软件模块之间的接口是否正确实现,基本依据是软件体系结构设计。
确认测试和系统测试是在软件开发完成后,验证软件的功能与需求的一致性、验证软件在相应的硬件条件下的系统功能是否满足用户需求,其主要依据是用户需求。
3 、测试人员将发现的缺陷编写成正式的缺陷报告,提交给开发人员进行缺陷的确认和修复。缺陷报告编写最主要的要求是保证缺陷的重现。要求测试人员具有很好的文字表达能力和语言组织能力。
4 、测试人员需要分析软件质量。在测试完成后,测试人员需要根据测试结果来分析软件质量,包括缺陷率、缺陷分布、缺陷修复趋势等。
问题5 :在程序方面为什么需要两个人团队的合作?
答:在软件开发的过程中,团队开发是常见的操作方式。开发软件工程是一项相当复杂和繁琐的过程,需要有非常精密的思维才可以完成。
六、18-3
问题1:这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的?
答:1、对于微信,我是通过手机应用推荐和朋友介绍而了解的,微信的零钱二维码特别方便,支付特别便利。而且朋友圈的可见不可见功能也比较新颖,微信的使用也方便和加强了人与人之间的交流与认识;
2、游戏软件英雄联盟是腾讯开发的一种游戏软件,起初认识也是在网站上,其目的不仅是赢利,而且给大众提供了一个游戏娱乐的平台,当然了,英雄联盟也通过真人秀、做广告的方式让更多人了解和使用,从而由此获益不菲,更是通过比赛等方式,极大地刺激了用户。
3、起初了解金山毒霸是通过网站,或是一些系统推荐,与之前的两项相比,金山毒霸的目的更大地方便了用户而非赢利,它为使用手机及电脑的用户们提供了一个安全地学习、工作及生活环境,更好地保护了用户的利益,着实为用户的安全来考虑。
以上这些软件最基本的是通过广告来赚取费用。
问题二:这些软件是如何到你手里的(邮购,下载, 互相拷贝....你当时上几年级?你对这个软件的感觉如何?
答:基本都是应用推荐下载或者朋友介绍互传的。
问题三:这些软件是如何处理Bug的?又是如何更新版本的?
1、个人觉得微信的BUG挺少的,否则也不会如此地受大众欢迎和热宠,微信的BUG一般都是由用户使用而发现的,由此可以将这些问题提供和反应给官方,从而得到处理,我猜测大概是这个样子的。
2、英雄联盟的BUG一般是用户在游戏娱乐时出现而提交给其开发商,从而使其更加优质化,更加完善完美,该游戏更新的周期是特别短的,其背后的工作人员一直在塑造新的英雄,并对各英雄的技能伤害等等做出改变和调整,给用户新的体验。
3、金山毒霸是系统软件当中功能比较强大的软件,作为保护手机电脑的软件,其BUG 也是相当少的,我本人是几乎没有发现过,金山毒霸的更新也是其开发商完成的,用户通过系统软件升级而得以使用。
问题四:同一类型的软件之间是如何竞争的?
1、我们知道,QQ与微信之间的竞争是相当激烈的,其市场竞争、用户竞争强度此起彼伏,当然了,单枪匹马是站不住脚的,所以它们会与其他诸如:支付宝、借贷宝、饿了么等等商家合作共赢,从而扩大其使用率,达到竞争目的,我觉得微信因为零钱的安全性,微信的发展势头是相当好的,其不断推陈出新的创新理念使其一直立于不败之地;
2、英雄联盟与其他国服游戏的竞争也很大,为此腾讯做了很多广告,而且为其开设了很多联赛、决赛等等,职业联盟选手之间的较量也尤为显得引人注目,与此同时,也有很多帅哥美女开启了联盟直播;英雄联盟的发展也是相当好的,无数的新英雄,无数的皮肤为英雄联盟注入着新鲜活力;
3、金山毒霸与手机管家、鲁大师等等的系统软件之间也有竞争,但金山毒霸的强大功能使其显得略胜一筹;随着软件和计算机事业的发展,越来越多的用户会需要更新的金山毒霸。