Скорее всего, вы уже слышали имя Кея Хорстманна (Cay S. Horstmann). Он — довольно видный человек в мире Java и автор многих книг по нашему с вами любимому языку. Среди них — классический курс «Core Java» (на русском выходил в двухтомнике «Java. Библиотека профессионала») и серия с кратким изложением по сути «Java for Impatient» (на русском выходили «Java SE 8. Вводный курс» и «Java SE 8. Базовый курс»). Носит гордое звание «Java-чемпион». А по этой ссылке можно найти его олсдкульный сайт с интересной информацией.
Кей Хорстманн и его 1500 слов о том, как стать лучшим Java-программистом   - 1
Предлагаем вашему вниманию перевод статьи для ресурса InformIT, в которой Кей озвучивает несколько советов начинающим и продолжающим программистам о том, как стать лучше в своей профессии. Однажды Дженнифер Бортел, редакционный директор InformIT, обратилась ко мне с просьбой черкнуть о том, как стать лучшим Java-программистом. Она предположила, что я, автор Core Java for the Impatient, могу что-то об этом знать. «Нет ничего проще, просто купите книгу, — сначала подумалось мне. Но такой ответ не прокатил, поскольку я должен уместить это в 1500 слов, а до этого момента их всего 62* (разумеется, при переводе статьи мы не стремились сохранить количество слов — прим. перев.). Недавно я получил письмо от знакомого разработчика, которого на собеседовании спросили о том, почему следующий код не является потокобезопасным:
class ThreadSafeClass extends Thread
{
     private static int count = 0;

     public synchronized static void increment()
     {
         count++;
     }

