Так получилось, что я хотел стать программистом еще учась в университете в Москве, но стал им уже за пределами России и не сразу — путь был долог и тернист. Я ходил на множество интервью (вначале искал я, потом уже искали меня), вникал в тонкости работы и размышлял на тему — как же стать хорошим программистом.


Один из аспектов, который актуален на протяжении всей карьеры, это поиск работы и прохождение интервью. Я сам проводил очень мало интервью (4-5), но посетил большое их количество (>100). У меня было 3-4 периода по поиску работы за последние ~7 лет, когда я ходил на интервью месяц-два, по 1-2-3 в день иногда.


В этой статья я бы хотел поделиться опытом прохождения интервью, дать какую-то систематизацию, как оно выглядит и бывает, к чему готовиться.


Что бы мне было интересно узнать в комментариях — как это бывает у других, особенно в Москве/России, наверняка есть различия с Европой.


Основано на моем личном опыте, разговоре с коллегами, чтении форумов, книжек и проч. Я бы сказал так — это мое субъективное мнение на ситуацию в целом, этот пост претендует на цельность информации и на то, что он охватывает, если не все, то большинство аспектов. Там, где мое мнение, я так и пишу, по-моему. В остальном, я претендую на объективность.


Почти весь мой опыт это собеседования в IT в европейских финансовых компаниях на позицию java (senior)developer, преимущественно в Лондоне. Нет ни веба (в любом виде, front/end-backend), ни интеграции, ни работы на заказчика (по типу — есть CRM и компания внедряет ее в банках), амазон, фейсбук, гугл тоже не представлены — я не знаю, как там и не очень стремлюсь, наверное. Мой опыт начинается от простого программиста и заканчивается senior developer. Team/techlead/manager — нет.


Об интервью в общем


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


Интервью это игра по своим правилам, которые принято соблюдать, знание этих правил помогает выстаривать ожидания и процесс подготовки, прохождения. В конце концов, это показывает, что вы умеете играть по правилам и их принимаете, умеете учитывать обычаи коллектива. Никто не пишет сортировки вручную, да даже synchronized вряд ли придется писать, не говоря о notify/notifyAll. Равно как и вряд ли понадобится детальное знание внутреннего устройства hashmap — но это один из самых популярный вопросов — 70 процентов интервью не обходятся без этого, с этим вопросом может поспорить только контракт между equals and hashcode. С другой стороны, это говорит об общей подготовке кандидата, как хорошо он подходит к рабочей задаче (а поиск работы это тоже своего рода маленький проект).


Из администратвных вопросов


Забудьте ждать ответа. Нет ответа — ответ отрицательный.
Иногда мне казалось, это у них правило хорошего тона — они не отвечают, если не заинтересованы. Это на примере с рекрутерами — если ты ему ответил, что работа сейчас не нужна, то это типа слабак. Ибо они сами, естественно, не овтечают, если име не нужно, логика — что время тратить. Вообще, рекрутеры, это удивительные люди, когда-то мне стало казаться, что они как сирены — стоит ответить и вот все, ты уже на интервью, на которое не пошел бы. Умение четко сказать нет, или сформулировать, что мне нужно, это хороший навык. Я верю агентам, но никогда не доверяю. Беру только факты, причем те, которые можно доказать, из разряда "это новый проект, там все очень хорошо" — это сотрясание воздуха. А если "они готовы поднять зарплату на 10 тысяч" — то это уже что-то :-)


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


От агентов, конечно, есть толк, иногда они полезны и хороши. Факт в том, что какие-то очень интересные вакансии мне приходили только через агентов. Но и верно обратное, не смотря на распространенное мнение, работу без агента найти можно и нужно. Особенно, если интересует работа в более менее понятной области — берем топ 20 компаний по миру/стране в этой отрасли и идем на их сайты. Так я нашел свою первую работу в Лондоне, которой был очень доволен.


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


В целом, всегда и везде — средний уровень не интересует, надо быть ВЫШЕ среднего, в том числе, и выше своих способностей, в том смысле, что надо выложиться по полной.
Финансовое ай ти это огромная бюрократия, и надо уметь в ней существовать, да, на это тратятся ресурсы и все неэффективно, но таковы правила и лучшего варианта иногда просто нет. Из плюсов — есть интересные, очень интересные проекты, бюрократия и бизнес аналитики не сильно достают и оч оч хорошие деньги.


Подготовку к интервью я рассматривать совсем не буду. Считаем, что это пройденный этап, необходимые знания есть, и есть приглашения на интервью.


Этапы собеседований


Предварительный этап это телефонное интервью.


Часто с агентом — спросят базовую информацию из резюме, что действительно ли работаете сейчас там, где работаете, зарплатные ожидания и текущая зарплата (это отдельная тема — расскажу ниже), визовый статус и как быстро можете приступить к работе. Агент, как правило, расскажет о компании и о вакансии (но увы, лишь общую информацию) и спросит интересно ли мне это и вообще, что я ищу. Спрашивают серьезно про мотивацию, почему ищешь, меняешь работу.


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


Преимущество в том, что сразу можно узнать больше информации про проект и отказаться, т.к. не интересно, либо наоборот еще больше заинтересоваться, поняв что это очень интересно.


Было немного случаев (но они стабильно были), когда начинается все жестко уже на первом интервью — здрастье, здрастье, ну пройдемся по джвае, алгоритмам и тд. Просто 40-50 минут тех вопросов в духе экзамена по computer science.


Про деньги


У меня довольно долгое время было табу на эту тему — я не хотел знать сколько получают коллеги — меня бы это демотивировало и понижало самооценку. Потом поменял свою точку зрения на противоположную — сокрытие зарплаты на руку работодателю, поэтому среди коллег не против обменяться цифрами, но среди просто знакомых — нет. Для Лондона — можно посмотреть на glassdoor и умножить на 1.5. верхняя часть зарплат там почему-то не представлена, хотя это самая сладкая часть и, что важно — вполне достижима. В любом случае, программист в Лондоне в банке это очень и очень хорошие деньги и уровень жизни выше, чем в Москве (это мое субъективное мнение, исходя из моих представлениях об уровне жизни и потребностях, так же сами города накладывают ограничения, в Москве, мне кажется, об ипотеке я бы и не думал, в Лондоне, Европе, 2% годовых — норм, 20-25% первый взнос уже достаточно).


