[Перевод] Чему я научился за 10 лет на Stack Overflow

eltv8cqma6rt0hi3q1fosrhv07c.jpeg


Близится десятая годовщина моего присутствия на Stack Overflow. За эти годы мой подход к использованию сайта и его восприятие сильно изменилось, и я хочу поделиться с вами своим опытом. И пишу я об этом с точки зрения среднестатистического пользователя, который не сильно вовлечён в жизнь сообщества сайта или его культуру. В последние дни я отвечаю лишь на вопросы, относящиеся к VS Code — продукту, над которым я работаю. Однако раньше я активно участвовал в обсуждении широкого набора тем. За 10 лет я задал около 50 вопросов и дал 575 ответов, просмотрел несметное количество чужих комментариев.

Джон Скит описал культуру Stack Overflow гораздо лучше и авторитетнее, чем я когда-либо смогу сделать. Его публикация повлияла на некоторые главы этой статьи, хотя в целом это мои собственные откровенные размышления о моём опыте пребывания на Stack Overflow, что на этом сайте хорошо и что плохо, и как его можно сегодня использовать. Это обсуждение будет довольно поверхностным, без глубокого погружения в работу сайта или его историю.

Итак, вот чему я научился за 10 лет использования Stack Overflow.


На первый взгляд, нет ничего проще: введи несколько слов в текстовом поле, нажми «Отправить», и интернет волшебным образом поможет решить все твои проблемы! Но у меня ушло почти 10 лет, чтобы понять, какие слова нужно ввести в это чёртово поле, чтобы действительно получить результат. По сути, я всё ещё каждый день этому учусь.

Умение задавать хорошие вопросы — это действительно недооценённый навык (как и составление хорошего сообщения о проблеме, кстати говоря). Во-первых, как мы вообще определяем, что вопрос «хороший»? Stack Overflow предлагает подсказку, в которой перечислены такие качества хорошего вопроса:

  • Соответствует ли тематике сайта.
  • Подразумевает объективный ответ.
  • Ещё не был задан.
  • Был исследован.
  • Ясно описывает проблему, обычно с минимальным, легко воспроизводимым примером.


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

К сожалению, маленькое текстовое поле здесь не помогает. Так стоит ли удивляться тому, что так много пользователей публикуют некачественные вопросы? Иногда единственный ответ, который они получают, это ссылка на какую-нибудь запутанную документацию. И это им ещё повезёт. Многие некачественные вопросы просто молча минусуют, и они исчезают в бесконечной ленте вопросов.

Задавать хорошие вопросы — это навык. К счастью, его можно развивать. Я, в основном, учился, читая кучу вопросов и ответов, отмечая, что работает, а что нет. Какая информация полезна, а какая мешает? Хотя вам всё равно будет страшно использовать полученные знания на практике и задавать вопросы. Просто постарайтесь, и учитесь на полученном результате. Должен признаться, что меня самого немного смущают некоторые мои ранние невежественные вопросы, хотя, возможно, это доказывает, что я сильно прокачал свой навык задавать вопросы с тех пор, как очутился на этом сайте.


Не стану подслащивать пилюлю: некоторые вопросы просто плохи.

Вопрос, состоящий из скриншота и фразы «ПОЧЕМУ ЭТО НЕ РАБОТАЕТ?!!» — плохой. Почему? Очевидно, что автор почти не приложил усилий. Это даже не столько вопрос, сколько требование: «сделайте эту работу за меня!» С чего бы мне это делать? Моё время слишком ценно, чтобы тратить его на помощь тому, кто с самого начала не хочет учиться и не будет ценить мою помощь. Учиться тому, что собой представляет Stack Overflow.

Теперь рассмотрим вопрос, озаглавленный «Как убрать синие границы на моей странице», состоящий из нескольких абзацев текста, в котором говорится о CSS-свойстве outlineproperty, но без явного упоминания слов «CSS» или «outline». Хотя такой вопрос может противоречить многим рекомендациям Stack Overflow, я с этим не соглашусь, это не плохой вопрос. Автор хотя бы пытался дать какую-то информацию, даже не зная, что нужно дать. Попытка засчитывается, как и готовность воспринимать и учиться.

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

Действительно плохие вопросы не стоят того, чтобы тратить на них время. Но нужно учитывать, что те, кто задаёт не слишком хорошие вопросы, делают это непреднамеренно. Они хотят задавать хорошие вопросы, просто не знают, как. Если слепо и без объяснений наказывать новичков, то как они научатся?


Обычно на Stack Overflow быстрее отвечают на простые вопросы, на которые многие могут ответить. У вас вопрос о двоичном поиске в JavaScript или о HTML? Прекрасно! Получайте пять ответов менее чем за час. Но чем сложнее или специфичнее вопрос, тем меньше вероятность, что вам ответят, вне зависимости от качества формулировки.

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


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

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

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

В целом, несмотря на ежемесячные минусы, я считаю, что сообщество Stack Overflow голосует объективно. Будем придерживаться этого пути.


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

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


Сейчас я работаю над VS Code, поэтому взял за привычку просматривать вопросы с тегом vscode. Это прекрасный способ узнать, как мой код используется в реальном мире. Какие проблемы возникают пользователей? Как можно улучшить документацию или API? Почему то, что я считал абсолютно понятным, вызывает столько непонимания?

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

Если вы сопровождаете продукт для разработчиков, то не воспринимайте Stack Overflow как свалку (или, того хуже, как кладбище вопросов). Регулярно проверяйте, какие появились вопросы и ответы. Это не означает, что вам нужно самостоятельно отвечать на каждый вопрос, однако сигналы со Stack Overflow слишком важны, чтобы их игнорировать.


Немалое количество вопросов о VS Code на Stack Overflow на самом деле были сообщениями о багах. А многие другие — на самом деле запросами на новые фичи.

К примеру, вопрос с заголовком «Почему VS Code падает, когда я делаю …?» — это сообщение о баге. VS Code не должен падать в самых разных ситуациях. Отвечать на вопросы, являющиеся сообщениями о багах, непродуктивно, ведь авторов может удовлетворить обходное решение и они никогда не заполнят настоящий отчёт о баге. В подобных ситуациях я обычно пишу, чтобы пользователи заполнили отчёт о баге на Github.

В других случаях отличия могут быть менее очевидными. Например, вопрос «Почему JavaScript IntelliSense не работает в VS Code?». В зависимости от того, как именно не работает JavaScript IntelliSense, вопрос можно отнести к одной из трёх категорий:

  • Если это проблема пользовательской конфигурации, то это действительно вопрос для Stack Overflow.
  • Если в описываемом случае IntelliSense должен работать, а он не работает, то это сообщение о баге.
  • Если в описываемом случае IntelliSense не должен работать, то это запрос на новую фичу.


В конце концов, большинству пользователей эти нюансы не важны — они всего лишь хотят, чтобы работал JavaScript IntelliSense.

И хотя для меня, как ответственного за проект, эти различия важны, то в целом они не должны и для меня иметь значение. Потому что и вопросы, и сообщения о багах, и запросы на фичи — всё это способы выражения одной идеи: пользователь ждёт чего-то от моего кода и не получает этого. Если бы продукт был идеален, пользователи никогда не задавали бы вопросы о нём, потому что им всё было бы понятно и он делал бы именно то, что они хотят (или хотя бы понятно говорил, почему не может).


Люди эмоциональны. Люди иррациональны. Люди придурки. Не всегда, конечно, но иногда! И не поверите, но разработчики тоже люди.

Есть такая выдумка, что мы, разработчики, любим повторять себе: «Мы работаем с компьютерами, поэтому должны быть рациональны. Мы понимаем загадочные символы, поэтому должны быть умны. Программы захватили мир, так что мы должны быть круты! Круто! Вперёд!!!»

