socialgekon.com
  • Principal
  • Ágil
  • Outros Do Mundo
  • Pesquisar
  • Tecnologia
Processo Interno

A necessidade de velocidade: uma retrospectiva do desafio de codificação em JavaScript do ApeeScape

ApeeScape iniciou o desafio de codificação JavaScript aplicativo web como uma forma de atrair pessoas para nossos estandes de conferência. Vendo o quão bem sucedido foi, decidimos fazer um piloto na web, aberto a todos em nossa comunidade e suas redes.

Uma captura de tela do ApeeScape

No momento do lançamento, encorajamos os desenvolvedores motivados a encontrar maneiras criativas de pontuar alto no desafio geral de codificação de JavaScript. Alguns dos principais fatores de sucesso de grandes freelancers independentes são a capacidade de pensar fora da caixa e encontrar maneiras criativas de trabalhar dentro de um conjunto de restrições.



Perguntas do desafio de codificação JavaScript

A manopla consistia em uma série de JavaScript perguntas - semelhantes às que podem ser usadas como Questões de entrevista - variando de questões de desafio de JavaScript realmente básicas:

box.double = function double (x) { //return x doubled };

... para os mais intermediários:

box.dateRank = function dateRank (x) { // x is a date in 2019 as string (example: '06/30/2019') // return the rank of the day in 2019 (i.e., '09/01/2019' translates to 244) };

Queríamos que os desenvolvedores iniciantes e avançados se divertissem e convidassem seus amigos e colegas para competir com eles pelas pontuações mais altas. As perguntas foram classificadas por pontos, para que até mesmo os desenvolvedores juniores pudessem marcar alguns pontos. A ordem das perguntas com a mesma quantidade de pontos era aleatória, de modo que a experiência era ligeiramente diferente a cada vez, enquanto o conjunto completo de perguntas permanecia o mesmo ao longo da semana.

O objetivo era concluir o máximo de tarefas possível no prazo de três minutos. No caso de alguém encontrar uma maneira de completar todas as tarefas no desafio de codificação JavaScript, 10 pontos seriam atribuídos a cada segundo restante. Permitimos várias tentativas para completar o desafio.

A primeira coisa que previmos que aconteceria é que as pessoas levariam algum tempo para resolva as questões em um ritmo vagaroso e, em seguida, copie e cole as respostas no aplicativo da web.

Após uma hora e 40 minutos de lançamento do desafio, a primeira pessoa seguiu esta abordagem e obteve os 1445 pontos máximos que a aplicação permitia, mais alguns pontos extras que atribuíamos a cada segundo restante.

Um ponto de virada no desafio de codificação JavaScript

Com a abordagem de copiar e colar, os principais concorrentes não tinham mais nada a ganhar concentrando-se na codificação das próprias respostas. Em vez disso, eles voltaram sua atenção para trazer velocidade para suas habilidades de automação.

A abordagem mais fácil neste ponto era escrever algum JavaScript que resolveria cada tarefa enquanto esperava em um loop até que os botões estivessem prontos e copie e cole no console do navegador:

const solutions = { 'double': 'return x*2', 'numberToString': '...', 'square': '...', 'floatToInt': '...', 'isEven': '...', 'squareroot': '...', 'removeFirstFive': '...', // ... 'dateRank': '...', // ... }; const get_submit_button = () => document.querySelector('.task-buttons > .col > .btn'); const solve = () => { const ace_editor = ace.edit(document.querySelector('.ace_editor')) const submission = ace_editor.getValue() for (const key in solutions) { if (submission.includes('box.' + key + ' ')) { ace_editor.insert(solutions[key]) get_submit_button().click() setTimeout(() => { get_submit_button().click() setTimeout(() => { solve() }, 400) }, 900) return } } } solve()

Esta parte também pode ser automatizada usando ferramentas de automação regulares, como Selênio . Mas uma forma mais rápida seria automatizar o uso da API, enviando as soluções para as tarefas:

const request = require('request'); const runTask = (data, entryId, callback) => { const tests = data.nextTask.tests_json; const results = Object.fromEntries( Object.entries(tests).map(([key, value]) => [key, value.result]) ); request.post(`https://speedcoding.toptal.com/webappApi/entry/${entryId}/attemptTask`, { form: { attempt_id: data.attemptId, tests_json: JSON.stringify(results), }, }, (error, res, body) => { if (error) throw error; const next = JSON.parse(body).data if (next.isChallengeEntryFinished) { callback(next) return } runTask(next, entryId, callback) }); } const runEntry = (callback) => { request.post('https://speedcoding.toptal.com/webappApi/entry', { form: { challengeSlug: 'toptal-speedcoding', email: ..., leaderboardName: ..., isConfirmedToBeContacted: ..., dateStop: ... }, }, (error, res, body) => { if (error) throw error; const { data } = JSON.parse(body); const entryId = data.entry.id runTask(data, entryId, callback) }); } runEntry(console.log)

Uma coisa a notar é que, nesta versão do desafio de codificação de velocidade, o código foi testado apenas no lado do cliente. Por isso, foi possível simplesmente enviar as respostas aos casos de teste em vez do código. Isso permitiu uma otimização e cortar alguns milissegundos no lado do cliente.

Após três dias, a competição realmente começou a esquentar, com o número de tentativas por balde de três horas subindo de menos de 1.000 para quase 100.000.

Por três dias, a pontuação permaneceu a mesma. Algumas pessoas estavam escrevendo micro otimizações para seu código e várias pessoas estavam enviando suas soluções em um loop, esperando que o servidor ficasse menos lotado para que eles pudessem obter alguns pontos à frente. Tínhamos uma grande surpresa.

Quebrando a pontuação máxima do Desafio de codificação JavaScript

Primeiro, vamos fazer algumas contas rápidas: tivemos um total de 1445 pontos concedidos para a conclusão de todas as tarefas e um tempo concedido de 180 segundos. Se atribuirmos 10 pontos por segundo restantes na aplicação, a pontuação máxima teórica alcançável seria 3245 - no caso de enviar todas as respostas instantaneamente.

Um de nossos usuários atingiu uma pontuação de mais de 6.000, que continuou crescendo ao longo do tempo.

Como alguém pode obter uma pontuação tão alta?

Após uma breve revisão, descobrimos o que estava acontecendo. Nosso principal concorrente, um desenvolvedor profissional full-stack e ApeeScapeer com mais de 15 anos de experiência competitiva em programação, encontrou uma lacuna na configuração do desafio de codificação. Ele gerou vários bots, o que tornou o servidor lento; enquanto isso, ele poderia completar a mesma tarefa (aquela que concedeu a maioria dos pontos) tantas vezes quanto possível e atribuir suas pontuações a uma única entrada, adicionando continuamente à pontuação dessa entrada.

Isso não era contra as regras, pois permitíamos soluções criativas; no entanto, o método específico que ele estava usando tornava o servidor consideravelmente mais ocupado, tornando as solicitações de rede mais lentas para todos os outros. A primeira coisa que fizemos foi aumentar a potência do nosso servidor, o que apenas o fez passar de 56.000 para 70.000 pontos e ficar em primeiro lugar.

Embora não quiséssemos interferir na maneira como as pessoas interagiam com o desafio, essas tentativas tornaram o servidor lento a ponto de tornar o desafio difícil de usar para outros usuários, então decidimos corrigir a lacuna.

A correção tornou impossível que outras pessoas obtivessem a mesma pontuação durante o último dia do desafio de codificação de JavaScript. Por causa disso, decidimos estender o número de prêmios dados aos melhores concorrentes. Originalmente, o prêmio principal - um par de AirPods - deveria ir apenas para o competidor principal. No final, os AirPods foram dados aos que ocupavam as seis primeiras posições.

Começos humildes e fins ferozes: algumas estatísticas do desafio de codificação de JavaScript

Até mesmo nossos maiores pontuadores tiveram alguma dificuldade para começar. Na verdade, de todas as pessoas que fizeram cinco tentativas ou mais, a pontuação máxima para a primeira tentativa de qualquer um foi de 645, e a pontuação média para as primeiras tentativas nesse grupo foi de apenas 25 pontos.

Ao final da competição, pode-se adivinhar a estratégia que está sendo tentada a partir do número total de tentativas. Enquanto alguns foram mais eficientes do que outros, o melhor competidor, de longe, teve o maior número de tentativas.

Um gráfico de barras logarítmico combinado que mostra os 20 principais concorrentes

Seguindo em Frente

O que o futuro guarda?

Esta foi apenas a primeira iteração de desafio de codificação JS. Queremos fazer muitos mais desafios de programação JavaScript no futuro, aprender aulas das execuções anteriores, e torná-lo ainda mais emocionante. A primeira coisa que queremos fazer é implementar o controle de fluxo de tentativas para limitar o número de envios. Também queremos expandir além dos desafios de codificação em JavaScript, tornando-os disponíveis em uma ampla variedade de linguagens de programação.

Por último, enquanto estamos tomando medidas para tornar o desafio da codificação JavaScript mais seguro, planejamos continuar permitindo o uso de bots e outras abordagens criativas para desafios futuros.


Agradecimentos especiais para Pavel Vydra , Anton Andriievskyi , Tiago Chilanti, e Matei Copot por suas contribuições para o desafio e este artigo, e para @Zirak pela projeto de código aberto que formaram a base do aplicativo do concurso. Da mesma forma, obrigado a todos que participaram - e concorreram - do concurso.

Compreender o básico

Como pratico desafios de codificação?

Para se tornar um especialista em resolver desafios de codificação, você deve melhorar constantemente, selecionando problemas cada vez mais difíceis. O desafio JavaScript do ApeeScape contém uma ampla gama de níveis de dificuldade de tarefas. Não pule problemas que parecem entediantes: a única maneira de melhorar é se concentrar em resolvê-los também.

O que é um desafio de JavaScript?

Um desafio de JavaScript é projetado para testar seu conhecimento de programação em um ambiente cronometrado. Para concluir um com sucesso, você deve ser capaz de selecionar de forma inteligente estruturas de dados e algoritmos de design rapidamente.

Onde posso praticar a codificação JavaScript?

Exercism, Codewars, Codility e os desafios de codificação de velocidade do ApeeScape (quando disponíveis) são ótimos lugares para praticar a codificação JavaScript - competitiva ou não.

Como fazer uma transmissão ao vivo no Instagram em 2021

Postagem

Como fazer uma transmissão ao vivo no Instagram em 2021
O Zen de devRant

O Zen de devRant

Estilo De Vida

Publicações Populares
Artista processa Bill Cosby recém-libertado em 1990 em um hotel
Artista processa Bill Cosby recém-libertado em 1990 em um hotel
Um tutorial passo a passo para seu primeiro aplicativo AngularJS
Um tutorial passo a passo para seu primeiro aplicativo AngularJS
Explorando a caixa do urso da bolha da criptomoeda
Explorando a caixa do urso da bolha da criptomoeda
Menos é mais - Usando Lean UX para avaliar a viabilidade do produto
Menos é mais - Usando Lean UX para avaliar a viabilidade do produto
Princípios heurísticos para interfaces móveis
Princípios heurísticos para interfaces móveis
 
Vício de recompra de ações: estudos de caso de sucesso
Vício de recompra de ações: estudos de caso de sucesso
Organizadores do debate: houve 'problemas' com o microfone de Donald Trump
Organizadores do debate: houve 'problemas' com o microfone de Donald Trump
Como criar reflexo de lente em fotos do iPhone e corrigi-lo no Photoshop
Como criar reflexo de lente em fotos do iPhone e corrigi-lo no Photoshop
Como dar feedback sobre design profissional
Como dar feedback sobre design profissional
O verdadeiro ROI da UX: Convencer a Suíte Executiva
O verdadeiro ROI da UX: Convencer a Suíte Executiva
Categorias
Processos FinanceirosFuturo Do TrabalhoMundoÁfrica Do Oriente MédioOutros Do MundoÁsiaSaúdeEuropaDesign MóvelPostagem

© 2023 | Todos Os Direitos Reservados

socialgekon.com