суббота, 16 мая 2009 г.

Четыре уровня компетентности в программировании

Источник: http://dev.by

Одним из краеугольных камней современной психологии является психоанализ. Зигмунд Фрейд был одним из первых, кто смог чётко разделить и описать уровни, на которых происходит психическая деятельность человека. В течение первой половины своей жизни он в результате своих исследований и размышлений установил существование трёх взаимодействующих уровней психики человека – бессознательное, подсознательное и сознательное.

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

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

В этой статье мы попытаемся применить эту простую схему на том умении, которое мы с вами практикуем каждый день – программировании.

Уровень 1. Неосознанная некомпетентность.

Джон – молодой веб-разработчик. Он собирался учиться на юриста, но, решив, что это не особо денежное занятие, в мгновение ока переключился на что-то другое. Он всегда хорошо справлялся с решением проблем с компьютерами для своих друзей и подумал, что работа в IT это совсем несложно. Он быстренько поискал курсы поближе к дому и, voila – через шесть месяцев он уже является экспертом веб-разработки, а в его резюме упоминаются все когда-либо известные человечеству платформы и языки программирования.

В реальности Джон – это безжалостный копипастер. Он считает, что выскакивающие при клике сообщения это и есть весь JavaScript. PHP? Проще простого – он может установить Wordpress. Linux? Он умеет загружаться с лайвсиди Ubunt’ы, он может организовать кластер сбалансированных по нагрузке веб-серверов Apache. Его знания не знают границ.

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

Джон – неосознанно некомпетентен.

Уровень 2. Осознанная некомпетентность

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

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

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

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

Марк – осознанно некомпетентен.

Уровень 3. Осознанная компетентность

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

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

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

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

Адриан – осознанно компетентен.

Уровень 4. Неосознанная компетентность

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

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

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

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

8 модных путей получить доступ к заблокированным сайтам

Источник: http://www.xakep.ru

1. Screen-Resolution.com
Сайт позволяет увидеть как будет выглядеть сайт при разных разрешениях монитора. Работает только в IE, но все равно лучше чем ничего - можно кликать ссылки и перемещаться по сайту.

2. BrowserShots.org
Делает статический скриншот сайта, почти тоже самое, что и в первом пункте, только перемещаться по ссылкам нельзя.

3. Кэш поисковых систем
Поисковая машина кэширует страницы, которые и можно посмотреть. Можно использовать не только Google, но и Yahoo и т.п.

4. Системы перевода
Сервисы типа Yahoo BabelFish и Google Translate позволяют перевести страницу с одного языка на другой. Фишка в том, что ваш доступ к заблокированной странице вовсе и не нужен, сервис сам ее получит и предоставит вам.

5. По почте
Сервис Web2Mail может прислать вам произвольную страницу по почте - достаточно послать письмо на www@web2mail.com, где в Subject указать требуемый URL. Можно попробовать и другой подобный сервис - WebinMail.

6. Кэш Google Mobile Search
Еще один вариант - оставляет нормальный HTML код, удаляет javascript и CSS.

7. Подписка на RSS
Может работать не на всех сайтах, но все равно можно попробовать подписаться на потоки и читать их или посылать себе на почту.

8. Wayback Machine
Wayback Machine - еще один сервис, который периодически сохраняет копии страниц, своего рода "архив Интернета". не для весх сайтов работает, к тому же имеет ощутимый временной лаг.

четверг, 18 декабря 2008 г.

Как давать хорошие ответы

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

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

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

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

Задавайте дополнительные вопросы, чтобы получить больше информации. Если это делать правильно, спрашивающий кое-чему научится, — да и вы тоже. Попытайтесь превратить плохой вопрос в хороший; помните - все мы были начинающими.

Хотя простой ответ RTFM бывает оправдан, когда дается просто лентяю, ссылка на документацию (даже если это набор ключевых слов для поиска в Google) все же лучше.

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

