Défi de codage DemensDeum #2

Je commence le Demensdeum Coding Challenge #2 :
1. Vous devez vibecoder l’application Web pour afficher une liste de fêtes/événements dans la zone utilisateur.
2. La source de données peut être du Web Scraping depuis l’avant ou une base de données locale/distante.
3. Afficher les événements/fêtes sur la carte uniquement pour aujourd’hui.
4. Vous pouvez modifier le rayon de recherche.
5. Soumettez-le sous forme de séquence d’invites textuelles pouvant être reproduites dans des générateurs de code gratuits, tels que Google AI Studio.
6. Devrait fonctionner sur le Web pour iOS, Android, PC
7. Le meilleur design gagne
8. Affichez des informations détaillées sur l’événement en appuyant sur l’événement sur la carte.
9. Zoomez sur les cartes avec vos doigts ou votre souris.
10. Le gagnant est choisi par le jury (écrivez-moi pour participer au jury)
11. Prix 200 USDT
12. Date d’échéance : 1er juillet.

Vainqueur du DemensDeum Coding Challenge #1
https://demensdeum.com/blog/ru/2025/06/03/demensdeum-code-challenge-1-winner/

Mise à jour maçonnerie-AR

La possibilité d’acheter des pièces contre de la crypto-monnaie a été ajoutée au jeu Masonry-AR ! Pour 1 $, vous pouvez obtenir 5 000 MOS. Des liens de parrainage ont également été ajoutés au jeu ; pour l’achat de chaque ami, le parrain reçoit 50 000 MOS. Détails dans le wiki maçonnique. Un mode de marche automatique a également été ajouté : lorsqu’il n’y a pas d’accès au module GPS, le Maçon commence à marcher automatiquement depuis l’une des capitales du monde, uniquement en avant.

Lien du jeu :
https://demensdeum.com/demos/masonry-ar/client/

Adepte de l’Âne

“Donkey Adept” est une pièce époustouflante et électrisante de surréalisme pixelisé. Au centre se trouve un personnage vêtu d’une veste en cuir noir, dont la tête est une télévision enflammée et statique avec des oreilles d’âne enflammées. Le sujet tient une puissante lanterne, agissant comme une sentinelle solitaire qui cherche la vérité au milieu du bruit. C’est une furieuse méditation rétro sur les médias, la folie et la recherche incessante de la lumière.

https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/5

Cube Art Project 2 en ligne

Rencontrez le Cube Art Project 2 en ligne – Éditeur léger, rapide et entièrement réécrit du calendrier de la station, qui fonctionne directement dans le navigateur. Maintenant, avec la possibilité d’une créativité conjointe!

Ce n’est pas seulement un outil, mais une expérience avec la couleur, la géométrie et une création 3D méditative à laquelle vous pouvez connecter des amis. Le projet a été créé sur Pure JavaScript et Three.js sans frameworks et webassembly, démontrant les capacités de WebGL et Shaaders.

Nouveau: multijoueur! Coopérer avec les autres utilisateurs en temps réel. Tous les changements, l’ajout et la coloration des cubes sont synchronisés instantanément, vous permettant de créer des chefs-d’œuvre de station ensemble.

Contrôle:
– wasd – déplacer la caméra
– Mouse – Rotation
– GUI – Paramètres de couleur

En ligne:
https://demensdeum.com/software/cube-art-project-2-online/

Sources sur github:
https://github.com/demensdeum/cube-art-project-2-online

Le projet est écrit sur Pure JavaScript en utilisant trois.js.
Sans frameworks, sans collectionneurs, sans webassembly – seulement Webgl, shaders et un peu d’amour pour la géométrie des pixels.

Donki Hills Steam

Donki Hills est un jeu d’horreur de comédie, une expérience narrative passionnante chez la première personne, plongeant les joueurs dans un secret profond avec un mélange d’humour inattendu. Développé et publié par Demensdeum sur le moteur Unreal Engine, le jeu vous permet de contrôler James, une personne ordinaire, dont la vie prend une tournure inhabituelle après la mystérieuse disparition de sa connaissance en ligne, Maria. Son seul indice est une seule photo faisant allusion à un village russe isolé appelé Quiet Donki, situé près de Novosibirsk. Conduire avec une connexion inébranlable et un besoin désespéré de réponses (et, peut-être, avec plusieurs rires nerveux), James part dans un voyage épique pour révéler la vérité sur la disparition de Marie.

Le jeu est disponible sur Steam:
https://store.steampowered.com/app/3476390/Donki_Hills/

Entropie dans la programmation

[Compléments]

L’entropie dans la programmation est une force puissante, mais souvent discrète, qui détermine la variabilité et l’imprévisibilité du comportement logiciel. Des insectes simples aux grandes-flux complexes, l’entropie est la raison pour laquelle nos programmes ne se comportent pas toujours comme nous nous attendons.

Qu’est-ce que l’entropie dans le logiciel?

L’entropie dans le logiciel est une mesure des résultats inattendus des algorithmes. L’utilisateur perçoit les résultats 1STTI comme des erreurs ou des bogues, mais du point de vue de la machine, l’algorithme effectue exactement les instructions que le programmeur s’y est couché. Un comportement inattendu se produit en raison d’un grand nombre de combinaisons possibles de données d’entrée, de conditions du système et d’interactions.

Causes d’entropie:

* Modification de l’état: lorsque l’objet peut modifier ses données internes, le résultat de son travail devient dépendant de l’historique complet de son utilisation.

* La complexité des algorithmes: à mesure que le programme se développe, le nombre de façons possibles d’exécuter le code augmente de façon exponentielle, ce qui rend la prédiction de tous les résultats presque impossible.

* Facteurs externes: système d’exploitation, autres programmes, retards de réseau – tout cela peut affecter l’exécution de votre code, créant des sources de variabilité supplémentaires.

Causes d’entropie:

* Modification de l’état: lorsque l’objet peut modifier ses données internes, le résultat de son travail devient dépendant de l’historique complet de son utilisation.

* La complexité des algorithmes: à mesure que le programme se développe, le nombre de façons possibles d’exécuter le code augmente de façon exponentielle, ce qui rend la prédiction de tous les résultats presque impossible.

* Facteurs externes: système d’exploitation, autres programmes, retards de réseau – tout cela peut affecter l’exécution de votre code, créant des sources de variabilité supplémentaires.

Variables globales comme source d’entropie

Dans son travail “Global Varia Bybles a exercé des nocifs” (1973) W.A. Wulf et M. Shaw ont montré que les variables mondiales sont l’une des principales sources de comportement imprévisible. Ils créent des dépendances implicites et des effets secondaires difficiles à suivre et à contrôler, qui est une manifestation classique de l’entropie.

Lois de Leman et de l’entropie

L’idée d’une complexité croissante des systèmes logiciels a parfaitement formulé Manny Leman dans ses lois d’évolution des logiciels. Deux d’entre eux reflètent directement le concept d’entropie:

Le programme informatique utilisé sera modifié. Cette déclaration suggère que le logiciel n’est pas statique. Il vit, développe et change pour répondre à de nouvelles exigences et à l’environnement. Chaque nouveau “tour” de la vie du programme est une source potentielle d’entropie.

Lorsque le programme informatique est modifié, sa complexité augmente, à condition que personne ne l’empêche. Cette loi est une conséquence directe de l’entropie. Sans efforts de gestion de complexité ciblés, chaque nouvelle modification introduit une variabilité et une imprévisibilité supplémentaires dans le système. Il existe de nouvelles dépendances, des conditions et des effets secondaires qui augmentent la probabilité de bugs et de comportements non évidents.

Entropie dans le monde de l’IA et du LLM: code imprévisible

Dans le domaine de l’intelligence artificielle et des modèles de grands langues (LLM), l’entropie est particulièrement aiguë, car ici nous avons affaire à des algorithmes non métnamiques. Contrairement aux programmes traditionnels, où le même accès donne toujours la même voie à l’extérieur, LLM peut donner des réponses différentes à la même demande.

Cela crée un énorme problème: l’exactitude de l’algorithme ne peut être confirmée que sur un certain ensemble limité de données d’entrée à l’aide des auteurs. Mais lorsque vous travaillez avec des données d’entrée inconnues (demandes des utilisateurs), le comportement du modèle devient imprévisible.

Exemples d’entropie dans LLM

Vocabulaire innordatif et déclarations racistes: cas connus lorsque des robots de chat, tels que Tay de Microsoft ou Grok de XII, après une formation sur les données d’Internet, ont commencé à générer des déclarations offensantes ou racistes. C’était le résultat de l’entropie: des données d’entrée inconnues en combinaison avec un énorme volume d’échantillon de formation ont conduit à un comportement imprévisible et incorrect.

Appels illégaux: de tels problèmes surviennent lorsqu’un réseau neuronal commence à émettre un contenu qui viole les normes du droit d’auteur ou éthiques.

AI Bota dans les jeux: L’introduction de personnages d’IA dans les jeux avec la possibilité d’apprendre, par exemple, dans Fortnite, a conduit au fait que l’IA Bot devait être désactivé et ajouté au suivi pour l’exactitude de l’activité, pour empêcher les actions illégales du LLM Bot.

Dette technique: intérêt accumulé sur les défauts

Code mal écrit et solutions de contournement
Le devoir technique est un compromis conscient ou inconscient, dans lequel la priorité est donnée à une livraison rapide au détriment d’un soutien et d’une qualité à long terme. Des corrections rapides et des solutions de pontage sans papiers, souvent mises en œuvre en peu de temps, s’accumulent, formant un “champ de mines”. Cela rend la base de code extrêmement sensible même aux changements mineurs, car il devient difficile de distinguer les solutions de pontage intentionnelles de la logique erronée réelle, ce qui conduit à une régression inattendue et à une augmentation du nombre d’erreurs.

Cela démontre l’effet direct et cumulatif du devoir technique sur la propagation des erreurs et l’intégrité des algorithmes, où chaque réduction de courant adoptée conduit à des erreurs plus complexes et fréquentes à l’avenir.

tests inadéquats et son effet cumulatif

Lorsque les systèmes logiciels ne sont pas testés avec soin, ils sont beaucoup plus susceptibles des erreurs et des comportements inattendus. Cette insuffisance permet aux erreurs de s’accumuler au fil du temps, créant un système difficile à soutenir et qui est très sensible aux autres erreurs. Négliger les tests dès le début augmente non seulement la dette technique, mais contribue également directement à augmenter le nombre d’erreurs. La «théorie des fenêtres cassées» dans l’entropie du logiciel suggère que des erreurs insignifiantes et ignorées ou des problèmes de conception peuvent s’accumuler au fil du temps et entraîner des problèmes plus graves et réduire la qualité du logiciel.

Cela établit une relation causale directe: le manque de tests conduit à une accumulation d’erreurs, ce qui entraîne une augmentation de l’entropie, ce qui conduit à des erreurs plus complexes et fréquentes, affectant directement l’exactitude et la fiabilité des algorithmes.

Manque de documentation et d’informations Silos

Une documentation appropriée est souvent ignorée lors du développement de logiciels, ce qui conduit à une fragmentation ou à une perte de connaissances sur le fonctionnement du système et comment le soutenir. Cela oblige les développeurs à «soutenir» le système pour apporter des changements, augmentant considérablement la probabilité de malentendus et de modifications incorrectes, ce qui conduit directement à des erreurs. Cela complique également sérieusement l’adaptation des nouveaux développeurs, car les informations critiques ne sont pas disponibles ou trompeuses.

L’entropie du programme se produit en raison du «manque de connaissances» et des «écarts entre les hypothèses générales et le comportement réel du système existant». Il s’agit d’une observation organisationnelle plus profonde: l’entropie se manifeste non seulement au niveau du code, mais aussi au niveau des connaissances. Ces connaissances informelles et implicites sont fragiles et sont facilement perdues (par exemple, lorsque vous quittez les membres de l’équipe), ce qui conduit directement à des erreurs lorsque vous essayez de modifier, en particulier les nouveaux membres de l’équipe, compromettant ainsi l’intégrité de la logique algorithmique, car ses principales hypothèses cessent d’être claires.

Méthodes de développement incohérentes et perte de propriété

Le facteur humain est un facteur de conduite significatif, souvent sous-estimé dans l’entropie du logiciel. Diverses compétences, codage et attentes de qualité parmi les développeurs entraînent des incohérences et des écarts dans le code source. L’absence de processus standardisés pour la liaison, les avis de code, les tests et la documentation exacerbe ce problème. En outre, un code peu clair ou instable du code, lorsque plusieurs commandes possèdent une partie du code ou personne ne possède, conduit à la négligence et à l’augmentation de la décomposition, ce qui conduit à la duplication de composants qui remplissent la même fonction de différentes manières, diffusant les erreurs.

Cela montre que l’entropie n’est pas seulement un problème technique, mais aussi un sociotechnique, profondément enraciné dans la dynamique organisationnelle et le comportement humain. «L’incohérence collective» survenant en raison de pratiques incohérentes et de possession fragmentée conduit directement à des incohérences et à des défauts, ce qui rend le système imprévisible et difficile à contrôler, ce qui affecte considérablement l’intégrité des algorithmes.

Dysfonctionnements en cascade dans les systèmes interconnectés

Les systèmes logiciels modernes sont souvent complexes et très interconnectés. Dans de tels systèmes, un degré élevé de complexité et de composants étroitement apparentés augmente la probabilité d’échecs en cascade, lorsque le refus d’un composant provoque une réaction en chaîne des échecs chez d’autres. Ce phénomène exacerbe l’influence des erreurs et un comportement inapproprié des algorithmes, transformant les problèmes localisés en risques systémiques. Les résultats des algorithmes dans de tels systèmes deviennent très vulnérables aux échecs qui surviennent loin de leur chemin d’exécution direct, ce qui conduit à des résultats incorrects généralisés.

La complexité architecturale, la manifestation directe de l’entropie, peut transformer les erreurs algorithmiques isolées en défaillances de système à grande échelle, ce qui rend le système général peu fiable et ses données de sortie ne sont pas fiables. Cela met l’accent sur la nécessité d’une stabilité architecturale pour contenir la propagation des effets d’entropie.

L’un des derniers exemples est l’arrêt bien connu des aéroports en Amérique et en Europe en raison de l’apparition de l’écran de mort bleu après avoir mis à jour le logiciel antivirus en 2024, le résultat erroné de l’algorithme antivirus et du système d’exploitation a conduit au trafic aérien dans le monde.

Exemples pratiques

Exemple 1: Entropie dans Unicode et Restriction d’octets


Regardons un exemple simple avec un champ de texte, qui est limité par 32 octets.

Scénario

avec ASCII (entropie basse)

Si le champ accepte uniquement les symboles ASCII, chaque symbole prend 1 octets. Ainsi, exactement 32 caractères sont placés sur le terrain. Tout autre symbole ne sera tout simplement pas accepté.

