软件工程之美
项目生命周期
- 规划
- 需求分析
- 设计
- 编码
- 测试
- 运行和维护
软件项目管理金三角
瀑布模型 (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)
怎么做需求分析
单个用户的需求
- 挖掘真实需求
- 提出解决方案
- 筛选和验证方案
软件工程需求
- 收集需求:对用户需求进行收集整理;
- 分析需求:对需求进行分析,挖掘用户真实需求;
- 需求评估:筛选过滤掉不可行的需求;
- 需求设计:针对用户需求提出解决方案,设计成产品方案;
- 验证需求:验证方案是否可行
或者 KANO 模型
参考工程方法,我们可以将每次原型设计过程分成四个部分:分析、设计、实施和验证。
-
分析
-
设计
要优先考虑满足产品需求,然后是让界面好看好用
-
实施
-
验证
自己验证几遍、开评审会议。
原型工具的选中从以下几个纬度来思考
- 面向的 平台:web、桌面、手机
- 保真度
- 功能:是否满足你的需求
- 成本:价钱
- Axure RP:Axure RP 曾一度是原型设计工具的代名词,历史悠久功能强大,可以制作
站、桌面软件、移动 App 的原型。 缺点是专业度较高,价格高。 - 墨刀:墨刀 是一款优秀的国产原型设计工具,可以制作 站、桌面软件、移动 App 的原
型。上手相对容易,价钱也较 Axure 便宜很多。 - Adobe XD:Adobe XD 是 Adebe 出的一款设计兼原型设计工具,可以制作出高保真原
型,对于设计师尤其容易上手。 - ProtoPie:ProtoPie 是一款高保真原型设计工具,不需要编程基础,可以做出逼真强大的
交互效果。 - Framer X:Framer X 是一款高保真的原型设计工具,功能很强大,但是需要一定的编程基
础,尤其适合程序员使用
程序员应该要懂产品
程序员的价值 不都是技术水平越高、价值就越大。而是和你创造的价值是正相关
-
价值体现在你做的产品之上
-
价值体现在团队中的稀缺性
有的程序员能搞定别人搞不定的技术难题;
有的程序员擅长培训新人;
有的程序员擅长和业务部门沟通;
有的程序员能高质量地完成功能模块;
有的程序员能按照需求设计好的架构,可以让团队高效率低成本地完成需求。
什么是产品意识
产品意识,本质就是一种思维方式,一种站在产品角度思考问题的方式。如果细分一下,产
品意识包含:商业意识、用户意识和数据意识。
商业意识
所做的产品要有商业价值。
成本意识
商业意识的另一方面其实是成本,成本意识也是程序员容易忽视的。比如说:
有时候为了炫技,采用了更难更酷的技术方案,而忽视了所采用的方案会导致很高的开发
成本;花了太长时间去开会而忽略了开会的成本;
有时候又为了省钱,舍不得买一些成熟的商业组件或服务,反而是浪费了更多成本。
如果程序员有商业意识,就可以在项目中有更好的成本意识,为项目节约时间、经济等成
本,帮助团队打造更有价值的产品
用户意识
所谓用户意识,就是说做产品时,你要能挖掘出用户的真实需求,让产品有好的用户体验。
这需要你要有同理心,能站在用户的角度去思考和体验产品。
大部分程序员可能更多专注于程序上,所以在用户意识上确实有所欠缺。举例来说
-
一个产品功能,产品经理在细节上没有定义清楚,程序员可能并不会主动提出,最终做出
来的产品会不好用;
-
在做技术方案时,更追求技术炫酷,而不是用户体验更好;
-
在设计接口时,并没有考虑调用者的便利性
数据意识
所谓数据意识,就是在产品设计、产品运营时,通过数据来发现问题、证实结果
如何应对需求变更
根据不同阶段选择合适的方案
- 提升需求确定性
- 提高需求变更的成本
- 降低响应需求变更的成本
架构设计
- 分析需求;
- 选择相似的成熟的架构设计方案;
- 自顶向下层层细化;
- 验证和优化架构设计方案
推荐书籍
- 架构整洁之道
- 以“前浪微博”场景为例,谈谈架构设计流程四步曲
- 从单个服务器扩展到百万用户的系统
- 架构师之路
- 软件架构入门
什么是架构师思维
-
抽象
在软件项目中,遇到类似的场景,就会考虑抽象出来,总结一个规则和方法
-
分治
架构设计的一个重点,就是要对复杂系统分而治之,分解成小的、简单的部分。但光分解还
是不够的,同时还需要保证分解后的部分能够通过约定好的协议集成在一起
-
复用
复用是一种非常简单有效的提升开发效率的方法,通过对相同内容的抽象,让其能复用于不
同的场景
-
迭代
好的架构设计,通常不是一步到位,而是先满足好当前业务需求,然后随着业务的变化而逐
步演进
一个好的架构师,不仅技术要好,还要懂业务;能从整体设计架构,也能在局部实现功
所以要成为好的架构师,需要具备几个条件。
-
有架构师思维:具备良好的抽象思维、分治思维、复用思维和迭代思维
-
懂业务需求:能很好地理解业务需求,能针对业务特点设计好的架构;
-
有丰富的编码经验:像抽象、分治、复用这些能力,都需要大量的编码练习才能掌握;
另外保持一定量的编码经验也有助于验证架构设计;
- 良好的沟通能力:架构师需要沟通确认需求,需要让团队理解架构设计
如何提升学习能力
首先需要在一个技术领域深耕 然后往相近的领域逐步横向拓展
如何提高解决问题的能力
- 明确问题
- 拆分和定位问题
- 提出解决方案并总结
如何提升影响力
- 在某个领域做出了足够牛的成绩
- 做事情超出预期
- 帮助其他人就是在帮助自己
- 分享就是学习和打造影响力
自动化测试
有哪些自动化测试
- 单元测试
- 集成测试
- UI 测试
- 端到端测试
- 契约测试
- 组件测试
谷歌按照数据量来划分测试类型
-
小型测试
小型测试是为了验证一个代码单元的功能,例如针对一个函数或者一个类的测试
-
中型测试
中型测试是验证两个或多个模块应用之间的交互,通常也叫集成测试
契约测试,这个测试最
近出现的频度比较高,主要是针对微服务的。其实就是让微服务在测试时,不需要依赖于引
用的外部的微服务,在本地就可以模拟运行,同时又可以保证外部微服务的接口更新时,本
地模拟的接口(契约)也能同步更新
-
大型测试
型测试则是从较高的层次运行,把系统作为一个整体验证。会验证系统的一个或者所有子
系统,从前端一直到后端数据存储。大型测试也叫系统测试或者端对端测试
一个完整的自动化测试要包括三个部分的测试:
-
验证功能是不是正确
例如说输入正确的用户名和密码,要能正常注册账 ;
-
覆盖边界条件
比如说如果用户名或密码为空,应该不允许注册成功;
-
异常和错误处理
比如说使用一个已经用过的用户名,应该提示用户名被使用。
源代码管理工具
介绍
源代码管理工具也叫版本控制系统,是保存文件多个版本的一种机制
哪些 上托管平台
- github
- gitlab
- coding
- 码云
- 阿里云 code
- 百度效率云
- 腾讯 git 代码托管
- 华为云 codehub
如何用好源代码管理工具/h3>
-
要频繁的提交
-
每次提交后要跑自动化测试
-
提交的代码要有人审查
选择对应的开发流程
- git flow
- github flow
- gitlab flow
github flow 开发流程
-
有一个稳定的分支,如 master
-
每次创建新功能或者修复 Bug,必须创建一个分支。最后通过代码审查和自动化测试
后,才能合并回稳定分支
详细流程
- 创建分支
- 提交更新
- 创建 pr 请求合并
- 讨论和代码审查、
- 部署测试
- 合并
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进行处理,非常感谢!
-