Помогите общественности извлечь пользу из вопроса. Когда встречаетесь с хорошим вопросом, спросите себя: "Как надо изменить соответствующую документацию или список ЧаВО, чтобы больше этот вопрос никто не задавал?". Затем пошлите соответствующее дополнение тому, кто поддерживает эти документы.

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

Если ответ не получен

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

В общем случае, повторная посылка вопроса - не лучшая идея. Это будет воспринято как бессмысленная надоедливость.

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

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

Есть также масса коммерческих компаний, с которым можно заключить контракт на поддержку, как крупных, так и маленьких (одни из наиболее известных - Red Hat и Linuxcare, но есть и множество других). Пусть вас не пугает идея платить за поддержку! В конечном итоге, если необходим капремонт двигателя автомобиля, вы ведь отдадите его в мастерскую и заплатите за ремонт. Даже если программное обеспечение ничего не стоило, нельзя рассчитывать, что его всегда будут бесплатно поддерживать.

У популярного программного обеспечения, вроде Linux, на одного разработчика приходится, по крайней мере, 10000 пользователей. Один человек просто не может справиться с поддержкой 10000 пользователей. Помните, что даже если за поддержку приходится платить, это все равно обходится намного дешевле, чем когда приходится покупать еще и само программное обеспечение (да и поддержка закрытого программного обеспечения обычно стоит дороже и выполняется менее компетентными специалистами, чем в случае программного обеспечения с открытым исходным кодом).

Хорошие и плохие вопросы

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

Глупо: Где мне найти информацию о Foonly Flurbamatic?

Этот вопрос просто напрашивается на ответ "STFW".

Правильно: Я попытался поискать в Web с помощью Google по запросу "Foonly Flurbamatic 2600", но полезных ссылок не получил. Не знает ли кто-нибудь, где найти информацию о программировании этого устройства?

Этот вопрошающий уже поискал в Web и, похоже, у него - реальная проблема.

Глупо: Я не могу скомпилировать код проекта foo. Почему он некорректен?

Он думает, что кто-то другой облажался. Самоуверенный тип.

Правильно: Код проекта foo не компилируется в ОС Nulix версии 6.2. Я прочитал ЧаВО (FAQ), но там нет ничего о проблемах с Nulix. Вот запись сеанса компиляции; что я сделал неправильно?

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

Глупо: У меня проблемы с материнской платой. Не может ли кто-нибудь помочь?

Любой хакер на такой вопрос в уме ответит, скорее всего так: "Хорошо. Может, тебе еще помочь срыгнуть и пеленку поменять?", и нажмет клавишу Delete.

Правильно: Я попробовал X, Y и Z на материнской плате S2464. Когда это не сработало, я попробовал A, B и C. Обратите внимание на странный симптом при попытке сделать C. Очевидно, что эта фигня не фурычит, но результаты получаются непредсказуемые. Что обычно приводит к тому, что не фурычат многопроцессорные материнские платы с Athlon? Нет ли у кого идей для дополнительных тестов, которые помогут изолировать проблему?

Этот товарищ, напротив, кажется, достоин ответа. Он продемонстрировал способность решать проблемы, а не просто ждет, пока ответ упадет ему с неба.

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

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

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

Хакеры, в определенном отношении, очень жестокая интеллектуальная элита (в оригинале - meritocracy.). Я уверен, что они правы, и если бы я облажался, то был бы раскритикован или проигнорирован, независимо от прежних заслуг. Их предложение описать ситуацию в качестве инструкции для всех остальных стало непосредственной причиной составления этого руководства.

Вопросы, которые задавать не надо

Вот ряд классических глупых вопросов и о чем думают хакеры, когда на них не отвечают.

Вопрос:
Где можно найти программу или ресурс X?

Ответ:
Там же, где и я ее взял, придурок, — найти в Internet. Боже, неужели еще не все знают, как пользоваться Google?


