Мой друг Крис Некласон, специалист по разработке ядра операционной системы, однажды сказал, что программировать все равно что строить дом из спичек: требуется уйма времени, внимания и изобретательности. Познакомившись с Java, я оценил по достоинству его аналогию. И понял, насколько тяжел его крошечный «молоток»!
И придумал собственную метафору: изучение языка программирования похоже на... да просто на изучение незнакомого разговорного языка! Ничего нового здесь нет, но о чем, насколько я знаю, никогда не упоминалось, так это о том, что сходство гораздо большее, чем просто синтаксическая аналогия. Можно также провести и культурные параллели. Для масштабного мыслителя изучение культуры языка Java (кто его использует и почему, каковы его философские и идеальные аспекты применения) требует внимания не меньше, чем при овладении ключевыми словами.
Кроме того, оказалось, что выстроить линию поведения при поиске информации, нужной мне, как человеку, относительно мало знакомому с технической стороной дела, столь же важно, как знать, когда нужно кланяться во время японской чайной церемонии.
Как земляк земляку
Окончив колледж десять лет назад и получив свою первую работу в отделе продаж компании, поставлявшей системы Unix, я довольно быстро уяснил, что познания в технологии в основном определяются кругом общения. Так что я, не унижая своего достоинства, постоянно «ошивался» в курилке с инженерами компании, специально приобрел и изучил книги Трэйси Киддера «Душа новой машины» и Дага Хофстадтера Goedel, Escher, Bach. (Недавно я вычитал в одном журнале мод: «Если вы хотите продать дорогой костюм клиенту из Зимбабве, то узнайте хотя бы, где эта страна находится».)
Это сработало. Стоило моему новому коллеге-инженеру Дж. Б. услышать слово «прототип», сорвавшееся с моих «нечистых» (читай: торгашеских) губ, как у него сразу пропало предубеждение ко мне, и я узнал от него массу полезных сведений об иерархических базах данных. Кому-то такой подход к добыванию технической информации, связанный с манипуляцией людьми, может показаться нечистоплотным, но я предпочитаю думать, что это просто метод «глубокого социального погружения». Между прочим, в результате я по-настоящему подружился с самыми «крутыми» людьми в компании.
Для этой статьи я подобрал еще несколько крупиц мудрости из области культуры и образования (заметки для себя, честное слово), которые помогают мне пробираться в моих нынешних и иногда вызывающих неверие в собственные силы приключениях при изучении Java.
Как набраться уму-разуму в области Java?
Признаюсь, когда я задаю вопросы, мой голос звучит смущенно (потому что я действительно стесняюсь). Смущение, конечно, присуще многим. Но сейчас я говорю о смущении новичка, о свойстве, которым пользуются в своих интересах бессчетные поколения старшеклассников, продавцы подержанных автомобилей и парижане. Эту особенность часто используют, чтобы помучить молодых и наивных.
Такова уж человеческая природа. Любой новичок боится, что над ним будут издеваться из-за его невежества. Но бояться не стоит, немного энтузиазма и искренности могут принести хорошие плоды. Например, парижане обычно добреют, стоит только попытаться сказать что-то по-французски. Так же ведет себя и большинство знатоков языков программирования (в том числе и мой друг Дж. Б.).
Мой опыт «технического» писателя говорит, что если вы ищете ответы, то позаботьтесь о том, чтобы задавать правильные вопросы. Но если вы продемонстрируете, что проделали по крайней мере небольшую домашнюю работу над проблемами, решить которые призван язык Java, то будете щедро вознаграждены. Кроме того, знание еще одного языка не повредит.
Я немного знаю французский, немецкий и испанский. Имея возможность сравнить два романских языка с прагерманским, я могу оценить чистоту и разумную конструкцию испанского и французского. (Никаких падежей! Если бы только у них убрать родовые окончания слов...) Зная немного романские языки, я могу оценить выразительность и утонченность немецкого и английского языков.
Так же и с языками программирования. Хотя ведутся серьезные споры о том, действительно ли «лучше» сначала изучать C++, и только потом Java (или сначала язык C, а потом C++ , коли на то пошло), а опытные программисты считают необходимым знать больше одного языка программирования, чтобы понять и использовать преимущества каждого. По-видимому, и так подсказывает логика, каждый следующий язык должен быть также легче в изучении, - если только подходить к делу гибко и не стараться в одной упряжке объединить «коня и трепетную лань».
Обсуждая отличия процедурного языка программирования от объектного, я просто обязан упомянуть об одной странности в мире Java, которая меня забавляет как студента каждый раз, когда я (неизбежно) с ней встречаюсь. Это философская несуразица, которая присутствует практически в каждой книге о Java в моей библиотеке.
Во введениях к этим книгам утверждается, что объектно-ориентированное программирование призвано отразить реальный мир, следовательно, эта модель программирования интуитивно более понятна, чем модель устаревших процедурных языков. Но когда в каждой книге вы доходите до главы, посвященной объектному программированию, вас неизменно предупреждают, что понимание объектов - это один из «самых трудных аспектов Java», а это говорит о том, что данная модель не настолько интуитивно понятна, как об этом говорилось в начале. Возможно, с этим парадоксом я разберусь, когда лучше пойму структуру Java.
Сказано - сделано
Некоторым из нас претит мужланский, прямолинейный подход. Мы, интеллектуалы, привыкшие мыслить масштабно, сопротивляемся, когда нам говорят, что для построения дома нужно найти экскаватор и вырыть котлован под фундамент. Нет, нам сначала нужно подписаться на Architectural Digest и съездить на экскурсию по историческим достопримечательностям.
Я проделал нечто подобное, решив изучить испанский: собрался в Латинскую Америку, доводил чуть не до слез своих учителей и однокурсников вопросами об эволюции синтаксиса и рассуждениями о логической структуре латыни (в свое оправдание могу сказать, что я выучил язык не хуже, чем большинство моих приятелей-студентов).
Но когда все сказано и сделано, неизбежно наступает этап сухого тяжелого труда программирования и следующая за ним встреча с дьяволом. Программист и писатель Роджерс Кэйденхед называет это «страхом перед компилятором». Об этом подробно написано в его намеренно забавной, но при этом остроумной и основательной книге для начинающих Teach Yourself Java 1.1 Programming in 24 Hours («Как за сутки самостоятельно изучить программирование на Java 1.1»). Сегодня это мой самый любимый путеводитель по Java.
Конечно, как начинающий программист, я могу пожаловаться, что мой компилятор меня просто не понимает. Или же понадеяться, что мой неповторимый диалект будет правильно понят. Но в программировании такой номер не проходит.
К сожалению, мой афоризм («обучение программированию сродни изучению нового разговорного языка») верен только до того момента, пока дело не доходит до компилятора. Если я не говорю на суахили в Зимбабве, то все же могу показать на молоко, и лавочник, возможно, поймет мои намерения. Но если Java не понимает формулировку, то сколько бы вы ни показывали пальцем, жестикуляция не заменит пропущенной точки с запятой. И единственный способ нарастить необходимую синтаксическую «мускулатуру» - это соответствующая непрерывная практика.
И наконец, найдите хороший словарь. Он сам говорит за себя. К счастью, найти хороший словарь по программированию на языке Java легко. Он называется Internet.