## Episode 5 - ALU - Arithmetic and Logic Unit
#### Arithmetic
- Tudo usa ALU para computações
- É realmente duas unidades em uma
- Arithmetic Unit
- Lida com todas as operações numéricas em um computador
- Um conceito muito importante é o increment e o decrement. Mais um e menos um.
- Overflow ocorre quando um resultado de uma adição é muito grande para ser representada pelo número de bits que você está utilizando. Isso pode normalmente causar erros e resultados inesperados.
- 8bit = máximo de 255
- Para cada carrier reverberar adiante (ripple forward) demora alguns bilionésimos de segundos. Elétrons são muito rápidos.
- Lembra-se do carrier mecânico? Que era chamado de relay? Era uma peça de metal que fazia 0 ou 1 através de magnetismo. Quando ligamos o ímã, o relay fecha e temos corrente. Quando desligamos o ímã, o relay fecha e cortamos a corrente. Elétrons fazem isso bem mais rápido através de condução de silício, material utilizado para fazermos processadores.
- O que ela chama de carry é basicamente aquele 1 que passamos para a próxima casa. Nada importante para se preocupar aqui.
- Curiosidade inútil:
- Carry-Look-Ahead é a estratégia utilizada hoje em dia
#### Logic Unit
- Conceitos bem abstratos para entender:
- AND
- A e B devem ser verdadeiros para o resultado ser true
- OR
- A ou B ou ambos devem ser verdadeiros para ser true
- NOT
- Inverte. Se A é verdadeiro será false. Se for falso será true
- XOR
- Somente um entre A ou B devem ser verdadeiros. Se ambos forem verdadeiros, o resultado é false
## Episode 6 - Registers and RAM
- **Dica de padeiro: abstração um conceito que esconde outros conceitos**
- Abstração é tipo uma boneca russa. Uma coisa, dentro de outra, dentro de outra.
- Uma grande abstração é uma Letra, que é um número ASCII, que se traduz em Bytes, que é formado por Bits, que são impulsos elétricos.
- Você desce um nível de abstração conforme necessário
- Um engenheiro que trabalha fazendo chips de computador desce muito na abstração (Baixo nível)
- Um gamer só precisa entender uma abstração bem alta (Alto nível)
- Um desenvolvedor só discute um baixo nível na hora de fazer código, mas fala em alto nível com pessoas não técnicas, ou em momentos que não requerem detalhamento de baixo nível.
- Isso é o poder humano de abstração. Encapsular detalhes (colocar dentro de uma cápsula metaforicamente falando) e dar um nome para isso.
- Somente calcular sem guardar o resultado não tem valor. É aí que precisamos de memória.
- RAM - Random Access Memory. Memória de acesso randômico
- Somente guarda estado enquanto há energia
- Existem outros mecanismos de memória persitente
- Gravar é write
- Acessar é read
- Se write é enabled, podemos alterar o estado
- Se write é disabled, não podemos alterar o estado
- Um 256-Bit Memory é composto de:
- Um endereço na memória (este endereço consome 8-bits)
- Dados
- Habilidade de Escrever
- Habilidade de Ler
- Um Byte é um registro de 8 unidades de 256-Bit Memory
- Endereço de memória significa literalmente ONDE está essa informação lá no seu pente de memória RAM. Em qual parte física este dado está. Física mesmo, de verdade, se você apontasse com um microscópio.
- Curiosidade inútil:
- AND-OR-LATCH
- Guarda o estado do último bit enviado. Se mandar 1, guarda 1. Se mandar 0, guarda 0.
- Um grupo de latches operando juntos é chamado de register, que mantém um único número
- O número de bits em um register é chamado width (largura)
- Multiplexer é um componente do computador que intercala diversas atividades. É um dispositivo de comutação (switch / troca)
- Multi = muitos
- Plex = complexidade
- SRAM - Static Random Access Memory
- DRAM, Flash Memory, NVRAM
## Episode 7 - CPU - Central Processing Unit
- Este espisódio inteiro é uma curiosidade inútil
- 4 primeiros bits = OPCODE = operation
- 4 últimos bits = ADDRESS or REGISTERS
- ALU recebem número binários como input e performam cálculos
- Tipos de memórias de computador:
- Registers: small linear chunks of memory
- Pequenas e lineares porções de memória úteis para persistir um único valor
- RAM: larger bank of memory
- Pode persistir muito números localizados em diferentes endereços
- CPU executa programas que tem instruções
- Se for uma instrução ALU, o CPU faz computações matemáticas
- Se for uma instrução de Memória, o CPU lê e guarda dados
- Blocos Funcionais: Microarquitetura
- Abstração da conexão entre componentes
- Control Unit
- Abstração de FETCH > DECODE > EXECUTE
- Clock Speed é a velocidade que um CPU consegue terminar o ciclo de um Control Unit
- É medido em Hertz, uma unidade de frequência
- 1hz = um ciclo por segundo
- 1khz = 100 cycles/s
- 1mhz = 1_000_000 cycles/s
- 1ghz = 1_000_000_000 cycles/s
- Fazer clock da cpu é chamado de Dynamic Frequency Scaling
- Se você clockar demais o PC, ele pode pegar fogo, real hahaha melhor jogar seu game no HIGH com a configuração padrão do que fazer overclock para jogar no ULTRA, a menos que você seja muito rico ou muito inteligente, ou os dois.
## Episode 8 - CPU - Instructions & Programs
- CPU é um Hardware, controlado por um Software fácil de ser modificado.
- Conceitos importantes:
- JUMP - pula de uma instrução para outra
- HALT - parar o processamento
- LOOP INFINITO - nunca alcança um halt, volta eternamente
- CONDITIONAL JUMP
- JUMP_NEGATVE - pula se o resultado do ALU é negativo
- JUMP_IF_EQUAL - pula se o resultado é igual a algo
- JUMP_IF_GREATER - pula se o resultado é maior que algo
- O comprimento da instrução é 4bit, 8bit, 16bit, 32bit, 64bit ...
## Episode 9 - Advanced CPU Designs
- CPU tem um cache
- Cache é um storage pequeno, para salvar um pedaço de informação que pode ser útil para diminuir o tempo de acesso a uma informação, pois uma nova comunicação não é necessária
- Se existe em cache, o acesso é chamado de CACHE HIT
- Se não existe em cache, o acesso é chamado de CACHE MISS
- O Cache pode ser utilizado como um espaço para rascunho, guardando valores intermediários ao performar um cálculo mais longo ou mais complicado
- DIRTY BIT
- A sincronização normalmente ocorre quando o cache está cheio
- Mas um novo bloco de memória está sendo requerido pelo processador
- Antes do cache deletar o bloco velho para liberar espaço, ele checa seus Dirty Bits
- Se o bit está sujo, o bloco velho é escrito na RAM antes de carregar o novo bloco
- INSTRUCTION PIPELINING
- Passar instruções de um componente para outro
- O output do componente A é o input do componente B
- PARALLELIZING
- Colocar todos os componentes para trabalharem de forma simultânea, paralela, respeitando a ordem e disponibilidade destes componentes
- Isso aumenta o throughput (vazão / taxa de transferência)
- Processadores Pipelined (canalizados. pense em canos de água) precisam procurar com antecedência Dependências de Dados e, se necessário, cessar a canalização para evitar problemas, tais como acessar um dado que já está antigo.
- Processadores modernos utilizam uma estratégia chamda OUT-OF-ORDER-EXECUTION, que evita Pipeline Stalls (cessações de canalização)
- JUMPS fazem o pipeline aguardar até o próximo resultado. Alguns processadores trabalham com Speculative Execution
- O processador chuta qual seria o valor e já preenche o pipeline através de BRANCH PREDICTION. Consegue chegar a um chute 90% correto!
- Se estiver correto, já está no pipeline e continua a execução
- Se estiver errado, ele faz um PIPELINE FLUSH, dá uma descarga e joga os dados fora
- Floating Point Math Operations Per Second FLOPS
## Episode 10 - Early Programming
- Contexto histórico. Curiosidades inúteis
## Episode 11 - The First Programming Languages
- Hello ou `.... . .-.. .-..` significam a mesma coisa, porém em ENCODINGS diferentes
- Um é encodado em inglês
- O outro é encodado em código morse
- Hardware de computadores somente entendem dados crus (raw data)
- Raw data é instrução binária, zeros e uns
- É a linguagem que os computadores falam nativamente. A única que são capazes de entender
- Chamado de Machine Language, ou Machine Code
- PSEUDO-CODE = pseudo código
- São instruções de legíveis a humanos, em linguagem natural para humanos, que um computador não consegue ler
- OPCODES ganharam nomes, chamados de MNEMONICS seguidos e OPERANDOS
- Nasce o ASSEMBLER, que recebe MNEMONICS e transforma eles em binários
- JUMPS ganharam LABELS, nomes para processos, assim removemos a dependência de ordem (1, 2, 3...)
- COMPILADORES traduzem uma linguagem de programação de alto nível, para baixo nível: linguagem de máquina
- FORTRAN - Formula Translation linguagem de programação criada pela IBM
- COBOL - Common Business Oriented Language
- WRITE ONCE RUN EVERYWHERE
- ALGOL, LISP e BASIC linguagens de 60'
- PASCAL, C e SmallTalk linguagens de 70'
- C++, Objective-C e Perl linguagens de 80'
- Python, Ruby e Java linguagens de 90'
- Swift, C#, Haskell, Go, Rust, Kotlin, Scala, Julia, R, Elm, Elixir... existem centenas hoje em dia
- Recomendo que comece estudando Ruby se for para o back-end, pois é uma linguagem de Alto Nível (muito parecida com inglês nativo)
- https://www.alura.com.br/curso-online-introducao-a-programacao-com-ruby-e-jogos-1
- Recomendo que comece estudando Html, CSS e Javascript se for para o front-end. É o arroz com feijão de qualquer front, depois você avança para outras ferramentas (React ou Vue.js)
- https://www.alura.com.br/curso-online-introducao-html-css
## Episode 12 - Programming Basics: Statements & Functions
- statement = declaração
- O conjunto de regras que regem estrutura e composição de declarações em uma linguagem é chamada de sintaxe.
- assignment statement = declaração de atribuição
- Atribuir um valor a uma variável é sempre com `=` exemplo: `some_var = some_value`
- Sempre se preocupe em dar o melhor nome possível para variáveis e funções.
- Tenha o mesmo carinho e dedição que você teria para dar nomes a filhos.
- Existem 2 coisas difíceis em programação:
- Dar nome às coisas
- E invalidar cache (esse é avançado, o primeiro é uma brincadeira... só que não)
- [TwoHardThings](https://martinfowler.com/bliki/TwoHardThings.html)
- declarações de controle de fluxo
- if / else
- switch / case
- declarações de loop
- for
- while
- Veja como Python é muito mais "human-readable" do que pascal ou shell script
- Ruby é mais idiomático ainda, ou seja, se assemelha mais a uma linguagem natural para humanos.
- Foque em python se você quiser trabalhar em áreas com matemática e estatística (machine learning, AI etc). Esse tipo de carreira exige um conhecimento mais pesado em exatas
- Quanto mais simples a solução melhor
- Funções, métodos e subrotinas são formas de abstrair instruções em um nome (existem diferenças sutis entre estes 3 que não são importantes para aprender agora)
- exemplo de função: `multiplica_por_dois(meu_valor)`
- Funções podem chamar funções
- Não faz sentido você construir algo complexo em um único arquivo, com uma única lista de declarações.
- Você pode quebrar problemas grandes em pequenos. Pequenas unidades que fazem somente uma coisa, e as fazem muito bem feitas!
- Este é um conceito muito importante chamado SINGLE RESPONSIBILITY
- Uma função com mais de 100 linhas, é um SMELL (cheirinho de bosta) de que algo está errado, que pode ser quebrado em componentes menores
- Modularizar programas em funções nos permite escrever apps e habilita outras pessoas a trabalhar de forma eficiente.
- Imagine seu amiguinho pegando seu código super genial de 1_000_000 linhas tudo em um lugar só. É bem bosta isso. Não escrevemos código para ser "smarty" ou para máquinas, escrevemos código para que outros humanos possam ler, possam entender.
- Não reivente a roda para criar um app. Problemas comuns possuem soluções comuns, tais como elevar a potência, raiz quadrada, PI etc.
- Alguém sempre já resolveu um problema manjado. É assim que programadores se tornam eficientes.
## Episode 13 - Intro to Algorithms
- Sorting (ordenar) é um problema bem comum com várias soluções (algoritmos) diferentes para problemas diferentes
- Não se assuste, ninguém sabe tudo isso, real. É algo que você estuda como aplicar quando precisa. Por enquanto, basta ter ouvido falar o nome. Em negrito são os que importam:
- **Bubble Sort**
- **QuickSort**
- **Tree Sort**
- **Selection Sort**
- **Merge Sort**
- Adaptive Heap Sort
- Adaptive Sort
- Batcher Odd-Even MergeSort
- Bead Sort
- Bitonic MergeSort
- Block Sort
- Cache-Oblivious Distribution Sort
- Cascade Merge Sort
- Cocktail Shaker Sort
- Comb Sort
- Comparison Sort
- Counting Sort
- CubeSort
- Cycle Sort
- FlashSort
- FunnelSort
- Gnome Sort
- HeapSort
- Insertion Sort
- Library Sort
- Odd-Even Sort
- Oscillating Merge Sort
- Pairwise Sorting Network
- Pancake Sorting
- Partial Sorting
- Pegionhole Sort
- Polyphase Merge Sort
- ProxMap Sort
- QSort
- Quantum Sort
- Radix Sort
- SampleSort
- ShellSort
- SlowSort
- SmoothSort
- Spaghetti Sort
- SPlaySort
- SpreadSort
- Stooge Sort
- Stupid Sort
- TimSort
- Tournament Sort
- Array é uma lista (tipo uma cadeia de itens, pense em uma listinha ordenada mesmo)
- [mirtilo, toranja, pitaya]
- Posição 0: valor mirtilo
- Posição 1: valor toranja
- Posição 2: valor pitaya
- Ela explica o selection sort
- Comece a varrer o array desde a posição 0
- O próximo é maior? Troca. Senão, continue.
- Volte para o último item trocado
- Repita a ITERATION (iteração)
- A relação do tamanho do input vezes o número de passos que o algoritmo leva para rodar, caracteriza a complexidade do Algoritmo.
- A complexidade vai ter dar uma idéia se vai ser rápido ou lento.
- Por exemplo, no Selection Sort, o pior dos casos é repetir todo o processo para cada item. Se o array tem N posições, a complexidade é de N vezes N. Ou seja, N ao quadrado, ou N^2.
- Isso é conhecido como Notação de Big O
- Selection Sort tem complexidade de O(n^2)
- Ela explica o merge sort
- Temos que verificar cada número, então o algoritmo é propocional ao tamanho do array: N
- Fazemos um passo adicional para cada item, que é dividir o tamanho total da lista por 2 até que não haja mais como dividir
- Isso nos dá uma complexidade de Log2 8, que é 3.
- Ou seja, 2^3 = 8
- No final temos uma complexidade de O(n * log(n))
- Isso é muito melhor do que n ao quadrado
- Busca de Grafos
- Brute force approach: é a maneira mais simples de varrer os possíveis caminhos para percorrer um grafo
- Este tipo de algoritmo possui complexidade O(n!)
- n! significa n fatorial
- 8! = 8*7*6*5*4*3*2*1
- n! é o pior tipo de solução que você pode ter, pois é muito custosa e normalmente tem despedício
- isso acontece pois não se utiliza nenhuma estratégia para chegar no melhor caminho, você percorre todos
- Djikstra = Pronuncia-se Dáikistra. Esse maluco é bem importante na história da programação.
- Ele lutou muito para avançar a tecnologia em computação, você vai encontrar ele em muitas literaturas.
- A primeira versão do algoritmo do Dáikistra tinha complexidade de O(n^2)
- A segunda versão do algoritmo era mais inteligente, O( n * log(n) + 1)
- Você não precisa ser mestre em algoritmos se não quiser trabalhar com algoritmos. Algum cientista já abstraiu isso em um nome para você. Só precisa saber o básico e ir progredindo ao longo da vida.
- É tipo usar uma receitinha de bolo corretamente, não se assuste.
- A maioria dos problemas comuns já tem soluções comuns.
- Quem precisa de soluções ainda não inventadas, está mudando o jogo, empresas como Google, Facebook, Amazon e por aí vai.
## Episode 14 - Data Structures
- Array é uma lista (tipo uma cadeia de itens, pense em uma listinha ordenada mesmo)
- [mirtilo, toranja, pitaya]
- Posição 0: valor mirtilo
- Posição 1: valor toranja
- Posição 2: valor pitaya
- Na maioria das linguagens de programação, a sintaxe é bem parecida com esta:
- meu_array = ['a', 'b', 'c']
- meu_array[0]
- pega o valor no index 0, ou posição 0, que neste caso é a letra 'a'
- meu_array[1]
- pega o valor no index 0, ou posição 0, que neste caso é a letra 'b'
- meu_array[c]
- pega o valor no index 0, ou posição 0, que neste caso é a letra 'c'
- Built-in function é uma função que já existe na própria linguagem. Ou seja, são algoritmos que você não precisa criar, já existe sem você ter que baixar ou instalar nada adicional.
- Um exemplo de Built-in function, ou funcionalidade nativa, ou comportamento já existente na Standard Library (biblioteca padrão) da maioria das linguagens é o sort.
- String é uma cadeira de caracteres. 'a' é um character. "a menino entrou no fábrica" é uma string
- Uma String é tipo um array de caracteres, ou seja, uma LISTA ORDENADA de caracteres, que acaba em Null (null será discutido posteriormente)
- Concatenar significa juntar duas strings. Simples assim, é só um nome muito comum dado a esta operação de juntar textos.
- Matriz é um array de arrays. Você pode definir que o valor de uma posição de um array é outro array e assim por diante.
- Normalmente evitamos Data Structures complexos, portanto mais de 2 dimensões provavelmente é um SMELL (tá fedendo a cagada)
- Um Nó é uma variável especial, que possui um número e um ponteiro para o próximo nó.
- Pense em nós como uma árvore, você tem sempre nós, que levam a nós, que levam a nós, que levam a folhas
- Linked List é um tipo de Data Structure
- Arrays precisam ter seu tamanho definido no momento de criá-los. Você não pode aumentar ou diminuir um array
- O linked list pode ser aumentado ou diminuído
- Re-order: re-ordenado
- Trimmed: remover, aparar as pontas
- Split: dividido, partido
- Reversed: reverter a ordem
- etc
- Queue: filas
- FIFO - First In First Out
- Imagine uma fila de pessoas mesmo. Chegou Caio, Bruno e Kellen
- Caio foi o primeiro a chegar, é o primeiro a ser atendido, é o primeiro a ir embora
- E assim por diante
- Enqueue: enfileirar, aumentar a fila (chegou o Kleber)
- Dequeue: desenfileirar, diminuir a fila (saiu o Caio)
- Stack: pilha
- LIFO - Last In First out
- Imagine que você está empilhando pratos. Coloco o prato grande. Por cima o médio. Por cima o pequeno
- O pequeno foi o último a entrar, ele é o primeiro a ser pego
- O grande foi o primeiro a entrar, é o último a ser pego em uma pilha
- Push: empurrar um novo item na pilha (coloquei o prato PP)
- Pop: remover o último item da pilha (tirei o PP)
- Em cada nó de um linked list possui um valor e um ponteiro para o next
- Em cada nó de uma árvore possui um valor e um ponteiro pra o nextLeft e outro para o nextRight
- O primeiro nó é o root, raiz
- Árvore BINÁRIA é uma árvore em que cada nó possui dois filhos, esquerda e direita
- Graphs podem conter ponteiros para qualquer nó e podem ter vários ponteiros. Aqui não tem conceito de root.
- É chamado de Grafo em português
- Red-Black Trees (árvore rubro-negra) e Heaps são outros exemplos de Data Structures
- Ninguém traduz Heap. É muito comum literatura brasileira traduzir alguns termos, mas nem sempre eles são exatos. Por isso algumas buzzwords são necessárias para se passar um conceito exato de algo.
## Episode 15 - Alan Turing
- Um programa é composto de diversos algoritmos
- HIERARCHIES - hierarquias
- Programação Orientada a Objetos
- OOP - Object Oriented Programming
- Conhecido também como OO (leia ô-ó)
- Este é um paradigma de programação
- Existem apenas 3 paradigmas: OOP, Structured Programming e Functional Programming
- Há 50 anos ninguém inventa um paradigma novo
- Em programação orientada a objetos, pense em Classes, Objetos e Métodos
- Classe: é como se fosse um molde, uma planta baixa, uma receita
- Object: é a concretização deste molde em uma instância, uma unidade
- Métodos: são os comportamentos
- Exemplo:
- Classe Carro
- Objeto MeuCarro (cor azul, placa xpto, número de série abcd, dono bruno)
- Métodos: Dirigir, Freiar, Buzinar, Abrir portas etc
- Higher Order components. Um componente de ordem maior, ou seja, um carro é um Higher Order component comparado a um component menor.
- Documentação: textos que descrevem coisas
- API - Application Programming Interface: algo para você mandar comandos para uma aplicação, para um programa
- Exemplos de interfaces para interagir com um carro:
- Volante
- Para enviar o comando: vire
- Câmbio
- Para trocar de marcha
- Entrada da Chave
- Para dar ignição
- SET - definir - GET - pegar
- caio = new Pessoa
- caio.setAge(29), define 29 como ano de caio
- caio.getAge, devolve o valor 29
- Exemplo de Interface da vida real:
- O campo de busca do Google. Você não sabe como é o algoritmo de fazer busca do Google.
- Você simplesmente utilizar a interface que ele te dá: um campo de texto para escrever o termo da sua busca e um botão para enviar este texto para o programa do Google fazer a busca para você
- Uma função pública, é uma função que outras pessoas podem acessar
- Uma função privada, é uma função que somente a classe que implementa aquele código tem acesso
- Esta habilidade de esconder uma lógica é a base da programação OO, se chama encapsulamento
- IDE - é um editor de código com muitas funcionalidades inteligentes
- Você passa mais tempo testando e debugando seu sistema do que efetivamente escrevendo novo código
- Source Control, Version Control, Revision Control ou SVC (Source Version Control) são todos sinônimos
- São formas de você controlar a versão do código que você escreve.
- Existem programas que fazem este controle. O mais utilizado é o GIT
- Repository
- Repositório, é onde você guarda seu código. Pense nisso da mesma forma que você pensa em salvar um game.
- Você avança e salva, avança e salva. Assim você guarda um histórico de saves, e pode dar um:
- Check Out
- Check out é ir lá pegar aquela versão, igual quando você vai na biblioteca pegar um livro
- Commit
- Este é o nome dado a esta ação de "salvar"
- Commit é tipo: comprometer-se, gravar no histórico, marcar
- Rollback
- Voltar no tempo, desfazer, ir para um estado antigo
- QA
- Quality Assurance
- É a área de conhecimento de estuda e aplica testes, assegura-se que a qualidade do programa existe
- Beta: programa em testes
- Alpha: programa em testes, mais prematuro ainda que o Beta
## Episode 16 - Software Engineering
- Um programa é composto de diversos algoritmos
- HIERARCHIES - hierarquias
- Programação Orientada a Objetos
- OOP - Object Oriented Programming
- Conhecido também como OO (leia ô-ó)
- Este é um paradigma de programação
- Existem apenas 3 paradigmas: OOP, Structured Programming e Functional Programming
- Há 50 anos ninguém inventa um paradigma novo
- Em programação orientada a objetos, pense em Classes, Objetos e Métodos
- Classe: é como se fosse um molde, uma planta baixa, uma receita
- Object: é a concretização deste molde em uma instância, uma unidade
- Métodos: são os comportamentos
- Exemplo:
- Classe Carro
- Objeto MeuCarro (cor azul, placa xpto, número de série abcd, dono bruno)
- Métodos: Dirigir, Freiar, Buzinar, Abrir portas etc
- Higher Order components. Um componente de ordem maior, ou seja, um carro é um Higher Order component comparado a um component menor.
- Documentação: textos que descrevem coisas
- API - Application Programming Interface: algo para você mandar comandos para uma aplicação, para um programa
- Exemplos de interfaces para interagir com um carro:
- Volante
- Para enviar o comando: vire
- Câmbio
- Para trocar de marcha
- Entrada da Chave
- Para dar ignição
- SET - definir - GET - pegar
- caio = new Pessoa
- caio.setAge(29), define 29 como ano de caio
- caio.getAge, devolve o valor 29
- Exemplo de Interface da vida real:
- O campo de busca do Google. Você não sabe como é o algoritmo de fazer busca do Google.
- Você simplesmente utilizar a interface que ele te dá: um campo de texto para escrever o termo da sua busca e um botão para enviar este texto para o programa do Google fazer a busca para você
- Uma função pública, é uma função que outras pessoas podem acessar
- Uma função privada, é uma função que somente a classe que implementa aquele código tem acesso
- Esta habilidade de esconder uma lógica é a base da programação OO, se chama encapsulamento
- IDE - é um editor de código com muitas funcionalidades inteligentes
- Você passa mais tempo testando e debugando seu sistema do que efetivamente escrevendo novo código
- Source Control, Version Control, Revision Control ou SVC (Source Version Control) são todos sinônimos
- São formas de você controlar a versão do código que você escreve.
- Existem programas que fazem este controle. O mais utilizado é o GIT
- Repository
- Repositório, é onde você guarda seu código. Pense nisso da mesma forma que você pensa em salvar um game.
- Você avança e salva, avança e salva. Assim você guarda um histórico de saves, e pode dar um:
- Check Out
- Check out é ir lá pegar aquela versão, igual quando você vai na biblioteca pegar um livro
- Commit
- Este é o nome dado a esta ação de "salvar"
- Commit é tipo: comprometer-se, gravar no histórico, marcar
- Rollback
- Voltar no tempo, desfazer, ir para um estado antigo
- QA
- Quality Assurance
- É a área de conhecimento de estuda e aplica testes, assegura-se que a qualidade do programa existe
- Beta: programa em testes
- Alpha: programa em testes, mais prematuro ainda que o Beta
## Episode 17 - Integrated Circuits & Moore's Law
- De 40 a 60, os computadores eram constituídos de partes individuais, chamadas de Discrete Components.
- Transistorized Computers foi a segunda geração de computadores, criado pela IBM, que trocou cada DIscrete Component de Vacuum Tube por Transistors
- Discrete Transistors não resolveu o problema da Tirania dos Números, os computadores ainda dependiam de Centenas de Milhares de Componentes Discretos.
- Em 1958 nasceu o Integrated Circuit. Ao invés de milhares de componentes conectados por cabos, agora teríamos diversos componentes juntos em um único componente.
- Em 1968 isso foi viabilizado através do uso de Silício (25% da crosta da terra é feita deste material, é muito abundante) que era mais estável.
- Printed Circuit Boards - PCB - Menor, mais barato e mais confiável. Estas placas não precisavam de cabos para conectar os components
- Silício é um semicondutor. Ou seja, Ora Conduz eletricidade, Ora não conduz. ZEROs e UMs
- Em abril 1965 o então presidente da Intel, Gordon Earle Moore, profetizou que a quantidade de transistores que poderiam ser colocados em uma mesma área dobraria a cada 18 meses mantendo-se o mesmo custo de fabricação.
- Estamos na quarta geração de computação
- Estamos próximos ao momento em que não será mais possível diminuir os transistors, por conta da largura das ondas de luz que fazem a Fotolitografia.
- Adicionalmente a este problema, os eletrôdos separados por apenas algumas dúzias de átomos, fazem com que os elétrons possam pular um espaço entre um transistor e outro, um fenômeno chamado Quantum Tunneling. Assim não temos controle da conrrente de energia.
- Laboratórios já mostraram transistors de 1nn, o que ainda não é viável para o mercado, mas pode ser o próximo futuro da computação.
- Além disso, há estudos de computação quântica:
- [https://www.youtube.com/watch?v=fLN1zQOPT2E](https://www.youtube.com/watch?v=fLN1zQOPT2E)
- [Shohini Ghose: A computação quântica explicada em dez minutos | TED Talk Subtitles and Transcript | TED](https://www.ted.com/talks/shohini_ghose_quantum_computing_explained_in_10_minutes/transcript?language=pt-br)
## Episode 18 - Operating Systems
- Sistemas operacionais são apenas programas, mas que possuem a habilidade de rodar e gerenciar outros programas
- Batch processing nasceu de computadores que poderiam gerenciar a entrada de novos punch cars, diminuindo o tempo iddle (ocioso)
- Problemática dos programadores: Interfacear com diverentes impressoras e dispositivos conectados a uma computadores, chamados de periféricos (peripheral).
- Interfacear significa se comunicar com determinado sistema através da interface que este nos expõem
- Era necessário saber detalhes de baixo nível muito específicos de cada dispositivo no passado.
- Assim os OSs entram entre o Software que escrevemos e o Hardware que usamos. O OS expõem para nós uma API (Application Programming Interface), chamados de drivers.
- I/O - Input Output, entrada e saída de dados
- Todo processo de I/O é demorado, até os dias de hoje (proporcionalmente falando).
- O computador Atlas era capaz de fazer Scheduling e Sleep, assim ele introduziu o Multitasking de processos que poderiam ficar em um estado iddle por conta de I/O e ao mesmo tempo fazer cálculos que não tinham essa demora tão alta.
- Um programa pode consumir diversos endereços de memória, espalhados e não ordenados
- Assim ficava difícil para os programadores saberem para qual endereço de memória deveriam se referir, então criou-se o conceito de Virtual Memory, que sempre começa em 0, porém o endereço físico real é abstraído pelo OS
- Isso permite aos programas terem tamanhos de memórias flexíveis, chamados de Dynamic Memory Allocation. O programa acha que é um bloco contínuo de memória.
- Desta forma fica mais seguro fazer o multitasking, pois se algum programa der pau, começar a escrever baboseiras e se comportar de forma estranha, a memória de um estará isolada de outro. (Gobbledygook = baboseira). Isso é Memory Protection
- Os computadores então ganharam terminais, que de fato eram estações de trabalho que não possuíam nenhum processamento por si só.
- Multics foi o primeiro dos mais influentes OSs que tiveram Time-Sharing. Isso permitia que múltiplos usuários utilizassem o mesmo computador.
- Porém, o Multics era um canhão para matar uma mosca, houve um Over-engineering alí (engenhosidade excedente)
- Dennis Ritchie e Ken Thompson criaram um OS mais leve, chamado UNIX
- KERNEL: parte seria responsável por Gerenciar Memória, Multitasking, Lidar com I/O
- TOOLS: ferramentas que nos ajudam a operar o OS, basicamente programas e conjuntos de programas (Libraries)
## Episode 19 - Memory & Storage
- Este episódio inteiro é uma Curiosidade inútil
- Volatile Memory - memória que não é persistida
- Random Access Memory - este nome surgiu pois antigamente só era possível gravar ou ler a memória de forma sequencial. Com a RAM, podemos fazer ambas as operações de formas independêntes, randômicas e paralelas
- Small Size & Small Capacity = Processor Registers: Very Fast & Very Expensive
- Small Size & Small Capacity = Processor Cache: Very Fast & Very Expensive
- Medium Size & Medium Capacity = Random Access Memory: Fast, Affordable
- Small Size & Large Capacity = Flash / USB Memory: Slower, Cheap
- Large Size & Very Large Capacity = Hard Drives: Slow & Very Cheap
- Large Size & Very Large Capacity = Tape Backup: Very Slow, Affordable
- Hoje em dia ainda utilizamos a hierarquia de memória para aplicar a tecnologia certa para o problema que temos
## Episode 20 - File & Files Systems
- File formats: TXT, JPG, MP3
- TXT utiliza ASCII - characte encoding standard
- Dados que descrevem dados, são meta dados
- Directory File
- Nome do arquivo
- Quando foi criado
- Data de última modificação
- Owner (usuário do sistema operacional)
- Permissões de Leitura e Escrita
- Onde começam
- Quão longos são
- Blocks
- Fragmentation / Defragmentation
- Conforme os blocos vão sendo utilizados, o disco fica fragmentado e a leitura e escrita em disco ficam mais lentas
- SSDs e Macs não precisam de defragmentação, eles já possuem sistemas internos que fazem isso automaticamente
## Episode 21 - Compression
- Encodar dados em pacotes menores
- Lembre-se que algum algoritmo faz o encode / decode da compressão, por isso é necessário mais tempo para utilizar um arquivo comprimido, pois ele precisa ser decompressed antes de ser utilizado
- Lossless compression - comprimir sem perder nenhum dado
- Lossy compression - reduz a qualidade de partes menos importantes. mais menor o resultado comprimido, mais dados são perdido
- Vídeos utilizam redundância temporal, ou seja, muito pixels que não se movem, são comprimidos entre os frames
- Diferentes encoders podem ter efeitos que resolvem bem ou não os problemas de vídeos, imagens, sons etc
- Tudo depende do quanto você precisa comprimir, como por exemplo:
- Em uma conexão de internet lenta, é melhor ter qualidade de imagem ou ter qualidade de som?
- O quanto é aceitável para o cliente perceber valor na comunicação?
## Episode 22 - Keyboards & Command Lines
- Teclado QWERTY
- O custo de mudar hábitos, cria uma barreira que impede as pessoas de mudarem sua forma de trabalhar. Isso é levado em consideração em diversos aspectos para se decidir alguma tecnologia nova.
- 100 palavras por minuto é muito mais rápido do que a escrita a mão
- A língua falada tem cerca de 120 palavras por minuto
- Existem diversos cursos gratuitos e pagos para aprender a digitar com os 10 dedos, tais como o [Learn Touch Typing Free - TypingClub](http://TypingClub.com)
- Command Line Interface ou CLI
- `ls` para listar os arquivos de um diretório (entenda diretório como pasta, tipo pasta do Windows. São coisas diferentes conceitualmente, mas para este momento basta saber que Dir e Folder são referenciados como o mesmo agora)
- `cat nome_do_arquivo.txt` imprime o conteúdo de um arquivo no terminal
- `cd minha-pasta` change directory, entrar em uma pasta
## Episode 23 - Screens & 2D Graphics
- Conceitos gerais sobre gráficos. O importante é ter ouvido falar sobre
- CRT - Cathode Ray Tube
- Vector Scanning vs Raster Scanning vs Liquid Crystal Displays
- Read Only Memory - ROM
- Screen Buffer
- Nasceu o conceito de Bitmap e Vector
- Nasceu o conceito de CAD - Computer Aided Design
- VRAM para alocar memória de vídeo
- Utilizamos Libraries que possuem funções prontas para criar gráficos
- Imagem em Vetor
- Possui coordenadas, assim como forma são feitas de pontos, linhas, curvas
- Cor de preenchimento
- Cor e grossura das linhas
- Imagem em Bitmap
- É literalmente uma mapa de bits.
- Cada quadradinho pode ser um pixel, cada pixel com uma cor
- Quanto maior a resolução, menor é o pixel, ou seja, mais pixels por área
- Bitmaps são mais pesados e não podem ser escalados sem perder resolução
- Vetores são projetados para serem mais precisos, escaláveis e simplificados
## Episode 24 - The Cold War and Consumerism
- Este episódio inteiro é sobre contexto histórico. Curiosidade inútil.
## Episode 25 - The Personal Computer Revolution
- Este episódio inteiro é sobre contexto histórico. Curiosidade inútil.
## Episode 26 - Graphical User Interfaces
- Este episódio inteiro é sobre contexto histórico. Curiosidade inútil.
## Episode 27 - 3D Graphics
- X/Y/Z - 3D Projection
- Ortográfica
- Perspective Projection
Game designers precisam balancear com cuidado a Fidelidade do Modelo vs Contagem de Polígonos, pois se a contagem for muito alta, o Framerate da animação cai para um nível que não fica flúido para os usuários. Pos esta razão existem algoritmos para simplificar Meshes.
- Scanline Rendering
- Jaggies, são as sobras de pixels renderizados
- Anti-Aliasing - utiliza cores diferentes para preenchimentos completos e preenchimentos parciais das bordas de um polígono
- Z-Buffering. Causa Z-Fighting. Quando dos polígonos possuem o mesmo valor Z, não é possível determinar qual é o correto a ser mostrado.
- Back-Face Culling - o verso do polígono é preto para poupar processamento
- Flat Shading - Gourad Shading - Phong Shading
- Texture Mapping
- GPU - Graphics Processing Unit, dedicados e meshes, shading, textures etc
## Episode 28 - Computer Networks
- Latência: tempo que uma mensagem demora para ser transferida
- LAN - Local Area Netwroks
- ETHERNET
- MAC - Media Access Control Address - para saber de quem é a mensagem
- CSMA - Carrier Sense Multiple Access
- Bandwidth - largura de banda
- Exponential Backoff - exponencialmente aumenta o tempo de retentativa para acessar a rede e transmitir um dado
- Picotar dados em pacotes pequenos e passá-los ao longo de rotas flexíveis com capacidade de sobra, é tão eficiente e tolerante a falha, que toda a Internet funciona desta forma hoje em dia. Esta abordagem é chamada de Packet Switching.
- Hoje temos o que chamamos de IoT - Internet of Things. Este conceito considera que cada dispositivo conectado a internet compôem uma rede.
## Episode 29 - The Internet
- LAN - Local Area Network
- WAN - Wide Area Network
- ISP - Internet Service Provider
- IP - Internet Protocol: Envia o pacote para o computador
- Estrutura:
- IP Header
- Data Payload
- UDP - User Datagram Protocol: Envia o pacote para o Programa
- Não oferece mecanismos para corrigir o dado ou pedir uma nova cópia. Os programas que recebem o dado corrompido (onde o checksum não bate com o payload recebido) são alertados de corrupção e os dados são descartados
- Fire & Forget: quem manda o dado, não consegue saber se chegou ao destino corretamente
- Serve para coisas como o Skype, que é tolerante a perda de dados em uma chamada com vídeo por exemplo e isso o torna extremamente rápido
- Estrutura:
- IP Header
- Data Payload
- UDP Header
- Portnumber
- Checksum
- Data
- TCP - Transmission Control Protocol
- Contém informação sobre a ordem dos pacotes
- Se receber o dado, o recebedor envia um ACK para o enviador
- Se o enviador não receber um ACK, ele reenvia o pacote depois de um tempo
- Se um dado chegar em duplicidade, ele simplesmente é descartado
- Dependendo da largura de banda, pode estrangular (Throttle) a taxa de transmissão
- Estrutura:
- IP Header
- Data Payload
- TCP Header
- Portnumber
- Checksum
- Data
- DNS - Domain Name System
- TLD - Top Level Domains
- SLD - Second Level Domains
- Sub Domains
- Modelo OSI - Open System Interconnection
- Framework conceitual para compartimentalizar diferentes processo da rede
- Physical Layer - Sinais elétricos em cabos ou sinais de rádio transmitido pelo ar (redes wireless)
- Data Link Layer - Mac Address, Collision Detection, Exponential Backoff (Low Level)
- Network Layer - Switching and Routing
- Transport Layer - UDP, TCP (transferência ponto a ponto entre computadores, detecção de erros e recovery)
- Session Layer - Onde protocolos abrem uma conexão, passam informação de lá pra cá e fecham a conexão quando termina (request ou DNS lookup)
- Presentation Layer - Browser, Skype, HTML Decoding, Movie Streaming
- Application Layer
## Episode 30 - The The World Wide Web
- WWW Não é a internet
- Hyperlink ou Hypertext - links
- URL - Uniform Resource Locator
- HTTP - Hypertext Transfer Protocol
- Códigos 2xx - OK
- Códigos 3xx - Redirecionamentos
- Códigos 4xx - Erros do client (neste caso, o client é o Browser)
- Códigos 5xx - Erros no servidor
- HTML - Hypertext Markup Language
- `<h1>Título</h1>`
- `<a href="http://www.google.com">Clique aqui para ver o Google<a/>`
- Web Browsers
- Net Neutrality
- Princípio que diz que todos os pacotes da internet devem ser tratados igualmente. Não importa se pacote é o meu e-mail ou se eu estou fazendo um streamming de vídeo, eles devem ser movidos na mesma velocidade e prioridade
- Se por um lado as companhias de internet (Internet Service Providers) poderiam utilizar uma estratégia de Throttle para estrangular a conexão de conteúdos específicos (por exemplo, beneficiando apenas grandes parceiras e interesses próprios), alguns grupos apoiam esta medida pois acreditam que naturalmente a demanda por estes ISPs seriam filtrados pelos usuários. Ou seja, quem oferece um serviço ruim seria trocado por outro com um serviço melhor.