WordPress Core contributions by (tickets) numbers

Questo articolo รจ stato scritto oltre 1 years, il contenuto potrebbe essere datato.

Introduction

I did my first patch for WordPress core in 2015, I contributed in various WP official projects like WP-CLI, I am one of the co-maintainers of VVV (An open source Vagrant configuration for developing with WordPress), I am also the author (now just release manager) of GlotDict used by WordPress localizers/polyglots to contribute to the localization of WordPress and plugins/themes (for users numbers in Firefox/Chrome check here), I am a plugin developer in my web agency that sells also plugins, I am also a Global PTE for Italian for WordPress, I co-organized a WordCamp in Rome 2018 and in conclusion also a Co-organizer of the WordPress Roma and WordPress Terni meetup.
My WordPress.org profile just in case you don’t thrust me.

I am also famous for my critics to Open source projects like Mozilla other than just WordPress with his Visual Editor/Gutenberg.

I am not a data analyst so I am using the data I can find, with some calculation they are not perfect but helpful to get an idea. For any updates I am here to improve it.

Trust the data

So as contributor since a long time, that joined a lot of wordcamp, I know a lot of people and I see a lot of things happening on Trac. The other day, I was thinking how I can help others understand that it is necessary to involve more developers on “advanced” tasks, as contributors, that aren’t Component Maintainers or Committers? Like a middle role that helps to review the patches, so the Component maintainer can do his job and the Committer just does what the role name says. This middle role to me should be someone that just do reviews about the code itself as first level instead to leave a patch hanging for years.

Anyway following the idea of Year in core 2021 I did a similar thing with the WordPress Core Trac tickets data.

So using the public data that are incomplete (Trac limitation) I was able to do a script that generate some helpful data that I am here to show to you.
The tool generates also some JSON so you can generate graphs if you want (didn’t attached in this blogpost, use the tool to generate it).

I am ignoring all the data from Gutenberg or other projects, just the pure Core by Trac numbers.

The report, as full content, is available at that link, but you can generate it on your own if you need it (yes everything is open also the data analysis).
Those data are generated from the CSV downloadable by Trac, that doesn’t include everything, otherwise is necessary to scrape all the tickets and it wasn’t the best case…
Also those data are matched with an analysis of the tickets volume every 3 months since the project start in 2004.

It is not possible to get the closed date of a ticket, we will use the last modified date or “today” (for open ticket) that is not the ideal solution, so the average in reality could be tiny different!
Also it is not possible to know who closed the ticket with the author of the patch!
Don’t forget that a ticket can have more than 1 changeset that will close it (or not)!

Let’s start

Total public and alive tickets 55080 on estimated 55487 total created tickets with missing 407 tickets
The oldest ticket is 1 created on 2004-06-10
The oldest ticket still opened is 78 created on 2004-06-17

25126 Tickets with resolution "fixed" take an average of 276.4 days
4442 Tickets with resolution "wontfix" take an average of 664.3 days
2754 Tickets with resolution "worksforme" take an average of 467.6 days
7197 Tickets with resolution "invalid" take an average of 216.9 days
7500 Tickets with resolution "opened" without status changing 1654.4 days

Just to understand the volume, we can say that 1/3 of the tickets is just non-valid stuff.

Tickets by keywords
-----------

3105 Tickets with keyword "has-patch" average waiting time for closing 477.3 days
2042 Tickets with keyword "needs-testing" average waiting time for closing 713.3 days
1279 Tickets with keyword "dev-feedback" average waiting time for closing 902.5 days
479 Tickets with keyword "needs-patch" average waiting time for closing 901.7 days
881 Tickets with keyword "2nd-opinion" average waiting time for closing 660.5 days

So we can see that tickets take an average of 2-3 years before to be closed when a first patch is available.
So for a contributor in a WordCamp, as example, to get a review of the patch the average is like 3 years.
You can image what happens with all this delay, the patch is not aligned anymore with the WordPress code and maybe also with the coding standards. Without considering that the original developer in the meantime abandoned the community or doesn’t remember anything about that code when there is finally a review.

This generates a lot of stuff to do for committers/component maintainers that are the ones that will review the code (and update the patch/adding what is missing like tests). In the majority of the cases, this doesn’t happens as they need their time to work on other tickets in the same situation.

