понедельник, 21 июня 2010 г.

Учиться... Учиться? Учиться!

Источник: http://www.skipy.ru/philosophy/learning.html


Учитесь так, словно вы постоянно ощущаете нехватку своих знаний, и так, словно вы постоянно боитесь растерять свои знания.
Конфуций

Судьбы у людей очень разные. Программисты не исключение. Один в 40 лет стоит во главе преуспевающей компании, а другой в те же 40 лет остается простым разработчиком. Жалуется на возраст, на то, что с более молодыми тягаться непросто. Идти некуда. Жизнь не сложилась. И т.д. и т.п. Думаю, видели не раз. Отчего так происходит? От чего это зависит? Как этого избежать? Четкого ответа нет. Есть лишь некие мысли на тему, пища для размышления. Этими мыслями я и хочу поделиться.

Отчего с молодыми непросто тягаться? Скорость мышления? Отчасти. Однако, казалось бы, эта скорость с лихвой перекрывается опытом и знаниями. Недостаточно иметь быструю машину, надо еще знать, куда ехать. Иначе, пока ты будешь по отличному шоссе на большой скорости делать крюк, твой соперник может незаметной тропкой пешком добраться до финиша быстрее тебя.
Но факт – он и в Африке факт. Тягаться непросто. А значит – проигрывая в скорости мышления, не знаем тайной тропки. Почему? А вот это уже совсем другой вопрос! Как может получиться, что разработчик в 40 лет знает меньше, чем другой в 30? При том, что работает он существенно дольше. Где грабли? Именно об этом и пойдет речь.

Представьте себе ситуацию: вам надо что-то сделать, но вы не знаете, как. Как вы поступите – спросите у кого-то или начнете разбираться сами? Как часто вы поступаете первым способом? Как часто вторым?
Большая, если не большая часть тем в форумах по программированию, как правило, сводится к вопросу "как... ?". Как сделать это? Как реализовать это? Как? Как? Как?.. Причем зачастую для ответа на этот вопрос достаточно всего лишь прочитать пару страниц документации. Не нужно ничего сверхъестественного. И тем не менее – вопросы появляются с завидной регулярностью.
Иногда я спрашиваю: а почему вы задаете вопрос? Почему не найдете сами? Ответы самые разнообразные. Однако практически все из них сводятся к одному фундаменту. Приведу один из ответов, наиболее полно описывающий мотивацию вопросов:
А зачем мне копаться самому, если я могу спросить "гуру" и получить ответ гораздо быстрее?
К сожалению, это произнес один из моих коллег. Почему "к сожалению"? Потому что, по моему мнению, эта практика порочна. Чем именно? Читайте дальше.
Вот возник вопрос. Как сделать ...? Копаться и самому искать – долго. Да и лениво, если честно. А тут сидит "гуру". У него можно получить ответ легко и быстро. Дай-ка спрошу?!
Спросил. Действительно, не отрываясь от дела "гуру" выдал решение. То, что нужно. Вопрос. Как я поступлю в следующий раз?
А точно так же. Спрошу у "гуру". Раз, два, десять, сто... Чем больше раз я получу то, что мне нужно, тем больше вероятность того, что в следующий раз я поступлю так же. Чем больше я буду спрашивать, тем больше я буду знать. Хорошо! Хорошо ли?..
Почему "гуру" так легко отвечает на вопросы? Он сталкивался с этими случаями в практике? Совсем не факт. С частью – возможно. В остальных ситуациях – он просто знает принципы, на основании которых делает выводы для частных случаев.
Вопрос. Что буду знать Я, после того, как получу ответ на вопрос? А буду я знать... ответ для одного частного случая. Не более. Разве что мне объяснят и откуда ноги растут, но это, во-первых, может потребовать много времени, а во-вторых – быстро надоест самому "гуру".
Здесь надо поместить картинку. Жаль, у меня такой нет. Холмик свежей земли, воткнутая в него лопата и табличка со стрелкой вниз: "Собака". Ибо тут она и зарыта. До тех пор, пока я задаю вопросы, я знаю только ответы для частных случаев. Иногда я смогу вывести общие принципы, но это скорее исключение, нежели правило. А следовательно – я обречен спрашивать снова.
Ситуация подобна трясине. Чем больше мы спрашиваем, тем больше привыкаем к этому. Чем больше привыкаем, тем больше спрашиваем. Замкнутый круг. И сколько же времени будем спрашивать? Год? Два?.. Десять... А в 40 лет остается только жаловаться. С молодыми тягаться трудно... Жизнь не сложилась...
Что же получается? А получается, что любимая многими практика задавать вопросы – она выигрышна только в очень ближней перспективе. Сэкономили немного времени. А что было бы, если бы попытались искать самостоятельно?
Кажущийся минус – это отняло бы больше времени. Но вот отняло ли? Я бы сказал – заняло. Ибо за время поиска, во-первых, вы получите гарантированно больше информации, нежели задав вопрос "гуру". Просто потому, что до того момента, как вы найдете то, что вам нужно, вам придется прочитать много другого, не относящегося к проблеме напрямую. А, во-вторых, докопавшись, наконец, вы скорее всего найдете именно общий принцип. Знание которого и делает "гуру" – "гуру". И это – существенный плюс. Ибо в следующей сходной ситуации вы уже не будете тратить время на поиск решения. Более того, знание принципов дает возможность успешно применять их в совсем других областях. Это то, что называется "фундаментальность подхода".
Приведу пример такого подхода. В волновой оптике есть закон, если мне не изменяет память, Гюйгенса-Френеля. Он гласит, что при распространении волны каждая точка вторичного фронта является источником волны. Применяя этот, казалось бы, чисто физический закон, можно реализовать алгоритм поиска связной области на изображении, что нужно, скажем, для реализации заливки. Это показательный случай применения в одной области принципа, взятого из другой области.
Итак, в долгосрочной перспективе получается, что искать самому выгоднее. И именно поэтому мне жаль, что кто-то из моих коллег считает иначе. Тем самым он лишает себя возможности стать "гуру". А следовательно – подвергает себя риску наткнуться на проблемы, когда, откровенно говоря, делать что-то будет уже поздно.

