Primeiro, percebo que essa pergunta pode ser um tanto longa e vaga e peço desculpas por isso. Provavelmente, este é um problema básico com um nome abreviado para qualquer pessoa que "entenda", mas, como me falto a esse respeito, tenha paciência comigo ao descrever o problema.
Faço programação dessa maneira ou de outra desde os 11 anos de idade. Isso significa que eu tenho me ensinado tudo desde o início. Eu recebi uma educação técnica, mas não estritamente em Ciência da Computação (me formei em Engenharia Fotônica). Tivemos cursos de programação, é claro, mas isso era basicamente coisas básicas para mim e eu não aprendi muitas coisas novas. Eu continuei me educando ao longo do caminho pela alegria e sempre soube que seguiria uma carreira em programação, mas todos os meus projetos eram bem pequenos na época. Não tive problemas para mantê-los em minha mente e mantê-los.
Agora, eu me encontro na liderança de uma equipe, mas não no ambiente corporativo - trabalho para a universidade desenvolvendo software científico (em C ++) para aplicativos de engenharia. De repente, o projeto está crescendo (relativamente) e eu tenho problemas para entender o assunto na maioria das vezes. Estou perdendo muito tempo e esforço em duas coisas principalmente:
- Quando tenho que retornar a uma seção do código em que não trabalho há algum tempo, tenho dificuldade em lembrar como funcionou. Passo muito tempo revisando os arquivos de cabeçalho das classes relevantes e lendo os comentários que eu coloquei ao longo dos arquivos de origem. Eu gostaria que houvesse alguma forma de "esquema" que eu pudesse vislumbrar e recuperar a imagem mais facilmente;
- Quando eu introduzo mudanças, às vezes percebo, no meio do caminho, que o que estou tentando fazer irá quebrar as coisas em outro lugar (ou pior, isso só aparece em tempo de execução como uma surpresa). Eu reverto e começo a fazê-lo de maneira diferente, apenas para descobrir que negligenciei a influência em algum outro componente. Eu gostaria que houvesse algum "diagrama de arquitetura" onde eu pudesse ver como as coisas são feitas, como o que estou tentando fazer influenciará outros componentes e uma maneira de planejar detalhadamente antes de começar a implementar as alterações.
A maioria das pessoas com quem trabalho tem histórias semelhantes às minhas - orientação técnica forte e, às vezes, ótimas habilidades, mas sem meios de organizar seu trabalho. No entanto, seus projetos geralmente são muito menores que os meus, então eles lidam de alguma forma. De qualquer forma, o que isso significa para mim é que estou sozinho e não tenho ninguém para aprender as boas práticas.
Fiz um curso de pós-graduação em gerenciamento de TI e, apesar de bastante satisfatório, é voltado principalmente para não programadores, ensinando sobre metodologias de gerenciamento de projetos, estimativas de orçamento / cronograma, arquitetura corporativa etc. - não sobre design e planejamento de software. Tudo bem, estou tentando aprender essas coisas também. Obviamente, foram introduzidas algumas ferramentas (como UML) e os tipos de processos de desenvolvimento de software (em cascata, iterativo, ágil ...), mas obviamente não detalhados, e é difícil decidir o que escolher e usar ( e até que ponto).
Eu tenho lido muitas perguntas e respostas sobre design de software no SO - há muitas sobre como fazer isso usando essa ou aquela ferramenta ou metodologia específica, e se eu estivesse convencido de que a documentação UML resolveria meus problemas - eu pegaria e comece a usá-lo. Mas algumas pessoas juram, outras dizem que é inútil. Estou procurando uma resposta em um nível mais alto de abstração - existem maneiras de resolver os dois problemas que estou tendo e como você o faz pessoalmente? O que devo aprender para poder fazer isso, possivelmente sem estar vinculado a uma ferramenta específica? Eles vêm e saem de moda de tempos em tempos, e espero que sua aplicabilidade varie de acordo com o tipo de projeto.
Muito obrigado pela leitura, não consegui dizer o que quero dizer mais brevemente (falta de experiência e vocabulário em design de software).