Software Quality Award, 2015

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

我是软件开发中规则和纪律的忠实拥护者;例如,请参阅《你是黑客还是设计师?》。此外,我是纯正面向对象编程的狂热爱好者;例如,请参阅《一个好对象的七个美德》。我还是Zerocracy的联合创始人兼首席执行官,通过这家软件开发公司,我将我的纪律和干净设计的钦佩付诸实践。

我希望鼓励你分享我的激情——不仅通过阅读这个博客,还要以纪律的方式制作真正的开源软件。这个奖项是为那些敢于逆流而上,并且将质量看得高于一切的人而设立的。

发送给我你自己的项目以供审查,并参加比赛。

  • 一个人最多可以提交三个项目。

  • 提交截止日期为2015年9月1日已结束。

  • 提交必须通过电子邮件发送至me@yegor256.com。我只需要您的GitHub登录名和仓库名称;我将检查提交历史记录以确保您是项目的主要贡献者。

  • 我保留拒绝任何提交的权利,无需解释。

  • 所有提交内容都将在此页面上发布(包括被拒绝的)。

  • 结果将会在10月15日在此页面和通过电子邮件公布。

  • 最好的项目将获得$4,096

  • 最佳的8个项目将获得任意JetBrains产品的1年开源许可证(每个项目一张许可证)。

  • 最终决策将由我做出,并且不可商议(尽管我可能会邀请其他人帮助我做出正确的决策)。

每个项目必须是:

  • 至少5,000行代码。

  • 至少一年以上。

  • 面向对象(这是我唯一理解的东西)。

最好的项目将会具备以下特点(更多相关信息):

  • “Continuous delivery.” (持续交付)

  • 变更的可追溯性。

  • 自文档化的源代码。

  • 代码格式的严格规则。

什么不重要:

  • 编程语言。我相信,任何语言,只要被正确使用,都可以应用于设计高质量的产品。

  • 热点和趋势。即使你的项目只是另一个命令行参数解析器,它仍然有资格获得奖项。我不关心你的营销定位;品质才是最重要的。

顺便说一句,如果你想赞助这个奖项并增加奖金,请给我发电子邮件。

迄今为止已提交的项目共有158个(按提交顺序排列):

alf-tool/alf-core@blambeau 制作。

js-cookie/js-cookie@FagnerMartinsBrack 创建。

jOOQ/jOOQ@lukaseder 创建。

DeqingSun/ESP8266-Dash-Button

请将上述Markdown段落从英文翻译成中文,不要翻译技术术语和专有名词。

请将上述Markdown段落从英文翻译成中文,不要翻译技术术语和专有名词。

jOOQ/jOOX@lukaseder 创建。

js-cookie/java-cookie@FagnerMartinsBrack 编写。

colonB/Mixer@kkashpur 创建。


10月4日:几周前,我要求与我一起工作的三个人检查此列表中的每个项目,并提供他们的反馈意见。他们给我发来了三个纯文本文件。这里有它们的合并文件,几乎没有做任何更正:award-2015.txt(你可以在那里找到你的项目)。根据他们的意见,我决定选择以下12个项目进行更详细的审查(按字母顺序排列):

raphw/byte-buddy(于10月5日添加)

我会尽快审查它们。获胜者将于10月15日公布。

10月5日:我收到了raphw/byte-buddy的作者的电子邮件,要求我重新考虑对这个项目的决定。我快速查看了项目被过滤掉的原因,并决定将其列入入围名单。顺便说一下,如果你们中的任何人认为自己的项目被错误地排除在外,请随时给我发电子邮件。

10月11日:今天我分析了所有12个项目。它们全部都是非常好的项目,所以为了找到最好的一个,我专注于它们的缺点而非优点。以下是我初步发现的情况。

coala-analyzer/coala(14K Python代码行数,160K代码行数)

  • 有全局函数,例如get_language_tool_resultsDictUtilities。这在面向对象编程中绝对是一个糟糕的想法。

  • Constants 是一个糟糕的想法。

  • 在运行时检查对象类型是个不好的主意,例如 ClangCountVectorCreator.py

  • cindex.py有什么问题?代码有近3200行,太多了。

  • 静态分析不是构建/发布流程中的强制步骤。这就是为什么我认为代码格式不一致,有时相当丑陋的原因。例如,pylint报告了数百个问题。(更新:使用了scrutinizer,但我仍然相信本地使用pylint会严重提高代码质量)

  • 有些方法有文档,而有些没有。我不明白其中的逻辑。如果所有方法都有文档就太好了。另外,并不是所有的类都有文档。

  • Score: 5

checkstyle/checkstyle (83K Java LoC, 553K HoC)

