| ************************* |
| Python Advocacy HOWTO |
| ************************* |
| |
| :Author: A.M. Kuchling |
| :Release: 0.03 |
| |
| |
| .. topic:: Abstract |
| |
| It's usually difficult to get your management to accept open source software, |
| and Python is no exception to this rule. This document discusses reasons to use |
| Python, strategies for winning acceptance, facts and arguments you can use, and |
| cases where you *shouldn't* try to use Python. |
| |
| |
| Reasons to Use Python |
| ===================== |
| |
| There are several reasons to incorporate a scripting language into your |
| development process, and this section will discuss them, and why Python has some |
| properties that make it a particularly good choice. |
| |
| |
| Programmability |
| --------------- |
| |
| Programs are often organized in a modular fashion. Lower-level operations are |
| grouped together, and called by higher-level functions, which may in turn be |
| used as basic operations by still further upper levels. |
| |
| For example, the lowest level might define a very low-level set of functions for |
| accessing a hash table. The next level might use hash tables to store the |
| headers of a mail message, mapping a header name like ``Date`` to a value such |
| as ``Tue, 13 May 1997 20:00:54 -0400``. A yet higher level may operate on |
| message objects, without knowing or caring that message headers are stored in a |
| hash table, and so forth. |
| |
| Often, the lowest levels do very simple things; they implement a data structure |
| such as a binary tree or hash table, or they perform some simple computation, |
| such as converting a date string to a number. The higher levels then contain |
| logic connecting these primitive operations. Using the approach, the primitives |
| can be seen as basic building blocks which are then glued together to produce |
| the complete product. |
| |
| Why is this design approach relevant to Python? Because Python is well suited |
| to functioning as such a glue language. A common approach is to write a Python |
| module that implements the lower level operations; for the sake of speed, the |
| implementation might be in C, Java, or even Fortran. Once the primitives are |
| available to Python programs, the logic underlying higher level operations is |
| written in the form of Python code. The high-level logic is then more |
| understandable, and easier to modify. |
| |
| John Ousterhout wrote a paper that explains this idea at greater length, |
| entitled "Scripting: Higher Level Programming for the 21st Century". I |
| recommend that you read this paper; see the references for the URL. Ousterhout |
| is the inventor of the Tcl language, and therefore argues that Tcl should be |
| used for this purpose; he only briefly refers to other languages such as Python, |
| Perl, and Lisp/Scheme, but in reality, Ousterhout's argument applies to |
| scripting languages in general, since you could equally write extensions for any |
| of the languages mentioned above. |
| |
| |
| Prototyping |
| ----------- |
| |
| In *The Mythical Man-Month*, Fredrick Brooks suggests the following rule when |
| planning software projects: "Plan to throw one away; you will anyway." Brooks |
| is saying that the first attempt at a software design often turns out to be |
| wrong; unless the problem is very simple or you're an extremely good designer, |
| you'll find that new requirements and features become apparent once development |
| has actually started. If these new requirements can't be cleanly incorporated |
| into the program's structure, you're presented with two unpleasant choices: |
| hammer the new features into the program somehow, or scrap everything and write |
| a new version of the program, taking the new features into account from the |
| beginning. |
| |
| Python provides you with a good environment for quickly developing an initial |
| prototype. That lets you get the overall program structure and logic right, and |
| you can fine-tune small details in the fast development cycle that Python |
| provides. Once you're satisfied with the GUI interface or program output, you |
| can translate the Python code into C++, Fortran, Java, or some other compiled |
| language. |
| |
| Prototyping means you have to be careful not to use too many Python features |
| that are hard to implement in your other language. Using ``eval()``, or regular |
| expressions, or the :mod:`pickle` module, means that you're going to need C or |
| Java libraries for formula evaluation, regular expressions, and serialization, |
| for example. But it's not hard to avoid such tricky code, and in the end the |
| translation usually isn't very difficult. The resulting code can be rapidly |
| debugged, because any serious logical errors will have been removed from the |
| prototype, leaving only more minor slip-ups in the translation to track down. |
| |
| This strategy builds on the earlier discussion of programmability. Using Python |
| as glue to connect lower-level components has obvious relevance for constructing |
| prototype systems. In this way Python can help you with development, even if |
| end users never come in contact with Python code at all. If the performance of |
| the Python version is adequate and corporate politics allow it, you may not need |
| to do a translation into C or Java, but it can still be faster to develop a |
| prototype and then translate it, instead of attempting to produce the final |
| version immediately. |
| |
| One example of this development strategy is Microsoft Merchant Server. Version |
| 1.0 was written in pure Python, by a company that subsequently was purchased by |
| Microsoft. Version 2.0 began to translate the code into C++, shipping with some |
| C++code and some Python code. Version 3.0 didn't contain any Python at all; all |
| the code had been translated into C++. Even though the product doesn't contain |
| a Python interpreter, the Python language has still served a useful purpose by |
| speeding up development. |
| |
| This is a very common use for Python. Past conference papers have also |
| described this approach for developing high-level numerical algorithms; see |
| David M. Beazley and Peter S. Lomdahl's paper "Feeding a Large-scale Physics |
| Application to Python" in the references for a good example. If an algorithm's |
| basic operations are things like "Take the inverse of this 4000x4000 matrix", |
| and are implemented in some lower-level language, then Python has almost no |
| additional performance cost; the extra time required for Python to evaluate an |
| expression like ``m.invert()`` is dwarfed by the cost of the actual computation. |
| It's particularly good for applications where seemingly endless tweaking is |
| required to get things right. GUI interfaces and Web sites are prime examples. |
| |
| The Python code is also shorter and faster to write (once you're familiar with |
| Python), so it's easier to throw it away if you decide your approach was wrong; |
| if you'd spent two weeks working on it instead of just two hours, you might |
| waste time trying to patch up what you've got out of a natural reluctance to |
| admit that those two weeks were wasted. Truthfully, those two weeks haven't |
| been wasted, since you've learnt something about the problem and the technology |
| you're using to solve it, but it's human nature to view this as a failure of |
| some sort. |
| |
| |
| Simplicity and Ease of Understanding |
| ------------------------------------ |
| |
| Python is definitely *not* a toy language that's only usable for small tasks. |
| The language features are general and powerful enough to enable it to be used |
| for many different purposes. It's useful at the small end, for 10- or 20-line |
| scripts, but it also scales up to larger systems that contain thousands of lines |
| of code. |
| |
| However, this expressiveness doesn't come at the cost of an obscure or tricky |
| syntax. While Python has some dark corners that can lead to obscure code, there |
| are relatively few such corners, and proper design can isolate their use to only |
| a few classes or modules. It's certainly possible to write confusing code by |
| using too many features with too little concern for clarity, but most Python |
| code can look a lot like a slightly-formalized version of human-understandable |
| pseudocode. |
| |
| In *The New Hacker's Dictionary*, Eric S. Raymond gives the following definition |
| for "compact": |
| |
| .. epigraph:: |
| |
| Compact *adj.* Of a design, describes the valuable property that it can all be |
| apprehended at once in one's head. This generally means the thing created from |
| the design can be used with greater facility and fewer errors than an equivalent |
| tool that is not compact. Compactness does not imply triviality or lack of |
| power; for example, C is compact and FORTRAN is not, but C is more powerful than |
| FORTRAN. Designs become non-compact through accreting features and cruft that |
| don't merge cleanly into the overall design scheme (thus, some fans of Classic C |
| maintain that ANSI C is no longer compact). |
| |
| (From http://www.catb.org/~esr/jargon/html/C/compact.html) |
| |
| In this sense of the word, Python is quite compact, because the language has |
| just a few ideas, which are used in lots of places. Take namespaces, for |
| example. Import a module with ``import math``, and you create a new namespace |
| called ``math``. Classes are also namespaces that share many of the properties |
| of modules, and have a few of their own; for example, you can create instances |
| of a class. Instances? They're yet another namespace. Namespaces are currently |
| implemented as Python dictionaries, so they have the same methods as the |
| standard dictionary data type: .keys() returns all the keys, and so forth. |
| |
| This simplicity arises from Python's development history. The language syntax |
| derives from different sources; ABC, a relatively obscure teaching language, is |
| one primary influence, and Modula-3 is another. (For more information about ABC |
| and Modula-3, consult their respective Web sites at http://www.cwi.nl/~steven/abc/ |
| and http://www.m3.org.) Other features have come from C, Icon, |
| Algol-68, and even Perl. Python hasn't really innovated very much, but instead |
| has tried to keep the language small and easy to learn, building on ideas that |
| have been tried in other languages and found useful. |
| |
| Simplicity is a virtue that should not be underestimated. It lets you learn the |
| language more quickly, and then rapidly write code -- code that often works the |
| first time you run it. |
| |
| |
| Java Integration |
| ---------------- |
| |
| If you're working with Java, Jython (http://www.jython.org/) is definitely worth |
| your attention. Jython is a re-implementation of Python in Java that compiles |
| Python code into Java bytecodes. The resulting environment has very tight, |
| almost seamless, integration with Java. It's trivial to access Java classes |
| from Python, and you can write Python classes that subclass Java classes. |
| Jython can be used for prototyping Java applications in much the same way |
| CPython is used, and it can also be used for test suites for Java code, or |
| embedded in a Java application to add scripting capabilities. |
| |
| |
| Arguments and Rebuttals |
| ======================= |
| |
| Let's say that you've decided upon Python as the best choice for your |
| application. How can you convince your management, or your fellow developers, |
| to use Python? This section lists some common arguments against using Python, |
| and provides some possible rebuttals. |
| |
| **Python is freely available software that doesn't cost anything. How good can |
| it be?** |
| |
| Very good, indeed. These days Linux and Apache, two other pieces of open source |
| software, are becoming more respected as alternatives to commercial software, |
| but Python hasn't had all the publicity. |
| |
| Python has been around for several years, with many users and developers. |
| Accordingly, the interpreter has been used by many people, and has gotten most |
| of the bugs shaken out of it. While bugs are still discovered at intervals, |
| they're usually either quite obscure (they'd have to be, for no one to have run |
| into them before) or they involve interfaces to external libraries. The |
| internals of the language itself are quite stable. |
| |
| Having the source code should be viewed as making the software available for |
| peer review; people can examine the code, suggest (and implement) improvements, |
| and track down bugs. To find out more about the idea of open source code, along |
| with arguments and case studies supporting it, go to http://www.opensource.org. |
| |
| **Who's going to support it?** |
| |
| Python has a sizable community of developers, and the number is still growing. |
| The Internet community surrounding the language is an active one, and is worth |
| being considered another one of Python's advantages. Most questions posted to |
| the comp.lang.python newsgroup are quickly answered by someone. |
| |
| Should you need to dig into the source code, you'll find it's clear and |
| well-organized, so it's not very difficult to write extensions and track down |
| bugs yourself. If you'd prefer to pay for support, there are companies and |
| individuals who offer commercial support for Python. |
| |
| **Who uses Python for serious work?** |
| |
| Lots of people; one interesting thing about Python is the surprising diversity |
| of applications that it's been used for. People are using Python to: |
| |
| * Run Web sites |
| |
| * Write GUI interfaces |
| |
| * Control number-crunching code on supercomputers |
| |
| * Make a commercial application scriptable by embedding the Python interpreter |
| inside it |
| |
| * Process large XML data sets |
| |
| * Build test suites for C or Java code |
| |
| Whatever your application domain is, there's probably someone who's used Python |
| for something similar. Yet, despite being useable for such high-end |
| applications, Python's still simple enough to use for little jobs. |
| |
| See http://wiki.python.org/moin/OrganizationsUsingPython for a list of some of |
| the organizations that use Python. |
| |
| **What are the restrictions on Python's use?** |
| |
| They're practically nonexistent. Consult the :file:`Misc/COPYRIGHT` file in the |
| source distribution, or the section :ref:`history-and-license` for the full |
| language, but it boils down to three conditions: |
| |
| * You have to leave the copyright notice on the software; if you don't include |
| the source code in a product, you have to put the copyright notice in the |
| supporting documentation. |
| |
| * Don't claim that the institutions that have developed Python endorse your |
| product in any way. |
| |
| * If something goes wrong, you can't sue for damages. Practically all software |
| licenses contain this condition. |
| |
| Notice that you don't have to provide source code for anything that contains |
| Python or is built with it. Also, the Python interpreter and accompanying |
| documentation can be modified and redistributed in any way you like, and you |
| don't have to pay anyone any licensing fees at all. |
| |
| **Why should we use an obscure language like Python instead of well-known |
| language X?** |
| |
| I hope this HOWTO, and the documents listed in the final section, will help |
| convince you that Python isn't obscure, and has a healthily growing user base. |
| One word of advice: always present Python's positive advantages, instead of |
| concentrating on language X's failings. People want to know why a solution is |
| good, rather than why all the other solutions are bad. So instead of attacking |
| a competing solution on various grounds, simply show how Python's virtues can |
| help. |
| |
| |
| Useful Resources |
| ================ |
| |
| http://www.pythonology.com/success |
| The Python Success Stories are a collection of stories from successful users of |
| Python, with the emphasis on business and corporate users. |
| |
| .. http://www.fsbassociates.com/books/pythonchpt1.htm |
| The first chapter of \emph{Internet Programming with Python} also |
| examines some of the reasons for using Python. The book is well worth |
| buying, but the publishers have made the first chapter available on |
| the Web. |
| |
| http://www.tcl.tk/doc/scripting.html |
| John Ousterhout's white paper on scripting is a good argument for the utility of |
| scripting languages, though naturally enough, he emphasizes Tcl, the language he |
| developed. Most of the arguments would apply to any scripting language. |
| |
| http://www.python.org/workshops/1997-10/proceedings/beazley.html |
| The authors, David M. Beazley and Peter S. Lomdahl, describe their use of |
| Python at Los Alamos National Laboratory. It's another good example of how |
| Python can help get real work done. This quotation from the paper has been |
| echoed by many people: |
| |
| .. epigraph:: |
| |
| Originally developed as a large monolithic application for massively parallel |
| processing systems, we have used Python to transform our application into a |
| flexible, highly modular, and extremely powerful system for performing |
| simulation, data analysis, and visualization. In addition, we describe how |
| Python has solved a number of important problems related to the development, |
| debugging, deployment, and maintenance of scientific software. |
| |
| http://pythonjournal.cognizor.com/pyj1/Everitt-Feit_interview98-V1.html |
| This interview with Andy Feit, discussing Infoseek's use of Python, can be used |
| to show that choosing Python didn't introduce any difficulties into a company's |
| development process, and provided some substantial benefits. |
| |
| .. http://www.python.org/psa/Commercial.html |
| Robin Friedrich wrote this document on how to support Python's use in |
| commercial projects. |
| |
| http://www.python.org/workshops/1997-10/proceedings/stein.ps |
| For the 6th Python conference, Greg Stein presented a paper that traced Python's |
| adoption and usage at a startup called eShop, and later at Microsoft. |
| |
| http://www.opensource.org |
| Management may be doubtful of the reliability and usefulness of software that |
| wasn't written commercially. This site presents arguments that show how open |
| source software can have considerable advantages over closed-source software. |
| |
| http://www.faqs.org/docs/Linux-mini/Advocacy.html |
| The Linux Advocacy mini-HOWTO was the inspiration for this document, and is also |
| well worth reading for general suggestions on winning acceptance for a new |
| technology, such as Linux or Python. In general, you won't make much progress |
| by simply attacking existing systems and complaining about their inadequacies; |
| this often ends up looking like unfocused whining. It's much better to point |
| out some of the many areas where Python is an improvement over other systems. |
| |