MIT 6.005 软件构建讲义(七)
parsePitch : String → Pitch(MusicLanguage.java:77) 通过解析pitch语法产生来返回一个Pitch。你应该能够理解递归 — 基本情况是什么递归情况是什么阅读练习parsePitchparsePitch的基本情况处理这些输入中的哪些缺少答案缺少答案缺少答案缺少答案缺少答案缺少答案缺少答案缺少解释实现播放器回想一下我们播放音乐的操作play : Music × SequencePlayer × double → void(Music.java:18) 在给定节拍延迟之后使用给定的序列播放器播放音乐片段。为什么这个操作要花费atBeat为什么不直接现在播放音乐呢如果我们以这种方式定义play那么除非我们实际上在play操作期间暂停例如使用Thread.sleep否则我们将无法随时间播放音符序列。我们的序列播放器的addNote操作已经设计好了以安排未来的音符 - 它处理延迟。有了这个设计决定就可以在每个Music变体中轻松实现play。阅读并理解Note.playRest.play以及Concat.play方法。你应该能够理解它们的递归实现。在我们准备好进行即兴演奏之前再加一点实用代码music.midi.MusicPlayer使用MidiSequencePlayer播放Music。Music不知道序列播放器的具体类型因此我们需要一些代码将它们联系起来。将所有内容整合在一起让我们使用MusicADT阅读并理解music.examples.ScaleMusic代码。运行ScaleMusic中的主方法。你应该再次听到同一个一个八度音阶。那并不是很令人兴奋所以阅读music.examples.RowYourBoatInitial并运行主方法。你应该听到Row, row, row your boat你能够从调用notes(..)到拥有Music实例再到递归play(..)调用再到单独的addNote(..)调用的代码流程吗阅读练习音符Row, row, row your boat中有 27 个音符。根据实际实现RowYourBoatInitial中的notes调用将创建多少个Music对象缺少答案缺少答案缺少答案缺少答案缺少答案缺少答案缺少答案缺少解释持续时间rowYourBoat.duration()的结果应该是什么缺少答案缺少解释音乐假设我们有import music.*; import static music.Instrument.*; import static music.MusicLanguage.*;并且Music r rest(1); Pitch p new Pitch(A).transpose(6); Music n note(1, p, GLOCKENSPIEL); ListMusic s Arrays.asList(r, n);以下哪个是有效的Music缺少答案缺少答案缺少答案缺少答案缺少答案缺少答案缺少解释未完待续弹奏Row, row, row your boat是非常令人兴奋的但到目前为止我们所做的最强大的事情并不是音乐语言而是非常基础的音乐解析器。使用简化的 abc 记谱写音乐显然比一页页写addNoteaddNoteaddNote更易于理解免受错误的影响并且随时可以更改。在课堂上我们将扩展我们的音乐语言并将其转化为一个构建和操纵复杂音乐结构的强大工具。阅读 27团队版本控制6.005 中的软件| 免受错误影响 | 易于理解 | 准备好变化 || — | — | — || 今天正确未来也正确。 | 与未来的程序员清晰沟通包括未来的自己。 | 设计以适应变化而无需重写。 |目标复习 Git 基础知识和提交图练习多用户 Git 场景Git 工作流程您已经使用 Git 进行问题集和课堂练习一段时间了。大多数情况下您不必与其他人协调推送和拉取到同一存储库并且与您同时进行。对于团队项目情况将发生变化。在本阅读中通过回顾您所了解的内容并熟悉一些命令为课堂 Git 练习做好准备。现在您对 Git 基础知识更加熟悉是时候回顾本学期初的一些资源了。查看发明版本控制一个开发人员多个开发人员和分支。如果需要可以查看学习 Git 工作流程来自入门页面。查看提交历史从Pro Git中查看**2.3 查看提交历史**。您不需要记住书中介绍的所有不同命令行选项相反了解可能的操作这样当您需要时就知道要搜索什么。从版本控制克隆示例存储库https://github.com/mit6005/fa16-ex05-hello-git.git使用log命令确保您了解存储库的历史。提交的图表请记住Git 存储库中记录的历史是一个有向无环图。存储库中任何特定分支如默认的master分支的历史始于某个初始提交然后如果多个开发人员并行进行更改或者单个开发人员在切换之前在两台不同的机器上工作而没有提交-推送-拉取则其历史可能会分裂并重新汇合。这是示例存储库的git lol输出显示了一个 ASCII 艺术图* b0b54b3 (HEAD, origin/master, origin/HEAD, master) Greeting in Java * 3e62e60 Merge |\ | * 6400936 Greeting in Scheme * | 82e049e Greeting in Ruby |/ * 1255f4e Change the greeting * 41c4b8f Initial commit这里是 DAG 的图表http://web.mit.edu/6.005/www/fa16/classes/27-team-version-control../05-version-control/figures/hello-git-history-trees.png在ex05-hello-git示例存储库中确保您能解释master历史何时分裂何时重新汇合。从版本控制阅读中查看合并。您应该理解整个过程的每一步以及它与示例存储库中的结果之间的关系。查看合并部分包括合并和合并冲突。阅读练习合并Alice 和 Bob 都从相同的 Java 文件开始public class Hello { public static void greet(String name) { System.out.println(greeting() , name); } public static String greeting() { return Hello; } }| Alice 更改greet(..)public static void greet(String name) { System.out.println(greeting() , name !); }| Bob 改变greeting()public static String greeting() { return Ciao; }|缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失解释危险的合并在前方相同的起始程序public class Hello { public static void greet(String name) { System.out.println(greeting() , name); } public static String greeting() { return Hello; } }| Alice 改变greeting()public static String greeting() { return Ciao; }| Bob 改变了函数如何一起工作public static void greet(String name) { greeting(); System.out.println(, name); } public static void greeting() { System.out.println(Hello); }|缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失解释继续合并相同的起始程序public class Hello { public static void greet(String name) { System.out.println(greeting() , name); } public static String greeting() { return Hello; } }Alice 改变greet(..)以返回而不是打印public static String greet(String name) { return greeting() , name; }Bob 创建了一个新文件Main.javapublic class Main { public static void main(String[] args) { // print a greeting to Eve Hello.greet(Eve); } }缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失答案缺失解释在团队中使用版本控制每个团队都为版本控制制定了自己的标准团队的规模和他们正在处理的项目是一个主要因素。以下是适用于你将在 6.005 中进行的小范围团队项目的一些指导方针沟通。告诉您的队友您将要做什么。告诉他们您正在做这件事。告诉他们您已经做过了。沟通是避免浪费时间和精力清理破损代码的最佳方式。撰写规范。对于我们在 6.005 中关心的事项是必要的也是良好沟通的一部分。编写测试。不要等待大量代码堆积起来才尝试进行测试。避免一个人编写测试另一个人编写实现除非实现是你计划放弃的原型。首先编写测试以确保您对规范的理解一致。每个人都应对其代码的正确性负责。运行测试。如果不运行测试测试是无法帮助您的。在开始工作之前运行它们再次在提交之前运行它们。自动化。您已经使用像 JUnit 这样的工具自动化了您的测试但现在您希望在项目更改时自动运行这些测试。对于 6.005 组项目我们提供 Didit 作为一种在团队成员向 Athena 推送时自动运行测试的方式。这也消除了“它在我的机器上运行正常”的问题它要么在自动构建中正常工作要么需要修复。检查您提交的内容。使用git diff --staged或 GUI 程序查看您即将提交的内容。运行测试。不要使用commit -a这是填充您的仓库与println和其他您不打算提交的内容的绝佳方式。不要通过提交无法编译、产生调试输出、实际上未使用等代码来惹恼您的队友。开始工作前先拉取最新版本。否则您可能没有最新版本作为起点 —— 您正在编辑旧版本的代码您肯定要稍后合并您的更改并且有可能浪费时间解决合并冲突。同步。在一天结束或工作会话结束时确保每个人都已推送和拉取所有更改大家都处于相同的提交状态并且每个人对项目状态满意。我们不建议在 6.005 大型项目中使用分支或变基等功能。我们强烈建议在同一时间、同一地点一起工作特别是如果这是你第一次进行团队软件工程体验。阅读练习团队版本控制这些哪些展示了良好的团队软件开发实践缺少答案缺少答案缺少答案缺少答案缺少答案缺少答案缺少解释团队项目项目阶段的大部分课时将用于团队合作。这些课程是必修课就像普通课程一样你必须在课堂上与你的项目导师 TA 进行沟通。

