Pergunta

Estou desenvolvendo um novo aplicativo web revolucionário para o mercado corporativo. Claro, muitos antes de mim pensou que seu aplicativo web seria revolucionário apenas para descobrir que não é. (Ou seja, mas o negócio não é bom de qualquer maneira).

Então, eu sou am pensamento, a fim de saber se a minha idéia tem qualquer tração com o menor custo, para acompanhar um extremo YAGNI:

  • Não há recursos de segurança (ou seja, nenhum usuário, etc). Para qualquer novo cliente que instalar uma nova instância do banco de dados e uma nova instância webapp. Cada instância webapp é protegido por uma senha do servidor http (digerir ou autorização básica, talvez sobre https).

  • No internacionalização. Apenas corda Inglês embutido no código-fonte.

  • No dissociação. Apenas páginas que falar com o banco de dados.

  • Sem truques de desempenho. Sem filas, caches, temporizadores, trabalhos de fundo, chamadas assíncronas, etc.

  • No escalabilidade. Sem particionamento de banco de dados, há cacos, sem agregação ou replicação.

  • Além disso, o uso YAGNI no nível micro, sempre que adequado.

Eu só quero iniciar o projeto e chegar o mais rápido ponto de uma possível onde posso vender (ou tentar vender) minhas características inovadoras com um simples e UI envolvente.

Se o plano falhar, eu vou saber cedo. Se der certo, vou ver o que os clientes querem então. Eles querem uma versão francesa? Ou eles querem usuários e funções dentro da organização?

É isso que as pessoas querem dizer por YAGNI, ou isso é um exemplo patológico e exagerado de YAGNI?

Foi útil?

Solução

Estou inteiramente de acordo com o princípio YAGNI, mas você ainda quer plano para o sucesso. Se um aplicativo precisa de uma reescrita completa quando de repente tem mais de usuários dez, então é YAGNI levado muito longe.

Algumas coisas que você está indo precisar. Da minha perspectiva, os dois pontos mais importantes:

  • Não atire no próprio pé por não preparar seu aplicativo para a internacionalização. Se sua aplicação é bom, a internacionalização vai ser sobre a mesa um dia. Além disso, a capacidade de lidar com caracteres estrangeiros usando UTF-8 é um requisito absoluto ao criar um aplicativo a partir do zero em 2010. A internacionalização pode parecer não é tão importante para um falante nativo Inglês, mas acredite em mim, é essencial ea dor de internacionalizar uma aplicação mais tarde é horrível.

  • Pense duas vezes sobre a coisa apresenta nenhuma segurança. E quanto a uma organização ou grupo que quer trabalhar com seu aplicativo com usuários em diferentes níveis de segurança. É poderia ser que este é um recurso que você pode realmente fazer sem - Eu tenho um sistema de segurança de grão fino construído em muitos dos meus produtos que nunca foi usado em todo seu potencial ainda. Mas pense bem sobre se a sua aplicação específica pode prescindir, mesmo que seja bem sucedido.

Outras dicas

Isto é o que eles chamam de "protótipos". Vá em frente.

Há uma sutileza entre YAGNI e prototipagem.

  1. Quando é featuritis, e você não dizer solicitado pelo usuário, que é YAGNI.

  2. Quando da implementação (I18N, "descolamento" (?), Filas, caches, temporizadores, etc.) e você não diz para si mesmo. Isso não é realmente YAGNI. Isso é prototipagem.

A maioria do que você tem aqui não parece ser orientada para o utilizador-regulamentação. Eu não chamaria isso - precisamente -. YAGNI

YAGNI é sobre lembrando-o de ver a diferença entre o que você pode fazer eo que você precisa fazer para satisfazer suas necessidades.

Por exemplo, se sua exigência diz "deixar que as pessoas criam contas e log in", é só usar métodos de autenticação padrão do seu quadro e passar para a próxima exigência.

