Executando verificação de segurança...
6

[TabNews] Novo ranqueamento, otimizações e mais 🚀

Fala Turma do TabNews, muita coisa aconteceu desde a última publicação de melhorias, principalmente otimizações de consultas, mas elas ocorreram em diferentes PRs, então vamos deixar uma visão geral, e mais detalhes podem ser conferidos nos Pull Requests.

Otimizações nas consultas ao banco de dados

Foram implementadas várias otimizações em diferentes PRs. A seguir, destacamos as principais melhorias presentes nos PRs #1400, #1402, #1403, #1410, #1419 e #1421:

  • A função findChildrenTree foi refatorada e renomeada para findTree, pois passou a permitir retornar (opcionalmente) tanto o conteúdo pai como os filhos em uma mesma consulta ao banco.

  • Na mesma consulta também é possível buscar o conteúdo diretamente pelo owner_username, onde antes a gente precisava buscar primeiro o owner_id em uma consulta separada.

  • Enquanto ainda estávamos utilizando consultas recursivas para buscar conteúdos root e para buscar (ou apenas contar) os filhos de um conteúdo, passamos a eliminar uma etapa da recursão sempre que possível.

  • Foram invertidas as consultas para montar a página que lista conteúdos de um usuário. Agora buscamos primeiro o usuário e depois os conteúdos. Antes a consulta pelos dados do usuário ocorria após a consulta dos conteúdos, e os conteúdos eram buscados pelo owner_username, o que é menos performático do que buscar diretamente pelo owner_id, que é um campo presente em contents, e que podemos usar ao buscar os dados do usuário primeiro.

  • Foi adotada a estratégia de armazenar o caminho materializado dos conteúdos para facilitar a obtenção da árvore de comentários sem precisar de consultas recursivas.

  • Para isso, primeiro foi adicionado uma coluna path na tabela contents que armazena o id de todos os conteúdos que estão acima do item na árvore.

  • Foi criado um índice GIN nessa coluna path.

  • Passamos a utilizar path no lugar da maioria das consultas recursivas. Por exemplo, para buscar todos os filhos de um conteúdo, passamos a filtrar por WHERE children.path @> ARRAY[contents.id].

  • Foi removida a função findRootContent e passamos a buscar o conteúdo root diretamente pelo primeiro id em path.

  • Agora só buscamos o conteúdo root se ele existir, o que é verificado pelo path, eliminando consultas desnecessárias, por exemplo, ao criar notificações e ao montar a página de conteúdos.

Algumas outras modificações foram realizadas nos PRs citados, onde as principais são:

  • Ao classificar os comentários, ordenar itens apenas entre os irmãos (conteúdos abaixo do mesmo pai). Antes ocorria uma ordenação geral antes da estrutura da árvore ser montada.

  • Foi reformulada a equação de cálculo de score de comentários utilizada para ordenação. Estamos utilizando uma equação mais simples de ser computada e sem o bug de conteúdos negativados que existia na versão anterior.

  • Mudamos a validação de owner_username para ser igual à de username, para que as novas consultas possam mostrar corretamente páginas 404 ao tentar acessar conteúdo de usuário inválido ou inexistente.

As implementações foram realizadas por mim, mas agradeço toda a ajuda do @filipedeschamps e do @FabricioFFC para chegarmos na solução utilizando caminho materializado. Também agradeço ao @GHCMelo por ter reportado rapidamente um bug introduzido em uma das alterações.

Nos PRs existem algumas métricas específicas das melhorias, mas vou deixar um gráfico capaz de mostrar um impacto geral das mudanças, que é o tempo de execução das funções lambdas, ou seja, quanto tempo nosso backend levou processando requisições ao longo de cada dia, onde boa parte desse tempo era aguardando o processamento das consultas no banco de dados.

Independentemente dos números absolutos, notem que a quantidade de invocações permaneceu mais ou menos estável ao longo do mês, mas o tempo total de execução foi bastante reduzido nas duas etapas de implantação das otimizações.

