Книга Стивена Вольфрама «Элементарное введение в язык Wolfram Language»

http://blog.wolfram.com/2015/12/08/i-wrote-a-book-to-teach-the-wolfram-language/
  • Перевод
  • Tutorial

Перевод поста Stephen Wolfram "I Wrote a Book—To Teach the Wolfram Language".
Выражаю огромную благодарность Кириллу Гузенко KirillGuzenko за помощь в переводе и подготовке публикации

Книга «Элементарное введение в язык Wolfram Language» доступна для вас в печатной форме, бесплатно в Интернете, а также в других формах.



Я не был уверен, что когда-нибудь напишу еще одну книгу. Моя последняя книга — Новый вид науки — заняла у меня более десяти лет интенсивной сосредоточенной работы и является моим крупнейшим проектом из всех, что я когда-либо делал.

Но некоторое время назад я понял, что мне придется написать еще одну книгу — такую, которая бы познакомила людей, не знакомых с программированием, с языком Wolfram Language и способами мышления в вычислительной сфере, которые преподносит этот язык.

Результат — книга Элементарное введение в язык Wolfram Language, вышедшая сегодня в печать. Она также свободно доступна в Интернете, и в других формах.



Цель книги — провести людей с нуля до той точки, в которой они будут достаточно знать о Wolfram Language, чтобы регулярно использовать его для создания программ для всего того, что они хотят сделать. И когда я говорю «нуль», я и в самом имею в виду «нуль». Эта книга для всех. Она не предполагает каких-либо знаний из областей программирования, математики (за исключением основ арифметики) или чего-то еще. Она просто ведёт с нуля и объясняет самые разные вещи. Я пытался сделать её пригодной как для взрослых, так и для детей. Я думаю, она вполне сгодится для обычных детей в возрасте от примерно 12 лет и старше.

В прошлом существование подобной книги было бы невозможным. Технологии, необходимые для её реализации, ещё не существовали. Серьезное программирование всегда было тяжелым трудом, и не существовало хороших способов провести связи с реальными понятиями. Но теперь у нас есть Wolfram Language. Его создание заняло три десятилетия. Но сейчас он содержит достаточное количество встроенных знаний, а процесс программирования достаточно автоматизирован, чтобы в самом деле иметь возможность провести любого человека от точки с нулевыми знаниями к границам вычислимого.



Но как это сделать? Что нужно объяснить, в каком порядке? Были проблемы, которые и сподвигли меня к написанию этой книги. Некоторое время назад я написал быстрое введение для программистов, которое в 30 страницах или около того знакомит людей, которые уже знакомы с программированием, с основными идеями Wolfram Language. Но как же люди, которые ничего не знают о программировании?

В течение многих лет я находил различные возможности показать для таких людей то, чем теперь является Wolfram Language. И вот, я использовал свой опыт, чтобы объяснить в этой книге то, что нужно делать.

Это диалог


В сущности, эта книга представляет собой беседу читателя с компьютером. Есть две важные вещи касательно Wolfram Language, которые заставляют всё работать так, как надо. Во-первых, язык является символьным, так что все, с чем он имеет дело, будь то цвет, изображение, граф, да всё что угодно — может быть представлено в диалоговом окне. А во-вторых, что язык может быть чисто функциональным, так что все в нем стабильно, а любой ввод может быть самодостаточной конструкцией.



Также весьма важно, что Wolfram Language содержит встроенные знания, что позволяет незамедлительно начать производить вычисления с реальными вещами.





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



С чего бы начать?


Хорошо, так с чего же начать? Самая первая страница книги об арифметике — ведь это та сфера, где любой сможет увидеть то, как происходят вычисления:



Там есть раздел под названием Словарь (Vocabulary), который поможет разобраться с некоторыми "словами" Wolfram Language. Также есть упражнения (Exercises), о которых я в скором времени упомяну.

Хорошо, мы закончили с арифметикой, и куда двинемся дальше? Я решил сразу перейти к представлениям функций, введя их через арифметические понятия. Плюс в том, что хотя понятие функции может быть новым для читателя, но осуществляемые ими операции (арифметические) уже знакомы.



Как только станет понятной функция Plus можно будет сразу перейти к таким функциям, как Max, для которых не требуется какое-либо специальное введение. Функция Max не делает ничего особо интересного. Более интересная функция, которую я представлю следующей — RandomInteger, которую люди любят использовать снова и снова, чтобы увидеть, что она выдаст.

Итак, что же дальше? Ответ очевиден — мы должны ввести списки. Но что же делать со списками? Выбирать из них элементы не кажется чем-то особо захватывающим, и понимание того, что это важно, приходит не сразу. Таким образом, вместо нее первой функцией для работы со списками я решил представить ListPlot. Здорово начать с визуализаций — и это также хороший пример того, как можно ввести лишь маленький кусочек кода и получить в итоге нечто большее и более интересное.



На самом деле, лучший из самых простых примеров — функция Range, которую я тут также продемонстрировал. Range — отличный способ показать что компьютер на самом деле что-то вычисляет, при том выдавая результат, который легко понять.

Ну, хорошо, теперь нам нужно закрепить представление о функциях и об их совместной работе. Функция Reverse не то чтобы очень популярна в практическом использовании, однако ее очень легко понять; далее введем функцию Join.



Радует тот факт, что с Reverse, Range и Join у нас появляется некоторый свой микроязык, который полностью самодостаточный и позволяет нам делать разнообразные вычисления. И, конечно, проводя любые вычисления, можно сразу увидеть результаты в символьной или графической форме.



Следующая пара разделов — о визуализации и работе со списками, которые закрепляют сказанное ранее и вводят различные функции, полезные на практике. Далее следует Table — очень мощная и общая функция, которая содержит в себе циклы и другие полезные вещи.

Я начинаю с простых версий Table без каких-либо итераторов. Я беру как должное то, что Table может представлять список графических элементов так же, как и список чисел (безусловно, тот факт, что он может так делать, является следствием фундаментально символьного характера Wolfram Language).



Следующий большой шаг — ввести в Table переменную. Я много думал о том, как это сделать, и решил, что лучше всего сначала показать это в чисто символьной версии. В конце концов, мы уже ввели функции, и в символьной версии можно сразу увидеть, откуда появляется переменная. Но теперь, когда мы ввели Table с переменными, мы можем пуститься во все тяжкие и начать делать то, что некоторые могут назвать «реальными вычислениями».



Ворота, ведущие в книгу


В первых нескольких разделах книги материалом для наших вычислений в основном были числа и списки. Далее я бы хотел показать, что есть и другие вещи, которые можно применять в вычислениях. Как и в первом примере, я выбрал цвета. Цвета — хороший выбор, ведь (а) все знают об их существовании, (б) вы можете проводить над ними вычисления (в) с их помощью можно получить красочный результат (!).



После цветов мы готовы перейти к графическим объектам. Я не вводил понятие координат, потому я могу показывать лишь отдельные графические объекты без информации об их положении.



И нет абсолютно никаких причин, чтобы не затронуть трёхмерные фигуры, и далее мы коснемся и их.



Теперь мы готовы к чему-то «продвинутому»: интерактивным манипуляциям. В плане синтаксиса есть большая схожесть с Table, за тем исключением, что здесь мы получаем полноценный интерактивный пользовательский интерфейс. И так как мы ввели графику, то она может быть частью интерфейса. Люди видели интерактивные интерфейсы в большом количестве разных программ. Мой опыт показывает, что они будут весьма впечатлены возможностью создавать их с нуля самостоятельно.



Следующее, что я представляю в этой книге, и, быть может, это будет несколько удивительно — обработка изображений. Да, за обработкой изображений лежит большое количество сложных вычислений. Но в Wolfram Language все скрыто внутри. И люди видят просто функции, такие как Blur, ColorNegate — и их предназначение легко понять.

