JavaRush/Java блог/Java Developer/Кей Хорстманн и его 1500 слов о том, как стать лучшим Jav...

Кей Хорстманн и его 1500 слов о том, как стать лучшим Java-программистом

Статья из группы Java Developer
участников
Скорее всего, вы уже слышали имя Кея Хорстманна (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. Как только вы это сделаете, на собеседованиях вы сможете говорить со знанием дела и опытом. И не так уж и важно, решите ли вы надуманную головоломку.
Комментарии (21)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Юрій Якимчук
Уровень 33
31 января 2018, 15:47
Хотите стать писателем - пишите. Хотите стать художником - рисуйте. Все несколько сложнее, когда хотите стать нейрохирургом...
Василий Малик Senior Java-разработчик в CodeGym Expert
31 января 2018, 09:01
Очень толковая статья, и все, о чем пишет автор приходит с опытом. Кстати, интересная задачка про FizzBuzz. Даже написал ее для себя на листочке и потом проверил в IDE:
public static void main(String[] args) {
    for (int i = 1; i <= 100; i++) {
        if (i % 3 != 0 && i % 5 != 0) {
            System.out.print(i);
        } else {
            if (i % 3 == 0) {
                System.out.print("Fizz");
            }
            if (i % 5 == 0) {
                System.out.print("Buzz");
            }
        }
        System.out.print(" ");
    }
}
Юрій Якимчук
Уровень 33
31 января 2018, 16:29
пфф...
WITH RECURSIVE t(n) AS (
    select 1
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT
    n,
    if (n % 3 = 0) then 'Fizz' endif || if (n%5=0) then 'Buzz' endif l
FROM t
where l is not null
Ashuprox
Уровень 7
1 февраля 2018, 20:42
А вот на моём рабочем инструменте:
sub FizzBuzz {
   foreach my $i (1..100) {
      unless ($i % 3 == 0 || $i % 5 == 0) {
         print $i;
      }
      else {
         print 'Fizz' if ($i % 3 == 0);
         print 'Buzz' if ($i % 5 == 0);
      }
      print ' ';
   }
   return ();
}
Юрій Якимчук
Уровень 33
2 февраля 2018, 09:27
Надо дойти до 20го лвл срочно, ато решать задачки начинаю с извратами :)
public class MyClass {
    public static void main(String args[]) {
         FizzBuzz(1);
    }

    public static void FizzBuzz(int x) {
        if (x > 100) return;
        System.out.print(x + " ");
        if (x%3==0) System.out.print("Fizz");
        if (x%5==0) System.out.print("Buzz");
        System.out.println();
        FizzBuzz(x+1);
    }
}
Василий Малик Senior Java-разработчик в CodeGym Expert
2 февраля 2018, 12:46
Для чисел кратных трем или пяти не нужно выводить само число. из условия: "При этом вместо чисел, кратных трем, программа должна ... "
Юрій Якимчук
Уровень 33
2 февраля 2018, 16:17
Это какбы не задачка для валидатора ;)
30 июня 2018, 15:03
Oracle:
select
case when mod(level,15)=0 then 'FizzBuzz'
when mod(level,3)=0 then 'Fizz'
when mod(level,5)=0 then 'Buzz'
else level
end
from dual
connect by level <=100
hidden #1864455
Уровень 6
30 сентября 2018, 09:53
/* результат вниз */
select case when mod(level,3) = 0 then 'Fizz'
when mod(level,5) = 0 then 'Buzz'
else to_char(level)
end result
from dual
connect by level <= 100;

