Письмо Скотту Хансельману
«Иногда в моей голове звучит вопрос — действительно ли я разработчик или просто хорошо гуглю. Я не знаю правильного ответа — я гуглер или разработчик. Скотт, пожалуйста, помоги мне выяснить»
От переводчика
Всем привет, с вами Максим Иванов, и сегодня мы поговорим об одном из постов Скотта Хансельмана (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)
BaDP1nG
24.05.2016 23:33Мне Гугл даёт очень многое, особенно с того момента, как я сел за swift. Учитывая довольно активное развитие этого языка всегда стоит отслеживать так называемые «best practices».
BaDP1nG
24.05.2016 23:36+2А, ну и ещё Гугл отлично сбивает спесь: только ты начинаешь думать, что так круто и хитрО решил какую-то задачу, как Гугл подкидывает вариант не хуже, а то и лучше.)))
darkAlert
25.05.2016 11:25а зачем вы решаете такие задачи, какие уже решены в гугле? Вроде как решать своими силами нужно то, что в гугле не нашлось.
BaDP1nG
25.05.2016 14:43К сказанному оратором выше мог лишь добавить: а) реально уникальных проектов под мобильные платформы практически нет б) когда я начинал писать диссертацию и, соответственно, программу симуляции для кхм… демонстрации алгоритма, то вносил некую инновационность, через пару лет схожие алгоритмы(местами немного лучше или хуже, не суть) увидел у своих «коллег» из других институтов. Так что даже то, чего не нашлось в гугле сегодня, через пару дней/месяцев вполне может там появиться и в улучшенном виде.
wOvAN
24.05.2016 23:51Помню время до широкополостного интернета, когда просто сидишь и пишешь программу. (((
yul
25.05.2016 11:35+1Пока не появится какой-то хитрый баг, и сидишь, ковыряешься в доках и дебаггере. А это для начинающего программиста было 95+% времени. Дальше лучше, конечно, но все равно…
Плохое быстро забывается.
HappyGroundhog
25.05.2016 00:36+4Не совсем в тему программирования, но близко. Преподавал студентам основы сисадминства. На лабах принципиально не существовало методичек. Было задание выданное за неделю, был комп с виртуалкой, был гугл. Все как в жизни) А дальше все делились на думающих и тех, у кого не работали тупые копи-пасты из интернета… Потому, что как гласит старая мудрость «Чтобы правильно задать вопрос, надо знать больше половины ответа». В программировании очень похоже, stackoverflow это великолепно, но больше половины ссылок надо отсеять сразу же, т.к они не совсем о том, что тебе нужно или это решение похожей, но не твоей ситуации. А в твоей оно иногда еще и наоборот вредное. Вот для этого нужно разбираться в предмете! Так и на экзаменах, честно говоря, тоже давал пользоваться всем) Но это мало кому помогало без понимания предмета…
stalkers
25.05.2016 10:45Вот это, кстати, очень правильный подход. У нас так живо отсеялись зубрилки, у которых теория прям, что называется, от зубов отскакивала, но на практике как-то не сложилось. Они могли чуть ли не дословно пересказать конспект по курсу «Теория ОС», но задача правильно разбить винт и установить Винду вводила их в ступор.
akaDuality
25.05.2016 12:00Я думал что в оригинале «правильный вопрос уже содержит половину ответа», но ваш вариант тоже хорош
HappyGroundhog
25.05.2016 16:13+1Мы оба оказались неправы)
Это цитата из Роберта Шекли «Вечный вопрос»
«Ничего более конкретного они не добились. Долгие часы они мучили Ответчик, мучили себя, но правда ускользала все дальше и дальше.
— Я скоро сойду с ума, — не выдержал Морран. — Перед нами разгадки всей Вселенной, но они откроются лишь при верном вопросе. А откуда нам взять эти верные вопросы?!
…
Один на планете — не большой и не малой, а как раз подходящего размера — ждал ответчик. Он не может помочь тем, кто приходит к нему, ибо даже Ответчик не всесилен.
Вселенная? Жизнь? Смерть? Багрянец? Восемнадцать?
Частные Истины, полуистины, крохи великого вопроса.
И бормочет Ответчик вопросы сам себе, верные вопросы, которые никто не может понять.
И как их понять?
Чтобы правильно задать вопрос, нужно знать большую часть ответа.»
Кстати рекомендую прочитать, он очень хорошо дополняет статью и комментарии! Ответчик в рассказе Шекли очень напоминает современный Гугл :)
akaDuality
25.05.2016 16:15Потрясающе, спасибо!
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“, так что переводы могут отличаться, но смысл остается. Рекомендую прочитать оригинал, он всегда богаче перевода.
qrck13
25.05.2016 00:56Гугл не всегда помогает. Как пример конкретно сейчас я работаю над закрытым продуктом, который не используется нигде за пределами компании, так что довольно часто гуглиь бесполезно — все равно никто ничего не знает про наш стек технологий ;)
Alexeyco
25.05.2016 03:05+1Кодишь такой… а потом бац — что-то полез гуглить. Нашел пост(ы) на StackOverflow. Смотрел-смотрел, выругался и написал сам.
SpectarlDragon
25.05.2016 12:00+1Я junior, для меня Google — хлеб насущный. Он помогает мне решить мои задачи, уложится в срок. Я не считаю это плохой практикой, так как когда я сталкиваюсь с подобной проблемой, я знаю как её решить. Единственное, я чувствую себя кодером, который ничего кроме кода не делает. Просто набирает код, чтобы начальник был доволен и я уложился в срок. Мне хочется стать программистом. Тем человеком, который сначала тщательно обдумывает архитектуру, а потом пишет прекрасный код. Как будто его руки были омыты слезами тайландских девственниц. Наверное, мне просто нужно больше практиковаться и набираться опыта, так что, Google, я рассчитываю на тебя :)
linakun
25.05.2016 12:00+1Я вот стараюсь найти готовую реализацию моей задумки в гугле/гитхабе/гитлабе/etc. Если найду, посмотрю как мыслил автор и перенесу идею в свой проект. Это, конечно, грубо и не интересно, но чего поделать.
IllusionTurtle
25.05.2016 12:00+210 лет в IT, 3-5 в программировании — я только вчера узнал про оператор % (остаток от деления) проходя собеседование которое само собой с треском провалил… я Google-oriented программист, и у этого подхода есть огромный минус — отсутствие фундаментальной базы, получаемые навыки/опыт ограничены проблемами с которыми пришлось столкнуться.
Gorthauer87
25.05.2016 12:07+3Это смотря как гуглить. Лучше разок какой-нибудь специально составленый курс пройти с задачками на то на сё, чем чисто с практическими задачами бороться. Все эти курсы же составляют специально, чтобы охватить базу.
http://exercism.io/
xxvy
25.05.2016 12:00+7У меня уже выработалось правило. Если ты никак не можешь найти ответ в интернете, значит ты просто изначально что-то делаешь не так. Надо остановиться и прочесть наконец инструкцию.
P.S. А ещё очень доставляет, когда находишь ветку форума с обсуждением нужной проблемы, где в конце автор топика пишет «Всем спасибо, проблему решил.»
И всё.
VitaliiDel
25.05.2016 13:56Чаще всего я гуглю тексты ошибок и куски стектрейсов… И никогда — чужой код
А так же сравнительные тесты технологий, фреймворков и т.п. И никогда — чужой код
PavelMSTU
25.05.2016 14:37Уровни профессионализма программиста.
Уровень 1. Ты понимаешь о чем проблема.
Уровень 2. Ты умеешь хоть как-то решить проблему.
Уровень 3. Гугл/Яндекс тебе помогают только как справочники.
Уровень 4. Тебя перестают материть другие программисты в команде.
Уровень 5. Не ты ищешь работу, а работа ищет тебя.
SKolotienko
25.05.2016 14:59Уровень 6. Ты уже не пишешь на языке программирования — ты пишешь сам язык программирования.
Shultc
25.05.2016 16:26-2Уровень 7. Твоя программа пишет тебя, потому что боготворит тебя и хочет быть похожей на тебя. Она заменяет тебя ботом.
herr_kaizer
25.05.2016 20:56Лично мне тяжело с пустыми глазами копипастить куски кода. Пока не разберусь в его работе, всегда в голове будет висеть мысль, что «у тебя висит костыль, нужно с ним разобраться», даже если он без проблем решает поставленную задачу; а работать над проектом с такой мыслью не очень комфортно.
Yago
26.05.2016 00:50Объем информации поглощаемый программистами настолько высок, что без использования гугла можно просто остаться не у дел с устаревшими знаниями. Мало какая книга даст оперативное решение проблемы, да и для другого они предназначены. Но и бездумно копипастить код для решения своей задачи редко получается. Почти все требует доработки и адаптации под задачу.
slonopotamus
26.05.2016 00:58+4Несколько лет назад неожиданно для себя обнаружил, что перешел в состояние «у меня по работе возникают в основном такие вопросы к гуглу, ответов на которые нет не только на stackoverflow, а вообще нигде в интернетах». В лучшем случае обнаруживаются посты с неотвеченными аналогичными вопросами. И не могу сказать, что это делает меня более счастливым.
Sergey6661313
26.05.2016 15:32-1Иногда документация написана столь плохо, что только гуглинг примеров и спасает. А если к этой платформе ещё и только привыкаешь — то тупое копирование неизбежно, ибо не знаешь как вообще можно писать по другому.
А если не очень хорошо знаешь английский, то всё программирование вообще в принципе сводится к гуглингу.
Да и вообще в 21 веке живём вроде. Все виды велосипедов уже давно написали за нас. Плодить новые просто бессмысленно (хотя иногда хочется, чем и занимаюсь на досуге).
Вообще считаю что проблемы гуглинга именно в отсутствии (адекватной) документации. Потому что если дать человеку топор и лес — он сможет построить дом. Но если дать аборигену не заправленную бензопилу — он никогда не распилит ей дерево. Откуда ему вообще знать что нужен бензин? А в инструкции будет: «для того чтобы завести бензопилу — резким движением потяните за кольцо». Тут только гуглинг поможет…
Вот и я в программировании чувствовал себя также. Особенно когда только начинал. Берёшь книгу а там: «откройте простым текстовым редактором, бла-бла-бла int main() бла-бла-бла, а теперь скомпилируйте.» А на деле это сработает только с первым примером из книги (если вообще сработает). Окажется компилятор надо сначало найти, скачать, установить, при компиляции указать нужные ключи. Сам редактор может сохранять фаил не в той кодировке. И вот начинает безумно гуглить по каждому пунктику…
Или например начинаешь по книге изучать объекты. Изучаешь массивы. А как создать массив обьектов? Меня например это ввело очень в большой ступор когда я изучал java. (славу богу сейчас я на python-е сижу)
И что самое страшное как раз именно гуглинг и не помогает. А всё потому что каждая следующая подсказка — создаёт с 10-ток новых вопросов.
Во общем негодую я.Avitale
26.05.2016 17:31А если к этой платформе ещё и только привыкаешь — то тупое копирование неизбежно, ибо не знаешь как вообще можно писать по другому.
Вот я не понимаю как это — тупо копировать, не пытаясь понять код, который копируешь. Да, приходилось иногда заглядывать и в код коллег, и в SO за помощью, но разве чисто самому не становится интересно, как оно работает? А если оно работает неправильно?Sergey6661313
26.05.2016 21:57-1А как оно работает? а где посмотреть? А что делать если не знаешь даже где посмотреть?
Вы вот фреймворками пользуетесь? А лезете по коду глубже чтобы узнать как оно там работает? А если там просто тупые биндинги к готовым библиотекам? А в учебниках об этом пишут? Как узнать в принципе что код работает не правильно? Как узнаёте вы? Вы не пробуете для начало просто запустить чужой код — чтобы проверить а запускается ли он вообще?
> «не пытаясь понять код»
Вот скажите вы когда видите
cout << «Hello world!!!\n»;
Вам интересно как работает этот код? А если он работает не правильно? А откуда вам знать что именно это правильно?
А может быть надо:
cout << «Hello, world!» << endl;
или ещё хуже:
puts («Hello, World!»);
или так:
printf («Hello, World!\n»);
Попробуйте поймите. Как дойдёте до уровня ассемблерного кода — решите правильно ли оно работает. Я конечно утрирую. Но когда дело касается вывода строки на экран — все соглашаются, о том что, проще использовать готовый встроенный годами отлаженный функционал, чем писать свой. Я с такой же точки зрения смотрю на чужой код. Если написано «так» — значит кто-то продумал почему именно так а не иначе.
Когда дело касается незнакомой платформы — один фиг начинаешь с того что берёшь какой нибудь кусок чужого кода и пробуешь посмотреть как он себя ведёт. И никогда заранее не знаешь правильно это или нет. А теперь перечитайте моё сообщение выше: я писал о недостатках документации. Не о решении глобальных экономических проблем страны, а о том что программирование в принципе начинается с того что ты берёшь какой нибудь код и пробуешь его. Естественно при данном действии так называемое «понимание кода» отсутствует.
> разве чисто самому не становится интересно, как оно работает?
Если мы опять же будем говорить об решении глобальных экономических проблем — то мне действительно будет интересно как работает рабочий код. Но даже там мне будет интересно не «понять код», а «узнать алгоритм» код которого и осуществляется в каком либо рабочем примере.
если я не могу посчитать на листочке то что я хочу видеть от программы, то и саму программу я не смогу даже сформулировать. И никакой чужой код мне не поможет.
А если могу и есть адекватная документация то мне и копировать код не придётся.
А вот если я знаю чего хочу видеть на экране но не знаю какую команду задать, то тупое копирование — единственный вариант который у меня вообще есть.herr_kaizer
26.05.2016 22:15Вы просто хотите, чтобы все возможные юзеркейсы разжевывались и клались в рот. Но мы живем в реальном мире — так не бывает.
А после таких вот копипастов приходится потом разбираться в написанных в разном стиле (а то и парадигме — и такое бывало) кусках кода с излишним или недостаточным функционалом.Sergey6661313
27.05.2016 08:11> так не бывает.
Зато бывает как на рисунке с совой. И очень часто. Особенно новичкам. Которые эти ваши парадигмы только изучают…
не мы такие — жизнь такая… А потом удивляются почему на том же SO тысячи однотипных вопросов.
Когда на самом деле всем начинающим нужна просто маленькая шпаргалочка в виде таблиц с различными комбинациями.herr_kaizer
27.05.2016 16:52«нужна просто маленькая шпаргалочка»
Это называется документацией.Sergey6661313
27.05.2016 19:22+1А теперь вернёмся к моему первому комменту: Иногда документация написана столь плохо, что только гуглинг примеров и спасает.
gena_glot
Гуглить не проблема. Проблема в том, что часто люди сразу не думая бегут гуглить и находят бяку какую-нибудь и вставляют в код кое-как.
То есть если есть stackoverflow то грех им не пользоваться, но сначала надо подумать и сформулировать, а также определиться что мы ищем и в какую сторону.
То есть решать по одной схеме «гуглить — не гуглить неправильно». Иногда придется прогуглить 3 разные вещи, и из них слепить решение.
jMas
Мне кажется, должно быть чувство «выполненной задачи на хорошо», то есть бежать гуглить проблему со всех сторон — это даже не плохо, просто необходимо брать не первое попавшееся, а изучить вопрос, сформулировать оптимальное решение для конкретно нашего случая, вставить и порефакторить выбросив ненужные части.
darkAlert
Страшно становится тогда, когда ты нашел на stackoverflow схожий вопрос, но на него никто так и не смог ответить…
timiskhakov
Или когда, проанализировав простыни логов, замучив до смерти дебаггер и таки найдя решение через 3 дня, возвращаешься на SO победителем, а на этот вопрос уже ответили.
PavelMSTU
Да, у меня такое же было полгода назад… Первоначальные ощущение — «обидненько».
Но потом понимаешь, что пока 3 дня ковырял — ты реально вырос.
И тогда осознаешь, что эти 3 дня не были пустой тратой времени.
Randl
Обычно, что я понимаю, что я невнимательный идиот.
Avenger911
Зато как приятно, продравшись через дебри, написать ответ на этот вопрос =)
GarifZZ
из крайности в крайность сэр!