如何更好的添砖加瓦

  1. 引言
  2. 前言
  3. 史山之从设计到制作
    1. 需求设计
    2. 制作
  4. 史山之从修改到回归
    1. 修改
    2. 测试
  5. 积累
  6. 协作
  7. 36技

引言

记录总结了从7月到11月积累的非技术经验, 涉及添砖加瓦方方面面.

前言

本文是自己从7月到11月积累的部分非技术经验, 总结了工作记录中遇到的问题. 由于是个人经验积累, 适用性不强, 也不是大而全. 发布出来主要还是用于自己自勉, 整理了, 不发出来有感觉浪费.

史山之从设计到制作

需求设计

需求评审
评审时, 如果不是很确定这部分功能, 自己负责的服务器能不能做, 就不要承接下来, 最后发现做不了, 再转手.

需求文档到手

  1. 从需求文档中找到需求点, 协商好需求点由哪个服务器来处理, 防止开发重复内容或者无人处理. 或者由于种种原因是对方压根做不了, 只能自己来做.
  2. 尽量避免想当然的情况, 比如文档中说每天增加一次挑战次数, 但是没有提初始次数是多少次, 这时候最好沟通下.
  3. 虽然可能不清楚其他需求, 但还是尽量能够判断下和其他需求是否有重叠, 导致出现边界情况, 对好这个时候怎么处理.

需求文档看完, 开工之前, 先定协议

定完协议之后, 各个参与人就可以独立开发. 如果先开发再定协议, 可能导致后定的协议不便于所有人使用.

开工之前, 进行下预期设计, 同时评估时间

  1. 写代码之前先在vscode进行下预期设计, 写写伪代码. 虽然需求可能要的比较紧急, 但花一点时间提前设计下, 比直接撸起袖子开干还是感觉最终效率好很多.
    1. 代码放到哪个模块
    2. 这个功能大概是什么流程
  2. 预期设计完成后, 根据功能点和设计, 能够更加准确的进行排期.
  3. 根据需求工作量确定下复杂程度. 虽然完善的设计很重要, 但有时会因为过于完善, 导致简单的需求变得非常复杂, 同时后续也不一定用得上这次设计的完善机制.
  4. 预期下异常情况处理和兜底处理

制作

将重复的项目抽取出来
第一次做的时候, 可能考虑到需求比较简单或者时间不足, 一个功能就放在了一起实现, 但是后续又双叒叕用到这个功能了.对于个人提升来说, 就可以考虑抽取出来了.

做好兼容性处理

负责的功能要将兼容性处理做完善, 能够做到其他人无感知是最好的. 不要想着其他人只需要小小的一点处理就能解决, 到时候不管提示再多次都会有人@问什么问题的, 所以最优解是其他人无感知.

预估时间后无法完成后, 要及时周知相关人员

应该及时通知,否则默认你这边完成了, 其他人进行了一些处理, 导致不必要的问题出现.

开发的时候加足DEBUG日志

  1. 遇到问题的时, 查日志相对看代码是效率非常高的解决方式.
  2. 加日志的位置和内容还是吃经验. 个人感觉站在将来查问题的角度去加日志有帮助.
  3. DEBUG日志一般会在线上关闭, 一些重要内容就要注意使用更高的等级, 否则一点日志都没, 外网问题全靠复现才能查.

个人统一的工具仓库
工作中难免会写出来一些小工具, 提供给他人使用的时候一般都是放到公共代码库中, 这个时候工具就会在本地和公共代码库有两份, 注意只在一个地方修改, 否则容易出现不一致.

需求中途变更后简化代码

代码设计初期一般会留有一些考虑能够应对需求变化,但是需求变化后可能会导致实现可以简化,这个时候继续复用复杂的代码还是简化代码就需要考虑了.

代码尽量一步成型
个人感觉修改次数越多, 出问题的概率越高, 修改了这里忘记了同步修改其他地方是重灾区.

避免设计无用的东西
一些本来加个函数就能解决问题的, 是否要抽成一个模块就要仔细考虑下了.

数值类配置化or计算化

  1. 数值类的最好不要写死
    1. 如果是配置中的值,配置变了,写死的数值就会导致问题
    2. 还可能导致本来热更就能搞定的,需要重新编译服务器
  2. 尽量不要写死参数, 配置或者计算得来, 否则后面还需要同步修改.

减少通用错误码的使用

如果错误码一对一能够及时发现问题, 如果是多个地方使用的, 只能靠日志+看代码路径了.

客户端参数校验

老生常谈了, 基本上每本书里都会提这点, 这次就出现了所有服务器都没校验的一个操作, 甚至是客户端都没检验.

状态校验放错了位置. 写的时候还是没考虑好运行路径

加代码的时候, 仔细考虑好相关的运行路径. 可能某个分支下, 这次加的就是有问题的.

加快调试速度

需求写完之后, 想要测试下自己的代码, 尽量将GM工具完善好, 否则每次修改代码都要重复操作好几步, 导致花费的时间反而比加一下工具要多.

  • 副作用, GM工具要标注下使用场景, 否则错误场景使用后容易出乌龙问题.

史山之从修改到回归

修改

修改前-不确定是bug还是feature时要进行确认
否则可能将feature作为bug处理了, 后续还要改回来, 造成不必要的时间浪费或者麻烦.

修改前-遇到BUG还是感觉留下现场,比重启解决问题更加重要

问题可以后面解决,复现问题可能再也没有机会了

修改前-简单方式解决问题

对于一个小bug, 简单的打个补丁就可以解决的话, 还是偏向于打补丁. 至于刨根问题解决虽然好, 但是一旦牵扯过多, 然后自己对项目不了解, 大刀阔斧重构容易出问题.

