Le choix de la technologie, de l'architecture et du design dans les projets logiciels - sans espèces

Mes amis! Nous continuons une série de publications «sans coupures» sur les processus de conception, les technologies informatiques et comment travailler efficacement. Aujourd'hui, nous allons parler d'un sujet très sensible qui provoque des brûlures d'estomac dans le cerveau - le choix des technologies, des langages de programmation, le rôle des architectes, des analystes, des chefs d'équipe et des médiums pour résoudre le problème épique: lancer une solution logicielle, si possible, dans un délai raisonnable. Et nous nous attarderons séparément, pour ne pas vous ennuyer du tout, sur une analyse de la corrélation des tailles des parties du corps d'une partie de l'équipe avec la productivité du cerveau d'une autre. Versez du café et c'est parti!

Comment devenir des experts


Afin de comprendre objectivement pourquoi il n'y a toujours pas de clarté dans les problèmes indiqués et il y a tant de conflits «religieux» avec des sacrifices humains, vous devez être distrait, sourire et dessiner la vie d'un spécialiste informatique avec un couteau de cuisine sous la forme d'une ligne brisée sur une table avec des carrés qui signifient les connaissances acquises.


Le plaisir commence par le fait que, généralement, même dans les universités spécialisées, il n'y a pas suffisamment de connaissances pour la programmation professionnelle et la compétence d'un spécialiste dépend directement de la lutte mentale contre la paresse: prenez un livre / code pendant quelques heures ou dégringolez avec une canette de bière devant la télévision. De toute évidence, seule une petite partie est capable de résister aux réseaux sociaux, aux séries télévisées, aux jeux en ligne et d'apprendre de façon désintéressée, mais même si, comme les moines, ils sacrifient constamment et quotidiennement une partie de leur vie, ils peuvent facilement comprendre un, enfin, parfois deux langages de programmation industrielle et plusieurs technologies connexes. Et la moustache, la pension commence et tout en apicole pour planter des abeilles.

Mais avec une telle difficulté, les connaissances acquises pour réussir ne se révèlent pas encore suffisantes et une spécialisation constante dans les projets de développement est nécessaire, de préférence avec des délais infernaux, car les compétences en écriture immédiatement rapidement et correctement sont perdues très rapidement.

En conséquence, seuls quelques carrés peuvent être coupés avec un couteau, et plus à droite, moins de carrés, en règle générale, car des enfants naissent, des connaissances apparaissent, des passe-temps et je veux au moins vivre un peu au moins pour moi la nuit et enfin jouer au tanchiki, enfin.

Une analogie très compréhensible d'un expert en informatique, peut-être, est un spécialiste des arts martiaux qui, après l'école, a quitté Voronezh pour la Chine, a passé 10 ans dans un monastère, a rempli les doigts sur ses doigts de ses épaules, a coupé son épée génitale et s'entraîne pendant 20 heures par jour. Un combattant sera même sympa de connaître plusieurs dialectes chinois, mais un jour il rencontrera un gars à la peau sombre qui s'est consacré à la capoeira . Très probablement, au niveau des signes, ils se comprendront et pourront choisir la technologie pour le projet logiciel, mais, malheureusement, vous devez le plus souvent rencontrer des amateurs agressifs de cosplay et de science-fiction - dans un costume Jedi avec un sabre laser en plastique dans les mains.

Copier-coller, frameworks et science-fiction


De toute évidence, seuls quelques-uns peuvent étudier et apprendre la Vérité de façon si altruiste et dans la vie réelle, les rencontres et les différends concernant les technologies et les langages de programmation se produisent principalement entre les fans de «séries» différentes et à la mode, qui souvent ne connaissent pas la différence entre IP et TCP. Le problème est aggravé par un marketing agressif externe - la plupart des grands fournisseurs informatiques recrutent activement des adeptes dans leurs rangs en utilisant des canaux d'information accélérés. Vous n'avez pas besoin d'aller loin pour des exemples - Mozilla fait la promotion de Rust, Google fait la promotion de Go, Oracle est intéressé (?) et le datatatisme, pour beaucoup d'argent sont vendus ... des cours universitaires poussiéreux en théorie des probabilités, règle et statistiques pour toujours et toujours, amen :-)