checkstyle/checkstyle](https://github.com/checkstyle/checkstyle)(83K Java LoC,553K HoC)

  • 有很多实用类,是面向对象编程中的一种不好的事情。它们甚至被分组到一个特殊的utils包中,这是一个非常糟糕的想法。

  • 设置器和获取器随处可见,以及不可变类,这些实际上不是面向对象编程的一部分,例如 DetectorOptions

  • NULL在许多地方被积极使用,这是一个严重的反模式。

  • 我找到了五个.java文件,每个文件中有超过1000行的代码,例如ParseTreeBuilder.java中有2500+行。

  • 有不同的贡献者对主分支进行了直接提交,其中一些没有与任何问题关联起来。很难理解为什么进行了这些提交。例如,看看这个7c50922。是否有相关讨论?是谁做出了决定?一点都不清楚。

  • Releases are not documented at all.”

【发布版本】(https://github.com/checkstyle/checkstyle/releases)根本没有记录。

  • 发布流程不是自动化的。至少我在代码库里没有找到任何发布脚本。

  • Score: 3

citiususc/hipster(5K Java LoC,64K HoC)”

  • 有一些公共的静态方法和实用类,例如这个具有有趣名字的F

  • to use NULL as a placeholder value or to represent the absence of a value. Instead, it is recommended to use more descriptive alternatives, such as None in Python or nil in Ruby.

  • JavaDoc文档不一致,有些方法有文档,而其他方法没有。

  • 并不是所有的提交都与工单相关,例如,看看这个:8cfa5de

  • 更改直接提交到 master 分支,根本不使用拉取请求。

  • 我没有找到自动发布的流程。我找到了一个用于定期快照部署到Bintray的流程,但是关于正式发布呢?是手动完成的吗?

  • 没有静态分析,这就是为什么代码有时看起来很乱。

  • 单元测试的数量相当少。除此之外,我没有找到任何地方发布的真实代码覆盖报告。

  • Score: 4

gulpjs/gulp (700 JS LoC)

gulpjs/gulp](https://github.com/gulpjs/gulp)(700 JS LoC)

  • Score: 0

kaitoy/pcap4j (42K LoC, 122K HoC)

kaitoy/pcap4j (42K 行代码,122K 字符)

  • NULL在可变对象中使用,例如在AbstractPcapAddress中使用;这是一个不好的主意。

  • 有太多的static方法和变量。它们简直无处不在。甚至有一个名为pcap4j-packetfactory-static的模块,充满了带有静态方法的“类”。

  • JavaDoc文档不一致,有时甚至不完整,请查看此链接作为例子。

  • 只有几个问题和六个拉取请求。提交与问题没有关联。几乎没有任何变更的可追踪性。

  • 发布流程未自动化,releases 未有记录。

  • 没有静态分析,所以代码有时看起来很乱

  • Score: 3

raphw/byte-buddy (84K LoC, 503K HoC)

raphw/byte-buddy](https://github.com/raphw/byte-buddy)(84K行代码,503K高度代码)

  • 有很多public static方法和属性。我意识到这可能是在Java中处理问题域的唯一方式,但还是…

  • instanceof经常被使用,但在面向对象编程中,这是一种不好的做法。虽然我理解在某些情况下问题域可能需要它,但是还是……

  • 大多数提交直接在主分支上进行,没有拉取请求或票证,这就是为什么它们的可追溯性被破坏了。

  • 发布程序不是自动化的(我没有找到脚本)。

  • Score: 5

subchen/snack-string(1K LoC,2K HoC)”

  • Score: 0

gvlasov/inflectible (5K LoC, 36K HoC) 的中文翻译为:gvlasov/inflectible(5千行代码,36千行其他代码)。

  • Score: 10

testinfected/molecule (10K LoC, 43K HoC)

  • 有一些类中有设置器(setters)和访问器(getters),尽管它们采用了不同的命名约定,例如RequestResponse

  • 大多数.java文件没有任何JavDoc块,并且它们看起来是一致的,但突然间,一些文件确实有文档,例如WebServer

  • 问题并不多,而且大多数提交无法追溯到其中任何一个问题,例如b4143a0——为什么进行这个提交?不清楚。此外,几乎没有拉取请求。看起来作者只是向主分支提交。

  • 发布流程没有记录/自动化。我找不到它。此外,releases也没有记录。

  • 静态分析是不存在的。

  • Score: 6

trautonen/coveralls-maven-plugin (4.5K LoC) should not be translated as it consists of technical terms and proper nouns.

  • Score: 0

wbotelhos/raty(8.7千行代码,63千字符)”

  • 有全局函数,例如在helper.js中。

  • jasmine.js 有2400行代码,这太多了。

  • 我不明白为什么.html文件与.js文件放在同一个目录中,例如run.html

  • 并非所有的更改都可以追溯到问题,比如0a233e8。项目中的问题并不多,只有一些拉取请求。

  • 发布流程不是自动化的(至少我没有找到任何关于它的文档)。

  • 没有静态分析

  • 没有单元测试

  • Score: 2

xvik/guice-persist-orient (17K LoC, 54K HoC) should not be translated as it contains technical terms and proper nouns.

  • 依赖注入被积极使用,我认为这在面向对象编程中通常是一个不好的想法。但在这个项目中,我理解这是问题领域所要求的。无论如何…

  • 只有少量问题和几乎没有拉取请求,而且提交无法追溯到问题,例如这个:e9c8f79

  • 没有静态分析(使用一部分Checkstyle、PMD和FindBugs检查)。

  • Score: 5

我主要关注反模式,这是我们应尽量避免的第一个和最可怕的错误。例如,null的存在比自动发布程序的缺失更严重地影响了得分。

10月15日:因此,我们从提交到竞赛的158个项目中选出了以下最佳项目:

  1. testinfected/molecule的Markdown段落

  2. coala-analyzer/coala 请将上述的 Markdown 段落从英文翻译成中文,不要翻译技术术语和专有名词。

  3. xvik/guice-persist-orient 请,将此Markdown段落从英文翻译成中文,不要翻译技术术语和专有名词。

  4. raphw/byte-buddy 请将以下的 Markdown 段落从英文翻译成中文,不要翻译技术术语和专有名词。

  5. citiususc/hipster

  6. checkstyle/checkstyle请将上述Markdown段落从英文翻译成中文,不要翻译技术术语和专有名词。

  7. kaitoy/pcap4j请将以下Markdown段落从英语翻译成中文,不要翻译技术术语和专有名词。

恭喜@gvlasov获胜者!这是您的徽章:

将这段代码放入GitHub的README文件中:

所有八个项目将获得一个 JetBrains 产品的一年免费单用户许可证。我会给大家发电子邮件,然后我们会商讨如何进行转让。

感谢大家的参与!明年再见。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-05 at 22:00

sixnines availability badge   GitHub stars