Вернемся к интервью, я так понимаю, что работодатель хочет видеть кандидата с определенной суммой. Я бы сказал, что лучше ответить каким-то интервалом, но надо его ставить разумно, чтобы потом не оказалось, все хорошо, но хочу больше денег. В целом, я бы казал, что +10-15% к текущей зарплате это средний вариант. Увеличение зарплаты почти вдвое тоже возможно и увеличение в год на 10% на текущем месте также, что бы ни говорили агенты. Поясню, с одной стороны, чем дороже агент продаст, тем больше он получит, но приоритет — продать вас вообще, а за сколько, там как получится, 5-10% разницы в вашей зарплате для агента это не такая большая разнциа в том, что агент сам получит на руки (это предположение).


Форматы интервью


Орг вопросы


У меня было интересное наблюдение, как организовано само интервью, где оно проводится, сам офис и переговорная. Подтверждение о дате, времени, месте — редко, когда просто по телефону, но и такое было. Как правило — письмо. Часто от агента с минимум информации. Самое приятное — хорошо отформатированное письмо, с именами и должностями, с кем встреча и что интересно — с указанием переговорной (значит они умеют планировать заранее, а не искать свободную переговорку за 5 минут до собеседования), также часто агенты присылают linkedin интервьюера — экономят мне время, потому что я всегда просматриваю профайл того, с кем мне потенциально предстоит работать. Если есть его статьи — я и их почитаю.
Кстати, если анонсировано несколько людей, нормально ожидать, что все они не придут, если самый главный из них делегирует это кому-то. Но, имхо, приятно, когда приходят все заявленные гости.


Дальше все стандартно, пришел, доложился на ресепшн, за тобой спустились или отправили одного в переговорную. Как правило, за вами спускается сотрудник и ведет вас сам. Время в лифте и по дороге тоже можно использовать для переговоров.


И кстати — как компания походит к набору кандидатов, это тоже показатель. Интервью это двухсторонний процесс, как компания, отдельные люди подходят к этому процецссу, насколько качесвтенно собеседуют, это тоже характеристика компании/команды. Это, конечно субьективно, мне кажется, не лучший выбор спрашивать все интерфейсы Collections на уровне, знаешь/не знаешь, гораздо интересней выбрать каую-то тему и развивать ее дальше, та же сама любимая hashMap — какие отличия от CHM, как можно вообще хранить мапу в памяти, спросить про время доступа, что происходит при рехэшинге, и далее развить тему, как хранятся элементы в списках коллизий ( список, дерево, какое дерево и т.д.))


Также, если интервью не задалось, отказали, а вам кажется, что выступили хорошо — это тоже не повод расстраиваться, если вы не подходите и нет искры, то лучше и не начинать. В этом смысле мне нравится мысль, что если не получается, возможно, мне туда и не надо. Также мне нравится подход (google кстати) — лучше не нанять хорошего сотрудника, чем нанять плохого. Тоже самое и для кандидата — лучше не попасть в хорошую компанию, чем попасть в плохую.


Мне были любопытны две вещи — фактическое время начала интервью (я всегда приходил на 10 минут до начала) и какие картины весят на стенах, дизайн переговорных — как правило это переговорные для клиентов банка и в их оформление вкладывают большие деньги.


Есть такой момент — заявлено интервью на 2 часа с 4 людьми, а после часа вам говорят спасибо. Понятно, что вы не прошли. Не знаю, как к этому относиться, это не о том, что — мне обидно, я готовился, пусть слушают (ну или пусть я хоть практику прохождения интервью получу) — тут все четко и да, жестко; это скорей о том, что, возможно, это было неудачное выступление и если продолжить, то все станет лучше. Но тут, значит опять логика — лучше не нанять хорошего, чем нанять плохого.


Телефон


Самое базовое, как я описывал, телефонный разговор. Технические вопросы могут быть, но что-то очень тяжелого или сложного, очевидно, спрашивать сложно. Детали реализации in places quick sort вряд ли будут спрашивать, а если будут — надо бежать, потому что, имхо, это неадекватно.


Он лайн


Далее, любимое в последнее время (этого не было 5-7 лет назад или было меньше) — онлайн программирование типа hackerrank или онлайн тесты.


Тесты с выбором ответа из списка — редко бывают и, на мой взгляд, редко тест адекватно отображает подготовку кандидата, хотя, мне попадался один, просто замечательный, 12 минут, 12 довольно вразумительных вопросов. Поэтому, я думаю, это такой грубый фильтр.


Онлайн программирование с интервьюером, выглядит так — заходите на сайт, авторизуетесь, и перед вами он-лайн IDE, которая видна вам и интервьюеру. Он дает вам задания, и вы тут же пишете код, запускаете его и т.д. Лишь один раз мне встретилось, когда это был просто гугл док, все остальное — вполне себе простая онлайн IDE.


Домашнее задание


Старые и добрые тестовые задания, когда просто дается описание задачки, и надо прислать решение — иногда на время, иногда просто, в течении 1-2-3-4 дней.


По форматам заданий — домашние задания, как правило, очень вразумительные и осмысленные. Это либо алгоритмически что-то (что-то вроде поиск пути в лабиринте, или маленькая система по подсчетам среднего значение из потока цен и хранения самого последнего, там немного надо спроектировать классы и написать все с упором на low latency) или, как я это называю, на ООП — есть простая предметная область, надо просто написать программу которая отображает поставленную задачу. Например, у нас есть больница, в ней пациенты, каждому пациенту дают определенный список лекарств, лекарства по определенным правилам взаимодействуют друг с другом вызывая разный эффект (если принять А и Б, то пациент заболеет болезнью Х, если пациенты с болезнью Д не был дан препарат И, он умрет). Надо написать программу, которая по заданному списку лекарств выдает результат применения их на список больных (у каждого из которых своя изначальная болезнь). Другой пример — написать банкомат (внимание на атомарность транзакций). Еще один — написать игру камень ножницы бумага.


