Что вообще значит «full stack»?
Не счесть холиваров о том, стоит ли быть фуллстек-разработчиком. И в таких дискуссиях часто вылезает ещё один спорный вопрос:, а что это понятие означает-то? «Фронтбэкендер»? «Многорукий Шива, мастер всего от инфраструктуры до тестирования»? «Человек, освоивший столько технологий, что воспарил над ними в мир общих концепций»?
Я захотел разобраться, как это понятие появилось и что люди в него вкладывали изначально. Было ли какое-то «каноническое» определение? Пока разбирался, увидел прямо-таки эволюцию представлений о нём и решил изложить её для Хабра.
Когда понятие возникло? Как можно увидеть по графику Google Trends, в широкий обиход оно вошло с 2014-го. А на Хабре первое упоминание произошло в 2013-м. Это был перевод англоязычного блог-поста, где упоминается, что Facebook «нанимает только Full Stack». То есть в Фейсбуке это уже тогда было устоявшимся понятием? Я стал гуглить дальше и в техническом блоге Facebook нашёл пост 2010 года «The Full Stack, Part I» с тысячей лайков. А он, в свою очередь, ссылается на пост разработчика Рэнди Шмидта 2008 года. И, судя по прочей найденной мной информации, вот у Шмидта и было первое использование понятия, из которого выросло всё остальное. Теперь, когда мы дошли до начала начал, давайте пойдём по этим же постам в обратном направлении (по хронологии) и посмотрим, что в них говорилось.
Эта страница личного блога уже даже не открывается, но Internet Archive заботливо сохранил для нас Первый Пост. Автор поста восхищается людьми, которых он называет «Full Stack Web Developers». И вот какое определение им он даёт:
A full stack web developer is someone that does design, markup, styling, behavior, and programming.
Вот это сейчас внезапно было: первым пунктом идёт дизайн. Д И З А Й Н. (Судя по контексту, это не про design как проектирование, а именно про графический дизайн.) А «programming» упомянуто мимоходом как единый последний пункт — хотя сегодня обсуждения строятся как раз на том, что у него есть подпункты.
Ну, с programming понятно: в 2008-м ещё не произошёл JS-взрыв, поэтому в тексте «браузерная» часть проходит как «markup, styling» (читай: HTML, CSS). Но даже если мысленно заменить «markup, styling» и «programming» на «фронт» и «бэк», всё равно не получится нынешних дискуссий: это разделение Шмидта как раз не сильно волновало. По-настоящему его волновало, что он не разбирается в дизайне, и ему надо вот с этим справиться, чтобы стать настоящим full stack web developer. Так что получается, что мы сейчас под «фуллстеком» понимаем вообще не то, что закладывал автор.
По сути, содержание его поста сегодня в какой-то степени актуально внутри фронтенда, где есть место и JS-программированию, и более дизайнерским вещам. Так что, оставаясь в пределах фронтенда, можно специализироваться на чём-то, а можно быть многостаночником — в прошлом году нашумел текст «The Great Divide», посвящённый как раз разнице специализаций.
Следующие два года слова «full stack» не получали большого распространения, но затем Карлос Буэно из Фейсбука написал текст с таким заголовком, ссылающийся на Рэнди Шмидта. Поскольку у инженерного блога Facebook аудитория заметно больше, чем у небольшого личного блога, похоже, что вот отсюда понятие начало расходиться шире. Но Карлос не просто пересказал малоизвестную чужую идею, а дал своё определение:
A «full-stack programmer» is a generalist, someone who can create a non-trivial application by themselves.
Вот такое звучит применимо и сегодня: «человек, который может сам создать приложение в одиночку». Про дизайн тут не слова ни сказано, и непонятно, что думает Карлос по его поводу. И ещё, кстати, тут нет слова «web», которое было в оригинале — получается, что можно и где-нибудь в геймдеве быть фуллстеком.
Вместо дизайнерских умений Карлосу важно вот что: «люди с широким набором умений обычно вырабатывают хорошую ментальную модель того, как действуют разные слои системы. Это особенно ценно для работы над производительностью».
Он сравнивает это с химией и физикой, которые действуют на разных уровнях реальности: понимание нижнего уровня помогает человеку лучше ухватывать происходящее на верхнем. То есть, если исходный пост был только про «широту охвата» («и дизайнер, и кодер, и на дуде игрец»), то вот тут впервые зашла речь о том, что важна глубина.
Ещё один резонансный ранний пост — тот самый, благодаря которому словосочетание «full stack» впервые появилось на Хабре (его тут переводили аж три раза, причём в третий раз — вчера, спустя восемь лет после публикации оригинала).
Здесь определение звучит так:
For me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology.
«Знаком со всеми слоями, даже если и не мастер в них» — вот это интересный нюанс. Если изначальное определение предполагало «умеешь всё делать хорошо», то здесь этого уже требуют. Можно быть «T-shaped»: чем-то конкретным заниматься глубоко, а с другими вещами достаточно «быть знакомым».
И здесь приводится новая причина «чем это хорошо», уже не про оптимизацию производительности: «Хорошие разработчики, знакомые со всем стеком, знают, как улучшить жизнь окружающим их людям». Про это сейчас можно услышать в связи с тестированием или девопсом: давайте не просто перекидываться кодом через стену, а вместе понимать, как всё работает.
А основную часть поста занимает список «как выглядит полный стек, который разработчик должен знать», и это тоже интересно. В случае с дизайном тут есть опция «признать, что нужна помощь дизайнера», его не считают обязательным требованием. Зато появились другие пункты от «понимать сервера/сеть/хостинг» до «понимать, что нужно пользователю и бизнесу». Спектр описан не столько в ширину («фронт/бэк»), сколько «в глубину», и непосредственно «кодить» — только средняя его часть.
Разумеется, этот список породил споры, где к нему пытались что-то добавить или убрать. Но интересно обсуждать не конкретные пункты, а общую идею: тут получается, что для фуллстека важнее не «уметь накодить и на фронте, и на бэке», а понимать и ниже своего кода («как работает то, что накодил»), и выше («зачем вообще нужно то, что накодил»). По сути, тут обращаются к исходному значению слова «stack»: вертикальная стопка вещей, опирающихся друг на друга (недаром тексты про фуллстек часто иллюстрируют стопкой блинов на тарелке).
Наконец, наткнулся в процессе гугления на популярный текст 2014 года в блоге на сайте издательства O’Reilly. Здесь уже не просто отдельное мнение, а попытка осмыслить различные предыдущие выступления по теме и добавить к ним что-то своё.
Одно из добавлений: вот здесь говорится, что JavaScript к 2014-му страшно разросся и усложнился, так что от фуллстек-разработчиков теперь требуется и понимание всяких ангуляров.
А ещё Майк предлагает к списку «знаний фуллстека» предлагает добавить CVS (ну, сегодня бы уже даже не стал упоминать, наверное), облака, распределённые вычисления… Как он сам признаёт, результат в таком случае получается не вертикальным «стеком», где всё опирается друг на друга, а разветвлённым «деревом», где много вещей «в сторону».
И ещё он признаёт, что если добавить это всё к списку от Лоренса, получается совсем уж длиннющий перечень. Поэтому не требует магического абсолютного мастерства во всём сразу. А вместо этого впрямую произносит слово «T-shaped», призывая специализироваться на чём-то, но в то же время и заглядывать в другие сферы: «я не требую от разработчиков разбираться в сетевых вопросах на уровне сетевиков, но уметь обсуждать эти вопросы надо».
Из забавного: в тексте есть фраза «I sincerely hope that «full stack» doesn«t appear in job titles anywhere». Майк, пишем тебе из будущего, не хочется расстраивать, но тут такое дело…
И что в итоге?
Какие выводы мы можем извлечь из этих четырёх текстов? Своими выводами делитесь в комментариях, а у меня получились такие:
- Сегодняшние обсуждения full stack страшно отдалились от того, что вкладывал в это словосочетание его автор. Наверное, он офигевает, глядя на то, во что всё превратилось :)
- Это понятие с самого начала было довольно размытым: с первых же постов разные люди вкладывали в него разное. Четыре приведённых текста — это четыре ощутимо разных позиции.
Так что нет и никогда не было какого-то одного «правильного» понимания. Это значит, что если у вас есть определённое видение, вы имеете на него полное право. Но это также значит, что у вашего собеседника может быть ощутимо другое видение, на которое он имеет такое же право. Так что перед тем, как спорить «нужно ли становиться фуллстеком», стоит проверить, не говорите ли вы о разных вещах.
А ещё я увидел в этих определениях идею, которую считаю очень интересной. Но надо сделать оговорку: у меня профдеформация, и я тут лицо заинтересованное.
Смотрите: мы привыкли воспринимать «фуллстек» как «фронт+бэк», но сразу два из четырёх описаний совершенно не требуют быть сениором в обеих сферах, а вместо этого идут в сторону «T-shaped». Они предлагают не отказываться от специализации и быть гением-многостаночником, а изучать разное вокруг своего основного.
И это откликается во мне по следующей причине: я работаю в JUG Ru Group, мы делаем конференции для разных IT-специалистов, и среди их зрителей встречаю как раз таких людей. Типичный случай — Java-разработчик посещает конференции не только по Java, но и по тестированию или DevOps. А ещё может посмотреть видеозапись доклада про GraphQL с JS-конференции или про архитектуру с .NET-мероприятия.
Этот человек не занимается фронтендом, но лезет сразу в разные стороны, чтобы лучше понимать всё вокруг, расширять доступный скоуп задач и находить общий язык с окружающими (тестировщиками, фронтендерами, инфраструктурщиками).
Стоит ли называть это «full stack»? Спорный вопрос. Но для меня как раз это звучит как «фуллстек здорового человека». Потому что если про совмещение разных ролей часто пишут «не ходите сюда, здесь боль и страдание», то вот про вылазки на смежные территории такого негатива никогда не слышал — только хорошее.
И если вы хотите быть фуллстеком вот в таком значении, то для вас напоследок сделаю минутку рекламы: мы придумали конференционный вариант как раз для таких людей. Для нашего сезона из 8 онлайн-конференций сделали «Full Pass» — билет-абонемент, дающий доступ ко всем сразу. Смысл в том, чтобы конференцию по своему профилю смотреть внимательно, а на других точечно подключаться к отдельным докладам, актуальным для вас. Если звучит интересно — переходите на сайт Full Pass, там все подробности.