вторник, 9 июня 2020 г.

Некоторые мысли про собеседования

Собеседование - это такая штука, которую программисту придётся учиться проходить.
Почему придётся - это понятно: чтобы найти работу.
Почему именно "учиться проходить"? Потому что собеседование это не работа и не программирование, это отдельный вид общественных отношений, со своими правилами, условностями и ожидаемым от всех участников поведением. И изучать всё это придётся отдельно.
Мой совет: не поленись погуглить и почитать умные статьи умных людей о том, как нужно вести себя до, во время и после собеседований, что нужно говорить, как одеваться и т.д.
Также нелишним будет погуглить и почитать "вопросы на собеседовании java, spring, hibernate".
Каждый раз, когда я икал работу, я заново повторял:
- все пазлеры ("коварные" вопросы по java, spring, hibernate),
- IO, NIO,
- пузырьковую и быструю сортировки (другие если и спрашивали, то только название и О-нотацию),
- уровни изоляции транзаций в PostgreSQL.

Ничего из этого ни на одной из работ сам не писал - использовал то, что есть в java, spring, hibernate.
Всё, что повторял перед собеседованиями, быстро забывалось за ненадобностью.
Можно взять любого программиста, который не повторял хотя бы ближайшие пару месяцев все те вещи, которые он не использует в работе, и проэкзаменовать его по ним. Результат будет таким же.
Для меня до сих пор загадка, как люди могут по году готовиться к собеседованию в FAANG и при этом через год после обеседования помнить то, с чего они начали свою подготовку (многие из них в приватных беседах признаются, что на самом деле, не помнят).

Считаешь, что повторять всё это для собеседования и спрашивать об этом на собеседовании - бессмысленно, бесполезно и никому не нужно? И тебя это расстраивает?
Зря расстраиваешься. Собеседование - это устоявшаяся штука. И, как я уже писал выше, со своими условностями и ожидаемым поведением. От кандидата ожидают, что он бдет соответствовать сложившемуся представлению о кандидате. Кандидат знает, каким его хотят видеть и, зная правила игры, может в обозримом будущем гарантированно найти себе работу. Все счастливы, процесс собеседования идёт как по маслу.

Есть куча статей в интернете: как проверить навыки спеца при приёме на работу. Общий приблизительный ответ: в условиях ограниченных ресурсов, практически никак. Кандидат может быть:
- олимпиадником, не знающим ни одного фреймворка и пишущим велосипеды и работающий, но неподдерживаемый код;
- свичером, который поверхностно знает фреймворки и паттерны;
- самозванцем, за которого кто-то решил тестовое, и, которому через наушник диктуют правильные ответы.
На сладкое: представь себе, что у тебя свой стартап и тебе нужно нанять прогеров. Не "рок-звёзд", но и не секретарей-машинисток.
Что ты будешь у них спрашивать на собеседовании?
Да всё то же: сколько корзин в HashMap по умолчанию. )) Вот и остаётся работодателям только задавать кандидатам одни и те же шаблонные вопросы.

Совсем другая ситуация была бы, если бы собеседование в каждую компанию проходило, как собеседование в гугл или фэйсбук, на котором проверяют соответствие хард-скилов кандидата стандартам компании. В этом случае подавляющее большинство кандидатов не смогли бы найти работу. И им пришлось бы пройти ещё пар-тройку курсов, длительностью в полгода - год, на которых их учили бы, как правильно проходить такие собеседования.
Так что, когда на собеседовании задают "тупые" (шаблонные) вопросы надо радоваться, а не расстраиваться.


Не думаю, что знание этих вещей (ответов на шаблонные вопросы) может достоверно показать: хороший программист пришёл на собеседование или плохой. Можно только понять:
- программист пришёл на работу или просто тот, кто решил на авось попробовать устроиться программистом,
- готовился кандидат к собеседованию или нет,
- как быстро начнёт искать новую работу. Например, если у кандидата при словах "алгоритм", "МЛ" и др. загораются глаза и "отскакивают от зубов" доказательства О-нотаций, градиентные спуски и т.д., а в работе это применяться не будет, то есть вероятность, что новую работу он начнёт искать очень скоро. 😏

