Rozhovor s Guido van Rossumem, část 3.

Autor jazyka Python Guido van Rossum odpovídá na otázky Billa Vennera o historii Pythonu, o vlivu jazyka ABC na vývoj Pythonu a o hlavních cílech při vývoji Pythonu.

Originál rozhovoru je dostupný na http://www.artima.com/intv/guido.html .

Author:Jan Švec
Date:2005-10-05
Copyright:Copyright (C) 2004-2005 Jan Švec

Produktivita a ruční psaní kódu

Bill Venners: Poznal jsem lidi, kteří Python používali pro jeho velmi vysokou produktivitu. Když jsem si poté porovnal C++ a Javu, myslím, že vyšší produktivitu umožňuje Java. Lidé kteří znají jak Javu, tak Python mi zase říkají o lepší produktivitě Pythonu. Odkud se tato produktivita bere?

Guido van Rossum: Je mnoho různých důvodů. Jedním z nich je asi fakt, že Python potřebuje mnohem méně psaní.

Bill Venners: Psaní na klávesnici?

Guido van Rossum: Na klávesnici. Nepřekvapují mě programy, které potřebují pětkrát méně řádek než Java kód . To by měl být přibližný poměr platící na všechny programy. A pokud máte takto málo kódu, je mnohem jednodušší ho udržovat a měnit.

Kdysi jsem slyšel, že dobrý programátor dokáže spravovat 20,000 řádek kódu. Je jedno, jestli 20,000 řádek asembleru, C nebo nějakého vysokoúrovňového jazyka. Stále jde o 20,000 řádek. Pokud váš jazyk vyžaduje méně řádek k vyjádření téhož nápadu, můžete strávit více času na částech, které by se jinak do oněch 20,000 řádek nevešly.

Program v Pythonu o 20,000 řádcích by pravděpodobně byl programem o 100,000 řádcích v Javě nebo C++. A možná o 200,000 řádcích v C, protože C nabízí ještě méně datových struktur. Hledání chyby nebo provedení systematické změny pak dá daleko více práce v 100,000 řádcích kódu než ve 20,000. V malých měřítkách to funguje obdobným způsobem. 500 řádkový program vypadá lépe než 10,000 řádků kódu.

Mocné datové typy

Bill Venners: Považujete méně psaní za hlavní zdroj vysoké produktivity v Pythonu? Proč se lidé cítí více produktivní?

Guido van Rossum: Jiným zdrojem vysoké produktivity jsou mocné interní datové typy. Vezměme si například pole. V Pythonu nemusíte deklarovat velikost pole. Nemusíte se starat, jak prvky vměstnat do počtu, který jste na začátku deklarovali. Náš typ pole je flexibilní. Má metody, pomocí nichž můžete doprostřed vložit prvek a zbytek prvků se automaticky posune. Jednotlivé prvky můžete mazat. Pole lze také "krájet", tj. pracovat pouze na jejich určité části. Pokud tedy chcete funkci aplikovat jen na část pole, jednoduše předáte "řez" jako jediný argument a nemusíte předávat původní pole s počátečním a koncovým indexem.

Python má velmi efektivní slovníkový typ, který se chová jako asociativní pole nebo též hash. Slovník je v Pythonu používám i v interní implementaci. To také zaručuje jeho efektivitu. Strávili jsme mnoho času jeho optimalizací při vývoji jazyka. Stejný slovník ale může používat i vaše aplikace. Slovník je pravděpodobně jediný datový typ, který používá každá aplikace.

Během let datové typy Python přibraly mnoho užitečných funkcí. Datové typy jsou vskutku mocné. To tvoří Python velmi silným jazykem. Ale přesto množina základních datových typů zůstala malá, nemusíte se nejprve rok učit práci s jednotlivými typy. Minimum psaní a výkonné datové typy dělají dohromady program malým a vy se díky tomu cítíte více produktivní.

