软件开发面试技巧_第1页
软件开发面试技巧_第2页
软件开发面试技巧_第3页
软件开发面试技巧_第4页
软件开发面试技巧_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 / 30 软件开发面试技巧 软件开发人员面试问题 想雇到搞软件开发的聪明人可不容易。万一一不小心,就会搞到一堆低能大狒狒。我去年就碰到这种事了。你肯定不想这样吧。听我的,没错。在树上开站立会议门都没有。 问点有难度的问题能帮你把聪明人跟狒狒们分开。我决定把我自己整理出来的软件开发者面试百问发出来,希望能帮到你们的忙。 这个列表涵盖了软件工程知识体系中定义的大多数知识域。当然,如果你只想找出类拔萃的程序员,便只需涉及结构、算法、数据结构、测试这几个话题。如果想雇架构师,也可以只考虑需求 、功能设计、技术设计这些地方。 不过不管你怎么做,都要牢记一点: 这里大多数问题的答案都没有对错之分! 你可以把我的这些问题作为引子,展开讨论。例如下面有个问题是使用静态方法或是单例的缘由。如果那个面试的就此展开长篇大论,那他很有可能是个聪明能干的家伙!如果他一脸茫然的看着你,发出这种声音,很明显这就是只狒狒了。同样,想知道一个数是不是 2的乘方也有很多方法,不过要是面试的人想用 mod 运算符,嗯你知道我的意思吧。 需求 2 / 30 你能给出一些非功能性需求的 例子么? 如果客户需要高性能、使用极其方便而又高度安全,你会给他什么建议? 你能给出一些用来描述需求的不同技术么?它们各自适用于什么场景? 需求跟踪是什么意思?什么是向前追溯,什么是向后追溯? 你喜欢用什么工具跟踪需求? 你怎么看待需求变化?它是好是坏?给出你的理由。 你怎样研究需求,发现需求?有哪些资源可以用到? 你怎么给需求制定优先级?有哪些技术? 在需求过程中,用户、客户、开发人员各自的职责是什么? 你怎么对待不完整或是令人费解的需求? 功能设计 在功能设计中有哪些隐喻?给出几个成功的例子。 如果有些功能的执行时间很长,怎么能让用户感觉不到太长的等待? 如果用户必须要在一个很小的区域内,从一个常常的列表中选择多个条目,你会用什么控件? 3 / 30 有哪些方法可以保证数据项的完整? 建立系统原型有哪些技术? 应用程序怎样建立对用户行为的预期?给出一些例子。 如何入手设计一组数量庞大而又复杂的特性,你能举出一些设计思路吗 ? 有一个列表,其中有 10 个元素,每个元素都有 20个字段可以编辑,你怎样设计这种情况?如果是 1000 个元素,每个元素有 3 个字段呢? 用不同的颜色对一段文本中的文字标记高亮,这种做法有什么问题? Web环境和环境各有些什么限制? 技术设计 什么是低耦合和高聚合?封装原则又是什么意思? 在 Web 应用中,你怎样避免几个人编辑同一段数据所造成的冲突? 你知道设计模式吗?你用过哪些设计模式?在什么场合下用的? 是否了解什么 是无状态的业务层?长事务如何与之相适应? 在搭建一个架构,或是技术设计时,你用过几种图? 在 N 层架构中都有哪些层?它们各自的职责是什4 / 30 么? 有哪些方法可以确保架构中数据的正确和健壮? 面向对象设计和面向组件设计有哪些不同之处? 怎样在数据库中对用户授权、用户配置、权限管理这几项功能建模? 怎样按照等级制度给动物王国建模? 程序设计 你怎样保证你的代码可以处理各种错误事件? 解释一下什么是测试驱动开发,举 出极限编程中的一些原则。 看别人代码的时候,你最关心什么地方? 什么时候使用抽象类,什么时候使用接口? 除了 IDE以外,你还喜欢哪些必不可少的工具? 你怎么保证代码执行速度快,而又不出问题? 什么时候用多态,什么时候用委派? 什么时候使用带有静态成员的类,什么时候使用单例? 你在代码里面怎么提前处理需求的变化?给一些例子。 描述一下实现一段代码的过程,从需求到最终交付。 算法 怎样知道一个数 字是不是 2 的乘方?怎样判断一个5 / 30 数是不是奇数? 怎样找出链表中间的元素? 怎样改变 10,000 个静态 HTML 页面中所有电话号码的格式? 举出一个你所用过的递归的例子。 在散列表和排序后的列表中找一个元素,哪个查找速度最快? 不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么? 怎样把字符串反转?你能不用临时的字符串么? 你愿意用什么类型的语言来编写复杂的算法? 有一个数组,里面是从 1 到 1,000,000 的 整数,其中有一个数字出现了两次,你怎么找出那个重复的数字? 你知道“旅行商问题”么? 数据结构 怎样在内存中实现伦敦地铁的结构? 怎样以最有效的方式在数据库中存储颜色值? 队列和堆栈区别是什么? 用堆或者栈存储数据的区别是什么? 怎样在数据库中存储 N维向量? 你倾向于用哪种类型的语言编写复杂的数据结构? 21的二进制值是什么?十六制值呢? 6 / 30 不管是书、杂志还是网络,你从中所学到的最后一点数据 结构的知识是什么? 怎样在 XML 文档中存储足球比赛结果? 有哪些文本格式可以保存 Unicode字符? 测试 什么是回归测试?怎样知道新引入的变化没有给现有的功能造成破坏? 如果业务层和数据层之间有依赖关系,你该怎么写单元测试? 你用哪些工具测试代码质量? 在产品部署之后,你最常碰到的是什么类型的问题? 什么是代码覆盖率?有多少种代码覆盖率? 功能测试和探索性测试的区别是什么?你怎么对网站进行测试? 测试套件、测试用例、测试计划,这三者之间的区别是什么?你怎么组织测试? 要对电子商务网站做冒烟测试,你会做哪些类型的测试? 客户在验收测试中会发现不满意的东西,怎样减少这种情况的发生? 你去年在测试和质量保证方面学到了哪些东西? 维护 7 / 30 你用哪些工具在维护阶段对产品进行监控? 要想对一个正在产品环境中被使用的产品进行升级,该注意哪些重要事项? 如果在一个庞大的文件中有错误,而代码又无法逐步跟踪,你怎么找出错误? 你怎样保证代码中的变化不会影响 产品的其他部分? 你怎样为产品编写技术文档? 你用过哪些方式保证软件产品容易维护? 怎样在产品运行的环境中进行系 统调试? 什么是负载均衡?负载均衡的方式有哪些种? 为什么在应用程序的生命周期中,软件维护费用所占的份额最高? 再造工程和逆向工程的区别是什么? 配置管理 你知道配置管理中基线的含义么?怎样把项目中某个重要的时刻冻结? 你一般会把哪些东西纳入版本控制? 怎样可以保证团队中每个人都知道谁改变了哪些东西 ? Tag 和 Branch 的区别是什么?在什么情况下该使用tag,什么时候用 branch? 怎样管理技术文档 如产品架构文档 的变化? 你用什么侗剧管理项目中所有数字信息的状态?你最喜欢哪种工具? 8 / 30 如果客户想要对一款已经发布的产品做出变动,你怎么处理? 版本管理和发布管理有什么差异? 对文本文件的变化和二进制文件的变化进行管理,这二者有什么不同? 同时处理多个变更请求,或是同时进行增量开发和维护,这种事情你怎么看待? 项目管理 范围、时间、成本,这三项中哪些是可以由客户控制的? 谁该对项目中所要付出的一切做出估算?谁有权设置最后期限? 减少交付的次数,或是减少每个每个交付中的工作量,你喜欢哪种做法? 你喜欢用哪种图来跟踪项目进度? 迭代和增量的区别在哪里? 试着解释一下风险管理中用到的实践。风险该如何管理? 你喜欢任务分解还是滚动式计划? 你需要哪些东西帮助你判断项目是否符合时间要求,在预算范围内运作? DSDM、 Prince2、 Scrum,这三者之间有哪 些区别? 如果客户想要的东西太多,你在范围和时间上怎样跟他达成一致呢? 9 / 30 一、数据库系统 :数据库基本理论 1.数据库与数据库管理系统有什么区别? 答:数据库是以某种数据模型所确定的数据结构方式来组织和存储数据的。简单来说,数据库是存放数据的仓库,数据库管理系统是用来管理数据库的。 2.是什么数据模型? 答:数据模型是对现实世界数据特征进行抽象的工具,用来描述和处理现实世界中的数据和信息。 数据模型主要由数据结构 、数据操作、数据完整性规则三部分组成。数据结构描述了组成数据库的基本成分,数据操作描述了对数据结构允许执行的操作的集合,数据完整性规则描述了对数据结构所具有的约束和存储规则。 3.什么是关系数据模型? 答:关系数据模型是用二维表的方式来组织、存储和处理数据和信息的。 4.什么是记录和字段? 答:二维表中的每一行称为一条记录,描述了关系中一个具体的个体,在数据文件中是一个记录值。二维表中的每一列是一个字段,描述了关系中的一个特征。 5.什么是主 键? 答:主键是指二维表中的某个列或者某几个列,它10 / 30 们的值能够唯一确定数据表中的一条记录。 6.什么是数据完整性规则? 答:数据完整性是指数据库中存储的数据是有意义的或者说是正确的。关系数据模型中的数据完整性规则是指对二维表的定义和操作过程要遵循的某些约束条件。 数据完整性包括: a).实体完整性,指每张数据表都必须有主键,而且表中不允许存在无主键的记录和主键值相同的记录。 b).参照完整性,指一张数据表中某列的取值受另一张数据表中某列的取值范围的约束,描述了多张 表之间的关联关系。 C).用户定义完整性,指针对某一具体应用定义的数据库约束条件,反应某一具体应用所涉及的数据必须满足应用语义的要求。即限制属性的取值类型和范围,防止属性的值与应用语义矛盾。 7.什么是视图? 答:视图是一种虚拟的表,具有和基本表相同的功能。可以对视图进行增加、修改、查找操作,视图通常是由一个基本表或者多个基本表的行或列的子集组成。对视图的修改不影响基本表。 8.索引的作用及其优缺点? 答:索引是对数据表中一个或者多个列的值进行排序的结构。数 据库的搜索引擎可以利 用它加速对数据的检索。其优点是有助于更快地获取11 / 30 信息。缺点是降低添加、删除和更新数据的速度,同时也增减了数据库的大小。因此,只有经常查询索引列中的数据时,才需要在表中创建索引。不过在大多数情况下,索引所带来的数据检索速度的优势大大超过了它的不足之处。如果应用程序非常频繁地更新数据,或磁盘空间有限,那么最好限制索引的数量。 9.什么是存储过程?用什么来调用存储过程? 答:存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。 存储过程存储在数据库内,可以由应用程序通过一个调用执行。存储过程具有很强的编程能力,在其中允许用户声明变量及定义条件执行语句。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集及返回值。其优点主要包括: A).允许多个模块化的设计:也就是说只需创建一次并将其存储在数据库中,以后在该程序中就可以调用多次。存储过程可由在数据库编程方面有专长的人员创建,可独立于程序源代码而独立修改。 B)执行速度更快:如果某操作需要大量 SQL 代码或需重复执行,存储过程将比 SQL批量代码的执行要快。在创建存储过程时,数据库将对其进行分析和优化,并可在首次12 / 30 执行该存储过程后,直接调用存放在内存中的该存储过程。 C)减少网络流量:在 B/S 或者 C/S 结构的程序中,一个需要数百行 SQL代码的操作由一条执行存储过程的单独语句即可实现,不需要在网络中发送数百行代码。 D)可使用安全机制进行控制:执行存储过程的用户必须具有一定的权限,否则无法调用存储过程。 存储过程的唯一弊端就是移植性差。如果一个项目的数据库操作全部使用存储过程,当 使用的数据库服务器发生改变时,几乎所有的存储过程都要重写。 10.触发器的作用? 答:触发器是一种特殊类型的存储过程,不由用户直接调用,主要是通过事件触发而被执行。使用 UPDATE、INSERT、 DELETE 等数据修改操作在指定表中进行数据修改时,触发器会自动执行。它可以强化约束来维护数据的完整性和一致性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。可以跟踪数据库内的操作从而不允许未经许可的更新和变化。 触发器的优点: A)触发器是自动的。表中的 数据做了修改之后,触发器将立即被激活。 B)触发器可以通过数据库中的相关表进行层叠更改。例如,可以在数据表的某列上写入一个删除触发器,以13 / 30 使其他表中的各匹配行采取删除操作。 C)触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK约束不同的是,触发器可以引用其他表中的列。 11.什么是数据库事务? 答:数据库事务是被绑定在一起作为一个逻辑工作单元的 SQL语句分组。如果其中任何一条语句操作失败,那么整个事务操作就会失败,回滚到操作前的状态, 只有全部语句都执行成功,事务才算执行成功。因此,如果要确保一组 SQL语句要么都执行,那么都不执行,就需要使用数据库事务。 事务是恢复和并发控制的基本单位。它具有四个属性:原子性、一致性、隔离性、持续 性。这四个属性通常称为 ACID特性。 A)原子性:一个事务是一个不可分割的工作单位,事务中包括的所有操作要么都做,要么都不做。 B)一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 C)隔离性:一个事务的执行不 能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。 D)持久性:持久性也称为永久性,指一个事务一旦14 / 30 提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 12.什么叫做 SQL 注入式攻击? 答:所谓 SQL 注入式攻击就是攻击者把 SQL 命令插入到 WEB 表单的输入域或者提交页面请求的查询字符串中,从而执行恶意的 SQL命令。在某些情况下,用户在输入域中输入的内容直接被用来构造动态 SQL命令,或作为存储过程的输入参数,这类表单特别容易受到 SQL 注入式攻击。 防范 SQL注入式攻击闯入并不是特别困难的一件事,只需要在利用表单输入的内容构造 SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。 A)替换单引号,即把所有的单独出现的单引号改成两个单引号,防止攻击者修改 SQL 命令的含义。 B)删除用户输入内容中的所有连字符,防止攻击者构造出带有注释的语句,从而使数据库忽略一部分信息而直接执行。 C)对于执行查询的数据库账户,限 制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同账户可执行的操作,因此也就防止了原本用于执行SELECT 命令的地方却用于执行 INSERT、 UPDATE 或 DELETE 命令。 15 / 30 D)用存储过程来执行所有的查询。 SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。 E)限制表单或查询字符串输入的长度。 F)检查 用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行。之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。 G)将用户登录名、密码等数据加密保存。加密用户输入的数据,让后再将它与数据库中保存的数据比较,这样用户输入的数据不再对数据库有任何特殊的意义。 H)检查提取数据的查询所返回的记录数量。如果程序只要求返回一条记录,但实际返回的记录却超过一行,则就当作错误处理。 13试解释 COMMIT操作和 ROLLBACK 操作的语义? 答: COMMIT 语句表示事务执行成功地结束,此时告诉系统,该事务对数据库的所有更新都将写入磁盘。ROLLBACK 表示事务执行不成功地结束,应该回退到初始状态。该事务对数据库的所有更新必须被撤销,数据库应该恢复该事务到初始状态。 16 / 30 14.如何估计一张表的大小? 答:数据表的大小 = 所有字段的字节数之和 * 数据表中记录的条数 15.谈谈你所知道的 JOIN 语句的使用,考虑到性能的优化,你有什么建议? 答: JOIN 语句分为以下几种: A)LEFT JOIN:左连接,返回左表中所有的记录以及右表中与连接字段相等的记录。即显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示 NULL。 B)RIGHT JOIN:右连接,返回右表中所有的记录以及左表中与连接字段相等的记录。即显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示 NULL。 C)INNER JOIN:内连接,又叫等值连接,只返回两个表中连接字段相等的行。 D)FULL JOIN:外连接,显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。 E)CROSS JOIN:交叉连接,结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。 交叉连接如果不带 WHERE 条件字句,他将返回被连17 / 30 接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。因此,如果两个需要求交集的表太大,将会非常非常慢,不建议使用。 在数据库中是什么含义?在 SQL Server 数据库中有哪些涉及 NULL的操作? 答: NULL 表示未知,不表示空字符串。与 NULL的任何比较都会产生一个 NULL 值。因为不能把任何值与一个未知值进行比较。在 SQL Server 中判断是否等于 NULL,不能用 =NULL和 NULL。而要使用 IS NULL 和 IS NOT NULL操作符。 设置字段值时可以用: update XX set YY=NULL 插入新纪录时可以用: insert XXX values Server 中有几种不同类型的触发器? 答:触发器是一种专用类型的存储过程,他被捆绑到 SQL Server 的表或视图上。在 SQL Server 里,有INSTEAD-OF和 AFTER 两种类型的触发器。 INSTEAD-OF 触发器是替代数据操控语言语句对表执行的存储过程。 AFTER触发器则在 DML语句在数据库里使用之后才执行。 18.请解释 Oracle中冷备份和热备份的不同点以及各自的优点? 答:热备份针对归档模式的数据库,在数据库仍处18 / 30 于工作状态时进行备份。而冷备份是指在数据库关闭后进行备份,适用于所有模式的数据库。热备份的优点在于备份时,数 据库仍可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。 的主要内存结构有哪些? 答:软件代码区:用于存储正在执行的或可以执行的程序代码。 系统全局区:一组由 Oracle分配的共享的内存结构,可包含一个数据库实例的数据或控制信息。 程序全局区:包含单个用户或服务器数据和控制信息的内存区域,它是在用户进程连接到 Oracle 并创建一个会话时由 Oracle自动分配的。 PGA 包含的是有关进程 正在使用操作系统资源信息以及进程的状态信息,而其他的进程所使用的 Oracle 的共享资源在 SGA中。 排序区: Oracle 利用该内存排序数据。 中的临时表有几种?使用临时表的主要原因是什么? 答:临时表在 Oracle 数据库中起到建立一个临时性的存放某些数据集的作用。临时表一般分为事务临时表和会话临时表两种。 19 / 30 当事务结束的时候,就会清空事务临时表。所以在数据库临时表中插入数据后,只要事务没有提交,该表中的数据就 会存在。但是,在事务提交或者回滚以后,该表中的数据就会被删除。而且,这个变化不会在重做日志中显示。当然,如果会话结束,事务临时表中的数据也会被清空。 会话里临时表是指数据只在当前会话内有效的临时表。关闭当前会话或者进行新的连接之后,数据表中的内容就会被清楚。 Oracle 的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据而互不干扰,不用担心会破坏或影响其他会话或者事务中的数据,这也是数据安全的一种解决方法。 二计算机网络与分布式系统 1.简 单描述 OSI网络结构的七层模型? 答:应用层:定义了网络中进行通信和数据传输的接口。用于提供标准服务,例如虚拟终端、文件以及任务的传输和处理。 表示层:掩盖不同系统间的数据格式的不同性,指定独立结构的数据传输格式。 会话层:管理用户会话和对话,控制用户间逻辑连接的建立和挂断并报告上一层的错误。 传输层:管理网络中端到端的信息传送。通过错误纠正和流控制机制提供可靠20 / 30 且有序的数据包传送,从而提供面向无连接的数据包的传送。 网络层:定义网络设备间数据如何传输数据。根 据唯一的网络设备地址路由数据包,提供流和拥塞控制以防止网络资源的损耗。 数据链路层:定义操作通信连接的程序。为数据帧封装数据包并且监测和纠正数据包传输错误。 物理层:定义通过网络设备发送数据的物理方式。作为网络媒介和设备间的接口,定义光学、电气和机械特性。 第七层至第四层处理数据源和数据目的地之间的端到端通信,而第三层至第一层处理网络设备间的通信。 程序员需要具备的基本素质 阅读代码这个技能需要程序员能够具备读懂已经存在的代码的能力,这样的能力可以 让程序员分析程序的行为,了解程序,这样才能和开发团队一起工作,继承维护或是改进现有的程序。 编写程序 编写程序并不包括程序设计。不要以为编程是一件很简单的事情,很多程序员都认为编程只需要懂得程序语言的语法,并把设计实现就可以了。但是这离编写程序还 远远不够,使用什么样的编码风格成为编写程序员最需要具备的基本技能。能否使用非常良好的编程风格直接决写了程序员的级别。 软件设计 这一能力直接决定了需要21 / 30 吏用什么样的代码技术达到怎么样的功能,而系统架构设计直接决定了软件的质量、性能和可维护性。并不是所有 的程序在这一方面都非常优秀,但每个程序员都需要或多或少的明白和掌握这一基本技能。 熟悉软件工程 每个程序员都应该明白软件工程是什么东西,都应该知道,需求分析,设计,编码,测试, Release 和维护这几个阶段。当然,几乎所有的人都知道这些东 西,但并不是每个人都很清楚这些东西。现在很多高级程序员都会混淆“需求规格说明书 FS”和“概要设计 HLD”。另外,程序员还需要知道一些软件开发的方 法论,比如:敏捷开发或瀑布模型。 使用程序库或框架 一个程序员需要学会使用已有的代码,无论是标论的程序库,或是第 三方的,还是自己公司内部的,都需要学会做。比如: C+中,需要学会使用 STL,MFC, ATL, BOOST, ACE, CPPUNIT 等等。使用这些东西,可以让你的工作事半功倍。 程序调试 程序调试是分析 BUG和解决问题最直接的能力。没有人能够保证程序写出来不用调试就可以运行正常,也没有人可以保证程序永远不会出 BUG。所以,熟练使用调试器是一个程序员需要具备的基本技能。 使用 IDE 学会使用 IDE 工具也会让你的工作事半功倍。比如, VC+, Emacs, Eclipse 等等,并要知道这些 IDE的长处和短处。 22 / 30 使用版本控制 一定要学会使用版本控制工具,什么叫 mainline/trunk,什么叫 tag,什么叫 branch,怎么做patch,怎么 merge 代码,怎么 reverse,怎么利用版本控制工具维护不同版本的软件。这是程序员需要明白的软件配置管理中最重要的一块。 单元测试 单元测试是每个程序都需要做的。很多单元测试也是需要编码的。一定要学会在 xUnit框架下进行单元测试。比如 JUnit, NUnit, CppUnit 等等。 重构代码 每个程序员都需要有最基本的能力去重构 目前已有的代码,使代码达到最优但却不能影响任何的已有的功能。有一本书叫软件的重构,每个程序员都应该读一下。 自动化编译 程序员需要使用一个脚本,其能自动化编程所有的工程和代码,这样,整个开发团队可以不停地集成代码,自动化测试,自动化部署,以及使用一些工具进行静态代码分析或是自动化测试。 需求 你能给出一些非功能性需求的例子么? 所谓非功能性需求,是指软件产品为满足用户业务需求而必须具有且除功能需求以外的特性。软件产品的非功能性需求包括系统的性能、可靠性、可维 护性、可扩充性和对技术和对业务的适应性等。下面对其中的某些指标加以说明。在这里可以看到非功能性需求涉及的范围很广,软件产23 / 30 品本身不是孤立存在的,还涉及到诸多外在环境的影响。非功能性需求必须考虑软件既要可用,又要易用。 对于非功能性需求描述的困难在于很难像功能性需求那样,可以通过结构化和量化的词语来描述清楚,在描述这类需求时候我们经常采用软件性能要好,查询要在多少时间内出结果,软件健壮性要好等较模糊的描述词语。这类描述词语都是脱离了软件的执行环境,人和相关的场景的描述,因此信息很难体现到软件架构设 计和具体的实现中。我们在架构设计中关注的安全,系统开发框架,并发和性能,异常日志等不是凭空产生出来的,而是来源于我们对非功能性需求的分析。 一个软件系统必须完整,因此不仅仅包括了可执行的程序,还包括了在线帮助,数据和用户管理,日志异常查询,自动升级等相关功能特征。这些需求不仅仅是为了满足用户的需要,也是为了我们后续维护和监控系统的需要。 系统的可靠性,可维护性和适应性是密不可分的。当系统出现故障和用户出现错误的操作后是否支持恢复,当用户在使用过程中遇到错误的时候是否可以立即定位问题 ,但业务场景和逻辑发生变化的时候系统是否支持,当网络不稳定或使用中异常中断的情况下系统是否都有相应的容错措施,这些都是需要在非功能性需求中考虑到的问题。 易用性也是我们在开发非功能性需求中必须要考24 / 30 虑到的问题,易用性同时还涉及到美工和 UI 界面,人机工程,交互式设计,心理学,用户行为模式等多方面的知识。易用性的三原则就是易见,易学和易用或者叫为发现,易懂,效率。易见就是各种功能操作不要藏得太深,用户很容易找到他们期望进行的各种操作;易学需要软件系统通过在线帮助,导航,向导等各种方式保证软件是可自学 习的;易用的重点则在软件在熟练使用后应该可以更快的进行各项操作。这三者相互间也存在冲突,需要平衡,而平衡的一个重点就是真正的做到以用户为中心进行设计,需要去细分场景和用户。 对于非功能性需求的描述,在描述过程中必须要强调到人,业务场景,环境等各方面的内容。强调的目的就是要说明非功能性需求不是无限度的,任何一项非功能性需求的实现往往会付出更大的研发人力成本和硬件网络成本。比如我们在描述一个表单的模糊查询功能的时候,如果简单的描述为所有查询都要在多少秒内完成,那么这种需求将很难得到满足,以下是一些 可选的描述方式。 1.估计用户数为 1 万人,每天登录用户数为 3000左右,网络的带宽为 100M带宽。 2.在非高峰时间根据编号和名称特定条件进行搜索,可以在 3秒内得到搜索结果。 3.当通过互联网接入系统的时候,期望在编号和名25 / 30 称搜索时最长查询时间 有了这些场景和数据后,我们在进行架构设计的时候就可以有针对性的选择我们的开发框架和模式,数据库,软硬件环境配置已经复杂功能的具体实现方式等。同时这些需求还可以更好的指导我们对通过性能测试等工具对这些非功能性需求进行验证。 在某个时间范围内,产品运行稳定的程度;在某些压力极端情况,产品运行稳定的程度;不正常宕机后,产品的恢复度量。 如果客户需要高性能、使用极其方便而又高度安全,你会给他什么建议? 1 高性能,一般需要集群实现 2 使用方便,这个需要根据用户的水平。 B/S 是很容易掌握的。 3 安全,最好用 VPN进行访问,或者干脆专网专用。密码管理的问题不是系统能解决的。就算加上实时的密码锁。 4 选择合适的人,并保持稳定 总之,这些要求在一些大型应用里面都 是必须的,比如电信级的计费系统。 方便与高性能、高度安全是不完全统一的。方便带来的问题是安全性的降低,或性能不能达到最合适的程度;高性能会导致复杂性;安全性会让性能不能达到最佳。最好的方式是选择一种优先级,比如以安全性为主要的考核标26 / 30 准,适当安排性能和难易程度;或者以性能为主。尽量达到三者的平衡点,在某些极端的情况可比保证性能降低,但安全有保证 你能给出一些用来描述需求的不同技术么?它们各自适用于什么场景? 需求分类 : 项目需求 :商业需求 ,项目管理需求 ,交付 需求等 产品需求 :技术需求 ,安全需求 ,性能需求等 如果非要说个技术那就是观察,也叫工作跟踪 ,通常由观察者从外部来观察使用者的工作 参与观察者 ,实际执行一个流程或程序 ,体验他们是如何实施的。 需求分析 需求分析在整个开发过程中占的工作量不大,但是产生的影响巨大。既然需求分析如此重要,照理说应该安排最强的人来搞。但实际 情况往往不是如此:很多公司负责需求分析的人并不胜任这项工作。我经历过几个不太成功的项目,其问题的根源都和需求分析有关。 需求分析最要 紧的是:搞清楚用户到底想要什么?如果这个问题搞错了、搞偏了,后面的步骤做得再好也是白搭。这方面其实有很多的道道,限于篇幅就不展开了,大伙儿如果有兴趣,以后可以单独说一下。 在搞清楚“用户想要什么”之后,接着要整理出功27 / 30 能列表,并筛选出大约 20%的重点功能。这个步骤是我今天主要想介绍的,因为这个步骤和后续的各项开发密切相关。一般来说,功能筛选的依据有如下几个: 1、用户经常用的功能 2、宣传的卖点 3、和用户利益密切相关的功能 这个筛选的过程要尽早完成,而且最好是 产品人员、开发人员、测试人员三方的头头一起讨论,以保证立场客观、观点全面。筛选出重要功能点后,其他人员的工作安排要 以重点功能为纲 ,有所侧重。 项目管理 如果你是个项目经理,在排项目计划时,就得尽量优先安排重点功能的开发 /测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论