¿Qué es un hack? [cerrado]

55

A menudo escucho a compañeros de trabajo que se dicen unos a otros, "Eso es un truco horrible, horrible".

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

Es interesante para mí cuando algo está clasificado como un hack. ¿Cómo puedes identificarlo?

    
pregunta dustyprogrammer 12.01.2016 - 18:48

17 respuestas

97

Se está aplicando una ayuda de banda 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 llamada "Jim" aparezca siempre primero en una lista alfabética. Para resolverlo rápidamente, le cambias el nombre a " Jim" . Este es un truco que seguramente volverá a morderte más tarde.

    
respondido por el JD Isaacks 01.05.2018 - 18:36
59

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

Un truco es una situación en la que se prefiere el primero, mientras que 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 los primeros y no tienen la experiencia suficiente para entender o estimar realmente lo último.

Los desarrolladores con experiencia lo hacen, pero por diversos motivos (muchos legítimos) eligen el primero.

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

    
respondido por el Uri 03.05.2011 - 17:08
20
  

¿Cómo es mala una solución 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 hack que se usa debido a la ignorancia de una mejor práctica o la suposición de que /1 parecía más simple en ese momento o un error en una biblioteca que hizo el /1 funciona correctamente.

  

¿Se debe a una buena práctica?

No. Hacks son código "conveniente". Hay tres cuatro causas.

  • Ignorancia de los principios de diseño apropiados. (es decir, principios Sólidos)

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

  • Errores reales que no se resuelven pero que se solucionan.

  • Anulación de la administración a buenos supuestos de diseño y corrección. "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 es mantenible?

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

  

¿Está utilizando un efecto secundario del código como parte de su solución?

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

    
respondido por el S.Lott 03.05.2011 - 19:50
15

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

Hack muy a menudo implica el uso de algunas características no documentadas y no compatibles, que pueden cambiar en el futuro rompiendo tu código. También pueden implicar valores codificados.

Por lo general, la piratería también puede ser un trabajo temporal en el código usando alguna biblioteca / servicio, en lugar de resolver el problema subyacente. Si más adelante está fuera de su control, la piratería podría ser la única forma de lidiar con él.

    
respondido por el vartec 03.05.2011 - 17:55
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 arruinar que hacer algo brillante, es mucho más común escuchar acerca de hacks horribles que de hacks brillantes, pero he oído que el término se usa de ambas maneras.

"Hack" 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 hack brillante a menudo implica aprovechar un aspecto no deseado de la tecnología.

    
respondido por el jhocking 03.05.2011 - 23:22
10

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

Ejemplo: necesita generar un documento HTML, rellenando algunos valores dinámicamente. La forma correcta de hacer esto es usar una de las herramientas que están diseñadas para este propósito, como Freemarker, o XSLT, o JSP. Pero no puedes usar ninguno de ellos, o simplemente no puedes molestarte en hacerlo correctamente, así que escribes algo como esto:

public String getGreetingPage(String name) {
    return "<html><body>Hello, "+name+"!</body></html>";
}
    
respondido por el Mike Baranczak 03.05.2011 - 17:11
9

Un pirateo es una solución ingeniosa para un problema, que a menudo depende del pensamiento original y se aprovecha de datos inesperados sobre el medio ambiente. Hay un dicho por ahí sobre el hackeo arquetípico que los espectadores están de acuerdo que es ingenioso, pero no pueden averiguar si es maravilloso u horrible. Este es el tipo de cosas que no desea en sus arreglos de mantenimiento.

Es muy probable que un hack 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 cambia. 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 dañen 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 para tratar.

    
respondido por el David Thornley 03.05.2011 - 18:32
9

La palabra hackear es mal usada. Si realmente desea obtener un poco de historia, puede Wikipedia. Un truco es una palabra para describir el proceso de ajustar cosas para hacer algo que no estaban destinados 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 hack es generalmente malo. Sí, funciona, pero generalmente significa que el programador escribió una parte ambigua del código 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 los programadores. Además, los hacks tienden a romper algo más, en el software.

Se trata de una sentencia de juicio para aceptar o no el truco. Al menos, usted quiere que el ingeniero de software sénior apruebe el pirateo, ya que tiene más experiencia y puede tomar una decisión más informada. 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 hackeo.

    
respondido por el Erion 03.05.2011 - 19:38
6

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

Enrealidad,todosobreesesitioesunhack.

Loshackssonusosingeniososyaudacesdealgunascosasfueradesucontexto.
Labellezadeuntrucoconsisteenelhechodequetieneunproblemadadoyherramientasquenuncafuerondiseñadaspararesolverlo,peroqueresuelveelproblemasoloconesasherramientas(enlugardeobtenerlascorrectas).Soninteligentes,rápidosydivertidos.Elinconvenienteesquelosresultadossonamenudofrágilesypeligrososdeusarparapersonasexternas.
Quierodecir,sitegustaresolvertusproblemascomoenlaimagen,nohayproblema.Elproblemaocurre,cuandoresuelvesasílosproblemasdeotraspersonas.Enestecaso,probablementeseelectrocutaríanoquemaríanoalgoasí.

