теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить.
Пожалуй сам и начну.
Задача 1. Уровень Mid Developer Java/C#
Напишите программу, выводящую на экран Ваше имя.
Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
Собеседование — это не экзамен в советском институте. Собеседование — это встреча серъезных людей, занятых делом.
Можно собеседование потратить с пользой, поговорив об опыте гостя и характере стоящих задач в компании, а можно потратить время впустую.
Давать задачки, это самый бестолковый способ потратить ценное и очень ограниченное время.
Нужно поговорить об опыте человека, что он умеет, чем он занимался, чем он хочет заниматься, в каком направлении хочет развиваться. Представить компанию, описать задачи, менталитет коллектива. Каждая из сторон должна сообщить о себе комплексную и разнородную информацию, чтобы сложилось впечатление, на основании которого обе стороны будут принимать решение.
Конкретные задачи сможет решить либо человек, который к ним готовился, либо человек, по случайному стечению обстоятельств занимавшийся ровно этим на прошлой неделе. Позволю себе предположить, что готовиться к решению задачек будут люди, которым позарез нужна работа, а люди, прекрасно себя чувствующие на рынке труда, не будут заниматься ненужным и неоплачиваемым делом. Поэтому такой подход сработает в обратную сторону, отфильтруя наиболее полезных людей.
Мне случалось тоже бывать на таких собеседованиях. Дали задачку, решил, обсудили ее, дальше люди делают предложение. А как мне его принимать? Потратили два часа на задачу, ничего не рассказали о себе, не познакомили с коллективом, не сверили часы на тему cultural fit. Пришлось сказать "нет". А как соглашаться работать с людьми, о которых я ничего не знаю (кроме того, что не умеют грамотно проводить собеседования)?
Здравствуйте, gandjustas, Вы писали:
G>Слушай, скажи как тебя зовут. Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
G>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
G>Или ты просто троллишь?
Просто одного из этих ребят
, контуженных в юности адресной арифметикой и массивами, допустили к собеседованиям.
Кодеры-задроты на марше, это печалька.
Здравствуйте, Сонный Программист, Вы писали:
СП> Собеседование — это не экзамен в советском институте. Собеседование — это встреча серъезных людей, занятых делом.
"экзамен это беседа двух умных людей. а если один из них дурак? тогда другой лишается стипендии" (с)
СП> Можно собеседование потратить с пользой, поговорив об опыте гостя и СП> характере стоящих задач в компании, а можно потратить время впустую.
это возможно только если у вас один кандидат в пол-года. даже если собеседовать одного кандидата в неделю, то это ухлопать кучу времени, особенно, если собеседовать его будете не только вы, а еще пара-тройка человек. таким образом, к собеседованию на подобные темы имеет смысл подходить только при высокой вероятности победы. в противном случае вы быстро обнаруживаете, что кандидат или опаздывает или вообще исчезает. ваш график летит к черту. а вам по хорошему нужно самому к собеседованию подготовится.
короче, нужен входной фильтр.
СП>Давать задачки, это самый бестолковый способ потратить ценное и очень ограниченное время.
даже журналистов и прочих литераторов на приеме просят что-то быстро набросать на бумаге. типа вот жил человек по имени вася. в него врезался автомобиль. васе хоть бы хны, водитель тоже не пострадал, а вот ребенок на заднем сиденьи вылетел сквозь лобовое на встречную полосу. вам дают минут пять десять, чтобы придумать заголовок и уложить эту новость в абзац.
вам не кажется, что интервью без вопросов это как постель без секса?
СП>Нужно поговорить об опыте человека, что он умеет, чем он занимался, чем он хочет заниматься,
ответ стандартый. умею X, Y, Z. сталкивался с M, K, L. но это как бы не вопрос, потому что я способный и быстро учусь.
> Представить компанию, описать задачи, менталитет коллектива.
да-да, сразу весь сор из избы. вы, случайно, не в гербалайф нанимаете? очень, знаете, похоже.
СП> Конкретные задачи сможет решить либо человек, который к ним готовился, либо человек,
не делайте мне мозги. обратить список должен каждый человек. это вообще задачка для юнных математиков. тут даже языков программирования знать не нужно.
СП> Позволю себе предположить, что готовиться к решению задачек будут люди, которым позарез нужна работа,
в гугле меня пугали интервью и дали готовится две недели (или одну? нет, кажется все-таки две). интересно, подумал я, как я буду готовится, когда у меня и на своей работе дел по горло. и что вы думаете? стали задавать такие вопросы, которые выводятся число логически из самых общих соображений. хотя я им сразу ответил, что готовится не собираюсь, т.к. мне просто интересно испытать себя. если вопрос из моей области, то неответ будет позором. если из перпендикулярных плоскостей, то мне и готовится не надо, т.к. в этом случае им нужен не я, а кто-то другой.
СП> а люди, прекрасно себя чувствующие на рынке труда, не будут заниматься ненужным и неоплачиваемым делом.
если на собеседовании предлагают написать маленький http-сервер (и ведь предлагают же, судя по статьям в иннете), то его и писать не надо, т.к. он уже готовый есть (например, в том же питоне в стандартной поставке). а если писать все-таки надо, то с рабочим сервером устаивается на работу нет мазы, лучше двинуть его на рынок. кстати, работодатели, дающие такие задачи, не в состоянии ответить на элементарный вопрос: сформулируйте список требований к серверу и обоснуйте чем вам не подходят уже существующие.
СП> А как соглашаться работать с людьми, о которых я ничего не знаю (кроме того, что не умеют грамотно проводить собеседования)?
это уже другой вопрос.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Напишите программу, выводящую на экран Ваше имя. ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
Пойдет?
программа Имя
Имена: массив строк = {Иван, Алексей, Юрий, ...}
начало
цикл Индекс от 1 до Имена.КоличествоЭлементов
печать "Ваше имя ", Имена[Индекс], "? (Да или Нет)"
цикл пока
читать Ответ
если Ответ = "Да" то начало
печать "Ваше имя: ", Имена[Индекс]
выходизпрограммы
конец если
иначе если Ответ = "Нет" то
выходизцикла
иначе
печать "Ответ не верный, введите правильный ответ (Да или Нет)"
конец цикла пока
конец цикла
печать "Ваше имя не известно системе"
конец
Здравствуйте, мыщъх, Вы писали:
М>как бы x & (x — 1) проверка на то, что x это степень двойки. если поменять минус на плюс, то получим проверку, что следующее за x число это степень двойки, а сама x это битовая маска из единиц. это в том случае если результат равен нулю. все остальные случаи мы приравниваем к true.
Все же x & (x — 1) — это обнуление младшего единичного бита, как и x & (x + 1) — обнуление группы единичных битов, начинающихся с нулевой позиции. Проверка на степень двойки — уже следствие. Так что Паблик Морозов все верно сказал.
Вообще, основная цель задачек на собеседовании — оценка стиля мышления кандидата: склонен ли он к анализу, умеет ли строить логические умозаключения, последователен ли в решении проблем, его степень ассоциативности. Попутно можно многое узнать о его бекграунде (не все знакомы с простейшими структурами данных, не говоря уже про "большое О") и общем кругозоре. В идеале, для решения должно быть достаточно базовых знаний, а самих решений должно быть несколько (компромиссных), чтобы можно было завязать содержательную беседу. Желательно также, чтобы задача не была слишком известна; например, можно взять что-нибудь из внутреннего проекта и слегка упростить/изменить.
Рассмотрим несколько проблем, упомянутых в соседней ветке.
1. Реверсирование односвязного списка. Задача действительно элементарная, требующая понимания двух вещей — указателей и структуры "односвязный список". Никаких хвостовых рекурсий и прочих выводов знать не требуется, достаточно нарисовать несколько прямоугольников со стрелками (для некоторых нужно две схемы — начальное состояние и промежуточное), после чего решение становится очевидным, а код пишется с картинки. Вполне может выступать для отсеивания полных идиотов, не умеющих рисовать Впрочем, есть нюансы. Если кандидат выдает решение без схем, то, скорее всего, он его вызубрил. Проверяется предложением объяснить ход мыслей. С другой стороны, кандидат, выдающий решение как у gandjustas скорее всего overqualified, и либо "выпендривается", либо любит усложнять без надобности.
2. Выборка N случайных элементов массива. Тут фильтр серьезнее. Решения на shuffle и сортировке по случайным ключам достаточно очевидны, но появляется возможность поговорить о сложности, требованиях к ГСЧ и пр.
Есть решение "в лоб" — выбирать случайный элемент по одному и проверять не выбран ли он уже. Тут вопросов еще больше
Решение, указанное gandjustas выдать весьма не просто, если не знать его принцип, но после небольшой подсказки (использовать теорию вероятностей) оно находится простейшим мозговым брутфорсом. Однако, для доказательства корректности этого решения базовых знаний тервера может не хватить.
Кода больше, чем в предыдущем случае, и это максимум по объему, что можно требовать написать, имхо.
3. Нахождение максимальной общей подпоследовательности. Имхо, такие вещи спрашивать на собеседовании бесполезно. Человек, знающий о существовании динамического программирования алгоритм сформулирует с высокой вероятностью, не знающий — вряд ли переизобретет велосипед. Кода много, он весьма наворочен, так что возникнут проблемы с проверкой его корректности, в результате времени будет потрачено много, а результатов достигнуто мало.
Нужно помнить, что для проведения подобных собеседований сам интервьюер должен обладать всеми вышеперечисленными качествами и быть готовым самому на время стать собеседуемым, иначе можно сесть в лужу. Например, когда кандидат выдаст неординарное решение. И, чем сложнее задача, тем риски выше.
Также есть вакансии на которые мыслящий работник не нужен (быдлокодерство по разжеванным требованиям). В этом случае задавать задачки — терять время.
Здравствуйте, gandjustas, Вы писали:
G>Форумный болтун это ты, а я партнер, выход на начальство твое есть обучение консультантов проводил.
Ну да, еще среди наших патнёров — клининговая компания, которая в офисе убирается, её мнение по вопросам рекуртинга для нас тоже очень важно.
G>Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают?
Оно показывает идиот человек или нет. Я еще ни разу не встречал нормального программиста, который бы был не в состоянии решить такую простую задачу.
G>Не говоря уже шапках и гномах.
Аналогично.
G>Тебя вообще вредно допускать к собеседованиям после такого тут
Офигенная задача. Видишь, как много она показывает:
— умение понять что же надо сделать (что мыщъх сделал намного лучше меня, видимо из него бы получился хороший консультант-аналитик или постановщик)
— умение провести исследование, найти закономерности, понять и их смысл (вообще, поиск закономерностей — это стандартная задача теста на IQ, так у детей в детском саду уровень развития интеллекта определяют)
— умение декомпозировать задачу и сложить решение из готовых блоков
— наличие системного подхода к решению задач, состоящих из более, чем одного действия
). Т.е. то, из чего состоит любой успешный проект по внедрению Microsoft Dynamics CRM, да и вообще решение любой задачи. Плюс, задача требует понимания важности всех этапов, их взаимосвязи и системного подхода к ним. Смог бы я решить задачу, если бы мыщъх не выполнил бы корректную постановку (моя собственная была некорректной, я бы изначально стал решать задачу неправильно)? Смог бы я её решить, если бы не выполнил исследование битовых операций или ошибся при исследовании? Т.е. четвертым пунктом эта задача проверяет наличие качеств, необходимых менеджерам проектов.
При этом на всём протяжении можно общаться с кандидатом, давать подсказки (например, спросить что значит x & (x — 1), что значит x & (x + 1), в чем разница), запутывать и провоцировать (что, например, мыщъх делал здесь: http://www.rsdn.ru/forum/job/4633807.1.aspx
Короче, не знаю, где мыщъх раскопал эту задачу, но она просто великолепна. Единственная проблема в том, что это действительно серьезная задача, рассчитанная на инженеров, и она может оказаться сложноватой для обчитавшейся msdn прокладки между пользователем и sharepoint-ом, гордо именуемой майкрософт сертифиед профешшионал девелопер.
G>Это пример эпического дрочева на хакерские приемы, которые не имеют никакого отношения к реальной разработке.
Накакого дрочева, только системный подход и ориентированность на результат (еще раз напоминаю, я никакой не хакер, этот ваш Hacker Delight не читал и на оссёмблере со школы не программировал).
Здравствуйте, landerhigh, Вы писали:
L>Ты будешь смеяться, но у меня в резюме практически так и написано. На поток желающих предложить очередную "once in a lifetime opportunity" никак не повлияло, надмозгов с гномиками, сортировками, недо-брайнбенчами и прочей ересью как отрезало.
Ну да, ни одна приличная контора таких капризных девочек приглашать не станет, потому что следующей предьявой будет "отказываюсь тестировать свой код", "отказываюсь приходить на работу вовремя" или что он там еще откажется делать.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, gandjustas, Вы писали:
G>>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
SVZ>Задачи действительно высосаны из пальца. Хотя полно проектов, где и их надо решать.
"Полно" это что-то около 0.001%
SVZ>Но если кандидаты даже такое задание не могут решить, то как им доверишь что-то сложнее?
Разворот списка — сложная задача, как и множество других, несмотря на простой код решения.
Здравствуйте, ArtemGorikov, Вы писали:
ПМ>>Ну да, ни одна приличная контора таких капризных девочек приглашать не станет, потому что следующей предьявой будет "отказываюсь тестировать свой код", AG>Нанимай тестеров
На программистов, которые думают, что ответственность за качество кода лежит на тестеров, я бы предпочел вообще не тратить ни минуты времени.
ПМ>>"отказываюсь приходить на работу вовремя" AG>За обоздание на 2 минуты штраф 2 доллара, норма выработки баго-форм в день?
И на тех, которые не понимают зачем приходить на работу вовремя — тоже. Вообще не представляю, как взрослый человек может быть настолько инфантильным и безответственным.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, ArtemGorikov, Вы писали:
ПМ>>>Ну да, ни одна приличная контора таких капризных девочек приглашать не станет, потому что следующей предьявой будет "отказываюсь тестировать свой код", AG>>Нанимай тестеров
ПМ>На программистов, которые думают, что ответственность за качество кода лежит на тестеров, я бы предпочел вообще не тратить ни минуты времени.
Так ты сам таких программистов придумал. Какие-то предъявы сам себе сочинил. Рановато тебе собеседования проводить, рановато.
ПМ>>>"отказываюсь приходить на работу вовремя" AG>>За обоздание на 2 минуты штраф 2 доллара, норма выработки баго-форм в день?
ПМ>И на тех, которые не понимают зачем приходить на работу вовремя — тоже. Вообще не представляю, как взрослый человек может быть настолько инфантильным и безответственным.
А что, для программистов апофеозом ответственности нынче считается быть на работе ровно в девять нуль-нуль, гладко выбритым и в костюме с галстуком?
Здравствуйте, StandAlone, Вы писали:
SA>Просто одного из этих ребят SA> SA>, контуженных в юности адресной арифметикой и массивами, допустили к собеседованиям.
Нормальные ребята на картинке, что не так? А что до контузии адресной арифметикой — чай программистов нанимаем, а не варщиков творога.
M>"Есть несколько альтернативных дизайнов раббиения функционала на модили и их взаимодействия. По каким критериям вы будете сравнивать между собой разные дизайны?"
1. предполагаем ли мы реюзать этот код? или это местная подсистема, которую снаружи точно никто не будет использовать?
код, конечно, надо стараться писать общим, но часто написание общего кода требует слишком много усилий, и проще написать частный
2. определить моменты, подобные п.1 и тем самым яснее очертить ситуацию -- т.е. скорректировать веса критериев
на самом деле, попытка постороить это в систему это моя уступка твоему странному (с моей точки зрения) системному подходу; я считаю, что тут не то что веса корректировать надо, а реальная ситуация может что-то существенное добавить или убрать полностью
3. теперь сами критерии:
четкость разграничения ответственности с внешними программистами или пользователями системы
возможность отдать часть работы программистам широкого профиля (не обладающими спец. знаниями)
наличие готовых исходников
сложность отдельных частей и живучесть системы после глюка в одной из них
минимальная зависимость одних частей от других (оптимально, если каждая часть универсальна)
возможность выразить универсальность модулей в рамках с++ (или другого языка)
ресурсы: быстродействие, память, ...
Здравствуйте, gandjustas, Вы писали:
G>Ты разве не понял что я могу подобрать задачи, которые ты на собеседовании не решишь. Даже с подсказками. G>После этого назову тебя идиотом. Только с твоими навыками это никак не коррелирует.
Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код. Если задача обращения списка кажется программисту слишком сложной, то он явно чем-то не тем занимается. Доверять разработку такому человеку мне бы не хотелось.
G>Решение задачи манипуляции с битами показывает только умение решать задачи манипуляции с битами и больше ничего
Я уже очень подробно расписал, что она показывает, опровержений по сути нет, лишь повторение одной и той же мантры. Но если у тебя уж совсем с соображалкой туго, замини слово "биты" словом "майкрософт сертифиед профешшионал девелоперы" и задача будет показывать умение решать задачи манипуляции с майкрософт сертифиед профешшионал девеловерами.
Кстати, в решении задачи я облажался, но не в месте манипуляции с битами, уже одно это умному человеку скажет, что эта задача — больше чем манипуляция с битами.
G>А вот на товарища мыщъх ты зря ссылаешься. Потому что он не инженер-разработчик , а исследователь-реверсер.
Я тоже не разработчик. И, как выяснилось, 9 из 10 сеньёр-разработччиков — это просто зубрилки, которые выучили какую-то справочную информацию, но мозгов у них от этого не прибавилось и задачи они решать не научились. В эпоху интернета знание справочной информации не представляет никакой ценности — любая доступна в течение нескольких секунд. Ценен только интеллект.
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, мыщъх, Вы писали:
М>>речь не про это. чисто для разминки мозгов мне задачка показалось интересной (задачу придумал не я), но во-первых, это она мне интересна, потому что я вообще люблю с битами перепихиваться
M>Как такой вопрос: быстрая реализация BSF для uint64_t на C, без ассемблера?
быстрая -- это на собеседовании? тогда я пас. без профайлера даже из готовых решений под конкретный ЦП не скажу что будет быстрее, особенно если ЦП с несколькими ядрами и молотит кучу задач.
чисто алгоритмически берусь решить за листке бумаги на паскале или питоне. но это будет тормоз. над быстрой реализацией надо медетировать и курить траву с лоером напару, потому как под это дело выдан патент и задача сводится к известному анекдоту про ответ девшуки клерку "я, конечно, могу сказать как получила продвижение по службе, только вам это навряд ли поможет".
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, gandjustas, Вы писали:
G>>Твое желание чтобы соискатели на собеседовании решали такие задачи — каприз, не подкрепленный необходимостью.
ПМ>Пока практика показывает, что это самый действенный метод отсеять людей, которые не умеют программировать.
Это твоя практика, хотя с чего ты взял что они не умеют?
G>>Уверен что они были более сложные? Может они просто более неизвестными тебе были? ПМ>Да, уверен.
Я уже писал что есть склонность преувеличивать сложность незнакомых задач и преуменьшать сложность знакомых.
Здравствуйте, minorlogic, Вы писали:
>>> Другими словами решение проблемы а не ее усугубления?* М>>а решения проблемы нет. во всяком случае в такой постановке вопроса. "ты скажи мне что те нужно, я те дам, что ты хошь" M>Тогды совсем не сеньер. "Моя хата с краю" это позиция в никуда
Вот там в другой ветке об этом написали хорошо:
Первое что мне сказали когда я пришел в IBM — Do not think, do ask.
Я бы сразу задал вопрос — устраивает ли решение из STL. Умные задают дополнительные вопросы — дураки сразу "понимают".
Знаменитая история. Джоел спольски любил задавать вопрос — нарисуйте дом. Вы рисуете квадратик с шапочкой, может даже окошком и дверцей. И когда закончили, Спольски говорил — да, совсем забыл. Домик-то для двуголовых жирафов. Что, размеры не те? чего не уточняли? все, до свиданья.
У меня исходная задача тоже вызвала массу вопросов. Бросаться чего-то писать не прояснив что это и для чего — самый плохой способ, в сложных проектах потом так и делают — сначала что-то накодят, потом разбираются "а надо-то было не так... эх.. не поглядели.. не спросили...".
Здравствуйте, gandjustas, Вы писали:
G>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Задачи действительно высосаны из пальца. Хотя полно проектов, где и их надо решать.
Но если кандидаты даже такое задание не могут решить, то как им доверишь что-то сложнее?
Здесь нет ничего из rocket science. Просто сесть, подумать и написать. И то не справляются, как выяснилось.
2 П.Морозов: Есть еще одна идея. Спроси кандидатов, какую литературу они читают (техническую)? Может быть весьма показательным.
_____________________
С уважением,
Stanislav V. Zudin
Послушайте, зачем вы вообще ЭТО спрашиваете у кого-то? Вы СЕБЕ ищите людей с которыми ВАМ потом работать и за произведения которых ВАМ отвечать. Перестаньте обращать внимание на высокомерных супер-сениор программистов местных, минута рабочего времени которых стоит 100$ минимум. Они вам не помогут — для них самое лучшее собеседование означает выслушивание их зарплатных ожиданий и сразу выданое согласие платить им все что они хотят и премию каждый месяц в размере оклада.
Я как то предлагал подобным людям писать в своем резюме — "отказываюсь отвечать на вопросы про прикладное программирование на собеседовании и решать каки-либо задачки". Но как-то не нашлось в их душах согласия с этой позицией.
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить. ПМ>Пожалуй сам и начну. ПМ>Задача 1. Уровень Mid Developer Java/C# ПМ>Напишите программу, выводящую на экран Ваше имя. ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить.
Да просто поговорите с человеком, чем занимался, какие задачи решал, почему именно так, а не иначе, с какими трудностями столкнулся, что по его мнению было сделано правильно, а что нет.
Напишите сами код с разными граблями типа виртуальных деструкторов и функций, генерируемых по умолчанию (это для С++, думаю в С# своих граблей хватает), попросите рассказать что тут не так.
Распечатайте листинг своего реального кода, спросите мнение (только не обижаться на критику ).
Опишите недавнюю реальную задачу, попросите рассказать, как бы кандидат подошел к ее решению.
Если кандидат вдруг впал в ступор и что-то "тупит", не стесняйтесь помочь, задать наводящие вопросы.
Если человек не гуру собеседований, он наверняка будет волноваться и переживать, что он "тупит".
Задачи вроде обращения списка очень легко решаются на "холодную" голову и могут быть проблемой даже для сообразительных людей без опыта собеседований.
Отбирая людей чисто задачками, рискуете нанять человека далекого от практики и/или работы в коллективе, который просто заучил типовой набор "100 задач от Микрософта".
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить.
ПМ>Пожалуй сам и начну.
ПМ>Задача 1. Уровень Mid Developer Java/C#
ПМ>Напишите программу, выводящую на экран Ваше имя.
ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
Слушай, скажи как тебя зовут. Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
Здравствуйте, gandjustas, Вы писали:
G>Слушай, скажи как тебя зовут. Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
G>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
G>Или ты просто троллишь?
Вообще(безотносительно набижавших в этот раздел унылых троллей), про задачи на собеседованиях.
Мне как-то дали задание написать веб-сервис, которому скармливается строка, затем эта строка обрабатывается асинхронно вторым потоком(разбивается по заданным токенам), и затем результат выводится в Вин-Формс клиенте.
Дали студию и пару часов на выполнение. Сделал за полчаса,код никто обсуждать не стал, просто оставил проект.
Искали сеньора.
Через день позвонили и спросили, когда выйду на работу.
Так-то!
Здравствуйте, мыщъх, Вы писали:
М>как бы x & (x — 1) проверка на то, что x это степень двойки. если поменять минус на плюс, то получим проверку, что следующее за x число это степень двойки, а сама x это битовая маска из единиц. это в том случае если результат равен нулю. все остальные случаи мы приравниваем к true.
Ну вот, поскольку ты ответ знаешь, а не думал над ним, то назвал ровно половину ответа. Да, если x = 2 ^ n — 1 (число из единиц), результат станет равным нулю (будут занулены все биты до младшего нуля, т.е. все биты числа). Если нет — то именно как я написал. Аналогично x & (x — 1) очищает младший установленный бит, соответственно возвращает 0 если x = 2 ^ n, т.к. у такого числа установлен всего один бит.
Вообще, всякие x +- — по сути циклы с условиями (carry-бит двигается в цикле пока биты установлены, borrow — пока сняты, сами биты в результате движения устанавливаются/сбрасываются), */ 2 — безусловный сдвиг всех битов влево/вправо, and/or/xor — условное снятие/установка бита на фиксированной позиции. И после того, как ты абсолютно верно нашел решение задачи: M>мы начинаем двигать самый младший бит влево до тех пор, пока на следующей позиции не окажется нуль
остаётся только понять, как собрать его из этих кубиков. Для этого декомпозируем задачу дальше:
Что значит двигать бит? Это значит надо его найти, извлечь, сдвинуть (операцией сложения), восстановить сброшенные биты, кроме крайнего правого (его мы "двигаем")
Для поиска: обнулим и сделаем xor.
обнуляем твоей "проверкой на степень двойки":
reset_lsb = x .&. (x — 1) // например 10110 станет равным 10100.
извлекаем:
extract_lsb = reset_lsb `xor` x // из 10110 и 10100 получили 10
"начинаем двигать самый младший бит влево до тех пор, пока на следующей позиции не окажется нуль":
move_lbs = x + extract_lsb // 10110 + 10 = 11000
устанавливаем биты, которые сбросились в процессе "движения":
result = move_lbs .|. reset_lsb // 11000 | 10100 = 11100
или в одну строчку:
result = (((x .&. (x — 1)) `xor` x) + x) .|. (x .&. (x — 1))
Вот решение для ближайшего большего, собственно. Вполне адекватная задача для собеседования при условии, что человеку будут даваться подсказки и что он умеет обращать списки. Сформулировал задачу, как это сделал ты — пол решения. Разобрался, как работает сложение/вычитание на уровне битов — еще четверть . Собрал решение из готовых блоков — заключительная четверть. Никаким хакером для решения этой задачи быть не надо, лично я — даже не программист, а деплоймент-инженер.
Здравствуйте, gandjustas, Вы писали:
G>Слушай, скажи как тебя зовут.
Стасик.
G>Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
Думаешь они станут слушать какого-то форумного болтуна?
G>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
Чтобы отделить тех, кто самостоятельно могут решать задачи от обычных зубрилок, которым нельзя давать в руки ничего сложнее техзадания на размещение кнопочек на форме.
Здравствуйте, Паблик Морозов, Вы писали:
G>>Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям. ПМ>Думаешь они станут слушать какого-то форумного болтуна?
Форумный болтун это ты, а я партнер, выход на начальство твое есть обучение консультантов проводил.
G>>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать? ПМ>Чтобы отделить тех, кто самостоятельно могут решать задачи от обычных зубрилок, которым нельзя давать в руки ничего сложнее техзадания на размещение кнопочек на форме.
Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают?
Не говоря уже шапках и гномах.
Тебя вообще вредно допускать к собеседованиям после такого тут
Вполне адекватная задача для собеседования при условии, что человеку будут даваться подсказки и что он умеет обращать списки. Сформулировал задачу, как это сделал ты — пол решения. Разобрался, как работает сложение/вычитание на уровне битов — еще четверть.
Это пример эпического дрочева на хакерские приемы, которые не имеют никакого отношения к реальной разработке.
Никаким хакером для решения этой задачи быть не надо, лично я — даже не программист, а деплоймент-инженер.
Самое главное что ты на этой картинке справа
Кстати: максимальная подпоследовательность в силе. Дерзай. Ниче сложного в ней нет, код на 10 строк примерно. Покажи что ты понимаешь что-либо за пределами того что знаешь.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, gandjustas, Вы писали:
G>>Ты разве не понял что я могу подобрать задачи, которые ты на собеседовании не решишь. Даже с подсказками. G>>После этого назову тебя идиотом. Только с твоими навыками это никак не коррелирует.
ПМ>Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код.
Кому должен?
ПМ>Если задача обращения списка кажется программисту слишком сложной, то он явно чем-то не тем занимается. Доверять разработку такому человеку мне бы не хотелось.
Еще раз напомню что ты не решил две предложенные мной задачи, хотя видел их точно. Причем задача выбора случайных элементов гораздо чаще встречается, чем разворот списка.
Ты хочешь сказать что доверять тебе решение задач нельзя?
G>>Решение задачи манипуляции с битами показывает только умение решать задачи манипуляции с битами и больше ничего
ПМ>Я уже очень подробно расписал, что она показывает, опровержений по сути нет, лишь повторение одной и той же мантры.
Мантру вижу: "каждый программист должен", а объяснения не вижу. Ты ведь и сам такие задачи решать не умеешь, ты это уже явно показал.
Врядли ты в таком расклде сможешь чтонить объяснить.
ЗЫ. Кстати, жду решения задачи о максимальной подпоследовательности.
Здравствуйте, gandjustas, Вы писали:
G>>>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
SVZ>>Задачи действительно высосаны из пальца. Хотя полно проектов, где и их надо решать. G>"Полно" это что-то около 0.001%
Я полагаю, мы с тобой занимаемся разными по своей сути проектами.
Мне постоянно попадаются вакансии, где надо разрабатывать собственные структуры данных, заниматься графикой, вычислительной геометрией и прочей низкоуровневой шелухой.
Про популярные ныне TCP и передачу видеопотоков даже упоминать нет смысла — каждая вторая вакансия.
Ты работаешь на более высоком уровне — SharePoint, Web-сервисы и прочая.
Поэтому и статистика у нас с тобой будет разная. По моей это не 0.001%, а все 40%.
SVZ>>Но если кандидаты даже такое задание не могут решить, то как им доверишь что-то сложнее? G>Разворот списка — сложная задача, как и множество других, несмотря на простой код решения.
Кто-то в обсуждении верно заметил, что достаточно нарисовать три кубика со стрелочками, чтобы найти решение.
Не зацикливайся. Рассматривай эту задачку как игру в шахматы Кто-то играет лучше, кто-то хуже, а кому-то вообще не дано.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Паблик Морозов, Вы писали:
G>Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают?
разворот списка решается как на си (и других языках, активно работающих с указателями) так и на питоне с java-script и всяких прочих руби, где указателей вообще нет. более того, реверс списка вполне повседневная задача. вывести список в обратном порядке на печать -- это экзотика?
G> Не говоря уже шапках и гномах.
а чем вы так недовольны? свои первые собеседования я заваливал и жутко волновался, впрочем, оффера все-таки получал (т.к. собеседование это не экзамен и не бинарная логика, мой ответ был неправильным, но ход мыслей — зачотным). очень быстро я насобачился на этих задачах до такой степени, что проходил телефонные интевью, прижимая плечом трубку к уху и решая текущие дела без отрыва от производства. только мое торжество длилось недолго. меня просто перестали собеседовать. совпадене или нет -- не знаю. а может у HR'ов глобальная база есть -- не в курсе.
короче -- если у вас есть свое понимание того как нужно собеседовать людей это не значит, что все остальные собеседуют их неправильно. а в подтверждение своей правоты не помешало бы предоставить факты. сколько людей бы собеседовали и сколько из тех, кого вы взяли -- оказались теми, кто вам нужен.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить.
ПМ>Пожалуй сам и начну.
ПМ>Задача 1. Уровень Mid Developer Java/C#
ПМ>Напишите программу, выводящую на экран Ваше имя.
ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
Можно ли использовать Visual Studio и Google или нужно написать на бумажке? По памяти, на бумажке, я бы не написал (мой уровень — Senior Developer C#).
Здравствуйте, Flying Dutchman, Вы писали:
FD>Можно ли использовать Visual Studio и Google или нужно написать на бумажке? По памяти, на бумажке, я бы не написал (мой уровень — Senior Developer C#).
Да, конечно. Думаю наиболее сообразительные кандидаты должны догадаться найти своё имя на страничке в социальной сети.
-----
" Програмисту дали задание реализовать функцию которая возвращает текущее время с точностью до секунды. В результате он показал заголовочный файл с таким объявлением
currentTime.h
int getCurrentTime();
Вопрос , какие вы видите проблемы и как бы вы смогли улучшить этот код?
"
-----
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Задачи для собеседования.
ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
Кстати, вопрос не лишен смысла. Я сам частенько забываю, как правильно пишется мое имя в голландском паспорте.
Здравствуйте, minorlogic, Вы писали:
M>С++
M>----- M>" Програмисту дали задание реализовать функцию которая возвращает текущее время с точностью до секунды. В результате он показал заголовочный файл с таким объявлением
M>currentTime.h
M>int getCurrentTime();
M>Вопрос , какие вы видите проблемы и как бы вы смогли улучшить этот код? M>" M>-----
проблема одна — в задании ничего не говорится о том что должна возвращать функция.
/// Gets current time
/** Return value is offset from time when function was called (in any measurement system).
Precision: (0, 1] seconds
*/inline int getCurrentTime() { return 0; }
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, Flying Dutchman, Вы писали:
FD>>Можно ли использовать Visual Studio и Google или нужно написать на бумажке? По памяти, на бумажке, я бы не написал (мой уровень — Senior Developer C#).
ПМ>Да, конечно. Думаю наиболее сообразительные кандидаты должны догадаться найти своё имя на страничке в социальной сети.
Да, специально для этого у меня на стартовой странице браузера есть ссылки на мой профайл в LinkedIn и RSDN.
есть "look inside", так что можно получить представление о вопросах, которые на этих самых собеседованиях (в гугл, ms, fb) задают людям. не все вопросы легкие. и местами автор книги честно признается, что ответ предполгается получить, давая собеседуемому подсказки и корректируя траекторию полета его мысли.
ПМ>В этой
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна,
а как вам задача типа этой: есть число 32 бит. получить ближайшее меньшее или большее число с таким же точно числом установленных бит. признаюсь, что у меня на решение ушло полчаса (при записи ответа в одну строку на си). по тупому, конечно, ее любой может решить. или... не любой?
> можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие > опыта решения подобных задач в течение полугода помешают им их решить.
предлагаю дать задачу сравнения двух деревьев. а разворот списка это, извините, в детсад и на горшке сидеть.
а как вам задача дефрагментации списка? т.е. упордочить элементы списка в памяти в том порядке в котором они идут в списке? а как упорядочить список за наименьше кол-во операций? а оценить кол-во операций от размера выделяемой доп. памяти?
ПМ>Пожалуй сам и начну. ПМ>Задача 1. Уровень Mid Developer Java/C# ПМ>Напишите программу, выводящую на экран Ваше имя. ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
кстати, я такое же задание давал тем, кого интевьировал. только там было не имя кандидата, а строку, передаваемую программе в качестве аргумента. оценивалось главным образом то, в каком виде кандидат это представит (задание на си). если это проект на студии, то это одно. если это линк на svn, в котором есть скрипт сборки, документация и readme с примером использования -- это совсем другое. (да, кандидату заранее говорилось, что представьте, что вы пишите скелет программы, с которым будут работать ваши коллеги, так что пишите не за 30 секунд, а за минут за полчаса).
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, os24ever, Вы писали:
M>>Вопрос , какие вы видите проблемы и как бы вы смогли улучшить этот код?
O>Мой PHP сказал мне, что кретинические дни случаются у вашей функции раз в 68 лет: O>
M> Пока есть положительный сдвиг , но очень малый (как по мне).
Можно было бы добавить параметры: временная зона, локаль и т.д.
Но задание на сеньёра, поэтому сеньёр так делать не хочет. Он помнит, что он где-то когда-то уже видел, что всё это задавалось в переменных окружения или в файлах настроек (и язык и кодировка тоже).
Здравствуйте, os24ever, Вы писали:
M>> Пока есть положительный сдвиг , но очень малый (как по мне).
O>Можно было бы добавить параметры: временная зона, локаль и т.д.
O>Но задание на сеньёра, поэтому сеньёр так делать не хочет. Он помнит, что он где-то когда-то уже видел, что всё это задавалось в переменных окружения или в файлах настроек (и язык и кодировка тоже).
Это уже НАМНОГО ближе к идеальному с моей точки зрения ответу.
> Задача 1. Уровень Mid Developer Java/C# > > Напишите программу, выводящую на экран Ваше имя. > > Оценивается умение кандидата работать с system out, знание паттернов, > умение писать своё имя без грамматических ошибок.
Если добавить сюда "на русском языке", а system.out будет писать в
консоль винды, то тут ещё много чего можно проверить
Я эту поржать создал, серьёзно пишем в ту -->
М>Здравствуйте, Паблик Морозов, Вы писали:
М>а как вам задача типа этой: есть число 32 бит. получить ближайшее меньшее или большее число с таким же точно числом установленных бит. признаюсь, что у меня на решение ушло полчаса (при записи ответа в одну строку на си). по тупому, конечно, ее любой может решить. или... не любой?
ИМХО нет смысла давать получасовую задачу, особенно если в процессе её решения не о чем разговаривать с кандидатом. Задача неразрешима, если число — 0. Ближайшее большее — сдвиг исходного числа на один бит влево, зануление всех бит, кроме самого старшего, установка n — 1 младших бит (где n — кол-во установленных бит в исходном числе). Это по-тупому, как в одну строчку сейчас не придумаю.
М>предлагаю дать задачу сравнения двух деревьев. а разворот списка это, извините, в детсад и на горшке сидеть.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, мыщъх, Вы писали:
ПМ>ИМХО нет смысла давать получасовую задачу, особенно если в процессе её решения не о чем разговаривать с кандидатом. Задача неразрешима, если число — 0.
в этом случае функции next_bigger_num(x)/prev_lower_num(x) должны вернуть ошибку, не?
> Ближайшее большее — сдвиг исходного числа на один бит влево, > зануление всех бит, кроме самого старшего, установка n — 1 младших бит
чего-чего?! мы начинаем двигать самый младший бит влево до тех пор, пока на следующей позиции не окажется нуль.
или нет, даже не так. если представить биты в виде строки, для удобства инвертированной слева-направо. и нужно найти первый '1+0', после чего заменить его на '01+' (регулярна в псевдофрме).
осталось только записать решение, используя сложение, вычитание, свдиг, or, and, xor и чего еще душе угодно. и вот как его записать я не так долго думал, как отлаживал. сначала наплодил кучу промежуточных переменных, а когда стал их "сворачивать", где-то лажанулся и долго ходил кругами.
М>>предлагаю дать задачу сравнения двух деревьев. а разворот списка это, извините, в детсад и на горшке сидеть. ПМ>Нам бы хоть так...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, minorlogic, Вы писали:
M>С++
это не си++
M> "Програмисту дали задание реализовать функцию которая возвращает текущее время с точностью до секунды.
что такое время? текущее -- это показание системных часов компьютера, да? в каком формате выдавать? местное время устроит? а если это приложение для мобильного телефона, который автоматически определяет часовой пояс и время начали определять в одном месте, после чего усыпили систему, сели на самолет, приземлились, врубили питалово... функция вернет очень странный результат вообще-то. а неучитывать такие ситуации -- нельзя.
M>int getCurrentTime(); M>Вопрос , какие вы видите проблемы и как бы вы смогли улучшить этот код?
проблема только одна. код -- не работает. точнее, работает, но делает не то, что написано в ТЗ.
и начинать улучшение кода нужно с уточнения формулировок ТЗ.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, мыщъх, Вы писали:
М>>и начинать улучшение кода нужно с уточнения формулировок ТЗ. M>Это хорошее начало , но для сеньора стоит ожидать и хорошей альтернативы?
сеньер должен сказать, что текущим время бывает только у домохозяек. проводить ликбез и объяснять чем отличается GMT от UTC собеседуемый вроде не должен. так же непонятно для каких _целей_ это нужно. если время используется в качестве уникального значение, которое никогда не повторяется и всегда возрастает, то это -- одно. если для логгирования -- это ____ВАААААЩЩЩЩЕЕЕЕ____ другое. вот у меня есть лог. в нем есть местное время. но нету часового пояса. и я не в курсе политики сохранения времени в стране получения лога, которая в самом логе тоже не отражена.
> Другими словами решение проблемы а не ее усугубления?*
а решения проблемы нет. во всяком случае в такой постановке вопроса. "ты скажи мне что те нужно, я те дам, что ты хошь"
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
>> Другими словами решение проблемы а не ее усугубления?* М>а решения проблемы нет. во всяком случае в такой постановке вопроса. "ты скажи мне что те нужно, я те дам, что ты хошь"
Тогды совсем не сеньер. "Моя хата с краю" это позиция в никуда
Здравствуйте, Паблик Морозов, Вы писали:
М>>чего-чего?! мы начинаем двигать самый младший бит влево до тех пор, пока на следующей позиции не окажется нуль.
ПМ>Понял, туплю.
Чего? Двигать? Цикл? Не, не слышал.
Проверяйте:
int f(int x)
{
int minusOneBit = (x-1)&x;
int e = x^minusOneBit;
return minusOneBit|(e>>1);
}
int func(int x)
{
if (!(x&1))
return f(x);
return ~f(~x);
}
PS: переворачивать списки — не мое, там же циклы нужны
Здравствуйте, мыщъх, Вы писали:
ПМ>>ИМХО нет смысла давать получасовую задачу, особенно если в процессе её решения не о чем разговаривать с кандидатом. Задача неразрешима, если число — 0. М>в этом случае функции next_bigger_num(x)/prev_lower_num(x) должны вернуть ошибку, не?
А какой результат должна вернуть prev_lower_num(1)?
Здравствуйте, Sap78, Вы писали:
S>Здравствуйте, мыщъх, Вы писали:
ПМ>>>ИМХО нет смысла давать получасовую задачу, особенно если в процессе её решения не о чем разговаривать с кандидатом. Задача неразрешима, если число — 0. М>>в этом случае функции next_bigger_num(x)/prev_lower_num(x) должны вернуть ошибку, не?
S>А какой результат должна вернуть prev_lower_num(1)?
ошибку, очевидно. точно как next_bigger_num(0xFFFFFFFF)
речь не про это. чисто для разминки мозгов мне задачка показалось интересной (задачу придумал не я), но во-первых, это она мне интересна, потому что я вообще люблю с битами перепихиваться, а, во-вторых, даже при всей моей любви к битам не могу представить себе практического применения решения в одну строку. с преобразованием битов в строку и последующими операциями над ней на питоне -- задача вообще решается влет. причем, код ясен и понятен даже ламеру. а вот шаманство на уровне битовых операций -- оно вообще непонятно как работает и насколько корректно обрабатывает "пограничные" ситуации.
считаю, что под такую задачу можно искать или матерых хакеров, которые это делают в уме (ну в частности, на вопрос что сие значит (x & ( x + 1)) я ответил не раздумывая. меня даже плюс не смутил (в реальной жизни там минус), но это не потому, что у меня мозги работают с космической скоростью, а потому что этот шаблон я регулярно вижу на протяжении всей моей жизни.
а вот вопрос: "какое максимальное кол-во белых и черных коней можно разместить на 8x8 доске, чтобы они не угрожали друг другу и кол-во белых и черных было одинаковым" поставил меня в тупик. аналом чувствую -- задача из серии "классиков", но решение мне неизвестно. подозреваю, что 64, но неуверен. но это ж вообще шахматы. нечестно давать их на программировании...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>считаю, что под такую задачу можно искать или матерых хакеров, которые это делают в уме (ну в частности, на вопрос что сие значит (x & ( x + 1)) я ответил не раздумывая. меня даже плюс не смутил (в реальной жизни там минус), но это не потому, что у меня мозги работают с космической скоростью, а потому что этот шаблон я регулярно вижу на протяжении всей моей жизни.
У меня другое мнение. Вот спросят меня, "что делает (x & ( x + 1))?" Я ни разу не хакер и эту хрень первый раз в жизни вижу, но что я первым делом начну делать (если интернета нет под рукой)? А начну я выписывать цифекрки:
И так до просветления. И что я увижу? Увижу то, что четные цифры оно не трогает, а у нечетных убирает все единички до младшего нуля, что эквивалентно вычитанию чего-то там (ответ зависит от степени моего просветления). Ну или просто убирает все единички до младшего нуля, потому что у четных цифр он в самом начале, т.е. и убирать-то нечего. Это и будет моим ответом на вопрос. И тот, кто этот вопрос мне задаёт, по тому, насколько быстро у меня наступит просветление и насколько оно было глубоким, сможет сделать вывод о моих способностях. А если я по ночам Hacker's Delight читал под одеялом и отвечаю на этот вопрос по памяти, то мне его, наверное, нет особого смысла задавать, проще про коней спросить. Тут-то и можно будет оценить, смогу ли я разработать какую-нибудь систему для решения новой для себя задачи и насколько далеко смогу продвинуться.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, мыщъх, Вы писали:
М>>считаю, что под такую задачу можно искать или матерых хакеров, которые это делают в уме (ну в частности, на вопрос что сие значит (x & ( x + 1)) я ответил не раздумывая. меня даже плюс не смутил (в реальной жизни там минус), но это не потому, что у меня мозги работают с космической скоростью, а потому что этот шаблон я регулярно вижу на протяжении всей моей жизни.
ПМ>У меня другое мнение. Вот спросят меня, "что делает (x & ( x + 1))?" Я ни разу не хакер и эту хрень первый раз в жизни вижу, но что я первым делом начну делать (если интернета нет под рукой)? А начну я выписывать цифекрки:
как бы x & (x — 1) проверка на то, что x это степень двойки. если поменять минус на плюс, то получим проверку, что следующее за x число это степень двойки, а сама x это битовая маска из единиц. это в том случае если результат равен нулю. все остальные случаи мы приравниваем к true.
ПМ>И так до просветления. И что я увижу? Увижу то, что четные цифры оно не трогает, а у нечетных убирает все единички до младшего нуля, что эквивалентно вычитанию чего-то там (ответ зависит от степени моего просветления).
короче ваш ответ таков: "оно там что-то делает с битами"
> А если я по ночам Hacker's Delight читал под одеялом и отвечаю на этот вопрос по памяти,
если вы возились с асмом, контроллерами или хотя бы парсили exe/elf файлы -- вы уже знаете ответ. т.к. первый же макрос который пишется на си это ALIGN_UP/DOWN. да и при разборе файловых систем без него никуда.
> то мне его, наверное, нет особого смысла задавать, проще про коней спросить.
видите? а меня кони поставили в тупик. на бумаге рисовать лень. доски дома нет. разве какую компьютерную программу скачать в ней поэксперементировать? догадываюсь, что задачу можно попытаться решить на фрагменте 8x8, а затем распростанить на всю доску
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Пожалуй сам и начну. ПМ>Задача 1. Уровень Mid Developer Java/C# ПМ>Напишите программу, выводящую на экран Ваше имя.
Ой, госсподи. Неужель так сложно реальную задачу придумать? Ну вот сходу, из реальной практики, на растерзание. Имеем массив экземпляров PlainData:
PlainData {
id;
parentId;
data;
}
Преобразовать это в массив экземпляров TreeData (вроде как это зовется лесом), поддерживающую иерархию:
TreeData {
id;
*TreeData;
data;
}
То есть на первом уровне массива будут элементы, на которых не будет ссылок из parentId, а далее уже иерархия.
Естественно писать не на бумажке, а за компом со средой разработки, гуглом и тому подобным (за такое на бумажке убивать надо!). И не за 5 минут — я б час выделил, сделать хоть как, главное чтоб работало, ну и можно было разобраться как оно работает. Задача минимум — рассказать как будешь делать, совсем хорошо — если успеешь и код написать (ступоры у всех бывают).
Могу еще пятерку различных задач из практики вспомнить при желании, в том числе те, до решения которых все руки не доходят. Именно из того проекта, на который планируется взять человека.
Плюс реальный код, который меня беспокоит в текущем проекте — нужно сказать, что в нем плохо, и как сделать лучше.
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить.
Ты обижаешься, что я раскрыл решение твоей задачи
Вот тебе взамен схожие по сложности задачки, не требующие подготовки.
1. Дано бинарное упорядоченное дерево.
Вернуть максимальный узел <= заданному.
2. То же, но вернуть не сам узел, а его родителя [злодейская ухмылка]. Что возвращать для крайних случаев (узлов не найдено, найден корневой узел) — на выбор интервьюера.
3. Для самых продвинутых можно предложить написать обход дерева.
И чтобы без рекурсии
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>2. То же, но вернуть не сам узел, а его родителя [злодейская ухмылка]. Что возвращать для крайних случаев (узлов не найдено, найден корневой узел) — на выбор интервьюера.
Добавлю. Эта задачка хороший повод для обсуждения структур данных.
Если узел имеет ссылку на родителя, то решение элементарно. Но если данных ___ОЧЕНЬ___ много, то хранить лишнюю ссылку получается накладно.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, Паблик Морозов, Вы писали:
SVZ>Вот тебе взамен схожие по сложности задачки, не требующие подготовки.
SVZ>1. Дано бинарное упорядоченное дерево. SVZ>Вернуть максимальный узел <= заданному.
SVZ>2. То же, но вернуть не сам узел, а его родителя [злодейская ухмылка]. Что возвращать для крайних случаев (узлов не найдено, найден корневой узел) — на выбор интервьюера.
SVZ>3. Для самых продвинутых можно предложить написать обход дерева.
SVZ>И чтобы без рекурсии
А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>>И чтобы без рекурсии
G>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Что-то я занимаюсь проектами, высосанными из пальца последнее время.
Что-то странное Вы написали, ближе к истине IMHO будет следующий вариант для большего числа, без обработки ошибок:
//Count the consecutive zero bits (trailing) on the right in parallelunsigned int trailingZeroBits(unsigned int v) // 32-bit word input to count zero bits on right
{
unsigned int c = 32; // c will be the number of zero bits on the right
v &= -signed(v);
if (v) c--;
if (v & 0x0000FFFF) c -= 16;
if (v & 0x00FF00FF) c -= 8;
if (v & 0x0F0F0F0F) c -= 4;
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
return c;
}
unsigned int next(unsigned int x)
{
unsigned int zeroBits = trailingZeroBits(x);
unsigned int bit = x - (x & (x-1));
x += bit;
unsigned int totalBits = trailingZeroBits(x);
x += (1u << (totalBits - 1 - zeroBits)) - 1;
return x;
}
G>>Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают? ПМ>Оно показывает идиот человек или нет. Я еще ни разу не встречал нормального программиста, который бы был не в состоянии решить такую простую задачу.
G>>Не говоря уже шапках и гномах. ПМ>Аналогично.
Ты уже в сплошной беспроглядный субъективизм скатился.
Ты разве не понял что я могу подобрать задачи, которые ты на собеседовании не решишь. Даже с подсказками.
После этого назову тебя идиотом. Только с твоими навыками это никак не коррелирует.
ПМ>Офигенная задача. Видишь, как много она показывает: ПМ>- умение понять что же надо сделать (что мыщъх сделал намного лучше меня, видимо из него бы получился хороший консультант-аналитик или постановщик) ПМ>- умение провести исследование, найти закономерности, понять и их смысл (вообще, поиск закономерностей — это стандартная задача теста на IQ, так у детей в детском саду уровень развития интеллекта определяют) ПМ>- умение декомпозировать задачу и сложить решение из готовых блоков ПМ>- наличие системного подхода к решению задач, состоящих из более, чем одного действия
Решение задачи манипуляции с битами показывает только умение решать задачи манипуляции с битами и больше ничего
А вот на товарища мыщъх ты зря ссылаешься. Потому что он не инженер-разработчик , а исследователь-реверсер.
Здравствуйте, gandjustas, Вы писали:
ПМ>>Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код. G>Кому должен?
Должен уметь решать, если он собирается писать код в моём проекте. Если не умеет — пусть пишет в другом месте. Исправлять за такими ошибки — себе дороже.
G>Еще раз напомню что ты не решил две предложенные мной задачи, хотя видел их точно. Причем задача выбора случайных элементов гораздо чаще встречается, чем разворот списка.
Я не на собеседовании.
G>Мантру вижу: "каждый программист должен", а объяснения не вижу.
Объяснения я уже раз 20 раз написал.
G>Ты ведь и сам такие задачи решать не умеешь, ты это уже явно показал.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ> лично я — даже не программист, а деплоймент-инженер.
*FACEPALM*
Конец был немного предсказуем. Не программист ты, не программист.
Чего-то такого и стоило ожидать, для разных саппортеров и админов характерно дрочение на макросы и биты.
Здравствуйте, StandAlone, Вы писали:
SA>Здравствуйте, Паблик Морозов, Вы писали:
ПМ>> лично я — даже не программист, а деплоймент-инженер.
SA>*FACEPALM*
SA>Конец был немного предсказуем. Не программист ты, не программист. SA>Чего-то такого и стоило ожидать, для разных саппортеров и админов характерно дрочение на макросы и биты.
А для программистов с многолетним опытом видимо характерна неспособность к решению задач, с которыми справляются десятиклассники. Вопрос — зачем нужны такие программисты?
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>2 П.Морозов: Есть еще одна идея. Спроси кандидатов, какую литературу они читают (техническую)? Может быть весьма показательным.
А какую техническую литературу должен читать программист?
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, gandjustas, Вы писали:
ПМ>>>Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код. G>>Кому должен?
ПМ>Должен уметь решать, если он собирается писать код в моём проекте. Если не умеет — пусть пишет в другом месте. Исправлять за такими ошибки — себе дороже.
Ну вот. Получается что знать разворот списка — совершенно не является необходимым. Это лишь твой каприз, не мотивированный объективными причинами.
Со своими капризами ты не в тот форум зашел, это тебе в КСВ.
G>>Еще раз напомню что ты не решил две предложенные мной задачи, хотя видел их точно. Причем задача выбора случайных элементов гораздо чаще встречается, чем разворот списка. ПМ>Я не на собеседовании.
Сейчас не можешь и на собеседовании бы не смог. Или тебе пришлось бы заранее готовиться и изучать такие задачи.
Это как раз подтверждает мои слова.
G>>Ты ведь и сам такие задачи решать не умеешь, ты это уже явно показал. ПМ>Утверждение высосано непонятно из какого пальца.
Ты не решил её.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>>2 П.Морозов: Есть еще одна идея. Спроси кандидатов, какую литературу они читают (техническую)? Может быть весьма показательным.
ПМ>А какую техническую литературу должен читать программист?
"Активная" часть форума меня сейчас загнобит и мы опять скатимся во флейм, но попытаюсь изложить свою мысль.
О своей рабочей платформе что-то читать нужно. Под виндой — Рихтера, Соломона, Руссиновича, под никсами — Стивенса, например.
Если утверждает, что занимается "проектированием структур данных", то хотя бы с Ульманом должен быть знаком (его у нас часто издавали).
Если тема алгоритмическая, то Кнут, Кормен, Седжвиг.
Для С++ — Мейерс, Вандевурд, Саттер, Джосаттис...
Ну и т.д.
Если не книги, то какие-то блоги, онлайн статьи...
На самом деле даже не важно, что читает, главное — читает ли вообще.
Надо учиться на чужих ошибках, а иначе получится, что "чукча не читатель, чукча — писатель".
Раз проводишь собеседование, то поспрашивай. Если накопится какая-то статистика, было бы интересно с ней ознакомиться.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, gandjustas, Вы писали:
G>>>>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
SVZ>>>Задачи действительно высосаны из пальца. Хотя полно проектов, где и их надо решать. G>>"Полно" это что-то около 0.001%
SVZ>Я полагаю, мы с тобой занимаемся разными по своей сути проектами. SVZ>Мне постоянно попадаются вакансии, где надо разрабатывать собственные структуры данных, заниматься графикой, вычислительной геометрией и прочей низкоуровневой шелухой. SVZ>Про популярные ныне TCP и передачу видеопотоков даже упоминать нет смысла — каждая вторая вакансия.
Статистика HH с тобой несогласна. Хотя даже если взять TCP и видео, то для этого уже давно написаны либы.
SVZ>>>Но если кандидаты даже такое задание не могут решить, то как им доверишь что-то сложнее? G>>Разворот списка — сложная задача, как и множество других, несмотря на простой код решения.
SVZ>Кто-то в обсуждении верно заметил, что достаточно нарисовать три кубика со стрелочками, чтобы найти решение.
Это лично ему достаточно.
SVZ>Не зацикливайся. Рассматривай эту задачку как игру в шахматы Кто-то играет лучше, кто-то хуже, а кому-то вообще не дано.
Дано всем, только это сложно. реально сложно если нету предварительной подготовки.
SVZ>О своей рабочей платформе что-то читать нужно. Под виндой — Рихтера, Соломона, Руссиновича SVZ>Ну и т.д.
Мб и не помешают эти книжки, но я бы плюсик ставил за вечную классику: "совершенный код", "программист-прагматик", рефакторинг, ГОФ.
Конечно и то и то уровень невысок, но на прикладных задачах имхо "внимательно прочитавший рефакторинг фаулера" важнее "решающий обращение списка".
PS. Хотя на каком-то уровне посерьёзнее ты понимаешь, что рефакторинг и гоф — это всё полное фуфло. Полезный остаток — по треть книги где-то.
Здравствуйте, gandjustas, Вы писали:
G>Ну вот. Получается что знать разворот списка — совершенно не является необходимым.
То, что знать разворот списка — совершенно не является необходимым я написал раз 10 наверное. Мне не нужно, чтобы человек знал, мне нужно, чтобы сеньёр-девелопер умел решать хотя бы самые примитивные алгоритмические задачи. Иначе такому "девелоперу" лучше сменить профессию.
G>Сейчас не можешь и на собеседовании бы не смог. Или тебе пришлось бы заранее готовиться и изучать такие задачи.
Я решал на собеседованиях более сложные задачи. Именно поэтому мне не понятно, как человек, называющий себя программистом не может справится с такой чепухой.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>О своей рабочей платформе что-то читать нужно. Под виндой — Рихтера, Соломона, Руссиновича, под никсами — Стивенса, например. SVZ>Если утверждает, что занимается "проектированием структур данных", то хотя бы с Ульманом должен быть знаком (его у нас часто издавали). SVZ>Если тема алгоритмическая, то Кнут, Кормен, Седжвиг. SVZ>Для С++ — Мейерс, Вандевурд, Саттер, Джосаттис... SVZ>Ну и т.д.
Я не читал ни одной из этих книг. Не знаю, о чём это говорит.
SVZ>Если не книги, то какие-то блоги, онлайн статьи...
Это да.
SVZ>На самом деле даже не важно, что читает, главное — читает ли вообще. SVZ>Надо учиться на чужих ошибках, а иначе получится, что "чукча не читатель, чукча — писатель".
Тут полезнее навык сопровождения кода, наверное.
SVZ>Раз проводишь собеседование, то поспрашивай. Если накопится какая-то статистика, было бы интересно с ней ознакомиться.
Ок, поспрашиваю. Но решение на основании ответов принимать не буду. Действительно интересно, кто что читает.
Здравствуйте, Nuseraro, Вы писали:
N>"совершенный код"
Бросил не прочитав и четверти. Стив — Капитан-очевидность.
N>"программист-прагматик"
Не читал.
N>рефакторинг
Бросил после 20 страниц. Рефакторить код сможет любой человек просто исходя из "здравого смысла", а польза от знания названий этих операций — минимальна. Любой практикующий программист с ними ознакомится исходя из контекстного меню своей IDE.
N>ГОФ.
Прочитал лет 5 назад и забыл. Обычная ООП-профанация.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, gandjustas, Вы писали:
G>>Ну вот. Получается что знать разворот списка — совершенно не является необходимым.
ПМ>То, что знать разворот списка — совершенно не является необходимым я написал раз 10 наверное. Мне не нужно, чтобы человек знал, мне нужно, чтобы сеньёр-девелопер умел решать хотя бы самые примитивные алгоритмические задачи. Иначе такому "девелоперу" лучше сменить профессию.
А я не говорю конкретно про задачу разворачивания списков. Я еще с самого начала говорил про задачи, не имеющие отношения к работе.
Твое желание чтобы соискатели на собеседовании решали такие задачи — каприз, не подкрепленный необходимостью.
G>>Сейчас не можешь и на собеседовании бы не смог. Или тебе пришлось бы заранее готовиться и изучать такие задачи. ПМ>Я решал на собеседованиях более сложные задачи.
Уверен что они были более сложные? Может они просто более неизвестными тебе были?
Здравствуйте, aleks_mur, Вы писали:
_>У меня исходная задача тоже вызвала массу вопросов. Бросаться чего-то писать не прояснив что это и для чего — самый плохой способ, в сложных проектах потом так и делают — сначала что-то накодят, потом разбираются "а надо-то было не так... эх.. не поглядели.. не спросили...".
Исходная задача вопросов не вызывает. Ваще. Ни одного.
Есть только один правильный способ работать со временем.
Объявляем некий момент времени началом времен. Например 00:00:00 01/01/2000. Можно любой другой. Это совершенно не важно.
Если достаточно секундной точности, то берем 64х битное знаковое целое. Нам его хватит почти на 300 миллиардов лет. Это в 20 раз больше возраста вселенной.
Если мы делаем универсальный формат, то в качестве представления нужно брать десятичную дробь неограниченной точности.
Все что меньше нуля произошло до нашего начала времен.
Все что больше произошло позже.
Показ времени пользователю и чтение его из строки производится с помощью календаря. Который кроме собственно календаря (которых даже сейчас больше одного) содержит часовые пояса, прыгающие секунды, итп.
Все остальные способы работать со временем не правильные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, gandjustas, Вы писали:
G>Твое желание чтобы соискатели на собеседовании решали такие задачи — каприз, не подкрепленный необходимостью.
Пока практика показывает, что это самый действенный метод отсеять людей, которые не умеют программировать.
G>Уверен что они были более сложные? Может они просто более неизвестными тебе были?
Здравствуйте, gandjustas, Вы писали:
G>Это твоя практика, хотя с чего ты взял что они не умеют?
Проверил на примере одной простой задачи.
G>>>Уверен что они были более сложные? Может они просто более неизвестными тебе были? ПМ>>Да, уверен. G>Я уже писал что есть склонность преувеличивать сложность незнакомых задач и преуменьшать сложность знакомых.
ПМ>или в одну строчку: ПМ>result = (((x .&. (x — 1)) `xor` x) + x) .|. (x .&. (x — 1))
ПМ>Вот решение для ближайшего большего, собственно. Вполне адекватная задача для собеседования при условии, что человеку будут даваться подсказки и что он умеет обращать списки. Сформулировал задачу, как это сделал ты — пол решения. Разобрался, как работает сложение/вычитание на уровне битов — еще четверть . Собрал решение из готовых блоков — заключительная четверть. Никаким хакером для решения этой задачи быть не надо, лично я — даже не программист, а деплоймент-инженер.
молодец, деплоймент-инженер! понты так и прут
ты тестировал свое решение? нет? а я протестировал твое
import Data.Bits
import Numeric
import Data.Char
binary x = showIntAtBase 2 intToDigit x ""
f x = (((x .&. (x - 1)) `xor` x) + x) .|. (x .&. (x - 1))
g x = putStrLn $ (binary x) ++ " --> " ++ (binary (f x))
$ ghci bits_public_morozov.hs
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( bits_public_morozov.hs, interpreted )
Ok, modules loaded: Main.
*Main> g 3
11 --> 110
*Main>
тогда как минимальное число после 11 это очевидно 101
особый минус тебе за то, что запостив свое решение в 15:06 ты не прочитал мою подсказку, запощенную в 12:09
G>Я уже писал что есть склонность преувеличивать сложность незнакомых задач и преуменьшать сложность знакомых.
плюсую
надо сказать, что задачу про обращение списка я не решал, а узнал решение раньше, читая что-то по хаскелю, так что я не могу объективно оценить ее сложность
впрочем, если человеку объяснить на пальцах (на кубиках ) идею алгоритма обращения, тогда можно уже требовать его безошибочного программирования... опять же вовсе не уверен насчет 5 минут -- там в частных случаях можно запутаться
Здравствуйте, m e, Вы писали:
ME>надо сказать, что задачу про обращение списка я не решал, а узнал решение раньше, читая что-то по хаскелю, так что я не могу объективно оценить ее сложность
В хаскеле мутабельный список — очень неестественная структура. Поэтому хаскелистов у меня другие задачи.
На одном относительно недавнем собеседовании у меня прямо, можно сказать, на входе попросили на бумажке написать алгоритм поиска самой длинной повторяющейся подстроки в строке.
Конечно, я помню о существовании сложного поиска с суффиксными деревьями, и даже помню, что он O(n+r), но за 20 минут (столько времени дано на задачу) все, что я смог написать — ужасно неэффективный "поиск в лоб" с перебором от каждой буквы. И то, не уверен, что алгоритм работает, т.к. ни тестов, ни чего другого за это время не написать.
Хорошо хоть следующие 20 минут прошли в обсуждении разных способов огранизации tiered storage. Но там у интервьювера были столь глубокие и обширные знания, что я не мог вообще ничего нового или интересного ему сказать. Только общие банальности.
Здравствуйте, lxa, Вы писали:
lxa>Что-то странное Вы написали, ближе к истине IMHO будет следующий вариант для большего числа, без обработки ошибок:
тяжело читать твой код, но похоже он правильный -- за исключением х=0, когда он выдает полную лажу (во всяком случае у меня) -- ты делаешь там левый шифт или на ооооооочень много или на -1, что UB
твой код правильный в том смысле, что при х=1111100000000000 он выдает не следующий больший х, а следующий больший х по модулю 2**32, или циклически больший (это наверно ясно? но объяснять лень) -- т.е. невозможность найти больший х в рамках unsigned int легко ловится по тому признаку, что next(x)<=x
ниже я записал свое понимание твоего кода в читаемой с моей точки зрения форме (например оптимизации, вроде "x+=... вместо y=x+..." надо оставлять компилятору, и писать ясно), исправил ошибку с 0 и добавил throw:
#include <iostream>
#include <string.h>
unsigned int number_of_trailing_zero_bits(unsigned int x) //Count the consecutive zero bits (trailing) on the right in parallel
{
unsigned int result = 32;
x &= -signed(x);
if (x) result--;
if (x & 0x0000FFFF) result -= 16;
if (x & 0x00FF00FF) result -= 8;
if (x & 0x0F0F0F0F) result -= 4;
if (x & 0x33333333) result -= 2;
if (x & 0x55555555) result -= 1;
return result;
}
inline unsigned int clear_lowest_unit_bit(unsigned int x) { return x & (x-1); }
inline unsigned int lowest_unit_bit(unsigned int x) { return x ^ clear_lowest_unit_bit(x); }
inline unsigned int create_unit_bits(unsigned int n) { return (1u << n) -1; }
inline unsigned int number_of_pretrailing_unit_bits(unsigned int x)
{
return number_of_trailing_zero_bits(x+lowest_unit_bit(x)) - number_of_trailing_zero_bits(x);
}
unsigned int next(unsigned int x)
{
unsigned int y = x + lowest_unit_bit(x); /// это мы получаем тот самый сдвиг одного бита налево... но коммент должет быть длиннееunsigned int result = y | (create_unit_bits( number_of_pretrailing_unit_bits(x) ) >> 1) ;
if( result <= y) /// FIXME а компилятор не решит ли соптимизировать это нафиг?throw"no next";
else
return result;
}
теперь где я остановился в самостоятельном (без гугля) решении -- в целом у меня был тот же алгоритм, но
1. был тупо цикл, двигающий группу единиц до столкновения с границей
2. я чуть дольше возился вместо элегантного вычисления y
3. и думал по поводу "а как без цикла посчитать количество последовательных единиц и нулей" -- а придумывать че-то типа такого алгоритма как выше мне было лень
ME>>надо сказать, что задачу про обращение списка я не решал, а узнал решение раньше, читая что-то по хаскелю, так что я не могу объективно оценить ее сложность
ПМ>В хаскеле мутабельный список — очень неестественная структура. Поэтому хаскелистов у меня другие задачи.
это несущественно
если знаешь разворот немутабельного списка, то развернуть мутабельный можно легко по аналогии
Здравствуйте, visitor_pattern, Вы писали:
_>Я как то предлагал подобным людям писать в своем резюме — "отказываюсь отвечать на вопросы про прикладное программирование на собеседовании и решать каки-либо задачки". Но как-то не нашлось в их душах согласия с этой позицией.
Ты будешь смеяться, но у меня в резюме практически так и написано. На поток желающих предложить очередную "once in a lifetime opportunity" никак не повлияло, надмозгов с гномиками, сортировками, недо-брайнбенчами и прочей ересью как отрезало.
L>>Ты будешь смеяться, но у меня в резюме практически так и написано. На поток желающих предложить очередную "once in a lifetime opportunity" никак не повлияло, надмозгов с гномиками, сортировками, недо-брайнбенчами и прочей ересью как отрезало.
ПМ>Ну да, ни одна приличная контора таких капризных девочек приглашать не станет, потому что следующей предьявой будет "отказываюсь тестировать свой код", "отказываюсь приходить на работу вовремя" или что он там еще откажется делать.
М>а как вам задача типа этой: есть число 32 бит. получить ближайшее меньшее или большее число с таким же точно числом установленных бит. признаюсь, что у меня на решение ушло полчаса (при записи ответа в одну строку на си). по тупому, конечно, ее любой может решить. или... не любой?
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, landerhigh, Вы писали:
L>>Ты будешь смеяться, но у меня в резюме практически так и написано. На поток желающих предложить очередную "once in a lifetime opportunity" никак не повлияло, надмозгов с гномиками, сортировками, недо-брайнбенчами и прочей ересью как отрезало.
ПМ>Ну да, ни одна приличная контора таких капризных девочек приглашать не станет, потому что следующей предьявой будет "отказываюсь тестировать свой код", "отказываюсь приходить на работу вовремя" или что он там еще откажется делать.
Public, у нас разные понятия о приличных конторах. Смотри выделенное.
Здравствуйте, m e, Вы писали:
ME>func для нечетных чисел находит вовсе не предыдущее, а следующее число с равным количеством единиц
ME>
ME>f: 11110 -> 11101
ME>func: 00001 -> 00010
ME>
Разве это противоречит условиям "получить ближайшее меньшее или большее число"?
func(1) --> 2
От 1 (0001) ближайшее большее с равным числом бит — это 2 (0010).
ME>для нечетных чисел, похоже, тебе придется поступиться принципами и сделать цикл
ME>
Здравствуйте, gandjustas, Вы писали: G>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Ну не скажи — быстрый и компактный словарь это тебе не хухры-мухры.
теме мы пришили к выводу, что задача обращения списка слишком сложна и нетривиальна, чтобы давать её на собеседованиях. Предлагаю составить список хороших, годных задач, которые можно давать сеньёр-девелоперам без опасений, что стресс усталость или отсутсвие опыта решения подобных задач в течение полугода помешают им их решить.
ПМ>Пожалуй сам и начну.
ПМ>Задача 1. Уровень Mid Developer Java/C#
ПМ>Напишите программу, выводящую на экран Ваше имя.
ПМ>Оценивается умение кандидата работать с system out, знание паттернов, умение писать своё имя без грамматических ошибок.
Вброс засчитан.
Теперь осталось узнать когда тебя забанят
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, aleks_mur, Вы писали:
_>>У меня исходная задача тоже вызвала массу вопросов. Бросаться чего-то писать не прояснив что это и для чего — самый плохой способ, в сложных проектах потом так и делают — сначала что-то накодят, потом разбираются "а надо-то было не так... эх.. не поглядели.. не спросили...". WH>Исходная задача вопросов не вызывает. Ваще. Ни одного.
Ну, ты царь! У меня их так много возникло что я даже не стал в дискуссию ввязываться..
Так по теме вспомнил одну задачку для старта бурана комплекс делали.. Там надо было время учитывать с точностью до миллисекунды, а разрядность 32 бита. Время не возврата 18 часов.. Так тупо не влазил счетчик в разярдную сетку.. Пришлось писать программу деления. Правда потом сделали отдельное устройство таймер..
Я задавал эту задачку десятку кандидатов, больше половину не поняли вообще о чем я спрашиваю. Только после наводящих вопросов. Мне кажется это очень хорошо отличает зрелость разработчика , когда он пытается выяснить требования, указывает на недостатки и предлагает свои решения.
Здравствуйте, MescalitoPeyot, Вы писали:
MP>Я б сказал, что в таком виде функцию просто надо переименовать в int getUnixTime(), но уверен что вас такой ответ не устроит.
А если реализация возвращает что то другое? Если она например время в миллисикундах возвращает с момента старта ОС ?
Я в свое время давал:
# переворот строки
# задачка на дизайн классов для простенькой структуры данных при условии что человек работает в команде + простой пробег по ней (функцию написать)
# задачка на дизайн классов для куска функциональности, которую мы реально использует. Опять же человеку сообщалось что его кодом будут пользоваться другие люди
Пункты #2 и #3 были самые лучшие IMHO, так как сразу показывали людей, не могущих даже спроектировать простой класс.
Здравствуйте, minorlogic, Вы писали:
M>А если реализация возвращает что то другое? Если она например время в миллисикундах возвращает с момента старта ОС ?
M>Програмисту дали задание реализовать функцию которая возвращает текущее время с точностью до секунды
Здравствуйте, kosmik, Вы писали:
K>Пункты #2 и #3 были самые лучшие IMHO, так как сразу показывали людей, не могущих даже спроектировать простой класс.
Про классы учту. Но тут очень много субъективных моментов. Я встречал человека, который предлагал спроектировать класс "фонарик". Когда я узнал "правильный" ответ и методику оценки, я пришел к выводу, что это что-то среднее между "угадай о чём я сейчас думаю" и "да я это просто, чтобы разговор поддержать".
Здравствуйте, мыщъх, Вы писали:
М>речь не про это. чисто для разминки мозгов мне задачка показалось интересной (задачу придумал не я), но во-первых, это она мне интересна, потому что я вообще люблю с битами перепихиваться
Как такой вопрос: быстрая реализация BSF для uint64_t на C, без ассемблера?
Здравствуйте, мыщъх, Вы писали:
М>а как вам задача типа этой: есть число 32 бит. получить ближайшее меньшее или большее число с таким же точно числом установленных бит. признаюсь, что у меня на решение ушло полчаса (при записи ответа в одну строку на си). по тупому, конечно, ее любой может решить. или... не любой?
Меньшее с условием получается, примерно так
Если четное, то по аналогии
(((x ^ (x-1)) + 1) >> 2) | (x & (x-1))
Для нечетного надо сбросить/восстановить младший бит
Здравствуйте, Mystic, Вы писали:
M>Меньшее с условием получается, примерно так M>Если четное, то по аналогии M>(((x ^ (x-1)) + 1) >> 2) | (x & (x-1)) M>Для нечетного надо сбросить/восстановить младший бит
Здравствуйте, gandjustas, Вы писали: G>Нахрена задачи, не имеющие отношения к работе, решать?
Чтобы узнать, сколько гонмиков останется в живых. Это жизненно важно.
DP>Разве это противоречит условиям "получить ближайшее меньшее или большее число"?
я понял это условие таким образом -- ты можешь *один* раз выбрать, меньшее или большее число ты будешь получать, затем фиксируешь свой выбор и его реализуешь
любой из фиксированных вариантов пригоден для того, чтобы перебрать *все* такие числа, начав скажем с 1111110000 или с 0000111111; твой вариант все числа не переберет
какую задачу на самом деле ставил мыщъх -- это надо спросить у него; как я щас погуглил, без цикла все же можно обойтись, но тогда придется использовать деление
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, мыщъх, Вы писали:
М>>речь не про это. чисто для разминки мозгов мне задачка показалось интересной (задачу придумал не я), но во-первых, это она мне интересна, потому что я вообще люблю с битами перепихиваться
M>Как такой вопрос: быстрая реализация BSF для uint64_t на C, без ассемблера?
встречный вопрос -- а накуя? вы можете назвать хоть один компилятор где нет таких расширений? в ms, gcc, intel'е они есть и libc есть.
быстрая реализация на си? гм... без профайлера не скажу. табличная реализация vs калькуляция. трудно сказать, что будет быстрее на современных процессорах, тем более без указания типа процессора.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, мыщъх, Вы писали:
М>>а как вам задача типа этой: есть число 32 бит. получить ближайшее меньшее или большее число с таким же точно числом установленных бит. признаюсь, что у меня на решение ушло полчаса (при записи ответа в одну строку на си). по тупому, конечно, ее любой может решить. или... не любой?
M>Без обработки на ошибки как-то так?
лично я обработки ошибок возложил на вызывающую функцию. типа:
foo(x)
{
res = next_bigger(x);
if (res <= x) // ошибка
res = prev_lower(x);
if (res >= x) // ошибка
}
"ошибка" в смысле "для данного x нет решения" (или бага в алгосе).
M>Большее как-то так? M>((x ^ (x-1)) + 1) | (x & (x-1))
поставил 3 получил 2. как-то не так.
M>Меньшее с условием получается, примерно так
могу показать свое решение если интересно.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, kosmik, Вы писали:
K>>Пункты #2 и #3 были самые лучшие IMHO, так как сразу показывали людей, не могущих даже спроектировать простой класс.
ПМ>Про классы учту. Но тут очень много субъективных моментов. Я встречал человека, который предлагал спроектировать класс "фонарик". Когда я узнал "правильный" ответ и методику оценки, я пришел к выводу, что это что-то среднее между "угадай о чём я сейчас думаю" и "да я это просто, чтобы разговор поддержать".
гм... а если так?
light_on(); light_off(); is_light_on();
а вообще можно без классов -- letbelight(); а що? nuke_them_all() -- тут даже exit() не нужен. и конструктор испариться прежде, чем до него дойдет поток управления.
ЗЫ. по ходу дела тут нужно спроектировать сам фонарик. вот у меня фонарик на солнечных батарейках (без шуток). и у него только одна кнопка. а в детстве я паял фонарик на фоторезисторе, который автоматически включался, когда темно. вот написать программную реализацию такого фонарика (с учетом подавления помех от кратковременных вспышек) -- это самое то.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
M>>Большее как-то так? M>>((x ^ (x-1)) + 1) | (x & (x-1)) М>поставил 3 получил 2. как-то не так.
Начал проверять за компом, вышло так. То просто неправильный алгоритм был, сейчас вроде верно
[сcode]
#include <stdio.h>
int main(int argc, char* argv[])
{
unsigned int x;
scanf("%u", &x);
unsigned int y = (x|((x|(x-1))+1))^((((x|(x-1))^((x|(x-1))+1))+1)>>2);
printf("%u\n", y);
return 0;
}
[/сcode]
M>>Меньшее с условием получается, примерно так М>могу показать свое решение если интересно.
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, Mystic, Вы писали:
M>>Здравствуйте, мыщъх, Вы писали:
M>>Как такой вопрос: быстрая реализация BSF для uint64_t на C, без ассемблера? М>встречный вопрос -- а накуя? вы можете назвать хоть один компилятор где нет таких расширений? в ms, gcc, intel'е они есть и libc есть.
(1) Для разминки мозгов
(2) Вопрос скорее в платформах. Есть спарки, есть ARM-ы. Какой там синтаксис соответствующей ассемблерной команды я сказать не могу, да и проверить не могу. Но могу прописать в configure, что если у нас на x86 и не x86_64, то включить общий вариант функции. А там энтузазисты поправят.
М>быстрая реализация на си? гм... без профайлера не скажу. табличная реализация vs калькуляция. трудно сказать, что будет быстрее на современных процессорах, тем более без указания типа процессора.
Одними и самых быстрых считается эти, по сути 4-5 ассемблерных команд без всяких условий.
Здравствуйте, мыщъх, Вы писали:
M>>Как такой вопрос: быстрая реализация BSF для uint64_t на C, без ассемблера? М>быстрая -- это на собеседовании?
Нет, не на собеседование. Имхо, это надо запомнить, потому что понять это нивазможно! Но тоже с битами.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, landerhigh, Вы писали:
ПМ>Я не совсем понимаю "once in a lifetime opportunity". Это типа стартап с презентацией в power-point-е?
И ты берешься проводить собеседования, не зная таких элементарных вещей? Стыдно должно быть
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, мыщъх, Вы писали:
М>>быстрая реализация на си? гм... без профайлера не скажу. табличная реализация vs калькуляция. трудно сказать, что будет быстрее на современных процессорах, тем более без указания типа процессора.
M>Одними и самых быстрых считается эти, по сути 4-5 ассемблерных команд без всяких условий.
1) надеюсь, вы не ожидаете, что этот код напишут прямо на собеседовании?
2) тормозную реализацию можно написать и на питоне (на глаз должно хватить дюжины строк);
3) даже для системщиков это очень узкий вопрос и не уверен, что показательный;
4) в качестве тестового задания -- ИМХО слишком просто (ответ быстро находится в иннете);
5) а почему вы против вычислительных алгосов? на x86 с LEA получается довольно шустро, даже если писать на си -- есть шанс, что оптимизатор это заоптимизирует как надо
M>Некоторые другие быстрые алгоритмы можно найти тут.
я предпочитаю сначала искать по патентным базам патент который я привел -- там все с рискунками как для тупых, тьфу, как для детей и по крайней мере вы точно знаете, что это патент и можете посмотреть на каких условиях он распростаняется. а вот опен-сорс, неожиданно попадающий под патент, может стать сюрпризом.
хотя вы меня натолкнули на интересный вопрос для собеседования -- "в каком порядке искать ответ на вопрос". гугл? гугл не всемогущ. поиск по патентным базам зачастую сокращает ваш путь в десятки и сотни раз. как-то был случай в жизни. попросили реконструировать проприетарный протокол. протокол закрытый, но запатентованный. причем, протокол сношения с микроконтроллером, которому передается микропрграмма. для страховки заказчик дал задачу мне и еще одному парню. я быстро нашел патент и убедился, что опкоды совпадают на 90% (со времен подачи патента протокол претерпел несколько ревизий), в результате послал заказчику полную реконструкцию. мой коллега убил гораздо больше времени и реконстрировал лишь 30% опкодов (т.е. остальные не юзались в конкретной версии клиента, которую он реверсил).
в патентнах находится по меньше мере 60% ответов на мои вопросы, 30% находит гугл, 10% твиттер и потому когда человек говоит "що тут думать -- тут гуглить надо" с ним все ясно.
кстати, про вашу задачу. поднял исходники никсов и нашел там решение на си без привязки к асму. не уверен, что самое быстрое, но уврен, что:
а) рабочее;
б) не имеющее патентных ограничений;
про алгосы, найденные в иннете, ни того, ни другого сказать нельзя.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Паблик Морозов, Вы писали:
G>>Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают? М>разворот списка решается как на си (и других языках, активно работающих с указателями) так и на питоне с java-script и всяких прочих руби, где указателей вообще нет. более того, реверс списка вполне повседневная задача. вывести список в обратном порядке на печать -- это экзотика?
Во Всех языках есть готовые библиотеки для этого.
G>> Не говоря уже шапках и гномах. М>а чем вы так недовольны? свои первые собеседования я заваливал и жутко волновался, впрочем, оффера все-таки получал (т.к. собеседование это не экзамен и не бинарная логика, мой ответ был неправильным, но ход мыслей — зачотным). очень быстро я насобачился на этих задачах до такой степени, что проходил телефонные интевью, прижимая плечом трубку к уху и решая текущие дела без отрыва от производства. только мое торжество длилось недолго. меня просто перестали собеседовать. совпадене или нет -- не знаю. а может у HR'ов глобальная база есть -- не в курсе.
Ну вот я и говорю, что решение задач про гномиков это скилл, к работе не имеющий отношения. И недоволен тем что некоторые считают такие задачи хорошим фильтром на собеседованиях.
М>короче -- если у вас есть свое понимание того как нужно собеседовать людей это не значит, что все остальные собеседуют их неправильно. а в подтверждение своей правоты не помешало бы предоставить факты. сколько людей бы собеседовали и сколько из тех, кого вы взяли -- оказались теми, кто вам нужен.
Мне и факты предоставлять не надо, каждый второй кто тут пишет подтверждает мои слова.
ПМ>Про классы учту. Но тут очень много субъективных моментов. Я встречал человека, который предлагал спроектировать класс "фонарик". Когда я узнал "правильный" ответ и методику оценки, я пришел к выводу, что это что-то среднее между "угадай о чём я сейчас думаю" и "да я это просто, чтобы разговор поддержать".
А я как раз давал без подвохов и без необходимости думать. Просто на базовые программерские навыки: решить что и как сделать публичным, какие стандартные интерфейсы поддержать, написать простую функцию и самому ее протестировать.
Кстати, задачки на простейший дизайн классов вообще полезная вещь. Помню как лет 10 назад один чувак, преподававший ООП в одном из питерских технических ВУЗов на вопрос о пользе множественного наследования привел пример объекта "окно и в нем кнопка", который предлагалось унаследовать от обоих
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, мыщъх, Вы писали:
G>Во Всех языках есть готовые библиотеки для этого.
а все программы уже написаны задого до нас.
G> Ну вот я и говорю, что решение задач про гномиков это скилл, к работе не имеющий отношения.
не спрашивали меня за гномиков (это за тех гномиков, из которых уши кодов коррекции ошибок торчат?). у нас вообще интересные интервью были с жаркими спорами, в которые постепенно втягивался весь отдел. интерью ведь не экзамен, а беседа двух умных людей и тут намного важнее позитивное впечатление произвести, чем дать правильный ответ на вопрос.
G> И недоволен тем что некоторые считают такие задачи хорошим фильтром на собеседованиях.
фильтр отбирает кандидатов еще до собеседования. и если кандидат не может обратить список, то это очень плохой фильтр и собеседовать такого кандидата -- это профукивать деньги на ветер. программистам приходится сталкиваться с нетривальными задачами, которые требуют не только знаний SDK, но и умения мыслить.
G> Мне и факты предоставлять не надо, каждый второй кто тут пишет подтверждает мои слова.
вы меня извините, но обращение списка я считаю вообще задачей недостойной моей квалификации (хотя я и не программист), но что-то подобное мы еще в школе проходили (как смутно припоминаю). а, нет. вру. мы массив на бейсике обращали.
не, я вообще в упор не вижу проблемы. вот за сорок секунд написал на питоне не самую дебильную реализацию:
как видим работает. эффективность программы напрямую зависит от эффективности insert'а и, поскольку, вставка элементов идет в середину списка, реализация рискует соснуть. как вариант -- можно сделать:
x = my_list.pop(my_list_len); my_list.append(x);
или:
x = my_list.pop();
my_list_tmp.append(x);
последнее не уже зависит от реализаций pop и append (т.к. удаляется последний элемент списка и добавляется в конец tmp'а, то мы не только список, но и стек развернем, но тут мы окажемся в зависимости от качества сборщика мусора).
еще можно реализовать swap на питоне, но это зависит от качества реализации enumerate...
в общем, есть 100500 возможных решений и на питоне все они упираются в черный ящик -- мы не знаем как реализована та или иная функция. при обработке 500 метровых массивов выгоднее работать с идексами и delete -- это намного быстрее. во всяком случае в версии 2.7 под винду.
так что не фиг гнать на задачу. задача простая, но требует понимания как оно работает. конкретно в питоне все же выгоднее реализовывать swap через enumerate, т.к. это позволяет задейстовать map, что в свою очередь позволяет задействовать все ядра ЦП (в теории). на практике большие списки (500 метров данных) выгоднее обращать через импромизированный "кэш", исходя из представлениий об аллоканции памяти в питоне (особенно, если элементы списка -- строки) -- как раз в этом случае очень важно не создавать копию элементов списка, а тассовать указатели на них, но это уже дебри...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
М>как видим работает. эффективность программы напрямую зависит от эффективности insert'а и, поскольку, вставка элементов идет в середину списка, реализация рискует соснуть. как вариант -- можно сделать:
очень даже рискует; я бы предположил, что тут будет квадратичная сложность, если, конечно, insert по собственной инициативе не кэширует указатель на позицию прошлой вставки для списка
а в питоне вообще есть способ написать *свой* inplace reverse? че-то опять сомневаюсь -- видимо только list.reverse и юзать
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, мыщъх, Вы писали:
G>>Во Всех языках есть готовые библиотеки для этого. М>а все программы уже написаны задого до нас.
Программы — к сожалению нет. А алгоритмы манипуляции с коллекциями — да.
Найди хоть один современный язык, где нету в стандартного способа разворачивания коллекции?
G>> Ну вот я и говорю, что решение задач про гномиков это скилл, к работе не имеющий отношения. М>не спрашивали меня за гномиков (это за тех гномиков, из которых уши кодов коррекции ошибок торчат?). у нас вообще интересные интервью были с жаркими спорами, в которые постепенно втягивался весь отдел. интерью ведь не экзамен, а беседа двух умных людей и тут намного важнее позитивное впечатление произвести, чем дать правильный ответ на вопрос.
Я с тобой солидарен, но топикстартер поставил вопрос по-другому.
G>> И недоволен тем что некоторые считают такие задачи хорошим фильтром на собеседованиях. М>фильтр отбирает кандидатов еще до собеседования. и если кандидат не может обратить список, то это очень плохой фильтр и собеседовать такого кандидата -- это профукивать деньги на ветер. программистам приходится сталкиваться с нетривальными задачами, которые требуют не только знаний SDK, но и умения мыслить.
Еще раз повторю что разворачивание списка и "гномики" это скилл, не имеющий отношение к работе. В работе другие задачи, и даже если они похожи на "гномиков" люди об этом не знают.
Вот тот же морозов не увидел что из обращения иммутабельного списка тривиально выводится обращение мутабельного.
М>>как видим работает. эффективность программы напрямую зависит от эффективности insert'а и, поскольку, вставка элементов идет в середину списка, реализация рискует соснуть. как вариант -- можно сделать:
ME>очень даже рискует; я бы предположил, что тут будет квадратичная сложность, если, конечно, insert по собственной инициативе не кэширует указатель на позицию прошлой вставки для списка
извините за выражение, но в питоне все через жопу. нормальным спискам по фиг куда делать вставку в конец или в начало. во всяком случае в начало уж точно не медленнее, чем в конец. в питоне -- вставка в конец существенно быстрее вставки в начало. потому pop (а точнее даже del для облечения участи сборщика мусора) с append во временный список здорово выиграет по времени.
ME>а в питоне вообще есть способ написать *свой* inplace reverse? че-то опять сомневаюсь -- видимо только list.reverse и юзать
если очень-очень хочется, то можно реализовать свой итератор, который будет помнить позицию для вставки, которую сможет использовать своя же реализация insert'а (или кастомный pop). при этом мы имеем линейную сложность. поскольку, в обоих решениях (insert и pop) позиция вставки/удаления с каждой итерацией меняется ровно на один элемент, скользящий вдоль списка? -- нам достаточно "захачить" итератор next для сохранения этой позиции внутри списка.
так что задача на питоне вполне разрешима, но это уже выходит за рамки алгоритмов и бросает нас в пучину питона, который собеседуемый может и не знать.
вообще сюрприз питона в другом. my_list[idx] = val тормозит сильнее, чем del my_list[idx]; insert(idx, val); (при условии, что val -- строка и len(val) > len(my_list[idx]) -- я как бы обратного ожидал. хотя почему тормозит -- понятно.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
"Есть несколько альтернативных дизайнов раббиения функционала на модили и их взаимодействия. По каким критериям вы будете сравнивать между собой разные дизайны?"
M>"Попробуйде сформулировать правила по которым можно выбрать способ абстрагирования для объекта. Предлагаю рассмотреть 3 способа
M>1. Использование typedef M>2. Использование типа как шаблонного параметра M>3. использование типа как абстрактного класса (с известным интерефейсом).
M>Прокоментируйте мотивацию по правилам и приеимущества и недостатки всех 3х способов."
хм.
мне было бы интересно прочитать твой ответ, но сначала я выдам свой
попытки разводить теорию на тему "Прокоментируйте мотивацию по правилам", хотя и интересны, но мне кажутся бесполезны по двум причинам:
1. с++, в первом приближении -- лучшее, но все же из говна, которое мы имеем в языках программирования; так что ответ, в общем, сводится к тому -- чтобы результат получился не слишком мимо того, что умеет с++, и не слишком неожидан для остальных разработчиков -- ведь это именно им придется выполнять те соглашения, которые мы, к сожалению, не сможем выразить так, чтобы их мог проверить компилятор
а когда и если сможем -- то это будет очень стандартная ситуация, и там не нужна теория, мотивация и прочее, а нужно следование традициям
итак, ответ -- следовать традициям, ну или выражаясь высоким стилям -- паттернам
2. твой вопрос мне чем-то напоминает вопрос "Есть девушка; прокоментируйте мотивацию по выбора способа, которым вы будете ее... ну в общем понятно что"; ответ тоже понятен -- как сочту нужным, так и буду
по преимуществам и недостаткам трех способов уже можно говорить осмысленно
M>"Попробуйде сформулировать правила по которым можно выбрать способ абстрагирования для объекта. Предлагаю рассмотреть 3 способа
M>1. Использование typedef M>2. Использование типа как шаблонного параметра M>3. использование типа как абстрактного класса (с известным интерефейсом).
M>Прокоментируйте мотивацию по правилам и приеимущества и недостатки всех 3х способов."
1 (typedef) понятно самый слабый (т.е. дает протечку абстракции), но его юзают довольно часто в сочетании с 2, т.к. не хочется городить совсем уж монстров
3 подтормаживает (затраты на вызов виртуальной функции), зачастую не дает гарантий (т.е. не всегда возможно заставить компилятор уследить за тем, что вместо абстрактного окажется конкретный тип, и получить pure virtual method call в рантайме), и кроме того, бывает что является разновидностью динамической типизации (ммм... вот я сходу не вспомню щас подобный случай, хотя надо -- речь идет о том, что даункасты, хотя и с проверкой, там неизбежны); однако чаще всего это самый надежный вариант... если его удается применить
2 весьма неплох; из недостатков -- структурная эквивалентность (хотя надо это обозвать поточнее) и отсутствие полноценного параметрического полиморфизма, т.е. случаев, когда один и тот же код (шаблон) должен в рантайме принимать аргументы реально разных типов, и мы почему-то не можем провернуть трюк с обертыванием этих типов в объекты одной иерархии
кстати, не указан еще один способ --
4. это void* , обернутый для некоторой безопасности шаблонами
на самом деле, посмотрев на задачу, даже без такого чеклиста, сразу практически видно, что некоторые способы отпадают
ME>мне было бы интересно прочитать твой ответ, но сначала я выдам свой
Мне бы не хотелось свою точку зрения навязывать , тем более , что вопросы мои не пердполагают единого четкого ответа.
ME>попытки разводить теорию на тему "Прокоментируйте мотивацию по правилам", хотя и интересны, но мне кажутся бесполезны по двум причинам:
ME>1. с++, в первом приближении -- лучшее, но все же из говна, которое мы имеем в языках программирования; так что ответ, в общем, сводится к тому -- чтобы результат получился не слишком мимо того, что умеет с++, и не слишком неожидан для остальных разработчиков -- ведь это именно им придется выполнять те соглашения, которые мы, к сожалению, не сможем выразить так, чтобы их мог проверить компилятор
ME>а когда и если сможем -- то это будет очень стандартная ситуация, и там не нужна теория, мотивация и прочее, а нужно следование традициям
ME>итак, ответ -- следовать традициям, ну или выражаясь высоким стилям -- паттернам
Мне сложно согласиться с такой посылкой.
Например класс log_destination который направляет (готовый) поток вывода конкретному потребителю (файл, сеть, экран...). А теперь представьте себе что этот объект мы абстрагируем с помощью шаблоного агрумента по ВСЕМУ коду программы. Разве вы не увидите недостатков такого решения , разве на основе преимуществ и недостатков нельзя попытаться сформировать правила выбора?
ME>2. твой вопрос мне чем-то напоминает вопрос "Есть девушка; прокоментируйте мотивацию по выбора способа, которым вы будете ее... ну в общем понятно что"; ответ тоже понятен -- как сочту нужным, так и буду
Мне не кажется такой ответ зрелым, к контексте моего вопроса.
ME>по преимуществам и недостаткам трех способов уже можно говорить осмысленно
И по ним же можно составить правила (которые не обязаны быть строгими , но легко понятными)
M>"Попробуйде сформулировать правила по которым можно выбрать способ абстрагирования для объекта. Предлагаю рассмотреть 3 способа
M>1. Использование typedef M>2. Использование типа как шаблонного параметра M>3. использование типа как абстрактного класса (с известным интерефейсом).
M>Прокоментируйте мотивацию по правилам и приеимущества и недостатки всех 3х способов."
возможно, что тут надо добавить еще и
5. вместо самого типа Т передавать Boxed<T>, где
template<class T> class Boxed: public Object {
можно это рассматривать как комбинацию приемов 2 и 3, а можно как отдельный прием
M>Мне сложно согласиться с такой посылкой.
M>Например класс log_destination который направляет (готовый) поток вывода конкретному потребителю (файл, сеть, экран...). А теперь представьте себе что этот объект мы абстрагируем с помощью шаблоного агрумента по ВСЕМУ коду программы. Разве вы не увидите недостатков такого решения , разве на основе преимуществ и недостатков нельзя попытаться сформировать правила выбора?
проблема, которая будет тут, если log_destination будет передаваться аргументом шаблона -- это то, что something<OneLogDestination> и something<OtherLogDestination> будут рассматриваться как разные типы, но она тоже решаема
зато гарантированно здесь не будет pure virtual method call
традиции предписывают делать log_destination в виде наследника абстрактного класса; впрочем, если нам придется передавать log_destination в виде значения в рантайме, то это уже не традиция, а скорее необходимость (хотя, при особом желании, можно замутить что-то подобное с шаблонным аргументом, но это будет abuse)
ME>>по преимуществам и недостаткам трех способов уже можно говорить осмысленно M>И по ним же можно составить правила (которые не обязаны быть строгими , но легко понятными)
ну попробуй; если у тебя получится -- я порадуюсь, но по-моему ты обламаешься
плясать со стороны достоинств и недостатков куда легче, чем сочинить и/или помнить эти правила, и плясать от правил
Здравствуйте, m e, Вы писали:
ME>традиции предписывают делать log_destination в виде наследника абстрактного класса; впрочем, если нам придется передавать log_destination в виде значения в рантайме, то это уже не традиция, а скорее необходимость (хотя, при особом желании, можно замутить что-то подобное с шаблонным аргументом, но это будет abuse)
Откровенно, аргументация "такая традиция" меян бы сильно смутила. А если сущетсвуют другии критерии на основе которых многие принимают схожие решения ?
M>Откровенно, аргументация "такая традиция" меян бы сильно смутила. А если сущетсвуют другии критерии на основе которых многие принимают схожие решения ?
вот и прекрасно
давай мы не торопясь, со вкусом обсудим эту тему
да, я считаю, что "такова традиция" -- это основной или первый аргумент; далее идут аргументы, специфичные для проекта, которые могут заставить принять решение, отличающиеся от традиционного
понятно, что в любом случае фундаментальными целями является максимальная проверка правильности программы компилятором, понимабельность ее людьми и легкость выполнения людьми требований, не проверямых компилятором, но выливаться все это может в т.ч. и в нетрадиционное решение (хотя, скорее всего, редко)
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, landerhigh, Вы писали:
L>>Ты будешь смеяться, но у меня в резюме практически так и написано. На поток желающих предложить очередную "once in a lifetime opportunity" никак не повлияло, надмозгов с гномиками, сортировками, недо-брайнбенчами и прочей ересью как отрезало.
ПМ>Ну да, ни одна приличная контора таких капризных девочек приглашать не станет, потому что следующей предьявой будет "отказываюсь тестировать свой код",
Нанимай тестеров
ПМ>"отказываюсь приходить на работу вовремя"
За обоздание на 2 минуты штраф 2 доллара, норма выработки баго-форм в день?
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, os24ever, Вы писали:
M>>> Пока есть положительный сдвиг , но очень малый (как по мне).
O>>Можно было бы добавить параметры: временная зона, локаль и т.д.
O>>Но задание на сеньёра, поэтому сеньёр так делать не хочет. Он помнит, что он где-то когда-то уже видел, что всё это задавалось в переменных окружения или в файлах настроек (и язык и кодировка тоже).
M>Это уже НАМНОГО ближе к идеальному с моей точки зрения ответу.
Дык время как угодно можно хранить, если требования позволяют (забить на переполнение, локали) — в твоём случае просто требования скрыты и программисту приходится гадать. Требования в исходной задачи указаны минимальные.
Здравствуйте, m e, Вы писали:
ME>... или московском офисе в гугля -- там тоже емнип можно приходить на работу в любое время
Но там нужно решать задачи про гномиков, тестировать код и согласовывать кучу фигнюшек, перед тем, как выпустить что-то в продакш. И еще, туда не берут "девочек", там работают только сильные, целеустремлённые программисты.
Здравствуйте, Паблик Морозов, Вы писали:
O>>Сам не считаю себя знатоком БД, просто язык SQL люблю.
ПМ>Реализация EAV поверх РСУБД — это хороший детектор, позволяющий увидеть ушибленных на голову SQL-ем и недопустить их в проект.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Паблик Морозов, Вы писали:
O>>>Сам не считаю себя знатоком БД, просто язык SQL люблю.
ПМ>>Реализация EAV поверх РСУБД — это хороший детектор, позволяющий увидеть ушибленных на голову SQL-ем и недопустить их в проект.
L>Что предлагаете взамен для решения той задачи?
Первое, что я предлагаю, это rethink the whole thing. Потому что
>когда в БД хранятся некие сущности, которые являются "шаблонами". А потом из этих шаблонов пользователи порождают конкретные "экземпляры", которые могут отличаться между собой значениями полей (само собой), но также могут отличаться и от шаблона, допустим, наличием дополнительных полей.
это не задача, а уже набросок какого-то решения, который может быть в корне неверным. А изгаляться по-всякому можно, но надо ли?
O>Помогите ей преобразовать эту Вселенную в SQL, нарисуйте ER-диаграмму.
О, кстати, отличная, я бы сказал, классическая задача. В том смысле, что в большинстве случаев сформулирована некорректно. Потому что условие не содержит объяснения, ЗАЧЕМ нужно из дерева составлять таблицы.
В более широком смысле эта задача переходит в "спроектируйте мне ORM".
M>Откровенно, аргументация "такая традиция" меян бы сильно смутила. А если сущетсвуют другии критерии на основе которых многие принимают схожие решения ?
"традиция" в моем понимании не означает, что получив задание реализовать класс для глокой куздры я буду носится по интернету и искать, как традиционно их реализут достаточно легко сделать это по аналогии
традиция, скорее, состоит в том, какого объема ставить себе задачу
рассмотрим тот же log_destination
задачи можно поставить в двух объемах:
1. традиционная -- мы согласны на то ограничение, что log_destination будет конкретным потомком абстрактного класса; в случае, когда этих вариантов назначения лога будет немного (высокая вероятность), то это вполне пригодный вариант
2. расширенная -- мы хотим, чтобы log_destination был объектом любого такого класса SomeClass, для которого (почти) любой класс T имеет
так что разница в дизайне "log_destination делаем в виде классовой иерархии, а потоки в виде (условно скажем) шаблонного оператора" имеется,
и происходит она из-за причины, которую ты очень-очень вряд ли сможешь четко и ясно изложить в правиле, а если и сможешь -- младшие программисты все равно смогут с тобой спорить на тему "нет, это правило у нас сейчас не приложимо"
в то время как достоинства и недостатки языковых средств весьма близки к объективным -- в особенности ответ на вопрос "проверяет ли эту хрень компилятор" на 99% объективен (оставшиеся 1% необъективности отнесен на случай возможности проверки только с помощью переусложненных шаблонов)
ME>>... или московском офисе в гугля -- там тоже емнип можно приходить на работу в любое время
ПМ>Но там нужно решать задачи про гномиков, тестировать код и согласовывать кучу фигнюшек, перед тем, как выпустить что-то в продакш. И еще, туда не берут "девочек", там работают только сильные, целеустремлённые программисты.
что-то подозрительно лексика напоминает лексику успешных менеджеров...
кстати, а кто такие "девочки" -- это те, кто отказывается приходить на работу вовремя?
Если тема заинтересовала , предлагаю подумать как реализовать функционал std::vector используя typedef и абстрактные интерфейсы. Сможете ли вы провести границу в этом случае? и насколько формальной такая граница может быть ?
M>Если тема заинтересовала , предлагаю подумать как реализовать функционал std::vector используя typedef и абстрактные интерфейсы. Сможете ли вы провести границу в этом случае? и насколько формальной такая граница может быть ?
тема безусловно интересная
функциональность std::vector используя typedef и абстрактные интерфейсы не сделать, если у нас нет настоящего параметрического полиморфизма как скажем в скале (или на худой конец в яве; еще и имплициты как в скале могут потребоваться для хорошего качества) или шаблонов (как в с++)
известные варианты без ПП -- это
1. коллекции из потомков Object-а, при доставании элемента требуется даункаст
2. интрузивные коллекции -- элементу, чтобы класться в коллекцию, требуется наследование от чего-то-там
но решения по поводу "а как реально программировать log_destination" лежит немного в стороне от этих важных моментов
если бы с++ был бы хорошим языком, то там бы не было проблемы "делать хорошо или, наоборот, делать быстро, удобно и понятно даже последнему юниору"; а в с++ эта проблема есть, так что приходится выбирать
скажем, мы выбрали хорошо (как сделаны потоки или std::vector) -- а как в таком случае, позвольте спросить, передать в функцию f пару std::vector<T*> так, что T *неизвестен*, но гарантированно *одинаков* у обоих векторов? и какая сигнатура будет у функции f? вот тут-то мы вспомни про старый добрый void*, слегка прикрытый шаблонами, или не вспомним, а?
Здравствуйте, m e, Вы писали:
ME>функциональность std::vector используя typedef и абстрактные интерфейсы не сделать....
Вот этот момент и хотелось бы заострить. Почему не сделать, какие ограничения, чем отличается "сделать" и "не сделать"? Т.е. у вас есть понимание, что можно и как сделать, но вам тяжело это сформулировать, структуировать?
ME>но решения по поводу "а как реально программировать log_destination" лежит немного в стороне от этих важных моментов
Скорее не соглашусь. Только отмечу что пример с std::vector более яркий.
M> Сможете ли вы провести границу в этом случае? и насколько формальной такая граница может быть ?
(с разбега) я думаю, очень близка к формальной -- т.е.
— на с++
— без плохо обоснованных кастов (скажем касты через макросы, используя какое-то соглашение "не употреблять вот это вне макроса" и т.п.)
— без даункастов
— без интрузии
— без склейки лексем макропроцессором
коллекцию типа std::vector не сделать
з.ы. давно-давно, еще до шаблонов, люди делали свои типобезопасные коллекции через макросы и склейку
ME>>функциональность std::vector используя typedef и абстрактные интерфейсы не сделать....
M>Вот этот момент и хотелось бы заострить. Почему не сделать, какие ограничения, чем отличается "сделать" и "не сделать"? Т.е. у вас есть понимание, что можно и как сделать, но вам тяжело это сформулировать, структуировать?
мне так кажется, что это в принципе тяжело -- например, в предыдущем посте я попытался это сделать, но мне пришлось запретить склейку макропроцессором; а ведь никто не гарантирован от того, что ее очень редко, но придется использовать даже в шаблонном коде!
M>Вот этот момент и хотелось бы заострить. Почему не сделать, какие ограничения, чем отличается "сделать" и "не сделать"?
если запретить макропроцессор (а между прочим иногда он полезен), то все становится проще
тогда полиморфизм в ооп сводится к полиморфизму функции по первому аргументы
т.е. грубо говоря template<class T> int f(T, int) еще можно запихать в рамки ооп
дальше, template<class T> T f(T, int) тоже более-менее запихивается в ооп -- в нашем распоряжении есть virtual function covariant return, НО уже может потребоваться, фактически, интрузивность + шаблоны в виде CRTP (для всяких функций типа clone)
... кхм, и правда этот список интересно было бы довести до конца, но мне кажется у него будет только теоретическая полезность, на практике же надо смотреть просто: "а можно это сделать через ооп? нельзя? ну так придется через шаблоны"
т.е. шаблоны более полиморфны, чем ооп; с другой стороны, ооп обеспечивает удобную передачу информации о типе в рантайме (ну и инкапсуляцию); видимо, что-то похожее на передаче информации о типе в рантайме можно сделать и на шаблонах, но смысла в этом особого нет -- это будет велосипед, довольно большой, и из него почти гарантированно будут торчать кишки
M>А как на вопрос по дизайну вы бы начали отвечать ?
не-не-не! хотя, по-моему, твои вопросы по с++ представляют скорее теоретическую ценность, чем практическую, мне стало интересно над ними подумать именно с теоретической стороны, а тут дизайн
M>"Есть несколько альтернативных дизайнов раббиения функционала на модили и их взаимодействия. По каким критериям вы будете сравнивать между собой разные дизайны?"
что интересно, я совершенно не останавился на очевидном, фундаментальном критерии, которые все время имел в виду -- им будет дешевизна разработки, (возможно сильно) скорректированная на возможность реюза компонентов и затрат на ловлю багов/доработку системы во время эксплуатации заказчиком; дальше возможны репутационные потери/приобритения и т.д.
M>"Есть несколько альтернативных дизайнов раббиения функционала на модили и их взаимодействия. По каким критериям вы будете сравнивать между собой разные дизайны?"
в тех случаях, когда время -- это деньги, естественно добавится критерий времени на разработку; но в любом случае деньги -- основное
Здравствуйте, StandAlone, Вы писали:
SA>, контуженных в юности адресной арифметикой и массивами, допустили к собеседованиям.
Эх, молодежь. Печально.
SA>Кодеры-задроты на марше, это печалька.
"Кодеры-задроты", это как раз те, кто кидаются модными словечками, CRM, WCF, WWF, WPF, WTF, Sharepoint, MVP etc. Настоящие инженера, имеют солидный фундемент, системное мышление и не кидаются дешевыми понтами. А интеллигентные, образованные, умные и воспитанные люди, не обзывают других "кодерами-задротами". Задумайся об этом.
Computer science is no more about computers than astronomy is about telescopes (c) Edsger Dijkstra
Здравствуйте, Codechanger, Вы писали:
___>>"Кодеры-задроты", это как раз те, кто кидаются модными словечками, CRM, WCF, WWF, WPF, WTF, Sharepoint, MVP etc.
Здравствуйте, __lambda__, Вы писали:
SA>>Кодеры-задроты на марше, это печалька.
___>"Кодеры-задроты", это как раз те, кто кидаются модными словечками, CRM, WCF, WWF, WPF, WTF, Sharepoint, MVP etc. Настоящие инженера, имеют солидный фундемент, системное мышление и не кидаются дешевыми понтами. А интеллигентные, образованные, умные и воспитанные люди, не обзывают других "кодерами-задротами". Задумайся об этом.
Извините, но солидный фундамент в области работы паяльником по транзисторам в эру схемотехники представляет исключительно теоретический интерес.
А кодеры-задроты, если их назвать mentally challenged geeks, задротами-кодерами быть не перестанут.
Ipso fuckto.
Re[5]: Откуда такая нелюбовь к дотнету, мне вот интересно?
Здравствуйте, Codechanger, Вы писали:
___>>"Кодеры-задроты", это как раз те, кто кидаются модными словечками, CRM, WCF, WWF, WPF, WTF, Sharepoint, MVP etc.
.NET тут не причем, с тем же успехом мог сказать Java, J2EE, Spring, Hibernate.
Computer science is no more about computers than astronomy is about telescopes (c) Edsger Dijkstra
Здравствуйте, StandAlone, Вы писали:
SA>Извините, но солидный фундамент в области работы паяльником по транзисторам в эру схемотехники представляет исключительно теоретический интерес.
Но мы же не про паяльники и схемотехнику говорим, а про основы программирования и системное мышление.
SA>А кодеры-задроты, если их назвать mentally challenged geeks, задротами-кодерами быть не перестанут. SA>Ipso fuckto.
Но только "кодеры-задроты", это как раз таки совсем не те люди, про которых вы говорите.
Computer science is no more about computers than astronomy is about telescopes (c) Edsger Dijkstra
Здравствуйте, m e, Вы писали:
M>>"Есть несколько альтернативных дизайнов раббиения функционала на модили и их взаимодействия. По каким критериям вы будете сравнивать между собой разные дизайны?"
ME>1. предполагаем ли мы реюзать этот код? или это местная подсистема, которую снаружи точно никто не будет использовать?
миль пардон, но мы в галактике или сферическом вакууме? в реальности дела обстоят приблизительно так:
1) кого мы можем найти/нанять и насколько легко их разогнать и собрать заново;
2) манеры+продукт+говно (с)
3) на дизайн всем ложить, главное -- это саппорт и салеза
ME>3. теперь сами критерии:
ИМХО вы совершаете большую ошибку, пытаясь построить систему в условиях идеальной невесомости. систему нужно строить не в абстрактных рамках, а с оглядкой на сложившиеся производственные отношения. мне довелось работать в тиме, где навыки девов вообще не перекрывались и потому модули приходилось писать в стык, а в не в нахлест (блин, этот чувак не знает что такое call-back'и, ладно, хрен с ним, сделаем все на итераторах). плюс был в том, что система представляла из себя сооружение в стиле конструктора "лего" и потому любая комбинация ее элементов была работоспособна и на что-то способна. минус -- дикий оверхид. один и тот же функционал был реализован дважды, а то и трижды. вы считаете, что это минус дизайна? да, конечно, это минус. но это и плюс. если васе нужен петин функционал, то вместо того, чтобы пробивать тоннель в виде апи и получать адъ зависимостей и версионностей -- вася пишет эту часть самостоятельно и никакие изменения в петином коде его не волнуют. петин модуль можно вообще изъять из системы -- вася это даже не почувствует. к тому же дублирование функционала снижает стоимость ошибок. допустим, петя реализовал базовый алгос, который заюзан в десяти других модулях. допустим, у него там есть баг. и он распространяется на все десять модулей. а если эти модули от него независимы -- все не так уж и плохо. к тому же один и тот же алгос может работать с блоками данных в пару килобайт, а в другом модулей идентичный алгос молотит гигабайты данных. алгос один -- а реализации различны (в первом случае это просто буфер в памяти, а во втором случае гигабайты ни в ram, ни в адресное пространство не влезают и все приходится писать сильно иначе)
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
М>(блин, этот чувак не знает что такое call-back'и, ладно, хрен с ним, сделаем все на итераторах)
это уже чересчур
впрочем, производственные отношения я учитывал в пункте "что можно поручить программистам широкого профиля"; предполагалось, что они все знают, что такое call-back или хотя бы могут быстренько разобраться под чутким руководством; если же дело дойдет до такого цирка что описал ты, то этот цирк тоже можно учесть так, как ты предлагаешь
М>3) на дизайн всем ложить, главное -- это саппорт и салеза
меня minorlogic спросил про дизайн, и он чувак своеобразный -- то ли романтик, то ли процесс у них там накатан хорошо, технологичен, и правда требует дизайна (отмечу, что чем ближе к железу, тем важнее именно технология, а не саппорт и салеза; скажем, сколько раз лично ты гонял lint-оподобные проги? а вот при изготовлении дизайна чипов верификация это must have, т.к. цена ошибки охрененна, в отличие от софта)
кроме того, я уже поправился, отметив стоимость саппорта как один из критериев дизайна
М>3) на дизайн всем ложить, главное -- это саппорт и салеза
впрочем, в веб-студии необоходимость саппорта быстренько заставит придерживаться порядка в дизайна и не разводить бардак
когда имеется порядка 100 копий CMS и в каждом сделан свой, несовместимый патч, в ряде копий исправлены баги, а в ряде -- нет, то это все может закончиться весьма плачевно для саппорта
ME>а вот при изготовлении дизайна чипов верификация это must have, т.к. цена ошибки охрененна, в отличие от софта)
Тут я как бы попрошу быть поаккуратнее — мы и про Фобос-Грунт можем припомнить.
Любая ошибка, допущеная мной сейчас, лишает контору всего дневного дохода. Ну, почти всего
ME>>а вот при изготовлении дизайна чипов верификация это must have, т.к. цена ошибки охрененна, в отличие от софта)
SD>Тут я как бы попрошу быть поаккуратнее — мы и про Фобос-Грунт можем припомнить. SD>Любая ошибка, допущеная мной сейчас, лишает контору всего дневного дохода. Ну, почти всего
я на стороне "тулзы для верификации -- это хорошо, и как жаль, что индустрия разработки софта прессует недостаточно для того, чтобы эти тулзы широко разрабатывались и применялись повсеместно"
Здравствуйте, m e, Вы писали:
ME>я понял это условие таким образом -- ты можешь *один* раз выбрать, меньшее или большее число ты будешь получать, затем фиксируешь свой выбор и его реализуешь
ME>какую задачу на самом деле ставил мыщъх -- это надо спросить у него; как я щас погуглил, без цикла все же можно обойтись, но тогда придется использовать деление
Вряд ли надо фиксировать один из вариантов. Если не фиксировать один из вариантов то получается простая задачка, которую можно давать на собеседования для всяких "хакерских" или "железячных" позиций. Двигаем младший битик влево для нечетных, это делается очень легко, и получаем ближайшее меньшее. Для четных — двигаем младший нолик влево (используя инвертирование задача сводится к предыдущей), получается ближайшее большее.
Если условия не фиксировать то получается задачка с множеством условий и ее за 15-30 минут не напишешь. Может вы нашли простое решение?
Здравствуйте, m e, Вы писали:
> сколько раз лично ты гонял lint-оподобные проги?
лично я гонял, поскольку у нас довольно навороченный комплекс и мой модуль только небольшая часть грандиозной системы по сложности сопоставимая с крейсером. и процедура сборки проекта занимает несколько дней. после чего пару недель он занимается самотестированием. цена ошибки тут невелика, но из-за латентности фиксить баги методом проб и ошибок не получается.
при этом я скромно молчу, что код типа:
size_t x;
...
x = ... ;
...
printf("%x\n", x);
вызовет ругательство компилятора и сборка остановится на моем модуле. после чего мне открутят яйца.
ME> кроме того, я уже поправился, отметив стоимость саппорта как один из критериев дизайна
да я же не спорю. вы все правильно пишите. в иделае все так и должно быть. а в реалиях, увы, "препод учит не тому языку, который нужен, а тот, который хоть как-то знает" (с)
хотя в РФ и в США ситуация на рынке труда очень разная. в рф мало контор, но много спецов, а потому реально в разумные сроки найти людей под дизайн и потому в рф нормально плясать от дизайна. в сша все обстоит наоборот и потому только крупные компании (типа ms и гугла) могут позволить себе такое. остальные же пляшут от людей к дизайну.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
ME>я на стороне "тулзы для верификации -- это хорошо, и как жаль, что индустрия разработки софта прессует недостаточно для того, чтобы эти тулзы широко разрабатывались и применялись повсеместно"
"Мы накормим вас вкусно, быстро, недорого — выберите два из трех" (С)