Comments 516
А вот в вэбе DDD это вообще как Йоулупукки для российских детей, чье имя может если не рассмешить, то даже напугать. Но тут я не говорю о людях которые пришли в вэб из других java c# с++ языков. И в этом не их вина, они свято верят что разработчики фраймворков просто боги которые лучше всех знают как нужно делать и если они делают так, то это единственно верное решение. То есть они учатся на увиденном. Да и куда скрыть тот факт что jQ и всякие верстки для cms до сих пор являются приоритетными.
А вот в вэбе DDD это вообще как Йоулупукки для российских детей, чье имя может если не рассмешить, то даже напугать. Но тут я не говорю о людях которые пришли в вэб из других java c# с++ языков.
Не преувеличивайте. В мире PHP уж точно DDD имеет место быть. Будущий мажорный релиз Symfony в частности обещает упрощения разработки по DDD.
Это просто прекрасно! Не думал, что смогу рыдать от смеха глядя на код)
Есть у меня, конечно, наколеночное решение с хардкодом, но это не наш метод! :)
Проблема в том, что новое поколение ребят с курсов задают такой вопрос «А что, Jquery это тоже Javascript? Не может быть!».
Если человек пошёл в университет — значит не смог освоить самостоятельно, что само по себе довольно странно.
Если же Вы намекаете на «корочку», то я с трудом верю, что где-то котируется корочка JQuery-разработчика…
если бы мне просто дали список того, что нужно знать для приобретения квалификации инженера, я запросто изучил бы это сам
Это есть, и называется сдать экзамены экстерном.
Немного не так оно есть, как в комментарии. Списки эти в пригодном для самоподготовки виде с боем нужно выбивать из деканатов/кафедр. По крайней мере лет 20 назад.
Меня всегда на форумах удивляла фраза: "да на кой мне этот js, есть же jq!"
"да на кой мне этот asm, есть же c++!"
Хоть это и шутка, но несогласным хочу напомнить, что ассемблер это тоже язык программирования. И если с jQuery аналогия неточная, то с каким-нибудь TypeScript вполне. jQuery можно считать аналогом CRT, без CRT тоже можно программы писать.
Академически — да, ассемблер это транслятор. А язык программирования называется "язык ассемблера".
Но если не придираться к словам, то слово "ассемблер" может прекрасно обозначать оба понятия.
Язык программирования без стандарта, это не язык программирования, вам не гарантируют ни метод адресации, ни даже наличие регистров, возьмите мультиклет, к примеру с его ассемблером.
Фактически, вы пытаетесь меня убедить, что x86 ассемблер, в виду его распространённости следует считать идолом ассемблера, я с этим не согласен. Если же речь не про x86, то совершенно не понятно что вы понимаете под языком ассемблера, может быть лисп машины в чипе, которые вполне себе ассемблер, потому что хардварны?
Нет, я хочу вас убедить в том, что не надо придираться к словам когда их смысл хорошо понятен из контекста.
Языки ассемблера для некоторого стекового процессора, DSP чипа и x86 — это три разных языка. Каждый из них, согласно правилам русского языка, можно назвать языком ассемблера или просто ассемблером, одинаковыми они от этого не станут.
Согласно правилам русского языка, можно назвать их ассемберами, или просто ассемблерами, одинаковыми они от этого не станут, и вот тут я уже придираюсь. Потому что речь шла о языках, а не правилах русского языка.
Все языки можно называть ассемблерами. А любой конкретный из них будет ассемблером.
Форма Бэкуса — Наура (сокр. БНФ, Бэкуса — Наура форма) — формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории.
В русском языке есть выражение "написано на ассемблере", которое имеет вполне понятный смысл. Как-то странно, что вы одни части русского языка учитываете, а другие игнорируете)
И да, писать можно и в ассемблере который имеет почти всегда встроенный редактор и для ассемблера, можно даже писать машинные коды. Если вы не слишком заморачиваетесь правилами русского языка, то можно писать в машинных когдах и на ассемблере, но «язык программирования» это конкретное понятие, которое даже не эквивалентно просто языку, до которого его сокращают, что почти всегда позволяет контекст. К чему заметка-то? Я не о правилах русского языка, я computer science, формальные грамматики, алгоритмы, языки программирования… не чувствуется связь, конекст какой-нибудь, не? И как-то страно, что алгоритм имеет определение, и язык программирования тоже и можно рассждать не в стиле, что мой дедушка так гвоорил и мне завещал?
Это разные диалекты одного языка и он разный на разных процессорах, C более стандартизован, а вариантов Бейсика — великое множество, Паскаля поменьше.
Фактически, вы пытаетесь меня убедить, что x86 ассемблер
Нет. фактически вы приписываете оппоненту свои фантазии, ибо x86 (другого не знаете?) ранее упомняут не был.
А я писал на языке ассемблера и в голове транслировал в машкоды — у меня был ассемблер или я им был? :) Тем не менее, в подавляющем большинстве случаев по контексту слово "ассемблер" ассоциируется вполне однозначно, уточнений "программа?", "язык?", "для какой архитектуры?", "какой диалект?" практически всегда не делаю.
Почему запись программы не может быть просто в машинных кодах или в мнемониках комманд процессора? Я например, совершенно точно писал машинные коды, потому что не было кода установки энного бита в байте и я по маске модифицировал три бита в самом коде комманды, превращая конкретную установку в нужную мне. Не зная, за что отвечают биты в коде комманды такое нельзя сделать, опираясь только на мнемонику.
Я и машинные коды, в тетрадке в клетку
Что не делает из языка ассемблера не язык программирования (низкоуровневый).
Я думаю, в контексте статьи понятно, что речь идет про язык ассемблера
Язык ассемблера — машинно-ориентированный язык низкого уровня
Сам же смысл языка программирования в абстрагировании от архитектуры, в том, что он чётко сформулирован и есть понимание что в нём можно делать, что нельзя. А если этих правил нет (выше я приводил пример, что даже регистров может не быть, не говоря уже про способы адресации и троичную логику как в Сетунь), может это всё-таки не язык?
Сам же смысл языка программирования в абстрагировании от архитектуры
Вы пропустили словосочетание "высокого уровня"
Сам же смысл языка программирования в абстрагировании от архитектуры
Это ваше личное понимание. Может имеет какое-то отношение к языкам высокого уровня (но далеко не во всех из них есть полная абстракция от архитектуры даже в таких базовых вещах как размер целого числа), но к языкам условного среднего (C например или Forth) и низкого (машинные языки, ассемблеры) точно не относится. Лишь немногие из популярных языков высокого уровня создавались изначально с целью полностью абстрагироваться от архитектуры, да и то подавляющее большинство пошло путем спецификации виртуальной машины, в машинный язык или ассемблер которой транслируется язык высокого уровня, то есть по сути язык не абстрагирован от архитектуры машины, а наоборот, жёстко привязан к одной-единственной, просто машина виртуальная, сама абстрагирует от реального железа.
Смысл языка программирования в возможности написания программ. Абстракция это уровень выше, и относится только языкам программирования высокого уровня, а не ко всем.
Язык ассемблера для x86 это один язык программирования, для ARM это другой. В пределах одного языка есть синтаксис и есть правила, что можно делать и что нельзя.
Кроме того, написание программ возможно и без всякого языка и транслятора, прямо в машинных когдах, смысл же языка программирования именно в синтаксисе, что вы упрямо отрицаете.
Например вики:
Язык программи́рования — формальный язык
Ну можете назвать машинные коды языком кодов, если вам так хочется и закончим на этом тему. Для меня же нет языка ассемблера, есть машинный код, есть ассемблер или транслятор и есть язык программирования обозначающий формальные правила.
Вот в той статье, откуда вы привели определение, есть фраза "пользовались непосредственно машинным кодом,… который принято считать языком программирования первого поколения".
К первому поколению (англ. first-generation programming language, 1GL) относят машинные языки — языки программирования на уровне команд процессора конкретной машины.
И нет, смысл языка программирования не в синтаксисе, а в возможности записи компьютерных программ. У русского языка есть синтаксис, но он не является языком программирования. Также, не каждый формальный язык является языком программирования.
И у любого ассемблера есть свой синтаксис. C ваших же слов:
синтаксис АТ&Т вам о чём-нибудь говорит
смысл же языка программирования именно в синтаксисе
В той же статье, откуда я привёл описание, написано:
Фактически, эти термины в то время не использовались.Зато ассемблер — использовался.
Читаем дальше:
языки программирования… лучше представлять как среды разработки
Моё мнение о этой статье: писал человек который хочет систематизировать всё и вся не разбираясь в предмете. Но цитата которую привёл я — важна и не сама по себе, а в связи. Почитайте про формальные грамматики, про то, как описываются языки программирования. Вообще, я не вижу смысла в нашем споре, если вы хотите называть языком и машинные коды и IDE, это ваше право. Я очень хорошо высказал своё мнение в письмах, более подробно разжевать мою позицию уже нельзя. И думаю, что вы её прекрасно поняли.
Значит не туда собеседовались, а может и туда, просто сейчас фраза не так всплыла, но, если это какая-то маломальская дизайнерская студия, то там знания jq просто обязательны, и для них это является очень большим фактором, но если при этом они сказали, что незнание библиотеки является незнанием языка, то это уже точно маломаломаломальская дизайн студия с теми, кто сам не знает js...
Ну скажем так, код на бумашке писать — дело первых программистов, вроде Ады) А мне это тупо не удобно, но я понимаю, что мне IDE только в помощь дана, она за меня ничерта не придумает. Поэтому к таким тестам я отношусь вполне нормально. Меня больше прикалываются такие тесты:
напишите на <придуманный язык/язык, который вообще не связан с предметом собеседования> программу, выполняющую <какое-то задание>
Такие задания реально интересны и показывают насколько у тебя бошка думает, а вот тесты типа
с помощью jq вставьте 3 разных случайных числа от 6 до 21 в блоки#test
,.test
и третий найденныйb
Вот это мрак, направленный чисто на знание библиотеки, а не оценки твоих умственных способностей.
Стоп, а обычно пишут на реальном коде? Я просто обычно использовал помесь python и js, ибо читаемость в python больше, а на js собеседуюсь...
И да, ИДЕ, очень сильно ускоряет написание кода и корректирует ход мыслей в правильном направлении.
Это тест насколько человек способен думать самостоятельно, без подсказок
Ну тут еще вопрос, что больше показывает способность думать самостоятельно) Когда человек сам пишет решение задачи, с которой он возможно уже сталкивался и потратил какое-то время на поиск этого решения, или когда человек ищет информацию в интернете, а значит точно ее не знает, и потом полученные знания правильно применяет для решения задачи.
Я конечно преувеличиваю, но по-моему этот тест не очень показательный.
Ну это в ваших тестах нет ничего такого. Я просто к тому, что в общем случае это утверждение не истинно. Это зависит от задачи.
Например, индекс ближайшего по значению элемента я найду. А вот какой-нибудь хитрый алгоритм обхода графа с заданными требованиями по времени и памяти уже вряд ли, надо будет информацию поискать.
Справедливо. Убрал "более чем", теперь работает округление.
Боюсь, что многие не осознают ошибку. Судя по количеству заявленных правильных ответов. Наверно надо бы предложить задержку в 1 секунду.
Each print must be asynchronous call console.log function with a 50ms delay.
Скорее всего, это вы не осознаете, что это условие неоднозначно, и не обязательно требует задержки 50ms между каждым принтом.
Да, я уже понял — тынц
Все равно не вижу проблем.
[...Array(100)].map((_, i) => i+1).reduce((x, y) => x.then(() => new Promise(resolve => {
if (y % 3 == 0 && y % 5 == 0) console.log("MissKiss");
else if (y % 3 == 0) console.log("Miss");
else if (y % 5 == 0) console.log("Kiss");
else console.log(y);
setTimeout(resolve, 50);
})), Promise.resolve())
Написал за 2 минуты без гугла, причем большая часть времени ушла на постоянные взгляды в условие на английском. Можно и понятнее написать — но это уже не на время.
А кто вам сказал что я всегда пишу в таком стиле?
У этой задачи есть 4 решения.
- Через async/await
- Через библиотеку async
- Через рекурсию
- Через reduce
Первые два — понятные и красивые, но первое требует babel или tcs для старых браузеров, а второе — отдельной библиотеки. Подключать их дольше, чем писать решение.
Варианты 3 и 4 — одинаково ужасны, но не требуют дополнительных инструментов.
PS кстати, прочтите решение еще раз. Там вообще-то есть декомпозиция.
Покажите пример кода, пожалуйста!
!function() {
var n = 0;
var interval = setInterval(function() {
if (n++ == 100) return clearInterval(interval);
// ...
console.log(...);
}, 50);
}()
Задержка 50мс для 100 элементов как бы неявно предполагает, что последняя надпись будет выведена через 5 секунд (5000 миллисекунд), плюс-минус точность таймеров операционной системы.
И это только setInterval.
Во-первых, setTImeout на 50 мс вызывается не ранее, чем через 50 мс, но чаще — более.
Во-вторых, если мы не под QNX сидим, у нас практически никогда ОС не выдаст событие таймера ровно через 50 мс. В винде по умолчанию например таймер тикает 64 раза в секунду, это 15.6мс в каждом тике. Т.е. в случае setTimeout на 50 вы будете получать в реальности один тик каждые 62 милисекунды. Нефиговая такая погрешность в 24%, не так ли?
Ну дальше ещё браузер своё откушает (ему нужно самому интерфейс перерисовать, анимации всякие покрутить, сборщик мусора запустить), потом запустит event loop для вашего скрипта, и только потом дойдёт до собственно вашего обработчика.
Так что любой код на setTimeout будет выполнятся секунд 7 вместо 5.
Это все от задачи зависит. Например, если задержка является эмуляцией сетевого запроса — то только новый setTimeout после предыдущего будет корректным.
function kissMiss(){
for(let i = 1, t=50; i<=100; i++, t+=50) {
setTimeout(()=>{
let s = '';
s = !(i%3) ? 'Miss': '';
s += !(i%5) ? 'Kiss': '';
s = s ? s : i;
console.log(t +' >> '+s);
},t);
}
}
Наверно вот такой код имелся ввиду:
function kissMiss(){
let startTime = new Date();
for(let i = 1, t=50; i<=100; i++, t+=50) {
setTimeout(()=>{
let s = '';
s = !(i%3) ? 'Miss': '';
s += !(i%5) ? 'Kiss': '';
s = s ? s : i;
console.log((new Date() - startTime) + ' >> ' + t +' >> '+s);
},t);
}
}
Но по большому счеты, эксперимент показывает что setTimeout вполне подходит, у меня в хроме ровно 50мс между вызовами, хотя до первого чуть-больше.
А что проверяем-то? То что хром умеет к переменной 50 прибавлять?
Да не, это я ступил. Сорри. Хром сам умеет выводить таймштамп перед логами. https://www.screencast.com/t/Wj4Wedqfrh
Я уже настолько привык к этой фиче, что забыл, что это не настройка по умолчанию.
function PrintRangeWithDelay( begin, end, delay ){
var recursion = function( current ){
if( current > end ) return;
setTimeout( function( ){
var miss = "";
var print = "" + current;
if( current % 3 === 0 ) print = miss = "Miss";
if( current % 5 === 0 ) print = miss + "Kiss";
console.log( print );
recursion( ++current );
}, delay );
};
recursion(begin);
}
PrintRangeWithDelay( 1, 100 ,50 );
И за счёт setTimeout стек не забивается.
Напишите программу, которая печатает числа от 1 до 100. Но для кратных трём значений «Fizz» вместо номера и для кратных пяти «Buzz». Для чисел, одновременно кратных трём и пяти — «FizzBuzz»
Это я решил на добром С++
main()
{
for(int i=0;i<100;i++)
{
if(i/3%10 == 0)
if(i/5%10 == 0)
cin<<"FizzBuzz"<<endl;
else
cin<<"Fizz";
else
if(i/5%10 == 0) cin<<"Buzz"<<endl;
else
cin<<i<<endl;
}
system("pause");
}
Тут обсуждается другая задача. Читайте пост внимательнее.
Теперь по более серьезному — i / 3 % 10 это вообще что у вас? Проверка делится ли (i/3) без остатка на 10? А зачем? В задаче нужно проверить делится ли i без остатка на 3 и на 5, то есть i % 3 == 0 было бы достаточно.
system(«pause») — си++ он может запускаться на разных платформах но этой строкой кода вы намерство прибили программу к винде.
Это отличительная черта программистов, которых заставили писать консольное приложение, или даже убедили что консольные приложения — это круто, но которым забыли объяснить как эту самую консоль правильно запускать...
Да, обычно это студенты или школьники. Но не обязательно.
Часть ещё используют getc
/gets
, тут от препода зависит, видимо. Мало у кого видел, чтобы этого не было вообще. Видимо, не осиливают в vs поставить соответствующую галочку, чтобы терминал не закрывался автоматически.
Нет конечно, с чего бы?
Окно консоли же закрывается не потому что программа завершилась — а потому что не осталось процессов, связанных с этим окном (т.е. все программы завершились).
Если вы запускаете программу из командной строки, то процесс командной строки (cmd.exe) остается привязан к консольному окну пока вы не напишете команду exit.
Да и сам алгоритм странный, три ветвления со вложенностью, когда можно двумя без вложенности. Это печальнее, на мой взгляд.
Алгоритм там как раз самый оптимальный, хоть это и экономия на спичках.
На счет инклюдов думал и решился их не писать. А с cin/cout дырявая башка, дай пирожка, вечно путаю.
Про i/3%10, что первым пришло в голову, опыта не хватило додуматься.
system(«pause») то же самое что и выше, можно конечно с getchar().
А с кроссплатформенностью никогда не встречался, вот и не задумываюсь перед тем использовать одно или другое. Всю жизнь на винде, так и помру с ней.
Могу сказать только спасибо, иначе даже сам не смог бы понять с чего так заминусовали.
Ну и вообще изучить синтаксис async/await
Не понял за что вас заминусили, спасибо за идею с reduce и [...Array(n)]
Но ваш код не идеален. Тут достаточно двух условий
В простой цикл на js нельзя включить задержку (в версиях языка до ES2017).
А оно надо? У меня ушло 4:20 как раз на вот это:
let q = v => new Promise(resolve => setTimeout(() =>
{
console.log(v);
resolve();
}, 50));
let p = Promise.resolve();
for(let i = 1; i <= 100; ++ i)
{
let msg = i;
if(i % 3 === 0 && i % 5 === 0) msg = 'MissKiss';
else if (i % 3 === 0) msg = 'Miss';
else if (i % 5 === 0) msg = 'Kiss';
p = p.then(() => q(msg));
}
На красоту и оптимальность не претендую. Писал на скорую руку прямо в отладчике. Но тут как раз простой цикл.
И создавать строчку каждый раз необязательно
y % 3 == 0 && y % 5 == 0 эквивалентно y % 15 == 0
Вообще ненужно
Нет, математику прогуливал интерпретатор. Если посмотреть бенчмарк — то становится видно, что в Хроме условие y % 3 == 0 && y % 5 == 0
работает быстрее чем y % 15 == 0
!
Покажите код, пожалуйста. Интересно же!
Но для кратных трех значений «Fizz» вместо номера и для кратных пяти «Buzz».Написано по-русски, но совершенно непонятно. Я бы тоже, пожалуй, не смог решить задачу, если бы условие выглядело таким образом.
3 минуты. В правильном варианте принты хоть и асинхронные, но последовательные, я делал параллельные — это считается надеюсь?
Покажите код, пожалуйста. Интересно же!
for (let i = 1; i <= 100; i++) {
let print = '';
if (i % 3 == 0) {
print = 'Miss';
}
if (i % 5 == 0) {
print += 'Kiss';
}
if (!print) {
print = i;
}
(function(text){
setTimeout(function(){
console.log(text);
}, 50 * i);
})(print);
}
for (var i = 1; i <= 100; i++) {
if (i % 3 === 0 && i % 5 === 0) {
setTimeout(print('miss kiss'), 1000);
} else if (i % 3 === 0) {
setTimeout(print('miss'), 1000);
} else if (i % 5 === 0) {
setTimeout(print('kiss'), 1000);
} else {
setTimeout(print(i), 1000);
}
}
function print(str) {
return function() {
console.log(str);
}
}
for (let i = 1; i <= 100; i++) {
setTimeout(() => {
var r = "";
r += i % 3 == 0 ? "Miss" : "";
r += i % 5 == 0 ? "Kiss" : "";
r = (r.length == 0) ? i : r;
console.log(r);
}, 50);
}
function printNum(num) {
if (num % 3 == 0 && num % 5 == 0) {
console.log("MissKiss");
} else if (num % 3 == 0) {
console.log("Miss");
} else if (num % 5 == 0) {
console.log("Kiss");
} else {
console.log(num);
}
}
function makePrintNum(i) {
return function () {
printNum(i);
}
}
for (var i = 1; i <= 100; i++) {
setTimeout(makePrintNum(i), i * 50);
}
Ваш код выплевывает все значения сразу. Попробуйте изменить задержку на 1 секунду, чтобы увидеть ошибку.
Each print must be asynchronous call console.log function with a 50ms delay
В задаче не указано, что задержка должна быть от каждого предыдущего принта, а не от точки старта. Я изначально понял эту задачу именно так, поэтому так и реализовал.
Да, скорее всего разумнее было бы делать задержку между вызовами, тем не менее — неточность в задании я трактовал в свою пользу
Да, убедительно.
Более того (ИМХО) решение автора не удовлетворяет условию в том виде, как он его трактует.
В его случае задержка также должна быть уменьшена время выполнения кода предыдущего шага.
В текущем примере это слабо заметно, но, думается мне, что если поставить «Number.MAX_SAFE_INTEGER» вместо 100, то можно будет увидеть, что время между первым и последним выводом будет не Number.MAX_SAFE_INTEGER*50, а на несколько миллисекунд больше.
function ExecR(i) {
var wrtext = "";
if (i % 3 == 0) wrtext = "Miss";
if (i % 5 == 0) wrtext += "Kiss";
if (wrtext == "") wrtext = i;
console.log(wrtext);
if (i < 100) window.setTimeout(function () { ExecR(i + 1); }, 50);
}
ExecR(0);
But for multiples of three print «Miss» instead of the number and for the multiples of five print «Kiss»т.е. кратное 3 = Miss
кратное 5 = Kiss
А у вас по ссылке (n % 3 === 0)? 'Kiss'
т.е. 99 = Kiss, 100 = Miss
Итого, решение не правильно (не соответствует условию). И за сколько в итоге вы решили? (Если это ваше решение)
Признаюсь, что у меня ушло 67 минут, применяя гугление
if (n <= 100) setTimeout(() => {
let s = (n % 3 === 0)? 'Kiss': '';
if (n % 5 === 0) {
s += 'Miss';
} else if (s === '') {
s = n;
}
console.log(s);
fn(++n);
}, 50);
})(1);
Т.е. задача еще не решена (решена не правильно), и время значит еще идет.
Гы-гы. Спасибо! Исправил.
Это если со скоупами напутать...
Write a program that prints into console the numbers from 1 to 100. But for multiples of three print «Miss» instead of the number and for the multiples of five print «Kiss». For numbers which are multiples of both three and five print «MissKiss». Each print must be asynchronous call console.log function with a 50ms delay.Хоть слово про JavaScript?
В javascript и языках на его основе. Само название метода несет в себе наследие браузера, где консоль — нечто опциональное. В языках, которые начинали как языки системного программирования такой метод не может называться log, он будет называться write или print :-)
Да, он относится к стандартной библиотеке.
И должно «подразумевать» подобным образом минимальное количество ограничений.
В противном случае, это просто неуважение к кандидату.
Я думаю, конкретно это задание было придумано для проверки именно js-разработчиков. Т.е. язык программирования не попал в цитату потому что уже был указан в наименовании вакансии.
Строго говоря, это можно считать методом стандартной библиотеки в современных браузерах и nodejs. Например, в IE <= 9 console.log
не отпределён (undefined
) пока не открыты dev tools.
Другой стандартный пример js без console.log
:
-> % jjs
jjs> console.log("test");
<shell>:1 ReferenceError: "console" is not defined
jjs>
1. GoTo
2. Лишние проверки
3. Нет асинхронности и задержки
Автором, которого он имеет в виду, является Имрана Гхори
который, очевидно, отворачивается от многих программистов
люди, которые борются за код,
самопровозглашенные старшие программисты
терпит неудачу во время интервью
их просят выполнить основные задачи программирования
не могут запрограммировать свой путь из бумажного мешка.
кто пишет программное обеспечение для жизни.
и так далее и тому подобное
Перевод ужасен, извините.
Знаю :( Я совсем не переводчик. Очень впечатлила статья. Не мог удержаться.
Как любят повторять в одной конторе, где мне посчастливилось трудиться: критикуешь-предлагай.
критикуешь-предлагай
Не сочтите за попытку уязвить, но я бы предложил для начала дать прочитать переведенный материал кому-нибудь и спросить «что непонятно»? Когда перевод стилистически коряв, но хотя бы понятен на русском языке — это одно. У вас совершенно другое.
люди, которые борются за код
«struggle to code» — испытывают проблемы с написанием кода
Они борются с крошечными проблемами
«They struggle with tiny problems» — испытывают проблемы с решением крошечных задачек
терпит неудачу во время интервью
«fail (during interview) when asked to carry out basic programming tasks» — Не справляются, кода их просят решить простейшие задачи (на собеседовании)
Я более чем готов сократить ограничения
«I'm more than willing to cut freshly minted software developers slack at the beginning of their career» — Я более чем готов (пойти на уступки / дать поблажки) новоиспеченным программистам на старте их карьеры.
Большое спасибо. Внёс правки. Рассчитываю на вашу помощь в дальнейшем.
а я вот только что решил потыкать англоязычные ссылки и был весьма удивлен, что вся статья базируется на статьях 2005-2007 годов
очень странный временной откат в статье на злободневную тему, вероятность достоверности данных низкая
самопровозглашенные старшие программисты
Тут все верно — в оригинале так же self-proclaimed. Ну, «старшие» некий аналог Senior, допустимый по контексту, кмк.
То есть «так называемые старшие программисты» или «люди, которые называли себя старшими программистами» или что-то более изящное. Но «Самопровозглашенные» не пойдет.
Спасибо, поправил: "кандидаты на старшего программиста".
Как лучше?
кандидаты, подававшие резюме на вакансию «Senior developer»
Вы подсмотрели неправильный перевод. Самопровозглашённые было гораздо лучше, потому что верно отражало смысл. Зря вы его убрали :)
Впрочем, окей, если бы это была единственная проблема с переводом — сошло бы за немного тяжеловесный каламбур.
Впрочем, речь в статье об элементарной неграмотности. Увы, это так. Это случилось от того, что вместо аналитических способностей оценивается соответствие неким абстрактным требованиям. Причем имеющим малое отношение к реальным нуждам программирования. Решение принимают люди, далекие от программирования. HR, коммерсы. У них не то, что понятия нет о программировании, они говорят на другом языке, мыслят по другому.
5 минут на решение. Мне 17 на работу возьмёте? :) Эти задачи может решить любой школьник просто почитав w3schools до конца. Если это единственное препятствие на собеседовании (нет последующих этапов) то набёрете много новичков.
А то я сначала сильно удивился зачем столько намудрено для обычного цикла, а только потом увидел описание на английском.
Писал в консоли хрома, поэтому не пугайтесь форматирования, у него жутко неудобно писать несколько строк.
Это «синхронный» вариант. Минут 5 и то из-за того, что копировал эти Kiss/Miss из задания.
let n = 1;
let interval = setInterval(() => {
if (n % 3 == 0 && n % 5 == 0) {console.log('MissKiss');}
else if (n % 3 == 0) {console.log('Kiss');}
else if (n % 5 == 0) {console.log('Miss')}
else {console.log(n)};
n++;
if (n == 101) {clearInterval(interval)}
}, 50);
Но вообще странно, где он берет 99 «программистов», которые не могут вообще ничего написать на это задание.
Спасибо за статью!
js знаю поверхностно
поэтому без всяких let и функций
var i, a, b;
for (i=1; i<101; i++) {
a=i % 3;
b=i % 5;
if (a==0 && b==0) {
console.log('MissKiss');
} else if (a==0) {
console.log('Miss');
} else if (b==0) {
console.log('Kiss');
} else {
console.log(i);
}}
И это неправильный ответ :)
И что тут неправильного? Если вы про
Each print must be asynchronous call console.log function with a 50ms delay.
, то я как бы и не владею полноценно js
Это уже нюанс, на решение которого надо потратить еще чуток времени
Ну нельзя же быть наполовину беременной, например.
соглашусь, но.
- я не программист ни разу, на задание потратил 4 минуты
- исходя из п.1 с огромной вероятностью следует, что тот, кто программист — напишет этот код быстрее и добавит асинхронность вывода с задержкой.
А значит автор статьи гиперболизирует проблему и ее нет
Проблема не в том, что программисты не справляются с задачей — а в том что "не программисты" приходят на собеседования на должности программистов и иногда даже их принимают.
Насколько я понял из статьи, все собеседующиеся имеют какие-то должности, спец.образование. Если все же ситуация имеет вероятность часто быть, то я бы сделал вывод о том, что
а) проблема с образованием (отсутствие качественно проверки и т.п.)
б) проблема в перенасыщенности информацией, когда люди на простых задачах впадают в ступор, но при этом отлично решают более сложные задачи
Все стали программистами — 1с-программистами, css-программистами, html-программистами.
Прочитал первые 10 страниц книги по программированию, и уже программист.
Мало того, я считаю 90% текущих программистов отнести к кодерам.
А кодеру незазорно не смочь создать решение.
Квалификация "программист" присваивается выпускникам ПТУ согласно действующим нормативным документам.
Инженер корпоративных систем 3 разряда.
Инженер веб-решений 7 разряда.
И прочее.
Человека, который не сумел написать FizzBuzz, нельзя отнести даже к кодерам.
В том-то и вопрос, что масса програмистов учили и умеют синхронный код программировать. Почему так мало смыслят в асинхронное программирование на бумаге — вот это совсем другая тема и как-то не очень корректно путать топлое с мягким.
for i in range(1,101,1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz");
elif i % 3 == 0:
print("Fizz");
elif i % 5 == 0:
print("Buzz");
else:
print(i);
for(var i=1; i<=100; ++i){
var s = '';
if(i%3==0){
s = 'Miss';
}
if(i%5==0){
s = s+'Kiss';
}
if(s=='') s = i;
setTimeout(( function(){ var x = s; return function(){ console.log(x) }})(), 51);
}
Вишенкой на торте задержка в 51мс, потому что когда я полез смотреть решение сразу увидел строку
// Боюсь, что многие не осознают ошибку. Судя по количеству заявленных правильных ответов. Попробуйте изменить задержку на 1 секунду.
и недоумевая таки изменил её на 1 секунду, после чего уже прочёл решение
Попробуйте изменить на 1000 мс. Ваш вариант выплевывает в консоль все ответы сразу.
Правильное окончание задания звучало бы как «между выводами чисел должна быть не блокирующая задержка в 50 мс»
Вместо var x=s; можно было бы перед s написать let, а не var и использовать s на вывод. :)
Не поленился и накарябал, не подглядывая в жс, в 10 минут уложился.
var range = Enumerable.Range(1, 100);
foreach (var item in range)
{
if (item % 3 == 0 && item % 5 == 0)
{
Console.WriteLine("FizzBuzz");
}
if (item % 3 == 0)
{
Console.WriteLine("Fizz");
}
if (item % 5 == 0)
{
Console.WriteLine("Buzz");
}
else
{
Console.WriteLine(item);
}
}
static void Main(string[] args)
{
for (int i = 0; i <= 100; i++)
{
string s = "";
if (IsDivisableBy(i, 3))
{
s += "Kiss";
}
if (IsDivisableBy(i, 5))
{
s += "Miss";
}
if (s.Length == 0)
{
s = i.ToString();
}
PrintAsync(s);
Thread.Sleep(50);
}
Console.ReadKey();
}
static bool IsDivisableBy(int sourceNum, int divisor)
{
return ((sourceNum % divisor) == 0) ? true : false;
}
static async void PrintAsync(string s)
{
await Task.Run(() => Console.WriteLine(s));
}
Зачем, ну зачем IsDivisableBy? Что оно делает?
Это на тут случай если кто-то не знает что в шарпе делает оператор %
?
Не говорю уже про ? true : false;
...
s += ((i % 3) == 0) ? "Kiss" : "";
слишком просто :))
public static bool IsDivisableBy(this int source, int divisor)
{
return ((source % divisor) == 0 ? true : false);
}
тогда тело цикла было бы как раз более читаемо с применением ?:
string s = "";
s += (i.IsDivisableBy(3) ? "Kiss" : "");
s += (i.IsDivisableBy(5) ? "Miss" : "");
if (s.Length==0)
{
s = i.ToString();
}
Почему вы в таком случае пишите s += ...
, а не s = string.Concat(s, ...)
?
public static IEnumerable<string> Names(this int index)
{
if (index.IsDivisableBy(3))
yield return "Kiss";
if (index.IsDivisableBy(5))
yield return "Miss";
}
string s = string.Concat(i.Names());
if (s.Length == 0)
// ...
Вы правда считаете такое хорошим кодом — или издеваетесь?
Т.е. вы считаете нормальным намеренно раздувать код, чтобы он начал казаться чем-то сложным?
Речь, скорее, о демонстрации на данном примере из собеседования, что кроме решения непосредственно задачи можно ещё показать умение пользоваться методами расширения, yield return'ом и async/await.
Ясное дело, что решение с минимальным читаемым кодом — это про другое.
Нет. Задачи класса FizzBuzz проверяют именно тот факт, что вы в принципе в состоянии писать код и держать при этом простой код простым.
Написание FizzBuzzEnterpriseEdition на собеседовании будет провалом.
Вспомнилась прекрасная серия от Kyle Kingsbury (aka Aphyr): Reversing the technical interview, Hexing the technical interview и Typing the technical interview. Крайне рекомендую к прочтению всем у кого с английским более-менее.
У этой серии есть два перевода на Хабре:
Заклиная техническое интервью
Типизируя техническое интервью
"Если бы я нанимал программиста" :), я бы сто пудов предпочёл того, кто не будет усложнять простое. Ибо нужен человек, который решает задачи за минимальную цену, а не "изображает из себя профессионала" (намеренное усложнение простой задачи вряд ли можно назвать иначе). Профессионал способен дозировать усилие (умное слово YAGNI).
Уже скидывали тут решеньеце этой задачки на реально сложном и не понятном...
А вам про что в посте написали? Не верите? Ну вот оно… теже яйца, только в профиль
class Program
{
static async Task FizzBazz()
{
for (var i = 1; i < 101; i++)
{
await Task.Delay(50);
switch ((i % 3, i % 5))
{
case var t when t.Item1 == 0 && t.Item2 == 0:
Console.WriteLine("MissKiss");
break;
case var t when t.Item1 == 0:
Console.WriteLine("Miss");
break;
case var t when t.Item2 == 0:
Console.WriteLine("Kiss");
break;
default:
Console.WriteLine(i);
break;
}
}
}
static void Main(string[] args)
{
FizzBazz().Wait();
Console.ReadKey();
}
}
Так вроде проще.
if (n % 5 === 0) {
s += 'Kiss';
}
console.log((s==='')? n: s);
const delay = 50, f = function _f(i) {
if (i > 100) return;
setTimeout(() => {
let s = '';
if (i % 3 === 0) s += 'Miss';
if (i % 5 === 0) s += 'Kiss';
console.log(s ? s : i);
_f(++i);
}, delay);
};
f(1);
for (let i = 1, s = ''; i < 101; i++) (s = (i % 3 ? '' : 'Miss') + (i % 5 ? '' : 'Kiss')) && setTimeout(function() { console.log(s); }, 50 * i);
Сначала сделал через setTimeout 50, потом прочитал, что это неправильно, перепугался и сделал через промисы.
var printOne = (i) => new Promise((resolve) => setTimeout(() => {
if (i % 3 === 0 && i % 5 === 0) {
console.log('MissKiss')
} else if (i % 3 === 0) {
console.log('Miss')
} else if (i % 5 === 0) {
console.log('Kiss')
} else {
console.log(i)
}
resolve();
}, 50));
var printIteration = (i) => {
if (++i > 100) return;
return printOne(i)
.then(() => printIteration(i));
}
printIteration(0);
Может отредактировать условие задачи чтобы сразу было понятно что они должны друг за другом следовать по 50 мс, а не просто "каждый console.log — асинхронный через 50мс"?
LOL
(timeout => new Promise(async res => {
for (let i = 1; i <= 100; i += 1) {
await new Promise(cb => setTimeout(cb, timeout));
if (!(i % 5) && !(i % 3)) {
console.log('MissKiss');
} else if (!(i % 5)) {
console.log('Kiss');
} else if (!(i % 3)) {
console.log('Miss');
} else {
console.log(i);
}
}
res();
}))(50);
Внешний Promise у вас — лишний, достаточно было (async timeout => ... )(50)
Действительно, спасибо
Пока не привык до конца к async/await
Более оптимальный код, плюс уточнил по условию, что console.log должен быть вызван асинхронно
(async timeout => {
for (let i = 1; i <= 100; i += 1) {
const log = async str => new Promise(cb => setTimeout(() => {
console.log(str);
cb();
}, timeout));
if (!(i % 5) && !(i % 3)) {
await log('MissKiss');
} else if (!(i % 5)) {
await log('Kiss');
} else if (!(i % 3)) {
await log('Miss');
} else {
await log(i);
}
}
})(50);
А теперь async лишний :-)
Чорт %) Пора отдохнуть )
(async timeout => {
for (let i = 1; i <= 100; i += 1) {
const log = str => new Promise(cb => setTimeout(() => {
console.log(str);
cb();
}, timeout));
if (!(i % 5) && !(i % 3)) {
await log('MissKiss');
} else if (!(i % 5)) {
await log('Kiss');
} else if (!(i % 3)) {
await log('Miss');
} else {
await log(i);
}
}
})(50);
Пожалуйста, поясните причину минусов, а то я не понимаю что я сказал не так.
Each print must be asynchronous call console.log function with a 50ms delay.
У меня вот на это уйдет большая часть времени. Более, того, я даю 100% гарантию, что не напишу такое на собеседовании, так как:
- Во многих языках работа с асинхронными вызовами не такая простая. Привет от python 3.4, например.
- Зачем?
Потому что в этой задаче console.log заменяет собой асинхронный вызов. Вы не верите, что в реальной работе вам однажды понадобится сделать подряд 100 асинхронных вызовов?
Такие вещи не пишутся в проекте.
Ну так и надо взять библиотеку, это правильное решение (одно из)! А не заявлять, что задача слишком сложная и ее не получится написать на собеседовании.
- Я сказал, что задача сложная для тех, кто не работает в языках, в которых асинхронные вызовы приняты. Давайте я вам предложу решить эту задачу на python 3.4 или, например, на Free Pascal?
Обычно выбор библиотеки от проекта к проекте отличается, и какой смысл предлагать человеку сделать то, что он 100% не будет использовать ни на вашем проекте, ни вполне возможно, на других, а потом говорить "ну… это похоже на реальную задачу". В какой реальной задаче мне нужно будет самому написать такой код?
- Касательно библиотек. Внезапно, но я довольно часто не помню синтаксис, команды и прочее для библиотек, которые использую редко. Более того, я часто могу не помнить, как та или иная функция называется или какие ей нужны параметры и их порядок. И это нормально даже для senior разработчика, а мы говорим про джуна. У него, очевидно, может вполне не получится написать правильный код на листочке, а особено если он еще сверху оденет либу.
Я сказал, что задача сложная для тех, кто не работает в языках, в которых асинхронные вызовы приняты. Давайте я вам предложу решить эту задачу на python 3.4 или, например, на Free Pascal?
Для тех языков, где асинхронные вызовы не приняты, такой задачи просто не будет. Обсуждаемая тут задача в текущей формулировке — это именно что задача на js.
Обычно выбор библиотеки от проекта к проекте отличается, и какой смысл предлагать человеку сделать то, что он 100% не будет использовать ни на вашем проекте, ни вполне возможно, на других, а потом говорить "ну… это похоже на реальную задачу". В какой реальной задаче мне нужно будет самому написать такой код?
Надо решать эту задачу любым методом. Смысл тут — в проверке что вы вообще знаете что такое асинхронный код.
У него, очевидно, может вполне не получится написать правильный код на листочке, а особено если он еще сверху оденет либу.
Так пусть пишет за компьютером...
Так пусть пишет за компьютером...
А вы не сталкивались с:
- Нам нужно что бы ты не гуглил, а решал задачу
- С докой каждый может
- IDE не используй
И так далее?
Это отдельная проблема, не имеющая никакого отношения к обсуждаемой задаче.
Ну и в конце концов, можно дать человеку компьютер без доступа к Интернету, с голой операционкой и простым текстовым редактором. Я, например, вообще не могу писать код на бумаге. Стоит мне открыть скобу, как я её тут же закрываю. Строки я обычно пишу не последовательно, нужна возможность добавлять строки сверху, или в середину. Написав какое-нибудь длинное выражение, понимаю что результат мне нужен в нескольких местах, и надо его сохранить в переменную. И еще много всего в таком духе. Так что без IDE это одно, а на бумаге это уже совсем другое. Чтобы нормально писать код на бумаге нужно специально тренироваться. Процесс слишком отличается.
На бумаге это ещё ничего. А вот когда просят в google docs. Да ещё и фокус из окна нельзя уводить, а то вдруг ты гуглишь чего, негодяй. Бррр. В Hola так собеседуют. Я больше не задачки их решал а с отступами в "коде" воевал. Хорошо хоть не в Paint-е.
for(let i=0;i<101;i++)console.log(i%3||i%5?(i%3?(i%5?i:"Buzz"):"Fizz"):"FizzBuzz")
Я правильно понял, что каждый следующий вывод в консоль должен отстоять на 50мс от предыдущего?
Да, правильно. Остальные варианты понимания условия слишком простые.
Write a program that prints into console the numbers from 1 to 100. But for multiples of three print "Miss" instead of the number and for the multiples of five print "Kiss". For numbers which are multiples of both three and five print "MissKiss". Each print must be asynchronous call console.log function with a 50ms delay.
Вы бы хоть исправили ошибки за гуглом.