Volné typování a standardní knihovna

Bill Venners: Jakým způsobem zvyšují volné typy v Pythonu produktivitu programátorů?

Guido van Rossum: Volně typové jazyky zvyšují produktivitu, protože vám umožňují zapomenout pravidla, podle nichž se rozhoduje, co přijde do vašeho pole a co ne. Můžete mít pole čísel a někam uprostřed uložit cokoli jiného, pokud to potřebujete. Jediná metoda pro řazení ho pak seřadí, přičemž bere v úvahu i prvky různých typů. Je to stejné, jako byste je porovnávali jednotlivě. Nemusíte se například starat o celá a reálná čísla. Oba typy čísel lze míchat a přesto se s nimi pracuje správným způsobem. Můžete také mít dlouhé integery, což jsou celá čísla libovolné velikosti. V mnoha případech jsou užitečné -- ať potřebuje o trochu více než 32 bitů nebo o mnoho více než 32 bitů. Dlouhé integery jsou také dostupné v Javě, ale v odděleném balíčku a používají se mnohem obtížněji, protože Java postrádá přetěžování operátorů. V Pythonu můžete napsat pouze x + y a je úplně jedno, zda x a y jsou malá celá čísla nebo čísla s mnoha tisíci bity.

Lidé se také často cítí více produktivní díky "přiloženým bateriím" -- standardní knihovně obsahující mnoho užitečných věcí, včetně implementace mnoha internetových protokolů -- HTTP, FTP, NNTP, IMAP, POP, SMTP. Kromě toho existuje i API vyšší úrovně, kterému pouze předáte URL a ono vám vrátí cosi, co se chová jako otevřený soubor. Pak jen čtete data a automaticky získáváte data odpovídající danému URL. Tyto knihovny obsahují mnoho užitečností za použití minima kódu.

Kromě standardní knihovny vytvořila komunita uživatelů Pythonu mnoho nezávislých knihoven. Mnoho let například nepodporovala standardní HTTP knihovna koláčky cookie, ale existoval výborný nezávislý cookie modul. Před jedním nebo dvěma roky byla jejich podpora přidána do standardní knihovny, nicméně již dlouho před tím byla dostupná pro lidi, kteří ji potřebovali. Všechny tyto aspekty pozitivně ovlivňují programátory a jejich produktivitu.

Objevování kódu

Bill Venners: Slyšel jsem o jednom problému Pythonu týkajícím se návrhu programu. Protože lidé mohou v Pythonu tak snadno napsat své programy, mají tendenci návrh vynechávat. Myslíte si, že upovídanost například Javy nutí lidi více plánovat své programy?

Guido van Rossum: Návrh je dobrý i špatný. Pokud víte, kam jdete, je dobrý. Pokud nevíte, co se vám po cestě přihodí, měli byste být více otevření a improvizovat. Vím o místech, kde se vyplatí přemýšlet, ale v jazyce, který vás nutí plánovat cokoli, je daleko větší ryziko klopýtnutí. Pak jste omezováni strachem z toho, že nevíte, jak něco udělat. V Pythonu můžete něco začít dělat a zjistit jak to dokončit během samotného postupu k cíli. Něco můžete napsat rychle, získat nové poznatky a pak navrhnout nový postup založený na lepším pochopení problému.

Bill Venners: Často si myslím, že vytváření programů je jako míchání cementu. Jde to lehce ale časem začne přituhovat. Později můžete vidět něco, co jste před tím neviděli, proto nemůžete cokoli plánovat od začátku. Můžete si udělat návrh, ale pak zjistíte, jak by se dalo postupovat lépe. Proto začnete znovu. Při každém začátku se posunete k lepšímu řešení a množství kódu se neustále zvyšuje. Nakonec již máte rozhraní, které je opravdu ověřené a na kterém začnete stavět.

Guido van Rossum: A poté již potřebujete být opravdu zpětně kompatibilní.

