15

Eu criei minhas próprias funções da libc do "zero"!

Olá, pessoal do TabNews! Hoje gostaria de compartilhar como foi a minha experiência desenvolvendo uma biblioteca em C do zero, sem ter nenhuma experiência prévia com programação, durante 16 dias!

Me chamo Sophia (aka ciproterona), tenho 18 anos e recentemente me tornei Cadete na 42 São Paulo. Para quem não conhece, a 42 é uma escola de engenharia de software disruptiva e sem professores: o aprendizado é baseado em projetos práticos, avaliação entre pares (peer-learning) e provas semanais. Eu me mudei sozinha da Paraíba para São Paulo apenas para tentar o processo seletivo (a Piscina) e, felizmente, deu certo! Mas essa jornada fica para um próximo texto.

A Libft é o nosso primeiro projeto oficial como Cadetes. O objetivo é recriar do zero várias funções da biblioteca padrão do C (libc), como isalpha, memcpy, bzero, além de funções mais avançadas como atoi, itoa e a ft_split (😭). Também há uma seção focada nas linked lists, implementando funções como lstnew, lstdelone e lstadd_front. Por regra da escola, todas as funções recriadas devem levar o prefixo ft_ (de Forty-Two).

Os maiores desafios

Para quem nunca tinha visto código na vida, o gerenciamento de memória foi um choque. Sem dúvidas, as funções mais difíceis para mim foram a ft_split e a ft_strtrim. Foram as que me exigiram mais tempo de estudo, especialmente para garantir o tratamento correto de ponteiros e evitar qualquer vazamento de memória (memory leak) ou um Segmentation Fault escondido, afinal, basta um único deslize desses para a Moulinette (O sistema de correção automática) ou os avaliadores zerarem o projeto...

O que realmente me ajudou a destravar a lógica foi externalizar o problema: comecei a desenhar os arrays e ponteiros no papel, fazendo uma espécie de "teste de mesa" visual. Ver a memória acontecendo no papel deixou o entendimento do código mais simples (tem momentos que o tradicional funciona).

O Projeto

Quem tiver curiosidade em conferir como ficou a estrutura final do meu repositório, ele está disponível no GitHub: github.com/ciproterona/42_libft.

Nota sobre contribuições: Como este é um projeto acadêmico e individual, não aceito merges de Pull Requests externos para alterar o código principal. No entanto, sinta-se totalmente livre para abrir uma Issue ou PR com caráter estritamente educacional (propor uma lógica mais eficiente, discutir novos conceitos ou apontar melhorias). Só peço, por favor, que evite enviar interações sem propósito ou sem uma explicação clara. E quero relembrar que entrei na 42 sem ter nenhum conhecimento sobre Git, C, algoritmos e lógica de programação. Eu aprendi tudo durante esses 3 meses que estive na 42.

Adoraria saber: quem aqui também começou a programar direto pelo baixo nível do C? Como foi a experiência de vocês com gerenciamento de memória no início? E como vocês estudam programação atualmente?

Estarei trazendo atualizações aqui no TabNews para os próximos projetos! Até mais 👐🏼

Carregando publicação patrocinada...
4

Boa! Para mim, quando comecei a aprender C, gerenciamento de memória foi bem intuitivo e não tive nenhuma dificuldade com isso. Mas isso porque eu já manjava de assembly e arquitetura de processadores antes de começar a estudar C.

Eu não fiz esse caminho de propósito, mas vendo como a galera têm dificuldades para entender essas questões da linguagem C, eu notei como aprender assembly antes facilitou muito minha vida kkkkk.

Inclusive, deixo aí como dica para quem quer aprender C ou tenha dificuldades com a linguagem: aprende assembly e arquitetura de processadores antes. :D

1

Começou com Assembly que já é mais complexo que C :O que legal!

Vou tentar seguir sua dica e estudar Assembly também. Eu gosto dessa parte do baixo nível.

Agradeço pelo comentário!

1

Na verdade, C é muito mais complexo que assembly. Assembly é só uma coleção de várias instruções simples1.

C pode até parecer uma linguagem simples e, no geral, é o que todo mundo fala da linguagem, mas existem muitas complexidades na linguagem. A curva de aprendizado da linguagem C confunde porque é rápido aprender o nível básico e até intermediário da linguagem, mas quando você chega no nível avançado é que fica complicado.

Ter que lidar com coisas como undefined behaviors e os algoritmos de otimização do compilador é o que mais complica na linguagem. Você sai do nível "aprender sintaxe" para o nível de ter que realmente entender os comportamentos e as semânticas da linguagem senão o compilador otimiza errado seu código e literalmente insere um bug no programa.

Claro, esse problema pode ser evitado simplesmente desligando as otimizações do compilador (-O0), mas ninguém faz isso em um software real. xD

Programar em C no nível avançado exige estudar a especificação da linguagem, conhecer bem como o compilador que você usa otimiza o código e, também, saber assembly: porque você vai ter que auditar o código assembly de saída do teu compilador para garantir que e o compilador não gerou código errado.

Espero que eu não tenha falado demais. Não quero te intimidar achando que você vai ter que aprender tudo isso. A gigantesca maioria das pessoas não chegam no nível avançado em C. Não é algo com o que você precisa se preocupar. 😄

Notas de rodapé

  1. Com exceções que não vale mencionar aqui para não complicar desnecessariamente o assunto.

1

