Sou desenvolvedor júnior (aproximadamente 3 anos de exp.) E, no meu trabalho, estamos no processo de arquitetar um novo sistema. Meu desenvolvedor principal será o arquiteto principal, mas ele me desafiou a tentar arquitetar o sistema sozinho (em paralelo).
Ao longo de algumas iterações de brainstorming de idéias e proposição do que eu vi como sugestões de arquitetura, minha liderança me deu o feedback de que a maior parte do que venho fazendo foi "projetar" e não "arquitetar".
Ele descreveu a diferença como a arquitetura sendo independente de implementação, enquanto um design é a descrição de uma implementação. Ele disse que preciso tirar meu chapéu de designer e colocar meu chapéu de arquiteto. Ele me deu alguns conselhos sobre como fazer isso, mas eu gostaria de lhe perguntar também:
Como saio do modo de designer de software e começo a pensar mais como um arquiteto?
Aqui estão alguns exemplos de "designs" que eu criei que não eram considerados relevantes para a arquitetura pelo meu lead:
- Eu vim com um algoritmo para carregar e descarregar recursos do nosso sistema e meu líder disse que algoritmos não são categoricamente arquitetura.
- Eu vim com um conjunto de eventos que o sistema deveria estar levantando e em que ordem deveria aumentá-los, mas isso também não pareceu cortá-lo como arquitetura.
Parece que estou sendo pego nos detalhes e não recuando o suficiente. Descobri que, mesmo quando me deparo com algo que está no nível da arquitetura, muitas vezes cheguei lá testando várias implementações e analisando os detalhes, generalizando e abstraindo. Quando descrevi isso para minha liderança, ele disse que eu estava adotando a abordagem errada: eu precisava estar pensando "de cima para baixo" e não "de baixo para cima".
Aqui estão alguns detalhes mais específicos sobre o projeto :
- O projeto que estamos arquitetando é um aplicativo da web.
- Estou estimando entre 10 e 100 mil linhas de código.
- Nós somos uma startup. Nossa equipe de engenharia é de cerca de 3-5 pessoas.
- A coisa mais próxima com a qual eu poderia comparar nosso aplicativo é um CMS leve. Possui complexidade semelhante e lida principalmente com os módulos de carregamento e descarregamento de componentes, gerenciamento de layout e estilo plug-in.
- O aplicativo é ajax-y. O usuário baixa o cliente uma vez e depois solicita os dados conforme necessário do servidor.
- Nós estaremos usando o padrão MVC.
- O aplicativo terá autenticação.
- Não estamos muito preocupados com o suporte a navegadores antigos (ufa!), Portanto, estamos procurando aproveitar o melhor e o mais recente que está por aí e será lançado. (HTML5, CSS3, WebGL ?, Extensões de fonte de mídia e muito mais!)
Aqui estão alguns objetivos do projeto :
- O aplicativo precisa ser dimensionado. No curto prazo, nossos usuários estarão na ordem de centenas a milhares, mas estamos planejando dezenas de milhares a milhões e além.
- Esperamos que o aplicativo esteja disponível para sempre. Esta não é uma solução temporária. (Na verdade, já temos uma solução temporária, e o que estamos arquitetando é a substituição a longo prazo do que temos).
- O aplicativo deve ser seguro, pois pode ter contato com informações pessoais sensíveis.
- O aplicativo precisa ser estável. (Idealmente, seria estável em torno do nível do gmail, mas não precisa estar no extremo de um rover de Marte.)
fonte
Respostas:
Antes de tudo, eu diria que a diferença entre arquitetura e design é principalmente semântica. Algumas equipes têm pontos de verificação entre os dois. Seu líder técnico define a arquitetura como antes do design e a arquitetura como independente de implementação. A partir disso, presumo que estamos falando de design, como no modelo em cascata, e não de Design Industrial, o que ajudaria você a projetar o produto com vista aos usuários antes de chegar à arquitetura do software. Eu acho que a arquitetura geralmente entra no design e isso não é necessariamente uma coisa ruim; geralmente é muito útil para o arquiteto ter um conhecimento profundo do que é possível no sistema em questão.
Dito tudo isso, você precisa de alguns conselhos para a situação em que se encontra. Existe um mundo inteiro de arquitetura de software por aí, jornais, livros, conferências, mas você geralmente procura padrões e abstrações. Sem mais detalhes sobre o projeto, só posso dar um exemplo amplo. Por exemplo, se você estava trabalhando em integração, existe a Arquitetura Orientada a Serviços ( SOA)) em que você divide partes do sistema em 'serviços' para poder trabalhar com cada parte de uma maneira definida. No programa da Web, isso geralmente é implementado como Serviços da Web (embora não deva ser tão limitado a isso) e, mais recentemente, o surgimento de APIs RESTful com JSON, novamente eu diria que esse é um design proveniente da arquitetura de SOA. Eu diria que Model, View, Controller (MVC) é outro exemplo de um padrão de arquitetura de uso comum, dividindo a responsabilidade dos componentes de um sistema para permitir a troca de peças, para conter erros e testes.
De um nível de 10.000 pés, se você pode desenhá-lo em um quadro branco e explicá-lo a um programador competente que não trabalha em seu campo e não conhece sua linguagem de programação e detalhes de implementação atuais, provavelmente é arquitetura. Se você pode escrever um livro sobre o qual alguém de fora da sua empresa se importaria, provavelmente é uma arquitetura. Se você encontrar seus detalhes autoexplicativos e não puder generalizá-los para outras bases de código / empresas / indústrias, provavelmente será o design.
Concordo que os dois exemplos que você fornece são design de código e não arquitetura. A primeira porque acho que quando você diz que criou um 'algoritmo' para carregar recursos, acho que você quis dizer que você projetou um conjunto de instruções para realizar essa tarefa, e não que você projetou um novo algoritmo que eles ensinarão no primeiro ano COMSC no próximo ano. No segundo exemplo, novamente concordo que é design. Se você me mostrasse alguma dessas idéias, não seria capaz de usá-las no meu projeto de software aleatório. Você precisa ir para um OO (Orientado a Objetos) de 'nível superior' em Java, em vez de querer que a Classe do Cliente seja uma subclasse da Classe da Pessoa. Mesmo falar sobre exceções em geral pode ser considerado um nível muito baixo (muito próximo da implementação).
Para tentar abordar as especificidades listadas, acho que o que você deveria pensar é como arquitetar um CMS baseado na Web. O Wordpress possui um códice de arquitetura de site no qual eles falam muito sobre detalhes de implementação de design, mas fica claro a partir do post que sua principal arquitetura se concentra em tornar o Wordpress extensível com temas. A arquitetura de uma interface clara para um tema de forma que pudesse ser escrita por alguém de fora da empresa foi claramente uma decisão de arquitetura que eles tomaram. Esses são os tipos de coisas que é bom colocar no papel ao arquitetar sua solução 'de longo prazo' (não temporária), para que todas as decisões de design e implementação sejam tomadas durante o desenvolvimento (por todos os desenvolvedores e não apenas pelo arquiteto) estão alinhados com essa ideia.
Outros exemplos de arquitetura para sua situação:
Talvez tente desenhar o sistema inteiro em um quadro branco. Experimente em diferentes níveis de detalhe, o primeiro painel pode ser GUI-> despachante-> back-end-> DB ou algo assim e, em seguida, faça uma busca detalhada até começar a usar pronomes.
fonte
A distinção entre essas duas idéias é realmente importante onde eu trabalho.
O que você chama de "arquitetura", chamamos de "programação em inglês". Isso é parcialmente importante porque se você não pode descrevê-lo para um não programador, algo está errado. Pode ser que você não entenda bem o problema, OU pode estar resolvendo um problema "fantasma" (não discutido aqui).
Os termos usados para esses dois aspectos diferentes do design geralmente são diferentes, mas os princípios são facilmente reconhecidos em todos os lugares. Um aspecto (no seu caso, o arquiteto, no meu caso, o designer) programa em inglês, enquanto o outro (no seu caso, "designer", no meu caso, "desenvolvedor") programa em um idioma específico. Eles também são comumente distinguidos como "design" e "implementação". "Design" é o que deveria realizar e "implementação" é o código que faz isso acontecer.
Alguns exemplos nos quais trabalhei:
A arquitetura de um programa é: precisamos de um gerente ou hub centralizado no qual possamos adicionar módulos facilmente. Este gerente distribuiria eventos para todos os módulos registrados. Um módulo pode se registrar no Gerenciador de Eventos e, assim, publicar eventos no restante do sistema e receber eventos importantes. Cada módulo possui uma "caixa de correio" que pode verificar e esvaziar como desejar. Isso nos permitiria acomodar novos módulos que ainda não sabemos que precisamos.
Nenhum código lá. Pode ser escrito em qualquer idioma. A implementação não é ditada por esta descrição.
A arquitetura de outro projeto é: precisamos de uma maneira confiável de iniciar e parar outros programas sem esperar por eles. Poderíamos ter um gerente responsável por um programa específico. Podemos apenas dizer a ele para iniciar ou interromper seu programa e o gerente cuida dele. Se esse outro programa for solicitado a parar e não parar em um determinado período de tempo, o gerente saberá forçá-lo a parar e limpar a bagunça. O programa não foi iniciado ou parado por mais nada, e o gerente pode ser perguntado se o programa está sendo executado, parado ou aguardando para parar. Isso nos permite continuar com as outras coisas que precisamos fazer, enquanto continuamos com esses outros programas iniciados e parados corretamente.
Novamente, nada aqui determina a implementação, embora algumas implementações sejam claramente mais úteis que outras.
A diferença entre design (o que chamaríamos de padrões ou implementação) e arquitetura (o que chamaríamos de design) é que um deles resolve um problema de codificação / implementação e o outro resolve um problema do mundo real.
fonte
Talvez isso ajude. Eu sempre vi a antiguidade de um engenheiro como uma questão de quão grande é o problema que eles podem resolver por conta própria.
Aproximadamente, para transmitir a ideia:
Você pode dar a alguém novo na programação de tarefas pequenas e contidas com muitas instruções explícitas sobre como a tarefa precisa se integrar a outras partes
Um desenvolvedor de nível médio é alguém que pode obter uma descrição de uma parte de um aplicativo e fazê-lo funcionar dentro do contexto desse aplicativo.
Um desenvolvedor sênior pode criar um aplicativo de tamanho médio a partir do zero, dentro das restrições técnicas de uma loja.
Um desenvolvedor mais sênior pode fazer isso e fazer escolhas de tecnologia ao longo do caminho sobre quais tecnologias usar para fazê-lo funcionar bem.
... mas essas não são regras rígidas e rápidas. E algumas pessoas saem pela porta como IMHO "sênior", mesmo que precisem passar algum tempo com um título diferente.
O que o arquiteto está pedindo é ver o problema de maneira ainda mais geral. Se você tivesse que reunir vários aplicativos para fazer o sistema funcionar:
Então, em certo sentido, a arquitetura técnica é como uma arquitetura de construção. É o layout ou o plano. Ele mostra o que é necessário para as várias partes, como eles detêm juntos, e tão importante por que .
(BTW, tive uma curva de crescimento semelhante explicada para arquitetos, desde a arquitetura de uma família de aplicativos relacionados ou um conjunto de recursos muito complexos, até a orientação técnica de um grupo e a tomada de decisões técnicas estratégicas para toda a organização .)
Dito isto, acho que a maioria dos engenheiros de todos os níveis também precisa fazer alguma "arquitetura". Não é uma linha brilhante. Parece que se você se concentrar primeiro no Big Picture e não se prender aos detalhes da implementação, estará mais alinhado com o que ele está procurando. Aliás, a capacidade de ver o panorama geral e os pequenos detalhes é um grande trunfo neste setor, portanto parece uma grande oportunidade.
... Aqui está uma analogia. Digamos que você seja solicitado a criar uma Magic Black Box. Como engenheiro, espera-se que você fique obcecado com o funcionamento interno da Magic Black Box. Mas como arquiteto, seu foco é diferente. Você pode espiar a caixa por curiosidade, mas espera-se que fique obcecado com tudo ao redor de todas as caixas pretas mágicas.
Semelhante a essa analogia, você pode pensar no papel da arquitetura como visualizar todo o sistema como a caixa mágica. Portanto, se você pegar uma Gigantic Glass Box e colocar os clientes, os aplicativos clientes, o firewall, o nível de serviço, o banco de dados e até os caras de devops, então, como arquiteto, você ficará obcecado em como fazer essa enorme caixa de sistema funciona bem .
fonte
A diferença exata entre "design" e "arquitetura" é um pouco subjetiva e há alguma sobreposição. No entanto, esta é a diferença que eu entendo:
Arquitetura analisa conceitos de alto nível. Quem são os atores do sistema? Quais são os principais objetos e quais são responsáveis por quê? Quando penso em arquitetura, penso em Visio, não em código.
Por exemplo, um sistema de eventos pode ter um gerenciador de eventos que aceite eventos recebidos e os despache para os manipuladores de eventos. A idéia de threads, assíncrona vs. síncrona e outros conceitos de nível inferior não entra em jogo aqui. O MVC é outro exemplo: detalhes específicos não são especificados no alto nível de como as três partes interagem, apenas que há três preocupações separadas tratadas por pacotes de códigos separados.
O design envolve a criação de protótipos, o desenho de interfaces de código, esqueletos de código, etc. Ele fica entre a arquitetura abstrata e o trabalho de "macaco de código" de baixo nível.
Em uma estrutura de eventos, o design pode dizer "um evento usa essa interface" e "existe um pool de encadeamentos que o gerente de eventos usa para despachar eventos para os trabalhadores". Um design para o MVC pode ser "use o Hibernate para o modelo, Spring para o controlador e GWT para a visualização".
Quando faço o trabalho de design, esboco interfaces e codifico esqueletos e depois entrego os resultados aos programadores. Às vezes eu sou esse programador. Mas são duas fases separadas, e ambas existem mais para o concreto do que para a arquitetura.
Colocar o chapéu da arquitetura significa limpar sua mente do código e pensar em objetos em um quadro branco. Pense em objetos, pacotes, estruturas e o fluxo de mensagens entre eles. Se você está pensando em apenas uma linha de código, está fazendo errado. Não fique atolado em algo como "oh, essa mensagem pode ser uma string, ou use SOAP, ou qualquer outra coisa". Nesse nível, o fato de a comunicação estar ocorrendo é suficiente. Os detalhes são irrelevantes.
fonte
Não pense em como você escreverá o código para realizar algo, mas pense sobre qual seria o melhor método para realizá-lo. Sua descrição do que você precisa fazer deve ser independente da linguagem ; portanto, você estará falando de padrões de design - que são uma "linguagem" comum entre usuários de diferentes linguagens de programação - para discutir como avançar.
Para o seu caso de uso específico, mais questões de arquitetura, na minha opinião, seriam ao longo das linhas de:
Basicamente, não fale nada sobre código. Mesmo que você não saiba fazer alguma coisa, quando houver vontade, existe um caminho . Pense mais em como as peças do quebra-cabeça se encaixam melhor, antes de se preocupar em montá-las.
fonte
Pense em todas as operações (ou seja, casos de uso) que seu sistema pode executar. Para cada operação, documente o que acontece em termos de domínio de negócios para cada operação. Você só deve falar em termos do domínio do problema e não descrever detalhes de implementação. Desenhe um grande bloco e chame-o de Sistema. A combinação desse "grande bloco" e as descrições de operação é a arquitetura do sistema de nível mais alto.
Embora essa arquitetura de alto nível forneça um ponto de partida decente, na verdade não é de muito valor na construção de um sistema real. Você deve reduzir um nível de detalhe para transformar isso em uma arquitetura útil.
Portanto, você segue a mesma ideia geral da abordagem do "grande bloco" e apenas começa a adicionar "sub-blocos" necessários para realizar cada operação. Esses "sub-blocos" são freqüentemente chamados de classes ou módulos de domínio. Eles são facilmente identificados usando as descrições de operação (da abordagem de grandes blocos) e desenhando diagramas de sequência. Eles são chamados de classes de domínio porque não pretendem ser classes "reais", mas destinam-se a descrever o seu sistema em termos do domínio do problema do seu sistema.
O resultado final da criação de todo o diagrama de sequência e da identificação de todos os "sub-blocos" é que agora você tem uma lista de classes de domínio e suas listas de operações. Isso geralmente acaba resultando em uma arquitetura de software bastante utilizável, onde cada um dos "sub-blocos" / módulos pode ser parcelado em diferentes desenvolvedores para projetar e implementar.
Obviamente, se você deixar como está, seus designers terão muita interação entre si na definição das interfaces entre os módulos. Assim, o arquiteto também pode decidir sobre mecanismos de interface e tipos de dados específicos a serem usados entre os módulos.
Além disso, alguns "sub-blocos" ainda serão muito complicados. Portanto, outra iteração da abordagem de "sub-bloco" pode ser necessária, mas apenas desta vez em um dos módulos recém-identificados.
Finalmente, pode haver alguns padrões / limitações específicos entre interfaces às quais o arquiteto deseja que o sistema adira (por exemplo, retornos de chamada de evento versus chamadas diretas de método), para que essas decisões precisem ser discutidas no projeto de arquitetura. Além disso, pode haver módulos "comuns" que o arquiteto deseja que todos usem.
fonte
Como desenvolvedor, você provavelmente está acostumado a fornecer soluções. Essa é uma maneira muito boa de pensar, mas pode atrapalhá-lo quando se trata de pensar em arquitetura.
Acho que ajuda a descrever o problema que você está tentando resolver primeiro. Quais são os requisitos? Quais são as restrições? Você pode conversar com as partes interessadas para descobrir esses requisitos?
Pode ajudar se você também puder descrever seus próprios objetivos de design. Sua solução precisa ser dimensionada ou o design para um único usuário é suficiente? Quanto tempo sua solução precisa permanecer válida? É uma solução única ou uma solução de infraestrutura de longo prazo? Talvez também seja importante: quais são os limites aceitos da sua arquitetura?
E como essa é uma experiência de aprendizado, não tenha medo de fazer perguntas, mesmo que sejam tolas.
fonte