相关新闻

XFlow格子玻尔兹曼方法模拟多孔介质两相流:从毛细管渗吸到参数标定实操

XFlow格子玻尔兹曼方法模拟多孔介质两相流:从毛细管渗吸到参数标定实操

格子玻尔兹曼方法(LBM)这个名词,在油藏工程和渗流力学圈子里早就不是什么新鲜概念了,但真正能用工程级软件把它跑起来、而不是自己吭哧吭哧写两万行C代码的人,确实不算多。我当年用XFlow做毛细管自发渗吸的模拟&#x…

2026/10/9 0:12:57 阅读更多 →
SpringBoot应用Ubuntu生产部署:打包、systemd守护与日志治理

SpringBoot应用Ubuntu生产部署:打包、systemd守护与日志治理

Java进阶-在Ubuntu上部署SpringBoot应用最近一直在折腾 Spring Boot 的生产环境部署,踩了不少坑,也总结了一些能直接抄作业的套路。不少朋友问我,本地开发跑得好好的项目,一到 Linux 服务器上就各种幺蛾子:启动慢、端口…

2026/10/9 0:12:57 阅读更多 →
C++空间与时间:从内存对齐到时间戳的性能优化实战

C++空间与时间:从内存对齐到时间戳的性能优化实战

写 C 这几年,我最常琢磨的两个字是“空间”和“时间”。空间是内存,堆上、栈上、数据段里的每一字节;时间是性能,从一次函数调用到一整个程序生命周期里 CPU 烧掉的每一纳秒。最近整理自己的 C 笔记,发现零散记录的许多…

