О собеседованиях
2 поста
2 поста
@zuko4f, раз я про тебя вспомнил. Подскажи, с какого направления лучше начать новичку, никогда не изузавшему программирование.
Решил написать отдельным постом, т.к. вдруг ещё кому полезно будет. Я сразу оговорюсь, что не претендую на истину, а всё, что написано ниже - моё субъективное мнение.
Во-первых, надо понять, зачем ты вообще хочешь работать программистом. Предположу, что ради больших денег. Тут сразу есть подвох - на стартовых позициях конкуренция огромная. Студенты и свежие выпускники готовы работать натурально по 60 часов в неделю и при этом работать почти за еду. При этом у них молодой и гибкий ум, свежая голова, не забитая кучей лишней инфы и способная много всего запомнить/усвоить. Если у тебя нет хорошего релевантного опыта и возможности пахать 60-80 часов в неделю - лучше просто забей и даже не начинай.
Если ты хочешь просто попробовать себя в этой роли без сильного погружения - ок, можно. Но на деньги не рассчитывай, зарплата будет на уровне кассира пятёрочки или даже ниже, т.к. конкуренция огромная. С момента, когда я написал свою первую программу и до момента, когда моя зарплата обогнала зарплату кассира прошло 17 лет. Ещё раз - семнадцать лет чтобы обогнать кассира по зарплате. Конечно, бывают и более резвые люди, но за год-два выйти на уровень хорошей зарплаты невозможно. Только если у вас уже есть сильный технический бэкграунд.
Вообще, где будет интересней работать в Яндексе.
Тут небольшое лирическое и, возможно, слегка грубоватое отступление. Я часто собеседую людей в Яндексе, сейчас как раз очередная волна набора стажёров. И требования к кандидатам очень высокие. Не потому что мы тут все охренели, а потому что у меня всего два свободных места и больше сотни соискателей. Тут и победители олимпиад, и люди, уже прошедшие пару стажировок в других местах, а у кого уже несколько лет опыта разработки. Это я к тому, что в начале у вас не будет выбор "где бы мне поработать". Работать придётся там, куда возьмут и если возьмут. Меня взяли в Яндекс с 7 попытки. Перед этим было 6 неудачных попыток в течение 9 лет. Не потому я слабый, а потому что конкуренция настолько велика, что любой мелкий косяк - и всё, кто-то из сотни конкурентов уже обошёл вас.
Но если вам всё ещё интересно и вы планируете серьёзно работать программистом, то мой список скиллов (для бэкендера, не фронта) вот:
Математика. Я из тех, что считает, что без изучения математики никуда. Вам не потребуется знание интегралов и т.п. Но математика учит правильному подходу к валидации своих и чужих знаний. Математика даёт общую базу того, как вообще должны строиться алгоритмы.
Чтение технического английского. Без этого у вас просто нет шансов вырасти. С трудом дорастёте до мидла, и то не факт. Вся информация, которая вам нужна - есть в англоязычном интернете. Но нужно уметь её добывать.
Базовые языки программирования. Тут есть разные школы мысли, лично я люблю С++. Но начинать изучать программирование с С++ это сомнительно, поэтому я бы рекомендовал Python. Курсов тьма, берите любой бесплатный. Мне как платформа нравится coursera. Платный брать не надо, т.к. именно на бесплатных курсах хорошо видна сила вашей мотивации и энтузиазма.
Онлайновые соревнования. Они вам не помогут в работе, но они помогут научиться решать задачи с собеседований. Leetcode, kaggle, Topcoder, etc.
Я намеренно не пишу слишком глубоко, т.к. не вижу смысла. Если есть какие-то вопросы или где-то нужно уточнение - пишите, попробую ответить.
Регулярно вижу споры о том, почему же на разные числа делить можно, а на ноль - нельзя. Очень часто "объяснения" являются ничем иным, как домыслом рассказчика. Поэтому хочу поделиться своей точкой зрения. Я изучал математику на мехмате МГУ, потом работал в Институте Прикладной Математики, имею несколько научных статей в области математики - поэтому считаю себя достаточно компетентным для ответа на этот вопрос.
Вообще ответ очень простой: нельзя делить на ноль, потому что математики между собой так договорились. Но договорились не потому что "нам так хочется", а потому что иначе не получается построить консистентную непротиворечивую теорию. Чтобы понять, как так вышло, надо прояснить несколько моментов.
Во-первых, математика основывается на аксиомах. Аксиома - это некая договорённость между людьми о том, что считается "правильным", истинным, без доказательств. Любая теорема в математике будет опираться на набор аксиом, т.е. набор фактов, которые все договорились считать верными. Важно заметить, что аксиоматика (набор аксиом) может быть разной. И какие-то теоремы можно доказать в одной аксиоматике, но опровергнуть в другой. Обычно в школе говорят про аксиомы планиметрии, но аксиомы есть и в других областях. Например, почему 2 + 3 = 5? Потому что люди так договорились. Не потому что в этом есть какой-то сакральный или физический смысл, а только по той причине, что люди так договорились. Это и называется аксиома - люди договорились что-то считать верным, потому что на основе этих фактов можно построить понятную и удобную систему. Так вот, для привычных всем натуральных чисел тоже есть аксиомы: Аксиомы Пеано. Эти аксиомы рассказывают, что мы умеем считать предметы и (как следствие) складывать натуральные числа.
Но этого мало для удобного пользования числами. Вот у тебя 5 яблок, ты отдал три яблока - сколько осталось? Хочется уметь записывать эту операцию, поэтому придумали вычитание. А заодно и ушли от натуральных чисел к целым. Если говорить языком алгебры, то мы подходим к Абелевым группам. В них мы считаем, что на самом-то деле у нас есть только одна операция: сложение. Но на каждый элемент у нас есть противоположный элемент. И вычитание - это просто прибавление противоположного элемента. Т.е. когда мы пишем 5 - 3, на самом деле это 5 + (-3). Но это всё как-то "на пальцах", а если формально - что такое "противоположный элемент"? Для этого сначала определим, что у нас есть "нейтральный элемент" - такое число, сложение с которым ничего не меняет. Т.е. для привычных нам целых чисел нейтральным элементном будет число 0. И вот если есть число X, то противоположное для него - это такое число, что если к нему прибавить Х, то получится 0. Для привычных нам целых чисел это -Х.
В процессе развития цивилизации становится понятно, что сложения и вычитания не хватает для нужд человечества, люди придумывают умножение и деление. В терминах алгебры это... всё та же Абелева группа (её часто называют мультипликативной группой). И если у нас не будет числа 0, то все те же аксиомы работают прекрасно: у нас есть числа (теперь уже не целые, а рациональные, т.е. дроби), есть какая-то операция (умножение) и есть даже нейтральный элемент. Для умножения нейтральным элементом будет число 1. Потому что при умножении на 1 число не изменяется. И деление - это ничто иное, как умножение на обратный элемент. Т.е. для любого Х мы хотим найти такое число, что вот мы его умножили на Х и получим единицу. Например, для числа 2 обратным будет число 0.5, потому что 2 * 0.5 = 1.
Тут мы и подобрались к ответу на вопрос. Дело в том, что с учётом всех аксиом, которые мы договорились использовать, деление на ноль - это на самом деле умножение на элемент, обратный нулю. Т.е. нам бы надо найти такое число Х, которое можно умножить на 0 и получить 1. Таких чисел у нас нет. Почему? Потому что вещественные числа являются полем и подчиняются Аксиомам вещественных чисел, из которых можно доказать (если кому интересно доказательство - напишу в комментах), что для любого Х всегда Х*0 = 0. Получается, что у нуля просто нет обратного элемента в силу тех аксиом, которыми мы договорились пользоваться. У всех чисел есть, а у нуля - нет. Поэтому и делить на него не получится.
Сразу возникает вопрос: а что будет, если мы возьмём другие аксиомы? Мы же можем придумать специальный элемент, который будет обратным к нулю? Конечно, можем. Вопросами разных "числовых структур" занимается алгебра, и существуют, например, "расширенное множество вещественных чисел", в котором есть ещё и элементы, отвечающие за бесконечность. Но вот беда - с этими элементами аксиомы перестают выполняться и большинство теорем, которые доказаны для привычных чисел - перестают быть верными для такого "расширенного" множества. И привычная нам бытовая логика уже не работает.
Делить на ноль "нельзя", т.к. это не укладывается в общепринятые аксиомы работы с числами, а говоря проще - потому что люди так договорились. Если "передоговориться", т.е. выбрать другой набор аксиом - на ноль будет можно делить, но много привычных теорем перестанут быть корректными, а значит и результаты таких вычислений не получится применять на практике.
Мой прошлый пост О собеседованиях на 700к/месяц вызвал намного больший резонанс, нежели я ожидал. И люди достаточно часто задавали дублирующиеся вопросы. Поэтому решил свои ответы собрать в едином посте. Вопросы разделил по отдельным темам чтобы было как-то проще структурировать.
Много людей указали мне на то, что я некорректно указал асимптотику для задачи про нахождение левой единички. Там есть два алгоритма: за O(N + M) и за O(N * log(M)). Нельзя строго сказать, какой лучше, т.к. зависит от значения M и N. Когда писал статью, написал первую, когда проверял - мне показалось, что второй вариант какой-то более интуитивный и решил поправить, но не исправил знак. Всем, кто заметил - респект. Всем, кто не заметил - мои извинения за косяк.
Вторая ошибка была в термине "контаминация кэша". Я подразумевал там состояние рассогласованности кэшей в контексте понятия "когерентность кэшей". Но мне указали (чего я сам не знал) на то, что вообще-то контаминация - это о другом https://en.wikipedia.org/wiki/Cache_pollution. Пикабу образовательный.
Ещё вопросы вызвал тот факт, что моя зарплата не совпадает с тем, что в оффере. И ещё часть людей проигнорировала этот факт и просто спрашивала - не нарушаю ли я NDA, разглашая свою з/п? Ответ - не нарушаю, т.к. з/п действительно другая (и её я не назову из-за NDA), а вот как так вышло - сейчас расскажу.
Когда вы обычно устраиваетесь на работу, то вы просто проходите собеседование и либо выходите на новую работу, либо нет. И тут всё просто. Но иногда так всё удобно складывается, что вы можете проходить собеседование параллельно в несколько фирм и получить от них параллельные офферы. В IT это совсем не редкость. Настолько не редкость, что в Америке даже распространены курсы по salary negotiations - переговоры о (будущей) зарплате. В России эта практика не очень-то распространена, но тоже имеет место быть. В моём случае это было примерно так:
- Я прошёл все собесы и все финальные собеседования, жду ответ от каждой организации. Дальше кто-то (не помню точно, кто), допустим, Сбер, говорит, что готовы мне предложить "вот такие" деньги (сумму можно поглядеть в предыдущем посте). И я НЕ соглашаюсь, а говорю, что мне надо подумать и подождать ответ от других фирм. Тут важно вести себя вежливо и культурно. Рекрутер - человек взрослый и (обычно) опытный. И у него кроме вас ещё куча работы, так что было бы хорошо ему максимально упростить общение с вами. Не надо его как-то обманывать, выдумывать какие-то глупые причины для затягивания своего ответа. Можно напрямую сказать: "Я жду, пока другие фирмы тоже назовут свои числа и потом уже выберу". Это вполне прагматичный и понятный подход. Да, есть шанс, что вас просто пошлют, но... на самом-то деле если вы крутой спец - вы нужны этой фирме. И она будет готова немного подождать.
- Дальше я сообщаю всем остальным фирмам, что мне "вот столько предложили". Или, если я не совсем спешу, то можно ещё денёк подождать (но не сильно долго, чтобы не наглеть) - вдруг кто-то "вслепую" предложит сильно больше. Но потом всё же я сообщил всем, мол "А мне вот Сбер предложил 675к/месяц". И у фирмы дальше два варианта - либо сказать "мы не готовы", либо сказать "ок, сейчас мы предложим больше". В моём случае часть фирм "отвалились", но Хуавей и Яндекс, подумав, предложили свои 685к и 720к соответственно.
- Я уже готов был принять предложение Яндекса, написал Хуавею и Сберу, мол "Яндекс вот такие мне деньги предложили, меня это устраивает". Сбер ответили, что готовы накинуть сверху ещё, назвали мне сумму, меня это не убедило. А вот Хуавей попросили подождать пару дней, пока они что-то с головным офисом согласуют. И накинули очень значимо. С этим "очень значимо" я пришёл в Яндекс, где мне сделали финальный оффер (сумму которого я как раз не пишу тут в силу NDA) и его-то я уже принял.
Кто-то считает, что переговоры о зарплате - это торгашество и "ниже достоинства". А я человек прагматичный, мне ещё ипотеку выплачивать.
Существует мнение (а точнее - ожидание или даже надежда), что деньги платят за навыки и знания. Но это (на мой взгляд) не так. Зарплата формируется исходя из того, сколько денег вы приносите бизнесу. Если у вас много полезных и крутых знаний, но бизнес не может на этих знаниях заработать - денег вам много не дадут. Даже если эти знания редкие и ценные и спасают людям жизни. Потому что для того, чтобы вы получили зарплату - бизнес эти деньги должен сначала получить от клиента. Поэтому крутые хирурги, у которых тоже есть огромное количество специфических знаний, получают меньше. И я, например, не считаю, что моя работа важнее, чем, например, работа педагога младших классов. Потому что формировать личность и обучать детей - для общества очень важно. И я был бы очень рад, если бы "социально-важные" профессии получали больше денег, но, увы, бизнес работает иначе.
Вопрос вечный, хорошего ответа нет, т.к. кому-то она и не нужна вовсе. Мне - была нужна. Я обещал ответить с примерами о том, как используются конкретные знания, привожу случаи из моей практики:
- Ряды Тейлора. Тут всё просто - если нужно вычисление какой-то функции, а ты пишешь под нестандартную архитектуру (встраиваемые системы, например) или ПЛИС, то математику придётся реализовывать самому.
- Градиенты и производные. Это базис для обучения нейросетей (метод SGD и его усложнённые модификации), а с помощью них как раз вы можете общаться с ChatGPT или рисовать картинки с помощью Stable Diffusion
- Аффинные преобразования и собственные вектора. Например, у вас есть набор объектов и их признаков. И надо понять, а нужны ли нам вообще все эти признаки? Можно записать все признаки как вектора, из векторов собрать матрицу. И если посчитать для этой матрицы собственные вектора, то моно оценить (по величине собственного значения), какие из этих признаков будут наименее полезными. Этот метод изобрёл не я, он называется PCA (простите за такое вольное описание метода).
- Якобиан и Гессиан. Всё это используется для оптимизации функций и я нигде кроме моделирования физических процессов не встречал. Но зато там это используется сплошь и рядом.
- Кольца и поля. На алгебре основаны многие современные методы шифрования. RSA был бы невозможен без малой теоремы Ферма, которая по сути говорит про кольца по простому модулю.
В общем и целом - все эти знания специфичны для своей сферы. И нередко за рамками сферы они просто не нужны. Я считаю, что математику знать очень полезно, но не обязательно.
Ещё могло сложиться мнение, я просто приходил на собесы, отвечал на все вопросы и уходил с ощущением превосходства. На самом деле - нет. За апрель я успел пообщаться с более, чем 10 разными фирмами и часть собеседований просто завалил.
Например, завалил секцию по Systems Design, на которой меня попросили спроектировать сервис а-ля Яндекс.Еда. Я сделал всё неплохо, но явно не на ту сумму денег, которую просил. Было ощущение, что я вроде делал всё правильно, но медленно.
Ещё была на одном собесе задача, вроде бы "в заданном графе посчитать количество треугольников". Формально - вычислить число подграфов, являющихся кликой размера 3. И вот это я просто не смог написать за отведённое время. Не уверен, что смог бы даже со второй попытки. Но, что интересно - после этого мне всё равно сделали оффер.
Ещё на одном собесе меня попросили придумать алгоритм параллельной обработки данных, в котором гарантированно не будет дедлоков. Понятно, что есть вариант "обвешать всё барьерами чтобы по сути доступ к данным всегда был последовательным", но это плохой вариант. А хороший я не смог придумать.
Ещё были собесы, где я просто зажал баги в код. Такое бывает, я в целом невнимательный человек по жизни.
Кто-то спрашивал про семью, родителей и т.п. На такие вопросы, простите, не хочу отвечать, т.к. не вижу связи с темой поста. Рос в обычной семье, учился в обычной школе.
Спрашивали про образование - я учился на мехмате МГУ, но не окончил его. После этого учился на психфаке РГСУ и его тоже не окончил. После этого учился на экономическом факультете МЭСИ и там получил диплом.
UPD: а ещё какой-то говнюк редиска скопировал мой пост и выкладывает теперь на других ресурсах. И я не про официальную группу Пикабу в Вк. Что ж, увы. Лишь бы от моего имени не начал там писать глупостей. "Кто настоящий автор?" всегда можно посмотреть по тому, где был пост раньше опубликован (правильный ответ? тут, на пикабушечке).
Думаю, не секрет, что айтишники гребут деньги лопатой. Но вот что именно нужно сделать, чтобы получить такую работу - пишут редко. В марте этого года я решил сменить работу и весь апрель занимался прохождением собеседований, в итоге получил несколько предложений на зарплаты около 700к/месяц. Об этом и хотел бы рассказать.
Немного о себе: занимаюсь коммерческим программированием 13 лет, ещё несколько лет работал в других сферах. Основной язык С++, достаточно хорошо знаю Python и ML. Есть опыт работы как в мелких фирмах на 5 человек, так и в ИТ-гигантах.
Искал работу программистом, строго не руководителем. Это добавляло некоторых особенностей, т.к. существует мнение, что большие деньги можно получать только на руководящихся должностях. Это не всегда верно (но на руководящих должностях получать большие деньги проще, т.к. руководителей нужно больше, чем топовых специалистов).
Первым делом, когда я решил менять работу - я обновил профиль в linkedIn и на hh.ru, уже на следующий день мне начали писать рекрутеры. Меня стали звать на разные секции - как технические, так и "пообщаться". Про свои ответы либо не буду писать, либо очень коротко, т.к. ответы можно легко найти гуглением (а там, где не получится - спрашивайте в комментах), иначе пост совсем разрастётся.
Одна интересная секция была на собесе в Хуавей. Я там шёл на должность ML-разработчика, который будет не модельки обучать, а писать сами библиотеки для обучения моделей. На собесе было человек 5 и они по очереди спрашивали меня каждый по своей теме (всё это длилось в сумме часа два):
- Сначала знание С++. Зачем нужны умные указатели, зачем нужен виртуальный деструктор, как устроен vtable, ещё какая-то муть. Я отвечал на всё легко и уверенно, интервьюер быстро "кивнул" и мы перешли к следующему.
- Аппаратура и программирование на С. Какие есть архитектуры помимо x86? Рассказал про ARM. Дальше спрашивали про вычисления на GPU - рассказал про примерную архитектуру и принципиальные отличия от CPU. "Что ещё можно использовать для вычислений?" Назвал FPGA, немного рассказал про особенности. Дальше этот же чел расспрашивал про особенности С. Разные вопросы про отличие между int *a =malloc(20); и int a[5];, про устройство менеджера памяти, про страницы памяти и виртуальную память (почему номера новых страниц всегда больше, чем номера старых? чтобы происходит с номерами удалённых страниц?), про механизм работы extern, union, volatile.
- Дальше были вопросы по математике. Как посчитать синус и косинус без соответствующей функции? Рассказал про ряды Тейлора. Что-то спросили про градиенты, попросили посчитать производную для |x| (модуль икса), а потом вторую производную. Дальше какие-то вопросы про градиенты. Перешли к аффинным преобразованиям и способам их описания. Рассказал про кольцо матриц, собственные вектора и их связь с геометрическим смыслом преобразования. Дальше спросили про Якобианы и Гессианы. Меня этот вопрос позабавил, но я рассказал и заодно упомянул, что эти штуки полезны для определения сходимости некоторых численных методов.
- Многопоточка. Тут всё было как-то быстро, видимо после первых трёх частей народ уже заскучал. Базово про примитивы синхрониазции (мьютексы, семафоры), про атомарность, заодно про атомарность на уровне процессора. Это ответил, рассказал про контаминацию кэша и методы разрешения конфликтов в кэше процессора - достаточно.
- Собственно, ML. Какие бывают слои у сеток, какие сейчас есть популярные архитектруры, почему 20 лет назад это не взлетало, хотя многие знания уже тогда были. Как инференсится дропаут, зачем нужна батч-нормализация, почему L1-регуляризация позволяет увидеть значимость фичей. Как построить эмбеддинги для слов, почему это вообще работает?
Собеседование оказалось очень разносторонним. Но это ещё не всё, после этого был ещё созвон на час, на котором мы обсуждали (уже с другими людьми) мой прошлый опыт. В каких крупных проектах участвовал, какие продуктовые фичи сам делал, какие решения сам принимал, как это отражалось на бизнесе. Несмотря на то, что я шёл разработчиком - ожидалось, что я буду очень автономным и иногда даже смогу как-то помогать в управлении/организации процессов. Технические вопросы почти не задавали.
В итоге мне предложили оклад 480к (после вычета налогов) и премии, которые зависят от разных факторов (мои показатели, общие финансовые показатели фирмы и т.п.), которые в среднем должны были добить мой доход до 685к/месяц.
В Сбере было несколько секций с написанием кода и одна на "поболтать". Секции про общение везде проходят примерно одинаково, так что повторять тут не буду. Про написание кода:
- Чистый С++. Тут была секция на проверку моих знаний по самому языку. Мне показали код, в котором есть несколько классов, где-то виртуальные методы, какой-то класс наследуется от другого, где-то в конструкторах и деструкторах что-то нетривиальное написано. И вопрос был "что выведет программа?" Суть была в том, что там в родителе была функция print (которая что-то базовое пишет) и в наследнике она была переопределена. Небольшой gotсha момент был в том, что функция не была объявлена виртуальной. Дальше там эти принты возникали в конструкторе и десрукторе. В общем и целом - вопрос был о том, что в каком порядке вызывается. Я почти справился, но проглядел один вызов из-за невнимательно. Но это был простой момент (а на сложные я ответил), так что интервьюер кажется поверил, что это просто невнимательность, а не незнание. После этого спросили "а что задумывал автор кода?" и попросили исправить. Такие вопросы будут очень сложны для джунов, потому что "а откуда я знаю чего он хотел?" и относительно легки для опытных разрабов, потому что понимаешь, какие есть расхожие подходы и что "вот так обычно пишут, а вот так - не пишут". В общем, вопрос крутой для определения опытности человека. Потом дали ещё кусок кода с многопоточкой и надо было сказать, есть ли в нём баги. Был потерян lock_guard (типичная ошибка работы с мьютексом), попросили исправить и объяснить, как именно раскручивается стек в многопоточке при обработке исключений.
Отличительной особенностью этой секции было то, что весь код писался в онлайн-трансляторе и каждый раз, когда я отвечал на вопрос "что выдаст код" мы просто запускали и смотрели. Особенно круто это было когда я ответил "упадёт с std::terminate" и оно действительно падало с std::terminate.
- Алгоритмы. Задачи, которые можно писать на любом языке (но я писал на С++).
Есть датчики. Один датчик сначала выдаёт нули, а потом, с определённого момента, начинает выдавать единицы. Есть синхронные показания N датчиков (в виде набора массивов, каждый содержит M значений). Нужно найти номер датчика, который сработал первым. Сделать надо эффективно, я реализовал за O(N + log(M)).
Воссоздаём лотерею: есть набор людей, про каждого известно, сколько билетов купил человек. Нужно написать функцию, которая выберет случайного человека с вероятностью, пропорциональной количеству купленных билетов (и вывести на экран его имя).
Была ещё какая-то задача, но уже не помню, что-то мелкое и скучное.
Про эту секцию могу сказать, что на высоком уровне тут уже обращают внимание не только на то, решил ты или нет, но ещё и как быстро, и какой код ты пишешь. У меня на каждую задачу уходило не больше 15 минут в сумме с выслушиванием условия и обсуждением моего решения, т.е. чистое написание кода занимало минут 5-10.
- Секция про ML. Тут были разные вопросы о том, как подходить к экспериментированию с моделями (зачем нужны отдельно валидационные и отдельно тестовые выборки?), что такое аб-тесты и т.п. Достаточно много вопросов про ранжирующие системы (какие бывают, какие есть особенности) - рассказывал про коллаборативную фильтрацию и эмбеддинги. Много каких-то технических подробностей спрашивали, например, почему разложение матрицы делают через SVD. Но в целом ничего особого. Типичная ML-секция с обязательными вопросами типа "как понять, что модель переобучилась, что делать? Как понять, что данных мало, что делать?"
- Общая секция. Я шёл в СберДевайсы, поэтому было важно ещё понимание каких-то "железных" вопросов. Рассказал про архитектуру процессора, кэши, ядра, конвейер, о том что внутри процессора есть отдельный компьютер и за один такт выполняется несколько микро-кодов, про TLB и прочее. Дальше про видюхи, их особенности относительно процов, про взаимодействие с памятью. Был вопрос типа "вам надо ускорить перемножение матриц, как бы вы это сделали с помощью видеокарты?" или, например, "можно ли ускорить поиск кратчайшего пути на графе с помощью видеокарты?".
Сбер предложил оклад 455к и премии разные, в сумме выходило 675к в месяц.
Я уже раньше работал в Яндексе и даже успел провести больше сотни собеседований, так что достаточно хорошо понимал, что меня ждёт. А ждали меня несколько секций с написанием кода "в блокноте", т.е. без возможности запуска. И ещё одна секция по ML.
- Алгоритмы.
Удалить нули из массива. Тут всё просто, проверка на совсем новичка.
Написать свою реализацию shared_ptr. Уныло, но хорошо проверяет понимание внутренней структуры языка.
Написать условный рейт-лимитер. Есть функция, которая на вход принимает timestamp события и максимально допустимое число таких событий за последние 600 секунд. Нам надо на каждый вызов этой фукнции ответить, хороший ли это запрос или уже "лишний", т.е. за последние 600 секунд было больше запросов, чем пороговое значение. Гарантируется, что timestamp не убывают.
Есть названия программ (по сути, просто набор строк), и для каждой есть набор зависимостей (т.е. массив строк на каждую программу). Зависимости только из того же списка, т.е. если у нас есть программы a, b, c, то программа b может зависеть от a, но не может зависеть от f (потому что нет в списке программы f). Надо вывести эти названия программ в "корректном" порядке для установки, т.е. чтобы если пакет шёл в списке - все его зависимости были раньше него в данном списке.
Были и другие задачи, но я точно уже условия не помню. Здесь опять же важна скорость написания и наличие багов. Если посадить хотя бы один баг (и не отловить самому) - это достаточно критично.
- ML. Эту секцию мне не очень хочется подробно описывать, т.к. она была почти "по учебнику". Если есть желание подготовиться - HR присылает ссылку на youtube с видосами от Яндекса. Видосы очень крутые (можно искать по ключевым словам "Лекции по машинному обучению, Воронцов ШАД").
- Общая секция. Вот тут была основная "соль". Просто хорошо решать алгоритмические задачки - дело полезное, но не на 700к. Тут было общение с будущим руководителем и обсуждение потенциальных задач. Мне назвали примеры задач (увы, разглашать не могу, т.к. они сейчас в работы) и я с ходу предложил какие-то идеи по решению этих проблем. Дабы не быть голословным, приведу примеры того, что могли бы спросить. Это гео-сервисы, поэтому вопросы вполне тематичные:
Как строить маршрут так, чтобы водитель доезжал быстрее? это вопрос-бомба, вопрос-убийца. Потому что большинство программистов начинают рассказывать про прекрасные алгоритмы, а потом спотыкаются на вопросе "а как вы измерите тот факт, что водитель стал доезжать быстрее? Как вы докажете, что вы что-то заметно улучшили для клиента?" Суть вопроса в том, что надо думать не только про техническую составляющую, но и про конечного пользователя. Недостаточно написать алгоритм, который работает быстрее или точнее предсказывает маршрут. Надо ещё чтобы это было полезно для клиента, а программисты про это часто забывают.
Мы запускаем бизнес (например, Такси) в новом городе. У нас есть примерная карта дорог, но нет статистики проездов по этим дорогам. Как предсказывать время проезда чтобы честно оценивать стоимость поездки? Опять же, вопрос про бизнес, а не про технологии. Да, тут надо обязательно проявить знание технологий, но этого мало. Типичный программист "в теме" скажет, что надо найти поставщиков данных, можно поездить самим по этим дорогам чтобы насобирать статистику и т.п. Но все эти этапы занимают как минимум недели, а в реальности - месяцы. А для бизнеса запуститься с плохими данными на полгода раньше - это зачастую выгоднее, чем запуститься спустя полгода, но с хорошими и точными данными. Поэтому хороший кандидат должен сам сказать о том, что вот, мол "можно купить данные - но это плохо и долго. А мы с вами сделаем вот так и вот так, тогда будет качество хуже, но зато быстро. Насколько именно качество будет хуже - считать будем вот так. А на бизнесовых метриках (которые человек сам должен предложить) это отразится вот эдак. А потом мы спросим стейкходлеров сервиса, готовы ли они запускать сервис с вот таки вот (относительно плохим) качеством, но на полгода раньше".
Это тоже не всё, но суть, думаю, ясна.
Яндекс предложил мне оклад 490к и ещё разные премии, в сумме с которыми вышло 720к в месяц.
Другие фирмы
Помимо этого я проходил собеседования ещё в Тинькофф, Вк, 1С и некоторые мелкие фирмы. Но общение с ними выкладывать уже день, да и в целом получилось достаточно чтобы сформировать понимание того, какого плана вопросы мне задавали. Если будут вопросы или нужны какие-то уточнения - пишите в комментах.
Выбрал я в итоге Яндекс, но текущий размер зарплаты лучше не буду озвучивать во избежание казусов. Он больше, чем мне изначально предлагали.
Всем привет, год назад купил кофе-машину Nespresso Vertuo Next, но в связи с СВО в России теперь капсулы Vertuo не продаются от официалов. Продаются от перекупов по ценнику х2 в лучшем случае, в среднем х3.
Вопрос к прошаренным пикабушникам: есть ли вариант закупить партию капсул где-то в "правильной" стране по адекватной цене и доставить в Москву? Возможно, имеет смысл заказывать большие партии (например, 1к капсул) и делить на несколько человек?
Многоразовые капсулы есть, но это другое.
UPD: спасибо @aristofanr, заказать можно по телефону, он есть на официальном сайте nespresso. Цены адекватные.
В прошлом году отдал фотоаппарат на ремонт (проблемы с объективом) в один из сервисов в Москве, указанный на оф. сайте Canon. Получил квитанцию со штампиком организации и договорились, что буду ждать звонка. Но звонок так и не поступил. Позвонил сам - сказали, что отправили на ремонт куда-то там и надо ждать пару месяцев. Ну, надо так надо, ждал. Перезвонил спустя указанный срок - "вот уже скоро всё будет, подождите пару дней". Сказал уже напрямую, мол, верните фотоаппарат. В ответ: "Он сейчас не у нас в отделении" и т.п. Такая ситуация повторяется уже в течение пары месяцев и, видимо, без юридической помощи вернуть назад аппарат не получится.
Вопрос к лиге юристов: куда и что писать в таком случае? Моя цель в том, чтобы вернуть фотоаппарат (пусть даже и не починенный) и по возможности привлечь организацию к ответственности.
На руках есть квитанция с указанной датой, моделью и серийником фотоаппарата и заявленными неисправностями.