Seu aplicativo web pode suporte OpenID, Active Directory, banco de dados local, arquivo simples, e um zilhão de outros tipos de métodos de autenticação, mas você pode satisfazer a exigência aplicando a mais simples. (Para mim, YAGNI implica DTSTTCPW ).

"Eu posso fazer qualquer coisa, dado o tempo suficiente"

- Cada programador que eu já conheci

Não é um fã do princípio da YAGNI mim mesmo; Eu vê-lo usado demasiadas vezes na justificação de software mal-concebido. software Over-projetado é um problema também, é claro, mas "YAGNI" realmente não deixa muito espaço para a análise de impacto real.

Acontece que no mundo do software, muitas das coisas que você acha que não vai precisar, você realmente está indo para necessidade. E então alguns. Who'dathunkit.

Eu escrevi um ou dois aplicativos que deveriam ser descartáveis ??aplicativos ou mantenha-overs que ainda estão em produção depois de dois anos. Eles são uma dor de manter.

Especialmente quando se trata de algo como segurança - você provavelmente são vai precisar dele

.

YAGNI é um princípio bom, mas não é o princípio de design única. Muitos dos faz sentido acima para obter um produto na frente de usuários rapidamente. Mas se, por exemplo, as páginas da web que falar diretamente com o banco de dados começam a cada um tem código duplicado você vai descobrir que a dependência servil em um princípio (YAGNI) para a exclusão de outros (neste caso DRY) irá limitar a sua capacidade para responder ao seu número espero crescente de solicitações de recursos dos usuários.

Se você estiver indo para desenvolver verdadeiramente um aplicação web revolucionário para o mercado corporativo Eu realmente não estou certo qual dessas coisas Y ou A int L onna N eed.

Além disso, seus exemplos são bastante específico. Por exemplo, quando você diz: "apresenta nenhuma segurança" ... Eu diria que os usuários é uma coisa que você talvez pode fazer sem, mas saneantes suas entradas é um que você não pode. Também "escalabilidade" não é uma questão de sharding de banco de dados ou replicação, essas são decisões que você tomar depois de perceber a sua aplicação não escala bem.

Eu prefiro ter cuidado ao usar YAGNI como uma diretriz de design de alto nível, ele se encaixar de melhor quando você fala sobre as características do produto ímpares ou talvez componentes de software extrema flexibilidade.

Apenas minha 0,2

Se você tomar "YAGNI" a esse extremo (e eu vou contornar discussões sobre se ou não isso é uma boa idéia, bem como discussões sobre se ou não isso é realmente "YAGNI"), você deve estar preparado para refatorar impiedosamente o seu base de código para adicionar mais tarde o que você deixar de fora agora sem criar uma bola de lama.

Em minha mente YAGNI é mais comumente usado em contexto com um pensamento desenvolvedor "oh que seria inteligente se também acrescentou recurso X. Podemos precisar dele no futuro." Nunca nunca adicionar funcionalidades que não é uma exigência.

Dito seu código deve estar sempre aberto para modificações se o seu cliente pensa recurso Y é absolutamente necessário. Uma boa arquitetura é um must!

Em relação à escalabilidade, filas, cache: depende. Qual é o requisito para a aplicação? É um site de intranet usado por 10 usuários simultâneos ou é um site popular com milhões de usuários. Depende. Encontre os requisitos e fazer isso - nada mais. YAGNI. Se a sua mudança de exigência; mudar sua aplicação -. que deve ser aberto para modificações

YAGNI é bom se há uma boa chance que você vai não precisam. Se você não precisa dele agora, mas é quase certo que você vai precisar dele no futuro previsível, então é quase sempre mais fácil de se encaixar em frente do que mais tarde. Quando você não justificam a implementação coisas que você não precisa de esta segunda , mas vai precisar quase de certeza no futuro próximo por YAGNI, que é onde os problemas começam.

O ponto que YAGNI é apenas um grande diretor entre muitos é uma boa para lembrar; às vezes YAGNI sugere uma decisão, mas há igualmente bons (ou melhor) razões para preferir outro.

