最近在码农翻身公众号看到几篇关于如何成为架构师,提高代码质量和产品稳定迭代的文章,觉得很多东西都值得参考,是自己接下来可以践行和思考的方向。
架构师
客户需求转化为技术实现
- 技术如何选型
- 如何设计才更简洁、更容易实现和扩展
- 如何满足非功能性需求,如性能、安全、高可用性等
刨除好奇心和热爱之外
- 掌握技术原理
- 基础知识:网络、操作系统、数据库、编译
- 应用层:Web 开发框架,HTTP/HTTPS、SSO、OAuth、RESTful、序列化、安全框架、RPC、Web 安全、虚拟机、并发编程、缓存、数据库相关范式、SQL、事务、索引,锁
- 获取项目经验和最佳实践
- 从现有项目中去学习,一定要努力地往上看,看到整个系统,看到端到端的流程
- 多问为什么
- 锻炼自己的抽象能力
- 找到系统中哪些不变的东西,把它们作为哦一个支点来架起整个系统的设计
- 项目总结,自我总结
- 阅读书籍,阅读源码
- 发出自己的声音
- 架构,设计,编码,工程实践,技术发展趋势都能提出自己的见解
- 小组讨论,部门会议,紧急任务处理,技术演讲,博客,客户交流
应用层学习时候,要多问为什么,建议采用这样的句式:因为有 xxxx 的问题,现有的 xxx 和 xxxx 问题解决不了,所以才出现了 xxxx 这个技术。当你在追寻技术的本源的时候,对这个技术的思考就会更加深刻,就能超越很多人。
怎么算把原理给掌握了呢?标准就是你能用自己的语言给别人讲出来
提交代码
提交代码前自己的 7 个问题
- 代码是正确的吗:完成需求且无 bug,自动测试,手动测试
- 代码是完整的吗:边界条件
- 代码是安全的吗:遵守安全最佳实践,是否验证了输入数据,防止了数据植入,经过了已知攻击的安全测试
- 代码是可读、可维护的吗:注释?拆分?命名?
- 代码是可扩展的吗:是否允许添加新功能而不破坏老的代码?是不是参数化的?是不是可配置的?恰当的设计模式来支持扩展?
- 代码是不是高效的:高负荷?异步?内存占用?
- 有没有一些让你可以自豪的地方
产品稳定
如何保证产品稳定迭代呢
- 测试驱动开发(TDD):先构建测试用例,再开始写你的功能代码,比较适合底层的系统和核心稳定的系统,对于需求多变的系统,构建测试用例的人力付出太大,而且需求一变,已有的测试用例可能失效,导致投入产出比不够高
- 灰度发布:上线一个新的客户端版本,代码逻辑已经预埋,但设计了一个开关
- 监控和日志
- 双写,双读验证:新旧代码,划分为两个流程(两个接口),上线到实际环境,然后在同个模块里面调用,一个请求进来后,两个流程分别执行一次,逐字节做对比新旧流程结果,新流程结果只用于对比,返回的依旧是旧流程的结果,如果对比失败,就可能存在异常,要查找并解决。