软件权衡
你做出的每一个设计选择都会关闭通往另一种选择的大门。软件开发本质上就是权衡的过程。你必须有目的地做出这些选择。否则,你只能在无意中做出选择。
你常面临的权衡:
• 功能 vs 性能 整洁的代码通常运行较慢。高效的代码通常难以阅读。对于每天运行一次的批处理任务,请使用易读的代码。对于每个请求运行数千次的路径,请使用优化过的代码。
• 灵活性 vs 简洁性 复杂的抽象会让代码难以理解。编写能解决问题的最简代码。在构建时考虑到后续的可扩展性。
• 可扩展性 vs 成本 为应对海量流量进行设计在当下需要投入更多资金。衡量你的增长率有助于你做出决定。如果你每月增长 20%,请为未来做规划。如果资金有限,请控制成本。
• 安全性 vs 易用性 极端的安全性可能会破坏用户体验。我们曾经为一个管理工具强制要求使用硬件令牌。登录成功率从 98% 降至 84%。工程师在紧急情况下被锁在系统之外。后来我们改用移动端推送通知。成功率回升到了 96%。目标应该是合理的安全性,而非极致的安全性。
如何做出更好的决策:
- 明确你的目标。
- 用数据衡量,而非凭空猜测。
- 从简单的解决方案开始。
- 仅在有证据支持时才进行优化。
- 记录下你做出该选择的原因。
我曾尝试优化一个 JSON 序列化器以节省几微秒的时间。结果导致了增加 300 MB 的内存泄漏。性能分析器(profiler)显示,网络 I/O 才是真正的瓶颈。在重写代码之前,务必使用性能分析器。
技术债是真实存在的。今天的捷径意味着明天的代价。当我们接手一个混乱的服务时,我们没有进行大规模重写。我们采用了细微且持续的改动。我们将测试覆盖率从 30% 提高到了 78%。这使修复 Bug 的时间从 4 天缩短到了 1.2 天。
权衡并非一成不变。重新审视你的决策。检查你的优化是否仍然重要。有意识地进行设计可以防止系统在所有方面都表现平庸。
Source: https://dev.to/lavkeshdwivedi/software-tradeoffs-44e7
Optional learning community: https://t.me/GyaanSetuAi