Как стать автором
Обновить

Комментарии 41

и в чем смысл? работу кто работать будет? тоже чат?

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

поверьте, значит вам в этой компании делать нечего, рыба сгнила с головы.

PS: не скажу за все-все-все компании но со мной делился опытом брат, опытом прохождения собеседований в Москве, Питере и - за границей. Так вот только в РФ задают какие-то абстрактные задачки, решать которые в работе никто и никогда не будет. Поэтому он пару лет работая за границей покатался в командировки в Москву/Питер, походил на собеседования и просто забил на это в РФ. Пусть дальше сидят и собеседуют до посинения, а он работу работает и успешно.

только в РФ задают какие-то абстрактные задачки

Вот так 1 человек на своём опыте помог сделать вывод о собеседованиях во всём мире.

Если взять реальную задачу, то её надо переделать под собеседование - убрать лишние детали и оставить только то, что важно для работы. И мы получаем опять абстрактную задачу.

Задача должна быть похожей на реальную.

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

А как правильно решить эту задачу? Симлинки\хардлинки вместо дубликатов оставить?

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

Текс, а где прочитать про решение?

Решение -- заюзать fdupes. А как его реализовать -- отдельный вопрос.

И как глубоко копать и под каким углом зависит от кандидата и его резюме.

Легко можно нагуглить https://leetcode.com/problems/find-duplicate-file-in-system/ и разборы их в десятке мест.

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

1) Что такое дубликат?
2) Какие размеры файлов? (байты, гигабайты?)
3) Файлуха локальная или сетевая? (не то чтобы было очень важно)
4) ФС поддерживает симлинки или хардлинки? (И все ли файлы в одном маунтпоинте?)
5) Для мест которые дубликаты на разных носителях -- симлинк ок, или оставлять по копии на носитель?

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

Окей, ответ конечно же тогда -- посчитать хеш каждого файла (`find . | xargs md5sum | sort`) и сказать что один хеш = один файл. Но это не так (с md5 это очевидно, но когда кандидат говорит что тогда возьмём sha1 и радуемся мне очень грустно). Некоторые кандидаты говорят что мы возьмём несколько разных хешей и если они все совпали -- то ухх! (Ответ -- нет, сложность коллизии на два хеша не произведение а сумма их).

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

Приходим к следующему алгоритму:

  1. Найти все файлы.

  2. Первый шаг -- группируем их по размеру, оставляя только файлы с одним размером.

  3. Читаем по 1к байт из каждого файла и считаем любой не сильно замороченный хеш от этого 1кбайта -- группируем файлы в кучки с совпадающим хешем от первого килобайта. (Разумеется, выкидываем уникальные на этом шаге).

  4. Теперь для каждой группы надо убедиться равны ли файлы, и кто кому равен.

    1. Если файлов два в группе -- прочитать и сравнить побайтово => готово, или "да" или "нет".

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

      1. Затем полученнеые дубликаты и "хз что за зверь" группируются по хешу полного файла

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

      3. ура.

  5. Теперь у нас есть группы файлов которые точно одинаковые, мы переходим к вопросу а как же заменить файл на хардлинк так, чтоб никто не заметил -- знает ли кандидат об атомарных операциях фс. А если файл был уже открыт -- что произойдёт? А как с созданием симлинка на его месте? А можно ли гарантировать что файл нельзя удалить пока есть симлинки на него?

По 5му можно копать вечность, сколько хватит времени.

Нет. Абстрактная задача - это когда вас просят сделать то, чего в реальной работе вы никогда делать не будете. А частная задача - это утрирование реальной задачи до уровня собеседования.

Когда человек собеседуется в EA, PeopleCanFly, Blizzard и т.д. и ему дают реальные задачи, то наверное он в состоянии дать оценку тому трешу, который спрашивают в РФ.

Как эквивалент по конкретно моей работе сисадмином с 99% вероятностью на собеседовании будет вопрос об "уровнях OSI" или "о стеке TCP", но за 25 лет работы я максимум от сети использовал только понимание того что такое управляемый маршрутизатор или неуправляемый и как работают nslookup, ping, tracert и telnet. (даже когда я занимался настройкой Cisco)

Так же как до сих пор в некоторых учебных заведениях учат Turbo Pascal вместо питона и вместо BigData или Web - сортировку пузырьком. Да-да, я знаю что вы скажете что это основа, пусть и так, она ее можно изучать параллельно в формате методички и практического занятия, а не посвещать этому целый год.

Мы недавно с одним товарищем запускали курс по DevOps в контакте с универом, как тестовая площадка. Занятий всего на месяц, то есть 20 академических часов, а результат куда более интересный и практически полезный для студентов, чем ква-ква Делфи/ООП.

Об уровнях OSI важно знать, что они есть, иначе будешь тестировать TCP latency командой ping. Как у вас получилось не зацепить BGP и MPLS при настройке маршрутизаторов?

момент в том что моя работа никак не связана ни с OSI ни с TCP latency, я не сетевик. А чтобы поручить мне настройку цисок меня никто не спрашивал - гугл в руки и вперёд. Поэтому что такое BGP и MPLS я не знаю.

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

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