Aqui está uma área onde eu sinto alguns proponentes YAGNI pode ir para longe: se você está confortável com OOD / polimorfismo, que normalmente custa muito pouco para "cozer em" alguns grandes pontos de extensão para uso futuro, mesmo em um protótipo .

Aqui está um exemplo ...

Você está criando um protótipo webapp que inclui a capacidade de exibir uma versão para impressão de um relatório. Você precisa trabalhar rapidamente, mas tem uma boa bastante sentindo os steakholders pedirá a capacidade de enviar e-mail o relatório, bem abaixo da linha.

Em seu código Java do lado do servidor, ocultar o conhecimento do fato de que o relatório está sendo preparado para a impressora por trás de uma interface. Criar uma classe concreta que estende a interface para segurar essa responsabilidade. Não realmente sair e write uma versão de e-mail da interface, porque YAGNI. Mas se você já fez, você está pronto para adicioná-lo sem carnificina a seus recursos existentes.

Eu diria que, se você está começando por jogar fora todo o senso comum e fazer todo o projeto da maneira mais expediant possível, então o que você vai acabar com uma grande pilha de falhar ... O que não é de meios revolucionários (tm).

Se você realmente quer saber se ele vai ser útil, fazer algumas simulações de tela ups. Talvez até mesmo apenas regular velho disco html codificada. Tome aqueles a potenciais clientes e veja se você pode obter o seu pé na porta. Se algum deles começar a morder, então busto seu bumbum e construí-lo.

Vai levar tempo para obter um contrato em vigor, obter o pagamento e obter alguém de sua equipe clientes para realmente começar a usá-lo. Enquanto o que está acontecendo, construí-lo.

O mais provável é o que vai acontecer é que os potenciais clientes irão ver a sua aplicação e, esperançosamente, dizer-lhe porque ele não funciona para eles. Alterar as maquetes e voltar. Iterate conforme necessário até que você tenha um design front-end para o seu produto que alguém está disposto a pagar.

O que eu faria é:

1) projeta-levando em consideração as decisões de arquitetura certas. Internacionalização e Segurança são, provavelmente, deve haves neste caso.

2) Ao desenvolver, criar os ganchos para esses princípios a serem implementadas mais tarde. Então, quando você tiver tempo e orçamento, você pode implemente-los sem fazer grande remodelação.

3) Em seguida, você pode se concentrar sobre as características que fariam sua mosca aplicação e são mais importantes para seus clientes potenciais.

Então eu acho que neste caso eu estaria usando mais da abordagem BEIJO de "extrema YAGNI" como você sugeriu.

Na minha opinião, YAGNI deve ser seguido por padrão, pois permite produtividade aumentando grandemente .

Há algumas exceções, pensou. Por exemplo, se você desenvolver uma biblioteca parte 3, você precisa pensar, pelo menos, um pouco antes do tempo e antecipar as necessidades de alguns usuários futuros. Isso não quer dizer que você tem que desistir de YAGNI completamente, mas você não deve segui-lo como estritamente como com um desenvolvimento in-house.

Sim, mas ...

Eu tendo a concordar com muitas das suas considerações , exceto o "não dissociação", porque o "it" em YAGNI significa funcionalidade, não para as etapas de pensamento. Apresentando algumas abstrações (apenas os necessários para dissociação) vai pagar imediatamente em termos de erros não fez ou erros encontrados mais rapidamente e removido.

Um bom (porque poupa pensando) maneira de introduzir essas abstrações seria usar uma estrutura boa web e simplesmente seguir a sua aplicação sugerida estilo estruturação .

Como um benefício adicional, ele se tornaria muito mais fácil adicionar a segurança, internacionalização, desempenho, e outras coisas de escala mais tarde e seu YAGNI-comportamento de agora deve tornar-se razoavelmente seguro.

(Infelizmente, o argumento se aplica somente se você souber o framework web já. Conhecimento reina supremo no YAGNI reino.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top