¿Qué es un hack? [cerrado]

55

A menudo escucho compañeros de trabajo diciéndose unos a otros: "Es un truco horrible, horrible".

Lo que puedo sacar de eso es que no es bueno. Cuando les pregunté si funciona, dijeron "sí, pero no es bueno". ¿Eso significa que no es una buena solución? ¿Cómo es una solución mala si funciona? ¿Se debe a las buenas prácticas? ¿O no mantenible? ¿Utiliza un efecto secundario del código como parte de su solución?

Es interesante para mí cuando algo se clasifica como un hack. ¿Cómo puedes identificarlo?

polvo
fuente
55
Algo puede funcionar pero ser lento, frágil, feo para trabajar y doloroso de mantener. Este es un truco.
Trezoid
1
Ghetto-rigged code == hack
Garet Claborn
No digo que sea un truco, pero debes repensar dinámicamente los parches de mono +para dividirlos en función de la heurística.
dietbuddha
Para todos aquellos que afirman que los hacks son curitas curiosas , miren lo que significó para aquellos que se autodenominaron hackers en outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Un increíblemente bueno , y quizás un trabajo que requiere mucho tiempo y que produce exactamente lo que se necesita
1
Una característica que no está implementada según los estándares populares o por el estándar de su superior.
Aditya P

Respuestas:

97

Está aplicando una curita temporal a una gran herida abierta. Está arreglado por ahora, pero causará aún más problemas más adelante.

Un ejemplo que he visto recientemente: desea que una persona nombrada "Jim"aparezca siempre primero en una lista alfabética. Para resolverlo rápidamente, renómbralo " Jim". Este es un truco que seguramente volverá a morderte más tarde.

JD Isaacks
fuente
34
O podrías llamarlo "AAA Jim".
compman
44
Otro ejemplo sería extender un if ... else ... else ... else debido a limitaciones de tiempo, en lugar de una solución más extensible.
Phil Lello
29
Y la solución real para hacer que Jim aparezca primero en la lista alfabética es, por supuesto, reordenar el alfabeto.
artem
1
@artem true, y se veía así jzbcdefghiklmnopqrstuvwxya (no desea tener que reordenar el alfabeto, eliminar a y
mostrar
1
Para expresarlo en términos de gestión de proyectos: un hack es una solución que podría crear una deuda de tiempo / horas hombre en el futuro, y / o va en contra de las mejores prácticas o convenciones estándar.
Incognito
60

Cada decisión de ingeniería es una compensación entre el costo inmediato y la demora y los costos consecuentes y la deuda técnica.

Un hack es una situación en la que se prefiere el primero mientras se acepta el segundo como consecuencia.

Los desarrolladores sin experiencia (en parte debido a la forma en que funciona el sistema de educación en ingeniería) se centran en el primero y no tienen la experiencia suficiente para comprender o estimar realmente el segundo.

Los desarrolladores experimentados lo hacen, pero por varias razones (muchas legítimas) eligen la primera.

El término pirateo casi siempre implica una intención de resolver un problema temporalmente y "hacerlo inmediatamente después", pero los desarrolladores experimentados saben que las cosas más permanentes en el código son los ataques temporales.

Uri
fuente
13
¡+1 para "pero los desarrolladores experimentados saben que las cosas más permanentes en el código son hacks temporales"! Lo que también significa que la pereza nunca debe impedir que lo hagas bien.
Matthieu M.
20

¿Cómo es una solución mala si funciona?

Considera esto

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

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

El segundo ejemplo, sin embargo, podría ser un truco que se usa debido a la ignorancia de una mejor práctica o una suposición que /1parecía más simple en ese momento o un error en una biblioteca que hizo el /1trabajo correctamente.

¿Se debe a las buenas prácticas?

No. Los hacks son códigos "convenientes". Hay tres cuatro causas.

  • La ignorancia de los principios de diseño adecuados. (es decir, principios SÓLIDOS)

  • Arrogancia (es decir, suposiciones erróneas) sobre una construcción de API o lenguaje.

  • Errores reales que no se resuelven pero se solucionan.

  • La administración anula los buenos supuestos de diseño y corrección. El "presupuesto" es una justificación común, pero esta es esencialmente una de las tres anteriores (ignorancia, arrogancia o error) con una causa raíz no técnica.

¿O no mantenible?

Ese es el punto. El hack se basa en ignorancia, errores o suposiciones.

¿Utiliza un efecto secundario del código como parte de su solución?

Eso puede ser un ejemplo de ignorancia o una suposición falsa.

revs S.Lott
fuente
Gran respuesta, pero no tiene en cuenta que los hacks a veces se escriben con calidad que se reduce debido al triángulo Calidad vs Tiempo vs Costo.
StuperUser
1
Solía ​​jugar ese juego con clientes. Les pediría que elijan los dos aspectos más importantes de un proyecto de Calidad, Tiempo, Costo. Casi siempre se elegían Tiempo y Costo, y luego regateaban por la calidad. Específicamente, citando el hecho de que era un consultor y debería poder entregar los tres a tiempo, costo y con una calidad sobresaliente. ¡Este escenario es como los dientes de gallina!
OptimizePrime
1
@Optimize: los dientes de gallina son raros. ¿Es esta situación rara?
Matt Ellen
@ Matt Ellen: Puede ser un uso diferente de la frase "Dientes de gallina". Puede significar "contradictorio" en lugar de "raro".
S.Lott
Creo que casi siempre es la decisión de "anulación de la gestión".
Mark McDonald
15

Hackear en contexto de programación sería equivalente a arreglar algo con cinta de pato o chicle.

Hackear a menudo implica el uso de algunas características no documentadas y no compatibles, que pueden cambiar en el futuro para romper su código. También pueden involucrar valores codificados.

Hackear también podría ser una solución temporal en el código usando alguna biblioteca / servicio, en lugar de resolver un problema subyacente. Si más tarde está fuera de tu control, el pirateo podría ser la única forma de lidiar con él.

revs vartec
fuente
21
Usar cinta de pato para conductos sería un charlatán;)
JeffO
quack quack quack
Mateen Ulhaq
11