A real recent example (just because I got an update while writing this article)?


Ticket 50163 about an issue with redirect and canonical for paginated pages, a ticket opened 2 years ago but are just missing the tests. Also if it is something that involve SEO there is no push on fix them because Committers/Component Maintainers doesn’t have time to add the tests and there aren’t suggestions about how to do them.

Reading the documentation for a newcomer is not so helpful, often give hints (in the ticket itself) like check this file where to add tests and check the documentation provide more helpful and motivate the developer to do it. A message like this instead create the feeling “they know that my code is good but they don’t want to ship it”.

This huge lists show the ticket status for each component, but we can see that takes years or months based on the component itself. Anyway there are components in a better situation then others and this can depends on various factors.

We need to specify that a Ticket Owner on WordPress Core is not clear if it is a Core Committer or the Component Maintainer.

Owners numbers
-----

 nobody has 32177 tickets, with 5 opened tickets, 5 invalid tickets and 1 closed tickets
 SergeyBiryukov has 2910 tickets, with 1 opened tickets, 1 invalid tickets and 16 closed tickets
 ryan has 1833 tickets, with 1 opened tickets, 1 invalid tickets and 158 closed tickets
 nacin has 1678 tickets, with 1 opened tickets, 1 invalid tickets and 11 closed tickets
 azaozz has 1264 tickets, with 1 opened tickets, 1 invalid tickets and 14 closed tickets
 westi has 770 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 wonderboymusic has 736 tickets, with 1 opened tickets, 1 invalid tickets and 8 closed tickets
 markjaquith has 683 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 ocean90 has 668 tickets, with 1 opened tickets, 1 invalid tickets and 7 closed tickets
 matt has 607 tickets, with 1 opened tickets, 1 invalid tickets and 7 closed tickets
 johnbillion has 569 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 dd32 has 538 tickets, with 1 opened tickets, 1 invalid tickets and 59 closed tickets
 westonruter has 453 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 boonebgorges has 444 tickets, with 1 opened tickets, 1 invalid tickets and 60 closed tickets
 DrewAPicture has 431 tickets, with 1 opened tickets, 1 invalid tickets and 32 closed tickets
 lancewillett has 419 tickets, with 1 opened tickets, 1 invalid tickets and 291 closed tickets
 pento has 413 tickets, with 1 opened tickets, 1 invalid tickets and 7 closed tickets
 desrosj has 374 tickets, with 1 opened tickets, 1 invalid tickets and 99 closed tickets
 audrasjb has 363 tickets, with 2 opened tickets, 2 invalid tickets and 1 closed tickets
 afercia has 343 tickets, with 1 opened tickets, 1 invalid tickets and 20 closed tickets
 helen has 291 tickets, with 2 opened tickets, 2 invalid tickets and 1 closed tickets
 rob1n has 217 tickets, with 1 opened tickets, 1 invalid tickets and 19 closed tickets
 jeremyfelt has 216 tickets, with 1 opened tickets, 1 invalid tickets and 11 closed tickets
 koopersmith has 214 tickets, with 1 opened tickets, 1 invalid tickets and 11 closed tickets
 mdawaffe has 207 tickets, with 1 opened tickets, 1 invalid tickets and 20 closed tickets
 swissspidy has 201 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 adamsilverstein has 198 tickets, with 7 opened tickets, 7 invalid tickets and 1 closed tickets
 filosofo has 159 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 flixos90 has 147 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 iammattthomas has 144 tickets, with 1 opened tickets, 1 invalid tickets and 83 closed tickets
 nbachiyski has 140 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 iandstewart has 136 tickets, with 1 opened tickets, 1 invalid tickets and 92 closed tickets
 duck_ has 134 tickets, with 1 opened tickets, 1 invalid tickets and 8 closed tickets
 jorbin has 133 tickets, with 1 opened tickets, 1 invalid tickets and 32 closed tickets
 chriscct7 has 130 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 joemcgill has 129 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 obenland has 127 tickets, with 1 opened tickets, 1 invalid tickets and 39 closed tickets
 hellofromTonya has 126 tickets, with 1 opened tickets, 1 invalid tickets and 8 closed tickets
 peterwilsoncc has 117 tickets, with 1 opened tickets, 1 invalid tickets and 4 closed tickets
 TimothyBlynJacobs has 114 tickets, with 1 opened tickets, 1 invalid tickets and 9 closed tickets
 rachelbaker has 112 tickets, with 3 opened tickets, 3 invalid tickets and 1 closed tickets
 josephscott has 108 tickets, with 1 opened tickets, 1 invalid tickets and 6 closed tickets
 rmccue has 108 tickets, with 1 opened tickets, 1 invalid tickets and 5 closed tickets
 ianbelanger has 101 tickets, with 1 opened tickets, 1 invalid tickets and 46 closed tickets
 scribu has 101 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 whyisjake has 95 tickets, with 1 opened tickets, 1 invalid tickets and 14 closed tickets
 joedolson has 82 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 iseulde has 78 tickets, with 1 opened tickets, 1 invalid tickets and 12 closed tickets
 garrett-eclipse has 73 tickets, with 2 opened tickets, 2 invalid tickets and 1 closed tickets
 davidakennedy has 71 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 laurelfulford has 67 tickets, with 1 opened tickets, 1 invalid tickets and 19 closed tickets
 kpdesign has 61 tickets, with 1 opened tickets, 1 invalid tickets and 61 closed tickets
 jacobsantos has 54 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 joehoyle has 51 tickets, with 1 opened tickets, 1 invalid tickets and 4 closed tickets
 davidbaumwald has 50 tickets, with 1 opened tickets, 1 invalid tickets and 35 closed tickets
 spacedmonkey has 48 tickets, with 1 opened tickets, 1 invalid tickets and 4 closed tickets
 ryelle has 47 tickets, with 1 opened tickets, 1 invalid tickets and 47 closed tickets
 andy has 47 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 melchoyce has 43 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 youknowriad has 41 tickets, with 1 opened tickets, 1 invalid tickets and 16 closed tickets
 skippy has 41 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 noisysocks has 40 tickets, with 1 opened tickets, 1 invalid tickets and 21 closed tickets
 pishmishy has 40 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 jnylen0 has 39 tickets, with 1 opened tickets, 1 invalid tickets and 21 closed tickets
 Nazgul has 39 tickets, with 1 opened tickets, 1 invalid tickets and 15 closed tickets
 noel has 39 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 garyc40 has 39 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 michel v has 38 tickets, with 1 opened tickets, 1 invalid tickets and 9 closed tickets
 mikeschroder has 37 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 iandunn has 35 tickets, with 1 opened tickets, 1 invalid tickets and 15 closed tickets
 antpb has 34 tickets, with 3 opened tickets, 3 invalid tickets and 1 closed tickets
 gziolo has 34 tickets, with 2 opened tickets, 2 invalid tickets and 1 closed tickets
 kadamwhite has 33 tickets, with 1 opened tickets, 1 invalid tickets and 33 closed tickets
 sabernhardt has 30 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 yoavf has 29 tickets, with 1 opened tickets, 1 invalid tickets and 7 closed tickets
 atimmer has 29 tickets, with 1 opened tickets, 1 invalid tickets and 4 closed tickets
 ericlewis has 29 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 PeteMall has 29 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 jorgefilipecosta has 27 tickets, with 1 opened tickets, 1 invalid tickets and 27 closed tickets
 karmatosed has 27 tickets, with 1 opened tickets, 1 invalid tickets and 3 closed tickets
 xkon has 25 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 danielbachhuber has 24 tickets, with 1 opened tickets, 1 invalid tickets and 17 closed tickets
 skeltoac has 23 tickets, with 1 opened tickets, 1 invalid tickets and 10 closed tickets
 2fargon has 22 tickets, with 1 opened tickets, 1 invalid tickets and 4 closed tickets
 joostdevalk has 22 tickets, with 2 opened tickets, 2 invalid tickets and 1 closed tickets
 netweb has 22 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets
 Viper007Bond has 21 tickets, with 1 opened tickets, 1 invalid tickets and 4 closed tickets
 hansengel has 21 tickets, with 1 opened tickets, 1 invalid tickets and 2 closed tickets
 davidhouse has 21 tickets, with 1 opened tickets, 1 invalid tickets and 1 closed tickets

