¿Debo compartir mi horrible software?

Después de publicar mi artículo, algunas personas me pidieron que compartiera el software que desarrollé. Al principio, estaba muy feliz de que mi artículo atrajera algo de atención, y estaba feliz de compartir no solo el código binario sino también el código fuente, los estudios de casos, etc. Pero mirando mi software, me siento muy avergonzado.

Mi software es horrible: el código fuente es un desastre y contiene varios de mis intentos fallidos; Nunca he usado patrones de diseño, por lo que el código duplicado está en todas partes; por simplicidad y una implementación rápida, a menudo prefiero las recursiones a los bucles, etc.

Siempre estoy bajo presión para producir nuevos resultados, y limpiar ese código me costaría un esfuerzo significativo.

Mi pregunta es si compartir este horrible software le dará a la gente una impresión muy negativa de mí. ¿Haría daño a mi carrera si las personas que comparto son posibles colaboradores, empleadores, ya que trabajan en el mismo campo?

No estoy seguro de cuánto realmente puedo ayudarte, pero he visto este video que, basado en tu problema, podría animarte un poco. google.co.uk/… Lo siento, no pude ayudarte más, solo quería mostrarte este video que pensé que era relevante.
Suena a software académico.
Sucio secreto: la mayoría del software académico es horrible. Incluso las cosas que salen del departamento de Ciencias de la Computación.
Puede lanzarlo bajo la licencia CRAP: matt.might.net/articles/crapl
La investigación generalmente implica probar mil cosas que no funcionan. Si logra escribir un código que funciona en los primeros intentos, probablemente no esté investigando, sino simplemente implementando.
Este artículo sobre la revista SIAM es una lectura fascinante y presenta un argumento muy convincente.
Otro punto a considerar: ¿Qué sucede si algunas de sus conclusiones se basan en datos falsos originados por un error en su software? Los lectores deberían poder verificar eso.
Publicar su código en un lugar público como GitHub le brinda la oportunidad de mostrar cómo ha mejorado gradualmente su software. Mejorar significativamente el software sin cambiar los resultados generados por el software no es una tarea fácil y, por lo tanto, es una habilidad que se valora mucho. Puede que le resulte útil publicar parte del código en el sitio de revisión de código codereview.stackexchange.com .
@qsphan Solo por curiosidad, ¿de qué trata su trabajo?
Para agregar a la conversación: phdcomics.com/comics/archive.php?comicid=1692
@mankoff: Por favor, no. Esa licencia es abismal . Lanzarlo bajo 3-Clause BSD con una gran etiqueta advirtiendo sobre la calidad sería una opción mucho mejor.
una gran cantidad de software no académico también es un desastre, cf. errores recientes de bash...
Blah, como programador: "Siempre estoy bajo presión para producir nuevos resultados, y limpiar ese código me costará un esfuerzo significativo". ¿Se da cuenta de que la razón por la que está bajo tanta presión es porque pasa tanto tiempo DEPURANDO el código que nunca se molestó en escribir o mantener correctamente?
Incluso si el código es realmente horrible, lo cual lo dudo, aún está probado en batalla y depurado, lo cual es mucho, MUCHO más valioso que usar los últimos patrones de diseño, etc. Asegúrese de agregar instrucciones detalladas en la plataforma subyacente (Ubuntu 12.04, OS X 10.7 con XCode con libX versión Y, etc.) ya que puede haber diferencias sutiles que den problemas, así como instrucciones completas sobre cómo compilar y vincular sus programas. Probablemente ya hayas automatizado un poco al escribirlo, solo anótalo para que otros puedan verlo.
No hay nada malo con la recursividad a menos que el lenguaje de programación no admita la optimización.
@Philipp: Lo que más me preocupa es una situación en la que el documento es correcto, pero el código tiene un error desagradable. En ese caso, corregir el error cambiaría la corrección de la respuesta pero no (digamos) sus características de rendimiento... así que si publica el código, corre el riesgo de avergonzarse incluso cuando sus resultados no se invaliden. (He encontrado este tipo de errores en mi propio código antes).
@Mark: La mayoría del software es horrible, punto final. No se limita a lo académico, y no es un secreto realmente. ;-)
Solo para agregar a esto, incluso el software científico que se usa todos los días en las principales aplicaciones se vuelve desordenado y horrible: el código utilizado por Met Office todavía está en Fortran y tiene fragmentos por todas partes desde hace varias décadas ...
@djechlin Aunque ocasionalmente es cierto, "La fuente de su presión es su mala codificación" no siempre es generalizable. ¿A menos que hubiera algo en mis habilidades con Python que estuviera impulsando la última epidemia de ébola?
@Fomite algo sobre tus habilidades con Python es la razón por la que aún no has terminado tu investigación sobre el ébola, si quieres decirlo de esa manera: P
@djechlin Nah, creo que es probable que tenga más que ver con la gente que sigue muriendo...
@Fomite, ¿por qué molestarse en escribir código si hay personas que mueren de cualquier manera?
@Fomite mi punto es que si vas a hacerlo , debes hacerlo bien y rápido si es el principal cuello de botella en tu trabajo. Supongo que se podría decir que el principal cuello de botella en su trabajo es la prevalencia del ébola, pero después de eso, hay una gran probabilidad de que sea lo bien que funciona su código. Pero si quieres insistir en que la existencia del ébola es el problema, entonces más poder para ti.
@djechlin Solo estoy señalando que la idea de que la fuente de presión sobre un académico se reduce a una mala codificación es profundamente presuntuosa y definitivamente no generalizable.
¿Es posible trabajar con un estudiante de grado o posgrado de informática y hacer que 'limpie' parte del código?
Sugerencia de un programador: no mantenga sus intentos fallidos como código comentado o en clases no utilizadas. En su lugar, envíe versiones (semi) funcionales al control de código fuente (GIT) con frecuencia. ¡Elimine siempre el código muerto que ya no es necesario! Si tiene que volver a una versión anterior, restáurela desde el control de código fuente. Es mucho más fácil estar al tanto de su código de esta manera, porque hay mucho menos código para leer. Con respecto al punto de que su código no usa patrones de diseño sofisticados, etc.: eso podría ser algo bueno, manténgalo lo más simple posible, solo agregue complejidad donde sea absolutamente necesario.