/* результат в строку */
select listagg(case when mod(level,3) = 0 then'Fizz'
when mod(level,5) = 0 then 'Buzz'
else to_char(level)
end || ' ' ) within group (order by level) result
from dual
connect by level <= 100;
hidden #1864455
Уровень 6
30 сентября 2018, 10:03
и ошибку несоответствия типов данных словите when mod(level,5)=0 then 'Buzz' -- varchar2 else level -- number
3 октября 2018, 08:16
альтернатива to_char для переносимости на другие платформы cast(level as varchar) - в oracle varchar автоматически приводится к varchar2
3 октября 2018, 08:19
второй запрос не на всех сейчас используемых версиях оракла будет работать: listagg появился только в версии 11.2
hidden #1864455
Уровень 6
4 октября 2018, 07:44
вопрос не в переносимости, в примере Вашего case не явного преобразования не произойдет, ни на какой из версий Oracle, ну а мы про Oracle.
4 октября 2018, 22:20
да ясно это: писал запрос "на коленке", без рабочей среды. подобный запрос (с иерархией) вообще новичок не напишет, если что ) по поводу способов конвертации я дополнил информацию для читателей, для расширения их кругозора. кстати, правильно будет, если уж на то пошло с указанием размерности cast(level as varchar(20)) то есть тут я тоже первоначально "допустил ошбику" ))
hidden #1864455
Уровень 6
6 октября 2018, 18:08
Я понимаю о чем Вы. Сцена: -Хаха вот смотрите как я умею в Оракл!!!! -Сэр, Ваш код не работает -ммммм ну общем смотрите, я так умею. на коленке, переносимость, listagg работает не у всех, cast и тп [умный вид] Это просто ad hoc запрос... Мой посыл - пишите, что-то - пишите правильно, что бы не выглядеть потом глупо))
7 октября 2018, 18:50
Ошибку я признал, а дальше ваши фантазии: глупо по-моему именно это. Информация, которую я дал дополнительно, полезна всем, кто заинтересуется, и мне кажется, вы её не знали. Но конечно же снова могу ошибаться. Ещё могу дополнить, что с листаггом вы словите ошибку (догадайтесь, на какую тему), если будете брать не до 100, а до 10 тыс, например. Ну и т. д. В русский язык тоже надо уметь, а то с трудом понял смысл. Правильно ваш посыл передаёт следующее предложение без ошибок: "Мой посыл: пишЕте что-то - пишите правильно, что бы не выглядеть потом глупо))" С этим соглашусь относительно работы, а на форумах писать: кто выверяет с помощью рабочей среды каждый свой ответ на НЕ тематическом форуме - по-моему, это и есть "показать умный вид". Но это разумеется, исключительно моё мнение, которое может не совпадать с вашим. Желаю успехов в работе.
hidden #1864455
Уровень 6
8 октября 2018, 21:44
ой все) лень читать. Хорошего обучения.
Август Лисицын
Уровень 23
30 января 2018, 14:17
"Выберите тот, который предлагает настоящие задачи, а не абракадабру. В конце концов, вы хотите, чтобы ваше подсознание хорошо справлялось с тем кодом, который вы на самом деле будете писать на практике. Вот почему я не очень увлекаюсь примерами программирования, которые используют надуманные ситуации, такие как классы животных с методами, которые мяукают и лают." - вот именно это я бы хотел, чтобы изменили в JavaRush (и на многих других ресурсах тоже). Решает все эти абстрактные задачи, а потом берешься за реальный проект, и складывается такое ощущение, что начинаешь обучаться заново.
30 января 2018, 14:27
Начиная с 21-го уровня в конце каждого уровня вы будете получать 1 "большую задачу". Большие задачи - это и есть небольшие мини-проекты, которые будут с каждым уровнем становится все больше и сложнее. Давать какие-то реальные проекты, когда ученик еще не знает основ, невозможно, нужно получить базовые знания и отточить их на простых задачах. Вы прошли только половину курса и еще не проходили Online-стажировку, так что все реальные проекты еще впереди.
Юрій Якимчук
Уровень 33
31 января 2018, 15:13
Мотивируете таки совершить марш-бросок до 20 лвл :)
Ravermeister
Уровень 35
31 января 2018, 19:57
Вы обратите внимание на 1-й пункт в конце статьи. Это именно то, что дает JavaRush. Я не раз начинал изучать программирование по книгам и ни разу не преуспел. Помнится, все заканчивалось в районе двухмерных массивов )). А второй пункт - это уже на "рашевскую" стажировку похоже. По-моему, вполне очевидно, почему эта статья оказалась здесь. Такая себе реклама JavaRush от видного человека в мире Java. Вы решайте, решайте. Поверьте, не пожалеете.