Conhecendo a Liberdade de Software, com código

Adriano Rafael Gomes, adrianorg@arg.eti.br
17 de setembro de 2016, versão 1



1. Introdução

Novas pessoas chegam ao mundo do Software Livre a todo momento. Nós damos as boas vindas a todas elas! Para que esses novos membros da nossa comunidade se tornem membros duradouros e conscientes, é importante que eles conheçam, compreendam, valorizem e defendam a filosofia do Movimento Software Livre.

O objetivo desta palestra é apresentar o conceito de Liberdade de Software para os novos usuários. Isso será feito expondo pontos fundamentais da nossa filosofia, ilustrados com exemplos de como eles são aplicados, enquanto desenvolvemos um pequeno programa de computador.

2. Liberdade de Software

Para entender o que é Liberdade de Software, vamos primeiro tentar responder:

2.1. Software

Neste documento, vamos considerar software e programa de computador como sinônimos.

Computadores são máquinas programáveis, que executam os comandos que são dados a eles. Seguindo os comandos, os computadores podem fazer qualquer coisa. Para o computador obedecer você, basta você dar os comandos certos.

Veja este programa de computador, por exemplo:

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  print "Oi, mundo!"

Quando executado, ele resulta em:

  $ ./oi-mundo.py 
  Oi, mundo!

Veja que o computador executou os comandos contidos no programa.

Assim, podemos definir programa de computador, ou software, como uma série de comandos para o computador executar.

2.2. Liberdade

Para entender o conceito de liberdade, tente responder esta pergunta:

3. As liberdades essenciais do software

Para que você tenha Liberdade de Software, é necessário que estas suas quatro liberdades essenciais sejam respeitadas:

3.1. Liberdade 0: executar

A Liberdade 0 é a liberdade de executar o programa, como você quiser, para qualquer propósito.

A liberdade de executar o programa significa que qualquer pessoa ou organização tem liberdade de executar o programa para qualquer tarefa ou propósito que queira, sem ter que comunicar ou pedir autorização ao desenvolvedor do programa ou a qualquer entidade. É o propósito do usuário que importa, e não o propósito do desenvolvedor do programa.

Por exemplo, você não será proibido de executar o programa para fins comerciais, nem de executar o programa em organizações militares. Nem lhe será exigido que você seja um estudante ou um usuário doméstico para usar o programa, ou qualquer outra restrição nesse sentido.

3.1.1. Código

E, para comemorar a liberdade 0, vamos executar o nosso incrível programa oi-mundo.py! :-)

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  print "Oi, mundo!"

O resultado é:

  $ ./oi-mundo.py 
  Oi, mundo!

Execute o programa como você quiser, não importa onde, nem quantas vezes, nem quem você é. Viva a liberdade 0!

3.2. Liberdade 1: estudar e modificar

A Liberdade 1 é a liberdade de estudar como o programa funciona, e de modificar o programa para que ele funcione como você quiser. Ter acesso ao código fonte do programa é um pré-requisito para essa liberdade.

A liberdade de modificar o programa é importante para que você possa controlar individualmente o que o programa faz e possa adaptá-lo para que ele atenda as suas necessidades.

Por exemplo, se você encontrar um bug no programa, você poderá consertá-lo. Se o programa não executar uma tarefa exatamente como você precisa, você poderá melhorá-lo. Será mais difícil impor sobre você um programa com comportamento malicioso, como espionar as suas informações, ou que contenha limitações artificiais, como impedir a impressão de arquivos, se você puder remover essas restrições do programa.

3.2.1. Código

O nosso programa oi-mundo.py é bem legal como nosso primeiro programa, mas agora vamos partir para algo mais avançado: vamos fazer um jogo!

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  numero_do_computador = 7
  print "Eu escolhi um número entre 1 e 10. Tente adivinhá-lo."
  numero_do_jogador = raw_input("Qual é o seu palpite? ")
  if numero_do_jogador == numero_do_computador:
      print "Você acertou! Parabéns!"
  else:
      print "Você errou. Eu escolhi", numero_do_computador

E, claro, vamos jogá-lo:

  $ ./jogo1.py 
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 1
  Você errou. Eu escolhi 7
  $ ./jogo1.py 
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 2
  Você errou. Eu escolhi 7
  $ ./jogo1.py 
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 7
  Você errou. Eu escolhi 7

Esse programa tem, pelo menos, dois problemas. Você consegue identificá-los?

  1. O primeiro problema é que o computador sempre escolhe o mesmo número, 7. Escolher sempre o mesmo número torna o jogo totalmente previsível e sem graça. O computador deveria escolher números diferentes.

    Para resolver esse problema, você vai precisar estudar como o programa funciona e modificar o programa para que ele funcione como você quiser. Ainda bem que você tem a liberdade 1 para estudar e modificar o programa!

    Para o computador escolher um número, vamos usar a função randint, trocando:

      numero_do_computador = 7
    

    por:

      numero_do_computador = randint(1, 10)
    

  2. O segundo problema é que, mesmo que você acerte o número que o computador escolheu, ele diz que você errou. Isso é um bug, que precisa ser corrigido.

    Esse bug acontece porque os tipos de dados dos dois números, o do computador e o do jogador, são diferentes. O programa está comparando inteiros com strings, o que sempre retorna falso no teste. Para corrigir esse bug, vamos converter de string para inteiro o tipo de dado do número que você escolheu, para ficar igual ao tipo de dado do número do computador.

    Vamos trocar:

      numero_do_jogador = raw_input("Qual é o seu palpite? ")
    

    por:

      numero_do_jogador = int(raw_input("Qual é o seu palpite? "))
    

Esta é a versão 2 do nosso jogo, com as devidas correções:

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  from random import randint
  
  numero_do_computador = randint(1, 10)
  print "Eu escolhi um número entre 1 e 10. Tente adivinhá-lo."
  numero_do_jogador = int(raw_input("Qual é o seu palpite? "))
  if numero_do_jogador == numero_do_computador:
      print "Você acertou! Parabéns!"
  else:
      print "Você errou. Eu escolhi", numero_do_computador

E este é o resultado:

  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 1
  Você errou. Eu escolhi 10
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 2
  Você errou. Eu escolhi 6
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 3
  Você errou. Eu escolhi 8
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 4
  Você errou. Eu escolhi 10
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 5
  Você acertou! Parabéns!

Com as liberdades 0 (executar) e 1 (estudar e modificar), você sozinho já consegue ter controle individual completo sobre o programa, desde que você saiba programar.

E se você não souber programar? E, mesmo que você saiba programar, você teria tempo disponível para dar manutenção nas centenas de programas que você usa?

Ter controle individual é essencial, mas não é o suficiente. Por isso, precisamos ter controle coletivo. De que forma? Compartilhando.

3.3. Liberdade 2: copiar sem modificações

A Liberdade 2 é a liberdade de fazer cópias idênticas do programa e distribuí-las a quem você quiser, de modo a ajudar o seu próximo e a ser ajudado por ele.

Por exemplo, você não será proibido de copiar para os seus amigos os programas que você usa. Ao contrário, copiar os programas é um comportamento desejável.

3.3.1. Código

Um dia, um amigo seu viu você jogando e se interessou pelo nosso jogo. O seu amigo então perguntou se você poderia copiar o jogo para ele, e você respondeu:

- Claro! Aqui está! Pode levar essa cópia do jogo para você!

E você também disse para ele:

- Se alguém pedir uma cópia do jogo para você, você pode copiar à vontade, porque esse programa é Software Livre.

E seu amigo respondeu:

- Software Livre? Que interessante! Gostei, quero saber mais!

Num outro dia, você estava jogando e percebeu um problema no jogo: ele permite que você escolha um número fora da faixa de 1 a 10.

Veja:

  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 0
  Você errou. Eu escolhi 1
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 11
  Você errou. Eu escolhi 2
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 42
  Você errou. Eu escolhi 2
  $ ./jogo2.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? -273
  Você errou. Eu escolhi 1

Você até fez uma tentativa de melhorar o jogo, usando a liberdade 1, para estudar e modificar o programa. Você olhou o código fonte do programa e tentou melhorá-lo, mas você não conseguiu porque ainda não sabe programar.

Então você achou melhor pedir ajuda para um amigo seu que sabe programar, para ele fazer essa melhoria. Você então copiou o programa para ele dar uma olhada. Ainda bem que você tem a liberdade 2, para copiar o programa para quem você quiser!

3.4. Liberdade 3: redistribuir com modificações

A Liberdade 3 é a liberdade de você distribuir a sua versão modificada do programa a quem você quiser, de modo a beneficiar a sua comunidade com as modificações feitas por você, e vice-versa, ou seja, você receber as modificações que a comunidade distribuir. Ter acesso ao código fonte do programa é um pré-requisito para essa liberdade.

Mesmo para um excelente programador de computadores é impossível conseguir fazer sozinho todas as modificações necessárias nos diversos programas que usa, porque isso seria um trabalho imenso devido à enorme quantidade de programas livres existentes. Por isso, é importante ter a liberdade de colaborar com os demais, formando uma comunidade.

Por exemplo, as inúmeras melhorias que são feitas por diversas pessoas nos diversos programas livres existentes dão origem a novas versões desses programas. Esses programas são então distribuídos com essas melhorias, para o benefício de todos os usuários desses programas.

3.4.1. Código

Você explicou para o seu amigo programador que o seu jogo não está conferindo se o número digitado pelo usuário está dentro da faixa de 1 a 10, e fez uma cópia do programa para o seu amigo tentar melhorar o jogo.

O seu amigo programador logo descobriu como resolver o problema e fez a seguinte modificação:

Trocou:

  numero_do_jogador = int(raw_input("Qual é o seu palpite? "))

por:

  numero_do_jogador = 0
  while numero_do_jogador not in range(1, 11):
      numero_do_jogador = int(raw_input("Qual é o seu palpite? "))

O seu amigo programador testou a modificação e confirmou que o jogo estava funcionando corretamente:

  $ ./jogo3.py 
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 0
  Qual é o seu palpite? 11
  Qual é o seu palpite? 42
  Qual é o seu palpite? -273
  Qual é o seu palpite? 1
  Você errou. Eu escolhi 10

A versão melhorada do jogo ficou assim:

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  from random import randint
  
  numero_do_computador = randint(1, 10)
  print "Eu escolhi um número entre 1 e 10. Tente adivinhá-lo."
  numero_do_jogador = 0
  while numero_do_jogador not in range(1, 11):
      numero_do_jogador = int(raw_input("Qual é o seu palpite? "))
  if numero_do_jogador == numero_do_computador:
      print "Você acertou! Parabéns!"
  else:
      print "Você errou. Eu escolhi", numero_do_computador

Ele então copiou para você o programa com as modificações que ele fez, e agora você também pode jogar a nova versão melhorada do jogo. Ainda bem que o seu amigo programador tem a liberdade 3, para redistribuir com modificações o programa para quem ele quiser!

As quatro liberdades essenciais, quando respeitadas, se complementam e permitem que os usuários tenham total controle sobre o software que usam.

4. Bônus - o jogo trapaceiro

Até agora, nós desenvolvemos um programa de computador que conseguiu evoluir graças às condições proporcionadas pela Liberdade de Software.

A partir de agora, nós vamos explorar outra situação: um jogo trapaceiro.

Você obteve uma nova versão do jogo e, enquanto você jogava, você percebeu que agora somente o computador ganha o jogo:

  $ ./jogo4.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 1
  Você errou. Eu escolhi 10
  $ ./jogo4.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 2
  Você errou. Eu escolhi 9
  $ ./jogo4.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 3
  Você errou. Eu escolhi 8
  $ ./jogo4.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 4
  Você errou. Eu escolhi 7
  $ ./jogo4.py
  Eu escolhi um número entre 1 e 10. Tente adivinhá-lo.
  Qual é o seu palpite? 5
  Você errou. Eu escolhi 6

O que aconteceu? Será que você perdeu a sua sorte? Ou será que o programa está trapaceando? Como saber?

Caso o nosso jogo fosse software não-Livre, você não poderia fazer nada a respeito. GAME OVER

Mas o nosso jogo é Software Livre, então vamos examinar o código-fonte:

  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  
  from random import randint
  
  numero_do_computador = randint(1, 10)
  print "Eu escolhi um número entre 1 e 10. Tente adivinhá-lo."
  numero_do_jogador = 0
  while numero_do_jogador not in range(1, 11):
      numero_do_jogador = int(raw_input("Qual é o seu palpite? "))
  numero_do_computador = 11 - numero_do_jogador
  if numero_do_jogador == numero_do_computador:
      print "Você acertou! Parabéns!"
  else:
      print "Você errou. Eu escolhi", numero_do_computador

Opa! O que esta linha está fazendo aí?

  numero_do_computador = 11 - numero_do_jogador

Vamos retirar essa linha trapaceira do nosso programa, pois nós queremos que o software trabalhe a nosso favor, e não contra nós.

Esse é um dos problemas que podem acontecer quando nós não temos Liberdade de Software: os programas podem conter funcionalidades maliciosas que trabalham contra nós, e que talvez nunca sejam detectadas.

5. Conclusão

Foram apresentados conceitos fundamentais da filosofia do Movimento Software Livre. As quatro liberdades essenciais do software, para executar, estudar e modificar, fazer cópias idênticas e redistribuir com modificações são a base para a Liberdade de Software.

Somente com Liberdade de Software a sociedade consegue controlar e compartilhar o software que usa. É essencial que a sociedade defenda a Liberdade de Software, assim como já defende outras liberdades, como as liberdades de pensamento, de expressão, de associação, e demais liberdades.

Para termos uma sociedade livre, temos que lutar por liberdade em todas as áreas. As diversas liberdades dependem umas das outras e se fortalecem umas com as outras, e nossa sociedade é tão livre quanto a mais fraca das liberdades.

6. Para saber mais

Para saber mais a respeito da filosofia do Movimento Software Livre, acesse http://www.gnu.org/philosophy/philosophy.html.

7. Licença

Copyright (C) 2016 Adriano Rafael Gomes <adrianorg@arg.eti.br>.

Esta obra está licenciada sob uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional (CC BY-SA 4.0).