Respuestas (18)

Si deberías.

Primero, la mayoría del software científico es terrible. Me sorprendería mucho si el tuyo es peor que el promedio: el mero hecho de que conoces los patrones de diseño y la diferencia entre la recursividad y los bucles sugiere que es mejor.

En segundo lugar, es poco probable que tenga el incentivo o la motivación para mejorarlo a menos que, o hasta que, alguien más lo necesite (o usted en 6 meses). Abrirlo te da ese incentivo.

Potenciales ventajas: posibles nuevos colaboradores, corrección de errores, extensiones, publicaciones.

Desventajas potenciales: disipador de tiempo (mantener el código o solucionar problemas para otras personas), ser descubierto. Seré claro: no me tomo ninguno de estos inconvenientes muy en serio.

La mayoría del software científico NO es terrible. (Me gané la vida trabajando con él y optimizándolo durante un par de décadas, así que creo que tengo una opinión informada). Simplemente tiene criterios bastante diferentes para la bondad: trabajar, obtener respuestas correctas en tiempo práctico, ser extensible a la próxima teoría, etc., en lugar de ajustarse al último paradigma de diseño cuasi-religioso o tendencia lingüística. Y para el OP, su software "horrible" podría, si se limpia y comenta un poco, ser más accesible para otros científicos que el código "bueno".
Solo agregaría a esto que sugeriría compartirlo a través de Github o similar, que tiene una comunidad vibrante y facilita que las personas colaboren, bifurquen su proyecto y contribuyan a él.
No se menciona el elefante en la habitación, ¿ reproducibilidad ?
@jamesqf: exageré para el efecto, pero mi pensamiento es este. La mayoría del software científico es un código corto de prueba de principio y desechable. Rara vez se publica fuera de un grupo pequeño y, según mi experiencia, está mal escrito. La mayoría del software científico que dura a una escala razonable no es terrible (también he trabajado con algunos en una escala de tiempo similar): no puede ser para producir múltiples publicaciones. Pero estoy pensando en "todo el código escrito por científicos" aquí.
@mmalmeida Estoy de acuerdo, Github es un conducto para la colaboración. Los problemas e hitos ofrecen una forma de realizar un seguimiento de los problemas y las solicitudes de mejora. Antes de abrir este código, también recomendaría tomarse un tiempo para limpiarlo o, como mínimo, agregarle comentarios descriptivos.
@jamesqf Bueno, la mayoría es terrible. También diría que tengo una opinión informada. Cómo funciona el código no es un criterio de "bondad" del código para un programador, al menos para el que se considera bueno. La corrección es una propiedad "imprescindible". La tasa de divergencia, la estabilidad numérica, la velocidad (excluyendo las optimizaciones específicas del hardware), etc., son propiedades del algoritmo que implementa el código. Puede tener un código bueno y un código malo que realicen lo mismo. Aunque admito que "bueno" es demasiado vago y, a menudo, da lugar a malentendidos. Yo diría que la "calidad del código" es muy a menudo terrible. Incluso si el programa funciona muy bien.
@jamesqf: la mayoría del software científico con el que me he encontrado no estaba en ningún tipo de control de fuente, y esto suena como otro ejemplo (o por qué si no, todos los intentos fallidos siguen ahí).
@RemcoGerlich: Bueno, hay un ejemplo de tener diferentes criterios para la 'bondad'. Todavía no he encontrado un sistema de control de código fuente que no tenga un defecto de diseño importante y obvio: sacar archivos del sistema restablece su marca de tiempo a la hora de salida, no a la hora de la última modificación. Los implementadores de estos sistemas obviamente piensan que es una característica 'buena', he tenido varios argumentos en el foro de usuarios al respecto, pero el resultado final es que no uso el control de versiones a menos que me paguen explícitamente para hacerlo.
@jamesqf: no lo tome como algo personal, pero eso ocupa un lugar bastante alto en la lista de razones tontas para no usar el control de fuente (además, con VCS "normales" se necesita una secuencia de comandos de quizás 20 líneas para "arreglar" este "diseño principal defecto").
@jamesqf Nunca he visto que la marca de tiempo del archivo importe, en absoluto . El único caso en el que puedo pensar que afecta algo es make, y cuando tiene un pago limpio, no hay binarios para verificar si necesitan reconstrucción. Los beneficios del control de fuente son obvios: seguimiento de cambios (que es increíblemente valioso en la práctica), protección contra pérdidas, compartir más fácilmente con colegas y permitir que las personas trabajen en la misma base de código simultáneamente. Su problema parece extremadamente oscuro, y apostaría a que esos beneficios por sí solos superan las desventajas de su caso de uso particular.
El proyecto Sage ( sagemath.org ) es un ejemplo vivo de software de investigación matemática que no es horrible , aunque constantemente hay discusiones de diseño y quejas sobre la práctica de codificación.
@ jpmc26: ¿Cómo pueden no importar los tiempos de los archivos? Tal vez si solo trabaja en un conjunto de código, no son tan importantes, pero si tiene muchos códigos diferentes, cada uno con muchos archivos (típico del software científico, en mi experiencia), es realmente útil para poder ver en un vistazo (haciendo, por ejemplo, 'll *.[chyl]' exactamente en qué archivos trabajó y cuándo. Ahora estoy de acuerdo en que un sistema de control de código fuente que FUNCIONE CORRECTAMENTE sería una gran herramienta para tener. El problema es que el !@# Los $s que los construyen se niegan absolutamente a implementar esta solución realmente simple.
Las confirmaciones de @jamesqf (el núcleo de la mayoría de los sistemas de control de código fuente) tienen marcas de tiempo. En git, por ejemplo, crea una confirmación para cada modificación de tus archivos de datos, por ejemplo, "vuelve a ejecutar la simulación usando el nuevo código de la revisión XXX". Para cada modificación de código, haga una confirmación que diga "código mejorado en XXX por motivo YYY". Luego, en lugar de tener una "fecha de última modificación" para sus archivos, obtiene una buena lista de confirmaciones, junto con cuándo ocurrieron, qué archivos se agregaron/modificaron/eliminaron exactamente y un comentario útil. No hay solución que hacer, simplemente no sabe cómo usar el control de fuente correctamente.
Sin mencionar que si realmente necesita esta función, cualquier software de control de fuente le permite preguntar cuándo se modificó por última vez un archivo. De hecho, la mayoría irá más allá y le dirá qué confirmación afectó por última vez a un archivo, brindándole el contexto del cambio además de la marca de tiempo, que es mucho más útil y práctico que "oh, modifiqué este archivo por última vez hace 26 días". , mejor miro en mi archivo .txt a ver qué hice allí... oh, espera, se me olvidó anotarlo, ups".
@jamesqf Thomas lo logró. Miras el historial de confirmaciones para ver qué se cambió, cuándo y cómo. Con una herramienta de diferenciación, incluso puede ver una comparación línea por línea de las versiones anterior y actual de los archivos (o incluso dos versiones anteriores). Su control de fuente se convierte en la fuente autorizada de esta información. Esto también hace que sea mucho más fácil compartir la historia con otros, algo que creo que sería valioso para la comunidad académica. En una nota al margen, por lo general, debe colocar bases de código no relacionadas en diferentes repositorios. Esto le permite ver las historias por separado.
@Thomas: Lo siento, pero esta es la misma línea de BS que recibo de los desarrolladores: trabaje de la manera que queremos que trabaje o piérdase. Lo siento, pero he INTENTADO trabajar a su manera, amigos. No funciona para mí.
@jamesqf En ese caso, sería bastante fácil escribir un gancho para la mayoría de los sistemas VCS para que funcione de la manera que desea. No hay razón para no tenerlo en ambos sentidos.
La razón por la que se restablecen las marcas de tiempo es porque si obtiene un archivo modificado en su pago que se modificó ayer, pero hizo una compilación esta mañana, la mayoría de los sistemas de compilación no detectarían el cambio (porque la marca de tiempo era más antigua que los artefactos de compilación) . Con la marca de tiempo establecida en el momento del pago, las compilaciones funcionarán.
@jamesqf Nos guste o no, usar VCS es una obligación pragmática. Si no utiliza VCS, a muchos colaboradores potenciales (incluidos casi todos los programadores experimentados) les resultará muy difícil tomar en serio su proyecto. Y el ímpetu de esos paradigmas de diseño "cuasi-religiosos" es la búsqueda de una elegancia inefable que hace que el proyecto sea extensible a la siguiente teoría y accesible a otros.
@jamesqf Hay una razón por la que 'los desarrolladores' siguen diciéndote eso: es porque tienen razón. Además, sí, la mayoría del software científico es bastante malo, incluido el mío. Escribo el código de manera muy diferente cuando lo escribo para un proyecto de producción que tengo la intención de mantener en comparación con cuando lo escribo como una prueba de concepto para ejecutar algunas simulaciones para un trabajo de investigación. He visto lo mismo en casi todos los códigos de investigación que he visto. Hay algunas excepciones, pero son solo eso: excepciones.
@jamesqf "¿Cómo pueden no importar los tiempos de archivo? Tal vez si solo trabaja en un conjunto de código, no son tan importantes, pero si tiene muchos códigos diferentes, cada uno con muchos archivos (típico del software científico, en mi experiencia ), es realmente útil poder ver de un vistazo exactamente en qué archivos trabajaste y cuándo". Uh... ¿no es ese exactamente el problema que el control de versiones pretende resolver?
@jamesqf Si el uso activo del control de fuente le causa problemas, probablemente solo necesite repensar un poco su flujo de trabajo. Si puede reducir los problemas específicos que tiene, las preguntas sobre cómo puede abordarlos de manera diferente probablemente sean bienvenidas en Programmers y StackOverflow. Dale un tiro. Es posible que se sorprenda de cuánto mejora su experiencia. También diré esto: si probaste git, ese sistema es realmente difícil de aprender. Es posible que le resulte más fácil comenzar con SVN, que es mucho más intuitivo y no exige tanto su flujo de trabajo. SVN es mucho mejor que nada.
Como alguien que trabaja en software, ningún código es perfecto . Pero no dejes que la perfección sea enemiga de lo “suficientemente bueno”. Como han dicho otros, alguien puede encontrar útil su software. Si puede tomarse el tiempo para limpiarlo un poco y agregar algunos comentarios o un LÉAME, mucho mejor :)
No es solo el software científico lo que está terriblemente escrito. He estado desarrollando en tiendas de software y empresas de fabricación por igual durante diez años, y les prometo que el código no se vuelve más limpio. En cualquier lugar. Escribir un código hermoso es muy difícil. Es como escribir un libro. El primer borrador generalmente apesta, pero en realidad contará la historia. Para vender un libro hay que embellecerlo. Para complacer a sus partes interesadas en las plantas, solo necesitan que cuente la historia.
Este hilo de comentarios se ha convertido en una conversación fuera de tema sobre VCS. Por favor lleve la discusión extendida a Academia Chat .
He tonteado con GATT (un programa para establecer horarios usando algoritmos genéticos, el banco de pruebas para una serie de doctorados en Escocia). Funcionó, pero el código contenía mucho código comentado, funciones no utilizadas (de tesis anteriores), código demasiado general (para acomodar diferentes intentos) y código muy estrecho, difícil de adaptar uno al lado del otro. Compuesto con estructuras de datos intrincadas, que a veces se convierten en usos no diseñados. Limpiar ese desastre habría sido una tarea enorme. Pero estaba bien como estaba para su marco para el rol de exploración.

