Following several discussions lately, I wanted to bring back to our attention one important principle of how we work: we aim to contribute all our work to the Open edX project.
This is one of the main reasons that OpenCraft exist, to align the interests of clients needing customization with the open source project, so that both benefit from each other. By contributing the work, the clients get to share the maintenance load of their features with the rest of the project, while the rest of the project gains new features. And for us in the middle, we don’t end up caught up in the vicious circle of pushing quick changes that are a nightmare to maintain on the long term, especially during upgrades. It’s a guarantee we offer to our clients, to the project, and to the rest of the team who will have to deal with the code.
Core vs plugins
That doesn’t mean that everything needs to be upstreamed to the core, but every development we do should end up into one of these two categories:
- Upstream PR: for core features
- Plugin: for core and non-core features that fit in a plugin (note that the extension points might not exist, and would then also require an upstream PR to add them).
Also note that even in the case of a plugin, we should still contribute it to the project: post product proposals, ADR, and if there is interest for having it in the standard distribution, still get it included there. This is important, as more and more features will be developed as plugins - we should still do the effort of “upstreaming” those.
This isn’t specific to Open edX - changes to other open source projects and libraries follow the same approach.
One exception might be when we need to modify client code which might be proprietary in the first place - but we aim to keep those to a minimum, and will only rarely accept to do this, when it’s necessary for the rest of our work.
The big NO’s!
Specifically, the following approaches are banned:
- Making a change in a fork of the platform without upstreaming that change
- Making a logic/code change in a theme
- Making the change in a plugin that we don’t attempt to contribute to the project
We know from experience that some of these options are sometimes very tempting, especially when the clients don’t have much budget, and are pressuring for small quick fixes. We (and some clients) have however been bitten hard in the past by taking that road, and we owe it to them to remind them that, on the long term, this will actually end up being more costly, in particular because of the increased maintenance cost. Making features good and generic enough to be useful in the project takes more time and effort upfront, but it’s much better than ending up spending that time keeping a hacky change afloat forever.
Getting help
If you have encountered that situation, or if you do in the future, don’t hesitate to bring it up in the forum. It can feel like being stuck between a rock and a hard place, but you don’t have to deal with it alone. We have many people in the team who went through it numerous times, and there often ways to find a good solution.
And with the core contributors in the team, there is likely someone in the team that can help with the contribution part, or the upstreaming strategy. If that’s your case now, don’t hesitate to bring it up now.
Proposal: core contributor reviews of discoveries
Btw, since often these problems start at the estimation phase, by not provisioning enough time to properly generalize and contribute the features, it could now make sense to get technical discoveries reviewed by a core contributor - one that has the closest expertise for the subject at hand?
[ Ticket to log time answering ] (or a given project ticket/epic if you need to discuss a specific case)