什么时候程序足够好才能发货?你做好了客户想要的东西了吗?为什么(以及如何)Netflix故意和随机地关闭自己的服务器?我们能从波音737空难中学到什么?Twitter是如何根除失败鲸的?这和Ruby有什么关系?
成功的软件项目需要的不仅仅是技术专长。弄清楚客户想要什么、在团队中协作、管理复杂性、降低风险、按时和预算,以及在各种约束下确定产品何时足够好才能发货,这些都至少是同样重要的主题,通常都有重要的人为因素。17-313广泛探讨了这些问题,涵盖了现代软件工程的基本原理。
假设具备相当扎实的编程技能(包括单元测试和代码级设计),我们将探讨以下主题:软件开发的过程考虑(如何及早避免问题?什么时候设计,多少钱设计?什么时候测试,测试多少?何时以及如何让客户参与进来?敏捷方法...)。
需求引出、文档编制和评估(如何确定客户真正想要的是什么?还有谁有兴趣呢?我们怎样才能客观地衡量成功呢?我们如何可靠地记录预期?...)。
为质量属性而设计(我们如何设计一个能够扩展到数百万用户的系统?我们如何才能将安全性设计到系统中?...)。
质量保证策略,包括测量、检查以及静态和动态分析(哪种质量保证策略最适合给定的系统?我们可以自动化什么?我们应该在什么时候让人类保持在循环中?我们应该做多少测试,应该做什么样的测试?除了功能正确性之外,还需要确保哪些品质?我们可以评估可用性、可扩展性、可靠性和性能吗?我们如何静态地保证不存在某些安全问题?...)。
软件工程中的经验方法(我们如何度量诸如性能、安全性和可靠性之类的质量属性?我们如何衡量用户与系统的交互方式?我们怎么知道差异是否重要呢?……)。
时间和团队管理(如何估计项目的持续时间和成本?如何监控进度和风险,以便及早发现问题?如何协调团队中的开发人员?如何组建和发展团队?如何选择和激励团队成员?如何处理团队动力,如社交闲散?…)
本课程有很强的技术重点,包括使用和不使用编程的作业。作业还包括书面内容。学生将获得团队管理和现代软件工程工具的经验。这门课程让学生走上了项目管理职位的快车道。
作业(大部分以小组形式完成)包括:介绍作业,个别学生将学习如何使用现有的代码库。
需求分配,其中每个团队都将与涉众进行面谈,以得出并记录软件系统的需求。
团队将使用微服务培训和部署ML模型的体系结构任务。
每个团队都为自己选择的开放源码项目做出贡献的项目。这包括识别现有项目中的问题,了解该项目的开发过程以及如何做出贡献,并实际做出贡献,例如修复错误或添加功能。如果捐款合并到项目中,将获得额外的学分。