Есть также мнение, что "опытных чуваков" на собеседованиях не спрашивают о количестве корзин в HashMap, а просто с ними беседуют.
Так то ж опытные чуваки. Скорее всего, их в таком случае каким-то другим способом проверяют:
- репозиторий на гитхабе,
- активность в соцсетях разработчиков,
- отзывы коллег и т.д.,
- на "простой" беседе могут спросить о последнем проекте, принятых архитектурных решениях и о причинах их принятия. Думаю, программер с небольшим опытом сразу "засыпется" на таких вопросах. Тогда ему будут задавать вопросы по HashMap. ) 


Если всё устоялось, идёт по накатанной, то почему же у кандидатов возникают сложности с собеседованиями?
У меня возникают сложности потому, что со временем я начинаю писать код так же, как говорить: на автомате, не особо задумываясь о правилах языка. Например, пишешь ты хорошие и правильные программы потому что когда-то где-то усвоил, что так писать ПРАВИЛЬНО. А тут приходишь на собеседование и тебя спрашивают: а как писать НЕПРАВИЛЬНО? А затем следом: а почему так будет ПРАВИЛЬНО, а вот так - НЕПРАВИЛЬНО? И, если ты до этого нигде не читал, почему нужно писать так, а не по-другому, никогда не писал НЕПРАВИЛЬНО и не обжигался на этом, то ответить на такой вопрос будет очень сложно.
Один из реальных примеров: на курсе, где я учился, ментор часто повторял, что Singleton - это антипаттерн. Спроси любого выпускника из курса того времени, они будут свято уверены, что Singleton - это антипаттерн, но объяснить, почему они так считают, не смогут.


В этих ваших интернетах есть две интересные точки зрения о том, нужно ли ходить на собеседования без намерения получить работу:
1) так делать нужно, чтобы поддерживать у себя в актуальном состоянии навык прохождения собеседований;
2) так делать нельзя, т.к. тем самым ты "обманываешь" HR-ов и работодателей, отнимаешь их рабочее время, потому что проходишь собеседование без цели трудоустроиться.
Иногда мне кажется, что обе эти "точки зрения" придуманы одними и теми же людьми с целью создания хайпа и привлечения внимания.

Я придерживаюсь третьей точки зрения: делать так, как тебе нужно. Хочешь потренироваться перед собеседованием в компанию А, т.к. хочешь работать там, только там и нигде больше? Пройди несколько тренировочных (для тебя тренировочных) собеседований в компании X, Y, Z.

Если тебе пофиг где работать, лишь бы была здоровая атмосфера в коллективе и платили вовремя. Тогда нет смысла проходить собеседования ради собеседований. Собеседоваться только с целью найти работу. А свободное время потратить с большей пользой. 

И напоследок, пара интересных случаев из моего опыта прохождения собеседований:

Полная аудитория желающих пособеседоваться в иностранную компанию. Сидим. Выходит чел. Спрашивает на английском:
- Кто знает java?
Половина народу подняли руки.
Второй вопрос:
- Из джавистов, кто скалу знает?
Подняли руки человек 5.
- Из последних поднявших руки, кто Хаскел знает?
Поднял руку один.
- You are hired! - кричит HR, бросается к этому чуваку и вцепляется в него мёртвой хваткой. ))
Поржали, пожрали нахаляву и разошлись. )  

Я с двумя офферами на руках просто по фану собеседовался 5 часов в Сбере и 4 часа в Люксофте. )
Когда тылы прикрыты, начинаешь себя на собеседованиях чувствовать более раскованно. собеседующих это закусывает, идут вопросы один сложнее и заковыристее другого. Т.к. "тормозов" типа "или сегодня офер любой ценой или завтра голодная смерть" у тебя нет, отвечаешь спокойно, со знанием дела, хмуря брови... Смотришь, как сеньор интервьюер начинает потеть, звать помощь из "зала". Ведь он хотел доказать твою несостоятельность, но что-то идёт не так...
Короче, это было весело. ) 
В Сбере меня спрашивали вообще всё, что смогли вспомнить. Через часа 3 один из "гестаповцев" вышел и вернулся с распечатанными java-пазлами на листочке. Заставили их решать. На пятом часу я им сказал, что голова уже опустошена и дальше я не соображаю, и, вообще, скоро магазины закроются, а у меня дома кот голодный. На том и разошлись. Через полгода они позвонили, поздравили с прохождением тех.интервью и пригласили на встречу с боссом. Я отказался. 

