2311061106/REPORT.md
23175 b8b09fd9d4
Some checks failed
autograde-final-vibevault / check-trigger (push) Successful in 13s
autograde-final-vibevault / grade (push) Failing after 55s
完成作业
2025-12-14 16:02:40 +08:00

9.8 KiB
Raw Permalink Blame History

后端开发反思报告

请参考 REPORT_GUIDE.md 了解写作要求。建议 8001500 字。


1. 我遇到的最大挑战

在开发音乐平台后端时我遇到的最大挑战是API设计的一致性和错误处理。这个问题差点让前后端协作陷入僵局也让我深刻体会到了"前期规范不足,后期加倍偿还"的道理。

1.1 混乱的开始

开发初期我没有制定任何API规范都是想到什么写什么。结果不出两周API就变得一团糟

  • 状态码混乱添加歌曲到歌单时歌曲已存在返回500 Internal Server Error实际应该是409 Conflict用户未登录访问需要权限的API时返回404 Not Found实际应该是401 Unauthorized
  • 错误信息模糊:所有错误都返回"Internal Server Error",前端根本不知道哪里出了问题
  • 响应格式不统一:有的接口直接返回数据,有的返回{code: 200, data: {...}},有的返回{success: true, result: {...}}

1.2 痛定思痛的排查

我意识到必须解决这个问题,于是开始了全面排查:

  1. 日志分析查看后端日志发现500错误是由于重复添加歌曲时的数据库约束违规引起的但代码中没有捕获这个异常直接抛出导致500错误
  2. API规范学习查阅RESTful API设计最佳实践发现应该根据错误类型使用合适的HTTP状态码而不是统一用500
  3. 错误处理审查:检查现有代码,发现每个控制器方法都自己处理异常,没有全局统一的错误处理机制

1.3 重构之路

我用了三天时间彻底重构了API设计和错误处理机制

  1. 制定API规范

    • 统一HTTP方法使用GET获取POST创建PUT更新DELETE删除
    • 规范路径命名:/api/playlists/{id}/songs获取歌单中的歌曲
    • 统一响应格式:所有接口返回{code: 200, message: "success", data: {...}}
  2. 规范错误信息:为每种错误场景提供具体的错误信息,如"歌曲已存在于歌单中"、"用户未登录"等

  3. 完善状态码使用:

    • 400 Bad Request请求参数错误
    • 401 Unauthorized未登录
    • 403 Forbidden无权限
    • 404 Not Found资源不存在
    • 409 Conflict资源冲突

1.4 成果与反思

重构后前后端协作效率提升了至少50%

  • 前端不再需要猜测错误原因,直接根据错误信息就能定位问题
  • 状态码的统一使用让前端能更好地处理各种场景
  • 响应格式的统一减少了前端数据处理的复杂度

这个经历让我明白API设计不仅仅是技术问题更是团队协作的基础。一个好的API规范能让整个开发过程事半功倍。

2. 如果重新做一遍:从教训中学习

经过这次开发,我总结了很多经验教训。如果能重新开发这个项目,我会从以下几个方面进行改进:

2.1 模块化设计:从混乱到有序

痛点回忆开发到中期时UserService.java文件已经超过了500行包含了登录、注册、获取用户信息、修改密码、管理歌单等所有和用户相关的功能。每次修改一个小功能都要在这个大文件里找半天。有一次我修改了登录逻辑结果不小心影响了歌单管理功能导致用户无法正常创建歌单。

改进方案:

  • 严格分层架构Controller层只处理请求和响应Service层只处理业务逻辑Repository层只处理数据访问
  • 模块拆分将系统拆分为独立的业务模块每个模块有自己的Controller、Service和Repository
    • 用户模块:处理登录、注册、个人信息管理
    • 歌单模块:处理歌单的创建、修改、删除和分享
    • 歌曲模块:处理歌曲的上传、播放和搜索
  • 通用功能抽取:将认证、日志、错误处理等通用功能抽取为独立的模块,提高代码复用性

2.2 测试覆盖:从"靠运气"到"有保障"

痛点回忆项目接近完成时我修复了一个播放列表的bug结果导致登录功能无法正常工作。我花了一天时间才找到问题所在——原来我在修改一个共享的工具函数时破坏了登录逻辑。如果当时有完善的测试用例这个问题早就被发现了。

改进方案:

  • 测试驱动开发:先写测试用例,再实现功能,确保每个功能都有测试覆盖
  • 全面测试覆盖:
    • 单元测试使用Mockito模拟外部依赖测试核心业务逻辑
    • 集成测试测试模块之间的协作确保API接口正常工作
    • 自动化测试实现CI/CD流水线每次代码变更都自动运行测试

2.3 性能优化:从"能用"到"好用"

