De béton les symptômes de l'over-engineering
J'ai récemment trouvé moi-même dans la position de l'expliquer (En interne) de l'application j'ai écrit à deux candidats de ma société aime à la location afin de les aider dans la maintenance et l'ajout de fonctionnalités mineures.
C'est la première "production" de l'application que j'ai écrit, il a 45k Ldc et j'ai passé près de deux ans de "solo" de développement sur elle. Je suis assez jeune (18 ans) et a écrit l'application à partir de zéro, tout en étant engagé comme doublure pour un ancien développeur qui a quitté la société. Inexpérimentés dans la conception d'applications de cette taille, j'ai essayé de l'utilisation commune de l'architecture et de la conception des modèles.
Aujourd'hui, je sais que j'ai fait un peu de sérieux sur-l'ingénierie, par exemple à l'aide d'un débranché le suivi des modifications de l'architecture de la place de l'Unité De Travail, qui la choisi ORM a déjà mis en place. Je vais probablement jamais avoir à aller à la "vraie" trois niveaux.
Les deux candidats ont 10 ans+ d'arrière-plan dans le Développement de l'Application avec la plate-forme correspondante. Étant la moitié de leur âge et ayant peu d'expérience je respecte leur opinion. Quand j'ai d'expliquer l'architecture de l'application à eux, les commentaires étaient le long des lignes de:
- Jeez, personne ne me paye pour faire des trucs comme ça, je dois faire les choses
- Coller avec ce que fait le cadre, ne pas utiliser de fantaisie bibliothèques/technologies
- Ne pas envelopper code de la structure. Dans une équipe, tout le monde va écrire son propre code wrapper de toute façon.
- Que vous utilisez .NET 3.5? Eh bien, nous sommes à l'aide 2.0.
- Ce n'est que LINQ trucs m'acheter? Toute cette question de la composition et de la projection semble trop compliqué.
Maintenant, je me demande:
Suis-je un l'architecture de l'astronaute? Comment savoir si je vais trop loin avec l'architecture? Quels sont les symptômes courants de l'over-engineering?
- Cela pourrait être mieux qu'un wiki de la communauté - il n'est probablement pas un large consensus sur ce qui constitue une plus-ingénierie.
- Parfois, le gars avec+ de 10 ans d'expérience est le meilleur de son équipe, parfois, il est la carrière amateur. Parfois, la haute gamin de l'école sans diplôme effectue au niveau de la direction, parfois, ils n'ont jamais écrit une ligne de code dans leur vie et de penser la programmation ressemble à ceci: youtube.com/watch?v=gwlE1aASc4g . Pour ce que sa vaut le coup, nous sommes tous enclins à plus de génie. Je ne voudrais pas transpirer, surtout si ces gars-là n'ont pas vraiment vu le code réel. Viens de faire un peu balaie propre pour enlever tout ce qui ressemble de DailyWTF matériel et de l'appeler bon.
- D'accord avec Juliette - si vous êtes en train d'apprendre de lui et il fonctionne, alors ne vous inquiétez pas à ce sujet. Presque tout le monde va vers trop compliqué avant de trouver comment code plus simple de la mode comme vous obtenez plus d'expérience. Au moins vous avez pensé à elle...
Vous devez vous connecter pour publier un commentaire.
Code qui permet de résoudre les problèmes que vous n'avez pas.
Un avertissement très fort signe de overengineering, c'est quand tout va de travers tant d'indirection que c'est dur de trouver le morceau de code qui en fait met en œuvre concrète, au niveau du domaine morceau de fonctionnalité. Si vous trouvez que la plupart de vos fonctions ne très concrètement, peu de travail et il suffit d'appeler d'autres fonctions virtuelles, vous pouvez avoir un problème.
L'ennui
L'ennui est un bon précurseur conçu de code. Je vais vous avouer, quand j'ai eu mon premier emploi, je me sentais tellement sous-exploité. Je viens de m'ennuyer. Et quand j'en ai eu marre, j'ai écrit le code. Pas n'importe quel code, les CATHÉDRALES DE CODE.
Non, sérieusement, j'ai eu une image mentale de mon code et les abstractions que les grandes tours d'or en saillie des flèches, des arcs-boutants de vitreux onyx, une magnifique voûte soutenant par voûté surmonté de dômes avec de beaux entrelacs géométriques, etc etc etc.
C'était vraiment fascinant de voir les habitudes de travailler ensemble pour moi-même, mais avec le recul, je suis complètement honte de l'impie mess j'ai laissé derrière moi.
Si vous écrivez vos propres cadres et des Dsl code pour passer le moins stimulant les heures de travail, tout simplement arrêter. Le temps est mieux dépensé lecture Pupilles Wiki, ou de l'écriture open source livre, ou vous pouvez le demander à la direction pour plus de travail.
De la rédaction de votre propre Cadre de référence
Probabilités sont, quelqu'un est déjà fait. Qui plus est, ils l'ont déjà fait 1000x mieux que vous ne le pourrait jamais. De plus, ce qu'ils ont fait est probablement déjà un standard de l'industrie, de sorte que l'apprentissage de la technologie va vous rendre plus compétitif à d'autres emplois.
Lors de la dernière entreprise où je travaillais, un programmeur a travaillé en solo sur ses projets pour la plupart de son mandat. Il a écrit l'une de ses plus populaire des applications et a été largement considéré comme le meilleur sur l'équipe, mais à mon avis, il avait la fâcheuse habitude d'écrire tout ce qu'il fallait partir de zéro.
Il avait écrit de sa propre infrastructure d'injection de dépendance, de son propre ORM, un framework de test unitaire (qui, inexplicablement, a regardé et a agi très similaire à NUnit -- pourquoi n'a-t-il pas utilisé NUnit?), un cadre pour la création d'objets de fabrique (un "usine usine" je l'appellerais).
Vous l'esprit, le code a été fait remarquable, mais ce qui est le point?
L'écriture d'une meilleure Base de la Bibliothèque
À mon entreprise actuelle, il semblait toujours comme les programmeurs qui écrivent inutile quantités de code à reproduire les caractéristiques déjà présentes dans la .NET framework.
Entre autres choses, ils ont écrit:
Soit ils ne savent pas le cadre très bien, ou qu'ils pensent de ses notoirement insuffisantes.
Il y a seulement précieusement quelques exemples, je pense, d'où la re-mise en œuvre de la bibliothèque est mieux que l'original (voir Jane Rue De Bibliothèque De Base, C5 Générique Collections pour .NET, un taux de change réel de la classe), mais les chances sont, vous n'aurez pas d'écrire un meilleur standard de la bibliothèque.
Quant à la question de savoir si vous l'architecture de l'astronaute: Si vous êtes conscient du danger qui vous met en avant de beaucoup de gens. Vous ne voulez pas aller dans le sens de vos collègues de travail soit, il semble que certains d'entre eux sont devenus croustillant vieux pleurnichards.
Sur-le génie est le résultat d'un problème de hiérarchisation qui a abouti à une partie du système en avoir trop l'attention. Ainsi, le symptôme le plus apparent de la plus-ingénierie est que vous pouvez voir tous les environ d'autres parties du système qui sont mal pour un manque d'attention.
(Il y a aussi une tendance pour l'ingénierie d'exposer le système à l'augmentation des risques de mauvaise conception, en raison de l'augmentation de la complication et de la quantité de risque d'erreur de la spéculation en cause pour déterminer quels sont les aspects à la sur-ingénieur, mais comme un commentaire souligne, que ne pas suivre automatiquement.)
Pour la plupart dans des applications, la plupart de votre code doit être concerné par la mise en œuvre de préoccupations des entreprises, et pas de problèmes techniques non liés à l'entreprise (comme votre "déconnecté le suivi des modifications de l'architecture"). Actuellement disponibles cadres sont assez matures et supporte la plupart des cas d'utilisation courants. Si vous êtes à inventer de nouvelles technologies ou de nouveaux (dans le contexte de l'entreprise-développement de l'application) juste envelopper certains autres cadre existant de la bibliothèque ou juste pour le plaisir de l'emballage, vous êtes probablement de faire le mal. Idéalement, chaque élément de l'architecture de vous construire devrait être traçables à une exigence de l'entreprise. Garder les choses simples.
À mon humble avis plus des commentaires que vous avez au sujet de votre demande ne sont pas vraiment à propos de la sur-génie parce que la sur-ingénierie n'est pas une question de technologie. C'est à propos de l'architecture. Les nouvelles technologies peuvent être appris et compris dans un laps de temps raisonnable. La compréhension d'un cours d'ingénierie de l'application est généralement beaucoup plus difficile et parfois même impossible. Cela rend les points 2, 4 et 5 non valide. Le premier point n'est pas vraiment valable, car de toute évidence vous a payé pour l'écriture de l'application tel qu'il est et si cela fonctionne, vous avez pas de problème ici.
C'est mon "quick test" pour savoir si une application tend être conçu:
Ce sont juste des astuces que j'utilise pour mes applications. Ils ne sont pas garantis pour être l'alpha et l'oméga de "sur-l'ingénierie de détection".
Lorsqu'un co-travailleur de l'ordinateur vient de voler au-delà de votre tête parce qu'ils ont passé les 6 dernières heures à essayer et à défaut de le faire d'une vraie boîte de dialogue apparaît, à l'aide de votre ridicule cadre, c'est une jolie béton symptôme là.
En évitant toute utilisation de YAGNI, SEC, et KISS viennent à l'esprit en regardant les choses qui sont au-dessus de l'ingénierie. Si il y a beaucoup de pièces qui semblent être partiellement remplie et beaucoup de parties de code qui semblent avoir une, "Que faire si cela arrive? Que faire si cela arrive?" se sentent à elle, ce serait un autre point. Ignorant de bons principes de conception OO ou De SOLIDES principes serait une autre note. Si vous pensez que vous avez écrit le code parfait, ce serait un autre signe de difficulté, car il est extrêmement rare qu'une personne à écrire quelque chose qui ne peut pas être améliorée d'une manière ou d'une autre.
De l'OMI, méfiez-vous que certaines personnes sont peut-être trop critique de votre travail comme faisant partie d'une base de code peut impliquer des gens aimer les choses d'une certaine façon, par exemple, les conventions de nommage sur les méthodes, les tests et les variables. C'est juste la façon dont il est. Maintenant, ce que vous avez à comprendre est comment gérer les gens dans siutations comme conflit ou la persuasion et de l'influence, où il existe des outils qui peuvent les aider.
Plugins qui fournissent intrinsèque de la fonctionnalité de votre application
Avouons-le, enfichable architectures sont juste sacrément sexy et amusant à écrire. Cependant, c'est encore un de ces endroits où vous devez vous demander: "ai-je vraiment besoin de le faire de cette façon?".
Si vous n'avez pas besoin d'ad-hoc, des ajouts à votre demande, ne vous attendez pas à quiconque d'écrire des extensions tierces, et la portée de votre application assez bien définis, vous n'avez pas besoin d'une architecture enfichable.
Vous ne devriez pas écrire des plugins pour prendre en charge intrinsèque de la fonctionnalité dans votre application. Disons que vous écriviez un programme de Peinture; vous auriez probablement prendre en charge les plugins pour enregistrer des fichiers dans de multiples formats, mais vous n'avez pas besoin d'un enfichables à annuler le gestionnaire de fichier ou de dialogue parcourir.
Vous n'êtes pas une architecture de l'astronaute. LINQ est assez simple et basique, et utile, pour une. En va de même pour .NET 3.5.
Dans le même temps, vous êtes débutant dans l'équipe et allez obtenir une sorte de nervures, même si ils aiment ce que vous avez fait.
Prendre tout cela avec un grain de sel. Juste accepter leurs critiques, clin d'œil, et d'avoir une bière avec eux par la suite.
Si ils vous demander de le changer, alors votre commentaire est "mon dieu .. je sais que j'ai tort, mais ça marche et ça va être trop de mal pour le changement".
Essayer d'évaluer si vous avez fait des choses pour réduire le travail au cours de la durée de vie prévue du code. Cela comprend l'entretien ainsi que le développement.
Dans le code du cycle de vie, rappelez-vous que la durée de vie du code n'est pas la même que la durée de vie de l'application. Il peut-être mieux d'écrire un petit prototype d'abord, puis re-engineer/refactoriser après une meilleure compréhension du domaine. Dans cette situation, le cycle de vie est très courte, donc garder les choses simples.
En outre, différentes applications peuvent nécessiter différents amouhts de l'ingénierie. Cette application va coûter des vies en cas de panne? I. e. est-il un contrôleur pour un cœur mécanique, ou pour la navette spatiale de la navigation de fusées? Ou est-il une liste de contacts pour les adolescents s'ennuient?
Sur un plus générique et de haut niveau de l'approche,
Quels sont les moyens pour y parvenir?
Résoudre les problèmes que vous n'avez pas, à voir le problème plus complexe qu'il est vraiment, essayer de prévoir trop à l'avenir, la construction de trop générique trucs, entre autres.
Avez-vous en œuvre votre projet dans un délai raisonnable? Est-il aujourd'hui? Si oui, vous pouvez probablement se détendre un peu, comme l'un des pires problèmes avec plus de génie n'est jamais réellement quelque chose d'utile à faire.
Les gars vous avez parlé trop peut avoir quelques bonnes suggestions, mais cela ne signifie pas que vous avez besoin de prendre tout ce qu'ils disent comme parole d'évangile. Par exemple, l'utilisation d'une version récente de .NET sur un nouveau projet ne me paraissent de quoi s'inquiéter. Sont-ils vraiment se plaindre que?
la moitié de c'est vieux hommes (je suis dans leur ligue) coller à l'éprouvé et vrai moteur à vapeur qu'ils ont connu. l'autre moitié est vrai, mais pas vraiment vous dire quelque chose de nouveau.
autre que cela, Jeff Sternale la réponse est stellaire.
Comme quelqu'un qui a été en développement logiciel professionnel depuis 24 ans, tout ce que je peux dire, c'est que ce problème de prise de l'appel sur le niveau d'abstraction requis pour un problème particulier - est le plus difficile partie de mon quotidien design & le travail de programmation.
Dans le "vieux" jours, sous-ingénierie a été monnaie courante, ce qui a conduit à l'ensemble de la structuration de la méthodologie et des pratiques. Maintenant, il semble que nous sommes allés dans l'autre sens. Il n'y a pas de réponse simple, et parfois, vous ne saurez si vous sous ou au-dessus d'ingénierie dans recul 😉
J'ai eu plusieurs recul des expériences où je me suis dit: "je souhaite que je n'avais pas compliquer ce tellement", mais aussi "Si seulement je l'ai écouté la petite voix à l'arrière de ma tête, et a fait un peu plus générique ici".
Je n'ai pas encore distiller de règles absolues pour faire l'appel...
Je pense que je suis enclin à plus de génie, donc j'ai fait cette photo de mon PC papier peint
Genre de vouloir offrir un point de vue différent, mais je pense que ce terme devrait être supprimé et remplacé par une description plus. Il stigmatise "génie" qui devrait être d'environ la simplicité et la facilité de maintenance et de praticité au-dessus de tout, quand beaucoup de ce qui est décrit comme "l'over-engineering" a le sens contraire des qualités (comme si le génie de trop, ou de le prendre trop au sérieux, est censé donner la plupart des solutions alambiquées). Il est fréquent, par exemple, de voir une corrélation entre l'ingénierie et la mauvaise procédure de test (au moins, j'ai souvent vu ces deux vont de pair), et ce genre d'excès dans l'ingénierie effectue le montant minimal de tests officiels?
Je dis que venir à partir d'un point de vue où j'ai souvent entendu les gestionnaires de logiciels et occasionnellement, des dinosaures qui n'étaient pas si SE-savvy pour lancer ce terme autour de à toute personne qui tente, par exemple, de réduire les coûts de maintenance dans un système ou d'en proposer plus de son essai les procédures et les normes de sécurité. Il est trop facile pour le profane de penser que n'importe quel type de grave se concentrer sur l'ingénierie du son, de l'essai, et qui ne produit pas de code au sprint snap-snap-snap rythme qu'ils veulent, c'est "over-engineering".
Il y en a beaucoup qui en ont réellement reconnaître le vrai odeurs de "l'over-engineering", mais le terme est au moins sans doute trompeuse.
Comme pour les symptômes, en plus de l'excellent celles déjà fournies, pour moi c'est un angle mort dans être en mesure de bien évaluer et de réévaluer le travail en face de vous. Les programmeurs peuvent bâtir des mondes dans leur imagination, se sont obsédés et absorbé avec grands concepts. Alors que c'est un peu ennuyeux et réponse générique, qui peut conduire à un risque de ne plus voir la réalité des problèmes et des priorités juste sous notre nez. Pour conceptualiser trop profonde est souvent à développer un angle mort de ce qui est juste en face de nous, à compliquer les problèmes, de perdre le contact avec la réalité et le réel de l'utilisateur de fin d'besoins. Pour moi, la plus grande symptômes à surveiller pour tourner autour de la psychologie.
Toutes sortes de professions gravitant autour de la production sont vulnérables à cette tendance de base où l'on perd de vue le réel et immédiat des problèmes à résoudre en tant que résultat de trop obsédé sur les concepts (ex: un réalisateur de film). Avec la programmation en général, une façon de le combattre est de favoriser clarté, la simplicité, la praticité, le codage plus tôt avant de conceptualiser quelque chose pour la nième degré (achat de plus de temps pour réévaluer avant de nous tomber trop profondément en amour avec toutes les idées). On ne peut pas aller trop loin de la vérité en embrassant ces idéaux, mais la clé pour moi, c'est pour éviter le développement de cette angle mort qui nous empêche d'être en mesure d'évaluer correctement notre travail. Un overengineered base de code ne vient pas à propos de la nuit-il faut une longue période de travail acharné dans la mauvaise direction pour la rapporter, et pour moi, le plus grand évitables problème avec ça, c'est pas de la clairvoyance mais souvent développer le recul trop tard.