Вопрос:
Как можно с помощью X сделать Y?

Ответ:
Если вы хотите сделать Y, надо так и спрашивать, не предполагая заранее использование метода, который может вовсе не подходить. Вопросы такого вида часто задают те, кто не просто ничего не знает об X, но сбит с толку решаемой проблемой Y и слишком сконцентрирован на деталях своей конкретной ситуации. Обычно лучше игнорировать таких людей, пока они не сформулируют свою проблему лучше.


Вопрос:
Как сконфигурировать приглашение командного интерпретатора?

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


Вопрос:
Можно ли преобразовать AcmeCorp-документ в TeX-файл с помощью программы преобразования файлов Bass-o-matic?

Ответ:
Попробуйте и узнаете. Так вы, во-первых, узнаете ответ, а, во-вторых, перестанете тратить мое время.


Вопрос:
Моя {программа, конфигурация, мой оператор SQL} не работает

Ответ:
Это вообще не вопрос, и я не собираюсь задавать еще десяток наводящих вопросов, чтобы выяснить, в чем на самом деле состоит ваша проблема — у меня есть дела и поинтереснее.

Когда я вижу подобные вопросы, то обычно посылаю один из следующих ответов:

Вам к этому больше нечего добавить?

Ой, это очень плохо. Надеюсь, вы уже это исправили.

И какое это имеет отношение лично ко мне?



Вопрос:
У меня проблемы с Windows-машиной. Не могли бы вы помочь?

Ответ:
Да. Выкиньте этот Microsoft-овский мусор и поставьте себе операционную систему с открытым исходным кодом, например, Linux или BSD.

Примечание: вы можете задавать вопросы, связаные с Windows-машинами, если они относятся к программе, имеющей официальную версию для Windows, или взаимодействующей с машинами под Windows (например, Samba). Просто не удивляйтесь ответу, что проблема - в Windows, а не в самой программе, потому что Windows - настолько "крива" в целом, что зачастую именно так и бывает.


Вопрос:
Моя программа не работает. Я думаю, проблема в системном компоненте X.

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


Вопрос:
У меня возникли проблемы с установкой Linux (или X). Не могли бы вы помочь?

Ответ:
Нет. Чтобы решить эту проблему, мне нужен непосредственный доступ к вашей машине. Задайте вопрос местной группе пользователей Linux, которые смогут помочь лично.

Примечание: вопросы об установке Linux могут быть уместными в форуме или списке рассылки, посвященном конкретному дистрибутиву, если проблема связана с этим дистрибутивом, или в форумах локальных групп пользователей. В этом случае, не забудьте точно описать подробности сбоя. Но сначала тщательно поищите в Web, указав ключевые слова "linux" и все подозрительные компоненты оборудования.


Вопрос:
Как взломать пароль пользователя root/получить расширенные привилегии/прочитать чужую электронную почту?

Ответ:
Да ты просто пошляк, раз хочешь такое сделать, и идиот, раз просишь хакера тебе помочь.

Не реагируйте как неудачник

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

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

Смириться. Это - нормально. На самом деле, это хорошо и целесообразно.

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

Были хакерские форумы, где, исходя из неправильно понятой гипертрофированной вежливости, участникам запрещалось посылать сообщения об ошибках в чужих сообщениях. Им было сказано: "Если не хотите помочь пользователю, молчите". Отток знающих участников в другие форумы привел к их вырождению в бессмысленную болтовню и к полной бесполезности с технической точки зрения.

Выбирайте: преувеличенная "дружественность" (такого рода) или полезность.

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

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

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

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

Реакция на грубость

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

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