El término se usa ocasionalmente con la connotación opuesta, como en un "truco brillante". Solo porque es mucho más común equivocarse que hacer algo brillante, es mucho más común escuchar sobre hacks horribles que hacks brillantes, pero he oído que el término se usa en ambos sentidos.

"Hackear" usado en sentido positivo básicamente significa una solución elegante que resuelve el problema de una manera inesperada y particularmente inteligente. Los significados negativos y positivos son en realidad un poco cercanos porque un truco brillante a menudo implica aprovechar un aspecto no intencionado de la tecnología.

jhocking
fuente
1
Es un truco brillante porque será difícil ver lo que hiciste en la superficie, pero eso, después de una inspección más detallada, es obvio que este es un código de campo izquierdo ridículamente inteligente. ¿Puedo dirigirlo a la magia de la raíz cuadrada del terremoto? Codemaestro.com/reviews/9
Robert Massaioli
10

Una solución que funciona en este momento , pero que probablemente causará problemas a largo plazo.

Ejemplo: necesita generar un documento HTML, completando algunos valores dinámicamente. La forma correcta de hacer esto es usar una de las herramientas que están realmente diseñadas para este propósito, como Freemarker, XSLT o JSP. Pero no puede usar ninguno de esos, o simplemente no puede molestarse en hacerlo correctamente, por lo que escribe algo como esto:

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

Un truco es una solución ingeniosa para un problema, que a menudo depende de un pensamiento innovador y aprovecha los hechos inesperados sobre el medio ambiente. Hay un dicho sobre el truco arquetípico de que los espectadores están de acuerdo en que es ingenioso, pero no pueden determinar si es maravilloso u horrible. Este es el tipo de cosas que no desea en sus arreglos de mantenimiento.

Es muy probable que un truco que solucione un problema dependa de los detalles del entorno, o de las características no documentadas de una herramienta, o algo así. Es probable que sea una solución frágil, que funcione ahora pero que se rompa cuando algo cambie. Puede ser difícil entender cómo funciona, y cualquier programador de mantenimiento odiará el código difícil de entender. Puede tener efectos secundarios que no duelen nada por el momento, pero causarán problemas en piezas de código perfectamente buenas a cierta distancia en el futuro, y eso puede ser una pesadilla con la que lidiar.

David Thornley
fuente
9

La palabra hackear es mal utilizada. Si realmente quieres tener un poco de historia, puedes Wikipedia. Un truco es una palabra para describir el proceso de ajustar las cosas para hacer algo que no estaban destinadas a hacer. En el contexto de la ingeniería eléctrica, esto es bueno. Hay una mejor descripción en Wikipedia sobre esto.

Ahora, en el contexto de la informática. Un truco es generalmente malo. Sí, funciona, pero generalmente significa que el programador escribió un código ambiguo que no cumple con el diseño del software y que confundirá a cada programador que tenga que leer ese código. Por supuesto, el tiempo de los programadores es costoso, por lo que como gerente uno quiere tener el software más fácil de mantener. Lo mismo es válido para programadores. Además, los hacks tienden a romper algo más, en el software.

