软件工程之美-笔记

软件工程之美

项目生命周期

  1. 规划
  2. 需求分析
  3. 设计
  4. 编码
  5. 测试
  6. 运行和维护

软件项目管理金三角

瀑布模型 (6 个阶段)

Code And Fix 边写边改 模型

快速开发快速改

快速原型模型

快速原型模型,就是为了要解决客户的需求不明确和需求多变的问题,快速原型开发往往是以牺牲质量为代价的

针对原型模型的这种快速、低质量的特点,通常有两种处理策略:抛弃策略和附加策略。

大瀑布拆小瀑布

**瀑布模型的很多问题,根源都是周期太长。**周期长所以中间难以响应变更,周期长所以客户很久才能看到结果,周期太长所以风险不好控制。如果能将周期变短,那么很多问题就迎刃而解了。

基于这种思路,产生了很多开发模型,比较典型的主要是:增量模型迭代模型

增量模型——按模块分批次交付

增量模型是按照功能模块来拆分;而迭代模型则是按照时间来拆分,看单位时间内能完成多少功能

迭代模型最难的部分,在于规划每次迭代的内容和要达到的目标

小结

  • 一个以确认需求为主要目的的项目,就可以不用花太多时间在代码质量上面,低成本、高效做出来才是最重要的;
  • 一个高风险的项目,则可以采用螺旋模型,出现问题及时止损;
  • 一个很长时间加班加点,却一直没法上线,导致士气低落的项目,可以改成增量模型,先上线一个小模块,让大家看到成绩提升士气,然后再迭代,逐步上线其他模块。

敏捷开发

瀑布模型的典型问题就是周期长、发布烦、变更难,敏捷开发就是快速迭代、持续集成、拥抱变化

在这里以一个开发任务为例,大致讲解一下应用敏捷开发方法的基本开发流程:

  • 把要开发的 Ticket 从“To Do”栏移动到“In Progress”栏;
  • 从主干(master)创建一个分支(branch),基于分支去开发功能或修复 Bug;
  • 编写实现代码和测试代码(单元测试和集成测试),是不是测试驱动不重要,看个人偏好或团队要求;
  • 持续提交代码更新到分支,直到完成;
  • 创建 PR(Pull Request,合并请求),邀请其他人帮忙 Review 代码,根据 Review 的结果,可能还需要更新几次;
  • CI 在每一次提交代码到代码库后都会自动运行,运行后主要做这些工作:
    – 检查代码格式是不是符合规范;
    – 运行单元测试代码;
    – 运行集成测试。
  • 最终这些检查都完成后,CI 会把执行结果显示在 PR 上。通常绿色表示通过,红色表示失败;
  • PR 能合并需要满足两个条件:CI 变绿 + 代码 Review 通过;
  • PR 合并后,CI 会自动构建 Docker Image,将 Image 部署到开发环境;
  • 将相应的 Ticket 从看板上的“In Progress”栏移动到“Done”栏。

部署上线流程

这些年随着容器化、微服务、DevOps 这些技术或概念的兴起,部署已经变得越来越高效,大厂已经开始在部署流程上融合这些理念。

  • 首先,部署的不再是程序代码,而是 Docker 的 Image,每次代码合并后 CI 都会自动生成新的 Image,测试也是基于 Image 测试。
  • 部署生产环境之前,先在内部的测试环境充分测试。
  • 部署生产环境前,需要审批确认,有 Ticket 跟踪。
  • 部署时,先部署一部分,监测正常后再全量部署。
  • 整个过程都有监控 警,出现问题及时回滚。

