Як воно — працювати творцем контенту на LeetCode, і чи справді задачі з платформи — «квиток до FAANG». Розмова з українським розробником

Богдан Штепан — Back-end Software Engineer, який у жовтні 2021 року підписав контракт щодо створення контенту для LeetCode, однієї з найвідоміших платформ із завданнями для розробників, що набула репутації «вхідного квитка» до FAANG. Ми поговорили з ним про роботу, «золотий стандарт FAANG» у вигляді задачок, особливості контракту з LeetCode та інсайди щодо розвитку порталу.

Як я потрапив у розробку та ознайомився з LeetCode

Я довго не асоціював себе з ІТ. Більшість людей з мого оточення починали кар’єру айтівців зі шкільного віку і згодом цілеспрямовано вступали на факультети інформатики та комп’ютерної інженерії. Мені ж займатися розробкою як фахом геть не хотілось — програмісти здавались мені «красноглазіками», які не мають життя. Я ж мріяв про роботу, де потрібно буде багато спілкуватись і подорожувати.

Однак технологіями все одно цікавився як хобі. Хотів знати, як усе працює — від браузера до десктопних програм. У 2007–2008 роках ми разом зі шкільним другом намагалися відкрити мобільний сайт. У старшій школі я почав порпатися у С# та .NET. Сидів на спеціалізованих форумах у мережі, ставив багато дурних запитань і читав книжки, які мені там радили.

І попри все це, програмістом я себе не бачив. Після закінчення школи вступив до Одеської національної академії харчових технологій, вивчав мікробіологію. Але в навчанні швидко розчарувався — у нас у країні не найперспективніша харчова промисловість. Тож переді мною постало питання, чим займатись у житті. Та й певні сімейні обставини підштовхнули до пошуків роботи.

І я вирішив повернутись до розробки. У шкільні роки мені це легко давалось, а сам напрям був доволі перспективним. До того ж я мав друзів з ІТ і міг наочно порівнювати рівень заробітків в цій та інших галузях. Вибір був очевидним.

Так, на другому курсі університету, у 2011–2012 роках, я заглибився в розробку. Почав вивчати PHP та Web-програмування і вже за рік став проходити співбесіди в одеських конторах. На той час мій стек складався з PHP, HTML, CSS, JavaScript, jQuery. Щодо рівня сказати важко, але на позицію інтерна я влаштувався. Протягом 4–5 місяців працював спочатку як HTML-кодер, згодом — як JavaScript Developer.

Втім поєднувати роботу в офісі та денну форму навчання було складно. Тож із часом я перевівся на заочку й перейшов на фриланс. За близько 2,5 року фрилансу попрацював із купою технологій і стеків — C#, .NET, ASP.NET, PHP, MySQL, JavaScript тощо. А у 2013–2014 роках, на піку розвитку Front-end як окремої галузі ІТ-сектору, мій фокус змістився на цей напрям.

Тож коли я вирішив перейти на офісну роботу, то шукав позиції Front-end Developer рівня Middle. Переїхав до Києва, проходив багато співбесід. Врешті мені запропонували приєднатись до нідерландської компанії Daxx, яку згодом викупила Grid Dynamics. Я пропрацював там близько шести років, а потім перейшов до Exabeam.

Вже там я не обмежувався фронтенд-розробкою: спробував програмувати на Scala, Go, Python і ще купі мов та технологій. Тож зараз я себе характеризую як Generalist Developer — є такий напрям у західному ІТ, коли вас наймають не як програміста конкретної мови, а як інженера, який виконуватиме конкретні задачі, від яких вже залежатимуть стек, технології й мови.

У цій же компанії я зустрів багато ініціативних людей, які прагнули виходити на новий рівень і йшли до інтернатури в компанії FAANG, часто з метою закріпитися там на фултайм. Зацікавився цим і я. Тоді ж дізнався про LeetCode. Хоча мушу одразу зауважити: не можна сказати, що моє подальше знайомство зі світом алгоритмів і структур даних зав’язувалось тільки на бажанні працювати в FAANG.

Я зареєструвався на платформі у 2018 році, а активно розв’язувати задачі там почав два роки тому, коли світ накрив COVID-19. Вирішив, що теж хочу попробуватись у FAANG, перевірити свої шанси. І розв’язування задачок на LeetCode стало маленькою частиною цієї підготовки. Врешті це перетворилось на щоденну «розминку для розуму» для власного задоволення, а не щоб кудись потрапити.