Gráfico mostrando redução no tempo de execução das lambdas ao longo do mês
Gráfico 1 - Diminuição no tempo de execução das funções lambdas com as otimizações realizadas.

Agora boa parte do tempo de execução das lambdas é utilizado para a validação dos dados retornados do banco, principalmente quando é grande a quantidade de comentários em uma publicação. Então a validação é uma ótima opção para quem quiser investigar o que podemos otimizar. 👍

Botão de nova publicação no header (+)

Era uma solicitação recorrente, então o @victorhcb abriu o PR #1349 que adicionou o botão de publicação na versão desktop.

Configuração do cache

No #1406 foram criadas funções para definição de cache dos endpoints/métodos da API. Além da padronização da configuração de cache, com elas seremos alertados durante o desenvolvimento se o cache for definido mais de uma vez (com valores diferentes) em uma mesma requisição.

Regra ESLint no-unused-vars

Para uma melhor organização do código, foi habilitada a regra no-unused-vars, que visa eliminar variáveis, funções e parâmetros de função não utilizados.

A implementação foi iniciada pelo @omariosouto lá atrás no PR #404 e foi continuada mais recentemente pelo @issdomingoss no PR #1337. Eu apenas fiz os ajustes finais no PR #1410.

Melhoria nas thumbnails

A geração das imagens de compartilhamento de publicações em redes sociais continha um bug que podia deixar o texto sobreposto à logo, isso dependendo da largura dos caracteres presentes no texto.

O @OtavioVB iniciou uma correção com o PR #559, mas na mesma época a Vercel estava lançando a biblioteca @vercel/og, que parecia que ia nos ajudar a resolver o problema, mas que acabou não ajudando, pois nosso banco de dados não pode ser acessado diretamente da Edge da Vercel.

Com essa restrição em mente, o @ErickCReis começou a realizar testes utilizando a biblioteca satori, também da Vercel, e que está por trás da og. E com isso ele chegou recentemente na versão final com o PR #1425.

A nova versão não tem mudanças visuais significativas, mas corrigiu o bug que existia:

thumbnail de exemplo

Refatoração da função can em authorization

A função can verifica se um usuário está autorizado a realizar determinada ação no TabNews e retorna um booleano. Ela funcionava muito bem, mas era difícil de ser lida e entendida pelos desenvolvedores, tanto que houveram algumas tentativas de refatoração, mas que não conseguiram diminuir significativamente a complexidade.

Até que o @JoandersonPaiva fez uma proposta diferente das anteriores, utilizando early return, o que deixou mais visível qual seria o retorno da função em cada caso, e isso deve facilitar para quem estiver realizando contribuições que envolvam de alguma maneira essa função.

Os detalhes estão no PR #1427.

Nova classificação de conteúdos relevantes

A implementação da estratégia de caminho materializado (path) agilizou a consulta da árvore de comentários, possibilitando o uso dessa informação na classificação de conteúdos relevantes. Então agora são computados quantos usuários diferentes interagiram com as publicações e essa informação é utilizada junto com o saldo de TabCoins e o tempo de publicação para classificar os relevantes.

A mudança foi realizada por mim e os detalhes estão no PR #1426.

Lembrando que a qualificação de conteúdos ainda é a maneira que mais impacta a classificação, então é muito importante que continuem aproveitando toda oportunidade que tiverem de transformar seus TabCoins em TabCash, seja para ajudar a melhorar o ranqueamento 🚀, seja porque TabCash é a moeda que será muito importante quando for lançado o Revenue Share. 🤑

Conclusão

Tem muita coisa legal e impactante pra melhorar no TabNews, e que exigem diferentes níveis de conhecimento, então dá para contribuir com coisas simples, porém úteis, quando estiverem precisando de dopamina, mas também dá para evoluir muito com a gente ao interagir nas contribuições mais difíceis.

