Продолжаем переводить книгу Чеда Фоулера «Страсть к программированию» совместными усилиями. Готов координировать работу с остальными переводчиками.
Глава 8. Будь специалистом
— Каким образом Вы можете добиться падения JVM используя только возможности Java?
В ответ — тишина.
— Вы меня слышите?
— Извините, я не понял Вас. Повторите, пожалуйста, вопрос.
В голосе прозвучало отчаяние. Я знал из своего опыта, что повторение вопроса не поможет. Тем не менее я повторил вопрос, медленно и громко.
— Каким образом Вы можете добиться падения JVM используя только возможности Java?
— Эм… Извините, я никогда не сталкивался с подобной задачей.
— Я уверен, что не сталкивались. Как насчёт такого вопроса: как бы Вы написали программу, которая бы никогда не приводила к сбоям JVM?
Я искал действительно хороших Java разработчиков. В начале интервью я попросил этого человека (и всех людей, которых я интервьюировал в течение той недели) оценить себя по шкале от 1 до 10. Он сказал девять. По моим ожиданиям он должен быть невероятным специалистом. Если этот парень так высоко оценивает себя, почему он не может придумать ни одного трюка который приведёт к сбою JVM?
Недостаточно глубокие знания.
Этот человек утверждает что он разбирается в Java. Если бы Вы встретили его на вечеринке и спросили как он зарабатывает свой хлеб, он бы ответил: «Я Java разработчик». При этом он не смог ответить на этот простой вопрос. Он даже не смог дать неправильный ответ. На протяжении двух с половиной недель в поисках кандидатов на вакансии в Индии такая картина не была исключением, это было правилом. Тысячи Java специалистов претендовали на вакансии, практически никто из них не мог объяснить как работает загрузчик классов Java или описать в общих чертах как виртуальная машина Java управляет памятью.
Ладно, Вы не должны знать все эти нюансы для того чтобы писать простой код под присмотром опытных специалистов. Но предполагалось что эти соискатели были экспертами. Похоже на то, что очень многие из нас верят в то, что специализация означает то, что Вы попросту не знаете ничего другого. Например, я мог бы назвать мою маму специалистом по Windows, поскольку она никогда не работала с Linux или OS X. Или, я мог бы назвать своих родственников из глубинки в Арканзасе экспертами в кантри, потому что они никогда не слышали другой музыки.
Представьте что Вы на приёме у Вашего семейного врача, жалуетесь на странное уплотнение под кожей на правой руке. Ваш врач направляет вас к специалисту для проведения биопсии. Что если бы этот специалист считался таковым лишь потому что в медицинском учебном заведении он не учился ничему, что бы не было непосредственно связано с биопсией? Я не подразумеваю что он углублённо изучал всё что связано с биопсией. Возможно он лишь вскользь пробежался по материалам по данной теме, но не знает ничего другого. Если бы Вы спросили у этого специалиста:
— Что если тот аппарат начнёт издавать звуковой сигнал во время операции?
— Хм, не припомню чтобы такое случалось, вряд ли это случится в этот раз. Я не знаю что делает это оборудование, но оно ещё ни разу не издавало звуков.
К счастью от результатов работы большинства разработчиков не зависят жизни. Если они облажаются, их работодатели теряют деньги, а не жизни.
К сожалению в нашей индустрии множество таких узких специалистов, которые используют термин специалист как оправдание для того, что они не знают ничего другого. В медицине специалист это человек с действительно глубокими знаниями в конкретной области. Врачи направляют пациентов к специалистам, потому что в некоторых ситуациях специалист окажет им более квалифицированную помощь чем врач широкого профиля.
Так кем же должен быть специалист в нашей отрасли? Я могу сказать Вам кого именно я искал в своей поездке с целью нанять квалифицированных разработчиков. Я искал людей которые глубоко разбираются в Java разработке и ориентируются в среде в которой будет работать разрабатываемое программное обеспечение. Я искал людей которые могли бы сказать «знаю, делал» в 80% ситуаций в которые мы можем попасть при разработке и глубина знаний которых позволит им справиться с оставшимися 20% незнакомых ситуаций. Я хотел найти таких специалистов, которые работая с высокоуровневыми абстракциями понимали бы низкоуровневые детали того, что позволяет реализовать эти абстракции. Я хотел найти человека, который мог бы справиться с любой проблемой связанной с внедрением разрабатываемого продукта, или по крайней мере знал бы к кому обратиться за помощью.
Это специалист который выживет в изменчивой индустрии разработчики программного обеспечения. Если Вы .NET специалист, это не является оправданием отсутствию знаний чего-либо кроме .NET. Это значит, что если речь идёт о .NET — Вы эксперт. Зависшие и нуждающиеся в перезагрузке IIS сервера? «Без проблем». Интеграция системы контроля версия с Visual Studio? «Будет сделано». Клиенты в ярости из-за непонятных проблем с производительностью? «Дайте мне полчаса».
Если же Вы не согласны с таким определением специалиста, надеюсь Вы не называете себя этим словом.
Действуй!
1. Вы используете компилируемый язык, который работает в виртуальной машине? Если да, потратьте некоторое время на изучение внутреннего устройства данной виртуальной машины. В случае с Java, .NET, Smalltalk существует очень много книг и онлайн ресурсов посвящённых этой тематике. Ознакомиться с данной тематикой проще чем Вы думаете.
Зависит ли Ваш язык от виртуальной машины или нет, посвятите некоторое время на то чтобы разобраться, что происходит когда Вы компилируете файл с исходным кодом. Что происходит в процессе того как код, который Вы набирали, из текста превращается в инструкции, которые может выполнять компьютер? Что нужно для того, чтобы написать свой собственный компилятор?
Когда вы импортируете и используете сторонние библиотеки, откуда они загружаются? Что в действительности означает импортировать стороннюю библиотеку? Как Ваш компилятор, операционная система или виртуальная машина объединяют несколько кусков кода вместе в одну связную систему?
Изучение этих вопросов приблизит Вас на несколько шагов к статусу специалиста в выбранной Вами технологии.
2. Найдите возможность (на работе, или во внерабочее время) обучать желающих тем аспектам технологии, в которых Вы хотели бы глубокого разбираться. Как Вы увидите в главе «Будьте наставником», обучение других это один из лучших способов научиться самому.
Автор: sdevelopment