Программирование без интернета
оригинал на xkcd
Топ-3 повседневных вопросов программиста:
- как сделать Х,
- почему работает так, а не эдак,
- как назвать переменную.
С третьим вопросом всё понятно — он неразрешим в принципе. С первыми двумя интереснее.
Чтобы получить ответы, программисты девяностых читали исходники и руководства. Программисты двухтысячных начали активно гуглить. А затем в 2008 появился Stack Overflow, и стал «внешней памятью» для разработчиков. Теперь на 95% вопросов есть готовый ответ: первая ссылка из гугла на Стек.
В чём проблема со Stack Overflow
Вроде бы это хорошо: не надо полдня разбираться в причинах. Скопировал решение, вставил, работаем дальше. Но плохо то, что внешние решения проходят мимо головы. Когда человек в следующий раз столкнется с той же проблемой, он снова полезет на Стек. И снова. И снова.
Чужое решение не запоминается. Нет стимула разбираться, как оно устроено. Нет чувства удовлетворения, когда «заработало!». Не образуются в мозгу новые нейронные связи. А без этого нет и запоминания.
Дальше хуже. Когда злоупотребляешь готовыми ответами, перестаешь воспринимать аналогии и косвенные решения. Ищешь, чтобы прямо один-в-один было то, что тебе нужно. В долгой перспективе это тупик.
Да и разработка с постоянной беготнёй из кода в гугл — это не программирование, а ерунда какая-то.
Что с этим делать
Скачать документацию, чтобы была под рукой. Я рекомендую devdocs.io — на выбор 130 языков и фреймворков, бесплатно.
Скачать исходники бинарных библиотек, которые используются в проекте. Актуально для языков вроде Java и C#. Толковые IDE умеют делать это самостоятельно.
Использовать правило пяти минут. Столкнулся с проблемой — пять минут пытаешься решить её без интернета. Разрешается использовать исходники, документацию и собственный мозг.
Для одноразовых задач правило пяти минут не действует. Если вы веб-разработчик, и вдруг вынуждены разбираться с багой компиляции lxml на OracleLinux — не начинайте с 800-страничного руководства, просто загуглите текст ошибки.
Пять минут без интернета можно превратить в десять или пятнадцать. Григорий Бакунов из Яндекса вообще рекомендует блокировать доступ к Stack Overflow на 45 минут каждого часа. Как по мне, это уже перебор.
А вы не ловили себя на стековерфлоу-зависимости?
Ещё по теме:
- Лекция Григория Бакунова «Можно ли программировать без интернета», 20 минут.
- Выпуск подкаста Developer Tea Intentional Problem Solving, 15 минут.
Комментарии (24)
11 января 2017 в 12:20 (комментарий был изменён)
+4↑
↓
Спорно. Есть инструмент, который позволяет быстро решать проблему, и я буду его использовать по максимуму, чтобы освободившееся время потратить на создание уникальной функциональности, а не борьбу с «особенностями» ОС, например. Но вообще, я стараюсь хоть как-то разобраться в сути проблемы и проанализировать предложенное/сработавшее решение.11 января 2017 в 12:29
+1↑
↓
борьбу с «особенностями» ОС
Это как раз «одноразовые» задачи, для них Стек отлично подходит. Речь в заметке о ваших основных задачах.
11 января 2017 в 12:33
–2↑
↓
По основным тоже бывает, что какие-то библиотечные функции не могу запомнить, как правильно вызывать, например. Тоже не вижу проблемы, когда на поиск ответа нужно 20–30 секунд. Да, согласен, что я делаю Ctrl+C — Ctrl+V, особо уже и не смотрю, так что вряд ли когда-то это запомню.
11 января 2017 в 12:22 (комментарий был изменён)
+17↑
↓
Когда человек в следующий раз столкнется с той же проблемой, он снова полезет на Стек. И снова. И снова.
Чужое решение не запоминается.
Ерунда.
Я программист 3д графики. До выхода UE в Open Source — моя основная работа была завязана на программирование 3Д движков с нуля.
Я не смогу в тетрадке без внешних источников написать работающий код инициализации OpenGL. Я на нём работаю с 2004 года. Проектов написано под сотню, разного уровня сложности. Я много раз по документации писал инициализацию. Но не смогу её точно вспомнить. Зачем мне её в деталях учить?Нет стимула разбираться, как оно устроено.
Ерунда.
Если вы пихаете код из внешнего источника не разобравшись в нём — это не проблема внешнего источника.
Это проблема вашего лида, который до сих пор вас не уволил.Нормальные программисты берут решение с SO. Смотрят что в этом решении происходит и тогда уже копируют в своё код, без изменений, если код на 100% соответствует ситуации. Но никогда не пихают в свой код чужой черный ящик.
11 января 2017 в 13:06
–2↑
↓
Смотрят что в этом решении происходит и тогда уже копируют в своё код,
«Смотрение» в чужих решениях обычно очень поверхностное. Нет глубокого понимания, нет обучения.
11 января 2017 в 13:18
0↑
↓
Пару лет назад столкнулся с задачей по блокировке скролла у списка в Android.
https://habrahabr.ru/post/218307/Нашел решение, разобрался почему оно хреновое, написал в итоге своё (вроде тоже на основе обсуждения в SO, уже точно не помню).
Прошло два года:
1) Я ничего не помню о диспетчеризации событий в Android. Не работаю с этим, соответственно не помню. Несмотря на то, что в тот момент достаточно детально разобрал ситуацию.
2) Мне за два года больше ни разу знания о диспетчеризации событий в Android не пригодились.Может давайте отделять фундаментальные знания, которые надо изучать, от всякой мишуры, которую сделал и забыл? Причем забыл, независимо от того, сам разработал решение или нагуглил.
11 января 2017 в 13:24
+1↑
↓
Это вы за кого говорите? Если за себя, тогда ладно, дело ваше. Если за меня — нет, я обычно смотрю не поверхностно, а подробно, разбираюсь в увиденном и мотаю на ус. Если же человек поступает не так, то может стоит называть его не разработчиком/программистом, а (мягко говоря) кодером/интегратором?
11 января 2017 в 12:30
+3↑
↓
А я вот с вами не согласен. Во первых очень и очень часто на Stackoverflow объясняется трудная часть которая не понятна в документации, ведь в документации нужно закончить все и к сроку, а в SO пишется для рейтинга и хороший ответ может взвинтить ваш рейтинг. В общем, Stackoverflow это в большинстве случаев та же документация только написана (разжевана) более понятным языком. Кроме того не всегда знаешь что решение проблемы X лежит в статье Y в документации к продукту Z, и чтобы это найти самому нужно потратить иногда не один час. И да, понимание тоже приходит. Учил JSF по ответам BalusC на SO, легендарная личность.11 января 2017 в 13:08
–2↑
↓
Stackoverflow это в большинстве случаев та же документация
Stackoverflow в большинстве случаев — это Add two variables using jquery. Есть и исключения, конечно, но они не опровергают общую картину.
11 января 2017 в 13:27
0↑
↓
А в чем проблема этого вопроса? Если его не заминусовали то он вполне легитимен для сообщества, а то что его заплюсовали значит, что он очень даже актуален. Да, вопрос простой, но не стыдно «не знать», стыдно не спросить. Кроме того в моем случае SO очень часто сыграл роль желтого утенка, например вот здесь.
11 января 2017 в 12:35
+5↑
↓
>Скачать документацию, чтобы была под рукой. Я рекомендую devdocs.io — на выбор 130 языков и фреймворков, бесплатно.В чем разница — поискать в гугле, или порыться в документации?
Кроме того, документация часто написана так, что бы отвязались, и в реальных задачах слабовато помогает.11 января 2017 в 13:10
0↑
↓
Я начал писать ответ, но понял, что если для вас нет разницы между гуглением и чтением документации — вряд ли смогу что-то объяснить.
11 января 2017 в 13:15
+3↑
↓
>Я начал писать ответ, но понял, — вряд ли смогу что-то объяснить.«Если учёный не может объяснить уборщице, которая убирается у него в лаборатории, смысл своей работы, то он сам не понимает, что он делает.» © Эрнест Резерфорд
11 января 2017 в 13:40
0↑
↓
А вы предлагаете читать документацию последовательно, сверху вниз?
11 января 2017 в 12:42
+3↑
↓
По моему, ерунда какая-то. Решение может в себя включать несколько разделов мануала сразу. Так что лучше посмотреть решение, а уже затем лезть в мануал и посмотреть что там еще написано.
Я как раз отношусь к «правильным» программистам, которые сами до опупения разбираются с проблемой, вместо того чтобы загуглить. И вот что я могу по этому поводу сказать: уже неоднократно ловил себя на том, что обнаружив багу в чужой библиотеке, докапываюсь до ее сути, исправляю ее, после чего выясняю что это никому не нужно — проект давно не обновляется, а в первой же строчке выдачи гугла решение в две строчки, как можно работать с библиотекой, чтобы не натыкаться на эту ошибку. То есть, я молодец, вроде как… только вот кому и какая польза от моих действий?11 января 2017 в 13:11
0↑
↓
Польза вам. Вы получили левел-ап. А те, кто взяли «решение в две строчки» — нет. С годами эти левел-апы ощутимо проявляются в размере заработной платы.
11 января 2017 в 13:19
+1↑
↓
С годами эти левел-апы ощутимо проявляются в размере заработной платы.
Или не проявляются. Ибо мои левел-апы оценить нельзя, а производительность «копипастера» как раз можно. Так что так себе аргумент — только для самоуспокоения годится.
11 января 2017 в 12:55
+5↑
↓
Простите, но похоже на старческое брюзжание. Пока есть инструменты и доступ в «коллективный разум» вроде SO, позволяющие в 10 раз быстрее решить задачу не отвлекаясь на лишние детали, разумные и ценящие свое время разработчики будут это использовать. Лично я этим пользуюсь, даже если приходится ходить часто за одним и тем же решением, потому что не хочу забивать голову знаниями, которые устареют в течение года или с выходом новой версии библиотеки (а в мире js устареть может в течение месяца, а то и недели). Просто потому что в течение этого месяца я схожу 10 раз на SO за решением одной и той же проблемы, не запоминая, а после мне это знание не понадобится уже никогда. Вроде нюансов инициализации windows-приложения на C++ STL в 95 году или программирования резидентов под MS-DOS 5. Наверное, обидно тем, кто потратил человекомесяцы на вникание в эти темы, а сейчас это никому нафиг не нужно. Мне такие упущенные годы не нужны, я лучше за это время что-нибудь фундаментальное изучу вроде алгоритмов и структур данных, паттернов и т.п. А для параметров инициализации фреймворка или нюансов имплементации языка регулярных выражений в конкретном языке — пусть служит «внешняя память». Все равно завтра это всё будет уже не нужно. Бобука уважаю, но насчет блокировки SO — имхо, он ересь несёт.11 января 2017 в 13:35
+2↑
↓
Мне кажется я понимаю что хотел сказать автор. Он не против SO (или остальных интернетов), он хочет сказать что в некоторых случаях готовый ответ не несет пользы для самого девелопера. Это как в притче: или дать рыбы (накормить 1 раз), или научить ловить рыбу (накормить на каждый день).Разбираясь в проблеме самостоятельно — ты между делом узнаешь подробно как оно устроено, запомнишь ньюансы которые тебе могут пригодиться позже, проникнешься архитектурой. Ведь не зря джуниоров заставляют заглянуть, например, во внутрь java.util.HashMap — там ведь очень много полезного.
SO отличный инструмент, и когда нет времени на ресер — он прекрасно спасает, но как говорит автор — нужно уметь и головой думать, и в исходниках ковыряться.
11 января 2017 в 13:36
0↑
↓
Мне кажется, у вас с автором одинаковое понимание ツ
11 января 2017 в 13:35
0↑
↓
Чет какой-то совсем бред. По моему, тут все складывается из человека. Я более менее активно пользуюсь SO, но не каждый раз бегу туда. Бегу на первый линк в гугле (условно говоря), будь то мануал, или стек, неважно. Если это мануал, пробую, не получается — иду на стек. Если это стек, процедура та же, только потом иду в мануалы. Я конечно понимаю, да мозги потренировать и прочие бредни, но мы ведь не сидим, теоремы не выводим, в течение 5ти минут самостоятельно, ибо глупость же, нет?11 января 2017 в 13:35
0↑
↓
да мозги потренировать и прочие бредни
Да, мозги потренировать и прочие бредни. Точно подметили.
11 января 2017 в 14:03
0↑
↓
В контексте срочно решаемой задачи — это бредни. Когда мне нужно обеспечить единожды воспроизводимый функционал — тоже. Как правило, если ты не задаешь вопрос на СО, а нагугливаешь его, то код ответов зачастую не полностью совпадает с решением текущей задачи — возникает необходимость допилить, доработать, исправить — вникнуть в суть. Проблема выедена из яйца, так можно до чего угодно докопаться: «разраб вот полез в интернет вместо книжки, а как же листание страничек, просмотр оглавления, там же тоже информация, которая сразу отложится в мозгу! А еще лучше по рукописям, пущай на каждой странице рыщет в поисках нужной функции! А еще лучше пусть наугад названия и аргументы угадывает!».
Понятное дело, что пользоваться коллективным разумом нужно в РАЗУМНЫХ (какая ирония, да?) пределах, я думаю, каждый тут это осознает. Отсюда — нет смысла говорить людям, что «не нужно подчистую копипастить код ай-я-яй».
11 января 2017 в 13:43
0↑
↓
Скачать документацию, чтобы была под рукой. Я рекомендую devdocs.io — на выбор 130 языков и фреймворков, бесплатно.
Дополнительно рекомендую Zeal — zealdocs.org. Заявлено 195 docsets
В некоторых моментах лучше чем devdocs. Например есть MySQL документация, которая в devdocs отсутствует по лицензионным соображения. Zeal имеется в репо Ubuntu и Fedora.