@startuml
Exemple de titre avec ASCII (entropie basse)
Acteur utilisateur
Participant “Textfield”

Utilisateur -> TextField: présente 32 symboles ASCII
TextField -> TextField: vérifie la longueur (32 octets)
Remarque à droite
Tout va bien.
Note finale
TextField -> Utilisateur: Accepte l’entrée
@enduml

Scénario

avec UTF-8 (entropie élevée):

Maintenant, notre programme de leurs années 80 tombe en 2025. Lorsque le champ prend UTF-8, chaque symbole peut occuper de 1 à 4 octets. Si l’utilisateur introduit une ligne dépassant 32 octets, le système peut le couper incorrectement. Par exemple, les emoji occupent 4 octets. Si l’élagage se produit à l’intérieur du symbole, nous obtenons un symbole «cassé».

@startuml
Exemple de titre avec UTF-8 (High Entropy)
Acteur utilisateur
Participant “Textfield”

Utilisateur -> TextField: présente “Hi” (37 octets)
TextField -> TextField: coupe la ligne jusqu’à 32 octets
Remarque à droite
Soudainement! Symbole
Coupé par des octets.
Note finale
TextField -> utilisateur: affiche “HI”
Note à gauche
Symbole incorrect.
Note finale
@enduml

Ici, l’entropie se manifeste dans le fait que la même opération d’élagage pour différentes données d’entrée conduit à des résultats imprévisibles et incorrects.

Exemple 2: Entropie dans CSS et incompatibilité des navigateurs

Même dans des technologies apparemment stables, comme le CSS, l’entropie peut se produire en raison de différentes interprétations des normes.

Imaginez que le développeur a appliqué l’utilisateur élu: aucun; À tous les éléments pour désactiver la sortie du texte.

Browser 10 (Old Logic)


Le navigateur 10 fait une exception pour les champs d’entrée. Ainsi, malgré l’indicateur, l’utilisateur peut saisir des données.

@startuml
Navigateur de titre 10
Acteur utilisateur
Participant “Browser 10” comme navigateur10

Utilisateur -> Browser10: Entrée en entrée
Browser10 -> Browser10: vérifie CSS
Remarque à droite
-Usser-élu: aucun;
Ignoré pour l’entrée
Note finale
Browser10 -> utilisateur: permet l’entrée
@enduml

Browser 11 (Nouvelle logique)

Les développeurs du nouveau navigateur ont décidé de suivre strictement les spécifications, appliquant la règle à tous les éléments sans exception.

@startuml
Navigateur de titre 11
Acteur utilisateur
Participant “Browser 11” comme navigateur11

Utilisateur -> Browser11: entrée en entrée
Browser11 -> Browser11: vérifie CSS
Remarque à droite
-Usser-élu: aucun;
Appliqué à tous les éléments, y compris l’entrée
Note finale
Browser11 -> utilisateur: refuse d’entrer
Note à gauche
L’utilisateur ne peut rien faire
taper.
Note finale
@enduml

Cet exemple classique d’entropie – la même règle conduit à différents résultats en fonction du “système” (version du navigateur).

Exemple 3: Entropie due à un Tk ambigu

Une tâche technique ambiguë (TK) est une autre puissante source d’entropie. Lorsque deux développeurs, Bob et Alice, comprennent la même exigence de différentes manières, cela conduit à des implémentations incompatibles.

TK: “Pour implémenter un générateur de nombres de Fibonacci. Pour l’optimisation, une liste de nombres générés doit être armé à l’intérieur du générateur.”

Modèle mental de Bob (POO avec une condition variable)
Bob s’est concentré sur la phrase “Liste … doit être armé.” Il a mis en œuvre une classe qui stocke le même état (Self. Sequence) et l’augmente avec chaque appel.

    def __init__(self):
        self.sequence = [0, 1]

    def generate(self, n):
        if n <= len(self.sequence):
            return self.sequence

        while len(self.sequence) < n:
            next_num = self.sequence[-1] + self.sequence[-2]
            self.sequence.append(next_num)

        return self.sequence

Modèle mental d'Alice (approche fonctionnelle)

Alice s'est concentrée sur l'expression «renvoie la séquence». Elle a écrit une fonction pure qui renvoie une nouvelle liste à chaque fois, en utilisant le cache uniquement comme optimisation interne.

    sequence = [0, 1]
    if n <= 2:
        return sequence[:n]

    while len(sequence) < n:
        next_num = sequence[-1] + sequence[-2]
        sequence.append(next_num)

    return sequence

Lorsque Alice commence à utiliser le générateur BOB, elle s'attend à ce que Générer (5) renvoie toujours 5 numéros. Mais si avant ce bob appelé générer (8) dans le même objet, Alice recevra 8 numéros.

Conclusion: L'entropie ici est une conséquence de modèles mentaux mentaux. L'état modifiable dans la mise en œuvre de Bob rend le système imprévisible pour Alice, qui attend le comportement de la fonction pure.

Entropie et multi-astuces: l'état de la course et du grand-père

Dans la programmation multi-flux, l'entropie se manifeste particulièrement. Plusieurs flux sont effectués simultanément et la procédure pour leur mise en œuvre est imprévisible. Cela peut conduire à la condition de course, lorsque le résultat dépend du flux le premier à accéder à la ressource commune. L'affaire extrême est grand-père lorsque deux flux ou plus s'attendent et le programme se fige.

Exemple de la solution de Dedlok:

Le problème de Dedlok se pose lorsque deux ou plusieurs flux se bloquent, en attendant la version de la ressource. La solution consiste à établir une seule procédure fixe pour saisir les ressources, par exemple, les bloquer en augmentant l'ID. Cela exclut une attente cyclique qui empêche l'impasse.

@startuml
Solution de titre: procédure de blocage unifiée
Participant "Stream 1" comme Thread1
Participant "Stream 2" comme thread2
Participant "comme" comme responsable
Contant "Compte B" en tant que compteB

Thread1 -> Ractual: Blocks Compte a
Remarque sur Thread1
La règle suit:
ID de blocage
Note finale
Thread2 -> Accounta: en attente du compte A sera libéré
Remarque sur Thread2
La règle suit:
En attente de verrouillage d'un
Note finale
Thread1 -> CompteB: Blocks Compte B
Thread1 -> Ractual: Frees Compte a
Thread1 -> CompteB: Score des versions b
Remarque sur Thread1
La transaction est terminée
Note finale
Thread2 -> Ractual: bloque le compte A
Thread2 -> CompteB: Blocks Compte B
Remarque sur Thread2
La transaction se termine
Note finale
@enduml

Cette approche - blocage ordonné (commande de verrouillage) - est une stratégie fondamentale pour prévenir les morts dans la programmation parallèle.

Super, analysons comment l'état modifiable de l'approche OOP augmente l'entropie, en utilisant l'exemple de dessin sur toile et comparez cela avec une fonction pure.

Problème: condition modifiée et entropie

Lorsque l'objet a un état changé, son comportement devient imprévisible. Le résultat de l'appel de la même méthode dépend non seulement de ses arguments, mais aussi de l'histoire de l'interaction avec cet objet. Cela amène l'entropie dans le système.

Considérez les deux approches du rectangle dessin sur toile: l'une dans un style OOP avec une condition variable, l'autre en fonction, avec une fonction pure.

1. Approche OOP: classe avec un état variable
Ici, nous créons une classe de curseur, qui stocke son état intérieur, dans ce cas, la couleur. La méthode Draw dessinera un rectangle en utilisant cette condition.

  constructor(initialColor) {
    // Внутреннее состояние объекта, которое может меняться
    this.color = initialColor;
  }

  // Метод для изменения состояния
  setColor(newColor) {
    this.color = newColor;
  }

  // Метод с побочным эффектом: он использует внутреннее состояние
  draw(ctx, rect) {
    ctx.fillStyle = this.color;
    ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
  }
}

// Использование
const myCursor = new Cursor('red');
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

myCursor.draw(ctx, rectA); // Используется начальный цвет: red
myCursor.setColor('blue'); // Изменяем состояние курсора
myCursor.draw(ctx, rectB); // Используется новое состояние: blue

Diagramme UML de l'approche OOP:

Ce diagramme montre clairement que l'appel de la méthode Draw donne des résultats différents, bien que ses arguments puissent ne pas changer. Cela est dû à un appel SetColor séparé, qui a changé l'état interne de l'objet. Il s'agit d'une manifestation classique de l'entropie dans un état modifiable.

title ООП-подход
actor "Программист" as Programmer
participant "Класс Cursor" as Cursor
participant "Canvas" as Canvas

Programmer -> Cursor: Создает new Cursor('red')
note left
  - Инициализирует состояние
    с цветом 'red'.
end note
Programmer -> Cursor: draw(ctx, rectA)
note right
  - Метод draw использует
    внутреннее состояние
    объекта (цвет).
end note
Cursor -> Canvas: Рисует 'red' прямоугольник
Programmer -> Cursor: setColor('blue')
note left
  - Изменяет внутреннее состояние!
  - Это побочный эффект.
end note
Programmer -> Cursor: draw(ctx, rectB)
note right
  - Тот же метод draw,
    но с другим результатом
    из-за измененного состояния.
end note
Cursor -> Canvas: Рисует 'blue' прямоугольник
@enduml

2. Approche fonctionnelle: fonction pure

Ici, nous utilisons une fonction pure. Sa tâche consiste à dessiner simplement un rectangle en utilisant toutes les données nécessaires qui lui sont transmises. Elle n'a aucune condition et son défi n'affectera rien en dehors de ses frontières.

  // Функция принимает все необходимые данные как аргументы
  ctx.fillStyle = color;
  ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
}

// Использование
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

drawRectangle(ctx, rectA, 'red'); // Рисуем первый прямоугольник
drawRectangle(ctx, rectB, 'blue'); // Рисуем второй прямоугольник

Diagramme UML d'une approche fonctionnelle:

Ce diagramme montre que la fonction Drawrectangle obtient toujours la couleur extérieure. Son comportement dépend entièrement des paramètres d'entrée, ce qui le rend propre et avec un faible niveau d'entropie.

@startuml
Approche fonctionnelle du titre
Acteur "programmeur" en tant que programmeur
Participant "fonction \ n drawrectangle" comme drawfunc
"Toile" participant comme toile

Programmer -> Drawfunc: DrawrewerCTangle (CTX, recta, «rouge»)
Remarque à droite
- Appelez avec des arguments:
- CTX
- recta (coordonnées)
- «rouge» (couleur)
- La fonction n'a pas de condition.
Note finale

Drawfunc -> toile: inondations avec la couleur «rouge»
Programmer -> Drawfunc: DrawrewerCTangle (CTX, RECTB, 'BLUE')
Remarque à droite
- Appelez avec de nouveaux arguments:
- CTX
- rectb (coordonnées)
- «bleu» (couleur)
Note finale
Drawfunc -> toile: inondations avec la couleur «bleu»
@enduml

Dans un exemple avec une fonction pure, le comportement est complètement prévisible, car la fonction n'a pas de condition. Toutes les informations de travail sont transmises par des arguments, ce qui les rend isolés et sûrs. Dans une approche OOP avec un état variable au comportement de la méthode Draw, toute l'historique de l'interaction avec l'objet peut affecter, ce qui introduit l'entropie et rend le code moins fiable.

Conception et architecture modulaire: isolement, testabilité et réutilisation

La division des systèmes complexes en modules plus petits, indépendants et autonomes simplifie la conception, le développement, les tests et la maintenance. Chaque module traite certaines fonctionnalités et interagit par des interfaces clairement définies, réduisant l'interdépendance et contribuant à la séparation de la responsabilité. Cette approche améliore la lisibilité, simplifie la maintenance, facilite le développement parallèle et simplifie les tests et le débogage en isolant des problèmes. Il est essentiel que cela réduit le "rayon de la défaite" des erreurs, retenant les défauts dans des modules distincts et empêchant les échecs en cascade. L'architecture de microservice est une puissante réalisation de la modalité.

La modularité n'est pas seulement un moyen d'organiser le code, mais aussi une approche fondamentale pour contenir les défauts et l'augmentation de la stabilité. Limitant l'impact de l'erreur dans un module, la modalité augmente la stabilité globale du système à la désintégration de l'entropie, garantissant qu'un point de refus ne compromet pas l'exactitude de l'ensemble de l'application. Cela permet aux équipes de se concentrer sur des parties plus petites et plus contrôlées du système, ce qui conduit à des tests plus approfondis et à des erreurs de détection et de correction plus rapides.

Pratiques de code pur: baiser, drys et principes solides pour la fiabilité

Kiss (gardez les choses simples, stupides):
Cette philosophie de conception représente la simplicité et la clarté, évitant activement la complexité inutile. Un code simple est intrinsèquement plus facile à lire, à comprendre et à modifier, ce qui entraîne directement une diminution de la tendance aux erreurs et à l'amélioration du support. La complexité est clairement définie comme un environnement nutritif pour les erreurs.

Le baiser n'est pas seulement une préférence esthétique, mais un choix délibéré de conception, ce qui réduit la surface de l'attaque pour les erreurs et rend le code plus résistant aux changements futurs, maintenant ainsi l'exactitude et la prévisibilité des algorithmes. Il s'agit d'une mesure proactive contre l'entropie à un niveau de code détaillé.

Sec (ne vous répétez pas):
Le principe sec vise à réduire la répétition des informations et la duplication du code, en les remplaçant par des abstractions ou en utilisant la normalisation des données. Sa position principale est que "chaque fragment de connaissances devrait avoir une représentation unique, sans ambiguïté et faisant autorité dans le système". Cette approche élimine la redondance, qui, à son tour, réduit les incohérences et empêche la propagation des erreurs ou leur correction incohérente dans plusieurs copies de la logique dupliquée. Il simplifie également le support et le débogage de la base de code.

La duplication du code entraîne des changements incohérents, ce qui, à son tour, conduit à des erreurs. Le sec empêche cela, en fournissant une seule source de vérité pour la logique et les données, ce qui contribue directement à l'exactitude des algorithmes, garantissant que la logique générale se comporte uniformément et prévisible dans tout le système, empêchant les erreurs minces et difficiles à entrer.

principes solides

Cet acronyme mnémonique présente cinq principes de conception fondamentaux (responsabilité unifiée, ouverture / proximité, substitution de Liskin, séparation des interfaces, inversions des dépendances) qui sont cruciales pour créer des projets orientés objet qui sont clairs, flexibles et favorables. Adhérer à des entités logicielles solides devient plus facile à soutenir et à adapter, ce qui conduit à un plus petit nombre d'erreurs et à des cycles de développement plus rapides. Ils y parviennent en simplifiant le service (SRP), en garantissant les fonctions d'ajout évolutives sans modification (OCP), en assurant la cohérence comportementale (LSP), en minimisant la cohérence (ISP) et en augmentant la flexibilité due à l'abstraction (DIP).