This other huge list is based on the owners associated to the various tickets and I think that the most important ones are on the top (excluding nobody).
This show another issue, What happens when the Owner abandon the project with hundred of tickets assigned to him/her?

Average of tickets closed (25126) per 874 Owners 28.7 that means 0.028 tickets closed by owner per week (1040 weeks since 2004)

We don’t know the ticket closed by the owner has that data is removed when the the ticket is fixed so I used the whole “fixed” tickets. The ratio is very unfair means that an owner close less than a single ticket every week.
Also consider that I am including also owners with just one ticket or not active anymore so the number can be different.

Another issue seems that after closing a ticket the owner is removed so we have no idea how many closed ticket were handled by a specific owner (with this data).

Tickets managed every 3 months average
-----------

Average 3-months "newticket" 764.9 tickets
Average 3-months "closedticket" 768 tickets
Average 3-months "reopenedticket" 115.5 tickets
Average 3-months "batchmodify" 5.1 tickets
Average 3-months "changeset" 731.4 changesets

The number of new tickets is the same of the changeset in 3 months, this means that it is kind of impossible to keep up and close tickets with this average, considering that there are tickets with multiple changeset (so the real numbers are different).

For this it was better a graph generated with the JSONs (but you can find everything in the repport file) using JSON to CSV.
If you are looking for the Jupyter version check here (don’t forget that also other JSON are generated by the script).

Anyway the 2022 data are incomplete, as the year didn’t yet ended.

Using GitHub (that can be another idea) we can see another fact about contributors that are committers in the WordPress case.

This is just a preview of that link, but you can see that the names are the same in the list above.

Conclusion

Excluding the fact that we don’t have complete and valid at 100% data, like the real closed data of the ticket or when the changeset was published (that closed the ticket), we can do some thoughts (I don’t want to scrape all the 55000 tickets).

Probably move everything to GitHub or use in a more consistent way Trac like without removing the owner when the ticket is closed or get more data from Trac can give better information. The sad part of this analysis is that we aren’t 100% sure of everything but at the end they are numbers and they are trustable as they are also if they are not complete.

My opinion on the Core development is that it is on stall since the Gutenberg arrival, that the core development is in the hand of very few people (that can leave in any moment like happened with 5.0 release) and also that is not possible with the actual numbers of “advanced” contributors keep up with the amount of tickets and patch made every day.

The problem of the bus factor existed in the PHP project, so the PHP Foundation was created to resolve this issue, founding 6 different developers to move on the core development. Just to remember that Automattic was one of the company that shared funding to this foundation (with others).
In WordPress this is managed by companies that employee people to work on that and casual contributors but this means that we are create gatekeeping in a FOSS project with those numbers.

All this duties to Component maintainers and Committers are bad, basically because this can move easily to burnout as they have a huge list of tickets assigned to them but in a day how many of them, with their life and work, can handle them?

My suggestions

  • Create a Mentor/Reviewer role, that has duty, but is able/skilled to review the patch or help the patch author to finish it, ready to be reviewed by Component Maintainers
  • Improve the Bug triage team with other people to have less tickets to be handled by Component maintainers (when a component is assigned)
  • During WordCamp at the core table get people working on triage, as developers/veterans are required

Now with numbers everyone can do their own math to understand if the project is healthy and if for contributors is worth it. My personal experience is that I have still patch waiting since 2015 for a review and the suggestions at WordCamp (or on Slack) was to stalker the various owners/component maintainers to get a review. Remember that a review is not enough and probably after the first changes you will need more of them and if it is required an year to get one…

Not everyone can do the component maintainers or the committer because maybe doesn’t have time for that but instead the skills are another matter. Right now the learning curve is very high but the onboarding of new people is very difficult because of this.

Thanks to: Erik, Loic, Enea, Stefania, John, Antonello for the review and suggestions!

PS: what is the crazyhorse component?

PS: also Trac needs help, the ticket about JSON exports was created 15 years ago.

Liked it? Take a second to support Mte90 on Patreon!
Become a patron at Patreon!

2 thoughts on “WordPress Core contributions by (tickets) numbers

    1. Usually before the changes on 5.0 the odd release was mainly for bugfixes with less new stuff as it was 2 releases every year with more time to define stuff etc.

      But without any people working on tickets is not useless and also with gunteberg that require a lot of changes and updates at every release is not easy to follow this. It would be more easy if we have people focusing on specific things and not on everything.

Leave a Reply

Your email address will not be published. Required fields are marked *