Оналйн программирование на время (без участия человека с той стороны) — как правило, это что-то алгоритмическое из разряда обхода дерева, работа с массивами — все то, что есть на geelforgeeks, нередки и более зубодробительные задачи. К сожалению, решение многих задач зависит от того, встретилась она до этого или нет, часто задания сложные и взяты (и сформулированы) в открытых источниках, мне кажется, это не очень удачный выбор заданий, врядли интервьюеры хотят протестировать навыки пользования гуглом.


Оналйн программирование с интервьюером — тоже интересный вид, задачки гораздо проще, но добавляется стресс и непривычность IDE, главное тут — не молчать, рассуждать и не кидаться сразу писать решение. Подумайте и прикиньте. Пример задачи, который может быть — задан набор значений, каждому значению задана вероятность. Надо написать программу, которая выдает эти значения с заданной вероятностью. На мой взгляд сложновато, но посильно.
Еще пример — есть долгая операция, принимающая на вход один аргумент, есть много потоков, которые вызывают и делают эту операцию. Напишите обертку которая бы оптимизировала вызовы (надо сделать кэширование с упором на многопоточность, чтобы если второй тред вызывает операцию с тем же значением и операция в процессе вычисления, то не надо запускать вычисление еще раз, надо просто подождать). Дьявол, как известно, в деталях и крайних случаях.


Еще об агентах — иногда бывают, что агенты как бы знают, что будут спрашивать и могут это как-то описать. Это серая зона, с одной стороны хорошо знать, будет ли интервью чисто техническим или просто разговоры, что от вас ожидают и т.д. Это ок. Но вот говорить конкретные задания, я считаю это не очень хорошо, особенно в отношении компании, также, кандидат будет очень плохо выглядеть, если он волшебным образом сразу написал решение задачи, но не смог объяснить его. Поэтому я бы предпочёл такими подсказками не пользоваться.


Онсайт интервью


  • парное программирование, по сути то же онлайн программирование, только интервьюер не на телефоне, а на стуле рядом.
  • домашнее задание — дают задание, комп, час времени, напишете — позовите.
  • Кодить, дизайнить на бумаге\доске.

Просто разговор.


По самой беседе — 50/50 будет 1/много интервьюеров, в целом, неплохо когда сразу несколько, и интересно, когда это выглядит как перекрестный допрос — спрашивают все и много.


Пример типичных заданий/вопросов


Знание решения ничего не гарантирует, равно как и неточности, неполнота решения, ответа.
Само задание, вопрос, это начало разговора на тему. Например, как смержить два отсортированных массив. Потом, если у нас массивов больше чем 2. Какая сложность, как оптимизировать, а что если мы изменим это и то. На мой взгляд, это очень хороший подход — тебя не огорашивают сложным алгоритмом, а дается что-то простое, а потом начинается разговор на тему, усложнение.


Спецификация Java


  • equals and hashcode contract, что будет если нарушить
  • как устроена hahsmap. С разной степенью детализации? начиная от того, как hashcode используется (что будет если нарушить контакт c equals) до — CHM, copy on write array, как устроены внутри, blocking read/write, segments locks, concurrent level.
  • volatile (memory barier), happens before semantic
  • java 7 — chm, atomics, nio(?)
  • java 8 — streams, lambda
  • GC (я, кажется, могу делать презентации на эту тему уже)
  • вопрос про volatile массив, volatile int[] arr; arr[2] = 2; int j = arr[2];
  • double checking locking (и почему его не стоит использовать)
  • не понял в чем интерес, но где то видел, как пример интересного вопроса:
    Object[] o = new Object[10](); VS Object b = new Object[10]();(вот тут я не знаю сам ответ, если кто читает — помогите с этим вопросом)
  • notify notify All, producer consumer и когда можно\нельзя исползовать notify вместо notifyAll

Алгоритмы