Et quand un fan de Game of Thrones commence à discuter avec un fan du clan Soprano sur les avantages de la programmation orientée vers les aspects , des mixins et des fermetures , il ne reste plus qu'à rire sincèrement et à saupoudrer les débatteurs de sable sacré du Tibet et de pommes de terre McDonald. Vous ne pourrez pas attendre de conclusions utiles et objectives, et vous serez encore plus confus - et, pire encore, vous obtiendrez un poppin viral et commencerez à marcher dans un manteau rayé.

Traditions et "justesse"


Le fait est que, par exemple, assembler une voiture en fer est une tâche assez coûteuse et longue: vous avez besoin de matériel, de soudure, de connaissances, d'une chambre, d'une affiche de fille avec les bonnes formes, etc. Et écrire un programme, surtout pas seul, est assez courant. Créativité virtuelle - a explosé et continue de froisser et d'étirer le monde. Une mer de contenus numériques, souvent désemparés et primitifs, où tous les écrivains et artistes ont inondé le web. En raison de la relative simplicité de l '"expression de soi", dans le monde, dans un laps de temps relativement court, après la Seconde Guerre mondiale, un grand nombre de programmes, mais aussi de langages de programmation, sont apparus. Écrire un nouveau langage de programmation n'est pas difficile, beaucoup plus difficile - pour le faire gagner en popularité. Il est arrivé historiquement que les langages qui ont appris à "les écrire correctement" (par exemple C ++, Java, ECMA262) soient maintenant populaires, et les langages "créés plus tard et semblent meilleurs" (par exemple C #, Python3, Rust, Kotlin) sont beaucoup moins populaires. En choisissant un langage «plus correct», vous courez le risque de ne pas trouver suffisamment de développeurs qui le connaissent, ou il peut arriver que le langage cesse tout simplement de se développer ou monte dans l'éternité, comme Haskell. Par conséquent, guidés par le bon sens, ils choisissent souvent des technologies traditionnelles, pour ainsi dire, même si elles ne sont pas tout à fait «correctes» et cohérentes, pleines de béquilles et de traces de croissance, mais testées, populaires et développées.


Dans le contexte du développement actif de la graphomanie (en particulier dans le sens du front-end, bien que npm soit également amusant), je voudrais mettre en garde contre l'utilisation irréfléchie des bibliothèques et des frameworks . Il est important de regarder l'historique de développement du framework, le contingent de développeurs (plus la technologie est simple, plus il y a de surprises) et la durée de prise en charge des versions.

Habituellement, dans les projets open source, il n'est pas habituel de maintenir le cadre pendant une longue période, par exemple 3-5 ans ou plus - c'est ringard, cher et ennuyeux. Par conséquent, généralement, après avoir acquis une masse critique de «béquilles», la prochaine version est créée, dans un an ou deux, et je recommande aux utilisateurs de leurs versions précédentes de transférer leur projet ... faites-le vous-même, car la version précédente ne sera plus mise à jour et les erreurs de sécurité ne seront pas non plus corrigées. Des exemples de cette "irresponsabilité" sont tout simplement la mer.

Les bibliothèques et les cadres commerciaux, en règle générale , ne souffrent pas d'une maladie infantile similaire (mais pas tous, vous devez lire attentivement la documentation et étudier ce problème en profondeur) et maintenir la compatibilité descendante pendant 5 ans ou plus. Veuillez y prêter une attention particulière, sinon vous devrez soudainement réécrire votre solution Web à partir de zéro!

En général, sur ce point, il vaut mieux utiliser un proverbe sur une mésange et une grue.

Nouveau ou ... fini


Un autre problème psychologique très répandu dans le développement est le choix entre «le faire à partir de zéro» et «le prendre prêt». Je vais vous dire un secret - tout le monde veut être des dieux, des développeurs novices, ce qui, soit dit en passant, est normal, ils veulent pomper et obtenir une entrée dans le CV et choisir de "le faire à partir de zéro". Mais ensuite, généralement, ils partent à cause de l'ennui après six mois ou un an, et souvent en raison du manque d'expérience, leurs créations doivent être réécrites encore et encore à partir de zéro. Des moines Shaolin expérimentés, généralement, pour se protéger contre les erreurs et les surprises des enfants, choisir des solutions et des bibliothèques prêtes à l'emploi et passer le temps libre restant à développer des fonctionnalités non standard, exclusives pour cette fonctionnalité de projet Web. Et ce ne sera pas ennuyeux!


