为练习提出改进建议

在提出练习改进建议之前需要考虑什么


你发现了某个练习中你想改进的地方。首先,感谢你的关心,也感谢你抽出时间来告诉我们!💙

修改练习时,有几件事需要考虑,而学习练习(也就是讲解教学大纲中主题的那些练习)与实践练习(其余的练习)的考量略有不同。下面我们会详细说明这些区别。

不过,先来看几个通用的注意事项。

修改练习会带来一系列影响

修改练习会带来相当多的影响:

  1. 新增测试可能会导致已有的提交解答无法通过。 这样一来,成千上万人的成果就过时了;如果新增的测试并没有揭示任何已有的 bug,这会让他们很沮丧。
  2. 我们需要重新测试所有人的成果,这既有环境成本,也有财务成本。
  3. 一位或多位维护者必须花时间审查这些改动,这意味着他们在这段时间里无法为学习轨道做其他改进。

出于这些原因,我们只会在能带来明确的重大收益时才会修改练习,对此非常谨慎。

避免逐渐走向无序

练习的测试套件并不以覆盖所有可能情况为目标。 我们的练习不是生产软件,也不是为了模拟真实世界的使用场景。 它们被设计成玩具问题,帮助你熟练地掌握一门编程语言。 因此,我们有意避免覆盖每一个边界情况、强制做大量输入校验,或者其他类似真实世界的关切。 如果你建议的改进只是捕获某个边界情况或检查输入校验,那么除非它对练习有实质性的影响,否则不太可能被接受。

学习练习

学习练习的设计只有一个目标:讲解概念。 对练习的任何改动,首先都要看它是否有助于更好地讲解概念。

学习练习(尤其)不以测试详尽为目标。 它们有时还会显得有点刻意或晦涩,这是为了避开学生还没学过的概念,或者避免让学生不堪重负。

如果你建议的改动可能分散对概念学习的注意力,那它多半会被拒绝。 如果改动让学习变得更轻松,我们会重点考虑。 如果它介于两者之间,可能会被接受,但不太可能被优先处理。

实践练习

关于实践练习,最重要的一点是:几乎所有实践练习都放在一个中央代码仓库里(名为 “Problem Specifications”)。 因此,修改一个练习会对所有学习轨道产生连锁影响。 这意味着一个好的改动格外有价值,因为它能帮到所有语言。 但它也加重了改动的负担:需要多位负责不同学习轨道的维护者都同意,改动才会被接受,然后每种语言的维护者还要把改动向下游同步到各自的学习轨道中。

修改练习还可能让教学大纲中与它关联的概念变得更模糊,或者让练习需要额外的功能才能解答,从而改变它解锁的位置。 在改动被接受之前,这一点也需要在各个学习轨道上统一考虑。

虽然我们确实有办法让只有部分学习轨道包含某些测试用例,但我们通常不鼓励这样做,因为这种分叉会让维护者和学生都感到困惑。 所以,在提议修改实践练习时,请从所有学习轨道的大局出发。

如何让你的改动被接受

虽然我们拒绝建议的理由有很多,但很多时候,人们提出的好点子我们都会采纳!

对于能让表述更清晰的措辞改动,我们也几乎总是欢迎的,尤其是在学习练习中。

为了让你的建议最有可能被批准,请在写建议时体现出你已经考虑了以下几点:

  • 这个改动带来的实际改进(最好附上代码示例,说明你的改动能实现或阻止什么)。
  • 对已有的提交解答的影响,以及为什么这值得。
  • 对所教或所用概念的任何改变。
  • 理解现状为何如此。(请阅读我们关于切斯特顿的栅栏的文章。)

另外,请记得把观点表达为观点,把事实表达为事实。 这样往往能带来最有成效的讨论。

再次感谢你抽出时间提出建议,也感谢你读完了这份文档!