У меня в универе преподавательница на первом курсе вынуждала писать код на С++ на бумажке. И ладно бы простые циклы/условия/переменные в стеке.
Едва ли не на уровне битовых операций писать заставляла.
На втором поменялся преподаватель — зная, что лабу я сдаю на Java (RESTful микросервис с каким-либо фронтом, «абы было, на красоту мне все равно»), несколько человек пишут на Django, ещё несколько вообще десктопное приложение на C# и WPF пишут, все ещё требовал учить на экзамен какие-то базовые приколы С++ типа зачем обнулять указатели, что такое битовые поля, специфика наследования в С++ (это джависту, питонщикам и дотнетовцам!).
Завалился я на вопросе «в чем отличие struct от class», потому что в моём любимом языке нет нет таких заморочек, а к экзамену я такого вопроса не готовил :))
Многопоточности к слову не было, её тихо отрицали, как явление :(
Это я к чему. Всё эти собеседования бесконечно близки к экзаменам в универе — без бумажки сходу назвать какие-то методы, которые гуглятся в две секунды (один клик в официальную документацию — профит). Я проходил два собеседования по JS на должность «ближе к джуну, но вообще ищем миддла», на одном из них мне показали реальный код ошибки в консоли Хрома, на другом — я решал алгоритмическую задачу в духе «перевернуть массив с повторяющимися элементами».
Если первое — вполне себе вменяемо, потому что с консолью фронтэндщику нужно каждый день работать, то второе просто ??? А зачем мне вообще переворачивать массивы руками? Если я буду писать на Python, я сделаю [::-1], на JS — myArray.reverse() и ничего не потеряю в скорости работы + я не думаю, что писать велосипеды на реальной работе — гуд.
На собеседовании по QA мне дали несложную логическую задачку, посмотреть на ход мышления. И мне это понравилось больше, чем извращаться с алгоритмами, 99% из которых реализованы в стандартных библиотеках, а 1% мне понадобится писать на должности сеньйора, до которого ещё дожить нужно.
P.S.
Собеседования проходил давно, алгоритмические задачи люблю, но не считаю, что умение построить красно-чёрное дерево/написать свою реализаю хэш-мапы/реализовать свой класс динамического массива — задача, которую будешь делать в реальной жизни каждый день.
Спустя некоторое время после написания статьи довелось столкнуться с паттерном Iterator в Java Stream API, в общем смысловая нагрузка и различие MoveNext() и Current() стали более понятны.
Смысл в том, что бинарная неопределенность теряется, поэтому boolean не нужен: речь о «функции без параметров»
Если мы понимаем нашу прямую задачу линейного программирования как классическую задачу «распределения ресурсов», двойственную ей задачу можно интерпретировать как задачу «оценки ресурсов».
(с) Wikipedia, по запросу «Двойственность (оптимизация)»
Не уверен, что это действительно то, что вы подразумевали, но с одной стороны немного проясняет ситуацию с обратной задачей.
Если брать чисто математически — обратную функцию, то из MoveNext(), возвращающей bool невозможно написать обратную функцию, так как, снова таки, цитируя Википедию (гораздо точнее выражает мои мысли, чем я сам):
Чтобы найти обратную функцию, нужно решить уравнение y=f(x) относительно x. Если оно имеет более чем один корень, то функции, обратной к f не существует.
Таким образом, функция обратима на интервале тогда и только тогда, когда на этом интервале она взаимно-однозначна.
Если
MoveNext :: () -> Bool
записать как bool = x.moveNext(); (1)
(Запись ближе к математическому определению функци, отсюда понятно, что отношение x к у не будет взаимно однозначным).
Следовательно, математически обратной функции к (1) не существует, т.к. мы получим уже отношение, а не функцию (не выполнится условие единому x соответствует единый y)ю
Следовательно, если ситуацию с True отбросить, т.к. она ломает нашу обратную функцию с математической точки зрения безвозвратно, то ситуация с False всегда будет соответствовать пустому множеству.
Небольшой, наверное, снова неточный вывод: если отбросить вариант с True, функция принимающая на вход ничего (False, следующего элемента в списке нет) и возвращающая пустой список (пустое значение списка), определенно имеет место быть как математическая функция (0 -> 0, не знаю, насколько это точно).
Вопрос, какой это имеет смысл?
Если я конечно, теперь, благодаря вашему комментарию и помощи Википеди лучше понял смысл.
Очень интересно было почитать статью с позиции людей, которые разработали продукт и который умер на их глазах. Несколько грустно это осознавать, но тем не менее.
Поинты «правильно & удобно» выглядят достаточно хорошо, для меня, как для простого разработчика, но да, думаю, этого недостаточно для того, чтобы оставаться конкурентноспособным на рынке.
Статья в принципе заставляет задуматься о том, почему я использую тот или иной продукт, созданный для разработчиков (например предпочитаю IntelliJ, а не бесплатные NetBeans/Eclipse), и каким образом функционирует рынок.
Всё это заставляет пересмотреть свои взгляды на разработку, и переосмыслить почему один продукт становится сверхпопулярным, а другой — пожив какое-то время, умирает.
В общем идея поиска дуалов у существующих паттернов и функций мне понятна чисто с математической точки зрения, но как человеку, не знакомому ни с C# ни с Haskell, не до конца понятна суть записи
completed :: () -> ()
next :: t -> ()
Если смысловую нагрузку
MoveNext' :: Bool -> ()
Неуверенно трактую как «вызвать Bool чтобы что-то получить» (полагаю, формулировка в корне неверна), то () -> () выглядит либо как «вызвать функцию, где return — ещё одна функция», либо «вызвать что-то чтобы получить что-то».
С паттернами и GoF в определенной мере знаком, но суть записи, увы, до конца не понимаю.
Когда я проходил собеседование в одну аутсорсинговую контору на должность Trainee/Junior (выше не претендовал) Angular Developer, меня тоже поспрашивали теории, потом перешли к практике.
Дали несложную задачку на элементарное умение находить оптимальное решение (уровень Easy LeetCode думаю, т.к. и должность не столь высокая, и фронт-энд разработчику не так остро нужны алгоритмы как другим), но так как я очень разнервинался (первое собеседование в жизни!), с фразой «Не будем привязываться к языку» накатал решение на доске на суржике из Python, псевдокода и JS.
Потому что компилировать код в голове, предвидеть ошибки на тот момент я ещё не умел, анализировать задачу я ещё не умел.
В общем задачки были очень простые, но тоже, со своеобразным подвохом, нужно было подумать.
Это я к чему веду? Я не считаю нужным при решении задач на белой доске привязываться к конкретной технологии/языку. Мы все пользуемся IDE, которая решает большое количество рутинных задач за нас, наша задача остаётся — думать и анализировать возможное решение поставленной задачи.
Кроме SQL конечно, ИМХО, SQL это такой язык, который нужно в голове уметь «запускать», он слишком простой, чтобы не уметь этого делать.
Уровень понимания языка — открывайте GitHub интервьируемого. Теорию можно заучить. А вот умение анализировать и думать в решении задачек подделать крайне сложно, как мне кажется. Разве что если человек перерешает все задачи, которые есть хотя бы с LeetCode. И то к тому моменту он уже сможет выделить общие паттерны решений и решать любые подобные задачи без проблем.
ИМХО, проверку на знание языка на собеседовании есть смысл только в IDE давать, потому что на работе-то всё равно все пользуются IDE'шками.
Если считать админами парней, которые у меня в универе работают — не совсем сходится. Да, на вид это брутальные дядьки, при близком рассмотреннии — добрейшей души люди. Один — гитарист, другой — крайне милый парнишка.
К ним регулярно обращаются преподаватели, решая задачи на уровне «включи мне компуктер, у меня лапки», но большую часть времени эти ребятки просто зависают в кабинете, занимаясь своими делами. х)
Едва ли не на уровне битовых операций писать заставляла.
На втором поменялся преподаватель — зная, что лабу я сдаю на Java (RESTful микросервис с каким-либо фронтом, «абы было, на красоту мне все равно»), несколько человек пишут на Django, ещё несколько вообще десктопное приложение на C# и WPF пишут, все ещё требовал учить на экзамен какие-то базовые приколы С++ типа зачем обнулять указатели, что такое битовые поля, специфика наследования в С++ (это джависту, питонщикам и дотнетовцам!).
Завалился я на вопросе «в чем отличие struct от class», потому что в моём любимом языке нет нет таких заморочек, а к экзамену я такого вопроса не готовил :))
Многопоточности к слову не было, её тихо отрицали, как явление :(
Это я к чему. Всё эти собеседования бесконечно близки к экзаменам в универе — без бумажки сходу назвать какие-то методы, которые гуглятся в две секунды (один клик в официальную документацию — профит). Я проходил два собеседования по JS на должность «ближе к джуну, но вообще ищем миддла», на одном из них мне показали реальный код ошибки в консоли Хрома, на другом — я решал алгоритмическую задачу в духе «перевернуть массив с повторяющимися элементами».
Если первое — вполне себе вменяемо, потому что с консолью фронтэндщику нужно каждый день работать, то второе просто ??? А зачем мне вообще переворачивать массивы руками? Если я буду писать на Python, я сделаю [::-1], на JS — myArray.reverse() и ничего не потеряю в скорости работы + я не думаю, что писать велосипеды на реальной работе — гуд.
На собеседовании по QA мне дали несложную логическую задачку, посмотреть на ход мышления. И мне это понравилось больше, чем извращаться с алгоритмами, 99% из которых реализованы в стандартных библиотеках, а 1% мне понадобится писать на должности сеньйора, до которого ещё дожить нужно.
P.S.
Собеседования проходил давно, алгоритмические задачи люблю, но не считаю, что умение построить красно-чёрное дерево/написать свою реализаю хэш-мапы/реализовать свой класс динамического массива — задача, которую будешь делать в реальной жизни каждый день.
(с) Wikipedia, по запросу «Двойственность (оптимизация)»
Не уверен, что это действительно то, что вы подразумевали, но с одной стороны немного проясняет ситуацию с обратной задачей.
Если брать чисто математически — обратную функцию, то из MoveNext(), возвращающей bool невозможно написать обратную функцию, так как, снова таки, цитируя Википедию (гораздо точнее выражает мои мысли, чем я сам):
Если
записать как
bool = x.moveNext(); (1)(Запись ближе к математическому определению функци, отсюда понятно, что отношение x к у не будет взаимно однозначным).
Следовательно, математически обратной функции к (1) не существует, т.к. мы получим уже отношение, а не функцию (не выполнится условие единому x соответствует единый y)ю
Следовательно, если ситуацию с True отбросить, т.к. она ломает нашу обратную функцию с математической точки зрения безвозвратно, то ситуация с False всегда будет соответствовать пустому множеству.
Небольшой, наверное, снова неточный вывод: если отбросить вариант с True, функция принимающая на вход ничего (False, следующего элемента в списке нет) и возвращающая пустой список (пустое значение списка), определенно имеет место быть как математическая функция (0 -> 0, не знаю, насколько это точно).
Вопрос, какой это имеет смысл?
Если я конечно, теперь, благодаря вашему комментарию и помощи Википеди лучше понял смысл.
Поинты «правильно & удобно» выглядят достаточно хорошо, для меня, как для простого разработчика, но да, думаю, этого недостаточно для того, чтобы оставаться конкурентноспособным на рынке.
Статья в принципе заставляет задуматься о том, почему я использую тот или иной продукт, созданный для разработчиков (например предпочитаю IntelliJ, а не бесплатные NetBeans/Eclipse), и каким образом функционирует рынок.
Всё это заставляет пересмотреть свои взгляды на разработку, и переосмыслить почему один продукт становится сверхпопулярным, а другой — пожив какое-то время, умирает.
Если смысловую нагрузку
Неуверенно трактую как «вызвать Bool чтобы что-то получить» (полагаю, формулировка в корне неверна), то () -> () выглядит либо как «вызвать функцию, где return — ещё одна функция», либо «вызвать что-то чтобы получить что-то».
С паттернами и GoF в определенной мере знаком, но суть записи, увы, до конца не понимаю.
Дали несложную задачку на элементарное умение находить оптимальное решение (уровень Easy LeetCode думаю, т.к. и должность не столь высокая, и фронт-энд разработчику не так остро нужны алгоритмы как другим), но так как я очень разнервинался (первое собеседование в жизни!), с фразой «Не будем привязываться к языку» накатал решение на доске на суржике из Python, псевдокода и JS.
Потому что компилировать код в голове, предвидеть ошибки на тот момент я ещё не умел, анализировать задачу я ещё не умел.
В общем задачки были очень простые, но тоже, со своеобразным подвохом, нужно было подумать.
Это я к чему веду? Я не считаю нужным при решении задач на белой доске привязываться к конкретной технологии/языку. Мы все пользуемся IDE, которая решает большое количество рутинных задач за нас, наша задача остаётся — думать и анализировать возможное решение поставленной задачи.
Кроме SQL конечно, ИМХО, SQL это такой язык, который нужно в голове уметь «запускать», он слишком простой, чтобы не уметь этого делать.
Уровень понимания языка — открывайте GitHub интервьируемого. Теорию можно заучить. А вот умение анализировать и думать в решении задачек подделать крайне сложно, как мне кажется. Разве что если человек перерешает все задачи, которые есть хотя бы с LeetCode. И то к тому моменту он уже сможет выделить общие паттерны решений и решать любые подобные задачи без проблем.
ИМХО, проверку на знание языка на собеседовании есть смысл только в IDE давать, потому что на работе-то всё равно все пользуются IDE'шками.
К ним регулярно обращаются преподаватели, решая задачи на уровне «включи мне компуктер, у меня лапки», но большую часть времени эти ребятки просто зависают в кабинете, занимаясь своими делами. х)