Из любого правила есть исключения. Из того – тоже. Я вовсе не призываю рассчитывать только на себя. Безусловно, "гуру" существуют для того, чтобы к ним обращаться. Только делать это надо с умом. Как я уже показал выше, беготня к "гуру" с любым вопросом может не довести до добра. Однако, безусловно стоит обращаться за помощью в том случае, когда самому заниматься решением проблемы – нерационально. Скажем, когда для решения проблемы требуются знания, получение которых в данный момент займет неоправданно много времени.
Приведу пример. Как и большинство разработчиков я в некоторой степени знаю SQL. Могу спроектировать несложную базу с внешними ключами, каскадными изменениями и т.п. Могу писать несложные запросы. Но любой навороченный update с несколькими условиями, вложенными запросами, упорядочиванием записей и т.п. намного превосходит мои знания в этой области. Безусловно, я могу найти все, что мне надо. Я тешу себя надеждой, что моего интеллекта таки хватит, чтобы разобраться с этими вещами. Но сколько это займет времени? День? Два? Неделю? Весьма вероятно. Учитывая, что я буду идти, фактически, вслепую, ибо не знаю предметной области настолько, чтобы выбрать направление сразу. И, главное, – это все-таки за пределами МОЕЙ предметной области. Я Java-разработчик, с SQL я имею дело постольку-поскольку. И потому – совсем не факт, что мне в будущем понадобятся эти знания настолько, чтобы сейчас потратить кучу времени. Вот это – повод идти к "гуру". Хотя и тут я лично сначала попытаюсь что-то сделать сам. И в любом случае изучу предложенное "гуру" решение, на будущее.
Другой пример. Задача находится в пределах моей предметной области, но сильно выходит за границы моих знаний. Опять-таки, получение информации, необходимой для ее решения, займет неоправданно много времени. И в этом случае тоже стоит воспользоваться помощью более опытного человека.
Есть также ситуации, когда самому получить знания очень сложно, ибо они происходят из опыта. Классический случай – архитектура приложения. Никто и никогда не скажет, как нужно проектировать, ибо в каждом случае необходимо принимать свое решение. Да, есть такое явление, как шаблоны проектирования. Однако они, во-первых, тоже не панацея, а во-вторых – иногда могут дать и обратный эффект. То, что хорошо в одном случае, может быть плохо в другом. Да и сами шаблоны могут быть реализованы ОЧЕНЬ по-разному. В зависимости от конкретной ситуации необходимо выбрать наиболее подходящее решение. В качестве примера – почитайте статью Реализация шаблона Singleton. Даже такой простой шаблон может быть реализован сильно отличающимися способами. И я еще привел не все способы реализации!
В любом случае, при обращении к "гуру" я бы прежде всего просил показать направление, в котором копать. И только потом, если не получилось – спрашивал бы насчет решения.
  Подведем итоги. Личные достижения в области разработки программного обеспечения, как правило, связаны с уровнем профессионализма. Следовательно, если мы не хотим попасть в ситуацию, когда нас будут обходить более молодые – необходимо набирать опыт. Постоянно. Только так можно быть всегда на шаг впереди и оставаться "гуру". А наиболее рациональный (с прицелом на далекое будущее) способ набирать знания – искать ответы самостоятельно. В разумных пределах, разумеется. Если же затраты на поиски неоправданно велики – стоит обратиться к "гуру". Но и это делать с умом.