Es una decisión judicial si se acepta el hack o no. Al menos quieres que el ingeniero de software senior apruebe el hack, ya que tiene más experiencia y es capaz de tomar una decisión más educada. Definitivamente no quieres que los chicos junior tomen decisiones sobre aceptar hacks. Pueden llegar a uno y discutir con los hombres mayores si los beneficios valen la pena de mantener el truco.

Erion
fuente
6

Este es un truco, como se encuentra en thereifixedit.com .

Cortar a tajos

En realidad, todo lo que hay en ese sitio es un truco.

Los hacks son usos ingeniosos y audaces de algunas cosas fuera de su contexto.
La belleza de un hack consiste en el hecho de que tiene un problema determinado y herramientas que nunca tuvieron la intención de resolverlo, pero resuelve el problema solo con esas herramientas (en lugar de obtener las correctas). Son inteligentes, rápidos y divertidos. La desventaja es que los resultados son a menudo frágiles y peligrosos para los extraños.
Quiero decir, si te gusta resolver tus problemas como en la imagen, no hay problema. El problema ocurre cuando resuelves los problemas de otras personas así. En este caso, probablemente se electrocuten o se quemen o algo así.

En el desarrollo de software, desea que su código pueda ser manejado por otros (lo que incluye su futuro) sin el equivalente de una lesión mortal. Como dijo Dijkstra:

El programador competente es plenamente consciente del tamaño limitado de su propio cráneo. Por lo tanto, aborda su tarea con total humildad y evita trucos ingeniosos como la peste.

Y los hacks se encuentran entre los trucos más ingeniosos.

Los hacks son bombas de tiempo en algún lugar de su código, porque los comunes se basan inherentemente en demasiados supuestos ("simplemente hacerlo" es preferible al desacoplamiento adecuado). Tan pronto como esas suposiciones ya no se cumplan, todo su sistema puede fallar sin que tenga idea de lo que sucedió.

back2dos
fuente
4

El término no es muy preciso, pero probablemente se refiere a una solución rápida y sucia a un problema que es difícil de resolver adecuadamente. La solución en cuestión probablemente funcione, pero probablemente no sea una muy buena implementación, tal vez tenga errores sutiles, tal vez algunos pequeños errores conocidos , y debería rehacerse más tarde, si el tiempo lo permite. Creo que lo que estás escuchando llamado "pirateo" a veces también se llama " kludge ".

A menudo veo que ocurren hacks cuando hay limitaciones de tiempo muy estrictas para finalizar una tarea, y se implementa una solución de hack porque funciona "lo suficiente" para pasar el control de calidad, con la esperanza de que se pueda solucionar más adelante. Desafortunadamente, esa reparación / limpieza posterior no siempre ocurre :(

FrustratedWithFormsDesigner
fuente
No estoy seguro de lo que quieres decir con "no muy preciso". Diría que la mayoría de los programadores sabrán exactamente lo que significa decir que un código escrito es un truco. Pero el resto de la respuesta es acertada, funciona, pero por alguna razón (arquitectura, actuaciones, etc.) no es una solución óptima.
ozz
@james: En mi experiencia, dos programadores pueden ver algún código y uno lo llamará un hack, el otro no. No hay una forma real de cuantificar un fragmento de código como un truco. Todos tienen su propia idea de lo que es un hack, y a menudo son similares pero no siempre iguales. Escrito como alguien a quien su código ha llamado "pirateo" por otros, y no estuvo de acuerdo. Y he llamado al código de otras personas "hackish" y no estuvieron de acuerdo. Es cierto, esos son probablemente casos límite, pero los límites pueden ser difusos a veces ...
FrustratedWithFormsDesigner
1
@FWFD: eso no está de acuerdo sobre si algo ES un truco. Si alguien "dice" algún código es un truco, sabrás lo que significan.
ozz
4

Paso mucho tiempo como desarrollador front-end, por lo que mi definición de hack es:

Una solución que se basa en un conocimiento profundo de los defectos del entorno y el comportamiento indocumentado.

El entorno puede ser su marco, navegador web, base de datos, cajero automático (cajero automático), caso judicial. Cualquier "sistema de reglas", donde conoces un agujero de bucle y lo explotas para resolver un problema.

mefisto
fuente
4

Un hack es generalmente un código que aparentemente proporciona la salida deseada, pero de una manera subóptima.

Por lo general, está utilizando alguna característica de biblioteca / lenguaje indocumentado u oscuro de alguna manera que no fue intencionada por el creador y, por lo tanto, ofuscó la intención.

Ocasionalmente, se hace para evitar algún error de idioma o biblioteca, pero en la mayoría de los casos la causa principal suele ser la ignorancia;

Para un martillo, todo parece un clavo.

Cosas que se hacen de manera ineficiente, generalmente en el espacio y el tiempo, pero que finalmente producen el resultado deseado, pero a un costo y posibles casos límite desconocidos sin capacidad de prueba y sin mantenimiento. Por lo general, deriva de una falta de comprensión fundamental de la lógica o del lenguaje. Ver también "el camino difícil".

Por lo general, el código es algo que alguien con la experiencia adecuada ni siquiera consideraría hacer, o tendría que pensar mucho para hacerlo tan complicado e ineficiente como la ronda de pirateo que han descubierto.

Ejemplos

La corrección de Vista

Validez de correo electrónico Validez

Unidades de software

Hash no determinista

revs usuario7519
fuente
+1 Para subóptimo. Y porque los hacks no son necesariamente "temporales" como los más votados.
rlb.usa
2

Un neumático calvo funciona pero nadie lo llamaría una solución ideal para un pinchazo. Puede crear problemas peores en el futuro.

Por lo general, consideraría un hack como una solución rápida y sucia a un problema inmediato. Por lo general, puede no ajustarse a la práctica de programación normal en una tienda de programación (por ejemplo, usar mucha codificación rígida). Bien puede ser una pequeña solución.

Una razón clave por la que es malo es que a) puede causar resultados impredecibles b) puede no coincidir con el diseño original del código en cuestión, lo que causará problemas de mantenimiento. En mi experiencia, los hacks también suelen estar muy poco documentados.

