Sinto que é importante continuar praticando minhas habilidades de resolução de problemas. Escrever meus próprios mini-projetos é uma maneira, mas outra é tentar resolver os problemas publicados on-line. É fácil encontrar questionários de programação interessantes on-line que exigem a aplicação de algoritmos inteligentes para resolver - o Project Euler é um exemplo bem conhecido.
No entanto, em muitos projetos da vida real, o design do software - especialmente nas fases iniciais - tem um grande impacto e, em estágios posteriores, não pode ser ajustado tão facilmente quanto os algoritmos comuns. Para melhorar essas habilidades, estou procurando qualquer coleção de problemas de design.
Quando digo "design", quero dizer o design abstrato de uma solução de software - por exemplo, quais módulos haverá e quais são as dependências entre eles, como os dados fluirão no programa, que tipo de dados precisam ser salvos no banco de dados etc. Os problemas de design são aqueles críticos para solucionar nos estágios iniciais de qualquer projeto, mas sua solução é um diagrama de quadro branco sem uma única linha de código.
É claro que esse tipo de problema não possui uma única solução correta, mas ficarei muito feliz com qualquer lugar que também mostre prós e contras das soluções típicas que podem ser usadas para abordar o problema.
fonte
Respostas:
Que tal o Code Kata . Fiz algumas delas, e elas são divertidas de fazer e desafiador o suficiente para que sempre haja algo a aprender.
Os comentários para cada um dos katas normalmente contêm informações suficientes para ajudar a responder a qualquer coisa em que você fique preso.
fonte
Comece com o problema de design clássico: KWIC.
David Parnas usou o KWIC como exemplo em seu artigo clássico sobre modularidade: Sobre os critérios a serem usados na decomposição de sistemas em módulos , que todos provavelmente deveriam ler a cada 10 anos.
O KWIC, para palavras-chave no contexto , é um problema simples de indexação e classificação, onde você lê linhas de texto e gira cada linha com base em palavras-chave (por exemplo, excluindo "the", "with"), adicionando cada turno a um lista que você classifica. A idéia é que o uso do KWIC seria útil para gerar um índice para um livro. Na época de seu artigo clássico, Parnas disse que um programador experiente poderia resolvê-lo em uma a duas semanas, mas a Lei de Yannis afirma que agora pode ser feito em uma a duas horas . [Os sistemas operacionais e as bibliotecas padrão ficaram muito melhores.]
Leia o artigo de Parnas e, assim que puder entender o que o programa KWIC deve fazer, escreva o seu como um exercício de design. Em seguida, leia o restante do artigo, que discute dois projetos diferentes: ambos são modulares, mas um obtém informações ocultas, enquanto o outro não.
Depois de conhecer o exemplo KWIC, você poderá apreciar outros documentos de design de software que o utilizam. Por exemplo, o artigo de Michael VanHilst, Decoupling Change from Design, usa-o para mostrar uma técnica de design realmente interessante usando modelos C ++. E, enquanto estivermos falando sobre modelos e design em C ++, leia Objetos de síntese de Czarnecki e Eisenecker .
Passando do KWIC, há outros exemplos clássicos, como o exemplo da Spacewar , que foi portado / reprojetado em várias linguagens, como Python e AspectJ .
Obviamente, qualquer programa pode ser usado como um exercício de design, mas o KWIC e o Spacewar são exemplos em que você pode procurar várias alternativas.
fonte
Eu ouvi esse tipo de coisa chamada de "programação de katas". Kata é um termo de artes marciais para uma forma ou sequência de movimentos praticados repetidamente com perfeição. Faça uma busca por katas no seu idioma preferido e aposto que você descobrirá algo. :)
fonte
Concordo que Katas e Euler são ótimos para projetar algoritmos e praticar codificação - talvez você possa expandi-los, ser um pouco criativo e projetar um sistema em torno de um dos problemas.
Por exemplo, estou trabalhando não apenas para resolver os problemas do Euler para encontrar a resposta mais rápida e mais curta, mas para resolvê-los de maneira distribuída - eu quero configurar uma série de nós Erlang para resolver um dos problemas. Obviamente, isso significa que eu tenho que descobrir como separar o problema em partes discretas e pedir que elas relatem seu progresso e agreguem os resultados (tudo dentro de uma Linguagem Funcional em que eu não sou especialista).
Talvez você possa projetar um sistema que resolva um desses problemas como uma solução comercial - como fazer para que vários "clientes" possam ter acesso ao seu problema ao mesmo tempo, além de projetar interações da camada de serviço e cliente etc.
É tudo sobre ser criativo e se divertir.
fonte