Pull to refresh

Comments 85

Написали бы такой тест для C#, я бы вас бы расцеловал!!!
UFO just landed and posted this here
Теперь бы себя проверить :)
6. Я не безнадежен :)
Вопрос №7 ввел в ступор (параметр String и метка).
Забавляют эти тесты, которые показывают уровень задротства конкретного языка, вместо умения, собственно, программировать.
Бессмысленные и беспощадные.
Зато знание таких вот вещей очень помогает на собеседованиях. Там очень часто любят что-то в этом духе спрашивать.
Хотя тут я подобрал вопросы, которые логичны. А вот на самих экзаменах по сертификации реально большинство вопросов на задротство, притом не языка, а API, что еще хуже.
Я б в жизнь не пошёл бы в такую контору, которая такие собеседования делает. В конце концов им что надо? Шашечки или ехать?
UFO just landed and posted this here
Тем не менее такие тесты позволяют не зазнаваться, что тоже полезно. ;)
или же, наоборот, зазнаться задротствующим :)
UFO just landed and posted this here
Общее «умение программировать» — это хорошо, но оно не помогает, если:
5а. В одном jar-файле изменилось значение строковой константы, а код почему-то продолжает работать по-старому.
5б. Строковый пул одного класса не содержит имени другого класса, хотя мы наверняка знаем, что есть зависимость по использованию константы.
9. Класс в своем блоке статической инициализации регистрирует себя в реестре. Мы «дергаем» класс, а регистрации не происходит.

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

Тут большой шанс получить историю о сексе с узкоспециализированной, кривой и хитровывернутой библиотекой. Они встречаются чаще таких фундаментальных косяков, и возни с ними обычно больше.
Такая история — тоже ок. Интересно ведь, как человек выходит из затруднений, и что для него — затруднение.
Проблему иногда и не вспомнишь вот так сразу )
Зато если спросят проблему, то знающий решит мгновенно, а незнающий — вряд ли решит сразу.
Это относится только к особенностям языка и компилятора, не к сторонним библиотекам. Лично мне нюансы сторонних API почему-то запоминаются, а вот особенности языка просто откладываются и вспоминаются только либо возникновении соответствующих симптомов, либо при непосредственном программировании.
Это вопросы на понимание принципов работы языка, которое может сэкономить уйму времени на решение «WTF». Мелким аникейщикам такие знания конечно не к чему, для экспертов — обязательны.
Вобщем учите матчасть, Сэр
Зато такие знания очень помогают в попытках понять быдлокод, который тебе запрещено редактировать, ибо «работает, и не трогай» :-)
Некоторые вопросы действительно интересные. Спасибо!
ответил на 4 вопроса: 2, 4, 7, 10.
О, у меня точно такая же комбинация :-)