Lo limpiaría un poco y lo compartiría. He publicado mucho código a lo largo de los años, y tampoco he publicado código por las razones que das.

Revísalo y coméntalo, en cualquier nivel que puedas. Dejar en "intentos fallidos" y comentarlos como tal. Di por qué fallaron y qué intentaste. Esta es información MUY útil para las personas que vienen después de ti.

Cree un archivo README que diga que lo está lanzando a pedido con la esperanza de que ayude a alguien. Digamos que sabe que el código es feo, pero espera que sea útil de todos modos.

¡Demasiadas personas retienen las cosas porque no es perfecto!

No puedo respaldar salir en intentos fallidos. Debería usar el control de versiones en su lugar. Está bien incluir comentarios breves que expliquen por qué falló el intento inicial, pero incluir el código fallido real puede ser activamente dañino.
@DavidZ Por el contrario, muéstralo. Si usa el control de versiones, las personas pueden ver variaciones anteriores de su trabajo, lo que está lejos de ser inútil. Pero si, como aquí, no usa VC, no elimine los intentos fallidos. Póngalos en otro archivo con los comentarios apropiados. ¿Qué tan dañino podría ser?
@coredump Puede hacer que todo el programa sea prácticamente incomprensible. He visto que esto suceda. Si no usa VC, comience a usarlo . La única forma en que podría respaldar una recomendación de no eliminar los intentos fallidos es si tiene prohibido poner el código en VC por algún motivo que no puedo imaginar, y es esencial ver el código anterior para comprender cuál es el código actual. el código lo hace (lo que probablemente significa que el código actual también es malo, aunque admito que pueden existir excepciones).
@DavidZ Lo siento, pero "Di por qué fallaron y qué intentaste" es un buen consejo, en mi humilde opinión. Si su código está desordenado y/o si no está acostumbrado a las prácticas de ingeniería de software, déjelo como está y comente todo lo que pueda. Eliminar información útil podría hacer que las cosas sean virtualmente incomprensibles. He visto que esto sucede ;-). De acuerdo, tal vez haya un término medio entre mostrar todas las cosas horribles que se intentaron y dejar rastros útiles. Creo que "lo limpiaría un poco" también es un buen consejo.
@coredump Decir lo que intentó en el sentido de incluir el código fallido es un buen consejo cuando solicita ayuda, pero no para escribir el programa en sí.
No veo cómo un código fallido puede ayudar, excepto ofuscar el código de trabajo (a menos que los errores sean claros y, por ejemplo, "código mucho más simple, pero solo funciona para entradas positivas"). Pero, ¿qué es bueno hacer comentarios (por ejemplo, "sería tentador usar matrices, pero no funcionarán para entradas no únicas").
Si el código es una implementación de un trabajo de investigación y él trató de implementarlo de diferentes maneras, mi suposición es que la solución no es obvia. En la investigación, alguien más podría ver el código de trabajo y pensar "Podría hacerlo mejor de esta manera", que podría ser una de las formas en que el autor lo intentó primero. Nos va mal en CS al compartir nuestros fracasos, lo que a veces conduce a la pérdida de trabajo. Ese es mi punto. No se puede saber si es una buena opción en este caso sin ver el código, pero conozco a muchos otros profesionales que comparten esta opinión.
Compartir intentos fallidos es diferente de mezclar código roto con el código de trabajo, lo que no logra nada excepto confundir e impedir la comprensión.