Les principes solides fournissent une approche holistique de l'intégrité structurelle, ce qui rend le système essentiellement plus résistant aux effets de cascade des changements. Promouvant la modularité, la séparation et les responsabilités claires, ils empêchent les erreurs en cascade et conservent l'exactitude des algorithmes même si le système est en continu, agissant comme des mesures fondamentales pour lutter contre l'entropie.

Entropie et conception axée sur le domaine (DDD)

La conception axée sur le domaine (DDD) n'est pas seulement une philosophie, mais une méthodologie à part entière qui offre des modèles spécifiques pour diviser l'application en domaines, ce qui vous permet de contrôler efficacement la complexité et de lutter contre l'entropie. DDD aide à transformer un système chaotique en un ensemble de composants prévisibles et isolés.

Modèles de gang de quatre conçoit comme un seul appareil conceptuel

Le livre "Design Patterns: Elements of Reutilisable Oriented Software" (1994), écrit par un "gang de quatre" (GoF), a offert un ensemble de solutions éprouvées pour des problèmes typiques. Ces modèles sont d'excellents outils pour lutter contre l'entropie, car ils créent des systèmes structurés, prévisibles et contrôlés.

L'un des effets clés des modèles est la création d'un seul appareil conceptuel. Lorsque le développeur d'une équipe parle de «l'usine» ou du «solitaire», ses collègues comprennent immédiatement de quel type de code nous parle. Cela réduit considérablement l'entropie dans la communication, car:

L'ambiguïté diminue: les modèles ont des noms et des descriptions clairs, qui exclut différentes interprétations, comme dans l'exemple avec Bob et Alice.

On a accéléré sur le plan: les nouveaux membres de l'équipe sont versés plus rapidement dans le projet, car ils n'ont pas besoin de deviner la logique debout derrière des structures complexes.

Le refactorisation est facilité: si vous avez besoin de modifier la partie du système construite en fonction du modèle, le développeur sait déjà comment il est organisé et quelles pièces peuvent être modifiées en toute sécurité.

Exemples de modèles GoF et leur influence sur l'entropie:

«Stratégie» du modèle: vous permet d'encapsuler divers algorithmes dans des classes individuelles et de les rendre interchangeables. Cela réduit l'entropie, car il vous permet de modifier le comportement du système sans modifier son code principal.

Pattern "Command" (Commande): Inkapsules La méthode de la méthode à l'objet. Cela vous permet de reporter l'exécution, de mettre les commandes dans la file d'attente ou de les annuler. Le motif réduit l'entropie, car il sépare l'expéditeur de l'équipe de son destinataire, les rendant indépendants.

Modèle d'observateur (Observer): détermine la dépendance du "un-à-plusieurs", dans lequel un changement dans l'état d'un objet en informe automatiquement tout. Cela aide à contrôler les effets secondaires, les rendant évidents et prévisibles, et non chaotiques et cachés.

Modèle "Méthode d'usine": définit l'interface pour la création d'objets, mais permet aux sous-classes de décider quelle classe instituer. Cela réduit l'entropie, car il vous permet de créer de manière flexible des objets sans avoir besoin de connaître des classes spécifiques, en réduisant la connectivité.

Ces modèles aident les programmeurs à créer des systèmes plus prévisibles, testés et contrôlés, réduisant ainsi l'entropie, qui se produit inévitablement dans des projets complexes.

Modèles de clés DDD pour contrôler l'entropie

Contextes limités: Ce modèle est la fondation DDD. Il propose de diviser un grand système en petites parties autonomes. Chaque contexte a son propre modèle, un dictionnaire de termes (langue omniprésente) et de logique. Cela crée des limites strictes qui empêchent la propagation des changements et des effets secondaires. Le changement dans un contexte limité, par exemple, dans le «contexte des commandes», n'affectera pas le «contexte de livraison».

Aggrégats (agrégats): L'unité est un groupe d'objets associés (par exemple, "Ordre", "Lignes de l'ordre"), qui est considéré dans son ensemble. L'unité a un objet racine (racine agrégée), qui est le seul point d'entrée pour toutes les modifications. Cela fournit la cohérence et garantit que l'état de l'unité reste toujours intégral. En changeant l'unité uniquement via son objet racine, nous contrôlons comment et quand il y a un changement dans la condition, ce qui réduit considérablement l'entropie.

Services de domaine: pour les opérations qui n'appartiennent à aucun objet particulier de la zone (par exemple, le transfert d'argent entre les comptes), DDD propose d'utiliser les services de domaine. Ils coordonnent les actions entre plusieurs unités ou objets, mais ne gardent pas la condition elles-mêmes. Cela rend la logique plus transparente et prévisible.

Les événements du domaine des sujets (événements de domaine): au lieu de méthodes d'appel direct à partir de différents contextes, DDD propose d'utiliser des événements. Lorsque quelque chose d'important se produit dans un contexte, il "publie" l'événement. D'autres contextes peuvent s'abonner à cet événement et y répondre. Cela crée une faible connectivité entre les composants, ce qui rend le système un plus évolutif et résistant aux changements.

DDD aide à contrôler l'entropie, créant des limites claires, des règles strictes et des composants isolés. Cela transforme un système complexe et déroutant en un ensemble de parties indépendantes et contrôlées, chacune ayant sa propre «loi» et un comportement prévisible.

Documentation complexe et animée

Le maintien d'une documentation détaillée et pertinente sur les modifications de code, les solutions de conception, les diagrammes architecturaux et les manuels d'utilisation est d'une importance capitale. Cette «documentation en direct» aide les développeurs à comprendre les subtilités du système, à suivre les modifications et à apporter correctement les modifications futures ou les erreurs correctes. Il réduit considérablement le temps consacré à la «re-ouvrage» ou à la conception inverse du système, qui sont des sources d'erreurs courantes.

L'entropie du programme se produit en raison du «manque de connaissances» et des «écarts entre les hypothèses générales et le comportement réel du système existant». La documentation agit non seulement comme un guide, mais comme

Le mécanisme critique pour préserver les connaissances, qui se bat directement avec «l'entropie de la connaissance». En rendant les connaissances implicites explicitement et abordables, elle réduit les malentendus et la probabilité de faire des erreurs en raison d'hypothèses incorrectes sur le comportement des algorithmes ou des interactions système, protégeant ainsi l'exactitude fonctionnelle.

Test stricte et assurance de qualité continue

Test automatisé: tests modulaires, d'intégration, de système et de régression
Les tests automatisés sont un outil indispensable pour adoucir l'entropie du logiciel et prévenir les erreurs. Il permet une détection précoce des problèmes, garantissant que les modifications de code ne violent pas les fonctionnalités existantes et fournit une rétroaction rapide et cohérente. Les types de clés comprennent des tests modulaires (pour les composants isolés), des tests d'intégration (pour les interactions entre les modules), des tests système (pour un système intégré complet) et des tests de régression (pour garantir que les nouveaux changements ne conduisent pas à l'apparence répétée d'anciennes erreurs). Les tests automatisés réduisent considérablement le facteur humain et augmentent la fiabilité.

Les tests automatisés sont la principale protection contre l'accumulation de défauts cachés. Il «déplace» activement la découverte des erreurs vers la gauche dans le cycle de développement, ce qui signifie que des problèmes sont trouvés lorsque leur correction est la plus chère et la plus simple, empêchant leur contribution à l'effet du coma de neige de l'entropie. Cela affecte directement l'exactitude des algorithmes, vérifiant constamment le comportement attendu à plusieurs niveaux de détail.

Développement par test (TDD): Déplacez-vous vers la gauche dans la détection des erreurs

Le développement par test (TDD) est un processus de développement de logiciels, qui comprend des tests d'écriture de code avant d'écrire le code lui-même. Ce cycle itératif "Refactorisation du vert rouge" favorise une rétroaction rapide, permettant une détection précoce des erreurs et réduisant considérablement le risque de problèmes complexes à des stades ultérieurs de développement. Il a été démontré que le TDD conduit à un plus petit nombre d'erreurs et à la qualité optimale du code, coordonnant bien la philosophie du sec (ne vous répétez pas). Les études empiriques d'IBM et de Microsoft montrent que le TDD peut réduire la densité d'erreur à libérer par un impressionnant 40 à 90%. Les exemples de test servent également de documentation en direct.

TDD agit comme un contrôle de qualité proactif, construit directement dans le processus de développement. Forçant les développeurs à déterminer le comportement attendu avant la mise en œuvre, il minimise l'introduction d'erreurs logiques et garantit que le code est créé délibérément pour se conformer aux exigences, améliorant directement l'exactitude et la prévisibilité des algorithmes dès le début.

Intégration et livraison continues (CI / CD): rétroaction précoce et versions stables
Les pratiques CI / CD sont fondamentales pour le développement de logiciels modernes, aidant à identifier les erreurs aux premiers stades, accélérer le développement et assurer un processus de déploiement ininterrompu. L'intégration fréquente de petits packages de code dans le référentiel central permet une détection précoce des erreurs et une amélioration continue de la qualité du code grâce à des assemblages et tests automatisés. Ce processus fournit une rétroaction rapide, permettant aux développeurs d'éliminer rapidement et efficacement les problèmes, et augmente également considérablement la stabilité du code, empêchant l'accumulation de code non vérifié ou instable.

Les convoyeurs CI / CD fonctionnent comme un mécanisme continu pour réduire l'entropie. En automatisant l'intégration et les tests, ils empêchent l'accumulation de problèmes d'intégration, fournissent une condition de déploiement constante et offrent une visibilité immédiate de la régression. Cette approche systématique et automatisée contrecarre directement le trouble apporté par des changements continus, en maintenant la stabilité des algorithmes et en empêchant la propagation des erreurs dans tout le système.

Gestion systématique de la dette technique

refactorisation supplémentaire: amélioration du code stratégique

Le refactorisation est le processus de restructuration du code existant pour améliorer sa structure interne sans modifier son comportement externe. Il s'agit d'un moyen direct de lutter contre les logiciels pourrie et réduisant la complexité. Bien que le refactorisation soit généralement considéré comme un moyen de réduire le nombre d'erreurs, il est important d'admettre que certains réfractations peuvent contribuer involontairement à de nouvelles erreurs, ce qui nécessite des tests stricts. Cependant, les études confirment généralement que le code réfracturé est moins sujet à des erreurs que non. L'augmentation du refactorisation, dans laquelle la gestion de la dette est intégrée dans le processus de développement actuel et n'est pas reportée, est cruciale pour empêcher l'accumulation exponentielle de la dette technique.

Le refactorisation est une action délibérée pour réduire l'entropie, une restructuration de code proactive pour la rendre plus résistante aux changements, réduisant ainsi la probabilité d'erreurs futures et améliorant la clarté des algorithmes. Il transforme les incendies réactifs dans la gestion proactive de la santé structurelle.

Backlogs de la dette technique: priorisation et distribution des ressources

La maintenance d'un bablog actuel de la dette technique est une pratique critique pour la gestion systématique et l'élimination de la dette technique. Ce backlog sert de registre complet des éléments identifiés des droits techniques et des domaines nécessitant une amélioration, garantissant que ces problèmes ne seront pas négligés. Il permet aux chefs de projet de hiérarchiser les éléments de la dette en fonction de leur gravité d'influence et de risques potentiels. L'intégration du BABLOG pendant le projet garantit que le refactorisation, la correction des erreurs et le nettoyage du code sont des éléments réguliers de la gestion quotidienne du projet, réduisant les coûts de remboursement à long terme.

Le Baclog de la dette technique transforme un problème abstrait et croissant en un ensemble de tâches contrôlées et contrôlées. Cette approche systématique permet aux organisations de prendre des compromis raisonnables entre le développement de nouvelles fonctions et les investissements dans la qualité, empêchant l'accumulation de dette discret, ce qui peut entraîner des erreurs critiques ou une dégradation de la productivité des algorithmes. Il offre une visibilité et un contrôle sur la puissance d'entropie clé.

Analyse de code statique et dynamique: identification proactive des problèmes

Analyse statique

Cette technique comprend une analyse du code source sans sa mise en œuvre pour identifier des problèmes tels que les erreurs, les odeurs de code, la vulnérabilité de sécurité et les normes de codage altérées. Il sert de «première ligne de protection», en identifiant les problèmes dans les premiers stades du cycle de développement, en améliorant la qualité globale du code et en réduisant la dette technique en identifiant des modèles problématiques avant qu'ils n'apparaissent comme des erreurs pendant l'exécution.

L'analyse statique agit comme une "police de qualité du code" automatisée. Identifier les problèmes potentiels (y compris ceux qui affectent la logique algorithmique) avant de les performer, cela empêche leur manifestation sous forme d'erreurs ou d'inconvénients architecturaux. Il s'agit d'une méthode évolutive pour garantir les normes de codage et identifier les erreurs courantes qui contribuent à l'entropie du logiciel.

Analyse dynamique

Cette méthode évalue le comportement logiciel lors de l'exécution, fournissant des informations précieuses sur les problèmes qui ne se manifestent que lors de l'exécution. Il découvre parfaitement les erreurs pendant l'exécution, telles que les fuites de mémoire, l'état de la race et l'exclusion du pointeur zéro, ainsi que des lieux étroits en performance et en vulnérabilité de la sécurité.

L'analyse dynamique est essentielle pour identifier les inconvénients comportementaux pendant l'exécution, qui ne peuvent pas être détectés par analyse statique. La combinaison de l'analyse statique et dynamique garantit une idée complète de la structure et du comportement du code, permettant aux équipes d'identifier les défauts avant de développer de graves problèmes.

Surveillance de la production et du bureau des incidents

APM (surveillance des performances de l'application):
Les outils APM sont conçus pour surveiller et optimiser les performances des applications. Ils aident à identifier et à diagnostiquer des problèmes de performance complexes, ainsi qu'à détecter les causes profondes des erreurs, réduisant ainsi la perte de revenus des temps d'arrêt et de la dégradation. Les systèmes APM surveillent diverses mesures, telles que le temps de réponse, l'utilisation des ressources et la fréquence des erreurs, fournissant des informations en temps réel, ce qui vous permet de résoudre de manière proactive les problèmes avant qu'ils affectent les utilisateurs.

Les outils APM critent les solutions proactives aux problèmes et le maintien des niveaux de service. Ils offrent une visibilité approfondie dans l'environnement de production, permettant aux équipes d'identifier et d'éliminer rapidement les problèmes qui peuvent affecter les algorithmes corrects ou provoquer des erreurs, minimisant ainsi les temps d'arrêt et l'amélioration de l'expérience utilisateur.

Observabilité (journaux, métriques, traceur):

L'observabilité fait référence à la capacité d'analyser et de mesurer les états internes des systèmes en fonction de leurs données de sortie et de leurs interactions entre les actifs. Trois principaux piliers de l'observabilité sont les mesures (données quantitatives sur la productivité et l'utilisation des ressources), les journaux (enregistrements chronologiques détaillés des événements) et le traçage (suivant le flux des demandes à travers les composants du système). Ensemble, ils aident à identifier et à résoudre des problèmes, fournissant une compréhension complète du comportement du système. L'observabilité va au-delà de la surveillance traditionnelle, aidant à comprendre "inconnu inconnu" et à améliorer l'application sans problème des applications.

