Primero, me doy cuenta de que esta pregunta puede ser algo larga y vaga y me disculpo por esto. Este es probablemente un problema básico con un nombre corto para cualquiera que lo haya "entendido", pero como me parece que me falta en este sentido, tenga paciencia para describir el problema.
He estado programando de esta forma u otra desde que tenía unos 11 años. Esto significa que he estado enseñándome todo desde el principio. Recibí una educación técnica, pero no estrictamente en Ciencias de la Computación (me gradué con un título en Ingeniería Fotónica). Teníamos cursos de programación, por supuesto, pero esto era sobre todo cosas básicas para mí y no aprendí muchas cosas nuevas. Seguí educándome en el camino por el placer de hacerlo y siempre supe que seguiría una carrera en programación, pero todos mis proyectos eran bastante pequeños en ese momento. No tuve problemas para mantenerlos en mi mente y mantenerlos.
Ahora, me encuentro a la cabeza de un equipo, pero no en un entorno corporativo: trabajo para la universidad desarrollando software científico (en C ++) para aplicaciones de ingeniería. De repente, el proyecto está creciendo (relativamente) a gran escala y la mayoría de las veces tengo problemas para entenderlo. Estoy perdiendo mucho tiempo y esfuerzo en dos cosas principalmente:
- Cuando tengo que volver a una sección de código en la que no he trabajado durante un tiempo, me cuesta recordar cómo funcionó. Paso mucho tiempo revisando los archivos de encabezado para las clases relevantes y leyendo los comentarios que coloqué en el camino en los archivos de origen. Desearía que hubiera alguna forma de "esquema" que pudiera vislumbrar y recuperar la imagen más fácilmente;
- Cuando introduzco cambios, a veces me doy cuenta a medias de que lo que estoy tratando de hacer romperá las cosas en otro lugar (o peor, solo se muestra en el tiempo de ejecución como una sorpresa). Revierto y comienzo a hacerlo de manera diferente, solo para descubrir que descuidé la influencia en algún otro componente. Desearía que hubiera algún "diagrama de arquitectura" en el que pudiera ver cómo se hacen las cosas, cómo lo que estoy tratando de hacer influirá en otros componentes y una forma de planificar en detalle antes de comenzar a implementar cambios.
La mayoría de las personas con las que trabajo tienen historias similares a las mías: una fuerte orientación técnica y, a veces, excelentes habilidades, pero no tienen forma de organizar su trabajo. Sin embargo, sus proyectos suelen ser mucho más pequeños que los míos, por lo que se las arreglan de alguna manera. De todos modos, lo que eso significa para mí es que estoy solo y no tengo a nadie de quien aprender las buenas prácticas.
Tomé un curso de posgrado en administración de TI y, aunque lo encuentro bastante satisfactorio, está dirigido principalmente a no programadores, enseñando sobre metodologías de administración de proyectos, estimaciones de presupuesto / cronograma, arquitectura empresarial, etc., no diseño y planificación de software como tal. Está bien, también estoy tratando de aprender esas cosas. Por supuesto, se introdujeron algunas herramientas (como UML) y los tipos de procesos de desarrollo de software (en cascada, iterativo, ágil ...), pero obviamente no con gran detalle y es difícil decidir qué debo elegir y usar ( y en qué medida).
He estado leyendo muchas preguntas y respuestas sobre el diseño de software en SO; hay muchas sobre hacerlo usando esta o aquella herramienta o metodología en particular, y si estuviera convencido de que la documentación UML resolvería mis problemas, lo recogería y empieza a usarlo. Pero algunas personas juran por eso, otras dicen que es inútil. Estoy buscando una respuesta en un nivel más alto de abstracción: ¿hay maneras de resolver los dos problemas que tengo y cómo lo hace personalmente? ¿Qué debo aprender para poder hacerlo, posiblemente sin estar obligado a una herramienta en particular? De vez en cuando, estos pasan de moda y espero que su aplicabilidad varíe según el tipo de proyecto.
Muchas gracias por leer, no pude decir lo que quiero decir más brevemente (falta de experiencia en diseño de software y vocabulario).