¡Sí! Especialmente si su trabajo es, por ejemplo, sobre un algoritmo nuevo/mejorado que ha implementado, o si realiza un análisis de datos no estándar significativo, o básicamente cualquier cosa en la que reproducir sus resultados signifique volver a implementar su software.

Los artículos rara vez tienen espacio para dar más que un bosquejo. Sé que he pasado (= desperdiciado) demasiado tiempo tratando de implementar algoritmos de documentos que omitieron detalles críticos (pero no estrictamente relevantes para el documento).

Muy cierto comentario sobre la reproducibilidad, en particular, el segundo párrafo.
@EP: Sí. Lo siento, es mi distípica apareciendo de nuevo :-)

¿Crees que tu código está desordenado? He visto (e intentado trabajar con) un código que me dio pesadillas:

  • Cinco niveles de if Trueanidados, dispersos en lugares aleatorios a través del código.
  • Cree una matriz de ceros, conviértala a grados, tome el coseno y vuelva a radianes. Luego, deseche el resultado.
  • En un software bajo un fuerte desarrollo, la lista de "arquitecturas compatibles" es tan antigua (y ellos mismos lo dicen) que hoy en día sería difícil tener en sus manos una de estas computadoras.
  • Funciones rotas o modificadas hace varias versiones, aún recomendadas en los documentos.
  • Código que va de usar una entrada de formato estándar a algún formato propio. ¿Cómo generarlo? Nadie lo sabe realmente, y los desarrolladores dan una respuesta.
  • Lanzamientos que ni siquiera compilan. (¿Incluso lo probaste?)
  • Menús GUI a los que tiene que acceder en un orden específico. De lo contrario, obtiene una falla de segmentación y debe comenzar desde el principio.
  • Rutas codificadas de forma rígida dispersas por el código. Por lo tanto, debe desplazarse a través de varios archivos para encontrar y cambiar todas las apariciones de /home/someguy/absurd_project/working/la suya.

Y, mi favorito personal, cierto programa de miles de líneas de código, solo usaba comentarios para eliminar fragmentos de código aleatorios, excepto uno:

Aquí perforamos las cartas.

Aún así, ni idea de lo que estaba haciendo.

Y esto solo deja fuera las cosas clásicas de buenas prácticas, como variables de una letra en todo el código, algoritmos no especificados en ninguna parte...

Si le preocupa la calidad de su código, probablemente signifique que le importa lo suficiente como para haberlo hecho mejor que el promedio. Si espera hasta que el código esté limpio, es posible que nunca salga y sus contribuciones científicas se pierdan parcialmente.

En mi opinión, las cosas importantes que te deben importar, en orden, son:

  1. Formatos de entrada y salida. Use estándares cuando estén disponibles, hágalo simple cuando no lo esté. Facilite el uso de su programa como una caja negra.
  2. comentado. Breves descripciones de las funciones, resumen rápido del algoritmo.
  3. Legibilidad. Usando código idiomático, buenos nombres de variables...
  4. Estructura. Esto es más fácil cuando sabes lo que quieres hacer, que generalmente no es el caso en el código de investigación. Solo si hay interés en la comunidad, puede considerar refactorizarlo.

Por lo tanto, publique su software cada vez que tenga 1 (2 y parte de 3 deben aparecer mientras lo escribe).

