软件支持

  • 产品缺陷性支持与非缺陷性支持
  • 支持成本
    • 商用软件:服务收费
    • 开源软件:Stackoverflow, github
  • 外层:客服
    • 咨询电话
    • 在线提交问题
  • 技术问题
    • 交付及安装补丁集

软件维护

  • 软件维护原则
    • 不损害程序的质量
    • 保持程序风格的一致性和功能的完整性
    • 应有利于将来程序的改变
    • 对用户没有不利的影响
  • 基于缺陷的软件维护
    • 缺陷定位/调试:程序频谱
    • 缺陷修复:自动修复技术
    • 回归测试
    • 集成

软件演化

  • 变更控制
    • 发起变更请求
    • 批准变更请求
    • 执行变更请求
    • 跟踪和关闭变更请求
  • 程序理解
  • 二次开发
  • 集成

Devops

  • DevOps: 版本研发 + 交付上线

    • 版本研发:持续交付
    • 流程:敏捷开发
  • 开发过程

    • 集成 Integration:编译、测试、打包
    • 部署 Deployment:应用组件或基本设施的代码或配置变更在产品环境生效称为“部署”
    • 发布 Release:具有业务影响的功能变化对最终用户可见
    • 交付 Delivery:从 Deployment 到 Release 之间的阶段,更多的强调的是一种能力
  • 三个阶段

    • Flow 宏观思维:开发发布自动化

      • 持续集成:开发人员提交了新代码之后,立刻进行构建、(单元)测试

        Maven, Gradle, Jenkins, Gitlab Cl

      • 持续交付:将集成后的代码部署到更贴近真实运行环境的「类生产环境」中

        Docker, Vagrant, Logstash

      • 持续部署

      • 持续演化

  • Feedback 反馈闭环:确保反馈的稳定提供,且包括缩短和优化反馈循环,以便人们尽可能快地 自动收到反馈

  • Continual Learning 持续的验证和提升的文化

代码重构

代码“坏味道”

  • 重复代码
  • 过长函数 (Long Method)/过大的类 (Large Class):将查询函数和修改函数分离
  • 过长参数列表 (Long Parameter List)/无用函数参数(Unused Function Parameter):移除参数
  • 不可读或者可读性差的变量名和函数名 (unread variable or function name):重命名
  • 异曲同工类(Alternative Classes with Different Interfaces)
    • 令函数携带参数
  • Switch 过多使用(Switch Abuse):以明确函数取代参数
  • 冗余类(Lazy Class)/冗余函数(Lazy Function)
  • 函数圈复杂度超过 10(The Complexity is over 10)
  • 依恋情结(Feature Envy)
  • 过度扩展设计(Over-extend design)
  • 过度耦合的消息链(Message Chains)
  • 令人迷惑的临时字段(Temporary Field)
  • 过多注释 (Too Many Comments)

重构技巧

  • 反射去除分支结构
  • 多态取代条件表达式

重构工具

  • 代码质量管理工具
    • SonarQube
  • 重复代码检测工具
    • PMD
    • Simian

开源工具

数据库 Oracle, MySQL, Cassandra
持续集成 Jenkins, TeamCity,Github Actions
部署 SSH, XLDeploy
云/laaS,PaaS Amazon Web Servies, Azure
业务分析/监控 Splunk, Nagios
配置管理 Git, SVN
库管理 Nexus, NuGet
配置/服务开通 Chef, Puppet, Ansible, Vagrant
发布管理 XL Release, UrbanCode Release
日志 Sumo Logic, Logstash
构建 Gradle, Ant, Maven
测试 Junit, Cucumber, Selenium, Jmeter, Appium
容器化 Docker, Kubernetes, Mesos
协作 Jira, Flowdock
安全 Snort, CyberArk