2026/10/9 0:12:57 阅读更多 →

最新新闻

浏览器扩展端侧AI推理:WebGPU+ONNX Runtime实战架构

浏览器扩展端侧AI推理:WebGPU+ONNX Runtime实战架构

1. 这不是“把模型塞进浏览器”那么简单:端侧AI在扩展环境里的真实战场“现代浏览器扩展环境下的端侧 AI 推理系统架构与工程实现规范”——这个标题里没有一个词是虚的,每个字都踩在当下前端工程最硬的几块石头上。我从去年开始带团队落地三个真实商用级…

2026/10/9 7:00:47 阅读更多 →
MiMo-V2.6:面向自我改进的工业级强化学习架构

MiMo-V2.6:面向自我改进的工业级强化学习架构

1. 这不是一篇“读论文就完事”的笔记,而是一次对强化学习边界的实地勘探“MiMo-V2.6 - Scaling Reinforcement Learning Towards Self-Improvement”这个标题里藏着三个关键信号:MiMo(Multi-Model,多模型协同)、V2.6&…

2026/10/9 7:00:47 阅读更多 →
Vue过滤器指南:原理、使用场景及面试避坑

Vue过滤器指南:原理、使用场景及面试避坑

最近这道面试题出现的频率不低,尤其面试 Vue 相关岗位时,冷不丁就会被问到:“说说 Vue 过滤器是什么?有哪些使用场景?”很多人第一反应是“用过”,但真让展开讲讲,又容易和计算属性、方法混在一…

2026/10/9 7:00:47 阅读更多 →
人工智能数学基础:梯度下降、优化器与正则化的核心原理与实战

人工智能数学基础:梯度下降、优化器与正则化的核心原理与实战

手头这本《人工智能数学基础》翻到第十八章的时候,我其实松了一口气——前面十几章的线性代数、微积分、概率论铺了那么多,总算开始收网了。这一章讲的内容,很多人可能会觉得“不就是优化算法和正则化嘛”,但真等到训练模型训练不…

2026/10/9 7:00:47 阅读更多 →
WorkBuddy实战:搭建Excel VBA模板母版-副本自动同步系统

WorkBuddy实战:搭建Excel VBA模板母版-副本自动同步系统

我把手头几张各写各的VBA模板文档,用WorkBuddy理成了母版-副本自动同步的总控台。前几周我一直在维护一套Excel进销存模板,里面有报价单、对账单、领料单,每张表里都塞了一段VBA逻辑,逻辑还互相抄。最崩溃的一次是改完报价单的客户…

2026/10/9 7:00:47 阅读更多 →
C语言数据类型与变量:内存机制、指针结构与实战避坑指南

C语言数据类型与变量:内存机制、指针结构与实战避坑指南

C语言的数据类型和变量,看上去是每本教材开篇就讲的基础,但我在实际带项目、看别人代码、甚至帮人排查问题的时候发现,很多人恰恰是栽在这些“基础”上。指针用得晕、结构体定义不明白、类型转换出bug、变量作用域一锅粥——这些问题十有八九…

2026/10/9 6:59:46 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →