Hız İhtiyacı: Bir Toptal JavaScript Kodlama Mücadelesi Retrospektifi
Yayınlanan: 2022-03-11Toptal, insanları konferans kabinlerimize çekmenin bir yolu olarak JavaScript kodlama yarışması web uygulamasını başlattı. Ne kadar başarılı olduğunu görünce, topluluğumuzdaki ve ağlarındaki herkese açık, web üzerinde bir pilot uygulama yapmaya karar verdik.
Lansman zamanında, motive olmuş geliştiricileri genel JavaScript kodlama mücadelesinde yüksek puan almanın yaratıcı yollarını bulmaya teşvik etmiştik. Büyük bağımsız serbest çalışanların kilit başarı faktörlerinden bazıları, kalıpların dışında düşünme ve bir dizi kısıtlama dahilinde çalışmanın yaratıcı yollarını bulma yeteneğidir.
JavaScript Kodlama Yarışması Soruları
Eldiven, gerçekten temel JavaScript sorgulama sorularına kadar, mülakat soruları olarak kullanılabileceklere benzer bir dizi JavaScript sorusundan oluşuyordu:
box.double = function double (x) { //return x doubled };
…daha orta dereceli olanlara:
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 (ie, "09/01/2019" translates to 244) };
Hem yeni başlayanlar hem de ileri düzey geliştiricilerin eğlenmesini ve arkadaşlarını ve meslektaşlarını en yüksek puanlar için onlarla rekabet etmeye davet etmelerini istedik. Sorular puanlara göre sıralandı, böylece genç geliştiriciler bile puan kazanabildi. Aynı puana sahip soruların sırası rastgeleydi, bu nedenle deneyim her seferinde biraz farklıydı ve tüm soru seti hafta boyunca aynı kaldı.
Amaç, üç dakikalık zaman sınırı içinde mümkün olduğunca çok görevi tamamlamaktı. Birinin JavaScript kodlama yarışmasındaki tüm görevleri tamamlamanın bir yolunu bulması durumunda, kalan her saniye için 10 puan verilecektir. Meydan okumayı tamamlamak için birden fazla denemeye izin verdik.
Olacağını umduğumuz ilk şey, insanların soruları yavaş bir hızda çözmek için biraz zaman ayırması ve ardından cevapları kopyalayıp web uygulamasına yapıştırmasıydı.
Mücadeleyi başlattıktan bir saat 40 dakika sonra, birinci kişi bu yaklaşımı izledi ve uygulamanın izin verdiği maksimum 1445 puanın yanı sıra kalan her saniye için verdiğimiz bazı ekstra puanları aldı.
JavaScript Kodlama Mücadelesinde Bir Dönüm Noktası
Kopyala ve yapıştır yaklaşımıyla, en iyi yarışmacıların cevapları kodlamaya odaklanmaktan başka kazanacakları bir şey yoktu. Bunun yerine, dikkatlerini otomasyon becerilerine hız kazandırmaya yönelttiler.
Bu noktada en kolay yaklaşım, düğmeler hazır olana kadar bir döngüde beklerken her görevi çözecek bir JavaScript yazmak ve tarayıcı konsoluna kopyalayıp yapıştırmaktı:
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()
Bu bölüm, Selenium gibi normal otomasyon araçları kullanılarak da otomatikleştirilebilir. Ancak daha hızlı bir yol, çözümleri görevlere göndererek API'nin kullanımını otomatikleştirmek olacaktır:
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)
Unutulmaması gereken bir şey, hız kodlama mücadelesinin bu sürümünde kodun yalnızca istemci tarafında test edilmiş olmasıdır. Bu nedenle, kod yerine test senaryolarının cevaplarını basitçe göndermek mümkün oldu. Bu, bir optimizasyona ve istemci tarafında bazı milisaniyelerin kesilmesine izin verdi.