Une bonne association peut être de choisir une base de données - ce qu'il faut prendre pour un projet Web, une base de données Oracle ou une base de données MySQL (oui, je sais qu'elles sont maintenant développées par une seule entreprise). Selon l'expérience - 99% des tâches de développement Web, même sous des charges élevées, sont résolues de manière excellente et à grande vitesse dans MySQL. Et si le résultat ne diffère pas, pourquoi ...? :-)

Par conséquent, généralement un projet logiciel se compose désormais d'un tas de bibliothèques et de frameworks prêts à l'emploi et testés, avec une bonne période de support et seulement une petite partie des fonctionnalités spécifiques à ce projet. Et cela, à mon humble avis, est correct.

Difficile et long ou ... rapide et facile?


C'est également une cause connue de débats nombreux et sans fin. En fait, les technologies informatiques et les langages de programmation modernes sont divisés, en gros, en 2 parties: simples pour la majorité (pas besoin d'approfondir, quelques jours pour comprendre) et difficiles pour la minorité (il faut une spécialisation sérieuse et longue, des mois pour comprendre). Comme nous l'avons vu ci-dessus, la plupart des gens n'aiment pas apprendre, donc si vous mettez en œuvre la bonne technologie et fiable, vous ne réussirez pas parce que personne ne peut le comprendre pleinement et vous jouerez à la roulette russe avec une boîte noire. Un exemple populaire: le choix entre redis ou cassandra - produits de différents ordres de complexité. Ou, un autre exemple: python ou C ++.

Dans les langages simples, en effet, la programmation est souvent beaucoup, beaucoup plus rapide - comparez un script python à 5 lignes et un code C similaire à 100 lignes. Mais, généralement, les langages «simples» et les technologies universelles fonctionnent parfois beaucoup plus lentement et consomment beaucoup plus de RAM :-) Après tout, vous devez payer pour tout.


Néanmoins, des langages «simples» sont de plus en plus utilisés pour résoudre la plupart des tâches d'un projet logiciel, où des exigences particulières pour la super-vitesse et la RAM ne sont pas nécessaires. Et le fer devient de moins en moins cher. PHP est désormais très populaire pour le développement Web rapide, et python, avec sa syntaxe très claire et lisible, pour les tâches générales et l'apprentissage automatique. JavaScript est très pratique pour automatiser non seulement l'interface Web, mais aussi ... la création d'applications serveur très rapides sur Node.js. Go, même avec sa syntaxe primitive, vous permet de vous passer de Java plus puissant, mais beaucoup plus difficile à comprendre dans les tâches système, et une application mobile peut être rapidement créée par un ordre de grandeur plus facile et plus accessible pour les débutants pour développer Kotlin. Il est possible avec des risques beaucoup plus faibles d'exécuter une application à haute charge dans Rust sans plonger dans les subtilités de la gestion de la mémoire en C ++. Mais personne de bon sens n'écrirait un jeu en Java, se souvenant du populaire minecraft, qui ne peut être joué qu'à une distance de 10 mètres de l'écran, plissant les yeux :-)

Par conséquent, pour chaque tâche, il est conseillé de choisir un outil spécifique et populaire affûté par celui-ci. Plus les outils prêts à l'emploi sont utilisés, mieux c'est.

C'est comique, mais dans les réalités actuelles, pas même le choix de la langue, mais le choix des caractéristiques linguistiques peut avoir une influence décisive sur le succès. Par exemple, ayant une équipe qui n'a aucune expérience de la programmation orientée objet et la connaissance des modèles de conception, vous pouvez écrire un zoo d'objets si flagrant qu'il pourrait être plus facile de résoudre le problème avec 100 fonctions dans un fichier monolithique, compréhensible pour tout le monde que de se cacher de centaines d'objets dans un bureau monstres avec un support au lieu d'une tête et des oreilles au lieu de jambes. C'est pourquoi, souvent, des langages simples (tels que python, php, javascript, ruby) qui n'offrent pas de possibilités redondantes de développement graphomanie et perfectionnisme, axés sur la clarté, la non ambiguïté (python) et la concision (php), permettent de plus en plus de réussir. Ce n'est pas pour rien que les histoires sont si populaires lorsqu'un site Web a commencé à être créé en C ++ et quel cauchemar il s'est transformé plus tard.