Также радует то, что люди, а особенно дети, могут проводить вычисления с изображениями, просто перетащив их куда нужно. И на самом деле это первый пример в книге, когда большое количество данных поступает в программу извне (мне нужен был образец изображения для раздела, поэтому я просто снял себя, работающего над книгой, на веб-камеру).



Затем я рассказал о строках и тексте. Операции со строками — нечто весьма скучное. Но в Wolfram Language есть много интересных вещей, которые можно сделать с ними, будь-то визуализация облака слов из статьи на Википедии или поиск популярных слов на разных языках.



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



Можно задаться вопросом: «Почему бы не коснуться звука сразу после графики?» Ну, прежде всего, я думал, что было бы неплохо немного смешать некоторые вещи для поддержания интереса. Однако имеется определенная цепочка зависимостей между различными областями. Например, имена музыкальных нот задаются в виде строк, поэтому мы сперва должны упомянуть строки.

Далее следуют массивы, или списки списков. Затем — координаты и графики. Во-первых, я волновался, что координаты — нечто слишком «математическое». Но особенно после того, как мы рассмотрели массивы, координаты уже не кажутся каким-то очень сложным понятием. А так как мы рассмотрели идею о двумерных координатах, то и не представляет сложности перейти к трехмерным.



На этом этапе книги люди уже знают, как сделать некоторые реально полезные вещи с помощью Wolfram Language. Так что в следующем разделе я привел некую интерлюдию — эдакий мета-раздел, дающий представление об объеме Wolfram Language, а также показывающий, как найти информацию по конкретным темам и функциям.



Теперь, когда мы представили немного абстрактных вычислений, пришло время поговорить о реальных данных, а также показать, как получить доступ к огромному количеству данных, которые Wolfram Language представляет вместе с Wolfram|Alpha.



Многие реальные данные включают в себя единицы измерения, так что следующий раздел посвящен работе с единицами измерения. После того, как мы закончим с этим, мы сможем коснуться раздела geocomputation (вычисления, сопряженные с географией) — поиск расстояний между точками на Земле, например, или отрисовка карт.



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



Wolfram Language — очень объемный язык. Но он основан на небольшом количестве идей, которые постоянно используются снова и снова. Одна из важнейших задач книги — охватить эти идеи. И в следующий раздел — об опциях — покрывает одну простую идею, которая постоянно возникает на практике.



После опций мы готовы поговорить о кое-чем, что часто рассматривается как сложная тема: графы и сети. Но мой опыт показывает, что в наше время люди сталкиваются с достаточно большим количеством графов и сетей в их повседневной жизни, так что у них не возникнет больших проблем с пониманием их в Wolfram Language, Конечно, немного помогает то, что язык позволяет манипулировать ими непосредственно, что является еще одним примером символьных объектов.



После графов и сетей, мы готовы приступить к, казалось бы, очень сложной теме: машинному обучению. Но даже если внутренние алгоритмы машинного обучения являются сложными, сами функции, которые реализуют его в Wolfram Language, абсолютно просты для понимания. И, здорово то, что пощупав большое количество примеров с ними, можно получить очень хорошее интуитивное представление о ключевых идеях машинного обучения.



На протяжении всей книги я пытаюсь представлять вещи в максимально простой форме. Но иногда это приводит к необходимости более подробно рассматривать уже пройденную тему. «Подробнее о числах» и «Другие визуализации» являются двумя примерами, иллюстрирующими сей факт, в которых рассказывается об уже пройденных понятиях, однако для более полного понимания этих областей нам требуется вернуться к ним на новом уровне.

Функциональное программирование


Следующие несколько разделов раскрывают важную и невероятно мощную тему функционального программирования. Раньше функциональное программирование, как правило, рассматривалось как нечто сложное и совсем не то, чему стоит учить людей, только начавших осваивать программирование. Однако я думаю, что Wolfram Language изменил ситуацию, и теперь имеется возможность объяснить функциональное программирование значительно более понятным языком. Я решил начать с абстрактного разговора о процессе применения функции.



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