+1 pero también agregaría el manejo de errores apropiado a la lista de puntos importantes (que con demasiada frecuencia faltan en el código de investigación apresurado). En particular, tenga especial cuidado con cualquier error que pueda afectar la salida de forma silenciosa: ¿el valor de retorno de esa función es el número real cero o un cero de retorno predeterminado en caso de error? (¡No los represente!) Además, los errores deben manejarse, pero no en exceso. He visto un código "a prueba de balas" escrito ingenuamente que podría recuperarse silenciosamente de los datos de entrada distorsionados y seguir produciendo resultados sin quejarse. Un bloqueo puede ser frustrante, pero los resultados imprecisos pueden ser un desastre.
Vuelva a su punto n. ° 3 y al comentario de otra persona sobre los nombres de variables de una sola letra: en el software científico, a menudo está traduciendo más o menos directamente ecuaciones matemáticas a código. Si las variables en las ecuaciones son letras sueltas, tiene mucho sentido usarlas como nombres de variables en el código. Y, como admito que debería hacer más a menudo, incluya LaTeX para las ecuaciones en un comentario. Por lo demás, no ha vivido realmente hasta que haya intentado depurar FORTRAN 66 con GOTO calculados y asignados :-)
+1 por respuesta de @imsotiredicantsleep. Es difícil trabajar con código que falla silenciosamente. Si va a generar resultados inexactos, asegúrese de que genere una advertencia o arroje un error en su lugar.

Estás preguntando si compartir software de baja calidad daría una mala impresión de ti. Creo que compartir software da una buena impresión.

  1. Como científico informático, me gusta cuando los colegas ponen a disposición su código fuente. Me hace más probable profundizar en su trabajo, tal vez contactarlos, tal vez citarlos, porque hay un artefacto más con el que interactuar (no solo el papel, sino también el código).

  2. Cuando un artículo informa un resultado que está "probado" por el código fuente, pero el código fuente no es público, a menudo me pregunto si el resultado es real. Mirar el código fuente (o simplemente la disponibilidad del código fuente, sin siquiera mirarlo) puede convencerme.

Así que compartir tu código fuente, horrible o no, siempre me daría una buena impresión de ti.

Ahora bien, si quieres impresionar aún más, te ayudaría...

... si reaccionas a problemas o solicitudes de extracción en un sitio como github, es decir, cuando veo que otros intentan contactarte y tú reaccionas.

... si su código contiene un archivo Léame que relaciona las afirmaciones de su artículo con el código fuente. De esta manera, cuando leo el documento y quiero saber más, puedo usar el archivo Léame para saltar al lugar apropiado en el código. Las frases típicas de dicho archivo Léame podrían ser: "El algoritmo de la Sección 3.2 del documento está en el archivo algoritmo/nueva versión/relacionado/segundo intento/foo.c" o "Para repetir la ejecución con el pequeño conjunto de datos descrito en la Sección 2 de el papel, ejecutar "hacer; hacer segundo_paso; foo_bar_2 conjuntos de datos/navidad.conjunto de datos. Esta ejecución toma alrededor de 2 días en mi computadora portátil".

También podría estar interesado en CRAPL (Licencia de programación académica y de investigación comunitaria) de Matthew Might, disponible en http://matt.might.net/articles/crapl/ . Contiene este término: "Usted acepta mantener al autor libre de vergüenza, vergüenza o ridículo por cualquier piratería, chapuza o acto de fe que se encuentre dentro del Programa". No me queda claro si esta "licencia" tiene algún efecto legal, pero la intención es clara: libera tu feo código y no pienses mal del feo código de los demás.

Relacionado tangencialmente, abordaré cómo compartir el software dadas sus inquietudes (no debe compartir el software para el que ya tiene una respuesta).

Poner los intentos fallidos en el control de versiones significa que nadie los verá nunca. La forma en que manejo esto es poner cada intento en un método y cada intento fallido en un método separado:

def main():
    get_foobar(x, y)


def get_foobar():
    return x**y


def get_foobar_legacy_1():
    """
    This attempt did not work for values > 100
    """
    return x + y


def get_foobar_legacy_2():
    """
    This attempt did not work on Wednesdays in September
    """
    return x - y

Según los comentarios a continuación, puede ser una buena idea colocar estos métodos en una clase FailedAttempts o BadIdeas separada. Esto tiene el agradable efecto de compartimentar las diversas etapas del proceso según la necesidad real. Encuentro que los programadores de computadoras a menudo saben cuándo dividir la lógica en un método y cuándo no, pero los científicos informáticos a menudo no la tienen. Este enfoque ayuda a los informáticos a dividirse en un método cuando sea necesario.

Eso no es parte de ninguna de las mejores prácticas de programación. El código supuestamente no utilizado en realidad debería comentarse, para que algún código no siga llamando get_foobar_legacy_43. Y cuando quede claro que está roto, debe eliminarse si es posible. Si vale la pena comprender algún intento fallido para los lectores de la versión actual (lo que sucede), debe ponerlo en el control de versiones y agregar un comentario que apunte a la ID de compromiso relevante, posiblemente con un enlace permanente.
@Blaisorblade: Tiene razón, si el objetivo es desarrollar una aplicación que funcione bien, entonces el código no utilizado debe eliminarse, ya sea comentando o relegándolo a las profundidades del software de control de código fuente. Sin embargo, ese no es el objetivo declarado por el OP. El OP necesita documentar sus fallas. Esta es la forma de hacerlo. Aunque veo valor en su punto, y tal vez cada método podría comentarse con /* */la sintaxis de comentario de bloque. Curiosamente, uno de los pocos lenguajes que no admite comentarios en bloque es Python, el lenguaje que usé para el pseudocódigo anterior.
@Blaisorblade: una solución aún mejor puede ser tener un archivo, clase o directorio separado que abarque los intentos fallidos, separado del código de correo de la aplicación.
La pregunta no menciona la documentación de fallas, y creo que es una buena idea en algunos casos (por ejemplo, para intentos interesantes pero fallidos de lograr las contribuciones del artículo). "Dejar en fracasos" parece provenir de otra respuesta, donde las personas tuvieron un fuerte debate: academia.stackexchange.com/a/37373/8966 .