Valeu Turma! 💪

2

A implementação do caminho materializado para construir a árvore dos filhos de uma publicação foi uma experiência Open Source simplesmente sensacional!! Foi um curso de vida real acontecendo e se desdobrando de forma aberta ali, para todo mundo acompanhar... uma novela com vários capítulos, muito massa 😍

Quem tiver disponibilidade, sugiro dar watch no repositório para pegar toda comunicação que acontece, desde a abertura de um problema, as tentativas de desenvolvimento que acontecem, até o merge final. É uma experiência sensacional 🤝

Parabéns a todos os envolvidos nestas últimas melhorias!! 💪

2

Ótima solução! Foi legal e enriquecedor participar um pouco desse processo, em especial pela complexidade do problema e a solução ter encaixado como uma luva.

Mais um exemplo, que contribuir/acompanhar projetos open-source é uma excelente forma de ganhar experiência. Parabéns por terem criado essa possibilidade para nós! ❤️

1
1

O novo ranking ficou bom. Agora foco em resolver a liquidez, cada dia que passa fica mais seco ;)

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1

Olá @maniero, fico feliz que você tenha gostado do ranqueamento atual, mas ainda temos muito trabalho para melhorar ainda mais.

Em relação à liquidez, gostaria de esclarecer que temos uma quantidade significativa de usuários com saldo suficiente para realizar quase 30 mil qualificações. Portanto, não enfrentamos problemas de liquidez. No entanto, algumas pessoas podem não perceber que o ciclo completo envolve a avaliação, e acabam acumulando TabCoins que não serão utilizados.

Mesmo assim, aqueles que votam compensam aqueles que não votam, pois os votos adicionam TabCoins ao sistema, embora nem todos. Esse processo é dinâmico, e atualmente, a conversão de 12 TabCoins para TabCash gera até 22 novos TabCoins no sistema. Desses, 16 ficam disponíveis para serem utilizados em novas qualificações, o que aumenta o saldo de acordo com a demanda do sistema, que cresce com o aumento de usuários.

Aproveitando a oportunidade, observei que você tem incentivado os usuários a "economizarem" TabCoins em várias publicações suas. Gostaria de pedir que não faça isso, pois isso pode prejudicar aqueles que seguirem seu conselho. Essas pessoas terão menos TabCash quando a Revenue Share for lançada e podem ter dificuldades para recuperar os votos atrasados, devido aos limites de segurança do sistema. Além disso, essa informação equivocada pode levar essas pessoas a adotarem comportamentos inadequados no sistema.

O conselho saudável é que as pessoas convertam seus TabCoins em TabCash sempre que possível. Se acharam a leitura relevante ou positiva, votem de forma positiva. Se acharam irrelevante, votem de forma negativa. Se tiverem algo a acrescentar, comentem. Se tiverem algo não relacionado ao assunto, criem uma nova publicação...

Novos comportamentos prejudiciais sempre podem surgir, mas sempre estaremos criando mecanismos para proteger o TabNews.

Gostaria de saber sua opinião sobre um cenário em que existe uma publicação com ideias prejudiciais aos usuários do TabNews, mas a comunidade não consegue eliminá-la por conta própria. Como você acha que os usuários moderadores poderiam agir sem criar atritos desnecessários?

2

a conversão de 12 TabCoins para TabCash gera até 22 novos TabCoins no sistema

Felipe, estou com muita dificuldade de entender esta conta. Vc poderia dar alguns exemplos de como isso acontece?

Com base no que eu entendo do sistema atual, com 12 TabCoins dá pra dar 6 votos. Supondo que sejam todos positivos, e todos dados em posts da mesma pessoa (pra simplificar), então essa pessoa ganhou 6 TabCoins.

Vamos supor também que os votos foram dados nos 10 posts mais recentes postados há mais de 48 horas, ou seja, a pessoa entrou na faixa em que ganha 1 TabCoin por publicação.

