Доброго времени суток уважаемые участники форума. Хочу вам рассказать историю, которая не оставляет меня в покое уже долгое время, она связана с функцией reduce.
Предисловие:
По своему опыту я ее использовал зная, что это функция высшего порядка (функция получающая в аргумент другую функцию и возвращающая функцию или результат функции обратно). Никогда не задумался о реализации, зная что с ее помощью можно суммировать каждый индекс массива и в результате получить общую сумму чисел (с помощью заданной в аргумент функции обратного вызова). Где-то в глубине своих знаний о JS и программировании подразумевал, что внутри итератор (for, while) и происходят всякая магия на уровне Ecmascript или C++ - который под капотом в браузере.
Случай из жизни
Некоторое время назад меня уволили из HeadHunter, я начал активно искать работу как Front-end разработчик. Соответственно использовал HH для этого с его Python (Tornado, XSLT и морем JAVA API Бэкендов). Назначили собеседование в фирме которая занимается VPS, телофонией и прочими услугами. Пришел на собеседование, сразу перешли к тестированию. Первый вопрос напишите реализацию наследования, вариант с наследованием при помощи proto подошел (Первое что пришло в голову, хотя можно было и с помощью вложенных конструкторов написать и фабрику классов). В общем написал быстро, думаю ну ладно первый вопрос готов. Спросили про Pub-Sub, рассказал как в jQuery работает он, что паттерн Observer очень люблю использовать.
И тут пришел полный провал, мужик просит написать реализацию функции в которой без итератов нужно сложить в строку все аргументы функции, в общем начал придумывать, что arguments (массив), хотя он Object-like array. Написал return arguments.toString(). (Он на меня с недоумением посмотрел и говорит давай дальше)...
Дальше еще круче, я конечно в течении не долгого времени программирую и изучаю JS (1.5 Года). Мужик дает бумажку и говорит, вот есть два массива (разный набор чисел) напиши реализацию функции map, reduce и после этого получи мол вот эту сумму с помощью этих двух функций и на бумажке показал какая логика суммирования должна быть (Аргументировал что в больших проектах все разработчики должны идеально понимать мат.часть Javascript). В общем я просто взорвал мозг, понимая какие входные данные у функций и что возвращают, пытался сообразить, как это сделать. Но спустя 10 минут, мужик пришел и спросил: Видимо не потянул, ну ладно, тебе надо учить мат.часть Javascript. Хочешь последний воспрос? Я говорю окей, он в ответ: если ответишь развернуто, получишь работу "Какую роль в регулярных выражениях занимают конечные автоматы и сможешь объяснить как они внутри работают?". Последний вопрос меня вообще в пух и прах разбил и заставил задуматься о том, что бы взять Вирта, Алгебру, Высший Матан, Факториалы, C++, структуры данных, указатели, изучить досконально машину тьюринга, записаться на TopCoder или повеситься дома из-за разочарования.
Спасибо всем кто прочитал мою историю, возможно многим она будет полезна, но интересует мнение более опытных программистов и разработчиков с большим стажем. Вот откуда черпать знания? Например javascript.ru - да есть описание функций базовых, входных - выходных данных. Даже сам Ecmascript - мат часть не раскрывает тех функций которые встроены в языке. Изучаю Python - там так-же. Единственное где видел что-то около похожее на, то что бы получить знания по реализации подобных функций (Вирт, Кнут, учебники политехов. (Теория и практика ЯП, В. Математика и прочее). Вот как систематизировать знания? Хотелось бы самому полифилы для браузеров писать, понимать как составить алгоритм. Что посоветуете?
P.S: По поводу реализации всех функций, я нашел у Mozzilla Foundation ресурс который описывает все полифилы для старых браузеров:
https://developer.mozilla.org/en-US/..._Objects/Array - Почитав, немного понял, как в следующий раз победить такого сурового дядьку на собеседовании, но это все равно заучивание. Хотелось бы услышать как люди сами пришли к понимаю подобных реализаций и каким путем. Учить функциональное программирование? Анализ функций в математике? Алгоритмы?
В итоге начал копать прям академично и досконально, разбираться как структуры данных строятся внутри памяти, какие алгоритмы бывают (сортировки, архивации, как видео кодируется и прочее, как со звуком работать, анализ сложности алгоритмов, структуры данных, C, C++, математику начал повторять начиная с алгебры, теорией множеств, численное моделирование и прочее... Мозг взрывается, программировать лучше я не стал спустя два месяца глобального погружения, почти сутками изучая фундамент. Единственное, что реально улучшило мышление - это олимпиадные задачи, примеры решения, немного помогла книга Вирта. Но все равно в голове висит вопрос, что имел ввиду мужик под выражением "Учить мат часть javascript". Может книгу драконов почитать, о том как писать свой интерпретатор, Haskell в придачу разобрать. Может есть другой способ? Например взять исходники Javascript и их почитать и разобрать?