项目管理工具

  • 微软 ms project 瀑布流 粗狂

  • jira

  • azure devops

  • github

  • 码云

  • 禅道

  • worktile

  • tapd 腾讯

  • 运效 啊里

  • devcloud 华为

  • 基于 Ticket 的任务跟踪系统

  • 燃尽图 (burn down chart)

    怎么做需求分析

    单个用户的需求

    1. 挖掘真实需求
    2. 提出解决方案
    3. 筛选和验证方案

    软件工程需求

    1. 收集需求:对用户需求进行收集整理;
    2. 分析需求:对需求进行分析,挖掘用户真实需求;
    3. 需求评估:筛选过滤掉不可行的需求;
    4. 需求设计:针对用户需求提出解决方案,设计成产品方案;
    5. 验证需求:验证方案是否可行


    或者 KANO 模型

    参考工程方法,我们可以将每次原型设计过程分成四个部分:分析、设计、实施和验证。

    1. 分析

    2. 设计

      要优先考虑满足产品需求,然后是让界面好看好用

    3. 实施

    4. 验证

      自己验证几遍、开评审会议。

    原型工具的选中从以下几个纬度来思考

    1. 面向的 平台:web、桌面、手机
    2. 保真度
    3. 功能:是否满足你的需求
    4. 成本:价钱
    • Axure RP:Axure RP 曾一度是原型设计工具的代名词,历史悠久功能强大,可以制作
      站、桌面软件、移动 App 的原型。 缺点是专业度较高,价格高。
    • 墨刀:墨刀 是一款优秀的国产原型设计工具,可以制作 站、桌面软件、移动 App 的原
      型。上手相对容易,价钱也较 Axure 便宜很多。
    • Adobe XD:Adobe XD 是 Adebe 出的一款设计兼原型设计工具,可以制作出高保真原
      型,对于设计师尤其容易上手。
    • ProtoPie:ProtoPie 是一款高保真原型设计工具,不需要编程基础,可以做出逼真强大的
      交互效果。
    • Framer X:Framer X 是一款高保真的原型设计工具,功能很强大,但是需要一定的编程基
      础,尤其适合程序员使用

    程序员应该要懂产品

    程序员的价值 不都是技术水平越高、价值就越大。而是和你创造的价值是正相关

    • 价值体现在你做的产品之上

    • 价值体现在团队中的稀缺性

      有的程序员能搞定别人搞不定的技术难题;

      有的程序员擅长培训新人;

      有的程序员擅长和业务部门沟通;

      有的程序员能高质量地完成功能模块;

      有的程序员能按照需求设计好的架构,可以让团队高效率低成本地完成需求。

    什么是产品意识

    产品意识,本质就是一种思维方式,一种站在产品角度思考问题的方式。如果细分一下,产

    品意识包含:商业意识用户意识数据意识

    商业意识

    所做的产品要有商业价值。

    成本意识

    商业意识的另一方面其实是成本,成本意识也是程序员容易忽视的。比如说:

    有时候为了炫技,采用了更难更酷的技术方案,而忽视了所采用的方案会导致很高的开发
    成本;

    花了太长时间去开会而忽略了开会的成本;

    有时候又为了省钱,舍不得买一些成熟的商业组件或服务,反而是浪费了更多成本。

    如果程序员有商业意识,就可以在项目中有更好的成本意识,为项目节约时间、经济等成

    本,帮助团队打造更有价值的产品

    用户意识

    所谓用户意识,就是说做产品时,你要能挖掘出用户的真实需求,让产品有好的用户体验。

    这需要你要有同理心,能站在用户的角度去思考和体验产品。

    大部分程序员可能更多专注于程序上,所以在用户意识上确实有所欠缺。举例来说

    • 一个产品功能,产品经理在细节上没有定义清楚,程序员可能并不会主动提出,最终做出

      来的产品会不好用;

    • 在做技术方案时,更追求技术炫酷,而不是用户体验更好;

    • 在设计接口时,并没有考虑调用者的便利性

    数据意识

    所谓数据意识,就是在产品设计、产品运营时,通过数据来发现问题、证实结果

    如何应对需求变更

    根据不同阶段选择合适的方案

    • 提升需求确定性
    • 提高需求变更的成本
    • 降低响应需求变更的成本

    架构设计

    • 分析需求;
    • 选择相似的成熟的架构设计方案;
    • 自顶向下层层细化;
    • 验证和优化架构设计方案

    推荐书籍

    • 架构整洁之道
    • 以“前浪微博”场景为例,谈谈架构设计流程四步曲
    • 从单个服务器扩展到百万用户的系统
    • 架构师之路
    • 软件架构入门

    什么是架构师思维

    • 抽象

      在软件项目中,遇到类似的场景,就会考虑抽象出来,总结一个规则和方法

    • 分治

      架构设计的一个重点,就是要对复杂系统分而治之,分解成小的、简单的部分。但光分解还

      是不够的,同时还需要保证分解后的部分能够通过约定好的协议集成在一起

    • 复用

      复用是一种非常简单有效的提升开发效率的方法,通过对相同内容的抽象,让其能复用于不

      同的场景

    • 迭代

      好的架构设计,通常不是一步到位,而是先满足好当前业务需求,然后随着业务的变化而逐

      步演进

    一个好的架构师,不仅技术要好,还要懂业务;能从整体设计架构,也能在局部实现功

    所以要成为好的架构师,需要具备几个条件。

    1. 有架构师思维:具备良好的抽象思维、分治思维、复用思维和迭代思维

    2. 懂业务需求:能很好地理解业务需求,能针对业务特点设计好的架构;

    3. 有丰富的编码经验:像抽象、分治、复用这些能力,都需要大量的编码练习才能掌握;

    另外保持一定量的编码经验也有助于验证架构设计;

    1. 良好的沟通能力:架构师需要沟通确认需求,需要让团队理解架构设计

    如何提升学习能力

    首先需要在一个技术领域深耕 然后往相近的领域逐步横向拓展

    如何提高解决问题的能力

    1. 明确问题
    2. 拆分和定位问题
    3. 提出解决方案并总结

    如何提升影响力

    1. 在某个领域做出了足够牛的成绩
    2. 做事情超出预期
    3. 帮助其他人就是在帮助自己
    4. 分享就是学习和打造影响力

    自动化测试

    有哪些自动化测试

    • 单元测试
    • 集成测试
    • UI 测试
    • 端到端测试
    • 契约测试
    • 组件测试

    谷歌按照数据量来划分测试类型

    • 小型测试

      小型测试是为了验证一个代码单元的功能,例如针对一个函数或者一个类的测试

    • 中型测试

      中型测试是验证两个或多个模块应用之间的交互,通常也叫集成测试

      契约测试,这个测试最

      近出现的频度比较高,主要是针对微服务的。其实就是让微服务在测试时,不需要依赖于引

      用的外部的微服务,在本地就可以模拟运行,同时又可以保证外部微服务的接口更新时,本

      地模拟的接口(契约)也能同步更新

    • 大型测试

      型测试则是从较高的层次运行,把系统作为一个整体验证。会验证系统的一个或者所有子

      系统,从前端一直到后端数据存储。大型测试也叫系统测试或者端对端测试

    一个完整的自动化测试要包括三个部分的测试:

    • 验证功能是不是正确

      例如说输入正确的用户名和密码,要能正常注册账 ;

    • 覆盖边界条件

      比如说如果用户名或密码为空,应该不允许注册成功;

    • 异常和错误处理

      比如说使用一个已经用过的用户名,应该提示用户名被使用。

    源代码管理工具

    介绍

    源代码管理工具也叫版本控制系统,是保存文件多个版本的一种机制

    哪些 上托管平台

    • github
    • gitlab
    • coding
    • 码云
    • 阿里云 code
    • 百度效率云
    • 腾讯 git 代码托管
    • 华为云 codehub

    如何用好源代码管理工具/h3>
    • 要频繁的提交

    • 每次提交后要跑自动化测试

    • 提交的代码要有人审查

    选择对应的开发流程

    • git flow
    • github flow
    • gitlab flow

    github flow 开发流程

    • 有一个稳定的分支,如 master

    • 每次创建新功能或者修复 Bug,必须创建一个分支。最后通过代码审查和自动化测试

      后,才能合并回稳定分支

    详细流程

    1. 创建分支
    2. 提交更新
    3. 创建 pr 请求合并
    4. 讨论和代码审查、
    5. 部署测试
    6. 合并

    github 常见问题

    • 发布版本

      从 master 上创建 Tag,如 v1.0 等

    • 线上版本打补丁

    • 如果我经常需要打补丁,有没有比 Tag 更好的办法

    测试相关工具

    bug 跟踪系统

    • jira

    • 禅道

    • TAPD

    • 云效

    • Bugzilla 是由 Mazilla 公司提供的一款开源免费的 bug 跟踪系统。这是一款历史很悠久的

      产品

    • MantisBT 是一个简单但功能强大的开源 bug 跟踪系统,可以通过各种插件来扩展其功

    • Redmine 是一款开源的综合性的项目管理工具,不仅可以用于 Bug 跟踪,还可以用来跟

      踪项目进度

    自动化测试工具

    • Selenium 是一个 Web 端的自动化测试工具,直接运行在浏览器中,用来模拟用户操作。

      类似的还有 WebDriverIO 和 Nightwatch.js ,支持 Javascript,API 更简单更方便

    • Appium 是一个开源、跨平台的自动化测试工具,用于测试移动原生应用,支持 iOS,

      Android 系统

    • Macaca 是阿里巴巴开源的一款面向多端的自动化测试工具,支持桌面端、Web、移动

      端、真实设备和模拟器

    压力测试工具

    • Apache JMeter 是一款开源的压力测试工具,纯 Java 应用程序

    • LoadRunner 是惠普旗下的一款商业自动负载测试工具,可以通过录制的方式制作测试脚

      本,上手容易功能强大,可以方便的监控和分析性能测试结果

    • 阿里云性能测试 PTS 阿里云性能测试 PTS 是基于云端的压力测试服务,可以模拟从全国各地域运

      营商 络发起的流量, 告真实反应用户体验情况

    • WebPageTest WebPageTest 是一个可以用来测试和分析 页性能的在线工具,支持不同浏览器,

      支持 API。可参考《WebPagetest H5 性能测试工具入门详解》。、

    安全性测试工具

    • Fortify On Demand 是惠普旗下的一款安全检测工具,可以通过分析源代码、二进制程序

      或者应用程序 URL 检测程序安全漏洞

    • Sqlmap 是一款开源免费的检测 Sql 注入的工具

    • APPScan 是 IBM 旗下的一款漏洞扫描工具,支持 站和移动 App

    浏览器兼容性测试工具

    • Browsera 可以对不同浏览器下的布局提供 告,包括截图和 Javascript 错误

    • Browslering 可以针对不同浏览器进行测试,它在虚拟机中运行真实桌面浏览器,还可以人

      工进行交互

    测试用例管理工具

    • TestRail 是 TestRail 是一个专注于管理测试用例的工具,可以用它来创建测试用例和用例

      集,跟踪测试用例的执行和生成 告

    • 飞蛾 是 Coding 旗下的测试管理工具,对中文支持好,界面美观

    安全问题

    软件中的安全问题分类

    • 恶意输入 sql 注入、xss
    • 假冒身份
    • 数据泄露

    如何预防

    • 需求阶段

    • 设计阶段

      • 攻击面最小化

      • 权限最小化

        声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月11日
下一篇 2022年1月11日

相关推荐