L'observabilité permet aux équipes d'étudier de manière flexible ce qui se passe et de déterminer rapidement la cause profonde des problèmes qu'ils n'ont peut-être pas prévus. Cela fournit une compréhension plus profonde, flexible et proactive du comportement du système, permettant aux équipes d'identifier et d'éliminer rapidement des problèmes imprévus et de maintenir une forte accessibilité des applications.

Analyse de la cause profonde (RCA)

L'analyse des causes profondes (RCA) est un processus structuré basé sur des données qui révèlent les causes fondamentales des problèmes de systèmes ou de processus, permettant aux organisations de mettre en œuvre des solutions efficaces et à long terme et pas seulement d'éliminer les symptômes. Il comprend la définition du problème, la collecte et l'analyse des données pertinentes (par exemple, les mesures, les journaux, les échelles temporaires), la détermination des facteurs causaux et connexes à l'aide d'outils tels que «5 pourquoi» et des diagrammes d'Ishikawa, ainsi que le développement et la mise en œuvre d'actions correctives. Le RCA est crucial pour prévenir la réévaluation des problèmes et une formation sur les incidents.

La RCA est cruciale pour la prévention à long terme des problèmes et la formation sur les incidents. Identifier et éliminer systématiquement les principales causes, et pas seulement les symptômes, les organisations peuvent empêcher la réinstallation des erreurs et des défaillances des algorithmes, réduisant ainsi le système global du système et augmentant sa fiabilité.

Méthodologies flexibles et pratiques d'équipe

Gestion des erreurs dans Agile:

Dans l'environnement agile, la gestion des erreurs est extrêmement importante et il est recommandé d'allouer du temps dans les sprints pour les corriger. Les erreurs doivent être enregistrées dans un seul produit du produit et associées à l'historique correspondant pour faciliter l'analyse des causes profondes et améliorer le code dans les sprints suivants. Les équipes devraient s'efforcer de corriger les erreurs dès que possible, de préférence dans le sprint actuel afin d'éviter leur accumulation. La collecte des statistiques d'erreur (le nombre de résolus, le nombre d'heures enregistrées et consacrées à la correction) permet d'obtenir une idée de la qualité du code et d'améliorer les processus.

Cela souligne l'importance des corrections immédiates, l'analyse des causes profondes et l'amélioration continue. Les méthodologies flexibles fournissent un cadre pour un contrôle proactif des erreurs, empêchant leur contribution à l'entropie du système et en maintenant l'exactitude des algorithmes par vérification et adaptation constantes.

DevOps

pratiques

Les pratiques DevOps aident à réduire les défauts logiciels et à améliorer la qualité grâce à plusieurs approches clés. Ils comprennent le développement d'une culture de coopération et de communication indubitable, l'adoption de l'intégration et de la livraison continues (CI / CD), la configuration des tests automatisés, la concentration sur l'observabilité et les mesures, en évitant les travaux faits à la main, y compris la sécurité aux premiers stades du cycle de développement et la formation sur les incidents. Ces pratiques réduisent le nombre d'erreurs, améliorent la qualité et contribuent à une amélioration constante.

DevOps contribue à l'amélioration continue et à la réduction de l'entropie par l'automatisation, une rétroaction rapide et une culture de responsabilité générale. Intégrant les processus de développement et de fonctionnement, DevOps crée un environnement dans lequel des problèmes sont détectés et éliminés rapidement, empêchant leur accumulation et leur dégradation des systèmes, ce qui soutient directement l'intégrité des algorithmes.

Conclusion

L'entropie du programme est une force inévitable qui s'efforce constamment de dégradation des systèmes logiciels, en particulier dans le contexte de l'exactitude des algorithmes et des erreurs. Ce n'est pas seulement le vieillissement physique, mais une interaction dynamique entre le code, son environnement et les facteurs humains qui font constamment un gâchis. Les principales forces motrices de cette désintégration comprennent la complexité croissante, l'accumulation de dette technique, la documentation inadéquate, les environnements externes en constante évolution et les méthodes de développement incohérentes. Ces facteurs conduisent directement à des résultats incorrects des travaux d'algorithmes, à la perte de prévisibilité et à une augmentation du nombre d'erreurs qui peuvent se propager en cascadement via des systèmes interconnectés.

La lutte contre l'entropie du logiciel nécessite une approche multiforme, continue et proactive. Il ne suffit pas de corriger les erreurs au fur et à mesure qu'ils se produisent; Il est nécessaire d'éliminer systématiquement les principales raisons qui les génèrent. L'adoption des principes de la conception modulaire, du code propre (baiser, sec, solide) et de la documentation complexe est fondamentale pour créer des systèmes stables, qui sont essentiellement moins sensibles à l'entropie. Les tests automatisés stricts, le développement par test (TDD) et l'intégration / livraison continue (CI / CD) agissent comme des mécanismes critiques de détection précoce et de prévention des défauts, vérifiant et stabilisant constamment la base de code.

En outre, la gestion systématique de la dette technique par le refactorisation accessoire et les bafflogistes de la dette technique, ainsi que l'utilisation d'outils d'analyse de code statiques et dynamiques, permet aux organisations d'identifier et d'éliminer activement les problèmes avant de conduire à des échecs critiques. Enfin, une surveillance de la production fiable à l'aide d'outils APM et de plates-formes d'observabilité, en combinaison avec une analyse disciplinée des causes profondes et des pratiques d'équipe flexibles, assure une réponse rapide aux problèmes émergents et crée un cycle d'amélioration continue.

En fin de compte, assurer l'intégrité des algorithmes et minimiser les erreurs dans les conditions d'entropie du logiciel - ce n'est pas un effort à un temps, mais une obligation constante de maintenir l'ordre dans un environnement dynamique et en constante évolution. En appliquant ces stratégies, les organisations peuvent augmenter considérablement la fiabilité, la prévisibilité et la durabilité de leurs systèmes logiciels, garantissant que les algorithmes fonctionneront comme prévu, même s'ils évoluent.

Bloquer les diagrammes en pratique sans formol

Le diagramme de blocs est un outil visuel qui aide à transformer un algorithme complexe en une séquence d’actions compréhensible et structurée. De la programmation à la gestion des processus métier, ils servent de langage universel pour la visualisation, l’analyse et l’optimisation des systèmes les plus complexes.

Imaginez une carte où au lieu des routes est logique et au lieu des villes – des actions. Il s’agit d’un schéma de bloc – un outil indispensable pour la navigation dans les processus les plus déroutants.

Exemple 1: Schéma de lancement de jeu simplifié
Pour comprendre le principe du travail, présentons un schéma de lancement de jeu simple.

Ce schéma montre le script parfait lorsque tout se produit sans échecs. Mais dans la vraie vie, tout est beaucoup plus compliqué.

Exemple 2: Schéma élargi pour démarrer le jeu avec le chargement des données
Les jeux modernes nécessitent souvent une connexion Internet pour télécharger les données des utilisateurs, l’enregistrement ou les paramètres. Ajoutons ces étapes à notre schéma.

Ce schéma est déjà plus réaliste, mais que se passera-t-il en cas de problème?

comment était-ce: un jeu qui “s’est cassé” avec la perte d’Internet

Au début du projet, les développeurs n’ont pas pu prendre en compte tous les scénarios possibles. Par exemple, ils se sont concentrés sur la logique principale du jeu et ne pensaient pas ce qui se passerait si le joueur avait une connexion Internet.

Dans une telle situation, le schéma de bloc de leur code ressemblerait à ceci:

Dans ce cas, au lieu d’émettre une erreur ou de fermer correctement, le jeu s’est figé au stade de l’attente des données qu’elle n’a pas reçues en raison de l’absence de connexion. Cela a conduit à “l’écran noir” et au gel de l’application.

comment il est devenu: correction sur les plaintes des utilisateurs

Après les plaintes de nombreux utilisateurs concernant le plan de volant, l’équipe du développeur s’est rendu compte que nous devions corriger l’erreur. Ils ont apporté des modifications au code en ajoutant une unité de traitement d’erreur qui permet à l’application de répondre correctement au manque de connexion.

C’est à quoi ressemble le diagramme de bloc corrigé, où les deux scénarios sont pris en compte:

Grâce à cette approche, le jeu informe désormais correctement l’utilisateur du problème, et dans certains cas, il peut même passer en mode hors ligne, vous permettant de continuer le jeu. Ceci est un bon exemple de la raison pour laquelle les diagrammes de blocs sont si importants : ils font que le développeur réfléchit non seulement à la façon idéale d’exécution, mais aussi à toutes les échecs possibles, ce qui rend le produit final beaucoup plus stable et fiable.

comportement incertain

La suspension et les erreurs ne sont qu’un exemple de comportement imprévisible du programme. En programmation, il existe un concept de comportement incertain (comportement non défini) – Il s’agit d’une situation où la norme du langage ne décrit pas comment le programme devrait se comporter dans un certain cas.

Cela peut conduire à n’importe quoi: des «ordures» aléatoires dans le retrait de l’échec du programme ou même de la vulnérabilité de sécurité sérieuse. Le comportement indéfini se produit souvent lorsque vous travaillez avec la mémoire, par exemple, avec des lignes dans la langue de C.

Un exemple de la langue C:

Imaginez que le développeur a copié la ligne dans le tampon, mais a oublié d’ajouter à la fin le symbole zéro (`\ 0`) , qui marque la fin de la ligne.

Voici à quoi ressemble le code:

#include 

int main() {
char buffer[5];
char* my_string = "hello";

memcpy(buffer, my_string, 5);

printf("%s\n", buffer);
return 0;
}

Résultat attendu: “Bonjour”
Le résultat réel est imprévisible.