В следующем разделе уже можно заметить некоторые проявления реальной мощи функционального программирования. В общем виде такие функции, как NestList и NestGraph могут показаться довольно сложными и абстрактными. Но к этому моменту в книге мы рассмотрели достаточное количество конструкций Wolfram Language, так что у нас есть множество конкретных примеров, с помощью которых всё легко можно объяснить.



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



После функционального программирования следующая большая тема — шаблоны и шаблонно-ориентированное программирование. Я мог бы рассказать о них и ранее, но до сих пор в них не было нужды.



Есть нечто фундаментальное, что делает шаблоны столь мощными в Wolfram Language: единая структура для чего бы то ни было в языке, основанная на символьных выражениях. Если бы я писал спецификацию Wolfram Language, я бы начал именно с символьных выражений. И наверняка я поступил бы так же, если бы писал книгу для специалистов по теоретической информатике или чистой математике.

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

Весь стек


К этому моменту в книге мы уже готовы рассмотреть то, как можно развернуть, скажем, веб-приложение. Но перед этим нужно рассмотреть ещё кое-что. Я расскажу об ассоциациях, а затем о распознавании естественного языка. Изнутри система распознавания языка — очень сложная штука. Однако на уровне Wolfram Language распознавание легко использовать, но чтобы увидеть, как оно связывается с другими вещами, следует поговорить о чистых функциях.



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



На всё это ушло 220 страниц, или около того. Но по мне так это удивительно малое количество страниц, позволяющее перейти с нуля к, по сути, профессиональной области разработки веб-приложений. Если бы мы говорили лишь о каком-то весьма специфичном виде приложений, то это не было бы столь впечатляющим. Но мы говорим о приложениях весьма общего вида, которые могут производить вычисления практически любого вида.



Присвоение значений переменным


Если вы откроете какую-нибудь книгу о традиционном языке программирования, как, скажем, C ++ или Java, то одна из первых тем, с которыми вы столкнетесь, будет присвоение значений переменным. Но в своей книге я привожу эту тему лишь в 38-м разделе. В каком-то смысле это может показаться странным, но на самом деле это не так. Ведь в Wolfram Language вы можете сделать удивительно много, в том числе, к примеру, развернуть полноценное веб-приложение, ни разу не присваивая значения переменным.

И, по сути, это одна из причин, почему Wolfram Language столь прост в изучении. Ведь если не присваивать значения переменным, то каждый кусок кода будет независимым и всегда демонстрировать одно и то же поведение. Но как только вы начинаете присваивать значения переменным, то появляются скрытые состояния, и ваш код будет делать разные вещи в зависимости от текущих значений переменных.

Тем не менее, когда мы поговорили о присвоении значений переменным и о шаблонах, мы готовы перейти к определению своих собственных функций, что позволит нам вводить все более сложный функционал в Wolfram Language.



В этот момент читатель вполне ориентируется в терминах и основных понятиях Wolfram Language. Но последние несколько разделов книги рассказывают о некоторых важных прикладных моментах. Там есть раздел о строковых шаблонах и заменах. Далее раздел о хранении данных и кода локально и в облаке. Потом раздел об импорте и экспорте. Затем раздел о коллекциях (наборах) данных. Не каждому, кто использует Wolfram Language, когда-нибудь понадобятся коллекции (наборы) данных, но если вам придется иметь дело с большими объемами структурированных данных, то данный раздел окажется для вас весьма полезным. И все они представляют собой интересные примеры того, как реализуются различные идеи в Wolfram Language.

Разделы с эссе


В конце книги содержатся разделы с эссе различных тематик: о написании хорошего кода, об отладке, о том, каково быть программистом. Цель этих разделов — развить те пути мышления, которые, как я надеюсь, зародились в результате прочтения этой книги, а затем приобщить к некоторым абстрактным идеям.



Структурирование презентации


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



Есть несколько различных типов вопросов. Некоторые — об обсуждаемых ранее расширениях к функциональности. Некоторые — о том, что за всем этим стоит. А некоторые вопросы («Что означает возведение в степень?») могут показаться для некоторых читателей слишком простыми, но не для всех.

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

Упражнения


Другая часть, представленная в большинстве разделов — сборник упражнений. Подавляющее большинство из них представляются в формате "написать кусок кода, который делает N", а немногие — "найти более простой эквивалент этого куска кода".



В конце печатной книги содержатся ответы на все упражнения, а в веб-версии имеются дополнительные упражнения. Конечно, представляемые там ответы — лишь одни из возможных, а почти никогда не возникает ситуации, когда это единственно правильный ответ.



Написание упражнений было для меня интересным опытом, который, на самом деле, весьма важен в контексте моих размышлений о том, как, скажем, общаться с искусственным интеллектом. Ведь большая часть упражнений по сути говорит нам: "Возьми этот текст на английском и преврати его в код на Wolfram Language". Для чего-то простого английский вполне себе хорошо справляется с описанием. Но чем задачи сложнее, тем труднее их объяснить на английском. Вообще, при написании книги я часто сталкивался с ситуацией, когда гораздо проще было дать ответ к упражнению на Wolfram Language, чем писать его на английском языке.

В некотором смысле это очень даже хорошо, ведь это означает, что Wolfram Language очень хорошо подходит для выражения идей. Некоторые вещи, которые легко выражаются на английском языке, мы можем передать для интерпретации в Wolfram|Alpha. Но есть много вещей, которым необходима большая структурированность и точность, которыми обладает Wolfram Language.

Книга?


В каком-то смысле может показаться странным писать книгу, которую можно распечатать, вместо того, чтобы создать нечто с куда более гибкой структурой и в веб-формате. Но для себя я выяснил, что концепция книги может быть весьма полезной. Да, можно иметь веб-сайт, из которого мы сможем, переходя по ссылкам, почерпнуть много информации. Но когда люди пытаются изучать что-то систематически, то, полагаю, вполне хорошо иметь некоторый конечный и определенный объем информации, который поступает последовательно и позволяет обнаружить некоторую общую структуру.

Это не означает, что онлайн-книги бесполезны. Сейчас книга доступна и в веб-формате, и многие цели эта веб-версия покрывает очень даже хорошо. Но, как ни странно, я по-прежнему считаю книгу в печатном виде — с нумерацией и фиксированными страницами — лучшим вариантом для многих случаев.

Конечно, если вы собираетесь изучить Wolfram Language, то вам следует его запустить. Таким образом, даже если вы используете физическую книгу, лучше иметь компьютер (или планшет), на котором вы сможете опробовать примеры, выполнить упражнения и т.д. У вас не получится сделать это моментально, если вы читаете книгу в интернете или в облаке. Но некоторые говорили мне, что им казалось полезным перепечатывать примеры: они усваивали их лучше, а с автодополнением и другими особенностями Wolfram Language код можно вводить очень быстро.

Чего нет в книге


Я назвал эту книгу «элементарным введением». И вот что я имею в виду. Это вовсе не книга обо всех возможностях Wolfram Language — она далека от этого. Она является введением и предназначена для того, чтобы привести людей из точки, где они обладают нулевыми знаниями, к точке, в которой они могут начать писать полезные программы. Она охватывает большое количество основных принципов языка, но лишь малую долю из очень большого числа конкретных функциональных областей.

Вообще, я попытался включить лишь те области, которые либо очень часто встречаются на практике, или хорошо иллюстрируют идеи языка и являются достаточно простыми для людей, которые не обладают дополнительными знаниями. Я весьма доволен тем, сколько областей книга смогла покрыть; конечно, в других книгах могли бы быть освещены и несколько другие области.

Да, я был немного разочарован, что многие удивительные вещи, которые может осуществлять Wolfram Language, мне не удастся показать. И в конце книги я решил привести краткий раздел, который даст некоторое понимание того, что я не смог включить в основную часть.



Немного предыстории


