• Nenhum resultado encontrado

3. ATIVIDADES DE DESENVOLVIMENTO DE SOFTWARE

3.1. Processo produtivo de software

A indústria de software é considerada uma indústria de alta tecnologia. No entanto, os níveis tecnológicos variam de segmento para segmento e entre as diferentes etapas do processo de desenvolvimento de software. Segundo (Pressman, 2002), referência na área de Engenharia de Software, abstraindo-se a linearidade que se pode inferir a partir da Figura 3.136, o desenvolvimento de software pode ser dividido em quatro etapas: Análise, Design, Codificação e Testes. A engenharia de software concentra-se nos dois primeiros estágios.

Embora o processo não seja linear e não ocorra desta forma na prática, a divisão entre as etapas é importante, pois verifica-se uma correlação entre estas divisões, os modelos de negócio e a divisão internacional do trabalho. É comum, dentro da própria indústria de software, a terceirização de etapas do desenvolvimento, notadamente a codificação e testes, intensivas em mão-de-obra e de relativamente baixo nível tecnológico.

36 Os processos de desenvolvimento de software não são estanques e as etapas ocorrem concomitantemente umas às outras e em forma circular,

Figura 3.1 – Etapas do desenvolvimento de software

Fonte: (Pressman, 2002)

A separação descrita não é rígida e as etapas não ocorrem de maneira isolada. A forma como se faz a análise e o design do projeto influenciam diretamente as etapas de codificação e testes. O reuso de código se objetiva na etapa de codificação, mas as decisões das etapas anteriores definem a intensidade da reutilização. O reuso de projeto, de soluções encontradas para determinados problemas comuns (análise e design) e o reuso de código estão umbilicalmente relacionados.

As características de cada etapa variam em relação à interação com o demandante do software, mais intensa nas atividades de engenharia de software, sendo relevante também nos momentos de implantação e testes, em que o demandante tem contato com a solução desenvolvida e atesta seu funcionamento. Esta interação ocorre em diversos momentos do projeto e não uma única vez, de forma linear, como pode-se inferir a partir do desenho.

A Engenharia de Software, sob a ótica das empresas desenvolvedoras de software, apresenta um dilema: os clientes, principalmente as organizações, desejam um software específico, feito sob medida para suas necessidades e que lhes traga ganhos competitivos em relação aos concorrentes; as empresas de software, por sua vez, desejam maximizar seus ganhos de escala, obtidos com a maximização do reuso, o que implica no desenvolvimento de softwares genéricos capazes de atingir um maior número de clientes. O dilema está no fato de que um software totalmente exclusivo apresenta custo elevado, pois não é diluído entre diversos usuários. Os softwares muito

genéricos, por sua vez, podem não trazer ganhos em relação aos concorrentes. A Engenharia de Software busca o equilíbrio entre estas variáveis, criando aplicações que sejam suficientemente reutilizáveis, de forma a obter ganhos de escala e reduzir o preço do aplicativo para o usuário final, e que atendam especificidades de cada usuário. Uma das estratégias é a maximização do reuso de código, de análise, de design, de testes, ou seja, em todas as etapas do desenvolvimento. Dado que o custo de um software é concentrado em sua primeira cópia, o reuso traz grandes ganhos de escala e produtividade.

O reuso sempre foi um objetivo no desenvolvimento de software, observando-se uma trajetória de seu desenvolvimento.

Para melhor compreensão, pode-se dividir o reuso de software em quatro categorias (Szyperski, 2003):

a) Reuso de código fonte: trechos de código reutilizável são usados durante a fase de

desenvolvimento de um novo software (copiados e colados).

b) Reuso de partes de software: reuso de arquitetura e implementação de fragmentos

de software em diferentes projetos. Exige um processo de desenvolvimento mais elaborado. O reuso ocorre durante o desenho da arquitetura do projeto e da implementação do código. Assim, como no caso acima, não existe componente como uma parte identificável na aplicação final, não sendo substituído com facilidade.

c) Integração dinâmica de componentes de diversas fontes: o reuso não ocorre na

fase de desenvolvimento do software. A aplicação já está desenvolvida e novas funcionalidades são acrescentadas a partir de softwares plug-ins. São exemplos deste tipo de componente os plug-ins adicionados aos browsers para que estes consigam visualizar arquivos em formato PDF.

d) Componentização: esta categoria é a mais complexa. É sua característica que a

atualização, a extensão do sistema e a integração possam acontecer dinamicamente. Isto permite que os componentes sejam utilizados além das fronteiras das organizações. É nesta categoria que estão concentradas as pesquisas do momento e, também, a revolução potencial que pode ser proporcionada pela tecnologia de componentes (Softex, 2007:11).

Observa-se, conforme mostra a Figura 3.2, uma hierarquia entre as diferentes atividades de desenvolvimento de software. Na base, estariam as atividades mais estratégicas e inovativas para a firma, mais densas em conhecimento e basilares para as demais atividades. A partir da análise de requisitos, elabora-se o Design Conceitual; a partir deste, o Design de Alto-Nível e assim sucessivamente, até chegar à atividade de implementação. A codificação é um processo relativamente simples, repetitivo, não baseado na criatividade e conhecimento organizacional. A interação com o demandante é tanto maior quanto mais alta a hierarquia.

Observa-se uma separação entre concepção e execução, da mesma forma que ocorre em outras áreas da economia37. A codificação do programa é demandante de um grande volume de recursos humanos que, apesar dos esforços de automatização por parte da Engenharia de Software, trata-se de uma atividade com grande carga de trabalho manual. O conteúdo intelectual concentra-se predominantemente nas etapas de análise de requisitos e design.

37 A gerência científica de Taylor, do início do século, pautava-se nesta separação entre concepção e execução. Desta forma, o capitalista aumenta

Figura 3.2 – Hierarquização entre as etapas de desenvolvimento de software

Fonte: (Humprey, 2001:317 apud Roselino, 2006)

Conforme afirma Roselino, as atividades de desenvolvimento de software exigem “habilidades artesanais”, conhecimentos tácitos não automatizáveis, que exigem ação humana, por essa e outras razões, trata-se de uma indústria intensiva em mão de obra.

Esse produto, característico da mais moderna etapa do desenvolvimento das forças produtivas capitalistas, é desenvolvido a partir de um processo de concepção ou design (normalmente coletivo), baseado primariamente em “habilidades artesanais” e conhecimentos tácitos dos recursos humanos envolvidos, em processos não automatizáveis. Ocorre que este caráter “manufatureiro”, intensivo em mão-de-obra, está relacionado exclusivamente à atividade de elaboração da primeira unidade de uma solução em software, ou seja, do primeiro produto a partir do qual se podem reproduzir cópias integrais no caso de software pacote, ou de partes reutilizáveis nos casos de serviços em software.(Roselino, 2006:8) Inferior

Implementação

Design Detalhado

Design Alto-nível

Design

Conceitual

Análise de Requisitos H ie ra rq u ia Superior

A transmissão de conhecimento tácito e de difícil codificação exige maiores esforços, tal qual vimos na seção 2.1, que trata sobre os conceitos de informação e conhecimento. Esta característica faz com que estas atividades sejam mais bem remuneradas, por se tratar de mão de obra mais qualificada, rara e de formação mais cara.

Não são todas as etapas que têm essa característica, como a Figura 3.2 demonstra. Há diferentes níveis tecnológicos e, conseqüentemente, diferentes tipos de ocupações geradas. Quanto maior o nível hierárquico, maior a intensidade tecnológica, mais bem remunerado e produtivo o trabalhador. Quanto menor o nível hierárquico, menor o conteúdo tecnológico e maior o número de empregos gerados. Observa-se uma divisão internacional de acordo com a hierarquia do processo. As partes mais altas da hierarquia concentram-se nos países desenvolvidos. Atividades inferiores na hierarquia podem (e são) terceirizadas para países menos desenvolvidos, onde os custos de mão de obra são mais baixos.

Observa-se um dilema entre número de empregos e conteúdo tecnológico. O número de empregos gerados é tanto maior quanto mais inferior na hierarquia. Analisando-se o problema apenas sob a ótica da geração de empregos diretos, a focalização nos serviços de baixo valor torna-se a melhor opção. No entanto, a opção por buscar desenvolver apenas uma parte da indústria, voltada ao atendimento do mercado externo, tende a desconectar este setor do restante da economia local. Esta situação é observada na Índia, que possui uma forte indústria exportadora de software, mas o nível de digitalização local, nos demais setores da economia, e o acesso das famílias às TICs, é relativamente baixo. É um setor que gera empregos, movimenta a economia local, mas que apresenta transbordamentos limitados.

Este dilema é central quando se analisa a indústria de software sob a ótica da inclusão social. Por um lado, temos a quantidade de empregos gerados, que deve ser elevada pela intensidade das desigualdades brasileiras. Por outro, a qualidade do emprego, que deve proporcionar uma remuneração digna, salubridade e segurança, principalmente. Quantidade e qualidade, muitas vezes, encontram-se em pólos opostos. Este ponto será melhor explorado no próximo capítulo.

Das atividades presentes na Figura 3.2, todas são intensivas em mão de obra. Neste sentido, a demanda marginal gera necessidade de mais trabalho humano em proporções elevadas em

relação à intensidade da demanda. A indústria está incessantemente buscando aumentar a taxa de reuso, e, assim, reduzir a necessidade de trabalho humano para atender a demanda marginal. No entanto, trata-se de uma indústria em que as possibilidades de novas combinações e usos ainda está longe de se esgotar, mantendo seu dinamismo.