Каких навыков не хватает программистам-самоучкам?

0
3683
views

Пользователи сайта Quora поделились своим мнением относительно того, чему стоит научиться программистам-самоучкам, чтобы сравняться со своими коллегами, имеющими профильное образование.

Какие навыки упускают программисты-самоучки

Валентин Попеску, Software Architect

Я закончил колледж, где вообще не преподавали ничего, связанного с информатикой. Поэтому я самостоятельно изучал C/C++ и использовал свои знания в личных проектах. Также я принимал активное участие в «open source» проектах, хотя тогда они еще так не назывались. И вот сразу после колледжа я проходил одно собеседование.

Интервьюер попросил меня написать алгоритм для обработки списка. Подробностей я не помню, но с задачей я справился.

Затем у меня спросили, какова сложность этого алгоритма в нотации большого О. Что это еще такое?! Что еще за нотация?!

Дело в том, что я мог справляться с работой, но не мог обсуждать ее, используя правильную терминологию. То есть, я не владел нужной профессиональной лексикой. Я мог бы объяснить, что у моего алгоритма линейное время выполнения, но я не мог это выразить в виде O(n).

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

Когда вы программист-самоучка, вам не хватает профессионального словарного запаса. Со временем он, конечно, нарабатывается, но в начале карьеры его нет. Например, у вас есть какая-то проблема и вы обдумываете наилучший способ ее решения, а позже обнаруживаете, что у этого «наилучшего способа» уже есть свое название. На приобретение нужного словарного запаса могут уйти годы практического программирования.

Была у меня и еще одна интересная проблема. Учился я сам, а руку набивал на open source проектах. В ходе работ над этими проектами общение было письменным, по электронной почте. В результате всего этого я не знал, как принято произносить многие слова. Например, «SQL» я произносил как «es-que-el», в то время как общепринятым был вариант «See-quel». Или вот «I2C» — я произносил «eye-two-see», а нужно было «eye-squared-see».

Лалит Суреш

О, хороший вопрос! Вот несколько моих наблюдений, сделанных за много лет работы:

Незнание того, что есть, а чего нет

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

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

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

Туннельное зрение

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

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

У меня с этим связана личная история. В компании, где я проработал несколько недель, была группа инженеров-самоучек, поддерживавших базу данных, которая, как я заметил, не справлялась с определенными нагрузками. Изучив этот вопрос, я заметил, что некоторые параметры конфигурации были изменены с дефолтных на другие (собственно, это и было причиной проблем). Когда я спросил инженеров, почему они установили такие значения, оказалось, что они настраивали все, руководствуясь какими-то блогами в интернете. Никто из них не представлял последствий установки тех или иных значений.

Именно эту концентрацию исключительно на конечном результате и недостаток понимания картины в целом я неоднократно наблюдал в среде инженеров-самоучек.

Программисты-самоучки

Майк Чиралди, программирую уже больше 50 лет

Был у меня коллега — настоящий кудесник в программировании и при этом совершенный самоучка. Я поначалу тоже был самоучкой, но на момент этой истории (1980 год) как раз только получил степень магистра по информатике.

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

Несколько дней спустя этот товарищ подошел к моему столу — он весь аж сиял, потому что таки нашел способ сделать задуманное. Каждый раз, как его программа обнаруживала под-выражение, она удаляла его из строки, заменяя специальным символом. Я сказал: «Поздравляю! Ты только что заново изобрел машину Тьюринга!» Я ж говорил, что он был настоящим кудесником в программировании.

Дэвид Джиллиес, больше 20 лет опыта в написании и проектировании программ

Все программисты — самоучки, даже те, у кого есть профильное образование. Написание программ это то, чему учишься на практике, а не в аудитории. Так что вопрос вообще некорректен.

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

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

Был у вас конвейер разработки (Agile, Scrum, Kanban и т.п.)? Конечно, нет.

Кто проводил ревью кода, ваш кот?

Вы писали модульные тесты для своего кода? Самоучки никогда не пишут модульных тестов, потому что это скучно и неинтересно.

Вы пишете код в ветках, делаете пул-реквесты, а затем сливаете код обратно в основную ветку? Ага, ага. А вы вообще используете систему контроля версий? Есть у вас сервер сборки? Какова ваша стратегия интеграции? Список вопросов можно продолжить.

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

Конечно, это не значит, что вы должны настраивать Gerrit или Jenkins для управления личными проектами, но вы можете использовать Docker для изоляции вашей работы от вашей системы или завести себе стейджинг- и продакшен-сервер (компьютеры сейчас относительно дешевы). Сделайте написание тестов и их запуск частью вашего процесса разработки. Используйте Git. И когда вы решите поделиться своим творением с миром, вы будете готовы это сделать.

Айвэн Миллер, Data Engineer