Se a pessoa postar 16 publicações, ficará com um total de 22.

Claro, ela também pode postar uma só e ganhar votos, mas aí alguém terá que gastar mais TabCoins para votar. Mas limitando o exemplo ao gasto inicial de 12, a única maneira que vejo de gerar 22 é se a pessoa postar 16 publicações.

Por isso estou pedindo por um exemplo mais detalhado pra entender melhor. Eu já disse várias vezes que me falta o entendimento do todo, então acredito que ninguém melhor que vc (que criou o sistema atual) pra me dizer quais detalhes estão faltando no meu entendimento :-)


Aqui também tentei fazer outra simulação tosca, mas novamente, me falta o entendimento do todo, então queria muito que me explicassem em detalhes onde estou errando.

1

@kht, acho que você não tem dúvida sobre as regras, correto?

No entanto, essa dica é útil para qualquer pessoa que queira compreender as regras. Acredito que, para aqueles com algum conhecimento em programação, examinar o código, independentemente da linguagem com a qual estejam familiarizados, é a melhor forma de compreender as regras. Com conhecimentos básicos de matemática, é possível entender. Além disso, qualquer dúvida específica relacionada ao código pode ser esclarecida.

Quanto às simulações, é necessário utilizar estatística. Supondo que você esteja utilizando as regras corretas, é importante realizar uma amostragem de dados relevante. Não podemos imaginar que o sistema se comportará da mesma forma, em média, em uma simulação com apenas 2, 3 ou 4 usuários.

Não quero dar dicas sobre como burlar o sistema com as regras atuais. No entanto, sempre haverá maneiras de fazer isso. Como você percebeu, com apenas dois usuários, seria possível criar qualquer quantidade de TabCoins, como 100, 1.000, 1.000.000. A única limitação seriam as regras do firewall. Felizmente, não temos apenas dois usuários 😅

1

Bom, ainda não consegui entender como "a conversão de 12 TabCoins para TabCash gera até 22 novos TabCoins no sistema". O único jeito que consegui imaginar foi o que descrevi acima. Sim, foi simplificado de propósito, claro que na vida real vai ser bem diferente, mas enfim, já que não deu exemplos, vou dar um crédito e assumir que é verdade.

Daí surgem outras perguntas: essa conversão está de fato acontecendo? Qual a razão atual entre TabCoins gastos e gerados? Caso não esteja acontecendo da forma ideal, o que falta? É por causa de algo que os usuários estão fazendo (ou deixando de fazer)?


Simulações à parte, o que importa é a realidade. E nesta realidade em que vivemos, está mais difícil ganhar TabCoins, e talvez por isso muitos estejam com receio de gastar o que já tem. Entramos em um círculo vicioso e não sei como quebrá-lo sem uma mudança significativa (seja do sistema, ou do comportamento dos usuários).

2

Por que as pessoas não estão usando? Precisa descobrir isso. A culpa é minha?

Eu estou usando. Não tudo porque senti insegurança. Parece que outras pessoas também, quando uma mudança é feita sem prévio aviso, e essa mudança diz claramente que agora é para todo mundo receber menos votos, que antes as pessoas davam votos sem critério, é de se esperar isso.

Ninguém consegue controlar o critério de votos das pessoas, pode só secar a economia para ter menos votos sem critério. O que deve diminuir também os votos com critério. Até porque se a pessoa tem um desejo de votar ela vai usar o que ela acha melhor. Eu acho que as pessoas votam em coisas ruins, não todo mundo, claro, acho que deveriam votar mais em outras coisas, mas não posso fazer nada para isso mudar. Você pode ter critérios diferentes, também não pode controlar isso.

Economia é matemática e sociologia. Existe um furo na matemática, falarei depois, e parece faltar entendimento que as pessoas agem como elas querem, recionalmente ou emocionalmente, até mesmo se elas estiverem em delírio.

Eu não acho que as pessoas estejam em delírio. Principalmente eu (mas o delírio pode estar me fazendo não ver corretamente) e algumas que eu interagi e vi que eles estão recebendo menos votos que antes, e precisam economizar. Alguns estão dizendo que estão sem votos. Ou estão com medo de postar algo porque pode perder e está mais difícil conseguir de volta. Não vi ninguém dizendo o contrário. Será que todos estão nesse estado?

Vamos dizer que sim. Tem os caminhos:

  • deixa como está e espera que algo aconteça para resolver
  • muda algo no sistema para provocar a mudança
  • prova que todos estão errados e precisam gastar tudo o que tem o tempo todo, convencendo-as.

Mas precisa dar dados corretos, completos, contundentes, senão não vai convencer as pessoas.

Aparentemente você considera que eu tenho o poder de convencer as pessoas a não votarem. Eu não acho que tenha esse poder, se eu tivesse as convenceria a votar nas minhas postagens. Eu acho que você e o Felipe têm absurdamente mais poder. Vocês precisam fazer algo. Pode ser convencer as pessoas a mudarem suas ações. As pessoas só vão acreditar se for muito convincente. Ou acreditarão, gastarão e podem ficar na penúria e vão reclamar ou abandonar a plataforma, ou desistir de votos de vez.

Não falar nisso fará as pessoas terem mais votos? Ainda precisa resolver a matemática.

Eu entendo o que você diz, e na teoria o índice de votação pode ser positivo mesmo. Mas a realidade se impõe. Você teria razão, fazendo duas coisas:

  • tudo que for postado é muito bom, ou se não for será certamente apagado (nem preciso dizer que quase não terá conteúdo)
  • fraudando

Eu posso provar sua afirmação que dá para chegar a 1 milhão de pontos junto com só mais uma pessoa. Mas na prática só dá para fazer isso fraudulentamente.

Eu sei várias formas de ganhar pontos. A maioria não sabe. Ou não tem disposição para conseguir. Eu não uso quase nenhuma porque elas poderiam ser consideradas ou claramente são fraude. Dá para ir só no limite da regra.

Hoje eu tenho um pouco de saldo, só porque eu fiquei na penúria logo que mudou a sistemática. Acho que a maioria não saberia sair. Eu gasto o que ganho, mas aos poucos. Eu não posso mais votar em tudo o que gostaria. Eu quero e não posso. E eu transformo meus Tabcoins atuais em Tabcash em minutos ou horas se tiver alguma imposição do sistema. Porque é pouco. Eu não estou rico, só uma pequena folga. Amanhã ela já será menor.

Eu entendi que é possível gerar mais TCs que gastar. Na teoria... não na prática.

Usando a metáfora dos filhos. Para 40 mil pessoas só consegue manter-se saudável se nascer 40 mil filhos ou mais. Quando esses primeiros 40 mil morrerem, precisa de mais 40 mil, se tiver 20 mil, e eles fizeram a metade, logo terão só 10 mil filhos, e assim por diante.

Se as pessoas puderem ter mais que um filho, pode manter nos 40 mil, mas se elas só podem ter 1 filho, não. O sistema atual permite ter 2, 3, 4 ou mais filhos. Mas tem restrições. Quase ninguém consegue a permissão para ter mais que 1. Na verdade boa parte do tempo as pessoas podem ter 0. Essa é a falha. Poder gerar, pode, mas é muito difícil, na prática não gera.

Eu perguntei na época como poderia conseguir aumentar os ganhos (na prática, não na teoria, eu sei como ganhar mais na teoria, não sei se todo mundo sabe). Você não respondeu. As pessoas estão perguntando como que deveria estar funcionando, para você fornecer mais detalhes, e estamos aguardando para ver se estamos errados. As pessoas precisam ter informações que elas entendem. Vamos dizer que todo mundo está equivocado, precisa ser mostrado isso, inequivocamente.

