zoukankan      html  css  js  c++  java
  • 《构建之法》第八章读书笔记

    引子

    本章主要论述了需求分析过程中从获取到引导再逐步到分析和原则,同时也给出了一个有效的用于进行竞争性需求分析的模型,以方便团队定位自身功能以及需求的验证,最后再给出项目的目标、计划的估计

    软件需求的获取、分析

    软件团队需要找到软件的利益相关者,了解和挖掘他们对软件的需求,引导他们表达出真实的需求。不同的项目需要不同的手段,这一步骤也被叫做“需求捕捉”。

    • 私以为书中提到的 “需求捕捉” 这一概念不只是单纯获取到目标客户的需求,更多的是引导——考虑到开发者与客户各自的专业知识之间的差异,项目管理者也更需要在与客户的交流中更细节化确认需求的内容,同时也起对客户的引导作用——让客户给出更多优化性的需求限制。

    • 当然上述的这些需求不单单只来自于软件面向的客户——利益相关者,还可能来自于技术团队本身——建模框架的选择、为了提高开发效率引入的服务器配置、测试工具上的支持..

    • 也可以就这些需求就不同的角度来划分:

      • 功能性需求——要求产品必须实现的需求
      • 开发过程的需求——要求软件开发流程必须满足的约束条件
      • 非功能性需求——服务质量需求
      • 综合需求——设计各个系统间协调及执行能力
    • 上述这些需求的实现也能使得软件开发产品更好地融入外界社会,且上述需求需要在软件团队与客户代表在 “需求捕捉” 阶段定义完成。个人建议在此基础上提供一份需求分析文档以供客户方参考,这样做既可以正规化需求分析,又可以给予客户方一个参考实现。避免客户临时额外添加奇奇怪怪的需求

    • 下方给出一张各级需求与不同角度需求间的二维表示图。

    竞争性需求分析框架(NABCD)

    终于来到本章最精华的部分。软件开发在现实环境下的实践也更需要兼顾实用性和创新性,所以也衍生了另一种需求——竞争性需求。什么样的需求算是合理的的呢?是几个人一拍即合的灵光一闪,亦或是多角度对需求的 “长考” 。答案毫无疑问是后者,接下来我会详细阐述《构建之法》中提到的NABCD模型。

    • 需求
    • 如何了解用户需求?
      • 用户需求已被不同程度满足情况下,可以了解用户是否存在对现有产品的不满亦或是能做到更好的地方。
      • 而相对于另一部分没有接触过该类软件产品的用户,可以站在用户角度进行理性分析,引导用户得出用户的真实需求。
    • 引发的思考——是否做现有存在的产品就一定不如创新性的产品呢?
      • 创新性产品固然能给用户带来新鲜感,进而给产品提升短时间的热度,但是伴随而来更多则是未知的风险。
      • 而如果能在了解用户对已有软件、服务的不满意基础上,对此做出改进,不需要颠覆性的创新来改变用户的使用习惯,就可以做到需求上的竞争力体现。

    • 做法
    • 如何完成既定的需求呢?
      • 完成需求的方式有很多,但是与此同时给用户带来的体验也全然不同,如何能在完成既定需求的前提下,给用户带来全新更好的体验,同时这也涉及到了创新性——与竞争方面时刻挂钩
      • 书中提到:“你不能说我会C++,所以我一定可以写好这个软件。”这也阐述了做法中的实质,掌握语言只是相当于掌握一门工具,也不可能说我会用一把锤子就能盖出一栋楼。我想更加实质性的内容是通过语言这个工具实现的应用。
    • 做法的局限性
      • 大部分人都把做法这一个模块仅仅归结于技术层面,其实其他相关方面的知识也能应用到做法上,举个例子如美工、数据集不一定完全要通过自身亲力亲为处理,美工方面也如老师上课所说可以邀请 “外援” ,数据集方面也可以网上现有开源数据集作为基础来进行扩展。
      • 有时做法也会局限于既定需求和变更的需求,即使是同样的需求的完成度在不同的模型下也可能有极大的差异。在绝大多数情况下,用户不会关心怎么具体的实现方式,用户只关心软件所提供的解决方案以及带给他们的体验。切勿因此陷入第三章所述的“不分主次,解决所有依赖”的思维误区

    • 好处
    • 成本与获益
      • 毫无疑问软件开发一定是存在获利者,且双方均可以从软件开发中获得好处,就当前创新思维迸发的一个时代,很难做到软件开发上的独创性,所以我们也需要考虑到用户在使用软件上所耗费的成本。如果软件所需的使用成本和迁移成本在用户心目中的比重远大于新软件所带来更好的体验的话,设计开发出的产品也很难做到适应市场。
    • 延伸思考——市场适应
      • 一个好的软件同其他实体产品也一样需要市场的存在,我们通过独特、创新的做法做出了一个能给客户带来诸多好处的软件,却要求极高昂的用户成本,或许这种可以适应少数的用户,也能给这少部分用户带来极佳的体验,但是却流失了大多数的用户。
      • 所以在设计软件的同时也需要考虑到成本问题——底层硬件实现复杂度,个人认为不能只关注当前软件开发的进程。

    • 竞争

    • 竞争中的“优势”与“劣势”

      • 除去少部分创新型的产品,大多数的产品都是存在市场竞争因素的,也给进入市场中的产品分别带来优势与劣势。
      • “先发优势”——先进入市场的产品会使得用户形成在先发软件上的习惯,同时需要额外考量迁移成本。
      • “后发优势”——后进入市场的产品可以在先进入市场的产品上做出改进,更好地满足用户需求。
    • 竞争考量的其他问题

      • 市场有多大?
      • 已有的市场竞争是否已经存在饱和现象?
      • 如已存在饱和现象,该如何介入竞争,若未出现饱和现象,又应该如何体现创新点呢?
      • 引申到软工实践中,当然相对于团队作业来说,我认为每个团队的点子应该很难出现重复现象,而结对作业的需求十分明确,如何做出创新性也是竞争的考量因素之一。具体对竞争产品的分析如下图所示(《构建之法》——Page 170)


    • 推广
    • 如何将创新产品交到用户手中?
      • 把产品交付给用户包括许多步骤——提交应用、宣传、公关..,可能看似跟技术开发并不相关,但是这毫无疑问比前四个步骤来说都略显重要一些——好的产品没有经过宣传推广就很难为用户所知,软件开发产品的价值也就无从体现。仅仅是为了情怀的考量实在不敢苟同
      • 当然推广这一模块是与前四个模块紧密结合在一起的,高质量的功能、优秀的作品也可以使得用户口口相传,反之功能性较差的作品即使花费了很大精力来做宣传这一项工作也很难取得理想结果。

    结语

    • NABCD模型的五个模块看似是分割开的五个开发流程,但是实质上每一个模块都或多或少对着前序亦或是后序模块起着影响作用,竞争之间的博弈也与推广的强度有着紧密的联系,推广收益也与产品开发中做法的质量挂钩。
    • 我也会尝试应用这个模型的部分至结对作业中,并尽可能在实践中更好地理解该模型、应用这个模型。
  • 相关阅读:
    一个秒杀系统的设计
    2018年终总结-从我所在的团队回首一年技术变迁
    温习LOGO语言
    微信公众平台配置-笔记
    Spring mongotemplate使用
    三种方法实现MNIST 手写数字识别
    Python 实现0-1背包
    Python 实现快速排序和随机快速排序
    Spring+SpringMVC+Mybatis搭建的网站的处理流程总结
    Mybatis功能架构及执行流程
  • 原文地址:https://www.cnblogs.com/tomvii/p/9683385.html
Copyright © 2011-2022 走看看