1.3. O que é Ciência da Computação?

Ciência da computação é muitas vezes difícil de definir. Isto é provavelmente devido ao infeliz uso da palavra “computador” no nome. Como você está talvez consciente, ciência da computação não é simplesmente o estudo de computadores. Embora os computadores desempenhem um importante papel de apoio como ferramenta na disciplina, eles são apenas isso - ferramentas.

A ciência da computação é o estudo de problemas, resolução de problemas e soluções que surgem do processo de resolução de problemas. Dado um problema, o objetivo de um cientista da computação é desenvolver um algoritmo, uma lista passo-a-passo de instruções para resolver qualquer instância do problema que possa surgir. Algoritmos são processos finitos que se seguidos irão resolver o problema. Algoritmos são soluções.

A ciência da computação pode ser pensada como o estudo de algoritmos. Contudo, devemos ter cuidado para considerar o fato de que alguns problemas podem não ter solução. Embora provar esta afirmação esteja além do escopo deste texto, o fato de que alguns problemas não podem ser resolvidos é importante para aqueles que estudam ciência da computação. Podemos então definir ciência da computação, de forma completa, incluindo os dois tipos de problemas e afirmando que a ciência da computação é o estudo de soluções para problemas, bem como o estudo de problemas sem nenhuma solução.

Também é muito comum incluir a palavra ** computável**quando descrevendo problemas e soluções. Nós dizemos que um problema é computável se existe um algoritmo para resolvê-lo. Uma definição alternativa para ciência da computação, então, é dizer que a ciência da computação é o estudo de problemas que são e que não são computáveis, o estudo da existência e inexistência de algoritmos. Note que a palavra “computador” não surgiu em nenhuma dessas definições. Soluções são consideradas independentes da máquina.

Ciência da computação, no que se refere ao próprio processo de resolução de problemas, é também o estudo de abstrações. A abstração nos permite ver o problema e solução de tal forma a separar as assim chamadas perspectivas lógicas e físicas. A idéia básica deve-lhe ser familiar no seguinte exemplo.

Considere o automóvel que você pode ter dirigido para a escola ou para o trabalho hoje. Como motorista, um usuário do carro, você tem certas interações que acontecem para utilizar o carro para o propósito pretendido. Você entra, insere a chave, liga o carro, desliga, freia, acelera e controla a direção. Do ponto de vista da abstração, podemos dizer que você está vendo a perspectiva lógica do automóvel. Você está usando as funções fornecidas pelos projetistas do veículo com a finalidade de transportar você de um local para outro. Essas funções são às vezes também chamado de interface.

Por outro lado, o mecânico que deve reparar o seu automóvel tem um ponto de vista muito diferente. Ela não só sabe dirigir, mas deve conhecer todos os detalhes necessários para realizar todas as funções que nós nem consideramos. Ela precisa entender como o motor funciona, como o a transmissão muda as marchas, como a temperatura é controlada e assim por diante. Isso é conhecido como a perspectiva física, os detalhes que ocorrem “sob o capô.”

A mesma coisa acontece quando usamos computadores. A maioria das pessoas usa computadores para escrever documentos, enviar e receber e-mails, navegar na web, tocar música, armazenar imagens e jogar jogos sem qualquer conhecimento dos detalhes que ocorrer para permitir que esses tipos de aplicativos funcionem. Eles veem computadores de uma perspectiva lógica ou de usuário. Cientistas da computação, programadores, equipe de suporte tecnológico e administradores de sistemas tem uma visão muito diferente do computador. Eles devem saber os detalhes de como funcionam os sistemas operacionais, como os protocolos de rede são configurados e como codificar vários scripts que controlam o funcionamento. Eles devem ser capazes de controlar os detalhes de baixo nível que um usuário simplesmente assume.

O ponto comum para ambos os exemplos é que o usuário da abstração, às vezes também chamado de cliente, não precisa conhecer os detalhes, desde que o usuário esteja ciente da maneira como a interface funciona. Essa interface é a maneira como nós, como usuários, nos comunicamos com as complexidades inerentes da implementação. Como outro exemplo de abstração, considere o módulo math do Python. Uma vez que importamos o módulo, podemos realizar cálculos como

>>> import math
>>> math.sqrt(16)
4.0
>>>

Este é um exemplo de abstração procedimental. Nós não necessariamente sabemos como a raiz quadrada está sendo calculada, mas sabemos o nome da função e como usá-la. Se executarmos a importação corretamente, podemos supor que a função nos fornecerá os resultados corretos. Sabemos que alguém implementou uma solução para o problema da raiz quadrada, mas só precisamos saber como usá-la. Isto é às vezes referido como uma visão de “caixa preta” de um processo. Nós simplesmente descrevemos a interface: o nome da função, o que é necessário (os parâmetros) e o que será retornado. Os detalhes ficam escondidos (veja: ref: Figura 1 <fig_procabstraction>).

../_images/blackbox.png

Figura 1: Abstração Procedimental

Next Section - 1.4. O que é Programação?