Содержание страницы
Python Advocacy HOWTO¶
| Автор: | A.M. Kuchling |
|---|---|
| Версия: | 0.03 |
Аннотация
Обычно непросто убедить руководство использовать открытое программное обеспечение, и Python не исключение. В этом документе рассматриваются причины использовать Python, стратегии для получения одобрения, факты и аргументы, которые можно привести, а также случаи, когда не стоит пытаться применять Python.
Причины использовать Python¶Reasons to Use Python
Есть несколько причин включить сценарный язык в процесс разработки. В этом разделе они будут рассмотрены, а также объяснено, почему Python обладает свойствами, которые делают его особенно удачным выбором.
Программируемость¶Programmability
Программы часто организованы модульно. Низкоуровневые операции группируются вместе и вызываются функциями более высокого уровня, которые, в свою очередь, могут использоваться как базовые операции ещё более высокими уровнями.
Например, на самом нижнем уровне можно определить очень низкоуровневый набор функций для доступа к хеш-таблице. Следующий уровень может использовать хеш-таблицы для хранения заголовков почтового сообщения, сопоставляя имя заголовка, например Date, со значением Tue, 13 May 1997 20:00:54 -0400. Ещё более высокий уровень может работать с объектами сообщений, не зная и не заботясь о том, что заголовки хранятся в хеш-таблице, и так далее.
Часто самые нижние уровни делают очень простые вещи: реализуют структуру данных, например двоичное дерево или хеш-таблицу, или выполняют простое вычисление, например преобразование строки даты в число. Более высокие уровни содержат логику, связывающую эти примитивные операции. При таком подходе примитивы можно рассматривать как базовые строительные блоки, которые затем склеиваются для получения готового продукта.
Какое отношение этот подход к проектированию имеет к Python? Потому что Python хорошо подходит для роли такого связующего языка. Распространённый подход – написать модуль Python, реализующий низкоуровневые операции; ради скорости реализация может быть на C, Java или даже Fortran. Как только примитивы становятся доступны программам на Python, логика, лежащая в основе операций более высокого уровня, пишется в виде кода на Python. Логика высокого уровня становится более понятной и её легче изменять.
Джон Аустерхаут написал статью, в которой более подробно объясняется эта идея; она называется «Scripting: Higher Level Programming for the 21st Century». Я рекомендую прочитать эту статью; URL указан в списке литературы. Аустерхаут – изобретатель языка Tcl, поэтому он утверждает, что для этой цели следует использовать Tcl; он лишь кратко упоминает другие языки, такие как Python, Perl и Lisp/Scheme, но на самом деле аргумент Аустерхаута применим к сценарным языкам в целом, поскольку расширения можно писать с равным успехом для любого из перечисленных языков.
Прототипирование¶Prototyping
В книге «Мифический человеко-месяц» Фредерик Брукс предлагает следующее правило при планировании программных проектов: «Планируйте выбросить первый вариант – всё равно придётся». Брукс говорит о том, что первая попытка проектирования программного обеспечения часто оказывается ошибочной; если задача не очень проста или вы не экстраординарный проектировщик, вы обнаружите, что новые требования и возможности проявляются, как только разработка действительно началась. Если эти новые требования нельзя чисто вписать в структуру программы, перед вами два неприятных выбора: как-то втиснуть новые возможности в программу или выбросить всё и написать новую версию программы, с самого начала учитывая новые требования.
Python предоставляет хорошую среду для быстрой разработки первоначального прототипа. Это позволяет правильно определить общую структуру программы и логику, а затем можно настраивать мелкие детали в быстром цикле разработки, который обеспечивает Python. Когда интерфейс пользователя или вывод программы вас удовлетворит, код Python можно перевести на C++, Fortran, Java или другой компилируемый язык.
Прототипирование означает, что нужно быть осторожным, чтобы не использовать слишком много возможностей Python, которые трудно реализовать на другом языке. Использование eval(), регулярных выражений или модуля pickle означает, что понадобятся библиотеки C или Java для вычисления формул, регулярных выражений и сериализации. Но избегать такого хитрого кода несложно, и в итоге перевод обычно не составляет большого труда. Результирующий код можно быстро отлаживать, потому что все серьёзные логические ошибки будут уже устранены из прототипа, и останется только отследить более мелкие промахи при переводе.
Эта стратегия опирается на предыдущее обсуждение программируемости. Использование Python как связующего звена для соединения низкоуровневых компонентов очевидным образом применимо для построения прототипов систем. Таким образом Python может помочь в разработке, даже если конечные пользователи вообще не будут иметь дела с кодом Python. Если производительность версии на Python достаточна и корпоративная политика позволяет, возможно, не придётся делать перевод на C или Java, но всё равно быстрее сначала разработать прототип, а затем перевести его, чем пытаться сразу создать окончательную версию.
Один из примеров такой стратегии разработки – Microsoft Merchant Server. Версия 1.0 была написана полностью на Python компанией, которую затем купила Microsoft. Версия 2.0 начала перевод кода на C++ и поставлялась с частично кодом на C++ и частично на Python. Версия 3.0 уже не содержала Python вообще; весь код был переведён на C++. Хотя продукт не содержит интерпретатора Python, язык Python всё равно сослужил полезную службу, ускорив разработку.
Это очень распространённое применение Python. В прошлых докладах на конференциях также описывался этот подход для разработки высокоуровневых численных алгоритмов; см., например, статью Дэвида М. Бизли и Питера С. Ломдаля «Feeding a Large-scale Physics Application to Python» в списке литературы. Если базовые операции алгоритма – это такие вещи, как «взять обратную матрицу 4000x4000», и они реализованы на каком-нибудь низкоуровневом языке, то Python практически не добавляет дополнительных накладных расходов на производительность; дополнительное время, которое требуется Python для вычисления выражения m.invert(), ничтожно по сравнению со стоимостью самого вычисления. Это особенно хорошо подходит для приложений, где требуются бесконечные корректировки для получения правильного результата. Графические интерфейсы и веб-сайты – яркие примеры.
Код на Python также короче и быстрее пишется (как только вы освоите Python), поэтому его легче выбросить, если вы решите, что подход был ошибочным; если бы вы потратили две недели вместо двух часов, вы могли бы потратить время, пытаясь исправить то, что получилось, из-за естественного нежелания признать, что эти две недели были потрачены впустую. Честно говоря, эти две недели не были потрачены впустую, поскольку вы узнали что-то о задаче и технологии, которую используете для её решения, но человеческой природе свойственно рассматривать это как своего рода неудачу.
Простота и лёгкость понимания¶Simplicity and Ease of Understanding
Python – определённо не игрушечный язык, пригодный только для мелких задач. Возможности языка достаточно общие и мощные, чтобы его можно было использовать для многих различных целей. Он полезен на малом конце, для скриптов из 10–20 строк, но также масштабируется до более крупных систем, содержащих тысячи строк кода.
Однако такая выразительность не достигается ценой запутанного или хитрого синтаксиса. Хотя в Python есть некоторые тёмные уголки, которые могут привести к запутанному коду, таких углов относительно мало, и правильное проектирование может ограничить их использование лишь несколькими классами или модулями. Конечно, можно написать запутанный код, используя слишком много возможностей с недостаточной заботой о ясности, но большая часть кода на Python может выглядеть как слегка формализованная версия понятного человеку псевдокода.
В книге «Новый словарь хакера» Эрик С. Рэймонд даёт следующее определение слову «компактный»:
Компактный прил. О дизайне: описывает ценное свойство, которое можно охватить целиком в голове. Обычно это означает, что созданный по такому дизайну инструмент можно использовать с большей лёгкостью и с меньшим количеством ошибок, чем эквивалентный инструмент, не являющийся компактным. Компактность не подразумевает тривиальность или отсутствие мощи; например, C компактен, а FORTRAN – нет, но C мощнее FORTRAN. Дизайны становятся некомпактными из-за накопления возможностей и нагромождений, которые не вписываются чисто в общую схему дизайна (поэтому некоторые поклонники классического C утверждают, что ANSI C больше не компактен).
В этом смысле слова Python довольно компактен, потому что в языке всего несколько идей, которые используются во многих местах. Возьмём, к примеру, пространства имён. Импортируйте модуль с помощью import math, и вы создадите новое пространство имён с именем math. Классы – это тоже пространства имён, разделяющие многие свойства модулей и имеющие некоторые свои; например, можно создавать экземпляры класса. Экземпляры? Это ещё одно пространство имён. В настоящее время пространства имён реализованы как словари Python, поэтому у них те же методы, что и у стандартного типа данных «словарь»: .keys() возвращает все ключи и так далее.
Эта простота проистекает из истории развития Python. Синтаксис языка происходит из разных источников; одним из основных источников является ABC, относительно малоизвестный учебный язык, а другим – Modula-3. (Дополнительную информацию об ABC и Modula-3 можно найти на их веб-сайтах: http://www.cwi.nl/~steven/abc/ и http://www.m3.org.) Другие возможности пришли из C, Icon, Algol-68 и даже Perl. Python не столько внедрил много новшеств, сколько стремился сохранить язык небольшим и лёгким для изучения, опираясь на идеи, которые были опробованы в других языках и оказались полезными.
Простота – это достоинство, которое не следует недооценивать. Она позволяет быстрее выучить язык, а затем быстро писать код – код, который часто работает с первого запуска.
Интеграция с Java¶Java Integration
Если вы работаете с Java, Jython (http://www.jython.org/) определённо заслуживает внимания. Jython – это повторная реализация Python на Java, которая компилирует код Python в байт-код Java. Полученная среда обеспечивает очень тесную, почти бесшовную интеграцию с Java. Обращаться к классам Java из Python тривиально, и можно писать классы Python, наследующие классы Java. Jython можно использовать для прототипирования приложений на Java примерно так же, как CPython, а также для тестовых наборов кода Java или для встраивания в Java-приложение для добавления возможностей сценариев.
Аргументы и возражения¶Arguments and Rebuttals
Предположим, вы решили, что Python – лучший выбор для вашего приложения. Как убедить руководство или коллег-разработчиков использовать Python? В этом разделе перечислены некоторые распространённые аргументы против использования Python и приведены возможные контраргументы.
Python – это бесплатное программное обеспечение, которое ничего не стоит. Насколько хорошим оно может быть?
Очень хорошим, на самом деле. В наши дни Linux и Apache, два других проекта с открытым исходным кодом, становятся всё более уважаемыми альтернативами коммерческому ПО, хотя Python не получил такой же известности.
Python существует уже несколько лет и насчитывает множество пользователей и разработчиков. Соответственно, интерпретатором пользовалось много людей, и большинство ошибок из него уже вычищено. Хотя ошибки всё ещё обнаруживаются время от времени, они обычно либо довольно редкие (иначе на них уже кто-нибудь наткнулся бы), либо связаны с интерфейсами внешних библиотек. Внутреннее устройство самого языка весьма стабильно.
Наличие исходного кода следует рассматривать как возможность для коллективного рецензирования: люди могут изучать код, предлагать (и реализовывать) улучшения, а также отслеживать ошибки. Чтобы узнать больше об идее открытого исходного кода, а также ознакомиться с аргументами и примерами в его поддержку, перейдите по ссылке http://www.opensource.org.
Кто будет его поддерживать?
У Python довольно большое сообщество разработчиков, и его численность продолжает расти. Интернет-сообщество вокруг языка очень активно, и это тоже можно считать одним из преимуществ Python. Большинство вопросов, задаваемых в группе новостей comp.lang.python, быстро получают ответы.
Если вам потребуется углубиться в исходный код, вы обнаружите, что он понятен и хорошо организован, так что написание расширений и самостоятельный поиск ошибок не составят большого труда. Если же вы предпочитаете платную поддержку, существуют компании и частные лица, предлагающие коммерческую поддержку Python.
Кто использует Python для серьёзной работы?
Очень многие. Одна из интересных особенностей Python – удивительное разнообразие областей, в которых он используется. Люди применяют Python для:
- Запуска веб-сайтов
- Создания графических интерфейсов
- Управления кодом для численных расчётов на суперкомпьютерах
- Добавления скриптовых возможностей в коммерческое приложение путём встраивания в него интерпретатора Python
- Обработки больших наборов XML-данных
- Построения тестовых наборов для кода на C или Java
Какой бы ни была ваша предметная область, вероятно, найдётся кто-то, кто использовал Python для чего-то похожего. Тем не менее, несмотря на пригодность для таких высокопроизводительных приложений, Python всё ещё достаточно прост для мелких задач.
Список некоторых организаций, использующих Python, можно найти по адресу http://wiki.python.org/moin/OrganizationsUsingPython.
Какие существуют ограничения на использование Python?
Они практически отсутствуют. Обратитесь к файлу Misc/COPYRIGHT в дистрибутиве исходных кодов или к разделу History and License для полного текста лицензии, но сводится она к трём условиям:
- Вы должны оставить уведомление об авторских правах в программном обеспечении; если вы не включаете исходный код в продукт, вы должны поместить уведомление об авторских правах в сопроводительную документацию.
- Не утверждайте, что организации, разработавшие Python, каким-либо образом поддерживают ваш продукт.
- Если что-то пойдёт не так, вы не можете подать в суд на возмещение ущерба. Практически все лицензии на программное обеспечение содержат это условие.
Обратите внимание, что вам не нужно предоставлять исходный код для чего бы то ни было, что содержит Python или создано с его помощью. Кроме того, интерпретатор Python и сопутствующую документацию можно изменять и распространять любым удобным вам способом, и вам вообще не нужно платить кому-либо лицензионные отчисления.
Почему мы должны использовать малоизвестный язык вроде Python вместо широко известного языка X?
Я надеюсь, что это руководство (HOWTO) и документы, перечисленные в последнем разделе, помогут убедить вас, что Python не является малоизвестным, и его пользовательская база стабильно растёт. Один совет: всегда представляйте положительные стороны Python, вместо того чтобы концентрироваться на недостатках языка X. Люди хотят знать, почему решение хорошо, а не почему все остальные решения плохи. Поэтому вместо того чтобы критиковать конкурирующее решение по разным причинам, просто покажите, как преимущества Python могут помочь.
Полезные ресурсы¶Useful Resources
- http://www.pythonology.com/success
- Python Success Stories – это сборник историй успешных пользователей Python, с акцентом на бизнес- и корпоративных пользователей.
- http://home.pacbell.net/ouster/scripting.html
- Белая книга Джона Оустерхаута о скриптовых языках – хороший аргумент в пользу их полезности, хотя, вполне естественно, он особо выделяет Tcl, язык, который он разработал. Большая часть аргументов применима к любому скриптовому языку.
- http://www.python.org/workshops/1997-10/proceedings/beazley.html
Авторы, Дэвид М. Бизли и Питер С. Ломдаль, описывают свой опыт использования Python в Лос-Аламосской национальной лаборатории. Это ещё один хороший пример того, как Python может помочь в выполнении реальной работы. Эта цитата из статьи была повторена многими людьми:
Изначально разработанное как крупное монолитное приложение для систем массово-параллельной обработки, мы с помощью Python превратили его в гибкую, высокомодульную и чрезвычайно мощную систему для моделирования, анализа данных и визуализации. Кроме того, мы описываем, как Python решил ряд важных проблем, связанных с разработкой, отладкой, развертыванием и сопровождением научного ПО.
- http://pythonjournal.cognizor.com/pyj1/Everitt-Feit_interview98-V1.html
- Это интервью с Энди Фейтом, посвящённое использованию Python в Infoseek, можно использовать, чтобы показать, что выбор Python не создал никаких трудностей в процессе разработки компании и принёс существенные преимущества.
- http://www.python.org/workshops/1997-10/proceedings/stein.ps
- На 6-й конференции Python Грег Стайн представил доклад, в котором показал, как Python внедрялся и использовался в стартапе eShop, а затем в Microsoft.
- http://www.opensource.org
- Руководство может сомневаться в надёжности и полезности программ, созданных не на коммерческой основе. На этом сайте приводятся аргументы, показывающие, что открытое ПО может иметь значительные преимущества перед закрытым.
- http://www.faqs.org/docs/Linux-mini/Advocacy.html
- Мини-HOWTO по пропаганде Linux послужил источником вдохновения для этого документа, и его также рекомендуется прочитать: в нём содержатся общие советы по тому, как добиться признания новой технологии (например, Linux или Python). В целом, мало чего можно добиться, просто атакуя существующие системы и жалуясь на их недостатки; это часто выглядит как бессмысленные жалобы. Гораздо лучше указать на те многочисленные области, в которых Python превосходит другие системы.