¿Cuánto tiempo se tarda en aprender Haskell?

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.

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.

Comencé a sentirme cómodo con Haskell después de dos o tres meses de uso. Tomó un tiempo comenzar a pensar como un programador funcional, y un par de tardes largas para envolver mi cabeza en torno a algunos conceptos más “por ahí”, como Mónadas. Pero tenía alrededor de 10 años de experiencia previa con lenguajes imperativos orientados a objetos, y me sentía lo suficientemente cómodo con las plantillas de C ++ (que, como entiendo ahora, son un lenguaje funcional). También incursioné un poco en OCaml (me refiero a “leer un par de libros sobre el tema”).

Si no tiene antecedentes en informática y programación, tiene una ventaja en el sentido de que no tiene ideas preconcebidas en las que deba forzar la comunicación al cambiar de paradigmas. Pero, está en desventaja porque probablemente nunca aprendió el pensamiento algorítmico.

Es posible que desee tener en cuenta que una buena comprensión del álgebra ayuda enormemente a la hora de aprender Haskell. En particular, debe comprender la composición de la función (y, en primer lugar, qué es una función matemática).

En general, es posible que pueda aprender y sentirse cómodo con la sintaxis de Haskell en tres a seis meses, pero si necesita aprender a programar desde cero, bueno, eso podría llevarle años fácilmente. Pero eso es algo que viene con la práctica. Sin embargo, harías bien en tomar un curso de informática.

Depende de sus objetivos, a qué se refiere con “cuánto tiempo” (¿en tiempo real u horas ingresadas?), Y qué recursos está dispuesto a reunir.

Si nos dirigimos a un extremo, digamos que solo le interesan las competencias básicas, está dispuesto a obtener los mejores recursos, está dispuesto a obtener la ayuda de la gente tanto como sea posible, está dispuesto a dedicarle mucho tiempo, etc. En ese caso, podría ser un verano desde cero experiencia en programación.

Yendo a otro extremo, me tomó cinco años y ya era un programador experimentado. Pero los recursos en ese momento no eran muy buenos, no era bueno en pedir ayuda en ese momento, y mis intentos fueron abortivos y no fueron sostenidos.

Usando el libro (Programación de Haskell – listado de capítulos), mi coautor y yo estamos trabajando como guía, nuestro revisor que está aprendiendo a programar por primera vez a través del libro pudo hacer 2-3 capítulos en un solo fin de semana, un capítulo en una sola tarde cuando pudo sentarse y concentrarse. Si uno usa nuestra estimación de ~ 30 capítulos para el conteo final, eso es entre un mes y la mejor parte de un año, dependiendo de qué tan serio se ponga al respecto.

Es mejor no preocuparse demasiado por el tiempo que tomará, a menos que piense que solo tendrá que escribir programas durante un período breve y temporal en su vida. Ser disciplinado y consistente importa más que ir rápido en la mayoría de las cosas y aprender Haskell también.

Sería muy difícil de aprender sin un fondo en la programación. Haskell es un gran lenguaje, y recomendaría aprenderlo, pero no empieces con él. Hay muchos conceptos difíciles en Haskell (y los lenguajes funcionales en general) que son mucho más fáciles de aprender si tiene una comprensión más profunda de cómo se almacenan las cosas en la memoria y cómo funcionan los programas. Comenzaría con C y Python para aprender lo esencial, y me mudaría a Haskell después de eso.

No tengo idea. Depende principalmente de cuán apto / inclinado seas al razonamiento abstracto y formal. La inclinación para la programación también puede ayudar, pero con Haskell que es mucho menos relevante, el razonamiento formal y abstracto domina.

Si tienes alguna razón para aprender Haskell específicamente, te sugiero que no empieces con otro idioma y que comiences directamente con Haskell. Aprender otro idioma puede (o no) ayudarlo a convertirse en un programador más rápido, pero con el tiempo le será más difícil aprender Haskell.