Comencemos por definir lo que entendemos por “competente”, ya que obviamente esto tiene muchas definiciones diferentes basadas en el tipo de tarea y equipo. En Stack Builders, probablemente consideraríamos a un desarrollador “competente” cuando pueden realizar tareas de tamaño mediano (tal vez alrededor de 1 a 2 semanas de tiempo de implementación) en un proyecto de software. Estas tareas serían lo que yo llamaría “complejidad moderada”: tipos de funciones requeridas en muchas empresas de inicio basadas en la web o sistemas basados en la web en empresas más grandes.
Suponiendo que un nuevo programador de Haskell tenga una educación informática “promedio”, y tal vez un año de experiencia en programación en lenguajes como Java o C #, he visto que toma algunos meses antes de que los desarrolladores puedan realizar importantes trabajos , durante el cual tienen consultas regulares con desarrolladores más experimentados. Dentro de unos seis meses, he visto a estos mismos desarrolladores ser capaces de asumir grandes cantidades de trabajo sin necesidad de buscar tanta supervisión, y sin que los adultos mayores tengan que registrarse tan regularmente para asegurarse de que estén en el camino correcto. Después de un año, estos desarrolladores están avanzando rápidamente y son capaces de armar las funciones con bastante rapidez, mientras usan patrones idiomáticos. Pueden ofrecer un buen consejo a los desarrolladores que se aproximan a los tres meses y seis meses para que esos desarrolladores se vuelvan competentes rápidamente.
Ahora comparemos esto con el tiempo que tarda el mismo desarrollador (con una educación informática estándar, y poca experiencia en la industria) para alcanzar un nivel similar de competencia en algo como Java, Ruby o Python. En promedio, diría que a un desarrollador le llevaría aproximadamente tres años alcanzar el mismo nivel de competencia en estos idiomas: mucho más tiempo que los seis meses requeridos por un nuevo desarrollador en Haskell para ser altamente productivo, o el año para convertirse muy competente
Aunque esto puede parecer exagerado, creo que en realidad es una posición fácil de justificar. En los idiomas imperativos, OO, se dedica una gran atención al desarrollo de una buena intuición sobre cómo estructurar el código. Esto es necesario en gran parte debido a las complejidades de administrar el estado (los idiomas como Ruby lo llevan a un extremo, donde su propio programa puede estar cambiando a medida que se evalúa el código, lo que puede hacer que sea extremadamente difícil entender una base de código de tamaño mediano). Debido a estas complejidades, ser competente en Ruby, Python, Java y otros lenguajes similares requiere una comprensión muy sólida de los patrones de diseño (y cuándo no usarlos) y los patrones para crear pruebas que no agreguen un peso indebido al código base.
- ¿Cuál es la forma más fácil de descargar música en un iPhone?
- Como alguien que conoce a Ruby, ¿vale la pena aprender Perl?
- ¿Cuál es el sentimiento de aprender chino como segunda lengua?
- ¿Qué tan difícil es aprender la codificación para una persona de un entorno de comercio?
- Es 35 demasiado viejo para aprender guitarra a un alto nivel?
Como lo sabe cualquiera que haya pasado mucho tiempo trabajando en proyectos de software moderadamente complejos, no es trivial desarrollar la intuición para el código “bueno” y la estructura de prueba. De hecho, he visto que algunos desarrolladores, incluso con la supervisión adecuada, nunca alcanzan un nivel en el que tuvieran la intuición requerida, incluso después de años de trabajar con otros desarrolladores calificados. Los libros comunes que los programadores orientados a objetos (OO) necesitan para vivir y respirar incluyen el libro GoF y el software orientado a objetos en crecimiento, guiado por pruebas. En la práctica, los desarrolladores necesitan leer libros como este muchas veces, e implementar sistemas que sigan y rompan las reglas que sugieren. De hecho, he escuchado a desarrolladores con experiencia decir que no deberías leer GoF hasta que tengas diez años de experiencia en programación OO para que no te arruines los sistemas al aplicar sus patrones de manera exagerada.
Para mí, ser experto en la creación de software mantenible en Ruby requería la creación de sistemas buenos y malos por mi cuenta, la programación en conjunto con expertos, y años asistiendo a conferencias y leyendo cualquier otra cosa que pudiera utilizar para construir lo que creo que es una intuición decente para Código estructurante en sistemas OO. Crear sistemas OO bien estructurados es un verdadero oficio, y requiere sentido estético combinado con mucha experiencia informal y conocimiento de qué patrones formales alcanzar en qué escenarios.
En conclusión, convertirse en un experto en Haskell requiere bastante tiempo y esfuerzo, al igual que aprender cualquier herramienta. Sin embargo, el tiempo requerido para permitir a los nuevos desarrolladores una correa más larga es considerablemente menor en Haskell que en lenguajes como Ruby, Java y Python. Me atrevería a decir que es posible que la noción popular de llamar al desarrollo de software en Haskell como un “arte” nunca se ponga en práctica, por la sencilla razón de que las intuiciones seguras que conducen a sistemas mantenibles son mucho más fáciles de desarrollar en Haskell, y por lo tanto, a los nuevos desarrolladores se les puede dar una correa más larga después de un período de tutela mucho más corto. Dada la dificultad de la contratación de software, la capacitación de nuevos desarrolladores es una necesidad para la mayoría de los equipos de software. Debido a esto, creo que Haskell es una opción maravillosa dadas las realidades actuales de la industria del software.