> For the complete documentation index, see [llms.txt](https://minguw.gitbook.io/jvm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://minguw.gitbook.io/jvm/jvm-framework/da-zuo-ye-ping-fen-biao-zhun.md).

# 大作业评分标准

## 须知

{% hint style="danger" %}
**我们将进行严格的查重，包括对你的git记录、程序执行流进行审核。**
{% endhint %}

## **关于查重的FAQ**

#### **1. 能否复用自己的已有实现？**&#x20;

> 可以，只要是之前作业中已经布置过的，实现过的内容可以直接复制粘贴或者进行改动(如果你设计的其他模块与我们作业中的有所出入)。**但是！只有你自己实现过的部分可以复用，code review的代码不允许复用**

#### 2. 关于学术诚信

> 首先，你应该避免自己的代码泄露，如果想放在github上开源也请尽量等到整个课程结束之后再开源。当有人来找你索要代码的时候请尽量思考清楚学术不端的后果。
>
> 然后，我们会**自动+人工**查看你的git提交记录，我们不相信有人可以在很短的时间内产出几百上千行的代码，此外我们还有**其它统计学方法**来分析出现抄袭的可能性。对于存在潜在异常的同学，我们会在面检时适当增加细节性问题以确定知识的掌握情况。
>
> 当然，部分同学也许存在在本地进行了充分的调试最后一次性commit的习惯。为了避免无法说清楚的情况，**请保持良好的编程习惯，在完成了一部分工作后及时commit**，例如3-4个小时的工作、或者一个功能点的实现
>
> 最后，**对于被认定有异常行为的同学**，我们还会通过面查来考证你是否真的自己完成了作业。同样作为学生，我们相当了解面查的缺陷——前面的同学查完会和后面的人分享经验，最后大家都能假装自己很好的完成了作业。为了防止这样情况的出现，面检没有固定的题库，每个人的问题区别会很大；并且每个人都会回答一些和源码实现有关的细节问题。
>
> **希望大家自觉遵守规则，对自己负责。我们会尽可能让大家在学到东西的同时拿到比较好的分数，但是对于学术不端行为是绝对零容忍的，一经发现从严处理。**

#### 3. 能否参考之前作业中的框架代码

> 可以，但是不推荐。大作业的目的是让你们感受一下自己设计模块、协调模块间的交互，再锻炼一下自己的debug能力。由于开发周期的原因，助教实现的版本也是有很多地方缺乏良好的设计和编码，还没来得及重构。我们不希望让我们的实现给你带来一个刻板的印象。
>
> 就像其实JDK源码的双亲委托机制存在很多的问题，但是因为这部分代码已经在太多的代码中被使用了，修改的代价相当巨大。而你应该做出自己的思考，做出自己的设计。
>
> 哪怕你的实现也许不如框架代码的高效、简洁，我们**依然会给你一个很高的评价和评分**。这毕竟只是你开始接触更大规模项目的第一步。
>
> 此外，“参考”框架代码不意味着可以直接复制粘贴。如果在大作业中使用了之前的框架代码，请确保你已经完全理解了这部分内容，我们依然会提问。（~~而且从某种角度上说，因为我们更了解框架代码，所以涉及框架代码的问题毫无疑问会更难。~~）

#### 4. 举个例子

> E1 在JVM规范中每一个线程栈拥有一个PC，而我们把PC值放进了每一个StackFrame中，如果你和我们的实现相同，那也许我们会问“栈帧里面的pc是如何和解释器进行交互来维持正确的读取数据的” “为什么要把pc放在每一个栈帧里面，这样做是为了简便哪一部分的操作”

> E2 Decoder的map中我们存放了每一个指令类的一个对象，相同实现时我们会问“这里放一个对象可以获得什么样的好处” “是否需要防止在执行时由于多次调用同一条指令而使得该对象内部成员值发生变化从而引起bug”

以上问题均有可能出现在面查中，然而这只是非常小的一部分，如果抄了代码然后特地准备一下这些问题就以为能顺利通过面查那肯定是不可能的\~

{% hint style="danger" %}
我们希望杜绝的是抄设计，对于部分明确规定的，例如某条指令的行为，那当然可以复用自己的代码，这是算法层面上的复用。但是，因为数据结构的不同，每个人的代码都应该有所不一样，例如StackFrame中是否持有Thread这一条语句就会影响Invoke指令的具体实现。

助教实现的版本中也有很多设计不合理、冗余甚至完全错误的地方，并不是一份好的学习范本，我们只是尽可能通过已有的实现来把最核心的知识点教给大家，然后引导着做出自己的设计。
{% endhint %}

## 分数概况

具体大作业占这门课总分的多少分数最后会由老师给出。

**假设大作业的分数为100分制**，我们会有三部分的分数

* OJ：100分
* 量化的考题：100分
* 自主申请的面查：加分项

$$
总分 = \sqrt {OJ \* 考题}+面查加分
$$

## 具体说明

### **OJ**

> 在用例的设置上我们一共有13个测试用例，有3个用例会被放出来但是不算分，其余算分的用例都是隐藏的。这么做的目的是防止部分同学直接面向测试暴力破解。作为代替，我们会在隐藏用例中布置3个逻辑与公开出来的用例完成一致的用例，只是修改了数据。
>
> 10个隐藏用例的难度分级为1个送分、3个基础、3个中等、3个难，我们不会公布用例，但是我们会把涉及到的指令给放出来。（当然，你得至少能把一个什么都没有的空方法给跑过，这意味着你必须实现了加载器、方法调用...

### **考题**

> 形式目前暂定选择+判断，会像正式考试一样，在返校后和上机考试一起安排考核。**因此请自行提前复习考试内容。我们会严肃处理任何作弊行为。**
>
> 涉及到的内容包括但不限于对之前lab中的代码理解（***包括不是todo实现的部分***）、代码设计优缺点、JVM规范的部分细节，我们会尽量避开一些记忆性的问题，更倾向于理解性的问题。
>
> 考题的题量会略大于整个的分数，也就是说理论上的全做对的分数将超过满分，但是我们依旧按照满分计算，这意味着做对绝大部分就能够拿到满分。

### 自主申请加分

**这里涉及的面查仅适用于final大作业，前面的lab1-6可能会有额外的面查，具体流程由老师决定**

> 我们认为的实现亮点包括但不限于：实现了作业要求以外的新功能、对原来lab框架代码中的某些不合理的设计进行了改进、使用了与lab中推荐的截然不同的方法实现了某个功能点...因为面查的时间相当有限，负责检查的老师和助教不可能一个个核对你的实现。请同学们自行准备好要展示的亮点，PPT是一个非常不错的选择。
>
> 具体加多少分我们会由多个助教一起商量着给，这样能够做到尽可能的公正。
>
> 面查不是一个强制要求，主要作用是弥补之前因为OJ或考题丢的分数，如果你拿到了满分，那么面查只是一个看你心情的选择，有再多的亮点获得的分数也不会超过满分（当然，能做到这个程度的同学应该也不会在意成绩了，这本身是一件非常有价值非常有挑战的事情