Üç gün boyunca puanlar aynı kaldı. Bazı insanlar kodları için mikro optimizasyonlar yazıyor ve birkaç kişi birkaç puan öne geçebilmek için sunucunun daha az kalabalık olmasını umarak çözümlerini bir döngü içinde gönderiyordu. Büyük bir sürpriz bekliyorduk.
JavaScript Kodlama Mücadelesinin Maksimum Puanını Kırmak
İlk olarak, biraz hızlı matematik yapalım: Tüm görevlerin tamamlanması için toplam 1445 puan ve 180 saniyelik bir zaman hakkımız vardı. Başvuruda kalan saniye başına 10 puan verirsek, tüm yanıtların anında gönderilmesi durumunda, elde edilebilecek maksimum teorik puan 3245 olacaktır.
Kullanıcılarımızdan biri, zaman içinde istikrarlı bir şekilde artmaya devam eden 6000'in üzerinde bir puan aldı.
Bir insan nasıl bu kadar yüksek bir puan alabilir?
Kısa bir incelemeden sonra, neler olduğunu bulduk. En iyi yarışmacımız, profesyonel bir tam yığın geliştirici ve 15 yıldan fazla rekabetçi programlama deneyimine sahip Toptaler, kodlama zorluğunun kurulumunda bir boşluk buldu. Sunucuyu yavaşlatan birden fazla bot üretti; bu arada, aynı görevi (en çok puan veren) mümkün olduğu kadar çok kez tamamlayabilir ve puanlarını tek bir girişe atayabilir ve sürekli olarak o girişin puanına eklenebilir.
Bu, yaratıcı çözümlere izin verdiğimiz için kurallara aykırı değildi; ancak, kullandığı belirli yöntem, sunucunun önemli ölçüde daha yoğun olmasına ve ağ isteklerinin diğer herkes için daha yavaş olmasına neden oldu. Yaptığımız ilk şey sunucu gücümüzü artırmak oldu, bu da onu sadece 56.000'den 70.000 puana çıkardı ve ilk sırada kalmasını sağladı.
İnsanların meydan okumayla etkileşim kurma biçimine müdahale etmek istemesek de, bu girişimler sunucuyu o kadar yavaşlattı ki, meydan okumayı diğer kullanıcılar için kullanmak zor oldu, bu yüzden boşluğu düzeltmeye karar verdik.
Düzeltme, JavaScript kodlama mücadelesinin son gününde diğer kişilerin aynı puanı almasını imkansız hale getirdi. Bu nedenle, en iyi yarışmacılara verilen ödül sayısını artırmaya karar verdik. Başlangıçta, en büyük ödülün - bir çift AirPod'un - yalnızca en iyi yarışmacıya gitmesi gerekiyordu. Sonunda, ilk altı sırayı tutanlara AirPods verildi.
Mütevazı Başlangıçlar ve Vahşi Sonlar: Bazı JavaScript Kodlama Mücadelesi İstatistikleri
En yüksek puanlı oyuncularımız bile başlangıçta biraz zorlandılar. Aslında, beş veya daha fazla deneme yapan tüm insanlar arasında, herhangi birinin ilk denemesi için en yüksek puan 645'ti ve bu gruptaki ilk denemelerin medyan puanı sadece 25 puandı.
Yarışmanın sonunda, toplam deneme sayısından denenen strateji tahmin edilebilir. Bazıları diğerlerinden daha verimli olsa da, açık ara en iyi yarışmacı en yüksek deneme sayısına sahipti.
İlerlemek
Gelecek ne gösterir?
Bu, yalnızca ilk JS kodlama meydan okuma yinelemesiydi. Gelecekte çok daha fazla JavaScript programlama mücadelesi yapmak, önceki çalışmalardan dersler çıkarmak ve onu daha da heyecanlı hale getirmek istiyoruz. Yapmak istediğimiz ilk şey, gönderim sayısını sınırlamak için girişim azaltma uygulamaktır. Ayrıca JavaScript'teki kodlama zorluklarının ötesine geçerek onları çok çeşitli programlama dillerinde kullanılabilir hale getirmek istiyoruz.
Son olarak, JavaScript kodlama mücadelesini daha güvenli hale getirmek için önlemler alırken, gelecekteki zorluklar için botların ve diğer yaratıcı yaklaşımların kullanımına izin vermeye devam etmeyi planlıyoruz.
Pavel Vydra, Anton Andriievskyi, Tiago Chilanti ve Matei Copot'a mücadeleye ve bu makaleye katkılarından dolayı ve yarışma uygulamasının temelini oluşturan açık kaynak projesi için @Zirak'a özel teşekkürler. Aynı şekilde, yarışmaya katılan ve koşan herkese teşekkürler.