Pourquoi cela se produit-il? La fonction `printf` avec le spécificateur ‘% S` s’attend à ce que la ligne se termine par un symbole zéro. S’il ne l’est pas, elle continuera à lire la mémoire en dehors du tampon mis en évidence.

Voici le schéma de bloc de ce processus avec deux résultats possibles:

Ceci est un exemple clair de la raison pour laquelle les diagrammes de bloc sont si importants: ils font réfléchir le développeur non seulement à la manière idéale d’exécution, mais aussi à tous les échecs possibles, y compris des problèmes de niveau de bas niveau, ce qui rend le produit final beaucoup plus stable et fiable.

LLM Fine-Tune

Actuellement, tous les fournisseurs de services LLM populaires utilisent une tonnerie amende à l’aide de fichiers JSONL, qui décrivent les entrées et sorties du modèle, avec de petites variations, par exemple pour Gemini, OpenAI, le format est légèrement différent.

Après avoir téléchargé un fichier JSONL spécialement formé, le processus de spécialisation du modèle LLM sur l’ensemble de données spécifié commence, pour tous les fournisseurs LLM bien connus actuels, ce service est payé.

Pour affiner sur une machine locale utilisant Olllama, je recommande de compter sur une vidéo détaillée de la Tech de la chaîne YouTube avec un moyen le plus facile de faire affiner un LLM et nous avec Alloma:
https://www.youtube.com/watch?v=pTaSDVz0gok

Un exemple d’ordinateur portable Jupyter avec la préparation de l’ensemble de données JSONL à partir des exportations de tous les messages télégrammes et le lancement du processus d’adaptation local est disponible ici:
https://github.com/demensdeum/llm-train-example

React Native Brief Review

React Native s’est imposé comme un outil puissant pour le développement multiplateforme des applications mobiles et Web. Il vous permet de créer des applications natives pour Android et iOS, ainsi que des applications Web à l’aide d’une seule base de code sur JavaScript / TypeScript.

Fondamentaux de l’architecture et du développement

React Architecture nationale est basé sur les liaisons natives de JavaScript / TypeScript. Cela signifie que la logique métier de base et une application dans l’application sont écrites sur JavaScript ou TypeScript. Lorsque l’accès à des fonctionnalités natives spécifiques (par exemple, l’appareil ou la caméra GPS) est requise, ces liaisons natives sont utilisées, qui vous permettent d’appeler le code écrit sur Swift / Objective-C pour iOS ou Java / Kotlin pour Android.

Il est important de noter que les plates-formes résultantes peuvent varier en fonctionnalité. Par exemple, une certaine fonctionnalité ne peut être disponible que pour Android et iOS, mais pas pour le Web, ou vice versa, selon les capacités natives de la plate-forme.

Configuration et mises à jour

La configuration des liaisons natives est effectuée via la touche Plugins. Pour un développement stable et sûr, il est essentiel d’utiliser les dernières versions des composants natifs React et de toujours se tourner vers la documentation actuelle. Cela permet d’éviter les problèmes de compatibilité et d’utiliser tous les avantages des dernières mises à jour.

Caractéristiques du développement et de l’optimisation

React Native peut générer des projets résultants pour des plates-formes spécifiques (par exemple, les dossiers Android et iOS). Cela permet aux développeurs, si nécessaire, de corriger les fichiers des projets résultants manuellement pour une optimisation fine ou des paramètres spécifiques, ce qui est particulièrement utile pour les applications complexes qui nécessitent une approche individuelle des performances.

Pour les applications typiques et simples, il suffit souvent d’utiliser Bandle Expo avec des liaisons natives construites. Cependant, si l’application a une fonctionnalité complexe ou nécessite une personnalisation profonde, il est recommandé d’utiliser des assemblages personnalisés natifs React.

Eaturabilité du développement et des mises à jour

L’un des principaux avantages de React Native est la prise en charge de rechargement à chaud pour le code TypeScript / JavaScript pendant le développement. Cela accélère considérablement le processus de développement, car les modifications de code sont instantanément affichées dans l’application, permettant au développeur de voir le résultat en temps réel.

React Native prend également en charge «Silent Update) en contournant le processus de Google Play et Apple App Store, mais cela ne s’applique qu’au code TypeScript / JavaScript.

Il est important de comprendre que le code TS / JS est bandé sur une version spécifique des dépendances natives utilisant l’empreinte digitale, ce qui assure la coordination entre la pièce JavaScript / TypeScript et la partie native de l’application.

Utilisation de LLM dans le développement

Bien que la codhegénération avec LLM (modèles de grande langue) soit possible, son aptitude n’est pas toujours élevée en raison d’ensembles de données potentiellement obsolètes sur lesquels les modèles ont été formés. Cela signifie que le code généré peut ne pas correspondre aux dernières versions de React Native ou des meilleures pratiques.

React Native continue de se développer, offrant aux développeurs un moyen flexible et efficace de créer des applications multiplateformes. Il combine la vitesse de développement avec la possibilité d’accès aux fonctions natives, ce qui en fait un choix attrayant pour de nombreux projets.

Pixel Perfect: Mythe ou réalité à l’ère de la déclarativité?

Dans le monde du développement des interfaces, il existe un concept commun – “Pixel parfait dans le lodge” . Cela implique la reproduction la plus précise de la machine de conception au plus petit pixel. Pendant longtemps, c’était une étalon-or, en particulier à l’ère d’une conception Web classique. Cependant, avec l’arrivée du mile déclarant et la croissance rapide de la variété des appareils, le principe de “Pixel parfait” devient plus éphémère. Essayons de comprendre pourquoi.

Imperial Wysiwyg vs code déclaratif: Quelle est la différence?

Traditionnellement, de nombreuses interfaces, en particulier de bureau, ont été créées en utilisant des approches impératives ou Wysiwyg (ce que vous voyez est ce que vous obtenez) des éditeurs. Dans de tels outils, le concepteur ou le développeur manipule directement avec des éléments, en les plaçant sur toile avec une précision au pixel. Il est similaire à travailler avec un éditeur graphique – vous voyez à quoi ressemble votre élément, et vous pouvez certainement le positionner. Dans ce cas, la réalisation de “Pixel Perfect” était un objectif très réel.

Cependant, le développement moderne est de plus en plus basé sur miles déclaratifs . Cela signifie que vous ne dites pas à l’ordinateur de “mettre ce bouton ici”, mais décrivez ce que vous voulez obtenir. Par exemple, au lieu d’indiquer les coordonnées spécifiques de l’élément, vous décrivez ses propriétés: “Ce bouton doit être rouge, avoir des indentations 16px de tous les côtés et être au centre du conteneur.” Freimvorki comme React, Vue, Swiftui ou Jetpack composent simplement ce principe.

Pourquoi “Pixel Perfect” ne fonctionne pas avec un mile déclaratif pour de nombreux appareils

Imaginez que vous créez une application qui devrait être tout aussi bonne sur l’iPhone 15 Pro Max, Samsung Galaxy Fold, iPad Pro et une résolution 4K. Chacun de ces appareils a une résolution d’écran différente, une densité de pixels, des parties et des tailles physiques.

Lorsque vous utilisez l’approche déclarative, le système lui-même décide comment afficher votre interface décrite sur un appareil particulier, en tenant compte de tous ses paramètres. Vous définissez les règles et les dépendances, pas les coordonnées sévères.

* Adaptabilité et réactivité: L’objectif principal des miles déclaratifs est de créer des interfaces adaptatives et réactives . Cela signifie que votre interface doit s’adapter automatiquement à la taille et à l’orientation de l’écran sans se casser et maintenir la lisibilité. Si nous cherchions à «Pixel parfait» sur chaque appareil, nous devions créer d’innombrables options pour la même interface, ce qui nivellera complètement les avantages de l’approche déclarative.
* densité de pixels (dpi / ppi): Les appareils ont une densité de pixels différente. Le même élément avec la taille de 100 pixels “virtuels” sur un appareil à haute densité sera beaucoup plus petit que sur un dispositif à faible densité, si vous ne prenez pas en compte la mise à l’échelle. Les cadres déclaratifs sont résumés par des pixels physiques, en travaillant avec des unités logiques.
* Contenu dynamique: Le contenu dans les applications modernes est souvent dynamique – son volume et sa structure peuvent varier. Si nous détendions durement les pixels, tout changement de texte ou d’image entraînerait “l’effondrement” de la mise en page.
* diverses plates-formes: En plus de la variété des appareils, il existe différents systèmes d’exploitation (iOS, Android, Web, Desktop). Chaque plate-forme a sa propre conception, ses commandes standard et ses polices. Une tentative de faire une interface parfaite absolument identique et parfaite sur toutes les plates-formes conduirait à un type non naturel et à une mauvaise expérience utilisateur.

Les anciennes approches n’ont pas disparu, mais ont évolué

Il est important de comprendre que l’approche des interfaces n’est pas un choix binaire entre “impératif” et “déclaratif”. Historiquement, pour chaque plate-forme, il y avait ses propres outils et approches de la création d’interfaces.

* Fichiers d’interface natif: Pour iOS, c’était XIB / storyboards, pour les fichiers de marquage Android-XML. Ces fichiers sont une disposition WYSIWYG parfaite avec pixel, qui est ensuite affichée à la radio comme dans l’éditeur. Cette approche n’a disparu nulle part, elle continue de se développer, s’intégrant à des cadres déclaratifs modernes. Par exemple, Swiftui dans Apple et Jetpack composent dans Android se déroulent sur le chemin d’un code purement déclaratif, mais en même temps, a conservé l’opportunité d’utiliser une disposition classique.
* Solutions hybrides: Souvent dans les projets réels, une combinaison d’approches est utilisée. Par exemple, la structure de base de l’application peut être mise en œuvre de manière déclarative et, pour un positionnement précis des éléments, des méthodes impératives de niveau inférieur peuvent être utilisées ou des composants natifs développés en tenant compte des spécificités de la plate-forme.

du monolithe à l’adaptabilité: comment l’évolution des appareils a formé un mile déclaratif

Le monde des interfaces numériques a subi d’énormes changements au cours des dernières décennies. Des ordinateurs stationnaires avec des permis fixes, nous sommes arrivés à l’ère de la croissance exponentielle de la variété des appareils utilisateur . Aujourd’hui, nos applications devraient fonctionner aussi bien sur:

* Smartphones de tous les facteurs de forme et tailles d’écran.
* tablettes avec leurs modes d’orientation uniques et un écran séparé.
* ordinateurs portables et ordinateurs de bureau avec divers permis de moniteurs.
* TVS et centres de médias , contrôlés à distance. Il est à noter que même pour les téléviseurs, dont les remarques peuvent être simples en tant que Apple TV Remote avec un minimum de boutons, ou vice versa, surchargée de nombreuses fonctions, les exigences modernes pour les interfaces sont telles que le code ne doit pas nécessiter une adaptation spécifique pour ces caractéristiques d’entrée. L’interface doit fonctionner “comme si elle-même”, sans une description supplémentaire de ce que “comment” interagir avec une télécommande spécifique.
* montres intelligentes et appareils portables avec des écrans minimalistes.
* Casques de réalité virtuelle (VR) , nécessitant une approche complètement nouvelle d’une interface spatiale.
* Dispositifs de réalité augmentés (AR) , appliquant des informations sur le monde réel.
* Informations automobiles et systèmes de divertissement .
* Et même appareils ménagers : des réfrigérateurs avec des écrans sensoriels et des machines à laver avec des écrans interactifs aux fours et systèmes intelligents de la maison intelligente.

Chacun de ces appareils a ses propres fonctionnalités uniques: dimensions physiques, rapport des parties, densité de pixels, méthodes d’entrée (écran tactile, souris, contrôleurs, gestes, commandes vocales) et, surtout, les subtilités de l’environnement utilisateur . Par exemple, un VR Shlesh nécessite une immersion profonde, et un travail rapide et intuitif pour les smartphones en déplacement, tandis que l’interface du réfrigérateur doit être aussi simple et grande pour une navigation rapide.

Approche classique: le fardeau de soutenir les interfaces individuelles

À l’ère de la domination des ordinateurs de bureau et des premiers appareils mobiles, l’activité habituelle était la création et la prise en charge de de fichiers d’interface individuels ou même un code d’interface complètement séparé pour chaque plate-forme .

* Développement sous iOS nécessite souvent l’utilisation de storyboards ou de fichiers XIB dans Xcode, en écrivant du code sur objectif-c ou Swift.
* Pour Android Les fichiers de marquage XML et le code sur Java ou Kotlin ont été créés.
* Les interfaces Web activées sur HTML / CSS / JavaScript.
* Pour les applications C ++ sur diverses plates-formes de bureau, leurs cadres et outils spécifiques ont été utilisés:
* Dans Windows il s’agissait de MFC (classes Microsoft Foundation), de l’API WIN32 avec des éléments de dessin manuel ou à l’aide de fichiers de ressources pour les fenêtres de dialogue et les éléments de contrôle.
* Le cacao (objectif-c / swift) ou l’ancienne API carbone pour le contrôle direct de l’interface graphique a été utilisé dans macOS .
* Dans Systems de type Linux / Unix , des bibliothèques comme GTK + ou QT ont souvent été utilisées, ce qui a fourni leur ensemble de widgets et de mécanismes pour créer des interfaces, souvent via des fichiers de marquage de type XML (par exemple, des fichiers .UI dans le concepteur QT) ou une création de logiciels directs d’éléments.

Cette approche a assuré un contrôle maximal sur chaque plate-forme, vous permettant de prendre en compte toutes ses caractéristiques spécifiques et ses éléments indigènes. Cependant, il a eu un énorme inconvénient: duplication des efforts et des coûts énormes de soutien . Le moindre changement de conception ou de fonctionnalité a nécessité l’introduction d’un droit à plusieurs bases de code indépendantes, en fait. Cela s’est transformé en un vrai cauchemar pour les équipes de développeurs, ralentissant la sortie des nouvelles fonctions et augmentant la probabilité d’erreurs.

Miles déclaratifs: une seule langue pour la diversité

C’est en réponse à cette complication rapide que les miles déclaratifs sont apparus comme le paradigme dominant. Les framws comme react, vue, swiftui, jetpack compose et d’autres ne sont pas seulement une nouvelle façon d’écrire du code, mais un changement fondamental dans la pensée.

L’idée principale de l’approche déclarative : Au lieu de dire que le système «comment» de dessiner chaque élément (impératif), nous décrivons «ce que« nous voulons voir (déclaratif). Nous définissons les propriétés et l’état de l’interface, et le cadre décide comment l’afficher au mieux sur un appareil particulier.

Cela est devenu possible grâce aux principaux avantages suivants:

1. L’abstraction des détails de la plate-forme: Les Fraimvorki déclaratifs sont spécialement conçus pour oublier les détails de bas niveau de chaque plate-forme. Le développeur décrit les composants et leurs relations à un niveau d’abstraction plus élevé, en utilisant un seul code transféré.
2. Adaptation et réactivité automatique: Freimvorki assumez la responsabilité de la mise à l’échelle automatique, de la mise en page et de l’adaptation des éléments en différentes tailles d’écrans, de densité de pixels et de méthodes d’entrée. Ceci est réalisé grâce à l’utilisation de systèmes de disposition flexibles, tels que Flexbox ou Grid, et des concepts similaires aux “pixels logiques” ou “DP”.
3. Cohérence de l’expérience utilisateur: Malgré les différences externes, l’approche déclarative vous permet de maintenir une seule logique de comportement et d’interaction dans toute la famille des appareils. Cela simplifie le processus de test et offre une expérience utilisateur plus prévisible.
4. Accélération du développement et réduction des coûts: Avec le même code capable de travailler sur de nombreuses plateformes, est considérablement réduit par le temps et le coût de développement et de soutien . Les équipes peuvent se concentrer sur la fonctionnalité et la conception, et non sur la réécriture répétée de la même interface.
5. Prépité pour l’avenir: La capacité de résumer des spécificités des appareils actuels rend le code déclaratif plus plus résistant à l’émergence de nouveaux types de dispositifs et de facteurs de forme . Freimvorki peut être mis à jour pour prendre en charge les nouvelles technologies, et votre code déjà écrit recevra ce support relativement transparent.

Conclusion

Le mile déclaratif n’est pas seulement une tendance de la mode, mais l’étape évolutive nécessaire causée par le développement rapide des appareils utilisateur, y compris la sphère l’Internet des objets (IoT) et les appareils de ménage intelligents. Il permet aux développeurs et aux concepteurs de créer des interfaces complexes, adaptatives et uniformes, sans se noyer dans des implémentations spécifiques sans fin pour chaque plate-forme. La transition du contrôle impératif de chaque pixel à la description déclarative de l’état souhaité est une reconnaissance que dans le monde des futures interfaces devrait être flexible, transféré et intuitif quel que soit l’écran qu’ils sont affichés.

Les programmeurs, les concepteurs et les utilisateurs doivent apprendre à vivre dans ce nouveau monde. Les détails supplémentaires du Pixel Perfect, conçu pour un appareil ou une résolution particulière, conduisent à des coûts de temps inutiles pour le développement et le support. De plus, de telles dispositions sévères peuvent tout simplement ne pas fonctionner sur des appareils avec des interfaces non standard, telles que les téléviseurs d’entrée limités, les changements VR et AR, ainsi que d’autres appareils du futur, que nous ne connaissons même pas aujourd’hui. Flexibilité et adaptabilité – Ce sont les clés de la création d’interfaces réussies dans le monde moderne.

Pourquoi les programmeurs ne font-ils rien même avec les réseaux de neurones

Aujourd’hui, les réseaux de neurones sont utilisés partout. Les programmeurs les utilisent pour générer du code, expliquer d’autres solutions, automatiser les tâches de routine et même créer des applications entières à partir de zéro. Il semblerait que cela entraîne une augmentation de l’efficacité, réduisant les erreurs et l’accélération du développement. Mais la réalité est beaucoup plus prosaïque: beaucoup ne réussissent toujours pas. Les réseaux de neurones ne résolvent pas les problèmes clés – ils n’éclairent que la profondeur de l’ignorance.

Dépendance complète sur LLM au lieu de comprendre

La raison principale est que de nombreux développeurs comptent complètement sur LLM, ignorant la nécessité d’une compréhension approfondie des outils avec lesquels ils travaillent. Au lieu d’étudier la documentation – une demande de chat. Au lieu d’analyser les raisons de l’erreur – copier la décision. Au lieu de solutions architecturales – la génération de composants selon la description. Tout cela peut fonctionner à un niveau superficiel, mais dès qu’une tâche non standard survient, l’intégration avec un vrai projet ou le besoin d’un réglage fin est nécessaire, tout s’effondre.

manque de contexte et pratiques obsolètes

Les réseaux de neurones génèrent le code généralisé. Ils ne prennent pas en compte les spécificités de votre plate-forme, de votre version des bibliothèques, des restrictions environnementales ou des solutions architecturales du projet. Ce qui est généré semble souvent plausible, mais n’a rien à voir avec le code réel et pris en charge. Même des recommandations simples peuvent ne pas fonctionner si elles appartiennent à la version obsolète du cadre ou utilisent des approches qui ont longtemps été reconnues comme inefficaces ou dangereuses. Les modèles ne comprennent pas le contexte – ils dépendent des statistiques. Cela signifie que les erreurs et les antipattères, populaires en code ouvert, seront reproduits encore et encore.

Redondance, inefficacité et manque de profilage

L’IA générée par le code est souvent redondante. Il comprend des dépendances inutiles, des doublons la logique, ajoute des abstractions inutilement. Il s’avère une structure lourde inefficace qui est difficile à soutenir. Ceci est particulièrement aigu dans le développement mobile, où la taille du gang, le temps de réponse et la consommation d’énergie sont essentielles.

Le réseau neuronal ne mène pas le profilage, ne prend pas en compte les restrictions du CPU et du GPU, ne se soucie pas des fuites de mémoire. Il n’analyse pas l’efficacité du code en pratique. L’optimisation est toujours faite à la main, nécessitant une analyse et un examen. Sans cela, l’application devient lente, instable et à forte intensité de ressources, même si elle semble «correcte» du point de vue de la structure.

Vulnérabilité et menace pour la sécurité

N’oubliez pas la sécurité. Il existe déjà des cas connus lorsque les projets sont partiellement ou entièrement créés à l’aide de LLM ont été piratés avec succès. Les raisons sont typiques: l’utilisation de fonctions dangereuses, le manque de vérification des données d’entrée, les erreurs dans la logique de l’autorisation, la fuite à travers des dépendances externes. Le réseau neuronal peut générer un code vulnérable simplement parce qu’il a été trouvé dans les référentiels ouverts. Sans la participation de spécialistes de la sécurité et une révision complète, de telles erreurs deviennent facilement des points d’entrée pour les attaques.

La loi est Pareto et l’essence des défauts

La loi de Pareto travaille clairement avec les réseaux de neurones: 80% du résultat est obtenu en raison de 20% des efforts. Le modèle peut générer une grande quantité de code, créer la base du projet, répartir la structure, organiser des types, connecter les modules. Cependant, tout cela peut être dépassé, incompatible avec les versions actuelles des bibliothèques ou des cadres, et nécessite une révision manuelle importante. L’automatisation ici fonctionne plutôt comme un projet qui doit être vérifié, traité et adapté à des réalités spécifiques du projet.

Optimisme de mise en garde

Néanmoins, l’avenir semble encourageant. Mise à jour constante des ensembles de données de formation, intégration avec la documentation actuelle, vérification de l’architecture automatisée, conformité à la conception et aux modèles de sécurité – tout cela peut radicalement modifier les règles du jeu. Peut-être que dans quelques années, nous pouvons vraiment écrire le code plus rapidement, plus sûr et plus efficacement, en nous appuyant sur LLM en tant que co-auteur technique. Mais pour l’instant – hélas – il faut vérifier, réécrit et modifié manuellement.

Les réseaux de neurones sont un outil puissant. Mais pour qu’il travaille pour vous, et non contre vous, vous avez besoin d’une base, de la pensée critique et de la volonté de prendre le contrôle à tout moment.

Windows prototype de Gingerrita

Je présente à votre éditeur de texte Kate Fork Kate appelé Gingerrita. Pourquoi Fork, pourquoi, quel est l’objectif? Je veux ajouter la fonctionnalité dont j’ai besoin dans mon travail, afin de ne pas attendre la correction, d’ajouter des fonctionnalités de l’équipe Kate ou de l’adoption de mes corrections à la branche principale.
Pour le moment, une version prototype de Windows est actuellement disponible, presque vanille de Kate avec des modifications minimales. Pour Gingerita, j’ai développé deux plugs – une image des images directement de l’éditeur et du navigateur intégré, pour déboguer mes projets Web ou pour interagir avec l’IA avec des assistants tels que ChatGpt.

La version de Windows peut être testée par le lien ci-dessous:
https://github.com/demensdeum/Gingerita/releases/tag/prototype

Prise en charge des produits Demensdeum

Bienvenue sur la page d’assistance!

Si vous avez des questions, des problèmes avec les produits Demensdeum ou si vous souhaitez offrir des améliorations, nous sommes toujours prêts à vous aider.

Comment nous contacter:
support@demensdeum.com

Nous essayons de répondre aux appels dans les 3 à 5 jours ouvrables.

Quoi indiquer dans la lettre:

Le nom du produit
Version (si connu)
Une description détaillée du problème
Captures d’écran ou vidéos (si possible)
Dispositif et système d’exploitation sur lequel le problème s’est posé

Nous vous remercions pour l’utilisation de nos produits et nous nous efforçons de rendre votre expérience aussi pratique et agréable que possible.

Sincèrement,
Équipe Demensdeum

Astuces de core de vibration: pourquoi LLM ne fonctionne toujours pas avec un solide, sec et propre

Avec le développement de modèles de grandes langues (LLM), tels que Chatgpt, de plus en plus de développeurs les utilisent pour générer du code, une architecture de conception et une intégration accélérée. Cependant, avec une application pratique, elle devient perceptible: les principes classiques de l’architecture – solide, sec, propre – s’entendent mal avec les particularités de la codgendation LLM.

Cela ne signifie pas que les principes sont obsolètes – au contraire, ils fonctionnent parfaitement avec le développement manuel. Mais avec LLM, l’approche doit être adaptée.

Pourquoi LLM ne peut pas faire face aux principes architecturaux

Encapsulation

L’incapsulation nécessite de comprendre les frontières entre parties du système, des connaissances sur les intentions du développeur, ainsi que des restrictions d’accès strictes. LLM simplifie souvent la structure, rend les champs publics sans raison ou dupliquent la mise en œuvre. Cela rend le code plus vulnérable aux erreurs et viole les limites architecturales.

Résumé et interfaces

Les modèles de conception, tels qu’une usine abstraite ou une stratégie, nécessitent une vision holistique du système et la compréhension de sa dynamique. Les modèles peuvent créer une interface sans objectif clair sans assurer sa mise en œuvre ou violer la connexion entre les couches. Le résultat est une architecture excessive ou non fonctionnelle.

sec (donolt répétez-vous)

LLM ne cherchez pas à minimiser le code de répétition – au contraire, il leur est plus facile de dupliquer des blocs que de faire une logique générale. Bien qu’ils puissent offrir une refactorisation sur demande, par défaut, les modèles ont tendance à générer des fragments «auto-suffisants», même si cela conduit à une redondance.

Architecture propre

Clean implique une hiérarchie stricte, une indépendance des cadres, une dépendance dirigée et une connectivité minimale entre les couches. La génération d’une telle structure nécessite une compréhension globale du système – et du travail LLM au niveau de la probabilité de mots, et non de l’intégrité architecturale. Par conséquent, le code est mitigé, avec violation des directions de dépendance et une division simplifiée en niveaux.

ce qui fonctionne mieux lorsque vous travaillez avec LLM


Mouillé au lieu de sec
L’approche humide (écrivez tout deux fois) est plus pratique pour travailler avec LLM. La duplication du code ne nécessite pas de contexte du modèle de rétention, ce qui signifie que le résultat est prévisible et est plus facile à corriger correctement. Il réduit également la probabilité de connexions et de bogues non évidents.

De plus, la duplication aide à compenser la mémoire courte du modèle: si un certain fragment de logique se trouve à plusieurs endroits, LLM est plus susceptible de le prendre en compte avec une génération plus approfondie. Cela simplifie l’accompagnement et augmente la résistance à “l’oubli”.

Structures simples au lieu de l’encapsulation

Éviter l’encapsulation complexe et s’appuyer sur la transmission directe des données entre les parties du code, vous pouvez considérablement simplifier à la fois la génération et le débogage. Cela est particulièrement vrai avec un développement itératif rapide ou une création de MVP.

Architecture simplifiée

Une structure simple et plate du projet avec une quantité minimale de dépendances et d’abstractions donne un résultat plus stable pendant la génération. Le modèle adapte un tel code plus facile et moins souvent viole les connexions attendues entre les composants.

Intégration du SDK – fiable manuellement

La plupart des modèles linguistiques sont formés sur des versions obsolètes de la documentation. Par conséquent, lors de la génération d’instructions pour l’installation du SDK, les erreurs apparaissent souvent: commandes obsolètes, paramètres non pertinents ou liens vers des ressources inaccessibles. La pratique montre: il est préférable d’utiliser la documentation officielle et le réglage manuel, laissant LLM un rôle auxiliaire – par exemple, générer un code de modèle ou une adaptation des configurations.

Pourquoi les principes fonctionnent-ils toujours – mais avec le développement manuel

Il est important de comprendre que les difficultés de solides, sèches et propres concernent la codhégénération par LLM. Lorsque le développeur écrit le code manuellement, ces principes continuent de démontrer leur valeur: ils réduisent la connectivité, simplifient le soutien, augmentent la lisibilité et la flexibilité du projet.

Cela est dû au fait que la pensée humaine est sujette à la généralisation. Nous recherchons des modèles, nous apportons une logique répétitive dans des entités individuelles, créons des modèles. Ce comportement a probablement des racines évolutives: la réduction de la quantité d’informations permet d’économiser des ressources cognitives.

LLM agit différemment: ils ne ressentent pas de charges du volume de données et ne visent pas d’économies. Au contraire, il leur est plus facile de travailler avec des informations fragmentées en double que de construire et de maintenir des abstractions complexes. C’est pourquoi il leur est plus facile de faire face au code sans encapsulation, avec des structures répétitives et une gravité architecturale minimale.

Conclusion

Les modèles de grandes langues sont un outil utile en développement, en particulier dans les premiers stades ou lors de la création d’un code auxiliaire. Mais il est important de s’adapter à l’approche: pour simplifier l’architecture, limiter l’abstraction, éviter les dépendances complexes et ne pas compter sur eux lors de la configuration du SDK.

Les principes du solide, du sec et de la propreté sont toujours pertinents, mais ils donnent le meilleur effet entre les mains d’une personne. Lorsque vous travaillez avec LLM, il est raisonnable d’utiliser un style simplifié et pratique qui vous permet d’obtenir un code fiable et compréhensible qui est facile à finaliser manuellement. Et où LLM oublie – la duplication du code l’aide à se souvenir.

Demens TV Heads NFT

Je veux partager ma nouvelle collection NFT «Demens TV Heads».

Il s’agit d’une série d’œuvres d’art numériques, ils reflètent des personnes de personnages et de professions différents, dans le style du logo Demensdeum.
Le premier travail est féroce “Grozny” Il s’agit d’un auto-portrait stylisé.

Je prévois de libérer seulement 12 NFT, un chaque mois chaque mois.

Chaque travail existe non seulement dans la blockchain Ethereum, mais est également disponible sur le site Web Demensdeum et dans les routes GitHub, avec Metadan.

Si vous êtes intéressé, voyez ou évaluez simplement visuellement, je serai heureux:
https://opensea.io/collection/demens-tv-heads
https://github.com/demensdeum/demens-tv-heads-collection
https://demensdeum.com/collections/demens-tv-heads/fierce.png
https://demensdeum.com/collections/demens-tv-heads/fierce-metadata.txt

Super programmeur

Qui est-il – ce super programmeur mystérieux, éphémère, presque mythique? Une personne dont le code est compilé la première fois est lancée à partir de demi-tike et entre immédiatement dans le prod. La légende a transmis en octets de Senor à Jun. Celui qui écrit des bugs spécifiquement pour que les autres ne s’ennuient pas. Honnêtement, avec la chaleur et l’ironie, nous verrons quels superpuissances il doit avoir pour porter ce manteau numérique.

1. Écrit sur C / C ++ sans vulnérabilité unifiée
Débordement de tampon? Jamais entendu parler de cela.
Le super programmeur en C ++ n’a pas de variables gênantes – elles sont elles-mêmes initialisées à partir du respect. Il écrit un nouveau char [256], et le compilateur ajoute silencieusement un contrôle des frontières. Là où d’autres ont mis un point de rupture – il regarde. Et le bug disparaît.

2. Écrit les fiches sans bugs et tests
Il n’a pas besoin de tests. Son code se teste la nuit quand il dort (bien que … dort-il?). Toute ligne est une version stable finale, immédiatement avec le support de 12 langues et le niveau accessible de la NASA. Et si le bogue a toujours rencontré, alors l’univers le teste.

3. Cela fonctionne plus vite que l’IA
Alors que Chatgpt imprime «Quelle bonne question!», Le super programmeur a déjà verrouillé le nouveau système d’exploitation, l’a porté sur le grille-pain et a tout documenté dans Markdown avec des diagrammes. Il ne demande pas à Stackoverflow – il le soutient avec ses questions du futur. GPT étudie sur ses communautés.

4. Il comprend mieux le code de quelqu’un d’autre que l’auteur
“Bien sûr, je l’ai écrit … mais je ne comprends pas comment ça marche.” – un auteur ordinaire.
“Oh, cela est dû à l’appel récursif à la ligne 894, qui est lié à l’effet secondaire dans le filtre regex. Smart.” – Super programmeur sans clignoter.
Il lit Perl sur la première tentative, comprend les abréviations dans les noms des variables et les bugs capturent par vibration du curseur.

5. Écrit le code de la plate-forme croisée sur l’assembleur
Pourquoi écrire sur Rust, si possible sur Pure X86, ARM et RISC-V tout de suite, avec un drapeau “fonctionne partout”? Il a sa propre table des opodes. Même le processeur pense avant de gâcher ses instructions. Il n’optimise pas – il transcende.

6. Il répond aux questions sur les délais jusqu’à une seconde
“Quand sera-t-il prêt?”
“Après 2 heures, 17 minutes et 8 secondes. Et oui, cela prend en compte les insectes, une pause de fumée et une question philosophique dans le chat.”
Si quelqu’un demande à faire plus rapidement, il reconstruit simplement l’espace-temps via des jives.

7. Doches et réparation des cadres propriétaires
Le SDK propriétaire est tombé, API sans documentation, tout est chiffré par Base92 et toux de Segfault? Pour un super programmeur, c’est un mardi ordinaire. Il ouvrira un hex binaire, inhale, et une heure plus tard, il y aura un patch avec une correction, des améliorations des performances et un mode sombre ajouté.

8. Designer et spécialiste UX pour lui-même
L’interface utilisateur sort pour lui que les gens pleurent de beauté, et les boutons sont devinés par intuition. Même les chats se comportent – vérifié. Il ne dessine pas d’interface – il ouvre son essence intérieure, comme un sculpteur en marbre. Chaque presse est ravie.

9. mène des recherches marketing entre commits
Entre Git Push et le café, il parvient à collecter l’analyse du marché, à construire un entonnoir de vente et à repenser la stratégie de monétisation. Le week-end, teste les hypothèses. Il a des tests A / B est lancé automatiquement lorsqu’il ouvre un ordinateur portable.

10. Répondre Microsoft seul
Cela pour les sociétés de 10 ans et mille ingénieurs, pour lui – vendredi soir et bonne pizza. Windows 11? Windows 12. Office? Déjà là. Exceller? Il travaille sur la gestion des voix et aide à planifier des vacances. Tout fonctionne mieux et pèse moins.

11. Déplient et soutient les infrastructures pour 1 million d’utilisateurs
Son NAS fait maison est une calibre Kubernetes. Surveillance? Grafana avec des mèmes. Il déploie l’API plus rapidement que certains parviennent à ouvrir un facteur. Il a tout documenté, automatisé et de manière fiable comme une théière soviétique.

12. Le support technique n’est pas requis
Les utilisateurs n’en plaignent pas. Ils l’utilisent simplement avec révérence. FAQ? Pas nécessaire. Tutoriels? L’intuition le dira. Il est le seul développeur qui a le bouton “Aide” à la page de gratitude.

13. Il ne dort pas, ne mange pas, n’est pas distrait
Il se nourrit de caféine et d’un pur désir d’écrire un code. Au lieu de dormir, refactoring. Au lieu de manger – des forfaits Debian. Son cycle de vie est un cycle de développement continu. CI / CD n’est pas un pipeline, c’est un style de vie.

14. Communique avec les clients sans douleur
“Nous devons faire Uber, mais seulement mieux, dans deux jours.” – “Regardez: voici la feuille de route, voici les risques, voici le MVP. Et nous décidons d’abord des objectifs.”
Il sait dire non “afin que le client répond:” Merci, maintenant je comprends ce que je veux. ”

15. Programmes instantanément les réacteurs nucléaires
Combien de chaleur est libérée lorsque le noyau d’uranium est divisé? Le Super-Programmer le sait. Et il sait comment le voler dans Rust, C, Swift, même à Excel. Son réacteur n’est pas seulement sûr – il est également mis à jour par OTA.

16. A des connaissances dans tous les domaines possibles
Philosophie, physique, reportage fiscal de la Mongolie – tout dans sa tête. Il participe à des quiz, où il est un leader. S’il ne sait pas quelque chose, il a simplement éteint temporairement la mémoire pour faire de la place pour de nouvelles connaissances. Maintenant, il reviendra.

17. Connaît tous les algorithmes et les modèles de conception
Pas besoin de lui expliquer comment fonctionne un *, dijkstra ou singleton. Il est venu avec eux. Avec lui, les modèles se comportent correctement. Même les antipattères sont corrigées elles-mêmes – de la honte.

18. A travaillé à Apple, Google et en ennui gauche
Il était partout: Apple, Google, NASA, IKEA (testé l’interface de l’armoire). Ensuite, j’ai réalisé que c’était déjà trop bon et je suis allé développer des projets open source gratuits pour le plaisir. Il n’a pas besoin d’argent parce que:

19. Il a Pontid Bitcoin et il est Satoshi Nakamoto
Oui, c’est lui. Ne dit pas. Tous les portefeuilles avec des millions de BTC sont en fait sur son lecteur flash, mural en béton. En attendant, il écrit Backend pour une coopérative d’agriculteurs dans l’Outback, car “c’était intéressant d’essayer Kotlin Multiplateform”.

Conclusion: un peu de sérieux
En fait, les programmeurs sont des gens ordinaires.
Nous nous trompons. Nous sommes fatigués. Parfois, nous sommes tellement confiants en nous-mêmes que nous ne voyons pas l’évidence – et c’est alors que les erreurs les plus chères de l’histoire sont commises.

Par conséquent, il convient de se rappeler:

* Il est impossible de tout savoir – mais il est important de savoir où chercher.
* Travailler dans une équipe n’est pas une faiblesse, mais un chemin vers une meilleure décision.
* Les outils qui nous protègent ne sont pas des «béquilles», mais une armure.
* Demandez est normal. Douter est juste. Faire des erreurs est inévitable. L’apprentissage est nécessaire.
* L’ironie est notre bouclier. Le code est notre arme. La responsabilité est notre boussole.

Et les légendes sur un super-programmeur sont un rappel que nous nous efforçons parfois tous pour l’impossible. Et c’est précisément dans ce domaine de la magie de programmation.

Pourquoi la documentation est votre meilleur ami

(Et comment ne pas être un gourou dont les conseils cessent de travailler après la mise à jour)

“Les applications ne peuvent utiliser que des API publiques et doivent fonctionner sur le système d’exploitation actuellement expédié.” Lignes directrices sur la revue des applications Apple

Si vous avez déjà commencé à travailler avec un nouveau cadre et que vous vous êtes surpris à penser: “Maintenant, je comprendrai tout, la documentation est pour les alésages” – vous n’êtes certainement pas seul. De nombreux développeurs ont un instinct naturel: d’abord, et seulement alors – lisez. C’est bien.

Mais c’est à ce stade que vous pouvez facilement désactiver la bonne voie et vous retrouver dans une situation où le code fonctionne … mais seulement aujourd’hui, et seulement “j’ai”.

Pourquoi est-il facile de «le comprendre» – n’est-ce pas suffisant?

Freimvorki, en particulier fermé et propriétaire, est complexe et multi-réparties. Ils ont beaucoup de fonctionnalités de logique, d’optimisation et de mise en œuvre cachées, qui:

* Non documenté;
* non garanti;
* peut changer à tout moment;
* sont un secret commercial et peuvent être protégés par des brevets
* Contient des bugs, des défauts connues uniquement des développeurs du cadre.

Lorsque vous agissez “sur une intuition”, vous pouvez facilement construire une architecture dans des observations aléatoires, au lieu du support sur les règles clairement décrites. Cela conduit au fait que le code devient vulnérable aux mises à jour et aux cas de bord.

La documentation n’est pas une restriction, mais le support

Les développeurs de cadres créent des manuels pour une raison – il s’agit d’un accord entre vous et eux. Pendant que vous agissez dans le cadre de la documentation, ils promettent:

* stabilité;
* soutien;
* Comportement prévisible.

Si vous allez au-delà de ce cadre – tout ce qui se passe ensuite devient exclusivement votre responsabilité.

Expériences? Certainement. Mais dans le cadre des règles.
La curiosité est la super-via du développeur. Explorez, essayez les limites de test non standard – tout cela est nécessaire. Mais il y a un “mais” important:

Vous devez expérimenter dans le cadre de la documentation et des meilleures pratiques.

La documentation n’est pas une prison, mais une carte. Elle montre quelles opportunités sont vraiment planifiées et soutenues. Ce sont de telles expériences qui sont non seulement utiles, mais aussi sûres.

ATTENTION: Guru

Parfois, vous pouvez rencontrer de vrais “experts”:

* Ils organisent des cours
* Percer aux conférences,
* Écrivez des livres et des blogs,
* a partagé “leur approche” du cadre.

Mais même s’ils semblent convaincants, il est important de se rappeler:
Si leurs approches sont contraires à la documentation, elles sont instables.

Ces «modèles empiriques» peuvent:

* Travaillez uniquement sur une version spécifique du cadre;
* être vulnérable aux mises à jour;
* Break dans des situations imprévisibles.

Le gourou est cool lorsqu’ils respectent les manuels. Sinon, leurs conseils doivent être filtrés grâce à la documentation officielle.

un peu solide

Trois idées de principes solides sont particulièrement pertinents ici:

* Principe ouvert / fermé: élargir le comportement via une API publique, n’entrez pas à l’intérieur.
* Principe de la substance Liskov: ne comptez pas sur la mise en œuvre, comptez sur le contrat. Troubles – Tout va se casser lors du remplacement de la mise en œuvre.
* Inversion de dépendance: les modules de niveau élevé ne doivent pas dépendre de modules de niveau bas. Les deux types devraient dépendre d’abstractions. L’abstraction ne devrait pas dépendre des détails. Les détails devraient dépendre d’abstractions.

Qu’est-ce que cela signifie dans la pratique? Si vous utilisez un cadre et directement lié à ses détails internes – vous violez ce principe.
Au lieu de cela, vous devez renforcer la dépendance à l’égard des interfaces publiques, des protocoles et des contrats que le cadre soutient officiellement. Cela donne:

* La meilleure isolement de votre code à partir des modifications du cadre;
* La capacité de tester et de remplacer facilement les dépendances;
* Comportement prévisible et stabilité de l’architecture.

Lorsque votre code dépend des détails et non des abstractions, vous vous intégrez littéralement dans une implémentation spécifique qui peut disparaître ou changer à tout moment.

et si le bug?

Parfois, il arrive que vous ayez tout fait correctement, mais cela fonctionne mal. Cela se produit – les cadres ne sont pas parfaits. Dans ce cas:

* Rassemblez un exemple minimum reproduit.
* Assurez-vous d’utiliser uniquement l’API documentée.
* Envoyer un bug-port-ils vous comprendront certainement et, très probablement, vous aideront.

Si l’exemple est construit sur des hacks ou des contournements, les développeurs ne sont pas tenus de le soutenir, et très probablement votre cas manquera simplement.

comment serrer le maximum du cadre

* Lisez la documentation. Sérieusement.
* Suivez les guides et recommandations des auteurs.
* Expérience – mais dans le décrit.
* Vérifiez les conseils (même les haut-parleurs les plus célèbres!) À travers le manuel.
* Pliez des insectes avec un minimum de cas et du respect du contrat.

Conclusion

Freimvorki ne sont pas des boîtes noires, mais des outils qui ont les règles d’utilisation. Les ignorer signifie écrire le code “au hasard”. Mais nous voulons que notre code vive pendant longtemps, ravit les utilisateurs et ne se détache pas de la mise à jour mineure.

Donc: faites confiance, mais vérifiez. Et oui, lisez les manuels. Ils sont votre superpuissance.

Sources

https://developer.apple.com/app-store/review/guidelines/
https://en.wikipedia.org/wiki/SOLID
https://en.wikipedia.org/wiki/API
https://en.wikipedia.org/wiki/RTFM

Cube Art Project 2

Meet – Cube Art Project 2

La deuxième version de l’éditeur de station, entièrement réécrite sur Pure JavaScript sans WebAssembly.
Léger, rapide et commence directement dans le navigateur – rien de plus.

Ceci est une expérience: cubes, couleur, liberté et une petite géométrie 3D méditative.
Vous pouvez modifier les couleurs à l’aide de RVB-Sloders, Enregistrer et charger des scènes, se déplacer dans l’espace et simplement jouer.

Contrôle:
– wasd – déplacer la caméra
– Mouse – Rotation
– GUI – Paramètres de couleur

En ligne:
https://demensdeum.com/software/cube-art-project-2/

Sources sur github:
https://github.com/demensdeum/cube-art-project-2

Le projet est écrit sur Pure JavaScript en utilisant trois.js.
Sans frameworks, sans collectionneurs, sans webassembly – seulement Webgl, shaders et un peu d’amour pour la géométrie des pixels.

Les scènes peuvent être enregistrées et chargées – créez vos mondes, sauf en JSON, partagez ou retournez plus tard dans le raffinement.

Docker Safety: Pourquoi le lancement de Root est-il une mauvaise idée

Docker est devenu un outil indispensable dans les DevOps et le développement modernes. Il vous permet d’isoler l’encerclement, de simplifier la tenue et de mettre à l’échelle rapidement les applications. Cependant, par défaut, Docker a besoin d’une racine, ce qui crée une zone potentiellement dangereuse, qui est souvent ignorée dans les premiers stades.

Pourquoi Docker fonctionne-t-il à Root?

Docker utilise les capacités du Linux: CGroups, des espaces de noms, des iptables, du mont, de la mise en réseau et d’autres fonctions système. Ces opérations ne sont disponibles que pour le super utilisateur.

C’est pourquoi:
* Dockerd Demon commence à partir de la racine,
* Les commandes Docker sont transmises à ce démon.

Cela simplifie le travail et donne un contrôle total sur le système, mais en même temps, il ouvre des vulnérabilités potentielles.

Pourquoi est-il dangereux: Breakout de conteneurs, CVE, RCE

Breakout de conteneur

Avec une isolation faible, un attaquant peut utiliser Chroot ou Pivot_Root pour entrer l’hôte.

Exemples d’attaques réelles:

* CVE-2019-5736-Vulnérabilité à Runc, autorisé à réécrire l’application et à exécuter le code sur l’hôte.
* CVE-2021-3156-Vulnérabilité à Sudo, autorisé à obtenir une racine à l’intérieur du conteneur et à sortir.

RCE (exécution de code distant)

Si l’application dans le conteneur est vulnérable et commence à partir de root, RCE = contrôle complet sur l’hôte.

docker sans racine: solution du problème

Pour minimiser ces risques, le mode sans racine est apparu dans Docker. Dans ce mode, le démon et les conteneurs sont lancés au nom de l’utilisateur habituel, sans aucune privialité racine. Cela signifie que même si un attaquant reçoit le contrôle du conteneur, il ne pourra pas nuire au système hôte.
Il y a des restrictions: vous ne pouvez pas utiliser les ports inférieurs à 1024 (par exemple, 80 et 443), le mode priviled, ainsi que certains modes de réseau, n’est pas disponible. Cependant, dans la plupart des scénarios de développement et Docker sans racine CI / CD, il fait face à sa tâche et augmente considérablement le niveau de sécurité.

Historiquement, lancez à partir de Root – Antipattern

Dès le début, le principe des plus petits privilèges a été appliqué dans le monde Unix / Linux. Moins les droits du processus sont moins élevés, moins il peut faire de mal. Docker a initialement exigé un accès root, mais aujourd’hui, il est considéré comme une menace potentielle.

Sources

https://docs.docker.com/engine/security/rootless/
https://rootlesscontaine.rs/

Le problème non évident des conteneurs Docker: Vulnérabilités cachées

Le problème non évident des conteneurs Docker: Vulnérabilités cachées

Qu’est-ce que “Enfer endensky” (DH)?

“Dependency Hell” (DH) est un terme indiquant un problème qui se pose lors de la gestion des dépendances dans le logiciel. Ses principales raisons sont dans le conflit de versions, les difficultés d’intégrer diverses bibliothèques et la nécessité de maintenir la compatibilité entre eux. DH comprend les aspects suivants:

– Conflits de versions: les projets nécessitent souvent des versions spécifiques de bibliothèques, et les différents composants peuvent dépendre de versions incompatibles de la même bibliothèque.
– Difficultés de mises à jour: la mise à jour des dépendances peut entraîner des erreurs inattendues ou une rupture de compatibilité, même si une nouvelle version contient des corrections ou des améliorations.
– L’environnement: Le désir d’isoler et de stabiliser l’environnement a conduit à l’utilisation d’environnements virtuels, de conteneurisation et d’autres solutions visant à simplifier la gestion de la dépendance.

Il est important de noter que bien que l’élimination des vulnérabilités soit l’une des raisons de la publication des versions mises à jour des bibliothèques, ce n’est pas la principale force motrice de DH. Le principal problème est que chaque changement – qu’il s’agisse de corriger les bogues, d’ajouter une nouvelle fonctionnalité ou d’éliminer la vulnérabilité – peut provoquer une chaîne de dépendances qui compliquent le développement stable et le support de l’application.

Comment la lutte contre DH a-t-elle conduit à la création de Docker?

Dans une tentative de résoudre les problèmes DH, les développeurs cherchaient des moyens de créer un environnement isolé et stable pour les applications. Docker a été une réponse à ce défi. La conteneurisation permet:

– Isoler l’environnement: toutes les dépendances et bibliothèques sont emballées avec l’application, qui garantit un travail stable partout où Docker est installé.
– Simplifier le déploiement: le développeur peut une fois configurer l’environnement et l’utiliser pour se déployer sur des serveurs sans paramètres supplémentaires.
– Minimiser les conflits: Étant donné que chaque application fonctionne dans son propre conteneur, le risque de conflits entre les dépendances de divers projets est considérablement réduit.

Ainsi, Docker a proposé une solution efficace pour lutter contre le problème DH, permettant aux développeurs de se concentrer sur la logique de l’application et non sur les difficultés de configuration de l’environnement.

Le problème des dépendances obsolètes dans Docker

Malgré tous les avantages de Docker, une nouvelle direction des problèmes est apparue – l’obsolescence des dépendances. Cela se produit pour plusieurs raisons:

1. Le conteneur se fige dans le temps

Lors de la création d’une image Docker, un certain état de tous les packages et bibliothèques est corrigé. Même si après assemblage dans l’image de base (par exemple, `Ubuntu: 04.20,` Python: 3.9`, `Node: 18-Alpine`), des vulnérabilités sont trouvées ou de nouvelles versions sont produites, le conteneur continue de fonctionner avec les versions initialement installées. Si l’image ne doit pas être envoyée, l’application peut fonctionner avec des composants obsolètes et potentiellement vulnérables pendant des années.