норм-сложно


  • проверка баланса скобок ({[ — check-for-balanced-parentheses-in-an-expression
  • вычисление выражение (дана строка с цифрами, +-*/ скобками вычислить значение) — expression-evaluation
  • BFS/DFS — bfs-vs-dfs-binary-tree
  • поиск пути в графе от вершины ко всем, наименьшего между 2 вершинами — find-if-there-is-a-path-between-two-vertices-in-a-given-graph
  • отсортировать стэк — sort-stack-using-temporary-stack
  • перемешать массив чисел в случайном порядке

сложно


  • поиска наибольшей одинаковой подстроки в двух строках — longest-common-substring-java
  • нахождение наименьшего суффикса слова, при добавлении которого к слову получится палиндром — Longest palindrome prefix
  • нахождение компонент связности в графе (union find)

Задачки


легко


  • числа Фибоначчи, (итеративно, рекурсивно, tail recursion c примерами)
  • проверка числа на простоту, напечатать все простые числа меньше N
  • fuzz buzz (с 2 сравнениями это интересней)

норм


  • ring buffer, thread (non)safe, (non)blocking.
  • producer consumer, различиные notify/notifyAll, когда можно заменить один другим.
  • сделать из queue -> blocking queue черех wait notify
  • thread safe кэширование результатов тяжелой функции
  • calculate VWAP (with sliding window, global)
  • sliding mean/avg
  • найти наибольий треугольник в массиве чисел
  • все числа из цифр, все цифры из чисел
  • найти общего предка в дереве (с известной-неизвестной глубиной)
  • подсчет битов в числе — среднее количество итераций, средний ответ.
  • посчитать самую длинную последовательность одного и того же символа в строке (строка дана изначально, строка как стрим).
  • различные варианты с массивом цен на сток и операциями купить-продать (купить только 1 раз, N раз) — надо максимизировать прибыль
  • найти все одинаковые строки ротаций — check-for-string-rotation-in-java/

сложно (из разряда, непонятно кто их составлял и для кого)


  • поиск выхода в лабиринте — maze
  • кони на шахматной доске — Knight's tour, сколько потребуется ходов чтобы достичь клетку i,j
  • поиск слова в матрице букв — leetcode-word-search-java
  • дейкстра (пересчитывать только те, кого зааффектили, использовать для этого разницу между текущей оценки вершины и новой).

Мои любимые задачи — динамическое программирование. Их спрашивали мало, но один раз спросили в оч и оч крутой конторе на оч крутую позицию и, мне кажется, меня взяли именно из-за того что я решил эту задачу, потому что ничего дургого сложного там не было.


  • раскраска красками домов — leetcode-paint-house-java
  • есть массив из высот потолка и пола. На каждом шагу мы можем остаться на полу или потолке, как построить луч максимальной длинны.
  • написать throthler для публикации потока цен, простой вариант — есть поток цен, мы должны паблишить не чаще, чем раз в 1 секунду. throttling vs conflation.
  • спроектировать как брут форсить пароли.
  • есть 2 текста ( каждый по 1GB), по одному у каждого пользователя. Пользователи могут обменяться только <1000 байтами, как понять одинаковые ли у них тексты в 99% случаем (важно — не чтобы это работало на 99% текстов, а именно в 99% случаев сравнения лубых двух текстов). Тут просто поговорить, т.к. полная формулировака задачи — сколько надо бит информации, чтобы вероятность успеха была 1-epsilon — это уже большая задача не для интервью (и не только для программиста, но и для математика).

ООП


  • написать программу, которая бы эмулировала работу библиотеки
  • ATM (банкомат)
  • больница — есть пациенты с болезнями, есть лекарства, которые лечат болезни и имеют определенные побочные эффекты, эмулировать пример X лекарств на Y множестве пациентов.
    организовать систему хранения данных для навигатора (хранить карту дорог и домов по сути). оценить количество индексов, количество перекрестков.

Немного занимательной математики


  • макс площади треугольник, вписанный в круг\квадрат.
  • какова вероятность, что случайный треугольник окажется тупоугольным
  • среднее время ожидания автобуса (автобус ходит 3 раза в час по расписанию\случайно)
  • поезда отходят от платформы на восток и на запад с одинаковой частотой. Мужчина приходит на платформу и садится в первый поезд. Жена живет на востоке, любовница на западе — почему то так получается, что он чаще едет к жене — как так?..
  • при заданном объеме найти цилиндр максимальной/минимальной площади
  • есть генератор случайных чисел, им можно воспользоваться только один раз. как сгенирировать два случайных (натуральных) числа.

Общие вопросы по разработке


  • приложение зависло — что будем делать
  • как профайлить, смотреть память
  • как вы тестируете свое приложение
  • TDD
  • SOLID
  • популярная нынче тема — микросервисы.

Ресурсы для подготовки


  • leetcode
  • hackerrank
  • interviewbit
  • geeksforgeeks
  • и много много им подобных (проект Эйлера еще)
  • glassdoor
  • google
  • practice-practice-practice and have fun!

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

Комментарии (80)


  1. syouth
    22.11.2018 20:09
    +1

    Читать это все очень тяжело и неприятно.


    1. noittom Автор
      22.11.2018 21:03

      спасибо за отзыв, согласен, статья требует дальнейшей редактуры. Просто очень большой обьем, постараюсь отредактировать


  1. tuxi
    22.11.2018 21:11

    поезда отходят от платформы на восток и на запад с одинаковой частотой. Мужчина приходит на платформу и садится в первый поезд. Жена живет на востоке, любовница на западе — почему то так получается, что он чаще едет к жене — как так?..

    Я правильно понимаю, что в этой задаче основной поинт в «востоке» и «западе»?


    1. noittom Автор
      22.11.2018 23:57

      Не важно, просто есть два разных поезда (маршрута). Он садится на поезд, который пришел первый


      1. tuxi
        23.11.2018 01:09

        а на станцию он с какой стороны заходит? или он по центру входит, между платформами (например туннель под путями как часто бывает на больших вокзалах) и ему что налево, что направо — одинаково по затрачиваемым усилиям?


        1. noittom Автор
          23.11.2018 01:14

          Совесем неважно. Он приходит на станцию, которая, считайте, является материальной точкой. Садится на первый поезд и все.


          1. tuxi
            23.11.2018 01:23

            Тогда, при прочих равных (стоимость проезда, время в пути, удобство посадки в поезд и тп), я пока что не вижу другого решения, кроме лежащего в плоскости эмоций и психики :)


            1. Regis
              23.11.2018 01:49

              Представьте, что интервалы между поездами в разные стороны такие: поезд на восток, 1 минута пауза, поезда на запад, 9 минут пауза, поезд на восток, 1 минута пауза и т.д. При этом интервал поездов в каждую сторону — 10 минут.


          1. hover
            23.11.2018 01:44

            Возможное решение
            Поезда уходят с разной частотой, но один, например, отправляется всегда незадолго до другого.


            1. tuxi
              23.11.2018 01:54

              Опять же все сводится к психологии. Мне не трудно подождать 5 минут… или 10 минут, особенно если маршрут занимает 1..2..3 часа. Но я например не буду ждать следующего поезда 6 часов.
              Мне кажется это из серии тех задач, где важен не ответ, а рассуждения.


              1. noittom Автор
                23.11.2018 03:11

                Нет, нет, тут четкое математическое (и простое) решение, которое уже озвучили. Частота одинаковое, решение формальное — который первый пришел, на том и едет. Рассуждения всегда важны :-)


                1. adictive_max
                  23.11.2018 09:58

                  Вариант А:
                  Тот, который на восток, дольше набирает пассажиров, поэтому больше шансов попасть на него.

                  Вариант Б:
                  Та женщина, к которой чаще ездишь, та и жена.


                  1. noittom Автор
                    23.11.2018 15:10

                    nice try :-) но нет


        1. noittom Автор
          23.11.2018 01:44

          Это не важно, пусть так как вы описываете. Но вообще можно сказать что вся станция это материальная точка из которой исходят два поезда в разных направлениях с одинаковой частотой (раз в час например)


      1. Nezd
        24.11.2018 23:46

        А можете объяснить почему так получается что чаще к жене? Комментарии прочитал но что-то не понял.


        1. vassabi
          25.11.2018 01:37

          я так понял, что если например поезда ходят каждый час и стоят на остановке 5 минут, но при этом поезд «на запад» уходит на пятой минуте часа, а «на восток» — на 59й минуте, то шанс попасть «не к жене» очень мал.


    1. Roger2
      23.11.2018 18:08

      ИМХО, задача недоформулирована.
      Мужчина приходит на промежуточную платформу, а поезда отходят с некоторой другой.

      косвенно это подтверждает коммент ниже «Он садится на поезд, который пришел первый».

      В этом случае да, это мат. задача, с решением.


  1. xxxFeLiXxxx
    23.11.2018 02:01

    Cогласно Java Language Specifications, chapter 10:

    In the Java programming language, arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array.


         public static void main(String []args){
            Object[] arr = new Object[10];
            System.out.println(arr.length); // 10
            Object obj = new Object[10];
            System.out.println(obj.length); // ошибка
         }


    Да собственно говоря все очень просто — в первом случае получаем массив объектов, во втором объект. Соответственно, можно обратиться по индексу, узнать длинну и так далее у o, а o2 это просто объект. Его можно привести к массиву, и тогда осуществить все операции что и для o:

         public static void main(String []args){
            Object[] arr = new Object[10];
            System.out.println(arr.length); // 10
            Object obj = new Object[10];
            System.out.println(((Object[])obj).length); // 10
         }


    1. noittom Автор
      23.11.2018 03:14

      Ну ок, а в чем сложность, интерес, о чем тут можно вести разговор ?


      1. xxxFeLiXxxx
        23.11.2018 03:44

        Честно — пытался додуматься, ничего особого в голову не приходит, разве что можно порассуждать о equals и о том, что массив это по сути Object, а например int[] — нет


        1. slonopotamus
          23.11.2018 13:56

          массив это по сути Object, а например int[] — нет

          Эмм… Что?


          1. xxxFeLiXxxx
            23.11.2018 21:18

            Не знаю, почему так написал. Имел в виду, что массив объектов и массив примитивов слегка разное, хотя бы по возможности записать null и по инициализации.


            1. noittom Автор
              23.11.2018 21:21

              ну null просто не входит в множество значений. В массив объектов нельзя записать примитив (я не про автобоксинг).
              массив примитивов занимает столько же памяти как и массив оъектов (так ведь вроде?) (считаем что слово это 64 байта).
              Собственно, в том примере отличается лишь типа «указателя»


              1. xxxFeLiXxxx
                23.11.2018 21:30

                Размер одинаковый, да:

                    public static void printObjectSize(Object object) {
                        System.out.println("Object type: " + object.getClass() +
                                ", size: " + InstrumentationAgent.getObjectSize(object) + " bytes");
                    }
                
                    public static void main(String[] args) {
                        Integer[] a = new Integer[10];
                        int[] b = new int[10];
                
                        printObjectSize(a);
                        printObjectSize(b);
                    }
                


                Object type: class [Ljava.lang.Integer;, size: 56 bytes
                Object type: class [I, size: 56 bytes


  1. rasswet
    23.11.2018 08:55

    «не овтечают, если име не нужно, лоигка» поправьте пожалуйста.


    1. noittom Автор
      23.11.2018 14:52

      поправил, еще опечатки — пишите в личные сообщения, с благодарносью поправлю


  1. dididididi
    23.11.2018 09:44

    Спасибо, дельно! Про деньги забыли сказать, так чему равна цифра по glassdoor*1,5? ))


    1. noittom Автор
      23.11.2018 11:31

      Ну это как температура по больнице, не знаю контекста любая цифра будет слишком абстрактна. Я бы сказал так, очень общо, программист в банке — 50к-150к в год. Но тут интересен вид распределения и вероятность попадание в определенный интервал этого распределения с течением времени, в этом плане агенты довольно хорошо могут прикинуть сколько примерно стоит тот или иной кандидат


      1. TheGodfather
        25.11.2018 14:06

        Хм, и вы всерьез говорите, что условные 100к брутто-евро\фунтов в лондоне — это «лучше уровень жизни, чем в Мск» (где вы 200+ тысяч рублей в месяц получали небось)?


        1. noittom Автор
          25.11.2018 19:23

          я не только серьезно говорю, я делаю сам такой выбор и вижу, его делают другие.
          меня тут драйвит все вокруг, мне нравятся какие-то субьективные вещи — история, природа, музеи выставки, другая культура, профессиональное развитие, отношение к людям и качество сервиса, обьективные вещи — вроде лучшее качество сервиса, дорог, возможности путешествовать по всему миру. Можно вообще все это свести к субьективному мнению. я нехочу вступать в спор где лучше. Мне лучше тут, у меня возможность быть тут. вы хотите по-другому? я искренне надеюсь, что и у вас есть способ осуществить свое желание


  1. ris58h
    23.11.2018 09:52

    Можете очень очень интересные задачи и очень очень хорошие деньги выразить в цифрах?


    1. noittom Автор
      23.11.2018 11:28

      Очень интересные задачи, zero GC стриминг цен клиенту (то, что называется market making), order acceptance, написать market adapter, переписать существующие адаптеры, заменив их универсальным одним адаптером, разработка hft framework с возможностью проигрывать исторические данные для калибровки прайсинг и алго моделей при том, что с минимальными изменениями эта же модель будет использоваться и для реальной торговли (часто для калибровки используется матлаб или какие то сторонние симуляции), написание этих самых трейдинг моделей на пару с трейдерами, оптимизации производительности, микро анализ цен и аналитика происходящего на рынке в масштабах миллисекунд.
      По деньгам, моя цель/мечта 150к-200к gbp в год.


      1. wildraid
        23.11.2018 12:10

        Любопытно. Всегда думал, что скоростной трейдинг и анализ по умолчанию пишется на C, так как идёт борьба за каждую миллисекунду.

        Как сейчас атмосфера внутри банков? Может так получиться, что в ближайшие пару лет совсем сложно им будет зарабатывать независимо от качества моделей. Если рынки снижаются по всему спектру, а скоро ещё и property может скорость набрать.


        1. noittom Автор
          23.11.2018 12:59
          +1

          Большинство (ну ок, очень много) low latency пишется на джаве, покарйней мере большие системы, не сложно написать один компонент (джава плюсы), но вот это поддерживать и расширять, это большая задача. Программистов на джаве много, программировать проще. С плюсами сложней. Да, безусловно есть системы на плечах, есть и плисы, но джава превалирует. Посмотрите disruptor, aeron — это очень хорошие примеры на джаве. Их параметры производительности и лэтенси впечатляют.


          1. noittom Автор
            23.11.2018 13:42

            а, атфмосфера отличная. в плане объемов, вроде все хорошо goo.gl/TfmkPP
            по крайней мере, я в своем мирке этой проблемы не замечаю, не думаю, что в ближайшие пару лет будут какие-то потрясения, не вызванные глобильными кризисами (т.е. тренд хороший), для Лондона ключевой момент — брекзит, но опять так, как это затронит программистов. А так, шарахнуть может в любой момент, но хороший программист не пропадет (другой вопрос сколько он будет зарабатывать)


          1. mezastel
            23.11.2018 15:39

            Так distuptor это только для матчинга заявок, как же всякие fpga feed handlers, алгоритмика вроде «попрайсить стрип опционов» и все такое?


            1. noittom Автор
              23.11.2018 15:53

              дизраптор, это пример кода на джаве, который показывает высокую производительность и латенси. Используется для асинхронного взаимодествия и обмена информацией между тредами (producer consumer). FPGA — все слышали, никто не видел. Я думаю, что их применяют, но очень мало, на работу джава программиста это не влияет (в том смысле, что на разработчиков джава остается весь спектр задач и плисы их не вымещают). Что значит «feed handler» — плисы в маркет адаптерах, которые, например, парсят сообщения? На джаве это можно делать за 1-2 микрос (если мы говорим о текстовом протоколе, бинарный с фиксированными смещениями данных быстрей гораздо), это не является камнем преткновения, имхо. Алгоритмы вцелом, у банка задача быть в середине и полуачть прибыль за счет объема, не быть сильно медленным и не совершать больших ошибок. У спекулянтов задачи другие, я знаю о них по наслышке. Для сложных вычислений (опционы, поверхности волатильности, используются гриды, например — я лишь слышал об этом). Вообще говоря о банках я беру довольно малую часть — e trading, FX/equties. rates, commodities, не дай бог — asset managment — там по другому и мне сложно оценить насколько. Risk systems — еще более подругому, middle office, retail banking — вообще другая вселенная. Buy side — вселенная рядом, там nature of business другой, который всему придает другой оттенок


              1. mezastel
                23.11.2018 16:04

                А что такое «гриды»?


                1. noittom Автор
                  23.11.2018 16:06

                  1. mezastel
                    23.11.2018 16:12

                    Хмм, странно, я понимаю для анализа, но на стороне исполнения есть время чтобы данные куда-то перекидывать? Лейтенси же нереальный, даже если у вас инфинибэнд. Ну то есть, именно по этому fpga решения и существуют, если нужно такие вещи «в моменте» считать.


                    1. noittom Автор
                      23.11.2018 16:14

                      не знаю их специфики, не думаю что там нужно real time


              1. Rhombus
                23.11.2018 16:17

                На джаве это можно делать за 1-2 микрос

                А на c++ (а тем более FPGA) еще быстрее. Но основная проблема не скорость, а GC.


                1. noittom Автор
                  23.11.2018 16:22

                  gc free и lock free нам поможет. массивы, mutable objects.
                  ну опять таки — LMAX & disruptor — не является ли примером того, что на джаве может быть очень быстро?


                1. noittom Автор
                  23.11.2018 16:23

                  за сколько это можно сделать на плюсах? Т.е задача — получить из IO(TCP) FIX сообщение и распарсить.


                  1. Rhombus
                    23.11.2018 16:29

                    Субмикросекунды, насколько я знаю. Но я в другой ветке писал, я сам как раз на java пишу.


        1. Rhombus
          23.11.2018 16:17

          Просто надо различать HFT и алгоритмическую торговлю (или даже не торговлю, а pricing/hedging). В HFT в основном c++, а у алго требования часто поменьше и java вполне хватает.


          1. noittom Автор
            23.11.2018 16:19

            можете что-то рассказать про HFT? где именно это — prop дески в банках и очень немногочисленные хэджфонды, которые занимаются не только systematic trading?
            какие задачи, какой обьем данных и какие требования к лэтенси. Что можно там сделать на плюсах, что нельзя на джаве, примеры (IO? паямть, кэши).
            я так понимаю, вы тоже в Лондоне работаете? Где, если не секрет (можно в личку)


            1. Rhombus
              23.11.2018 16:27

              Особо ничего не могу, я только в теории знаком. Я как раз по java больше.
              Но понятно, что сделать все можно что на c++, что на java. Насколько я понимаю, c++ предпочтительнее с точки зрения предсказуемости: в java GC и JIT все пор.
              Понятно, что можно писать так, что GC не проблема и с прогревом JVM вопрос решаемый.


              1. noittom Автор
                23.11.2018 16:36

                да, я бы сказал, что язык не камень преткновения, и там и там ест ьсвои нюансы и сложности. К тому же, джава стала такой быстрой не так давно, есть же системы которые начинались писаться 7-10 лет назад, например.


            1. cebka
              23.11.2018 17:55
              +2

              Работал в Citadel Securities, там все на C++, а непосредственно реактивный трейдинг на FPGA. Не уверен, что могу говорить точное время реакции, но это десятки/ок наносекунд. Разумеется, отвечает FPGA, а не CPU. Знаю, что XTX, например, кроме C++ используют http://luajit.org/dynasm.html HFT на Java тоже достаточно много, но я как-то миром Java не интересуюсь совершенно.


              1. noittom Автор
                23.11.2018 18:12

                ух ты, это круто, очень круто. Не боитесь разглашать? десятки наносекунд это запредельно хоть для си хоть для чего еще. XTX — кстати, я присматривался к ним, кажется крутой компанией


                1. vassabi
                  23.11.2018 20:36
                  +1

                  не могу сейчас найти ссылку на источник, но пару лет назад один программист «из HFT» хвастался графиком сетевой активности, на котором пакет с ответом начинал уже «уходить» с исходящей сетевой карты еще до того, как весь пакет с информацией доходил до принимающей. Да, это FPGA, но кодогенерацию (т.е. правила как и что торговать) для него они делали на языке высокого уровня (ЕМНИП на хаскеле, но уже точно не помню, тут могу и соврать, но точно не С\С++).


                  1. noittom Автор
                    23.11.2018 21:17

                    пакет с ответом начинал уже «уходить» с исходящей сетевой карты еще до того, как весь пакет с информацией доходил до принимающей

                    т.е. он начинает отвечать, не дослушав вопрос :-)?
                    нисколько не хочу подвергать сомнению, я бы внимательно посмотрел как графики строятся


                    1. vassabi
                      25.11.2018 02:25

                      к сожалению это было давно, сейчас погуглил по жжшкам, которые в то время читал (1, 2, 3, 4, 5, 6), но сходу ничего не нашлось, увы.

                      т.е. он начинает отвечать, не дослушав вопрос :-)?
                      я могу только предположить, что там шел заголовок пакета (это уже для тела нужно дослушать, а голову можно заранее пускать). И понятно, что стандартные драйвера\железо как минимум — дочитывают пакет (а могут еще и в буфере хранить перед передачей в код).


                      1. noittom Автор
                        25.11.2018 18:10

                        надо посмотреть что делает Solarflare.
                        Мне на ум пришел ткой сценарий, когда можно недочитвыват,
                        например у нас есть поток цен и мы для каждой цены выставляем ордер на бирже, а по приходу новый сначала отменяем предудущий и шлем новый (и на бирже не поддерживается cancel replace), тогда это имеет значение.
                        Спасибо за ссылки


                  1. cebka
                    23.11.2018 23:06

                    Может, Ocaml и JaneStreet. Хотя не знаю, используют ли они FPGA. А так пакет (точнее, нотификация о пакете) может доходить до CPU действительно медленнее, чем FPGA пошлет на него ответ.


                    1. Rhombus
                      24.11.2018 01:32

                      Может, Ocaml и JaneStreet. Хотя не знаю, используют ли они FPGA.

                      Как минимум планировали: blog.janestreet.com/hiring-an-fpga-engineer


              1. noittom Автор
                23.11.2018 18:13

                может, еще есть какая-то информация про хэдэфонды? ну там, статьи, публикации, презентации, которые можете порекомендовать? Мне это очень интересно, учитывая что там нет джавы, врядли я когда то это увижу воочию


                1. Rhombus
                  23.11.2018 18:31

                  Почему нет, полно java. Разве что конкрето на таких позициях нет.


            1. tmaxx
              24.11.2018 02:28

              Prop десков в крупных банках имхо не осталось (спасибо Volcker rule), только хежд фонды. Даже в относительно либеральном cash fx приходится натягивать pre-hedging на глобус чтобы как-то оправдать сам факт наличия ненулевой позиции (если банк большой и хранит кучу пенсий европейских старушек).


              Но я бы на месте автора не особо заморачивался с ультра-быстрым HFT. Его тучные годы давно прошли, про FPGA и microwave все в целом знают, и сейчас нужно искать баланс между гибкостью и скоростью. Не факт что этот баланс лежит в области наносекунд. Хотя чисто технически наносекунды конечно интересны и впечатляющи.


              1. Rhombus
                24.11.2018 11:31

                И вообще крутые посоны используют ASIC и смеются над твоим FPGA.


  1. dididididi
    23.11.2018 11:41

    Вот вам еще задачка на личную тематику. В одной стране ипотека дается под 2% и инфляция 2%(цены(на квартиру тоже) и зарплаты растут на 2% в год). В другой стране ипотека дается под 15% и инфляция 15%. Где и когда выгодно брать квартиру?

    PS это не про РФ, так как тут цены на квартиры падают вроде.


    1. noittom Автор
      23.11.2018 15:03

      оговорюсь сразу — это не только имхо, это просто мысли вслух и я типа думаю, как вам привести контр-аргументы.
      а как дела со скоростью накопления первоначального взноса, его размером? Соотношением зарплаты professionals ( а можно предположить, что в стране с худщей экономикой труд будет цениться меньше, а связи больше — это я так тонко про коррупцию- ?) к стоимости жилья? Я претендую только на работу специалиста, а не ресурсного менеджера или человека, использующего административный ресурс (это не оценочное суждение, а просто моя ситуация)
      Большая инфляция говорит о нестабильности, ипотека это комитмент на долгие годы, стабильная ситуация делает рынок надежным, предсказуемым и, как следствие, более эффективным, значит, ставки будут ниже, маржа банков меньше, как следствие — рынок недвижимости больше и также эффективным. Хотя, как менялись ценю в Лондоне до брекзита, это отдельная история — рынок грелся и ипотечные кризисы в США, кстати, докозательство неэффективности системы (это я сейчас против себя говорю :-) ) (и в США сейчас кстати ставки, по-моему, не 2 процента). При нестабильности банки будут закладывать бОльшие риски, которые лягут на плечи потребителя, т.е. кредит будет дороже. И если все будет хорошо, то вы больше за него переплатите, если все накроется — вообще потеряете квартиру.

      А вы про какую страну, кстати?


  1. Reywal
    23.11.2018 14:53
    +1

    при заданном объеме найти цилиндр максимальной площади

    Странная задача. Точно не ошиблись в формулировке? При фиксированном объёме, если высота цилиндра будет стремиться к нулю, его площадь очевидно будет стремиться к бесконечности.


    1. noittom Автор
      23.11.2018 14:55

      ну, это не самая сложная задача. Но я поправил на
      «при заданном объеме найти цилиндр максимальной/минимальной площади»
      чтобы закрыть тему. Кстати, простые задачки в начале интервью, на мой взгляд, очень помогают разогреться и включить мозги, ну и опять таки — sense of achievement.


  1. Ilias
    23.11.2018 18:00

    Статья хорошая, финансы самому интересны, но, по-моему, не раскрыты как раз самые важные вопросы:

    • как вообще попасть в Лондон
    • как получить первую работу там в банке
    • есть ли шансы (и какие) устроиться из России, везут ли вообще людей из-за границы
    и тд


    1. cebka
      23.11.2018 18:05

      Я бы задался вопросом "зачем" в первую очередь. UK — не лучшая страна для жизни, а зарплаты программистов не слишком высокие тут, если сравнивать с США, а в относительном плане, так и с Москвой. Финансы — это достаточно специфическая и достаточно неприятная область для программиста (как минимум в плане work-to-life баланса).


      1. Ilias
        23.11.2018 18:13

        ну я уже задался вопросом «зачем». после этого остались вопросы, которые я написал выше.


        1. noittom Автор
          23.11.2018 18:26

          выбор стран, зарплат, США — ничего не скажу, все индивидуально и слишком много других факторов. В плане баланса — нууу, по моему все нормально. Пришел в 9 ушел в 18. до дома комфортные 30 минут (или 60 если жить в доме загородом с семьей). Нормальный обед, можно сходить в спорт зал.


          1. shishmakov
            24.11.2018 22:16

            Центрального отопления нет, батареи все электрические, домовладелец экономит на электричестве и не часто их включает в зимний/весенний период. В доме холодно, спите под двумя одеялами. Кран разделён на отдельную горячую и холодную воду (в 21 веке до сих пор), горячая вода дорогая так как расходуется электричество, ванную, как в РФ, уже не попринимаешь пару раз в неделю.

            Мои воспоминания пересекаются с вашей реальностью быта?


            1. igolikov
              24.11.2018 22:36

              2 раздельных крана это скорее редкость.


              1. shishmakov
                24.11.2018 22:43

                Для какого города? Если Москва не Россия, то Лондон видимо не Британия, а в «ней», Британии, кран со смесителем для меня был чудом (Манчестер, Ливерпуль, Эдинбург, Йорк, ...)
                Возможно в туристических зонах дело получше ибо европейцам это дикость.


            1. noittom Автор
              25.11.2018 02:05

              Есть и газовое отопление, оно дешевле. Но да, если электрическое, то зимой 150 фунтов в месяц


    1. noittom Автор
      23.11.2018 18:23

      «Подготовку к интервью я рассматривать совсем не буду. Считаем, что это пройденный этап, необходимые знания есть, и есть приглашения на интервью.»
      Работа в банках это большая тема не на одну статью (мне кажется, это будет очень сложно сделать, слишком уж неоднородно и слишком уж субьективно, так, в общих чертах пользы будет много). Мой итог — интересно и хорошо, я считаю мне сильно повезло, что я попал туда.
      Как попасть в Лондон, ну тоже, как вы представляете ответ на этот вопрос?
      ПОстараюсь коротко, про иммиграцию вообще.
      Главные вопросы «зачем и ради чего», предположим отвечены. Есть программы иммиграции (blue card, в Британии раньше была Teir1 виза), компании перевозят сотрудников по inter company transfer (соот-но ищите компанию в вашем городе, у которой есть офис в Лондоне), ну и просто компании из Лондона нанимают сотрудников из-за рубежа, делают визу и т.д. — ничего не могу сказать насколько это сложно, знаю, что случаи есть и они не то, что перевезли какую-то супер звезду. Но чем больше опыта работы и выше квалификация, тем проше (ну тоже с неким допущением, чем больше опыт, тем меньше работы, соответствующей ваше квалификации). Наверное оптимально будет mid/senior developer.
      Так что шансы есть всегда :-)


      1. cebka
        23.11.2018 18:56

        Можно еще через учебу. Но если вдруг будете подаваться на PhD, то постарайтесь сделать это по Tier 2, а не по Tier 4 визе. А то мы сделали такую ошибку, и теперь нужно ждать на три года больше, чтобы податься на ПМЖ...


        1. shishmakov
          24.11.2018 22:19

          При ПМЖ гражданство теряется?


          1. noittom Автор
            25.11.2018 02:03

            При ПМЖ? В смысле, один из вариантов, живёте 5 лет на внж, потом год на ПМЖ и постоянно юк гражданство. Если ваше предыдущее гражданство позвонят иметь два, то ничего не теряется :-)


  1. TheGodfather
    25.11.2018 14:12

    есть 2 текста ( каждый по 1GB), по одному у каждого пользователя. Пользователи могут обменяться только <1000 байтами, как понять одинаковые ли у них тексты в 99% случаем (важно — не чтобы это работало на 99% текстов, а именно в 99% случаев сравнения лубых двух текстов). Тут просто поговорить, т.к. полная формулировака задачи — сколько надо бит информации, чтобы вероятность успеха была 1-epsilon — это уже большая задача не для интервью (и не только для программиста, но и для математика).


    Я может немного не понял, но как предполагается достичь условных 99%, если передать можно всего 1e-4% информации? И вообще, по каким ключевым словам подобные задачки гуглить?


    1. vassabi
      25.11.2018 16:11

      А как по-вашему проверяется — тот ли файл был скачан по сети\ с торрентов?
      гуглите контрольные суммы, проверка целостности, хеши файлов и прочие подписи: CRC, MD5, Merkle Trees и т.д.


      1. TheGodfather
        25.11.2018 16:24

        Ааа, контрольные суммы! Точно, что-то с утра туго соображается, даже не подумал об этом. Спасибо!