# Software Quality Award, 2015

Source: https://www.yegor256.com/2015/04/16/award.html

{% badge /images/andreea/quality-award.svg 300 %}

I'm a big fan of rules and discipline in software development; as an example, see
[Are You a Hacker or a Designer?]({% pst 2014/oct/2014-10-26-hacker-vs-programmer-mentality %}).
Also, I'm a big fan of object-oriented programming in its purest form; for example, see
[Seven Virtues of a Good Object]({% pst 2014/nov/2014-11-20-seven-virtues-of-good-object %}).
I'm also a co-founder and the CEO of [Zerocracy](https://www.zerocracy.com), a software development
company through which I put my admiration of discipline and clean design into practice.


I want to encourage you to share my passion---not just by reading this blog
but through making real
[open source software]({% pst 2015/dec/2015-12-22-why-dont-you-contribute-to-open-source %}) in a disciplined way.
This award is for those who are brave enough to swim against the current and
value quality above everything else.

[Send me](/award.html) your own project for review and participate in the contest.

Rules:

 * One person can submit up to three projects.

 * Submissions are <strike>accepted until the **September 1, 2015**</strike> closed.

 * Submissions must be sent via email to [me@yegor256.com](mailto:me@yegor256.com).
   All I need is your GitHub login and repository name; I will check the commit
   history to make sure you're the main contributor to the project.

 * I reserve the right to reject any submission without explanation.

 * All submissions will be published on this page (including rejected ones).

 * Results will be announced **October 15** on this page and by email.

 * The best project will receive **$4,096**.

 * The best 8 projects will receive 1-year open source licenses to
   any [JetBrains](https://www.jetbrains.com/products.html)
   products (one license per project).

 * Final decisions will be made by me and are not negotiable
   (although I may invite other people to help me make the right decision).

{% badge /images/2015/06/jetbrains-logo.gif 128 https://www.jetbrains.com %}

Each project must be:

 * Open source (in GitHub).

 * At least 5,000 lines of code.

 * At least one year old.

 * Object-oriented (that's the only thing I understand).

The best projects will feature ([more about it]({% pst 2015/jun/2015-06-08-deadly-sins-software-project %})):

 * Strict and visible principles of design.

 * Continuous delivery.

 * Traceability of changes.

 * Self-documented source code.

 * Strict rules of code formatting.

What doesn't matter:

 * Popularity. Even if nobody is using your
   product, it is still eligible for this award. I don't care about
   popularity; quality is the key.

 * Programming language. I believe that any language, used correctly,
   can be applied to design a high-quality product.

 * Buzz and trends. Even if your project is yet another parser of command
   line arguments, it's still eligible for the award. I don't care about
   your marketing position; quality is all.

By the way, if you want to sponsor this award and increase the bonus,
[email me](mailto:me@yegor256.com).

<hr/>


158 projects submitted so far (in order of submission):

 * [`mdbs99/AWS`](https://github.com/mdbs99/AWS)
 * [`FagnerMartinsBrack/WebStories`](https://github.com/FagnerMartinsBrack/WebStories)
 * `robertop/triumph4php`
 * [`blambeau/wlang`](https://github.com/blambeau/wlang)
 * [`alf-tool/alf-core`](https://github.com/alf-tool/alf-core) by [`@blambeau`](https://github.com/blambeau)
 * [`siom79/japicmp`](https://github.com/siom79/japicmp)
 * [`tunabrain/tungsten`](https://github.com/tunabrain/tungsten)
 * [`AdamsLair/duality`](https://github.com/AdamsLair/duality)
 * [`openra/openra`](https://github.com/openra/openra) by [`@chrisforbes`](https://github.com/chrisforbes)
 * `Pacmanfan/UVDLPSlicerController`
 * [`openfurther/further-open-core`](https://github.com/openfurther/further-open-core) by [`@rahuofu`](https://github.com/rahuofu)
 * [`Bertram25/ValyriaTear`](https://github.com/Bertram25/ValyriaTear)
 * [`odoepner/typepad`](https://github.com/odoepner/typepad)
 * [`vladmihalcea/flexy-pool`](https://github.com/vladmihalcea/flexy-pool)
 * [`js-cookie/js-cookie`](https://github.com/js-cookie/js-cookie) by [`@FagnerMartinsBrack`](https://github.com/FagnerMartinsBrack)
 * [`jOOQ/jOOQ`](https://github.com/jOOQ/jOOQ) by [`@lukaseder`](https://github.com/lukaseder)
 * [`raphw/byte-buddy`](https://github.com/raphw/byte-buddy)
 * [`uniVocity/univocity-parsers`](https://github.com/uniVocity/univocity-parsers) by [`@jbax`](https://github.com/jbax)
 * [`arnaudroger/SimpleFlatMapper`](https://github.com/arnaudroger/SimpleFlatMapper/)
 * [`elBukkit/MagicPlugin`](https://github.com/elBukkit/MagicPlugin) by [`@NathanWolf`](https://github.com/NathanWolf)
 * `trade-manager/trade-manager`
 * [`ParaPenguin/morphix`](https://github.com/ParaPenguin/morphix)
 * [`tzaeschke/zoodb`](https://github.com//tzaeschke/zoodb)
 * [`tzaeschke/critbit`](https://github.com//tzaeschke/critbit)
 * [`praveendath92/MDroid`](https://github.com/praveendath92/MDroid)
 * [`DeqingSun/ESP8266-Dash-Button`](https://github.com/DeqingSun/ESP8266-Dash-Button)
 * [`javamonkey/beetl2.0`](https://github.com/javamonkey/beetl2.0)
 * [`81813780/HandyTabBar`](https://github.com/81813780/HandyTabBar)
 * [`xionghuiCoder/clearpool`](https://github.com/xionghuiCoder/clearpool)
 * [`android-cjj/ComicReader`](https://github.com/android-cjj/ComicReader)
 * [`Dreampie/icedog`](https://github.com/Dreampie/icedog)
 * [`hujiaweibujidao/TinyWeibo`](https://github.com/hujiaweibujidao/TinyWeibo)
 * `hujiaweibujidao/XingShan`
 * [`hujiaweibujidao/WeChat4j`](https://github.com/hujiaweibujidao/WeChat4j)
 * [`beartung/tclip-android`](https://github.com/beartung/tclip-android)
 * [`beartung/insta-filter`](https://github.com/beartung/insta-filter)
 * [`wewoor/ZBLOG`](https://github.com/wewoor/ZBLOG)
 * [`gulpjs/gulp`](https://github.com/gulpjs/gulp) by [`@contra`](https://github.com/contra)
 * [`joedayz/titanic-javaee7`](https://github.com/joedayz/titanic-javaee7)
 * [`TheCricket/Chisel-2`](https://github.com/TheCricket/Chisel-2)
 * `ddasilva/scheme-droid`
 * [`chenjishi/SlideActivity`](https://github.com/chenjishi/SlideActivity)
 * [`yazeed44/MultiImagePicker`](https://github.com/yazeed44/MultiImagePicker)
 * [`wbotelhos/raty`](https://github.com/wbotelhos/raty)
 * [`miku-nyan/Overchan-Android`](https://github.com/miku-nyan/Overchan-Android)
 * [`chylex/Hardcore-Ender-Expansion`](https://github.com/chylex/Hardcore-Ender-Expansion)
 * [`lionsoul2014/jcseg`](https://github.com/lionsoul2014/jcseg)
 * [`yfpeng/pengyifan-bioc`](https://github.com/yfpeng/pengyifan-bioc)
 * [`daimor/NBStudio`](https://github.com/daimor/NBStudio)
 * [`sytolk/TaxiAndroidOpen`](https://github.com/sytolk/TaxiAndroidOpen)
 * [`yaylas/AndroidFaceRecognizer`](https://github.com/yaylas/AndroidFaceRecognizer)
 * [`omgware/fluid-simulator-v2`](https://github.com/omgware/fluid-simulator-v2)
 * [`wendykierp/JTransforms`](https://github.com/wendykierp/JTransforms)
 * [`zqq90/webit-script`](https://github.com/zqq90/webit-script)
 * [`owasp/SecurityShepherd`](https://github.com/owasp/SecurityShepherd) by [`@markdenihan`](https://github.com/markdenihan)
 * [`subchen/jetbrick-template-2x`](https://github.com/subchen/jetbrick-template-2x)
 * [`subchen/snack-string`](https://github.com/subchen/snack-string)
 * [`restorer/gloomy-dungeons-2`](https://github.com/restorer/gloomy-dungeons-2)
 * [`restorer/Gloomy-Dungeons-3D`](https://github.com/restorer/Gloomy-Dungeons-3D)
 * [`restorer/zame-haxe-particles`](https://github.com/restorer/zame-haxe-particles)
 * [`mrzl/LeapMotionP5`](https://github.com/mrzl/LeapMotionP5)
 * [`relu91/niftyeditor`](https://github.com/relu91/niftyeditor)
 * [`bparmentier/OpenBikeSharing`](https://github.com/bparmentier/OpenBikeSharing)
 * [`graphhopper/graphhopper`](https://github.com/graphhopper/graphhopper/) by [`@karussell`](https://github.com/karussell)
 * [`t-oster/VisiCut`](https://github.com/t-oster/VisiCut)
 * [`arnaudroger/SimpleFlatMapper`](https://github.com/arnaudroger/SimpleFlatMapper)
 * [`Floens/Clover`](https://github.com/Floens/Clover)
 * [`chrisshayan/TechLooper`](https://github.com/chrisshayan/TechLooper)
 * [`bonigarcia/dualsub`](https://github.com/bonigarcia/dualsub)
 * [`blundell/WoodyFaceDetection`](https://github.com/blundell/WoodyFaceDetection)
 * [`blundell/QuickSand`](https://github.com/blundell/QuickSand)
 * [`blundell/ArrowLogger`](https://github.com/blundell/ArrowLogger)
 * [`pushtorefresh/storio`](https://github.com/pushtorefresh/storio) by [`@artem-zinnatullin`](https://github.com/artem-zinnatullin)
 * [`mangstadt/ez-vcard`](https://github.com/mangstadt/ez-vcard)
 * [`jmyrland/DriSMo`](https://github.com/jmyrland/DriSMo)
 * [`pmd/pmd`](https://github.com/pmd/pmd) by [`@adangel`](https://github.com/adangel)
 * [`javaslang/javaslang`](https://github.com/javaslang/javaslang)
 * [`thothbot/parallax`](https://github.com/thothbot/parallax)
 * [`jasonycw/MemeCreator`](https://github.com/jasonycw/MemeCreator)
 * [`jasonycw/TyphoonTycoon`](https://github.com/jasonycw/TyphoonTycoon)
 * [`ysc/QuestionAnsweringSystem`](https://github.com/ysc/QuestionAnsweringSystem)
 * [`ysc/word`](https://github.com/ysc/word)
 * [`andot/hprose`](https://github.com/andot/hprose)
 * [`guikeller/jetty-runner`](https://github.com/guikeller/jetty-runner)
 * [`frizbog/gedcom4j`](https://github.com/frizbog/gedcom4j)
 * [`h2oai/h2o-3`](https://github.com/h2oai/h2o-3) by [`@srisatish`](https://github.com/srisatish)
 * [`Feng14/MiniWeChat-Server`](https://github.com/Feng14/MiniWeChat-Server)
 * [`tianzhijiexian/ActivityOptionsICS`](https://github.com/tianzhijiexian/ActivityOptionsICS)
 * [`swanson/stringer`](https://github.com/swanson/stringer)
 * [`JayFang1993/DropDownMenu`](https://github.com/JayFang1993/DropDownMenu)
 * [`AizazAZ/Android-Ultra-Photo-Selector`](https://github.com/AizazAZ/Android-Ultra-Photo-Selector)
 * [`patilswapnilv/TerminalIDE`](https://github.com/patilswapnilv/TerminalIDE)
 * [`zhaoqp2010/andbase`](https://github.com/zhaoqp2010/andbase)
 * [`omry/banana`](https://github.com/omry/banana)
 * [`jackrex/AndroidCacheFoundation`](https://github.com/jackrex/AndroidCacheFoundation)
 * [`kaitoy/pcap4j`](https://github.com/kaitoy/pcap4j)
 * [`rgladwell/m2e-android`](https://github.com/rgladwell/m2e-android)
 * [`scireum/parsii`](https://github.com/scireum/parsii)
 * [`scireum/sirius-kernel`](https://github.com/scireum/sirius-kernel)
 * [`yazeed44/ResizableView`](https://github.com/yazeed44/GroceryShopping)
 * [`yazeed44/GroceryShopping`](https://github.com/yazeed44/GroceryShopping)
 * [`MindMac/AndroidAppLog`](https://github.com/MindMac/AndroidAppLog)
 * [`kpbird/chips-edittext-library`](https://github.com/kpbird/chips-edittext-library)
 * [`spiffyui/spiffyui`](https://github.com/spiffyui/spiffyui)
 * [`coala-analyzer/coala`](https://github.com/coala-analyzer/coala) by [`@sils1297`](https://github.com/sils1297)
 * [`mgarin/weblaf`](https://github.com/mgarin/weblaf)
 * [`conductor-framework/conductor`](https://github.com/conductor-framework/conductor) by [`@ddavison`](https://github.com/ddavison)
 * [`ctron/package-drone`](https://github.com/ctron/package-drone)
 * [`markkerzner/FreeEed`](https://github.com/markkerzner/FreeEed)
 * [`morris/lessql`](https://github.com/morris/lessql)
 * [`jitlogic/zorka`](https://github.com/jitlogic/zorka)
 * [`sdorra/angular-dashboard-framework`](https://github.com/sdorra/angular-dashboard-framework)
 * [`iluwatar/java-design-patterns`](https://github.com/iluwatar/java-design-patterns)
 * [`chesterbr/ruby2600`](https://github.com/chesterbr/ruby2600)
 * [`testinfected/molecule`](https://github.com/testinfected/molecule)
 * [`testinfected/simple-petstore`](https://github.com/testinfected/simple-petstore)
 * [`pchab/AndroidRTC`](https://github.com/pchab/AndroidRTC)
 * [`dolda2000/ashd`](https://github.com/dolda2000/ashd)
 * [`MaigoAkisame/MCPDict`](https://github.com/MaigoAkisame/MCPDict)
 * [`Ph1b/MaterialAudiobookPlayer`](https://github.com/Ph1b/MaterialAudiobookPlayer)
 * [`SVGKit/SVGKit`](https://github.com/SVGKit/SVGKit) by [`@adamgit`](https://github.com/adamgit)
 * [`vertigo17/Cerberus`](https://github.com/vertigo17/Cerberus) by [`@bcivel`](https://github.com/bcivel)
 * [`jaredsburrows/OpenQuartz`](https://github.com/jaredsburrows/OpenQuartz)
 * [`jaredsburrows/AndroidGradleTemplate`](https://github.com/jaredsburrows/AndroidGradleTemplate)
 * [`vitalidze/traccar-web`](https://github.com/vitalidze/traccar-web)
 * [`ReikaKalseki/ChromatiCraft`](https://github.com/ReikaKalseki/ChromatiCraft)
 * [`ReikaKalseki/RotaryCraft`](https://github.com/ReikaKalseki/RotaryCraft)
 * [`ReikaKalseki/DragonAPI`](https://github.com/ReikaKalseki/DragonAPI)
 * [`jOOQ/jOOX`](https://github.com/jOOQ/jOOX) by [`@lukaseder`](https://github.com/lukaseder)
 * [`konsoletyper/teavm`](https://github.com/konsoletyper/teavm)
 * [`citiususc/hipster`](https://github.com/citiususc/hipster)
 * [`katzer/cordova-plugin-local-notifications`](https://github.com/katzer/cordova-plugin-local-notifications)
 * [`katzer/cordova-plugin-background-mode`](https://github.com/katzer/cordova-plugin-background-mode)
 * [`katzer/cordova-plugin-email-composer`](https://github.com/katzer/cordova-plugin-email-composer)
 * [`nivdul/actitracker-cassandra-spark`](https://github.com/nivdul/actitracker-cassandra-spark)
 * [`LuckyJayce/MVCHelper`](https://github.com/LuckyJayce/MVCHelper)
 * [`LuckyJayce/ViewPagerIndicator`](https://github.com/LuckyJayce/ViewPagerIndicator)
 * [`xvik/guice-persist-orient`](https://github.com/xvik/guice-persist-orient)
 * [`xvik/dropwizard-guicey`](https://github.com/xvik/dropwizard-guicey)
 * [`mbosecke/pebble`](https://github.com/mbosecke/pebble)
 * [`inklabs/kommerce-core`](https://github.com/inklabs/kommerce-core) by [`@pdt256`](https://github.com/pdt256)
 * [`elchris/easysql`](https://github.com/elchris/easysql)
 * [`checkstyle/checkstyle`](https://github.com/checkstyle/checkstyle) by [`@romani`](https://github.com/romani)
 * [`mifmif/mspider`](https://github.com/mifmif/mspider)
 * [`mifmif/Generex`](https://github.com/mifmif/Generex)
 * [`KeldOelykke/FailFast`](https://github.com/KeldOelykke/FailFast)
 * [`erudika/para`](https://github.com/erudika/para) by [`@albogdano`](https://github.com/albogdano)
 * [`trautonen/coveralls-maven-plugin`](https://github.com/trautonen/coveralls-maven-plugin)
 * [`mystilleef/eclipse4-smartsave`](https://github.com/mystilleef/eclipse4-smartsave)
 * [`expercise/expercise`](https://github.com/expercise/expercise) by [`@ufukuzun`](https://github.com/ufukuzun)
 * [`kbilsted/StatePrinter`](https://github.com/kbilsted/StatePrinter)
 * [`js-cookie/java-cookie`](https://github.com/js-cookie/java-cookie) by [`@FagnerMartinsBrack`](https://github.com/FagnerMartinsBrack)
 * [`Suseika/inflectible`](https://github.com/Suseika/inflectible)
 * [`mp911de/lettuce`](https://github.com/mp911de/lettuce)
 * [`hackiftekhar/IQKeyboardManager`](https://github.com/hackiftekhar/IQKeyboardManager)
 * [`mafagafogigante/dungeon`](https://github.com/bernardosulzbach/dungeon)
 * `colonB/Mixer` by [`@kkashpur`](https://github.com/kkashpur)
 * `colonB/Dorm` by [`@kkashpur`](https://github.com/kkashpur)

<hr/>

<span id="11"></span>

October, 4th:
A few weeks ago I asked three guys, who work with me, to check every single
project in this list and provide their feedback. I've received three plain
text files from them. Here they are, combined into one, with almost no corrections:
[`award-2015.txt`](/txt/2015/award-2015.txt) (you can find your project there).
Based on [their opinions](/txt/2015/award-2015.txt),
I've decided to select the following 12 projects for closer review
(in alphabetic order):

  * [`coala-analyzer/coala`](https://github.com/coala-analyzer/coala)
  * [`checkstyle/checkstyle`](https://github.com/checkstyle/checkstyle)
  * [`citiususc/hipster`](https://github.com/citiususc/hipster)
  * [`gulpjs/gulp`](https://github.com/gulpjs/gulp)
  * [`kaitoy/pcap4j`](https://github.com/kaitoy/pcap4j)
  * [`raphw/byte-buddy`](https://github.com/raphw/byte-buddy) (added on Oct-5)
  * [`subchen/snack-string`](https://github.com/subchen/snack-string)
  * [`gvlasov/inflectible`](https://github.com/gvlasov/inflectible)
  * [`testinfected/molecule`](https://github.com/testinfected/molecule)
  * [`trautonen/coveralls-maven-plugin`](https://github.com/trautonen/coveralls-maven-plugin)
  * [`wbotelhos/raty`](https://github.com/wbotelhos/raty)
  * [`xvik/guice-persist-orient`](https://github.com/xvik/guice-persist-orient)

I'll review them soon. The winner will be announced
on the 15th of October.

October, 5th:
I received an email from the author of
[`raphw/byte-buddy`](https://github.com/raphw/byte-buddy), asking
me to reconsider my decision about this project. I took a quick
look at why the project was filtered out and decided to include
it into the list of finalists. BTW, if any of you think that your
project was excluded by mistake, don't hesitate to
[email me](mailto:yegor256@gmail.com).

October, 11th:
I analyzed all 12 projects today. All of them are really good projects,
that's why, in order to find the best one I was focusing on their
[sins]({% pst 2015/jun/2015-06-08-deadly-sins-software-project %}), not virtues.
Here is what I found, preliminary.

[`coala-analyzer/coala`](https://github.com/coala-analyzer/coala) (14K Python LoC, 160K HoC)

  * `None` is used in many places (over 400 places I found), which technically is `NULL`,
    and it's a serious [anti-pattern]({% pst 2014/may/2014-05-13-why-null-is-bad %})
  * There are global functions, for example
    `get_language_tool_results` and `DictUtilities`.
    It is definitely a [bad idea]({% pst 2014/may/2014-05-05-oop-alternative-to-utility-classes %}) in OOP.
  * Class [`Constants`](https://github.com/coala-analyzer/coala/blob/master/coalib/misc/Constants.py)
    is a [terrible]({% pst 2015/jul/2015-07-06-public-static-literals %}) idea.
  * Checking object types in runtime is a
    [bad idea]({% pst 2015/apr/2015-04-02-class-casting-is-anti-pattern %}),
    e.g. `ClangCountVectorCreator.py`
  * What's wrong with `cindex.py`?
    There are almost 3200 lines of code, that's way too many.
  * Static analysis is not a mandatory step in the build/release pipeline.
    That's why, I believe, code formatting is not consistent and sometimes
    rather ugly. For example, [`pylint`](https://www.logilab.org/857) reports hundreds of issues.
    (update: scrutinizer is used, but I still believe that a local use of pylint
    would seriously improve the quality of code)
  * Some methods have documentation, others don't. I didn't understand
    the logic. Would be great to have all methods documented. Also, not
    all classes are documented.
  * Score: 5

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

  * There are many ER-ending classes, like
    [`SeverityLevelCounter`](https://github.com/checkstyle/checkstyle/blob/master/src/main/java/com/puppycrawl/tools/checkstyle/api/SeverityLevelCounter.java),
    [`Filter`](https://github.com/checkstyle/checkstyle/blob/master/src/main/java/com/puppycrawl/tools/checkstyle/api/Filter.java),
    and `AbstractLoader` (for example),
    which are [anti-patterns]({% pst 2015/mar/2015-03-09-objects-end-with-er %}).
  * There is a [whole bunch](https://github.com/checkstyle/checkstyle/tree/master/src/main/java/com/puppycrawl/tools/checkstyle/utils) of utility classes,
    which are [definitely]({% pst 2014/may/2014-05-05-oop-alternative-to-utility-classes %})
    a bad thing in OOP. They are even grouped into a special `utils` package,
    such a terrible idea.
  * Setters and getters are everywhere, together with immutable classes, which
    really are [not]({% pst 2014/sep/2014-09-16-getters-and-setters-are-evil %}) an OOP thing,
    for example [`DetectorOptions`](https://github.com/checkstyle/checkstyle/blob/master/src/main/java/com/puppycrawl/tools/checkstyle/checks/regexp/DetectorOptions.java).
  * `NULL` is actively used, in many places---it's a serious [anti-pattern]({% pst 2014/may/2014-05-13-why-null-is-bad %})
  * I've found five `.java` files with over 1000 lines in each of them,
    for example 2500+ in `ParseTreeBuilder.java`
  * There are direct commits to master made by different contributors
    and some of them are not linked back to any tickets. It's impossible
    to understand why they were made. Look at this for example:
    [`7c50922`](https://github.com/checkstyle/checkstyle/commit/7c5092271d95f34b5ddcb160e85ea460daaadb5d).
    Was there a discussion involved? Who made a decision? Not clear at all.
  * [Releases](https://github.com/checkstyle/checkstyle/releases) are not documented at all.
  * Release procedure is not automated. At least I didn't find any release script
    in the repository.
  * Score: 3

[`citiususc/hipster`](https://github.com/citiususc/hipster) (5K Java LoC, 64K HoC)

  * [Getters and setters]({% pst 2014/sep/2014-09-16-getters-and-setters-are-evil %})
    are used in many places, for example
    in [`DepthFirstSearch`](https://github.com/citiususc/hipster/blob/1.0.X/hipster-core/src/main/java/es/usc/citius/hipster/algorithm/DepthFirstSearch.java)
    and [`Transition`](https://github.com/citiususc/hipster/blob/1.0.X/hipster-core/src/main/java/es/usc/citius/hipster/model/Transition.java).
    Aside from that, almost all classes are mutable and are used
    as transfer bags for the needs of the algorithm. This is not how OOP
    should be used, I believe.
  * There are public static methods and even
    [utility classes]({% pst 2014/may/2014-05-05-oop-alternative-to-utility-classes %}),
    for example this one, with a funny name [`F`](https://github.com/citiususc/hipster/blob/1.0.X/hipster-core/src/main/java/es/usc/citius/hipster/util/F.java)
  * `NULL` is used actively, especially in iterators---it's a [bad idea]({% pst 2014/may/2014-05-13-why-null-is-bad %})
  * JavaDoc documentation is not consistent, some methods are documented,
    others aren't.
  * Not all commits are linked to tickets, look at this, for example:
    [`8cfa5de`](https://github.com/citiususc/hipster/commit/8cfa5dec281d6ef6d8e38ff53458d38e83712e48).
  * Changes are committed directly to `master` branch, pull requests are not
    used at all.
  * I didn't find an automated procedure for release. I found one for
    regular snapshot deployment to Bintray, but what about releases? Are they
    done manually?
  * There is no static analysis, that's why the code looks messy sometimes.
  * The amount of unit tests is rather small. Besides that, I didn't find
    a real code coverage report published anywhere.
  * Score: 4

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

  * This project is too small for the competition,
    just 700 lines of code. Disqualified.
  * Score: 0

[`kaitoy/pcap4j`](https://github.com/kaitoy/pcap4j) (42K LoC, 122K HoC)

  * There is a [`util`](https://github.com/kaitoy/pcap4j/tree/master/pcap4j-core/src/main/java/org/pcap4j/util)
    package with utility classes, which are a
    [bad practice]({% pst 2014/may/2014-05-05-oop-alternative-to-utility-classes %})
  * `NULL` is used in mutable objects, for example in
    [`AbstractPcapAddress`](https://github.com/kaitoy/pcap4j/blob/master/pcap4j-core/src/main/java/org/pcap4j/core/AbstractPcapAddress.java);
    it's a [bad idea]({% pst 2014/may/2014-05-13-why-null-is-bad %})
  * There too many `static` methods and variables. They are literally
    everywhere. There is even a module called `pcap4j-packetfactory-static`,
    full of "classes" with static methods.
  * JavaDoc documentation is not consistent and sometimes
    just incomplete, check [this](https://github.com/kaitoy/pcap4j/blob/master/pcap4j-core/src/main/java/org/pcap4j/core/NotOpenException.java#L21-L23),
    for example
  * There are just a few issues and only six pull requests. Commits
    are not linked to issues. There is almost zero traceability of changes.
  * Release procedure is not automated,
    [releases](https://github.com/kaitoy/pcap4j/releases) are not documented
  * There is no static analysis, that's why the code looks messy sometimes
  * Score: 3

[`raphw/byte-buddy`](https://github.com/raphw/byte-buddy) (84K LoC, 503K HoC)

  * I found over 20 `.java` files with over 1000 lines of code.
    [`TypePool.java`](https://github.com/raphw/byte-buddy/blob/master/byte-buddy-dep/src/main/java/net/bytebuddy/pool/TypePool.java)
    even has 6200 lines!
  * There are many `public static`
    [methods]({% pst 2014/may/2014-05-05-oop-alternative-to-utility-classes %}) and
    [properties]({% pst 2015/jul/2015-07-06-public-static-literals %}). I
    realize that maybe that the only way to deal with the problem domain in Java,
    but still...
  * `instanceof` is used very often, and it's a
    [bad practice]({% pst 2015/apr/2015-04-02-class-casting-is-anti-pattern %})
    in OOP. Again, I understand that problem domain may require it sometimes,
    but still...
  * Most commits are made directly to master, without pull requests or tickets,
    that's why traceability of them is broken.
  * Release procedure is not automated (I didn't find a script).
  * Score: 5

[`subchen/snack-string`](https://github.com/subchen/snack-string) (1K LoC, 2K HoC)

  * The project is too small, disqualified.
  * Score: 0

[`gvlasov/inflectible`](https://github.com/gvlasov/inflectible) (5K LoC, 36K HoC)

  * The project is rather small, right on the edge of competition
    requirements and is made by a single developer. Besides that
    I don't see any problems here. The code looks object oriented,
    all changes are traceable back to issues and pull requests,
    release procedure is automated, static analysis is mandatory,
    releases are documented. Thumbs up!
  * Score: 10

[`testinfected/molecule`](https://github.com/testinfected/molecule) (10K LoC, 43K HoC)

  * There are a few [utility classes]({% pst 2014/may/2014-05-05-oop-alternative-to-utility-classes %}),
    for example `Streams`
  * There are setters and getters in some classes,
    even through they are in a different naming convention,
    for example [`Request`](https://github.com/testinfected/molecule/blob/master/src/main/java/com/vtence/molecule/Request.java)
    and [`Response`](https://github.com/testinfected/molecule/blob/master/src/main/java/com/vtence/molecule/Response.java).
  * Most of `.java` files don't have any JavDoc blocks, and they look consistent,
    but then, all of a sudden, some files do have documentation,
    for example [`WebServer`](https://github.com/testinfected/molecule/blob/master/src/main/java/com/vtence/molecule/WebServer.java).
  * There are not so many issues and most of commits are not
    traceable back to any of them, for example
    [`b4143a0`](https://github.com/testinfected/molecule/commit/b4143a0d15023c4fc259678e2f15698c77f3a76f)---why it was made? Not clear. Also, there are almost no pull request. Looks
    like the author is just committing to master.
  * Release procedure is not documented/automated. I didn't find it. Also,
    [releases](https://github.com/testinfected/molecule/releases) are not documented at all.
  * Static analysis is absent.
  * Score: 6

[`trautonen/coveralls-maven-plugin`](https://github.com/trautonen/coveralls-maven-plugin) (4.5K LoC)

  * The project is too small for the competition, less than 5K lines of code.
    Besides that, it's younger than one year, the first commit was
    made in May 2015.
    Disqualified.
  * Score: 0

[`wbotelhos/raty`](https://github.com/wbotelhos/raty) (8.7K LoC, 63K HoC)

  * There are utility classes, for example
    `helper.js`
  * There are global functions, for example in
    `helper.js`
  * `jasmine.js`
    has 2400 lines of code, which is way too many
  * I didn't understand why `.html` files stay together with `.js`
    in the same directory, for example
    `run.html`
  * Not all changes are traceable to issues,
    for example [`0a233e8`](https://github.com/wbotelhos/raty/commit/0a233e80a843afd8579878431235c2cbbd8a453e).
    There are not so many issues in the project and just a few pull requests.
  * Release procedure is not automated (at least I didn't find any documentation
    about it)
  * There is no static analysis
  * There are no unit tests
  * Score: 2

[`xvik/guice-persist-orient`](https://github.com/xvik/guice-persist-orient) (17K LoC, 54K HoC)

  * There is [ORM]({% pst 2014/dec/2014-12-01-orm-offensive-anti-pattern %})
    and that's why [getters and setters]({% pst 2014/sep/2014-09-16-getters-and-setters-are-evil %}),
    for example in [`VersionedEntity`](https://github.com/xvik/guice-persist-orient/blob/master/src/main/java/ru/vyarus/guice/persist/orient/model/VersionedEntity.java)
  * Dependency injection is actively used, which, I believe,
    is a [bad idea]({% pst 2014/oct/2014-10-03-di-containers-are-evil %}) in OOP in general. But in this project, I understand,
    it is required by the problem domain. Anyway...
  * There are just a few issues and almost no pull requests,
    and commits are not traceable back to issues,
    for example this one: [`e9c8f79`](https://github.com/xvik/guice-persist-orient/commit/e9c8f79cf666b92f9db40ae5dbfb8678e6721c6f)
  * ~~There is no static analysis~~ (static analysis is there, with a subset of Checkstyle, PMD and FindBugs checks)
  * Score: 5

I paid most attention to anti-patterns, which is the first
and the most terrible sin we should try to avoid. Presence of
`null`, for example, much more seriously affected the score than
the absence of an automated release procedure.

Oct 15:
Thus, we have these best projects, out of 158 submitted to the competition:

  1. [`gvlasov/inflectible`](https://github.com/gvlasov/inflectible): **winner!**
  2. [`testinfected/molecule`](https://github.com/testinfected/molecule)
  3. [`coala-analyzer/coala`](https://github.com/coala-analyzer/coala)
  4. [`xvik/guice-persist-orient`](https://github.com/xvik/guice-persist-orient)
  5. [`raphw/byte-buddy`](https://github.com/raphw/byte-buddy)
  6. [`citiususc/hipster`](https://github.com/citiususc/hipster)
  7. [`checkstyle/checkstyle`](https://github.com/checkstyle/checkstyle)
  8. [`kaitoy/pcap4j`](https://github.com/kaitoy/pcap4j)

Congratulations to [`@gvlasov`](https://github.com/gvlasov), the winner!
Here is your badge:

<img src="/images/award/2015/winner.png" style="width:203px;height:45px;" alt='winner'/>

Put this code into GitHub `README`:

```text
<a href="https://www.yegor256.com/2015/04/16/award.html">
  <img src="/images/award/2015/winner.png"
  style="width:203px;height:45px;" alt='winner'/></a>
```

All eight projects will receive a one-user free one-year license for one JetBrains
product. I will email you all and we'll figure out how to transfer them.

Thanks to everybody for participation! See you
[next year]({% pst 2015/oct/2015-10-17-award-2016 %}).