Une bonne analogie ici est un exemple de chevaliers médiévaux et ... hooligans coûteux et difficiles à régler. Vous pouvez former toute votre vie et devenir un samouraï Java multi-thread, mais vous pouvez soudainement mettre fin à votre vie lorsque vous rencontrez un étudiant avec une solution similaire et beaucoup plus simple en python ou Go.

ARCHITECTURES ET ARCHITECTURES


En effet, il y a 10-15 ans, il a fallu étudier et lire des livres épais pendant longtemps afin de comprendre les principes de placement des objets et leur interaction sur des serveurs et clusters séparés (j2ee, corba, com). Les échos de ce boom de l'architecture et des architectes se retrouvent encore dans des créations monstrueuses comme Spring . Mais les temps changent, la technologie devient plus puissante et plus abordable. En déployant quelques serveurs Web Apache gratuits, une base de données MySQL et une file d'attente RabbitMQ quelque part dans Amazon , vous pouvez résoudre la plupart des problèmes qui étaient auparavant disponibles dans les configurations de serveur d'applications compréhensibles par une écrasante majorité.


Si la tâche consiste à prendre en charge des connexions réseau massives, vous pouvez augmenter un cluster de machines Node.js, ou plutôt des machines avec Erlang et dormir paisiblement, plutôt que d'écrire votre propre solution de serveur dans, par exemple, Go ou C ++.

Si vous devez faire des recherches, en permanence, dans le flux, sélectionner l'un des 10 à 20 modèles d'apprentissage automatique et les déployer rapidement dans le cloud pour le service client, alors, bien sûr, python avec un grand nombre de bibliothèques deviendra une solution très pratique et pratique, etc.

Bien sûr, dans les projets étroitement spécialisés, une connaissance approfondie de la POO, de la PF , de l'architecture, de l' informatique est bien sûr toujours requise, mais de plus en plus il suffit de savoir à partir de quels blocs assembler la solution et cela conduira souvent le système logiciel à l'objectif.

Matching par équipe


Sur la base de ce qui précède, il est évident que l'équipe ne se développera très probablement que dans le cadre limité de l'ensemble des technologies sélectionnées pour le projet. Les unités commenceront à creuser des sujets connexes, et une petite proportion d'entre elles lira de la littérature spécialisée, mais cela, hélas, est un cas exceptionnel. Par conséquent, il est recommandé de sélectionner ceux déjà expérimentés dans les langues / bibliothèques indiquées, qui peuvent être vérifiées dans le CV et dans les entretiens. Et seuls ceux qui ne peuvent vraiment pas être renversés par les émissions de télévision et les réseaux sociaux peuvent être pris pour la «croissance» après avoir reçu un contrat pré-signé par le sang artériel :-)

Cependant, dans les projets non standard, vous devrez trouver au moins un développeur qui connaît autre chose et qui est excellent, à l'exception de python, ruby, php, javascript, go, perl, bash, chanson. Les chances que le combattant connaisse bien les algorithmes, les modèles de conception, les normes de réseau et la POO sont considérablement améliorées.


Si le projet est lié à l'apprentissage automatique et que vous avez besoin de creuser quelque chose en profondeur, vous devrez trouver un véritable analyste en mathématiques, de préférence avec un diplôme scientifique et une connaissance du python. Je suis sérieux - pour l'apprentissage automatique, sans formation spécialisée, vous devez étudier dur pendant plusieurs heures par jour (théorie des probabilités, algèbre linéaire, méthode des moindres carrés, statistiques, théorème de Bayes et sa technique) pendant plusieurs mois, voire des années.

Processus ou technologies?