С 10-й лично сталкивался, жутко раздражало после плюсов :-)
Спасибо за тест. Теперь вот сижу и мне стыдно за моё знание java.
Выложите плиз ссылки на остальные более чем 990 задачек.
UFO just landed and posted this here
Прочитал пост и понял что я не знаю java :(
UFO just landed and posted this here
К сожалению, только один правильный ответ. Но уж на 4-й то вопрос думал, что правильно отвечу…
А где можно поподробнее прочитать про эти тонкости языка? Какую книгу посоветуете?
Всем советую вот эту книгу.
Без воды, детально и главное очень легко читается.
Полная противоположность Java Language Specification, который читать имхо очень тяжело.
Вот так какой нибудь задрот напишет подобный код или скопипастит, а ты сиди голову ломай.
А ещё вместо обычного класса с методом, любят понаписать вокруг этого класса разной херни и вызывают этот метод через жопу.

Чем код проще и логичнее тем лучше.
Хочу такой же по Python. И, уверен, наберутся желающие попробовать решить подобные тесты для всех других языков)
Всего только два правильных ответа. Печаль, печаль…
реквестирую ответы с подробным разбором :)
ну прямо даже… ээээ. не знаю что сказать:))
ой, простите :)
хватило пяти вопросов, чтобы понять что я не знаю java, дальше не осилил)
brainbench.com есть для тренировок, но он за деньги. Есть еще хороший ресурс quizful.net. Там достаточно интересные и обширные тесты по java и другим технологиям. Правда он в последнее время как то вяло развивается.
Да. На экзамене большинство вопросов оказалось легче чем я думал. Набрал 92% при необходимых 65.
На brainbench частенько есть бесплатные тесты и по Java тоже.
UFO just landed and posted this here
у меня всё работает. Версия джавы такая же. Возможно что-то с настройками IDE?
В любом случае не важно, класс можно переназвать ))
UFO just landed and posted this here
ну как бы это не ошибка. для утилиты javac ты указываешь имя файла, который компилить. Поэтому расширение обязательно. А для java.exe нужно указывать имя класса, а не имя файла, поэтому .class писать не нужно.
UFO just landed and posted this here
В большинстве вопросов ответом будет «0. Так не стоит писать» =)
UFO just landed and posted this here
Исходя из подписи «evil edition», череп.
ответил на 5,6,8,10((
жду продолжение!!!
Никогда в жизни не писал на Java, только на Pythonе, ответил на 2,3,7,8,9, просто по интуиции.
Чтобы сравнить с помощью == два скалярных типа надо знать про пул и особенности его устройства??!!.. Помнится когда появился С# жависты обвиняли его в нарушении принципов ООП — и это замечательно потому что там всегда 1000==1000.
А что не так? == сравнивает ссылки на объекты. Всегда. Просто когда юзается пул, получается что объект один а ссылок несколько, отсюда другой результат. Если хочешь сравнивать значения, используется equals, у которого «1000».equals («1000») всегда true.
Я не силен в c#, но разве там == и пул не точно также работает?
В C# скалярные типы хранятся в стэке и не являются ссылочными типами — думаю это небольшой мемори импакт тк типы фиксированной длины. Похожий пул используется в .net для строк — тут это оправданно. Но это не столь важно в контексте дискуссии. Важно то что для cкалярных типов и строк оператор == сравнивает значения — по мне это и удобнее и интуитивнее.
в Java тоже сравнивание примитивных типов по == работает как ожидается.
int a = 1000;
int b = 1000;

a == b -> true

В то время, как Integer — это уже не примитивный тип данных, а полноценный объект и сравнивание для него работает как для всех объектов.

А помнить надо про auto boxing-unboxing — вот тут очень много тонкостей, и пул объектов, и утечки памяти
В .net int — это алиас для полноценного типа Int32 а примитивом он называется по другим очевидным причинам. Если угодно можно хоть так сравнивать: 5.Equals(5); но куда проще 5==5. И вообще, как наличие примитивов стоящих вне общей системы типов вписывается в концепцию ООП?
А в чём спор?
> можно хоть так сравнивать: 5.Equals(5); но куда проще 5==5
Для примитивов в Java возможен только второй способ, более простой :)
Для объектов в любом руководстве по языку написано, что сравнивать объекты необходимо с помощью equals(), а не ==. Как по мне, разделение примитив-врапер удобно — разработчик сам решает что и где ему использовать (о том правильно ли он решит думать не хочется :).
К сожалению, не очень знаком с .net, поэтому не хочу развивать дискуссию «что лучше» далее.

Про концепцию ООП вообще молчу — всего должно быть в меру, примитивные типы — это как раз то разумное отступление, сделанное для удобства.
В C# скалярные типы хранятся в стэке и не являются ссылочными типами — думаю это небольшой мемори импакт тк типы фиксированной длины. Похожий пул используется в .net для строк — тут это оправданно. Но это не столь важно в контексте дискуссии. Важно то что для cкалярных типов и строк оператор == сравнивает значения — по мне это и удобнее и интуитивнее.
из интересного на собеседованиях вспонил
int i=0;
while(i){
i++;
if (i>4) break;
}

и задротства на тему необязательности выполнения второй части && и ||
>и задротства на тему необязательности выполнения второй части && и ||

А в чём тут задротство-то? Вполне нормальный вопрос, причём ситуации, где это используется, очень распространены.
Банально:

if ( array == null || array.length == 0 ) {
    return;
}

При незнании того, что в случае array == null второе сравнение не будет производиться, а следовательно можно не бояться NPE, этот код развернётся в что-то вроде

if ( array == null ) {
    return;
}
else if ( array.length == 0 ) {
    return;
}

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

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

Integer c = 0;
Integer d = 0;
...

synchronized ( c ) {
...
}
...

synchronized ( d ) {
...
}


Но это ещё ладно, всё просто будет больше тормозить, но намного хуже когда:
Integer c = 0;
...

synchronized ( c ) {
    с++;
    ...
}
...

synchronized ( с ) {
    ...
}


Вуаля, много ли кто понимает, чем это опасно?
Думаю, понимают все, кто до сюда комментарии дочитал.
да ну что Вы… простые классы уметь писать… вот ещё…
кликнул пару раз по визарду, надергал примеров из инета, слепил прогу — и программер
Интересно, как вы оправдаете бредни вроде doIt(String String)? Неужели все те люди, не знающие, что именно произойдёт в таком абсурдном случае — «научились писать простые классы и методы и считают себя самыми крутыми»? (-;
Кто сказал что я это оправдываю? :) Очевидно, что писать такой код нельзя.

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

Хотелось бы еше только, чтобы в ответах везде давалась ссылка на соотв. пункт JLS.

Типа —

«в вопросе про строковые литералы, см. „
java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5,

обратите внимание на пункт:

This example illustrates six points:
Literal strings within the same class (§8) in the same package (§7) represent references to the same String object (§4.3.1).
Literal strings within different classes in the same package represent references to the same String object.
Literal strings within different classes in different packages likewise represent references to the same String object.
Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
Strings computed by concatenation at run time are newly created and therefore distinct.

Constant expressions описаны тут — java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

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

Продолжайте писать!
Ответил на 3, 4, 5, 6, 7, 9.
Внимательности не хватает :-)
Кто возьмется такое же сделать для Ruby?
Буду благодарен.

Если в 5 задаче пометить lo как final, то hello = «Hel» + lo тоже вернёт true.
4/10.
Действительно хорошие вопросы на понимание.

Ремарка: Автор не раскрыл тему многопоточного задротства.
Тема коллекций c обобщениями раскрыта не полностью.

> Во всех книгах и статьях пишут, что члены с доступом protected видны в данном пакете и в подклассах других пакетов. Но мало кто уточняет, что за пределами пакета данные члены видны ТОЛЬКО ЧЕРЕЗ НАСЛЕДОВАНИЕ.

В C++ тоже так. И в C#, мне кажется, тоже. Так что тут нет ничего особо удивительного.
UFO just landed and posted this here
UFO just landed and posted this here
6 из 10 верно, еще на двух пролетел по невнимательности :-)
На этот раз правильно ответил на 3, 4, 5, 6, 7, 10.
Sign up to leave a comment.

Articles