Задачі розв’язував на різних мовах. Спочатку — на JavaScript і Python. Згодом перейшов на Go. Волів розібратися з низькорівневим програмуванням, а саме С++ — для мене вона була «святим Граалем» розробки. Наразі С++ — це перша мова, на якій я виконав понад 1000 задач, і хочу продовжувати в неї заглиблюватись.

Хто такі творці контенту на LeetCode і як я потрапив до їхніх лав

Творці контенту на платформі — це розробники з усього світу, які співпрацюють з LeetCode здебільшого на контрактній основі та поєднують це зі своєю основною роботою. Позиції творців контенту на платформі відкриті завжди.

Самі креатори діляться на певні категорії: творці задач, творці едиторіалів (розв’язок до них), модератори.

Є також контент-креатори, які займаються картками колаборацій із компаніями — різні фірми повідомляють про процес їхніх інтерв’ю і дають завдання для підготовки. Крім того, LeetCode планує запустити розділ з технічними статтями, і туди також потрібні творці контенту.

Я не планував ставати креатором на LeetCode — тим паче я не проходив за деякими вимогами. Наприклад, аби податися у творці контенту, ваш контест-рейтинг мав бути вищим за 1800. У мене цього не було.

Та попри це, коли мій лічильник перетнув позначку в 1000 вирішених задач, представники LeetCode самостійно зі мною зв’язалися. Вони були вражені, що я за короткий час розв’язав понад тисячу задач, ще й публікував свої рішення на форумі порталу. Мені запропонували контракт як контент-креатору, який створюватиме розв’язки до задач, які нині додаються.

У LeetCode є проблеми з едиторіалами — до більшості задач їх немає, тож користувачу не завжди зрозуміло, як розв’язати ту чи іншу задачу належним чином. Бувало, що на LeetCode давали неоднозначні задачі на контесті, і люди не могли їх вирішити. Відповідно, рейтинг, який був нарахований за цей контест, LeetCode був змушений анулювати. Здебільшого йдеться про задачі важкого рівня, та все ж...

Тому платформа активно шукає людей, які створюватимуть і самі задачі, і рішення до них. Мені також запропонували брати участь у написанні статей. Аби не дублювати інформацію під кожною задачею про те, як працює quick select/quick sort тощо, можна написати окрему статтю й показати все це інфографікою.

Яким є контракт контент-креатора в LeetCode

Мій контракт передбачає оплату за певні дії. Наприклад, за кожну додану або промодеровану задачу вам платять конкретну суму. А також є певні часові рамки. Зазвичай на тиждень накидають 2–4 задачі. У вас є два дні, щоб «відмітитись» під кожною задачею, і потім близько тижня, щоб завершити роботу.

Але я не чув про якісь санкції за порушення цих термінів. Не відгукуєтеся на поставлене завдання — його призначать іншій людині. Немає такого, що якщо ви не виконали завдання за тиждень чи не відгукнулися за 48 годин, вас звільняють. До всього ставляться з розумінням.

Період контракту не прописаний, тобто теоретично він безстроковий. Спочатку ви маєте пройти місячний випробувальний термін зі зменшеним розміром оплати, і якщо все окей, підписуєте контракт на постійній основі.

Важливий нюанс — треба розуміти, що на LeetCode не щодня додаються задачі чи рішення. Це робота на якість, а не на кількість. І буває, що у вас протягом кількох тижнів немає задач. Тож це точно не стабільний і регулярний дохід на кшталт основної роботи.

Як на LeetCode додають задачі

Саме задач на LeetCode я додав лише три, ще коли був звичайним користувачем. Якось читав книжку Cracking the Coding Interview — це щось на кшталт трохи застарілої «Біблії з підготовки» до FAANG. Знайшов там кілька цікавих задачок на бітові маніпуляції й додав на платформу. Раніше задачі на LeetCode могли додавати звичайні користувачі, але через низку проблем їхньою розробкою вирішили займатися всередині компанії.

Написати умову та кілька тест-кейсів до задачі зазвичай не складно. Питання можуть виникати при підтягуванні задачі під різні мови програмування, бо environment різних мов працює по-різному.

Наприклад, С++ швидка, і для неї потрібно максимально затягувати constraints (обмеження), аби неоптимальні розв’язання задач не проходили. А Python досить повільний, для нього варто максимально послабити обмеження, інакше розв’язки задач не проходитимуть.

