Etiquetas

,

…y quizás tampoco las soportan los demás programadores.

En mi ordenador funciona

Si el código no funciona en un ordenador con toda las dependencias adecuadas instaladas es un error de tu programa, sin dudas, no hay excusas. Nunca digas esta frase, sólo demuestra que todavía no estás preparado ni para asumir la responsabilidad de tu propio código. Si eres alumno demuestra que no te interesa aprender sólo aprobar con el menor esfuerzo posible… además de tomar como tonto al profesor, como si nunca hubiese oído esta excusa (la oímos decenas de veces cada vez que se presentan prácticas).

El programa peta/se cuelga/no funciona ¿qué es?

Otro error típico, sobre todo de alumnos y jóvenes que preguntan al profesor o a un compañero. Si tú que conoces bien tu código no puedes encontrar el error, ¿cómo pretendes que otro te lo arregle sin conocer el mínimo detalle? Siempre tienes que ir con el código en cuestión, indicando la función o la línea donde falla y en qué condiciones. Si no lo haces así demuestra que todavía eres incapaz de analizar tu propio código. Un buen programador es capaz de analizar y estudiar cualquier código, algunos les puede costar minutos, otros muchas horas, pero es esencial saber hacerlo. Se aprende con mucha práctica, pero hay que comenzar con el código de uno mismo.

Pero si pasa los tests

Desde que se empezó a hablar de test units parece que algunos lo toman con el resultado de los dioses. Pero no, un test sólo verifica los bugs ya detectados o los que se imaginó el que los programó. Seguramente no consideró todos los posibles fallos con las diferentes condiciones que se pueden dar en el código que verifica. Sobre todo si es de un código que todavía no existe y que debe ser programado por otras personas. Por ello no es excusa que pase el test, en todo caso hay que pedir que se mejore el test con el caso descubierto en tu código. Mejor aún si tú mismo lo haces.

Eso no me lo enseñaron

No puedes ser espectador pasivo de tu aprendizaje ni esperar que los demás sean los responsables de enseñarte todo lo que necesitas aprender para cada una de tus tareas como programador. Además es imposible que en unos pocos años de estudio puedas aprender todas las cosas que necesitarás durantes las décadas futuras en tu profesión. Es cierto que muchas cosas que deberían darse no se estudian (y que también critico, a veces chillando por la universidad) pero una respuesta así indica que no asumes responsabilidad de tus conocimientos. Quizás peor, que no te enteraste qué es lo que debes aprender, un psicólogo te explicaría que es «deficiencia meta cognitiva». En todo caso sólo di «no lo conocía» o «no se me ocurrió, ahora mismo me pongo».

Pero el código funciona

Esta es una respuesta también muy habitual entre estudiantes y programadores novatos. Es como si un novelista respondiese a la mala crítica con un «pero si al final el mayordomo era el asesino, se entiende». Se da en dos situaciones diferentes:

  • El código es ilegible: Hay programadores que todavía piensan que los lenguajes de alto nivel se hacen para los ordenadores no para los humanos. Pero no es así, llevamos 70 años diseñando y desarrollando lenguajes de alto nivel principalmente para facilitar el trabajo a las personas, y no sólo al programador original, sobre todo a los demás que tienen que entender o modificar el programa. Una de las condiciones fundamentales de todo programador es que su programa se legible, que sea «fácil y agradable de leer». Hay novelas que son fáciles de leer, otras que son complejas, hay cortas y otras largas y pesadas, pero todas respetan normas básicas: sintaxis, gramática, oraciones con sustantivo verbo y objeto, limitaciones de adjetivos, puntuación, párrafos, separación entre palabras, líneas, párrafos y bordes de la página. El código fuente de un programa debe ser similar, hay normas generales (por ejemplo espaciado, sangrado, nombres de funciones variables, ficheros, etc.) y otras que son «idiomáticas» de cada lenguaje o de programadores.Lo fundamental es aprender esas normas, respetar tantos las generales como las particulares. Si no lo haces no sólo demuestra la incapacidad como programador, también una falta de respeto a los que tendrán que analizar tu código (sean estos los colegas o los profesores que te tienen que poner una nota).
  • La solución es inadecuada: Muchas veces recurren a soluciones que no sólo no son óptimas, también las peores de su clase. Por ejemplo re-implementar un ordenamiento de burbuja cuando tienen la función qsort(), o una búsqueda secuencial cuando el array está ordenado (los dos últimos son problemas de no recurrir a la menor complejidad de ejecución bien conocidas), o hacer una espera activa cuando tienen primitivas sencillas con bloqueo, etc. En la «ciencias de la computación» se estudian estos temas, algunos de ellos son fundamentales y de conocimiento obligatorio. No sirve que el programa funcione para un caso concreto, debe funcionar para todos los casos previstos y con la eficiencia «formal» bien conocida en el área. Conocer esos temas es parte del proceso de aprendizaje de un programador, si alguien te indica que la solución es errónea quizás pueda estar equivocado, pero nunca la excusa puede ser «pero funciona».

