提出问题
快速通读教材《构建之法》,并参照提问模板,提出5个问题。
1.复杂性、易变性是什么意思?怎么样的编程作业才算加入了软件特性?
我看了这一段文字
软件工程的编程作业,不仅仅是程序,而是要加入软件工程的要素(复杂性、易变性和其他),有价值的软件工程的作业必须要触及者两个基本要素!
——引用于教材第2章-2.4 实践—设计有实际意义的软件工程作业
通过这段话,我直接想要提出的问题是:复杂性、易变性是什么意思?怎么样的编程作业才算加入了软件特性?
接着看了书上关于软件特殊性的介绍(复杂性、易变性等是软件特性),它是这么介绍复杂性和易变性的:
复杂性——软件可以说是人类创造的最复杂的系统类型。大型软件(操作系统、办公软件、搜索引擎)有超过百万行的源代码,上万个不同的文件。……软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长。而理解运用这些复杂性的人并没有太大的变化。
易变性——软件看上去很容易修改,修改软件比修改硬件容易多了。……但是与此同时,正确地修改软件是一件很困难的事情。
——引用自教材第1章-1.2.1 软件的特殊性
在2.4接着阅读了例举的两个软件设计原则以及各方面的扩展举例,
我们以两个软件设计原则为例,第一,单一职责原则(Single Responsibility Principle,SRP)指出
一个模块(类)应该只有一个导致它变化的原因,一个模块应该完全对某个功能负责。
……
另一个重要的软件设计原则是开放-封闭原则(Open-Close Principle,OCP):
软件实体应该是可以扩展的,同时是不可修改的。
……
那么如何引入学生能承受的复杂度呢?如何引入“变化的轴线”呢?我们可以把简单的程序从几个维度逐步扩展,增加复杂度,引入不同的需求,提高需求的易变性,在这个过程中,锻炼程序员对各种软件设计原则、软件工程原则的理解和应用,软件的适应性也得到加强。
……
——引用于教材第2章-2.4 实践—设计有实际意义的软件工程作业
大概了解如何使软件编程加入软件特性,简单来说就是,根据需求把简单的程序从几个维度逐步扩展。
除此之外,我还想要知道的是:
(1)有“超过百万行的源代码,上万个不同的文件”这样特征的软件就具有复杂性了吗?还有没有什么其它的特点呢?
(2)易变性是指软件本身是容易修改的,因为软件是由众多的源代码构建出来的,源代码容易被改变?(好像有点傻)
2.RUP是什么?
当我看到教材第5章-5.3.4 Rational Unified Process 统一流程(RUP)时,最直接的,我想问RUP是什么?
书上说
从瀑布模型开始的各种模型都有一个共同点:重计划,重事先设计,重文档表达。这一类的方法中集大成者要算Rational统一流程(Rational Unified Process,RUP)。RUP把软件开发的各个阶段整合在一个统一的框架里。
——引用于教材第5章-5.3.4 Rational Unified Process 统一流程(RUP)
教材还介绍了RUP的工作流和开发过程,但我没有看到有对RUP含义的介绍,于是我查了度娘,
RUP(Rational Unified Process),统一软件开发过程,统一软件过程是一个面向对象且基于网络的程序开发方法论。
瑞理统一过程(RUP)是Rational软件公司(Rational公司被IBM并购)创造的软件工程方法。RUP描述了如何有效地利用商业的可靠的方法开发和部署软件,是一种重量级过程(也被称作厚方法学),因此特别适用于大型软件团队开发大型项目。
——引用于RUP_百度百科
这使我知道了RUP是一种软件工程方法,它可以为所有方面和层次的程序开发提供指导方针,模版以及事例支持;RUP的本质是一个流程定义平台,是一个流程框架。
我还想知道的是:迭代开发具有很多优点,但怎样的开发项目不适合采用迭代式开发呢?
3.敏捷开发与RUP有什么不同之处?
教材第6章全章都在写敏捷,
在软件工程的语境里,“敏捷流程”是一系列价值观和方法论的集合。
——引用于教材第6章-6.1 敏捷的流程简介
但是,敏捷到底是什么?同上面一个问题一样,我对这样的术语还是不理解(专业知识的底子到底还是太差了,求推荐相关的基础书目),网络资源就这样派上了用场……
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
——引用于敏捷开发_360百科
再贴上一张图
可是,看着这个概念,再对比一下跟RUP的含义,我有点懵:敏捷开发与RUP有什么关系?他们的不同之处在哪里?
看着书上的介绍,他们看起来好像不同,但是看着网络上找到的含义,他们又都是迭代式开发?!我只好带着疑问搜索。
RUP是一个通用的过程框架,适用于大型软件的开发。它的突出特点是用例驱动,以架构为中心,采用迭代和增量的开发策略。从软件工程的观点看,RUP的核心体现在:迭代的开发软件,管理需求,使用基于组件的架构,为软件可视化建模,验证软件质量,控制对软件的变更。RUP为软件开发团队提供指南,文档模板和工具,但同时缺乏灵活性(必须严格遵循9个工作流,而敏捷开发则是“能用则用,能不用则不用”)。
敏捷是轻量级的软件开发方法,适用于小型软件的开发,它非常注重了解团队每个成员的优点,缺点。发挥队员的长处,帮助队员克服弱点,互相帮助,共同成长,最终整个团队的能力得到提高。但其缺点是不正规,没有粒度较细的需求文档以及客户反馈的意见文档。也没有具体一点的体系结构。
——引用于RUP与敏捷开发之比较
它们的异同希望老师上课会涉及到。
4.我们在开发软件的时候,要用到哪些测试方法?什么阶段用什么方法?
第13章 软件测试 介绍了许许多多的测试方法,也介绍了它们的分类、功能以及用法(这里不一一列出),但我想知道的是:这些方法都要在我们进行软件测试时采用吗?那什么阶段应该用什么方法呢?
通过搜集资料,我了解到软件开发过程中常用的软件测试方法有:单元测试[程序内部数据测试],集成测试[单元测试之后],效能测试[单元测试,整合测试之后],回归测试[发生修改之后重新测试],验收测试[软件测试过程的最后一步]。(好像漏了些什么)并且这一章让我想到第一节课老师布置作业时说到的团队作业中的Alpha阶段、Beta阶段,当时我还不知道什么意思,现在看来,Alpha阶段应该指的是α测试阶段?!Beta阶段阶段应该指的是β测试阶段?!
Alpha测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由该系统的程序员或测试员完成。
β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。
(看到第15章,发现不太对)
Alpha阶段是指集成了主要功能的第一个试用版本。
Beta阶段是指功能基本完备,稳定性较Alpha版本高,用户可以在实际工作中小范围使用。
——引用第15章-15.1 从代码完成到发布
5.为什么领域外更有创新者?
这个问题来自第16章 IT行业的创新-16.1.5 迷思之五:要成为领域的专家,才能创新。这一小小节中列出了两个不是领域内专家却获得创新成果的人的例子。小节结尾提出的问题引发了我的兴趣,根据作者的推荐,我参考了《像外行一样思考,像专家一样实践:科研成功之道》这本书(没看完)。
我的一点点想法:某领域的专家一般会用这个领域的思维模式对他接触的事情进行思考,而领域外的人看待某个领域的这个事情是多方面的,几乎不受局限性的,提出任何自己想到的想法,在这个领域中可谓是创新。
问题暂提到这里,希望大家批评指正。(感觉自己的问题有点怪怪的,还没有学会提好问题)
附加题
请将问题提交至豆瓣:https://book.douban.com/subject/27069503/, 并在博客中给出链接
在豆瓣页面的最下方 “读书笔记” 那里发言, 《构建之法》的作者会亲自答复问题
(看了读书笔记的内容,但自己还没有想到哪些可以提出的好问题。~. ~)