查问题中-用物体的事件经过查问题挺方便的

事件驱动的场景下, 可以先查询顶层都有那些事件, 看看这些事件的内容和实际是否正确, 比一下钻到底层查问题要快很多.

影响扩大-确定修改后果, 注意一个函数都有哪些作用

  1. 一个函数可能不是你想的那种作用, 或者带有一些条件, 再或者是副作用. 之前没有使用过的, 不熟悉的最好看一看实现.
  2. 修改一处代码的时候, 考虑全面是否会波及其他调用方

影响扩大-抽取函数注意不要影响到原区域功能

发现一段代码可以复用的时候, 会从其他函数中将这个函数抽取出来. 但是抽出来的函数增加代码的时候, 注意不要影响到原位置. 如在抽取出来的函数中, 由于其他需求, 增加了一层判断, 导致原位置(抽取函数前的位置)功能被影响.

影响扩大-enum中增加新类型

enum中增加新类型后要注意看看这个enum的使用位置, 如果只是关注自己新写的代码忽略旧代码, 可能导致旧代码的判断过不去.

修改后-BUG修复关联BUG单

否则后续会忘记为啥修改这里, 当时是什么BUG做出的这样的处理.

测试

尽可能进行全面的自测

真的有某些代码是依靠BUG运行的, 修复BUG之后反而运行不了了, 所以基本的测试是必需的, 能想到的可能影响到的地方, 最好也是自测一下. 想到的地方不去测一下的话, 可能就是想到的这个地方出了问题.

A通过B通过不等于A+B通过

一个功能还是完整的测试吧,A功能虽然等于B+C功能,但B和C功能分别正确 不一定B+C就是正确的

自动化测试

一些功能测起来可能比较麻烦, 使用自动化工具会方便很多, 比如pyclient完全模拟一个客户端, 写代码有时候比点来点去构建测试环境方便很多.

积累

问题的优先级安排

并行处理任务的时候, 注意优先级的安排. 可能当前的工作进行到一半, 有其他高优先级的工作要做的话, 还是要切过去. 尤其是查BUG到一半的时候, 很容易上头, 导致又多查了半天.

充分关注自己的工作

其他人都开始要联调了, 自己的功能还没发布到服务器上. 虽然当时在处理其他问题, 但还是已经做过的善后优先一些.

不懂就问

文档较少, 全靠口口相传, 遇到不懂得项目, 一定要进行询问, 不能常识性的去做.

重视不起眼的小问题,可能背后的原因是非常离谱的

遇到过不止1-2次了, 看起来就是很小的一个问题, 深究起来问题可能一串一串的.

特殊处理

没有注释的代码, 可能使用了一些特殊规定, 如果错误删掉了就会影响到功能. 比如数值是0的时候, 按照1来处理, 看描述很简单, 但是实际代码可能没有那么直观.

预期下当前所做是不是可以解决最终问题, 而不是当前某一步

当前所做可能确实能解决当前问题, 但是不一定能解决最终问题. 比如传输日志之前需要压缩, 压缩成几个小包也是压缩, 压缩成超大包也是压缩, 但是压缩成超大包可能不利于传输和解压.

去看看别人负责的模块, 不要只顾自己的模块

对于多模块(多服务器)后台, 多去关注下自己负责模块之外的内容, 这样对项目了解的更深.

问题的原因, 不一定是第一印象想到的点

遇到问题即使下意识感觉问题就是那里, 也一定要确认下. 可能并不是那样.

协作

他人回复的内容一定要仔细理解,不要含主观臆断

  1. X场景下,……………………………(省略),这个功能就不需要了。(非X场景是需要的,不能直接删掉这个功能)
  2. 今天晚上就合入版本了(几点?能不能在全量发布服务器前完成,而不是晚上这种模糊时间)

后台开发代表全部后台, 前台开发代表全部前台

后台有多个服务器,每个服务器不同的人负责,前台可能认为后台是一个整体,所以找你沟通的时候最好不要只考虑本服务器的事情, 有需要就拉上其他服务器的一起建群.

帮忙

帮忙处理东西的时候,要问清楚原因, 搞清楚要做啥, 不能只是直接照做.

对应的事情尽量给对应的人去做

运维可以通过内网传输日志, 比通过sz和rz快和稳定很多.

36技

CR发起前可以自己整一个临时CR看看代码

每次提交代码前, 全局的看一看自己的代码, 可能功能正确, 但是有不小心动到其他地方的代码.

测试代码在最终CR的时候要及时去掉 使用TODO 名字方便检索

使用TODO标记测试代码, 提交前批量查找下, 全部去掉.

不建议手动操作流水线

流水线中某一步错误后, 尽量重新触发流水线. 手动执行错误的一步, 很容易出错, 漏掉某些操作.

自动化操作没有监管人

流水线有的没有人监管, 即使将结果通知到了使用者, 使用者可能也会忽视结果, 导致有错误没有发现, 进而导致其他问题. 所以错误提示要尽可能的明显.

压测和扩容

  1. 压测
    1. 压测场景和实际场景不匹配
      1. 出现问题之后,都能发现问题,关键是出现问题前发现限制点
  2. 扩容
    1. 重要节点前, 预备一些机器, 否则出问题的时候, 机器没办法即时拿到.

发现问题比解决问题更重要

性能优化感觉难点是发现性能问题, 包括编译加速. (20%的问题造成了80%的负面影响, 如果去处理另外80%的问题收益就很低)

指定时间点触发的循环定时器, 每轮都计算下时间相比固定时间的更加稳定

尽量统一函数对统一内容进行清除, 比如标志位, 这样方便发现错误清理的地方

测试东西或者搞新东西的时候, 注意不要影响到旧功能

该开测试空间的开测试空间, 防止影响到其他空间