[I.3] 个人作业:结课总结
[I.3] 个人作业:结课总结
个人作业2:课程总结
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 软件工程 |
| 这个作业的要求在哪里 | [I.1] 个人作业:阅读和提问 |
| 我在这个课程的目标是 | 深入学习软件工程,掌握其核心思想,增强自身团队合作能力,学会敏捷开发 |
| 这个作业在哪个具体方面帮助我实现目标 | 总结课程中学到的知识并将其应用到今后的软件开发实践中去 |
先前博客:[I.1] 个人作业:阅读和提问 - zfz04 - 博客园
问题回顾与解答
1. 关于效能分析工具的问题
问题回顾:
- 除了VSTS还有哪些能效分析工具?
- 能效分析工具除了找到"高能耗"代码还有什么作用?
解答:
通过结对项目和团队项目的实践,我深入使用了Intel VTune Profiler和Visual Studio Profiler等工具。在团队项目的性能优化阶段,我们使用VTune分析了数据库查询瓶颈,发现了一个N+1查询问题,优化后性能提升了40%。
新认识:
效能分析不仅是优化工具,更是架构设计的反馈机制。在团队项目发布后,我们通过持续的性能监控发现了内存泄漏问题,这让我认识到效能分析在维护阶段同样重要。
仍存疑问:
虽然理解了代码注入的基本原理,但对于如何在不同编程语言中实现高效低侵入的代码注入仍不太清楚。
2. 关于结对编程的问题
问题回顾:
如何解决学生因性格差异或技能不匹配导致的合作效率低下问题?
解答:
在结对项目中,我们尝试了以下方法效果不错:
- 使用GitHub Copilot作为"第三方工具",当一方卡顿时可以寻求AI建议
- 采用番茄工作法,每25分钟强制交换角色
- 将任务拆分为小模块,每人负责设计后交叉复审
新认识:
结对编程的价值不仅在于代码质量,更重要的是知识传递。在团队项目转会时,通过短期结对快速让新成员熟悉代码。
新问题:
在远程协作环境下,如何保持结对编程的效率?是否需要专门的工具支持?
3. 关于MSF授权的问题
问题回顾:
如何避免"过度授权"带来的失控风险?
解答:
在团队项目中,我们采用了"渐进式授权":
- 新成员先从明确的小任务开始
- 通过代码评审和每日站会提供反馈
- 使用Azure DevOps的看板可视化工作进展
新认识:
授权不是全有或全无,可以通过工具和流程建立安全网。我们的技术骨干担任"导师"角色,既避免过度干预又提供支持。
4. 关于PM/Dev/QA协作的问题
问题回顾:
当三者目标冲突时如何决策?
解答:
我们在团队项目中引入了"质量门禁"机制:
- 每个迭代设置明确的质量标准
- 三方共同参与DoD(Definition of Done)制定
- 使用SonarQube自动化代码质量检查
新认识:
冲突本身是有价值的,我们在一个紧急需求上通过激烈讨论找到了既保证质量又能按时交付的方案。
5. 关于NABCD框架的问题
问题回顾:
如何将NABCD框架转化为可落地的行动步骤?
解答:
在团队项目立项时,我们:
- 用Lean Canvas补充NABCD框架
- 通过低保真原型快速验证需求(N)
- 竞品分析时关注细分场景(C)
- 将交付(D)拆分为多个MVP
新认识:
学生项目的"独特招数"可以是对现有技术的创造性组合。我们通过合理使用API解决了技术能力不足的问题。
各阶段知识点学习
需求阶段
知识点:领域驱动设计(Domain-Driven Design)
在需求分析阶段,我们使用DDD方法对知识库管理领域进行了建模。通过与产品经理的多次讨论,识别出核心子域包括:文档解析域、向量化处理域、检索域和权限管理域。这帮助我们明确了VDB(向量数据库)和ODB(操作数据库)的边界与交互方式。
实践应用:
- 使用事件风暴工作坊梳理了"文档上传->解析->分块->向量化->存储"的核心流程
- 定义了明确的限界上下文,避免了后期因概念混淆导致的接口混乱
设计阶段
知识点:CQRS模式(Command Query Responsibility Segregation)
针对知识库系统读写特征差异大的特点,我们采用了CQRS架构:
- 命令端(写操作):使用ODB(PostgreSQL)处理文档元数据管理
- 查询端(读操作):VDB(Milvus)专精向量相似度搜索
- 通过领域事件保持数据最终一致性
技术决策:
- 选择Milvus而非Pinecone:考虑成本、可控性和中文社区支持
- 设计异步处理管道:解决CPU密集型向量化处理的性能瓶颈
实现阶段
知识点:Backpressure处理
在实现文档批量导入功能时,遇到了系统过载问题。通过实现基于令牌桶的背压机制:
- 控制同时处理的文档数量
- 队列积压时优雅降级
- 提供进度反馈接口
代码示例(简化):
class ImportController:
def __init__(self):
self.token_bucket = TokenBucket(rate=10) # 10 docs/sec
async def handle_upload(self, documents):
if not self.token_bucket.consume(len(documents)):
raise HTTPException(429, "System busy")
# 处理逻辑...
测试阶段
知识点:向量搜索的确定性测试
传统测试方法难以验证向量相似度搜索的准确性,我们开发了:
- 黄金数据集:人工标注的标准问答对
- 相似度基准测试:确保算法更新不降低召回率
- 模糊测试:随机扰动输入文本验证系统鲁棒性
测试策略:
- 对VDB单独进行负载测试(使用Locust)
- ODB侧重事务一致性测试
发布阶段
知识点:渐进式索引构建
为避免全量重建向量索引导致服务中断:
- 实现增量索引更新
- 开发索引热切换机制
- 监控召回率变化确保质量
发布流程:
- 影子模式运行新索引
- A/B测试对比效果
- 蓝绿切换
维护阶段
知识点:向量漂移监测
发现长期运行后搜索质量下降问题,建立了:
- 定期重新嵌入机制
- 嵌入模型版本管理
- 自动报警阈值(如cosine相似度下降>5%)
监控指标:
- 平均检索延迟
- 缓存命中率
- 分块大小分布
项目经历与心得
个人技术成长
- 向量数据库深度实践:
- 掌握了Milvus的索引类型选择(IVF_FLAT vs. HNSW)
- 实现了混合搜索(向量+关键词)提升召回率
- 优化了批量插入的吞吐量(从100 docs/s提升到500 docs/s)
- 性能优化经验:
- 发现并修复了N+1查询问题
- 通过预计算常用查询的向量提升响应速度
- 使用Redis缓存热门文档块
团队协作收获
- 与算法团队协作:
- 建立了统一的嵌入模型接口规范
- 共同设计了分块策略(考虑语义完整性)
- 开发了模型性能监控仪表盘
- 跨角色沟通:
- 与前端约定高效的数据分页协议
- 协助QA团队构建端到端测试流水线
- 参与制定SLO(服务等级目标)
教训与反思
- 初期低估的挑战:
- 非结构化文档解析的复杂性(PDF/PPT格式差异)
- 中文分词的准确性对向量质量的影响
- 长文本分块的语义边界问题
- 改进方向:
- 引入更精细的权限控制(文档级向量过滤)
- 实现自动化嵌入模型评估流水线
- 探索多模态向量搜索(支持图片/表格)
课程整体收获
通过这个项目,我深刻体会到:
- 工程化思维:从POC到生产可用的系统需要考量的维度完全不同
- 权衡的艺术:在 recall@k 指标与响应延迟间找到平衡点
- 全栈视角:后端设计必须考虑前端使用场景和运维需求
这些经验将指导我未来的技术选型和架构设计,特别是在处理AI与传统系统融合的场景时。最大的感悟是:一个好的后端系统不仅要正确高效,更要为业务演进预留空间。

浙公网安备 33010602011771号