Секреты Python Pro
Қосымшада ыңғайлырақҚосымшаны жүктеуге арналған QRRuStore · Samsung Galaxy Store
Huawei AppGallery · Xiaomi GetApps

автордың кітабын онлайн тегін оқу  Секреты Python Pro

 

Дейн Хиллард
Секреты Python Pro
2021

Переводчик А. Логунов

Технический редактор А. Руденко

Литературные редакторы М. Кольцов, А. Руденко

Художник В. Мостипан

Корректоры С. Беляева, Н. Викторова

Верстка Л. Егорова


 

Дейн Хиллард

Секреты Python Pro. — СПб.: Питер, 2021.

 

ISBN 978-5-4461-1684-3

© ООО Издательство "Питер", 2021

 

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

 

Предисловие

 

С языком Python мы родились в декабре 1989 года. За последующие три десятилетия я многого достиг, и Python тоже. Все больше людей выбирают его для достижения самых амбициозных целей в области data science, машинного обучения и многого другого. С тех пор как я освоил Python, этот «второй среди лучших языков для всего на свете» для меня стал первым и лучшим.

У меня был довольно традиционный путь в программирование через факультет электротехники и computer science Мичиганского университета. В то время все лабораторные на курсе были сосредоточены в основном на C++ и MATLAB — языках, которые я продолжал использовать на первом рабочем месте. На следующей должности, обрабатывая большой объем данных из области биоинформатики, я разработал несколько экземпляров скриптов для командной оболочки на SQL и начал использовать PHP для работы на персональном веб-сайте WordPress.

Хотя я и получал результаты (иногда даже крутые), ни один из используемых мною языков не находил во мне отклика. Я считал, что языки программирования — это просто средство достижения цели и у них мало шансов быть клевыми. Примерно в это время один товарищ пригласил меня присоединиться к хакатон-проекту по разработке библиотеки Ruby.

Внезапно мир взорвался красками, фрукты стали слаще, деревья выше и все такое. Простота использования интерпретируемого языка и удобный для человека синтаксис Ruby действительно заставили меня задуматься о тех инструментах, которые я использовал. Правда, я не слишком долго задержался на Ruby, решив для следующей итерации персонального веб-сайта попробовать Python и веб-фреймворк Django. Это принесло мне ту же радость и плавный прогресс в обучении, который был с Ruby, и с тех пор к Ruby я не возвращался.

Теперь, когда Python широко признан наилучшим языком для многих задач, людям, приходящим в разработку ПО, не нужно переживать этап проб и ошибок, который прошел я, — они открывают новые интересные пути к карьере в области ПО. Но несмотря на эти различия, надеюсь, что мы поделимся общим опытом радости от программирования на Python, и книгой «Секреты Python Pro»я хочу внести свой вклад в эту радость.

Присоединяйтесь к чудесному путешествию по Python, в которое я попал случайно. Хочу увидеть, как вы создаете веб-сайт, конвейер данных или автоматизированную систему полива растений. Что бы вы ни нафантазировали, Python вас прикроет. Присылайте скриншоты и образцы кода ваших проектов по адресу python-pro-projects@danehillard.com.

Благодарности

Я писал эту книгу не один и глубоко признателен всем, кто как только мог помогал мне на разных этапах. Я ценю вас.

Почти каждый, кто участвовал в создании книги, может сказать, что работы всегда оказывается больше, чем ожидалось, — я слышал это много раз. Но настоящая борьба разворачивается там, где приходится уравновешивать чрезмерную работу с реальной жизнью.

Стефани! Твоя поддержка и то, что ты терпела мой треп, было безумно важно при создании книги. Благодарю тебя за то, что ты так легко воспринимала мое невнимание и вытаскивала меня из этого проекта в самые трудные времена. Я бы не справился без тебя.

Спасибо моим родителям, Киму и Донне, за то, что всегда направляли мою энергию в творческое русло.

Спасибо моему дорогому другу Винсенту Чжану за бесчисленные ночи в кофейне, когда мы писали код. Там и родилась концепция книги, и твое одобрение помогло мне взяться за дело.

Спасибо Джеймсу Нгуену за настойчивость — ты изменил свою жизнь, чтобы стать разработчиком, и олицетворяешь целевую аудиторию этой книги. Я горжусь твоими достижениями.

Выражаю благодарность всем моим коллегам в ITHAKA и за ее пределами за ваш вклад и поддержку — вы выдержали этот непростой период.

Тони Арритоле, редактору, спасибо за решимость подталкивать меня к более качественному изложению. Процесс написания книги чреват многими неожиданными препятствиями, но вы обеспечили мне стабильность. Спасибо.

Ник Уоттс, научный редактор, ваши отзывы превратили мой безумный бред в правдоподобные размышления о разработке ПО. Я очень ценю вашу искренность и проницательность.

Спасибо Майку Стивенсу и Марджан Бейс из издательства Manning за то, что они поверили в мою идею и доверили ее реализовать. Спасибо всем в Manning за неустанную работу по воплощению авторских замыслов.

Всем рецензентам — Элу Кринкеру, Бонни Бейли, Буркхарду Нестману, Крису Уэйману, Дэвиду Кернсу, Дэвиду Кадамуро, Эриксу Зеленке, Грэму Уилеру, Грегори Матушеку, Жану-Франсуа Морину, Йенсу Кристиану Бредалю Мадсену, Джозефу Перениа, Марку Томасу, Маркусу Маучеру, Майку Стивенсу, Патрику Ригану, Филу Соренсену, Рафаэлю Кассемиро Фрейре, Ричарду Филдсенду, Роберту Уолшу, Стивену Парру, Свену Стампфу и Уиллису Хэмптону — ваши предложения помогли сделать книгу лучше.

Последняя благодарность всем, кто оказал положительное влияние — намеренно, ненамеренно или иным образом — на мой путь в программировании и эту книгу. Просто невозможно составить исчерпывающий список. Спасибо Марку Брехобу, доктору Эндрю Деорио, Джесси Силафф, Треку Гловаки, всем в SAIC (в нашем маленьком офисе в Анн-Арборе), всем в Compendia Bioscience (и друзьям), Брэндону Родсу, Кеннету Лаву, Трею Ханнеру, Джеффу Триплетту, Мариатте Виджая, Али Спиттелу, Крису Койеру, Саре Драснер, Дэвиду Бизли, Дрону Аялону, Тиму Аллену, Санди Мец и Мартину Фаулеру.

О книге

В книге «Секреты Python Pro» есть несколько идей, которые разработчики на практически любом языке могут использовать для улучшения своей работы. Она будет отличной книгой после изучения основ языка Python.

Для кого эта книга

Книга предназначена для тех, кто начинает свой путь в программировании или тех, кто использует ПО в качестве дополнительного инструмента в своей работе. Описанные здесь идеи помогут создавать ПО, улучшать его сопровождение и облегчат совместную работу.

В естественных науках воспроизводимость и работа с источниками являются важными аспектами исследовательского процесса. Все больше исследований опирается на софт, где особенно важен понятный код, который можно обновлять и совершенствовать. Но в учебных планах по-прежнему уделено слишком мало внимания связи ПО с другими дисциплинами. Тем, кто имеет небольшой опыт в формальной разработке софта, эта книга расскажет о принципах создания совместно переиспользуемого ПО.

Если вы хорошо разбираетесь в объектно-ориентированном программировании и предметно-ориентированном дизайне, то эта книга, возможно, покажется вам простой. Но начинающие разработчики обязательно найдут в ней много интересного.

Структура книги

Книга состоит из одиннадцати глав и разделена на четыре части. В частях I и II излагается тематический материал и приводятся краткие примеры и упражнения. Часть III основана на материалах из предыдущих глав и тоже содержит упражнения. В части IV содержатся рекомендации по дальнейшему изучению языка Python.

Часть I «Почему это важно?» рассказывает о восхождении языка Python к славе и отвечает на вопрос, в чем ценность разработки ПО.

• Глава 1 посвящена недавней истории языка Python и его достоинствам. Объясняется, почему так важен дизайн программного обеспечения и как он проявляется в вашей повседневной работе.

Часть II «Основы проектирования» охватывает концепции высокого уровня, лежащие в основе дизайна и разработки ПО.

• Глава 2 посвящена теме разделения ответственности — фундаментальной концепции, являющейся основополагающей для других, описанных в книге.

• Глава 3 объясняет абстракцию и инкапсуляцию и показывает, как сокрытие информации и предоставление простых интерфей­сов для более сложной логики помогает держать код под конт­ролем.

• Глава 4 предлагает подумать о производительности, разных струк­турах данных, подходах и инструментах создания быстрых программ.

• Глава 5 учит тестированию программ с использованием различных подходов — от юнит-тестирования до сквозного тестирования.

Часть III «Организация крупных систем» проведет вас по процессу создания реального приложения с использованием принципов, которые вы усвоили.

• В главе 6 вы самостоятельно спроектируете приложение. В главе также содержатся упражнения, которые помогут создать базу программы.

• Глава 7 разбирает понятия расширяемости и гибкости и содержит упражнения на добавление расширяемости в приложение.

• Глава 8 рассказывает о наследовании: когда и где его следует использовать. В главе также содержатся упражнения на проверку наследования в приложении.

• Глава 9 знакомит с инструментами и подходом для предотвращения чрезмерного роста кода по мере развития проекта.

• Глава 10 объясняет понятие слабой сопряженности и приводит несколько заключительных упражнений на уменьшение сопряженности в разрабатываемом приложении.

Часть IV «Что дальше?» дает несколько рекомендаций, как и чему учиться дальше.

• В главе 11 я покажу, как составить план дальнейшего обучения, и затрону несколько тем, которые могут быть интересны, если вы настроены на последующее погружение в вопросы разработки ПО.

Рекомендую читать книгу «Секреты Python Pro» последовательно, хотя вы можете пропустить главы из частей I и II, если эти темы вам знакомы. Часть III лучше читать последовательно и делать упражнения по порядку.

В конце книги есть приложение, где рассказано, как установить Python:

• В приложении рассматривается вопрос о том, какую версию Python установить, и как это сделать.

О коде

Полный исходный код примеров и упражнений можно получить в репозитории книги на GitHub (https://github.com/daneah/practices-of-the-python-pro). Либо зайдите на домашнюю страницу книги (www.manning.com/books/prac-tices-of-the-python-pro) и скачайте код, нажав на кнопку Source Code (Исходный код).

Эта книга содержит много примеров исходного кода, как в пронумерованных листингах, так и в основном тексте. В обоих случаях код выделен моноширинным шрифтом.

Во многих случаях код был переформатирован: мы добавили разрывы строк и переработали отступы, чтобы уместиться в доступное пространство книжной страницы. В редких случаях даже этого было недостаточно, и листинги включали маркеры продолжения строк (

). Кроме того, комментарии в коде часто удаляются из листингов, если в тексте есть описание. Большая часть листингов имеет дополнительные примечания.

В каждой главе код организован в модули Python, на которые даны ссылки в тексте. Мы надеемся, что вы напишете свою версию кода и будете использовать предоставленный исходный код только для самопроверки. В части III проекты каждой главы имеют в основе код из предыдущей, однако каждая глава содержит полную рабочую копию исходного кода.

Весь код этой книги написан на Python 3, точнее предназначен для работы с Python 3.7+. Большую часть кода можно организовать для работы в более ранних версиях без особых проблем, но все же подумайте об установке свежей версии Python для работы с этой книгой.

Форум liveBook

Покупка книги «Секреты Python Pro» включает в себя бесплатный доступ к веб-форуму от издательства Manning Publications, где вы можете комментировать книгу, задавать технические вопросы и получать помощь от автора и других пользователей. Для того чтобы получить доступ к форуму, перейдите по ссылке https://livebook.manning.com/#!/book/practices-of-the-python-pro/discussion. Вы также можете узнать больше о форумах издательства Manning и правилах поведения на сайте по адресу https://livebook.manning.com/#!/discussion.

Издательство Manning предоставляет читателям возможность для содержательного диалога. Участие и вклад автора в работу форума остается добровольным (и неоплачиваемым). Попробуйте задать автору сложный вопрос! Форум и архивы предыдущих дискуссий будут доступны на веб-сайте издательства.

Об авторе

Дейн Хиллард — ведущий разработчик веб-приложений в ITHAKA, некоммерческой организации в области высшего образования. Ранее занимался созданием движков для данных телеметрии и конвейеров ETL для приложений в области биоинформатики.

Первые попытки Дейна программировать заключались в создании индивидуального стиля для своей страницы MySpace, написании скриптов для приложения 3D-моделирования Rhinoceros и создании настраиваемых под свои нужды скинов и оружия для игры Liero в MS-DOS. Дейн любит творческое написание кода и активно ищет способы объединить свою любовь к музыке, фотографии, еде и ПО.

Дейн неоднократно выступал на международных конференциях, посвященных Python и Django, и планирует продолжать, пока кто-нибудь его не остановит.

Об обложке

Рисунок на обложке книги «Секреты Python Pro» называется «Homme Finnois», или «Финский человек» (житель Финляндии). Иллюстрация взята из коллекции костюмов разных стран Costumes de Diff

rents Pays Жака Грассе де Сен-Совера (1757–1810), опубликованной во Франции в 1797 году. Каждая иллюстрация нарисована и раскрашена от руки. Иллюстрации из каталога Грассе де Сен-Совера напоминают о культурных различиях между городами и весями мира, имевших место почти двести лет назад. Люди, проживавшие в изолированных друг от друга регионах, говорили на разных языках и диалектах. По одежде человека можно было определить, в каком городе, поселке или поселении он проживает.

С тех пор дресс-код сильно изменился, да и различия между разными регионами стали не столь выраженными. В наше время довольно трудно узнать жителей разных континентов, не говоря уже о жителях разных городов или регионов. Возможно, мы отказались от культурных различий в пользу более разнообразной личной жизни — и конечно, в пользу более разнообразной и стремительной технологической жизни.

Сейчас, когда все компьютерные книги похожи друг на друга, издательство Manning стремится к разнообразию и помещает на обложки книг иллюстрации, показывающие особенности жизни в разных странах мира два века назад.

В то время, когда трудно отличить одну компьютерную книгу от другой, издательство Manning демонстрирует изобретательность и инициативу компьютерного бизнеса с помощью книжных обложек, основанных на богатом разнообразии региональной жизни двухвековой давности, оживленной картинами Грассе де Сен-Совера.

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение! На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

Часть I. Почему это важно?

Когда вы начинаете изучать новые темы, важно учитывать общую картину, чтобы очертить рамки и сфокусировать внимание. Первая часть книги расскажет о значении языка Python в современной разработке ПО, а также поможет понять принципы и методы проектирования ПО, чтобы ваша карьера программиста была успешной.

Если вы новичок в программировании, или хотите изучить новый язык, или пытаетесь развить навыки для более крупных проектов, эта часть книги должна убедить вас в том, что Python — отличный выбор.

Глава 1. Крупный план

В этой главе:

Использование Python в сложных проектах.

Знакомство с высокоуровневым процессом дизайна ПО.

Когда нужно вкладываться в в дизайн.

Я рад, что вы взяли в руки эту книгу, — это значит, что вы хотите сделать следующий шаг в разработке ПО. Или войти в софтверную индустрию, или улучшить работу. Вполне возможно, раньше вам даже платили за написание софта. Примите поздравления — вы уже профессионал! Создавать код как профи — значит применять идеи и стратегии создания и поддержки крупных проектов в долгосрочной перспективе.

Читая дальше, вы узнаете, как Python помогает мыслить масштабно и переходить от написания служебных скриптов к разработке сложного ПО. Я помогу вам заложить фундамент, на котором вы разовьете свои умения.

На карьерном пути вы, вероятно, будете сталкиваться с постоянно растущей сложностью ПО: длительное проектирование или куча кода, навязанная вам в неподходящий момент. Как бы то ни было, вам захочется иметь в своем распоряжении набор утилит, чтобы во всем разобраться.

Книга поможет приобрести опыт и познакомит с работой сложных программных систем. Вы научитесь представлять разные системы еще до проектирования, чтобы свести к минимуму неожиданности и риски. После прочтения вы сможете с энтузиазмом погрузиться в то, что сейчас кажется непонятным и пугающим.

Я покажу, как поместить сложность вашего кода в легкую для понимания многоразовую оболочку. Вы организуете код так, чтобы он всегда был понятен, и поможете себе стать продуктивнее как в новых, так и в старых проектах!

Для примеров я использовал Python. Долгое время он был моим любимым языком программирования, и надеюсь, вы тоже его полюбите. Если у вас еще не было возможности познакомиться с Python поближе, то сначала найдите время, чтобы это сделать. Книга «Python. Экспресс-курс» Наоми Седер1 — отличное пособие для старта.

Великий водораздел

Что вы используете: Python 2 или Python 3? Большое количество людей все еще используют Python 2, хотя Python 3 появился давным-давно, в 2008 году. В том году на вершине чартов были «Low» Флоу Райды и «No One» Алиши Киз.

Python 3 внес несколько обратно несовместимых изменений, последствия которых ощущаются и по сей день. Многие из этих изменений были перенесены в более поздние версии Python 2. Разработчики крупных проектов, использующие Python 2, преодолевают сложности, но некоторые из них, похоже, унесут софт Python 2 с собой в могилу.

Все примеры в книге написаны для версии Python 3. Настоятельно рекомендую установить Python 3, прежде чем продолжить работу (помощь по установке — в конце книги).

Если вам еще нужны доказательства, что Python хорош, то вот они.

1.1. Python — язык для корпоративных приложений

Python исторически рассматривался как скриптовый язык. Разработчики негативно воспринимали его производительность и применимость, выбирая другие языки для своих корпоративных потребностей. Python использовался для малых задач обработки данных или персональных инструментов, а корпоративное ПО по-прежнему оставалось уделом Java, C или SAS.

1.1.1. Времена меняются

За последние несколько лет представление о Python резко изменилось. В настоящее время Python применяется практически во всех дисциплинах — от робототехники до машинного обучения и химии. Python дал старт некоторым из самых успешных интернет-компаний последнего десятилетия и не показывает никаких признаков замедления.

1.1.2. Что мне нравится в Python

Python — это глоток свежего воздуха. Как и многие мои друзья и коллеги, я очень много изучал C++ в школе, а также немного MATLAB, Perl и PHP. Я построил свой первый веб-сайт на PHP и даже в какой-то момент попробовал версию Java Spring. PHP и Java — это, как подтвердят многие успешные компании, вполне пригодные языки в этой области, но эти языки почему-то не пошли со мной на контакт.

Я нахожу синтаксис Python превосходным, и это одна из причин его растущей популярности. Он близок к письменному английскому языку, чем не могут похвастаться другие языки программирования, и подходит как новичкам, так и тем, кто устал от сложных конструкций. Я замечал, как люди загораются от радости, когда поручают Python вывести приветствие 'Здравствуй,мир!' с помощью print('Здравствуй,мир!'), и видят, как он делает именно это. Даже сейчас бывает, что я обна­руживаю стандартный библиотечный модуль, о котором раньше не знал.

Python удобочитаем — это ускоряет разработку. Хуэй Дин (Hui Ding), инженер из Instagram, проницательно отмечает, что «скорость исполнения больше не является главной заботой, а вот скорость выхода на рынок — да».2 Python обеспечивает быстрое прототипирование и, как вы увидите, способность консолидировать софт в надежную сопроводимую кодовую базу. Вот что мне нравится в Python.

1.2. Python — язык для обучения

В 2017 году опрос на Stack Overflow показал, что в странах с высоким уровнем дохода вопросы, связанные с Python, составляют более 10 % всех вопросов, опережая другие основные языки программирования.3 На сегодняшний день Python является самым быстрорастущим языком программирования, что делает его удобным учебным инструментом. Процветающее сообщество разработчиков и огромное количество доступной информации означают, что он будет оставаться безопасным вариантом еще несколько лет.

В книге я исходил из того, что у вас есть базовые знания синтаксиса Python, его типов данных и классов. При этом я не жду, что вы питонист-чемпион (или чемпион?). Некоторый опыт программирования за плечами и несколько часов личного общения с Python не даст вам запутаться в представленном коде. Попробуйте применить концепции из этой книги к другому языку, и вы обнаружите, что многие концепции разработки ПО выходят за рамки любой конкретной технологии.

1.3. Дизайн — это процесс

Хотя слово «дизайн» часто описывает результат чего-либо, смысл дизайна заключается в процессе достижения этого результата. Возьмем дизайнеров одежды. Их цель — создать вещи, которые окажутся в руках потребителей. Однако для того, чтобы дизайнер смог донести до клиентов очередной тренд, требуется много шагов и участие многих людей (рис. 1.1).

 

Рис. 1.1. Рабочий поток для дизайнера одежды. Дизайнер работает с целым рядом других людей, чтобы работа была выполнена

Дизайнеры работают с поставщиками тканей, чтобы получить нужные материалы. После того как изделие спроектировано, дизайнеры просят закройщиков изготовить выкройки. Готовые выкройки отправляются на производство, и далее одежда попадает в розничные магазины, где клиенты, наконец, покупают ее. Этот процесс может занимать месяцы!

Как и в моде, искусстве и архитектуре, дизайн в ПО представляет собой схематическую зарисовку планов, чтобы система могла выполнять задачи максимально эффективно. Планы помогают понять поток данных и фрагменты системы, производящие операции с этими данными. Рисунок 1.2 показывает высокоуровневую диаграмму рабочего потока веб-сайта электронной коммерции, очерчивающую то, как пользователь будет продвигаться шаг за шагом.

 

Рис. 1.2. Рабочий поток веб-сайта электронной коммерции. Система проходит ряд шагов, чтобы выполнить работу

При онлайн-покупке клиент обычно входит в систему, вводит информацию о доставке и оплачивает товар. В результате создается заказ, подлежащий обработке и отгрузке. Рабочие потоки, подобные этим, требуют выполнения огромного объема работ по дизайну. Программное обеспечение, которое управляет этими системами, соблюдает сложные правила, проверяет состояние ошибки и многое другое. И оно должно делать все это без промашек, потому что пользователи чувствительны к ошибкам. Они могут отказаться или даже активно выступать против продукта, который работает недостаточно хорошо.

1.3.1. Пользовательский опыт

Создание рабочих потоков затратно, даже если они кажутся небольшими и понятными. ПО, которое работает гладко для всех вариантов использования, требует исследования рынка, пользовательского тестирования и надежного дизайна. Некоторые продукты хорошо работают для предполагаемого варианта использования, но после их выпуска компании могут обнаружить, что пользователи делают с продуктом что-то совершенно неожиданное, на что ПО не заточено. В дизайне могут быть пробелы, которые необходимо учитывать.

Когда софт работает хорошо, мы этого почти не замечаем. Людям нравится контактировать без трений, и разработчики ПО не исключение. Работа с неподдерживаемым кодом, который не сопровождается технически, может привести к разочарованию, а незнание, как это исправить, — к гневу! Сделайте глубокий вдох.

Трение

Представьте себе катание на коньках. Когда вы выходите на лед сразу после того, как ледовый комбайн заканчивает его выравнивание, катание почти не требует усилий. Вы можете чуть-чуть опираться на ноги, позволяя коньку делать свою работу. Через ­некоторое время коньки начинают резать лед. Сколь­зить становится все труднее, и нужно сильно отталкиваться при каждом шаге.

Трение в пользовательском опыте похоже на грубый лед — пользователь по-прежнему способен делать то, что хочет, но он более напряжен. Опыт без трения — это опыт, который легко направляет пользователей вперед, до такой степени, что они едва замечают, как выполняется работа.

Скажем, вам поручено обновить ПО для отчетности в вашей компании. Вы видите, что значения в файлах экспорта разделены запятыми (CSV), но пользователи говорят, что табуляция (TSV) удобнее. Вы думаете: «Обновлю разделитель в выходной функции!» Затем открываете код и обнаруживаете, что все выводящие строки выглядят так:

print(col1_name + ',' + col2_name + ',' + col3_name + ',' + col4_name)

print(first_val + ',' + second_val + ',' + third_val + ',' + fourth_val)

Нужно убедиться, что вы заменили запятую на знак табуляции в шести местах. Здесь можно ошибиться. Вы заметили, что первая строка выводит заголовок, но пропустили строку, которая выводит строки данных. Для удобства разработчика, который будет использовать код после вас, сохраните значение разделителя в константе и используйте его там, где необходимо. Еще можно применить функцию, чтобы облегчить себе построение строк. Тогда, если пользователи снова захотят запятые, изменение можно будет внести только в одном месте:

DELIMITER = '\t'

print(DELIMITER.join([col1_name, col2_name, col3_name, col4_name]))

print(DELIMITER.join([first_val, second_val, third_val, fourth_val]))

Обдумывая систему на высоком уровне, вы начнете замечать грубые участки, которые не видели раньше, и понимать, что некоторые ваши допущения неточны. Вы удивитесь еще не раз, и это побудит вас продолжать в том же духе. Как только вы начнете видеть повторяющиеся паттерны и часто встречающиеся оплошности, вы научитесь распознавать шипы, которые нужно вытащить.

1.3.2. Вы уже были здесь раньше

Осознанно или нет, вы наверняка уже проходили через процесс проектирования. Подумайте о том времени, когда вы на мгновение перестали писать код, чтобы вернуться к цели, которую вы пытались достичь. Замечали ли вы что-то, что заставило вас изменить направление движения? Видели ли вы более эффективный способ решения задачи?

Эти короткие моменты сами по себе являются процессами проектирования. Вы сопоставляли цель и текущее состояние ПО, чтобы определить дальнейшие действия. Выделение процессов проектирования на ранней стадии работы будет иметь как краткосрочные, так и долгосрочные преимущества.

1.4. Дизайн обеспечивает высокое качество ПО

Буду с вами откровенен: хороший дизайн требует времени и усилий. Он не бесплатный. Внедрение дизайнерского мышления в повседневную работу очень важно, но решающее значение имеет независимый дизайнерский шаг перед написанием (или переписыванием) кода.

Планирование системы поможет выявить участки, которые представляют риск и содержат уязвимости пользовательской информации. Оно поможет увидеть, какие части системы могут быть узкими местами для производительности или отдельными точками сбоя.

Вы сэкономите время и деньги, упростив, объединив или разделив фрагменты системы. Глядя на отдельные компоненты, вы не поймете, выполняют ли другие компоненты аналогичную работу. Обзор системы в целом позволяет принимать обоснованные решения относительно дальнейшего пути.

1.4.1. Соображения по дизайну ПО

Часто ПО пишут для «пользователя», но кто это? Человек, использующий продукт, частью которого является ПО, или человек, пытающийся разработать дополнительные характеристики ПО? Часто вы являетесь единственным пользователем вашего ПО! Тогда вы можете лучше выявить качества, которые хотите сконструировать.

Ниже приведено несколько часто встречающихся аспектов оценки свойств ПО для различных вариантов использования:

• Скорость — программа выполняет работу так быстро, как только может.

• Целостность — данные, используемые или созданные ПО, защищены от повреждения.

• Ресурсы — ПО эффективно использует дисковое пространство и пропускную способность сети.

• Безопасность — пользователи могут читать и записывать данные, доступные только после авторизации.

В дополнение вот некоторые часто встречающиеся результаты, которые вы как разработчик, возможно, захотите получить:

• Слабаясопряженность — компоненты ПО не находятся в сложной зависимости друг от друга.

• Интуитивность — разработчики могут понять суть ПО и то, как оно работает, прочитав код.

• Гибкость — разработчики могут адаптировать ПО к связанным или аналогичным задачам.

• Расширяемость — разработчики могут добавлять или изменять один аспект ПО, не затрагивая другие аспекты.

Достижение этих результатов часто сопряжено с издержками. Например, принятие обязательств по повышению безопасности ПО, скорее всего, замедлит его разработку. Это увеличит ваши расходы, и вы захотите продать свое приложение по более высокой цене. Эффективное планирование и понимание компромиссов между результатами поможет вам минимизировать издержки для вас и ваших потребителей.

Языки программирования обычно не решают эти вопросы непосредственно — они просто предоставляют инструменты, с помощью которых разработчик занимается обслуживанием. Например, высокоуровневые языки, такие как Python, позволяют разработчикам писать на языке, близком к естественному, что обеспечивает некоторую защиту с точки зрения повреждения памяти. Python также поощряет использование эффективных типов данных с помощью своего синтаксиса (глава 4).

Тем не менее существует еще много работы, которую мы можем делать своими силами, потому что даже Python не способен предсказать все пути, которыми разработчики могут все испортить. Именно здесь поможет тщательный дизайн и продумывание системы в целом.

1.4.2. Органически выращенное ПО

В отличие от фермерских продуктов, органически выращенное ПО вредно для здоровья. В контексте разработки софта система, которая органически выросла с течением времени, скорее всего, созрела для рефакторинга. Рефакторингкода — это процесс обновления кода для его более оптимальной проработки и отражения последних передовых практик. Он связан с повышением производительности, сопроводимости или удобочитаемости кода.

Как следует из названия «органически выращенное», такое ПО стало организмом, укомплектованным нервной системой и собственным разу­мом. Возможно, в него были вживлены (и не раз) куски другого ПО, где-то там гниют методы, которые не использовались много лет,  скорее всего, есть одна функция, которая выполняет около 150 % работы. Время для рефакторинга такой системы бывает трудно выбрать, но оно наступает задолго до того момента, когда вы кричите: «Жив еще, курилка!»

Пример такого явления показан на рис. 1.3. Процесс регистрации на веб-сайте электронной коммерции включает в себя несколько важных шагов:

1. Определить наличие товара на складе.

2. На основе цены товара рассчитать промежуточный итог.

3. На основе региона покупки рассчитать:

• налог;

• расходы на доставку и обработку.

4. На основе текущих стимулирующих акций рассчитать скидки.

5. Рассчитать итоговую сумму.

6. Обработать платеж.

7. Выполнить заказ.

 

Рис. 1.3. Система электронной коммерции, которая выросла органически

В этой системе некоторые шаги четко разделены. Неплохо! Но есть и неровный участок посередине. Похоже, что вся логика, связанная с ценой, происходит в одном большом куске. Если в этом процессе есть дефект, то будет трудно понять, на какомименно шаге он происходит. Если цена окажется неправильной, придется просеять много кода, чтобы выяснить причину. Обработка платежей и их выполнение тоже смешаны в кучу, так что при наличии не вовремя выявленной ошибки вполне возможна ситуация, когда вы успешно обработаете платеж, но так и не выполните заказ. Это может вызвать недовольство клиента.

Хорошим началом на пути к повышению надежности этого рабочего потока станет вычленение его логических шагов (рис. 1.4). Если каждый шаг обрабатывается своей собственной службой, то служба для отдельного шага должна заниматься только одним заданием. Служба инвентаризации — отслеживать наличие товара. Служба ценообразования — знать его стоимость и налог. Изоляция шагов друг от друга снизит вероятность того, что каждый из них будет страдать от дефектов.

 

Рис. 1.4. Возможный вид тщательно спланированной системы электронной коммерции

Дизайн позволяет увидеть места, где существующие части системы могут быть разложены на более простые. Идея декомпозиции является лишь одним из инструментов, который мы подробнее рассмотрим в следующих главах. Имейте в виду, что рефакторинг исходного кода и редизайн никогда не завершаются. Однако усвоив некоторые технические приемы, вы обнаружите, что со временем эти задачи будут решаться проще и быстрее. Будьте начеку и распознавайте возможности для улучшения существующего кода!

1.5. Когда нужно уделять время дизайну

Мы склонны фокусировать усилия на создании нового ПО. Но по мере роста проектов мы забываем о реализации рабочего кода, который скорее создает проблемы, чем представляет ценность. Так проект накапливает технический долг, то есть требует дополнительной работы для сохранения продуктивности.

Чем чаще корявый фрагмент кода встает на пути и чем труднее с ним справиться в эти моменты, тем дольше нужно наводить порядок. Попробуйте найти проблему заранее.

Продуманный заранее дизайн ПО сэкономит время и избавит от головной боли в будущем. Когда ПО является гибким настолько, что его можно распространять на новые варианты использования, с ним приятно работать, поэтому обдумывайте написание каждой строки кода, чтобы поддержать продуктивность на высоком уровне. Мне нравится думать об этом как о технической инвестиции — вложениях ради последующего финансового возврата.

Возможно, вы сталкивались с проблемой в вычислительных фреймворках — крупных библиотеках кода, которые обеспечивают строительные блоки для реализации вашей цели (например, улучшения внешнего вида веб-сайта или создания нейросети для обнаружения лиц на видео). Фреймворк должен быть гибким в части обработки разных вариантов использования и расширяемым, чтобы вы могли дописать новую функцио­нальность в старый код. Разработчики Python создали многочисленные вычислительные фреймворки: запросы для выполнения HTTP-вызовов, Flask и Django для веб-разработки, pandas для анализа данных и т.п. В каком-то смысле большинство кода — фреймворк. Изу­чите его заранее, чтобы не чинить препятствий самому себе.

Дизайн ПО — это инвестиция, которая помогает адаптировать программу к потребностям разработчиков и потребителей без больших накладных расходов и разочарований. Помните, что важна частота использования или обновления кода  — тратить недели на совершенствование скрипта, применяемого пару раз в течение срока жизни проекта, неэкономично.

1.6. Новые начинания

Если вы зададитесь целью быть внимательнее к дизайну, улучшения быстро окажутся вам не по плечу. Возникнет так много всего, что нужно узнать и сделать, что попытки управлять всем этим сразу не доставят удовольствия. Необходимо постепенно внедрять в свою работу концепции дизайна, пока они не станут частью вашего мышления. В этой книге я буду вводить небольшие наборы понятий в каждую главу, и вы сможете в любое время вернуться к отдельным главам, чтобы закрепить знания.

1.7. Дизайн демократичен

Возможно, раньше вам приходилось работать над проектами самостоятельно, например во время учебы. В случае крупных проектов такое случается нечасто. В компаниях, разрабатывающих ПО для бизнеса, над одним продуктом могут работать десятки разработчиков, имеющих уникальный опыт. Разнообразие точек зрения хорошо отражается на надежности системы.

В ваших интересах прислушаться к мнению других разработчиков, особенно на ранних стадиях написания кода. Вы сможете выбрать из многочисленных вариантов самый подходящий и повысить свою продуктивность.

Если вам не выпала честь работать с активной командой разработчиков, то с особенностями совместного ПО вас могут познакомить проекты с открытым исходным кодом. Ищите дискуссии, где разработчики расходились (конструктивно!) во мнениях о какой-то задаче, и смотрите, какие соображения вступали в игру. Мыслительный процесс, который ведет к решению, часто важнее самого решения. Способность рассуждать и обсуждать скорее поможет вам преодолеть трудности, чем знание конкретного алгоритма.

1.7.1. Хладнокровие

При написании ПО можно легко увлечься. Вспомните периоды своего энтузиазма. Вам не терпелось увидеть код в рабочем состоянии, и вы не могли сидеть спокойно и писать идеальный код.

При работе с небольшим скриптом или при выполнении некоторой предварительной работы цикл быстрой обратной связи может быть полезен для сохранения продуктивности. Я часто делаю подобную работу в цикле чтения, вычисления и печати (read-eval-print loop, REPL) на Python.

Интерактивная среда REPL

Интерактивная среда REPL — это то, что скрывается за цепочкой символов >>>, когда вы набираете python в терминале. Она читает то, что вы набираете на клавиатуре, оценивает это, выводит результат и ждет, когда все это повторится (в цикле). Многие языки предоставляют среду REPL, поэтому разработчики имеют возможность интерактивно тестировать несколько строк кода.

Но будьте осторожны: в какой-то момент быстрое написание строки кода и наблюдение за тем, как она изменяет выходные данные, становится утомительной. Вы захотите написать более длинный или более долгосрочный код в файл и выполнить его с помощью интерпретатора. У каждого есть свой порог: я обычно упираюсь в свой, когда хочу использовать повторно строку кода, которую написал раньше, и это 15 строк назад в истории.

Пример в листинге 1.1 показывает, как преобразовать словарь данных, который увязывает штаты США с их столицами. Чтобы составить список всех столиц в алфавитном порядке, нужно:

1. Получить значения городов из словаря.

2. Отсортировать значения городов.

Листинг 1.1. Получение столиц штатов в алфавитном порядке

 

Эта задача была не так уж плоха, возникла только одна проблема. Но по мере роста проекта и расширения масштабов изменений полезно сделать шаг назад.

Продуманные планы экономят время в долгосрочной перспективе, вы же не будете делать два шага вперед и один шаг назад. Планирование на ранней стадии сформирует привычку подмечать возможности для рефакторинга. Когда я нахожусь в таком режиме, то обычно переключаюсь на написание своего кода в реальном модуле Python, даже если все еще пишу довольно короткий скрипт. Это побуждает меня немного притормозить и держать в уме более крупную цель.

Теперь представьте, что вам понадобился список столиц штатов в нескольких контекстах: в регистрационной форме, форме доставки и форме выставления счетов. Во избежание повтора вычисления можно обернуть это вычисление в функцию и вызывать ее всякий раз, когда нужно.

Листинг 1.2. Обертывание логики столицы штата в функцию

 

Получилась многоразовая функция. Но она работает с константными данными и делает некоторые вычисления при каждом вызове. Если она вызывается часто, можно ее изменить для повышения производительности.

На самом деле эта функция вообще не нужна. Переиспользования можно достичь с помощью только одного набора вычислений и сохранения результата в константе для последующего использования.

Листинг 1.3. Рефакторинг кода проявляет более лаконичное решение

 

Двукратное сокращение числа строк кода без ущерба для удобочитаемости дает дополнительное преимущество.

Процесс, который мы прошли от постановки задачи до ее решения, представляет собой дизайн. Скоро вы обнаружите, что можно определить области, требующие улучшения, на ранней и более ранней стадии, а затем станете перед написанием кода чертить высокоуровневые диаграммы сложных фрагментов ПО. Конечно, не все так работают, решайте сами.

Если вам захотелось все бросить и начать свой проект заново, держитесь! Читая эту книгу, вы увидите, что процессы дизайна и рефакторинга ПО не только взаимосвязаны, но и являются двумя сторонами одной медали. Выполнение одного часто означает выполнение другого, и оба они непрерывны. К тому же ничто (и никто) не совершенно, поэтому возвращайтесь к коду почаще, особенно когда пошли трения.

А сейчас расслабьтесь. Впереди много всего интересного.

1.8. Как пользоваться этой книгой

Конечно, эту книгу лучше всего прочитать от корки до корки. Я структурировал части так, чтобы более поздний материал отражал идеи раннего. В части III каждая глава строится на базе проекта, который вы начнете в главе 6. Но не стесняйтесь пролистывать или пропускать главы, с материалом которых уже знакомы, с оговоркой, что время от времени вам, возможно, понадобится вернуться к более ранней главе.

Идеи или практики из большинства глав можно легко внедрить в вашу повседневную работу. Если появится глава, идеи которой вы найдете особенно ценными, тщательно обдумайте их, а затем читайте дальше.

Помните, что код примеров и упражнений находится в репозитории GitHub этой книги (https://github.com/daneah/practices-of-the-python-pro), а также что большая часть исходного кода предназначена для проверки вашей собственной работы после выполнения упражнения. Используйте предоставленный код, если вы застряли или хотите сравнить решения, но сначала попробуйте выполнить упражнения самостоятельно.

Приятного написания кода!

Итоги

• Python имеет такой же вес в сложных корпоративных проектах, как и другие основные языки программирования.

• Python имеет одну из самых быстрорастущих пользовательских баз из всех языков программирования.

• Дизайн — это не только внешний вид, а процесс, которому вы следуете, чтобы добраться до цели.

• Дизайн — это инвестиция, которая потом вознаградит вас чистым и гибким кодом.

• Необходимо создавать ПО с учетом разнообразной аудитории.

1Седер Наоми. Python. Экспресс-курс. 3-е изд. — СПб.: Питер, 2020. — 480 с. — Примеч. ред.

2 Мишель Гино, «Instagram плавно переходит на Python 3» (Michelle Gienow, Instagram Makes a Smooth Move to Python 3) (http://mng.bz/Ze0j) — это отличная рецензия на переход Instagram с Python 2 на Python 3.

3 Дэвид Робинсон, «Невероятный рост популярности языка Python» (The Incredible Growth of Python), блог Stack Overflow (http://mng.bz/m48n).

Седер Наоми. Python. Экспресс-курс. 3-е изд. — СПб.: Питер, 2020. — 480 с. — Примеч. ред.

Мишель Гино, «Instagram плавно переходит на Python 3» (Michelle Gienow, Instagram Makes a Smooth Move to Python 3) (http://mng.bz/Ze0j) — это отличная рецензия на переход Instagram с Python 2 на Python 3.

Дэвид Робинсон, «Невероятный рост популярности языка Python» (The Incredible Growth of Python), блог Stack Overflow (http://mng.bz/m48n).

Для примеров я использовал Python. Долгое время он был моим любимым языком программирования, и надеюсь, вы тоже его полюбите. Если у вас еще не было возможности познакомиться с Python поближе, то сначала найдите время, чтобы это сделать. Книга «Python. Экспресс-курс» Наоми Седер1 — отличное пособие для старта.

Python удобочитаем — это ускоряет разработку. Хуэй Дин (Hui Ding), инженер из Instagram, проницательно отмечает, что «скорость исполнения больше не является главной заботой, а вот скорость выхода на рынок — да».2 Python обеспечивает быстрое прототипирование и, как вы увидите, способность консолидировать софт в надежную сопроводимую кодовую базу. Вот что мне нравится в Python.

В 2017 году опрос на Stack Overflow показал, что в странах с высоким уровнем дохода вопросы, связанные с Python, составляют более 10 % всех вопросов, опережая другие основные языки программирования.3 На сегодняшний день Python является самым быстрорастущим языком программирования, что делает его удобным учебным инструментом. Процветающее сообщество разработчиков и огромное количество доступной информации означают, что он будет оставаться безопасным вариантом еще несколько лет.