It will help you improve your skills and understand how to start this journey!
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.
I think a better fix is to stop adding code for awhile, and only fix bugs.
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.