GD Star Rating
loading...

Здравствуй, блог! Нужен совет.

Я тут ебанулся на отличненько и решил сходить на собеседование в старую, нединамично стагнирующую, но большую и уважаемую компанию на должность “Разработчик C#”.
Первый этап собеседования заключался в том, что мне дали стопку бумаги с вопросами, на которые надо было в письменном же виде ответить… подробности инсайде

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

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


Модератор, ты не прав. Здесь не кидаются какашкам. Здесь делают ими друг–другу общий классический массаж!
Написал sleep, 22.12.2011 в 14.30

Админы и сочувствующие посетители hardblog.net посчитали злободневным:насосы на Linux

Tagged with →  

254 Responses to Здравствуй, блог!

  1. linux:

    : извини, но вот что мне напоминает любой разговор с тобой 🙂 (1:40).
    Матричные и прочие часы, число Хоара и пр вещи для локов и поиска дедлоков на снепшотах нужны только в 0.001% софта, да и там уже оно написано!
    ну а про зп, я всегда встречал только вилку как самое сильное условие на зп.

  2. UPnsuper:

    На всякий случай, если это имеет значение – опыта профессиональной работы у меня уже за пять лет, из них именно с C# – последние два года. Может быть, такие вопросы ещё были бы объяснимы, если бы их задавали выпускнику какого-нибудь ВМК, ни разу делом не занимавшегося (хотя, имхо, они в любом случае не соответствуют вакансии).

    Итак, вопросы были следующего вида:

    ===
    Что выдаст функция
    public int Calculate(int value) {
    return value++ + ++value;
    }
    ===
    Напишите на Javascript функцию, которая по строке вида “2011.12.20 18:18” будет возвращать соответствующий объект типа Date.
    ===
    Есть ли разница между
    int value = 0;
    и
    System.Int32 value = 0;
    ===
    Есть ли ошибка в коде
    DateTime dateTime = null;
    ===
    Что лучше использовать для склейки четырёх строк,
    var s = s1 + s2 + s3 + s4;
    или
    var sb = new StringBuilder();
    sb.Append(s1);
    sb.Append(s2);
    sb.Append(s3);
    sb.Append(s4);
    var s = sb.ToString();
    ===

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

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

  3. Peeef:

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

  4. Xuaapp:

    : если HR умный, то они хотели от тебя “честно”, если тупые – “правильно”. Вроде как тебе повезло. Но хз, я такой подход не одобряю и к таким бы людям работать не пошёл.

  5. HTnSm:

    :

    1. нужно оторвать руки тому, кто это писал, но вообще походу 2 * (value + 1), хотя в другом языке с этим же синтаксисом может быть и другое.

    2. по второму вопросу – разницы нет, int – это альяс для Int32.

    3. да

    4. Лучше использовать первое, так как написано понятней.

    Очень интересно, что ответил тинпу.

  6. UPnsuper:

    : Ну давай пройдёмся по вопросам:
    1) Надо помнить, в каком порядке (слева направо или справа налево) вычисляются выражение. Надо помнить, что из i++ и ++i возвращает исходное значение, а что – увеличенное. При этом, мало того, что в реальной жизни такой код не попадётся – вообще за его написание надо расстреливать.
    2) Вакансия с JS никак не связана, а для решения задачи нужно помнить, как там в JS работать с регэкспами (хотя бы для валидации входной строки).
    3) Если мне надо хранить небольшие числа (типа счётчика от 1 до 1000), я использую int. Если большие – long. Кроме того, обычно принято писать именно сокращённые названия (int, long), а не полные (System.Int32, System.Int64). Хуй его знает, всегда ли int соответствует Int32; может быть, при запуске бинарников в 64битном режиме на 64битной системе это будет System.Int64. Если такой вопрос вдруг встанет – я это за пять секунд посмотрю в документации; но он не встанет.
    4) Ну это уже действительно на отсев неадекватов, и было бы понятно, если бы были ещё и нормальные вопросы. Но их не было; показал, что адекватен – идёшь к директору.
    5) Если оплата не по количеству строчек кода – я использую String.Join. Склеивать строки в реальной жизни через StringBuilder надо быть мазохистом.
    6) Последний раз я напрямую с DataTable работал год назад, когда писал слой абстракции для того, чтобы никогда вручную с DataTable не работать. Если понадобится опять поработать – я, конечно, смогу это сделать. Даже без чтения документации (есть же IntelliSense). Но сделать это в такой форме – может быть, они и реальный код на бумаге пишут, без использования компьютеров?

    Для сравнения, в другой компании были задачи вида “напишите функцию для проверки правильности расстановки круглых и квадратных скобок во входной строке”

  7. UPnsuper:

    О, вспомнил ещё одну сегодняшнюю задачу:
    ===
    Пользователь вводит в поле для текстового ввода строку, нужно вывести её в перевёрнутом виде (“!тевирП” вместо “Привет!”) в label.
    ===
    Вот что должна проверить эта задача?
    Умение (быстро) переворачивать строки? К чему тогда лирика про поля и label?
    Минимальное знание WinForms? ОК, но вакансия не подразумевает работу над пользовательскими интерфейсами (уж точно не с WinForms).
    В общем, не понимаю я этих эйчаров…

  8. UPnsuper:

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

  9. Xuaapp:

    : какой-то угар (:

  10. Peeef:

    :
    Надо помнить, в каком порядке (слева направо или справа налево) вычисляются выражение.
    Нет, достаточно знать, что значение такого выражения в Си стандарте (не уверен насчет С#, но думаю там то же самое) неопределено.

    Надо помнить, что из i++ и ++i возвращает исходное значение, а что — увеличенное.
    Странно, если программист этого не знает.

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

    Нет, нужно знать, что для такого дела найдется готовая библиотека и уметь нагуглить. В любом случае ответ “не знаю, но нагуглю за секунду” должен считаться верным.

    Хуй его знает, всегда ли int соответствует Int32

    Не хуй знает, а в стандарте это четко прописано. Даже я знаю, хотя с C# не в зуб ногой.

    4) Ну это уже действительно на отсев неадекватов,

    Мне, как не-программисту на C# очевидно что вопрос упирается в то, является ли DateTime классом или структом. Проверка этого знания (или хотя бы понимания разницы) – вполне ОК на мой взгляд.

    5) Если оплата не по количеству строчек кода — я использую String.Join. Склеивать строки в реальной жизни через StringBuilder надо быть мазохистом.

    Вполне адекватный ответ на вопрос. И ради такого ответа стоит этот вопрос задать, нет?

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

    Не знаешь – напиши “не знаю, но могу нагуглить”. Никто же не говорит тебе что для прохождения обязательно знать мануалы из головы и фигачить без синтактических ошибок.

    Для сравнения, в другой компании были задачи вида “напишите функцию для проверки правильности расстановки круглых и квадратных скобок во входной строке”

    Ага, вот такие задачи конечно же соответствуют специфике работы. Один из правильных ответов на такой вопрос таков: “пойду и возьму в гугле первую ссылку из 10 000 уже готовых реализаций”.

  11. Peeef:

    : Знание наличия функции reverse у строки. Вдобавок она сразу покажет – любишь ли ты изобретать велосипеды или нет.

  12. Xuaapp:

    : я не знаю как сейчас, но раньше стандартного метода reverse в C# не было. Так что вопрос ничего не покажет, например.

  13. UPnsuper:

    : Я примерно так отвечал.

    1.
    (была формулировка “прокомментируйте этот код”) Такой код писать нельзя, чтобы не пришлось его потом “комментировать”. Но, если интересует результат кода – надо полезть в документацию, посмотреть, в каком порядке проходят вычисления (слева направо или справа налево), какой из двух операторов i++ и ++i возвращает исходное значение, а какой увеличенное. Вот табличка 2*2 с результатом для каждого из этих вариантов. Опа, в каждой ячейке таблички получилось 2*value+2, но это не оправдывает написание такого кода.

    2.
    function() {
    if(str.replace(/[1-9]/, “0”)!= “0000.00.00 00:00”) throw new Exception(“wrong format”);
    return new Date(str.substring(0, 4), str.substring(5, 2), str.substring(8, 2), str.substring(11, 2), str.substring(14, 2), 0);
    }

    с комментарием: надо посмотреть в документации, как делать замену по регулярному выражению; как кидать исключения; с нуля или с единицы начинается нумерация строки в substring; как создать объект даты по году-месяцу итд; а вообще, конечно, в реальной жизни я напишу это через регулярные выражения без всяких replace/substring, но надо смотреть в документации, как с ними работать в JS, а без этого даже пробовать бессмысленно.

    3.
    Вроде int – алиас для System.Int32, но хуй его знает, надо посмотреть документацию, может, на некоторых платформах и с некоторыми настройками это System.Int64. На переполнение рассчитывают только пидарасы (всё-таки же на C# вакансия, не на C), а если, наоборот, боитесь переполнения – используйте long.

    4.
    ну тут всё очевидно DateTime – структура, она не может быть null.

    5.
    Вариант со StringBuilder производительнее, а с String.Join – и производительнее (надо свериться с документацией), и понятнее. В реальной жизни я не буду выбирать между двумя сортами говна, а воспользуюсь не-говном.

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

  14. Xuaapp:

    :

    1. Почему ты думаешь, что шарпнику надо знать стандарт си? Я хз как в шарпе, не спец, но жс, например, выдаст предполагаемый результат – 2 * (value + 1). А в руби были какие-то замуты с порядком, но уточнять сейчас лень.

    2. Библиотека не найдётся.

    4. Понимание разницы между struct и классом умные люди так не проверяют.

    5. Нет.

  15. Xuaapp:

    :

    2. function(str) { return new Date(str) }

    Вопрос дебилен по своей сути, а твой ответ гыгы (:

  16. UPnsuper:

    :
    > Нет, достаточно знать, что значение такого выражения в Си стандарте (не уверен насчет С#, но думаю там то же самое) неопределено.

    Во-первых, казалось бы, разработчику (если это не разработчик на brainfuck и не участник IOCCC) это знать совершенно необязательно.
    Во-вторых, из общего понимания – непонятно, почему значение такого выражения не может быть определено.

    > Нет, нужно знать, что для такого дела найдется готовая библиотека и уметь нагуглить. В любом случае ответ “не знаю, но нагуглю за секунду” должен считаться верным.

    Ага, только задание было – “напишите код” 🙂

    > Не хуй знает, а в стандарте это четко прописано.

    Но собеседуют они конкретного человека, а не стандарт. Я – не ходячая энциклопедия, поэтому для меня это – “хуй знает, надо посмотреть в стандарте”.

    > Мне, как не–программисту на C# очевидно что вопрос упирается в то, является ли DateTime классом или структом. Проверка этого знания (или хотя бы понимания разницы) — вполне ОК на мой взгляд.

    Ну вот это был, пожалуй, самый приличный вопрос.

    > Вполне адекватный ответ на вопрос. И ради такого ответа стоит этот вопрос задать, нет?

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

    > Не знаешь — напиши “не знаю, но могу нагуглить”. Никто же не говорит тебе что для прохождения обязательно знать мануалы из головы и фигачить без синтактических ошибок.

    Но создаётся именно такое ощущение.

    > Ага, вот такие задачи конечно же соответствуют специфике работы. Один из правильных ответов на такой вопрос таков: “пойду и возьму в гугле первую ссылку из 10 000 уже готовых реализаций”.

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

  17. UPnsuper:

    : Опять же, в реальной жизни я сначала попробую написать str.re и посмотреть, что мне предложит IntelliSense. А если ничего не предложит – то напишу соответствующий метод расширения, после чего уже можно будет писать str.Reverse(). Я всё-таки обычно более интересными вещами занимаюсь, а не переворачиваю строки без перерыва.
    И всё-таки, к чему тогда все эти пользователи, поля для текстового ввода, лейблы?

  18. UPnsuper:

    :
    > function(str) { return new Date(str) }

    Ну походу они ищут школьника-мастера на все руки, который, конечно же, будет знать, как там создать объект даты в джаваскрипте, какие аргументы у его конструктора и какие есть готовые функции для разбора строк с датой.
    Даже для вакансии “разработчик JS” этот вопрос выглядел бы странно, а уж тут-то вообще непонятно, зачем проверять знание таких вещей в JS.

  19. HTnSm:

    : не знать как работать с датой в джаваскрипте – это пиздец, особенно, если ищут разработчика под ASP.NET ***.

  20. Xuaapp:

    : пиздец – это тупые овцы в HR.

  21. HTnSm:

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

  22. HTnSm:

    : у лэйбла поставить.RightToLeft = true; (или как там это свойство называется?).

  23. UPnsuper:

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

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

  24. UPnsuper:

    : Но это не лучшим образом говорит не только о компании, но и о работающих в ней разработчиках.
    В нормальных местах, в которых работал я – даже “самый свободный человек” за пять минут написал бы пару вопросов поприличнее.

  25. UPnsuper:

    : Боюсь, что такой ответ даже менее полезен, чем “перевернуть монитор”: http://msdn.microsoft.com/en-us/library/…

  26. HTnSm:

    : на тебе кейс: “Вам необходимо оплатить этот счет в течение 35 минут”. При том, что в браузере клиента и время на сервере отличается не только часовыми поясами, но ещё и минутами.

  27. HTnSm:

    : напиши пять прямо сейчас, а? Сравним. Нужно, чтобы было готово через 15 минут, соискатель уже подъезжает.

  28. HTnSm:

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

  29. UPnsuper:

    : Зачем для этого парсить время?

  30. UPnsuper:

    : Выше уже был пример – написать функцию, определяющую корректность расстановки скобок в математическом выражении.
    Пример поинтереснее – написать функцию, вычисляющую математическое выражение (плюс, минус, умножить, разделить).
    Ещё один пришедший в голову пример – написать свой StringBuilder.
    Написать структуру БД для блог (добавление записей владельцем, комментирование, базовое модерирование).
    Если много времени – написать структуру БД для биллинга с базовыми возможностями, написать код.

    Ну и плюс классические задачки типа про количество вагонов в поезде, про количество установщиков кондиционеров в москве итд.

    Это так, первое, что в голову пришло.

  31. UPnsuper:

    : Вот у меня сложилось такое ощущение, что вся проверка технических знаний в итоге сведётся к сегодняшнему заданию…

  32. Fiaer:

    по поводу первой задачки. в 2007ом ходил подобный примерчик. ща вот нашёл про него. Цитата:

    int i = 5;
    i = ++i + ++i;
    Вопрос: Чему равно i?

    имхо должно быть 13. c# со мной согласен. говорят, будто на яваскрипт и php так же. однако есть мнение, что 14. говорят, что так выдаёт cc, gcc, vc++ 6.0, perl, borland c++

    ну и однозначно правильный комментарий “по рукам за такое бить надо”.

  33. HTnSm:

    : нужно его десериализовать. А как ты думаешь, в каком формате оно придёт с сервера?

  34. UPnsuper:

    : В каком пришлёшь, в таком и придёт.
    Ты же не для людей пересылаешь – так зачем его в таком извращённом виде пересылать, чем плох таймстемп?

  35. HTnSm:

    > определяющую корректность расстановки скобок в математическом выражении

    Это не ты же придумал, правильно? А прикинь, есть такое понятие, как правильные скобочные последовательности? И есть правило для проверки, является ли последовательность скобок правильной. И мы это в 8м классе на доп. занятиях проходили. Достаточно, чтобы для любой позиции открывающих было не меньше закрывающих, и чтобы всего их было одинаково. И что из теории ПСП (правильных скобочных последовательностей) вырастает куча всяких интересных факторов, связанных в том числе с золотым сечением и всякими иррациональными числами. Это просто надо знать, и это математика. И это не относится к знанию C#, а максимум к проверке алгоритмических знаний. При этом, ты не проверишь эти знания, если человек не обладает достаточным математическим аппаратом (что может быть и несущественно для решения бизнес-задач).

    > написать функцию, вычисляющую математическое выражение (плюс, минус, умножить, разделить)

    Я бы скомпилировал эту строку в сборку, и выполнил метод без выебонов вроде лексического разбора строки, преобразования в польскую запись и последующего вычисления. Хотя это умею, и в универе писал интерпретатор C-подобного языка. Но оно нахуй не надо в реальной практике и вообще никак не показывает знание C#, опять же.

    > Ещё один пришедший в голову пример — написать свой StringBuilder.

    Нахуй?

    > Написать структуру БД для блог (добавление записей владельцем, комментирование, базовое модерирование).

    Как это показывает навыки C#? И зачем тут реляционные базы данных, если key-value будет намного удобнее?

  36. UPnsuper:

    :
    > однако есть мнение, что 14. говорят, что так выдаёт cc, gcc, vc++ 6.0, perl, borland c++

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

  37. UPnsuper:

    : Ты какую-то школьную математику пытаешься привлечь туда, где она ни при чём. Про числа Каталана ещё вспомни.
    Да, напомню, скобки могут быть разными (о чём было сказано в исходном комментарии) – и круглыми, и квадратными…
    Задача решается совершенно банально, и никакой математики не нужно – идём по строке; если попадается открывающая скобка – кладём в стек; попадается закрывающая скобка, соответствующая открывающей – снимаем со стека; не соответствующая – ругаемся; если в результате стек не пуст – ругаемся. Вопрос в том, как именно будет выглядеть код, решающий это дело.

    > Но оно нахуй не надо в реальной практике и вообще никак не показывает знание C#, опять же.

    В реальной практике – не нужно, да. Просто это задача, решение которой занимает более двух строчек – и можно посмотреть, какие же именно строчки напишет соискатель.

    > Нахуй?

    См. выше.

    > Как это показывает навыки C#? И зачем тут реляционные базы данных, если key–value будет намного удобнее?

    Затем, что это уже относится к реальной жизни. Показывает, сможет ли человек спроектировать БД, предусмотреть все необходимые вещи в структуре БД, предусмотреть их в логике приложения. Разделение прав доступа там, версионирование, логи итд.

  38. UPnsuper:

    : Задача – определить, является ли строка на входе правильной скобочной последовательностью. Не перечислить все скобочные последовательности. Не сказать, сколько есть скобочных последовательностей заданной длины.
    Единственная “математика”, требующаяся для решения задачи – знать/понять, что такое правильная скобочная последовательность. Если у человека какие-то отклонения в развитии, и он сам этого не понимает – может спросить у собеседника.

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

  39. HTnSm:

    Слушай, я знаю, что ты всегда прав, самый умный, и спорить с тобой бесполезно. Я лишь попытался тебе показать, как выглядит реальная ситуация, и как были придуманы эти задания. И что с гиперспросом на разработчиков за 60-80к на работу берут вообще кого угодно.

    > Просто это задача, решение которой занимает более двух строчек — и можно посмотреть, какие же именно строчки напишет соискатель.

    Это слишком сложная задача. На тебе более простую – проверить разными способами, что строка является полноценным GUID’ом. При проведении собеседований по.NET я банально открывал оглавление Рихтера и начинал задавать вопросы по главам. Обычно люди сыпались на том, чем отличается by-value от by-reference. И что кроме IL (если они об этом знали) генерирует компилятор. Зачем спрашивал такую низкоуровневую теорию – чтобы понять, насколько быстро человек будет решать проблемы, связанные с его недостатками знаний необходимой мне практики.

  40. UPnsuper:

    :
    > проверить разными способами, что строка является полноценным GUID’ом

    Стандарт на guid-ы и регэксп в одну строчку, не?

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

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

    Недостаток знаний, казалось бы, влечёт только один ответ – “а хуй его знает, надо заглянуть в мануал”.

  41. Eiler:

    : и годами (было на практике).

  42. Eiler:

    : И правда 14, интересно.

  43. Eiler:

    : хотя я даже предполагаю почем так. В Си переменная это тупо место в стеке. ++ выполняется до сложения, поэтому мы получаем сложение два раза инкрементнутого i.

  44. Eiler:

    : о… но все-таки gcc разумный компилатор (с правильными флагами):

    @-laptop:~/work/tmp$ gcc -Wall -o test test.c
    test.c:3:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
    test.c: In function ‘main’:
    test.c:6:5: warning: operation on ‘i’ may be undefined [-Wsequence-point]
    test.c:6:5: warning: operation on ‘i’ may be undefined [-Wsequence-point]

  45. Sukon:

    : По стандарту С такое поведение неопределено. Всё.

  46. Eiler:

    : clang выдает 13 и не ругается.

  47. Peeef:

    :
    1) Я про стандарт С#
    2) Ты сам выше написал: new Date(str); вот и нашлась!
    4) Откуда тебе знать как умные люди это делают?
    5) Да.

  48. Ovenode:

    : вобще есть Definitive Guide по этой хуйне в плюсах

  49. Peeef:

    :
    Во–первых, казалось бы, разработчику (если это не разработчик на brainfuck и не участник IOCCC) это знать совершенно необязательно.

    Ну не знаешь – так и напиши, что не знаешь и не считаешь нужным это знать. Этот ответ будет для проверяющего не менее информативен и возможность такого ответа еще раз показывает тебе, что вопрос сам по себе хорош. Может в команде собрались 10 чуваков, которые терпеть не могут задротов, которые все про стандарт знают и для них такой ответ будет самым лучшим. Или наоборот, команда не приемлет девелоперов, которые не хотели бы в душе стать участником IOCCC.

    > Нет, нужно знать, что для такого дела найдется готовая библиотека и уметь нагуглить. В любом случае ответ “не знаю, но нагуглю за секунду” должен считаться верным.

    Ага, только задание было — “напишите код” 🙂

    Это не запрещает тебе написать ответ в духе:
    “date = parseDate(str); где parseDate – функция из библиотеки, которую я предварительно найду.”

    поэтому для меня это — “хуй знает, надо посмотреть в стандарте”.

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

    Проблема в том, что я не знаю, говно компания или нет.

    Это же не твое дело. Тебе задают вопросы для того, чтобы ты ответил на них так, как считаешь нужным, и исходя из твоих ответов HR сможет решить, похож ли ты на типичного члена команды, или нет.

    Если компания говно, то все эти вопросы были заданы с целью получить “правильный” ответ, с точностью до буквы соответствующий содержимому соответствующей области в прошивке эйчара.

    Обычно такого рода интервью и вопросы придумывают и проверяют так или иначе люди, связанные с разработкой (какие-нибудь сениор девелоперы). Если у сениор девелопера прошивка не похожа на твою, он справедливо и верно решит, что ты в команду не подходишь. В любом случае нет смысла априори считать что компания – говно (зачем ты вообще туда на интервью ходил в таком случае). А если так не считать, то я не вижу проблемы с вопросами.

    Но создаётся именно такое ощущение.

    Ну у меня вот не создалось.

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

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

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

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

  50. UPnsuper:

    :
    > Ну не знаешь — так и напиши, что не знаешь и не считаешь нужным это знать. Этот ответ будет для проверяющего не менее информативен

    Есть подозрение, что этот вопрос был задан, потому что в какой-нибудь книжке лохматого года написано, что нужно задать этот вопрос, а ответ на него должен быть 2value+2.

    > Это не запрещает тебе написать ответ в духе:
    > “date = parseDate(str); где parseDate — функция из библиотеки, которую я предварительно найду.”

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

    >> Проблема в том, что я не знаю, говно компания или нет.
    > Это же не твое дело.

    Это моё дело. Собеседование – оно кагбе не только для оценки соискателя работодателем, но и для оценки работодателя соискателем.

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

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

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

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

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

  51. Peeef:

    : Есть подозрение…

    Необоснованные у тебя какие-то подозрения.

    … но и для оценки работодателя соискателем.

    Да ну чепуха. Для оценки работотаделя есть другие способы. Тем более для таких “подозревающих” товарищей как ты.

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

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

    Дополнительный вопрос: ок, а теперь добавьте к своей функции поддержку фигурных скобок.
    Твои действия?

    “В имеющейся функции будет код вида “if IsOpeningBracket(nextChar)” и “if IsMatchingBracket(openChar, closeChar)”. Я допишу в реализацию этих функций (или map-ов) новый тип скобок.

    В любом случае, имхо, ответ … очень плохо о тебе говорит

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

    Заметь, кстати, что ты сам здесь именно что ожидаешь некоторого ‘правильного’ ответа на данную задачу в духе того, что описан в каком-нибудь “бородатом учебнике”. Неудивительно, что ты “подозреваешь” всех вокруг в таком же отношении к делу. А ведь вполне может быть, что тебя интервьюируют люди, более смышленые в данной теме нежели ты сам.

  52. Xuaapp:

    : отсюда вывод – не хуй спрашивать то, что не входит в обязанности. Тупые овцы, да.

  53. Xuaapp:

    : во-первых, на серверное время тобi насрать, у тебя сессия будет показываться от времени клиента. Во-вторых, примерно эдак стопицот лет назад человеки придумали таймстемпы и не ебут себе мозг. Чего и я тебе советую. А если таймстемпы не подходят по диапазону или ещё каким условиям, то некие другие человеки придумали RFC 1123.

    Вопрос закрыт.

  54. Xuaapp:

    Вообще писать код – это тупак. Ибо ничего это не говорит об испытуемом. Я на своём последнем собеседовании ни одной подобной задачки не решал – их просто не было. Потому что заучки никому на хрен не нужны.

  55. UPnsuper:

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

    Ну вот некоторые тут в комментариях вроде тоже склоняются к этой мысли.

    > Да ну чепуха. Для оценки работотаделя есть другие способы. Тем более для таких “подозревающих” товарищей как ты.

    Ну расскажи, какие. Отзывов о компании как о работодателе в интернете нет.

    > “В имеющейся функции будет код вида “if IsOpeningBracket(nextChar)” и “if IsMatchingBracket(openChar, closeChar)”. Я допишу в реализацию этих функций (или map–ов) новый тип скобок.

    Говнокод, имхо – описания скобок у тебя уже раскиданы по разным функциям, новые типы скобок надо добавлять в двух разных местах.
    Кроме того, в IsMatchingBracket тебе надо различать три случая:
    1) Это подходящая закрывающая скобка.
    2) Это неподходящая закрывающая скобка.
    3) Это вообще не закрывающая скобка.

    > Заметь, кстати, что ты сам здесь именно что ожидаешь некоторого ‘правильного’ ответа на данную задачу в духе того, что описан в каком–нибудь “бородатом учебнике”.

    Я не видел такие задачи в “бородатых учебниках”.
    Такая задача – миниатюрный вариант задачи из реальности. Соответственно, я предполагаю, что реальные задачи ты будешь решать также, как эту. И твоё решение оставляет весьма гнетущее впечатление – знакомым работодателям часто такие люди попадаются, например
    “Вот если бы, да я бы…” – но это всё выглядит смешно, когда конкретный человек, учившийся “на твёрдую четвёрку” в реалиях, когда ему говорят запрограммировать билинейную интерполяцию, говорит, что он неделю искал в Интернете, не нашёл, значит этого сделать нельзя и он этого сделать не сможет.
    А правильный интервьюер должен понять, что это ты так выпендриваешься и косишь под дебила, но, если взять тебя на работу – ты будешь решать задачи совершенно не таким способом, как на собеседовании?

  56. UPnsuper:

    : О, и ещё:
    Я уже проводил кастинг по резюме обращавшихся на работу (на нормальную “бессрочную” зарплату).
    Оказалось, никто из них не может запрограммировать даже билинейную интерполяцию – сразу лезут в Интрнет в поисках готового кода… А там почему-то не могут найти… А хотят по 70 тыр./мес. Хотя мозга в 10 раз меньше, чем у профессоров МГУ, которые получают меньше…

    Не тебя собеседовали, случаем?

  57. Peeef:

    : Ну вот некоторые тут в комментариях вроде тоже склоняются к этой мысли.

    “Некоторые” это Аух. Аух, мне кажется, слишком горячий парень со слишком радикальными взглядами на жизнь. К реальности это не всегда применимо.

    Говнокод, имхо — описания скобок у тебя уже раскиданы по разным функциям

    Нет, почему же. Описания скобок у меня в одном месте. Смотри:
    opening_brackets = set(‘([{‘)
    is_matching_bracket = set([ ‘()’, ‘{}’, ‘[]’ ])
    всё.

    тебе надо различать три случая:
    Нет, не надо.

    Я не видел такие задачи в “бородатых учебниках”.

    Ну теперь знай, что эта задача – херня из домашек для 9го класса по информатике.

    Такая задача — миниатюрный вариант задачи из реальности.

    В 99% программистских вакансий разработкой алгоритмов и не пахнет. В разы важнее умение разбираться в имеющихся фреймворках и правильно их склеивать.

    ты будешь решать задачи совершенно не таким способом, как на собеседовании?

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

    Но опять же, тут все зависит от вакансии. Если ты действительно идешь на работу писать драйвера для звуковой карты или же какую-нибудь CAD/CAM систему – алгоритмические скилы тебе нужны и конечно же в таком контексте интервьюирующий захочет убедиться в их наличии. Но ты же про C# говоришь… на нем в наше время все больше бизнес-логику пишут.

  58. Sukon:

    : Ты должен гордиться собой.

  59. Sukon:

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

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

  60. UPnsuper:

    :
    > Нет, почему же. Описания скобок у меня в одном месте. Смотри:
    > opening_brackets = set(‘([{‘)
    > is_matching_bracket = set([ ‘()’, ‘{}’, ‘[]’ ])
    > всё.

    Вообще-то, это уже два места. При добавлении нового типа скобок надо добавить его и в opening_brackets, и в is_matching_bracket.

    > Нет, не надо.

    В строке – не только скобки.

    > Ну теперь знай, что эта задача — херня из домашек для 9го класса по информатике.

    Так я тебе говорил – ценно не то, сможешь ли ты решить задачу, а то, как ты это сделаешь.

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

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

    > Но ты же про C# говоришь… на нем в наше время все больше бизнес–логику пишут.

    Ты там забыл ещё одно слово выделить. “Пишут” – это не “тырят готовый код из гугла не читая”. На задание “напишите код” ответом должен быть написанный тобой код, а не “поищу код в гугле, пройду по первой ссылке и скопипащу не читая” – что на собеседовании, что в реальной работе. Иначе вместо тебя подошла бы и любая обезьяна, обученная пользованию CtrlC/CtrlV.

  61. UPnsuper:

    :
    > алгоритмические скилы тебе нужны и конечно же в таком контексте интервьюирующий захочет убедиться в их наличии.

    Конкретный пример: компания занимается разработкой ПО для прямых видеотрансляций через интернет. При этом, её продукт на голову выше всех конкурентов; везде, где возможно прямое сравнение с конкурентами – заказчики охреневают от крутизны её продукта и от калищности ранее казавшихся нормальными конкурирующих продуктов.
    Алгоритмическая часть тоже есть, но не в ней суть.

    Сейчас ищутся новые разработчики для более интенсивного развития этого продукта. Одно из тестовых заданий “на дом” – написать код для билинейной интерполяции. Типичный ответ – “бляяя, я не смог найти в гугле готовый код, такого не существует!!!”; хотя даже мне, занимающемуся бизнес-логикой, понятно, что достаточно пяти минут на прочтение статьи в википедии о том, что такое “билинейная интерполяция” и ещё какого-то небольшого времени – для написания кода.

    Далее, когда эти люди слышат о том, над чем им, возможно, надо было бы работать, сразу же типичная реакция – “а нахуя вы всё это делаете, я слышал, такое делает одна западная компания X напомню, не выдерживающая никакого сравнения с тем продуктом, о котором идёт речь и ещё одна компания Y много лет назад были молодые-зелёные и по глупости передали заказчику Y не только бинарники, но и исходники тогдашней версии, продавали бы их продукты и не парились”.

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

    Так и живём.

    А ты, такое ощущение, тоже из таких горе-профессионалов.

  62. UPnsuper:

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

  63. Peeef:

    : Вообще–то, это уже два места. При добавлении нового типа скобок надо добавить его и в opening_brackets, и в is_matching_bracket.

    Утипути. Ну давай запишем так:
    bracket_info = {‘opening’: set(‘([{‘), ‘matching’: …}

    Ничего по сути не изменилось, но теперь как будто в одном месте, да?
    А еще можно записать конфиг-строку
    brackets = ‘()[]{}’ и распарсить ее в нужную структуру, если уж совсем идиотизм в голову ударит.

    В строке — не только скобки.

    ОК. Тогда еще нужно будет is_bracket.

    то, как ты это сделаешь.

    Конкретно данную задачу делают школьники точно так же как и все остальные. У нее есть стандартное решение. Проверять знание этого решения сродни проверке на знание “хитрых задачек”.

    Но ты–то исходно говорил

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

    опыт знакомых работодателей

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

    бизнес–логику пишут

    Ты не туда ударение поставил. Я имел в виду что “бизнес-логику пишут”. А это занятие довольно вяло связано с написанием алгоритмов. Более того, для написания 99% бизнес логики лучше всего подходят именно обезъяны, обученные пользованию Ctrl+C/Ctrl+V. А вот после умников, хреначащих где нужно и не нужно свои любимые абстракции, изобретающие на каждом шагу велосипеды и алгоритмы, код манажить зачастую в разы сложнее нежели чем после аккуратно копипейстящих обезъян.

  64. Peeef:

    : “бляяя, я не смог найти в гугле готовый код, такого не существует!!!”

    Ясное дело, что если человек не способен в гугле найти код для решения стандартной задачи (хотя постановка в виде “напишите билинейную интерполяцию” без дополнительного контекста какая-то дебильная), то он не очень подходящий кандидат.

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

    Так и живём.

    Хорошо живете.

    А ты, такое ощущение, тоже…

    HR в фирме – дебил. Собеседник в блоге – дебил.
    Трудно наверное жить, ощущая, что все кроме тебя – дебилы?

  65. Xuaapp:

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

  66. Xuaapp:

    : есть coding guides в любой нормальной конторе. И как ты сам для себя пишешь – никого не трогает.

  67. UPnsuper:

    :
    > Утипути. Ну давай запишем так:
    bracket_info = {‘opening’: set(‘([{‘), ‘matching’: …}

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

    > Конкретно данную задачу делают школьники точно так же как и все остальные. У нее есть стандартное решение. Проверять знание этого решения сродни проверке на знание “хитрых задачек”.

    Ещё раз, проверяется не знание решения (да там и без всякого знания это решение придумывается за минуту), а его оформление.

    > Дык одно дело, когда тебе надо решить реальную проблему — тогда ты ищешь реальную библиотеку. Другое дело, когда тебя просят решить стандартную школьную задачку — тогда ты идешь и берешь решение любого школьника.

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

    > Твои знакомые работодатели, на которых ты здесь сослался, походу просто любят попугать кандидатов выражением “билинейная интерполяция”, которое, вполне возможно, не каждому знакомо.

    Казалось бы, пользоваться википедией – не такое уж и безумно сложное дело для тех, кто умеет пользоваться гуглом. Да и в гугле по запросу “билинейная интерполяция” сразу отправляют в википедию, где есть описание алгоритма.

    > А это занятие довольно вяло связано с написанием алгоритмов.

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

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

    То есть, по-твоему, когда в проекте рабочий код одного-двух умников – поддерживать его сложнее, чем нерабочий код тысячи разных индусов из гугла, щедро сдобренный костылями от “аккуратно копипейстящих обезьян”?

    Не говоря уж о том, что, как только перед обезьяной встаёт задача, готового решения на блюдечке для которой нет на первой странице гугла – она сразу впадает в ступор и начинает говорить, что решить задачу невозможно. Я там выше уже приводил пример – те люди, которые для примитивной функции не могут ничего, кроме поисков готового кода в гугле, вообще не понимают, зачем писать своё ПО, когда уже есть другое со схожим назначением.

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

  68. Zzzer:

    : coding guides как-то мешают писать говнокод?

  69. Xuaapp:

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

  70. UPnsuper:

    : Это немного не о том.
    Грубо говоря, ты можешь увидеть, насколько испытуемый предусмотрел дальнейшее расширение функционала / изменение вводных (т.е. насколько трудозатратно в реальной жизни будет адаптировать его код к постоянно меняющимся условиям).
    Например, про те же скобки, если сказано было только про один их тип, что-то вроде
    ===
    bool IsStringValid(string str) {
    int braces = 0;
    for(int i=0; i

  71. UPnsuper:

    : Парсер лох.

    : Это немного не о том.
    Грубо говоря, ты можешь увидеть, насколько испытуемый предусмотрел дальнейшее расширение функционала / изменение вводных (т.е. насколько трудозатратно в реальной жизни будет адаптировать его код к постоянно меняющимся условиям).
    Например, про те же скобки, если сказано было только про один их тип, что–то вроде http://pastebin.com/k2VXBH88 – значит, надо уже готовиться к посыланию кандидата нахуй, но ещё можно задать наводящий вопрос “а если скобки могут быть двух видов?”.
    Если же на наводящий вопрос будет ответ такого вида: http://pastebin.com/b9NaMJGP – то сразу нахуй.

    А принятые в конкретной конторе соглашения тут особо ни при чём.

  72. UPnsuper:

    :
    > Ясное дело, что если человек не способен в гугле найти код для решения стандартной задачи (хотя постановка в виде “напишите билинейную интерполяцию” без дополнительного контекста какая–то дебильная), то он не очень подходящий кандидат.

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

    > Вопрос о том, чем вы лучше конкурентов вполне обоснован, и я не вижу что плохого ответить на него.

    Человек не спрашивает “чем вы лучше конкурентов” (btw, речь идёт не обо мне, а о моих знакомых). Человек говорит что-то вроде “да вы дебилы писать своё, ведь аналогичная функциональность уже есть у крутой западной компании Polycom, продавайте их железки и не парьтесь, а я вам помогу продавать – и даже в гугле код искать не придётся”.

    > Трудно наверное жить, ощущая, что все кроме тебя — дебилы?

    Ну не преувеличивай, не все, только 95% 🙂

  73. Peeef:

    :
    ОК, а когда выяснится, что одной открывающей могут соответствовать несколько разных закрывающих?

    Ответ на этот вопрос я тебе уже дал.

    А когда выяснится, что хочется иметь более чем односимвольные открывающие–закрывающие конструкции?

    Это делается токенайзером и к изначальной задаче отношения не имеет.

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

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

    Ещё раз, проверяется не знание решения (да там и без всякого знания это решение придумывается за минуту), а его оформление.

    Это стандарнтная задача со стандартным решением в стандартном его оформлении. Если человек не знает это стандартное решение (и в результате напишет какую-то хрень) то да, у него пробел в разделе “Структуры данных: стек”. Важно ли это для вакансии или нет – вопрос отдельный.

    Другое дело, когда тебя спрашивают на собеседовании — там можно и повыёбываться

    Просто напросто на собеседовании надо спрашивать что-то, связанное с реальной работой, а не задачки из учебника Авраама Пуповича бородатого года выпуска, с требованием выписать решение в том же виде, в каком оно там в учебнике выписано (“иначе мне не нра”).

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

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

    То есть, по–твоему, когда в проекте рабочий код одного–двух умников — поддерживать его сложнее, чем нерабочий код тысячи разных индусов из гугла, щедро сдобренный костылями от “аккуратно копипейстящих обезьян”?

    Здесь я вынужден подставить твой же комментарий: “У тебя какие–то странные крайности, как будто нет ничего между абсолютным NIH и безмозглой копипастящей обезьяной. “.

    Дальше осталось заметить, что если выбирать между Инженером Гариным и твердой посредственностью, то во многих проектах (особенно богатых на “бизнес-логику”) второй вариант не хуже, а зачастую и лучше вливается в команду нежели первый. Поэтому отсеивать его какими-то IQ тестами и задачками “про вагоны” с точки зрения HR глупо.

  74. Peeef:

    :
    Не на все задачи на первой странице гугла есть готовый код на блюдечке.

    Да. Гуглинг – умение непростое и не каждому дано.

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

    Такие люди очевидно не являются хорошими кандидатами. Я только потерял нить, почему ты о них мне рассказываешь. Вон собачки вообще не умеют программировать. И что?

  75. Hsvhlam:

    никогда не спорить с типнушками [x]

  76. UPnsuper:

    > Это стандарнтная задача со стандартным решением в стандартном его оформлении. Если человек не знает это стандартное решение (и в результате напишет какую–то хрень) то да, у него пробел в разделе “Структуры данных: стек”. Важно ли это для вакансии или нет — вопрос отдельный.

    Ещё раз, оценивается не умение человека решать эту конкретную задачу, а то, какой именно код для решения этой задачи он выдаст.

    > Просто напросто на собеседовании надо спрашивать что–то, связанное с реальной работой, а не задачки из учебника Авраама Пуповича бородатого года выпуска, с требованием выписать решение в том же виде, в каком оно там в учебнике выписано (“иначе мне не нра”).

    О чём я и говорю.

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

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

    > Здесь я вынужден подставить твой же комментарий: “У тебя какие–то странные крайности, как будто нет ничего между абсолютным NIH и безмозглой копипастящей обезьяной. “.

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

    > если выбирать между Инженером Гариным и твердой посредственностью

    “Инженер Гарин” – это, я так понимаю, тот, кто будет писать велосипеды всегда, а в сторону чужих готовых решений и не посмотрит? Эту крайность я не поддерживаю, как уже говорил.
    Но называть тех, кто умеет только искать готовый код в гугле и CtrlC/CtrlV, “твёрдыми посредственностями” можно только потому, что их большинство.

  77. UPnsuper:

    > Да. Гуглинг — умение непростое и не каждому дано.

    Я больше скажу – не для любой задачи вообще существует готовое решение.
    Такое ощущение, что ты путаешь должность разработчика с должностью гуглиста-копипастера.

    > Такие люди очевидно не являются хорошими кандидатами. Я только потерял нить, почему ты о них мне рассказываешь.

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

    > Вон собачки вообще не умеют программировать. И что?

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

  78. Peeef:

    : лучше наоборот: нечем занять время и надо пофлудить – спроси Тинпу! [x]

  79. UPnsuper:

    : никогда не спорить с блогерами [x]
    И вообще, меня тут функан ждёт.

  80. Peeef:

    : какой именно код для решения этой задачи он выдаст.

    В данной задаче есть, по большому счету, всего два варианта: правильный и неправильный. Ради получения одного бита информации лучше задать человеку вопрос попроще.
    Более того, если человек решит неправильно, это еще не значит что он ни на что не способен в области бизнес логики. И наоборот – если он решит ее правильно, это еще ничего не говорит про способность и опыт разработки реальных систем.

    О чём я и говорю.

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

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

    Не надо навязывать другим свои методы. Не умеешь гуглить – не учи других. Чем лазить по индусским блогам я возьму активно поддерживаемый опенсорсный проект многолетней зрелости. Он будет второй ссылкой в гугле.

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

    Да, это утверждение абсолютно верно. Оно не значит что “быть обезьяной – почетно”. Но оно значит, что отсеивание кандидатов с упором на их способности решить алгоритмическую задачку – далеко не лучший вариант для отбора на вакансию C# программиста.

    Но называть тех, кто умеет только искать готовый код в гугле и CtrlC/CtrlV, “твёрдыми посредственностями” можно только потому, что их большинство.

    Ты постоянно исходишь из предположения что вокруг все дебилы. Это неверное предположение. Твердая посредственность – это отличный девелопер, который возможно не решит тебе слету очередную задачку на нахождение MaxFlow, или не реализует A*, но при этом под правильным руководством будет очень аккуратно и четко в срок клепать компоненты, которые будет потом легко дорабатывать. Именно на таких товарищах держатся успешные проекты.

  81. Peeef:

    : именно у них описываемый тобой подход “дали задачу? надо взять готовый код по первой ссылке в гугле”.

    Не “именно у них”, а “возможно у них тоже”. У хороших девелоперов это должна быть первая реакция. Только задрот с первого курса побежит без оглядки решать древнюю алгоритмическую задачку ручками.

    берёт собачек на должность разработчиков

    Кто тебе сказал, что собачек берут?

  82. Xuaapp:

    : не надо думать наперёд. Это обычно заканчивается всяким говном типа Spring для Java. Обо всём подумали, но такой пиздец, что проще с нуля написать.

  83. Peeef:

    : Ааа, так ты и есть первый курс. Это многое объясняет.

  84. Zzzer:

    : функан разве на 1ом курсе читают? у нас вроде на 4ом был.

  85. Peeef:

    : Я на втором брал по-моему, но тут у кого как. По любому дух молодого бойца из Тинпу бьет ключом. Думается мне, это пройдет, как у всех.

  86. UPnsuper:

    : Один вариант гарантированно приводит к говну.
    Другой может привести к говну (это уже от людей зависит).
    Какой же выбрать?

  87. UPnsuper:

    :
    > Только задрот с первого курса побежит без оглядки решать древнюю алгоритмическую задачку ручками.

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

    > У хороших девелоперов это должна быть первая реакция.

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

    > Кто тебе сказал, что собачек берут?

    Цель этого поста – понять, не являются ли такие задачи на собеседовании признаком того, что туда берут собачек.

  88. UPnsuper:

    :
    > В данной задаче есть, по большому счету, всего два варианта: правильный и неправильный.

    “Правильный” и “неправильный” в смысле того, правильный или неправильный результат выдаст функция.

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

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

    Я ещё раз повторю, “именно такая задача” нацелена не на то, чтобы получить от человека решение из учебника (я, к слову, таких учебников не читал, но решение написать могу). Написать функцию, проверяющую корректность расстановки скобок, сможет любой дебил; цель – проверить, как именно он это сделает, и тут уже учебники ни при чём.

    > Чем лазить по индусским блогам я возьму активно поддерживаемый опенсорсный проект многолетней зрелости. Он будет второй ссылкой в гугле.

    Ты же ещё несколько комментариев назад говорил про первую ссылку в гугле!
    Тем не менее, не для всех задач есть “активно поддерживаемые опенсорсные проекты многолетней давности”. Кроме того, опенсорсный проект надо ещё интегрировать в свою систему (и в этом нет ничего плохого).
    У нас же речь о том, что надо написать функцию (проверка расстановки скобок, разворот строки, итд), и ты собираешься просто воткнуть туда готовый код.

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

    Ещё раз, если человек неспособен написать функцию, проверяющую корректность расстановки скобок – с ним вообще не о чем разговаривать; как он вообще попал на собеседование?
    А если он написал эту функцию – то можно посмотреть на то, как именно он её написал, и сделать соответствующие выводы о том, насколько он хорош как разработчик.

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

    На каждую задачу брать готовый кусок кода по первой ссылке в гугле, а затем скрепить это костылями, не понимая ни условия задачи, ни то, как работает взятый из гугла код – и “легко дорабатывать”?

  89. UPnsuper:

    : Чорд, спалился.

  90. UPnsuper:

    : Ну вот, вы меня почти раскрыли. Но не до конца – на самом-то деле я учусь в девятом классе, а ты не угадал, лол, и так и будешь думать, что я на первом курсе! Муа-ха-ха!

  91. Hsvhlam:

    : ну так не спорь уже, всем от этого только лучше. Ну, кроме слипа.

  92. Peeef:

    : Хорошая реакция — понять требования к решению;

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

    Цель этого поста — понять, не являются ли такие задачи на собеседовании признаком того, что туда берут собачек.

    По-моему цель этого поста для тебя – пофлудить на тему какие все вокруг идиоты что задают вопросы, которые не являются бородатыми алгоритмическими упражнениями и поэтому они тебе не по нраву.
    От того, что я тебе тут аргументирую на тему “нет, не является признаком” тебе ни тепло ни холодно, правда ведь.

  93. Peeef:

    :
    “Правильный” и “неправильный” в смысле того, правильный или неправильный результат выдаст функция.

    Да нет, там реально нет особых вариантов. Либо ты понимаешь (знаешь/помнишь/догадался) алгоритм и записываешь его в виде соответствующего алгоритма. Тогда он будет выглядеть “красиво” и “поддерживаемо”. Либо ты не понимаешь (не знаешь/не помнишь/не догадался за отведенное на это время) алгоритм, и напишешь чушь.

    Написать функцию, проверяющую корректность расстановки скобок, сможет любой дебил

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

    Ты же ещё несколько комментариев назад говорил про первую ссылку в гугле!

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

    Ещё раз, если человек неспособен написать функцию, проверяющую корректность расстановки скобок — с ним вообще не о чем разговаривать; как он вообще попал на собеседование?

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

    На каждую задачу брать готовый кусок кода по первой ссылке в гугле, а затем скрепить это костылями, не понимая ни условия задачи, ни то, как работает взятый из гугла код — и “легко дорабатывать”?

    Понимаешь ли, “бизнес логика” – это херня в духе “транзакция проходит тогда, когда на одном счете есть достаточно денег, на другом есть привилегия перевода денег, и третья сторона согласна. Если условия не выполняются, нужно бросить эксепшн и вылогинить пользователя”. Для реализации такой херни не нужно быть гением алгоритмического программирования и уметь с закрытыми глазами переворачивать строки. Но нужно знать как оперировать транзакциями, доступом к базе, эксепшнами и аутентификацией. Как пользоваться сторонними АПИ, и как писать свои компоненты с доступным другим АПИ. Нужно понимать всякие детали про локальные-глобальные-потоковые переменные, синхронизирование-события-мутексы-потоки-аппсерверы, внутренние-статические-анонимные классы, делегаты и типы данных, знать сторонние технологии аля SQL-LINQ-MDX-HQL-ASP-ODBC-WTF-OMG. Наконец, не повредит знание некоторых паттернов. Это все – далеко не rocket science, это просто большой набор примитивов.

    Ни один кандидат скорее всего не знает всего этого, и цель HR – понять сколько ему нужно времени чтобы догнаться по этим вопросам. Алгоритмические скилы тут вторичны.

  94. TuaEkb:

    : про i++ ++i я даже знаю чела с 5-ти летним опытом, что не знал, как оно работает. 🙂

  95. Xuaapp:

    : KISS – хороший принцип! Он к говну не приводит.

  96. Peeef:

    : Ну в принципе это задание на потроллить и знание верного ответа тут с опытом вряд ли коррелирует. Девелоперы, читающие интернет, знают правильный ответ. Те, кто интернет не читали – не знают. Если бы я делал интервью, я бы дал такое задание чисто для прикола, посмотреть что напишут.

    Еще классический тролль-пример был бы:
    int test() {
    __int p[] = {1};
    __return 2/*p;
    }

  97. UPnsuper:

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

    ОМГ, даже не знаю, что на это ответить.
    Ну вот даже в этом посте я уже приводил пример решения задачи, отличающийся от твоего более чем “едва ли значимыми синтаксическими различиями”. Да и индусский код индусским называют не за “едва ли значимые синтаксические различия”.

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

    Не может, мы ведь ищем “билинейная интерполяция код c#”

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

    Блеать, задача – “проверить корректность расстановки скобок в строке”, нахера тут гугл?
    Надеюсь, хоть в сортир сходить без помощи гугла ты осиливаешь?

    > Понимаешь ли, “бизнес логика” — это херня в духе “транзакция проходит тогда, когда на одном счете есть достаточно денег, на другом есть привилегия перевода денег, и третья сторона согласна. Если условия не выполняются, нужно бросить эксепшн и вылогинить пользователя”.

    Ага, и для этого недостаточно уметь искать в гугле “проверить наличие денег на счёте c# код скачать”.

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

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

    > Наконец, не повредит знание некоторых паттернов.

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

    > Ни один кандидат скорее всего не знает всего этого

    Мы сейчас говорим про кандидатов на роль старшего подавальщика кофе нормальным разработчикам, или на роль собственно разработчика?
    Понятно, что за всеми новыми веяниями не угонишься, и требовать от кандидата знания ASP.NET/ODBC/WCF/WinForms/WPF/NHibernate /DevExpress/что-там-ещё-любят-требовать, если вакансия не подразумевает работу именно с этой технологией, не стоит.
    Но остальное-то – это же базовые знания должны быть для человека с мало-мальским опытом.

    > Алгоритмические скилы тут вторичны.

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

  98. UPnsuper:

    :
    > Ответ “взять готовый код в гугле” указывает лишь на то, что интервьюируемый прекрасно в курсе, что ему предлагают решить бородатую задачу, от которой он устал уже в детском саду.

    Я ещё раз повторю, как и десять раз до этого. Цель задачи “а напиши функцию, которая делает то-то” – не проверить, что человек умеет писать примитивные функции или искать их в гугле. Цель этой задачи – посмотреть, какой код умеет писать человек.

    Ответ “не буду писать, посмотрю в гугле” означает, что человек либо дебил, который не в состоянии осознать поставленную задачу; либо не умеет самостоятельно писать код, а умеет только тырить готовый из гугла. В любом из этих двух случаев продолжать собеседование бессмысленно.
    Конечно, по твоей версии, есть ещё третий вариант – человек охуенно крут, но тут он решил выпендриться и показать, что примитивные задачи он решает через гугл; а уж сложные-то и из реальной жизни он решает самостоятельно и хорошо. Но если человек на собеседовании только и делает, что выпендривается – от дебила его не отличить.

    > По–моему цель этого поста для тебя — пофлудить на тему какие все вокруг идиоты что задают вопросы, которые не являются бородатыми алгоритмическими упражнениями

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

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

  99. UPnsuper:

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

    Ага, ещё бывают боянные задачки вроде “сложите четыре треугольника из шести спичек” и “исправьте одной чертой ошибку в выражении 5+5+5=550”.

  100. Peeef:

    Ну вот даже в этом посте я уже приводил пример решения задачи, отличающийся от твоего более чем “едва ли значимыми синтаксическими различиями”.

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

    Не может, мы ведь ищем “билинейная интерполяция код c#”

    Это не важно. Я тебе о том, что выражение “возьму первую ссылку в гугле” не стоит воспринимать столь буквально. (Кстати, первая ссылка по твоему запросу выдает некий вполне адекватный код).

    Блеать, задача — “проверить корректность расстановки скобок в строке”, нахера тут гугл?

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

    Ага, и для этого недостаточно уметь искать в гугле “проверить наличие денег на счёте c# код скачать”.

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

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

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

    показывают знание человеком паттернов.

    Я про ООП-паттерны, паттерны интеграции, паттерны деплоймента, и прочее. До алгоритмики подсчета скобочек тут далеко.

    Я ни разу не говорил, что от человека нужны крутые алгоритмические скиллы.

    Нафига тогда задачи из учебника “Алгоритмы и структуры данных”?

    а не только тупо работать проксей между начальником и гуглом.

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

  101. Peeef:

    : Я ещё раз повторю, как и десять раз до этого.

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

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

    Из приведенных тобой примеров заданных тебе вопросов ни один таковым не является.

  102. Peeef:

    : Но ты же сам выше предлагал давать такие задачи на собеседовании (“…Ну и плюс классические задачки типа про количество вагонов в поезде, про количество установщиков кондиционеров в москве итд.“). Что же тебе не нравится что у тебя такую спросили?

  103. UPnsuper:

    > Если ты хочешь, чтобы ответ соответствовал “действиям в реальности”, то в реальности прежде чем кидаться писать код, нормальный разработчик сходит в гугл или поищет готовую реализацию в имеющейся системе.

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

    > Ты вон выше изобрел якобы–пример якобы–работающего, но “плохо написанного” кода и уверен что он работает, а он опа — не работает.

    Ну так как задача решается на бумажке, то и свой “якобы-пример” я написал в блокноте, не проверяя. Должен работать, почему нет (ну разве что IndexOutOfBoundException вылетит для некоторых плохих строк).
    Конечно, “хорошо написанный” код я писал совсем по-другому.

    > Я не вижу принципиальной разницы между алгоритмической задачей переворота строки и алгоритмической задачей подсчета скобочек.

    Принципиальная разница – переворот строки решается в три строчки кода, и там действительно особо ничего изобрести не получится (хотя и тут можно отфильтровать индусов, у которых будут миллионы склеиваний строк); задача “написать функцию, определяющую правильность расстановки скобок” – более содержательна и там уже есть где развернуться (предусмотреть, что могут потребоваться более чем односимвольные скобки (при сохранении возможности однозначного определения скобки), что может понадобиться разрешать адские комбинации вида [} и {], что результат можно выдать более информативный, чем “true/false”, итд).

    > Я про ООП–паттерны

    Сложно было не догадаться.

    > Нафига тогда задачи из учебника “Алгоритмы и структуры данных”?

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

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

    Если “девелопер” не включает мозг для осознания требований, не включает мозг для понимания сути задачи, не включает мозг для поиска наиболее подходящего решения, не включает мозг для проверки работоспособности и качества найденного кода – он достоин только звания чистильщика сортиров. “прокси между начальником и гуглом” – это так, чтобы не совсем уж расстраивать.
    Я ещё раз напомню о людях, которые называют себя профессиональными девелоперами, и при этом отсутствие в гугле нужного кода для них означает невозможность решить задачу; у них мозга не хватает даже на то, чтобы узнать значение неизвестных для них терминов в этой задаче. Как в том примере с билинейной интерполяцией – не удалось найти готовый код на нужном ЯП, значит всё, плачем и зовём маму.

  104. UPnsuper:

    : Боянные задачки вроде упомянутых мной проверяют только то, слышал ли человек раньше такую задачку.
    А описанные мной – необязательно. Во всяком случае, когда я впервые услышал задачу про поезд, то решил её самостоятельно со сложностью O(n^2), а потом и O(n*log(n)).

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

  105. UPnsuper:

    :
    > В одной я говорю тебе, что задача “напиши алгоритм” проверяет в первую алгоритмические умения, и не очень много говорит о способностях и опыте разработки софтвера.

    Так о каких “алгоритмических умениях” речь-то? О том, сможет ли человек решить задачу? Я ещё раз на всякий случай повторю: человек, который не может написать функцию на проверку правильности расстановки скобок в строке, не должен был вообще попасть на собеседование.

    > если интервьюер притворяется, что его задачи на интервью якобы соответствуют специфике работы

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

    > Из приведенных тобой примеров заданных тебе вопросов ни один таковым не является.

    Что, неужели “value++ + ++value” не из учебника взят?

  106. Peeef:

    Ну так как задача решается на бумажке, то и свой “якобы–пример” я написал в блокноте, не проверяя.

    Какая разница, на чем ты писал. Ты только что сам показал, что алгоритмические задачи не так просты как кажется, и в ситуации стресса, на интервью, ты бы точно так же случайно ошибся бы индексом. Что теперь, отметать тебя как негодного?

    …и там уже есть где развернуться (предусмотреть, что могут потребоваться более чем односимвольные скобки (при сохранении возможности однозначного определения скобки), что может понадобиться разрешать адские комбинации вида [} и {], что результат можно выдать более информативный, чем “true/false”, итд

    Это нелепое высасывание из пальца и оверенжиниринг. Ожидать от кандидата, что он начнет оверинжинирить в ту же сторону, что и ты – это бред.

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

    Нет. Не зная этот учебник (в частности, понятия стека или рекурсии), ты ее нормально не решишь, или решишь с трудом.
    Зная учебник, ты ее решишь легко и элегантно. Если у тебя в критерии входит знание учебника “Алгоритмы и структуры данных” это нормальный вопрос, но ничего кроме этого он не показывает.
    Т.к. ты уже подразумеваешь, что кандидат знает учебник (у тебя условие такое, что иначе он не попадет на собеседование), спрашивать это еще раз – почти бессмысленно.

    Я ещё раз напомню о людях, которые называют себя профессиональными девелоперами, и при этом отсутствие в гугле нужного кода для них означает невозможность решить задачу;

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

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

    Переворот строки – 3 строчки, твоя задача в изначальной постановке – примерно 5, в расширенной – 6-9, невелика разница. Но главное, ни одна из этих задач не покрывает реальные ситуации.

    Что, неужели “value++ + ++value” не из учебника взят?

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

    В остальном я утомился и сдаюсь. Во флудинге ты сильнее меня…

  107. UPnsuper:

    > Ты только что сам показал, что алгоритмические задачи не так просты как кажется, и в ситуации стресса, на интервью, ты бы точно так же случайно ошибся бы индексом. Что теперь, отметать тебя как негодного?

    Казалось бы, очевидно, что опечатка при написании кода на бумаге без проверки “не считается”.
    Напомню, оцениванием качество кода, а не безошибочность.

    > Ожидать от кандидата, что он начнет оверинжинирить в ту же сторону, что и ты — это бред.

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

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

    Странно, как же её тогда решаю я, если в первый раз об этом учебнике я услышал от тебя?

    > Т.к. ты уже подразумеваешь, что кандидат знает учебник

    Я подразумеваю, что у кандидата есть мозг.

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

    Тем не менее, насколько я в курсе, больше никто не пришёл на нормально описанную вакансию разработчика с более чем рыночной зарплатой.
    Ну и образование у них не ПТУшное.

    > Переворот строки — 3 строчки

    Странно, у меня получается от 2 (инициализация новой строки, заполнение её данными) до 4-5 (если тело цикла вынести на отдельную строчку, и речь не о питоне).

    > твоя задача в изначальной постановке — примерно 5, в расширенной — 6–9, невелика разница

    Ты за 6 строчек решил эту задачу для разных типов скобок?
    Покажи-ка свои 6 строчек; чувствую, там будет адовое индусское говно.

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

    > Не представляю даже, в каком учебнике и в каком контексте такое может попасться. Это чисто интернет–фольклор.

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

  108. Peeef:

    :
    Казалось бы, очевидно, что опечатка при написании кода на бумаге без проверки “не считается”.

    Это не опечатка. Это алгоритмическая ошибка. Умение писать алгоритмы без таких ошибок оттачивается годами.

    а в том моём примере добавление третьего типа — переделывание половины кода и куча копипасты.

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

    Странно, как же её тогда решаю я, если в первый раз об этом учебнике я услышал от тебя?

    Я надеюсь ты понимаешь, что здесь речь опять же не о буквально “учебнике” а о любом курсе алгоритмов и структур данных, в котором эта тема покрывается. Если ты в первый раз об этом слышишь, меня не удивляет что у тебя получается код на 50 строк. Но это не значит что ты индус, это значит что ты просто не в курсе данной конкретной темы.

    Покажи–ка свои 6 строчек; чувствую, там будет адовое индусское говно.

    Ну вот как-то так. Строчек по существу там как раз примерно 6 (а суммарно с закрывающими скобочками и декларациями – 9). “Адовое индусское говно” – это скорее твой код на 50 строк.

  109. UPnsuper:

    :
    > Это не опечатка. Это алгоритмическая ошибка.

    Укажи, пожалуйста, на конкретную ошибку (если речь идёт не об IndexOutOfBoundException).

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

    Я говорил про свой пример.

    > а о любом курсе алгоритмов и структур данных, в котором эта тема покрывается

    Не нужны никакие курсы, достаточно наличия мозгов и знания того, что такое “стек” (не в смысле System.Collections.Generic.Stack, а в смысле концепции).

    > Ну вот как–то так.

    Там, конечно, есть одна идея, о которой я не подумал (у меня – peek, проверяем, потом при необходимости pop; тут уже можно спорить, чей код лучше), но:
    1) Если я правильно понял твой алгоритм, то там две опечатки. Вместо stack.push(s) должно быть stack.push(brackets[c]); вместо stack.pop()!= brackets[c] должно быть stack.pop()!= c. Ну или я неправильно понял, что в ваших сях делает stack.push. В любом случае, для закрывающей скобки brackets[c] вроде вернёт null или выкинет исключение – опять же, если я правильно понял, как в этих сях наполняется словарь.
    2) Твой код вроде не предусматривает того, что в строчке могут быть и другие символы кроме скобок, хотя я тебе уже давно говорил, что именно поэтому нужно рассматривать три варианта, а не два. Даже если ты модифицируешь свой код так, чтобы он в этом случае не падал – ты всё равно на первом же нескобочном символе сделаешь stack.pop() и вернёшь false.

    Довольно херово, на мой взгляд.

    > “Адовое индусское говно” — это скорее твой код на 50 строк.

    “Полсотни строк” – это с учётом того, что определение словаря у меня (для наглядности) занимает пять строк, тела ифов тоже вынесены на отдельные строки, и есть пустые строки. Так-то что угодно можно в одну длинную строку засунуть, было бы желание.

    Ну вот какой-то такой код я написал на том собеседовании (опять же, только ручка и бумага (а сейчас – блокнот), никакой проверки, плюс ещё есть куда стремиться): http://pastebin.com/6DMbSDUy. Лол, как я с количеством строк угадал-то.

  110. UPnsuper:

    : Когда я начал писать свой комментарий, этого уточнения ещё не было 🙂
    Тем не менее, никуда не делась опечатка со stack.push(s), и, вроде как, твоя функция по-прежнему будет фейлить на строках, содержащих не только скобки.

  111. UPnsuper:

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

  112. UPnsuper:

    : Блеать, самое интересное забыл (на бумаге не забывал).
    Вот исправленная версия, заодно и по остальным вопросам улучшил: http://pastebin.com/mrNzynXV
    92 строчки, омг.

  113. Zzzer:

    : ебать мои глаза, да у тебя тырпрайз головного мозга 🙂

  114. UPnsuper:

    : Заметим, не я начал говорить о бизнес-логике 🙂

  115. Peeef:

    :в строчке могут быть и другие символы кроме скобок

    Он вполне учитывает это и в таком случае возвращает false. Ты ведь не специфицировал как должен вести алгоритм себя в этом случае. Если он должен вести себя по-другому (возвращать true), нужно добавить одну строчку в начало цикла if (c is not a bracket) continue;

    Довольно херово, на мой взгляд.

    Если ты не понял алгоритм, это не значит что он “херовый”.

    Ну вот какой–то такой код я написал на том собеседовании

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

  116. Peeef:

    : Бизнес-логика и тырпраз головного мозга – не одно и то же.

    Но я теперь понял что ты имел в виду своим вопросом про расстановку скобочек. По нему действительно можно отсеивать индусов, оверенжинеров, и прочих товарищей со странностями. Тебя бы отсеили первым делом.

    private class Bracket епт, афигеть. К такому коду еще документацию прилагать надо на десяти страницах.

  117. Peeef:

    :
    Укажи, пожалуйста, на конкретную ошибку (если речь идёт не об IndexOutOfBoundException).

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

  118. Peeef:

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

  119. AylaTa:

    Блядь, почему ЛЮБОЙ пост с участием этого персонажа превращается в срач с 1000 простыней???

  120. Ovenode:

    : пиздец, у меня энтерпрайз из монитора сочиться начал.

  121. Xuaapp:

    : какого? А то я не слежу уже давно.

  122. AylaTa:

    : посмотри в список постов автора.

  123. Xuaapp:

    : обычные блого-посты, не? Вникать лень.

  124. Peeef:

    : Потому что любой пост начинается с закидона в духе: “ПОЧЕМУ ВСЕ ВОКРУГ ИДИОТЫ?!”, за которым следует наглядная демонстрация того, что на самом деле идиот – сам ТинПу. Это отличная схема для какашечного срача при поддержке автора, в которой грех не поучаствовать уже хотя бы ради соцдинамики кидания какашек.

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

  125. Peeef:

    Тинпу, а напиши-ка все-таки еще и разворот строки. Я думаю что ты слукавил, когда сказал что у тебя он в две строчки поместится.
    Как же там без private class ReversibleStringCharacterElement и StringReverseException?

    А что если вдруг понадобится при развороте строки еще и песни напевать?

  126. Nexhlam:

    Весь ваш C# это рак мозга, а.NET отрыжка от поедания некачественного говна!

  127. AylaTa:

    : нет, это не обычные блого-посты, поверь.

  128. AylaTa:

    : я под хромом, сорьки )

  129. Zzzer:

    : под хромом работает же

  130. UPnsuper:

    :
    > К такому коду еще документацию прилагать надо на десяти страницах.

    Я не вижу в этом коде ничего, что требовало бы документирования.

    > Тебя бы отсеили первым делом.

    Ну хз, ещё не отсеивали.

  131. UPnsuper:

    :
    > Он вполне учитывает это и в таком случае возвращает false.

    Т.е. по-твоему, в строчке 2*(2+2) скобки расставлены неверно?

  132. UPnsuper:

    : Эээ, вообще-то я об этой ошибке знал во время написания кода, и сознательно не стал её убирать.

  133. UPnsuper:

    :
    public static string Reverse(this string original) {
    if(original == null) return null;
    string reversed = new string(0x0, original.length);
    for(int i=0; i А что если вдруг понадобится при развороте строки еще и песни напевать?

    Ну запусти в одном потоке разворот, а в другом напевание песен, делов-то.

  134. UPnsuper:

    : Не преувеличивай, там даже сотни строк нет.

  135. Peeef:

    :
    Я не вижу в этом коде ничего, что требовало бы документирования.

    Там требует документирования ВСЁ. Это индусский код, в котором ты раздул задачу, цена которой = 6 строк, во все 90 (да и по скорости он у тебя раза в два-четыре хуже нормального решения), без какой-либо на то причины.

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

    Ну хз, ещё не отсеивали.

    Нудык, скажи спасибо доброму HR, на которого ты тут бочку зазря катишь.

    Т.е. по–твоему, в строчке 2*(2+2) скобки расставлены неверно?

    По-моему, строчка 2*(2+2) не является правильной скобочной последовательностью. В любом случае, спор о точности и понимании твоей постановки задачи здесь по-моему неуместен. Можно решить так, можно сяк – в любом случае это будет 6-9 строчек.

    Эээ, вообще–то я об этой ошибке знал во время написания кода, и сознательно не стал её убирать.

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

  136. Peeef:

    : Но вменяемых альтернатив-то в нише расово-верного виндозного программинга как бы нет.

  137. Peeef:

    : А как же StringReversingNotifierInterface? Вдруг мне нужно будет разворачивать в такт с песней? Ты не до конца продумал решение!!

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

  138. UPnsuper:

    :
    > Там требует документирования ВСЁ.

    Например?

    К слову, если посмотреть на твой код – чего стоит хотя бы то, что функция называется check, а возвращает bool. Вот и разбирайся, что там означает true, а что означает false.

    > да и по скорости он у тебя раза в два–четыре хуже нормального решения

    Аргументируй.

    > Нудык, скажи спасибо доброму HR, на которого ты тут бочку зазря катишь.

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

    > По–моему, строчка 2*(2+2) не является правильной скобочной последовательностью.

    Я на всякий случай напомню, исходная постановка задачи: напишите функцию для проверки правильности расстановки круглых и квадратных скобок во входной строке (ок, можно было бы ещё сказать “в математическом выражении). О правильных скобочных последовательностях тут говорил только ты.
    А я тебе неоднократно напоминал о том, что в строке могут кроме скобок содержаться и другие символы, и поэтому тебе надо проверять три различных случая, а не два.
    Если ты сейчас попробуешь модифицировать свой код под изменившиеся условия, то уже и строчек там будет не шесть, и работать оно будет уже за O(m*n) (m – количество типов скобок, n – длина строки), а не за O(logm * n).

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

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

  139. UPnsuper:

    : А в вашем пистоне нет явной статической типизации. И даже на скобках экономят!

  140. UPnsuper:

    :
    > А как же StringReversingNotifierInterface? Вдруг мне нужно будет разворачивать в такт с песней? Ты не до конца продумал решение!!

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

    А вот то, что при проверке строки снаружи захочется знать, где именно и какая именно ошибка в этой строке – вполне реально.
    Банальная ситуация – вводит какой-нибудь пользователь в твою форму Главную Формулу Жизни, Вселенной и Всего Такого килобайт этак на сто, а ты ему говоришь “false”. Пользователь обращается в техподдержку, и там люди начинают под лупой рассматривать эту формулу в поисках ошибки. Проведя так пару дней и не найдя её, обратятся к тебе, ты воткнёшь в свой код отладку, прогонишь эту строку через отладочную версию… сплошной геморрой, да и количество строчек у тебя тогда тоже уже станет измеряться десятками.

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

    Это ты про то, что задачу можно решить не за O(n), а с олимпиадным выебоном оптимизировать аж до O(n)?

  141. Dnaprado:

    Ребята а сколько вы уже оба собеседований провели?

  142. Peeef:

    iam_weasel: Да какая разница, весело же! Иди, залезай к нам, мы и тебе костюм выдадим, и начальный набор какашек!

  143. Hsvhlam:

    : Ты тут напираешь на важность диагностических сообщений, а твоя версия, между прочим, в этом смысле сделана халтурно, не доделана. Минимальное изменение в алгоритме позволило бы выдавать сообщения не только об отсутствии закрывающей скобки, но и указать точно позицию последней непарной открывающей скобки.
    Что же касается воплей о том, что, дескать, вдруг задача станет в миллион раз сложнее, давайте предусмотрим всё на этот случай – они тоже особого смысла не имеют. Лишний вариант скобочек добавить – не проблема. А значительно более сложные задачи лучше решать уже настоящим генератором парсеров.

  144. Peeef:

    : Например?

    Например, как все-таки твоей функцией узнать – верна ли строка или нет (неужто ловить ApplicatonException? Да лаадно? Такое эзотерическое решение нужно задокументировать).
    Какие из подклассов ApplicationException нужно вообще рассматривать для использования твоей функции – я же не полезу в код или в список классов искать это?
    Какие из них используются в проекте, а какие можно будет в будущем можно будет изменить, убрать или добавить не сломав ничего вокруг?
    Да и вообще, первый вопрос любого, кто откроет твой код – нахрена там так много кода вообще и что весь этот код значит? Ведь только тебе одному понятно что ты так написал что бы что-то где-то “обобщать”. И никто кроме тебя так обобщать не станет нигде и никогда.
    Если в реальности кому-то когда-то понадобится проверяльщик строк с функциональностью, похожей на “проверку скобочек”, но гораздо более общей, он уж точно не станет разрабатывать далее твой проект. Вместо этого он расчехлит любой генератор LL(1) парсеров и напишет для него грамматику в три строчки. Всё.

    К слову, если посмотреть на твой код — чего стоит хотя бы то, что функция называется check, а возвращает bool. Вот и разбирайся, что там означает true, а что означает false.

    Да, несомненно, к указанной функции в документацию пойдет одна строка: “returns true if the string is a valid bracket sequence”. В отличие от твоего монстра, главами которого будут зачитываться поколения.

    Аргументируй

    У тебя структуры данных поголовно динамические и куча лишних вызовов. Компилятор тебе это хрен заоптимит.

    Так эта задача была задана в нормальной компании

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

    А я тебе неоднократно напоминал о том, что в строке могут кроме скобок содержаться и другие символы

    Да я понимаю, в чем проблема-то. Твою формулировку можно воспринять двояко. В моем понимании другие символы означают “неверную” строку. Если это не так, проблема решается добавлением ровно одной строки в код (и еще одного set-а со списком скобочек). Итого получим 10 строк.

    Если ты сейчас попробуешь модифицировать свой код под изменившиеся условия, то уже и строчек там будет не шесть, и работать оно будет уже за O(m*n) (m — количество типов скобок, n — длина строки), а не за O(logm * n).

    Ти что, дебил? Во-первых, с HashSet и HashMap-ом код работает за O(n) для любого количества скобок. Во-вторых, под какие “изменившиеся условия” емае? Ты про добавление строчки “if not a bracket then skip”?

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

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

    Это ты про то, что задачу можно решить не за O(n), а с олимпиадным выебоном оптимизировать аж до O(n)?

    Это я про то, что можно одним кликом получить решение, которое лучше твоего в два раза, хотя и там, и там вроде бы O(n). “Олимпиадный выебон” – использовать Array.Reverse, ага.

  145. Arbam:

    не срача ради, расскажите пожалуйста про ущербность господ с ВМК(я правильно понимаю что это Выч Мат и Киб фак МГУ им Ломоносова что на воробьевых горах в г Москва РФ?). или они ущербные и калищные только с тз автора поста? соц опрос мне нахер не всрался, а вот почему #такие тупые вопросы для ребят с ВМК# интересно услышать.

  146. UPnsuper:

    > Например, как все–таки твоей функцией узнать — верна ли строка или нет (неужто ловить ApplicatonException? Да лаадно? Такое эзотерическое решение нужно задокументировать).

    Я напомню, это решение “на коленке” с ручкой и бумажкой. Конечно, стоит сделать специальное AbstractBracketsErrorException, от которого унаследовать те три конкретных.

    Кстати, мы, видимо, немного о разных вещах говорим – документирование интерфейсов против документирования реализации. Документирование интерфейсов (спецификация) нужно всегда. Документиирование реализации (“а вот что делает эта конкретная строчка кода / зачем нужно это конкретное поле класса”) в моём случае не нужны.

    > Да, несомненно, к указанной функции в документацию пойдет одна строка: “returns true if the string is a valid bracket sequence”.

    А у меня – одна строчка (в яве вроде даже это на уровне языка есть) “throws AbstractBracketsErrorException”.

    Только у тебя, если разработчик, использующий твою функцию, ошибся / невнимательно прочитал / не прочитал / итд (тем более, что функция называется “check…”, а не “is…”) – программа будет выдавать неверные результаты. А у меня даже если разработчик ошибся – ну не перехватит он исключение в конкретном месте, ну обработается оно уровнем выше, неверная строка всё равно не пройдёт.
    И у тебя даже при всём желании, без вмешательства в код твоей функции, нельзя определить, что же именно не так со строкой. У меня же при необходимости можно понять, где и какой косяк.

    > У тебя структуры данных поголовно динамические

    Чочо?

    > Если это не так, проблема решается добавлением ровно одной строки в код (и еще одного set–а со списком скобочек). Итого получим 10 строк.

    У тебя их уже девять. Давай, добавляй, вперёд.

    > Во–вторых, под какие “изменившиеся условия” емае? Ты про добавление строчки “if not a bracket then skip”?

    Я говорил о минимальных изменениях в твоём коде – что-то вроде “if c in brackets.values”.

    > код работает за O(n) для любого количества скобок.

    То есть, если у тебя m=over 9000 различных видов скобок, проверка символа на то, является ли он открывающей скобкой, всё равно происходит за константное время? Или ты не в курсе, что такое log m?

    > Понадобится узнать — изменишь функцию.

    А если понадобилось узнать через N лет, и со своей целью сделать максимально нечитаемый код, минимизировав количество строк, уже уволился / эмигрировал / скончался?

    > Поправка шестистрочного кода (да хоть замена его на полностью новый)

    ОК, так и запишем – пишет неподдерживаемый код, который в случае чего придётся полностью заменять на новый.

    > это в разы легче чем расковыривание 90–строчного говна с прайват классами и эксепшнами

    Что там расковыривать-то? Какая строчка тебе не очевидна?

    > с прайват классами и эксепшнами, про которые непонятно, сломается ли что–нибудь, если их удалить, или нет

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

    > “Олимпиадный выебон” — использовать Array.Reverse, ага.

    Ну извини, я в первую очередь обратил внимание на тот пример, где они руками символы местами меняют.
    В любом случае, проверять на собеседовании, помнит ли кандидат о существовании Array.Reverse как-то странно. А ещё он вроде не generic, фу.

  147. UPnsuper:

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

    Так я и не спорю. Говорю же – это то, что было написано на собеседовании ручкой на бумаге, за отведённое для собеседования время.

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

    Да, позволило бы. Действительно, такое минимальное изменение сделать полезно.
    И в моём примере его сделать можно, для этого достаточно поменять три строчки работы со стеком.
    В примере придётся перелопатить всю функцию, поменять формат её использования (если она уже где-то используется – сломать весь существующий код или оставить старую версию для обратной совместимости – так, что о новой никто и не узнает)… впрочем, он там сам выше говорит, что лучше выкинуть его поделие и написать всё с нуля.

  148. UPnsuper:

    > До тех пор пока в требованиях не прописана необходимость делать петь песни, танцевать, и выкидывать эксепшны по любому поводу — этого делать не нужно.

    Да, если ты тут собирался сослаться на популярный в гугле холивар “исключения – зло”, то немного промахнулся. Потому что даже гугловцы вместо исключений используют другие способы передачи информации об ошибках; это уже дело вкуса и принятого в конкретном проекте стиля. Твоя же функция не возвращает абсолютно никакой информации, кроме “ок”/”не ок”.

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

  149. UPnsuper:

    : Я никоим образом не хотел обосрать ВМК, речь шла об абстрактном выпускнике, опыта работы с реальными проектами ещё не имевшего, зато поднаторевшего в решении алгоритмических задач (Кнут, ACM).

  150. Eiler:

    : а в чем подвох в этой задаче? Я посчитал, что 2, и получилось 2.

  151. Zzzer:

    : исключения – зло. какую еще инфу кроме ок-неок должна возвращать эта функция? 🙂

  152. UPnsuper:

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

  153. Peeef:

    : А ты скомпили ее, увидишь.

  154. Arbam:

    : как ты понимаешь собеседование суть есть дерево, начинающееся с приема письма-резюме-собеседуемого-etc, а дальше уже тупо – очередной узел = некий тест из которого выходят во множество других узлов. В какой то момент ты придешь, как тебе будет, казаться в лист, но ведь не факт что ты не попробуешь свои силы снова, например, люди несколько раз пытаются попасть в гугл или мс.
    Обычные тесты даются на то чтобы понять как вообще человек думает. Я хз есть ли здесь люди из DB, но у них вроде тоже тесты(ну и потом дальше общения и телодвижения), а вот в Люксе который на них батрачит тупо пиздежь, причем та еще хурма 🙂 И отовсюду выходишь и думаешь накой хрен мы общались с вами несколько лишних часов о fucking vector, matrix clocks, проблемах JMM(jsr133,166), volatile, диких и корявых архитектурах, монадах и эрланге = ведь кодить придется тупые бизнес логики где 90% это возьми энтити конвертни в дто = покажи в вебе либо обратный ход.
    Ну и да самый большой секрет = все это создано только для того чтобы сделать зп меньше если человек подходит, а полных идиотов не способных работать не очень то и много, ведь можно для совсем уж скажем так начинающих дать простецкие задачи – репорты смотреть или там настраивать билд системы, пописывая таски для анта или мавена.

  155. Peeef:

    :
    Конечно, стоит сделать специальное AbstractBracketsErrorException, от которого унаследовать те три конкретных.

    Да! Да! Ради таких фраз я готов еще посидеть в этом посте.

    То есть, если у тебя m=over 9000 различных видов скобок,…

    … и вот ради таких. Я прямо визуально представляю себе тебя, корпящего над разработкой ПРОГРАММЫ ПРОВЕРКИ СКОБОЧЕК, поддерживающей over 9000 различных видов скобок, и позволяющей с помощью системы плагинов подключать дополнительную платную функциональность. Ты не думал стартап на эту тему поднять?

    проверка символа на то, является ли он открывающей скобкой, всё равно происходит за константное время?

    У меня – да.

    А если понадобилось узнать через N лет

    Я думаю что и через N лет в этом мире будут существовать люди, которые смогут с нуля за пять минут написать шестистрочную программу из учебника по алгоритмам. Хотя глядя на тебя уже возникают сомнения. Куда катится этот мир?

    Если этот класс используется (а иначе он бы и не был написан) — то, конечно же, сломается.

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

    Да, если ты тут собирался сослаться на популярный в гугле холивар “исключения — зло”

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

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

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

  156. Peeef:

    : исключенительная ситуация [x]

  157. Zzzer:

    : но задача стояла “проверить корректно ли заданное скобочное выражение” 🙂

  158. UPnsuper:

    > и позволяющей с помощью системы плагинов подключать дополнительную платную функциональность. Ты не думал стартап на эту тему поднять?

    Про юникс-вей слышал что-нибудь? Do one thing and do it well.

    > У меня — да.

    То ли ты не умеешь читать, то ли у тебя квантовый компьютер.

    > Я думаю что и через N лет в этом мире будут существовать люди, которые смогут с нуля за пять минут написать шестистрочную программу из учебника по алгоритмам

    Ага, философия – написать кусок говна; понадобится в нём что-то поменять – не вопрос, выкинем его и напишем заново.

    > Хотя глядя на тебя уже возникают сомнения.

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

    > Именно поэтому твоя реализация, пестрящая эксепшнами, уже в момент рождения стала неизменяемой (ведь эксепшны и контракт менять нельзя)

    Ты не различаешь интерфейс и реализацию, сигнатуру и тело, публичные и приватные поля?

    > Я о том, что оверенжиниринг — зло, но тебе этого еще долго этого будет не понять.

    И как же ты определяешь, овер – или не овер-?

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

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

    > У нормальных людей абстракция используется чтобы сократить код и упростить понимание.

    Упростить понимание – да.
    Сократить код – необязательно. На твоём примере хорошо видно, что короткий код может быть менее понятен, чем длинный.
    Кроме того, в реальности, по мере изменения требований, твой короткий код обрастёт таким количеством костылей, что, вероятно, станет даже длиннее моего.

    > А исключения конечно же зло, если их использовать для индикации исключенительной ситуации, а не как способ возврата значения функции.

    Ты там, кажется, одно “не” пропустил. И на всякий случай напомню, и в твоём, и в моём случаях функция называется “check…”, а не “is…”. Да и постановка задачи – “проверить, является ли строка”, а не “сказать, является ли строка”.
    И повторю насчёт гугла – даже там есть коды возврата и контексты, насколько я в курсе. Твоя же функция не предусматривает ни исключений, ни гугловского подхода, голый результат “нет, пройдите нахуй”. Вот пытаешься ты включить комп, или там открыть страницу блог, а тебе говорят “false”. Что false, почему false – а хуй его знает.

  159. UPnsuper:

    :
    Для сравнения, в другой компании были задачи вида “напишите функцию для проверки правильности расстановки круглых и квадратных скобок во входной строке”
    Написала , 20.12.2011 в 19.36, в hardblog.net

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

  160. Peeef:

    : хотел сказать тебе, что в постановке задания ничего нет про возвращение какой-то дополнительной информации.

  161. UPnsuper:

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

    > все это создано только для того чтобы сделать зп меньше если человек подходит

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

  162. UPnsuper:

    : ОК, я не отследил, на что он отвечал.

    Тогда другой комментарий – разработчик, если это не тупая обезьяна вроде нижнего уровня быдлокодеров в МС, должен не тупо кодить нечётко сформулированное ТЗ в код, а подумать, откуда вообще это ТЗ взялось и какие в дальнейшем могут быть дополнительные требования.
    Например, зачем вообще может появиться необходимость проверки строки на соответствие таким условиям?
    Почему бы не предусмотреть возможность диагностики, ведь от этого никому не станет хуже?
    Да и отлаживать легче – вот ошиблись мы там где-то в содержательной части кода, и на сложной килобайтной строке, где должно было быть true, наша функция выдала false. С true всё понятно, там вариантов нет, “косяков не обнаружено”, но false-то может быть выдан по тысяче разных причин, и хорошо бы понимать, по какой причине он выдаётся в данном конкретном случае.

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

    И всё-таки напомню ещё о корректности строки 2+(2*2). ОК, не учёл это требование, пропустил мимо ушей, задача была криво сформулирована – это не страшно. Страшно то, что он, в погоне за экономией количества строчек, объединил два совершенно разных условия. Надо будет внедрить поддержку строк вида 2+(2*2) – у него там вообще будет монструозное логическое выражение с сайд-эффектами (впрочем, они и сейчас есть), из трёх частей. ИМХО, за if-ы с сайд-эффектами вообще надо расстреливать на месте.

  163. UPnsuper:

    : Ещё к вопросу об исключениях.
    Конечно, в плюсах с этим бардак, и каждый пишет как хочет.
    Но в дотнете есть огромная BCL, уже работающая каким-то образом. Я могу написать, например, var amount = decimal.Parse(amountField.Value), при необходимости обернув это в try…catch, и ни одна малолетняя девица не упадёт от этого в обморок (да и как тут ещё написать-то, делать танцы вокруг TryParse?). Так почему же я не могу придерживаться той же философии в своём коде?

  164. UPnsuper:

    : Хотя Ъ-пацаны, наверное, и всякие там IDisposable презирают. Да, действительно, я не Ъ.

  165. Peeef:

    : Про юникс–вей слышал что–нибудь? Do one thing and do it well.

    Ну вот у тебя пока не получается.

    То ли ты не умеешь читать, то ли у тебя квантовый компьютер.

    Нет. У меня хэшмап.

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

    Ну не смог же. Индус внутри не дал тебе сделать этого!

    Ты не различаешь интерфейс и реализацию, сигнатуру и тело, публичные и приватные поля?

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

    И как же ты определяешь, овер — или не овер–?

    Если разработчик начинает додумывать от себя “что же может понадобиться в будущем” и писать ради этого херню, в десять раз превышающую по размерам то, что нужно – он оверинжинирит.

    Нет, просто я немало времени имею дело с проектами объёмом чуть–чуть больше шести, шестидесяти или даже шестисот строк,

    Извини, но я тебе не верю. Именно потому, что я сам немало повидал проектов, в которых вот такое вот говнище на стопицот классов расписано в каждом углу вместо одной простой функции. Что-либо понять и изменить в них здравомыслящему человеку невозможно. Ведь поверх своего суперабстрактного проверяльщика скобочек индус вроде тебя обязательно поставит еще и Factory, которая будет конфигурироваться через какой-нибудь плагин, сохраненный в стороннем модуле, чтобы при необходимости можно было вообще заменить весь проверяльщик скобочек. И потом вдруг окажется, что часть кода выполняется неизвестно откуда неизвестно зачем и неизвестно как, а документации на нее нет, потому что “это же реализация, чего ее документировать, вам достаточно знать что вот эта Factory делает объекты, которые проверяют скобочки”. А потом поверх Factory он запихнет пару фильтров, чтобы можно было при желании заменить Factory на любую другую и вместо проверок скобочек можно было бы дописывать скобочки. А потом он еще вспомнит про Flyweight, и про MVC, и про все что он вызубрил в его любимой GoF и прикрутит это все к проверке скобочек. Потому что почему бы нет? Ведь может пригодиться!

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

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

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

    и в твоём, и в моём случаях функция называется “check…”, а не “is…”.

    Я так понимаю тебе какой-то coding standard мозг съел, что ты уже не способен воспринимать функции, которые именуются не так, как тебе привычно.

    “проверить, является ли строка” для большинства здравомыслящих людей значит “проверить и сообщить результат”. Хотя концептуально мне твой ход мысли нравится. В следующий раз когда тебе дадут такую задачу, пиши код который осуществляет проверку, но возвращает всегда true. Нуачо, проверил же. Возвращать результат не обязательно.

    Вот пытаешься ты включить комп

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

  166. Peeef:

    : откуда вообще это ТЗ взялось и какие в дальнейшем могут быть дополнительные требования.

    Да, поэтому давай-ка додумаем всякой херни на пустом месте. Если у тебя нет информации о том, откуда твое ТЗ взялось, то ты должен спросить. Если ты не можешь спросить (как в случае с заданием на интервью) ты должен реализовать самый простой способ, а не изобретать хрень, которую придется вызывать в try/catch блоке вида
    try { checkString(); output_result = true; } catch(какая-то херня) { output_result = false; }
    А ведь заказчик просто хотел узнать, хорошая у него строка или нет и сохранить эту информацию в файл.

    ведь от этого никому не станет хуже?
    От твоей непрошенной “диагонстики” станет хуже:
    1) Программе, которая будет работать слегка дольше.
    2) Программисту, которому придется использовать try/catch чтобы просто узнать свойство строки.
    3) Мейнтейнеру, которому придется разбираться в четырех классах вместо одной функции.

    результирующий код будет выглядеть ещё страшнее.

    Ну страшнее твоего уж точно сложно сделать.

    Надо будет внедрить поддержку строк вида 2+(2*2)… у него там вообще будет монструозное логическое выражение с сайд–эффектами

    Слуш, ну ты ведь правда не умеешь программировать если для тебя это так трудно.
    Для дебилов, специально, расширенная версия: http://pastebin.com/taXzppnr

    Так почему же я не могу придерживаться той же философии в своём коде?

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

  167. UPnsuper:

    > Ну вот у тебя пока не получается.

    Я не предлагаю обвешивать функцию проверки платными плагинами.

    > Нет. У меня хэшмап.

    А операции с хэшмапом, по-твоему, за постоянное время происходят?

    > Различаю. А ты походу не понимаешь, что однажды опубликованный эксепшн удалить из проекта невозможно.

    Потому что публичные поля/подклассы – часть “интерфейса”.

    > Если разработчик начинает додумывать от себя “что же может понадобиться в будущем” и писать ради этого херню, в десять раз превышающую по размерам то, что нужно — он оверинжинирит.

    От тебя мы работоспособного кода так и не увидели.

    > Ведь поверх своего суперабстрактного проверяльщика скобочек индус вроде тебя обязательно поставит еще и Factory, которая будет конфигурироваться через какой–нибудь плагин, сохраненный в стороннем модуле, чтобы при необходимости можно было вообще заменить весь проверяльщик скобочек.

    Если предполагается, что могут быть разные “проверяльщики скобочек” – почему бы и нет?
    Тебя же не смущает, что при ресайзе картинки какой-нибудь там фотошоп предлагает на выбор несколько различных алгоритмов ресайза?

    > А потом он еще вспомнит про Flyweight, и про MVC, и про все что он вызубрил в его любимой GoF и прикрутит это все к проверке скобочек.

    А -ы скажет “все эти ваши MVC – б-гомерзкая выдумка индусов из GoF, а я лучше по старинке пхп-странички наклепаю, и чтобы sql-инъекций побольше было”.

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

    Не понадобится – и замечательно.
    А если понадобится? У меня всё работает, а твой говнокод придётся выкинуть и написать новый.

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

    В какой ситуации у него на экране будут пробегать названия моих классов?

    > Я так понимаю тебе какой–то coding standard мозг съел, что ты уже не способен воспринимать функции, которые именуются не так, как тебе привычно.

    Ага, #define true false гораздо лучше – ведь это так нон-конформистски!

    > “проверить, является ли строка” для большинства здравомыслящих людей значит “проверить и сообщить результат”

    Ну хер знает, в моём круге общения это всегда означало “передать управление дальше, если всё ок; выкинуть исключение, если что-то не ок”.
    “Узнать, является ли строка верной” обычно называют IsStringCorrect.

    > В следующий раз когда тебе дадут такую задачу, пиши код который осуществляет проверку, но возвращает всегда true.

    Если ты не заметил, там void.

    > Это такой чувак, которого просишь написать функцию сложения двух чисел, а он тебе говорит “ну вот представь, включаешь ты комп, а он тебе не говорит какая температура на улице. Фигня же, правда! Поэтому моя функция возвращает тебе значение температуры на улице. Ее можно конфигурировать в целсиях и фаренгейтах и подключать разные термометры!”.

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

  168. UPnsuper:

    > try { checkString(); output_result = true; } catch(какая–то херня) { output_result = false; }

    Ну вообще-то это можно сделать и легче с помощью универсального один раз написанного хелпера: output_result = DoesntThrowAnException<какая-то херня>(() => checkString(str));
    А ты там забыл output_result проинициализировать, пичалька.

    > А ведь заказчик просто хотел узнать, хорошая у него строка или нет и сохранить эту информацию в файл.

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

    > 1) Программе, которая будет работать слегка дольше.

    О да, кинуть исключение – это так сложно, целых O(1), а злые пользователи постоянно будут передавать нам плохие строки, чтобы вызвать этими исключениями DoS!

    > 2) Программисту, которому придется использовать try/catch чтобы просто узнать свойство строки.

    А у тебя программисту придётся использовать if/else, чтобы просто сообщить пользователю о возможной ошибке. Без возможности сообщить ему что-то более конкретное, чем “ваша строка – говно”. Главное только не перепутать, когда функция возвращает true, а когда false.

    > 3) Мейнтейнеру, которому придется разбираться в четырех классах вместо одной функции.

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

    > Ну страшнее твоего уж точно сложно сделать.

    Ну попробуй.

    > Для дебилов, специально, расширенная версия: http://pastebin.com/taXzppnr

    Строчек уже 11, ну да не в этом дело.
    Сайд-эффекты в ифе – заебись!
    Скобки надо перечислять в двух местах (а если по ошибке добавим новый тип скобок только в одно из них?) – заебись!
    continue – заебись!
    Для человека, который так печётся о производительности, перечисление всех скобок (включая открывающие) в all_brackets – заебись!
    Уебанский code style без каких-либо отступов в ифах, всё одной кишкой, да ещё и попеременно простые ифы и elseif (даже самые страшные питонисты так не пишут) – заебись! Сразу видна забота о мейнтейнере.
    Проверка совершенно разных условий, относящихся к совершенно разным косякам входных данных (строчка закончилась слишком рано / неподходящая закрывающая скобка) – заебись!

    А теперь попробуем хоть чуть-чуть причесать твой код, чтобы избавиться от самых очевидных косяков во внешности (но не от ошибок в логике / производительности): http://pastebin.com/ar78YJeE. Упс, уже 21 строка, а мой исходный вариант был 52. Да, это не “6 против 92”.

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

    Мне нужно проверить, является ли строка хорошей. При моём решении задачи там, снаружи, могут легко определить ответ по вылетевшему исключению конкретного типа; а если понадобится – то и конкретный источник проблемы. У тебя же надо не забыть, в каких случаях true и в каких false; а если захочется узнать источник проблемы – придётся переписывать всё твоё говно начисто.

  169. Ovenode:

    : ко сообщает:
    ? ~ g++ test.cpp
    test.cpp:4:11: error: unterminated comment
    test.cpp: In function ‘int test()’:
    test.cpp:4: error: expected ‘;’ at end of input
    test.cpp:4: error: expected `}’ at end of input

    return 2/*p; < – красненьким начало коментария

  170. Peeef:

    :
    Я не предлагаю обвешивать функцию проверки платными плагинами.

    Ты в полушаге от этого.

    А операции с хэшмапом, по–твоему, за постоянное время происходят?

    Да. Тем более что речь о символах.

    От тебя мы работоспособного кода так и не увидели.

    С каждым комментарием от тебя все больше маразма и абсурда прет. Я с нетерпением жду твоих следующих комментариев. В них ты походу начнешь отрицать само существование меня.

    Ага, #define true false гораздо лучше — ведь это так нон–конформистски!

    Да, да, больше абсурда! Если кто-то считает что функции можно называть не на “is…” а как-то по-другому, то он нон-конформист!

    Если предполагается, что могут быть разные “проверяльщики скобочек” — почему бы и нет?

    Да! Еще! Ведь твое дело – предположить, а там уже и Factory недалеко!

    А если понадобится? У меня всё работает, а твой говнокод придётся выкинуть и написать новый.

    Да нет, ничего выкидывать не придется – дописать в if кидание эксепшна большого ума не требует.
    Зато если окажется что эксепшнов не нужно или действительно по какой-то причине код нужно заменить, простой вариант заменяется одним кликом. Твоя же реализация намертво завязывается своими тремя интерфейсами с эксепшнами, и если потом вдруг окажется что не нужно этих эксепшнов, то их с корнем не выкорчуешь.

    “Узнать, является ли строка верной” обычно называют IsStringCorrect.

    Ах вооот оно в чем дело. Название оказывается виновато! Т.е. если бы название было бы одно, ты бы написал одну простую функцию без эксепшнов. А если оно другое – ты делаешь монстра?

    Если ты не заметил, там void.

    Заметил. Но еще лучше было бы return true. Твой ход мыслее был бы более явным.

    А ты напишешь кусок кала с захардкоженными цельсиями;

    Ай молодца! Индус обиделся!

  171. UPnsuper:

    > Ты в полушаге от этого.

    Может, ты и по фотографии лечишь?

    > Да. Тем более что речь о символах.

    Ну так-то и строки больше 2ГБ не бывают, тоже время, можно сказать, константно.

    > С каждым комментарием от тебя все больше маразма и абсурда прет. Я с нетерпением жду твоих следующих комментариев. В них ты походу начнешь отрицать само существование меня.

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

    > Да, да, больше абсурда! Если кто–то считает что функции можно называть не на “is…” а как–то по–другому, то он нон–конформист!

    Я считаю, что функции можно называть как угодно, если их название соответствует их действию.

    > Да нет, ничего выкидывать не придется — дописать в if кидание эксепшна большого ума не требует.

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

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

    Я на всякий случай напомню, что уже довольно давно было сказано – у трёх разных исключений базовый класс должен быть не ApplicationException, а AbstractBracketsException или что-то вроде того.
    Соответственно, либо снаружи используют только этот базовый класс, либо, выходит, исключения действительно оказались полезны.
    Кроме того, зачем тебе понадобилось их “выкорчёвывать”?

    > Ах вооот оно в чем дело. Название оказывается виновато! Т.е. если бы название было бы одно, ты бы написал одну простую функцию без эксепшнов. А если оно другое — ты делаешь монстра?

    Если название одно – я пишу функцию, возвращающую bool.
    Если название другое – я пишу функцию, возвращающую void и кидающую исключения.

    > Ай молодца! Индус обиделся!

    Лол, индус обвиняет других в индусскости.

  172. Peeef:

    : Ну вообще–то это можно сделать и легче с помощью универсального один раз написанного хелпера

    Товарищи! Метод проверки скобочек от ТинПу поставляется с четырьмя классами и тремя эксепшнами!
    НО ЭТО ЕЩЕ НЕ ВСЕ!!!!
    ЗВОНИТЕ ПРЯМО СЕЙЧАС и вы получите вдобавок БЕСПЛАТНО универсальный хелпер DoesntThrowAnException!

    О да, кинуть исключение — это так сложно

    Да не, я все больше о “BracketsByOpenChar[str[i]]”, “currentState.Peek().closeChars.Contains (str[i])” и прочей ненужной лабуде. Я не спорю, это всего в два-четыре раза медленнее обычного решения, ничего страшного. Но тем не менее.

    Главное только не перепутать, когда функция возвращает true, а когда false.

    Поэтому лучше чтобы функция ничего не возвращала! Ничего не возвращает – ничего не перепутать! Гениально! Пойду все функции перепишу.

    Когда ты добавишь всю требуемую функциональность

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

    Сайд–эффекты в ифе — заебись!
    Скобки надо перечислять в двух местах — заебись!
    continue — заебись!
    Для человека, который так печётся о производительности, перечисление всех скобок (включая открывающие) в all_brackets — заебись!
    code style без каких–либо отступов в ифах
    Проверка совершенно разных условий, — заебись!

    Это прямо какая-то индусская библия у тебя я смотрю. -“Не пиши continue ибо не даст бог Кришна тебе еды на завтрак. Пиши лучше вложенные ифы, ибо так Кришна любит!”. -“Да будут отступы в ифах всегда иначе кришне непонятно!”. -“Да будут называться функции на Is.. и никак иначе!” -“Перечисление скобок влияет на производительность, ибо сказал бог Кришна что это есть так!” -“Не более одного условия в ифе, ибо мозжечок Кришны не понимает оператора “или”, а любит он вложенные ифы и лишние проверки!”

    (но не от ошибок в логике / производительности)
    Ну расскажи же, где ошибки в логике/производительности. Я слушаю, о Кришна-сан!

    Упс, уже 21 строка, а мой исходный вариант был 52
    Клево. Индусу показывают как его код можно написать в 6 строк. Он, тужась, растягивает его на 21 и ликует. Я верю что ты можешь и до 52 и до 90 и до 900 растянуть, тебе только время дай!

    При моём решении задачи там, снаружи, могут легко определить ответ

    Только вот это не нужно никому. НЕ БЫЛО ЭТОГО В ЗАДАНИИ.

  173. Peeef:

    :
    Ну так–то и строки больше 2ГБ не бывают

    Причем здесь это?

    что и эту помойку с if–ами разгрести придётся

    Под “помойкой с ифами” ты подразумеваешь, я так понимаю.
    if(stack.empty() ИЛИ stack.pop()!= …)
    Да, тут ты конечно головушку сломааешь, чтобы разгрести два разных условия на два ифа-то. В школе вас оператору ИЛИ не учили, я так понимаю?

    у трёх разных исключений базовый класс должен быть

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

    Если название одно — я пишу функцию, возвращающую bool. Если название другое — я пишу функцию, возвращающую void

    Подумать только, две буквы в названии, а разница в полсотни строчек и четыре класса! Буду знать что есть такие традиции у некоторых каст.

  174. UPnsuper:

    > Причем здесь это?

    Как это при чём? O(n) при n ограниченном сверху превращается в O(1), ты не знал?

    > Под “помойкой с ифами” ты подразумеваешь, я так понимаю. if(stack.empty() ИЛИ stack.pop()!= …)

    Ага, в частности.

    > Да, тут ты конечно головушку сломааешь, чтобы разгрести два разных условия на два ифа–то. В школе вас оператору ИЛИ не учили, я так понимаю?

    Так я и с выражением return value++ + ++value разберусь, но это же не значит, что тому, кто это написал, не надо оторвать руки?

    > Это не важно. Твои исключения не выкорчуешь, если они окажутся не нужными,

    Зачем их выкорчёвывать? Тебе мешает?

    > или если кто–то захочет изменить логику рапортирования ошибок.

    Что ты имеешь в виду под “логикой рапортирования ошибок”?
    В этом плане исключения как раз более гибки, чем твои true/false. Во всяком случае, из исключений всегда можно снаружи получить true/false, а true/false снаружи никак на информативные исключения не переделаешь, придётся твой говнокод разгребать.

    > Подумать только, две буквы в названии, а разница в полсотни строчек и четыре класса!

    Подумать только, коммунизм от капитализма всего шестью буквами отличается, а разница-то между СССР и США какая!
    Полсотни строчек не только исключениями заняты.

    > ЗВОНИТЕ ПРЯМО СЕЙЧАС и вы получите вдобавок БЕСПЛАТНО универсальный хелпер DoesntThrowAnException!

    Ну обычно в крупных проектах уже есть вагон таких хелперов вроде Stream.CopyTo, Curry итд.

    > Да не, я все больше о “BracketsByOpenChar[str[i]]”, “currentState.Peek().closeChars.Contains (str[i])” и прочей ненужной лабуде. Я не спорю, это всего в два–четыре раза медленнее обычного решения, ничего страшного. Но тем не менее.

    Ебать, и с какой же это стороны BracketsByOpenChar[str[i]] медленнее твоего brackets[c]?

    > Поэтому лучше чтобы функция ничего не возвращала! Ничего не возвращает — ничего не перепутать! Гениально! Пойду все функции перепишу.

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

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

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

    > Это прямо какая–то индусская библия у тебя я смотрю.

    Ты не поверишь, индусам ещё и goto использовать запрещено – неожиданная новость, правда?

    > Ну расскажи же, где ошибки в логике/производительности. Я слушаю, о Кришна–сан!

    Я тебе на stack.push(s) указал уже хуй знает сколько времени назад.
    На то, что в all_brackets нахуй не нужны открывающие скобки – в предыдущем комментарии.
    Но тебе, видимо, легче игнорировать конструктивную критику.

    > Индусу показывают как его код можно написать в 6 строк. Он, тужась, растягивает его на 21 и ликует

    Я не понимаю, а зачем ты вообще так транжиришь строки? Всё ведь заебись записывается в одну строку: http://pastebin.com/kHY7cKEJ
    Только индусы могут растянуть это на две строки и более!

  175. Peeef:

    :
    Как это при чём? O(n) при n ограниченном сверху превращается в O(1), ты не знал?

    Причем здесь это?

    тому, кто это написал, не надо оторвать руки

    Предлагаю запретить оператор || вообще! Вместо каждого
    if (A || B) X;
    будем писать
    if (A) X; else if (B) X;

    Так ведь понятнее, правда, и головка не болит!

    с какой же это стороны BracketsByOpenChar[str[i]] медленнее твоего brackets[c]?

    C такой, что у меня там char, а у тебя – указатель, который потом еще дереференсить надо.
    Ты ведь знаешь, что такое поинтеры, правда?

    Ты не поверишь, индусам ещё и goto использовать запрещено — неожиданная новость, правда?

    Да, да, я слышал. Им сказали “нельзя”, они и не используют никогда. Не потому что плохо, а потому что им сказали. Они вместо этого эксепшны кидают. Ведь гото – плохо, а эксепшны – модно!

    Я тебе на stack.push(s) указал уже хуй знает сколько времени назад.
    Что с ним не так?

    На то, что в all_brackets нахуй не нужны открывающие скобки — в предыдущем комментарии.
    В моей версии алгоритма – нужны. Мне так понятнее. Неверным или неэффективным это алгоритм не делает.

    Еще “конструктивной критики”?

    Я не понимаю, а зачем ты вообще так транжиришь строки?

    Да, давай, прикидывайся идиотом. У тебя хорошо получается.

  176. Peeef:

    Я устал я ухожу. По данному интервью я понял что я бы Тинпу в команду не взял.

    Тинпу, расскажи потом – возьмут тебя или нет. Интересно очень.

  177. UPnsuper:

    > Причем здесь это?

    При том, что ты забыл о зависимость от количества типа скобок.

    > Предлагаю запретить оператор || вообще! Вместо каждого
    > if (A || B) X;
    > будем писать
    > if (A) X; else if (B) X;

    Тебе про сайд-эффекты и про смешивание событий с совершенно разным смыслом, а ты про ||. Индус, что тут поделать.

    > C такой, что у меня там char, а у тебя — указатель, который потом еще дереференсить надо.

    А, так ты на таких вещах экономишь…

    > Да, да, я слышал. Им сказали “нельзя”, они и не используют никогда. Не потому что плохо, а потому что им сказали. Они вместо этого эксепшны кидают. Ведь гото — плохо, а эксепшны — модно!

    То ли дело – он из одного только чувства противоречия доведёт плотность goto в своём коде до максимально возможной!

    > Что с ним не так?

    s – строка.

    > В моей версии алгоритма — нужны. Мне так понятнее. Неверным или неэффективным это алгоритм не делает.

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

    > Да, давай, прикидывайся идиотом. У тебя хорошо получается.

    Странно, а мне почему-то показалось, что это ты прикидываешься идиотом. Стоило только добавить к твоему коду переводы строк да фигурные строки с отступами (по сути, за исключением одного места, только оформление изменилось) – сразу крик “ааа, растягивают, индусы!!!”. Ну так не нравятся мои оформительские идеи – вообще непонятно, с чего ты стал об оформлении думать и вообще разбивать код на строки.

  178. UPnsuper:

    :
    > Я устал я ухожу.

    Свежо предание…
    В остальном я утомился и сдаюсь. Во флудинге ты сильнее меня…
    Написал , 22.12.2011 в 00.43, в hardblog.net

    > По данному интервью я понял что я бы Тинпу в команду не взял.

    У тебя какое-то самомнение завышено, говоришь так, как будто Тинпу готов идти в твою команду.

  179. Zzzer:

    : ну просто как по мне эксепшены мало чем отличаются от goto 🙂 но если осторожно, то можно и goto в принципе иногда заюзать, так что если тебе нравится, то пожалуйста 🙂

  180. Nexhlam:

    : Мы их потом продаем лисперам, тем и живем.

  181. UPnsuper:

    : Ну хз, мне один раз даже попалась вакансия с указанием зп с точностью до 500р. Столько и предложили по итогам собеседования.

  182. UPnsuper:

    : Зачем лисперам фигурные скобки?

  183. Nexhlam:

    : они их распрямляют и засовывают во все места

  184. UPnsuper:

    : Принципиальное отличие, как минимум, в том, что в случае с goto – там, где происходит переход, ты указываешь на то, куда перейти; а в случае с исключением – наоборот, там, куда происходит переход, ты указываешь на то, переходы откуда принимать (причём с точностью только до типа, а не конкретного источника).
    Тот самый goto, который вреден – используется как возможность для превращения стройных конструкций if..else в спагетти с телепортом, для не совсем явного в логической структуре кода перехода куда-то совсем в другое место; и достаточно чуть-чуть ошибитья, чтобы код начал вести себя непредсказуемым образом. Исключение же используется не для перехода, а для выхода в случае невозможности / бессмысленности продолжать работу соответствующего участка функциональности; и даже в худшем случае максимум – приложение свалится с соответствующим внятным сообщением об ошибке.
    Впрочем, я уверен, обо всём этом уже тысячу раз написали до меня.

  185. UPnsuper:

    : Так вот почему у них педали с таким трудом нажимаются!

  186. UPnsuper:

    Всё равно никто не прочитает срач простынками, разгоревшийся в этом посте, а мнение со стороны получить хочется.
    Итак, уважаемые дев-подблогеры, была дана задача – написать в блокноте функцию, проверяющую корректность расстановки скобок трёх типов в строке (например, математическом выражении).
    Решение1: http://pastebin.com/taXzppnr
    Решение2: http://pastebin.com/qFaiZjWX
    Как по-вашему, по какой из ссылок код более индусский?

  187. Zzzer:

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

  188. Zzzer:

    : да оба 🙂 но первый понять легче в разы

  189. AylaTa:

    Не родился ещё богатырь, способный перепростынить ТинПу.

  190. AylaTa:

    Но -у – респект и уважуха )

  191. UPnsuper:

    : Ну так можно договориться и до того, что циклы – неконтролируемое изменение потока выполнения.
    goto – неконтролируемое произвольное изменение потока выполнения; исключения – прекращение текущего потока выполнения и _возврат_ на тот уровень, где мы знаем, что с этим исключением делать.

  192. UPnsuper:

    : Простыни -а были длиннее моих.

  193. AylaTa:

    Кстати, касаемо содержания поста — исходя из личного богатого опыта собеседований, могу сказать, что:

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

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

    А вообще, я бы порекомендовал автору попробовать себя в другом виде деятельности, определённо талант пропадает зря.

  194. Zzzer:

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

  195. UPnsuper:

    :
    > прекращение и возврат это не изменение потока?

    Изменение, но не просто “перешли куда-то”, а “вылетели на тот уровень, где можем обработать произошедшее”.

  196. Zzzer:

    : в определенных ситуациях этот твой “уровень, где можем обработать произошедшее” == “куда-то”

  197. UPnsuper:

    :
    > самое адекватное, на мой взгляд, это когда после вопросов по твоему резюме тебе предлагают небольшое тестовое задание, и делать его не прямо тут, в офисе, а дома;

    Ну это тоже как вариант.

    > но и в вопросах этих нет ничего криминального, это фильтр на отсеивание неадекватов и выскочек, которые много о себе мнят.

    Т.е. если на вопрос про “value++ + ++value” ответил “за такой код надо отрывать руки” – то выскочка? 🙂

    > для этого и существует испытательный срок.

    Но он же не оправдывает полное отсутствие фильтров на собеседовании.

    > А вообще, я бы порекомендовал автору попробовать себя в другом виде деятельности, определённо талант пропадает зря.

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

  198. Zzzer:

    : в госдеп сша обращался уже, или собеседование не прошел?

  199. UPnsuper:

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

  200. UPnsuper:

    : Только если целенаправленно использовать исключения в виде альтернативы goto.
    Ну типа там всё, что после метки – вынести в отдельную функцию; кидать специальные исключения, в которых будет указано, какую функцию позвать; а обрабатывать все эти исключения в одном месте. Ну типа
    private static void Process(Action action) { try { action(); } catch(GoToException e) { Process(e.goto); }
    public static void Main() { Process(doSomething); }

    Но и микроскопом можно дрожжи в унитазе размешивать.

  201. Zzzer:

    : ок! ты классный!

  202. AylaTa:

    : если на вопрос про “value++ + ++value” ответил “за такой код надо отрывать руки” — то выскочка? 🙂

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

    Про полное отсутствие фильтров я и не говорил. Просто полной картины ты не составишь. Ну и понятно, что бывают совсем очевидные вещи, которые однозначно сигнализируют о том, что нуегонах — например, когда ты приходишь на собеседование в IT-отдел немаленького завода, в котором в 15-метровой комнатёнке ютятся 6 человек.

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

  203. UPnsuper:

    :
    > например, когда ты приходишь на собеседование в IT–отдел немаленького завода, в котором в 15–метровой комнатёнке ютятся 6 человек.

    О, кстати, хотел спросить, сирани опенспейсы – это типа сейчас норма? А то куда ни пойду, все сидят в одном ангаре с перегородками по грудь.

    > а потом через два месяца выяснится, что либо зарплату в конторе не платили уже четыре месяца

    Ну против этого есть трудовой договор 🙂

  204. AylaTa:

    : мы в замкадье не знаем, что такое опенспейсы. Где получилось помещение снять — там и офис.

    Ну против этого есть трудовой договор

    Он-то есть, но время уже потеряно.

  205. UPnsuper:

    : Вот релевантная ссылка: http://en.wikipedia.org/wiki/Cubicle

  206. AylaTa:

    : ну я уже догадался, но ничего похожего не видел. Может, где-то и есть.

  207. UPnsuper:

    : А мне что-то только такие и попадаются сейчас…

  208. Eiler:

    : а… я по уже автоматической привычке написал через пробелы.

  209. Sukon:

    : Не было такого в GoF, перечитай.

  210. Sukon:

    : > Конечно, стоит сделать специальное AbstractBracketsErrorException, от которого унаследовать те три конкретных.

    НУ КОНЕЕЧНО ЖЕ!

    Спасибо, смеялся до слёз.

  211. Sukon:

    : Да я бы его фотографию развесил на всех столбах, как в вестернах, только вместо WANTED было бы DO NOT WANT.

  212. Sukon:

    : Первый понятен, второй я, если честно, не дочитал.

  213. Sukon:

    Засабмитил в TheDailyWTF.

  214. UPnsuper:

    : Решил на всякий случай свериться с википедией.
    Chapter 2 is a step-by-step case study on “the design of a ‘What-You-See-Is-What-You-Get’ (or ‘WYSIWYG’) document editor called Lexi.” (pp33)

  215. UPnsuper:

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

    1) Класс Brace. По сути, вместо него можно было бы использовать и Tuple, но писать вместо этого Brace – гораздо понятнее. Зачем вообще нужен этот класс? Ну у нас всё-таки по логике действительно имеется описание скобочной пары, было бы вполне логично оформить эту сущность именно в таком виде. Да и вообще, кому помешает один лишний _приватный_ класс?

    2) Аж целых три разных private константы (в коде их две). По сути, отличие тут только в том, что в каждой из своих двух констант явно перечисляет все возможные символы скобок; такое дублирование усложняет поддержку кода, потому что теперь разработчикам надо поддерживать в актуальном состоянии сразу два списка, и контролировать их соответствие друг другу. У меня же обе эти константы формируются по единому источнику (для чего и нужен был класс Brace).

    3) char[] вместо char. Это, возможно, действительно лишнее; но с другой стороны, никому не помешает, а код практически не удлиняет (ну сколько там, десяток символов добавился?)

    4) Исключения. Это уже дело вкуса; для меня стандарт, что функция “проверить” должна кидать исключение в случае неудачи проверки; же не делает разницы между функциями “проверить” и “является ли”. Разработчику, использующему функцию , надо будет ещё заглянуть в документацию, потому что не так уж очевидно, чему соответствует true, а чему – false.

    5) Конкретные классы исключений. ОК, в случае с факториалом идеи “а вдруг мы захотим переключаться между алгоритмами” были надуманными. Тут же без всяких “а вдруг мы захотим” – где вообще может понадобиться такая функция проверки? Вероятно, для проверки пользовательского ввода. Далее, как мы собираемся отлаживать эту функцию? То есть, практически наверняка снаружи понадобится знать, почему же именно не подошла эта строка. Не понадобилось – и хорошо; но, скорее всего, понадобится.

    6) “Оптимизация” логики. в своём стремлении к экономии строчек, во-первых, засунул проверку двух совершенно разных условий, говорящих о совершенно разных вещах, в один if – это, опять же, усложняет поддержку кода. Что гораздо хуже, у проверка условия в if имеет сайд-эффекты. За такое надо расстреливать на месте. Опять же, условия с сайд-эффектами (в целом – в этом конкретном месте, может быть, это проявляется и не так сильно) усложняют поддержку кода.

    7) Code style. Конечно, можно легко сэкономить строчки, отказавшись от фигурных скобок и переводов строки в условных операторах (даже если у нас там несколько if … else if … else if подряд). А можно вообще убрать все переводы строки, и код будет в одну строчку, но кому нужен такой код? Опять же, усложнение поддержки кода.

    Уже по четырём пунктам код от поддерживать гораздо сложнее; фактически, используются практики “уместить код в как можно меньшее число строчек, и плевать на тех, кто будет это читать после меня”.
    А в чём сложности с поддержкой моего кода?

  216. Sukon:

    : Это только глава 2, или ты дальше не осилил прочитать? Тогда больше вопросов не имею.

  217. UPnsuper:

    : Извини, последний раз я читал очень давно, и сейчас уже не осилю восстановить для тебя по памяти точное содержание каждой главы.
    Тем не менее, кажется, кто-то здесь сел в лужу. И это был не я:
    > Не было такого в GoF

  218. Sukon:

    : Нет, ты.

    > PS: В GoF, помнится, текстовый редактор писали.

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

  219. Ht7Milk:

    то есть вы говорите, что и как программист – говно? вот это новость

  220. UPnsuper:

    :
    > Это был всего лишь один из примеров в одной из глав.

    Что никоим образом не меняет моё утверждение.

  221. Akref:

    лол, это же пацан с ноутбуком, все ясно

  222. Ltsre:

    : и с халупой в пушкино.

  223. Sukon:

    : Ты сказал это так, как будто только текстовый редактор там и писали.

  224. UPnsuper:

    : Нет, не так.

  225. Q_nMega:

    нихуя_не_понял.жпг

  226. Peeef:

    : Вот так, в невзрачной квартире бизнес-класса, за скромным лаптопом бизнес-класса, из под пальцев творца рождается прекрасный код бизнес-класса!

  227. UPnsuper:

    : Любопытно, что “бизнес-классовость” и квартиры, и кода – чисто твоя выдумка.

  228. Ltsre:

    : тинпушечка живет по принципу “последний комментарий всегда за мной”

  229. UPnsuper:

    : Ну а в таком случае живёт по принципу “побегать за тинпушечкой по всем блогм, чтобы в каждом посте оставить свой ёмкий комментарий”.

  230. Ltsre:

    : воот, тинпушечка даже не отрицает )

  231. Ltsre:

    : зайчик, я на эту блогу подписан был еще до твоего прихода на блогу.

  232. UPnsuper:

    : На БДСМ-блогу, надеюсь, тоже подписан?
    Бери пример со -а, тот хотя бы по теме говорит что-то, а ты только какашками безосновательно кидаешься 🙂

  233. Ltsre:

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

  234. Sukon:

    : Ладно ладно, последний комментарий за тобой.

  235. UPnsuper:

    : Чья же тогда?

  236. Peeef:

    : Это очень важный вопрос. Давай выясним!

  237. UPnsuper:

    : Это твои проблемы.

  238. Peeef:

    : Тогда я не буду выяснять. Можно?

  239. Ltsre:

    : в принципе, надо в постах открывать тотализатор – оставит ли тинпушечка комментарий или нет.

  240. Peeef:

    : Лучше просто соревнование “Заткни ТинПу – международная лига”.
    Словесные схватки транслируются по цетральным каналам, прерываемые навязчивыми рекламами, спортивные комментаторы орут, публика неистовствует… Это ж целая индустрия была бы!

  241. Hsvhlam:

    : проходит во второй тур с незамеченным комментарием, а всерьёз намерен взять суперкубок в этом сезоне!

  242. UPnsuper:

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

  243. Akref:

    : формат данного бложика не совсем подходит вашей беседе, предлагаю создать ветку обсуждения в http://www.0chan.ru/c/ изложить там проблему(скобки), варианты решения и конструктивно обсудить.

  244. UPnsuper:

    Кстати, если уж приводить эзотерические примеры вроде value++ + ++value – гораздо ближе к жизни следующие грабли:
    ===
    foreach(var action in actions) {
    ThreadPool.QueueUserWorkItem(state => action());
    }
    ===

Добавить комментарий