Письмо Скотту Хансельману


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

От переводчика


Всем привет, с вами Максим Иванов, и сегодня мы поговорим об одном из постов Скотта Хансельмана (Scott Hanselman), который он написал по причине довольно серьезного и хорошо сформулированного письма к нему. В общем-то, меня вдохновила одна из статей на нашем ресурсе под названием Google-oriented programming. Больше всего мне понравилось то, что в программистах порой может появиться синдром самозванца. Конечно, труды Хансельмана не единственны в этом мире с точки зрения психологии, но он дает четко нам понять, что это нормально. Как он пишет: «Но вот в чем дело. Мы все иногда чувствуем себя обманщиками. Мы все обманщики. Это часть роста. Мы попадаем в ситуации, которые немного сложнее того, с чем мы можем справиться. Но мы справляемся с ними, мы не обманщики, и мы двигаемся к следующему испытанию.» Так давайте же разберемся, какие решения и выводы Скотт предлагает нам в своем посте. Приступим.

Простые правила


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

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

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

Во-первых, помните, что вы не одиноки. Я уверен в том, что мы растем, когда выходим за пределы своей зоны комфорта. Если это не ломает нас напрочь.

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

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

В-четвертых, думайте о проблеме глубже. Читайте об алгоритмах, читайте лучшие книги по программированию и проектированию. Вместо того, чтобы бездумно копировать код со Stack Overflow или копировать код крутого программиста.

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

А что вы думаете?

Популярные комментарии на habrahabr


koceg:
Я стараюсь много читать, причём книги из самых разных областей программирования. У меня нет цели запомнить всё или начать использовать эти знания на следующий день. Моя цель — расширять кругозор, чтобы когда появится необходимость, я знал в какую сторону копать. А сам этот процесс всегда начинается с поисковика.


splatt:
Я программирую вот уже почти 10 лет, и я признаюсь вам честно — за все это время я не дочитал ни одной книги по программированию. Я просто начинаю засыпать, когда читаю их, и усвоение материала начинает стремиться к нулю. В результате начинаешь просто пролистывать и искать то, что тебе более интересно и понятно. Мне кажется, это личное предпочтение. Лично мне вот не нравится сам формат книги, но я с удовольствием посмотрю видеоуроки и полистаю официальную документацию, что бы «включиться» в новый фреймворк или технологию. Для меня это тоже самое, что и книга, но гораздо быстрее. Ну и да — никакая книга не заменит вам практику, технику «просто возьми и начинай что-то делать (тестовый проект, todo list, и тд), решая задачи по мере поступления».


Scf:
С позиции опытного разработчика:
Гуглить что?
Чаще всего я гуглю тексты ошибок и куски стектрейсов
Затем — тёмные или подзабытые места фреймворков типа "hibernate declare composite key". Если мне нужно начать использовать новый фреймворк, я предпочту потратить день и прочитать официальную документацию.
И никогда — чужой код. Чужой код при решении проблем нужен только для того, чтобы изучить те API, которыми он пользуется для решения проблемы.
Исключение — это реализация достаточно сложных алгоритмов типа BCrypt, но и там не стоит брать первый попавшийся кусок.

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


vlreshet:
Старый анекдот:

Физику, математику и инженеру дали задание найти объём красного мячика.
Физик погрузил мяч в стакан с водой и измерил объём вытесненной жидкости.
Математик измерил диаметр мяча и рассчитал тройной интеграл.
Инженер достал из стола свою «Таблицу объёмов красных резиновых мячиков» и нашёл нужное значение.

Вот так и у программистов. Хороший программист всегда сначала попытается нагуглить объём красного резинового мячика, вместо долгого и тернистого пути по поиску объёма самостоятельно. Зачастую нет смысла рыться в документации если тебе нужен чёткий ответ всего на один вопрос — проще нагуглить этот ответ, и работать дальше.


Комментарии к оригинальному посту


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

К прочтению:

1. Является ли гугление плохой практикой?
2. 10 лучших сайтов с головоломками для программистов
3. Коаны о программировании
4. Питер Молинье о своей карьере
5. Is Googling a bad practice for doctors?
Поделиться с друзьями
-->

