Оставлю свои пять копеек по поводу того как нужно нанимать людей. Контора SlamData (специализируется на Scala и является работадателем очень известных Scala гуру таких как Daniel Spiewak) предлагает такой подход: вы присылаете pull-request в их флагманских продукт Precog и за это сразу-же получаете либо job-offer либо чек с оплатой потраченного времени.
Ну ваш пример слегка вычурный. Это действительно два разных инженера (Electrical Engineering и Машиностроение?). Эти ребята разве что на языке математики и физики будут договариваться. Мой поинт в том, что формально мы все люди из одной сферы и занимаемся одним и тем-же — «при помощи текстовых файлов говорим компьютерам что делать ».
Я согласен с тем, что никакие тулы не отменяют необходимости думать головой и понимать, что именно ты делаешь. Я как человек из мира системного программирования (в данный момент разработка компиляторов) пишу как раз 10-20 строк в день и вполне обхожусь Vim, Makefile и grep. В этом плане я Джо поддерживаю. С другой стороны у меня есть Java OSS проект c которым без супер-соврменной IDE работать почти невозможно. Я конечно, знаю там каждую строку и даже могу на коленке (в Notepad) написать какой-нибудь патч, но я предпочитаю использовать Intellij IDEA для этого.
Мне в словах Джо вот, что приглянулось. Последний абзац. У нас действительно проблема. Мы все говорим на разных языках. Да, 40 лет назад любой программист понимал любого другого с полуслова. Но сейчас — у нас уже куча специализаций, кланов если хотите. Я не говорю, что это плохо. Это прогресс, скорее всего. Но я за то, чтобы хоть как-то сохранить связи и иметь в наличии язык на котором мы сможем говорить. И я зык этот дожен быть не тулом а чем-то более глобальным. Я глубоко надеюсь, что то что называется Computer Science и есть этот самый универсальный язык. И его нужно стараться сохранять и учить независимо от того в какой области вы работаете — веб или системного программирования.
Задача на backtracking. Из каждой позиции у коня восемь возможных ходов. Делам каждый из восьми ходов — если это было _безопасно_ идем дальше. Безопасно — значит (а) мы не ушли за пределы доски (б) мы тут еще не были.
Примерный скетч алгоритма за экспоненциальное время O(8^n)
void step(int x, int y) {
if (safe(x, y)) {
// красим ячейку
fill(x, y);
// шагаем дальше
step(x + 1, y - 2);
step(x + 2, y - 1);
// и остальные шесть ходов
}
}
void main() {
clearTable();
step(0, 0);
}
Не соглашусь. Может конечно у вас побольше опыта в получении приглашений на интервью. Мой опыт говорит мне — что это один из сложнейших этапов. Поэтому как это немалые затраты для компании — оплатить перелет и тому подобное.
ЗЫ: Был на он-сайт интервью в ARM (1 интервью + тестовое задание перед приглашением на сайт). Сейчас готовлюсь к он-сайт в одной компании из США (8 phone-screen интервью перед приглашением).
Интересно просто. Я сам бывший мотоциклист. Продал мотоцикл потом-что очень заморочено его держать, без гаража и с мотосезоном в три с половиной месяца. Хотя жалею немного.
Странно все это. Я тут немедни прошел несколько интервью. Даже не несколько — а сколько. Никто никогда не спрашивал меня о хобби. Все только и разговоров что о проектах и задачках на бумажках.
Я попробую ответить. Для меня лично, это тоже больное место — эта терминология. В умных книжках, все эти моменты ненавязчиво опускаются (т.к. видимо являются чем-то сверхэлементарным для авторов, не требующим пояснений). Что для нас — перфекционистов — является большим испытанием. Я для себя решил разграничить эти вещи следующим образом:
Персистентность — свойство объекта/структуры позволяющее поддерживать множество его версий (это требование ФП мира). Тогда, персистентная структура — это коллекция, которая позволяет выполнять тот-же набор операций и для своей предыдущей версии. Такие структуры встречаются и в императивных средах, и могут быть построены на изменяемом внутреннем состоянии (с сайд-эффектами).
Неизменяемость — свойство объекта/структуры запрещяющее его любые изменения. Понятно, что неизменяемая структура после модификации представляет собой копию предыдущей версии + конкретные изменения (например новый элемент). При этом, неизменяемые объекты всегда персистентны (т.е. версию которую мы когда-то создали мы не можем изменить/удалить). Такие структуры тоже есть в императивном мире, например java.lang.String (моя любимая коллекция). Неизменяемость — это ограничение функционального мира (т.е. отсутствие деструктивных апдейтов). Может ли неизменяемая структура быть построена на изменяемом внутреннем состоянии? Я думаю да. Есть такое понятие как локализация мутации. Отличный пример такой мутации Паша Павлов рассказывает в этом видео на примере очереди банкиров. Т.е. формально коллекция неизменяемая (по набору элементов), но во внтуренней структуре есть некоторые места, которые подвержены мутациям, т.е. нельзя сказать, что такие структуры всегда без сайд-эффектов.
ЧФСД — это класс структур без сайд-эффектов. Баста.
По делу. Во-первых, не совсем понятно что имеется ввиду под «обычные персистентные структуры». Не секрет, что ЧФСД можно реализовать и в императивной среде (например на Java), но там они не очень популярны, потому как выглядят чужеродными. Другое дело функциональные языки, где мутации, как правило, физически не-возможны — тут и выбора то большого нет. Во-вторых, эта терминология очень скользкая дорожка. Часто говоря «персистентная структура (persistent)» подразумевают ЧФСД (purely functional) и на оборот. Более того, есть еще одно смежное определение «неизменяемая структура (immutable)», которое часто используется вместо двух предыдущих. Пример. Есть совершенно идентичная реализация чисто-функционального вектора (bit-mapped vector trie) в Scala и Сlosure. В Scala он называется "immutable.Vector", в Closure — "PersistentVector".
Мне нравится звук. В наушниках если смотреть можно услышать как «гудит» снаряд когда летит. Такой воющий звук, словно, что-то крутится. По рассказам Владимира Ивановича Трунина (ветерана ВОВ, танкиста), если ты слышишь такой звук — значит снаряд летит прямо на тебя, или пройдет очень рядом.
Я к тому, что детализация в отрывке потрясающая. Т.е. взрывы сделаны, не как обычно «Бах-бабах», а с чувством. Этот ужасающий вой (которого, я никогда в кино не слышал прежде) заставляет поверить, что ты сам там сидишь.
Согласен! Читал CLRS (Кормена) в универе. Сейчас взялся за Скиену. Книга затягивает как роман. Читать ее на английском сложнее чем CLRS, но дает она намного больше. Она более практическая что-ли, с глубокими фундаментальными основами. Например, в Кормене много станиц уделяется доказательствам алгоритмов (что, вообще говоря непонятно зачем нужно). В Скиене очень много страниц уделяется байкам «из жизни» про применение алгоритмов и структур а также, вопросам и пузырям «Остановись и подумай!», которые помогают очень глубоко понять материал. Там конечно очень многое опускается. Я бы сказал, что Скиену нужно читать после Кормена (нужен бекграунд). В этом плане книга выглядит сложнее. Но как только начинаешь понимать стиль письма автора и те действительно темные углы и комнаты в которые он заглядывает (туда куда ни Кормен ни Вирт не заглядывали) становится жутко интересно.
Лучший отдых от умственного труда – это спорт (нет, очкарик, не шахматы!). Займись бегом, боксом, качай тяжести – двигайся!
Подтверждаю. Для меня достаточно двух походов в тренажерный зал в неделю, чтобы держать и тело и ум в тонусе. Это потрясающая терапия — поднимать штангу с весом больше твоего. Это дисциплина и огромное удовольствие следить за тем как меняешься ты сам и твое тело.
Можно сравнить это с написанием программы, если хотите. Ты составляешь программу тренировок (дизайн будущей программы = основные алгоритмы + иерархия классов). Ты занимаешься день за днем (программируешь будущую программу). И потом ты наслаждаешься результатом (компилируешь и запускаешь программу).
Мне в словах Джо вот, что приглянулось. Последний абзац. У нас действительно проблема. Мы все говорим на разных языках. Да, 40 лет назад любой программист понимал любого другого с полуслова. Но сейчас — у нас уже куча специализаций, кланов если хотите. Я не говорю, что это плохо. Это прогресс, скорее всего. Но я за то, чтобы хоть как-то сохранить связи и иметь в наличии язык на котором мы сможем говорить. И я зык этот дожен быть не тулом а чем-то более глобальным. Я глубоко надеюсь, что то что называется Computer Science и есть этот самый универсальный язык. И его нужно стараться сохранять и учить независимо от того в какой области вы работаете — веб или системного программирования.
Сколько времени ушло на него?
ЗЫ: Был на он-сайт интервью в ARM (1 интервью + тестовое задание перед приглашением на сайт). Сейчас готовлюсь к он-сайт в одной компании из США (8 phone-screen интервью перед приглашением).
Неправильные конторы какие-то я выбираю. Мда.
Персистентность — свойство объекта/структуры позволяющее поддерживать множество его версий (это требование ФП мира). Тогда, персистентная структура — это коллекция, которая позволяет выполнять тот-же набор операций и для своей предыдущей версии. Такие структуры встречаются и в императивных средах, и могут быть построены на изменяемом внутреннем состоянии (с сайд-эффектами).
Неизменяемость — свойство объекта/структуры запрещяющее его любые изменения. Понятно, что неизменяемая структура после модификации представляет собой копию предыдущей версии + конкретные изменения (например новый элемент). При этом, неизменяемые объекты всегда персистентны (т.е. версию которую мы когда-то создали мы не можем изменить/удалить). Такие структуры тоже есть в императивном мире, например java.lang.String (моя любимая коллекция). Неизменяемость — это ограничение функционального мира (т.е. отсутствие деструктивных апдейтов). Может ли неизменяемая структура быть построена на изменяемом внутреннем состоянии? Я думаю да. Есть такое понятие как локализация мутации. Отличный пример такой мутации Паша Павлов рассказывает в этом видео на примере очереди банкиров. Т.е. формально коллекция неизменяемая (по набору элементов), но во внтуренней структуре есть некоторые места, которые подвержены мутациям, т.е. нельзя сказать, что такие структуры всегда без сайд-эффектов.
ЧФСД — это класс структур без сайд-эффектов. Баста.
По делу. Во-первых, не совсем понятно что имеется ввиду под «обычные персистентные структуры». Не секрет, что ЧФСД можно реализовать и в императивной среде (например на Java), но там они не очень популярны, потому как выглядят чужеродными. Другое дело функциональные языки, где мутации, как правило, физически не-возможны — тут и выбора то большого нет. Во-вторых, эта терминология очень скользкая дорожка. Часто говоря «персистентная структура (persistent)» подразумевают ЧФСД (purely functional) и на оборот. Более того, есть еще одно смежное определение «неизменяемая структура (immutable)», которое часто используется вместо двух предыдущих. Пример. Есть совершенно идентичная реализация чисто-функционального вектора (bit-mapped vector trie) в Scala и Сlosure. В Scala он называется "immutable.Vector", в Closure — "PersistentVector".
Я к тому, что детализация в отрывке потрясающая. Т.е. взрывы сделаны, не как обычно «Бах-бабах», а с чувством. Этот ужасающий вой (которого, я никогда в кино не слышал прежде) заставляет поверить, что ты сам там сидишь.
Не на правах рекламы.
Подтверждаю. Для меня достаточно двух походов в тренажерный зал в неделю, чтобы держать и тело и ум в тонусе. Это потрясающая терапия — поднимать штангу с весом больше твоего. Это дисциплина и огромное удовольствие следить за тем как меняешься ты сам и твое тело.
Можно сравнить это с написанием программы, если хотите. Ты составляешь программу тренировок (дизайн будущей программы = основные алгоритмы + иерархия классов). Ты занимаешься день за днем (программируешь будущую программу). И потом ты наслаждаешься результатом (компилируешь и запускаешь программу).
Занимайтесь спортом, коллеги!