Але один розробник зазвичай ознайомлений лише з кількома мовами програмування, й однаково якісно підігнати задачу під усі понад 20+ мов, які доступні на LeetCode, йому важко.

Інженер, який програмує на Java і С++, уважно створить і перевірить задачу на цих мовах, але підганяючи її під параметри Go, може пропустити суттєві нюанси. І ось ця задача потрапляє на контест, у розробника на Go вона не працює або ж працює неправильно, і це руйнує людині рейтинг. Таких випадків було чимало, саме тому команда платформи вирішила взяти створення задач суто на себе.

Щодо оптимальності розв’язків, то зазвичай Easy-задача «проходить» навіть з O(n^4) складністю алгоритму, а то й більше. Medium-задачі часто мають «стелю» квадратичної складності алгоритму, хоча є і винятки. Hard — це лінійна та лінійно-логарифмічна складність. Хоч є Hard-задачі з невеликим полем пошуку, де може пройти й не найбільша поліноміальна складність алгоритму. Яскравий приклад — NP-hard/complete задачі, які не мають детермінованого поліноміального алгоритму. Тому для них величина вхідних даних обмежена, щоб задачу можна було вирішити повним перебором.

Щодо порядку дій, то ось як все відбувається:

  • Контент-креатор, який створив задачу, має підігнати її під усі мови програмування і протестувати, чи на кожній із них вона справно працює. Здебільшого цей процес автоматизований, але constraints підтягуються вручну.
  • За цим іде етап модерації, яку одна за одною проводять дві чи три людини. У LeetCode є своя організація на GitHub, де адміністратори призначають модераторів для різних задач. Переважно це люди з різними стеками, які дещо перетинаються, аби модерування було максимально якісним.
  • Усі модератори перевіряють, чи все працює різними мовами програмування, чи всі назви написані правильно, чи немає логічних помилок тощо. Це кілька свіжих поглядів на роботу людини, яка створила задачу. При цьому кожен модератор безпосередньо комунікує з креатором задачі, додає зауваження та очікує на виправлення тощо.
  • Фінальний етап модерації проводить адміністрація платформи і вирішує, чи публікувати цю задачу. При цьому рідко коли задача одразу потрапляє в базу LeetCode — спершу вона проходить через контести, і лише деякі унікальні на платформі задачі додадуть у базу.

Від чого залежить рівень складності задачі

На LeetCode є три рівні задач за складністю: Easy, Medium та Hard. Але насправді ці позначки досить умовні, а задача може «плавати» поміж різними рівнями.

🟢 Easy — найбанальніші задачі. Наприклад, потрібно знайти два числа в масиві, які сумуються до певного третього числа. Але також задачі легкого рівня можуть вимагати специфічних знань алгебри або геометрії. Адміністрація LeetCode вважає базовим знанням якусь формулу зі шкільної програми, але серед розробників є чимало людей, які з математичними формулами на «ви», бо банально їх не пам’ятають. І ось уже легка по суті задача становить складність.

🟡 Medium — задачі на певні нескладні алгоритми та структури даних. Часто вони складаються з двох задач рівня Easy, і для їх розв’язування потрібно зробити дві різні маніпуляції. Наприклад, відсортувати дані, а потім ще щось виконати із цим відсортованим масивом.

🔴 Hard — багатокомпонентні задачі. Часто вони складаються з комбінацій трьох і більше задач рівня Easy та Medium. Що більше алгоритмів, структур даних та концептів потрібно для розв’язання задачі, то вона складніша.

Бувають винятки, коли Hard-задачі вимагають специфічного знання математичної формули — «сакрального знання», недоступного більшості. Але їх небагато.

Основна різниця між рівнями Medium і Hard полягає в тому, що для Hard-задач виставляють «тугі» обмеження. І якщо для Medium-задачі може підійти розв’язок банальним сортуванням вхідних даних, пошуком результату відсортованих даних і поверненням цього результату, то для задачі рівня Hard сортування не буде вважатись оптимальним рішенням. Тут від вас очікуватимуть застосування складніших алгоритмів у структурах даних.

Рівень складності задачі на LeetCode зазвичай визначають модератори. Але він коригується й може змінюватись після публікації. Адміністрація дослухається до дискусій розробників під задачами, і якщо якась із них виявилась переоціненою щодо рівня складності або ж недооціненою, то рівень задачі змінять на користь користувачів.