Vous pouvez souvent trouver des projets logiciels longs et volumineux écrits dans des langages de programmation ou des ensembles de bibliothèques apparemment «inappropriés». Par exemple, on rencontre souvent d'énormes scripts de contrôle bash ou d'énormes bibliothèques et frameworks scientifiques pour des calculs précis sur ... python avec le typage Dodbyba duck . Le secret réside dans des processus et des pratiques rigoureuses. En utilisant:

  • conception préliminaire, tests de résistance et analyse des risques
  • tests unitaires et d'intégration automatisés (couverture de préférence à 100%)
  • normes de codage communes
  • bonne documentation du code et des composants du système
  • communication transparente maximale au sein de l'équipe
  • surveillance et analyse de l'environnement du serveur

Vous pouvez créer une solution logicielle, en principe, sur n'importe quelle technologie qui vivra pendant des années et ravira les clients. Et vice versa, en travaillant avec des "show-offs" hors de prix avec des boîtes noires, sans fouiller dans les détails de la technologie, en encourageant la négligence et les intérêts personnels au lieu de ceux de l'équipe, vous pouvez essayer de démarrer un projet pendant des mois, corriger une erreur et donner lieu à des dizaines - malheureusement, cette situation est assez courante.


Résumé


Pour résumer et prioriser:

  • De plus en plus, on peut observer une situation où la vitesse de lancement d'un projet logiciel est un facteur décisif de réussite. Faire quelque chose d'inutilement long et difficile est pire que de publier rapidement une solution utile pour les clients et de recueillir des commentaires pour la prochaine secousse
  • Un démarrage rapide n'est possible que si vous utilisez le maximum de composants, de cadres et de bibliothèques prêts à l'emploi avec une période de support adéquate (en tenant compte de la durée de vie prévue de votre système Web)
  • Malheureusement, les connaissances algorithmiques et architecturales sont moins demandées. Le plus souvent, l'expérience dans la résolution de problèmes similaires et la pratique de l'utilisation des boîtes à outils et les atouts des fournisseurs de cloud sont les bienvenus.
  • Pas besoin de vous limiter et de tout faire sur une seule technologie et un seul, le MEILLEUR langage de programmation - une arme à feu dans les mains d'un enfant est plus efficace qu'une étude d'arts martiaux par le samouraï toute vie consciente et inconsciente. Le perfectionnisme et l'idéalisation tuent les systèmes logiciels. Choisissez la bonne arme pour chaque tâche du projet. Prenez le fini et concentrez les efforts restants sur le non standard.
  • Les technologies sélectionnées doivent être simples, claires et accessibles à la majorité de l'équipe. Regardez ce qu'ils écrivent un projet similaire sur le principal et prenez cette pile technologique pour vous-même. N'automatisez pas l'hébergement avec Haskell et n'écrivez pas de sites Web en C ++ :-) Si votre projet "décolle" et commence à se développer, alors seulement vous pouvez envisager de réécrire ses petites parties dans des technologies et des langages de programmation plus complexes. Mais généralement, les projets logiciels n'atteignent pas ce stade ou atteignent quelques années plus tard.
  • Le framework vous permet d'accélérer le lancement d'un projet logiciel par ordre de grandeur. Assurez-vous de vérifier la disponibilité d'une bonne documentation et de spécifier la période de prise en charge du framework afin qu'il n'y ait aucun problème avec une réécriture complète dans 2-3 ans. Il s'agit d'un cas très fréquent de nos clients.
  • Ne croyez pas à la capacité de l'équipe à apprendre - il y a trop de distractions dans la vie et la situation ne fait qu'empirer. Étudiez soigneusement votre curriculum vitae, vérifiez les certificats et les examens et essayez de vous concentrer autant que possible sur le résultat pratique. Mettez la pratique au-dessus de la théorie, au moins au moment de créer la première version d'une solution de travail.
  • La technologie et les langages de programmation ne sont pas des facteurs de réussite essentiels. Concentrez-vous sur la création des processus les plus nécessaires et la mise en œuvre des principales pratiques de développement et de conception. Les processus corrects, en règle générale, sont garantis pour conduire au résultat «correct». « » « », . , 2-3 .

, , !

Source: https://habr.com/ru/post/fr436460/


All Articles