Por supuesto, debe compartir el código fuente.

Académicamente hablando, un resultado basado en software que utiliza un código que no está fácilmente disponible no es muy valioso, ya que, ¿cómo podrían otras personas verificar sus afirmaciones, si es necesario? ¿Esperas que programen por su cuenta para este propósito? Compartir solo binarios es mucho menos valioso y, a menudo, genera pesadillas para las personas que intentan ejecutarlos.

Creo que deberías compartirlo. En primer lugar, debe hacer una limpieza básica. (p. ej.: no hay código anterior que ya no se use; no hay código en el comentario; forma válida de comentar, etc.) Además, si pone algo de "cosa por hacer" en el código, los demás pueden ver que se le acabó el tiempo y pueden ver tus intenciones (por ejemplo: todo: esto debería cambiarse a enum) También creo que deberías compartir la parte más importante de tus algoritmos. Cuando comparto un código, nunca comparto partes sin importancia. Todos pueden manejar la lectura/escritura de archivos, la comunicación entre subprocesos, la interfaz gráfica de usuario, etc. Pero no comparta código ilegible. No tendría sentido. Así que creo que el camino medio es el mejor muchas veces. :-)

La limpieza es buena en principio. Sin embargo, si uno espera un buen momento para limpiar, es posible que ese momento nunca llegue. Sugeriría ponerlo en un repositorio de control de versiones en Github o Bibucket o similar de inmediato, y limpiarlo a medida que lo haga. De todos modos, cualquiera que lo descargue estará mirando principalmente a HEAD.

Habla con algunos de los profesores de tu departamento de informática. Vea si alguno de ellos está buscando un proyecto en el que los estudiantes puedan limpiar el código desordenado para hacerlo más presentable.

Para los estudiantes que revisan el código, esta puede ser una buena experiencia de aprendizaje. ¿Qué sucede cuando los codificadores programan con una mentalidad de resultados primero o una mentalidad de solo resultados? Llegan a ver eso de primera mano. También pueden aplicar algunas de las mejores prácticas sobre las que han estado aprendiendo. Y pueden estar motivados para hacer un trabajo especialmente bueno sabiendo que otros profesionales ya están interesados ​​en ver el código.

Un profesor podría incluso convertir esto en un concurso, donde los equipos de estudiantes intentan revisar el software y el mejor resultado se comparte con el resto del mundo.

Si sus esfuerzos de refactorización fracasan, no estarás más atrasado de lo que estabas. Si ese es el caso, los descargos de responsabilidad son una cosa maravillosa. Simplemente comparta el código, pero agregue una advertencia: "No es bonito. Cuando escribí esto, estaba tratando de hacer mi investigación, no pensé que alguna vez saldría de mi laboratorio de computación. Pero de nada para echar un vistazo si realmente quieres".

Me gusta esto, me hubiera encantado tener esta oportunidad cuando estaba en la Uni. Leer y comprender el código de otras personas es una habilidad y debe aprenderse.

En las otras respuestas se han mencionado muchos puntos a favor de publicar el código, y estoy completamente de acuerdo con ellos. Por lo tanto, como se ha discutido la conveniencia básica de publicar el código, me gustaría complementar esto con una lista de verificación de puntos adicionales que deben considerarse. Es probable que muchos de estos problemas aparezcan en prácticamente todo el software académico, por lo que incluso si no puede responder "Esto no se aplica a mi proyecto". a todos ellos, al menos debería poder responder "Esto es una preocupación, pero podemos solucionar este problema para..." antes de publicar su código:

  • ¿Tienes permiso para publicar el código?
    • ¿Puede garantizar que solo usó fragmentos de código que puede redistribuir? ¿O posiblemente usó código de fuentes no abiertas que puede usar para su propio software interno, pero que no puede publicar? ¿Puede garantizar que todo el código que usó se puede publicar en un paquete completo? La compatibilidad de licencias no es un tema trivial.
    • ¿Puedes siquiera averiguarlo de forma fiable? ¿Subcontrató alguna parte de su trabajo de codificación o integró código no publicado de otro lugar? Por ejemplo, ¿supervisó a algún estudiante durante sus tesis de graduación o empleó a algún estudiante asistente de investigación, cuyo trabajo se basó en su investigación y, por lo tanto, su código se agregó a su base de código? ¿Algún compañero de trabajo contribuyó con código a su base de código? ¿Recibieron algo de su código de los estudiantes? ¿Todas estas personas involucradas prestaron la debida atención a los problemas de licencias (si es que tenían el conocimiento para emitir un juicio educado sobre estas cuestiones de licencias)? ¿Se puede determinar aún dónde se originaron las partes del código? ¿Las personas que contribuyeron con cada parte aún lo saben? ¿Están todavía "dentro del rango de contacto" para ti?
    • ¿Se desarrolló el código durante el tiempo de trabajo con fondos de terceros? Si es así, ¿los términos del contrato de financiación permiten publicar el código o incluyen algún requisito de que el software creado dentro del proyecto financiado debe compartirse exclusivamente con los socios del proyecto?
  • ¿Tiene suficientes recursos (tiempo y otros) para dedicar el esfuerzo a limpiar el código y sus comentarios de manera que siga siendo significativo, pero no proporcione ninguna información que no deba hacerse pública?
    • ¿Tiene algún comentario que revele quién trabajó en el código? ¿Se les permitió oficialmente a las personas que contribuyeron con el código trabajar en la investigación respectiva, según su financiación? (Los desarrolladores de software son muy conscientes de que el trabajo en equipo y la reutilización de componentes son aspectos centrales del desarrollo de software. Lamentablemente, las agencias de financiación suelen desconocer esto y suponen que si el desarrollador A recibe fondos del proyecto X y el desarrollador B recibe fondos del proyecto Y, A trabaja exclusivamente en X y B trabaja exclusivamente en Y, y revelar que, wlog, A pasó solo media hora haciendo algo que terminó en el proyecto Y podría tener graves consecuencias, como reclamar partes de los fondos).
    • ¿Algo en los datos publicados revela alguna información sobre las particularidades de cómo se hizo el trabajo que no debe hacerse público?Esto es especialmente importante si todo el historial de confirmaciones en un VCS se va a hacer público (o, en la práctica, significa que el historial de confirmaciones nunca debe publicarse), pero también puede desempeñar un papel en otras situaciones. Por ejemplo: ¿Se realizó algún trabajo en el código fuera de los horarios de trabajo asignados oficialmente (por ejemplo, durante los fines de semana)? ¿Los tiempos de trabajo revelan que trabajó más del límite legal de su país por horas de trabajo por día? ¿Los horarios de trabajo revelan que no cumplió con los descansos legalmente requeridos? ¿Los tiempos de trabajo delatan que las personas asignadas a otros proyectos hicieron aportes? ¿Los horarios de trabajo proporcionan alguna razón para desconfiar de cualquiera de las afirmaciones que hizo sobre sus horarios de trabajo (por ejemplo, en informes de éxito de proyectos que requerían una asignación detallada de tiempos de trabajo a paquetes de trabajo predefinidos con ciertas asignaciones máximas)? ¿Algo revela que trabajó en situaciones en las que no debería haber estado trabajando (por ejemplo, durante una reunión de proyecto)? ¿Hay algo que delate que usted trabajó en lugares donde no debería haber trabajado (por ejemplo, desde su casa, cuando su contrato no le permite trabajar desde casa, por ejemplo, por complicaciones relacionadas con el seguro)?
    • ¿Hay alguna información secreta en el código , como contraseñas, nombres de cuentas de usuario o direcciones URL que no deben ser conocidas públicamente (porque los servidores no están diseñados para manejar grandes cantidades de usuarios más allá de una pequeña cantidad de personas seleccionadas a las que se les dio la URL para la configuración de prueba personalmente)?
  • ¿Alguien más puede usar el código?
    • ¿Se ejecutará el código o requiere grandes esfuerzos de configuración? ¿Puede dedicar el esfuerzo requerido para explicar qué configuración es necesaria?
    • ¿Se puede compilar el código? ¿Ha utilizado compiladores no oficiales modificados o personalizados que no son de acceso público? Si es así, ¿el código agrega algo más allá de lo que ya se puede proporcionar como un algoritmo de pseudocódigo en sus documentos?
    • ¿El código requiere algún recurso externo? ¿El código solo será útil si puede acceder a servidores, bibliotecas o conjuntos de datos que no puede publicar junto con el código por un motivo u otro? ¿Se puede proporcionar al menos una descripción de estos recursos, o sus interfaces están sujetas a algún tipo de NDA?
    • ¿El código realiza cambios irreversibles en los sistemas en los que se ejecuta? Por ejemplo, ¿cambia automáticamente alguna configuración del sistema (como sobrescribir la ruta de búsqueda del sistema)? ¿Realiza algún acceso de bajo nivel a los componentes de hardware que podrían, en ciertas constelaciones (que usted evita internamente en sus configuraciones de prueba) causar daños permanentes a los componentes? ¿Puede advertir de forma fiable a los usuarios del código de tales posibles efectos secundarios no deseados?