Некоторые мысли о том, как и где учиться программированию

Моё мнение - минимум, 2 - 3 часа  (в идеале - 4 часа) ежедневно. Без выходных. Никакой жизни вне учёбы: походов в кино, на природу, друзей, девушек и т.п. Читать книги и статьи. Смотреть видео и решать задачи. С ментором, с большим количеством задач, их проверкой ментором и с обязательной обратной связью (разбором ошибок).
Иностранный язык можно выучить за пол года - год, учась по 1 часу в день.
Программирование и того проще освоить, т.к. всё преподносится на родном языке и язык программирования - это, в отличие от разговорного иностранного языка, сплошная логика, которая в нас "встроена" с рождения. Нужно только тренировать её, как мышцы.
Поэтому 4 часа на учёбу ежедневно - это то, что называется, отлично.
В ВУЗе, дай бог, чтоб 4 часа в неделю изучали программирование.
Рассуждения о том, что 4 часа учёбы ежедневно - это малоэффективно похожи на рассуждения о том, что:
-  4 часа в день заниматься спортом - это малоэффективно,
- или, что разговаривать на английском по 4 часа в день - это тоже малоэффективно.

Если у тебя есть пару свободных часа в дороге каждый день, то смотри-читай учебные материалы. А когда приедешь домой - попробуй применить то, что узнал на практике: задачки порешай, воспроизведи задачки из изученного учебного материала.

На крайняк, если нужен будет перерыв для отдыха мозга, слушай IT подкасты.

Главное - не потерять эти самые часы даром: не слушать музон, не смотреть развлекательное видео и не читать книжки или Интернеты не по учёбе.
Я езжу стоя в метро каждый день по 45 минут в каждую сторону (на работу и с работы). За это время Успеваю почитать книжку по програмированию, посмотреть заранее загруженное учебное видео или потренировать английский в приложении.
Главное в учёбе - это поставить цель и каждый день идти к ней небольшими шагами.