Моя новая книга представляется мне как часть работы по запуску Wolfram Language. И в 1988 году, когда мы только выпустили Mathematica, тогда я тоже написал книгу. Но она была другая: её целью было полноценное введение, плюс она являлась справкой по всей системе. Первое издание содержало 767 страниц. Спустя 10 лет, к своему пятому изданию книга «потолстела» до 1488 страниц. И в тот момент мы решили, что книга — не лучший вариант для предоставления информации, и вместо неё построили целую онлайн систему.



И хорошо, что мы так сделали, потому что это позволило нам значительно расширить область охвата, в частности, в виде примеров. И, конечно, сама система сильно выросла в объеме, в результате чего сегодня Центр документации содержит более 50 000 страниц контента.

Многие люди говорили мне, что им нравилась оригинальная книга Mathematica и, в частности, тот факт, что это она была того объема, чтобы её реально было прочитать от корки до корки. Моя цель, сопряженная с Элементарным введением в язык Wolfram Language, снова предоставить достаточно краткую книгу, которую люди смогут полностью прочитать.

Глядя на книгу, интересно отметить то, сколько всего появилось в Wolfram Language (или в Mathematica) лишь совсем недавно. Конечно, меня радует и тот факт, что эти вещи достаточно важны для того, чтобы осветить их в элементарном введении. Но это также означает, что даже те, кто уже знаком с некоторыми гранями Wolfram Language через Mathematica уже в течение многих лет, найдут эту книгу интересной для чтения.

Почему именно я?


Некоторое время назад я понял, что кем-то должна быть написана книга наподобие той, которую написал я. И, очевидно, есть много людей, которые знают Wolfram Language достаточно хорошо и, в принципе, могут написать к нему введение. Но я рад, что именно мне довелось сделать это. Да, пришлось выкроить некоторое время из, скажем, написания статей. Но это был увлекательный опыт.

Как будто мы переместились на сто лет назад и задались вопросом: "Как объяснить математику людям?". И, шаг за шагом, мы пришли к тому, что сперва это должна быть арифметика, затем алгебра, ну и так далее. А теперь мы должны сделать нечто подобное и для вычислительного мышления. И книга представляется мне как одно из первых усилий по приобщению вычислительного мышления широкому кругу людей.

Я получил большое удовольствие от написания книги. Надеюсь, людям будет интересно ее читать, и что они узнают из нее, как создавать удивительные вещи вместе с Wolfram Language!
  • +16
  • 15k
  • 6
Wolfram Research 45,74
Wolfram Language, Mathematica, Wolfram Alpha и др.
Поделиться публикацией
Комментарии 6
  • +1
    Когда на русском будет?
    • +2
      Это не известно в настоящий момент. Возможно в середине-конце следующего года.
      • 0
        а сейчас уже известно?
        • 0
          Ведутся переговоры о том, кто будет переводить и кто будет печатать в РФ.
    • 0
      EPUB (есть с DRMом ведь), FB2 будут ли?!
      • +2
        Что удивительно в Wolfram Mathematica, что она, с одной стороны, является красочным интерфейсом к функциям и данным, описанным в этой книге, так, в то же время, отличным языком программирования со своей идеологией. Удивительно, как эти две вещи уживаются в одном продукте, но, похоже, они уживаются.

        Поясню о чем я.

        Идеология «все есть список» и замечательные конструкции типа Or@@((##===0)&/@list), позволяющие проверить наличие нуля в массиве (это игрушечный пример, но на деле через Map и Apply пишется многое) требуют определенного подхода мозга и отказа от традиционного подхода с циклами, но при этом дают возможность максимум производительности из ядра «Математики» и ее алгебраической системы. И программируя таким образом, ты можешь никогда не столкнуться ни с чем, описанным в этой книге.

        Но при этом «Математика» содержит и все описанное выше, и одно другому, похоже, не противоречит.

        P.S. Уже написав комментарий, пробежался еще раз по статье и заметил, что она таки содержит раздел про функциональное программирование. Хотя я лично ставил бы его на первое место. Но, возможно, при таком позиционировании она была бы менее продаваемой…

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое