[I.3] 个人作业:结课总结
[I.3] 个人作业:结课总结
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 2025春季软件工程 |
| 这个作业的要求在哪里 | [I.3] 个人作业:结课总结 |
| 我在这个课程的目标是 | 掌握软件工程原理与敏捷协作,实现高质量系统全周期工程化,开发出一款令人满意的软件 |
| 这个作业在哪个具体方面帮助我实现目标 | 提问回顾与个人总结 |
提问博客链接
对曾经提出的问题的解答与反思
(一)AI辅助编程的当下,结对编程是否还有意义?
在经过和fxk同学的结对编程后,作为AI Coding的深度用户,我认为结对编程仍然有其独特的价值。
在我们的结对编程中,fxk同学的经验和思路帮助我更好地理解了项目需求和设计模式,我们在过程中也同时使用了AI工具来辅助编程。通过这种方式,我们不仅提高了工作效率,还增强了对代码的理解和掌控。
例如贪吃蛇任务中,鉴于Rust的编程风格和语法与Python有较大差异,我首先使用python设计了一个简单的操作框架,帮助fxk同学更快地理解游戏逻辑和操作流程。然后我们一起将这个框架转换为Rust代码,并在过程中讨论了Rust的特性和最佳实践。这种合作方式使得我们能够更高效地完成任务,同时也提升了双方的编程能力。
所以针对以前的质疑——“随着copliot、comate这些代码补全工具的出现,保证了语法的正确性,同时,用户需求方面可以与ai工具进行交流,而且不会出现矛盾,这时结对编程的效率是否要低于AI辅助下的单人编程”,再经过结对编程的实践后,我认为结对编程仍然是一个非常有价值的实践,它可以帮助团队成员更好地理解项目需求、提高代码质量,并促进团队协作。AI工具可以作为辅助,但不能完全替代人类的创造力和判断力。
新的问题:在我们的实践中,更偏向于都会或多或少的需要写代码,传统的驾驶员-导航员是否仍然适用?还是说我们可以采用更灵活的角色分配方式?
(二)既然软件存在生存周期,就一定有迭代周期,而软件的质量在敏捷开发中又至关重要。敏捷开发方法如何通过其核心原则和实践,在快速迭代中有效保障并提升软件质量?
敏捷开发方法通过其核心原则和实践,在快速迭代中有效保障并提升软件质量,主要体现在以下几个方面:
- 持续集成和持续交付:敏捷开发强调频繁地将代码集成到主干,并进行自动化测试。这种做法可以及时发现和修复问题,确保软件在每个迭代中都保持高质量。
- 迭代和增量开发:敏捷开发采用短周期的迭代,每个迭代都交付一个可用的增量。这种方式允许团队在每个迭代中评估和改进软件质量,确保最终产品符合用户需求。
- 跨职能团队:敏捷开发鼓励团队成员具备多种技能,能够在不同领域协作。这种跨职能的团队结构有助于提高软件质量,因为团队成员可以从不同角度审视和改进代码。
在JieNote的整个开发过程中,我们团队也切切实实地应用了这些敏捷开发的核心原则和实践。我们在github上使用workflow实现了持续集成和持续交付,确保每次提交都经过自动化测试,此外,这些操作也便于前后端协作。
我们采用了迭代和增量开发的方式,每个迭代都交付一个可用的增量,并在每次会议中中队每个迭代中进行评估和改进软件质量。团队成员之间的跨职能协作也使得我们能够更好地理解和改进代码。
同时,团队大多数成员都具备多种技能,例如针对前端的PDF预览功能,我们尝试了多种实现方式,但大多效果不佳,这时候我们就通过灵活的人员调整,让负责测试的ykq同学来尝试实现这个功能,通过复现并更改github上一个开源项目的代码,最终完美实现了PDF预览功能。
总之,敏捷开发方法通过持续集成、迭代和增量开发、跨职能团队等实践,有效保障并提升软件质量。在JieNote的开发过程中,我们团队也切实应用了这些原则和实践,确保了软件的高质量。
(三)大部分工具类App项目,企业为盈利新增付费会员专属功能,但用户抱怨基础功能被削弱。团队采用迭代灰度发布,通过用户行为数据逐步优化付费模型,但初期仍导致部分用户流失。敏捷宣言强调“客户合作高于合同谈判”,但未明确“客户”是否包含企业自身作为利益相关方;在敏捷开发中,如何平衡企业商业模式驱动的内生需求(如商业化功能)与用户实际需求之间的矛盾,既保障企业可持续发展,又避免损害用户体验和产品质量?
针对这个问题,其实我们的开发中涉及比较少,因为我们是一个开源项目,主要是为了学习和实践软件工程的知识,而不是为了盈利。
但我认为在实际的商业项目中,平衡企业商业模式驱动的内生需求与用户实际需求之间的矛盾是一个非常重要的问题。
在敏捷开发中,我们可以通过以下几种方式来平衡这两者之间的矛盾:
- 用户反馈和数据驱动:通过收集用户反馈和行为数据,了解用户的实际需求和痛点,从而指导产品的迭代和优化。敏捷开发强调与客户的合作,通过持续的沟通和反馈,确保产品能够满足用户的期望。这一点在我们的项目中也得到了体现,我们通过用户测试和反馈来不断改进产品功能和用户体验。
- 迭代和实验:在产品迭代中,可以采用灰度发布等方式,逐步推出新功能或商业化模型,并通过用户反馈和数据分析来评估其影响。这种方式可以降低风险,同时确保产品质量和用户体验。
(四)在定义典型用户角色时,如何准确识别并分类“受欢迎”与“不受欢迎”用户,避免因角色边界模糊导致功能设计矛盾或安全漏洞?尤其是当同一用户行为在不同业务场景中可能被赋予相反角色属性时,应如何建立动态且一致的判定标准?
我们开发过程中,面向的用户主要是大学生和相关科研人员,因此我们在定义用户角色时,主要考虑了他们的需求和使用场景。
在识别和分类“受欢迎”与“不受欢迎”用户时,我们可以采用以下几种方法:
- 用户画像:通过用户调研和数据分析,建立用户画像,了解不同用户的需求、行为和偏好,从而更好地识别和分类用户角色。例如,我们通过问卷调查,大概了解了用户对JieNote的需求和期望,从而在功能设计中更好地满足他们的需求。此外,由于我们的产品面向用户也包括我们自己,作为开发者,我们也会考虑到自己的需求和使用场景,从而在功能设计中更好地满足这些需求。
- 动态角色判定:在实际应用中,用户的行为和角色可能会随着时间和场景的变化而变化。因此,我们可以建立动态的角色判定标准,根据用户的行为和上下文信息来实时判断其角色属性。例如,在我们的项目中,我们可以根据用户的操作记录和使用习惯,例如在文献库推荐中,我们通过用户的阅读历史来判断其角色属性,从而提供更个性化的推荐服务。
新的问题:在实际应用中,用户的行为和角色可能会随着时间和场景的变化而变化。我们如何设计这个动态角色判定标准,以确保其准确性和一致性?
(五)在软件工程实践中,如何有效培养和衡量设计师与工程师的“同理心”,以确保其真正转化为以用户为中心的设计决策?尤其是在技术实现复杂度高或商业目标与用户需求冲突时,如何避免“伪同理心”(如表面采纳用户反馈却未解决核心痛点)?
JieNote的开发过程中,我们团队成员之间的设计决策主要体现在以下几个方面:
- 用户调研和反馈:我们通过问卷调查和用户访谈等方式,了解用户的需求和痛点,从而指导设计决策。例如,我们在项目初期进行了用户调研,收集了大量用户反馈,这些反馈帮助我们更好地理解用户的需求和期望。
- 开展角色扮演:让团队成员模拟不同用户身份(如研究生、科研人员)完成核心任务,用手机记录操作卡顿点,复盘行为背后的需求逻辑。
"做中学"的感悟与思考
需求阶段: 团队进行选题时,我们进行了多次讨论和调研,如coze类似的大模型开发平台、小游戏等,最终确定了JieNote作为我们的项目。我们通过问卷调查和用户访谈等方式,了解用户的需求和痛点,从而指导设计决策。总之,需求阶段是整个项目的基础,我们通过充分的调研和讨论,确保了项目的方向和目标。
设计阶段: 作为后端开发者,我主要负责JieNote的后端设计和实现。在设计阶段,我们团队进行了多次讨论,确定了系统的架构和模块划分。我们采用了微服务架构,将系统划分为多个独立的服务,以提高系统的可维护性和扩展性。同时,我和hxr同学还通过多次讨论设计了数据库结构(E-R图等)和API接口,以确保前后端的协同工作。
实现阶段: 开发过程中,我们采用了敏捷开发方法,进行了多次迭代和增量开发。每个迭代都交付一个可用的增量,并在每次会议中评估和改进软件质量。我主要负责后端的登陆注册,笔记功能,文献库等模块的实现。同时便于团队管理,我们还使用了飞书进行任务分配和进度跟踪,确保每个成员都能清楚自己的任务和进度。

