Reflexões sobre C++

Desenvolvi esse projeto chamado netsys, um software de diagnóstico simples, mas com informações essenciais sobre redes e sistema. É uma ferramenta que não substitui ferramentas mais robustas de gerenciamento do Linux.

$ netsys
------------------------------------------------------------------------------------------------------------------------
System
------------------------------------------------------------------------------------------------------------------------
Uptime: 2 hours, 43 minutes
Memory Available: 1.55 GiB  |  Memory Installed: 7.05 GiB
CPU Usage (%):
cpu: 1.76
 | cpu0: 3.92 | cpu1: 3.00 | cpu2: 2.00 | cpu3: 2.02
 | cpu4: 3.03 | cpu5: 1.01 | cpu6: 1.02 | cpu7: 1.98
------------------------------------------------------------------------------------------------------------------------
Interfaces
------------------------------------------------------------------------------------------------------------------------
ADDRESS               BROADCAST             INTERFACE   MAC                   STATE       VENDOR
192.168.0.8/24        192.168.0.255         wlp2s0      58:02:05:74:d6:7f     up          AzureWave Technologies, Inc.
127.0.0.1/8           none                  wlp2s0      58:02:05:74:d6:7f     up          AzureWave Technologies, Inc.
192.168.0.8/24        192.168.0.255         lo          00:00:00:00:00:00     unknown     unknown
127.0.0.1/8           none                  lo          00:00:00:00:00:00     unknown     unknown
-----------------------------------------------------------------------------------------------------------------------
Routing Table
-----------------------------------------------------------------------------------------------------------------------
DST ADDRESS              GATEWAY                  INTERFACE                TABLE
0.0.0.0/0                192.168.0.1              wlp2s0                   main
192.168.0.0/24           none                     wlp2s0                   main
127.0.0.0/8              none                     lo                       local
127.0.0.1                none                     lo                       local
127.255.255.255          none                     lo                       local
192.168.0.8              none                     wlp2s0                   local
192.168.0.255            none                     wlp2s0                   local

O motivo por trás deste projeto são dois: primeiro, queria me atualizar no C++, pois já faz tempo desde a útlima vez que trabalhei com essa linguagem (o padrão vigente acho que era o C++98 ainda). O segundo motivo, foi muito guiado pelas minhas necessidades dentro de um projeto que estou trabalhando atualmente.

Nesse projete, algumas das minhas responsabilidades são a programação de um backend e a manutenção dele que roda em um servidor Linux. E para quem trabalha com infra, dentro de um ambiente do cliente, sabe que muita coisa fora do nosso controle pode vir a acontecer como, por exemplo, falhas elétricas, manutenção na infra que faz parte da rotina do cliente, envolvimento de terceiros na gestão da LAN, etc.

Quando acontece algum problema, preciso investigar a causa raíz do problema com base nos sintomas apresentados. Não acho haja um caminho linear para identificar a causa para todo e qualquer tipo de problema. Em algumas ocasiões a primeira suspeita é a causa. Mas em outras, precisamos levantar hipóteses, testar e validar.

Se, por exemplo, o servidor fica offline, uma das perguntas que me faço é: por que ficou offline? será instabilidade na conexão de internet? se a conexão estiver ok, então o servidor tá desligado? se tiver desligado, significa que houve queda de energia? e por mais tempo que o banco de bateria pode aguentar? houve alguma alteração no endereçamento de rede? rota? etc. As possibilidades podem ser bem extensas e para ajudar no processo de investigação, utilizo ferramentas como ip, top, leitura de logs e entre muitos outros recursos.

Mas todos os comandos são executados de forma manual um a um. E sentia falta de uma ferramenta que fosse simples, mas que desse uma fotografia do cenário atual do servidor. Sendo assim, desenvolvi o netsys que é uma ferramenta de diagóstico rápido e não extensivo, não tem nada de extraordinário, mas ele me oferece informações suficientes para eliminar algumas hipóteses, algumas pistas ou, com sorte, para matar logo a charada.

Tudo bem, eu poderia usar sequências de comandos com pipe? Sim, e dessa forma é até mais flexível porque tenho as ferramentas do sistema a minha disposição. Mas lembra do primeiro motivo? Então, experimentei desenvolver essa ferramenta com o C++ moderno e foi uma experiência de muito aprendizado.

Minhas percepções: apesar da linguagem ser criticado por sua complexidade e pelos compiladores gerarem "sujeiras" no código assembly (ou da máquina), acredito que tenha mais coisas boas do que ruins.

O C++ se tornou e vem se tornando uma linguagem cada vez mais robusta com recursos para resolver não um problema específico, mas para classes de problemas. Recursos como constexpr que avalia expressões em tempo de compilação (caso contrário, seria avaliado em tempo de execução somente) é genial, pois tira-se a necessidade executar para então descobrir se o código falha. Ao mesmo tempo, tira-se um pouco da sobrecarga de execução.