Considere que las agencias de financiación o los empleadores revisan los registros de confirmación para determinar las consecuencias legales. Esa es una clara preocupación teórica. Entonces, ¿tienes alguna evidencia de que alguna vez haya sucedido? Mi experiencia limitada con las agencias de financiación, en particular con las subvenciones del ERC, es en realidad lo contrario, aunque eso no cuenta.
@Blaisorblade: "Entonces, ¿tiene alguna evidencia de que alguna vez sucedió?" - la motivación para que el financiador descubra posibilidades de reducir sus costos parece clara, y las posibles repercusiones que podrían tener (devolver parte del dinero de la subvención) son lo suficientemente graves (perder dinero previamente otorgado es probablemente una de las pocas cosas que pueden ocurrir). hacer que los empleados de la universidad se metan en serios problemas con la administración de la universidad) que parece razonable no abrir este posible punto de ataque en primer lugar.

Por supuesto. La única forma de mejorar en la escritura de un buen software es obtener comentarios (de todo tipo). Si tienes miedo a la retroalimentación, no llegarás muy lejos. Los tres conceptos básicos para escribir un gran software son práctica, práctica y práctica.

Pasemos ahora a la pregunta de si dañaría su carrera si la gente descubriera que sus habilidades de escritura de software no son de primera categoría. Creo que no, al contrario, te respetarían por tu integridad académica. Y estaría deseando colaborar con usted.

Puede enviarlo a GitHub e intentar mantener un proyecto en caso de que otras personas interesadas en su proyecto puedan acceder fácilmente a su código y tal vez puedan ayudarlo a mejorar su código.

+1 - Esto es lo primero que me vino a la mente. Es un lugar seguro para almacenar el código de uno, mejor que tenerlo al acecho en un disco duro o una memoria USB que morirá o se perderá. Además, el código es fácil de mantener, así como cualquier cambio de código que se rastree y, como usted dice, otros pueden colaborar y contribuir (siempre que se elijan las configuraciones de acceso correctas).

Si deberías. Después de todo, el código fuente del kernel de Linux es un desastre y eso no ha impedido que muchos desarrolladores profesionales lo estudien y contribuyan con parches y adiciones. Recuerde también que el kernel de Linux es la base del sistema operativo que ejecuta las supercomputadoras más rápidas y poderosas y la mayoría de los dispositivos del mundo. PD: Linus Torvalds, el tipo que inventó el kernel de Linux, tiene una carrera muy rentable y exitosa que no se ha visto afectada negativamente ni perjudicada de ninguna manera por el hecho de que el código fuente del kernel de Linux es desordenado.

Una razón por la que nadie ha mencionado por qué debería compartir su código es que puede encontrar a alguien que esté interesado en colaborar con usted, pero que esté preparado para dedicar más tiempo a limpiar el código y hacer que funcione en diferentes sistemas, etc. en hacer el desarrollo innovador que ha hecho.

Mucha gente encuentra este tipo de trabajo muy satisfactorio y si su código es realmente útil para ellos, estarán felices de hacerlo. En cualquier caso, puede encontrar que recibir comentarios de personas que han intentado usarlo, pero que necesitan algún tipo de ayuda, es una buena motivación para hacerlo más fácil de mantener/más fácil de usar y comprender.

