Как стать автором
Обновить
4
0.3
Антонов Никита @kogemrka

Пользователь

Отправить сообщение

Как это не волнуют?

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

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

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

Устраивать диверсии - мув абсолютно отвратительный (и скорее всего столь же незаконный) вне зависимости от каких-либо условий каких-либо контрактов.

По словам руководителя РКН, уже установленные комплекты ТСПУ нуждаются в постоянной модернизации, в первую очередь из-за роста объёма трафика у операторов связи. Эту проблему планируется оперативно решать установкой дополнительного оборудования в узлах связи.

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

Сейчас мы живём в мире, где каждый второй сайт - SPA, написанный на джаваскрипте.

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

Операции в AVL дереве называется rotate, а не invert, вряд ли имели в виду именно её (в оригинальном сообщении автора brew используется слово invert).

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

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

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

Возможно, коммуникационный барьер возникает из-за разницы фронтенд/бэкенд.

Просто, ну пишем мы, допустим, на бэкенде crud (взять жсон, положить в бд. Взять параметр, селектнуть по нему из бд, отдать json).

Это, казалось, бы, самое простое, что на бэке можно придумать.

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

Я это к чему веду.

Никто не кладёт данные в дерево просто так по приколу.

Если есть дерево - значит, как правило, есть какой-то инвариант / набор инвариантов.

Рассуждение над инвариантами почти всегда естественно ведутся в терминах рекурсии и "раздеяй и влавствуй" - сформулировал что-то на одном уровне деревьев, свёл к какой-то подзадаче на детях / комбинации детей.

В этой задаче рекурсивное решение выводится просто и легко и просто и легко доказывается.

Решить задачу - это как раз-таки придумать, как сделать то, что требуется поддержав инварианты / как использовать инварианты на дереве, чтобы эффективно найти / посчитать то, что требуется.

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

Подход "вижу дерево с инвариантами - буду рассуждать в терминах рекурсии, потом если надо будет - разверну" - совершенно нормальный и правильный.

Развернуть рекурсивное решение в стек / стек+автомат - уже технические детали.

Ну, типа, в самом крайнем случае можно прямо в лоб не включая голову переписать написанный рекурсивный код в большой такой while со стеком из std::vector'а. Знание о том, что так можно сделать - не какое-то сакральное знание, на проверку которого стоит тратить время.

Вы меня кажется, не поняли.

Представьте, что я вас собеседую.

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

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

Все x второго дерева строго больше любого x первого дерева.

Вам нужно из двух деревьев получить одно с сохранением инвариантов.

—-

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

если человек с ходу в рекурсию бежит

Кек, решение задачи среди прочего подразумевает формулирование и объяснения решения, доказательство корректности (не в строгом формальном смысле) и рассуждение над кодом.

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

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

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

Конечно он не лежит, с чего ему лежать? просто медленно отвечает.

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

Т.е. деграднуло оно примерно в шесть тысяч раз.

И при этом оно "медленно отвечает" вместо того, чтобы упасть по таймауту / deadline'у?

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

Не выдумает, а подумает о возможных проблемах

Вот вы же выше по треду упомянули про "тут можно углубиться в многопоточность".

Вы же понимаете, что, например, добавлять блокировки в код, который ни за что не конкурирует "просто так" - это прямо будет провал? (и не только блокировки, но и большую часть операций с atomic'ами).

Хорошо, допустим, сениор углубился в многопоточность. И написал многопоточный код для kernel space'а.

 апстрим лежал, она пару дней поработала и положила прод

Теперь вы получили травму и злитесь при виде рекурсии,

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

Кстати, про observability на собеседовании тоже стоит поговорить.

 А не "о, дерево, хорошо что я по школе это помню - тут же и применю"

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

Сеньор - взял бы день и больше на решение

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

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

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

Я всё ещё не понимаю, о каком школьном знании мы говорим?

Это не какая-то штука, которую кто-то вообще держит в голове, это просто задача и её предлагается решить. Откуда вообще взялось какое-то зазубривание, которое вы подразумеваете?

Зависит от глубины на которую хочется нырнуть.

Конечно зависит)

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

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

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

Компании - ни за чем. Собеседующему - чтобы протолкнуть кандидата, которого он заранее выбрал; либо чтобы чтобы отчитаться что-то вроде "вот, опросили 50 кандидатов - все неадекватные. Не будь меня - вам самим бы пришлось с ними иметь дело!"

50 кандидатов - это 50 рабочих часов собеседующего разработчика/лида (на самом деле больше - потому что всё-таки требуется переключать контекст).

Я понял бы ваш подкол, если бы речь шла о каком-то нетривиальном изменении.

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

Но не сделает же.

Я уверен, что в этом псевдокоде при переложении на произвольный язык, компилятор языка не развернёт хвостовую рекурсию.

(ну или развернёт один из двух рекурсивных вызовов - а вам-то какой от этого прок, глубина рекурсии от этого не изменится)

Если дублирует, то в чём проблема?

Любая возможность не перепечетывать какой-нибудь стрёмный код ошибки с риском опечататься в одном символе / не пересылать фотографию экрана - благо.

Есть хотя бы один плюс того, чтобы пользователю такую возможность не дать?

Надеюсь, что qr-code не заменяет, но дублирует логи на самом экране.

Что я делаю не так?

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

Тут главное выбранную стратегию ни в коем случае не менять.

Информация

В рейтинге
1 766-й
Откуда
Карабаново, Владимирская обл., Россия
Дата рождения
Зарегистрирован
Активность