real-blog 17514-总结 CMU 17-214(514) Principles of Software Construction (24Fall) 总结 课程总述 这门课在一亩三分地里面有很多好评和推荐,workload 和推荐程度都是五颗星。这门课是 CMU S3D (Software and Societal Systems Department) 里面很推荐的一门课。之前讲课的老师是 Joshua Bloch (《Effective Java 》的作者)。上课的时候说很早之前这门课学习和使用的 GUI 都只是 Java 的 framework。 迭代到现在使用的架构是 Java + React (Typescript)。这门课涉及到的内容比较多,包括了传统的 UML 模型, Design Principle 和 Design Pattern,到后来的 Testing, Concurrency (Java 和 JS 中的使用),以及 前端 GUI。这门课每周的 Recitation 是完成一个简单的 Lab (Github),并且需要给助教进行演示。 Homework (Github) 相当于 Project,最后需要完成一个桌游 Santorini。这门课有两次 midterm 和一次 final exam。总得来说是比较累但是很推荐的一门课。 课程成绩 (94.21 -- A) 这门课的 Syllabus 和 Grading Evaluation 在官网有清晰的说明。这门课是这学期唯一一门使用了 late days (而且5天还全部使用完了的课程)在 workload 最大的 Homework 中拿到了 98.51%。最后 Santorini 游戏前端和拓展做得不错还拿到了 bonus points。就考试而言,个人更喜欢第二次 midterm:因为没有画 UML 图的题目,考的是比如一个实际场景需要用哪种 design pattern,以及 Java / JS 的并行性判断 (是否出现竞争,async/await/promise 的使用)等等更偏向实际开发的考察。 课程内容 这里和 15513总结 类似,通过 homework 内容来进行内容总结:HW 1: Warm-Up with Flash Cards. 这里主要是相当于一个 Java 以及 Typescript 的 warm-up。需要对这个 Flash Cards 小游戏设计一个 CLI。从这里就很符合 CMU 的风格了:只告诉了我们需要实现的需求,框架之类的都需要我们自己去找。这里 Java 我是用的 Apache Commons CLI ,而 Typescript 是使用的 Commander。除了 CLI 之外, 还需要实现一种新的 CardOrganizer。并且在 Github 的仓库中已经配置好了 CI 文件, 分别是 /.github/workflows/java.yml以及 /.github/workflows/typescript.yml。最终提交的 commit 也要求在 GitHub 上的提交通过这些 CI 测试。HW 2: Santorini. 这里分为了三部分,第一部分 milestone 2a 中需要设计以及实现 santorini 游戏的后端。而 2b 是对 2a 的设计进行 peer review。2c 是根据 peer review 和 grader 的评分再进行修改。 这里在实现中的一个很普遍的问题是,我们想让 Controller 去控制整个游戏流程但是就导致了把整个 santorini 的逻辑(比如一个 while 循环中双方进行游戏操作,直到一方胜利),但这样并不满足我们将来需要把前端融入的需求。也就是说,后端只需要暴露一系列函数 (也就是 API),然后维护一个状态 (比如 currentAction,currentPlayer 等),然后前端可以调用任意 API,只是后端会通过其保存的状态对 API 函数进行 validate (例如 precondition: 调用者的player是currentPlayer)。这样才符合前后端分离的规范。另外这里要求提交不少文档,对于 UML 图使用的是之前在花旗实训学习到的 PlantUML ,在 VSCode 或者 Cursor 中装入这个插件之后配上 AI 自动补全,画图会方便很多。这个项目没有任何模板,但需要参考 HW 1,在项目中需要包含 Github CI 测试等。HW 3: Unit Testing. 这里主要是对 HW 1 中完成的 Flashcard 项目的每个类编写单元测试。其中 Typescript 需要 Specification-base testing,而 Java 需要 Structural testing 并且需要 JaCoCo 生成的覆盖率达到 100%。同时这里需要修改 Github CI 文件,保证在进行 CI 测试时除了会 checkstyle,还会运行编写的所有测试样例。HW 4: Design and Testability Improvement of a Static Website Generator. 这里主要是给了一个本身可以运行的 Static Website Generator,其输入内容是 md 文件或者 yaml 文件。但这个项目有很多 code smell (例如 code duplication, coupling, cohesion,和 subsubsubsubsubArticles)等等。并且它也违反了 SOLID 设计原则。我们需要去 refactor 这些代码来解决这些问题,(例如通过 composition pattern来解决subsubsubsubArticles的问题)HW 5: Concurrency. 这里通过 React 以及 Node.js 需要实现一个分析表情的程序。首先我们需要配置 GCP (Google Cloud Platform), 通过课程提供的 Credits 来获取 Google Vision API key。整个程序的 workflow是 1. 在我们前端输入一个关键词后, 2. 会先调用 wikipedia_api去获取这个关键词相关的图片,并将这些图片提供给 google_vision_api再获取对表情的分析结果,最后在前端将表情进行分类。这里调用不同 API 的过程就涉及到了异步处理的问题。这个 homework 还要求我们进行 error handling,控制最大并发数,实现 retry 等操作。HW 6: Return to Santorini。 这里分为 Milestone 6a 以及 6b 两个阶段。在 Milestone 6a 中,我们需要连通前后端。前端我使用的 React (Typescript)+ Three.js + Tailwind,而后端没有使用 TA 在 Lab 中推荐的轻量化的 NanoHttpd ,为了开发的效率,而是使用的 Spring Boot。而在 Milestone 6b 中,将角色进行拓展,实现了 GodCard,也就是增加了不同角色的技能。这里是之前 design principle 以及 design pattern 的一个很好的运用实例。这其中运用了很多 pattern 例如 工厂模式,模板模式,装饰器模式等等。最后这整个 Santorini 大项目拿到了满分 和 bonus points。 课程感受 17514的课程质量确实很好。之前在 Berkeley 上过 CS 169 (Intro to Software Engineering) 以及 CS 169L (Software Team Project) 两门大课,但是课程质量都不如这一门。并且还感受到比较疑惑的是目前觉得像这门课的 Java + React 才更是开发的主流 (甚至 Node.js + React),而当时 Berkeley 学习时的课程和项目都是用 Ruby on Rails 来完成的。总的来说这门课的技术栈和教的内容确实比较新,也让我想在后面的学期中选更多 S3D 的课程。 December, 2024 admin