O que eu entendi e que problemas encontrei ao criar um clone do Hacker News



De um tradutor: Este artigo é uma tradução resumida da postagem original do desenvolvedor da Web Jesse Horne. Seu trabalho e ao mesmo tempo seu hobby é web design. Jesse geralmente compartilha suas melhores práticas e lições aprendidas com outros programadores, experientes e iniciantes.

Há algum tempo, escrevi um post bastante volumoso no Hacker News, que recebeu sólido apoio dos leitores. Chamei a atenção para as capacidades desse recurso e decidi tentar criar um clone para obter novas experiências e conhecimentos.

A Skillbox recomenda: Um curso prático de desenvolvedor de PHP de um ano.
Lembramos que: para todos os leitores de "Habr" - um desconto de 10.000 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

Inicialmente, isso me pareceu um grande objetivo, onde o kit de ferramentas e as táticas eram predeterminadas. Anteriormente, trabalhei em tarefas menores usando diferentes linguagens e estruturas. A única coisa que não existia era um projeto importante que permitiria reunir tudo isso.

Decidi trabalhar em um novo projeto do zero usando a linguagem Crystal. Essa é uma ferramenta conveniente, que também é nova. É rápido, os princípios de trabalhar com ele são semelhantes ao Ruby. É digitado estatisticamente e é de código aberto. Mas apenas uma nova linguagem também não é suficiente, então decidi complicar minha tarefa e criar não um clone do Hacker News, mas uma versão aprimorada desse recurso.

A propósito, eu pensei que criar um clone regular seria uma tarefa fácil. E o fato de não ser assim, percebi um pouco mais tarde, começando o trabalho.

Não varra muito alto

Não quero dizer que você não deve estabelecer metas ambiciosas. Tente alcançar as estrelas, com ou sem espinhos. Sonhar é útil, tentar alcançar o que eu não podia fazer antes é necessário para avançar com sucesso na carreira profissional.

Eu disse que você não deve tentar se apressar imediatamente no desgaste de uma tarefa complexa e grande. Escolha o que você precisa em um momento específico para implementar a ideia. Além disso, recomendo dividir metas significativas em outras menores. Se você tem muito código no qual há muito "lixo", tente simplificar e estruturar tudo.

Nem consigo expressar em palavras o quanto é importante dividir uma tarefa grande em várias tarefas menores.

No meu caso, me deparei com vários novos problemas que não havia encontrado antes. Primeiro, trabalhei com o Crystal apenas uma vez - quando estava criando um aplicativo cuja complexidade não era muito maior que a complexidade de um programa como "Olá, mundo!". No passado, eu usei Python, Lua, PHP. A nova linguagem foi o primeiro obstáculo à implementação do projeto.

O segundo foi o quadro . Crystal, sendo uma nova linguagem, ainda não possui muitas estruturas e documentação para elas. Eu decidi usar Kemal para o meu clone. Eu esperava que o quadro fosse intuitivo, pois conheci exatamente isso no meu trabalho. Mas aqui estava outro caso - as coisas individuais não eram fáceis de entender. Por exemplo, algumas seções do código pareciam bastante normais, mas por algum motivo não funcionaram. E foi difícil encontrar a causa do problema na Internet pelo mesmo motivo - a novidade da linguagem e a própria estrutura. Em alguns casos, tive que parar por um longo tempo e lidar com a causa do problema. Até agora, eu nunca tinha visto a fonte, por exemplo, o mesmo Flask.

O terceiro obstáculo são os objetivos específicos que escolhi para o projeto. Para tornar meu clone mais útil, decidi adicionar vários recursos funcionais. Eu trabalhei com o Hacker News anteriormente, por isso sei muito sobre as vantagens e desvantagens desse recurso. Ocorreu-me que seria bom explorar as análises fornecidas pelo GitHub. Utilizando-os, eu poderia adicionar estatísticas sobre o número de visualizações e a atividade do usuário no site.

