J'avoue qu'en terme d’obfuscation du code ça se pose là !
Pour @Going
Un bel exemple d'exécution parallèle et de résultat synchrone en Kotlin.
@Animal je te recommande cet article pour mieux comprendre le travail que tu feras avec @Milk et @Sigmund.
Pour @Philou et ses architectes qui ne codent pas.
La documentation expliquant un à un les contrôles applicables par TSlint sur du code Typescript.
Bon en général je ne fais pas ça mais c'est trop incroyable. Je dois me taper le refacto d'une classe écrite par une trèèèès grosse boite de service pour mon client et qui calcule des dates spéciales en Java, dans le cas que je corrige, il s'agit de Pâques...
Je ne vous mets qu'un extrait du code (le reste est tout aussi incroyable mais je ne veux pas de problème de copyreich) :
private static GregorianCalendar calculJourPaques(int pYear) {
GregorianCalendar vPaques = new GregorianCalendar();
int vA = pYear % 19;
int vB = pYear / 100;
int vC = pYear % 100;
int vD = vB / 4;
int vE = vB % 4;
int vF = (vB + 8) / 25;
int vG = (vB - vF + 1) / 3;
int vH = (19 * vA + vB - vD - vG + 15) % 30;
int vI = vC / 4;
int vK = vC % 4;
int vL = (32 + 2 * vE + 2 * vI - vH - vK) % 7;
int vM = (vA + 11 * vH + 22 * vL) / 451;
int vN = (vH + vL - 7 * vM + 114) / 31;
int vP = (vH + vL - 7 * vM + 114) % 31;
vPaques.set(pYear, vN - 1, vP + 1);
vPaques.add(5, 1);
return vPaques;
}
Alors oui, le code est en français, oui les variables sont préfixées par un "p" pour dire qu'elles sont paramètres de la méthode et par un "v" pour indiquer qu'elles sont de simples variables dans cette méthode...
Sinon c'est un "a" (pour attribut) ou "f" (pour field) mais un attribut c'est aussi parfois un "c"... Bah oui vous comprenez, certains développeurs avaient de gros doigts donc ils ont appuyé à côté du "f" sur la touche "c"... Et d'autres ont simplement reproduit cette erreur pour que le préfix "c" corresponde aux attributs. #Enjoy
J'ai déjà patché du code compliqué, du code de merde, du code inutile, du code ultra-théorique à base de formules complexes mais je n'avais jamais dû patcher du code dont je ne peux décrire l'origine !
P.S : vous remarquerez que l'algorithme est juste une prouesse de complexité hein (T_T). J'ai déjà pu identifier que l'on parlait d'année bissextile et heureusement ! Vive les TU (que je vais devoir créer parce que trop marrant sinon).
Edit : l’algorithme est celui de Butcher-Meeus.
Le concept du Test, Commit, Revert (TCR) est sympa.
Comment notre façon de programmer est-elle devenue asynchrone et bloquante ? C'est vrai que je passe mon temps à revenir sur des pull-requests qui ont eu lieu plusieurs jours auparavant ; et c'est dur à chaque fois ! J'aime coder et oublier le code que je viens de coder aussitôt que la PR part. Je n'aime pas qu'on me relance sur un sujet que j'ai fermé car c'est une charge cognitive forte et épuisante et pourtant ce modèle est devenu le modèle "standard".
=> Pour @Chlouchloutte
Via Riduidel
Je retranscris ici l'article de Julio Blason tant je l'ai trouvé bien et important !
Je vais faire ma mijaurée mais pas grave.
Quand je lis :
L’architecture applicative apporte une réponse à la question suivante :
Comment les éléments fonctionnels sont ils implémentés ? Le COMMENT ?
Cette architecture représente l’implémentation des services fonctionnels sous forme d’éléments applicatifs.
Elle est composée d’éléments applicatifs (ex : composants Java, .net, objets BDD,…). L’architecture applicative représente le premier niveau d’une projection entre une architecture fonctionnelle (et ses services métiers) et des technologies qui vont devoir supporter ces services. Elle est une instanciation de l’architecture fonctionnelle.
et ceci :
L’architecture technique apporte une réponse la question suivante :
Avec quels éléments techniques, les éléments applicatifs sont ils déployés ? Le AVEC QUOI ?
Cette architecture décrit l’infrastructure sur laquelle les éléments applicatifs ont été déployés.
Elle est décomposée en deux couches :
Une couche de logiciels médiateurs (ou middleware) qui est composée des progiciels : moteurs des bases de données, serveur d’application, serveur web, annuaire LDAP, ordonnanceur, gestionnaires de flux (EAI, ESB, ETL, …), etc.
Une couche matérielle qui est composée des logiciels de base (systèmes d’exploitation), des serveurs et des réseaux.
Mon petit cerveau de lémurienne fait tilt ! Sur quel critères rationnels, objectifs et argumentés LDAP serait plus du côté de l"architecture technique que du côté de l'architecture applicative ? Même question mais dans l'autre sens pour Java ? Quid des "objets BDD", de l'ordonnanceur, du gestionnaire de flux, ie. un BPM ? Un F5 ? Un load-balancer ?
Bref, la réalité est simple : l'architecture applicative et l'architecture technique constituent le même objet, elle sont la même chose ! Et le choix d'architecture doit être uniquement pris par les équipes produits constituées de développeurs.
Car oui, l'architecture, c'est du code point. Un design orienté micro-service, c'est du code. Le choix de frameworks, c'est du code qui impact du code. Les flux de données, c'est du code sous contrainte.
Les architectes sont dans un délire pluri-décennal consistant à croire que c'est leur compréhension qui part en production, or c'est archi-faux ! Leur position est d'être celle du dirigeant, du leader alors qu'elle devrait se contenir à celle d'un documentaliste ou d'un bibliothécaire #CommentCaCoupBas.
Moins d'architecte & Plus de développeurs => meilleurs logiciels de meilleurs qualité.
Quant à tout ceux qui pensent le contraire, les logiciels les moins fiables sur terre ont des équipes bardées d'architectes (coucou Microchiotte) tandis que ceux qui sont les plus fiables n'ont quasiment que des développeurs (coucou Linux, les logiciels libres & stuff).
Aussi, c'est certes un sophisme que de conclure + d'architectes => + de problèmes car corrélation n'implique pas une causalité, mais ce sera quand même ma conclusion car je n'ai aucun contre-exemple depuis 15 années passées sur le terrain !
C4-PlantUML combines the benefits of PlantUML and the C4 model for providing a simple way of describing and communicate software architectures [...]
Le doc c'est le code ! Ou pas... Le code ne peut pas exprimer le pour quoi ni le pour qui mais uniquement le quoi et le comment, de ce fait, il est nécessaire de documenter les intentions et la cible de l'application en plus de rédiger du code.
C4 était un bon modèle bien plus simple et bien moins coûteux qu'UML. Je ne connaissais pas PlantUML avant donc il faut voir.
Rappel : une bonne documentation explique le pour qui et le pour quoi en moins de 5 minutes.
Je reporte ici les montants :
- Injure sexiste (en privé) => 1 500 € d'amende
- Injure publique => 12 000 € d'amende
- Injure sexiste publique => 45 000 € d'amende + 1 an de prison
- Propos à connotation sexuelle répétés => 30 000 € d'amende + 2 ans de prison
- Incitation au viol => 45 000 € d'amende + 5 ans de prison
Merci à Caroline De Haas pour l'info !
Je n'ai pas tout lu dans le sens où je suis partie sur Kotlin il y a plus de deux ans maintenant #Coroutines. Mais c'est toujours bon de maîtriser les principes sous-jacents de la JVM.
Pour @Chlouchloutte et @Lenny.
Chlouchloutte et moi discutions aujourd'hui du kata de code consistant à écrire un convertisseur de nombre décimaux en nombre romains. Son comportement est le suivant :
- À partir d'un Integer, je dois pouvoir récupérer sa valeur en écriture romaine sous la forme d'une String.
Comment le coder façon Yegor Bugayenko ?
Il y a deux façons de voir ce problème :
- Mettre en avant le concept de nombre
- Mettre en avant le concept de conversion.
1) Représenter d'abord les nombres
Je vais écrire l'interface suivante :
interface Converter {
fun value():String
}
Et un implémentation :
class IntegerAsRomanNumber(
private val number:Integer
) : Converter {
fun value():String {
// Conversion code
}
}
// Usage
val number = 123
val romanNumber = IntegerAsRomanNumber(number).value()
2) Représenter d'abord l'action de conversion
Nous conservons l'interface mais en précisant la structure dans le nom de la méthode :
interface Converter {
fun romanValue():String
}
Et son implémentation :
class Number(
private val number:Integer
) : Converter {
fun romanValue():String {
// Conversion code
}
}
Vous avez du remarquez que l'implémentation sera la même dans les deux cas et que la seul chose qui diffère sera le "wording". En réalité la première façon est verbeuse mais pratique puisqu'elle nous masque la problématique de conversion au profit de la mise en exergue du nouveau type de la donnée. Ce qui nous permettrait de créer plusieurs convertisseurs nous permettant de passer d'un type à un autre comme suit :
interface Converter<OUTPUT> {
fun value():OUTPUT
}
Exemple d'utilisation :
val number = 123
val egyptianNumber:String = RomanAsEgyptian(IntegerAsRoman(number)).value()
Et le concept de décoration fait sens à ce moment.
Comment ça, « ça n'a rien à voir » ?
Bon, vous l'aurez compris, on va causer à la fois informatique et politique… et j'vais encore être grossier, mais ils m'énervent à la fin, avec leurs conneries. Rooogn'tudju.
Très bon parallèle de Grisebouille exposant les techniques d'optimisation de code appliquées à la fraude fiscale.
Le titre est put-a-clic mais Timo a toujours cette perspective intéressante lorsqu'il parle de phénomènes de société. Ici, l'enseignement du code à l'école.
Très très bien. Coudifié hop !
Merci au Styx
Comme certains le savent peut-être, je vais changer la structure juridique de ma société et je me renseigne sur les différents types de sociétés possibles, principalement dans un cadre avec plusieurs associés. Ce soir je découvre les Société en Nom Collectif (SNC).
Pourquoi est-ce que je vous en parle ?
Tout simplement parce que le phrasé du Code Civil expliquant la responsabilité du Gérant d'une SNC est juste à vomir de complexité. Je vous en cite une ligne (bonne soupe) : "1382 du Code Civil : Tout fait quelconque de l'homme qui cause un dommage à autrui oblige celui par la faute duquel il est arrivé à le réparer."
Indigeste n'est-ce pas ? Ponctuation, tournure, sémantique, rien n'est simple. À noter qu'une phrase similaire, toujours en français j'aime-me-caresser-le-pistil mais qui serait déjà plus abordable, donnerait : "Tout auteur d'un dommage causé à autrui doit en réparer le préjudice."
Sachez que le mouvement des #GiletsJaunes revendique justement le RIC (Referendum d'Initiative Citoyenne) et l'une des raisons pour lesquelles cet outil politique est indispensable, c'est qu'il contribuera à l'éclaircissement du droit puisque ce dernier y serait écrit par des "gens simples pour des gens simples".
Dit autrement, le Code Civil actuel, c'est du putain de code Scala obfusqué ! Seule une infime partie de la population kiffant cette merde continue désespérément de défendre une immondice en terme de complexité et de charge cognitive (et je dis cela en adorant Kotlin, Rust et TypeScript hein).
Certaines personnes ont le besoin de se créer une charge mentale, ou plutôt de générer une charge mentale aux autres, pour se sentir plus fortes ou meilleures que leur prochain. Je pense que certains juristes et certains scalaïstes partagent ce triste point commun.
Pour Animal. C'est tellement vrai n'est-ce pas ?
Pour Doudou notamment.
Je trouve que RMS est quelqu'un qui pense et accepte de prendre le temps de faire les choses avec une vision locale et globale. Je préfère grandement sa démarche qui me semble bien plus inclusive et bien plus pertinente que tout code de conduite auquel j'ai pu accéder à cette heure.
Il n'y a pas d'éthique, pas de jugement de valeur, pas d'imposition aux autres de son propres modus operandi moral. Juste des lignes directrices basées sur un principe : la bienveillance.
Merci Richard.
Je copie-colle une partie de l'article ci-dessous :
Entre autres points, on peut lire parmi les directives de Richard Stallman aux mainteneurs et contributeurs du projet GNU que :
vous devez supposer que les autres participants postent leurs messages de bonne foi, même si vous n'êtes pas d'accord avec ce qu'ils disent ; vous devez penser à la manière de traiter les autres participants avec respect, en particulier lorsque vous n'êtes pas d'accord avec eux ; vous ne devez pas prendre un ton dur envers les autres participants, et surtout ne pas les attaquer personnellement. Vous devez faire de votre mieux pour montrer que vous critiquez une déclaration, pas une personne ; vous devez répondre à ce que les gens disent réellement, pas aux exagérations de leurs points de vue ; vous devez reconnaître que la critique de vos déclarations n’est pas une attaque personnelle contre vous. Mais si vous sentez que quelqu'un vous a attaqué ou a porté atteinte à votre dignité personnelle, Stallman recommande de ne pas riposter avec une autre attaque personnelle. « Cela tend à créer un cercle vicieux d’agressivité verbale croissante. Une réponse privée, énonçant poliment vos sentiments et demandant la paix, peut calmer les choses. Écrivez-la, mettez-la de côté pendant des heures ou un jour, relisez-la pour supprimer toute expression de colère, et ne l'envoyez seulement qu'après cela ». C'est ce que recommande Stallman ; vous devez être particulièrement gentil avec les autres contributeurs lorsque vous leur dites qu'ils ont commis une erreur. Le président de la FSF rappelle en effet que programmer signifie faire beaucoup d'erreurs, et c'est ce que nous faisons tous. C'est pourquoi, dit-il, les tests de régression sont utiles. « Les programmeurs consciencieux font des erreurs, puis les corrigent. Il est utile de montrer aux contributeurs que le fait d’être imparfait est normal. Nous ne leur en tenons donc pas compte et nous apprécions leurs contributions imparfaites, même si nous espérons qu’ils y remédient en y apportant des solutions » ; vous devez être aimables lorsque vous signalez aux autres contributeurs qu'ils doivent cesser d'utiliser certains logiciels non libres. « Pour leur propre bien, ils devraient eux-mêmes décider d'abandonner les logiciels non libres, mais nous nous félicitons de leurs contributions à nos paquets même s'ils ne le font pas. Donc, ces rappels doivent être gentils et peu fréquents - ne les harcelez pas », dit Stallman ; en revanche, suggérer que d’autres utilisent des logiciels non libres s’oppose aux principes de base de GNU, ce n’est donc pas autorisé dans les discussions du projet GNU ; vous ne devez pas soulever de problèmes politiques sans rapport avec les discussions du projet GNU, car ils sont hors sujet. Les seules positions politiques approuvées par le projet GNU sont (1) que les utilisateurs doivent pouvoir contrôler leur propre pile informatique (par exemple, en utilisant des logiciels libres) et (2) soutenir les droits de l'homme fondamentaux en informatique. En tant que contributeur, poursuit Stallman, il ne vous est pas demandé d’être d’accord sur ces deux points, mais vous devez accepter le fait que les décisions de la communauté seront fondées sur ces points.
Contrairement à Sebsauvage ici je ne dirai pas que le dev de SQLite soit un "bigot à la con". Le mec a une religion (et donc une opinion religieuse) à laquelle il tient. Parmi l'ensemble des points proposés, je ne me retrouve pas dans la croyance en un Dieu tout puissant, ni en le Christ (que je pense être une fable), ni en la prière, bref ni dans tout ce que le dogme d'une église prodigue ; et quelque soit cette église.
Par contre, pour ce qui est du reste (tu ne tueras point, tu ne seras pas envieux, tu ne blâmeras pas les autres à part toi-même #toussa) j'ai du mal à comprendre en quoi ce sont de "mauvaises valeurs" pour gérer une communauté ou définir un code de conduite.
Sebsauvage, je ne pense pas qu'il faille être anti-religieux à ce point. Je n'apprécie pas la chose d'une manière générale, cependant je ne suis pas comme AstronoGeek - dont j'apprécie l’œuvre - mais qui transpire le narcissisme et le sentiment de supériorité parce que "lui il sait".
En tant qu'agnostique (parce qu'on ne peut démontrer ni l'existence ni l'inexistence de Dieu), je pars du principe qu'une morale qui vise à minimiser la souffrance de l'autre n'est pas fondamentalement une mauvaise morale ; et que comme toute morale, elle peut avoir des faiblesses par endroits #MoraleUtilitariste.
Enfin, au regard du fait que facilement la moitié de l'humanité croit en ce code de conduite, et que les points inscrits par le dev de SQLite ne font apparaître aucun critère de race, de sexe ou de religion (autre que les religions polythéistes - mais bon, il ne doit plus avoir beaucoup de mecs qui croient en Zeus ou en Odin de nos jours hein...), bah ce code de conduite a le mérite de parler au plus grand nombre.
Enfin Sebsauvage, techniquement tu viens de violer ce code de conduit à l'instant même où tu as publier ton commentaire sur ton Shaarli. Aussi, le mec de SQLite a-t-il eu tort ?