Это не так. А если бы было так, то помоги господи остальным людям. Даже на Stack Overflow, этом инструменте для профессионалов, созданном как объективная база знаний, даже в моём собственном, крайне специфичном уголке VS Code я продолжаю сталкиваться со всевозможными безобразиями: логическими заблуждениями, оскорблениями, стадным мышлением и т. д.

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


Я тоже человек, и время от времени происходящее на Stack Overflow меня раздражает. Например, когда пользователь самоуверенно пишет чушь или просто даёт ошибочный ответ на вопрос, связанный с VS Code — продуктом, который я создал и который прекрасно знаю. Странно, но такое впечатление, что чем ошибочнее ответ, тем вероятнее, что кто-то назовёт его непреложным фактом.

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

a6af3b72c980250f85c70052c38a0aae.png

И несколько раз это приводило к возникновению длинных веток: горе мне, что осмелился поставить под сомнение их знания о том, что я создал! Прекратите всё время пытаться быть правыми, чёртовы умники! Потому что прав я!!!


Столкнувшись с бесконечным потоком некачественных вопросов, легко стать циничным. Он никогда не слышал про Google? А тот хотя бы представляет, как строить связные предложения? Ты чё, пёс?

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

Конечно, есть пользователи, которые не прилагают ни грамма усилий и публикуют плохие вопросы. Но верю, что основная масса некачественных вопросов исходит от людей с благими намерениями (хотя и бестолковых). Я всегда стараюсь помнить о том, что значит быть новичком. Когда ты только начинаешь, то не понимаешь, как на самом деле здесь всё устроено. В некоторых случаях ты даже не знаешь, в каких словах правильно выразить свою проблему. Поверьте, тяжело быть в таком положении. И неприятно, когда тебя облили помоями только за то, что задал вопрос.

Хотя Stack Overflow многое сделал, чтобы помочь новичкам, ещё нужно сделать гораздо больше. Я пытался найти баланс между соблюдением принятых на сайте стандартов и снисходительностью к неопытным пользователям. Это может подразумевать объяснение, почему я проголосовал за закрытие вопроса или размещение комментария, побуждающего пользователя дать дополнительную информацию. Мне ещё есть куда расти.

С другой стороны, я без колебаний минусую пользователей с репутацией в 50 000, которые публикуют вопросы «Лучшее оформление под VS Code для JavaScript-разработки?», или которые загружают мыльные скриншоты кода вместо текста.


На Stack Overflow слабо развита культура благодарности. Помнится, когда-то на сайте автоматически вырезались из вопросов слова «привет» и «спасибо». Возможно, так делается до сих пор, я не проверял.

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

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


Stack Overflow действует по принципу транзакций: одни люди задают вопросы, другие отвечают. А что происходит после получения ответа? Кто знает? Иногда мне интересно это узнать. Был ли мой ответ полезен? Какому скромному проекту он помог? Чему научился автор вопроса?

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


…при превращении процессов в игру.

Я всё ещё немного волнуюсь, когда вижу в строке статуса маленький значок +10 или +25. Возможно, эти небольшие вкрапления геймификации являются причиной того, что я 10 лет возвращаюсь на сайт. Но с годами я также стал задаваться вопросом, какого рода игрой является Stack Overflow и что означает победа в ней.

Уверен, что систему создавали из лучших побуждений: награждать людей за полезные вопросы и ответы. Но как только добавляешь высокие оценки, в силу вступает закон Гудхарта, и часть пользователей начинает подстраивать свои действия не под достижение максимальной ценности, а под получение максимальных оценок. И это важно, потому что…


Репутация не эквивалентна технической компетентности, навыкам коммуникации или пониманию, как работает или должен работать Stack Overflow.

Я не хочу сказать, что репутация бесполезна. Просто она означает не то, что подразумевает администрация Stack Overflow или что должно означать слово «репутация». Я понял, что репутация — это мера влияния. Рассмотрим два гипотетических ответа, опубликованных на сайте:

  • Один о распространённой git-операции. Я за две минуты с помощью Google написал ответ в три строки.
  • Другой о запутанной теории графов. Возможно, ответить на него может всего сотня человек во всём мире. Я написал несколько абзацев и пример кода, объясняющие суть проблемы и как её решить.


