Задали мне на днях задачку на знание Java:
Какой результат у выражения:
[java]((int) (char) (byte) -1)[/java]
Ответ написан ниже белым цветом на белом фоне :)
Правильный ответ: 65535
Потому как byte - знаковый тип, поэтому -1 = все 8 бит - единички
Поскольку byte - знаковый, а char - нет, то происходит знаковое расширение
в результате (ВНИМАНИЕ!!!) в значении char все 16 бит - единички!
В стандарте это называется widening и narrowing primitive conversion
Вот правило: Sign extension is performed if the type of the original value is signed; zero extension if it is a char, regardless of the type to which it is being converted.

:-) Абалдеть!
Сорри за содержательный коммент, но действительно абалдеть :-) Вот так любого соискателя можно завалить.
И насчет белого на белом – тоже отличная идея.
Тот, кто мне эту задачку задал, говорил что ещё никто её не решил с первого раза.
Отсюда вывод – читайте стандарт.
Еще одна никому не нужная нерешаемая задача?
Андрей, задачка вполне решаемая. А насчет нужности – тут уж каждый сам за себя решает. Способность решить задачу показывает глубину знания языка. Конечно, если претендент не смог решить и объяснить решение еще не означает, что он плохой программист.
С другой стороны, в тестах SCJxxxx масса таких задач. Андрей, вы думаете компания Sun раздавала бы сертификаты за “никому не нужные нерешаемые задачи”?
Ок, возможно я погорячился, но:
- задача совершенно бесполезная, только если вы не набираете разработчиков компиляторов, поскольку:
* если человек ее не решил, то это еще ничего не значит
* если человек ее решил(предположим такой случай), то это значит что он всего лишь обладает неким бесполезным для вас(не разработчиков компиляторов) грузом знаний(как расширяется byte в единственный беззнаковый тип char) и некоторым уровнем развития логики, который целесообразнее определять с помощью более адекватных задач
* я пытался готовится в прошлом к собеседованиям по екзаменам сан, и на мой взгляд неадеквата там тоже хватает
* к любителям коллекционировать сертификаты java без надобности(бывают в жизни ситуации, что надобность таки настает) у меня отдельное отношение.
Вообще мой поинт таков: есть люди которые любят задавать на собеседованиях такие вот задачи, которые сами в подобных условиях их не решили бы. Поведение таких людей я не одобряю. По отношении к данной конкретной задаче, уверен что совсем чуть чуть поресерчив можно набрать таких с десяток если не больше.
У меня другое мнение на этот счет:
Если соискатель правильно ответит на подобный вопрос, то это говорит о том, что он удосужился прочитать стандарт, и что он глубоко вник в предмет, с которым работает (читай Java). А уже дает немногозначительную оценку такому кандидату.
К тому же на подобном тесте можно проследить ход мыслей кандидата.
С другой стороны никто не говорит, что решение/нерешение такой задачи должно однозначно влиять на исход собеседования – можно сделать её “по желанию соискателя”.
>>единственный беззнаковый тип char
char не единственный беззнаковый тип :) учите матчасть :)
А какой еще?..
Вот кстати другие “”завальные” вопросы которые мне пришли в голову за это время:
- что будет если вызывать из нескольких потоков методы одного и того же инстанца entity bean-а
- что случится при выполнении следующего куска кода:
void notifyTest(Object o) {
o.notify();
}
- могут ли бросать и почему ConcurrrentModificationException обращения к обьекту set если он обьявлен следующим образом:
Set set = Collections.synchronizedSet(new HashSet());
- Можно ли опускать нуллы в ArrayList и HashTable и почему?
Почему же это завальные вопросы? Вполне практичные и жизненные.
Потому что программист среднего рыночного уровня на них не ответит. Попробуй ответить ты в режиме собеседования(не подглядывая в литературу). Такие вопросы кажутся простыми когда знаешь ответ.
Если бы я на собеседовании задавал эти вопросы – меня бы мало интересовал правильный ответ – меня бы больше интересовала реакция собеседуемого, встречные вопросы, которые он бы задал, а также как он агрументировал свой выбор.
Ну так вот, это вопросы не того вида. Это вопросы типа: знаешь ты какую то определенную фишку или нет. Вопросы на которые нужно беседовать это например:
- попросить спроектировать поисковый движек/интернет магазин/корзину в эл магазине/менеджер памяти/сервис аутентификации, спросить какие алгоритмы и технологии будешь использовать и почему.
Ты не прав.
Пример: Из 2х десятков прособеседованных мною за последний год людей только 2 кандидата ответило на 4 примитивных вопроса про битовые операции (и только один ответил на ВСЕ 4 ПРАВИЛЬНО). Остальные либо отказались отвечать либо ничего внятного не сказали.
При этом каждый распылялся про классы, обьекты, шаблоны проектирования, сложные архитектуры, каждый второй делал огромные порталы с высокой нагрузкой и интернет-магазины, использовал все известные мне технологии и аббревиатуры.
Извините, но больше я на собеседованиях разговоры о высоких технологиях не веду.
Мне важно видеть задатки фундаметального образования и “правильное” направление мышления во внештатных ситуациях.
Так вот подобные “неберущиеся” вопросы очень хорошо могут в этом помочь.
P.S. У меня в списке вопросов на собеседовании нет подобных задач (но очень хотелось бы) :)
Это может обозначать что для программиста, который работает в направлении соответствующем вашей вакансии и заработной плате, не критично знание битовых операций. Так ли важно современному веб программисту знать что такое ксор? Если вдаваться в крайности можно какую нибудь теорему про гомоморфизм спрашивать.
Для web-разработчика не знать битовых операций (хотя бы AND и OR) – это нормально???
Это не разработчик! Это html-верстальщик.
Заметь, что никто не говорил про web-разработчиков! Это ты сам приписал “web-”
Если бы теорема про гомоморфизм имела хоть какое-то отношение к практическому
программированию – я бы спрашивал на cобеседовании и её. Скорее всего не в точной формулировке, но хотя бы дабы проверить что кандидат “что-то о ней слышал”.
Ты сказал про порталы с высокой нагрузкой и интернет магазины.
Абстрагируясь от стереотипов подумай сам, так ли часто современный веб программист использует битовые операции(если вообще использует). И если есть люди которые их используют — является ли это жизненно необходимым в таких ситуациях. Между тем я согласен что доскональное знание битовых операций необходимо разработчикам пишущим скажем драйвера устройств.
Да причем тут часто или не часто? Я использую часто, кто-то не часто, но при этом знать их должен каждый! Не потому что они нужны или не нужны – а потому что это основы.
Это как примитивные алгоритмы, которым меня учили в школе и на младших курсах университета. Или, по-вашему, их тоже знать/понимать не нужно?
Если человек не удосужился подучить в школе/универе/самостоятельно бинарную логику, то это не разработчик – это низкокачественный самоучка без фундаментальных знаний, который начал программировать когда понял что на чистом html гостевую книгу на домашней страничке не сделаешь.
Чему я могу его научить, и какие задачи могу поставить человеку без базовых знаний?
Как я могу работать с человеком какому прийдется “с нуля” рассказывать что такое граф, битовая маска или какая разница между классом и обьектом?
> Чему я могу его научить, и какие задачи могу поставить человеку без базовых знаний?
Писать высокопроизводительные порталы и электронные магазины?..
Во первых давай не будем бросаться в утрирование: речь шла о битовых операциях а не о графах и обьектах и классах. То есть я думаю что количество людей которые на твоих собеседованиях знали что такое граф, обьект и класс было больше 1 из 20. Если нет, то возможно это проблемы ваших ХР, которые плохо проводят скрин интервью, или вы за маленькие деньги хотите супер-мега-гипер профессионалов(типичная современная проблема).
Во вторых что бы исключить неопределенность темы спора, расскажи чем ты занимаешься, и для каких задач ты использовал графы и битовые маски. Может в вашем проекте они действительно жутко нужны, ты работаешь в гугле, и без фундаментальных алгоритмов у вас никуда. Тогда я признаю что я ошибаюсь.
Ты веришь что люди, которые на вопрос “сколько будет 4&1″ отвечают, “я забыл что это за знак такой &” или вообще отказываются отвечать, могут ответить что такое граф или отличить класс от обьекта? Увольте!
Скрин-интерью мы не проводим принципиально – не ХР-у работать с этим человеком а мне.
Насчет денег – никто никогда ещё не жаловался.
Супер-мега-профи – тоже не самоцель, но если он приходит – мы только рады – с таким человеком приятно работать.
За знатоками фундаментальных алгоритмов тоже не охотимся.
Чтобы исключить неопределенность темы спора:
Графы используются в например разных социальных сетях, алгоритмах поиска пути, анализе статистических данных; битовые маски – как минимум права доступа в unix (только не надо мне говорить что не должен разработчик их понимать).
Да и не о том спор. Я пытаюсь донести, что такие заковыристые вопросы покажут у человека наличие фундаментальных знаний и умение/желание разобраться во внештатной ситуации. Сосб-но в задачке “((int) (char) (byte) -1)” мне важен не правильный ответ, а ход мыслей.
А я пытаюсь обьяснить что если в выражении (int) (char) (byte) -1) выкинуть (char) то задача становится вообще элементарной. Если оставить то задача заключается в том: “а не удосужился ли человек прочитать стандарт джава и запомнить как именно расширяется byte к char”.
Про графы: так и не понял где у вас они используются…
Про скрин интервью: ну что же такой взгляд тоже имеет место быть.
Про бит маски: программист может делать например так: chmod u+x a.out(как по мне более цивилизованный вариант), и никакие маски ему не нужны, если даже считать команду chmod примером использования битовых масок.
Про деньги и все остальное: если бы вы в вакансиях писали зарплату программисту 2500 а не 1000 как это делаете сейчас, то к вам бы приходило куча народу которые знали бы и что такое графы, и что такое маски и все остальное.
>> “а не удосужился ли человек прочитать стандарт джава и запомнить как именно расширяется byte к char”.
Браво! Об этом то я и говорю!
Если человек прочитал стандарт Java разве это не характеризует его положительно?
А если нет – то хотя-бы должен попытаться ответить исходя из своих соображений об этом, вот тут и проявляется его понимание того, чем он хочет заниматься.
В 100ый раз повторяю – мне не интересно ответит ли он правильно или нет – мне интересны его аргументы в пользу его же версии.
Про деньги и все остальное:
Ошибаешься. Очень ошибаешься.
Узкое место: byte -> char. Предположим я не знаю как это происходит. Варианты обсуждения:
- я говорю не знаю.
- я начинаю придумывать всякие способы.
Какие могут быть аргументы? Здесь варианты – знаешь или нет, все точка, никаких аргументов быть не может.
Про деньги и все остальное:
ссылки на вакансии больше 1000 баксов в студию.
“всякие способы” – это и есть твои аргументы!
>> ссылки на вакансии больше 1000 баксов в студию.
Нефиг делать:
http://jooble.com.ua/SearchResult.aspx?kw=mysql+php+%25sl1000&rgn=78&vr=v&date=5&cntmsg=0&p=1
Просто флейм плавно перехоит в холи вор :-) Буду продавать оружие обоим сторонам.
Значит так, коллеги, предлагаю оставить обсуждение HR, зарплат и компаний. Тем более, не стоит переходить на личности. На developers.org.ua есть отличный раздел, где можно “обсудить” любую компанию.
Ответьте мне на простой вопрос: как, по вашему, эффективно провести интервью с соискателем? Установка такая: есть пол часа времени, давать “домашние задания” нельзя, так как не вполне ясно, кто их в итоге выполнит. Как адекватно оценить человека?
Мой подход, это задавать последовательность вопросов от простых к сложным. К примеру:
1. Чем отличается объект от класса.
2. Чем отличается абстрактный класс от интерфейса.
3. Если создать пустой класс, создать объект этого класса и вызвать toString() то что будет? Откуда взялась реализация toString().
4. Что такое инкапсуляция, наследование?
….
n. В каких случаях следует использовать LinkedList, а в каких ArrayList.
n+1. Чем отличаются checked и unchecked исключения.
….
….
При проектировании real-time системы с требованиями доступности больше 99.9% траву какого народа вы будете курить.
И я довольно быстро пойму, на каком уровне занания соискателя начинают давать сбои. Совершенно очевидно, что задачки вроде той что сверху я дам в самом конце. Возможно я сам ее не решил, но я не считаю зазорным дать ее соискателю. Ведь должен же я знать, насколько он “круче” меня.
Если вы предложите другую стратегию оценивания – с удовольствием послушаю.
2 Vadim
Я не совсем понял какое имеет отношение к той ссылке твоя компания. Что бы не заводить спор в тупик, ты ведь работаешь в (удалено администратором)?
Про аргументы вообще не понял что ты хочешь сказать. Ты наверное хотел что бы я начал фантазировать на тему как можно byte трансформировать в char? Зачем это?
2 Юрий
Я согласен с твоим подходом, но считаю что сабджевая задача в этой последовательности лишняя, исходя из моих выше приведенных аргументов.
Кстати пункты 2 считаю стремным, поскольку:
- зачем человеку знать как реализован toString в object-e? О чем это будет говорить? (Чесно скажу не знаю как, могу только предполагать что “имя класса @ хеш код”).
Кстати на мой взгляд давать домашние задания можно, так как потом можно за 10 мин наводящих вопросов с приемлемо высокой вероятностью определить кто их делал. Другое дело что это может отпугнуть кандидатов. Я например согласен решать такое задание только ну на очень вкусное предложение.
>> зачем человеку знать как реализован toString в object-e
Вопрос состоит не в том КАК реализован toString(), а в том откуда он взялся в пустом классе (заметь, про Object не сказано ни слова).
И правильным ответом на этот вопрос будет:
“3. В результате вызова toString() мы получим результат преобразования обьекта в строку.
Реализация toString() наследуется от класса-родителя Object”.
P.S. Текущее место моей работы к этому блогу отношения не имеет, потому я не могу представлять актуальные вакансии на этом месте работы.
Ладно, я так понимаю что начальный вопрос исчерпан, все сделали для себя выводы какие захотели :)
Я не ответил на эту задачу и сомневаюсь, что ответил бы на нее через 10 лет. А теперь ситуация: я после этой статьи прихожу на собеседование и мне задають очень похожий вопрос и от этого зависит решение о принятиии меня на работу. Естественно теперь я на него отвечу :) А толку? Я показал умение мыслить? Я от этого лучше знаю устройство сановской ЖВМ? Я могу быть увереным, что такой уродский кастинг будет работать у юзера (кастомера) у которого JVM от IBM или еще от бог знает кого? Мой ответ: не допускать такого уродства в коде.
PS: Спецификации лучше конечно знать, чем не знать :-)
Ты показал что либо уже стыкался с этой проблемой и для выявления твоего понимания нужно использовать другие вопросы, либо ты очень внимательно читал спецификацию.
Да. Иначе эта JVM будет называться не Java а какой нибудь JRockit.
JRockit это сертифицированная ДЖ В М.
Пример несертифицированной: java class path. То есть если такое расширение типов прописаны в спецификациях джава, то оно должно так же работать и у IBM jvm(тоже сертифицирована) и на jrockit но не факт что на jcp(хотя скорее всего там тоже так же работает).
А мне интересно а где можно узнать какие вопросы задают на собеседованиях?
а где можно этот самый стандарт почитать? ..
Интересно бы сделать опрос кто из web разработчиков хоть раз применял битовые операции и для каких целей? Я, например, ни разу. В коде встречал только для генерации хэшкодов.
PS
Кстати белый текст на белом фоне – не очень хорошая идея, гугл считает что это обман пользователя и может применить санкции (в плане выдачи в результатах поиска)
Неужели нынешние разработчикине не пользуются битовыи масками?
Ну для примера – я использую битовые операции каждый день. Не сложные, но все же они есть.
to Vadim Voituk
Я ни разу не использовал битовые операции,
но после прочитанного уже записал в список дел))
Конечно это может быть связанно с некоторой неопытностью(2,5 года) но я о них читал только 3 года назад когда решил стать программистом и потом я их не встречал.
>>когда решил стать программистом и потом я их не встречал.
Значит, не программист ты пока что. иcпользуются они (арифметические битовые) скорее для трюков, но используются. Например,
(int x;)
x&1 == 0 – проверка на чётность
x&(x-1) == 0 – проверка на то, явл. ли число степенью двойки.
Да, скобки я там неправильно расставил – это уж сами :)
битовые операции??? это наверно их используют подобные люди которые до сих пор перебирают на радиорынках железо для 386-х :) пора взрослеть ;) чтобы жаба-девелопер использовал в повседневной жизни эти операции … это действительно отсталый способ программировать. Может в разработке эмбедед-систем или драйверов на си, но это уже другая история.
Типичный комментарий человека, который дальше клепания веб-формочек на Struts&Hibernate в своем професссиональном развитии не продвинулся.
Причем чаще всего этим страдают люди без
фундаментального образования и с глупой увереностью что “знают жизнь “, навеянной дефицитом кадров на рынке
Позволю себе привести пример использования битовых операций на Java.
При создании Composite в SWT в конструкторе нужно передать параметр int, в котором определен стиль данного Composite.
Когда разным композитам нужны разные стили очень удобно использовать битовые поля, как например в данном примере.
как пример:
new Composite(parent,ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE);
Если делать не так, то тогда нужно будет задавать какой-нибудь Map или еще что.
Мне кажется, что использовать битовые операции нужно уметь. Но тулить их нужно туда, где они действительно нужны. (что относится к любому объекту или технологии).
и главное делать это красиво. Если встретишь в коде непонятные манипуляции с битами, то, конечно, не сразу поймешь что к чему. А если вынести такие операции в отдельный класс, сделать для него красивый API, то будет намного лучше.
Читаю ваши статьи, к вам отношусь с уважением и понимаю что вы серьезный разработчик.
Говорю сразу и честно, что вряд ли бы ответил по битовым операциям на собеседовании. И мне стыдно опыта разработки на java более 5 лет, действительно забыл чему учился в институте :) (прийдется в скорое время вспоминать/исправляться). Да и сам Sun 3-4 назад убрал из своей сертификации вопросы по битовым операциям.
И вы правы что лучше такие базовые вопросы нельзя забывать/не знать, т.к. сам недавно столкнулся на практике в чужом коде с битовыми масками, пришлось немного задуматься чтобы разобраться. С другой стороны был очень удивлен когда увидел что вы не знаете некоторые основы работы с СУБД (http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/).
Наверное у каждого свои слабые стороны. С уважением.
Вадим, Адрей, Юрий теперь решите другую задачу:
[java](byte) 2000[/java]
Вы же знаете стандарты и математику – на решение 30 секунд. НЕ ПОДСМАТРИВАТЬ! РУКИ ОТ КЛАВИАТУРЫ!
Получилось? Или всё таки не дочитали стандарт (читать – НЕДОУЧИЛИ) или с математикой проблемы?
Всё к тому что на всякого найдётся управа.. и нечего строить из себя мегасобеседователей – любого можно опустить так что мать родная не узнает..
(Ответ: результат деления 16161552 на 336699) – тут уже подсказка впрочем)
маразм