De qualquer forma, só mostrar não deve resolver a questão, mas te deixa em uma posição mais confortável.

Você tem dados se algumas pessoas já desistiram por causa da mudança?

De uma forma ou de outra, só você e o Felipe podem fazer algo para resolver a questão. Pode ser que cada dia perdido prejudique mais a plataforma. Tomara que não, é tudo o que eu quero evitar. Já vi plataformas demais afundarem. É difícil fazer virar, mais ainda manter por longo tempo, não pode errar. A não ser que ela não tenha importância para vocês. Eu acho que tem. Tem pra mim, menos que eu acho que para vocês, mas tem.

Se eu estou dizendo que a Terra é plana (fazendo uma analogia, claro), me mostre isso. Eu acho que estou dizendo que ela é redonda (continuando a analogia), outras pessoas também. Precisamos mais do só você dizer que estamos errados.

De qualquer forma, se quer que eu não fale mais nada, eu não falo. Não vai mudar nada, mas eu posso fazer. Eu posso não dizer, eu não posso dizer o contrário porque eu passaria a mentir. Mas deixo-me convencer que é verdade.

Algumas pessoas devem estar cansadas de tentar mostrar que não está funcionando, e pedir mais dados.

Eu não posso nem dizer para a pessoa que eu não votei na postagem dela porque não sei se vou ganhar votos depois? Eu não posso dizer que vou apagar uma postagem porque me cria complicações para entrar no sweet spot de pontuação? Eu não posso justificar? Eu tenho que deixar a pessoa achando que sou mesquinho? Obviamente que em alguns contextos.

Eu sou muito pró-regra. Até injusta eu cumpro. Ou se não for possível, eu desisto, o que me for mais favorável no momento. Se algo não está bom, é necessário apresentar uma diretriz melhor.

Eu estou postando bastante, estou votando, menos do que gostaria, porque não estou convencendo muita gente que é algo bom. Tem gente que está fazendo isso com constância? Quantas?

Eu já disse em outro lugar que o RS vai dar um pico e vai criar a ilusão que o problema resolveu. E disse que algumas mudanças precisam ser feitas. Mas eu não vou ficar cobrando que sejam. Até eu canso.

Haverá consequências em qualquer ação que seja tomada, até deixar como está. Eu torço para que sejam boas. Eu acho que vão fazer algo bom em algum momento.

Eu sei que a economia funciona com as ações corretas. Culpar os agentes que fazem ela rodar nunca resolve problemas.

Eu não sei o que quer dizer sobre o último parágrafo. Eu fiz alguma publicação com ideias prejudiciais aos usuários do TabNews? Apague. Ou debata o assunto antes. Ou peça para apagar, dando argumentos ou não. Ou peça para mudar algum ponto específico. Sem saber do que se trata eu não consigo falar muito, cada contexto merece algo diferente. Eu sou muito direto, e prefiro algo direto. Eu não acho que fiz algo assim. Se for verdade, inclusive não vai mudar nada apagar, porque no mínimo não deve ter tido votos positivos, e talvez negativos, afinal se alguém achou isso deve ter votos sobrando para votar nisso. De qualquer forma, quem é dono da bola sempre pode fazer o que achar que é certo. Em qualquer lugar é assim. Não tem o que fazer.

E sei que semrpe que se faz algo contrário, gera atrito, ele pode ser pequeno ou grande, só não gera não fazendo nada. Está na hora de eu não fazer nada?

De qualquer forma, eu já estou cansado do assunto. Parece que não terá a solução que eu acho correta, então o melhor é deixar assim. Eu dei minha contribuição sobre o assunto. Até pensei em nem responder essa, mas não gosto de deixar sem resposta. Só me informe melhor o que pode ser falado ou não. Debater isso acho que já esgotou, já não será produtivo, falei tudo o que devia.

Me informe como quiser se estou incomodando. Não quero isso, só achei que estáva ajudando, me desculpe.

E obrigado pela resposta.