С другой стороны, иногда можно встретиться с грубостью и вызовом, не имеющими никаких видимых оснований. Обратная сторона этой медали в том, что такая реакция является вполне приемлемой формой постановки на место действительных грубиянов, - мы отсекаем их недостойное поведение остро отточенным словесным скальпелем. Однако вы должны быть очень уверены в своей позиции, прежде чем пытаться этим заняться. Грань между указанием на невежливость и началом бессмысленного "базара" (в оригинале - flamewar) настолько тонкая, что и сами хакеры нередко ее переходят. Если вы - новичок или просто случайный читатель, шансов избежать такой грубой ошибки немного. Если вас интересует информация, а не развлечение, лучше уберите руки с клавиатуры и не рискуйте вступать в подобные дискуссии.

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

В следующем разделе мы поговорим о другой проблеме; о своего рода "грубости", с которой можно встретиться, когда именно вы не правы.

Если вы не поняли...

Если вы не поняли ответ, не шлите тут же требование его объяснить. Используйте те же источники информации, что и при поиске ответа на исходный вопрос (руководства, ЧаВО, Web, опытные коллеги), чтобы понять ответ. Если и после этого вам необходимы разъяснения, покажите, что вы узнали сами.

Например, предположим, я вам ответил: "Похоже, у вас завис zentry; надо проверить". Тогда плохим уточняющим вопросом будет: "А что такое zentry"? А хорошим: "OK, я прочитал страницу справочного руководства, и про zentry там упомянуто только в опциях -z и -p. Ни в одной из них не сказано, как сбросить зависший zentry. Надо ли использовать одну из этих опций, или я что-то неправильно понял?"

Как интерпретировать ответы

RTFM и STFW: как понять, что вы серьезно облажались

Есть древняя и священная традиция: если вы получаете ответ "RTFM", значит, отвечающий думает, что вам стоит почитать руководство (Read The Fucking Manual). Он почти наверняка прав. Читайте.

У ответа RTFM есть более молодой аналог. Если вы получаете ответ "STFW", значит, отвечающий думает, что вам стоит поискать ответ в сети (Search The Fucking Web). Он почти наверняка прав. Ищите.

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

Часто тот, кто посылает один из подобных ответов, имеет под рукой руководство или web-страницу с необходимой вам информацией, и смотрит на нее, когда набирает ответ. Эти ответы означают, что, по его мнению, во-первых, необходимую вам информацию легко найти и, во-вторых, вы большему научитесь при поиске информации, чем если вам ее преподнесут под нос на тарелочке.

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

Пошлите краткое описание решения

После того, как проблема решена, пошлите сообщение всем, кто вам помог; дайте им знать, чем все закончилось, и поблагодарите еще раз за помощь. Если проблема вызвала общий интерес в списке рассылки или дискуссионной группе, имеет смысл такое сообщение послать туда.

Оптимально будет ответить в нити обсуждения, начатой с исходного вопроса, добавив в теме сообщения пометку 'FIXED', 'RESOLVED', 'РЕШЕНИЕ' или другой не менее очевидный признак решения. В списках рассылки с большим количеством сообщений, потенциальный отвечающий при взгляде на нить обсуждения "Проблема X", завершающуюся сообщением "Проблема X - РЕШЕНИЕ" понимает, что ему не нужно тратить время даже на чтение сообщений (если он лично не считает Проблему X интересной), и поэтому может потратить время на решение другой проблемы.

Такое сообщение не обязательно должно быть длинным и подробным; простое: "Привет! Проблема была связана с разрывом в сетевом кабеле! Спасибо всем. Билл", - уже лучше, чем ничего. Фактически, краткое и вежливое резюме лучше, чем длинная диссертация, если только решение не затрагивает серьезные технические аспекты. Напишите, какие действия позволили решить проблему, но всю последовательность поиска решения повторно описывать не надо.

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

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

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

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

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

Вежливость никогда не повредит, и иногда помогает

Будьте вежливы. Используйте фразы "Пожалуйста" и "Заранее благодарен". Дайте понять, что благодарны людям, бесплатно посвящающим вам свое время.

