O que é software design? E por que é tão importante

Português   |   Source

Dilbert

O que é software design? Qual é o produto final da atividade software design? Por que é tão importante entender esse conceito nos nossos dias e como entendê-lo pode mudar a forma como você encara o desenvolvimento de software e toda a indústria de software que conhecemos atualmente.

O que me fez ter vontade de levantar essa discussão foi que um dia desses eu estava dando uma olhada nos meus itens para ler no delicious.com e me deparei com um artigo bem antigo, de 1992 e que chamou a minha atenção imediatamente. O artigo em questão foi escrito por Jack W. Reeves e apesar de antigo continua tão atual que parece ter sido escrito ontem. Sugiro fortemente que antes de você continuar lendo esse post, leia o artigo original ou pelo menos guarde-o nos seus bookmarks para ler depois.

O artigo

Durante todo o artigo de Reeves, você percebe que ele tenta colocar na mente do leitor um conceito principal. O produto gerado pela atividade de software design não é documentação, mas sim código-fonte. E esse conceito principal é desdobrado em diversos outros aspectos relacionados que realmente abrem os olhos para alguns aspectos que ele mesmo diz que são tão óbvios que parece que estão localizados em um ponto-cego das empresas. Vejamos alguns desses aspectos.

There is one consequence of considering code as software design that completely overwhelms all others. It is so important and so obvious that it is a total blind spot for most software organizations. This is the fact that software is cheap to build. It does not qualify as inexpensive; it is so cheap it is almost free. If source code is a software design, then actually building software is done by compilers and linkers.

O primeiro aspecto aqui é bem claro. Reeves coloca que "construir" software é muito barato. Mas não construir software do jeito que nós entendemos, o que encaramos hoje como construir software é o que ele chama de software design e é justamente aí que a coisa toda começa a fazer mesmo todo o sentido pois os conceitos começam a ser esclarecidos e mais importante ainda, unificados. Construir software ou build software se refere a atividade de compilar o software, gerar o artefato final do software, que pode variar de um executável para um conjunto de arquivos interpretados, dependendo da linguagem de programação que usamos. E nesse caso, build software, é muito barato, basta um computador comum para isso.

Mas software design é caro, muito caro. Observemos a explicação de Reeves, mais uma vez.

Designing software is an exercise in managing complexity. The complexity exists within the software design itself, within the software organization of the company, and within the industry as a whole. Software design is very similar to systems design. It can span multiple technologies and often involves multiple sub-disciplines. Software specifications tend to be fluid, and change rapidly and often, usually while the design process is still going on. Software development teams also tend to be fluid, likewise often changing in the middle of the design process. In many ways, software bears more resemblance to complex social or organic systems than to hardware. All of this makes software design a difficult and error prone process. None of this is original thinking, but almost 30 years after the software engineering revolution began, software development is still seen as an undisciplined art compared to other engineering professions.

Aí está, software design envolve essencialmente tratar a complexidade que é exigida no desenvolvimento de software, e essa complexidade tende a crescer exponencialmente a medida que o software cresce em funcionalidades. Apenas para termos um exemplo mais atual que o do artigo, levemos em conta um desenvolvimento web da atualidade.

Para desenvolver uma aplicação web hoje, você precisa conhecer inicialmente HTML e alguma linguagem para realizar a programação do lado servidor, recomendo que caso queira reduzir a complexidade dessa aplicação, escolha Python. Daí, para poder deixar a aplicação apresentável em termos visuais, você terá de conhecer bem CSS. Se quiser que sua aplicação seja bastante interativa com o usuário, terá que conhecer Javascript. Para facilitar o uso do Javascritp, hoje quase todo mundo prefere a fantástica biblioteca jQuery. Se quiser facilitar as coisas ainda mais e ficar antenado com as tendências mais recentes acrescente aí as novidades do HTML5 e as novidades do CSS3. E olhe que estamos falando aqui apenas da parte de tecnologia de uma aplicação.

Para complicar ainda mais o cenário exposto acima, adicione a essa receita de complexidade as regras de negócio do seu cliente, que na maioria dos casos devem ser inúmeras e mudar constantemente e sim, chegamos facilmente a conclusão de que desenvolver software é realmente um exercício de complexidade, e por isso realizar software design é caro, muito caro.

Conclusão

Percebe agora por que software design é tão importante? Software design de verdade acontece no momento em que estamos produzindo código-fonte, é ali que precisamos nos preocupar com a complexidade do software, se vamos usar orientação a objetos, programação funcional, se vamos dividir em módulos o sistema, qual vai ser a arquitetura da aplicação que vai suportar essa complexidade.

Porém, o problema é que já por muito tempo, a indústria tem adicionado outras complexidades em cima de algo que já é por natureza bastante complexo com metodologias, processos, certificações entre outras coisas que só complicam a nossa vida ao invés de realmente nos ajudar. Não sou contra processo e acho até que ele ajuda em muitos casos, mas precisamos claramente de processos que tornem a vida de quem cria o software, o desenvolvedor, mais fácil e não mais complicada. Métodos ágeis estão aí para tentar ajudar nessa questão, mas quantas empresas hoje são realmente ágeis? Quanto tempo ainda vai demorar para que elas saiam desse ponto-cego em que se encontram e passem a enxergar o óbvio como um artigo desses que foi escrito em 1992? São perguntas que eu infelizmente não sei a resposta, mas sei que precisamos persistir em tentar respondê-las.

Comments powered by Disqus
Share