测试阶段: 测试主要是由ykq同学负责的,而我主要负责对交付代码进行简单逻辑测试,他通过编写测试用例和自动化测试脚本,对我的api进行了全面的测试,确保了系统的稳定性和可靠性。我们还通过用户测试和反馈来不断改进产品功能和用户体验。通过测试阶段,我了解了测试的重要性和方法,学会了如何编写测试用例和进行自动化测试。
发布阶段: 发布阶段发生了一个小插曲,由于我们为了便于多人协作,最开始时将包含大模型的key、JWT加密密码、SMTP服务密码等大量敏感信息的配置文件.env文件上传到了github上,导致了敏感信息泄露。我们及时发现并删除了这个文件,并重新生成了相关的密钥和密码,同时也加强了对敏感信息的管理和保护。通过这个小插曲,我认识到在软件开发中,保护敏感信息的重要性,以及如何在发布阶段进行安全管理。这里也十分感谢学长的提醒和帮助,让我们及时发现并解决了这个问题。

维护阶段: 目前项目的维护阶段并不长,但我们已经开始收集用户反馈和行为数据,以指导后续的迭代和优化。我们还计划在未来的版本中增加更多的功能和优化现有的功能,以满足用户的需求。
个人收获与成长
在这个课程中,我不仅学到了软件工程的基本原理和方法,还通过实践项目提高了自己的编程能力和团队协作能力。以下是我个人的一些收获与成长:
- 编程能力的提升:通过参与JieNote的开发,我提高了自己的编程能力,尤其是在fastapi和Rust方面的应用。通过实际的编码实践,我更深入地理解了这些技术的原理和应用场景。
- 团队协作能力的提升:通过与团队成员的合作,我学会了如何更好地进行团队协作,包括任务分配、进度跟踪和代码审查等。这些经验让我在团队中更有效地工作,并提高了项目的整体质量。
- 规范化开发流程的理解:感谢项目的PM dqr同学,他在项目中引入了规范化的开发流程,包括需求分析、设计、实现、测试和发布等阶段。这让我更好地理解了软件工程的全生命周期,并学会了如何在实际项目中应用这些流程。
总的来说,这个课程让我在软件工程的各个方面都有了很大的提升。我不仅学到了理论知识,还通过实践项目提高了自己的编程能力和团队协作能力。这些收获将对我未来的学习和工作产生积极的影响。

浙公网安备 33010602011771号