Vaya mierda de código, debería estar programado con ponga_aquí_las_últimas_tecnologías_o_frameworks

Es el típico error que hemos cometido todos. Normalmente se hace sin tener en cuenta las condiciones del momento en que comenzó a desarrollarse, los requerimientos iniciales, la tecnología y recursos disponible, ni la multitud de limitaciones que tienen todos los proyectos. Además, el estado actual de un proyecto es la evolución durante años de programadores, tecnologías y objetivos cambiantes. Cada uno de estos elementos aporta a la deuda tecnológica, tú también generarás la misma deuda, todos los hacemos.

Así que nunca sueltes esta frase ligeramente, sobre todo si vas a una empresa, solo demostrarás que además de ignorante no tienes respeto por el trabajo de tus colegas. Quizás el código realmente sea malo, pero antes de decir una palabra espera un tiempo, aprende de su historia, y si aún así piensas que puede mejorarse propón la solución, o mejor, envía el parche.

Un secreto: cuando los programadores oímos a otro soltar esta frase de un código que ni conoce pensamos «no podía faltar el gilipollas». No hagas de gilipollas.

Yo hubiese usado ponga_aquí_la_librería_de_moda

Si dices esto es porque alguien te preguntó que te parece lo que implementó. Decirle que hubieses usado otra librería ya no ayuda y quizás estés equivocado o no conoces todos los detalles. Es mejor analizar antes, proponer cambios concretos y reservar esta frase sólo si no hay una solución adecuada (aunque muy raro que no haya soluciones). Nunca nunca nunca sueltes esta frase sólo por ver las primeras líneas de «include» o «package».

Yo hubiese desarrollado un nivel intermedio de servicios ponga_aquí_el_formato_de_moda

Es el típico ejemplo del programador entusiasmado que tiende a la «sobre ingeniería» y aplicar en un proyecto todas las técnicas y palabros que aprendió o leyó. Pero una una ingeniería se basa en hacer las cosas en su justa simplicidad, agregar servicios y capas intermedias con formatos de intercambio (que requieren conversiones y serializaciones/deserializaciones, antes de ayer era binario, ayer era XML, hoy es JSON, mañana quién sabe) muy pocas veces está justificado y casi nunca elimina complejidad, todo lo contrario. Lo que suelen añadir es complejidad, latencias, consumo, necesidad de recursos y más administración.

Depende del tipo de proyecto sí que es necesario desarrollar una capa de traducción de este tipo, por ejemplo cuando haces el backend/API de servidor para apps móviles. En estos casos la capa es casi un objetivo y requerimiento inicial del desarrollo, no una idea creativa para aumentar la simplicidad de desarrollo y mantenimiento.

Intenta mantener el programa lo suficientemente simple para que se cumplan los plazos y la complejidad esté controlada, si el proyecto crece y necesita agregar capas y servicios se hará en su momento. En todo caso deberías preocuparte más de la estructura de datos: que sean simples y flexibles para expandirlas y usarla de otras maneras. Y si aún así te parece que una capa intermedia con traducción es formatos es necesaria, consúltalo antes con los programadores más expertos. Nunca lo plantees como primera opción, suele generar unos 🙄 importantes.

La universidad debería enseñar ponga_aquí_la_última_moda

De este tema ya escribí varias veces, la última en Lo que se aprende, o debería, en la carrera de informática, pero insisto, el tiempo es limitado, no se pueden aprender todas las tecnologías que podrías encontrarte en tu carrera profesional. Antes eran cinco años, ahora cuatro, y ya hay una ley para que sea de tres. Ni en las mejores universidades del mundo podrán enseñarte todo lo que cree importante cada uno de los «actores del mercado», si fuese tan sencillo las currículas no serían tema de debate y cambios continuos hasta en la ACM.

Por otro lado las «tecnologías de programación» no cambian tan radicalmente, muchas veces se usan ideas que ya se estudiaron y desarrollaron antes. Por ejemplo el tema de concurrencia tan estudiado en sistemas operativos y mainframes hoy vuelve a estar de moda por los procesadores de múltiples núcleos, sí ha avanzado pero los principios son los mismos que hace 40 años. Otro ejemplo, NoSQL, las mismas técnicas de los años 70 pero usadas para tener bases de datos distribuidas mucho más limitadas que las relacionales, ¿hace falta tener una asignatura para saber cómo funcionan los hashes y su almacenamiento en fichero que viste en estructuras de datos o «algoritmia» (signifique lo que signifique)?.

¿Realmente hacen falta asignaturas obligatorias específicas sólo para «desarrollo de apps» cuando hoy lo más raro que te encuentras es que tienes que tener un thread para conectarte a un servidor o mostrar imágenes o listados largos? (ojo, sí que deben ser parte de prácticas o laboratorios, que ya se hacen en la mayoría de universidades).

¿Por qué no usaste el framework X?

Qué pesadilla, no hace falta seguir, ¿no?

Ninguno de los frameworks se ajusta a lo que necesitamos, vamos a desarrollar uno mejor

🙄 🙄 🙄