Як створюють едиторіали — розв’язки до задач

Розв’язки до задач додає окрема контент-команда. При цьому це не просто шматок коду, а детальне описання алгоритму з поясненнями та примітками, прикладами. І, звісно, результативний код, який задовольнить систему.

За правилами LeetCode, для кожної великої задачі має бути мінімум два розв’язки, краще — три.

🤔Найперший і найочевидніший варіант — так званий метод brute force («груба сила»), який доступний практично кожному і який, найімовірніше, не пройде за обмеженнями задачі. Він потрібен, щоб мотивувати користувача. Мовляв, грубим чином задача могла бути вирішена отак, але з цієї чи іншої причини це не працює.

🤔Другий розв’язок — це більш оптимальне рішення. Не ідеальне, але таке, що буде прийняте системою. Таке рішення не вимагає сильних знань в алгоритмах і структурах даних.

🤔Третій розв’язок — максимально оптимальне рішення, яке зазвичай спирається на специфічні та глибокі знання людини щодо структур даних та алгоритмів. На інтерв’ю в компанії на кшталт Google чи Facebook від вас, найімовірніше, очікуватимуть третього типу розв’язку. Тож задачі від них зазвичай непросто виконати.

Як компанії співпрацюють з LeetCode

LeetCode часто створює контести з колабораціями. Йдеться про рейтингові змагання з розв’язання задач. Вони відбуваються раз на тиждень, і під час змагання потрібно за 1,5 години розв’язати чотири задачі — одну Easy рівня, дві Middle та одну Hard. Залежно від того, наскільки швидко та якісно ви їх виконаєте, додадуть певну кількість балів.

Останнім часом LeetCode робить контест-рейтинги в колаборації з іншими компаніями. Якщо людина посіла хороше місце в такому змаганні, її електронна пошта стане доступною компанії-партнеру, яка може з нею зв’язатись для подальшої комунікації. Нещодавно було кілька контестів, спонсорованих Amazon. Але LeetCode часто робить колаборації і з невеликими компаніями. На платформі є спеціальна форма для компаній, які б хотіли брати участь або створити картки з задачами.

Нині всередині LeetCode відбувається невелика реструктуризація — платформа хоче мати вигляд більш комплексного інструменту в підготовці до інтерв’ю, а не лише збірника задач. Це допоможе охопити значно ширшу аудиторію та покращити фінансові показники. Тож, імовірно, LeetCode частіше співпрацюватиме з компаніями.

Чи справді джунам нічого робити на LeetCode через складність задач

Усе залежить від мислення спеціаліста та того, як він звик розв’язувати задачі. Людина може бути джуном, але розв’язувати задачі рівня Medium тощо. Знову ж таки, рівні задач на платформі умовні.

Коли я починав, у мене майже не було знань зі структури даних і алгоритмів, я наново за книжками проходив дискретну математику. Для багатьох людей розв’язувати задачі на LeetCode спершу важко, незалежно від рівня сеньйорності.

Але це навичка, над якою можна працювати, тож не варто розчаровуватись після перших невдач. Колись і для мене задачки рівня Easy були важкі, а зараз розв’язувати їх — це як лускати насіння, навіть код перевіряти не потрібно.

Але не варто вводити себе в оману, що стати гарним розробником можна на самих лише задачках на LeetCode. Це дуже специфічне, абстрактне знання. Я не можу сказати, що воно не потрібне: якщо ви працюєте над високими технологіями, де ваш застосунок має працювати швидше, ефективно розпоряджатись пам’яттю й ресурсами системи, то практика задачок допоможе зрозуміти, де і які алгоритми застосовувати. Але для розвитку себе як фахівця однозначно потрібні ширші навички.

Чи гарантує хороший досвід на LeetCode потрапляння до компаній FAANG

Важливу роль відіграють поведінка людини, її реакція на конфліктні ситуації, лідерські якості та самостійність — і, так, вміння розв’язувати задачі. Але більшість топових компаній не вимагають від кандидата конкретних знань, там ніхто не хоче вас завалити. Немає такого, що вас покликали на співбесіду, аби дати задачу на алгоритм, який знає 10 людей. А потім, коли вирвете на собі все волосся, розчаровано сказати: «Ви нам не підходите».

Їхнє завдання — відібрати найкращих. Людині дають задачу, часто середнього рівня, і спостерігають за її розв’язком. Я часто чув про випадки, коли кандидат не написав код, але яскраво продемонстрував алгоритм розв’язання цієї задачі та чітко описав її результат. І такі люди отримували офер.

Задачі на LeetCode — це лише маленька та, ймовірно, найлегша частина підготовки до співбесід у топові компанії.

Торік я пробувався у FAANG, ходив на інтерв’ю до більшості з компаній. У деяких пройшов до кінця на онсайтах. На той час у мене за плечима було понад 800 розв’язаних задач і набита рука на алгоритмах і структурах даних. Але мене не взяли, попри те, що я отримував позитивний відгук про розв’язки.

Просто тому, що задачі хоч і допомагають пройти інтерв’ю, але врешті не дають вам вирішальної переваги перед іншими кандидатами. Успішне розв’язання задач — не означає 100% гарантію кудись влаштуватися. Так, в Amazon і Snapchat я не пройшов поведінкове інтерв’ю, в Google не розв’язав задачу, у Facebook написав кривий код для задач (а для них це дуже важливо).

Та радує те, що важливі для мене компанії дали крутий фідбек з поясненнями, де варто краще готуватись і кликали на повторне інтерв’ю після бан-періоду.

А ви працюєте з LeetCode? Пишіть у коментарях ваші враження про активність на платформі.

Маєте важливу новину про українське ІТ? Розкажіть спільноті. Це анонімно.І підписуйтеся на Telegram-канал редакції DOU

👍ПодобаєтьсяСподобалось17
До обраногоВ обраному6
LinkedIn



12 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

А скільки задачок треба розв’язати з LeetCode, що б у веб версії ФБ при програванні відео у стрічці, коли виставляєш рівень звуку і намагаєшся розвернути відео на повний екран, то зберігався би попередньо встановлений рівень гучності, а не завжди виставляється у 100% (але повзунок залишається на умовних 30%)?

Ви нє понімаєтє, ето другоє!

All jokes aside, думаю, це питання більше до продактів, ніж до інженерів. Цьому багу щонайменше років 5 і я сумніваюсь, що про нього не знають.

Ну!
А что по капусте?
Доброго вечора, ми з ДОУ)

А в мене 100++ вирішенних задачок, витратив на це все життя і вже забув, що було на початку та всередині. Швидкість наближення до пенсії вище, чим до тих усіх фаангів :) Але я не здаюся.

просто «все життя» і «вже забув, що було на початку та всередині» якось із сотнею задач не в’яжеться. Можливо не вистачає теоретичної підготовки та систематизації? На літкоді є цілком непоганий roadmap по якому можна пройтись і зачепити плюс-мінус усі теми.

В цілому ІМО не так багато інтерв’юєрів, які вимагають знання якогось суперкрутого алгоритму. На інтерв’ю навряд чи потрібно буде повертати червоно-чорне дерево. Той клас задач, на який найбільше скаржаться — динамічне програмування, — це переважно просто про вміння ділити задачу на менші та бачити як процес використовує попередні дані для нових обчислень. Як на мене, це потрібний скіл для погромізда.

не вистачає теоретичної підготовки та систематизації

саме так і є (про все життя я трошкі перегнув з ціллю донести глибину своїх страждань)

LeetCode перетворився на такий собі стандарт де-факто для інтервʼю в топові компанії і це велика пічалька для людей, у яких є реальний досвід роботи, але нема сотні годин для підготовки. Так, я чув, що є люди котрі можуть сходу без підготовки вирішувати 2 хард задачі за 45 хвилин, та думаю таких 0.001% від всіх кандидатів. А так більшість просто завчають рішення задач абоа підхід (благо leetcode premium дає можливість подивитися найпопулярніші питання по компаніях), а потім на інтервʼю вдають, що бачать задачі перший раз в житті.

Disclosure: навирішував 400+ задач, в основному медіум та ізі, трохи хард. Сумарно десь витратив півроку.

Я гадаю, що розробники, які сходу без підготовки зможуть вирішити Hard — готувалися теж до цього багато років, наприклад, в олімпіадному програмуванні.
А після багатьох годин роботи в розробці кожен день пилити після роботи ще й LeetCode — так, звісно, важко за це засісти. :(
Але якщо є бажання кудись розвиватися — то це потрібно, я вважаю. Аби не вигоріти :)

А після багатьох годин роботи в розробці кожен день пилити після роботи ще й LeetCode

/s/после/вместо

Підписатись на коментарі