
Hace ya tiempo venía dando vueltas en mi cabeza la idea de una materia para estudiar ciertas cuestiones «avanzadas» y en un punto hasta filosóficas de nuestra profesión. Dada la gran mezcolanza de temas no lograba darle nombre. Se me ocurrieron nombres como «Desarrollo Profesional de Software», «Programación Avanzada» y «Ejercicio profesional del desarrollo de software» pero ninguno me convencía. Finalmente, el pasado fin de semana me puse a escribir una descripción de los temas a abordar y mientras escribía la bibliografía de referencia me resultó evidente que el título debería ser «Artesanía de Software».
La idea de esta materia es estudiar ciertas cuestiones del ejercicio profesional del desarrollo de software. Es una materia avanzada, no por la complejidad de los temas a abordar sino por el hecho de que para poder abordarlos con profundidad y con una visión crítica es necesario tener algunos años de experiencia en el ejercicio de la profesión y más específicamente en programación. O sea, esta no es una materia para gerentes, analistas o maquetadores, es una materia para programadores.
Si tuviera que ubicar esta materia en el plan de estudio, sería una materia optativa del último año de la carrera.
Sobre los temas
Si miramos los planes de estudio de las carreras de sistemas vemos varias materias de programación: Algoritmos y Programación, Paradigmas de Programación, Programación Concurrente, Programación Orientada a Objetos, Taller de Programación, etc. Cada una de estas materias aborda alguna técnica o aspecto de la programación, pero hay ciertas cuestiones que son en cierto modo transversales a todas estas materias.
Entre estas cuestiones transversales hay temas tan básicos como la elección de los nombres de variables que uno podría pensar que deberían abordarse en las primeras materias de programación pero que en ocasiones no se abordan en profundidad o que incluso cuando sí se abordan, son cuestiones que resulta interesante replanteantearse luego de un par de años programando.
También tenemos algunos otros temas relacionados al versionado que es algo que utilizamos a diario pero que muchas veces lo hacemos en modo automático y sin considerar qué estamos metiendo en cada commit, que mensaje de commit ponemos, con que criterio creamos branches, etc.
Uno de los temas más polémicos y filosóficos que trata la materia es la discusión del desarrollo de software como ingeniería, ciencia u oficio.
Algunos otros temas a cubrir:
- Profesionalismo, ética y contratos
- Freelancing
- Work-life balance
- Aprender, enseñar, aprender a aprender y aprender a enseñar
- Estimación, No-estimación, presupuestos y planificación
- Lenguajes y paradigmas
- Tipado estático vs. tipado dinámico vs. no tipado
- Código de aplicación y código de pruebas
- Las pruebas como documentación
- Java, el nuevo cobol
- El ascenso de JavaScript
- Smalltalk…..
- Mantenimiento y evolución
- Trabajo con código legado
- Código de infraestructura
- Versionado y trazabilidad
- Revisiones, Pairing y Mobbing
- No-code / Low-code
Modalidad de cursada
La materia se dicta en una modalidad de aula invertida durante 16 semanas con un encuentro online de 3 horas por semana y con una dedicación estimada extra clase de unas 4 horas semanales.
La materia incluye lecturas (varias), videos (no tantos), código (tanto para leer y como para escribir) y debate (espero que mucho).
Participantes
Los candidatos a cursar la materia deberían:
- Estar a menos de 4 materias para recibirse de una carrera de grado de sistemas/computación.
- Tener al menos 3 años de experiencia programando profesionalmente en la industria.
- Sentirse cómodos trabajando con al menos dos lenguajes de programación y tener alguna experiencia en al menos otros dos lenguajes (no cuenta HTML, CSS, ni bash).
Bibliografía
Estos son algunas de la fuentes y materiales en los que está basada la materia:
- The Pragmatic Programmer, de Hunt & Thomas
- Software Craftsmanship: The New Imperative, de Pete McBreen
- Code Complete, de Steve McConnell
- The Software Craftsman, de Sandro Mancuso
- Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman, de Oshineye & Hoover
- The Design of the Design, de Brooks
- Atomic Habits, de James Clear
- Implementation Patterns, de Beck
- Refactoring to Patterns, de Kerievsky
- xUnit Test Patterns, de Meszaros
A esto se suman varios artículos (algunos formales y otros no tanto) y algunos videos.
Pre-Inscripción
Si el lector llegó hasta este punto, posiblemente se esté preguntando donde se dicta esta materia. La respuesta es que no lo sé. Por el momento tengo armada la estructura de la materia, algunos materiales, muchas ideas pero no tengo institución para dictarla. Claro que podría hacer un curso «no académico» y dictar esto por mi cuenta, pero precisamente lo pensé como materia porque me parece que es un contenido faltante en las carreras de grado de sistemas/computación. Creo que estos temas deben ser parte de la formación académica de los profesionales de esta disciplina.
En fin, por lo pronto y mientras veo como meter esto en una institución, si estás interesado en tomar este curso te invito a que completes este formulario y en cuanto tenga más definiciones me contactaré contigo.
Bueno, la idea esta buena!. Comienzo por aquello que me gusto… contratos, aprender a aprender, java el nuevo cobol un posible gran acierto…
agregaría => observabilidad el porq es importante que el developer lo tenga en cuenta, IAC que se pueda tener en cuenta, metodologías de pushing … alternativas para generar documentación..plataformas paas, faas a tner en cuenta.. y creo sacaría Smalltalk.
En biblio tendría en cuenta a tmb robert martin clean code quizá y el de arquitectura limpia posiblemente tmb algún merge de caps posiblemente, y artículos de sam newman y Richardson posiblemente tmb…
un draft para seguir puliendo.