Или это гугл у вас научился?
нам надоело разговаривать с кандидатами, которые не могут запрограммировать свой путь из бумажного мешка
Если вы можете успешно написать цикл, который <...>, вы уже опережаете пакет!
Что?
Благо, что есть профессиональный перевод. Исправил методом копипаста.
for i in [1 .. 100]
if i % 3 == 0 and i % 5 == 0
console.log "MissKiss"
else if i % 3 == 0
console.log "Miss"
else if i % 5 == 0
console.log "Kiss"
else
console.log i
await setTimeout defer(), 50
Я придумал burning-hot-espresso-script.
Это как ваш кофескрипт, но для удобства символы можно писать в любом порядке (shuffle(str.split('')).join(''))
Транспилятор сам разберется какой символ куда поставить
=t
lol0
l f"ls=so iio o c
ciorct 0.l =l%ds1[Kw s% n laoe s 3 e s i
"elei 0iie%ea.i i % amns"0"cKoii=si 0, =.o. so3o lse] M5. .fsfsgons
e (g r 5e
n )
euiliTess n e =fn e" M 5= ggdi oli"s fe0o o0=t1
С чего бы это бесило программистов на чистом JS?
1. Visual Basic 6
2. VBA
3. CoffeeScript
По ссылке нет доказательств того, что именно эта возможность бесит программистов на чистом js.
Кроме того, лично для меня дико звучит сама идея что программист может ненавидеть язык за наличие в нем каких-то фич, обычно не любят либо отсутствие фич, либо непривычный синтаксис.
Для меня необ'яснимая загадка, чем не нравится coffescript подавляющему большинству
Думаю, дело в том, что он не вводит ничего нового в язык, а синтаксис меняет, причём ещё и в сторону некрасивого Ruby. Его использование говорит о том, что программист не квалифицирован оценивать соотношение рисков и пользы от добавления в проект дополнительной зависимости. В таком ключе реакция большинства на coffeescript должна быть очевидной.
Так и не понял, при чем тут заморочки конкретно JavaScript к умению программировать.
Написал решение с циклом и потом понял прикол с рекурсией.
На самом деле, для js-разработчиков асинхронное программирование musthave. Иметь скилы работы с асинхронным кодом это хорошо, но если на сервере не нужно работать с ним, то что, вешаться? Поэтому странно судить всех по 1 критерию.
А где это на сервере нету асинхронных вызовов?
В Apache :)
А если серьёзно, то "нету" и "не нужно работать с ними" (вся асинхронность скрывается ОС и рантаймом как в PHP по дефолту) — две большие разницы.
Ну окей. Тогда понятно почему у php программеров, которые пытаются на js писать встают волосы (личный опыт).
Еще в Метеоре асинхронность скрыта за ширмой фреймворка, например.
function missKiss () {
for (let i = 1; i < 100; i++) {
const triply = i % 3 === 0,
fivy = i % 5 === 0
switch (true) {
case triply && fivy:
print('MissKiss');
break;
case triply:
print('Miss');
break;
case fivy:
print('Kiss');
break;
default:
print(i);
}
}
}
function print (what) {
setTimeout(
() => {
console.log(what);
},
50
)
}
package main
import (
"bytes"
"fmt"
"strconv"
"time"
)
func print(ch <-chan string, delay time.Duration, done chan struct{}) {
for toPrint := range ch {
time.Sleep(delay)
fmt.Println(toPrint)
}
close(done)
}
const (
miss = "Miss"
kiss = "Kiss"
)
func main() {
printCh := make(chan string, 100)
doneCh := make(chan struct{})
buf := bytes.Buffer{}
go print(printCh, 50*time.Microsecond, doneCh)
for i := 1; i <= 100; i++ {
if i%3 == 0 {
buf.WriteString(miss)
}
if i%5 == 0 {
buf.WriteString(kiss)
}
if buf.Len() == 0 {
buf.WriteString(strconv.Itoa(i))
}
printCh <- buf.String()
buf.Reset()
}
close(printCh)
<-doneCh
}
На все около 7 минут ушло.
А по теме статьи — да, проблема есть, но я не понимаю, зачем давать такие задания после ознакомления с кодом кандидата. А это бывает, к сожалению, часто. Как и тестовые задания на несколько дней…
C#
for (var i = 1; i <= 100; i++) {
var message = string.Empty;
if (i % 3 == 0) {
message = "Miss";
}
if (i % 5 == 0) {
message += "Kiss";
}
Console.WriteLine(message);
Thread.Sleep(50);
}
function wait(msecond) {
var timeStart = Date.now();
var timeStop = timeStart + msecond;
for (;;) if (Date.now() > timeStop) break;
}
for (var i=1;i<=100;i++) {
var num = i;
var res3 = (num % 3 === 0) ? 'Kiss' : '';
var res5 = (num % 5 === 0) ? 'Miss' : '';
console.log((res3 || res5) ? res5 + res3 : num);
wait(50);
}
if (y % 3 == 0) {
console.log((y % 5 == 0) ? "MissKiss" : "Miss");
} else {
console.log((y % 5 == 0) ? "Kiss" : y);
}
Другие предположили, что задача пойдёт в реалии веб-дева, где завтра может прийти заказчик и сказать «Знаешь, там при делении не на 3 и 5 надо выводить MissKiss, а на 47 и 82. И ещё на 25 выводить Bingo!» и поэтому максимально прозрачно перевели условия в код, не экономя сравнения.
С искусственными задачами всегда так, кто что додумал, тот так и сделал. Хотя из условий задачи (JavaScript), по умолчанию, я бы не стал экономить на копеечных операциях.
var
out_str: String;
begin
...
if (value % 5) = 0 then out_str:="Miss";
if (value % 3) = 0 then out_str:=out_str+"Kiss";
Print(out_str);
end
Типа такого.
Почему программисты не могут программировать