Qu'est-ce qu'un hack? [fermé]


55

J'entends souvent des collègues se dire: "C'est un piratage horrible, horrible."

Ce que je peux en déduire, c'est que ce n'est pas bon. Quand je leur ai demandé si cela fonctionnait, ils ont répondu "oui, mais ce n'est pas bon". Cela signifie-t-il que ce n'est pas une bonne solution? En quoi une solution est-elle mauvaise si cela fonctionne? Est-ce dû aux bonnes pratiques? Ou pas maintenable? Utilisez-vous un effet secondaire du code dans votre solution?

C'est intéressant pour moi quand quelque chose est classé comme un hack. Comment pouvez-vous l'identifier?


5
Quelque chose peut fonctionner mais être lent, fragile, laid et douloureux à entretenir. C'est un hack.
Trezoid

1
Code truqué par un ghetto == bidouille
Garet Claborn

Je ne dis pas que c'est un bidouillage, mais vous voulez repenser dynamiquement la correction +de singe pour diviser en fonction d'heuristiques.
dietbuddha

Pour tous ceux qui affirment que les hacks sont des pansements salissants, veuillez regarder ce que cela signifie pour ceux qui se sont appelés pirates informatiques à l' adresse outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Incroyablement bon , et peut-être très fastidieux, travail qui produit exactement ce qui est nécessaire.

1
Une fonctionnalité qui n'est pas implémentée selon les normes populaires ou selon les normes de votre supérieur.
Aditya P

Réponses:


97

Il s'agit d'appliquer un pansement temporaire sur une grande plaie béante. C'est corrigé pour l'instant, mais cela posera encore plus de problèmes plus tard.

Un exemple que j'ai récemment vu: Vous voulez qu'une personne nommée "Jim"apparaisse toujours en premier dans une liste alphabétique. Pour le résoudre rapidement, vous le renommez " Jim". C'est un hack qui va sûrement revenir te mordre plus tard.


34
Ou vous pouvez l'appeler "AAA Jim".
Compman

4
Un autre exemple consisterait à étendre un if ... else ... else ... else en raison de contraintes de temps, au lieu d'une solution plus extensible.
Phil Lello

29
Et la vraie solution pour que Jim apparaisse en premier dans la liste alphabétique est, bien sûr, de réorganiser l’alphabet.
artem

