Конкурентне програмування міфу - вам не потрібно вчитися цьому

Тепер, коли у мене є ваша увага з заголовком допису, дозвольте мені детальніше розглянути свої погляди на конкурентне програмування.

Що таке конкурентне програмування?

Змагальне програмування - це спорт. Вам доведеться вирішити проблему з швидким кодом, який споживає мінімальний обсяг пам'яті і часто практично нечитабельним.

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

Система зламана

Ось ще один приклад від Хен-Вень:

Є маса прикладів, яких я можу придумати.

Творець homebrew - менеджер пакетів, яким користуються майже всі, хто працює під управлінням macOS? Відхилено. Творець WhatsApp? Відхилено Facebook та Twitter.

То що тут відбувається? Чи ці люди недостатньо кваліфіковані для роботи в цих МНК?

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

Деякі з найкращих написаних кодів не були написані за 30 хвилин. Деякі з найкращих алгоритмів, написаних у ядрі Linux, що використовуються навіть сьогодні, не були написані Лінусом за 30 хвилин. Деякі з найкращих інтерфейсів, такі як Stripe, не були розроблені за 30 хвилин.

То як може якийсь випадковий кадровик у якійсь випадковій компанії визначити вашу вартість за 30 хвилин?

Ось як компанії оцінюють вашу "доцільність" - перевіряючи, чи зможете ви вирішити проблему іграшки, абсолютно не пов'язану з будь-якою роботою, яку ви могли робити в минулому, або можете зробити в майбутньому.

Чи можна це виправити?

Не знаю. Я можу скаржитися і кричати все, що хочу, але я, чесно кажучи, не знаю, як компанії можуть швидко та правильно оцінити людину, яка претендує на роботу.

Якщо ви хочете швидко, ви втратите багато хороших кандидатів, таких як згадані вище. Якщо ви не хочете втратити хороших кандидатів, співбесіда може тривати занадто довго - набагато довше, ніж компанія може собі дозволити.

Конкурентне програмування! == Програмування в реальному світі

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

Ви вважаєте, що вам може знадобитися вивчити алгоритм Дейкстри для роботи на Картах Google, але серйозно, чи думаєте ви, що Google передасть один із своїх основних продуктів комусь новому в компанії? Думаєте, ви не отримаєте жодної допомоги від своїх однолітків?

Ймовірно, ви будете працювати над інтерфейсом продукту або розподіленими системами, а не над одним із відповідних алгоритмів Google. Це означає, що всі ваші знання про "конкурентне програмування" ні до чого.

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

Мініфікація та покращення продуктивності з’являються пізніше, оскільки автоматизовані інструменти багато часу. Швидше за все, якщо ви конкурентний кодер, у вас склалася погана звичка писати потворний код.

Будь-хто може написати код для машин. Питання в тому, чи можете ви написати код для людей?

Але є надія

Сидіти на подібних інтерв’ю і сподіватися, що ти зможеш вирішити іграшкове питання, яке ти готував протягом 3-5 місяців, вивчаючи лише DSA та конкурентне програмування - один із способів.

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

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

У багатьох місцях конкурентне кодування - це не єдиний спосіб очистити співбесіду - всілякі компанії керують різними людьми. Людина, яка погоджується з моїм PoV і керує компанією, не буде наймати людей лише на основі їхніх "конкурентних" знань.

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

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

Не плутайте DSA з конкурентним програмуванням

Спочатку я не хотів писати цей розділ, але знав, що занадто багато людей це заплутає. DSA - Структури даних та алгоритми - це щось інше. Купи, карти, масиви, вектори, зв’язані списки, .etc, все це дуже корисно і в реальному програмуванні.

Найцікавіша частина полягає в тому, що ви також можете розвинути це розуміння досвідом. Я ніколи явно не дізнався про "купу", використовуючи якийсь великий 50-годинний курс DSA. І якщо ви вчитеся програмувати, вам також не потрібно дуже глибоке розуміння цього.

Поглиблений DSA потрібен, коли ви хочете вивчати інформатику, а не програмування. Зрозумійте різницю, інформатика - це теорія, програмування практичне.

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

Моя історія

Я не конкурентоспроможний програміст, мабуть, єдиний студент CS у моєму університеті, який ніколи не торкався конкурентного кодування в коледжі .

Чому? Тому що я пробував це 4-5 років тому і ненавидів. Чому? Тому що я міг бачити, як я витрачаю 3-5 годин дня щодня, вирішуючи проблеми, які нічого мені не дають. Я знав ще одну-дві речі про підхід до наступного питання, але чи цього було достатньо, щоб справити вплив? Це було достатньо, щоб виділитися з натовпу?

Що доброго я робив? Відчувалося, що я марную час на питання, які вже були вирішені. Для всіх це може бути по-різному, але я щасливий, коли бачу, як інші люди використовують те, що я запрограмував (на той час я почав працювати як веб-розробник).

Я просто не міг терпіти свій час, навчаючись чогось, чого ніколи б не використовував у реальному світі. Раніше я брав участь у Google Code Jam та Facebook Hacker Cup ще того часу. Але незабаром мені стало нудно і розчаровано через відсутність кращого слова, і я ніколи не повертався до нього. Влаштування на роботу чи стажування мене не стосувалось, ніколи.

Одного разу я сидів за інтерв’ю в Google у кампусі. Вони провели раунд короткого списку резюме як перший раунд, на відміну від усіх інших компаній, де був перший раунд, зачекайте його, конкурентний раунд кодування. Ну, 7 років веб-розробки та досвіду систем пішли нанівець.

У будь-якому випадку, для Google я був єдиною людиною, яка потрапила в шорт-ліст із середнім балом 7,5 (найвищий середній бал - 10 в Індії). Решта 10-15 людей були вище 8,5 або 9.

Я знову не пройшов конкурентний раунд, але це навчило мене, що проникнути в перший раунд такої компанії, як Google, можна лише за допомогою вашого резюме. Тому над цим важливо працювати.

Висновок

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

Є погляди та думки? Зв’яжіться зі мною в Twitter та Instagram і давайте поговоримо!