Я сам инженер-самоучка. Если вы на самом деле хотите стать высококлассным инженером, вам не обойтись без изучения информатики! Вот некоторые вещи, к которым мне пришлось возвращаться, чтобы изучить, поскольку я не изучал их в университете:

  1. Структуры данных и алгоритмы. Вам НУЖНЫ эти знания, если вы собираетесь разрабатывать программы, не падающие при заходе 10 тысяч пользователей.
  2. Умение решать задачи. Я не имею в виду копипаст со Stack Overflow. Я говорю о решении сложных проблем своей головой. Курсы математики и логики направлены как раз на выработку этого умения.
  3. Знание основ. Например, вам нужно хотя бы высокоуровневое понимание того, как строятся компьютерные сети. Изучение таких тем как сети, базы данных, операционные системы, языки программирования и компиляторы просто чудеса творит с вашей интуицией.
  4. Приобретение инженерского интуитивного «чувства опасности». (В оригинале — «spidey sense». Выражение уходит корнями в комиксы про Человека-паука, у которого появлялось ощущение, что происходит нечто неправильное или опасное. — Прим.перев.). Это ощущение тяжело точно описать, но оно вполне реально. И его нельзя заменить прохождением курсов или умением писать код на JavaScript. Оно поможет вам более эффективно заниматься отладкой кода, продумывать edge cases, проектировать системы и даже высказывать свои мысли!
  5. Математика. Нет, чтобы написать HelloWorld, знания алгебры не нужны. Но математика повсеместно применяется в моделировании проблем, а кроме того, дает вам нужный словарный запас для описания вещей. Математика учит вас решать сложные задачи, а именно этим и занимаются разработчики.
Самообразование

Робин Томас, Senior Software Engineer

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

  1. Многие самоучки на заботятся об эффективности кода. Они просто идут самым легким путем. Если есть 100 решений, они пишут самое простое из них. Алгоритмическая сложность для них ничего не значит.
  2. Под самостоятельным изучением программирования чаще всего понимается самостоятельное изучение синтаксиса языка. И больше ничего. Но информатика это не только программирование, не так ли? Самоучки упускают из виду множество концепций, которые изменили бы их подходы к решению проблем.
  3. Самоучки первыми переключаются на новые технологии, фреймворки и языки. С этим утверждением, конечно, можно поспорить, но это то, что я видел в своем окружении. Это не обязательно плохо. Но следует хотя бы подождать, пока у новинки появится хоть какая-то поддержка, а уж затем переключаться на нее, если это подходит для дела. А не переходить на новое только потому, что кто-то еще этим пользуется.
  4. Большинство самоучек не разбираются в алгоритмах. Они просто привыкли к библиотекам.
  5. Видал я людей, называющих себя программистами-самоучками после прочтения книги «Изучи Х за 24 часа» (вместо «Х» подставьте любой язык программирования).
  6. Многие самоучки не знакомы с шаблонами проектирования, принципами разработки программ и лучшими подходами к разработке.

Фрэнк М. Тейлор, веб-разработчик

Я не столько программист, сколько веб-разработчик, но я написал достаточное количество JS-кода, как для фронтенда, так и для бэкенда. Итак, чего же не хватает программистам-самоучкам?

Скромность

Кто-то уже довольно остроумно отметил, что чего программистам-самоучкам не хватает, так это скромности. Я согласен с этим утверждением.

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

Гордиться тем, что всему научил себя сам, конечно, можно. Только не нужно забывать об ограниченности возможностей вашего учителя.

Алгоритмы

Программирование без знания алгоритмов это как столярная мастерская с одной пилой: с работой вы, может, и справитесь, но времени на это уйдет много.

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

Я потратил четыре дня, чтобы разобраться, как сделать перестановку. И я так гордился собой, когда мне это, наконец, удалось! Аж пока не обнаружил, что Б.Р. Хипс сделал это еще в 1963 году.

Шаблоны проектирования

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

Парадигмы программирования

Ни объектно-ориентированное, ни функциональное, ни реактивное программирование не являются единственно верным путем. Каждое из них — лишь возможный вариант.

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

Если у вас есть молоток, то вам все кажется похожим на гвоздь.

Примените эту пословицу к самостоятельному изучению программирования, и вы поймете, что бьете молотком по гвоздям, шурупам, скобам и своим пальцам.

Один такой программист-самоучка как-то заявил мне, что все, кроме объектно-ориентированного программирования, это вообще не программирование, и потому он не считает JavaScript настоящим языком.

Структуры данных

Конечно, ваш язык программирования даст вам основное понятие о разных структурах данных. Но (заостряю ваше внимание!) это только основная идея.

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

Если бы мир умещался в массив, он был бы невероятно маленьким.

Тестирование

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

Научитесь проводить модульное тестирование. И, что даже более важно, освойте разработку через тестирование. Есть разница между тестированием кода и написанием кода, который может пройти тестирование.

В этом вопросе мне очень помогла книга «Программист-прагматик».

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here