信息系统项目管理师
备注
计划报考中项,通过率挺高的,高项就算了
项目组成的一个例子:
后端应用代码
后端测试代码
日志记录
前端应用代码
前端测试代码
drone - cicd平台
gitea - git平台
文档
渐进式升级
第一阶段: 裸应用代码轻步兵
只实现功能, 简单实现
第二阶段: 自动化测试和运维重兵器
测试驱动开发,devops
第三阶段: 持续迭代优化
大胆优化和重构跟需求无关的应用代码需要多个条件:
足够的测试覆盖率
开明的上级或客户(理解升版出错)
开放的环境,能ssh连接开发环境, 能实施自动化部署
改动的地方保证有对应的测试用例
要满足幂等效应,即当部署出问题时,事故原因应该要能和新需求扯上关系, 并且不影响同事
若以上条件存在一条满足不了, 应该将精力和重新放在重兵器保障下限,只要应用代码能实现功能就可以。 即使满足以上条件,正式动手优化与需求无关的代码前还要好好思考以下几点:
这个项目是否值得我投入时间和精力?
是否发自内心喜欢应用功能?
是否有持续盈利的希望?
真出问题,不能马上解决的情况下能否在第二天处理,而不是当晚通宵解决?
否则,还是建议将时间和精力投入到其他项目或者兼职。
版本号和代码仓库规范
https://blog.csdn.net/weixin_38984879/article/details/124819491
https://semver.org/lang/zh-CN/spec/v2.0.0.html
对标django项目
master分支为生产环境版本 dev分支为测试环境版本
X.Y.Z
X - 主版本号 Y - 子版本号 Z - 修订号
每次增加一个修订号就创建一个tag,每次增加一个子版本号就创建一个新分支,例如:
当前版本号2.0.0, 对应分支v2.0.X, 代码 __version__ = 2.0.0
在v2.0.X分支修复完一个或N个BUG后,修改修订号, 代码 __version__ = 2.0.1
, 发布一个tag: v2.0.1, 依此类推。
有比较大的功能变更或实现,创建新分支v2.1.X, 代码 __version__ = 2.1.0
,依此类推
出现不兼容变更或者项目重构,创建新分支v3.0.X, 代码 __version__ = 3.0.0
,依此类推
在docs记录每一次版本号的变更内容,便于日后追踪问题
建议同时维护两个版本,一个是稳定版(LTS),另外一个是加入了新特性的版本(Current)
django
在server下的 __init__.py
维护版本号
__version__ = '2.4.4'
__date__ = '2023-08-15'
__author__ = '蝉时雨丶'
__contact__ = '397132445@qq.com'
维护多个不同版本的最佳办法
场景
有两个版本, 2.1.X是稳定版本, 目前在生产环境运行, 2.2.X是下一个大版本
构建一个2.1.X和2.2.X的基础分支, 假设命名为dev分支, 当2.1.X发现新BUG时(意味着2.2.X和dev分支都存在这个BUG), 在dev分支创建新分支,假设命名为 fixBUG, 处理完BUG后,同时合并到2.1.X和2.2.X和dev三个分支。
日志
官方文档提供了丰富的 参考案例
使用异步日志
提供应用程序性能
字符串变量拼接使用占位符的方式
import logging
logger = logging.getLogger(__name__)
name: str
# √
logger.info('新增关注, 关注者姓名: {}'.format(name))
# × 降低性能
logger.info('新增关注, 关注者姓名: ' + name)
占位符会先判断日志级别
如果变量是json,使用+号会先进行变量的转换后再判断日志级别,json转换str的过程中会影响性能
所有日志至少保存15天
敏感操作至少6个月, 比如说金钱的提现或修改
避免打印重复日志
造成浪费,底层往外面抛出信息,在接口层收集起来打印日志
error日志应该包含简短信息和异常堆栈信息
logger.error("错误: {}".format(err))
在单元测试覆盖不到的地方打印日志
例如访问外部接口
升级框架
推荐增量更新方法
完整流程参考django文档: https://docs.djangoproject.com/zh-hans/4.2/howto/upgrade-version/
版本控制
一种是一个版本一个release, 对被引用方不友好
一种是同一个代码仓库,v1目录是一个版本,v2目录是一个版本,对被引用方更友好
对于我所在的企业项目中,其实采用第二种方式更合适,因为第一种需要有专人管理版本发布的事项,而目前并没有这个人选对象
标准化开发流程
渐进式阶段+小步重构
渐进式阶段:
第一阶段: 接到需求后, 以最快的速度实现模块功能, 不用管性能和是否优雅, 存在不伤大雅的Bug也没关系,核心功能实现下来就行。 第二阶段: 修复第一阶段留下来的Bug 第三阶段: 以更优雅的代码的实现功能 第四阶段: 以更高效的性能实现功能
小步重构:
从当前阶段重构到下一个阶段, 一有机会就重构, 不停重构,但每次的步伐不要过大。
其他
- 项目文档开发使用Python的sphinx框架
文档代码统一存放在根目录的docs目录
主题首选sphinx_rtd_theme
CI/CD服务器的搭建使用Python的buildbot框架
使用Python的ansible作为自动化运维工具
Vue使用选项式API风格编写代码: 可以理解为面向对象的风格,更接近Python的编写习惯
npm install
改为cnpm install
, 安装速度更快静态页面和同步表单使用django模板, 响应式数据和异步表单统一交给vue处理
项目结构统一化命名:
project/docs ; 文档代码
src ; 后端代码
web ; 前端代码
crawler ; 爬虫代码
playbooks/ ; 运维脚本
deploy.yml ; 部署, 手工触发;
release.yml ; 发行, 手工触发;
test.yml ; 持续集成;
参与开源项目的挑选优先级: 个人有使用但是没有视频只有文档的, 例如sphinx, 参与插件开发,体积小,容易从github下载
面向对象设计(OOD)
单一职责原则: 设计目的单一的类,与结构化方法的高内聚原则是一致的
开放-封闭原则: 对外扩展开放,对修改封闭;
李氏/里氏(Liskov)替换原则: 子类可以替换父类
依赖倒置原则: 要依赖于抽象,而不是具体实现; 针对接口编程,不要针对实现编程
接口隔离原则: 使用多个专门的接口比使用单一的总接口要好
组合重用原则: 要尽量使用组合,而不是继承关系达到重用目的;
迪米特(Demeter)原则(最少知识法则): 一个对象应该对其它对象保持最少的依赖关系
设计模式
针对重复出现的问题所总结出的最佳经验
创建型模式
用于描述如何创建对象
工厂方法模式
抽象工厂模式
原型模式
单例模式
构建器模式
结构型模式
用于描述如何实现类或对象的组合
适配器模式
桥接模式
组合模式
装饰器模式
外观模式
享元模式
代理模式
行为型模式
描述类或对象怎么交互以及怎么分配职责
模板方法模式
策略模式
命令模式
职责链模式
观察者模式
迭代器模式
访问者模式
中介者模式
备忘录模式
状态模式
职责链模式
sdk开发
参见