Bill Venners: Proto lze dělat změny tak snadno před oním přituhováním. Možná věci v Pythonu netvrdnou tak rychle, přes jednotlivé cykly vývoje se totiž dostáváte daleko rychleji.

Guido van Rossum: Ano. Vždy jsem považoval za nejzajímavější ty programovací úlohy, při kterých přesně nevíte, kde skončíte. Implementování nového tabulkového procesoru je nudné. Již máme spoustu tabulkových procesorů. Víme, jak by mělo jeho uživatelské rozhraní vypadat. Víme jaké jsou správné postupy implementace. Lze to pravděpodobně velmi dobře navrhnout, protože si lze udělat seznam vlastností všech známých programů. Chci toto, chci tamto, chci opravit tento problém. Chci se vyvarovat chybám. Je to jednoduché, ale ne moc zajímavé.

Mám rád programovací problémy, kde se přemýšlí: "To je něco opravdu zajímavého, ale nemohu to pořádně popsat." Jediné, co můžete dělat je postupovat krok za krokem, za pomoci malých částí kódu a začít objevovat lepší popis. A možná to nebylo v tom, ale někde jinde. Nebo se jedná o úplně jiný problém, než jste ze začátku mysleli. Možná to není vůbec zajímavé a vy tím přestanete chtít ztrácet čas.

Nebezpečím plánování je plánování možností, o kterých víte, ale neplánování věcí, o nichž nic nevíte, které teprve objevujete. Takže pokud poprvé narazíte na neočekávanou událost na vaší programátorské cestě, musíte opravit rozhraní mnoha metod. A když se poté vrátíte k původnímu plánu, již mnohé neplatí a vy máte další problém.

Nestarám se konkrétně o to, když někteří říkají, že v Pythonu můžete prototypovat snadněji, ale například Javová verze Pythonu usnadňuje psaní velkých a robusních systémů. S Pythonem můžete snadno prototypovat. Pokud již jednou objevíte podstatu problému, můžete udělat více plánů a návrhů, které verze v Javě vyžaduje. Pokud začnete psát v Javě a znáte stejně málo, jako kdybyste začali pracovat na prototypu v Pythonu, ztratíte mnohem více času vytvářením fungujícího systému než objevováním správného řešení.

Ve světě Pythonu máme několik pěkných příkladů. Hodně dávno, když se web teprve stával zajímavý pro věci jako online nakupování, malá společnost nazvaná eShop vyvinula různé servery pro e-comerci. eShop používal proprietární protokoly, proprietární aplikace a byl napsán tak, aby byl použitelný pouze z webového browseru. Vývojáři se rozhodli vytvořit prototyp v Pythonu. Protože použili Python, uvolnili tito vývojáří první beta verzi mnohem dřívě než ostatní, kteří se snažili o totéž. Po této betaverzi již nikdy neuvolnili fungující kód, poněvadž tato společnost byla pohlcena Microsoftem. Microsoft provedl dvě nebo tři revize po nichž byl veškerý kód přepsán do C++. Ale pokud by eShop nezačal v Pythonu, nikdy by nevytvořil nic tak zajímavého, aby k této akvizici vůbec došlo.

Totéž Yahoo. Yahoo Mail začal jako úspěšná aplikace v Pythonu. Opět, poněvadž vývojáři použili Python, mohli rychle reagovat na návrhy uživatelů. A vytvořili aplikaci, kterou může používat téměř kdokoli. Opravili mnoho chyb a zároveň mohli přidávat mnoho nových vlastností. Protože dělali cosi nového, nevěděli přesně, co lidé budou vyžadovat od webmailu. Požadavky byly naprosto odlišné od programu, který běží na vašem počítači, i přístupové doby jsou odlišné. A opět, myslím si, že Yahoo nyní může nahradit tento kód za C++ nebo kterýkoli jiný jazyk, ale na začátku byl Pythonní prototyp.

Obsah