1
@artem true, et cela ressemblait à ceci jzbcdefghiklmnopqrstuvwxya (vous ne voulez pas avoir à réorganiser l'alphabet, à supprimer et à afficher z)
Nom d'affichage

1
Pour le formuler en termes de gestion de projet: un hack est une solution qui pourrait créer une dette future en temps / homme-heures et / ou aller à l'encontre des meilleures pratiques ou conventions standard.
Incognito

60

Chaque décision d’ingénierie constitue un compromis entre les coûts et les retards immédiats et les coûts et la dette technique qui en résultent.

Un hack est une situation où le premier est préféré tout en acceptant le second en conséquence.

Les développeurs inexpérimentés (en partie à cause du fonctionnement du système de formation en ingénierie) se concentrent sur les premiers et ne possèdent pas suffisamment d'expérience pour vraiment comprendre ou estimer les seconds.

Les développeurs expérimentés le font, mais pour diverses raisons (beaucoup légitimes) choisissent le premier.

Le terme piratage implique presque toujours une intention de résoudre temporairement un problème et de le "résoudre immédiatement après", mais les développeurs expérimentés savent que les éléments les plus permanents du code sont des piratages temporaires.


13
+1 pour "mais les développeurs expérimentés savent que les éléments les plus permanents du code sont des piratages temporaires"! Ce qui signifie également que la paresse ne devrait jamais vous empêcher de le faire correctement.
Matthieu M.

20

En quoi une solution est-elle mauvaise si cela fonctionne?

Considère ceci

2 + 2 <-- Correct.  Elegant.  Simple.

(2/1 + 2/1) * 1/1 <-- Also Correct.  Lots of useless weird code.  

Le deuxième exemple, cependant, pourrait être un hack utilisé en raison de l’ignorance d’une meilleure pratique ou d’une hypothèse qui /1semblerait plus simple à l’époque ou d’un bogue dans une bibliothèque qui rendait le /1travail correctement.

Est-ce dû aux bonnes pratiques?

Les hacks sont du code "opportun". Il y a trois quatre causes.

  • Ignorance des principes de conception appropriés. (c.-à-d. principes SOLID)

  • Arrogance (c.-à-d. Hypothèses erronées) sur une construction d'API ou de langage.

  • Bogues réels qui ne sont pas résolus mais qui sont résolus.

  • La direction passe à de bonnes hypothèses de conception et de correction. Le "budget" est une justification commune, mais il s’agit essentiellement de l’une des trois raisons susmentionnées (ignorance, arrogance ou erreur) ayant une cause fondamentale non technique.

Ou pas maintenable?

C'est le but. Le hack est basé sur l'ignorance, des bugs ou des suppositions.

Utilisez-vous un effet secondaire du code dans votre solution?

Cela peut être un exemple d'ignorance ou une fausse hypothèse.


Excellente réponse, mais ne prend pas en compte le fait que les hacks sont parfois écrits avec une qualité médiocre en raison du triangle Qualité vs Temps / Coûts.
StuperUser

1
Je joue à ce jeu avec les clients. Je leur demanderais de choisir les deux aspects les plus importants d'un projet dans Qualité, Temps et Coûts. Presque toujours, le temps et les coûts étaient choisis, puis la qualité était au rendez-vous. Plus précisément, citant le fait que j'étais un consultant et que je devrais être en mesure de fournir les trois en respectant les délais, les coûts et une qualité exceptionnelle. Ce scénario est comme les dents de poule!
OptimizePrime

1
@Optimize: Les dents des poules sont rares. Cette situation est-elle rare?
Matt Ellen

@ Matt Ellen: Il peut s'agir d'une utilisation différente de l'expression "Dents de poule". Cela peut signifier "contradictoire" au lieu de "rare".
S.Lott

Je trouve que c'est presque toujours la décision de «dérogation de la direction».
Mark McDonald

15

Hack dans le contexte de la programmation serait équivalent à réparer quelque chose avec du canard ou du bubble gum.

Le piratage implique très souvent l'utilisation de fonctionnalités non documentées et non prises en charge, qui pourraient changer à l'avenir en cassant votre code. Ils peuvent également impliquer des valeurs codées en dur.

Le piratage peut aussi généralement être un travail temporaire dans le code en utilisant une bibliothèque / service, au lieu de résoudre le problème sous-jacent. Si plus tard vous échappez, le piratage pourrait être le seul moyen de régler le problème.


21
Utiliser du ruban de canard pour les conduits serait un charlatan;)
JeffO

quack quack quack
Mateen Ulhaq

11

Le terme est parfois utilisé avec la connotation opposée, comme dans un "hack brillant". Juste parce qu'il est beaucoup plus courant de faire des erreurs que de faire quelque chose de brillant, il est beaucoup plus courant d'entendre parler de piratages horribles que de piratages brillants, mais j'ai entendu dire que le terme était utilisé dans les deux sens.

"Pirater" utilisé dans le sens positif signifie fondamentalement une solution élégante qui résout le problème de manière inattendue et particulièrement intelligente. Les significations négatives et positives sont en réalité assez proches, car un hack brillant implique souvent de tirer parti d'un aspect non intentionnel de la technologie.


1
C'est un brillant bidouillage, car il sera difficile de voir ce que vous avez fait en surface, mais cela, après une inspection plus détaillée, il est évident qu'il s'agit d'un code de champ gauche ridiculement intelligent. Puis-je vous diriger vers la magie de la racine carrée du tremblement de terre: codemaestro.com/reviews/9
Robert Massaioli

10

