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?
terminology
polvo
fuente
fuente
+
para dividirlos en función de la heurística.Respuestas:
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.fuente
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.
fuente
Considera esto
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
/1
parecía más simple en ese momento o un error en una biblioteca que hizo el/1
trabajo correctamente.No. Los hacks son códigos "convenientes". Hay
trescuatro 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.
Ese es el punto. El hack se basa en ignorancia, errores o suposiciones.
Eso puede ser un ejemplo de ignorancia o una suposición falsa.
fuente
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.
fuente
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.
fuente
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:
fuente
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.
fuente
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.
fuente
Este es un truco, como se encuentra en thereifixedit.com .
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:
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ó.
fuente
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 :(
fuente
Paso mucho tiempo como desarrollador front-end, por lo que mi definición de hack es:
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.
fuente
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;
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
fuente
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.
fuente
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).
fuente
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:
fuente
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.
fuente
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) ...
fuente