temptar
fuente
2

Una breve definición que he escuchado y respeto.

"Una solución a un síntoma que no resuelve completamente el problema en todos los casos"

El código feo puede o no ser un hack. El ejemplo 2 + 2 en otra respuesta no es un truco, es una solución de código fea y mala desde el punto de vista de la comprensión del código, pero produce la solución correcta en todos los casos. Piense en una ecuación factorizada en matemáticas: el comportamiento / relación es idéntico y correcto en ambas versiones, pero la forma es diferente. Hmm, factoriza una ecuación, refactoriza una ecuación, refactoriza el código ... no, no hay similitud, estoy seguro :)

El ejemplo en una de las otras respuestas sobre cambiar el primer nombre a "Jim" es un truco: resuelve el síntoma (el primer nombre en la lista es Jim), pero no resuelve completamente el problema (la lista no está ordenada o priorizado de cualquier manera que funcione para todas las entradas).

luego
fuente
1

Un hack está haciendo algo que devuelve el resultado esperado, pero lo hace de una manera extraña (generalmente incurriendo en un golpe de rendimiento).

P.ej:

Tarea : Convertir una variable entera a un doble

Solución : utilice el operador de reparto. Es decir: dblVar = CType (intVar, Double)

Hack : Divide por un doble. Es decir: dblVar = intvar / 1.0

Caballero Cebolla
fuente
+1 para un ejemplo estelar. En el antiguo código AS400 veré las fechas europeas multiplicadas por algún decimal loco, que genera la fecha estadounidense. Los problemas comienzan cuando ciertos codificadores comienzan a filtrar eso en nuestro código .Net ... ¡bleh!
Morgan Herlocker
0

Imagínese si su pierna se infectó y tuvo que ser removida para poder sobrevivir. ¿Prefiere que el médico lo corte rápidamente con un hacha, o lo quite quirúrgicamente después de examinar el problema y elegir las herramientas, el procedimiento, etc.? Lo mismo se aplica al software.

Josh Smith
fuente
Le pediría que lo corte antes de que el atacante tenga la oportunidad de hackear mi cerebro.
Mateen Ulhaq
¿Y si solo tuvieras unos minutos?
StuperUser
0

Un hack señala su nacimiento cuando el codificador responsable declara "Volveré y lo arreglaré más tarde".

En una nota seria: un hack en el contexto del OP es algo que logra el resultado deseado, pero utiliza un método temporal o poco confiable para hacerlo.

La otra definición común es una técnica que explota los comportamientos de casos extremos para eludir las limitaciones / salvaguardas en la plataforma.

Hackear en el segundo contexto tiene un cierto prestigio entre los codificadores de héroes "rebeldes" (léase: peligrosos) ...

sunwukung
fuente