痛点回忆:项目上线测试时,有用户反馈"获取歌单列表太慢"。我检查后发现获取歌单时同时查询了所有歌曲信息导致响应时间超过5秒。这个问题严重影响了用户体验。

改进方案:

  • 数据库优化为常用查询字段如user_id、playlist_id添加索引
  • 缓存机制使用Redis缓存热门歌单和歌曲数据减少数据库查询压力
  • 数据懒加载:获取歌单列表时只查询歌单基本信息,点击歌单详情时再查询歌曲信息
  • API限流使用Redis实现API限流防止恶意请求导致服务器过载

2.4 API版本控制从"随心所欲"到"规范升级"

痛点回忆我曾经直接修改了获取用户信息API的响应格式导致前端应用崩溃。前端同学抱怨说"你改API至少告诉我一声啊"这个事件让我意识到API版本控制的重要性。

改进方案:

  • 版本控制为API添加版本前缀如/v1/、v2/),确保后续升级不会影响现有客户端
  • 文档自动化使用Swagger自动生成和更新API文档保持文档与代码同步
  • 变更通知修改API时提前通知前端并提供迁移指南

3. AI协同开发惊喜与教训

在这次开发中我频繁使用AI辅助开发从代码生成到问题解决AI确实帮了我很多忙但也带来了一些教训。

3.1 AI的惊喜事半功倍的时刻

  1. 代码框架快速生成: 开发初期我需要创建大量的后端代码。我向AI描述了音乐平台的核心实体User、Playlist、Song和功能AI在10分钟内就生成了完整的代码框架包括Spring Boot控制器、服务层、仓库层和实体类。这让我节省了至少一周的开发时间能够专注于核心业务逻辑。

  2. 协助调试复杂错误: 在实现歌曲播放计数功能时我遇到了一个并发更新的问题当多个用户同时播放同一首歌曲时播放计数可能不会正确增加。我向AI描述了问题现象和相关代码AI分析后指出这是典型的并发更新问题并建议使用乐观锁@Version注解或数据库层面的原子操作来解决。根据AI的建议我在Song实体中添加了@Version注解并修改了更新播放计数的代码成功解决了这个问题。

  3. 提供技术解决方案: 在实现音频播放功能时我遇到了自动播放被浏览器阻止的问题。我向AI描述了问题AI提供了多种解决方案包括监听用户交互事件、使用Web Audio API等。根据AI的建议我实现了一个兼容各种浏览器的自动播放解决方案。

4.2 AI 误导我的经历

  1. 生成有安全漏洞的代码: 在开发用户认证功能时我让AI生成一个用户登录的控制器方法。AI生成的代码中直接使用了字符串拼接的方式构建SQL查询语句这存在严重的SQL注入风险。幸运的是我在代码审查时发现了这个问题并将其修改为使用JPA的参数化查询。这个经历提醒我AI生成的代码可能存在安全漏洞必须进行仔细的审查和测试。

  2. 过度设计的诱惑: 实现歌单分享功能时我向AI描述了需求允许用户分享歌单给其他用户或生成分享链接。AI建议使用复杂的权限管理系统包括角色、权限、资源等概念生成了几百行代码。

    然而这个设计远超实际需求。最后我简化了设计只实现了基于链接的分享功能生成包含唯一token的链接代码不到50行就满足了需求。

    这个教训让我学会了"需求导向",而不是被复杂的技术方案所诱惑。

4. 总结与反思:成长与未来

这次后端开发经历就像一场"实战演习",让我在真实的开发环境中学习和成长。回顾整个过程,我既有收获,也有反思。

4.1 我的成长

  1. 技术能力的提升:

    • 从只会写简单接口的新手成长为能够设计完整API体系的开发者
    • 掌握了Spring Boot的核心概念和最佳实践
    • 学会了如何处理并发问题、优化性能、保障安全
  2. 问题解决能力的提高:

    • 遇到问题时,不再慌张,而是学会了系统地分析和解决
    • 掌握了日志分析、错误排查、性能优化的方法
  3. 团队协作意识的增强:

    • 深刻理解了前后端协作的重要性
    • 学会了如何制定规范、沟通需求、解决冲突

4.2 未来的改进方向

  1. 技术深度:

    • 深入学习Spring Boot源码和原理
    • 掌握微服务架构和分布式系统设计
    • 学习云原生技术Docker、Kubernetes
  2. 架构能力:

    • 学习高可用、高性能系统的设计
    • 掌握领域驱动设计DDD思想
    • 研究系统的可扩展性和可维护性
  3. 软技能提升:

    • 提高沟通能力,更好地与团队成员协作
    • 学习项目管理知识,提高项目管理能力
    • 培养产品思维,关注用户需求和业务价值

这次开发经历让我深刻体会到,后端开发不仅仅是写代码,更是一个不断学习、不断改进的过程。我会带着这次的经验和教训,继续在开发的道路上前进。