Assim, decidi que meu clone deveria mostrar pelo menos visualizações e cliques para cada postagem. Essa função provavelmente seria útil para os usuários e sua implementação seria uma boa prática para mim. Mas não achei que demorasse tanto! Agora, o projeto é mais uma prova de conceito do que um recurso pronto. Além de visualizações e cliques, também decidi adicionar uma exibição dos comentários que aparecem para que eles apareçam em tempo real. Se não fosse por essa tarefa adicional, o projeto teria sido concluído muito mais rapidamente.

Agora, o projeto suporta autorização, publicação e classificação de postagens, interação com outros usuários, comentando e visualizando perfis, etc.

O quarto problema que estou enfrentando é o caos. Migrações, modelos, visualizações, controladores de API, código CSS e JavaScript se acumulam muito rapidamente. E tudo isso se transforma em uma bagunça. Eu tentei resolver o problema e quase consegui. Mas lugares parcialmente problemáticos no código do meu projeto ainda ocorrem - você pode perceber facilmente. Portanto, em muitos lugares, o código é repetido, os pontos de extremidade não são organizados, a nomeação é complicada, o que leva a um aumento na quantidade de código e a um grande número de consultas no banco de dados. Gradualmente, resolvo esse problema.

Em muitos lugares, o código é repetido

Quando o projeto começou, resolvi os problemas que apareciam. Por exemplo, foi necessário verificar se o usuário está autenticado - e eu encontrei uma solução original que levou três linhas ou mais, dependendo da rota. Eu estava com pressa para implementar as soluções encontradas.



Em geral, eu tive que seguir os princípios do DRY desde o início. Não se repita! Eu precisava escrever um programa intermediário que fizesse o que era necessário e, em seguida, simplesmente aplique a solução encontrada nesses casos, quando necessário. No futuro, ajustarei meu projeto com base nesse princípio.

Nomeação e organização de terminais

Eu desenvolvia a API na equipe da Pioneer. Usamos o REST , um estilo de arquitetura que eu realmente jurei como um novo membro da equipe Pioneer. Nesta equipe, trabalhei nos pequenos elementos de um grande aplicativo. Mas no meu novo projeto eu tive que escrever tudo do zero.

Uma "API RESTful" deve ter uma interface uniforme, como diz o Wiki. No meu projeto, organizei tudo para que os pontos finais fossem definidos nos arquivos de origem, chamados de acordo com a função ou finalidade. O registro e a saída do aplicativo foram registrados em "auth.cr". O nome do usuário foi registrado em "user.cr".

Sem dúvida, esta parte requer processamento. No futuro, organizarei tudo para que as ações se relacionem com o terminal "/ user", simplesmente porque tudo isso está relacionado ao "Usuário". Por exemplo, para melhorar a estrutura do projeto, dividirei o código em partes mais convenientes e gerenciáveis ​​com um grande número de arquivos. Vou criar a pasta "src / user / auth /", que conterá as funções de login, registro e saída do usuário do aplicativo.

1_6dy_OCE7_Cjj_Df7_A0s_Aj_3i_Q

Muitos pedidos

Neste projeto, estou tentando escalar minhas idéias. No momento, muitas consultas estão sendo feitas no banco de dados. Portanto, se o aplicativo tivesse cem usuários, eu ficaria louco tentando descobrir quantas consultas ao banco de dados estão sendo executadas a cada poucos segundos. Agora o cliente atualiza o status das mensagens a cada 10 minutos. Além disso, o post determina ciclicamente se foi visualizado pelo usuário. Durante cada verificação, ocorre uma solicitação ao banco de dados, realizada de acordo com o filtro atual. E tudo isso carrega significativamente o servidor.



Tudo o que é descrito acima são apenas exemplos de problemas que encontro o tempo todo. Não posso descrevê-los por completo. No entanto, agora estou pensando em documentar meus problemas e soluções. Espero que tudo isso ajude outros programadores a ver e entender meus erros e a evitar os próprios. Eu sei que se eu usar uma combinação de Redis e MySQL ou Postgres, eu posso acelerar a execução de consultas. Mas, por enquanto, vou me debruçar sobre isso.

Espero que você tenha gostado do artigo e tenha aprendido algo útil para si mesmo.

A Skillbox recomenda:

Source: https://habr.com/ru/post/pt425099/


All Articles