*************************** 信息系统项目管理师 *************************** :理论知识: https://www.bilibili.com/video/BV1oN41127QH/ .. note:: 计划报考中项,通过率挺高的,高项就算了 项目组成的一个例子: * 后端应用代码 * 后端测试代码 * 日志记录 * 前端应用代码 * 前端测试代码 * 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下的 :file:`__init__.py` 维护版本号 .. code-block:: python __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三个分支。 日志 ============================ 官方文档提供了丰富的 `参考案例 `_ 使用异步日志 ---------------------------------- 提供应用程序性能 字符串变量拼接使用占位符的方式 -------------------------------------- .. code-block:: python import logging logger = logging.getLogger(__name__) name: str # √ logger.info('新增关注, 关注者姓名: {}'.format(name)) # × 降低性能 logger.info('新增关注, 关注者姓名: ' + name) 占位符会先判断日志级别 如果变量是json,使用+号会先进行变量的转换后再判断日志级别,json转换str的过程中会影响性能 所有日志至少保存15天 ----------------------------------- 敏感操作至少6个月, 比如说金钱的提现或修改 避免打印重复日志 ------------------------ 造成浪费,底层往外面抛出信息,在接口层收集起来打印日志 error日志应该包含简短信息和异常堆栈信息 ----------------------------------------------------- .. code-block:: python 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处理 * 项目结构统一化命名: .. code-block:: text project/docs ; 文档代码 src ; 后端代码 web ; 前端代码 crawler ; 爬虫代码 playbooks/ ; 运维脚本 deploy.yml ; 部署, 手工触发; release.yml ; 发行, 手工触发; test.yml ; 持续集成; * 参与开源项目的挑选优先级: 个人有使用但是没有视频只有文档的, 例如sphinx, 参与插件开发,体积小,容易从github下载 面向对象设计(OOD) ================================================== * 单一职责原则: 设计目的单一的类,与结构化方法的高内聚原则是一致的 * 开放-封闭原则: 对外扩展开放,对修改封闭; * 李氏/里氏(Liskov)替换原则: 子类可以替换父类 * 依赖倒置原则: 要依赖于抽象,而不是具体实现; 针对接口编程,不要针对实现编程 * 接口隔离原则: 使用多个专门的接口比使用单一的总接口要好 * 组合重用原则: 要尽量使用组合,而不是继承关系达到重用目的; * 迪米特(Demeter)原则(最少知识法则): 一个对象应该对其它对象保持最少的依赖关系 设计模式 =================================================== 针对重复出现的问题所总结出的最佳经验 创建型模式 ---------------------------------- 用于描述如何创建对象 * 工厂方法模式 * 抽象工厂模式 * 原型模式 * 单例模式 * 构建器模式 结构型模式 ------------------------------- 用于描述如何实现类或对象的组合 * 适配器模式 * 桥接模式 * 组合模式 * 装饰器模式 * 外观模式 * 享元模式 * 代理模式 行为型模式 ------------------------------------ 描述类或对象怎么交互以及怎么分配职责 * 模板方法模式 * 策略模式 * 命令模式 * 职责链模式 * 观察者模式 * 迭代器模式 * 访问者模式 * 中介者模式 * 备忘录模式 * 状态模式 * 职责链模式 sdk开发 =============================== 实现案例: https://gitee.com/TencentCloud/tencentcloud-sdk-python/blob/master/tencentcloud/tsf/v20180326/tsf_client.py .. seealso:: `如何编写sdk? `_