2. Manque de mises à jour automatiques

Contrairement aux serveurs traditionnels, où vous pouvez configurer la mise à jour des packages automatiques via les gestionnaires système (par exemple, `APT Updgrade` ou« NPM Update »), les conteneurs ne sont pas mis à jour automatiquement. La mise à jour ne se produit que lors de l’élection de l’image, qui nécessite une discipline et un contrôle régulier.

3. Dépendances fixes

Pour garantir la stabilité, les développeurs corrigent souvent la version des dépendances dans des fichiers comme `redirements.txt` ou« package.json`. Cette approche empêche les changements inattendus, mais gèle en même temps l’état des dépendances, même si des erreurs ou une vulnérabilité sont détectées par la suite.

4. en utilisant des images de base obsolètes

Les images de base sélectionnées pour les conteneurs peuvent également être obsolètes au fil du temps. Par exemple, si l’application est construite sur l’image de «Node: 16», et que les développeurs sont déjà passés au «nœud: 18» en raison d’améliorations et de corrections, votre environnement restera avec une version obsolète, même si tout fonctionne correctement à l’intérieur du code.

Comment éviter les problèmes de dépendances obsolètes?

Inclure des inspections régulières pour les dépendances et vulnérabilités obsolètes dans le processus CI / CD:

– pour Python:

pip list --outdated

– pour node.js:

npm outdated

– Utilisez des outils pour analyser les vulnérabilités, par exemple, «TRIVY»:

trivy image my-app

Surveillez les mises à jour des images de base

Abonnez-vous aux mises à jour des images de base dans Docker Hub ou des référentiels correspondants sur GitHub afin de découvrir en temps opportun les corrections et les mises à jour critiques.

Conclusion

Le problème de l’enfer de dépendance est survenu non seulement en raison de la nécessité d’éliminer la vulnérabilité, mais aussi en raison de difficultés à gérer et à mettre à jour les dépendances. Docker a proposé une solution efficace pour lutter contre la DH, fournissant un environnement isolé et stable pour les applications. Cependant, avec l’avènement de la conteneurisation, une nouvelle tâche est survenue – la nécessité d’un renouvellement régulier des images afin d’empêcher l’obsolescence des dépendances et l’apparition d’une vulnérabilité critique.

Il est important pour les spécialistes modernes de DevOps non seulement de résoudre les problèmes de conflits de versions, mais aussi d’introduire régulièrement et automatisé les pratiques de contrôle pour la pertinence des dépendances afin que les conteneurs restent sûrs et efficaces.

Modèle du générateur: en phase de création d’un objet dans le temps

Introduction

Le dernier article a examiné le cas général de l’utilisation du motif du constructeur, mais l’option n’a pas été touchée lorsque l’objet est créé par étapes dans le temps.
Builder Pattern (Builder) est un modèle de conception générateur qui vous permet de créer progressivement des objets complexes. Il est particulièrement utile lorsque l’objet a de nombreux paramètres ou diverses configurations. L’un des exemples intéressants de son utilisation est la possibilité de séparer le processus de création d’un objet dans le temps.
Parfois, l’objet ne peut pas être créé immédiatement – ses paramètres peuvent être connus à différentes étapes du programme.

Un exemple sur Python

Dans cet exemple, l’objet de la voiture est créé par étapes: d’abord, une partie des données est chargée à partir du serveur, puis l’utilisateur entre les informations manquantes.

import requests

def fetch_car_data():
    response = requests.get("https://api.example.com/car-info")
    return response.json()

builder = CarBuilder()

# Backend API data
car_data = fetch_car_data()
builder.set_model(car_data["model"])
builder.set_year(car_data["year"])

# User input
color = input("Car color: ")
builder.set_color(color)

gps_option = input("GPS feature? (yes/no): ").lower() == "yes"
builder.set_gps(gps_option)

car = builder.build()
print(car)

Imaginez un appel API, la saisie de données se produit dans différentes parties de l’application, ou même dans différentes bibliothèques. Ensuite, l’utilisation du motif du constructeur devient plus évidente que dans un exemple simple ci-dessus.

Avantages

– La sortie est une structure immunitaire qui n’a pas besoin de stocker des données facultatives pour l’assemblage temporaire
– L’objet est collecté progressivement
– Éviter des concepteurs complexes
– Le code d’assemblage de l’objet n’est pas incompétent uniquement dans une essence de constructeur
– commodité de comprendre le code

Sources

https://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional-ebook/dp/B000SEIBB8
https://demensdeum.com/blog/2019/09/23/builder-pattern/

Défi de codage Demensdeum # 1

Commencer Demensdeum Coding Challenge # 1
Prix ​​100 USDT
1. Nous devons écrire des photos de rendu pour Windows 11 64 bits
2. Rendre
https://demensdeum.com/logo/demens1.png
3. L’image doit être intégrée dans l’application
4. API graphique – Direct3d ou DirectDraw
5. gagne que la demande s’est avérée être la plus petite taille en octets
6. L’image doit être de 1 sur 1 positif comme original, enregistrez les couleurs
7. Tous les langues / camers ne nécessitent pas d’installation supplémentaire -> afin que vous puissiez démarrer immédiatement à partir de l’application. Par exemple, si la solution n’est qu’un seul script Python, une telle solution ne convient pas. L’installation de Python, Pygame et lancement manuellement sont nécessaires. Bon exemple: script python enveloppé avec Python et Pygame dans EXE, qui démarre sans installations supplémentaires.
8. Donnez sous la forme d’un lien vers un référentiel public avec le code source, des instructions pour assembler l’application. Bon exemple: un projet avec les instructions d’assemblage de Visual Studio Community Edition

Date limite: le 1er juin résumant le concours

Solution de référence sur zig + sdl3 + sdl3_image:
https://github.com/demensdeum/DemensDeum-Coding-Challenge-1

Contacts fantômes

Dans l’application GhostContacts, vous pouvez ajouter des contacts à la liste secrète, il y a une prise en charge des sujets sombres et brillants, de la localisation, de l’exportation et des importations de contacts CSV, un mot de passe d’urgence est pris en charge pour réinitialiser la liste des contacts si l’utilisateur nécessite soudainement un mot de passe régulier pour entrer.

Application en ligne:
https://demensdeum.com/software/ghost-contacts/

Github:
https://github.com/demensdeum/GhostContacts

Pourquoi j’ai choisi WordPress

Lorsque j’ai commencé à réfléchir à la création de mon propre blog en 2015, j’ai été confronté à la question : quelle plateforme choisir ? Après de nombreuses recherches et comparaisons, j’ai opté pour WordPress. Ce choix n’est pas le fruit du hasard, mais le résultat d’une analyse des capacités de la plateforme, de ses avantages et de ses inconvénients. Aujourd’hui, j’aimerais partager mes réflexions et mon expérience avec WordPress.

Avantages de WordPress

  • Facilité d’utilisation
    L’une des principales raisons pour lesquelles j’ai choisi WordPress est son interface intuitive. Même si vous n’avez jamais travaillé avec un CMS auparavant, vous pouvez maîtriser WordPress en quelques jours.
  • Un grand nombre de plugins
    WordPress donne accès à des milliers de plugins gratuits et payants. Ces extensions vous permettent d’ajouter presque toutes les fonctionnalités liées au blogging, de l’optimisation SEO à l’intégration des médias sociaux.
  • Évolutivité
    WordPress est idéal pour les blogs de toutes tailles. Ayant commencé avec un simple blog personnel, je sais que je peux facilement le développer en ajoutant de nouvelles fonctionnalités et capacités.
  • Large choix de sujets
    Il existe un grand nombre de thèmes gratuits et payants disponibles sur WordPress qui vous permettront de créer un blog de très belle apparence en peu de temps. Créer un design personnalisé nécessite la main sensible d’un designer.
  • Optimisé pour le référencement
    WordPress est conçu pour être convivial pour les moteurs de recherche. Avec des plugins comme Yoast SEO, vous pouvez facilement optimiser votre contenu pour améliorer son classement dans les recherches.
  • Communauté et support
    WordPress possède l’une des plus grandes communautés au monde. Si vous rencontrez un problème, vous trouverez presque certainement une solution sur les forums ou blogs dédiés à la plateforme.
  • Support multilingue
    Grâce à des plugins comme WPGlobus, je peux bloguer dans plusieurs langues, ce qui est particulièrement important lorsque l’on travaille avec un public de différents pays.

Inconvénients de WordPress

  • Vulnérabilité aux attaques
    La popularité de WordPress en fait une cible pour les pirates informatiques. Sans protection adéquate, un site peut devenir victime d’attaques. Cependant, des mises à jour régulières et l’installation de plugins de sécurité contribuent à minimiser les risques.
  • Dépendance du plugin
    Parfois, la fonctionnalité que vous souhaitez ajouter nécessite l’installation de plusieurs plugins. Cela peut ralentir votre blog et provoquer des conflits entre les extensions.
  • Problèmes de performances
    Sur les gros blogs, WordPress peut commencer à ralentir, surtout si vous utilisez beaucoup de plugins. Pour résoudre ce problème, vous devez optimiser la base de données, mettre en œuvre la mise en cache et utiliser un hébergement plus puissant.
  • Coût de certaines fonctions
    Alors que la version de base de WordPress est gratuite, de nombreux thèmes et plugins professionnels coûtent de l’argent. Parfois, il faut investir pour en tirer le meilleur parti.

Conclusion

WordPress est un outil qui offre l’équilibre parfait entre simplicité et puissance. Pour moi, ses avantages l’emportent sur ses inconvénients, surtout compte tenu du grand nombre de solutions pour les surmonter. Grâce à WordPress, j’ai pu créer un blog parfaitement adapté à mes besoins.

Wordex – programme de lecture rapide pour iOS

J’ai récemment trouvé une application de lecture rapide que j’aimerais vous recommander.

La lecture rapide est une compétence qui peut considérablement augmenter votre productivité, améliorer votre compréhension en lecture et gagner du temps. Il existe de nombreuses applications sur le marché qui promettent de vous aider à maîtriser cette compétence, mais celle qui se démarque est Wordex pour iOS. Dans cet article, nous vous expliquerons ce qu’est Wordex, quelles sont ses fonctionnalités, à qui il convient et pourquoi il mérite votre attention.

Qu’est-ce que Wordex ?

Wordex est une application iOS conçue spécifiquement pour développer des compétences en lecture rapide. Il aide les utilisateurs à lire les textes plus rapidement, à se concentrer sur les idées clés et à éviter les distractions. Le programme est basé sur des approches scientifiques et propose des outils pratiques pour améliorer votre vitesse de lecture.

Principales fonctionnalités de Wordex

  • Mode de lecture rapide : le texte est affiché de manière optimisée pour une compréhension rapide. Les utilisateurs peuvent ajuster la vitesse d’affichage du texte en fonction de leurs besoins.
  • Analyse des progrès : le programme fournit des statistiques détaillées, notamment la vitesse de lecture et la dynamique d’amélioration. Cela vous aide à évaluer vos progrès et à ajuster votre approche de la lecture.
  • Importer des textes : Wordex vous permet de télécharger vos propres textes pour vous entraîner. Vous pouvez lire des articles, des livres ou du matériel pédagogique directement dans l’application.
  • Interface intuitive : l’application est conçue dans un style minimaliste, ce qui la rend facile à utiliser. Même les débutants peuvent facilement comprendre la fonctionnalité.


Wordex Screenshot 1

À qui Wordex convient-il ?

Wordex est idéal pour :

  • Étudiants : qui ont besoin de lire rapidement du matériel d’étude et de se préparer aux examens.
  • Hommes d’affaires et employés de bureau : qui souhaitent traiter une grande quantité d’informations en un minimum de temps.
  • Lecteurs : qui souhaitent lire plus de livres et apprécier le processus.


Wordex Screenshot 2

Avantages de Wordex

  • Mobilité :Vous pouvez étudier n’importe où et n’importe quand grâce à l’application sur votre iPhone ou iPad.
  • Personnalisation :la possibilité de personnaliser l’affichage du texte en fonction de vos besoins.


Wordex Screenshot 3

Pourquoi devriez-vous essayer Wordex ?

Wordex n’est pas seulement un outil pour enseigner la lecture rapide. Il s’agit d’un programme qui développe la concentration, élargit le vocabulaire et augmente la productivité. Une fois que vous aurez essayé Wordex, vous remarquerez que la lecture ne sera plus une corvée et se transformera en une activité passionnante.

Conclusion

Si vous souhaitez apprendre la lecture rapide ou améliorer vos compétences existantes, Wordex est un excellent choix. Simple d’utilisation et efficace, l’application vous aidera à atteindre vos objectifs et à gagner un temps précieux. Téléchargez Wordex depuis l’App Store et commencez à vous entraîner dès aujourd’hui !

App Store :
https://apps.apple.com/us/app/speed-reading-book-reader-app/id1462633104