     public synchronized void decrement()
     {
         count--;
     }
}
Мой приятель решил, что в этом примере код потокобезопасный, и я согласился с ним, отметив, что там не хватает одного ключевого слова static во втором методе, и после его вставки доступ контролируется встроенной блокировкой объекта класса. Я также сказал, что это не очень хороший вопрос для собеседования, поскольку если вам нужен потоковый счетчик, лучше использовать AtomicInteger. Но вот посреди ночи я проснулся, и задался вопросом: а что, если это слово static было пропущено неслучайно? Возможно, какой-то подлый интервьюер целенаправленно выстроил этот пример именно так, чтобы ввести кандидатов в заблуждение? Поэтому я снова написал задавшему мне вопрос разработчику и сказал, что, вероятно, ранее ошибся: в параллельной Вселенной под названием «Вопросы собеседований» ответ на этот вопрос следующий: «Второй метод содержит блокировку объекта». После этого ответа парень спросил, не веду ли я YouTube-канал, где учу, как справляться с такого рода задачками с собеседований. Увы, я этим не занимаюсь. Я учу компьютерным наукам и пишу книги, но моя главная цель — не подготовить лучшего «решателя задачек на собеседованиях», а сделать из моих студентов лучших программистов. Когда-то Питер Норвиг (Peter Norvig, американский учёный в области искусственного интеллекта, директор по исследованиям Google, — прим. перев.) написал замечательную статью в своем блоге. Он утверждал, что книги, обещающие научить вас Java за 24 часа или 21 день, попросту смешны. С ним сложно не согласиться: чтобы стать экспертом в любой сфере нужно 10 лет или, возможно, 10 000 часов. И хорошо известно, что эксперты обрабатывают информацию не так, как новички. В классическом эксперименте, опытным и начинающим шахматистам в течение нескольких секунд показывали шахматную доску с определённым расположением фигур, а затем её прятали и просили расставить фигуры так, как было. Новички справлялись с задачей не очень хорошо, а вот эксперты — без проблем. Но только при одном важном условии: расположение фигур должно соответствовать реальной игре. Если фигуры были помещены случайным образом, эксперты восстанавливали доску ничуть не лучше новичков.
Кей Хорстманн и его 1500 слов о том, как стать лучшим Java-программистом   - 2
Вот почему на вопрос из письма я ответил ровно так, как ответил. Мой опыт — это реальное программирование, а не прохождение собеседований, поэтому я инстинктивно добавил недостающее ключевое слово и сделал «неправильный» вывод. Я хотел бы думать, что меня всё равно бы взяли на работу, после того, как я пояснил бы, что произошло, и почему я никогда не напишу такой код, как в примере без моего дополнения. Пожалуй, если бы такой ответ их не удовлетворил, мне бы самому не хотелось бы с ними работать.
Так вот, я не думаю, что подготовка к сертификационным экзаменам или к собеседованиям превратит вас в лучшего программиста. Я также уверен, что не сработает и покупка большого количества книг по программированию с их дальнейшим прочтением от корки до корки (хотя мне, как автору этих самых книг, и не хотелось бы этого признавать!). На самом деле, действительно хороший способ стать лучшим программистом — это создавать как можно больше программ. Время от времени я преподаю вводный курс по информатике в своем университете. Это, безусловно, самый трудный курс, из всех, которые мне доводилось вести. Он даже сложнее, чем курс, читаемый для выпускников. В те времена, когда я только-только начал работать молодым профессором, я старательно начитывал студентам лекции, в которых послушно освещал вопросы программирования, такие, как разница между циклами for, while и do. Затем я задавал студентам четыре трехнедельных проекта. И этот предмет преподавался именно так с начала времён во всех вузах. После моей первой попытки инструктор курса второго семестра пожаловался, что большинство моих бывших учеников после первого семестра программирования толком не усвоили даже простые циклы. И такие результаты тоже имели место быть с начала времён. Помните статью «FizzBuzz или почему программисты не умеют программировать» ? Когда вы изучаете иностранный язык, большинство заданий — это упражнения и практика, а вовсе не теория. Крайне важно «протолкнуть» знания в подсознание. Переломный момент наступает тогда, когда вам больше не нужно активно думать о каждом цикле, или (в случае французского языка), о каждом нерегулярном глаголе. Если этот момент наступил, значит, вы готовы перейти на следующий уровень. И ничего революционного в этой мысли нет.
Кей Хорстманн и его 1500 слов о том, как стать лучшим Java-программистом   - 3
Ключ ко всему — мгновенная обратная связь. Некоторые психологи считают, что мы могли бы сделать гораздо больше с компьютерным обучением с мгновенной обратной связью. Например, в другом классическом эксперименте начинающие пилоты-стажеры прошли тренировочную сессию, в которой от них требовалось снова и снова смотреть на приборную панель и описывать движение самолета. При этом они получали мгновенную обратную связь с указанием, правильно они это сделали или нет. После двух часов обучения они превзошли опытных пилотов. Разумеется, это не значит, что их сразу можно отправить в настоящий полёт, но они больше не нервничали из-за разнообразных и многочисленных циферблатов на приборной панели. Итак, если вы только начинаете изучать Java, выполнение множества практических заданий для тренировки — самая лучшая идея. Существует большое количество веб-сайтов и онлайн-курсов с автоматической проверкой правильности кода. Выберите тот, который предлагает настоящие задачи, а не абракадабру. В конце концов, вы хотите, чтобы ваше подсознание хорошо справлялось с тем кодом, который вы на самом деле будете писать на практике. Вот почему я не очень увлекаюсь примерами программирования, которые используют надуманные ситуации, такие как классы животных с методами, которые мяукают и лают. Через некоторое время вы освоите основы программирования. Чтобы перейти на следующий уровень, можно написать пару-тройку проектов. Несколько лет назад портал InformIT задал опытным программистам вопрос: «Назовите самый лучший способ для программиста изучить новый язык?». Если обобщить их ответы, можно вывести следующее: «используйте этот язык в вашем нынешнем проекте». Так вот, подумайте, что вы всегда хотели реализовать, — и вперёд. Двадцать лет назад, когда Java была ещё очень молода (на днях, 23 января Java исполнилось 22 года, — прим. ред.) мой друг, а временами и соавтор Гэри Корнелл позвонил мне и сказал: «Кей, мы собираемся написать книгу по Java». Мой ответ был о том, что ни он, ни я, ничего толком не знаем об этой Java, на что он парировал: «И что с того? У нас уже есть контракт на книгу». Делать нечего. Нам пришлось поспешить, поскольку кое-кто другой объявил о скором выходе книги «Научите себя быть Java-болванчиком за 24 часа»… Кажется, она называлась как-то так (Кей иронизирует над серией книг "For Dummies" — "для чайников", слово "Dummy" можно перевести как "болванчик", — прим. перев.). Для изучения нового языка я начал с проектов — написал программу, которая создала пользовательский интерфейс для планирования выхода на пенсию, а затем программу, которая подключалась к погодному сайту и отображала отчет о погоде. После неё — программу, имитирующую движение автомобилей по автостраде. На то время эти программы были просто потрясающие! Чтобы их создать мне пришлось изучить java.awt, java.net и нити (threads). И я должен был узнать, как на самом деле заставить всё это работать, а не только то, что написано в документации. В то время это были совершенно разные вещи. Вот почему книга «Core Java» [1] стала хитом: она была не «для чайников».
Кей Хорстманн и его 1500 слов о том, как стать лучшим Java-программистом   - 4
В то время изучать Java было гораздо сложнее. У нас не было таких сайтов, как Stack Overflow (и JavaRush тоже не было, — прим. ред.). На этом моменте я перехожу к формулировке следующего совета по улучшению вашего программистского «скилла». Итак, когда вы будете работать над собственным проектом, вы обязательно где-нибудь застрянете. В таком случае идите на специализированный форум и пытайтесь найти ответы. Поверьте, это — отличная идея. Сначала вы будете задавать вопросы, которые до вас уже спрашивали многократно. Но вскоре вы наберётесь знаний, и ваши вопросы станут более уникальными. Это потрясающий способ учиться! Конечно, речь не о том, чтобы просто скопипастить кусок кода и спросить: «И что мне теперь с этим делать?». Нужно докопаться до сути, пояснить, какие попытки решить задачу вы уже сделали прежде, чем застрять. Кстати, в большинстве случаев, пока я формулирую вопрос в письменном виде, я сам нахожу ответ и мне остается лишь сказать самому себе: «Да что тут за проблема, всё и ежу понятно» ещё до того, как я отправил вопрос. Но даже если этого не произошло… Поверьте, продуманные вопросы, как правило, привлекают вдумчивые ответы. Только не забывайте возвращать социальный должок, отвечайте на вдумчивые вопросы других людей. И формулировка вопросов, и ответы на вдумчивые вопросы делают вас лучшим программистом. «Так, а что с книгами? — спросите вы. — Неужели благодаря Google и Stack Overflow они окончательно и бесповоротно устарели?». Всякий раз, когда я пробираюсь через дебри новой технологии, я полагаю, что я — мужественный человек, и смогу побороть все сложности в одиночку. Но час бессмысленных мучений сменяет час здравомыслия — и я покупаю книгу. В настоящее время технические книги — потрясающе выгодное предложение. Если я заплачу 40 долларов за электронную книгу и получу быстрый ответ только на один вопрос, я уже верну потраченные деньги. Мне неприятно разочаровывать своих коллег по перу, но я ни разу не читал технические книги от начала до конца. Я начинаю с того места, где, как мне кажется, расписана моя проблема и ее решение, и я читаю до тех пор, пока не пойму, как её решить. По этой причине, в настоящее время я стараюсь писать книги, которые можно читать именно так. Такой подход породил серию «Для нетерпеливых». И на этом моменте мне следует остановиться — я превысил редакторский лимит в 1500 слов. Добавлю только, что чтобы стать лучшим программистом, начните с признания того, что существует много уровней знаний.
  1. Вначале «втяните» базовые языковые конструкции в свое подсознание, то есть доведите их знание до автоматизма путем решения большого числа упражнений.

  2. Как можно быстрее приступите к работе над реальными проектами, интересными вам.

  3. Затем присоединитесь к сообществу, где вы можете задавать вопросы и отвечать на них.

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