Traduction en français plus bas.
While YunoHost is not only about its apps, apps in YunoHost are still a very important part as it allows users to extend the possibilities of their server and to have the services they really need.
Because of that, apps packages in YunoHost should be resilient over time. When an user install an app, the app should not become obsolete after a few months/years just because the package does not get upgraded.
Yet, at the time I’m writing these lines, 112 apps out of 306 are not maintained anymore ! This is huge !!!
That situation shows also clearly that even when you write a new package, and you know that you will maintain it, for more than one app out or three, sooner or later, you’re going to not maintain it anymore. Meanwhile, many users may have installed your app and will end up with an app not maintain and possibly broken.
But to not maintain an app anymore shouldn’t be a problem, as long as another packager can continue your work and give to the users new upgrades.
No one here is, or should be, bond to life to his work.
From experience, we know that apps that are especially famous among our users, aside of often being the most difficult to maintain, are also the apps that change often of maintainers.
But actually, for any apps, we do expect to have different maintainers, while I’m running a test on dokuwiki, a quick look to its contributors list shows at least 4 “maintainers” over its history.
That prove mainly one very important thing, when you write a package for an app. One way or the other, you’re not going to be the only one working on this app.
A lot of other packagers will be involved in your package.
Considering this, when working on a package, for the sake of our final users, we should never forget that we’re not alone and that we have to consider it as a shared work.
To work as a team, and not as a lone dev implies to share some common rules, some restrictions to go together in the same way.
Finally to follow rules is not a constraint, it’s a form of respect for the others packagers that will get involved and for the users that will still have their favorite apps long after it was added to YunoHost.
While we’re working on the migration to Buster, confined in our houses, many packagers, new comers or not, are working on packages they didn’t write in the first place.
And because most of our packages do respect the template and the common rules, those packagers can work on this packages, fix issues or upgrade what need to be without having to spend time figuring out how the packagers before them did write the code. Without having to untangle the code to understand how it works.
They can just follow the template, and focus and what really matters, what are the specific needs of the app and what needs to be done.
For all those previous reasons, an app package, in my opinion, should be as simple and clear as possible.
To be as simple as possible is also, to be straight, easy to read, and as obvious as possible for everyone who read any of the scripts.
In the same idea, when a packager read a script of your app, to fix the app, to help an user in trouble, or just to find how you did solve a situation he has as well in its own package. This packager should be able to read your script easily and unambiguously, without stumbling on a laconic call to some personal function that hides an important part of the process or a helper like ynh_render_template or ynh_restore that does not say what it’s actually doing. Any app script should be clear and without any ambiguity on what’s its doing and when, that way, any packager reading it will know what’s done, how and when.
That’s the reason why we’ve defined the template in the example app, to have a template as clear and easy as possible. And especially to have a standard template for everyone.
Now that’s for sure, the template is not perfect, the template won’t satisfy everyone, the template may not correspond to your habits. But the first purpose of this template is not to be perfect or to please you, the first purpose of the template is to be universal among app packages.
To respect the template is, on one hand, to respect the syntax, the flow, and the spirit of the example app. And in the other hand to keep it as straightforward as possible for everyone who will read it.
Globally, as soon as you move the logic of the code, conditions, loops or anything else away of the main scripts, you obfuscate the understanding of the code for other packagers.
While all of that is said, I know, for I’m myself a developer, that to use a code without factorization, is far from what we’re use to do. Far from what is usually considered as a good practice. And can be source of errors if we forgot to modify every occurrences in the code.
But, app packages are not like any usual piece of code, app packages are common scripts, shared by all apps, that should be considered as part of a bigger code, the whole app packaging template.
That’s what will make apps resilient for our users.
If our apps are to become ephemeral, I think we would lose one of the main objective of YunoHost…
(La traduction française n’est pas parfaite, mais respecte plutôt bien l’idée originale).
Bien que YunoHost ne se limite pas à ses applications, les applications dans YunoHost sont une partie très importante car elles permettent aux utilisateurs d’étendre les possibilités de leur serveur et d’avoir les services dont ils ont vraiment besoin.
C’est pourquoi les applications de YunoHost doivent être résilientes dans le temps. Lorsqu’un utilisateur installe une application, celle-ci ne doit pas devenir obsolète après quelques mois/années juste parce que le package n’est pas mis à jour.
Pourtant, au moment où j’écris ces lignes, 112 applications sur 306 ne sont plus maintenues ! C’est énorme !!!
Cette situation montre aussi clairement que même lorsque vous écrivez un nouveau package, et que vous savez que vous allez le maintenir, pour plus d’une application sur trois, tôt ou tard, vous n’allez plus le maintenir. En attendant, de nombreux utilisateurs peuvent avoir installé votre application et se retrouver avec une application non maintenue et peut-être même cassée.
Mais ne plus maintenir une application ne devrait pas être un problème, tant qu’un autre packager peut continuer votre travail et donner aux utilisateurs de nouvelles mises à jour.
Personne ici n’est, ou ne devrait être, lié à vie à son travail.
Par expérience, nous savons que les applications qui sont particulièrement célèbres parmi nos utilisateurs, en plus d’être souvent les plus difficiles à maintenir, sont aussi celles qui changent souvent de mainteneurs.
Mais en fait, pour toute application, nous nous attendons à avoir différents mainteneurs. Alors que je fais un test sur dokuwiki, un coup d’oeil rapide à la liste de ses contributeurs montre au moins 4 “mainteneurs” au cours de son histoire.
Cela prouve principalement une chose très importante, quand vous écrivez un package pour une application. D’une manière ou d’une autre, vous ne serez pas le seul à travailler sur cette application.
Beaucoup d’autres personnes seront impliquées dans votre package.
C’est pourquoi, lorsque nous travaillons sur un package, nous ne devrions jamais oublier, pour le bien de nos utilisateurs finaux, que nous ne sommes pas seuls et que nous devons le considérer comme un travail partagé.
Travailler en équipe, et non comme un développeur isolé, implique de partager certaines règles communes, certaines restrictions pour aller dans la même direction.
Enfin, suivre des règles n’est pas une contrainte, c’est une forme de respect pour les autres packagers qui vont s’impliquer et pour les utilisateurs qui auront toujours leurs applications préférées bien après qu’elles aient été ajoutées à YunoHost.
Alors que nous travaillons sur la migration vers Buster, confinés dans nos logements, de nombreux packagers, nouveaux ou non, travaillent sur des packages qu’ils n’ont pas écrits au départ.
Et parce que la plupart de nos packages respectent le modèle et les règles communes, ces packagers peuvent travailler sur ces packages, corriger les problèmes ou mettre à jour ce qui doit l’être sans avoir à passer du temps à comprendre comment les packagers précédents ont écrit le code. Sans avoir à démêler le code pour comprendre comment il fonctionne.
Ils peuvent simplement suivre le modèle, et se concentrer sur ce qui est vraiment important, sur les besoins spécifiques de l’application et sur ce qui doit être fait.
Pour toutes ces raisons, je pense qu’une application doit être aussi simple et claire que possible.
Être aussi simple que possible, c’est aussi être direct, facile à lire et aussi évident que possible pour tous ceux qui lisent les scripts.
Dans le même ordre d’idée, lorsqu’un packager lit un script de votre application, pour réparer l’application, pour aider un utilisateur en difficulté, ou simplement pour trouver comment vous avez résolu une situation qu’il a également dans son propre package. Ce packager doit être capable de lire votre script facilement et sans ambiguïté, sans tomber sur un appel laconique à une fonction personnelle qui cache une partie importante du processus ou un helper comme ynh_render_template ou ynh_restore qui ne dit pas ce qu’il fait réellement. Tout script d’application doit être clair et sans ambiguïté sur ce qu’il fait et quand, de cette façon, tout packager qui le lit saura ce qui est fait, comment et quand.
C’est la raison pour laquelle nous avons défini le modèle dans l’application d’exemple, pour avoir un modèle aussi clair et facile que possible. Et surtout pour avoir un modèle standard pour tout le monde.
C’est sûr que le modèle n’est pas parfait, qu’il ne satisfera pas tout le monde, qu’il ne correspondra pas à vos habitudes. Mais le but premier de ce modèle n’est pas d’être parfait ou de vous satisfaire, le but premier du modèle est d’être universel parmi les packages d’applications.
Respecter le modèle, c’est, d’une part, respecter la syntaxe, le flux et l’esprit de l’application d’exemple. D’autre part, il doit être aussi simple que possible pour tous ceux qui le liront.
Globalement, dès que vous écarter la logique du code, les conditions, les boucles ou tout autre élément des scripts principaux, vous obscurcissez la compréhension du code pour les autres utilisateurs.
Avec tout cela dit, je sais, car je suis moi-même un développeur, que l’utilisation d’un code sans factorisation est loin d’être ce à quoi nous sommes habitués. Loin de ce que l’on considère généralement comme une bonne pratique. Et peut être source d’erreurs si nous avons oublié de modifier toutes les occurrences du code.
Mais, les packages d’applications ne sont pas comme n’importe quel morceau de code habituel, les packages d’applications sont des scripts communs, partagés par toutes les applications, qui devraient être considérés comme faisant partie d’un plus grand code, le modèle de package d’applications.
C’est ce qui rendra les applications résilientes pour nos utilisateurs.
Si nos applications devaient devenir éphémères, je pense que nous perdrions l’un des principaux objectifs de YunoHost…