Sistema é o nome que se dá a um conjunto de componentes que se organizam de forma a executar uma ou mais funções. É um termo que é usado em várias áreas do conhecimento humano. Por exemplo, em anatomia, o sistema circulatório humano é o nome que se dá ao conjunto de veias, artérias, capilares e o coração, que, em conjunto cumprem a função de fazer o sangue circular pelo corpo.
Se você é da área de saúde, me perdoe a analogia simplista, imagino que tem milhares de coisas que estou deixando de fora aqui, ou que entendi errado, mas a ideia é essa. Dentre os componentes de um sistema, alguns desses componentes podem ser, por si só, sistemas, ou seja, contam eles mesmos com outros componentes menores para executar uma função. Normalmente se dá o nome de sub-sistema.
Um carro pode ser entendido como um grande sistema, com a função de te levar de um lugar para outro. Dentre os vários componentes, você tem um sub-sistema de aceleração e um sub-sistema de frenagem, e cada um desses tem seus componentes e, eventualmente, sub-sistemas. A medida que a tecnologia aumenta, os sistemas se tornam mais complexos.
Vários níveis de sistemas e sub-sistemas integrando milhares de componentes para produzir diversas funções importantes. Os sistemas informatizados estão entre os sistemas mais complexos jamais produzidos pelo ser humano. Você acha um carro algo complexo?
Pois a complexidade dos sistemas que rodam no caro é ordens de grandeza maior que a dos componentes mecânicos envolvidos. Apesar disso, cada vez mais, carros se torna informatizados, um grande computador com acessórios de locomoção. O que é um sistema?
Um sistema, em informática, é um conjunto de instruções de processador, informações e outros subsistemas organizados de forma a permitir que o computador realize determinada função esperada. Os componentes desse sistema são rotinas, trechos de código e outros sistemas mais básicos. No final das contas, a quantidade de componentes em um sistema de informática, como esse navegador que você está usando para ver meu vídeo do youtube, ou o aplicativo do youtube no celular, possuem milhares de instruções individuais.
Além disso usam funções do sistema operacional, que atua como um subsistema para acessar a placa gráfica e mostrar o vídeo. Também usam o sub-sistema de network, para acessar o conteúdo do vídeo no servidor do youtube e por aí vai. A complexidade desses sistemas todos é monstruosa.
Como é de se esperar, em sistemas muito complexos, é grande a chance de um erro ou uma falha. Isso é um ponto que todo desenvolvedor de sistema está acostumado. Sistemas tem bugs.
Você se esforçou durante meses, desenvolvendo aquele seu sisteminha, só para, no primeiro dia, o usuário achar 200 bugs no seu filho. Dá raiva isso, eu sei. Sistemas funcionam muito melhor sem usuários.
Você sabe que programador nenhum gosta de admitir que o programa tem erros. Bug é inseto em inglês. Reza a lenda que quando os primeiros programadores colocavam seus sistemas para rodar nos Eniacs da vida, aqueles computadores antigos, ainda baseados em válvulas e não em chips de silício.
De repente o sistema dá aquela travada. O que os programadores falavam? Olha, um bug entrou ali na válvula e parou o sistema.
Vamos tirar o bug de lá e o sistema vai voltar a funcionar. Lógico que não era inseto nada, era erro no código, mas o programador agora ganhou um tempinho para corrigir o erro e botar a coisa para rodar de novo. Mas o mais incrível é como esses malditos insetos conseguiram evoluir tão rapidamente, migrar para os chips, e até hoje de vez em quando fazem os transistores e chips de silício falharem e travarem o seu sistema.
Tem uma piada já a algum tempo que, se programadores fizesse carros, eles andariam a 10 km/h, dariam erros a cada 20 metros e de tempos em tempos você teria que parar o carro, desligar ele, sair do carro, entrar de novo e reiniciar o motor, mas, em compensação poderia copiar o carro sem ter que pagar um novo. Mas, agora falando sério, você já se perguntou porque software tem tantos erros? Estamos acostumados a comprar um hardware, como um relógio, e ver esse relógio funcionar por anos, sem nem um erro.
Porque o programa trava de vez em quando, para de funcionar? Um motivo já mencionamos acima, é o fato de softwares serem sistemas extremamente complexos, quando comparados com outros dispositivos mecânicos, mesmo dispositivos mecanismo bastante complexos como são os relógios. Mas existe um outro motivo que é contra intuitivo.
Softwares tem muito erros porque erros de software são baratos de corrigir. Pensa bem. Quando um carro tem um erro de projeto, é preciso fazer um recall, chamar todos os carros, substituir peças, alterar a linha de produção, é um custo enorme.
Por isso, o processo de desenvolvimento de um carro conta com uma fase de projeto extremamente cara e extensa, gastar dinheiro no projeto é economizar dinheiro depois evitando erros. Em software, se seu sistema deu bug, você, provavelmente vai lançar uma nova versão corrigindo. Pronto.
É barato. Na maior parte das vezes, uma pessoa pode fazer um projeto meio nas coxas, de qualquer jeito e depois ir corrigindo isso ao longo do caminho. Por isso tantas equipes de desenvolvimento acabam aprendendo a fazer software assim e se sentem confortáveis com isso.
O problema desse tipo de visão é que, embora eu concorde que a maior parte dos erros em software seja algo simples, sem grandes custos, alguns erros podem sim ser caros, muito caros. Por exemplo, o caso do foguete Ariane 5, um dos foguetes do programa espacial da união europeia, usado para colocar satélites em órbita. Esse foguete era uma melhoria em relação ao Ariane 4, seria lançado em 1995, após um projeto que levou vários anos.
Esse projeto incluía um sistema de navegação que tinha um erro no cálculo do vetor de aceleração horizontal. Em determinado ponto do código, um número de ponto flutuante era armazenado em uma variável inteiro. O código era o mesmo que havia sido usado no foguete Ariane 4.
Como estava funcionando, eles não mudaram nada, não havia porque testar novamente. Só que o foguete Ariane 5 era mais rápido, então deu overflow. O número ponto flutuante não cabia dentro do inteiro.
O foguete perdeu o controle e precisou ser explodido no ar por segurança. Um pequeno bug de software que custou algumas centenas de milhões de dólares. Mas não é só esse.
Tem outros casos, como o Mars Orbiting Craft, uma sonda americana que explodiu ao chegar a marte, em 1999, devido a um erro de conversão entre centímetros e polegadas no código do sistema, no código do sistema. Mas há casos ainda piores. Em 2000 na cidade do panamá, um sistema de apoio para uma máquina de radioterapia tinha um erro no código que acabava, em algumas situações, aumentando muito a dose de radiação.
E você sabe, radiação não mata na hora, leva um tempo. No final, até descobrirem o que estava acontecendo, 8 pacientes morreram de complicações da radiação e vários outros pioraram significativamente e tiveram complicações no tratamento devido a um bug. Portanto deve-se tomar muito cuidado.
Embora a maior parte dos bugs de sistemas seja extremamente barata de consertar, nem todos são. Na nossa área, como vamos cuidar para garantir segurança de sistemas, um erro pode ser extremamente caro. Uma falha no controle de acesso, um erro que revele informações pessoais, senhas, tudo isso pode ter um impacto financeiro absurdamente caro.
Por isso, é fundamental a criação de processos cuidadosos de desenvolvimento e testes de sistemas de forma a minimizar a possibilidade de tais erros críticos. Desenvolver software e desenvolver software com segurança são duas atividades com diferenças significativas. Nem sempre vale a pena o custo, mas, cada vez mais é importante considerar tais diferenças.
Não deixe o seu foguete explodir por falta de cuidado.