Надеюсь, суть мыслей ясна. Выбирает же каждый для себя. Сам. И только он отвечает за конечный результат.

Напоследок хочу сказать вот о чем. Недавно в одной из тем в форуме мне был задан вопрос – "если ты такой умный, то что ты тут делаешь?". Отвлекаясь от несколько некорректного тона вопроса, я хотел бы все-таки на него ответить.
Основная цель моего присутствия в форуме – отвечать на вопросы. Зачем? Очень просто. Моя текущая работа охватывает далеко не все области. И если я буду ограничиваться только тем, чем занимаюсь с 10 до 19, то во всем остальном безнадежно отстану. А я все-таки хочу быть профессионалом. Форум же хорош тем, что там всплывают вопросы из ОЧЕНЬ разных областей. И КАЖДЫЙ из этих вопросов становится темой для исследования. Почитать документацию. Закопаться в исходный код. Написать несколько тестов. И, даже ответив на вопрос, можно не останавливаться, а поискать еще и вокруг, раз уж все равно коснулся темы.
Хороший пример. Потребовалось кому-то узнать, как получить доступ к определенной точке изображения. В смысле, прочитать значение пикселя. Сначала я выдал несколько способов. Потом понял, что, собственно говоря, человеку НЕ НУЖНО получать значения, у него изначально неверный подход. Объяснил, как стоит подойти к решению его задачи. И тем не менее – на ближайшую неделю закопался в Java 2D Guide. Зато теперь я знаю, что такое цветовые профили, как представляются изображения и много чего другого.
Таким образом, ответ достаточно прост. Я постоянно отвечаю на вопросы в форуме потому, что таким образом узнаю что-то новое для себя. И именно это позволяет мне быть профессионалом и отвечать на вопросы. Круг замкнулся.
То же самое можно сказать и про материалы сайта. Каждая статья приводит к тому, что я начинаю исследования. Ибо в процессе написания неизбежно встают вопросы, о которых не задумывался раньше. И потому – это полезно прежде всего мне. Даже несмотря на то, что внешне это выглядит наоборот.
Думаю, теперь становится понятно, почему я зачастую отвечаю на вопросы достаточно кратко. Я скорее предпочитаю показать направление, в котором копать. К сожалению, многие на это обижаются. Им кажется, что для них будет лучше получить готовое решение.


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