Une solution qui fonctionne actuellement mais qui posera probablement des problèmes à long terme.

Exemple: vous devez générer un document HTML en renseignant certaines valeurs de manière dynamique. Pour ce faire, vous devez utiliser l'un des outils conçus à cet effet, tels que Freemarker, XSLT ou JSP. Mais vous ne pouvez utiliser aucun de ceux-ci, ou vous ne pouvez pas être dérangé de le faire correctement, alors vous écrivez quelque chose comme ceci:

public String getGreetingPage(String name) {
    return "<html><body>Hello, "+name+"!</body></html>";
}

9

Un hack est une solution ingénieuse à un problème, qui repose souvent sur une réflexion originale et tire parti de faits inattendus sur l'environnement. Il existe un dicton selon lequel les téléspectateurs conviennent que c'est génial, mais ne savent pas si c'est merveilleux ou horrible. C'est le genre de chose que vous ne voulez pas dans vos correctifs de maintenance.

Un hack qui corrige un problème dépendra très probablement des détails de l'environnement, des fonctionnalités non documentées d'un outil, ou de quelque chose comme ça. Ce sera probablement une solution fragile, qui fonctionne maintenant mais qui se brise probablement lorsque quelque chose change. Il peut être difficile de comprendre son fonctionnement, et tout programmeur de maintenance déteste le code difficile à comprendre. Cela peut avoir des effets secondaires qui ne nuisent à rien pour le moment, mais qui poseront des problèmes avec des morceaux de code parfaitement bons à une certaine distance dans le futur, et cela peut être un cauchemar à gérer.


9

Le mot bidouille est mal utilisé. Si vous voulez vraiment avoir un peu d'histoire, vous pouvez le faire sur Wikipédia. Un hack est un mot pour décrire le processus consistant à peaufiner des choses pour faire quelque chose qu'elles n'étaient pas censées faire. Dans le contexte du génie électrique, c'est bon. Il existe une meilleure description sur Wikipedia à ce sujet.

Maintenant, dans le contexte de l'informatique. Un hack est généralement mauvais. Oui, cela fonctionne, mais cela signifie généralement que le programmeur a écrit un morceau de code ambigu qui ne respecte pas la conception du logiciel et qui déroutera tout programmeur qui doit lire ce code. Bien sûr, le temps passé par les programmeurs coûte cher. En tant que gestionnaire, vous souhaitez donc disposer du logiciel le plus facilement maintenable. La même chose est valable pour les programmeurs. En outre, les hacks ont tendance à casser quelque chose d'autre, dans le logiciel.

C'est un appel de jugement pour accepter le piratage ou non. Au moins, vous voulez que l’ingénieur logiciel principal approuve le piratage, car il a plus d’expérience et est capable de prendre une décision plus éclairée. Vous ne voulez certainement pas que les jeunes garçons prennent des décisions concernant l’acceptation de piratages. Ils peuvent en proposer un et discuter avec les cadres supérieurs de la question de savoir si les avantages en valent la peine.


6

C'est un hack, comme on le trouve sur thereifixedit.com .

Pirater

En fait, tout ce qui se trouve sur ce site est un hack.

