Micro-Filosofia: A arte da fragmentação
Tags: softwareengineering, programming, development, philosophy
Published: 2023-07-17 02:08:24

Estou convencido de que o melhor jeito de se desenvolver um programa de computador é aplicando a "micro-filosofia".

Neste artigo, falarei rapidamente sobre:
- GNU
- TailwindCSS
- Refatoração
  - Trunk Based Development
- Código Limpo e Programador Pragmático

E demonstrarei como essa abordagem está presente em cada uma dessas _entidades_.

A **micro-filosofia** é um método divide grandes desafios em micro tarefas, facilitando a resolução de problemas.

> "Devagar a gente chega onde a gente quer chegar" - ExaltaSamba

## [GNU](https://pt.wikipedia.org/wiki/GNU)
![GNU](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02bplfnlpns392ehiluk.png)
Não sou especialista na história do Unix, GNU e Linux. 

Mas, o que entendo é que:

- Unix era um Sistema Operacional escrito em C
  - Lançado em 1971
  - Funcionava em diversos processadores e arquiteturas
    - Algo raro na época
  - Era de uma empresa privada e vendido comercialmente.
- GNU é um projeto/movimento de código livre. 
  - Foi iniciado em 1984
  - Seu objetivo inicial era construir um Sistema Operacional
    - Completamente livre
    - Com código aberto. 
  - Possuía diversos miniprogramas que realizavam variadas funções de um sistema operacional
  - Estava quase pronto em 1992, faltava só o _kernel_ (módulo principal) para combiná-los.
