Мы не видели изначального контракта. Если в контракте прописано, то поезда могут пожизненно обслуживать только представители производителя, и покупатель с этим согласился, то это выглядит уже по другому.
Не очень понимаю, если какая-то из сторон договора считает, что другая сторона нарушила условие контракта - для решения этого вопроса существуют суды.
Устраивать диверсии - мув абсолютно отвратительный (и скорее всего столь же незаконный) вне зависимости от каких-либо условий каких-либо контрактов.
По словам руководителя РКН, уже установленные комплекты ТСПУ нуждаются в постоянной модернизации, в первую очередь из-за роста объёма трафика у операторов связи. Эту проблему планируется оперативно решать установкой дополнительного оборудования в узлах связи.
Впечатляет, сколько сил и времени тратится на вещь, которая людям не может принести по построению никакой пользы или добра, а только мешает жить и работать.
Сейчас мы живём в мире, где каждый второй сайт - 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 - убрать рекурсию)
Как это не волнуют?
Их волнуют такие мелочи - чем больше такого будет, тем больше у бояр будет работы и деняк.
Не очень понимаю, если какая-то из сторон договора считает, что другая сторона нарушила условие контракта - для решения этого вопроса существуют суды.
Устраивать диверсии - мув абсолютно отвратительный (и скорее всего столь же незаконный) вне зависимости от каких-либо условий каких-либо контрактов.
Впечатляет, сколько сил и времени тратится на вещь, которая людям не может принести по построению никакой пользы или добра, а только мешает жить и работать.
Сейчас мы живём в мире, где каждый второй сайт - 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 рабочих часов собеседующего разработчика/лида (на самом деле больше - потому что всё-таки требуется переключать контекст).
Я понял бы ваш подкол, если бы речь шла о каком-то нетривиальном изменении.
Типа "хэй, ты описал это очень просто, и по этому псевдокоду может создаться впечатление, что задача - тривиальная. Но следующим шагом интервьювер попросит сделать X и это сразу сделает задачу сложной" (где X - убрать рекурсию)
Но не сделает же.
Я уверен, что в этом псевдокоде при переложении на произвольный язык, компилятор языка не развернёт хвостовую рекурсию.
(ну или развернёт один из двух рекурсивных вызовов - а вам-то какой от этого прок, глубина рекурсии от этого не изменится)
Если дублирует, то в чём проблема?
Любая возможность не перепечетывать какой-нибудь стрёмный код ошибки с риском опечататься в одном символе / не пересылать фотографию экрана - благо.
Есть хотя бы один плюс того, чтобы пользователю такую возможность не дать?
Надеюсь, что qr-code не заменяет, но дублирует логи на самом экране.
Почему не так? Напротив, ваш подход отлично работает - вы не понравились интервьюеру и он вам не понравился. Полное совпадение, идеально.
Тут главное выбранную стратегию ни в коем случае не менять.