软件工程在实际项目开发过程中的应用

写作目的

  • 本文主要用于记录软件工程理论在实际软件开发过程中的应用,
  • 记录开发过程中用到的比较好的工具(工欲善其事,必先利其器)。

正文

1、需求规划阶段

  • 【1.1、确定开发模式】

    • 瀑布开发模式、敏捷开发模式。。。
  • 【1.2、分析需求】

    • 使用流程图,泳道图,活动图,用例图,类图等uml类图来分析需求和实现过程,画图工具推荐StarUML、PowerDesign
    • 使用燃尽图和鱼骨图评估人月,并控制项目时间,每次迭代会先复盘上个迭代的经验总结。然后规划下个迭代,职责到人,在线画图网站推荐ProcessOn
    • 制定项目规范:
      • 代码提交规范:见实用分支管理策略
      • commit规范:多组协助的时候,一定要注意该问题。
      • 代码仓划分:
        • 一个仓方便控制版本,但是易发冲突。
        • 多个仓方便开发(开发冲突次数少),但是多个仓的版本管理存在问题,部署的时候容易拿错版本(需要制品库来解决,例如镜像仓库直接推送latest到k8s,不经过人为操作,避免投产问题)。
  • 【1.3、项目架构】

    • 确认项目开发过程中用到的开发语言、中间件以及选用理由。
    • 提供解决方案来应对项目中可能遇到的重复提交、幂等、缓存一致性、最终一致性、一致性hash、消息百分百投递、分布式事务等问题。

2、开发阶段

  • 【2.1、制定制定项目规范】

    • 统一团队编码风格
    • 建立统一的项目文档和存放规范、存放权限
  • 【2.2、搭建CI/CD流程】

    • 推荐使用开源的Git+Jenkins+Gerrit:git提交代码、jenkins做持续集成部署、gerrit做门禁和CodeReview。
    • CI时推荐使用SonarQube或者Tsunami进行代码扫描。
    • bug追踪推荐使用Jira
    • 开源项目需要使用Fossid对使用到的软件进行开源认证,并使用BlackDuck黑鸦扫描对开源软件进行评估。
    • Azure的DevOps
  • 【2.3、搭建仓库】

    • 搭建属于自己项目组的maven仓:便于发布和拉取资源。
    • 使用httpd搭建属于自己项目组的软件服务目录:便于及时获取工具类的软件。
    • 搭建属于自己项目组的制品库:可以是容器镜像仓或者文件夹,为后续版本控制、投产发布做准备。
  • 【2.4、开发工具】

    • 开发工具:IDEA、Eclipse/MyEclipse、VisualStudio、VsCode
    • 数据库连接工具:Navicat
    • 查看工具:NotePad++、Beyond Compare
    • ssh工具:MultiDesk、Mobaxterm

3、调试阶段

  • 【3.1、网络问题】

    • 端口占用
    • 防火墙没关、端口未开(ping、telnet)
    • 使用tcp dump+Wireshark抓包查看具体请求情况
  • 【3.2、操作系统问题】

    • 某些字符集编码在不同的操作系统,或者即使相同的操作系统,因为配置不同,而导致的运行异常,乱码错误
  • 【3.3、OOM问题】

4、测试阶段

  • 【4.1、单元测试】

    • 根据测试准则编写测试用例对类和方法进行功能测试,必须考虑代码行覆盖(又叫语句覆盖)、 判定覆盖(分支覆盖)、条件覆盖 、路径覆盖
    • 推荐测试过程中直接使用路径覆盖
  • 【4.2、微基准测试】

  • 【4.3、接口/性能测试】

    • 使用Postman对接口进行功能测试。
    • 使用Jmeter 或者 LoadRunner对接口进行高并发测试。
  • 【4.4、SIT测试】

    • 集成测试:当多个模块开发或者增量开发完成后,
  • 【4.5、Mock测试】

    • 当独立单元写好后,需要进行集成测试时,由于很难获取下游资源或者下游没有写好,那么通过postman的Mock server 或者 YAPI模拟下游资源进行测试,这种测试方法将接口和微服务松耦合,具体使用见:Mock测试方法
    • 注意到YAPI还可以用于PM管理开发接口。
  • 【4.6、UAT测试】

    • 项目上线前,在公司内进行大量的用户测试,提前发现实际运行中遇到的各类问题。
  • 【4.7、破坏性测试】

    • 使用用户操作手册未禁止的方法和流程对软件进行测试,具体做法请百度。
  • 【4.8、Monkey测试】

    • 类似于破坏性测试,就像猴子一样无目的的、乱点乱按,一般通过编写脚本产生伪随机的事件流,实现对正在开发的应用程序进行压力测试,多用于Android系统。
  • 【4.9、安全性测试】

    • 安全性测试就是检测软件是否安全稳定,是否轻易获取权限、泄漏用户信息、程序崩溃等。
    • 安全性测试范围很广,重点把握:权限、用户信息、数据库安全
    • 例子:
      • 某招生网站在公布招生名单前,被人通过抓包方式获取录取名单。
      • 某网站切换管理员和用户时,不需要重新登录。
  • 【4.10、回归测试和冒烟测试】

5、投产部署阶段

  • 【5.1、物理架构图】
    • 使用Visio画出项目投产的物理架构图,实施的时候便于总体把握。
    • 使用Excel编写集成需求表,集成需求表的作用是寻求公司内其他组同事解决超过自己能力范围内的事情,比如申请虚拟机、申请IP地址、搭建数据库AlwaysOn。
    • 光有集成需求表还不够,还需要一个时间进度表,来排班各个组协助的时间,特别是有依赖关系的项目组,使用拓扑图能很好的帮助到你。
  • 【5.2、部署脚本化】
    • Linux下的很多安装、查找过程都可以使用脚本自动完成。
    • 经常使用的指令:find | grep | sed | cat | source | chmod | sudo | tar | scp | make | vim
  • 【5.3、系统服务】 做成系统服务,这样宕机的节点在重启后,能即使启动服务。
    • Window做成系统服务:下载Instsrv.exe和Srvany.exe,结合注册表可以实现
    • Linux做成系统服务:记住chkconfig --add|systemctl enabl | service指令
  • 【5.4、高可用设计】

6、运维阶段

运维阶段主要是保障服务的SLA,优秀的网站至少提供4个9的SLA,

全年拿365天做计算,看看几个9要停机多久时间做能才能达到!
1年 = 365天 = 8760小时
99.9 = 8760 * (100-99.9)% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
  • 【6.1、监控】
    • 系统监控:
      • 通过ping指令简易判断节点是否宕机。
      • 安装Zabbix,实现对服务器 系统和应用 级别的监控,通过配置可以实现邮件告警功能。
    • 应用监控:
      • 使用HAProxy监控端口,实现对应用存活的简易监控。
    • 日志监控:
    • 分布式监控系统:
      • 普罗米修斯(Prometheus)
  • 【6、2新版本投产替换】
    • 灰度发布
    • 蓝绿发布
    • 金丝雀发布

猜你喜欢

转载自blog.csdn.net/ljfirst/article/details/108299857