Les hackers sont des utilisations ingénieuses et audacieuses de certaines choses hors de leur contexte.
La beauté d'un hack réside dans le fait que vous avez un problème donné et des outils qui n'ont jamais été conçus pour le résoudre, mais que vous résolvez le problème uniquement avec ces outils (au lieu d'en obtenir les bons). Ils sont intelligents, rapides et amusants. L'inconvénient est que les résultats sont souvent fragiles et dangereux à utiliser pour les étrangers.
Je veux dire, si vous aimez résoudre vos problèmes comme dans l'image, il n'y a pas de problème. Le problème survient lorsque vous résolvez les problèmes d’autres personnes comme celui-ci. Dans ce cas, ils seraient probablement électrocutés, brûlés ou quelque chose du genre.

En développement logiciel, vous voulez que votre code puisse être manipulé par des tiers (y compris votre avenir, vous) sans l’équivalent d’une blessure mortelle. Comme le dit Dijkstra:

Le programmeur compétent est parfaitement conscient de la taille limitée de son propre crâne. Il aborde donc sa tâche avec une totale humilité et évite les astuces intelligentes comme la peste.

Et les hacks sont parmi les astuces les plus intelligentes.

Les hackers sont des bombes à retardement quelque part dans votre code, parce que les plus communes sont basées sur trop d'hypothèses ("il suffit de le faire" est préférable au découplage approprié). Dès que ces hypothèses ne tiennent plus, tout votre système peut tomber en panne sans que vous ayez la moindre idée de ce qui s'est passé.


4

Le terme n’est pas très précis, mais il fait probablement référence à une solution simple et rapide à un problème difficile à résoudre correctement. La solution en question fonctionne probablement, mais ce n'est probablement pas une très bonne implémentation, peut-être des bugs subtils, peut-être quelques petits bugs connus , et devraient être refaits plus tard, si le temps le permet. Je pense que ce que vous entendez appelé "bidouille" est aussi parfois appelé " kludge ".

Je vois souvent des piratages se produire lorsqu'il existe des contraintes de temps très serrées pour terminer une tâche, et qu'une solution de piratage est mise en œuvre car elle fonctionne "juste assez" pour passer le contrôle qualité, dans l'espoir que cela puisse être corrigé ultérieurement. Malheureusement, cette correction / nettoyage ultérieur ne se produit pas toujours :(


Je ne suis pas sûr de comprendre ce que vous entendez par "pas très précis" - je dirais que la plupart des programmeurs sauraient exactement ce que l'on entend par dire que du code écrit est un hack. Mais le reste de la réponse est parfait, cela fonctionne, mais pour une raison quelconque (architecture, performances, etc.), ce n’est pas une solution optimale.
Ozz

@ james: D'après mon expérience, deux programmeurs peuvent consulter du code et l'un d'entre eux l'appellera un piratage, l'autre pas. Il n'y a pas vraiment de moyen de quantifier un morceau de code comme un hack. Chacun a sa propre idée de ce qu'est un hack, et souvent, ils sont semblables mais pas toujours pareils. Écrit comme quelqu'un qui a eu son code appelé "hack" par d'autres, et en désaccord. Et j'ai appelé le code d'autres personnes "hackish" et ils n'étaient pas d'accord. Certes, ce sont probablement des cas limites, mais les limites peuvent parfois être floues ...
FrustratedWithFormsDesigner

1
@FWFD - c'est juste en désaccord sur le point de savoir si quelque chose est un hack. Si quelqu'un "dit" que du code est un hack, vous saurez ce qu'il voulait dire.
Ozz

4

Je passe beaucoup de temps en tant que développeur front-end, alors ma définition du hack est la suivante:

Une solution qui repose sur une connaissance approfondie des défauts d'environnement et du comportement non documenté.

L’environnement peut être votre cadre, votre navigateur Web, votre base de données, votre guichet automatique bancaire (guichet automatique), votre procès. Tout "système de règles", dans lequel vous connaissez une boucle et l'exploitez pour résoudre un problème.


4

Un hack est généralement un code qui fournit apparemment le résultat souhaité, mais de manière sous-optimale.

Il utilise généralement une fonction de langage / bibliothèque non documentée ou obscure d’une manière qui n’était pas voulue par son auteur et qui a donc brouillé l’intention.

Il est parfois fait pour contourner un bogue de langage ou de bibliothèque, mais dans la plupart des cas, la cause principale est généralement l’ignorance;

Pour un marteau, tout ressemble à un clou.

Les choses qui sont faites de manière inefficace, généralement dans l'espace et dans le temps, mais produisent finalement le résultat souhaité, mais à un coût et avec des cas extrêmes indéterminables sans testabilité ni maintenabilité. Habituellement découlant d'un manque de compréhension fondamentale de la logique ou des idiomes de langage. Voir aussi "à la dure".

Habituellement, le code est quelque chose que quelqu'un avec l'expérience appropriée ne l'aurait même pas envisagé, ou devrait réfléchir longuement pour le rendre aussi compliqué et inefficace que le piratage qu'il a découvert.

Exemples

Le correctif de Vista

Validité de la validation par email

Unités de logiciel

Hash non déterministe


+1 pour sous-optimal. Et parce que les hacks ne sont pas forcément "temporaires" comme les plus votés.
rlb.usa

2

Un pneu chauve fonctionne, mais personne ne l’appelle une solution idéale à une crevaison. Cela pourrait créer des problèmes plus graves en bout de ligne.

Typiquement, je considérerais un hack comme une solution rapide et sale à un problème immédiat. En règle générale, il peut ne pas être conforme aux pratiques de programmation habituelles dans un magasin de programmation (par exemple, utiliser beaucoup de codage en dur). C'est peut-être une petite solution.

Une des principales raisons pour lesquelles il est mauvais est que a) il peut entraîner des résultats imprévisibles b) il peut ne pas correspondre à la conception d'origine du code en question, ce qui entraînera des problèmes de maintenance. D'après mon expérience, les hacks sont généralement très mal documentés.