- Linux na verdade é uma abreviação para _GNU/Linux_. 
  - Em 1992, [Linus Torvalds](https://pt.wikipedia.org/wiki/Linus_Torvalds) criou um _kernel_ que utilizava todos os subprogramas do GNU
  - Com isso, criou a primeira distribuição do sistema operacional _GNU/Linux_.

De forma **bem** abreviada, agora você entende o que é o GNU.

Beleza, o que isso tem a ver com _micro_? Bem... Vamos lá.

O GNU/Linux é a personificação da filosofia do Software Livre, que defende o desenvolvimento colaborativo e de código aberto, seus princípios são:

- _Copyleft_
  - O contrário de _copyright_ (direito autoral)
  - Garante que toda e qualquer alteração feita no software seja "livre de direitos autorais".
- Transparência
  - Todo o código e documentação são abertos e disponíveis para todos.
- Colaboração
  - Acredita no poder colaborativo de desenvolvedores unidos por um objetivo em comum.
- **Simplicidade**: Os pacotes GNU são exemplos de _micro_-programas que resolvem um único problema.

O GNU encoraja e defende a **micro-filosofia**! 

O movimento enxergou o sistema operacional como uma coleção de _pequenos_ programas, que fazem apenas 1 coisa, mas a fazem muito bem!

Alguns dos programas que fazem parte do pacote GNU são:
- [ls | cat | cp | mv | rm | wc](https://www.gnu.org/software/coreutils/manual/coreutils.html)
- Bash (Terminal padrão de quase todas as _distros_ GNU/Linux)
- Nano (Editor de texto presente em todas as _distros_ GNU/Linux)

Uma das melhores coisas de se utilizar Linux, ou algum sistema operacional _unix-based_ (Oi Mac OS) é poder criar combinações de programas para executar alguma tarefa.

Isso é possível através do comando "pipe (|)", por exemplo, caso você queira gerar um rank de palavras mais utilizadas, pode usar:

```
cat file.txt | tr ' ' '\n' | sort | uniq -c | sort -nr | head -10
```

Não existe um programa específico que faça isso, mas é possível realizar essa tarefa ao combinar os comandos: [cat](https://www.gnu.org/software/coreutils/manual/coreutils.html#cat-invocation), [tr](https://www.gnu.org/software/coreutils/manual/coreutils.html#tr-invocation), [sort](https://www.gnu.org/software/coreutils/manual/coreutils.html#sort-invocation), [uniq](https://www.gnu.org/software/coreutils/manual/coreutils.html#uniq-invocation) e [head](https://www.gnu.org/software/coreutils/manual/coreutils.html#index-head).

## TailwindCSS
O TailwindCSS revolucionou a forma como eu uso CSS.

Ele é um framework de CSS que se auto-denomina [_utility first_](https://tailwindcss.com/docs/utility-first).

Diferente de outros frameworks CSS como _Bootstrap_, _MaterialUI_ e _ChakraUI_, o _TailwindCSS_ **não possui nenhum componente completo**.

Ele nada mais é do que um conjunto de **micro-classes** de CSS, onde cada classe, **aplica apenas uma estilização**.

Apesar de parecer contraditório, trabalhar com classes minúsculas proporciona muita flexibilidade, poder e estimula a criatividade.

Essas classes são atalhos para estilizações que já foram escritas incontáveis vezes em milhões de sites na web, além de apresentarem classes dinâmicas (como p e m) e aceitarem parâmetros fixos, ex: h-[300px].

![Seção Padding na documentação do Tailwind](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8mxkbns96zup0wh09foz.png)

Assim como o GNU, o Tailwind também acredita no **poder** da filosofia micro para a resolução de problemas.

## Refatoração

![livro Refatoração do Martin Fowler](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6b0gwh15574knha8gjow.jpg)
Recentemente, tenho lido o livro [Refatoração](https://www.amazon.com.br/Refactoring-Improving-Design-Existing-Code/dp/0134757599?&_encoding=UTF8&tag=codista-20&linkCode=ur2&linkId=73cd2c546e1999bc24ce757700ec4e1a&camp=1789&creative=9325) do Martin Fowler. Nele, são abordadas algumas estratégias e técnicas para melhorar código. 

Segundo o autor, refatoração é uma técnica controlada para melhorar o design de um código existente.

> É uma forma disciplinada de limpar código que minimiza as chances de introduzir bugs.

O processo de refatoração segundo Martin Fowler envolve:

- Fazer mudanças _pequenas_ que não alteram o comportamento do código.
- Dar pequenos passos, para cometer menos erros.
- Rodar builds e testes a cada nova mudança, só atualizar se estiver funcionando.

Ao fazer isso, você garante que o código está sempre funcional e, aos poucos, vai melhorando.

O livro conta também com 70 técnicas de melhoria de código.

Grandes refatorações são feitas aproveitando do **poder** da **micro-filosofia** aplicada à melhoria de código.

Segundo o Martin, é o jeito mais rápido de resolver um problema ou de melhorar um projeto, é resolver pequenos micro-problemas sequenciais que, combinados, resolvem um problema gigante.

### Trunk Based Development
É uma estratégia de versionamento de projetos, focada em manter _branches_ de curta duração e:

- Sempre mergear para main
- Mergear com frequência (idealmente 1x por dia)
- Utilizar Feature Flags para esconder features que não estiverem prontas

Isso ajuda a evitar:
- Conflitos de merges complicados
- Corrida-por-commit

As explicações para essas 2 suposições podem ser encontradas [nesse artigo](https://martinfowler.com/articles/branching-patterns.html#Trunk-basedDevelopment) SENSACIONAL do Martin Fowler.

Aqui, o conceito _micro_ aparece ao defender que _micro_ alterações devem ser mergeadas ao projeto principal, o mais rápido e frequente possível. 

Com isso, fica mais fácil de:
- Analisar PR
- Resolver conflito de merge
- Manter todas as branches atualizadas

Se você for capaz de manter uma estratégia com branches de _curta_ duração.

## [Código Limpo](https://www.amazon.com.br/C%25C3%25B3digo-limpo-Robert-C-Martin/dp/8576082675/ref=sr_1_1_sspa?__mk_pt_BR=%25C3%2585M%25C3%2585%25C5%25BD%25C3%2595%25C3%2591&amp;keywords=clean+code&amp;sr=8-1-spons&amp;sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&amp;psc=1&_encoding=UTF8&tag=codista-20&linkCode=ur2&linkId=5a42cf85455594d2b57676b39695d2b3&camp=1789&creative=9325) e [Programador Pragmático](https://www.amazon.com.br/Programador-Pragm%25C3%25A1tico-Aprendiz-Mestre/dp/8577807002/ref=sr_1_5?keywords=programador+pragmatico&amp;sr=8-5&amp;ufe=app_do%253Aamzn1.fos.6121c6c4-c969-43ae-92f7-cc248fc6181d&_encoding=UTF8&tag=codista-20&linkCode=ur2&linkId=5ef9b9be4e551373d735af38c034e83d&camp=1789&creative=9325)
Dois ótimos livros sobre desenvolvimento de sistemas codificados e carreira como programador.

Ambos defendem:
- Funções pequenas
  - Com nomes descritivos
- Código legível 
  - Entendível
  - Autoexplicativo
  - Sem comentários
- Política de Boa Vizinhança 
  - Deixar o código melhor do que encontrou
- Refatoração contínua
  - Não ter medo de alterar o código para melhor, nunca!
  - Refatorar para melhorar a leitura, compreensão ou manutenção
- Testes Unitários
  - Ponto comum nos 3 livros
  - Facilita a manutenção (maior segurança para mudar)
  - Facilita o entendimento das regras de negócio
  - Força a criação de funções pequenas e desacopladas

## Micro-Filosofia
Está presente em cada uma dessas _entidades_ da programação.

Consiste em quebrar grandes problemas, etapas ou funcionalidades, em **micro**-tarefas.

Todos os autores afirmar que a verdadeira velocidade no desenvolvimento de Software só é possível com passos pequenos, iterativos, testáveis e manuteníveis.

Eu, particularmente concordo, tenho aplicado muitos dos conceitos que comentei no post e acredito que é muito mais fácil e seguro aplicar a **microfilosofia** no rotina do desenvolvimento de software.