Если честно, это не так важно, как отсутствие ошибок в тексте вопроса, ясность, точность и детальность описания, использование открытых форматов и т.д. (и не заменяет все перечисленное); хакеры, в общем случае, предпочли бы получать грубые, но технически точные сообщения об ошибках, чем вежливое словоблудие. (Если вас это удивляет, вспомните, что мы ценим вопрос за то, чему он нас учит.)

Однако при нормальном техническом уровне вопроса вежливость действительно повышает вероятность получить полезный ответ.

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

Не помечайте свой вопрос как "Срочный", даже если для вас он именно такой

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

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

Так делать, однако, - крайне рискованно, потому что точка зрения хакера на серьезность и его интересы, вероятно, отличаются от ваших. Вопрос с международной космической станции, например, вызовет интерес, а вот вопрос от имени преуспевающего благотворительного фонда или политической партии, почти наверняка, - нет. Фактически, вопрос с темой "Срочно: Помогите мне спасти пушистых тюленят!" будет проигнорирован или злобно прокомментирован даже теми хакерами, которые считают, что жизнь пушистых тюленят имеет для них значение.

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

Избегайте бессмысленных просьб

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

В общем случае, вопросы с ответами да-нет лучше не задавать, если только вы не хотите получить ответ да-или-нет.

Не задавайте вопросы из домашних заданий

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

Если вы подозреваете, что вам подкинули вопрос из домашнего задания, но все равно не можете дать на него ответ, попытайтесь задать вопрос в форуме группы пользователей или (в крайнем случае) в "пользовательском" списке рассылки/форуме соответствующего проекта. Хотя хакеры его и "опознают", некоторые из продвинутых пользователей могут, по крайней мере, дать вам подсказку.

Задавайте ясные и четкие вопросы

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

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

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

Поэтому имеет смысл ограничить вопрос, чтобы свести к минимуму время, необходимое эксперту для его решения. Но зачастую это не то же самое, что упростить вопрос. Так, например, вопрос: "Можете ли вы дать мне ссылку на хорошее описание X?" - обычно куда разумнее, чем просьба: "Объясните мне X, пожалуйста". Если у вас проблема с неработающим кодом, разумнее будет попросить объяснить, что в нем не так, а не просить исправить ошибки.

Не просите отвечать на личный адрес электронной почты

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

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

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

Описывайте цель, а не отдельный шаг

Если вы пытаетесь разобраться, как что-либо сделать (а не сообщаете об ошибке), начинайте с описания цели. И только потом описывайте конкретный шаг на пути к ней, который вы не смогли выполнить.

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

Глупо:
Как заставить диалог выбора цвета в программе FooDraw воспринимать шестнадцатеричное RGB-значение?

Разумно:
Я пытаюсь заменить таблицу цветов в изображении нужными мне значениями. Сейчас я вижу только один способ сделать это - редактируя каждый слот таблицы, но я не могу задать шестнадцатеричное RGB-значение в диалоге выбора цвета программы FooDraw.

Вторая версия вопроса - разумна. Она позволяет получить ответ, в котором будет предложено средство, более подходящее для решения задачи.

Описывайте симптомы проблемы в хронологическом порядке

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

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

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

Описывайте симптомы проблемы, а не свои предположения

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

Глупо:
Я постоянно получаю ошибки SIG11 при компиляции ядра, и подозреваю, что причина - микротрещина на материнской плате. Как лучше всего это проверить?

Разумно:
На собранном мной компьютере K6/233 на материнской плате FIC-PA2007 (чипсет VIA Apollo VP2) с 256MB памяти Corsair PC133 SDRAM начинают часто возникать ошибки SIG11 примерно через 20 минут после включения питания, в ходе компиляции ядра, но они не возникают в первые 20 минут. Перезагрузка ни к чему не приводит, а вот отключение на ночь помогает. Замена всей памяти не помогла. Соответствующая часть результатов типичной компиляции прилагается.