Compártelo si quieres, no lo compartas si no quieres. Sé que esto suena sarcástico, pero creo que hoy en día hay demasiada presión para "compartir todo" y la gente intentará hacerte sentir culpable por no compartir, pero en realidad no tienes la obligación de compartir nada.

Los resultados reproducibles son una de las piedras angulares del método científico. Y eso requiere compartir. Su comentario es similar a decir "... pero en realidad, los científicos no tienen la obligación de adherirse al método científico".
Claro, compartir puede ser opcional fuera de la comunidad científica, pero seguro que no es opcional dentro de la comunidad científica.
@Contango Sí, ese es un punto justo si la liberación del software ayuda a reproducir los resultados.
@JeffE No compartí nada, ¿de qué estás hablando? Encuentro tu mensaje críptico. Si desea ser entendido, por favor sea un poco más claro.
Usted compartió su opinión, por supuesto.

Definitivamente deberías compartir tu código.

Para ordenar las cosas, haga regiones de las mismas partes del código como hacer una región de un intento fallido y explique por qué falló. Además, si desarrolla en Visual Studio, instale la extensión “CodeMaid” desde Extension Manager y limpie su solución completa. Eliminará espacios y también eliminará referencias no utilizadas haciendo que la mayoría de las cosas se vean mejor.

Si desarrolla en C#, comparta su código conmigo. También puedo ayudarte a arreglar las cosas :)

@Zuberi005 es la única persona que ofrece una solución automatizada para ayudar a limpiar el código y la única persona que se ofrece personalmente para ayudar a limpiar el código. ¿Y alguien votó negativo? ¡Me avergüenzo de ellos!

Publique un descargo de responsabilidad de que el código se proporciona "tal cual" sin promesas de soporte, etc. Y luego comparta el código.

Caso de estudio: Convertir una nube de puntos aislados en una superficie impermeable es un problema práctico extremadamente importante, utilizado en todas partes, desde la robótica hasta la visión por computadora y el procesamiento de datos de sensores 3D como Microsoft Kinect.

La reconstrucción de la superficie de Poisson tiene 7 años y hace tiempo que dejó de ser el estado del arte para resolver este problema. Pero todo el mundo todavía lo usa hasta el día de hoy. ¿Por qué? Porque el autor publicó el código y desde entonces se ha incorporado a un montón de bibliotecas populares de procesamiento de geometría. El documento ahora tiene más de mil citas.

Sí. Debería publicar su código, probablemente bajo la licencia CRAPL. El objetivo es construir un futuro mejor, y su pésimo código ayudará a las personas a lograrlo. Una advertencia es que debe documentar cómo operar con éxito el código lo suficientemente bien como para que alguien tenga una oportunidad decente de reproducir los resultados publicados.

Y, no se preocupe, una parte del código de investigación en el que trabajé fue desarrollado por 5 posdoctorados de capacidad de programación indiferente para una serie de proyectos en el transcurso de aproximadamente 8 años.

La lista de variables globales (solo los nombres) tenía aproximadamente 4 páginas.

Aproximadamente un tercio de ellos se utilizaron para establecer un comportamiento predeterminado para cambiar la funcionalidad que funcionaba en un momento dado. Otro 20% eran estructuras de datos paralelas, lo que significa que almacenaban aproximadamente los mismos datos y, por lo tanto, funciones en el código extraídas de las estructuras de datos más o menos al azar. Sí. A veces no estaban sincronizados. Y a veces necesitaba estar desincronizado.

Había aproximadamente 50 versiones no documentadas, almacenadas en partes aleatorias del servidor del grupo, cada una de las cuales tenía al menos un propósito específico, y solo un administrador mantuvo esos propósitos específicos en su cabeza. Era más común que no tener personas que usaran la versión 'incorrecta' para un propósito determinado.

El uso de procedimientos recursivos increíblemente complejos para, por ejemplo, escribir un archivo, era estándar. En serio: unas pocas miles de líneas para guardar los resultados de la imagen.

Ah, y los restos de un intento fallido de resolver una fuga de memoria (en realidad, una figura invisible) sin crear nunca una nueva variable.

Ah, y la base de datos, esa hermosa base de datos. Aproximadamente la mitad de los datos no se pudieron utilizar debido a (a) errores en el diseño de la base de datos (b) errores en la entrada de datos (en programas automáticos). El código para recuperar archivos de la base de datos tenía varios cientos de líneas de lógica... La base de datos en sí también era lo suficientemente amable como para contener muchas copias de los mismos datos, muchas de ellas con enlaces rotos entre tablas. Restricciones? No. Vi a un estadístico pasar de la inquietud al miedo, a las lágrimas y renunciar al mes de haberle confiado la base de datos...

Había entre 0 y 1 formas de operar el software y obtener resultados correctos en un instante dado...

Y sí, hubo gotos.

Ah, y en un esfuerzo por garantizar un funcionamiento opaco y no determinista, se realizó una serie de cálculos llamando a los botones de la GUI con devoluciones de llamada asociadas.

Aproximadamente el 90 % de cualquier función determinada no era, de manera bastante confiable, relevante para el resultado o para la depuración del resultado; estaba compuesta, más bien, de proyectos a corto plazo insertados y luego nunca eliminados. En serio, escribí una versión completa de características que realmente funcionó y que tenía 1/10 del tamaño... Las fracciones significativas eran funciones insertadas copiadas y pegadas, muchas de las cuales diferían entre sí.

Y, no Virginia, no hay documentación. O nombres de variables descriptivos.

Ah, y las bibliotecas no documentadas, con errores, dlls y asociadas, generadas usando un código que ya no existía.

Todo escrito en Matlab. En términos de prácticas de codificación de Matlab, asuma que el uso abundante de eval sería lo más destacado de su día.

En serio, tu código no es tan malo.

Dicho esto, si ha hecho algo realmente útil, podría mejorar su carrera lanzar una versión limpia para que otras personas usen y citen su biblioteca. Si acaba de hacer algo, entonces la reproducción es probablemente lo más lejos que le recomendamos que vaya.