Eneldesarrollodesoftware,usteddeseaquesucódigopuedasermanejadoporotros(loqueincluyesufuturo)sinelequivalenteaunalesiónfatal.ComodijoDijkstra:

  

Elprogramadorcompetenteestácompletamente  conscientedeltamañolimitadodesupropia  cráneo.Poresoseacercaasu  Tareacontotalhumildad,yevita.  Trucosinteligentescomolaplaga.

Yloshacksestánentrelostrucosmásinteligentes.

Loshacksestánmarcandolasbombasdetiempoenalgúnlugardesucódigo,porqueloscomunessebasaninherentementeendemasiadassuposiciones(seprefiere"simplemente hacerlo" a un desacoplamiento adecuado). Tan pronto como esas suposiciones ya no se cumplan, todo su sistema puede descomponerse sin que usted tenga una idea de lo que sucedió.

    
respondido por el back2dos 04.05.2011 - 22:25
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 implementación muy buena buena , tal vez tenga errores sutiles, tal vez algunos errores pequeños conocidos , y debería Ser rehecho más tarde, si el tiempo lo permite. Creo que lo que estás escuchando llamado "hack" también se llama a veces " kludge ".

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

    
respondido por el FrustratedWithFormsDesigner 03.05.2011 - 17:40
4

Pasé 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 fallas de entornos y comportamiento no documentado.

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

    
respondido por el mefisto 03.05.2011 - 18:17
4

Por lo general, un hack es un código que aparentemente proporciona el resultado deseado, pero de manera subóptima.

Por lo general, utiliza alguna función de lenguaje / biblioteca no documentada u oscura de alguna manera que no fue intencional por parte del originador y, por lo tanto, confunde cuál es la intención.

Ocasionalmente se hace para solucionar algunos errores de lenguaje o de biblioteca, pero en la mayoría de los casos, la causa principal suele ser la ignorancia;

  

Para un martillo todo parece un   uña.

Las cosas que se realizan de manera aproximada son ineficientes, generalmente tanto en espacio como en tiempo, pero eventualmente producen el resultado deseado, pero a un costo, y posibles casos de borde incognoscibles sin comprobabilidad ni mantenimiento. Por lo general, se deriva de una falta de comprensión fundamental de la lógica o las expresiones idiomáticas. También vea "la manera 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 por mucho tiempo para que sea tan complicado e ineficiente como la ronda de piratería que han descubierto.

Ejemplos

La solución de Vista

Validez de la validación de correo electrónico

Unidades de software

Hash no determinista

    
respondido por el Jarrod Roberson 05.05.2011 - 07:18
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 truco como una solución rápida y sucia a un problema inmediato. Por lo general, es posible que no se ajuste a la práctica de programación normal en un taller de programación (por ejemplo, utilice mucha codificación física). 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 están típicamente muy mal documentados también.

    
respondido por el temptar 03.05.2011 - 17:45
2

Una definición corta 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 de 2 + 2 en otra respuesta no es un pirateo, 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 acerca de cambiar el nombre a "Jim" es un truco: resuelve el síntoma (el primer nombre en la lista es Jim), pero no resuelve el problema por completo (la lista no está No se clasifica ni prioriza de ninguna manera que funcione para todas las entradas).

    
respondido por el anon 04.05.2011 - 00:30
1

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

Por ejemplo:

  

Tarea : para convertir una variable entera en un doble

     

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

     

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

    
respondido por el Onion-Knight 04.05.2011 - 21:30
0

Imagina que tu pierna se haya infectado y haya que quitarla para poder sobrevivir. ¿Preferiría que el médico lo cortara rápidamente con un hacha o lo eliminara quirúrgicamente después de examinar el problema y elegir las herramientas, procedimientos, etc. adecuados? Lo mismo se aplica al software.

    
respondido por el Josh Smith 04.05.2011 - 00:52
0

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

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

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

El pirateo en el segundo contexto tiene un cierto prestigio entre los "codificadores" de héroes (leídos: peligrosos) ...

    
respondido por el sunwukung 04.05.2011 - 15:15

Lea otras preguntas en las etiquetas

Comentarios Recientes

¡Renji convocado! Fuentes oscuras me dijeron que Toei Animation se está desarrollando actualmente en una serie derivada de sus próximos proyectos de versión de Witchblade X9 que utilizará el talento y la personalidad de Lanya. Nos complace informar que el 2 de junio de 2015 la misma compañía envió la novela Episodio 10 de Light, que se espera que incluya un nuevo personaje dibujado por Shin Wataru. La serie lanzará el primer capítulo 5 de la novela y también será serializada. en tres volúmenes. Aparentemente... Lee mas