Комментарии (51)


  1. gena_glot
    24.05.2016 23:27
    +3

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

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

    То есть решать по одной схеме «гуглить — не гуглить неправильно». Иногда придется прогуглить 3 разные вещи, и из них слепить решение.


    1. jMas
      24.05.2016 23:33

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


    1. darkAlert
      25.05.2016 11:35
      +3

      Страшно становится тогда, когда ты нашел на stackoverflow схожий вопрос, но на него никто так и не смог ответить…


      1. timiskhakov
        25.05.2016 12:29
        +6

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


        1. PavelMSTU
          25.05.2016 14:31
          +2

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


          1. Randl
            28.05.2016 11:34

            понимаешь, что пока 3 дня ковырял — ты реально вырос.

            Обычно, что я понимаю, что я невнимательный идиот.


      1. Avenger911
        25.05.2016 15:36
        +1

        Зато как приятно, продравшись через дебри, написать ответ на этот вопрос =)


    1. GarifZZ
      26.05.2016 22:57

      из крайности в крайность сэр!


  1. BaDP1nG
    24.05.2016 23:33

    Мне Гугл даёт очень многое, особенно с того момента, как я сел за swift. Учитывая довольно активное развитие этого языка всегда стоит отслеживать так называемые «best practices».


  1. BaDP1nG
    24.05.2016 23:36
    +2

    А, ну и ещё Гугл отлично сбивает спесь: только ты начинаешь думать, что так круто и хитрО решил какую-то задачу, как Гугл подкидывает вариант не хуже, а то и лучше.)))


    1. darkAlert
      25.05.2016 11:25

      а зачем вы решаете такие задачи, какие уже решены в гугле? Вроде как решать своими силами нужно то, что в гугле не нашлось.


      1. DnV
        25.05.2016 12:50
        +3

        Многие задачи проще и/или надёжнее решить самому, чем воспользоваться чужим решением.


        1. darkAlert
          25.05.2016 15:28
          -1

          велосипед?

          p.s. я не против них, но общество почему то против.


      1. BaDP1nG
        25.05.2016 14:43

        К сказанному оратором выше мог лишь добавить: а) реально уникальных проектов под мобильные платформы практически нет б) когда я начинал писать диссертацию и, соответственно, программу симуляции для кхм… демонстрации алгоритма, то вносил некую инновационность, через пару лет схожие алгоритмы(местами немного лучше или хуже, не суть) увидел у своих «коллег» из других институтов. Так что даже то, чего не нашлось в гугле сегодня, через пару дней/месяцев вполне может там появиться и в улучшенном виде.


  1. wOvAN
    24.05.2016 23:51

    Помню время до широкополостного интернета, когда просто сидишь и пишешь программу. (((


    1. dottedmag
      25.05.2016 10:11

      Библиотеки и документация тогда были оффлайновые по умолчанию.


    1. yul
      25.05.2016 11:35
      +1

      Пока не появится какой-то хитрый баг, и сидишь, ковыряешься в доках и дебаггере. А это для начинающего программиста было 95+% времени. Дальше лучше, конечно, но все равно…
      Плохое быстро забывается.


    1. trikadin
      25.05.2016 19:06
      +1

      <offtop>
      "широкополостной" — это с широкими полостями)
      </offtop>


  1. HappyGroundhog
    25.05.2016 00:36
    +4

    Не совсем в тему программирования, но близко. Преподавал студентам основы сисадминства. На лабах принципиально не существовало методичек. Было задание выданное за неделю, был комп с виртуалкой, был гугл. Все как в жизни) А дальше все делились на думающих и тех, у кого не работали тупые копи-пасты из интернета… Потому, что как гласит старая мудрость «Чтобы правильно задать вопрос, надо знать больше половины ответа». В программировании очень похоже, stackoverflow это великолепно, но больше половины ссылок надо отсеять сразу же, т.к они не совсем о том, что тебе нужно или это решение похожей, но не твоей ситуации. А в твоей оно иногда еще и наоборот вредное. Вот для этого нужно разбираться в предмете! Так и на экзаменах, честно говоря, тоже давал пользоваться всем) Но это мало кому помогало без понимания предмета…


    1. stalkers
      25.05.2016 10:45

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


    1. akaDuality
      25.05.2016 12:00

      Я думал что в оригинале «правильный вопрос уже содержит половину ответа», но ваш вариант тоже хорош


      1. HappyGroundhog
        25.05.2016 16:13
        +1

        Мы оба оказались неправы)
        Это цитата из Роберта Шекли «Вечный вопрос»

        «Ничего более конкретного они не добились. Долгие часы они мучили Ответчик, мучили себя, но правда ускользала все дальше и дальше.
        — Я скоро сойду с ума, — не выдержал Морран. — Перед нами разгадки всей Вселенной, но они откроются лишь при верном вопросе. А откуда нам взять эти верные вопросы?!

        Один на планете — не большой и не малой, а как раз подходящего размера — ждал ответчик. Он не может помочь тем, кто приходит к нему, ибо даже Ответчик не всесилен.
        Вселенная? Жизнь? Смерть? Багрянец? Восемнадцать?
        Частные Истины, полуистины, крохи великого вопроса.
        И бормочет Ответчик вопросы сам себе, верные вопросы, которые никто не может понять.
        И как их понять?
        Чтобы правильно задать вопрос, нужно знать большую часть ответа.»

        Кстати рекомендую прочитать, он очень хорошо дополняет статью и комментарии! Ответчик в рассказе Шекли очень напоминает современный Гугл :)


        1. akaDuality
          25.05.2016 16:15

          Потрясающе, спасибо!


          1. HappyGroundhog
            25.05.2016 16:25

            Да, в оригинале этот рассказ называется несколько иначе. «Robert Sheckley, „Ask A Foolish Question“ и точная фразу звучит как „In order to ask a question you must already know most of the answer“, так что переводы могут отличаться, но смысл остается. Рекомендую прочитать оригинал, он всегда богаче перевода.


  1. qrck13
    25.05.2016 00:56

    Гугл не всегда помогает. Как пример конкретно сейчас я работаю над закрытым продуктом, который не используется нигде за пределами компании, так что довольно часто гуглиь бесполезно — все равно никто ничего не знает про наш стек технологий ;)


  1. Alexeyco
    25.05.2016 03:05
    +1

    Кодишь такой… а потом бац — что-то полез гуглить. Нашел пост(ы) на StackOverflow. Смотрел-смотрел, выругался и написал сам.


    1. gwer
      25.05.2016 10:21
      +9

      Главное — потом в этих постах отметиться.


    1. knagaev
      25.05.2016 12:22

      Такое больше было характерно для CodeProject.
      На SO качество ответов и кода значительно выше.
      Хотя чужой код никогда не вставлял — побаиваюсь :)


      1. wladyspb
        26.05.2016 22:57

        Бояться вставлять чужой код имеет смысл только если не понимаешь что в нём происходит)


  1. SpectarlDragon
    25.05.2016 12:00
    +1

    Я junior, для меня Google — хлеб насущный. Он помогает мне решить мои задачи, уложится в срок. Я не считаю это плохой практикой, так как когда я сталкиваюсь с подобной проблемой, я знаю как её решить. Единственное, я чувствую себя кодером, который ничего кроме кода не делает. Просто набирает код, чтобы начальник был доволен и я уложился в срок. Мне хочется стать программистом. Тем человеком, который сначала тщательно обдумывает архитектуру, а потом пишет прекрасный код. Как будто его руки были омыты слезами тайландских девственниц. Наверное, мне просто нужно больше практиковаться и набираться опыта, так что, Google, я рассчитываю на тебя :)


  1. linakun
    25.05.2016 12:00
    +1

    Я вот стараюсь найти готовую реализацию моей задумки в гугле/гитхабе/гитлабе/etc. Если найду, посмотрю как мыслил автор и перенесу идею в свой проект. Это, конечно, грубо и не интересно, но чего поделать.


  1. IllusionTurtle
    25.05.2016 12:00
    +2

    10 лет в IT, 3-5 в программировании — я только вчера узнал про оператор % (остаток от деления) проходя собеседование которое само собой с треском провалил… я Google-oriented программист, и у этого подхода есть огромный минус — отсутствие фундаментальной базы, получаемые навыки/опыт ограничены проблемами с которыми пришлось столкнуться.


    1. Gorthauer87
      25.05.2016 12:07
      +3

      Это смотря как гуглить. Лучше разок какой-нибудь специально составленый курс пройти с задачками на то на сё, чем чисто с практическими задачами бороться. Все эти курсы же составляют специально, чтобы охватить базу.
      http://exercism.io/


  1. xxvy
    25.05.2016 12:00
    +7

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

    P.S. А ещё очень доставляет, когда находишь ветку форума с обсуждением нужной проблемы, где в конце автор топика пишет «Всем спасибо, проблему решил.»
    И всё.


    1. 1eqinfinity
      26.05.2016 17:47
      +2

      Т.н. «Fermat's last post» :)


  1. VitaliiDel
    25.05.2016 13:56

    Чаще всего я гуглю тексты ошибок и куски стектрейсов… И никогда — чужой код

    А так же сравнительные тесты технологий, фреймворков и т.п. И никогда — чужой код


  1. PavelMSTU
    25.05.2016 14:37

    Уровни профессионализма программиста.

    Уровень 1. Ты понимаешь о чем проблема.
    Уровень 2. Ты умеешь хоть как-то решить проблему.
    Уровень 3. Гугл/Яндекс тебе помогают только как справочники.
    Уровень 4. Тебя перестают материть другие программисты в команде.
    Уровень 5. Не ты ищешь работу, а работа ищет тебя.


    1. SKolotienko
      25.05.2016 14:59

      Уровень 6. Ты уже не пишешь на языке программирования — ты пишешь сам язык программирования.


      1. Shultc
        25.05.2016 16:26
        -2

        Уровень 7. Твоя программа пишет тебя, потому что боготворит тебя и хочет быть похожей на тебя. Она заменяет тебя ботом.


  1. herr_kaizer
    25.05.2016 20:56

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


  1. Bimawa
    25.05.2016 21:06

    Идешь на stackoverflow, а единственный верный ответ, давал ты сам…


  1. Yago
    26.05.2016 00:50

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


  1. slonopotamus
    26.05.2016 00:58
    +4

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


  1. Sergey6661313
    26.05.2016 15:32
    -1

    Иногда документация написана столь плохо, что только гуглинг примеров и спасает. А если к этой платформе ещё и только привыкаешь — то тупое копирование неизбежно, ибо не знаешь как вообще можно писать по другому.
    А если не очень хорошо знаешь английский, то всё программирование вообще в принципе сводится к гуглингу.
    Да и вообще в 21 веке живём вроде. Все виды велосипедов уже давно написали за нас. Плодить новые просто бессмысленно (хотя иногда хочется, чем и занимаюсь на досуге).
    Вообще считаю что проблемы гуглинга именно в отсутствии (адекватной) документации. Потому что если дать человеку топор и лес — он сможет построить дом. Но если дать аборигену не заправленную бензопилу — он никогда не распилит ей дерево. Откуда ему вообще знать что нужен бензин? А в инструкции будет: «для того чтобы завести бензопилу — резким движением потяните за кольцо». Тут только гуглинг поможет…
    Вот и я в программировании чувствовал себя также. Особенно когда только начинал. Берёшь книгу а там: «откройте простым текстовым редактором, бла-бла-бла int main() бла-бла-бла, а теперь скомпилируйте.» А на деле это сработает только с первым примером из книги (если вообще сработает). Окажется компилятор надо сначало найти, скачать, установить, при компиляции указать нужные ключи. Сам редактор может сохранять фаил не в той кодировке. И вот начинает безумно гуглить по каждому пунктику…
    Или например начинаешь по книге изучать объекты. Изучаешь массивы. А как создать массив обьектов? Меня например это ввело очень в большой ступор когда я изучал java. (славу богу сейчас я на python-е сижу)
    И что самое страшное как раз именно гуглинг и не помогает. А всё потому что каждая следующая подсказка — создаёт с 10-ток новых вопросов.
    Во общем негодую я.


    1. Avitale
      26.05.2016 17:31

      А если к этой платформе ещё и только привыкаешь — то тупое копирование неизбежно, ибо не знаешь как вообще можно писать по другому.

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


      1. Sergey6661313
        26.05.2016 21:57
        -1

        А как оно работает? а где посмотреть? А что делать если не знаешь даже где посмотреть?
        Вы вот фреймворками пользуетесь? А лезете по коду глубже чтобы узнать как оно там работает? А если там просто тупые биндинги к готовым библиотекам? А в учебниках об этом пишут? Как узнать в принципе что код работает не правильно? Как узнаёте вы? Вы не пробуете для начало просто запустить чужой код — чтобы проверить а запускается ли он вообще?

        > «не пытаясь понять код»
        Вот скажите вы когда видите
        cout << «Hello world!!!\n»;
        Вам интересно как работает этот код? А если он работает не правильно? А откуда вам знать что именно это правильно?
        А может быть надо:
        cout << «Hello, world!» << endl;
        или ещё хуже:
        puts («Hello, World!»);
        или так:
        printf («Hello, World!\n»);
        Попробуйте поймите. Как дойдёте до уровня ассемблерного кода — решите правильно ли оно работает. Я конечно утрирую. Но когда дело касается вывода строки на экран — все соглашаются, о том что, проще использовать готовый встроенный годами отлаженный функционал, чем писать свой. Я с такой же точки зрения смотрю на чужой код. Если написано «так» — значит кто-то продумал почему именно так а не иначе.

        Когда дело касается незнакомой платформы — один фиг начинаешь с того что берёшь какой нибудь кусок чужого кода и пробуешь посмотреть как он себя ведёт. И никогда заранее не знаешь правильно это или нет. А теперь перечитайте моё сообщение выше: я писал о недостатках документации. Не о решении глобальных экономических проблем страны, а о том что программирование в принципе начинается с того что ты берёшь какой нибудь код и пробуешь его. Естественно при данном действии так называемое «понимание кода» отсутствует.

        > разве чисто самому не становится интересно, как оно работает?
        Если мы опять же будем говорить об решении глобальных экономических проблем — то мне действительно будет интересно как работает рабочий код. Но даже там мне будет интересно не «понять код», а «узнать алгоритм» код которого и осуществляется в каком либо рабочем примере.
        если я не могу посчитать на листочке то что я хочу видеть от программы, то и саму программу я не смогу даже сформулировать. И никакой чужой код мне не поможет.
        А если могу и есть адекватная документация то мне и копировать код не придётся.
        А вот если я знаю чего хочу видеть на экране но не знаю какую команду задать, то тупое копирование — единственный вариант который у меня вообще есть.


        1. herr_kaizer
          26.05.2016 22:15

          Вы просто хотите, чтобы все возможные юзеркейсы разжевывались и клались в рот. Но мы живем в реальном мире — так не бывает.

          А после таких вот копипастов приходится потом разбираться в написанных в разном стиле (а то и парадигме — и такое бывало) кусках кода с излишним или недостаточным функционалом.


          1. Sergey6661313
            27.05.2016 08:11

            > так не бывает.
            Зато бывает как на рисунке с совой. И очень часто. Особенно новичкам. Которые эти ваши парадигмы только изучают…
            не мы такие — жизнь такая… А потом удивляются почему на том же SO тысячи однотипных вопросов.
            Когда на самом деле всем начинающим нужна просто маленькая шпаргалочка в виде таблиц с различными комбинациями.


            1. herr_kaizer
              27.05.2016 16:52

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


              1. Sergey6661313
                27.05.2016 19:22
                +1

                А теперь вернёмся к моему первому комменту: Иногда документация написана столь плохо, что только гуглинг примеров и спасает.


        1. Randl
          28.05.2016 11:39

          Вызывать чужой код и копировать чужой код — это разные вещи.