个人博客作业 1:就《现代软件工程》提 5 个问题

作为一个非纯 CS 背景、初入软件工程领域的学习者,我希望通过这门课不仅提升编程能力,更理解软件工程背后的逻辑、原则,以及在现实项目中的应用。以下是我在阅读课程材料与参考文献过程中,思考出来的几个问题,借此把学习感受和疑惑整理出来,也希望能和更多同学 / 开发者交流。

一、在“AI + 软件工程”的时代,如何合理划分人机边界?

背景:近年来,随着大语言模型(LLM)在代码生成、自动重构、缺陷修复等方向上的应用研究急速发展,越来越多人期待「AI 帮助写代码、修复 bug」成为主流。
然而,在实际开发中,AI 辅助(如 GitHub Copilot、Cursor 等)也常被批评容易引入“幻觉”、生成不可靠代码,或者在长期维护阶段表现欠佳。

我好奇:在典型的软件工程项目中,什么时候适合把某个子任务交给 AI,什么时候必须由人来完成?也就是说,如何划定“人必须负责”的部分与“AI 可以介入”的部分?

  • 在需求分析、架构设计、复杂业务逻辑、系统安全性、性能优化等环节,AI 的可靠性边界在哪里?
  • 随着时间推移、系统演化、模块耦合越来越复杂,AI 介入带来的“代码漂移”或一致性问题怎么控制?
  • 如果一个项目从头就带有 AI 辅助,是不是整个开发生态(工具链、审查流程、测试策略)都必须被重新设计?

二、软件工程如何适配「机器学习系统 / 数据驱动系统」?

背景:传统软件系统通常是确定性逻辑 + 输入 / 输出的组合。但如果一个系统里嵌入了机器学习 / 模型推理模块,它的行为可能是非确定性的、依赖数据分布、版本演化敏感的。许多研究指出,ML 系统的工程化挑战(版本控制、可测试性、可解释性、模型漂移)是目前软件工程尚未成熟覆盖的领域。:contentReference[oaicite:2]

因此,我想问:在构建一个带 ML 模块 / 数据驱动功能的软件系统时,我们在软件工程上需要做哪些特别设计或妥协?

  • 在需求 / 验收测试阶段,如何设计“可测”的规格(spec)给一个模型模块?
  • 模型更新(上线、回滚、灰度)如何与传统的 CI/CD、版本管理流程融合?
  • 若数据分布发生漂移,如何在系统架构层面做容错或热替换?
  • 在团队协作中,数据科学家、后端工程师、运维工程师之间的边界、职责如何划分?

三、在大规模 / 超大规模系统中,传统软件工程方法还能支撑吗?

背景:在一些极大规模、跨组织、长期演进的软件/系统(也称 Ultra-Large-Scale Systems,ULSS),系统之间具有复杂依赖、异构组件、多利益相关方、持续进化的特性,传统的软件生命周期管理方法可能会失灵。:contentReference[oaicite:3]

问题在于:当系统规模 / 复杂度极度放大时,我们能否仅靠已有的软件工程方法(模块化、架构层次、敏捷迭代、文档管理)就能维持质量和可演进性?如果不能,还需要什么新的范式或思维方式?

  • 比如,如何在规模极大的系统里维持一致性、变更控制、回归测试的可控性?
  • 在多个子系统、多个团队、多个组织跨界协同的场景下,如何定义合理的边界、接口契约、版本演进策略?
  • 当系统演进到某种“生态系统”级别,是不是需要把软件看成社会-技术系统(socio-technical system),而不仅仅代码 + 架构?
  • 是否需要全新的治理机制(模块保险机制、运行时断言、演化监控反馈循环等)?

四、在分布式 / 跨地域 / 跨文化团队中,如何保障沟通与协作效率?

背景:现代软件开发越来越跨地域、跨时区、外包 / 分包常见。将敏捷、Scrum 等面对面协作原生设计的流程,迁移到分布式场景中,会遇沟通延迟、文化冲突、非正式交流缺失、信任建立困难等问题。

所以我好奇:在这种分布式团队环境下,我们在课程里学的那些协作 / 敏捷 / 管理方法,哪些需要特别调整?如何做?

  • 在日常 stand-up、同步会议、设计评审、code review 中,哪些沟通方式会失效?我们该引入哪些补充机制(异步文档、视觉协作工具、设计日志等)?
  • 如何在异步环境下保持团队对系统状态、设计演化、风险的共同感知?
  • 跨文化 / 跨语言团队中,如何避免误解、文化差异带来的摩擦?
  • 当遇到时区不重叠的情况,如何安排“交接”机制、缓冲机制、重叠时区优化?

五、在课程/项目教学环境下,如何更好设计“真实感”的软件工程作业 / 课程项目?

作为学生身份,我也常反思:我们在课程里做的项目(课程设计 / 大作业)与真实工业项目之间,往往存在脱节。以下是我思考出来的问题,用于你作为老师 /课程设计者 /未来课程参与者的反思:

  • 如何在课程项目里合理引入“不可预期变更”(比如需求变动、中途插入安全 /性能要求、外部接口变更等),以模拟真实项目中的不确定性?
  • 在课程项目中是否可以引入“多人协作、跨模块边界”的挑战(让学生分模块、分团队,定义接口、契约、文档、代码合并冲突等)?
  • 是否可以在作业评估中引入“长期维护性”考量(比如后续几周返工、bug 修正、重构任务),而不是只评交付功能?
  • 在课程中,如何设计“代码审查、CI/CD、自动化测试、持续集成 / 部署”的流程,让学生体验完整的软件工程流程?
  • 是否可以让学生参与开源项目或真实项目中的某个子任务,使得课程作业具有“生产环境接轨”的意义,但同时控制风险与可评估性?

posted @ 2025-10-11 17:34  CO5MO5  阅读(26)  评论(2)    收藏  举报