В сообществе часто задают вопросы:
Можно ли отдыхать от учёбы (делать длительные перерывы)?
Себя не обмануть. Если перерыв в учёбе нужен, то так или иначе его придётся сделать. Только нужно быть готовым к тому, что после отдыха будет сложнее продолжить, т.к. некоторые вещи забудутся. 
Что лучше: самому выстрадать решение задачи или попросить помощи у коллег?
Лучше вообще не тупить, а, если самому непонятно, то сразу открывать SOF (Stack Overflow), учебники, статьи, чужой GitHub, javadoc и т.д. и смотреть, как надо делать.
Есть даже целое направление обучения - code-kata: смотришь и повторяешь, а где-то в пути приходит понимание.
Почему такой вариант учёбы имеет место быть? Ответ простой - время. Одно дело - учить что-либо по учебным пособиям с разбором задач и совсем другое - самому, с нуля, выводить нужные знания толко на основании собственного опыта и ошибок. Во втором случае жизни не хватит, чтобы изучить предмет. 
Помогают ли в учёбе конференции?
Вопрос спорный. В чём-то помогают. В чём-то нет. Если есть желание узнать таким способом общее направление, в котором развивается индустрия, то конференция может оказатьс неплохим вариантом. Если необходимо получить глубокие знания по вопросу, то в этом плане на конференциях нет ничего полезного. Всё, что там рассказывают, можно свободно найти в интернете. А рассказы на тему "было много трудностей, но мы справились" - они, без конкретных деталей, бесполезны. 
Не помню, где прочитал умную мысль: "...Многие выступления на конференциях охватывают доказательство концепций, а не реальные сценарии. " 
Поможет ли в учёбе телеграм-канал/форум/что-то ещё?
Можно попробовать найти в таком источнике ответ на конкретный узкий вопрос, но для более широкого изучения и понимания предмета, польза таких источников сомнительна.
Залез я как-то в один телеграм-канал по тематике "профи в спринге". Ну, думаю, почитаю умные мысли неглупых людей. Но, исходя из содержания канала, сложилось впечатление, что там собрались люди, изучающие спринг "виртуально", исключительно методом "научного тыка" и пытающиеся изучить его  раньше основ java.
Все разговоры в канале были примерно следующего содержания: "а где мне указать properties?", "а как их прочитать", "а что будет, если у меня будет 2 класса конфигурации?", "а как отправить пост-запрос?" и т.д.
Какие курсы лучше?
Не попробуешь, не узнаешь. На одном курсе всё кривенько-косенько и иногда заводит в тупик неспособность ментора грамотно писать по-русски и выражать свои мысли. Но, в то же время, и цена у такого курса более-менее человечная, и все выпускники курса, в течение 8 - 12 месяцев с момента начала курса находят, себе работу программистами, и сообщество учащихся и выпускников там вполне себе здоровое.
На другом курсе: и цена космическая, и преподаватели все исключительные (судя по рекламе) и контент весь выверенный, синхронизированный и автоматизированны. Но, что-то не слышно отзывов от успешных учеников...На одном из митапов моему коллеге очень известная компания, продающая курсы задорого, предложили стать преподавателем на одном из их курсов. Он согласился, но при этом сказал мне, что теперь ему придётся в ускоренном темпе изучить тему курса почти с нуля.
Поэтому при выборе курса обращай внимание не на рекламу и известность или "крутизну" курсов, а на следующее:
- цена - зачем переплачивать?
- наличие материалов, объясняющих предмет - по книжкам можно учиться и без курсов,
- программа курса включает в себя те технологии, которые перечислены в подавляющем количестве вакансий - зачем платить за то, что будет невостребовано, или, чтобы остаться в глазах работодателя недоучкой? Открываем программу курса и ищем там: java, spring, spring boot, hibernate, postgreSQL, git и т.д. по списку технологий из вакансий,
- наличие большого количества практических задач - как иначе освоить "карате", если не спаринговаться?
- проверка задач ментором и наличие обратной связи - без этого учёба может сильно подзатянуться или завести не в ту степь. Одним из показателей этого является то, что ментор готов ответить на твои вопросы в течение дня, а не через месяц или непонятно, когда. Никаких: ответит менеджер, секретарь или кто-то ещё. Только ментор. Всё просто: если у ментора нет времени ответить на твои вопросы сейчас, то у него не будет времени и на проверку твоих задач во время учёбы,
- наличие сообщества сокурсников - там подскажут и покажут то, на что у ментора может не хватить времени и сил, чтобы по сотне раз объяснять каждому (напимер, как настроить ИДЕ). Со временем ты также научишься получать кайф от дачи ответов на те же "глупые" вопросы новых учеников, какие раньше задавал сам. Это поднимент твою мотивацию и придаст уверенности в собственных знаниях,
- наличие положительных отзывов реальных учеников, которым ты можешь написать и задать все интересующие тебя вопросы о курсе - все мы знаем, что можно нанять школьника, который под копирку напишет хвалебный отзыв, но не сможет ответить ни на один практический вопрос об учёбе, т.к. он смутно может себе представить то, что только что расхваливал.

Ну, и главное: программирование - это не про деньги. Это про увлечение. Если нужны только деньги, то программирование может разочаровать тебя тем, сколько сил и времени тебе придётся вложить в то, чтобы научиться программировать и начать этим зарабатывать. В програмирование идут те, кому это нравится. На вопрос "почему ты решил изучать программирование" такие люди отвечают: "мне всегда нравилось...", "я всегда хотел...", "я со школы увлекался...".
У тебя может получиться обмануть ментора, сокурсников и работодателя, когда ты будешь говорить, что увлечён программированием, но обмануть себя не получится и это чревато... ))