Полагаю, каждый из нас (под нами здесь я имею в виду разработчиков программного обеспечения) сталкивался с ситуацией, когда решить возникающую техническую проблему без привлечения посторонних лиц не выходит. На этот случай существует множество полезных сайтов, вроде stackoverflow.com, где можно попросить совета в решении возникшей проблемы. Однако, перед тем как задать вопрос, недурно бы описать, что ты уже попытался сделать для решения своей проблемы. Мэтт Геммелл (Matt Gemmell), известный разработчик пользовательских интерфейсов для iOS и Mac, делится своими мыслями по этому поводу.


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

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

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

Немного поясню: под “новичками” я имею в виду не только выпускников и других молодых людей. Некоторые говорят, эта болезнь является продуктом современной образовательной системы Западных стран, и когда-то дела обстояли гораздо лучше. Может быть это так, а может быть и нет, я не знаю наверняка, поэтому не буду никому навязывать свое мнение по вопросу современности этой проблемы. Болезнь, о которой я говорю, похоже одинаково заразна и для молодых и для немолодых разработчиков.

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

1. Можем мы установить http-соединение в приложении. если да, мне нужен этот код. Я посмотрел на NSURLconnection. Я не смог интегрировать этот код в свое приложение. 2. Я хочу отображать картинку с сайта. Может кто-нибудь дать мне код? Если у кого-то есть пример такой программы, пожалуйста, дайте мне.

Так в чем же проблема? Проблема не в том, что автор плохо говорит по-английски (прим. пер. - автор приведенного поста на форуме, действительно, был не очень грамотен). Дело не в пунктуации и грамматике, поскольку эти вещи не особо важны для того, чтобы понять, что хочет спросить человек.

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

Необходимо отметить, что в приведенном примере все не так плохо, как могло бы быть; небольшой проблеск надежды заметен в словах “посмотрел на NSURLconnection”. Это внушает некоторый оптимизм, поскольку NSURLConnection действительно тот класс, который надо изучить для того, что создавать HTTP-соединения в Cocoa. Так или иначе, “посмотрел” - это все, что сделал наш друг, он “не смог интегрировать этот код” и поэтому сдался.

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

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

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

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

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

  1. Формулированием вопроса, правильный ответ на который каким-то образом улучшит ваше понимание.
  2. Попыткой ответить на этот вопрос.

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

У меня есть большой личный опыт общения с людьми, демонстрирующими это беспокоящее нежелание учиться, исследовать, пытаться. За долгие годы, я написал много кода, у меня есть множество open-source разработок для платформ, с которыми я работаю. И поскольку разработчики open-source являются в некотором роде добровольными учителями, я получаю много писем с просьбами о помощи в решении той или иной проблемы. И я помогаю всегда, когда могу.

Я помог буквально сотням людей, делавших первые шаги в изучении Cocoa с тех пор, как была выпущена Mac OS X. Я не отвечаю шаблонными письмами, напротив - я каждый раз пишу индивидуальный ответ. Абсолютно все, начиная с вопросов относительно кода (включая, но не ограничиваясь вопросами, касающимися моего собственного кода), рекомендаций книг, заканчивая советами по поводу того, как вообще начать программировать - я отвечал на все эти вопросы и я считаю это своим долгом. Люди, умеющие что-то делать всегда испытывают сильное желание помочь тем, что хочет этому научиться.

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

Секрет прост: единственным ограничением является желание учиться.

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

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

Существует сильный негативный эффект растущего нежелания делать хоть что-то, чтобы самостоятельно решать свои проблемы. Люди, способные помочь, начинают появляться в чатах, форумах и списках рассылки все реже и реже. “Плохое соотношение сигнал/шум”, говорят они. А страдают от этого добросовестные (под ними я имею в виду людей, желающих учиться, которые просто осваивают новую предметную область) разработчики, которые используют эти источники для получения ответов на свои правильные вопросы. У этих людей меньше шансов получить квалифицированную помощь из-за того, что трудно отличить их от ленивых бездельников.

Это ужасная ситуация, и сегодня она актуальна как никогда прежде - особенно для молодых и/или испытывающих всплеск популярности платформ. Для них число опытных разработчиков невелико, средний уровень опыта ниже, количество просящих помощи больше, гораздо больше пропорция ленивых разработчиков, работающих в стиле “хватай-деньги-и-беги”, чем для других, более старых платформ. Речь идет, конечно, об iPhone, Android и подобных платформах.

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

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

Попробуйте потрать несколько минут и пробежаться по этим пунктам:

  • Вам удалось разбить ваш вопрос или проблему на части, чтобы задать конкретный вопрос? В разработке программного обеспечения вы можете в большинстве случаев отнести проблему к одной из двух категорий: (1) что-то, что может быть разделено на составляющие и (2) что-то, что вы уже знаете или можете быстро найти, как это сделать.
  • Является ли ваша проблема стандартной, для которой точно существуют примеры кода и документация? Не существует ни одного набора инструментов GUI, для которого в документации не описано, как вывести окно на экран. Нет ни одного языка программирования, для которого не известно как читать содержимое файла. Просмотрите документацию или немного поищите. Если проблема из этой категории, ее решение очень близко. Вы сможете его найти!
  • Попробуйте поискать в Интернете. Это очевидный совет, я знаю, но тем не менее. Если вам не удается получить нужный результат, попробуйте сузить область поиска. Не ищите “оператор if”, если вам интересен оператор if в ruby, вместо этого попробуйте “оператор if ruby”. Еще лучше будет найти сайт, посвященный определенному языку или технологии, с которой вы работаете, и поискать на этом сайте. В случае с Cocoa таким сайтом является CocoaBuilder. Кто-то уже мог задать ваш вопрос, и может быть, даже не один раз.
  • Кто бы ни создал ваш язык или фреймворк или API или что-либо еще, он обязательно создал набор примеров кода, даже не сомневайтесь. Этот код предназначен для того, чтобы у вас была основа для решения некоторых распространенных задач, в этом коде могут быть реализовано то, что вам необходимо сделать. Проверить примеры кода займет всего несколько минут, и вполне вероятно, что вы найдете куски кода, которые могут пригодиться вам в будущем.
  • Используйте интегрированную или онлайн-справку вашей IDE. В Xcode встроен браузер документации. Eclipse содержит документацию по классам Java. PHP.net содержит полезные php-скрипты. Найдите документацию производителя того, с чем вы работаете и ищите в ней. Вы наверняка найдете что-то, что почти всегда будет полезно.

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

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

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

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

Поэтому в следующий раз, перед тем как задать вопрос, подготовьте убедительный ответ на вопрос “А что ты уже попытался сделать?”

Если ваш ответ “Почти ничего”, помяните мое слово - в ответ вы получите “Тогда почему я должен тебе помогать?”

Источник