2

Une courte définition que j'ai entendue et que je respecte maintenant:

"Une solution à un symptôme qui ne résout pas complètement le problème dans tous les cas"

Un code laid peut ne pas être un hack. L’exemple 2 + 2 d’une autre réponse n’est pas un hack, c’est une solution de code laide et mauvais du point de vue de la compréhension du code, mais il produit la solution correcte dans tous les cas. Pensez à une équation factorisée en mathématiques - le comportement / la relation est identique et correct dans les deux versions, mais la forme est différente. Hmm, factorisez une équation, refactorez une équation, code de refactor ... non, pas de similitude j'en suis sûr :)

L'exemple dans l'une des autres réponses sur la modification du prénom en "Jim" est un hack: il résout le symptôme (le prénom dans la liste est Jim), mais ne résout pas complètement le problème (la liste n'est pas triée ou priorisé d’une manière qui fonctionne pour toutes les entrées).


1

Un hack est en train de faire quelque chose qui retourne le résultat attendu, mais le fait de manière étrange (entraînant généralement un impact négatif sur les performances).

Par exemple:

Tâche : transtyper une variable entière en un double

Solution : Utilisez l'opérateur de casting. Ie: dblVar = CType (intVar, Double)

Hack : Diviser par un double. Par exemple: dblVar = intvar / 1.0


+1 pour un exemple stellaire. Dans l'ancien code AS400, je verrais les dates européennes multipliées par une décimale farfelue, qui affiche la date américaine. Les problèmes commencent lorsque certains codeurs commencent à introduire cela dans notre code .Net ... bleh!
Morgan Herlocker

0

Imaginez si votre jambe était infectée et devait être retirée pour que vous puissiez survivre. Préférez-vous que le médecin pirate rapidement avec une hache ou le retire chirurgicalement après avoir examiné le problème et choisi les outils, la procédure, etc. appropriés? La même chose s'applique aux logiciels.


Je lui demanderais de l'attaquer avant que l'attaquant ait une chance de me pirater le cerveau.
Mateen Ulhaq

Et si vous n'aviez que quelques minutes?
StuperUser

0

Un hack signale sa naissance lorsque le codeur responsable déclare "je reviendrai et je corrigerai cela plus tard".

Sur une note sérieuse - un hack dans le contexte du PO est quelque chose qui permet d’atteindre le résultat souhaité, mais qui utilise une méthode temporaire ou peu fiable pour le faire.

L'autre définition courante est une technique qui exploite les comportements de cas extrêmes pour contourner les limitations / sauvegardes de la plate-forme.

Hack dans le deuxième contexte a un certain cachet parmi "maverick" (lire: dangereux) héros codeurs ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.