Hi all,
In my opinion, the Joomla CMS’s upgradability, stability, and maintainability can and should be improved greatly. I think this is essential to our project’s future. I think that those three items can be improved substantially without sacrificing innovation. In fact, adjusting the way we currently deal with these three processes will set the foundation for more sustainable innovation and competitive involvement on the web.
The current development strategy results in fragmented Joomla CMS major versions that are extremely difficult, time-consuming, and costly to migrate from one version to another. Our users are not able to keep up with the pace of change, which is evident by the statistic that about 55% of our users are still on Joomla 1 (http://w3techs.com/technologies/details/cm-joomla/all/all).
Fragmented Joomla major versions also make it difficult for core developers/designers and 3rd party developers/designers to maintain their software, since they need to support multiple packages and do testing on multiple versions. It results in at least double the work for maintainers and testers.
It also results in a bloated CMS that’s difficult (or near impossible) to maintain long-term.
Finally, the last major issue is that it results in confusion as to which Joomla CMS version to use and when. Should a user migrate from Joomla 1.5 to Joomla 2.5 or Joomla 3? If so, when? How long will each be supported? What’s the best strategy to take? What’s LTS? What’s STS? For how long? We’ve resorted to answering these type of questions with complicated paragraphs, diagrams, charts, infographics, videos, etc. Even with all the effort we’ve put into explaining Joomla versions, our users as a whole still don’t understand because it’s too complicated.
That being said, I’d like to propose and get community feedback on my suggested changes to our development strategy for the CMS, which would resolve the above mentioned issues. These are merely my personal ideas as a community member and they are not on behalf of PLT. I would like to gather more community feedback before presenting my ideas for consideration to PLT.
The basic premise is to keep things simple, easy, and sustainable. All terms with an * are defined at the bottom of the doc. So with that in mind, here are my suggestions:
There should only be one active Joomla CMS version, “the latest and greatest”, which everyone should use and which should always be stable and user-friendly. (Note, this is the same approach as Google Chrome and Wordpress)
In order to achieve this, the following policy is required:
Backward compatibility* must always be maintained, even across major versions
The Developer API* (i.e. public API) should never break
Developer API should be clearly stated and documented.
Developer API should be fully unit tested to maintain integrity
Deprecations* are maintained at least 2 years before being considered for removal .
Deprecations should be clearly documented
Removal of deprecated code is not mandated after 2 years, but merely allowed if necessary
Deprecations can only be removed during major releases.
Removal of deprecations are not considered breaks in backward compatibility
The Designer Media* must never “break”
Designer Media should be clearly stated and documented.
Deprecations* are maintained at least 2 years before being considered for removal .
Deprecations should be clearly documented
Removal of deprecated media is not mandated after 2 years, but merely allowed if necessary
Deprecations can only be removed during major releases.
Removal of deprecations are not considered breaks in backward compatibility
Public Database Schema* must be maintained
Database schema should be clearly stated and documented.
Deprecations* are maintained at least 2 years before being considered for removal
Deprecations should be clearly documented
Removal of deprecations is not mandated after 2 years, but merely allowed if necessary
Deprecations can only be removed during major releases.
Removal of deprecations are not considered breaks in backward compatibility
Refactoring* should only be done when needed
Backward compatibility is non-negotiable. If that means we acquire technical debt for our users (end-users, site builders, designers, developers, etc), so be it.
Release a new minor (e.g. 3.4) or major (e.g. 4.0) version about every 6 months
The degree of change should determine if it’s a minor or major release. For example, an overhaul of the admin area could trigger a major release.
Alpha should be released around 3 months before the release
Beta should be released around 2 months before the release and no more new features can be added after beta is released. Periodic betas should be released.
An RC should be released at least two weeks before the release and only when ready
A stable release should only be released when ready
If any submitted features are not ready, they must wait until the next release (around 6 months later)
Maintenance releases (e.g. 3.1.1) should only fix security issues and critical bugs
Joomla core should be kept light and flexible
Non-essential extensions (for example, com_banners, com_contact, com_newsfeeds, etc) should be made as installable extensions via the Install from Web feature and maintained independently of the Joomla core.
This includes extensions that are used as “best practices” guides for new developers. A category on the JED can be created for “best practice” extensions and we can highlight them in the Install from Web feature if needed.
This type of thinking can be used for distributions. Just have a light core and install "sets" of extensions from the Install from Web feature.
--------------------------------
Definitions:
1) Backward compatibility:
Backward compatibility refers to the ability of a Joomla version N to accept extensions or data that worked under version N - 1. By this definition, if previous versions (N - 1, N - 2, etc.) were also backward compatible, which is often the case, then, by induction, version N will also accept input that worked under any prior version after, and including, the latest one that was not backward compatible. However, in practice, features are often deprecated and support is dropped in a later release, which is yet thought of as backward compatible.
Note, this is taken from http://en.wikipedia.org/wiki/Backward_compatibility, but modified slightly with “Joomla” and “extensions” as references instead.
2) Deprecation:
Deprecation is status change of a supported practice to a non-supported practice, which keeps in place the previously supported practice for at least one version to provide backward compatibility. That being said, with the deprecation of at least 2 years, you're actually getting at least N-4 versions.
3) Developer API:
The API that Joomla is agreeing to support for developers to use. This is our contract between Joomla and developers for API that we’re agreeing will be available to them and stable.
4) Designer Media:
The media that Joomla is agreeing to support for designers to use. This is our contract between Joomla and designers that we’re agreeing will be able to them and useable.
5) Public Database Schema:
The database schema that Joomla is agreeing to support for developers and others to use. This is our contract between Joomla and those that desire to use Joomla’s database schema.
6) Refactoring:
According to http://refactoring.com/, refactoring is a "disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior". Another way to say that is that refactoring is a technique that changes code, but produces no breaks for its users.
____________
FAQs:
1) What is the main advantage of the proposed changes?
The main advantage is that it’s simple. There’s only one Joomla version to market, to explain, and to maintain. This produces a ton of benefits for maintainers and users alike.
The Joomla core team would only have one Joomla version to maintain (rather than 2 or 3, as is possible now). That version would be light, so there would be less code to maintain.
Extension developers (include template designers) would only have one version to support, thus they wouldn’t need to maintain several different code bases (as was the case from J1.5 to J2 for everyone and J2 to J3 for template designers).
2) Won’t we get stuck with a lot of outdated, junky code?
No, that’s where deprecation comes in. It allows us to responsibly remove outdated/junky code, while stilling giving people enough time (at least 2 years) to adjust.
3) What is the relationship between backward compatibility and deprecation?
Backward compatibility is in reference to supported practices of the previous version (i.e. N-1). On the other hand, deprecation is status change of a supported practice to a non-supported practice, which keeps in place the previously supported practice for at least one version to provide backward compatibility. That being said, with the deprecation of at least 2 years, you are actually getting at least N-4 versions.
4) Isn’t removing deprecated code a break in backward compatibility?
That depends on what definitions you’re using. If you’re using the industry standard of N-1 for backward compatibility of supported practices, then by definition removing deprecated code is not a break in compatibility.
This is why it’s essential for our project to define our terms properly, no matter what direction we take.
5) Can you give an example of a break in backward compatibility?
Sure. An example of a break in backward compatibility would be an API that used to do a certain function in version V that suddenly stops doing the same function or produces a fatal error in version V+1.
However, if an API gets deprecated in V and gets removed in version V+5, when V+6 comes along, that is not considered a break in compatibility since the API was deprecated in V, worked in V+1, and was removed in V+5 and is not supported in V+6.
5) Why not just use semantic versioning instead of the proposed changes?
Semantic versioning doesn’t tell you whether or not you should have backward compatibility changes. It merely tells you what you should do *if* you have breaks in backward compatibility. My suggestion transcends semantic versioning and states that we should never have breaks in backward compatibility.
Furthermore, semantic versioning is for APIs whereas Joomla contains APIs and more. There’s UI to take into account, etc, that needs to be properly communicated. For example, an overhaul of the admin area could trigger a major release (e.g. J4).
6) What happens to STS and LTS?
Those terms are confusing and unneeded. With the proposed changes, there’s only the “latest Joomla”.
7) What would a move from a Joomla 3 to Joomla 4 for users look like under the proposed changes?
It would be a one-click upgrade.
Currently around 55% of our users are on Joomla versions that are EOL, unsupported, and insecure:
http://w3techs.com/technologies/details/cm-joomla/all/all
The propose changes would greatly mitigate this types of issues from occurring in the future.
8) Aren’t time-based releases causing rushed, sloppy code and review?
No, time based releases do not require submitted code to get in. If it's not ready (even for a committer to review it), it must wait 6 months until the next release.
That being said, having alpha 3 months before the release and having beta 2 months before, gives plenty of breathing room, especially with a lighter core and unit tested developer API.
----
Your feedback is welcomed and appreciated. Thank you for taking the time to read through this and give it consideration.
Sincerely,
Maintenance releases (e.g. 3.1.1) should only fix security issues and critical bugs
Sure thing. It's basically the same concept as our currently JUI:
https://github.com/joomla/joomla-cms/tree/master/media/jui
CSS, Javascript, images, etc, that Joomla is agreeing to support for
designers to use.
Backward compatibility* must always be maintained, even across major versions
The degree of change should determine if it’s a minor or major release. For example, an overhaul of the admin area could trigger a major release.
Joomla core should be kept light and flexible
4) Isn’t removing deprecated code a break in backward compatibility?
5) Why not just use semantic versioning instead of the proposed changes?
8) Aren’t time-based releases causing rushed, sloppy code and review?
Sorry are we trying to copy wordpress. I thought we were joomla.
8) Aren’t time-based releases causing rushed, sloppy code and review?Yes, the actually do, as can be evidenced by Joomla! CMS 3.2
It also results in a bloated CMS that’s difficult (or near impossible) to maintain long-term.
Finally, the last major issue is that it results in confusion as to which Joomla CMS version to use and when. Should a user migrate from Joomla 1.5 to Joomla 2.5 or Joomla 3? <snip> Joomla versions, our users as a whole still don’t understand because it’s too complicated.
In order to achieve this, the following policy is required:
Backward compatibility* must always be maintained, even across major versions
The Developer API* (i.e. public API) should never break
Developer API should be clearly stated and documented.
Developer API should be fully unit tested to maintain integrity
Deprecations* are maintained at least 2 years before being considered for removal .
In all of these proposals, this is the only one that is calling for defining the API, and IMO, clarifying the API is the only possible way out.
But, I would not go further than defining the API at this time. I would get an agreement on that -- and the very act of doing so will mean BC breaks. There are far, far, far too many ways that developers can use the environment and those should be significantly slashed and Interfaces should be defined for the CMS to act as clear contracts as to what developers should (and should not be using.)
As an example of how this would help -- take email as a service and offer a single method "send()" with no parameters. Inject all input using the framework's DIC and the API is one method. Now, what the framework folks do inside is irrelevant to the CMS. If they offer options beyond phpMailer -- including Swiftmail -- and Zendmail -- it won't change the API.
I'm very concerned at all of these proposals I am seeing which continue to avoid getting down to a cleaned up, scaled back, well documented, fully tested API. When the API is agreed too, those other matters, like how long support lasts and whether or not Semantic Versioning will be used, etc., etc., will be easier to tackle.
But first, what is the API? Does everyone agree on that? That alone will be a big job but it's the way forward, avoiding it means more of the same in terms of problems, quality issues, BC breaks.
It's definitely worth looking at why WordPress is able to upgrade without problems. For a very long time, WP has had a clearly defined API. And, that isn't all public functions -- it's a clear set of developer functions, nothing less than what they need and nothing more.
On the issue of BC support, yes, WP is the one to emulate. But, before Joomla is in a position to do what WP is successfully doing, there will need to be cleanup changes, there is just no way around that.
We're not trying to be like Drupal. We've tried strictly featured based releases. We've tried strictly timed based releases. Neither of them have worked for our community in the long run (if they had, we wouldn't be having this conversation) the balance is somewhere in the middle. Let's find that.
The current development strategy results in fragmented Joomla CMS major versions that are extremely difficult, time-consuming, and costly to migrate from one version to another.
Our users are not able to keep up with the pace of change, which is evident by the statistic that about 55% of our users are still on Joomla 1 (http://w3techs.com/technologies/details/cm-joomla/all/all).
In order to achieve this, the following policy is required:
Backward compatibility* must always be maintained, even across major versions
The Developer API* (i.e. public API) should never break
Developer API should be clearly stated and documented.
Developer API should be fully unit tested to maintain integrity
Deprecations* are maintained at least 2 years before being considered for removal .
Deprecations should be clearly documented
Removal of deprecated code is not mandated after 2 years, but merely allowed if necessary
Deprecations can only be removed during major releases.
Removal of deprecations are not considered breaks in backward compatibility
The Designer Media* must never “break”
Designer Media should be clearly stated and documented.
Deprecations* are maintained at least 2 years before being considered for removal .
Deprecations should be clearly documented
Removal of deprecated media is not mandated after 2 years, but merely allowed if necessary
Deprecations can only be removed during major releases.
Removal of deprecations are not considered breaks in backward compatibility
Public Database Schema* must be maintained
Database schema should be clearly stated and documented.
Deprecations* are maintained at least 2 years before being considered for removal
Deprecations should be clearly documented
Removal of deprecations is not mandated after 2 years, but merely allowed if necessary
Deprecations can only be removed during major releases.
Removal of deprecations are not considered breaks in backward compatibility
Refactoring* should only be done when needed
Backward compatibility is non-negotiable. If that means we acquire technical debt for our users (end-users, site builders, designers, developers, etc), so be it.
Release a new minor (e.g. 3.4) or major (e.g. 4.0) version about every 6 months
The degree of change should determine if it’s a minor or major release. For example, an overhaul of the admin area could trigger a major release.
Alpha should be released around 3 months before the release
Beta should be released around 2 months before the release and no more new features can be added after beta is released. Periodic betas should be released.
An RC should be released at least two weeks before the release and only when ready
A stable release should only be released when ready
If any submitted features are not ready, they must wait until the next release (around 6 months later)
Maintenance releases (e.g. 3.1.1) should only fix security issues and critical bugs
Joomla core should be kept light and flexible
Non-essential extensions (for example, com_banners, com_contact, com_newsfeeds, etc) should be made as installable extensions via the Install from Web feature and maintained independently of the Joomla core.
This includes extensions that are used as “best practices” guides for new developers. A category on the JED can be created for “best practice” extensions and we can highlight them in the Install from Web feature if needed.
This type of thinking can be used for distributions. Just have a light core and install "sets" of extensions from the Install from Web feature.
1) Backward compatibility:
Backward compatibility refers to the ability of a Joomla version N to accept extensions or data that worked under version N - 1. By this definition, if previous versions (N - 1, N - 2, etc.) were also backward compatible, which is often the case, then, by induction, version N will also accept input that worked under any prior version after, and including, the latest one that was not backward compatible. However, in practice, features are often deprecated and support is dropped in a later release, which is yet thought of as backward compatible.
Note, this is taken from http://en.wikipedia.org/wiki/Backward_compatibility, but modified slightly with “Joomla” and “extensions” as references instead.
2) Deprecation:
Deprecation is status change of a supported practice to a non-supported practice, which keeps in place the previously supported practice for at least one version to provide backward compatibility. That being said, with the deprecation of at least 2 years, you're actually getting at least N-4 versions.
3) Developer API:
The API that Joomla is agreeing to support for developers to use. This is our contract between Joomla and developers for API that we’re agreeing will be available to them and stable.
4) Designer Media:
The media that Joomla is agreeing to support for designers to use. This is our contract between Joomla and designers that we’re agreeing will be able to them and useable.
The main advantage is that it’s simple. There’s only one Joomla version to market, to explain, and to maintain. This produces a ton of benefits for maintainers and users alike.
The Joomla core team would only have one Joomla version to maintain (rather than 2 or 3, as is possible now). That version would be light, so there would be less code to maintain.
Extension developers (include template designers) would only have one version to support, thus they wouldn’t need to maintain several different code bases (as was the case from J1.5 to J2 for everyone and J2 to J3 for template designers).
2) Won’t we get stuck with a lot of outdated, junky code?
No, that’s where deprecation comes in. It allows us to responsibly remove outdated/junky code, while stilling giving people enough time (at least 2 years) to adjust.
3) What is the relationship between backward compatibility and deprecation?
Backward compatibility is in reference to supported practices of the previous version (i.e. N-1). On the other hand, deprecation is status change of a supported practice to a non-supported practice, which keeps in place the previously supported practice for at least one version to provide backward compatibility. That being said, with the deprecation of at least 2 years, you are actually getting at least N-4 versions.
4) Isn’t removing deprecated code a break in backward compatibility?
That depends on what definitions you’re using. If you’re using the industry standard of N-1 for backward compatibility of supported practices, then by definition removing deprecated code is not a break in compatibility.
5) Why not just use semantic versioning instead of the proposed changes?
Semantic versioning doesn’t tell you whether or not you should have backward compatibility changes.
It merely tells you what you should do *if* you have breaks in backward compatibility. My suggestion transcends semantic versioning and states that we should never have breaks in backward compatibility.
Furthermore, semantic versioning is for APIs whereas Joomla contains APIs and more. There’s UI to take into account, etc, that needs to be properly communicated. For example, an overhaul of the admin area could trigger a major release (e.g. J4).
I have written a gist https://gist.github.com/KISS-Web-Design/440a89cc54913a8ba4d5#file-j-version-strategy-md that explains my idea for a 5 year lifecycle, comments are welcome on the gist (or here is you must, but lets not completely hijack the thread).
The versioning and lifecycle do form part of the development strategy, but I have tried to isolate them from the other issues (distributions, joomlacode/github, chicken/egg, core/plugin, etc) - although there is a little crossover.
Hopefully the idea makes sense whatever the resolution to any of the other issues happens to be.
This is a first pass at the idea, it is not comprehensive enough for a proposal or RFC, and I am sure there are some details that need to be added and/or clarified.
Chris.
In all of these proposals, this is the only one that is calling for defining the API, and IMO, clarifying the API is the only possible way out.
But, I would not go further than defining the API at this time. I would get an agreement on that -- and the very act of doing so will mean BC breaks. There are far, far, far too many ways that developers can use the environment and those should be significantly slashed and Interfaces should be defined for the CMS to act as clear contracts as to what developers should (and should not be using.)
As an example of how this would help -- take email as a service and offer a single method "send()" with no parameters. Inject all input using the framework's DIC and the API is one method. Now, what the framework folks do inside is irrelevant to the CMS. If they offer options beyond phpMailer -- including Swiftmail -- and Zendmail -- it won't change the API.
I'm very concerned at all of these proposals I am seeing which continue to avoid getting down to a cleaned up, scaled back, well documented, fully tested API. When the API is agreed too, those other matters, like how long support lasts and whether or not Semantic Versioning will be used, etc., etc., will be easier to tackle.
But first, what is the API? Does everyone agree on that? That alone will be a big job but it's the way forward, avoiding it means more of the same in terms of problems, quality issues, BC breaks.
It's definitely worth looking at why WordPress is able to upgrade without problems. For a very long time, WP has had a clearly defined API. And, that isn't all public functions -- it's a clear set of developer functions, nothing less than what they need and nothing more.
On the issue of BC support, yes, WP is the one to emulate. But, before Joomla is in a position to do what WP is successfully doing, there will need to be cleanup changes, there is just no way around that.
I think we are 99% there if we separate out your "upgrading must be
easy" concerns into another policy. Let's get this easy one out of the
way. Architectural direction is harder to quantify and codify and we
are all going to have to talk to a lot of people about what they want.
For now that, just allowing 3.x to continue and 4.0 to arrive at a
date to be advised is a reasonable compromise don't you think?
Regards,
Andrew Eddie
Concerning semantic versioning, it doesn�t tell you whether or not you
should have backward compatibility changes. It merely tells you what you
should do *if* you have breaks in backward compatibility. My suggestion is
to not have breaks in backward compatibility ever (this assume the
definition I gave).
It also doesn't tell you how big of backward compatibility changes you
should have or whether you should have an upgrade path.
Finally, it doesn't deal with anything other than public API. For example,
it doesn't deal with UI changes.
That being said, if we maintain backward compatibility for our users, I'm
fine with going with semantic versioning though, because it doesn't say
that "Major version X (X.y.z | X > 0) MUST NOT be incremented if only
backwards compatible changes are introduced to the public API." i.e. it
doesn't strictly disallow a major incrementation if you have a major new
features that are backwards compatible, but which you want to communicate
with a major version (e.g. a backward compatible admin UI overhaul). It
only states what you should do if you have a break in backward
compatibility. That's the way I read it anyway.
I don't take your comments out of context and compare them to Drupal's strategy and tell you to jump ship to there.
As to developers, I actually ran it by several trusted developers before posting and they gave it hearty approval
+1 on both points, Amy. Well said.
Cheers,
Nick
>
>
> On Friday, December 13, 2013 12:20:12 AM UTC-6, Nick Savov wrote:
>>
>>
>> Concerning semantic versioning, it doesn�t tell you whether or not you
Given a version number MAJOR.MINOR.PATCH, increment the:
Are we going to guarantee an easy upgrade path or not?
I'm also curious which developers you ran it by. Not to name and shame or to say they're wrong in agreeing. But I'm more curious if these are the same developers who are trying to help Joomla be a stable product that can be implemented in a variety of environments or if they are the same ones who have to release updates to their code at every release because their code implementations are not in line with what many would expect to be correct usage of the API.
and I posted before which Nick is choosing to ignore as l:
Who, what, when...... Do not quote without being precise in these major important discussions? Quoting sources without mentioning your 'trusted (by whom?) sources is rather funny so to say
Leo
Since the Joomla Project is a Community driven Project I assume that
this Community has some words to say on performance of the Leadership of
this Project? What we do if somebody in PLT is considered not to
represent the general opinion of this Community?
Leo
Hi Don,
Yes, easy upgrade path for those that are currently following Joomla best
practices in the Joomla 3 series. We can safely ignore people that have
hacked core files.
Yes, it's a hard promise to keep, but we've made the promise as a project
already. We need to keep it now.
Are we going to guarantee an easy upgrade path or not?
Kind regards,
Nick
So having said so with all frustrations reading this I simply would like to ask to Open Source Matters:
Take your responsibility as owners and why not erasing all this PLT/CLT etc etc and set these groups up by invitation ( you know who have been very good to the project from the beginning in 2005: People like Brian, Andrew, Sam, Michael, Don, Thomas etc). At present People are in the Production Leadership Team (example) because (sometimes) they applied for it and not because they have been chosen or selected. These people are suppose to be Leaders and are showing not to be the persons who are pretending to represent us at present?
Leo
Example: At http://forum.joomla.org/viewtopic.php?f=9&t=825287&start=0#p3103232 an issue is reported with an extension which broke during the 3.1 to 3.2 update. After troubleshooting, I determined that the cause of the issue is in the developer calling a static method in object context and we did not implement the static method in the new application classes, causing the error noted by that user. Is this a case where we, as the Joomla developers and leaders, and myself personally as the individual who wrote these classes, screwed up and broke backwards compatibility or is this the fault of the developer who incorrectly implemented the API?
--
--
Bad mouse on the work computer, darn...IMO, this specific issue isn't about public/protected. In 3.1, JFactory::getApplication() returned an instance of JApplication, so doing JFactory::getApplication()->isWinOS(); worked. JApplication::isWinOS() (http://api.joomla.org/cms-3/classes/JApplication.html#method_isWinOS) is a static method but was accessible in object context because the application object was an instance of JApplication.In 3.2, our application classes extend JApplicationWeb, and nowhere in that hierarchy is the isWinOS() method included. Developers who expected it to be available via the application object instead of calling the static method in a static manner experienced a breakage. So, it's still clear as mud to me; who accepts responsibility for that breakage? The developer who is calling that static method (there are a couple others, but the forum post I linked used that method specifically) within object context or the project for not accomodating what I would consider incorrect use of the API in a refactoring of the application classes?
On Friday, December 13, 2013 11:11:56 AM UTC-6, Michael Babker wrote:Bad mouse on the work computer, darn...IMO, this specific issue isn't about public/protected. In 3.1, JFactory::getApplication() returned an instance of JApplication, so doing JFactory::getApplication()->isWinOS(); worked. JApplication::isWinOS() (http://api.joomla.org/cms-3/classes/JApplication.html#method_isWinOS) is a static method but was accessible in object context because the application object was an instance of JApplication.In 3.2, our application classes extend JApplicationWeb, and nowhere in that hierarchy is the isWinOS() method included. Developers who expected it to be available via the application object instead of calling the static method in a static manner experienced a breakage. So, it's still clear as mud to me; who accepts responsibility for that breakage? The developer who is calling that static method (there are a couple others, but the forum post I linked used that method specifically) within object context or the project for not accomodating what I would consider incorrect use of the API in a refactoring of the application classes?
So, how does a developer know? Is it written anywhere? Is there an API that says so?
By Andrew's definition if it came in the bag of peanuts and the visibility is public or protected -- the developer can use it. It fits within that standard.
FWIW, I agree with you. The API is something more specific than visibility and docblocks. Most of the core code shouldn't be used by CMS extension developers. In balance, only a few methods of the thousands of methods in the peanut bag are actually intended for use by extension developers. So, why not identify them? Publish that list specifically. It would be much easier to unit test those. It would be far easier to document those. That's the list Semantic Versioning would be based upon.
Several times people have said "We aren't trying to be WordPress!" And, that's fine, but it's kind of a weird response since it doesn't hurt to at least understand how they are able to avoid BC breaks. It's pretty simple -- they have clarity on their API. That's the big secret. They have a small set of functions developers are intended to use and they work very hard not to break those. Everywhere else in the core code, the core devs can do their thing. If someone's plugin breaks because they ventured into deep core waters, it would be bad on them. They weren't using the API.
Thanks Nick,
I do have some ideas around migration/upgrade strategies - and may write another gist to explain my thoughts - but that is for another day.
As for the one version idea, I don't like it for a couple of reasons
Semver is a great way to manage versions, with well defined rules regarding major.minor.patch, which go a long way to helping developers, site builders and 3rd party devs understand the scope of the changes...
e.g. A break in the backwards compatibility (of the API, or anything that breaks B/C) triggers a new major version.
Time based releases cause mad rushes to get new features included before they are ready, and if they miss by even 1 day there is a 6 month wait to have it added into the next release. Some do 'make it in' only to cause misery because they were not ready and had been rushed or bullied in because 'its needed, we already announced it and we can't delay the release any more'.
Having evolving releases that add features when they are ready gives a better product to the customers (builders, 3rd party devs, admins, etc). The features will be more stable, fully assessed, tested and ready for production.
Having a 2 year overlap in the releases gives plenty of time to plan migrations - and have fully supported major versions running in parallel, so nobody feels they must upgrade because their current version is EOL after only a couple of years.
@Chris, great doc! I commented in the gist.
Kind regards,
Nick
I'm willing to compromise on everything, except an easy upgrade path.
We've made the promise as a project already. Yes, it's a hard promise to
keep, but we need to keep it. So, I'll ask the question again, are we
going to guarantee an easy upgrade path or not?
In my first post, I already mentioned how we can improve upgradability.Let's use the API example.
1) Define a developer API that Joomla agrees to support for developers to
use. This is our contract between Joomla and developers for API that we’re2) The developer API should be clearly stated and documented.
agreeing will be available to them and stable.
3) The developer API should be 100% unit tested
So let's say a PR comes in for a bug fix or new feature. If the PR breaks
the unit testing, don't merge.
If you do the above, that would make upgrading easier for developers and
it's a big step in the right direction.
If we can't agree on basic principles like
"an easy upgrade path", there's no point in talking "policy-ese".
I'm willing to compromise on everything, except an easy upgrade path.
We've made the promise as a project already. Yes, it's a hard promise to
keep, but we need to keep it. So, I'll ask the question again, are we
going to guarantee an easy upgrade path or not?
To add -- paying people to do work changes the equation.
If the community wants promises, then people must be paid.
"People Must paid" :: We have had that in the past already and that is not on the plate imho nor desired at all so let's not go and discuss that again shall we?
Sorry, but non-time-based-releases do not have claim to the "when it's
ready" title. Time-based-release can and should, IMO, only include code
"when it's ready" too. We should never include code that's not ready. If
the code's not ready, it can wait for the next train. It's the reviewers'
responsibility to make sure that happens and they shouldn't be rushed
either. I think the timeframes I gave for alpha and beta in my original
post in this thread give the reviewers plenty of breathing space to
properly review the code.
Also, if we wanted to compromise in this area, we could say that we can
release new features at least once every 6 months (if there's something
even submitted). So let's say for example, a new minor version is
released, but one key feature doesn't get in, but is almost there. We
could then do a release 2 months later to give the developer(s) enough
time, hope, and encouragement.
Two potentially big issues with feature-based releases are scope creep and
volunteer availability, especially as more time elapses. Drupal's going
through that now with Drupal 8 and the projections keep being pushed back.
Looks like it might end up taking them 4+ years.
The issue is that "upgradability" shouldn't be an after-thought once the
"features" are done or about done. It should be the cornerstone. Google
Chrome got it right with their auto-updater and making it the cornerstone
from the start.
As for API, I'd also say the closest thing we have to it is our libraries,
but it doesn't matter much unless it's declared and clearly communicated
by the project. That's where
https://groups.google.com/forum/#!topic/joomla-dev-cms/YhPvWTJS4go
hopefully comes into play.
If there will be a complete turn to such an approach, the PLT / Nick can do a promise for a "robust upgrade path", similar to the one we had with 1.0 => 1.5: