Introdução ao Processamento de Dados e Programação – Parte 02

Introdução

No post anterior (Introdução ao Processamento de Dados e Programação – Parte 01), levantamos cinco possibilidades de calcular a média de uma lista de notas salvas em um arquivo texto, onde quatro delas usam um script ou um programa. Nesse post, vamos tentar resolver o mesmo problema com outras linguagens:  C++ ( Windows e Linux ), Java (Windows e Linux), Visual Basic .NET (Windows), e Linux Bash.

Recapitulando

Um arquivo texto (por exemplo “notas.txt) possui 30 linhas, cada linha com a nota da prova de um aluno — de 0 a 100 — e eu preciso criar um programa que leia todas as linhas do arquivo, calcule a soma de todas as notas, e calcule a média inteira das notas.

C++

Usando por exemplo o Visual Studio da Microsoft, podemos gerar um aplicativo sem dependências, que pode ser executado em qualquer máquina com Windows 7 pra cima — acho até que roda em Windows mais antigos, não tenho nenhum “na manga” pra teste.

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <string>

int main()
{
  int alunos = 0;
  int media = 0;
  int notas = 0;
  std::ifstream infile("notas.txt");
  std::string line;
  while (std::getline(infile, line))
  {
    notas += atoi(line.c_str());
    alunos++;
  }
  media = notas / alunos;
  printf("Alunos ........... %d\n", alunos);
  printf("Soma das notas ... %d\n", notas);
  printf("Media da Classe .. %d\n", media);
  
return 0;
}


E, o resultado obtido:

CalcNotas CPP

Este mesmo código foi compilado no linux (g++), e funcionou (quase) perfeitamente:

CalcNotas G++

— Tem uma diferença na contagem de linhas, um comportamento diferente entre plataformas. Faltou uma proteção no código para ignorar uma linha vazia — depois da ultima nota preenchida.

Java

O mesmo código abaixo foi compilado no Windows, e a classe gerada foi executada no Windows e no Linux, tranquilo — Claro, apos baixar o Java JDK do Windows (Ferramentas de desenvolvimento e compilação do Java) e o Java JRE (Máquina Virtual Java para executar aplicações) no Linux.

import java.io.*;

public class calcnotas 
{ 
  public static void main(String[] args)throws Exception 
  { 
    File file = new File("notas.txt"); 
    int alunos = 0;
    int notas = 0;
    int media = 0;
    BufferedReader br = new BufferedReader(new FileReader(file)); 

    String st; 
    while ((st = br.readLine()) != null) 
    {
      notas += Integer.valueOf(st);
      alunos++;
    }

    media = notas / alunos;

    System.out.printf("Alunos ........... %d\n", alunos);
    System.out.printf("Soma das notas ... %d\n", notas);
    System.out.printf("Media da Classe .. %d\n", media);

  }
}

Resultado no Windows

CalcNotas Java

Visual Basic .NET

Usando o Visual Studio 2017 com VB .NET, funcionou também. Alguns passos para criar uma aplicação “Console”, depois codificar, compilar, corrigir, compilar, debugar … pronto, funciona.

Imports System

Module Module1

  Sub Main()

    Dim fileReader As System.IO.StreamReader
    fileReader = My.Computer.FileSystem.OpenTextFileReader("notas.txt")
    Dim stringReader As String
    Dim notas As Integer
    Dim alunos As Integer
    Dim media As Integer
    notas = 0
    alunos = 0
    stringReader = fileReader.ReadLine()
    Do While stringReader IsNot Nothing
      alunos = alunos + 1
      notas = notas + Convert.ToInt32(stringReader)
      stringReader = fileReader.ReadLine()
    Loop
    media = notas \ alunos
    Console.WriteLine("Alunos ........... " + alunos.ToString())
    Console.WriteLine("Soma das notas ... " + notas.ToString())
    Console.WriteLine("Media da Classe .. " + media.ToString())

  End Sub

End Module

Resultado obtido:

CalcNotas VB

Linux Bash

O “bash” ou interpretador de comandos do Linux também possui funcionalidades excepcionais. Vamos calcular usando um script — calcnotas.sh

#!/bin/bash
input="notas.txt"
notas=0
alunos=0
while IFS= read -r line
do
  if [ ! -z "$line" ]
  then
    alunos=$(( alunos + 1 ))
    notas=$(( notas + line ))
  fi
done < "$input"
media=$(( notas / alunos ))
echo "Alunos ........... $alunos"
echo "Soma das notas ... $notas"
echo "Media da Classe .. $media"

Resultado obtido:

calcnotas_bash

Conclusão

Bem, por hora já temos bastante exemplos funcionais. Cada linguagem mostrada nestes posts tem as suas características especificas, sintaxe e comportamentos. Algumas são case-sensitive ( considera letras minúsculas são diferentes de maiúsculas ), em algumas (como Python) o espaçamento dos comandos (identação, espaços a esquerda de cada linha) definem inicio e final de bloco, em outras a identação é apenas uma boa prática … as declarações mudam, os tipos de dados também, os limites e comportamentos, cada uma tem o seu “charme” … E eu usei POR ENQUANTO APENAS 8 linguagens de exemplo 😀

Espero que estas informações lhes sejam úteis, ou pelo menos interessantes !!! E desejo a todos como sempre TERABYTES DE SUCESSO !!!

 

Introdução ao Processamento de Dados e Programação – Parte 01

Introdução

Vistos os posts anteriores sobre Introdução a Informática (iniciando com Introdução a Informática – Parte 01), agora vamos focar em processamento de dados e programação.

Processamento de Dados

Embora o termo “processamento de dados” esteja intimamente relacionado a “programação”, eu não preciso necessariamente escrever um programa para processar dados. Vamos ver primeiro o que significa “processamento de dados”:

Processamento de dados é uma série de atividades executadas ordenadamente, que resultará em uma espécie de arranjo de informações, onde inicialmente são coletadas informações, ou dados, que passam por uma organização onde no final será o objetivo que o usuário ou sistema pretende utilizar.[1] A obtenção inicial de dados, informações ou propriamento e seu processamento pode ou não ser realizada através de métodos computacionais e tecnológicos, assim como qualquer outra forma de escrita e catalogação. Exemplo: Um álbum de figurinhas é uma forma de processamento de dados, pois a entrada foram dados aleatórios, onde organizados, formaram informações pertinente ao tema desejado.[1] Contudo, para melhor definição, são usados o computadores para realização de tais tarefas, ele é uma máquina que possui um sistema de coleta de dados, um processador, e ferramentas para manipulação das informações.[2][3]

Fonte: Wikipedia

Em suma, uma planilha eletrônica criada usando um aplicativo como o Microsoft Excel, é capaz de fazer processamento de dados. Você define colunas para preenchimento de informações, e colunas calculadas com fórmulas matemáticas, somatórias e afins, e até mesmo cria gráficos baseado nas informações fornecidas pelo usuário ao editar as células da planilha. Mas você não precisou escrever um programa de computador, você no máximo usou algumas funcionalidades disponíveis mediante assistentes visuais da interface do programa. O Microsoft Excel em si é um Software (ou programa de computador), um aplicativo projetado para ser uma ferramenta de criação e edição de planilhas eletrônicas.

Programação

Para atender necessidades específicas, onde um aplicativo não atende aos requisitos necessários, seja por flexibilidade, capacidade ou tipo de processamento desejado, podemos optar por “fazer um software”. Bem, é nesse ponto que as possibilidades ficam literalmente infinitas. Recomendo a leitura complementar do post “A melhor linguagem de programação“, e todas as referências no final deste post 😀 A definição dos 5 passos para a criação de um programa — de um modo geral — descrita na Wikipedia serve como uma luva:

  1. Reconhecer a necessidade de um programa para resolver um problema ou fazer alguma coisa.
  2. Planificar o programa e selecionar as ferramentas necessárias para resolver o problema.
  3. Escrever o programa na linguagem de programação escolhida.
  4. Compilação: tradução do código fonte legível pelo homem em código executável pela máquina, o que é feito através de compiladores e outras ferramentas.
  5. Testar o programa para ter a certeza de que funciona; se não, regressar ao passo 3

Essa abordagem em passos pode muito bem resultar no uso de uma ferramenta ou aplicativo que não envolva codificar ou compilar um programa. Num primeiro momento você acha que precisa construir um programa para resolver um problema ou atender uma necessidade, porém ao procurar as ferramentas necessárias para resolvê-lo, você encontra um aplicativo ou utilitário pronto. Se não for esse o caso, a escolha da linguagem e recursos necessários para resolver o problema passa a fazer parte do problema.

Quem conhece profundamente uma linguagem de programação, consegue resolver de um jeito ou de outro praticamente qualquer necessidade, exceto quando existem restrições ou requisitos são atendidos pela linguagem ou exigidos no projeto.

Para sair um pouco da teoria, vamos partir de uma necessidade específica, que poderia inclusive ser atendida por uma aplicação de mercado já existente, mas que será resolvida usando um programa de computador, que será escrito em várias linguagens. Os objetivos do programa são realizar a tarefa proposta. Para você ter ideia da quantidade de linguagens de programação que poderiam ser utilizadas, recomendo que você visite o site “The Hello World Collection” —  Nessa página existem exemplos de um programa minusculo, onde o objetivo é simplesmente retornar ao usuário ou imprimir na tela a mensagem “Hello World”, escrita em muitas, muitas linguagens de programação — inclusive AdvPL.

Problema proposto

Em uma escola X, o professor Y quer calcular a média da nota da classe inteira, para cada prova bimestral que ele aplica, em cada classe que ele leciona. Após corrigir as provas, ele têm as notas de todos os alunos gravadas em um arquivo de texto, onde cada linha desse arquivo corresponde a nota de um dos alunos, representados por um numero de 0 a 100, sem ponto ou vírgula. O programa de computador deve ser capaz de ler todas as notas deste aquivo, contar quantas linhas tem no arquivo, e calcular a média das notas — somando todas as notas e dividindo pelo número de alunos (linhas) , gerando um resultado inteiro. Vamos partir de um arquivo chamado “notas.txt”, que contém 30 linhas, correspondendo as notas de 30 alunos de uma sala:

87
82
66
85
100
49
83
96
44
54
86
42
65
43
41
85
47
53
84
68
51
77
95
67
85
98
85
48
68
51

Agora, vamos ver como poderíamos fazer isso com algumas aplicações e linguagens de programação — interpretadas, compiladas, em Windows, em Linux, etc !!!

Microsoft EXCEL

Nem precisamos criar um programa. Simplesmente utilizamos o Microsoft Excel, criamos uma planilha em branco, abrimos o arquivo notas.txt usando o bloco de notas do Windows, copiamos o conteúdo inteiro do arquivo para a área de transferência do Windows, posicionamos na primeira linha da primeira coluna da nova planilha vazia, e colamos o conteúdo. Pronto, 30 linhas com a coluna “A” preenchida com a nota. Selecionamos as 30 células desta coluna com o mouse — clicando na célula A1 e arrastando até a A30 — e usamos a aba “Fórmulas”, opção AutoSum -> Average. Pronto, na célula A31 aparece a média da soma das notas, informando o valor 69,5. Podemos editar a célula e alterar a expressão usada para calcular a média, e obter o resultado inteiro — veja abaixo:

Introdução PD 04

 

BATCH SCRIPT ( CMD – Windows ) 

Eu fiquei surpreso, mas esta operação pode ser feita por exemplo usando o “Prompt de Comando” (CMD) do sistema operacional, criando um arquivo de lote (ou Batch Script), por exemplo chamado de “calcnota.bat” — Teste realizado com Windows 10.

@echo off
echo Calculando Notas -- Arquivo NOTAS.TXT
set tot=0 
set lines=0
set media=0
for /f %%a in (notas.txt) do set /a "lines+=1"
for /f %%a in (notas.txt) do set /a "tot+=%%a"
set /a media = %tot%/%lines%
echo Alunos ........... %lines%
echo Soma das notas ... %tot%
echo Media da classe .. %media%
echo.
pause

Resultado obtido:

Introdução PD 01

Python

Python é uma linguagem orientada a objetos e interpretada — você escreve o fonte e chama o aplicativo que interpreta e executa o script. Precisa ter o Python instalado e configurado na máquina. Teste realizado com Python 3.8.0

filepath = 'notas.txt'
with open(filepath) as fp:
  cnt = 0
  notas = 0 
  media = 0
  line = fp.readline()
  while line:
    if len(line) > 0 :
      notas += int(line)
      cnt += 1
    line = fp.readline()
  media = notas / cnt 
  print("Alunos ........... {}".format(cnt))
  print("Soma das notas ... {}".format(notas))
  print("Media da Classe .. {}".format(media))

E, o resultado obtido:

Introdução PD 02

HARBOUR 

O Harbour é um projeto aberto, que deu continuidade a linguagem Clipper, que requer compilação, e gera um código de máquina — ou aplicação executável. O programa abaixo compilou e rodou em uma VM Linux com Ubuntu Server 16 LTS, usando HARBOUR 3.2.0

Function CalcNota()
Local cfilestr, clinha , nMedia 
Local nAlunos := 0 
Local nSomaNota := 0
Local nLinha := 1
cfilestr := memoread('notas.txt')
While !empty( clinha := memoline(cFilestr,,nLinha) )
  nSomaNota += val(alltrim(clinha))
  nAlunos++
  nLinha++
Enddo
nMedia := int( nSomaNota / nAlunos ) 
qout("Alunos ........... "+str(nAlunos))
qout("Soma das notas ... "+str(nSomaNota))
qout("Media da Classe .. "+str(nMedia))
Return

Resultado obtido:

Introdução PD 03

AdvPL

O código abaixo, escrito em AdvPL, roda em qualquer servidor Protheus , qualquer versão, qualquer build, Windows ou Linux. O resultado é mostrado no console do servidor. Como o AdvPL possui a mesma “base” comum de sintaxe e comportamentos do Clipper, o fonte é quase idêntico ao fonte para Harbour — exceto pela USER FUNCTION ser apenas FUNCTION, e o uso da função conout() ao invés da QOut()

User Function CalcNota()
Local cfilestr, clinha , nMedia 
Local nAlunos := 0 
Local nSomaNota := 0
Local nLinha := 1
cfilestr := memoread('notas.txt')
While !empty( clinha := memoline(cFilestr,,nLinha) )
  nSomaNota += val(alltrim(clinha))
  nAlunos++
  nLinha++
Enddo
nMedia := int( nSomaNota / nAlunos ) 
conout("Alunos ........... "+str(nAlunos))
conout("Soma das notas ... "+str(nSomaNota))
conout("Media da Classe .. "+str(nMedia))
Return

// RESULTADO OBTIDO NO CONSOLE DO SERVIDOR

Alunos ........... 30
Soma das notas ... 2085
Media da Classe .. 69

Pontos comuns dos códigos

Cada um desses códigos basicamente realiza as mesmas operações, ou realizam de forma muito parecida. Leitura de um arquivo texto do disco, contagem de linhas, determinar o valor de cada linha, somar os valores em uma variável, dividir o valor das somas pela quantidade de linhas, e mostrar os valores apurados e o resultado da divisão inteira.

Melhorias

Todos os fontes estão corretos e funcionam. MAS, todos eles partem da premissa que o arquivo informado existe, que as notas informadas em cada linha do arquivo não contenham números informados errados — com letras ou espaços no meio dos números ou números maiores que 100.  Logo, uma linha informada errada no arquivo pode gerar um valor que altera a média da classe. Como o objetivo do post é mostrar as diferenças e semelhanças entre diferentes linguagens de programação, eles servem para o propósito. Porém uma versão “final” dessa funcionalidade precisaria de mais algumas linhas e instruções, para prever e tratar eventuais erros nas informações disponibilizadas para este processo.

Um outro ponto interessante, é que todos estes programas foram criados para trabalhar com apenas um arquivo de texto por vez, com um nome fixo, e nenhum deles usou uma interface gráfica para mostrar o resultado. Como se trata apenas de um teste, exemplo ou prova de conceito, isso não é um problema. Mas, se a pessoa que vai usar esse programa não é você mesmo, existem muitos pontos a serem considerados.

Portabilidade e restrições

O exemplo feito em BATCH roda apenas no Windows. Todos os programas exigem que o usuário crie uma pasta na máquina para colocar o script e o arquivo. Java roda em qualquer  máquina, desde que você tenha instalado o “JRE” ( Java Runtime Environment). Python exige que o usuário tenha na máquina dele o Python instalado — com uma versão compatível com o programa que você criou. O Harbour no linux gera um aplicativo executável, mas existe uma dependência com a LIB do Harbour, que deve ser disponibilizada junto do aplicativo ou o usuário tem que instalar um módulo do Harbour na máquina dele. O programa AdvPL pode ser disponibilizado como fonte ou como “patch”, mas exige que o usuário tenha uma instalação funcional do Protheus Server, e como o programa mostra o resultado na tela de console do servidor, não fica nada prático para set utilizado.

Conclusão

Existem muitas formas e muitas linguagens que podem ser utilizadas para atender a uma determinada necessidade. É fundamental para um desenvolvedor especializar-se em uma delas, mas conhecer as demais alternativas, para melhor avaliar suas escolhas.

No próximo post, vamos ver mais alguns fontes, escritos em outras linguagens, para realizar esse mesmo processamento.

Espero que este conhecimento lhe seja útil, e desejo a todos TERABYTES DE SUCESSO !!!

Referências

Introdução a Informática – Parte 03

Introdução

No post anterior (Introdução a Informática – Parte 02), vimos as etapas que acontecem quando ligamos o equipamento, e de bandeja alguma coisa bem ‘por cima’ sobre dados e programas. Agora vamos descer um pouco mais dentro dos Bytes, abordar o conceito de Dados e Programas, e aproveitar o gancho para ver ‘por cima’ o que é um sistema de arquivos, mais especificamente o sistema de arquivos em árvore, usado pelo MS-DOS e pelo Windows.

Lembrando do Byte

“Note que um byte nada tem de especial, é apenas um número binário de oito algarismos. Sua importância na informática deriva apenas do fato do código ASCII haver adotado números de oito bits, além de razões meramente construtivas ou operacionais. Por exemplo: os códigos enviados a impressoras para controlar a impressão têm oito bits, os valores trocados via Modem entre computadores também, assim como diversas outras operações elementares de intercâmbio de informações. Além disso, memórias costumam ser organizadas de tal forma que as operações de leitura e escrita são feitas com quantidades de um byte ou de um múltiplo de bytes (oito, dezesseis, trinta e dois, sessenta e quatro ou cento e vinte e oito bits – o que corresponde a um, dois, quatro, oito e dezesseis bytes, respectivamente).” (Wikipedia, BYTE)

Logo, o que está gravado em qualquer arquivo armazenado no disco de um computador ? R: Bytes. E na memória RAM ? R: Bytes. E num pen-drive ? Mais Bytes. Legal, tudo são Bytes, ou sequências numéricas de octetos. Mas, no computador eu tenho arquivos de texto, imagens, áudio, vídeo … tudo são bytes ? R: SIM.

Existem editores de texto e ferramentas de disco que permitem abrir um arquivo qualquer, em qualquer formato, e ler todos os bytes do arquivo, e mostrar na tela o conteúdo do arquivo representados em bytes. Normalmente estes programas mostram o valor de cada byte em uma base numérica conhecida por HEXADECIMAL. No sistema decimal, usamos 10 algarismos diferentes para representar um número, de “0” a “9”. No sistema binário, usamos apenas 2: “0” e “1”. No sistema Hexadecimal, usamos 16 ( HEXA + DECIMAL = 6 + 10 ), usando os algarismos de “0” a “9” e as letras de “A” a “F”.

Partindo da base binária, precisamos de uma sequência de 4 BITS para representar 16 valores diferentes, certo ? Usando Hexadecimal, com apenas um símbolo, de “0” a “F”, conseguimos representar 16 valores diferentes. Vejamos abaixo como podemos representar os 256 valores diferentes de um Byte usando cada um dos sistemas ( DEC = Decimal, HEX = Hexadecimal, BIN = Binário ):

DEC HEX BIN DEC HEX BIN DEC HEX BIN DEC HEX BIN
------------------------------------------------------------------------------
000 00 00000000 064 40 01000000 128 80 00000010 192 C0 11000000
001 01 00000001 065 41 01000001 129 81 00000011 193 C1 11000001
002 02 00000010 066 42 01000010 130 82 00000100 194 C2 11000010
003 03 00000011 067 43 01000011 131 83 00000101 195 C3 11000011
004 04 00000100 068 44 01000100 132 84 00000110 196 C4 11000100
005 05 00000101 069 45 01000101 133 85 00000111 197 C5 11000101
006 06 00000110 070 46 01000110 134 86 00001000 198 C6 11000110
007 07 00000111 071 47 01000111 135 87 00001001 199 C7 11000111
008 08 00001000 072 48 01001000 136 88 00001010 200 C8 11001000
009 09 00001001 073 49 01001001 137 89 00001011 201 C9 11001001
010 0A 00001010 074 4A 01001010 138 8A 00001100 202 CA 11001010
011 0B 00001011 075 4B 01001011 139 8B 00001101 203 CB 11001011
012 0C 00001100 076 4C 01001100 140 8C 00001110 204 CC 11001100
013 0D 00001101 077 4D 01001101 141 8D 00001111 205 CD 11001101
014 0E 00001110 078 4E 01001110 142 8E 00010000 206 CE 11001110
015 0F 00001111 079 4F 01001111 143 8F 00010001 207 CF 11001111
016 10 00010000 080 50 01010000 144 90 00010010 208 D0 11010000
017 11 00010001 081 51 01010001 145 91 00010011 209 D1 11010001
018 12 00010010 082 52 01010010 146 92 00010100 210 D2 11010010
019 13 00010011 083 53 01010011 147 93 00010101 211 D3 11010011
020 14 00010100 084 54 01010100 148 94 00010110 212 D4 11010100
021 15 00010101 085 55 01010101 149 95 00010111 213 D5 11010101
022 16 00010110 086 56 01010110 150 96 00011000 214 D6 11010110
023 17 00010111 087 57 01010111 151 97 00011001 215 D7 11010111
024 18 00011000 088 58 01011000 152 98 00011010 216 D8 11011000
025 19 00011001 089 59 01011001 153 99 00011011 217 D9 11011001
026 1A 00011010 090 5A 01011010 154 9A 00011100 218 DA 11011010
027 1B 00011011 091 5B 01011011 155 9B 00011101 219 DB 11011011
028 1C 00011100 092 5C 01011100 156 9C 00011110 220 DC 11011100
029 1D 00011101 093 5D 01011101 157 9D 00011111 221 DD 11011101
030 1E 00011110 094 5E 01011110 158 9E 00100000 222 DE 11011110
031 1F 00011111 095 5F 01011111 159 9F 00100001 223 DF 11011111
032 20 00100000 096 60 01100000 160 A0 00100010 224 E0 11100000
033 21 00100001 097 61 01100001 161 A1 00100011 225 E1 11100001
034 22 00100010 098 62 01100010 162 A2 00100100 226 E2 11100010
035 23 00100011 099 63 01100011 163 A3 00100101 227 E3 11100011
036 24 00100100 100 64 01100100 164 A4 00100110 228 E4 11100100
037 25 00100101 101 65 01100101 165 A5 00100111 229 E5 11100101
038 26 00100110 102 66 01100110 166 A6 00101000 230 E6 11100110
039 27 00100111 103 67 01100111 167 A7 00101001 231 E7 11100111
040 28 00101000 104 68 01101000 168 A8 00101010 232 E8 11101000
041 29 00101001 105 69 01101001 169 A9 00101011 233 E9 11101001
042 2A 00101010 106 6A 01101010 170 AA 00101100 234 EA 11101010
043 2B 00101011 107 6B 01101011 171 AB 00101101 235 EB 11101011
044 2C 00101100 108 6C 01101100 172 AC 00101110 236 EC 11101100
045 2D 00101101 109 6D 01101101 173 AD 00101111 237 ED 11101101
046 2E 00101110 110 6E 01101110 174 AE 00110000 238 EE 11101110
047 2F 00101111 111 6F 01101111 175 AF 00110001 239 EF 11101111
048 30 00110000 112 70 01110000 176 B0 00110010 240 F0 11110000
049 31 00110001 113 71 01110001 177 B1 00110011 241 F1 11110001
050 32 00110010 114 72 01110010 178 B2 00110100 242 F2 11110010
051 33 00110011 115 73 01110011 179 B3 00110101 243 F3 11110011
052 34 00110100 116 74 01110100 180 B4 00110110 244 F4 11110100
053 35 00110101 117 75 01110101 181 B5 00110111 245 F5 11110101
054 36 00110110 118 76 01110110 182 B6 00111000 246 F6 11110110
055 37 00110111 119 77 01110111 183 B7 00111001 247 F7 11110111
056 38 00111000 120 78 01111000 184 B8 00111010 248 F8 11111000
057 39 00111001 121 79 01111001 185 B9 00111011 249 F9 11111001
058 3A 00111010 122 7A 01111010 186 BA 00111100 250 FA 11111010
059 3B 00111011 123 7B 01111011 187 BB 00111101 251 FB 11111011
060 3C 00111100 124 7C 01111100 188 BC 00111110 252 FC 11111100
061 3D 00111101 125 7D 01111101 189 BD 00111111 253 FD 11111101
062 3E 00111110 126 7E 01111110 190 BE 01000000 254 FE 11111110
063 3F 00111111 127 7F 01111111 191 BF 01000001 255 FF 11111111
------------------------------------------------------------------------------

TABELA ASCII

Mas, se dentro de um arquivo qualquer, eu tenho apenas Bytes, como é que eu vou trocar informações ? No final, tudo são números, certo ? R: Sim. Na prática sim. O que nós podemos fazer é dar significado aos números, e definir uma forma de interpretação diferente para os números. O padrão mais conhecido na informática para representação e trocas de informações baseadas em TEXTO para computadores é a famosa TABELA ASCII.

“ASCII (do inglês American Standard Code for Information Interchange; “Código Padrão Americano para o Intercâmbio de Informação“) é um código binário (cadeias de bits: 0s e 1s) que codifica um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, sinais de pontuação e sinais matemáticos) e 33 sinais de controle. […] A codificação ASCII é usada para representar textos em computadores, equipamentos de comunicação, entre outros dispositivos que trabalham com texto. Desenvolvida a partir de 1960, grande parte das codificações de caracteres modernas a herdaram como base.” ( Wikipedia, ASCII)

Não vou replicar a tabela ASCII dentro deste post, acesse o link da Wikipedia “https://pt.wikipedia.org/wiki/ASCII“. Quando abrimos um arquivo que contém apenas TEXTO (normalmente identificados pela extensão “.txt”), quando encontramos um byte com valor decimal “32”, ele significa um espaço em branco, “65” representa a letra “A” (“a” maiúscula do alfabeto), e uma sequência de bytes “13” e “10” representa uma quebra de linha.

Arquivos e Extensões

Um arquivo nada mais é do que uma sequência finita/limitada de Bytes. Qualquer programa é capaz de abrir um arquivo e ler seus bytes, mas para dar significado a esta informação, é necessário saber o que estes bytes representam. Quando o sistema de arquivos do MS-DOS foi concebido, foi definido que um “arquivo” possui um nome, que o diferencia dos demais, e uma extensão, normalmente separada do nome por um “.” ponto decimal, onde a extensão indica o tipo do conteúdo do arquivo.

Vejam abaixo algumas extensões e seus usos mais comuns, para os ambientes MS-DOS e Windows:

  • .INI Arquivo texto de configuração ou inicialização de algum aplicativo ou sistema.
  • .BAT Arquivo texto que contém uma sequencia de comandos do sistema operacional.
  • .EXE Arquivo binário que contém os códigos de um programa que pode ser executado pelo sistema operacional.
  • .JPG Arquivo de imagem no formato JPEG (Joint Photographic Experts Group).
  • .BMP Arquivo de imagem no fotmato BITMAP.
  • .PNG Arquivo de imagem no formato Portable Network Grafics.
  • .TXT Arquivo texto de uso geral.
  • .DLL Arquivo binário de link dinâmico, contém funções que podem ser carregadas e usadas por um ou mais programas.
  • .DOC Documento do MS-Word ou outro editor de textos.
  • .XLS Arquivo de Planilha Eletrônica do MS-Excel.
  • .PPT Arquivo de apresentação do MS-PowerPoint.
  • .ZIP Arquivo compactado no padrão ZIP, armazena um ou mais arquivos.
  • .RAR Arquivo compactado no padrão proprietário RAR, criado pelo russo Eugene Roshal (RAR = Roshal ARquive).
  • .XML Arquivo texto que contém dados estruturados usando XML (eXtended Markup Language).
  • .XSD Arquivo texto que contém uma regra de validação ou modelo de troca de dados em XML.
  • .DBF Arquivo de dados, normalmente nos formatos DBASE III e posteriores.
  • .CDX Arquivo de índice de dados, normalmente relacionado a dados em arquivo DBF.
  • .DTC Arquivo de dados no formato c-Tree, usados no AdvPL

Para mais extensões e seus usos mais comuns, consulte “https://pt.wikipedia.org/wiki/Extens%C3%B5es_de_ficheiros“.

Sistema de Arquivos e Diretórios (ou Pastas) no Windows

O sistema de arquivos do Windows herdou a estrutura organizacional e princípios do sistema de arquivos do MS-DOS. Cada unidade de disco instalada na máquina recebe uma letra maiúscula do alfabeto como identificador de unidade, seguido do símbolo “:” (dois pontos). As duas primeiras unidades de disco do computador, antes de existir disco rígido, eram as unidades “A” e “B”. Por isso que, até hoje, quando você abre o Prompt de Comando do sistema operacional no Windows, ou o Windows Explorer, a sua unidade de disco rígido é mostrada como “C:”, e as demais partições de disco e outras unidades (CD-ROM, Pen-Drive,etc) seguem em sequência.

A estrutura de arquivos do Windows é baseada em pastas — ou diretórios, como uma árvore. O primeiro diretório da árvore, ou “raiz”, e representado pela barra inversa “\”. A partir de qualquer diretório, você pode ter um ou mais arquivos, e um ou mais diretórios. Vamos entender que um diretório é um espaço nomeado dentro da estrutura que permite você guardar mais arquivos e outros diretórios. Dentro de qualquer pasta, você não pode ter mais de um arquivo ou pasta com o mesmo nome e extensão. Porém você pode ter arquivos com mesmo nome e extensão em pastas diferentes.

O Windows criou uma padronização, que apresentou pequenas mudanças ao longo das últimas 7 ou 8 versões, mas a base é a mesma. A partir da pasta Raiz da unidade de disco rígido (C:\) existe uma pasta chamada “Arquivos de Programas”, onde dentro dela existem pastas para as aplicações e programas instalados no equipamento, uma pasta “Usuários”, para registrar as informações de perfil e dados de aplicativos de cada usuário do equipamento, e a pasta “Windows”, que armazena um enorme grupo de outras pastas, que contém todos os programas, extensões, drivers e demais arquivos do Sistema Operacional.

Cada arquivo de cada pasta do computador pode ser endereçada ou identificada por um identificador de caminho completo (Full Path), composto pela unidade de disco, estrutura de pastas, e o nome do arquivo. Por exemplo, o arquivo nomeado “mstsc.exe” (Remote Desktop Connection Client), que fica na pasta “System32”, que fica na pasta “Windows” a partir do Drive “C:”, pode ser endereçado como “c:\Windows\System32\mstsc.exe”.

O sistema de arquivos de forma geral permite bem mais recursos e operações, e outras formas de endereçamento determinadas por cada sistema operacional. No Linux, por exemplo, o sistema de arquivos foi herdado dos sistema Unix, onde qualquer dispositivo pode ser endereçado como um arquivo. Não há “letras” de unidade de disco, existem “devices” nomeados, utilizando prefixos específicos para acessar cada tipo de dispositivo, e outros recursos como links dinâmicos para arquivos e pastas, que recentemente também foram implementados no Windows.

Dentro do arquivo

Mesmo que todos os arquivos do disco contenham “Bytes” dentro, arquivos que contenham por exemplo uma imagem ou fotografia, possuem uma regra de armazenamento e interpretação destes bytes. Por exemplo, vamos pegar um formato de imagem mais “antigo”, como o BITMAP (Ou Mapa de Bits), usado no Windows e no (extinto) OS\2.

Na Wikipedia, acesse o link “BMP file format” (https://en.wikipedia.org/wiki/BMP_file_format), veja a seção “File Structure“. Nela é descrito como é o formato de armazenamento interno de uma imagem em um arquivo BMP. O arquivo começa a ser lido do primeiro byte, e existem sequências de bytes de tamanho fixo que indicam informações de como os demais dados estão dispostos, e a partir de um determinado ponto, os blocos de bytes possuem tamanhos variáveis, de acordo com as definições anteriormente especificadas no arquivo. Um arquivo de dados em formato DBF possui uma estrutura similar, onde no início do arquivo os primeiros blocos de bytes identificam quais as informações que estão armazenadas no arquivo.

Nível de complexidade de operações com arquivo

Agora, imagine o quão complexo seria se você tivesse que saber como as informações estão dispostas dentro do arquivo para poder acessá-las? Sim, daria um valente trabalho…. cada arquivo possui uma estrutura interna, e um erro ao ler ou gravar um dado pode corromper a informação no arquivo.

Para tornar este processo mais fácil, as linguagens de programação que trabalham nativamente acesso a dados oferecem mecanismos de mais “alto nível”, onde através de funções ou classes, você aciona operações como “ler um registro”, “posicionar em um registro”, “inserir um novo registro”, “alterar os dados de um registro”. Outra abordagem muito utilizada é usar um segundo software, um SGBD (Sistema Gerenciador de Banco de Dados), usando SQL (Structured Query Language), através das quais você monta sentenças praticamente “literais” e solicita ao SGDB a operação desejada, como “SELECT * FROM SA1010 WHERE A1_ATIVO = ‘S’ ORDER BY A1_NREDUZ” (Selecione todos os registros da tabela SA1010 onde o campo (coluna) A1_ATIVO seja igual a letra ‘S’ maiúscula, com o resultado ordenado pelo campo A1_NREDUZ).

Se você precisa trabalhar com um tipo de arquivo que contém imagens, e quer aplicar na imagem um efeito, como mudança de brilho ou cor, você pode escrever uma API sua, abrir o arquivo em modo ‘binário’ (lendo diretamente seu conteúdo em bytes para a memória), entender como aquele mapa de bytes representa a imagem e suas cores, e aplicar o efeito desejado recalculando as definições de cores. Ou, você pode usar um componente pronto, uma biblioteca de funções fornecida com a linguagem ou uma biblioteca de terceiros (existem bibliotecas pagas e gratuitas, com código aberto (Open Source) e código fechado, para diversas linguagens de programação. Naturalmente, vai ser bem mais fácil e rápido usar uma biblioteca pronta. Basta você pesquisar se a escolha em foco atende todas as suas necessidades e não tem alguma restrição que inviabilize seu uso no cenário onde a mesma será aplicada.

Conclusão

A introdução está ficando “longa”, mas uma vez assimilada esta base comum de conhecimento, ela serve para tudo o que foi construído sobre ela, apenas existindo algumas características e comportamentos diferenciados para algumas plataformas ou sistemas, o resto é “farinha do mesmo saco”. Quem gosta de TI, Análise de Sistemas, Engenharia de Software, Programação e ciências correlatas, precisa ter sede e vontade de aprender, e de se manter atualizado, sempre. Mesmo após tornar-se um especialista, é preciso estar de olhos e ouvidos abertos para a evolução constante em torno da área como um todo.

Novamente, agradeço a todos pela audiência, e desejo a vocês TERABYTES de sucesso 😉

Até o próximo post, pessoal 😀

Referências

BYTE. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Byte&oldid=43771720>. Acesso em: 2 nov. 2015.

ASCII. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=ASCII&oldid=43771464>. Acesso em: 2 nov. 2015.

Extended ASCII. (2015, April 1). In Wikipedia, The Free Encyclopedia. Retrieved 03:19, November 2, 2015, from https://en.wikipedia.org/w/index.php?title=Extended_ASCII&oldid=654535698

RAR (file format). (2015, October 30). In Wikipedia, The Free Encyclopedia. Retrieved 19:19, November 14, 2015, from https://en.wikipedia.org/w/index.php?title=RAR_(file_format)&oldid=688294797

General overview of the Linux file system. In The Linux Documentation Project. Retrieved 17:27, November 14, 2015, from http://www.tldp.org/LDP/intro-linux/html/sect_03_01.html

Introdução a Informática – Parte 02

Introdução

No post anterior (Introdução a Informática – Parte 01), vimos a definição do termo “Informática”, e um resumo da evolução da aritmética e da eletrônica, desde 5000 AC até o surgimento do primeiro computador.  Hoje vamos entrar um pouco mais nos computadores de hoje, ver um pouco do que tem dentro, e o que acontece quando você liga o seu desktop ou laptop.

Por dentro do Microcomputador

Um micro-computador para uso pessoal é composto basicamente pelos seguintes componentes:

.Processador: Equipamento responsável pela execução de instruções de máquina.
.Memória RAM: Conjunto de memória que mantém bytes armazenados enquanto o computador está ligado. Ao ser desligado, as informações são perdidas (Memória Volátil, não persistente). Usada pelos programas em execução do equipamento para armazenamento temporário do próprio programa e dos dados manipulados pelo programa.
.BIOS: Consiste em um programa básico de infra-estrutura do equipamento, armazenado em uma memória diferenciada na placa principal do equipamento (ROM ou FLASH), que executa um diagnostico inicial quando o computador é ligado, e permite ajustar detalhes internos de comportamentos dos componentes instalados dentro do computador. BIOS é um acrônimo para “Basic Input Output System”, ou “sistema básico de entrada e saída.
.Disco Rígido: Unidade de disco magnético, de uso interno ou externo, usado para armazenar de forma persistente programas e dados. Não é volátil, quando desligado mantém os dados armazenados por longos períodos.
.Placa-mãe ou placa principal (ou MotherBoard): Hardware utilizado para integrar o processador à memória RAM e a todos os demais periféricos do computador, incluindo outras placas de acesso a dispositivos que podem ser acopladas nela.
.Portas de comunicação: Serial, Paralela, SATA, USB. Usadas para acoplar no computador vários periféricos, como mouse, teclado, fone de ouvido, impressoras, Disco Rígido (ou HD) externo, Scanners, etc.
.Fonte de energia: Conversor de energia alternada (110/220V) para fornecer corrente contínua estabilizada com voltagens de -5 a +12 V para os componentes, placas e periféricos do equipamento.

Ligando um computador

Assim que o computador é ligado, o primeiro programa carregado automaticamente na memória do equipamento é o BIOS. Ao ser executado, ele faz um diagnóstico nas placa principal, verificando o que está instalado no equipamento: Quantos “pentes” de memória RAM, interfaces de Entrada e Saída, placa de vídeo, rede, portas de comunicação serial, paralela, USB, SATA, etc. Normalmente é feito um teste rápido em alguns blocos dos endereços de memória RAM, para certificar-se que ela está armazenando e recuperando dados corretamente, e se os dispositivos acoplados estão em condições operacionais.

Se um computador não tivesse nada além do BIOS, uma vez ligado o equipamento precisa de um programa para que o operador possa “operar” o equipamento. O primeiro microcomputador que eu aprendi a programar era um MSX, da Gradiente. Processador Z-80, 32 KB de RAM, sem unidade de disco. Depois do BIOS ser carregado e executado com sucesso, o próximo programa carregado era um interpretador de BASIC, que já vinha gravado na memória ROM do equipamento. Este interpretador mostrava um “Prompt” na tela, onde através dele eu poderia executar comandos do BASIC, criar programas na memória e executar estes programas. Este interpretador de comandos é que tornava o meu microcomputador “operável”. Logo, você tinha que aprender quais instruções você poderia utilizar em modo interativo, como usar esse recurso, e quais instruções você tinha disponíveis na linguagem BASIC do equipamento para fazer um programa.

Para tornar um computador “operável”, de uma forma mais flexível, foram criados por várias empresas, com diversos nomes, um conjunto de programas conhecido por “Sistema Operacional”. Como o próprio nome diz, este programa torna um computador “operável”, e através dele você pode executar outros programas, gerenciar programas e arquivos de dados armazenados no equipamento, executar programas utilitários que são distribuídos com o sistema operacional para operações simples, como criação, armazenamento e impressão de arquivos de texto, imagens, áudio, vídeo, etc. Windows, Linux, Unix, são sistemas operacionais.

Carga do Sistema Operacional

Após a BIOS ser executada, ela verifica em uma lista de periféricos (Disco Rígido, CD/DVD, porta USB) se existe uma instrução de carga de programa pré-definida armazenada no primeiro segmento de dados destes dispositivos. A BIOS faz esta verificação em uma ordem pré-definida, que pode ser configurada. O primeiro dispositivo acessado que tiver uma instrução de carga de sistema operacional, a BIOS executará esta carga.

Quando instalamos um sistema operacional no equipamento (hoje a maioria já vem com um S.O. pré-instalado de fábrica no Disco Rígido), o programa de carga do sistema operacional é executado, e ele é o responsável por carregar todos os demais programas internos criados pelo fabricante do sistema operacional e “drivers” (programas de acesso a dispositivos ) fornecidos pelos fabricantes dos equipamentos e periféricos conectados de alguma forma ao computador. São módulos ou componentes do sistema operaciona, como gerenciadores de disco, memória, vídeo, áudio, comunicação, etc… Cada um destes programas está gravado no Disco Rígido (ou HD) do equipamento, dentro de uma pasta reservada para uso do Sistema Operacional. O sistema Operacional sabe onde eles estão, e sabe interpretar o que tem dentro de cada um.

Enquanto os programas estão sendo carregados, é mostrada normalmente uma imagem no monitor (ou vídeo) do computador, normalmente um logotipo do fabricante do Sistema Operacional sendo carregado. Quando esta carga é bem sucedida, logo em seguida são carregados e iniciados os programas internos, chamados de “serviços” do Sistema Operacional, e um programa dedicado a fornecer a interface “operacional” do sistema. No caso do Windows, é carregado automaticamente o processo chamado “Explorer”, responsável pelo DeskTop do equipamento, onde a partir dele podemos acessar todas as opções do sistema operacional e executar todos os demais programas instalados no equipamento.

Old School

Um dos primeiros sistemas operacionais que eu tomei contato foi o MSX-DOS (Sistema operacional de disco do MSX), carregado quando você iniciava o computador com uma unidade de disquete externa acoplada no equipamento. Sua interface era bem similar ao MS-DOS ( Microsoft Disk Operational System). Basicamente eram carregados apenas dois drivers ( IO.SYS e MSDOS.SYS ), e na sequência era carregado o interpretador de comandos do DOS ( Ainda hoje presente em praticamente todas as versões de Windows, acessado através do ícone “Prompt de Comando”.

Na primeira carga do interpretador de comandos, um arquivo com as configurações iniciais de carga do sistema operacional era processado. No arquivo CONFIG.SYS eram definidos os drivers de gerenciamento de memória, disco e demais dispositivos. Uma vez que tudo estava carregado, era executado um arquivo chamado AUTOEXEC.BAT, com uma lista de chamada adicionais de outros programas para definir configurações de ambiente e carregar outros dispositivos. Enfim, você tinha acesso ao Prompt de comandos, que mostrava normalmente a unidade de disco atual “C:\>”.

O interpretador de comandos possui um conjunto de comandos nativos, e o sistema operacional já vinha com alguns programas simples, como um editor de textos em formato TXT (EDIT), um programa interpretador para desenvolver usando a linguagem BASIC, algumas ferramentas de manutenção de disco (FORMAT/CHKDSK/SCANDISK/DEFRAG), comandos para criar estruturas de pastas nas unidades de disco para armazenamento de arquivos, comandos para realizar cópia, mover arquivos, apagar arquivos e pastas, etc. Estes comandos tinham que ser digitados no Prompt de comando, seguindo a sintaxe e parâmetros adequada para cada comando. Todos os demais programas que você quisesse instalar e executar no equipamento precisam ser compatíveis com aquela versão do sistema operacional.

E agora ?

Uma vez que o computador esteja ligado, e o sistema operacional esteja carregado, você pode abrir qualquer um dos programas instalados, instalar novos programas, enfim, você pode usar o computador. Para cada tarefa ou utilização do computador, você precisa usar um programa. Para criar um programa você usa um ou mais programas.

Editores de texto mais avançados, planilhas eletrônicas, aplicações de bancos de dados, ambientes de desenvolvimento para programação, jogos e afins, são programas ainda vendidos ou obtidos separadamente. No início da década de 90, as aplicações mais famosas para edição de textos, planilha eletrônica e banco de dados eram o WordStar, Lotus 123 e DBASE III, respectivamente. Hoje são os programas do Microsoft Office “Word”, “Excel” e “Access”. Todos estes novos programas são evoluções dos programas iniciais, com mais recursos, funcionalidades e integrações.

Se você quiser acessar a Internet, você precisa ter um programa chamado “Internet Browser”, que a partir de um endereço de um servidor (ou site), este programa é capaz de conectar no site, recuperar o arquivo que contém um script com a tela inicial do site, e “desenhar” este arquivo na sua tela, servindo de “interface” para você acessar os conteúdos e funcionalidades do site. Hoje os Browses mais famosos são o Google Chrome, o Internet Explorer, o Mozzila Firefox….

Se você quiser programar na linguagem Python, você precisa instalar o programa responsável por interpretar os scripts desta linguagem no seu computador. Hoje em dia basta ter uma conexão com a Internet, abrir o seu Internet Browser, acessar um mecanismo de pesquisa ( Google Search, Yahoo, Bing ) e procurar por “Python Download”, entrar no site “Phyton.org”, localizar a área de Download, escolher a versão da linguagem adequada ao seu sistema operacional, fazer o download, e instalar o aplicativo na sua máquina. Uma vez instalado, você deve aprender como a linguagem funciona, como você escreve um programa, e como você executa um programa.

Mas, antes de mais nada, eu recomendo que você aprenda o que é e como funciona o sistema operacional que você está utilizando. Para ser apenas um operador da máquina, e utilizar ela para fazer seus textos, documentos, ver fotos e filmes, acessar a Internet, você precisa pelo menos de uma noção de “como” e “onde” o seu sistema operacional guarda no disco os seus arquivos de dados, os seus programas instalados, as suas fotos, vídeos e afins, e como você faz para instalar, desinstalar e executar um ou mais programas.

Conclusão

Quando vemos um sistema computacional ‘por cima’, ele é relativamente simples. O que começa a dar volume da complexidade das operações é quantidade de recursos e etapas que uma instrução ‘simples’ faz por baixo do capô. Você não precisa ser mecânico para dirigir um carro, mas ter pelo menos uma noção de mecânica pode servir de orientação e explicar por quê determinados procedimentos não são boas práticas ao dirigir. O mesmo principio é totalmente válido ao operar um computador. Para programar a máquina, você precisa ter pelo menos um conhecimento superficial de mecânica, de como ela funciona. Isso vai fazer você conseguir aproveitar melhor os recursos do equipamento que você têm em mãos.

Fala-se sobre em “lógica de programação”, e sobre este tema pintam um monstro de 2 cabeças e vários tentáculos. Lembre-se, programar é como escovar os dentes, não passa de uma lista de tarefas. A “lógica” em si é a ordenação destas tarefas em uma sequência de operações e decisões que chegue ao resultado esperado. Depois de escrever um programa simples em qualquer linguagem e ver como ele funciona, você verá que o monstro não é tão feio quanto o que falam dele.

Curiosidades

Antes de aprender programação, eu literalmente “devorei” a coleção de revistas de eletrônica do meu pai. Chamava-se “Be-a-Bá da Eletrônica”, ele tinha a coleção completa da edição 1 a 32, que abordava em uma linguagem didática desde o que era um elétron e um fluxo de energia, até eletrônica digital e portas lógicas. Eu realmente fiquei fascinado ao saber o que era eletricidade e eletromagnetismo, e como vários tipos de materiais poderiam ser usados para gerar luz e dar movimento às coisas, apenas controlando o fluxo de elétrons entre as partes de um circuito elétrico. Quando eu aprendi a primeira linguagem de programação, eu imaginei usar este conhecimento para criar programas e ferramentas que me ajudassem a projetar circuitos eletrônicos. Porém, quando eu comecei a programar, e parei de tomar choque em capacitor carregado, parei de queimar a mão no ferro de solda ao tentar colocar um transístor em uma ponte de terminais, em “fritar” uma peça por que um fio estava errado… Chega de eletrônica, isso aqui é mais divertido.

Desejo novamente a todos TERABYTES de Sucesso 😀

Até o próximo post, pessoal 😉

Referências

SISTEMA OPERATIVO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Sistema_operativo&oldid=43714710>. Acesso em: 1 nov. 2015.

PREEMPTIVIDADE. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Preemptividade&oldid=43360409>. Acesso em: 1 nov. 2015.

SISTEMA DE FICHEIROS. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Sistema_de_ficheiros&oldid=43725348>. Acesso em: 1 nov. 2015.

Introdução a Informática – Parte 01

Introdução

“Informática é um termo usado para descrever o conjunto das ciências relacionadas ao armazenamento, transmissão e processamento de informações em meios digitais, estando incluídas neste grupo: a ciência da computação, a teoria da informação, o processo de cálculo, a análise numérica e os métodos teóricos da representação dos conhecimentos e da modelagem dos problemas. Mas também a informática pode ser entendida como ciência que estuda o conjunto de informações e conhecimentos por meios digitais.” (1)

Em dois artigos anteriores, eu postei algo sobre Programação e sobre Análise de Sistemas. Seguindo a mesma linha, de “desmistificar” a aparente complexidade deste universo, eu reparei que alguns conhecimentos que eu considero como “base” para o entendimento dos sistemas computacionais são pouco abordados, ou são vistos com uma superficialidade muito grande.

E boa parte do que temos hoje em tecnologia de sistemas e processamento de dados é uma evolução natural desta base. Logo, eu considero fundamental saber um pouco mais da origem das coisas, e da evolução histórica da computação no último século, para entender um pouco mais no que ela é baseada, e por quê (e como) ela evoluiu a saltos gigantescos desde então.

Um pouco de História

Fiz meu primeiro curso de programação com 13 anos de idade, e meu primeiro curso de nível profissional de informática com 15 anos, em uma escola de informática em Botucatu, fundada por um ex-técnico de Software da IBM e sua esposa. Antes de sentarmos na frente de um IBM-PC e ligá-lo pela primeira vez, tivemos uma semana de aula sobre “Introdução a Informática”, para que todos tenham uma noção de o que é um micro-computador, o que têm dentro, e pelo menos uma noção de como as partes internas funcionam.

Particularmente eu achei aquilo extremamente interessante, pois na semana seguinte, quando fomos para a frente dos computadores, mesmo sem ter visto um, nós sabíamos o que precisava ser feito para ligá-lo, e o que acontecia desde o momento que você apertou o botão “ON” até aparecer o “Prompt” de comando do sistema operacional ( na época, “A:\>” ).

Seguindo esta linha, estou dando inicio a uma série de Posts, com a TAG “Introdução a Informática”, onde eu vou tentar trazer esse conhecimento para vocês, com a maior riqueza de detalhes que a minha memória permite, estendendo esta abordagem até os micro-computadores dos dias de hoje. Recomendo essa literatura a todos que estão iniciando seus estudos em computação, e estendo o convite a todos que tenham alguma curiosidade sobre isso.

A necessidade é a mãe da invenção

A necessidade de mensurar coisas é tão antiga quanto a história da civilização. Uma vez que o homem aprendeu a cultivar a terra, por volta do período neolítico (8 mil A.C.). Este período é considerado um importante avanço social, econômico e político, onde o homem descobre que é muito mais vantajoso agir em grupo do que individualmente.

Com a subsistência mais fácil, não tendo que sair para caçar todos os dias, os neolíticos tinham mais tempo para interagir entre si, então desenvolveram as primeiras atividades de lazer, descobrindo a arte da cerâmica e depois como comercializá-la. O surgimento da escrita e a criação do Estado pelas primeiras da Antiguidade marcou o final da era neolítica.

Desde então, sempre existiu a necessidade de mensurar coisas. Quantidade de sementes, frutos produzidos, criação de unidades monetárias (dinheiro) para facilitar relações comerciais e afins. Embora a matemática conhecida hoje — usando algarismos indo-arábicos (1234567890), com ponto decimal e frações date de 1000 D.C., a utilização dessa representação em algarismos decimais é datada de 2 A.C.

O Ábaco, um instrumento de cálculo que data de 5500 A.C., ele é considerado como uma extensão do ato natural de contagem com os dedos. E também usa o sistema decimal (onde usamos 10 algarismos para representar um número). O Ábaco ainda é usado hoje para ensinar a crianças somar e subtrair.

Invenções mecânicas

Buscando dar mais precisão, segurança e velocidade aos processos de operações numéricas, várias invenções mecânicas foram surgindo ao longo do tempo, como a máquina de operações de Pascal (Século XVII), o Tear de cartões perfurados de Jacquard (Século XVIII), o projeto da máquina analítica de Babbage, até a máquina eletromecânica de Herman Hollerith, um equipamento que usava cartões perfurados usado para calcular o censo populacional dos EUA de 1890 em APENAS um ano — o censo da década anterior demorou 7 anos … Através de um painel de fios em seu tabulador 1906 Type I, foi possível executar diferentes trabalhos sem a necessidade de ser reconstruído. Estes foram considerados os primeiros passos em direção à programação. Em 1911, quatro corporações, incluindo a firma de Hollerith, se fundiram para formar a Computing Tabulating Recording Corporation. Sob a presidência de Thomas J. Watson, ela foi renomeada para IBM (“International Business Machines”).

O papel da eletricidade

Mesmo sendo conhecidos desde a Grécia antiga, os fenômenos magnéticos e os fenômenos elétricos somente começaram a ser estudados e explicados cientificamente a partir do século XVII. No início do século XIX, Hans Christian Ørsted obteve evidência empírica da relação entre os fenômenos magnéticos e elétricos. A partir daí, os trabalhos de físicos como André-Marie Ampère, William Sturgeon, Joseph Henry, Georg Simon Ohm, Michael Faraday foram unificados por James Clerk Maxwell em 1861 por meio de equações que descreviam ambos os fenômenos como um só: o fenômeno eletromagnético. Esta unificação foi uma das grandes descobertas da física no século XIX. Com uma teoria única e consistente, que descrevia os dois fenômenos anteriormente julgados distintos, os físicos puderam realizar vários experimentos prodigiosos e inventos úteis, como a lâmpada elétrica (Thomas Alva Edison) ou o gerador de corrente alternada (Nikola Tesla)

Entre 1930 e 1940, George Stibitz, um pesquisador da Bell Labs percebeu que os relés eletromecânicos usados em centrais telefônicas poderiam ser usados para realizar operações sequenciais, e desenvolveu os primeiros circuitos de lógica digital usando relés. Os projetos de computadores usando relês da Bell foram usados pelos EUA para fins militares, usando 1400 relês e com memória de 10 números, eles eram usados para processamento de cálculos de direcionamento de artilharia anti-aérea. Os trabalhos de George Stibitz foram baseados nos princípios de álgebra booleana, concebidos por George Boole quase um século antes, mas que até o momento não tinham aplicação prática.

Com o surgimento da válvula termo-iônica, como uma forma de modulação direta de energia, bem mais rápida que um relê, todo o conhecimento adquirido até então foi aproveitado para a evolução desta tecnologia. Porém, as válvulas queimavam com muita facilidade, e consumiam muita energia para funcionar. Mas a velocidade de chaveamento de energia era tão mais rápida que um relê, que logo surgiram os primeiros computadores usando esta tecnologia. A universidade de Iowa em 1942 montou um dos primeiros computadores valvulados, não programável, mas funcional para resolver equações de primeiro grau.

O primeiro computador totalmente eletrônico e programável foi o ENIAC (Electronic Numerical Integrator And Computer). Construído durante a segunda guerra mundial na universidade da Pensilvânia, ficou pronto em 1946. Usava mais de 17 mil válvulas, consumia 150 kW, e pesava 27 toneladas …. mas era milhares de vezes mais rápido do que qualquer computador a relê. Por exemplo, o computador Harward Mark II (1947), que usava relês de alta velocidade, operava a uma frequência de 8 Hz (ciclos por segundo). O ENIAC operava a uma frequência vertiginosa de 5 mil Hz (5 KHz), o que permitia ele calcular aproximadamente 357 multiplicações de números de 10 dígitos por segundo. Hoje, um processador de um SmartPhone ultrapassa facilmente 1 GHZ ( Um BILHÃO de ciclos por segundo).

Onde estão os “zeros” e “uns” ?

O sistema de numeração binário (base 2), usa apenas dois algarismos para representar um valor: ‘0’ ou ‘1’. Em informática, a menor unidade de armazenamento de um dado é o “bit”, que coincidentemente também armazena os valores ‘0’ ou ‘1’. Quando agrupamos 8 bits, temos um Byte ( também chamado de “octeto” de bits). Utilizando um BIT, armazenamos 2 valores diferentes (0 ou 1). Usando 2 bits, armazenamos quatro sequências de bits diferentes ( 00, 01, 10 e 11). Usando 8 Bits (um Byte) podemos armazenar 2 ^ 8 sequencias diferentes, ou seja, 256 combinações diferentes de 0 e 1 (de 00000000 a 11111111). Convertendo isso para numeração decimal (ou base 10), temos 256 valores diferentes (entre 0 e 255).

E por que eu preciso saber disso ?

Bem, meu chapa … toda a base de programação e processamento de dados são sequencias de zeros e uns. Isto somente vai ser quebrado com a computação quântica, que surgiu como teoria a alguns anos, e atualmente os estudos na área estão tornando possível a criação do Hardware para permitir este tipo de processamento. A computação quântica deve quebrar paradigmas em campos de aplicação onde as máquinas tradicionais (utilizando lógica booleana) chegaram em um limite tecnológico “físico” de desempenho. A menor unidade de informação em um computador é um Byte, que nada mais é do que um agrupamento de 8 bits. Logo, todo o armazenamento de dados e fluxo de informações entre os componentes de um computador e seus componentes auxiliares (ou periféricos) serão sequências ou blocos de zeros e uns 😉

E onde entra a tal da “programação” ?

Programar significa fornecer uma lista de instruções para realizar uma determinada tarefa. Quando você compra um produto desmontado, que vêm com um manual de instruções de montagem, ele descreve em linguagem natural a lista de passos para você montar o produto. Isto pode ser considerado um programa, que ao ser executado na ordem certa e com os materiais corretos, resulta no produto montado.

Um programa de computador é exatamente isso. Qualquer programa de computador é composto de uma sequência de instruções e dados, regidos por uma gramática e um conjunto de operações especificas, cujo objetivo final é enviar ao processador do equipamento uma sequência de códigos binários que representem a sequência de processamento a ser executada. Nesta sequência de instruções podemos interagir com os periféricos do equipamento, como a interface de vídeo, o teclado, uma impressora, uma unidade de armazenamento de dados, etc.

Conclusão

Este tópico é só para “abrir o apetite”. No próximo vamos dar uma boa olhada no que tem dentro de um computador, o que é um “Sistema Operacional”, por quê precisamos de um, e depois o que acontece quando a gente liga um equipamento.

Desejo a todos uma boa leitura, e TERABYTES de sucesso 😀

Até o próximo post, pessoal 😉

Referências

INFORMÁTICA. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Inform%C3%A1tica&oldid=43615873>. Acesso em: 12 out. 2015.

ÁBACO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=%C3%81baco&oldid=43500340>. Acesso em: 12 out. 2015.

ALGARISMOS INDO-ARÁBICOS. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Algarismos_indo-ar%C3%A1bicos&oldid=43058223>. Acesso em: 12 out. 2015.

ELETROMAGNETISMO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Eletromagnetismo&oldid=43478266>. Acesso em: 12 out. 2015.

HERMAN HOLLERITH. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Herman_Hollerith&oldid=42754476>. Acesso em: 12 out. 2015.

George Stibitz. (2015, August 15). In Wikipedia, The Free Encyclopedia. Retrieved 07:19, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=George_Stibitz&oldid=676218293

Harvard Mark II. (2014, September 19). In Wikipedia, The Free Encyclopedia. Retrieved 07:37, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=Harvard_Mark_II&oldid=626186726

ENIAC. (2015, October 12). In Wikipedia, The Free Encyclopedia. Retrieved 07:44, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=ENIAC&oldid=685327153

SISTEMA DE NUMERAÇÃO BINÁRIO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Sistema_de_numera%C3%A7%C3%A3o_bin%C3%A1rio&oldid=43459004>. Acesso em: 12 out. 2015.

Outras referências

http://www.infoescola.com/pre-historia/periodo-neolitico/

http://www.newtoncbraga.com.br/index.php/curiosidades/4856-cur008

http://www.techtudo.com.br/artigos/noticia/2012/09/computadores-a-valvulas.html

Entrando na área de TI

Introdução

Depois da entrevista feita no departamento de Tecnologia da TOTVS na semana passada, referente a matéria sobre as oportunidades na área de TI (http://g1.globo.com/bom-dia-brasil/noticia/2015/08/area-de-tecnologia-abre-quase-41-mil-vagas-no-primeiro-semestre-de-2015.html), recebi muitas mensagens de pessoas interessadas em começar a carreira nesta área.

Tendo em vista que este é um tema de interesse geral, tanto para quem que iniciar nesta área, como para quem quer mudar de área e vir para a TI, respondi a todos que publicaria um (ou mais) post(s) no Blog, para dar uma “luz” sobre este assunto, e contar um pouco de como eu comecei a programar computadores.

TI é muito amplo

TI, ou Tecnologia da Informação, é uma terminologia muito genérica, e amplamente abrangente. Ela envolve a aplicação de computadores e soluções informatizadas como meios para atingir um objetivo, normalmente ligado a resolução de um problema ou necessidade, ou tornar mais eficaz um processo qualquer.

Analisando apenas os componentes básicos de qualquer sistema informatizado (Computador, Celular, Tablet), temos basicamente dois tipo de componentes: Hardware (a parte física do equipamento), como o processador, placas, periféricos (acessórios), expansão de memória, armazenamento interno e externo, dispositivos de entrada e saída (teclado,vídeo,touchscreen), dispositivos de comunicação (placas de Wi-fi, Bluetooth), enfim, qualquer parte do equipamento que seja palpável entram no Grupo de “Hardware” — dá pra se ter uma idéia de quão grande é esse grupo imaginando tudo o que eu mencionei e o que eu não mencionei neste exemplo.

Tão ou mais amplo do que o Hardware, temos o grupo de elementos necessários para o funcionamento dos dispositivos de Hardware: O SOFTWARE. Reduzindo drasticamente a definição, o Software é o “programa” que realiza as operações com grupos de elementos de Hardware em um sistema computacional, responsável por realizar um processamento ( ou transformação ) de informações.

Tão amplos quanto estes dois grupos de elementos de um sistema computacional, são as aplicações práticas de todas as demais áreas de conhecimento que podem tirar proveito deste universo. Por ser um mundo de intermináveis terminologias, definições, paradigmas, e um extenso vocabulário que está em constante mutação, existem cursos e graduações de diversas áreas que já englobam na grade curricular matérias adicionais para explicar como e através de que a tecnologia da informação pode ser usada como um diferencial competitivo para tais atividades, como “Administração com ênfase em Tecnologia da Informação”, “Gerenciamento de Projetos com ênfase em Tecnologia da Informação”, e por aí vai.

Conhecimentos Gerais

Na minha opinião, deveria entrar definitivamente na grade curricular do ensino fundamental algumas matérias como “Introdução a Informática”, para explicar um pouco desse mundo, sobre o que é um computador (sem entrar muito fundo nos circuitos, mas sim nas definições), para que um computador pode ser utilizado, como utilizar para o seu dia-a-dia, o que é a Internet, o que são redes de computadores, como o computador pode tornar a vida das pessoas e das empresas mais fácil. Só este parágrafo já daria uma boa quantidade de matéria.

Conforme você entende o que é e como funciona superficialmente um computador, naturalmente a curiosidade de cada um vai despertar questões sobre “como funciona” por dentro, como eu faço para usar um determinado programa, como eu faço para CRIAR um programa, e por aí vai. Um sistema informatizado é composto por várias camadas, cada uma delas tem as suas características e particularidades, podem ser usadas uma ou mais linguagens de programação para criar aplicações, podem ser necessários mais dispositivos ou periféricos para uma determinada necessidade, o leque de opções tende ao infinito.

É importante você tomar contato com este universo, e então dar uma mergulhada naquelas partes que você se interessou. As vezes um determinado assunto pode parecer muito interessante, mas quando você entra dentro dele, ele é mais simples ou mais complexo do que você imaginava, e quando você mergulha em outro assunto, você pode achar ele mais ou menos interessante do que outro assunto que você tenha visto.

O ponto onde ocorre um “click” na sua cabeça, e você conclui algo como “putz, gostei muito disso aqui”, depois de ter visto com mais profundidade uma determinada área, normalmente é neste assunto que você vai mergulhar, e só vai sossegar quando você pegar aquilo com as próprias mãos e dominar este assunto.

Conhecimentos específicos

Dentro de cada sub-área da TI, existem conhecimentos básicos, intermediários, avançados e especialistas. Normalmente cada nível deste conhecimento pode ser necessário quando você precisa lidar com problemas ou soluções maiores. Normalmente uma solução integrada envolve tantos conhecimentos específicos, que é necessário um profissional de cada área envolvida para trabalharem juntos em um problema.

No desenvolvimento de uma aplicação para controlar e monitorar uma estufa para um determinado tipo de planta ou alimento, você vai precisar de um especialista na produção deste alimento, que conhece as etapas do cultivo, as condições climáticas ideais e todo o conhecimento específico daquela planta, esse cara é o “especialista de regra de negócio”, ele sabe como tem que ser para dar certo. Você também pode precisar de outros especialistas, para as partes elétricas e hidráulicas necessárias, bem como os dispositivos de monitoramento (termômetro, medidor de umidade), e para criar o programa de computador para controlar e monitorar a estufa, você precisa conhecer uma linguagem de programação onde você possa endereçar os dispositivos conectados no computador, para medir as condições do ambiente, e disparar ações como ligar ou desligar um bloco de iluminação, ou alterar a quantidade de água liberada para irrigação ,etc…

Para desenvolver um sistema de controle financeiro, falando de algo mais “avançado”, você vai precisar de um profissional que conheça profundamente sobre o assunto em questão e as operações que podem ser realizadas neste contexto, bem como quais são os resultados relevantes e controles que você precisa implementar na aplicação para ela apresentar os resultados esperados de forma que estes resultados sejam úteis para o controle financeiro e confiáveis para a tomada de decisões.

Se você se interessa por desenvolver drivers de dispositivos ou integrações com dispositivos, você precisa conhecer as especificações e padrões de comunicação do computador com estes dispositivos, para saber escolher qual delas atende melhor a sua necessidade. Normalmente este grau de aprofundamento surge quando você participa de um novo projeto, e é necessário ter este conhecimento para participar dele.

A necessidade é a mãe da invenção

Isto se aplica a muita coisa … um conhecimento qualquer, se não for utilizado, se perde. É como aprender um novo idioma, e não conversar com outras pessoas periodicamente com o idioma que você aprendeu. Quanto mais tempo você não usa este conhecimento, ele vai se perdendo naturalmente … Ainda mais quando você faz um curso daqueles “intensivos”, onde você precisa assimilar uma grande quantidade de informações em um curto espaço de tempo. Daqui a alguns anos, você não pode mais dizer que “sabe” falar Inglês, mas apenas mencionar que “você fez um curso a alguns anos, ainda lembra de alguma coisa, mas está enferrujado”….

Aplicando isso diretamente na informática, é sempre bom você estar atrás de novos conhecimentos, mas o investimento neles somente trará resultados e você somente vai tirar proveito dele se você aplicá-lo na sua atividade. Pra quem é autodidata, e tem facilidade em entender como as coisas funcionam apenas lendo uma documentação ou pesquisando, a Internet é um prato cheio. Existem vários cursos de curta duração, oferecidos gratuitamente por instituições de ensino, inclusive com prova e diploma de conclusão. Você pode fazer um curso desses por curiosidade ou necessidade, basta usar o conhecimento adquirido que ele não se perde.

Entrando no mercado

Existem várias portas de entrada no mercado para diversas áreas, depende muito do conhecimento que você adquiriu nos seus estudos ou cursos. Você não vai encontrar logo de cada a vaga dos seus sonhos. Mesmo tendo acabado de terminar uma faculdade, você aprendeu como as coisas deveriam funcionar, as metodologias mais utilizadas, como tirar proveito delas e os parâmetros de base para escolher entre uma e outra. O aprendizado nesta área é só o começo… Depois dele, vem a vivência da aplicação prática deste conhecimento, e isso sim faz você se tornar um diferencial.

Muitas pessoas que entraram em áreas como programação e desenvolvimento de sistemas, não necessariamente planejaram isso, tomaram contato com a informática de uma forma casual, quando compraram um computador para colocar na empresa, ou quando ganhou um computador dos pais e precisava aprender a usá-lo, e tomaram gosto por isso.

Antes de eu me tornar desenvolvedor de software, eu fui estagiário na escola de informática onde eu fiz o curso de Introdução a Informática e ao IBM-PC. Embora eu já tivesse conhecimento de programação em duas linguagens (Basic e DBase III), não havia nenhuma atividade como estagiário onde eu pudesse aplicar este conhecimento. Porém, como estagiário, eu aprendi outras coisas, como atender bem um cliente, o que é e como funciona um ambiente de trabalho, como eu deveria encarar atribuições de novas responsabilidades. Em um período de intervalo entre os cursos, o material didático era impresso na própria escola, as apostilas foram feitas usando o editor de textos ChiWriter, e eram impressas uma a uma em uma impressora Rima XT-600, com qualidade gráfica. A impressão era lenta, o cabeçote de impressão funcionava com o impacto das agulhas de impressão em uma fita (parecida com a usada nas máquinas de escrever) contra o papel, puxado por um cilindro.

Ficar de “estátua” olhando as apostilas serem impressas não estava nos meus planos … não me parecia uma atividade nada agradável. Então, comentei com meu chefe se não tinha nada mais “desafiador” para fazer. Ele pensou por alguns instantes, e perguntou se eu conseguia ler o material enquanto ele estava sendo impresso. Eu disse “— claro, tranquilo”. Logo, ao invés de monitorar a impressão pra ver se o processo de puxar o papel e dobrar corretamente a impressão em andamento, eu passei também a revisar o material didático durante a impressão.

Por uma semana, durante a impressão do material, eu li todas as apostilas dos cursos em andamento, e de cursos que eu já havia feito, e apontei os pontos do material que precisavam de correção ou que poderiam ser melhorados. Não escrevi uma linha de nenhum programa, mas aprendi um pouco de todos os outros cursos dados pela escola, que continham informações bem interessantes.

Mais tarde, depois de algumas reviravoltas do governo Brasileiro, como alterações na moeda, confisco da poupança e outras medidas, a escola acabou fechando, e eu procurei uma opção para me tornar desenvolvedor de software… mas não encontrei. Então, comecei a desenvolver por conta. A linguagem da época era o Clipper 5.x, recém lançado, que extendia (e muito) os recursos que eu já havia aprendido com o DBase III. Comecei desenvolvendo uma biblioteca de funções de interface, e peguei um projeto de software para um Disk Pizza novo no bairro … Depois de alguns anos, eu já tinha desenvolvido sistemas de estoque, vendas, varejo, clientes, contas a receber e pagar, locação de imóveis, controle de hotel, analise combinatória de loterias, planejamento e corte de barras de alumínio, imobiliária, consórcio de antenas parabólicas, faturamento e estoque de material de construção, agenda, controle de processos para advocacia, sistema de estoque e faturamento de lojas de roupas infantis, trabalhei com o ERP da NorthSoft (New Age e Visual Prodigy), fiz implantação, treinamento, suporte, manutenção e customizações, e mantive aberto por dois anos um escritório usando uma sala de uma imobiliária, com quem fiz uma permuta do contrato de manutenção de um sistema de controle de locação e venda de imóveis. Mas meu sonho ainda era trabalhar com tecnologia, em uma empresa maior.

Cavando a oportunidade

Nenhuma oportunidade caiu do céu, eu sempre estava em contato com os comerciantes da cidade, e corri atrás das oportunidades, e elas foram aparecendo. Construir uma carreira em TI não foi um desafio muito gratificante, mas conquistado com esforço e mérito. Eu não entrei na Microsiga em 1999 como especialista, entrei para o departamento de programação e manutenção do ERP, na equipe do Financeiro e Contábil. Por ter experiências anteriores, não foi difícil assimilar o modelo de funcionamento do ERP, e já fui contratado como programador Pleno. Não demorou muito para eu ser percebido pela minha chefe e pelo gerente de desenvolvimento, que eu tinha um perfil de tecnologia.

Recebi novos desafios de sistemas internos da empresa, que aceitei com o maior prazer, e dei conta do recado. Dentro da empresa as oportunidades foram aparecendo, e pouco mais de um ano depois eu estava na tecnologia WEB do Makira, que deixou de ser um departamento WEB da Microsiga e passou a ser uma empresa do grupo. Alguns anos depois, com a fundação da TOTVS, a Makira deixou de ser uma empresa so grupo, e passou a ser uma marca de uma linha de produtos para integração Web, e eu entrei para o departamento de Tecnologia da TOTVS, como Engenheiro de Software.

Para não fugir muito do objetivo desse post, a moral da história é a seguinte: Nem sempre você vai entrar no emprego dos seus sonhos, nem com o salário dos seus sonhos após adquirir algum conhecimento e experiência, você vai ter que mostrar, com sua atitude, que você é capaz de absorver novos conhecimentos e vencer desafios, e então buscar reconhecimento pelos desafios vencidos, para então procurar mais desafios.

O que têm pra hoje

A demanda de profissionais é alta, mas exige a capacitação. Não apenas ter o conhecimento, mas saber aplicá-lo. E esta formação não é tão rápida, não se constrói da noite para o dia. Por isso muitas empresas optam por fazer planos de treinamento internos e transferir este conhecimento através de planos de estágio e cursos oferecidos sem custo ou com subsídio para os funcionários e colaboradores que já estão na empresa. Elas oferecem isso para você se tornar um colaborador que vai contribuir com o crescimento da empresa, pois com isso você cresce junto da empresa.

Na reportagem publicada na segunda-feira no Bom dia Brasil, da rede Globo, que eu tive a honra de ser convidado, foi dada ênfase a falta de profissionais qualificados, a iniciativa da Totvs em fazer uma parceria com o Senai e dar cursos de formação em TI para os alunos selecionados entrarem na área e crescerem junto da empresa, e mencionaram um salário (máximo) de 20 mil reais.

Meu chapa, nem eu cheguei lá ainda … eu nunca vi uma vaga de TI (exceto de Diretor para cima) com este salário. Você deve conquistar várias promoções e mostrar para a empresa que você trabalha, que o seu trabalho e a sua conduta profissional agregam valores diretos e indiretos aos produtos confeccionados, aos clientes e projetos atendidos, e agrega conhecimento e bom exemplo para os demais participantes e colaboradores da Empresa, e isto requer tanto conhecimento quanto atitude.

E isso também depende de fatores de mercado e fatores organizacionais da empresa. Muitas vezes as empresas estipulam uma meta de crescimento agressiva, e ajustes de orçamento para todos os departamentos podem ser fatores limitantes para uma promoção. Neste caso, você pode optar por comprar a briga junto da empresa (vestir a camisa), e passar dois ou três anos sem uma promoção, mesmo sabendo que o reconhecimento financeiro pelo seu potencial e desempenho não acompanharam os seus méritos, porém uma vez sendo atingidos os objetivos, cabe a empresa valorizar os profissionais e colaboradores que fizeram a diferença e entraram nessa batalha com a empresa. Se isso não acontece, quem mais perde é a própria empresa, que precisa encontrar no mercado profissionais tão qualificados quando os que estavam com ela, pois estes procuraram e encontraram novas oportunidades de mercado por não serem reconhecidos.

Resumo da ópera

Não se intimide diante de desafios, estes devem ser vistos como oportunidades de crescimento. Não tenha preguiça em aprender, isso será uma constante nesta área. Não tenha medo de errar, isso pode acontecer, mas procure aprender com os seus erros e com os erros dos outros, procure se preparar da melhor fora possível para qualquer etapa do seu trabalho, pois o seu sucesso e reconhecimento dependem disso. Entenda quais são as suas responsabilidades no seu trabalho, e foque nelas. Não tenha medo de dividir conhecimento, afinal você só consegue subir uma posição na sua carreira, se houver alguém preparado e capaz de assumir o espaço que você vai deixar ao subir de cargo ou assumir novas responsabilidades. Lembre-se que em qualquer trabalho, existem atividades gostosas e atividades chatas, e que de vez em quando você vai ter que fazer algumas chatas antes de pegar as boas, e ambas fazem parte do seu trabalho. Faça ambas com a mesma dedicação e entusiasmo, e você vai ver que quando qualquer uma das tarefas é bem feita, ela gera bons resultados, seja uma tarefa chata ou seja uma tarefa legal. E, por último, mas uma das coisas que eu acredito ser mais importantes: Procure se colocar no lugar do seu cliente, e avalie o resultado do seu trabalho como se você fosse o cliente que vai usar o que você desenvolveu, ou documentou, ou participou. Entenda o que o seu cliente quer, e onde ele quer chegar com o resultado do seu trabalho, pois quanto mais próximo o seu trabalho chegar no resultado esperado pelo cliente, maior será a visibilidade do seu trabalho, em com ela o reconhecimento pelo seu mérito.

Espero que estes parágrafos sejam de alguma forma úteis para todos vocês 😀

Até o próximo post, pessoal 😉 Desejo a todos TERABYTES de sucesso !!!

O profissional de TI

Introdução

Este post é dedicado a todos os profissionais da área de Tecnologia da Informação, inclusive aos futuros candidatos e interessados em ingressar neste mundo. Espero que estes poucos parágrafos sirvam de inspiração para todos que com ele tomarem contato.

Definição da Tecnologia da Informação

A Tecnologia da Informação (TI) pode ser definida como o conjunto de todas as atividades e soluções providas por recursos de computação que visam permitir a produção, armazenamento, transmissão, acesso, segurança e o uso das informações. (*Wikipedia). Por tão ampla definição, um profissional da área precisa ter uma boa base de conhecimentos gerais sobre a aplicação da tecnologia, e optar por especializar-se em uma ou mais áreas relacionadas ao uso da tecnologia.

Competências

O sucesso na carreira é determinado pelas competências e “conjuntos de habilidades”, ou seja, toda a gama de ativos intelectuais e comportamentais, particularmente aqueles que permitem os relacionamentos dentro da organização e são canalizados para os clientes. (*Engineer Top Management)

Traduzindo pro bom português: Amigo, tudo o que você sabe e é capaz de fazer têm peso. Não apenas o que você sabe em Hardware ou Software, conhecimento acadêmico ou prático, mas também todas as demais habilidades. Relacionamento, apresentação pessoal, gerenciamento de conflitos e expectativas, resolução de problemas, boa oratória, correta aplicação do idioma (falado e escrito), etc…

Cultivando suas competências

Muitas pessoas têm um talento “nato” para alguma coisa. E normalmente pessoas de sucesso usam deste talento para conquistar seu lugar ao sol. O que nem todos se dão conta, é que não basta ser extremamente bom em uma coisa. Você também pode desenvolver outras capacidades, além daquelas que você têm mais facilidade ou predisposição em aprender. Basta você se interessar por isso, e dedicar-se.

Ninguém nasceu sabendo falar, amarrar os sapatos, escovar os dentes, fazer operações matemáticas, dirigir um automóvel, entre muitas outras coisas. Aquilo que não se sabe, se aprende. Pode levar mais ou menos tempo, pode ser mais fácil para uns e mais difícil para outros. Tem medo de falar em público ? Existe curso de oratória. Têm dificuldade em se organizar, têm curso pra isso também. Para quem têm facilidade em ser auto-didata, a Internet é um prato cheio de recursos e fontes de pesquisa, livros, manuais e cursos inteiros gratuitos. Basta priorizar seu tempo para fazer os cursos do seu interesse ou necessidade. Caso você não seja tão autodidata assim, existem cursos presenciais ou mesmo instrutores particulares. E, mesmo sendo um pouco mais difícil fazer um curso a distância, a capacidade de mídia na Internet permite cursos tão interativos, com tutores com atendimento via chat e vídeo, a sala de aula é virtual, mas com tanta interação que parece uma sala real.

O esforço e seu mérito

Ao cursar os últimos anos do ensino médio, uma colega de sala destacava-se por suas notas altas em todas as matérias e atividades, uma jovem muito inteligente. Uma aula da grade de ensino, Desenho Geométrico e Trigonometria, era ministrada por uma freira, que apesar de ter docência nesta matéria, não se preocupava em explicar alguns fundamentos dos assuntos abordados, deixando muitas dúvidas e lacunas entre uma aula e outra.

Como eu tinha muita facilidade em absorver o conhecimento da matéria, e conseguia entender com relativa facilidade o material didático, após o resultado da primeira prova do bimestre, alguns amigos da minha sala me perguntaram se eu não poderia explicar a matéria novamente e tirar essas dúvidas. Eu pedi autorização à diretora para usar a sala de aula no primeiro horário da tarde uma vez por semana, inicialmente para 3 ou 4 colegas.

Na terceira ou quarta semana, dos 40 alunos da sala, mais de 30 estavam vindo às aulas de reforço. Para meu espanto, a aluna mais inteligente da sala estava presente. Eu não entendi … por que a aluna mais inteligente da sala precisa de aula de reforço? Após a aula, eu fui conversar com ela, e lhe perguntei exatamente isso. O que ela me respondeu eu nunca mais esqueci:

“— Eu não sou a aluna mais inteligente da sala. Eu sou esforçada. Mesmo assistindo a todas as aulas na primeira carteira, e prestando atenção na matéria, boa parte do que foi explicado eu não entendo logo de primeira. Todos os dias eu chego em casa, e preciso pegar os livros, e ler tudo de novo. As vezes eu preciso ler duas ou três vezes, fazer e refazer os exercícios, e mesmo assim na próxima aula eu vou na mesa do professor tirar uma dúvida ou pedir uma explicação mais detalhada sobre alguns pontos que eu não entendi da matéria. Todos me consideram inteligente por que eu tiro boas notas nas provas, mas para conseguir isso, eu preciso dedicar várias horas do dia para estudar e rever as matérias. Se eu fosse mesmo tão inteligente, eu não precisaria fazer todo esse esforço pra entender as coisas. O que faz a diferença, é que eu sei das minhas limitações, mas tenho vontade de aprender. Então eu me dedico, o quanto for necessário, para aprender e entender o que está sendo ensinado.” ( Rebeca de Campos Leite )

Aprendendo a aprender

A cada dia novos conhecimentos são gerados, e outros são reciclados, em qualquer área de atuação. Acredito que a área de TI seja uma das mais voláteis e em constante mutação, então elas exigem que o profissional da área esteja sempre tomando conhecimento e contato com as novas tecnologias e abordagens para as soluções existentes e em desenvolvimento para lidar com os problemas contemporâneos e constantes necessidades que se apresentam a cada novo instante. É importante gostar de estudar e aprender a absorver novos conhecimentos, valendo-se da experiência adquirida com os conhecimentos já adquiridos.

Não se prenda a uma tecnologia ou a um conceito. Não existe uma solução mágica universal que sirva para todos os casos, normalmente quebramos um problema muito grande em problemas menores, e várias alternativas podem ser apresentadas para cada um. Todas trazem implicitamente um custo/benefício, e têm seus prós e contras. Entender isso e saber escolher é um diferencial muito importante, e isto se aplica não somente a um sistema informatizado, mas também se aplica a decisões de natureza pessoal.

Conclusão

Não basta saber e aprender, é preciso utilizar e entender a melhor forma de utilizar seu conhecimento e sua capacidade, bem como manter-se atualizado, e expandir suas capacitações. Se você realmente quer avançar na sua vida pessoal e profissional, estes são os melhores conselhos que eu posso te dar 😉

Até a próxima, pessoal 😀

Referências

TECNOLOGIA DA INFORMAÇÃO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Tecnologia_da_informa%C3%A7%C3%A3o&oldid=42589522> Acesso em: 24 jun. 2015.

Dicionário – Enginheer Top Management. Artigo sobre Capacidade Intelectual. Disponível em <http://www.eigenheer.com.br/candidatos/dic2.html> Acesso em: 24 jun. 2015.

Desmistificando a análise de sistemas

Prefácio

Nada como uma linda manhã de Domingo para estar inspirado e escrever um novo artigo. O título foi a ultima coisa a ser definida. Terminado mais um ano, em 04/01/2015 completei mais um aniversário na Totvs, são 16 anos completos, com muitos desafios, sempre vistos como oportunidade de crescimento, e muitas realizações, cada uma com um sabor especial. Agora estou curtindo alguns dias de férias, recarregando as baterias para entrar no 17o ano, com mais desafios, aprendizados e compartilhamento de experiências, buscando novas realizações.

Hoje o post não têm códigos de máquina, nenhum programa. Em um post anterior, “Desmistificando a programação”, eu tentei em algumas palavras mostrar que programar um computador é mais simples do que parece a primeira vista. O post de hoje complementa o artigo inicial, e estende a sua abrangência até a análise de sistemas. Novamente, afirmo que isto não é um bicho de 7 cabeças 🙂

Introdução

No último século, nunca houve tanta evolução em comparação com qualquer outro período da história da humanidade. Não me refiro apenas a informática, computação ou tecnologia da informação, mas em todas as áreas. A conquista do espaço, os avanços da medicina, o estudo do genoma humano, erradicação de algumas doenças, globalização, a revolução industrial, muita coisa para colocar em apenas um parágrafo.

O uso da eletricidade e as pesquisas realizadas para descobrir mais formas de utilizá-la levaram a um avanço desproporcional da tecnologia da informação e a outras ferramentas e recursos utilizados em todas as áreas. Pra ser um pouco mais específico, após a descoberta de materiais semicondutores, capazes de modular corrente elétrica em baixa voltagem e com tamanho cada vez mais reduzido, foram criados os mais diversos tipos de equipamentos. E estes evoluiram assustadoramente nos ultimos 50 anos.

Computadores

Um computador que ocupava um andar de um prédio, foi reduzido até ficar do tamanho de um fogão doméstico, e foi crucial para completar com sucesso a primeira missão tripulada para o espaço, que conseguiu sair da órbita da Terra, chegar até a lua, descer no asteroide, voltar novamente ao espaço e retornar em segurança de volta à Terra. Outro dia assisti a um documentário da History Channel que abordou os detalhes dessa proeza, inclusive entrevistou algumas pessoas ainda vivas atualmente, que participaram direta ou indiretamente neste projeto.

Cada equipe envolvida tinha desafios inéditos e realmente difíceis para fazer o projeto dar certo. Desafios de concepção, testes, validações e integrações, um universo de possibilidades a ser avaliado, muitas das soluções encontradas tiveram que ser re-feitas várias vezes, até que fosse encontrada uma alternativa funcional, e torná-la viável. Mas todas elas tinham um ponto em comum: Foi estabelecido um alvo, uma meta a ser realizada. E, a partir dela, quais as etapas necessárias para que esta meta fosse atingida. Primeiro definimos o que queremos como resultado, para então trabalhar em como fazer este resultado ser atingido.

Cozinhar arroz

E esta linha de raciocínio aplica-se praticamente a toda e qualquer realização, para qualquer objetivo. Partindo de um exemplo simples, vamos determinar um objetivo: Eu quero arroz no almoço de hoje. Detalhando um pouco mais o objetivo, deve ser arroz branco comum, não parbolilizado ou integral, apenas arroz tipo 1, e é para o almoço de hoje, e necessariamente eu quero cozinhar esse arroz. Para fazer esta tarefa, eu preciso enumerar os insumos necessários para cozinhar arroz, e as etapas necessárias para uso destes insumos, para no final da execução de todas as etapas, meu resultado seja “arroz cozido”.

Logo, vou precisar pelo menos de um recipiente de preparo (panela), uma fonte de calor (fogão), acessórios de preparo (copo para medida, uma colher), e é claro, vou precisar de arroz, água e temperos. E, na lista de tarefas para preparar o arroz, eu preciso definir todas as etapas de preparo, como lavar o arroz, ferver água, misturar o arroz com os temperos, colocar para cozinhar, etc. São todos procedimentos simples, mas é necessário saber cada um deles e executá-los corretamente para que o resultado seja arroz branco soltinho e apetitoso.

E, como todo o problema simples esconde um universo de problemas menores, qualquer etapa trocada ou mal executada interfere no resultado. Se a quantidade de água não for correta, ou o arroz fica cru ou fica “empapado”, se a panela não for tirada do fogo na hora certa o arroz fica cru ou queima no fundo. E, se faltar algum insumo ou algum recurso usado para fazer o arroz apresentar problema, você nem chega perto do resultado… Por exemplo, o fogão quebrou durante o cozimento, ou acabou o gás, ou não têm arroz no armário e o mercado está fechado.

Da cozinha pro teclado

Qualquer semelhança entre fazer arroz, escovar os dentes, e projetar um sistema informatizado não é mera coincidência. Tirando o uso final do resultado (você não vai colocar o sistema em um prato e almoçá-lo), as etapas básicas são as mesmas de qualquer atividade. O que fatalmente muda é a quantidade de etapas e os tipos de insumos aplicados.

Todas estas tarefas têm em comum a necessidade de levantar o que precisa ser feito, como deve ser feito, e se todos os insumos necessários existem, estão disponíveis e em condições de uso, e podem envolver um plano de contingência para cobrir as maiores possibilidades de fracasso da tarefa. Se o arroz der errado, é bom você ter um miojo guardado no armário, para não ficar com fome.

Projetando, analisando e desenvolvendo

Na construção de um um sistema informatizado, ou apenas no desenvolvimento de uma funcionalidade de um sistema, primeiro você precisa saber exatamente qual é o resultado esperado, depois avaliar as possibilidades de obter este resultado, verificar se a possibilidade escolhida é aplicável, analisar e aplicar a possibilidade escolhida. Dado o número de varíaveis, procedimentos, fluxo da informação e componentes deste processo, a atividade de análise e desenvolvimento de sistemas pode parecer num primeiro momento muito complexo, mas cada etapa e cada necessidade pode ser dividida em fases e etapas menores, onde algumas etapas podem ser feitas ao mesmo tempo, e quando se tem mais de uma pessoa no mesmo projeto, algumas etapas podem ser paralelizadas.

Esta lógica é praticamente instintiva, nós aplicamos ela sem perecber em muitas atividades corriqueiras do nosso cotidiano. Sim, a tal da lógica de programação, é tão simples quanto isso. Para escovar os dentes, precisamos conhecer as etapas do processo, experimentar o processo, fazer alguns ajustes na forma de execução ou na sequência ou no tempo de cada etapa, após algumas tentativas, a execução do processo torna-se tão natural, que nós nem precisamos mais pensar nas etapas, elas são realizadas naturalmente. Nós não nascemos sabendo escovar os dentes, nós aprendemos isso. Em um determinado momento, nós apredemos o que é a escova, pra que serve, qual é a maneira certa de segurar a escova, o que precisamos para usá-la, e como usá-la da melhor forma. Não é nada diferente das etapas de análise e desenvolvimento, ou aprendizagem e uso de uma linguagem de programação. O que pode tornar este aprendizado naturalmente mais difícil é a quantidade de elementos envolvidos e a quantidade de propriedades destes elementos.

Conclusão

Desde o princípio da informática, um bit têm apenas dois valores lógicos: 0 (desligado) ou 1 (ligado), e a utilização de uma corrente elétrica para a representação binária em um ponto de um circuito é este ponto estar energizado (1) ou não estar energizado (0). Os conceitos de processo, sistemas operacionais, interface, memórias (temporaria e persistente) não mudou desde a sua origem. Tudo o que temos hoje é resultado da evolução deste model-base. Conhecendo bem a base deste modelo, definitivamente torma mais fácil entender o que ele é e como ele funciona.

A cada novo avanço da tecnologia da informação, a utilização de aplicações em computadores têm se tornado cada vez mais intuitiva, você não precisa aprender ou endender muito como o seu celular funciona por dentro, para ser capaz de fazer uma ligação, outirar uma foto e publicá-la no Facebook, ou para jogar nele. Então, cada vez menos pessoas sabem o que acontece por trás da tela do computador, celular ou tablet. Muitos cursos de informática ensinam como você opera algumas aplicações dentro de um sistema operacional, ou mesmo como operar um sistema operacional, mas poucos entram nos méritos de como isso acontece por dentro do equipamento.

Se você vai ser um operador da máquina ou de seus aplicativos, você não precisa efetivamente saber disso em maior profundidade, mas para programar um equipamento, é necessário aprofundar-se um pouco mais, e isto realmente abre seus horizontes e a sua forma de enxergar um sistema informatizado, e eu garanto que absorver este conheicmento faz muita diferença. Normalmente você estuda estes aspectos em maior profundidade fazendo um curso superior de tecnologia em análise e desenvolvimento de sistemas, e em maior profundidade em ciência da computação.

Quanto mais você conhece como o equipamento funciona, e quais são as melhores práticas de como utilizá-lo, as escolhas das alternativas para a solução que você busca tornam-se mais fáceis. Um desenvolvedor de sistemas deve gostar de aprender e não ter medo de desafios, pois cada novo desafio envolve novos aprendizados e extensões do seu conhecimento.

Até o próximo post, pessoal 😉

Pense fora da caixa e resolva problemas

Hoje não veremos nenhuma linha de código, separei este post para compartilhar um pouco das experiências diárias do profissional de TI em lidar com problemas, e contar um “causo” (pelo menos pra mim) interessante, onde pensar fora da caixa foi fundamental para chega a uma solução elegante.

Problemas existem, e podem acontecer

Na trajetória do desenvolvimento de Software, volta e meia aparecem problemas de diferentes magnitudes e complexidades. Normalmente existe solução para todos os problemas, porém algumas soluções podem ser mais caras do que conviver com o problema ou contorná-lo. A primeira coisa que aprendemos na informática é como utilizá-la para resolver problemas. A segunda coisa é como resolver o problema quando uma falha na implementação de uma solução informatizada torna-se o problema.

A primeira coisa que devemos entender sobre o problema é a sua gravidade. E, é claro que isto é uma medida totalmente relativa. Um cliente não conseguir emitir uma nota fiscal pode parecer algo não grave, porém se este cliente depende da emissão desta nota para liberar um caminhão com produtos perecíveis, com data e horário certos para entrega sob pena de multa ou rescisão do contrato, não emitir essa nota é gravíssimo.

Depois, precisamos pensar em uma solução para o problema. Se o problema é grave e urgente, precisamos de um contorno para o problema. Dá-se preferência a um contorno elegante, mas se o que você têm para o momento é um arame e um durepoxi, e isso vai contornar o problema, apodere-se do espírito McGuyver que existe em você, e contorne. Mas pelo amor de Deus, não venda a gambiarra que você fez como a solução do problema. Explique que você está botando uma fita isolante no problema para o cliente não ficar parado, e que você vai trabalhar na solução definitiva assim que você entender as causas do problema.

Se você já está na fase de trabalhar no problema, ou teve que ir pra ela direto pois nenhum contorno passa pela sua cabeça, pesquise o que você puder sobre o problema. Procure entender o problema e suas causas, a partir de que momento ele manifestou-se, sob que circunstâncias, quando e onde ocorre, com que frequência, se é generalizado ou localizado, se ocorre em outros pontos do sistema, em um servidor ou em todos, em um tipo de programa ou qualquer programa, quais foram os eventos recentes que antecederam o início do surgimento do problema. É quase uma atividade de detetive. Procure as pessoas certas para levantar estas informações, limpe eventuais “sujeiras” na comunicação, e não tenha medo de perguntar “o que você quer dizer com isso ?”, quando você tiver qualquer dúvida a respeito das informações que permeiam o assunto em foco.

Muitas vezes você encontra um contorno para o problema — e posteriormente a solução — durante a análise dos detalhes do problema, ou tomando banho, ou tomando um café depois do almoço — sim, essas coisas acontecem. Se você já avaliou as possíveis causas e tudo parece certo, procure alguém mais experiente para trocar uma ideia, ou divida o problema com seus colegas de equipe, às vezes um detalhe que você não viu nas informações fornecidas  é visto na hora por outro analista, e dá um novo norte na busca pela causa do problema.

Alguns tipos de problemas são mais difíceis de reproduzir em um ambiente controlado do que Tamanduá-Bandeira em cativeiro. A causa pode estar relacionada a alguma particularidade do ambiente ou da configuração do sistema, ou mesmo até um defeito físico em uma parte da infra-estrutura. Quando as causas prováveis foram analisadas sem sucesso, comece a analisar as improváveis. Olhe tudo com uma lupa, revalide as possibilidades que foram eliminadas durante a análise, mas não desista. Existem pequenos problemas que se escondem por trás de um problema maior, e grandes problemas por trás de pequenos problemas. Não está achando o problema grande, verifique se existem problemas menores, eles podem ser consequência ou parte da causa do problema grande.

O caso do CNAB

No final das contas, entrei tanto dentro do problema que quase fugi do foco principal do post, o pensamento “fora da caixa”. Um cliente do ERP estava com dificuldade de utilizar a integração CNAB (padrão Febraban para remessa e retorno de títulos para compensação bancária). Quando o arquivo de remessa era gerado e enviado ao banco, alguns títulos do arquivo eram rejeitados pelo banco, pois o código de verificação do título que era enviado no arquivo, segundo o banco, não estava com os valores corretos.

O código de verificação de cada título era gerado pelo ERP, na geração do arquivo de remessa, e este código era composto por uma série de operações aritméticas de soma e multiplicação a partir de determinadas informações do título, como valor, vencimento, código do cliente e afins. A conta realizada com os valores daquele título resultava em um número inteiro muito grande, que esbarrava em um limite aritmético da linguagem AdvPL. O cálculo feito pela calculadora do Windows batia com o valor esperado pelo banco, que estava correto, mas o cálculo feito dentro do programa usando a aritmética da linguagem não comporta um número com mais de 16 dígitos significativos, havendo perda de precisão e consequentemente valor incorreto do código.

Isto foi antes do uso do Protheus Server, hoje chamado de TOTVS Application Server, muito anos antes de serem implementadas funções no AdvPL para lidar com números decimais de ponto fixo, que possuem precisão de até 64 dígitos. No final das contas, a fórmula matemática de cálculo escrita em AdvPL da forma originalmente proposta somente seria executada corretamente se a linguagem usasse um tipo de dado numérico com precisão superior ao ponto flutuante.

Depois de sair da minha mesa e tomar um café, levei meu caderno de rabiscos para passear, e já estava pensando em fazer um programa em outra linguagem e chamar ele de dentro do ERP para fazer aquela conta, quando eu olhei para os números e percebi o óbvio: Eu consigo fazer essa conta em um pedaço de papel, usando um lápis e as mesmas regrinhas básicas de soma e multiplicação que aprendemos no colégio primário. Se dá pra fazer no papel, dá pra fazer no computador, exatamente da mesma forma.

Eu só precisava de soma e multiplicação, e não importa se a operação ficasse um pouco mais lenta do que um cálculo em ponto flutuante nativo da linguagem, afinal seriam apenas algumas chamadas para cada título do borderô. Então, em menos de uma hora eu fiz duas funções para somar e multiplicar números recebidos como String. Bastou re-escrever as fórmulas para o CNAB daquele banco para pegar os dados do título e passar para as novas funções, trabalhando com os números como String.

Conclusão

Análise, programação e desenvolvimento de sistemas é uma atividade que requer jogo de cintura e criatividade para lidar com o universo de desafios de resolução de problemas, é saber usar o conhecimento e as ferramentas que se têm na mão, ser capaz de apontar mais de uma alternativa para resolver um problema, e escolher a que melhor atende a necessidade.

Pensar fora da caixa é uma expressão onde a caixa normalmente significa o limite do seu pensamento criativo, ou os paradigmas assimilados e embutidos nos problemas que você normalmente lida no dia a dia. A busca por novas soluções é constante, e avaliar um problema por novos ângulos e abordagens pode fazer toda a diferença. Não desista, a resposta está lá fora, esperando que você a encontre !!!

Até o próximo post, pessoal 😉

Informações Adicionais

As funções desenvolvidas para cálculo numérico de soma e multiplicação com strings estão disponíveis no ERP Microsiga, e documentadas na TDN nos links http://tdn.totvs.com/display/public/mp/FUNCAO+GENERICA+-+SOMASTR
e http://tdn.totvs.com/pages/releaseview.action?pageId=6814818 , e foram mantidas por compatibilidade. As funções implementadas na linguagem AdvPL para cálculo com números que exigem precisão maior do que a suportada por variáveis numéricas com ponto flutuante lidam com o tipo numérico “F” do AdvPl (Fixed size decimals), e estão também documentadas na TDN, no link http://tdn.totvs.com/display/tec/Decimais+de+Ponto+Fixo

A importância da simplicidade

Boas práticas existem na execução de qualquer atividade, desde colocar um copo no armário da cozinha, escovar os dentes, ou desenvolver uma rotina em um programa. Muitas dessas boas práticas são ensinadas e frisadas nas abordagens didáticas do planejamento, desenvolvimento, implementação e suporte de sistemas informatizados, algumas inclusive são tão importantes que deveriam ser vistas como “regras de ouro”. No que diz respeito a programação, existem boas práticas associadas ao desenvolvimento do algoritmo independente da linguagem, e outras de aplicação específica relacionadas à ferramenta ou linguagem utilizada.

Ao iniciar este texto, a ideia original era abordar uma lista de boas práticas aplicáveis a qualquer linguagem, então comecei pela que eu considero uma das mais importantes: A Simplicidade. Porém, durante a elaboração do texto, foram necessários mais parágrafos para desenvolver o assunto. A frase de Martin Fowler em um de seus livros sobre refatoração de código aborda de forma simples e direta este assunto: “Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam.”

Escrever um código complexo não necessariamente significa que ele foi escrito por um programador com profundo conhecimento da linguagem ou mesmo que ele sabia o que estava fazendo. Ou o código já nasce complexo, normalmente quando não se usa a melhor abordagem para o algoritmo e insiste-se numa linha de raciocínio que vai tornar possível resolver a questão, mas não é a melhor escolha, ou o código inicial nasce simples mas torna-se complexo ao ganhar mais funcionalidades, normalmente não previstas na análise inicial de sua concepção, ou que exigiriam uma refatoração cujo custo não poderia ser absorvido naquele momento, então mantém-se a lógica inicial e a nova funcionalidade ou comportamento fica parecendo um “remendo” no fonte.

A simplicidade é amiga do próprio programador. Afinal, depois de uma semana, um mês ou um ano, se o próprio desenvolvedor não registrou alguns “por quês” no código, nem ele vai lembrar por que optou por fazer daquela forma, e vai ter que reestudar o próprio código para entrender o que ele faz. Um programador experiente consegue fazê-lo, porém isso torna-se cada vez mais difícil e custoso quanto mais o código cresce desordenadamente, e até virar um mostro marinho de cinco pernas, três braços, tromba e chifres, e ninguém mais quer mexer naquilo, com medo de um dos braços do monstrinho possa lhe enfiar a mão na sua nuca e te arrancar a espinha! E isto terá sérias consequências no plano de carreira desse programador ao assumir novas responsabilidades ou projetos, pois não é possível ele subir um degrau na carreira se não houver alguém capacitado para preencher o degrau que hoje ele ocupa, e que ficará vazio com a sua subida.

Existem casos onde o código têm um nível intrínseco de complexidade, não por estar mal escrito ou remendado, mas onde a natureza do processo é complexa, ou ele foi escrito de uma forma mais complexa para obter ganhos diretos ou agregados, como um diferencial crucial de performance ou escalabilidade para um fim específico, onde este ganho justifica a complexidade da sua implementação e seu custo de manutenção. E mesmo assim, um bom programador neste ponto, usando sabiamente de um ou mais comentários sobre a lógica e os fatores determinantes da escrita da rotina, vai tornar o entendimento do código mais simples.

Procure sempre a simplicidade, grandes problemas da humanidade são resolvidos de forma simples. Utilize o complexo apenas quando realmente necessário, quando realmente existe um ganho tangível, pois a complexidade naturalmente vêm com um custo agregado, que nem sempre é necessário.

Até o próximo post 🙂

Referências