Nossa, isso me surpreendeu! Eu não havia me tocado que o compilador pode gerar esses problemas. Isso me assustou um pouco mas realmente, acho que não irei pegar esse nível do C kkk

Agradeço por seu compartilhamento!

3

Legal, acho que todo(a) programador(a) deveria saber fazer isso. Parabéns porestar na 42 e ter a chance de se tornar uma profissional acima da média. Seria legal ir colocando mais coisas até para as pessoas conhecerem a 42 e como funciona lá, será muito útil para outras pessoas, você tem a oportunidade que poucos têm, ajudar outras pessoas com algo realmente relevante e inédito (como funciona o aprendizado na 42).

Incentive outras pessoas de lá fazerem isso. Minha percepção é que a 42 fica meio escondida da comunidade de desenvolvedores, seria bom quebrar isso. Já fiz essa crítica para o Mata e a Mari.

https://www.tabnews.com.br/maniero/faq-do-programador-perdidao.

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

1

Muito obrigada Maniero!

Realmente a 42 é bem escondida mesmo. Eu a conheci pelo vídeo do Fábio Akita kk, assim como muitos Cadetes de lá.

Mas eu pretendo compartilhar mais sobre a escola e criar conteúdo sobre. A 42 valoriza muito essa conexão com a comunidade

2

Menina, que projeto bacana! Eu me lembro de quando eu comecei a aprender C e C++ no DevCpp, numa máquina bem humilde que rodava Windows 7 kkkk. Hoje em dia, o resultado é que sou bem mais proeficiente com os templates e smart pointers do C++ do que com o malloc e void pointer do C kkkkk.

Mas enfim, muito bacana teu projeto no github. Traga mais atualizações para nós assim que possível. Você é fera 🫵

2

Obrigada kkkk

Eu fiquei um pouco triste que o novo currículo da 42 trocou o C++ por Python, já que estão focando mais na parte de dados e IA. Mas pretendo estudar por fora

2

Dev C++, C e Python aqui. Vejo muito pouco uso prático para C++ além de plataforma de ensino de Orientação a Objetos. Tem pouco projeto do mundo real em C++ quando comparado a C e Python.

A utilidade prática do C++ é metaprogramação: Antes de começar um grande projeto, você desenha em C++ uma linguagem de programação que tem facilidade de expressar o tipo de questão envolvido naquele projeto (por exemplo, em um programa que trabalhe com matrizes é útil que o operador + saiba automaticamente como somar vetores e matrizes, sem precisar de loop for). Em teoria é extremamente útil, na prática se você passar uma semana sem olhar pro projeto você esquece como a linguagem que você mesmo criou funciona.

O que você achou dos desafios propostos pela 42? Não conheço escola BR com esse formato de desafio.

1

Realmente eu não vejo muitos projetos feitos em C++, só mais game engines e jogos em si

Sobre a 42, eu achei os desafios (projetos) bem complexos, especialmente para quem não tem conhecimento prévio na programação e linux (você usa linux na 42), e ainda levando o bônus de que não tem professores formais ou materiais acadêmicos. Você aprende com os outros Cadetes, materiais da internet e fazendo os projetos na prática. Inclusive, existe um projeto chamado "minishell", que é basicamente você criar seu próprio shell linux DO ZERO, usando a libft (infelizmente não tem mais ele no novo currículo).

Vale lembrar que a 42 não é uma "escola pública técnica", é uma instituição de ensino privada sem fins lucrativos, com formação livre. Isso é bom e ruim ao mesmo tempo, já que como a 42 foge bastante dos modelos do MEC, infelizmente não tem emissão de diploma no final do curso, apenas um certificado, que é reconhecido globalmente (que é emitido pela 42 Network). Mas acredito que a inserção no mercado de trabalho é muito mais rápida e eficiente. Nada te impede de fazer uma faculdade pós-42 (se o problema for diploma)

1

Se te deixar mebos desapontada,fui aluno e professor de universidade pública, e lá também não ensinam o básico 😅

É muito comum nas disciplinas básicas o professor chegar, dizer que a prova é daqui a 20 dias, que tem de entregar projeto daqui a 40 dias, sugerir um livro e dar o assunto por encerrado. Quando o professor é legal, ele passa um PowerPoint com o resumão do que vai cair na prova. Aula mesmo só quando chega nos tópicos mais avançados.

1

Ah, eu já ouvi isso também kkkk. Mas o que eu amei na 42, você faz o seu. Você chega a hora que quer sem ninguém te mandar, o dia que quer, senta ali no seu PC, estuda, se tiver dúvida tira com seu coleguinha do lado e assim vai indo. Pra quem é bolsista é mais puxadinho, já que você literalmente tá recebendo pra estar ali, mas pra quem não é, a 42 é super de boa com questão de horário (só tomar cuidado pra não cair no black hole, que é quando você demora muitooo pra entregar um projeto)

1

Irmão, aí eu vou discordar de você. Só abrir o Github e fazer uma pesquisa rápida que tu vai achar um punhado de projetos muito bacanas e modernos escritos em C++, principalmente se tratando de engines, IA e bancos de dados.

2

Eu comecei pelo alto nivel com php e fui pelo baixo nivel em c na faculdade. Quando voce encara as acoes do computador pelo de um cerebro humano, gerenciamento de memória nao assusta tanto. A memória de longo prazo seria o hd, a memória de curto prazo seria a ram. E por ae vai. Depoos tentar encarar como uma maquina de 50 anos atras faz mais sentido ainda, quando coce precisa dar comando ao linux pra attachar o pendrive.