А на последней работе важным было администрирование сайта, нужны знания PHP и администрирование почты. Сказал что опыта такого у меня нет. По факту взяли, но "администрирование почты" это бесплатный ящик на Яндексе, а сайта - это вбивать новости через Битрикс админку.

Правильно понимаю, что единственный бредовый ответ это упоминание функции ROW() в SQL?

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

Возможно сетка имела в виду row_number(), но чтоб не пугать нас своей гениальность, специально немного ошиблась =) В целом ответ отличный же!

В Presto есть тип данных ROW, контейнер объектов с именованными полями, и там все примеры будут корректно работать.

Задачу о строке, содержащей две заданные подстроки, она тоже не решила. И ответ нерелевантный. Через бинарный поиск задача не решается

НЛО прилетело и опубликовало эту надпись здесь

Согласен, логарифма не хватает

НЛО прилетело и опубликовало эту надпись здесь

Просто спросите её может ли она посчитать сумму элементов массива быстрее, чем за O(N). Меня её ответ впечатлил.

It is not possible to calculate the sum of an array faster than O(n), where n is the number of elements in the array. This is because in order to calculate the sum of an array, you must visit each element in the array at least once. Therefore, the best you can do is to use a linear time algorithm, which has a time complexity of O(n).

Вроде все ок, в чем удивление? Правда, до этого она предлагала мне O(N log N) алгоритм, типа Divide-and-Conquer. При этом отмечала, что достоинства этого подхода - это возможность распараллеливания.

Мне вот что она предлагала. но я, конечно, жал кнопчоку что она гонит.

Еще спросите MD5 хеш от “test” и от "test5test" напирмер. Хорошо показывает что она не вычисляет, а аппроксимирует, и что именно она там аппроксимирует -- я помолчу :)

Конечно, ведь на сайте в FAQ это даже написано, ну и эта сеть же GPT, то есть для обработки естественного языка, она не работает как компилятор или что-то там вычисляет, просто генерирует максимально возможный ответ (аппроксимируя его). Что в этом такого, её используют для другого. Вот если бы вы написали - создай код для вычисления хеша, то другое дело было бы); скоро она научится держать контекст больше, чем 3000 слов, и тогда уже совсем иной инструмент будет.

Еще она мне доказывала что итерирование по вектору требует O(N) памяти. В общем, всё зависит от попадания в корпус обучения. Выводов она делать таки не умеет.

Красиво же =)

В leethard-задаче условие и ответ совсем разные (причем ответ в общем случае хреновый). С таким подходом собес не пройти :)

В первой алгоритмической задаче предложенное решение неправильное. Для строки "abba" оно выдаёт ответ 3, когда правильный ответ 2. И дело не просто в ошибке +-1, а в целом алгоритм неправильный.

тот самый случай когда "Говорит что знает vs Знает что говорит".

НЛО прилетело и опубликовало эту надпись здесь
Никого не смущает что функция поиска самой длинной подстроки из уникальных символов не работает?

# Test the function
s = "a5b5c5a5b5c5"
print(find_longest_substring(s))  


выводит 6 хотя вроде бы должно быть 3

Да и по коду видно что оно просто прибавляет `end` и заменяет новые значения `char_indices` не проверяя что лучший результат мог быть ранее в строке
Впрочем мы же разбираем возможность пройти собеседование, а не решить правильно задачу, чего это я
> Имея две строки str1 и str2, вернуть самую короткую строку, в которой есть как str1, так и str2 в качестве подпоследовательностей.

result += self.count - (self.right.count if self.right else 0)

я не понял ни задачу ни решение, но скажите пожалуйста почему в вопросе «вернуть самую короткую строку» а в ответе у нас возвращается целое число?
И по каким признакам вы засчитали этот ответ? И еще неплохо бы примеры входных параметров и решений чтобы лучше можно было разобраться в задаче. Я всего лишь кожаный мешок и мне формулировка кажется неясной.
В задаче имеется в виду вот что:
  • «aaa», «bbb» -> «aaabbb»
  • «aaabb», «bbb» -> «aaabbb»
  • «aabbbc», «bbb» -> «aabbbc»

А решение неверное, ессно
спасибо
  1. Неверный код

  2. Просто глупость какая-то

  3. Несуществующая функция это весело, но нет.

  4. Ну еще туда-сюда.

  5. Тоже глупость какая-то

Спасибо, мы вам перезвоним.

Спросите уже у неё, кем она видит себя через пять лет.

Спрашивать надо задав контекст :)

я считаю, что в задаче с карточками либо подвох в условии, либо я его не так понял. с самого начала все карточки уникальны. «без замены» – значит, без возврата ? в вопросе имеется союз [и]. Но буквально оно так не сможет выполниться, ведь первая карта любая, а вторая должна быть такой же. получается. речь идёт о логическом ИЛИ. вероятность одного цвета 9/39, а номера — 3/39. события независимы. суммируем, получаем 12/39.

да, простите. и потом 1 - 12/39

Зарегистрируйтесь на Хабре, чтобы оставить комментарий