Читать книгу Код. Культура, скомпилированная в байты - - Страница 3
Введение: Код как культурный артефакт
В.2. Что такое культура языка программирования
ОглавлениеСлово «культура» в применении к коду может показаться метафорой. Это не метафора. Это буквальное описание того, чем являются языки программирования.
Культура языка программирования – это совокупность явных принципов, неявных конвенций, инструментов и истории, которые определяют, как на этом языке принято писать и думать. Принято – ключевое слово. Не «как можно» и не «как правильно», а «как принято». Это социальное понятие, не техническое.
Явные принципы фиксируются в документах. Python имеет PEP 20, известный как Zen of Python – девятнадцать афоризмов, написанных Тимом Питерсом в 1999 году. Двадцатый афоризм намеренно оставлен пустым. «Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex.» («Красивое лучше уродливого. Явное лучше неявного. Простое лучше сложного.») Эти строки – не просто рекомендации по стилю. Это философское заявление о том, что такое хороший код. И что важнее – это заявление встроено в сам язык: достаточно написать «import this», чтобы увидеть его на экране. Философия языка доступна в самом языке.
Ruby имеет принцип, который его создатель Юкихиро Мацумото повторял в бесчисленных интервью: «Ruby is designed to make programmers happy» («Ruby создан, чтобы делать программистов счастливыми»). Счастье программиста – не побочный эффект, а цель разработки. В интервью 2003 года он объяснял: «You want to enjoy life, don’t you? If you get your job done quickly and your job is fun, that’s good isn’t it? That’s the purpose of life, partly.» («Вы ведь хотите наслаждаться жизнью? Если вы быстро делаете работу и работа доставляет удовольствие – это ведь хорошо? Отчасти в этом и смысл жизни.») Язык программирования как инструмент для хорошей жизни – это философское утверждение, которое определяет каждое решение в дизайне Ruby.
Go имеет Go Proverbs – набор афоризмов, который Роб Пайк представил на конференции Gopherfest в 2015 году. «Clear is better than clever. A little copying is better than a little dependency. Don’t communicate by sharing memory, share memory by communicating.» («Ясное лучше умного. Немного копирования лучше, чем немного зависимости. Не общайтесь через разделяемую память, разделяйте память через общение.») Каждый афоризм – концентрированное философское утверждение о том, как следует писать программы. Не синтаксическое правило, а принцип мышления.
Неявные конвенции – это то, что не записано в документах, но известно каждому, кто пишет на языке достаточно долго. Это идиоматичный код – код, написанный так, как принято в данной культуре. Синтаксически корректный код на Python может быть совершенно не-питоничным, если он написан в стиле Java. Формально он работает. Культурно он чужероден.
Инструменты воплощают философию не менее красноречиво, чем манифесты. Go поставляется с gofmt – форматировщиком кода, который не имеет опций настройки. Один стиль форматирования на всех. Роб Пайк формулировал это так: «Gofmt’s style is no one’s favorite, yet gofmt is everyone’s favorite». Стиль gofmt – ничей любимый, но сам gofmt – общий любимец. Парадокс разрешается просто: ценность не в конкретном стиле, а в прекращении споров о стиле. Инструмент воплощает философию: единообразие важнее индивидуальных предпочтений.
История создания языка – такая же часть его культуры, как и синтаксис. Go появился в Google в 2007—2009 годах, и это не случайная деталь биографии. К тому моменту в Google работали десятки тысяч инженеров, кодовая база измерялась миллиардами строк, компиляция C++ занимала часы. Роб Пайк вспоминал, что идея Go возникла во время одной такой бесконечной компиляции. «We were not going to continue writing C++” («Мы не собирались продолжать писать на C++»), – говорил он. Go – не абстрактное упражнение в дизайне языков. Это ответ на конкретную боль конкретной компании в конкретный момент времени. Понять Go невозможно, не понимая этого контекста.
Erlang возник в Ericsson, где телекоммуникационные системы должны были работать с надёжностью «девять девяток» – 99,9999999% времени безотказной работы. Это означает менее секунды простоя за тридцать лет. При таких требованиях нельзя позволить себе остановку системы для перезагрузки после ошибки. Отсюда философия Erlang: пусть процессы падают, их перезапустят супервизоры. «Let it crash» («Пусть падает») – не признание поражения, а стратегия надёжности. Система, которая умеет падать и восстанавливаться, надёжнее системы, которая пытается никогда не падать.
Культура языка – это всё вместе: манифесты и молчаливые соглашения, инструменты и история, философия создателей и практика сообщества. Изучить синтаксис языка можно за неделю. Усвоить его культуру – за годы.
Здесь важно сделать оговорку. Когда мы говорим о культуре Python или культуре Go, мы говорим о языках как артефактах, не о людях. Не «программисты на Python думают так», а «Python как язык воплощает такую философию». Разница принципиальна. Программист может использовать Python и не разделять его философию – писать непитонический код, игнорировать PEP 8, нарушать конвенции. Это его право. Но язык останется тем, чем является – артефактом, несущим определённые ценности. Книга исследует артефакты, не людей.
Ещё одна оговорка: описание культуры не означает её оценки. Python не лучше Go, и Go не лучше Rust. Статическая типизация не правильнее динамической, и объектно-ориентированное программирование не превосходит функциональное. Каждый подход – ответ на определённые вопросы в определённом контексте. Описать эти ответы – задача книги. Судить их – нет.