За пять лет первый ответ посмотрели 5 млн раз и поставили 2000 плюсов. Второй ответ посмотрели 300 раз и поставили два жалких плюса.

В определённой мере это очень нечестно. За что награждать то, что оказалось в нужном месте в нужное время? (не всё определяется удачей, огромную роль играет и понимание правил игры). С другой стороны, первый вопрос действительно помог гораздо большему количеству людей, чем второй. Может быть, стоит признать, что в каком-то смысле признание приводит к нагромождению «репутации»?

Поэтому я расцениваю «репутацию» на Stack Overflow своего рода мерой влияния. Настоящую репутацию нельзя измерить простым баллами, она возникает в сообществе. К чьим советам я прислушиваюсь, кто помогает другим, кому я доверяю? Возможно, всё это будут разные люди, в зависимости от того, пишу я на PHP или под iOS.

Учитывая сказанное, я не знаю, что в этом отношении должен сделать Stack Overflow. Будут ли пользователи столь же мотивированы, если вместо «репутации» они заработают «хитрозадые баллы»? Останутся ли пользователи так же вовлечены, если вообще не будет системы баллов? Думаю, вряд ли. И миф о том, что «репутация» на Stack Overflow равноценна настоящей репутации, приносит выгоду не только самому сайту, но и самым активным пользователям. Ну правда, кому же не нравится повышать свою репутацию?

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


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

Я не продуктивен без IntelliSense, поискового движка и Stack Overflow. Судя по некоторым книгам, это делает меня очень плохим программистом. Вероятно, я провалил бы много тестов и не решил много задач на доске. Пусть так. Серьёзно, каждый раз, когда я использую .sort в JavaScript, мне приходится искать информацию о том, когда я получу -1, 0 или 1, а ведь я ежедневно пишу на JS, разрабатывая самый популярный редактор для этого языка.

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


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

Чудом является сам факт существования и результат работы Stack Overflow. Уверен, что не всё бывает так хорошо, как намеревались его создатели, но они пытаются. Несмотря на все недостатки, сайт многие годы помогает огромному количеству людей, в том числе и мне.

Stack Overflow не будет существовать вечно. Однажды появится что-то получше. Надеюсь, это что-то извлечёт уроки из ошибок Stack Overflow и возьмёт от него всё самое лучшее. А до тех пор, надеюсь, мы не будем воспринимать этот сайт как должное. Это и ориентир, и живое сообщество, которое постоянно пополняется новыми людьми. Если вас это волнует, то помните, что всё это очень хрупко, и даже небольшие действия — вроде помощи благожелательным, но пока ещё несведущим новичкам — может иметь положительный эффект. Если я критикую этот сайт, то лишь потому, что мне не всё равно и я знаю, как сделать его лучше.


Я был ещё школьником, когда пришёл на Stack Overflow. Я только начинал писать (ES5!) на JavaScript в Eclipse, и казалось, что 90% вопросов начинаются с «Использую jQuery, просто …». И хотя я не понимал, что делаю, незнакомцы тратили своё время на помощь мне. Не думаю, что я по-настоящему ценил это тогда, но я не забыл.

Люди всегда будут хотеть, чтобы Stack Overflow был чем-то разным: сайтом вопросов-ответов; инструментом для решения домашних задач; живым эталоном программирования. А для меня этот сайт, несмотря на его рост и недостатки, по сути своей является открытым сообществом, в котором незнакомцы помогают друг другу учиться и совершенствоваться. И это прекрасно. Я рад, что был частью Stack Overflow в последние 10 лет, и надеюсь, что так будет и впредь. Я хочу за следующее десятилетие узнать не меньше нового, чем за предыдущее десятилетие.

© Habrahabr.ru