Тренды вычислительной техники: программируем компьютеры будущего
[Об авторе: Андриан Буданцов — CTO и соучредитель компании Readdle, где с 2007 года управляет разработкой продуктов для миллионов людей и тысяч бизнесов. Андриан уже 16 лет работает с кодом десктопных, мобильных и веб-приложений]
История знает много примеров, когда люди, готовые к наступлению будущего, оказывались в выигрышном положении.
Айтишные примеры мирового масштаба всем хорошо известны — Билл Гейтс (ПО для микрокомпьютеров), Стив Возняк (бытовые микрокомпьютеры), Марк Андерсен (браузер), Энди Рубин (мобильная ОС). Примеры меньшего масштаба — основатели продуктовых компаний вашей страны или города.
Не следует строить иллюзий — хорошее понимание технологий очень важно, но не является достаточным условием успеха — даже в семидесятых годах на одного Возняка приходилась сотня бородатых молодых людей, способных разработать домашний компьютер. Однако готовность к будущему, которое может наступить, — вещь достаточно ценная, чтобы ей пренебрегать.
Что нужно программисту знать о будущем? В первую очередь то, для каких компьютеров в будущем нужно будет писать код.
Поговорим о компьютерах или даже в более узком смысле — о процессорах. Последние 120 лет сложность процессоров описывает закон Мура. Закон Мура (называется законом по исторической традиции) — это наблюдение о том, что каждые два года количество транзисторов на кристалле процессора удваивается. С некоторыми оговорками, это наблюдение все еще выполняется.
До 2005 года из наблюдения Мура следовало то, что персональные компьютеры регулярно
Начиная с 2005 года, из-за роста энергопотребления и тепловыделения скорость работы процессоров начала упираться в практические ограничения. Потребительские процессоры стали делать многоядерными. К списку обязательных знаний для каждого программиста добавилась работа с многопоточностью и синхронизацией.
Прошло около десяти лет, и мы оказались в ситуации, когда количество ядер в большинстве компьютеров больше не увеличивается, а разница в производительности между поколениями процессоров отличается едва ли на 10%.
Да, для мобильных процессоров ситуация пока еще более радужная (разница порядка 40% между поколениями), но и там уже чувствуется близость предела возможностей.
В сложившейся ситуации я различаю 4 тренда, которые влияли, влияют и, скорее всего, продолжат влиять на программирование в ближайшее время.
Тренд № 1: развитие многопоточности
Стоит рассчитывать на то, что количество ядер будет снова увеличиваться как в настольных, так и в мобильных процессорах общего назначения.
Для компьютеров и ноутбуков ситуацию может пошатнуть удачный выпуск нового AMD Ryzen (имеет шанс оказаться дешевым и быстрым
Как известно, писать многопоточный код сложно. Даже предельно внимательных и сообразительных программистов рано или поздно настигнет проблема синхронизации или тупиков. Несмотря на то, что самой концепции потока почти исполнилось 50 лет, все еще огромное количество программного обеспечения ограничено своей производительностью одним ядром.
На сегодняшний день наиболее удачные подходы для многопоточной разработки предполагают использование функционального программирования и/или передачи сообщений: см. модель взаимодействующих последовательных процессов и модель акторов.
Что делать: обратить внимание на языки программирования, в которых работа с многопоточностью является сильной стороной: Go, Rust, Erlang/Elixir, Scala.
Тренд № 2: General-Purpose Graphics Processing Unit (GPGPU или GPU)
Ускорители компьютерной графики, первоначально использовавшиеся для видеоигр и инженерной графики, выросли до параллельного процессора общего назначения, содержащего тысячи ядер.
Сейчас GPGPU используют для разнообразных расчетов, включая обучение и использование нейронных сетей. Производительность GPGPU продолжает расти экспоненциально, что каждый год открывает возможности для решения новых задач.
На GPGPU эффективней всего работает вычислительный код, выполняющий параллельную обработку большого количества данных. GPGPU код (обычно это код «вычислительных ядер») не выполняет ввод-вывод сам и не синхронизирует индивидуальные потоки. В некотором смысле это в чистом виде ускоритель вычислений.
Новейшая видеокарта Nvidia GeForce GTX 1080 Ti: 3584 CUDA ядер и 11 Гб памяти
Что делать: существует три возможности использовать мощь GPGPU:
- Высокоуровневые библиотеки и сервисы — уже готовые решения, которые позволяют с помощью GPU обрабатывать данные: изображения, звук, видео, текст, абстрактные значения.
- Инструменты для вычислений — оптимизированные библиотеки (достаточно большой список от Nvidia), а также фреймворки для вычислений вроде TensorFlow.
- Низкоуровневые инструменты — в первую очередь библиотеки-языки Cuda (можно начинать со свежего An Even Easier Introduction to CUDA) и OpenCL (а также Metal в мире Apple) — необходимы, когда нужна максимальная производительность и тесная интеграция между процессом расчета и приложением.
Тренд № 3: Облака
Вычислительные кластеры уже давно используются для решения задач, с которыми не справляется один процессор; к тому же Google показал, что решение, построенное на множестве недорогих компьютеров, оказывается более эффективным, чем большие серверы и мэйнфреймы.
С развитием облачных вычислений стало возможно получить в управление множество серверов и менять их количество в больших пределах в течение часа. Кроме этого, облачные решения становятся дешевле и популярней с каждым годом (см. иллюстрацию ниже — замкнутый круг между удешевлением, снижением цен, популярностью и ростом).
Замкнутый круг Amazon из документа «Introduction to AWS Economics»
Помимо чисто вычислительных возможностей облака, с продуктовой точки зрения на сегодняшний день почти от всех приложений ожидается поддержка работы группы людей и/или возможности хранить данные за пределами устройства.
Тренд остается актуальным как минимум последние 10 лет и вполне возможно станет еще более актуален, когда сети станут еще быстрее, а чипы мобильных устройств окончательно упрутся в ограничения тех-процесса и батарейки.
Что делать: наибольшая область развития в этом тренде находится в бэкенд разработке.
В первую очередь следует познакомиться с примитивами облачных вычислений (балансировка нагрузки, очереди, автомасштабирование). Далее — инструментарий devops, распределенные вычисления (блокировка, CAP теорема, задача консенсуса). Контейнеризация и популярные технологии оркестрирования — Kubernetes, Mesos, Swarm. Наконец существующие распределенные и масштабируемые базы данных и их ограничения.
Тренд № 4: FPGA и ASIC
Когда процессоры общего назначения упираются в пределы производительности — остается вариант использовать специализированные чипы. Как известно, по этому подходу уже пошли добытчики криптовалют, у которых аппаратные майнеры давно обогнали как CPU, так и GPGPU.
FPGA (Field-Programmable Gate Array) — программируемый пользователем чип, в котором логика работы может быть полностью задана с помощью кода, обычно на языках Verilog или VHDL. Традиционно FPGA используются для прототипирования.
До некоторых пор FPGA разработка находилась очень далеко от обычного программирования, однако сейчас, усилиями компаний Altera (Intel) и Mojo, порог входа в FPGA разработку почти не отличается от покупки Raspberry Pi или Arduino.
В 2017 году можно рассчитывать на новый тип инстансов Amazon F1, который будет позволять программировать и выполнять FPGA код, не прикасаясь к железу вообще. Кроме этого, известно, что новые iPhone 7 также содержат FPGA чип, пока еще неизвестного предназначения.
ASIC (Application-specific integrated circuit) — в более широком смысле, любые специфические чипы для решения определенных задач.
Из интересного нового железа в этой области — HPU (Holographic Processing Unit), который используется в HoloLens от Microsoft, TPU (Tensor Processing Unit) — аппаратный ускоритель TensorFlow от Google, чипы от Nvidia для самоуправляемых автомобилей.
Что делать: как и в случае с GPGPU, с этим трендом можно работать на разных уровнях. На высоком уровне — использовать возможности новых устройств, содержащих специфические ASIC. Каждый ASIC потенциально ждет своего killer-продукта.
Тем, кто достаточно смел, чтобы работать с железом, имеет смысл достать набор разработчика FPGA и начать изучение Verilog.
См. также
Помимо описанных трендов, существуют и другие события, которые могут резко повлиять на разработку программного обеспечения: слияние RAM и SSD (сверхбыстрая энергонезависимая память большого объема), 5G сети, квантовые компьютеры, новые устройства ввода/вывода.
Наконец существует вероятность, что произойдут большие изменения в методологии разработки без сопутствующих изменений аппаратуры.
Будьте любопытны, сообразительны и удачи вам.