Разрушение мифов о соревновательном программировании - вам не нужно этому учиться

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

Что такое соревновательное программирование?

Соревновательное программирование - это спорт. Вы должны решить проблему с помощью кода, который является быстрым, потребляет минимальный объем памяти и часто практически не читается.

Он очень популярен среди студентов университетов и тех, кто пытается попасть в крупные компании, прежде всего потому, что помогает им попасть в эти компании. К сожалению, миллионы людей нанимаются из-за некоторых знаний, которые они никогда не использовали бы в своей работе.

Система не работает

Вот еще один пример от Хен-Вена:

Я могу придумать множество примеров.

Создатель homebrew - менеджера пакетов, которым пользуются почти все, кто работает с macOS? Отклонено. Создатель WhatsApp? Отклонено Facebook и Twitter.

Так что же здесь происходит? Неужели эти люди недостаточно квалифицированы для работы в этих ТНК?

Нет, ответ в том, что эти ребята могут разрабатывать полезные инструменты и писать отличное программное обеспечение с первоклассным качеством кода, но им, вероятно, не удастся (пере) изобрести алгоритм для инвертирования двоичного дерева за 30 минут.

Некоторые из лучших когда-либо написанных кодов были написаны не за 30 минут. Некоторые из лучших алгоритмов, написанных на ядре Linux, используемом даже сегодня, были написаны Линусом не за 30 минут. Некоторые из лучших пользовательских интерфейсов, такие как Stripe, были разработаны не за 30 минут.

Так как же какой-нибудь случайный специалист по персоналу из какой-то случайной компании может определить вашу ценность за 30 минут?

Именно так компании оценивают вашу «осуществимость» - видя, можете ли вы решить игрушечную проблему, совершенно не связанную с какой-либо работой, которую вы, возможно, выполняли в прошлом, или можете делать в будущем.

Это можно исправить?

Я не знаю. Я могу жаловаться и кричать сколько хочу, но, честно говоря, я не знаю, как компании могут быстро и правильно оценить человека, ищущего работу.

Если вы хотите побыстрее, вы потеряете много хороших кандидатов, подобных упомянутым выше. Если вы не хотите терять хороших кандидатов, собеседование может длиться слишком долго - намного дольше, чем компания может себе позволить.

Соревновательное программирование! == Программирование в реальном мире

Собеседования для компаний - это скорее экзамен, на котором вы должны запомнить и узнать о вещах, которые вы не будете использовать после получения работы.

Вы думаете, что вам, возможно, потребуется изучить алгоритм Дейкстры для работы с Google Maps, но если серьезно, думаете ли вы, что Google собирается передать один из своих основных продуктов кому-то новичку в компании? Вы думаете, что вам не помогут?

Вы, вероятно, будете работать над интерфейсом продукта или распределенными системами, а не над одним из алгоритмов Google Corp. Это означает, что все ваши знания о "конкурентном программировании" бесполезны.

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

Уменьшение размера и улучшение производительности происходит позже, причем большую часть времени используют автоматизированные инструменты. Скорее всего, если вы конкурентоспособный программист, у вас выработалась дурная привычка писать уродливый код.

Кто угодно может писать код для машин. Вопрос в том, можете ли вы писать код для людей?

Но есть надежда

Сидеть на таких собеседованиях и надеяться, что вы сможете решить игрушечный вопрос, который вы готовили в течение 3-5 месяцев, изучая только DSA и соревновательное программирование, - это один из способов.

Есть другой способ - он будет работать с меньшим количеством компаний и людей, но он вам понравится и вы узнаете много вещей из реального мира по пути. Вы также будете более полезны, чем те люди, которые изучают «конкурентное кодирование» только ради этого.

Постройте что-нибудь. Что-нибудь. И затем надстройка над этим. Имейте сильное портфолио. Иметь полный набор навыков, который пригодится компаниям. Овладейте технологическим стеком - владейте им. Создавайте проекты, блоги, опыт, чтобы показать, что вы то, что написано в вашем резюме. Налаживайте связи, общайтесь с людьми, спрашивайте их рекомендаций.

Во многих местах конкурентное кодирование - не единственный способ пройти собеседование - самые разные люди руководят самыми разными компаниями. Человек, который согласен с моим PoV и руководит компанией, не будет нанимать людей только на основе их «конкурентных» знаний.

Ваша работа может доставить вас в такие места, о которых вы не могли даже представить. Самый простой способ - всегда следовать за толпой. Но ничего хорошего не бывает легко, по крайней мере, если вы достаточно амбициозны. Совмещение правильного количества амбиций и смелости может творить чудеса.

Для прогресса и продвижения человечества миру нужны великие программисты, а не люди, которых можно нанять.

Не путайте DSA с соревновательным программированием

Я изначально не хотел писать этот раздел, но знал, что слишком многие люди это запутают. DSA - Data Structures and Algorithms - это нечто иное. Куча, карты, массивы, векторы, связанные списки и т. Д. - все это очень полезно и в реальном программировании.

Самое интересное, что вы тоже можете развить это понимание с опытом. Я так и не узнал о «куче», используя какой-то большой 50-часовой курс DSA. И если вы учитесь программировать, вам не нужно очень глубокое понимание этого.

Если вы хотите изучать информатику, а не программирование, требуется углубленный анализ DSA. Поймите разницу: информатика - это теория, а программирование - это практика.

Будьте в курсе вещей , которые существуют, алгоритмы , которые существуют, и структуры данных , которые существуют. Вам не нужно учить или запоминать их все. Мне кажется безумно глупым запоминать или изучать что-то, что редко используется, когда я могу получить это с небольшой помощью коллег и Интернета.

Моя история

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

Зачем? Потому что я попробовал это 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, и давайте поговорим!