Знакомьтесь, Python. Секреты профессии 9785171569990

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

174 9 2MB

Russian Pages 224 [220] Year 2023

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Знакомьтесь, Python. Секреты профессии
 9785171569990

Table of contents :
Содержание
Concept: Для кого эта книга? И для чего?
Вступление
Как устроена эта книга
Зачем нужна каждая из глав
Как выжать максимум
Другие источники
Контрольные вопросы
В сухом остатке
Agile: Как перестать читать и начать программировать. Как побороть лень. Дофамин
Что может пойти не так
Первый шаг
Делай перерывы
Как съесть слона
Книги, перевернувшие сознание
Заведи рабочий ноутбук
В сухом остатке
IDE: Среда разработки. Hello World. Культура труда
Что такое IDE
Как установить Python
Блокнот или проект
Как создать окружение
Монти Пайтон и Святой Грааль
Стримы программистов
В сухом остатке
Root: Краткая история программирования. Вехи развития. Тренды
Особенности IT индустрии
Структурное программирование
Объектно Ориентированное Программирование
Программирование 2.0
Знаковые книги
Контрольные вопросы
В сухом остатке
Industrial: Сорта питона, и как их готовить. Области применения. Куда копать
Зачем это надо?
Прикладные вычисления
Серверные скрипты
Нейронные сети
Как я перешел на Python
Контрольные вопросы
В сухом остатке
Data WareHouse: Как хранить данные? Источники и потоки данных. Новая нефть
Зачем это надо?
Файловая система
JSON
SQL
Что почитать
Задания и примеры
В сухом остатке
Release: Главные Библиотеки Питона. Учебная практика
Зачем это надо?
Pandas
Django
RabbitMQ
Google и NASA
Контрольные вопросы
В сухом остатке
GIT: Система контроля версий. Где хранить исходники
Октокот Мона Лиза
Ludum Dare
Создаем репозиторий
Ответь на вопросы анкеты
Сохраняем изменения
Объединяем разные ветки
Как устроен Git
Контрольные вопросы
В сухом остатке
FAQ: Главный секрет программирования. Формулировать мысли. Декомпозиция. Сверху вниз
Как достичь мастерства
Декомпозиция
Имена переменных
Комментарии в коде
Quick Sort
Упражнение по декомпозиции
В сухом остатке
Linux: Консоль, Команды, Задачи. (Уголок админа)
Пингвин Такс
VPS на Linux
Работа с файлами
Планировщик задач Cron
Полезные лайфхаки
Линус Торвальдс
Задания и Примеры
В сухом остатке
Debug: Темная сторона. В любой непонятной ситуации
Что-то пошло не так
Пошаговая отладка
Логирование
Слабое звено
Держи удар
Контрольные вопросы
В сухом остатке
Clean Code: Правила чистого кода. Уголок архитектора. SOLID
Понятный, Расширяемый, Чистый
Форматирование — новая Каллиграфия
SOLID — новый ООП
Refactoring — как шатать программу
Что еще можно почитать?
Контрольные вопросы
В сухом остатке
Human Resource: Как пройти собеседование. Как заходить в хату
Как попасть в IT
Понабрали по объявлениям
О чем говорят программисты
Как вписаться в коллектив
Что еще можно почитать?
Подготовка к собеседованию
В сухом остатке
Bonus: Карьера и здоровье. Как вкалывать и не сгореть
Воля к жизни
Концентрация внимания
Планирование и отдых
Друзья и Коллеги
Полезные книги
Контрольные вопросы
В сухом остатке
Achievements: Таблица достижений. Мета-игра в книжке

Citation preview

ЕВГЕНИЙ ПАВЛОВ

ЗНАКОМЬТЕСЬ, PYTHON СЕКРЕТЫ ПРОФЕССИИ

Издательство АСТ Москва 2023

УДК 004.43 ББК 32.973 П 12

П 12

Павлов, Евгений. Знакомьтесь, Python. Секреты профессии / Е. Павлов. — Москва: Издательство АСТ, 2023. — 224 с. — (Программирование для всех) ISBN 978-5-17-156999-0 Очень хочется стать программистом и войти в IT, но не знаете с чего начать? Поздравляю, в ваших руках учебник нового поколения — без кучи непонятных слов и кодов расскажем про инструменты и библиотеки для программирования на Python. И все это заправлено лайфхаками, вдохновляющими историями из мира настоящих хакеров и игрофикацией — потому что обучение не должно быть скучным. «Знакомьтесь, Python» — уверенный первый шаг в мир программирования. Получите базовые знания о сфере IT, а также найдете ответы на вопросы по типу: с чего начать, как выбрать профессию, где прокачать скиллы и как подготовиться к собеседованию так, чтобы работодатель предложил оффер. УДК 004.43 ББК 32.973

ISBN 978-5-17-156999-0

© Е. Павлов, текст, 2023 © ООО Издательство «АСТ», 2023 © А. Дремов, 2023

Посвящается моим Учителям: Иван Владимирович Павлов (мой отец) Виктор Григорьевич Струц (советский инженер) Михаил Алексеевич Могилевский (первоый директор ФизМатШколы) Дмитрий Юрьевич Пучков (ст. о/у Goblin) Отдаю свой Долг перед Вами: Сначала вы учили меня. Теперь я учу других. Такая вот связь поколений. Низкий Вам поклон!

P. S. Спасибо Виктории Живиной (редактору) за моральную поддержку и полезные советы во время написания этой книги.

CONCEPT: ДЛЯ КОГО ЭТА КНИГА? И ДЛЯ ЧЕГО?

Вступление

Э

та книга ответит на самый главный вопрос: как стать программистом Питона? Я расскажу про язык Python, про его библиотеки, и про софт, которым нужно пользоваться. Кроме того, я буду рассказывать про людей в компьютерной сфере. Каково это — быть программистом: чем занимаются, чем живут и что умеют. Более того, в книге-учебнике будут лайфхаки о том, как сохранить мотивацию, распределить силу и расставить приоритеты. Язык Python признан самым популярным и эффективным языком программирования в 2021 году. Он сумел обойти Java и С — очень серьезных соперников, годами не пускавших никого на первое место во всевозможных рейтингах. В чем его преимущество: огромный спрос на программистов в целом, он очень распространен и, наконец, легок в изучении. Это неприятно, но, чтобы стать программистом — надо иметь мозоль на заднице. Высиживать перед компьютером по 12 часов буквально на чистом энтузиазме. Про то,

8

Евгений Павлов. Знакомьтесь, Python

что из-за постоянной смены материалов и нововведений, учиться и обновлять знания придется всю жизнь. Каждый год появляется что-то новое, а старое безвозвратно уходит в историю. Иными словами, программисты постоянно изучают новое. Если тебе не нравится сидеть перед компьютером — ты не сможешь долго продержаться в таком режиме. Данная книга написана еще и для того, чтобы ты смог узнать побольше о самой профессии программиста. Решить для себя, нужно тебе такое ремесло или нет. Я помогу тебе выбрать для себя то, что действительно тебе подойдет; то, где твои таланты смогут по-настоящему раскрыться. Способ познания лишь один — пробовать как можно больше разных вариантов, чтобы найти свой путь. Путь, выбранный сердцем (и немного разумом, естественно). Даже если ты решишь выбрать дорогу, не связанную с IT, ты не уйдешь отсюда с пустыми руками. Есть множество полезных навыков, которым можно научиться у программистов и успешно применять их в других областях. Эта книга о сильных сторонах программирования. Например, как превращать сложные задачи в простые. Если ты сможешь осознать их, то получишь преимущество в любой области, которую выберешь. Познай секреты программистов, пока другие тебя не опередили.

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

Concept: Для кого эта книга? И для чего?

9

к следующей главе, чтобы прочитать книжку по верхам и составить общее впечатление. В том случае, если ты решил вдумчиво изучить одну главу — ты можешь задержаться и проникнуть в тему действительно глубоко. Где-то на последних разделах у каждой главы есть тексты, которые я писал только для профессионалов. Есть раздел, который требует усилий от читателя. То есть не просто почитать теорию, воспарив над схваткой, а с головой погрузиться в практику (получив боевой опыт в программировании). С руками по локоть в коде. P. S. Если по какой-то причине ты все еще не знаешь английского, начни его изучать прямо сегодня! Без английского ты точно не сможешь разобраться в программировании. Еще никому не удавалось стать программистом без знания английского. P.P.S. Без Linux тоже не обойдется. С пингвином надо дружить!

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

10

Евгений Павлов. Знакомьтесь, Python

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

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

Concept: Для кого эта книга? И для чего?

11

Эффективность обучения вырастет в 3 раза, если ты будешь выполнять задания из книги. Более того, ты сможешь получить достижения, которые перечислены в конце книги. Чем больше достижений (ачивок, если говорить нашим языком) ты соберешь — тем больше удовольствия получишь от путешествия с книгой по волшебному миру Питона. Чтение дополнительной литературы — последний бастион. Я не ожидаю, что из читателей вообще кто-то до него доберется. Когда прочитаешь книги из списков — напиши мне. Автор порадуется за тебя и воздаст тебе почести. Адрес группы я указал вышел — добавляйся!;)

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

12

Евгений Павлов. Знакомьтесь, Python

Спецификация Питона и его библиотек — иногда полезно заглянуть в документацию и узнать еще парочку способов использовать язык. Увидеть карту языка в целом. Курсы питона в открытом доступе. Если тебе нужна лекция по самым азам языка — их тысячи! Тебе просто надо найти подходящего автора, который объясняет основы языка именно в твоем стиле. Попробуй почитать разных авторов, каждый рассказывает немного иначе. Это придаст объемность твоим знаниям, посмотришь на предмет под разными углами. StackOverFlow — в конце концов, все вопросы по языку приведут тебя сюда. Python — слишком популярный язык, поэтому на сайте скопилось фантастическое количество ответов на любые вопросы по Питону. Yandex — в любой непонятной ситуации, спрашивай у Яндекса. Нынешнее поколение поисковых роботов умеет понимать даже самые смутные тени мыслей и давать на удивление хорошие ссылки. Если не получилось с первого раза, то пробуй переформулировать и спросить по-другому. Лайфхак: для обзорных вещей помогает поиск по картинкам. Многие штуки можно зацепить, если последовать за удачной картинкой из какой-нибудь презентации. Из полезного также: 1. Бесплатный курс от Яндекса; 2. основы Python от Яндекса; 3. платный курс от Яндекса. Т.е. сначала можно пройти бесплатный курс, если готов продолжать — уже подходить к платному обучению. По окончанию платного, скорее всего, найдешь работу. ChatGPT — новомодная штука. Кажется, что следующие поколения программистов будут активно пользоваться ею, чтобы получать резюме по любому объемному чтиву.

Concept: Для кого эта книга? И для чего?

13

Удобная штуковина для поверхностного знакомства. Обрати внимание на отечественную разработку: GigaChat. Самый удобный интерфейс — это чат-боты в Телеграм. Есть бесплатные, есть за деньги, но обычно хватает бесплатных. Сам робот ничего не придумывает, он просто компилирует выжимку из доступных ему источников, придумывая недостающее. Будь осторожен! Робот местами привирает, да так ловко, что не сразу разберешься. За ним надо все тщательно перепроверять. Прочитал код робота? Напиши свой, который будет еще лучше!

Контрольные вопросы: 1. Чем занимаются программисты? 2. Чему можно научиться у программистов? 3. Хочешь ли ты стать программистом на Питоне? 4. Как лучше всего читать эту книгу? 5. Где спросить, если что-то не понятно? Если ответил на все вопросы, получаешь достижение #Concept.

В сухом остатке: 1. прочитай книгу несколько раз; 2. выполняй задания в конце каждой главы; 3. работай над мотивацией, чтобы достичь своей цели; 4. изучай английский и Linux; 5. пользуйся разными источниками.

AGILE: КАК ПЕРЕСТАТЬ ЧИТАТЬ И НАЧАТЬ ПРОГРАММИРОВАТЬ... КАК ПОБОРОТЬ ЛЕНЬ. ДОФАМИН.

Что может пойти не так

К

акие сложности могут быть при восхождении на самую обычную гору? Или при прочтении учебника? Обычное дело, за которое со временем берется все меньше и меньше людей. Там же вроде все просто, не так ли? Я не говорю, что чтение учебника — это подвиг. Но и легким времяпрепровождением я это не назову. Это работа, требующая усилий. Учись уважать свой (и чужой) труд, нельзя обесценивать свои усилия. Если ты не признаешь, что тратишь силы, то и восстанавливать их не будешь. Откуда тогда брать энергию для свершений? Бери и делай! Примерно у 95% процентов на этом этапе начинаются проблемы. Проблемы, о которых как-то неловко говорить, ведь окружающие поднимут на смех. Ты и сам наверняка посмеивался над этими неудачниками. Бывает очень тяжело признаться, что столкнулся с трудностями. Нежелание делать — еще один способ избежать работы.

16

Евгений Павлов. Знакомьтесь, Python

Делать — скучно. Ты тратишь усилия, а мгновенного результата что-то не видать. Сначала ты просто запоминаешь кучу бесполезных вещей, прежде чем их наберется достаточно для того, чтобы между ними возникли связи и появилась цельная картина — знание и навык. Вопрос в том, как много бесполезных вещей ты способен удержать, прежде чем мозг нажмет кнопку стирания памяти, и переключится на что-то другое. Если постоянно не получается — это вообще удар ниже пояса. Зачем делать то, что не получается? Суть в том, что как только ты начинаешь делать что-то новое — случаются ошибки. Иначе ты бы давно это делал. Есть отличный способ не делать ошибки — просто не делать ничего нового. Никогда не пытайся выйти за границы своих возможностей и все будет в порядке (сарказм). Как люди становятся успешными? Они совершают ошибки, намного больше ошибок, чем обычные люди. Секрет в том, что они не останавливаются. Продолжают пытаться и совершать все новые и новые попытки. Однажды у них это получается. Или нет. Я считаю, что стоит рискнуть! Потому что мотивация на нуле, а у всех людей разный уровень дофамина. И если чемпион сможет вывезти на характере, то обычный человек все это бросит при первом же затруднении. Пойдет смотреть мультики. Над депрессией смеются только те, кто никогда ее не испытывал: когда мир теряет краски; еда на вкус как картон; а внутри пустота, которую ничем не заполнить, ведь все бессмысленно. Это вопрос химии в голове, такое нельзя просто отменить. Нельзя просто встать и пойти, если тебе прострелили колено, но люди вообще-то очень упорные. Есть лекарства, есть программы реабилитации, которые помогают вылезти из этой ментальной западни.

Agile: Как перестать читать и начать программировать...

17

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

Боль и унижение — часть настоящей учебы. Боль — потому что у тебя ничего не получается. Унижение — потому что ты такой тупой. Наверняка окружающие смеются над твоими жалкими попытками! На самом деле нет. Каждый раз, когда ты будешь испытывать неприятные эмоции, знай, что ты не первый, и не последний, кто проходит этот путь. Прошли и оставили позади, это не будет длиться вечно. Любому росту предшествует что-то похожее. Отчаяние и разочарование — признаки начала роста, так устроен наш мозг. Чтобы поменяться, надо осознать невозможность оставаться прежним. Мы рубим ступени. Ни шагу назад! И от напряже нья колени дрожат, И сердце готово к вершине бежать из груди. Весь мир на ладони — ты счастлив и нем И только немного завидуешь тем, Другим, у которых вершина ещё впереди.2

В этой главе расскажу пару лайфхаков, как преодолеть долину боли и унижения; откуда брать мотивацию 1

Полозкова Вера. «Стихи из онлайн», 2013–2017.

2

Владимир Высоцкий. Из фильма «Вертикаль». 1966.

18

Евгений Павлов. Знакомьтесь, Python

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

Первый шаг Самый первый лайфхак: делай Minimal Value Product (MVP). Что даст результат, но при этом не потребует много усилий? Первый результат поможет тебе понять, что ты на верном пути. Когда есть успешный опыт, его легче повторить и развивать дальше. В нашем случае это программа из одной строчки:

print (‘Hello World’) Для начала будет достаточно написать эту строчку в браузере на сайте с он-лайн компилятором Питона (их тысячи!). Я просто поискал в Гугл «Python online» и открыл первый попавшийся. Кстати, там уже была написана эта строчка для примера работающей программы — очень удобно! Если у тебя получилось написать первую программу, получай достижение #HelloWorld.

Agile: Как перестать читать и начать программировать...

19

А теперь две строчки:

name = ‘Cool Hacker’ print (f’{name} is here!’) С непривычки ты ничего не почувствуешь. Научись ловить эти маленькие удовольствия от маленьких побед. А затем еще и еще. Для адекватной работы мозга постоянно нужны небольшие успехи. Так ты понимаешь, что движешься в нужном направлении и становишься увереннее в своих действиях. Запусти рабочую программу. Дописывай к ней все новые и новые усложнения. Если что-то не заработало — ты всегда знаешь после какого шага она перестала работать. Откатись на шаг назад и убедись, что старая версия все еще работает, затем накати изменения и разберись, что в них пошло не так. Аккуратное сохранение успешных вариантов и небольшие изменения до следующей версии — залог успеха. В умных книжках эта методология называется Agile.

Делай перерывы Уперся в проблему? Зафиксируй ее, чтобы описать подробности другому. Сохрани свою работу. Сделай копию и сохрани ее в надежное место. Например, в Git, про него расскажу позднее. Сделай перерыв. Утро вечера мудренее. Попей какао, посмотри в окно, разомнись, походи по дому. Главное — не переключаться на посторонние вещи. Сидеть в интернете или слушать радио — запрещено!

20

Евгений Павлов. Знакомьтесь, Python

Второй лайфхак: в случае затруднения обязательно сделай паузу. Чтобы мысль дошла до лобных долей и начала там вариться — нужно время, зато твоя миндалина (миндалевидное тело — отдел мозга) дает быстрый ответ! И если этот ответ не срабатывает, 95% людей разворачиваются и уходят. Не окажись среди этих неудачников! В нашем мозгу есть две системы для принятия решений: Система 1: быстрая и не требует усилий. Система 2: медленная и тяжелая. Почитай у Канемана, который придумал эту модель. Даниэль реально шарит в этой теме. Даже книжку написал: «Думай медленно… решай быстро». Проблема в том, что занимаясь программированием, ты заставляешь работать Систему 2 в полную силу. Это как мешки с песком таскать — очень, очень тяжело. А с непривычки еще и больно. Большинство программистов — интеллектуальные качки. Они любят и умеют работать головой. Терпят боль, шатают проблему, пока не находят решение. И в этом наш главный секрет! Да, со временем большинство задач становятся знакомыми, Система 1 начинает щелкать их как орешки. Например, шахматисты очень редко думают по-настоящему. Они натренировали свою нейронную сеть решать шахматные задачи, поэтому решение шахматных партий для них не требует усилий. Такая же история с управлением автомобилем: опытный водитель реагирует без раздумий, на рефлексах, моментально принимает решения в самых сложных дорожных ситуациях. Сложность в том, что программирование никогда не будет знакомым. Ты постоянно будешь сталкиваться с но-

Agile: Как перестать читать и начать программировать...

21

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

Как съесть слона Слона едят по кусочкам. Если перед тобой стоит огромная задача, раздели ее на части и составь расписание. Закрывай небольшие задачи день за днем. Хитрость в том, чтобы не останавливаться. Бывают энергичные, наполненные энтузиазмом и решимостью дни, когда работа спорится. Ветер дует в спину. Сложное дается легко, с первого раза получаются даже самые непонятные моменты. Но бывают и неудачные дни, когда нет ресурсов и все валится из рук. Не беда! Сделай план «минимум» и жди попутного ветра. Составляй минимальный план так, чтобы ты смог сделать его даже в самых плохих обстоятельствах. Если ты пропустил один день — не вини себя. Вместо этого сделай все, чтобы завтра обязательно сделать запланированное. Устрани препятствия и помехи, придумай как помочь себе. Вместо бесполезного чувства вины, думай, как вернуться к своей задаче. Тихо-тихо ползи, улитка, По склону Фудзи, Вверх, до самых высот.3

Я учу английский на телефоне с помощью приложения DuoLingvo4. Мой минимальный план — это 3 минуты утром 3 4

Хокку Кобаяси Исса, 1763–1828.

Бесплатная платформа для изучения языка и краудсорсинговых переводов.

22

Евгений Павлов. Знакомьтесь, Python

и 3 минуты вечером. Два урока, скрипя зубами, я стараюсь делать всегда. Скромные успехи? Только благодаря минимальному плану я вообще зашел так далеко. Попытки учить много не дали бы таких результатов из-за выгорания. Резво начал, да быстро выдохся. На дальних дистанциях все решает привычка, а не выносливость или сила. Каким бы умным ты ни был, всегда найдется задача намного сложнее твоих способностей. Здесь все решает рычаг — сила, умноженная на расстояние. Дистанция и время, вместо силы и скорости. Хороший программист скромно оценивает свои способности и умеет экономить свое мыслетопливо. Программирование — это искусство декомпозиции. Мы берем сложную задачу и разбиваем ее на задачи поменьше, до тех пор, пока эти задачи не станут элементарными. Делаем элементарные задачи. А затем собираем решения обратно в единое целое. Вжух! И задача решена. Энтузиазм и задор быстро уйдут. Что тогда будешь делать, чемпион? Дисциплина и методичность рано или поздно победят любую задачу. Иногда проблему приходится шатать — рассматривать ее под разными углами, пробовать решать разными способами. Раз за разом терпеть неудачу. И это нормально. Побеждают не те, у кого все получается, а те, кто не сдается и продолжает двигаться.

Книги, перевернувшие сознание Даниэль Канеман «Думай медленно… решай быстро». Наши действия и поступки определены нашими мыслями. Но всегда ли мы контролируем наше мышле-

Agile: Как перестать читать и начать программировать...

23

ние? Нобелевский лауреат Даниэль Канеман объясняет, почему мы подчас совершаем нерациональные поступки и как мы принимаем неверные решения. У нас имеется две системы мышления. «Медленное» мышление включается, когда мы решаем задачу или выбираем товар в магазине. Обычно нам кажется, что мы уверенно контролируем эти процессы, но не будем забывать, что позади нашего сознания в фоновом режиме постоянно работает «быстрое» мышление — автоматическое, мгновенное и неосознаваемое… Нассим Николас Талеб «Антихрупкость. Как извлечь выгоду из хаоса» Когда хрупкая ваза падает, она разбивается. Когда падает антихрупкий человек — он поднимается и становится сильнее. В мире, где царит неопределенность, нужно быть антихрупким, уметь при столкновении с испытаниями в жизни не просто оставаться невредимым, но становиться лучше, эволюционировать и развиваться. Талеб формулирует простые правила, которые позволяют нам преодолеть хрупкость; действовать так, чтобы непредсказуемая неопределенность, этот грозный и внезапный Черный лебедь (метафора из другой его известной книги), не причинила тебе вреда. Чтобы удары судьбы помогали нам совершенствоваться. Ты по природе своей антихрупкий — никогда не забывай про это чудесное свойство. Дженнифер Грин, Эндрю Стиллмен «Постигая Agile». Объемный труд включает в себя описание всех основных agile-методологий: Scrum, Kanban, Lean и XP (eXtremal Programming). То, что создают люди, часто зависит от того, на чем они сосредоточены. Чем больше люди сосредото-

24

Евгений Павлов. Знакомьтесь, Python

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

Заведи рабочий ноутбук Раздобудь себе рабочий ноутбук. Тебе не нужно его покупать, может ты сумеешь одолжить его у знакомых. Я и сам отдавал сыну товарища свой старый ноут: подержанный, небольшого размера (14’’), слабый процессор, минимум памяти, небольшой диск SSD/HDD, с убитым аккумулятором (главное, чтобы от розетки работал). Важно, чтобы там была клавиатура, интернет и HDMI для подключения большого монитора. Можешь смело с этим экспериментировать. Бери ноут с собой на занятия в университет, в городское кафе, в гости к друзьям и в путешествия на море. Считай это инвестицией в свою профессию программиста. Почувствуй себя крутым хакером. Великолепный план, Уолтер. Просто охеренный, если я правильно понял. Надёжный, как швейцарские часы.5

Если ты раздобыл рабочий ноутбук, то получаешь достижение #LapTop. 5

«Большой Лебовски», 1998. Джоэл Коэн, Итан Коэн.

Agile: Как перестать читать и начать программировать...

25

В сухом остатке: 1. 2. 3. 4. 5.

MVP — Minimal Value Product; Time Management — умение планировать свой отдых; Цель, План, Прогресс, Результат; Print, Format, Output, Loop, If; список книг для чтения на будущее.

IDE: СРЕДА РАЗРАБОТКИ. HELLO WORLD. КУЛЬТУРА ТРУДА

Что такое IDE

I

DE · Интегрированная среда разработки (англ. Integrated Development Environment). Это все программы, которые помогут вам разрабатывать программу. Не только

писать, но и отлаживать, хранить, проверять, выкладывать, администрировать. Одним написанием кода дело не ограничится. Нужно заставить код работать (и зарабатывать)! По сути, IDE — это твое рабочее место. Твои инструменты, с которыми ты должен уметь работать. Вот список программ на рабочем компьютере под Windows, которыми я пользуюсь: 1. FAR — менеджер файлов; 2. Notepad++ — текстовый редактор для просмотра файлов; 3. Chrome — браузер для просмотра web; 4. 7zip — архиватор; 5. Telegram — мессенджер для связи с коллегами; 6. GIT — система хранения кода; 7. SourceTree — клиент для git;

28

Евгений Павлов. Знакомьтесь, Python

8. Python — среда для выполнения языка программирования; 9. Anaconda — пакет приложений для работы с Python в интерактивном блокноте; 10. PyCharm — среда разработки для Python; 11. Beaver — клиент для работы с базами данных; 12. MobaXterm — консоль для удаленного подключения к linux серверам. Если ты никогда не сталкивался с серверами Linux — приготовься! Тебе придется разобраться с Linux и полюбить его, потому что сервера с Python на борту — это Linux в SSH консоли. P. S. Надеюсь ты уже раздобыл ноут. Настало время открывать его для работы.

Как установить Python Здесь все просто: заходи на Python.org и скачивай последнюю версию. Для учебы можно смело брать последнюю. Не запариваясь на стабильность, совместимость с версией на сервере, или поддержкой библиотек, с которыми ты будешь потом работать. Скачивай Windows installer (64-bit), которую рекомендуют на сайте (Recomended). Используй Cystomize installation, чтобы лучше понять, что и куда будет писаться. Install Now поставит куда ей вздумается. Потом замучаешься искать, где твой Питон лежит.

IDE: Среда разработки. Hello World. Культура труда

29

Use Admin Privilegies — нет, потому что замучаешься разносить разные версии с разными правами. Лучше сразу привыкать, что на рабочей машине у тебя нет прав Админа (корпоративная политика). Немного сложнее, зато более управляемое и безопасное. Add Python.exe to Path — тоже нет. Обратно история про разные версии Питона на одной машине. Кроме того, ты уже позаботился, чтобы путь до Питона был коротким. Просто запомни на будущее, что скоро версий Питона на твоем компьютере будет больше одной, поэтому сразу заводи порядок, позволяющий точно знать, где какая версия лежит и с какой версией ты сейчас работаешь. Customize Installation — выбор сильных духом. Поможет тебе настроить все осознанно и по уму. Вместо быстрой и беспорядочной установки Install Now. Лучше день потерять. Optional Features — нет. Когда понадобиться — поставишь отдельно. Install Python for All users — нет. Юзер для Питона тут ровно один — это ты. Customize Install Location. Укажи директорию для Питона народе C:\Python311, если у тебя версия 3.11. Лучше хранить в корневой на диске, чтобы указывать короткие пути к Питону везде, где попросят. Иначе замучаешься правильно писать длинные пути со всеми пробелами и русскими символами. Create shotcuts for installed applications — пусть будет, чтобы самому руками не создавать.

30

Евгений Павлов. Знакомьтесь, Python

Все остальные крыжики — отказать. В моей книге эти излишества без надобности. Если чего-то не хватит, всегда сможешь вернуться и поставить. Сейчас ставим все по минимуму, чтобы понять, что же входит в этот минимальный набор. Кроме того, я не хочу описывать текущую версию Питона, понимая, что у читателя скорее всего будет уже другая версия. Но сам минимальный набор в ней слабо поменяется. Install — Вжух! Теперь питон стоит на твоей машине. Давай сделаем что-нибудь для теста. Запускай PowerShell (нажимаешь Win, пишешь первые буквы названия “Po..”, пока не увидишь значок, на который кликаешь). cd C:\Python311\ Лайфхак: набрав пару букв файла, нажимай Tab и консоль сама дописывает за тебя остальное. Если вариантов несколько, то жмёшь Tab несколько раз, подставляя все новые и новые варианты, пока не найдешь нужный. Просто поиграйся с этой фичей, чтобы понять, как она работает в консоли. Затем набери нужную нам строчку. .\python.exe Вжух! Теперь ты в консоли Питона! Давай немножко попрограммируем: >>> import sys Эта строчка подключает системную библиотеку, чтобы взять из нее версию Питона:

IDE: Среда разработки. Hello World. Культура труда

31

>>> print (sys.version) 3.11.2 (tags/v3.11.2:878ead1, Feb 7 2023, 16:38:35) [MSC v.1934 64 bit (AMD64)] У меня вывелась вот такая строчка. У тебя будет другая, но главное, ты увидишь, что за билд Питона у тебя сейчас запущен. Чтобы покинуть консоль Python: Ctrl-Z и затем Enter Чтобы закрыть консоль PowerShell. exit Если нажмешь крестик на окошке в правом верхнем углу — тоже сойдет. Если у тебя получилось поставить Python — ты получаешь достижение #Python. Есть еще один момент. Однажды тебе придется запускать Python через SSH терминал на Linux сервере. Там будет примерно такой же интерфейс. Операционные системы разные, Питон — един! Это сильная сторона данного языка. Научился запускать под виндой, сможешь и под линухом, по аналогии. Отлично! С установкой Питона мы закончили, пора сделать перерыв. Разомни шею, плечи, грудную клетка, суставы ног. Сходи попей водички. Похвастайся домашним

32

Евгений Павлов. Знакомьтесь, Python

своим хакерским мастерством. Играючи поставил Python, даже программу уже написал. Красавчик! Можно двигаться дальше.

Блокнот или проект Есть два пути: Anaconda c Jupyter Notebook. Очень удобная штука для прикладных вычислений, например, для аналитики. Посчитал, посмотрел число и решил, куда дальше считать. Нейронные сети примерно в ту же сторону растут. Для учебы тоже отличный вариант: нет заморочки с окружениями и библиотеками. Большинство библиотек входят в дистрибутив Anaconda и подключаются в редакторе по ходу работы. Очень удобно! Второй путь — это PyCharm от компании JetBrains родом из культурной столицы Санкт-Петербург. Редактор отлично подходит для работы с проектами на Питоне для всяких сайтов и прочих скриптов для серверов на базе Unix. Выбор для корпоративной работы. Для каждого проекта можно создавать свое окружение с нужным набором библиотек, а потом это окружение портировать на сервер, чтобы проект сразу работал из коробки. Свое окружение избавляет от конфликтов версий библиотек и всего такого, если бы у нескольких проектов было общее окружение. Короче, вся эта магия с окружениями нужна для администрирования серверов. Anaconda — для ученых и инженеров. PyCharm — для программистов. Дальше буду рассказывать про PyCharm.

IDE: Среда разработки. Hello World. Культура труда

33

Дистрибутив PyCharm можно скачать с сайта JetBrains. Нам будет достаточно бесплатной версии Community. Выбираем обычный exe и скачиваем около 400 метров. Запускай установщик, подтверди для Windows, что доверяешь этому приложению. Оставь пустыми все опции при установке, значения остальных настроек оставь по умолчанию. После установки запусти PyCharm Community Edition: [Win] py [Enter] Подтверди согласие с условиями использования PyCharm User Agreement: [Continue] Разреши PyCharm подключаться к Интернету для поиска обновления (Windows Firewall blocked). Выбери Project — New Project Выбери папку FirstPython

для

проекта

(Location):

D:\Projects\

Мы будем использовать новое окружение Environment Using. Выбери тип окружения: VirtualEnv.

Virtual

Выпадающее меню для интерфейса называется Drop Down List, я иногда буду писать DDL для краткости.

34

Евгений Павлов. Знакомьтесь, Python

Нужно выбрать версию Питона, который будем запускать для выполнения проекта. Base Interpreter = С:\Python311\ python.exe Тот самый Питон, который мы установили в предыдущем разделе. Убери галочку Create main.py welcome script. Мы создадим такой скрипт сами, чтобы разобраться как это делать. [Create] Проект создан. Хьюстон, мы в редакторе! Прежде чем двинуться дальше, давай наведем немного красоты, чтобы все выглядело круто. Я использую темный стиль интерфейсов, чтобы было удобнее работать в темноте и вообще не нагружать глаза фарой из монитора. Выбери в верхнем меню программы File/Settings, или воспользуйся быстрыми кнопками (они написаны напротив названия пункта в меню). [Ctrl] + [Alt] + S Бам! Все крутые хакеры используют сочетания клавиш. Немного заморочено вначале, но зато потом можно сэкономить пару секунд во время работы. Если не охота запоминать — используй верхнее меню, так проще. В диалоге настроек — 100500 всяких разных опций, в случае чего ты уже знаешь, где искать. Сейчас меня интересует ровно одна настройка:

IDE: Среда разработки. Hello World. Культура труда

35

Appearance & Behavior > Appearance > Theme = Dracula Я поставил Sync with OS, поскольку тема Windows у меня тоже Ночная. [OK] Порядок! Теперь вернемся к нашему проекту. Слева панель с иерархией файлов, совсем как в windows file explorer (кстати, быстрые клавиши — Win + E). В папке проекта FirstPython уже есть подпапка venv (Virtual Enviroment) c нашим окружением (мы потрогаем его руками на следующем этапе). Создай еще одну папку rep (Repository) куда мы будем складывать наши скрипты, а потом научимся сохранять в спецхранилище, чтобы иметь возможность всегда восстановить или откатиться. Когда есть страховка, гораздо легче пробовать новое. Все кулхакеры — очень рисковые парни. Но не сразу. Сейчас просто создай папку rep. Теперь создай скрипт Питона: 1. Правой кнопкой мыши кликай по папке rep; 2. в контекстном меню выбирай New > Python File; 3. имя файла lesson1, Тип файла Python file; 4. [Enter] Пара секунд и появится файл lesson.py Справа появится закладка с именем lesson.py и окошком редактора. Пишем одну строчку из второй главы: print (‘Hello World’)

36

Евгений Павлов. Знакомьтесь, Python

В верхнем правом углу ищи зеленый треугольник, как в интерфейсе аудио-плеера. Это запуск выполнения скрипта. Проверь, что правее в DDL написано lesson1. Тоже самое можно запустить при помощи комбинации клавиш: Shift+F10. Снизу всплывет консоль, в которой будет написано “Hello world”. Ано работаит!!! Отлично! С установкой редактора закончили. Если сумел проделать тоже самое на своем ноутбуке — получаешь достижение #PyCharm. Самое время сделать перерыв, чтобы новые знания спокойно усвоились и переварились. Заблокируй комп ([Win] + L). Встань и пройдись, расправь плечи, посмотри вдаль. Это взгляд завоевателя, впереди еще много битв, но начало уже положено. Орел! Поставь чайник, разрежь ножом розовый грейпфрут и съешь пару долек, чтобы взбодриться. Насладись этим моментом хорошо сделанной работы.

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

IDE: Среда разработки. Hello World. Культура труда

37

Давай посмотрим на Virtual Enviroment поближе. Ты удивишься, как часто на работе мне приходится чинить его на боевых серверах. Если не разобраться — это может быть больно в боевой обстановке. Когда сервера лежат, времени в обрез, а вокруг бегают коллеги, у которых пригорает. Атакующие корабли, пылающие над Орионом; лучи Си, пронизывающие мрак близ ворот Тангейзера… Все эти мгновения затеряются во времени, как слёзы в дожде. Время… программировать!

Это была цитата (подправленная) из Blade Runner6 — культового фильма с стиле киберпанк про репликантов. Но мы отвлеклись. Запускай консоль PowerShell: [Win] power [Enter] Переходи в папку нашего проекта (не забывай про крутой tab для скоростного дописывания на автомате). cd C:\Projects\FirstPython Внутри у нас есть две папки: 1. rep — репозиторий с кодом для нашего проекта; 2. venv — локальное окружение для нашего проекта. Запускаем виртуальное окружение для нашей программы (в пределах процесса-консоли!) .\venv\Scripts\activate 6

«Бегущий по лезвию», 1982. Ридли Скотт.

38

Евгений Павлов. Знакомьтесь, Python

Теперь ты в матрице, Нео: (venv) PS C:\Projects\FirstPython> Давай разберемся с пакетами. Программа для работы с пакетами называется pip (Python Package Index). Настоящая олдскульная утилита. Только ты, консоль, пакеты и виртуальное окружение твоего проекта. У меня аж мурашки по коже, до того это все по-хакерски круто. Что? Тебя не прикалывают все эти хакерские фишки? Я не говорил, что будет легко, Нео. Я лишь обещал, что это будет правда.7

Если запустишь pip — вывалится список параметров, которые можно запускать. Для начала установим (install) — самый популярный пакет NumPy: (venv) PS C:\Projects\FirstPython> pip install NumPy PiP скачивает пакеты (по дефолту — последняя версия) из интернета и копирует их в папку виртуального окружения. Дальше посмотрим список (freeze) установленных пакетов. Кстати ты уже разобрался, как это работает. (venv) PS C:\Projects\FirstPython> pip freeze 7

«Матрица», 1999. Братья Вачовски.

IDE: Среда разработки. Hello World. Культура труда

39

Покажет список установленных пакетов в нашем окружении (наверное, у тебя будет другая версия, более продвинутая) numpy==1.24.2 Теперь кое-что крутое: создадим файл requirements. txt с этими пакетами, чтобы потом устанавливать их все скопом на любой другой машине/окружении. При помощи символа “>” мы направим поток вывода из pip в файл, вместо экрана, как было раньше. Такая вот загогулина! (venv) PS C:\Projects\FirstPython> pip freeze > requirements.txt В репозиторий часто кладут только этот файл, чтобы из него разворачивать окружение на linux сервере, например. Посмотри, что в директории C:\Projects\FirstPython появился файл requirements.txt в котором сейчас ровно одна строчка: numpy==1.24.2 Для эксперимента снесем установленный пакет, чтобы затем поставить его из файла. (venv) PS D:\Projects\FirstPython> pip uninstall NumPy Proceed (Y/n)? y Нажми в консоли пару раз кнопку UP — пролистай в истории запускаемых команд и найди freeze. Запусти и посмотри, что теперь список пакетов, установленных в нашем окружении, пустой.

40

Евгений Павлов. Знакомьтесь, Python

Еще хитрость: если выделить в консоли текст, а затем нажать Ctrl+C, текст попадет в буфер обмена. Правой кнопкой мышки по экрану консоли, и буфер обмена будет напечатан в строке ввода. Попробуй пару раз и запомни этот фокус на будущее — пригодится. Чтобы поставить пакеты из файла, запускаем: (venv) PS C:\Projects\FirstPython> pip install -r requirements.txt Вжух! У нас есть файл требований к пакетам и все пакеты из списка установлены в виртуальном окружении. Чистая работа! Закрывай консоль (вместе с ней и наше виртуальное окружение). Если тебе удалось настроить виртуальное окружение, то ты получаешь достижение #VirtualEnvironment. Было непросто и совсем непонятно, но ты справился. Молодец! Встань и пройдись, расправь затекшую спину, плечи, шею. Гиподинамия — главная опасность для людей, сидящих за компьютером, поэтому никогда не пренебрегай возможностью размяться. Полезная привычка для каждого профи. Сделай перерыв, глотни водички, протри водой лицо, перекинься парой слов людьми вокруг. Это немного убавит стрессовое состояние, от той душнины, через которую ты сейчас прорвался. Мировое господство стало еще на один шаг ближе!

IDE: Среда разработки. Hello World. Культура труда

41

Монти Пайтон и Святой Грааль Основной автор Python — программист Гвидо ван Россум из Нидерландов. По традиции, их неофициально называют Голландией, хотя Голландия — это две провинции современного Королевства Нидерландов, Северная и Южная. Язык Python программист начал создавать в конце 1989 года, в Амстердаме и оставался у руля разработки до 2018-го года, затем вышел на пенсию. Кстати, не Питон, а Пайтон. Автор назвал язык в честь культовой комик-группы Monty Python из 70-х, невероятно популярной в Британии. Обязательно посмотри фильм “Монти Пайтон и Священный Грааль” — очень смешной! — Ты убил отца невесты! — Я не хотел! — Не хотел?! Ты ему голову мечом рассёк! — Боже, как он?8

Про Питон уже потом анекдотов насочиняли, да и кто вообще знает про этих нерусских комиков? Большинство программистов называет этот язык Питоном. И я его буду называть Питоном, чтобы не вызывать путаницу у читателя и не душнить понапрасну. Интерпретатор Python написан на языке Си. На этом же языке написана операционная система Linux, которая часто упоминается в этой книге. Python — не самый быстрый в выполнении, но зато самый быстрый для написания и модификации. Сейчас скорость разработки важнее 8 «Монти Пайтон и Священный Грааль», 1975. Терри Гиллиам, Терри Джонс.

42

Евгений Павлов. Знакомьтесь, Python

скорости выполнения, потому что компьютерное время в сотни раз дешевле, чем время программистов. В 2008 году был создан Python 3. В нем почистили кодовую базу и удалили избыточность. С каждой версией Python 3 работает немного быстрее. С 2020 поддержка Python 2 прекращена. На производстве тебе будут попадаться древние (Legacy) проекты на Python 2, но с каждым годом их становится все меньше и меньше.

Стримы программистов Можно посмотреть, что пишут другие программисты. Просто поищи свежий ролик с похожим названием, завари чай и усаживайся наблюдать за работой программиста. Увидишь, с чего начинают работу над задачей опытные программисты. Обычно это какие-то размышления вслух и наброски требований по работе программы в виде списка. Увидишь, как опытный программист пишет код. Он часто ошибается, пишет, потом стирает и заново пишет. Многократно возвращается к уже написанному коду и исправляет его. Если втянуться, то становится интересно наблюдать за движением мыслей кодера. Познакомишься с новыми подходами, которых не было в учебнике! Как еще можно узнать про горячие клавиши или отладку классов в IDE? Очень много хитростей и лайфхаков я подсмотрел именно в таких стримах.

IDE: Среда разработки. Hello World. Культура труда

43

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

посмотрел

час

стрима

с

программированием

на Python — получай достижение #StreamCoding.

В сухом остатке: 1. 2. 3. 4. 5.

Integrated Development Environment; Python.org; Anaconda & Jupyter Notebook; PyCharm Community Edition; С 2020 поддерживается только Python 3.

ROOT: КРАТКАЯ ИСТОРИЯ ПРОГРАММИРОВАНИЯ... ВЕХИ РАЗВИТИЯ. ТРЕНДЫ

Особенности IT индустрии

E

xponencial Growth для финансов — это одна из немногих индустрий, которая все еще растет экспоненциально. Вот почему вокруг IT так много хайпа. Эта

индустрия все еще в начальной стадии бурного роста, в отличие от нефтяной индустрии, например, где бурный рост уже давно закончился. Вместо этого идет укрупнение производства, чтобы уменьшить издержки производства. Agile. Разработка информационного продукта стоит дорого, а производство копий — почти нулевое. Это фундаментальное свойство IT индустрии, позволило совсем иначе строить производственные циклы. Мы можем очень быстро выпустить продукт, а затем очень часто обновлять его, заменяя старые версии продукта новыми. Такой подход «на максималках» — это и есть принципы Agile. Готовность к изменениям важнее следования первоначальному плану.

46

Евгений Павлов. Знакомьтесь, Python

Global Market — глобальный рынок с отсутствием расстояний и границ. Сейчас, когда IT корпорации стали сравнимы с государством, их деятельность стараются отрегулировать. До этого они были недостаточно значимыми, чтобы государственные машины обращали на них внимание. Рынок размером с человечество позволяет окупать самые разные проекты, без оглядки на их экономическую эффективность. Во-первых, доставка цифровых продуктов, затем доступность способов оплат и, наконец, дистрибуция локальных производств. Интернет — это место, где цифровой коммунизм уже наступил. Open Source. Открытые продукты становятся всеобщими стандартами, вытесняя по популярности закрытые аналоги. Невольно, всем игрокам приходится открывать свои технологии, чтобы получить мировую поддержку. Это заставляет искать разработчиков все новые и новые модели монетизации их работы, раз уж за сам продукт деньги взять никак не получается.

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

Root: Краткая история программирования...

47

БДСМ пати с утра и до утра Мой папа чётко знает, что такое буфера 2^16 способов отстрелить себе конечности Отладка даёт представление о вечности Кто не умер сразу — тот уже неубиваем 20 лет стаж — мой папа стал джедаем9

Есть классическая строчка кода, которая является концентрированным синтаксисом этого языка: while (*a++ = *b++); Это побайтовое копирование строки. Чтобы объяснить работу этой строчки, как раз потребуется знание языка Си. Указатели, инкремент, присваивание, итераторы, цикл, массивы, строки, параметры и аргументы функций, стековые объекты, работа с памятью — все это свернуто буквально в несколько символов одной строки из самого первого учебника по программированию. Кажется, что язык Си делался специально под эту строчку. Кстати, аргумент и параметр функции — разные вещи. Аргумент — то, что мы передаем на вход нашей функции снаружи (конкретное значение); а параметр — это то, что мы принимаем внутри нашей функции (переменная в определении). Очень легко перепутать. Этот наивный вопрос способен поставить в тупик большинство программистов. Можешь при случае сбить спесь с зазнавшегося товарища.;) Запрещаю тебе, молодому программисту, писать в подобном BrainFuck стиле. Воспринимай это шарадой для разминки ума, а не как промышленный код. Многие плохие практики программирования растут как раз из таких 9

Научно-технический рэп — «Папа может в Си», 2020.

48

Евгений Павлов. Знакомьтесь, Python

лаконичных головоломок: компактный работающий код, который невозможно прочесть и понять с первого раза. Но что самое ужасное — невозможно отладить его работу. Не переходи на темную сторону спагетти-кода. В пастафарианстве поклоняются спагетти-монстру. Совпадение? Не думаю! В те легендарные времена программированием занимались настоящие ученые: 1. Дейкстра, Эдсгер Вибе — разработчик структурного программирования; 2. Дональд Кнут — автор легендарного «Искусства программирования; 3. Брайан Керниган — создатель C (не перепутай с Сарой Луизой Керриган из StarCraft); 4. Страуструп, Бьёрн — создатель С++; 5. Линус Торвальдс — создатель Unix; 6. Гвидо ван Россум — создатель Python. Однажды ты вернешься к истокам, чтобы понять, как работали предки современных программ. Когда мир программирования еще был настолько простым, что программа легко помещалась на листе бумаги. Иногда, разглядывая древние решения, можно постичь логику работы современных программ, понять истоки, чтобы увидеть их развитие в настоящем. Hаша pабота во тьме — мы делаем, что yмеем, Мы отдаём, что имеем, наша pабота во тьме. Сомнения стали стpастью, а стpасть стала сyдьбой. Всё остальное — искyсство в безyмии быть собой.10 10

Гимн хакеров, Сергей Лукьяненко «Лабиринт отражений». АСТ, 2017.

Root: Краткая история программирования...

49

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

Объектно Ориентированное Программирование Золотая эра программирования — время, когда вычислительные мощности удваиваются каждые два года. Легендарный закон Мура. Гордон Мур — основатель Intel. Чего бы ты не создавал, достаточно подождать пару лет и производительность железа превысит вычислительные требования твоей задачи. Кстати, основные отличия C++ от С — это вовсе не ООП, как ответят тебе 95% программистов. Вот остальные ключевые отличия, из-за которых в названии появилось аж два плюса: 1. пространство имен (namespace); 2. виртуальные функции (virtual function); 3. перегрузка операторов (overloading); 4. исключения (exception handling); 5. шаблоны (pattern).

50

Евгений Павлов. Знакомьтесь, Python

Ну и по мелочи: reference variables, bool, операторы new и delete. На взгляд автора, самый кайф — это перегрузка операторов, позволяющая создавать над необычными объектами новую математику (Саша+Маша=Любовь). Вот это действительно важные вещи, которые появились в программировании со времен структурного программирования. Вещи, которые изменили ремесло программирования, они по-настоящему важны для новых программистов. Область видимости (инкапсуляция) — это очень важный момент. Одна функция — один контракт. Ограниченный доступ к другим частям системы позволяет избежать паразитических влияний как случайных, так и зловредных. Если древние программисты свободно могли получить доступ к любому участку памяти, то современные программы живут в контейнерах. Это помогает обеспечивать должную безопасность, чтобы посторонние процессы не могли вмешиваться в работу твоей программы. Наследование (полиморфизм) — это новый уровень повторного использования кода. Еще один фокус, позволяющий разделять систему на уровни абстракций. Огромные системы содержат тысячи реализаций, написанных разными разработчиками (в прошлом или будущем), но на более высоком уровне абстракции алгоритм умеет использовать еще не существующий функционал, будто он уже реализован. И таких этажей абстракции в сложных системах может быть много, тебе лишь надо позаботиться о работе на своем уровне, а остальное случится уже без твоего участия. Дух захватывает! 1. First party software — твоя программа, или библиотека;

Root: Краткая история программирования...

51

2. Second party software — программа клиента, который использует твой функционал; 3. Third party software — программа любого другого разработчика, функционал которого ты используешь, ну или твоя программа. Важный момент! Если твой функционал будет отдан для использования другими разработчиками, с ним может произойти все, что угодно! Твой код не имеет права сломаться! Требования к кодам — очень строгие. Многопоточность. Был один важный момент в развитии железа: кроме CPU появились еще и GPU. И если сейчас в компьютере около 8 центральных процессоров (Сentral Processing Unit), то в графическом ускорителе несколько тысяч графических процессоров (Graphics Processing Unit) — это делает твой компьютер персональным суперкомпьютером с фантастической мощностью вычислений. Но есть нюанс: CPU хорошо работают с ветвлениями в алгоритмах и переключением между задачами, в то время как GPU хорошо работают только с линейными вычислениями без ветвлений и чувствительны к объему данных для ввода и вывода для вычислений в этом самом процессоре. Прежде чем программисты научились загружать все доступные процессоры по полной, часто процессоры простаивали в ожидании того, когда система отдаст им все необходимые для работы ресурсы. Получалось, что в компьютере два центральных процессора, но работает только один. Словно китайцы, сидящие за круглым столом. Каждый держит одну палочку и ждет, когда ему дадут вторую, которую держит его сосед. DeadLock! Математики серьезно

52

Евгений Павлов. Знакомьтесь, Python

потрудились, чтобы разрулить подобные конфликты, возникающие между разными процессами. Еще есть асинхронность — многопоточность «на минималках». Это когда две разные задачи выполняются в одном потоке, разделяя время выполнения. Сначала поработал один, затем второй, а затем снова первый. Более легкий вариант, где у тебя нет головной боли по поводу одновременного доступа к ресурсам системы. Замечу, что 95% задач — асинхронные, и только 5% — многопоточные. Автоматическое тестирование. Современные системы слишком сложны, чтобы человек смог быстро проверить их работу, поэтому появилось автоматическое тестирование. Один из подвидов которого — модульное тестирование (Unit Testing). Когда часть программы (бизнес-логика) изолируется от внешних сервисов, на вход подаются тестовые данные и анализируется ответ на выходе. В идеальном мире система полностью покрывается unit-тестами. Каждое изменение прогоняется через все известные тесты и страхует разработчика от рисков нарушить целостность системы. Набор тестов может быть сильно больше по объему кода самой системы. Эти тесты сами являются ценностью для разработки комплекса. Автоматическое тестирование — это важная часть современной культуры программирования, без нее мы не смогли бы создавать настолько большие и при этом стабильные программные комплексы. Одновременно это накладывает серьезные требования на архитектуру программы. — А когда будет восстание машин? — Зачем восстание? Зачем машин? Будет тихий приход

Root: Краткая история программирования...

53

к власти программно-аппаратных комплексов в строгом соответствии с нормами федерального законодательства.11

SOLID — современная парадигма, заменившая объектно-ориентированный подход. Наверное, одна из первых необходимостей — это как раз модульное тестирование. Обрати внимание, что современные программисты почти никогда не используют OOP, а вот SOLID используют постоянно. Про него я подробно расскажу позднее. Статические анализаторы кода (Static Code Analysis). Современные компиляторы настолько умны, что могут анализировать сам код без его исполнения. Статически. Подобный анализ позволяет выявлять плохие практики и архитектурные ошибки. Запах — некие признаки, указывающие на присутствие потенциальных ошибок или слабой архитектуры, набор эвристик программирования. Автоматическая интуиция. Это еще один важный шаг на пути к созданию гигантских систем. Еще один помощник, помогающий удерживать наш чистый код от вырождения в спагетти код (т. е. говнокод!). Удивительно, но современный программист пишет очень мало кода. В наше время чертовски много библиотек, которые смогут реализовать половину твоих задач. Сейчас, например, большую часть времени я трачу на рефакторинг и тестирование старого кода. Вся эта высокая магия начинает приносить пользу только для больших систем, начиная от сотен тысяч строк кода и десятков процессоров/компьютеров. Для маленьких прикладных задач одного программиста, архитектурные навороты — это просто бесполезный хлам. 11

Анекдот.

54

Евгений Павлов. Знакомьтесь, Python

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

Программирование 2.0 Вот появились нейронные сети — одно из направлений машинного обучения. Одна из веток искусственного интеллекта, а веток развития было очень много. Самая успешная на сегодня — искусственные нейронные сети. Среди нейронных, самые популярные — это GPT: генеративные (generative — создающий контент) предварительно обученные (pre-trained) трансформеры (transformer — тип архитектуры нейронной сети, позволяет использовать для обучения неразмеченные данные). Время от времени случаются прорывы — вспыхивает энтузиазм, выделяется финансирование на дальнейшую разработку, затем снова все затихает и наступает зима. Прямо сейчас происходит прорыв. Давай попробуем разобраться, что нам сегодня известно про эту тему. Еще один шаг к тому, чтобы машина сама разбиралась в задаче и решала ее. Размечаем данные, вопрос и ответ, а затем прогреваем нейронку этими данными. Нужные зависимости между параметрами — усиливаются. Ненужное — ослабляется. Потребуется очень много данных, чтобы обучить робота, а стоит это все как чугунный мост. Зато уже обученная (застывшая) нейронка требует на удивление мало ресурсов, чтобы выдать результат. Для

Root: Краткая история программирования...

55

пользователей это просто функция из библиотеки, с понятными параметрами на входе и результатом на выходе. Вот только не очень понятно, как именно получается результат. Внутрь смотреть пока не научились, здесь нет возможности отладки. Одна из возможностей — создавать нейронку которая сможет объяснять и аргументировать свои решения. 95% задач проще запрограммировать и получить работающую программу, способную решить задачу пользователя. Стоить это будет в тысячу раз дешевле. Результат предсказуем и точен. Ну почти. 5% остальных задач недостаточно формализованы или не чувствительны к вариативности ответов. Два плюс два равно примерно четырем или пяти. Баланс между сложностью и скоростью обучения. Чем сложнее нейронка, тем больше в ней узлов и связей между ними. Тем больше данных нужно пролить на нее, чтобы обучить эти связи. Первая задача, которая стоит перед разработчиками — подобрать нужное количество узлов и их архитектуру, чтобы обученная нейронка смогла осилить наш класс задач с одной стороны, и обучить на минимальном количестве данных, с другой стороны. Сложный выбор! Проблема переобучения (overfitting). Кроме того, если данных будет слишком много, есть риск, что нейронка будет хорошо предсказывать результаты только на этих данных и станет совсем не способна предсказать ответ на новых данных. У людей это называется «забронзоветь» — отлично

56

Евгений Павлов. Знакомьтесь, Python

решает привычные задачи и совершенно теряется в незнакомой ситуации. Проблема объяснения результата. Классический пример — это когда робот учится отличать шум атомных и дизельных подлодок по шуму океана. Атомные записывались в океане, а шум дизельных записывали в море. Дизельная подлодка в океане распознавалась как атомная и наоборот. Мы точно не знаем, на основании чего конкретная сеть принимает решение. Есть риск, что эти признаки не относятся к задаче, а являются особенностями обучающего набора данных. Проблема самообучения. Для обучения нужно разметить данные (Data Set). Много данных, содержащих задачу и ответ. Это титаническая работа. Еще одно направление исследований — автоматизация разметки (одна нейронка дает ответ, другая решает правильный он или нет) или вовсе отсутствие разметки (трансформеры). Это если совсем по верхам в новой области, где вопросов больше, чем ответов, а гипотезы и терминология все еще находятся в стадии обсуждения.

Знаковые книги Брайан Керниган и Деннис Ритчи «Язык программирования Си» Эта книга написана создателями языка. Книга написана не для новичков, несмотря на простые примеры в начале

Root: Краткая история программирования...

57

книги. Систематизирует основные знания, однако, без подготовки разобраться будет сложно. Дал У., Дейкстра Э., Хоор К. «Структурное программирование». Опыт программирования показан на примерах решения ряда миниатюрных задач. Последовательно рассматриваются данные различной степени сложности. В программировании постоянно приходится иметь дело со все более сложными структурами данных. Систематическое изложение иерархических принципов в программировании. Для программистов всех специализаций. Эдсгер Вибе Дейкстра «Дисциплина программирования» Книга посвящена фундаментальным вопросам конструирования корректных и изящных программ. Показана методика формального вывода программы из математической постановки задачи. Показано развитие от алгоритма до программы, содержит множество остроумных и поучительных задач по программированию. Рекомендую для широкого круга программистов. Гради Буч «Объектно-ориентированный анализ и проектирование с примерами приложений» Книга содержит объектные методы решения сложных проблем, связанные с разработкой сложных программ. На примерах показаны основные концепции объектноориентированного подхода. Книга содержит практические советы по вопросам анализа, проектирования, реализации и управления программными проектами. Полезна, прежде всего, системным аналитикам и архитекторам.

58

Евгений Павлов. Знакомьтесь, Python

Джефф Сазерленд «Scrum. Революционный метод управления проектами» Книга про идеологию Scrum, а не метод работы. Многие слепо внедряют Scrum, но часто не понимают сути идеологии метода. Автор описывает, как он пришел к этому методу. Что нужно понимать и что ожидать при повторении простых инструкций к действию: 1. Scrum предполагает непрерывное совершенствование процессов разработки; 2. работа короткими спринтами с планированием в начале, с демо и ретро в конце; 3. использованием доски с разделами: бэклог, взято в работу, сделано; 4. правильное составление бэклога; 5. основные роли на проекте: владелец продукта, команда, скрам мастер; 6. прозрачность процессов для всей команды. Многие команды работают по Scrum, но делают это бездумно, не понимая, что именно они хотят получить от Scrum.

Контрольные вопросы: 1. 2. 3. 4. 5. 6. 7. 8. 9.

Назови трех известных программистов. Кто создал язык Python? Чем отличается аргумент от параметра функции? Что такое Third party software? Почему SOLID используется чаще чем OOP? Чем асинхронность отличается от многопоточности? Чем чистый код отличается от спагетти кода? Как расшифровывается GPT? Что такое переобучение?

Root: Краткая история программирования...

59

Если ты ответил на все вопросы — получаешь достижение #BriefHistory.

В сухом остатке: 1. функциональное программирование — до 100 строчек. 2. объектно-ориентированное — выше 1000 строк; 3. SOLID актуальнее чем OOP; 4. нейронная сеть не может объяснить выбор ответа.

INDUSTRIAL: СОРТА ПИТОНА, И КАК ИХ ГОТОВИТЬ... ОБЛАСТИ ПРИМЕНЕНИЯ. КУДА КОПАТЬ

Зачем это надо?

К

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

на любой вопрос. Ты никогда не останешься один на один

со своей проблемой. Программист Питона — это сферический конь в вакууме. Умеет писать на Питоне, но не разбирается ни в какой предметной области. Короче, бесполезен. Собирают биолога, математика и физика и просят их придумать что-нибудь, чтобы всегда выигрывать на бегах. Через месяц они снова собираются и рассказывают «о проделанной работе». Биолог: «За месяц я вывел породу лошадей, которые отличаются необыкновенной скоростью и почти всегда выи-

62

Евгений Павлов. Знакомьтесь, Python

грывают. Для того, чтобы довести ее до ума мне нужно еще пару месяцев». Математик: «Я почти разработал теорию, которая описывает вероятность выигрыша в каждом конкретном забеге, теперь мне еще нужно примерно полгода, $1000 и помощник для того чтобы проверить ее на практике, а также снизить статистические погрешности». Физик: «Для того, чтобы продолжить работу мне нужен $1000000, хорошо укомплектованная лаборатория, штат сотрудников и еще где-то лет десять. Но зато у меня уже готова теория победы жидкого сферического коня в вакууме».12

Расскажу о направлениях, где любят и ценят Питон, узнаешь обо всех понемногу. Это все для того, чтобы выбрать своё направление, спланировать карьеру и, наконец, прийти к работодателю не с пустыми руками (даже готовый встать в строй и начать помогать в решении бизнесовых задач). Внезапно! Деньги платят не за программирование, а за умение решать задачи бизнеса. 60% — общение с коллегами, 40% — общение с компьютером. Прапорщик, запишите эти простые, но, в то же время, великие слова.13

12

Анекдот.

13

«ДМБ», 2000. Режиссер Роман Качанов.

Industrial: Сорта питона, и как их готовить...

63

Прикладные вычисления Обычные люди используют калькулятор, чтобы свести расходы и доходы. Бухгалтеры используют электронные таблицы, чтобы посчитать сумму в отчетах. Профессионалы используют Jupiter Notebook, чтобы забирать любые данные и сразу выдавать по ним результаты. С пылу, с жару! Стволы — для лохов, ножи — выбор мастеров!14

Чтобы посчитать статистику, менеджер поставит задачу (task) в Jira15 для программиста. Он будет ждать своей очереди на выполнение около недели, профи же сможет найти данные и обработать их самостоятельно на порядок быстрее. Аналитик с навыками программирования может написать скрипт для выгрузки данных в электронную таблицу (Pandas16), нарисовать график (Grafana17 & Plotly18) и написать текст отчета с выводами для руководства.

14

«Карты, деньги, два ствола», 1998. Режиссер Гай Ричи.

15

Коммерческая система отслеживания ошибок.

16

Программная библиотека на языке Python для обработки и анализа данных. 17

Свободная программная система визуализации данных, ориентированная на данные системы ИТ-мониторинга. 18 Библиотека с открытым исходным кодом для Python и R, которая отлично подходит для создания красивых и интерактивных визуализаций.

64

Евгений Павлов. Знакомьтесь, Python

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

Серверные скрипты Для продвинутых случаев в системах ERP (Enterprise Resource Planning) есть выделенные сервера, на которых крутится Питон. Скрипты, которые запускаются через Cron (Command Run ON). В продвинутых случаях RabbitMQ — мессенджер для роботов. Web-сайты на Django — для людей. И, наконец, API — сайты для роботов. Для внешних сервисов тоже Django. ERP требует множество серверных решений, чтобы автоматически считать ресурсы организации и на лету собирать данные. Здесь море работы для специалиста по данным Data Science. Хозяйство организации может насчитывать десятки серверов, каждый из которых отвечает за свой сервис и находится под online нагрузкой. Сервера общаются между собою по API (Application Pro-

Industrial: Сорта питона, и как их готовить...

65

gramming Interface), чаще всего это такие же web запросы с параметрами, как на обычных сайтах. Возвращают они не текстовый документ в формате html (HyperText Markup Language), а в формате json (JavaScript Object Notation) который удобнее превращать (Serialization) обратно в данные для программы. Чтобы серверам было удобнее, запросы делают в режиме «выстрелил-забыл». Когда весь контекст запроса хранится в самом запросе и больше нигде. REST API (Representational State Transfer Application Programming Interface) — набор дополнительных ограничений, позволяющих масштабировать обрабатывающий такие запросы сервис. Не сотни обращений в секунду, а миллионы. Не один выделенный (Dedicated) сервер, а сотни одинаковых узлов (Node), объединенные в кластер. Здесь будет много работы и для Data Engineer — специалиста, который будет следить за сохранностью данных, переполнением, безопасностью, резервными копиями (Backup) и вот этим вот всем. Мало собрать данные и работать с ними, нужно еще и обеспечить их хранение. Об этом я расскажу в следующей главе. Кроме этого, у нас есть руководство и проверяющие организации, которые требуют все новые и новые отчеты. Все это надо автоматизировать, и быстро! Еще вчера мы не знали, что нам потребуется этот отчет, поэтому завтра он должен быть готов. Когда я говорил про общение с людьми — это была не шутка. Хороший специалист, как доктор Хаус, или сыщик Шерлок — умеет обходить заказчиков, доставать информацию без документации, напрямую из коллег. Принимает стратегические решения и каким образом будет

66

Евгений Павлов. Знакомьтесь, Python

решена задача для бизнеса. Очень полезно понимать, как делаются дела в организации на пару этажей выше, у твоих заказчиков. Это чтобы быть максимально эффективным, полезным и уметь разговаривать на языке бизнеса. Заодно научишься аргументировать и получать ресурсы для своих задач (доступ, люди, время и деньги). Если ты все сделаешь правильно, то никогда не узнаешь, что такое микроменеджмент. Твой рабочий график всегда будет свободным. Главное, чтобы все работало, ведь так?

Нейронные сети Профи предпочитают говорить ML (Machine Learning) — машинное обучение. Основные стадии: 1. исследование бизнес-процессов; 2. разработка/модификация нейронных сетей; 3. подготовка данных и их разметка; 4. обучение/дообучение нашей нейронной сети; 5. внедрение в производство. По необходимости, повторить этот цикл несколько раз, пока не получим разумный компромисс между возможностями ML и бизнес-процессом. Здесь нужны хорошие Product Manager — специалист ML, который будет плотно общаться с CEO (Chief Executive

Industrial: Сорта питона, и как их готовить...

67

Officer, т. е. гендир) и CTO (Chief Technology Officer, т. е. техдир) заказчика, или с кем-то ниже, если организация заказчика очень крупная. Нужно объяснять им ограничения/ требования в применении ML и транслировать потребности бизнеса в команду разработки. Команда ML чаще всего состоит из десяти специалистов: математики (Data Scientist), инженеры (DevOps) и немножко программисты (Developer). Отдельно есть команда разметки — это специалисты из предметной области (например, врачи) которые размечают данные в процессе их подготовки для обучения робота. Крупные компании обычно не могут позволить себе использовать чисто коробочные решения, поэтому их требуется создавать самим. Чтобы попасть в ML, только лишь курсов недостаточно. Работодатель ищет прежде всего заинтересованных студентов, способных самостоятельно поставить себе задачу и найти решение. Для тебя точкой входа будет наличие домашнего ML проекта, эдакой диссертации на тему ML. Прежде всего, будет оценивается количество проблем, которые ты сумел преодолеть. Подойдет любая задача: умный дом, коты, вебсайты, уличное движение, спутниковые снимки. Повторюсь, здесь главное — это заинтересованность и умение находить решение для новых задач. Уровень программирования может быть не самым высоким. Многие ограничиваются работой с Jupiter Notebook. Для совместной работы над jupiter notebook есть бесплатная облачная среда Google Colaboratory. Правда, есть одно ограничение — через 12 часов данные удаляются.

68

Евгений Павлов. Знакомьтесь, Python

Как я перешел на Python Это был не самый прямой путь. По пути я изучил много разных вещей, которые сейчас никак не использую. С другой стороны, если не посмотришь по сторонам — не сможешь сделать осознанный выбор. С самого начала заинтересовавшись нейронными сетями, я прошел курс машинного обучения, заодно узнал, что библиотеки машинного обучения (TensorFlow и Keras) доступны именно на Питоне. Я начал изучать Python с написания программ на Django. Этот фреймворк настолько распространен, что обойти его невозможно. Если ты начнешь писать на Питоне, ты так или иначе будешь использовать http, а значит и Django. Йоу-йоу-йоу, металл-инженер здесь Сначала с ребятами по выходным на Flask’e Ми-ми-микро-сервисинг деплоится без смазки Так ты и перестаёшь писать на чистом Расширенные от ужаса зрачки джангиста Что я знал о Django? Что я знал о Django? Освобождённый nigga из восточного Ву-Танга Теперь я клацаю по клавишам — смешная обезьянка Django это я! Я — это Django!19

И только пройдя курс по Django, я, наконец, подошел к нейронным сетям. Пришлось повозиться, чтобы разобраться с проблемой версий: TensorFlow была написана для Питона более ранней версии и тогда не поддерживала современный Питон. Я скачал Python, скачал TensorFlow, 19

Научно-тенический рэп — «Джанго это я», 2021.

Industrial: Сорта питона, и как их готовить...

69

подключил библиотеку и получил ошибку! Ад из версий Питона в тот момент отправил меня в нокаут. Помучившись, я обучил нейронную из учебного примера. И на этом дело застопорилось. Вернулся обратно к данным, где требовалась аналитика, а не нейронные сети. Оказалось, что нейронные сети требуют очень много данных. Намного больше, чем есть у среднего размера рабочих проектов, т. е. порог входа для использования нейронных сетей непреодолим для 90% уже запущенных проектов. Сами проекты, наоборот, требуют анализа данных и поиска возможностей улучшить показатели для бизнеса. Аналитика находится на пересечении бизнес-целей, сбора данных инженерами и математики для поиска зависимостей. Прежде всего, аналитика — это управление погрешностями. Надо так нарезать данные, чтобы ошибки не переросли полученный результат анализа. На любую гипотезу в аналитике есть три ответа: да, нет, не знаю. Искусство выбора гипотез в том, чтобы получать третий результат как можно реже, но при этом добросовестно проверять возможность именно такого ответа на поставленный вопрос. Ответ на главный вопрос бизнеса «как сделать проект в два раза лучше?» — найти ошибку и исправить ее. Самые быстрые и эффективные решения — это как раз исправления ошибок. Если в вашем проекте нет ошибок (что несомненно хорошо!), то не стоит ожидать быстрых прорывов. Начинается долгая и кропотливая работа по выстраиванию процессов и проверке многочисленных гипотез. Из которых выстреливает одна из десяти, улучшая общий результат на 5%. Такая аналитика отлично работает на больших проектах и совершенно не окупается на маленьких стартапах.

70

Евгений Павлов. Знакомьтесь, Python

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

Контрольные вопросы: 1. Какие профессии предпочитают использовать Jupiter Notebook? 2. Зачем нужен API? 3. Чем отличаются REST API от API? 4. Какие библиотеки для нейронных сетей — полезные? 5. Зачем нужен Google Colaboratory? Если ответил на эти вопросы — получай достижение #PythonIndustrial.

Industrial: Сорта питона, и как их готовить...

71

В сухом остатке: 1. Data Analyst — аналитик по анализу и презентации данных; 2. Data Scientist — программист по сбору и обработке данных; 3. Data Engineer — инженер работает с инфраструктурой для хранения данных; 4. DevOps — системный администратор, управляет IT инфраструктурой; 5. Product Manager — отвечает за продукт, общается с заказчиком и командой разработки; 6. Разметка данных — специалисты из предметной области проекта.

DATA WAREHOUSE: КАК ХРАНИТЬ ДАННЫЕ? ИСТОЧНИКИ И ПОТОКИ ДАННЫХ. НОВАЯ НЕФТЬ

Зачем это надо?

П

рограмма на Питоне — это хранение и обработка данных. Построение инфраструктуры для аналитики подразумевает сбор данных из разных источников и сохранение их в единое хранилище (ClickHouse от Яндекса). Работа с финансами сводится к регистрации и хранению транзакций, расчету балансов на счетах клиентов. Все это хранится в базе данных (PostgreSQL). Для пользователей нам нужно выгружать выписки в табличные документы (Excel), рисовать графики (Grafana, Plotly) и показывать html страницы (Django) Программисту на Питоне не избежать SQL (Structured Query Language) для работы с базами данных. Пригодится и HTML стек: HTML (HyperText Markup Language) + CSS (Cascading Style Sheets) + JS (JavaScript). И обязательно знать: JSON (JavaScript Object Notation) — пересылка данных между скриптами.

74

Евгений Павлов. Знакомьтесь, Python

Файловая система Давай немножко попрограммируем. Открывай PyCharm Community Edition: [win] py.. [Enter] Выбери наш проект, который мы создавали в прошлой главе (IDE: Среда разработки). FirstPython В нашем проекте сейчас лежит два файла: 1. rep/lesson1.py 2. requirements.txt Давай напишем программу, которая requirements.txt и распечатает его в консоли.

прочитает

Где-то здесь я объяснял студентам сходство между дескриптором файла и указателем на объект в памяти. Но сейчас это кажется слишком заумным для первого знакомства. Поэтому сразу в бой! file_descriptor = open (‘requirements.txt’) Если навести мышку на кнопку запуска (зеленый треугольник в верхнем правом углу), то появится подсказка из быстрых клавиш для запуска программы. Shift+F10

Data WareHouse: Как хранить данные?

75

Запущенная программа выдает нам первую ошибку! FileNotFoundError: [Errno 2] No such file or directory: ‘requirements.txt’ Это потому что наш файл лежит в другой директории, а именно на одну директорию выше. По аналогии с командами в консоли, мы можем добавлять к имени файла текущую директорию ‘.\’ и директорию выше ‘..\’ Еще один нюанс и мы продолжим: Косая черта называется backslash. Она используется в строках для указания спецсимволов, вроде перевода строки ‘\n’ (backslash -> ‘\\’), поэтому, чтобы не грузить наш код лишними символами, мы используем raw (исходник) строчку, без магии спецсимволов. Что вижу, то и пишу: file_descriptor = open (r’..\requirements.txt’) Запускаем еще разок Shift+F10: Process finished with exit code 0 Бам! Sector Clear! Выполнилось без единой ошибки. Теперь выведем прочитаем содержимое файла в переменную: file_text = file_descriptor.read () print (file_text) Запускаем Shift+F10 и получаем мешанину из ASCII символов! Если открыть файл в блокноте, то мы увидим, что символов в файле в два раза меньше, чем напечаталось в консоли. Проблема в кодировке. Скорее всего файл requirements.txt записался в UTF-16 (Unicode

76

Евгений Павлов. Знакомьтесь, Python

Transformation Format — 16 бит), а мы пытаемся прочитать по умолчанию ASCII (American standard code for information interchange). Давай добавим кодировку: file_descriptor = open (r’..\requirements.txt’, encoding=’utf-16’) file_text = file_descriptor.read () print (file_text) Теперь после запуска, в консоли напечаталось ровно то же что и в файле: numpy==1.24.2 У-ф-ф! Главное ты уловил. Давай еще пару моментов набросаю. 1. Открывать файл лучше только на чтение: file_descriptor = open (r’..\requirements.txt’, ‘r’, encoding=’utf-16’). 2. Перед чтением надо проверить что такой файл существует: from os.path import exists path_to_file = r’..\requirements1.txt’ file_exists = exists (path_to_file) 3. Путь к файлу мы соберем из имени файла ‘requirements. txt’ и директории ‘..’

import os.path path_to_file = os.path.join (‘..’, ‘requirements.txt’)

Data WareHouse: Как хранить данные?

77

4. если файла нет, пишем предупреждение, используя строку форматирования ‘f’ print (f’Файл не найден: {path_to_file}’) Теперь полный фарш:

from os.path import exists, join path_to_file = join (‘..’, ‘requirements.txt’) file_exists = exists (path_to_file) if file_exists: file_descriptor = open (path_to_file, ‘r’, encoding=’utf-16’) file_text = file_descriptor.read () print (file_text) else: print (f’Файл не найден: {path_to_file}’) f-строки — еще один классный трюк со строками, чтобы подмешать переменную в итоговую строчку. Попробуй поменять имя файла path_to_file на что-нибудь типа ‘requirements1.txt’, и увидишь: Файл не найден:..\requirements1.txt На этом первое знакомство с чтением файлов можно закончить. У тебя есть конструктор из нескольких команд, попробуй поиграться с ним. Улучши программу на свой вкус или сломай ее — как пойдет. Первый шаг сделан. Почувствуй себя в самом начале пути в мир программирования. Это станет отличным кибер-приключением. Сделай перерыв: разомни шею, плечи, спину, ноги. Закрой глаза и подвигай зрачками, затем открой и посмотри вдаль, за окно, на солнышко. Прогуляйся попить водички и съесть вкусняшку. Ты с пользой проводишь время, и заслужил перерыв!

78

Евгений Павлов. Знакомьтесь, Python

JSON JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript. Это который выполняется в браузере на web-страницах. В первом приближении — это словарь ключ-значение. {‘ключ1’:’значение 1’, ‘ключ2’:’значение 2’, ‘ключ3’:’значение 3’} В качестве значение может быть снова словарь, или массив.

{ «ключ1»:»значение 1», «ключ2»: {«ключ21»:»значение 21», «ключ22»:»значение 22»}, «ключ3»: [«значение 31», «значение 32», «значение 33»] } Обрати внимание, что json использует двойные кавычки, в отличие от Питона, где мы могли писать строки и в одинарных, и в двойных. Давай создадим файл first.json и скопируем в него этот код. Сам файл сохраним рядом с lesson1.py. Теперь немного попрограммируем. Запускай PyCharm. Создай новый файл lesson2.py в папке c первым уроком (rep\lesson2.py). Для начала, давай создадим структуру и превратим ее в json, чтобы разобраться на что это должно быть похоже в качестве переменных Python.

Data WareHouse: Как хранить данные?

79

sample_dic = {} sample_array = [] Вот наши словарь и массив в Питоне. Добавим туда значений: sample_dic = {«ключ21»:»значение 21», «ключ22»:»значение 22»} sample_array = [«значение 31», «значение 32», «значение 33»] Теперь создадим общий словарь и поместим туда наши переменные: main_dic = {“ключ1”: “значение 1”} main_dic [“ключ2”] = sample_dic main_dic [“ключ3”] = sample_array print (main_dic) Если запустишь по умолчанию, то запустится наш первый скрипт, поэтому надо немного подсказать нашей IDE, что запускать. Перейди на вкладку lesson2.py и нажми Ctrl+Shift+F10. Ты должен увидеть в консоли строку: {‘ключ1’: ‘значение 1’, ‘ключ2’: {‘ключ21’: ‘значение 21’, ‘ключ22’: ‘значение 22’}, ‘ключ3’: [‘значение 31’, ‘значение 32’, ‘значение 33’]} Подозрительно напоминает наш первый json. Разве что кавычки одинарные, вместо двойных. Теперь давай начнем использовать библиотеку json:

80

Евгений Павлов. Знакомьтесь, Python

print (json.dumps (main_dic)) json подсвечивается красной чертой — не хватает подключения библиотеки. Можешь навести на нее курсор (мышку наведи и кликни) и нажать Alt+Enter. Выбери пункт: import json Нажми Enter — IDE сама напишет эту строку за тебя в начале скрипта. Еще один навык быстрого написания кода, когда IDE подбрасывает варианты дописывания и сама дописывает код. Шикарно! Подобный стиль называется Red Code — сначала пишем на черновую, что хотим сделать, а затем исправляем ошибки/дописываем недостающие части кода в программе. Устраняем подчеркивание красным в коде программе: Нажимаем Shift+F10, чтобы запустить и получаем какую-то белиберду в консоли: {“\u043a\u043b\u044e\u04471”: “\u0437\u043d\ u0430\u0447\u0435\u043d\u0438\u04351”, Это, брат, юникод. Поскольку у нас в строке были русские символы — json превратил их в ASCII (American Standard Code for Information Interchange) символы: ‘к’ => ‘\u043a’ Полезная штука, например, чтобы передать русские символы в URL (Uniform Resource Locator), который понимает только английские буквы (на самом деле уже пони-

Data WareHouse: Как хранить данные?

81

мает, но трудности случаются до сих пор). Но сейчас нам такое преобразование не нужно, поэтому отключим его: print (json.dumps (main_dic, ensure_ascii=False)) Снова запускаем Shift+F10 и на этот раз в консоли полный порядок: {“ключ1”: “значение 1”, “ключ2”: {“ключ21”: “значение 21”, “ключ22”: “значение 22”}, “ключ3”: [“значение 31”, “значение 32”, “значение 33”]} JSON игнорирует пробелы, перевод строки и табуляции, поэтому можно их добавлять в строку, чтобы выделить структуру данных, сделав их более удобными для чтения человеком. Заодно разобьем разрастающуюся команду на две части: создание строки (она нам понадобится) и ее печать в консоль. json_str = json.dumps (main_dic, ensure_ ascii=False, indent=2) print (json_str)

Никогда не пренебрегай возможностью сделать текст или код еще более читаемым. Кстати, если нажать в редакторе Ctrl+Alt+L (Reformat Code), твой код станет чуть более отформатированным для удобного чтения. Чистописание из младших классов возвращается! Чем проще читать код, тем меньше ты тратишь усилий на его понимание/осмысление при каждом новом чтении. Программистам постоянно приходится совершать интеллектуальные сверх-усилия. Эти маленькие хитрости позволяют эконо-

82

Евгений Павлов. Знакомьтесь, Python

мить усилия мысли и дают нам продвинуться еще немного дальше остальных. Все как с физической работой: не суетись понапрасну, иначе быстрее устанешь. Хорошо, еще пару усилий и мы закончим с этой темой, а я смогу пойти побегать с друзьями во дворе. Давай запишем получившуюся строку в файл. Нам опять нужен файловый дескриптор, но на этот раз в режиме записи ‘w’ — write: file_descriptor = open (r’lesson2.json’, ‘w’, encoding=’utf-16’) file_descriptor.write (json_str) file_descriptor.close () Нажми Shift+F10 чтобы запустить. У тебя должен появится файл lesson2.json в той же папке с файлом скрипта. Открой его и увидишь строчку из консоли. Обрати внимание, что файл записан в unicode кодировке. Это когда используется два байта (или 16 бит) на один символ и доступны все иностранные символы, например, кириллица. В конце появилась команда close () — это чтобы корректно закрыть записанный файл и записать его содержимое на диск. Наверное, если ее опустить, ничего страшного не случится. Компьютеры сейчас стали очень умные и умеют подчищать за рассеянным программистом. Однажды это может стать неприятным сюрпризом, когда твои изменения останутся в памяти и не сохранятся после окончания работы твоего скрипта. Береженого — Бог бережет! Теперь прочитаем строку из файла и превратим ее в структуру при помощи магии json. file_descriptor = open (‘lesson2.json’, ‘r’, encoding=’utf-16’)

Data WareHouse: Как хранить данные?

83

json_str = file_descriptor.read () main2_dic = json.loads (json_str) print (main2_dic) print (main_dic) В конце я распечатал обе переменные, до и после json, чтобы увидеть, что они совпадают. {‘ключ1’: ‘значение ‘ключ22’: ‘значение 32’, ‘значение 33’]} {‘ключ1’: ‘значение ‘ключ22’: ‘значение 32’, ‘значение 33’]}

1’, ‘ключ2’: {‘ключ21’: ‘значение 21’, 22’}, ‘ключ3’: [‘значение 31’, ‘значение 1’, ‘ключ2’: {‘ключ21’: ‘значение 21’, 22’}, ‘ключ3’: [‘значение 31’, ‘значение

Потрачено! Есть такой старый мем из дурацкого перевода игры GTA San Andreas. Создали переменную, записали ее в файл и впечатали в память обратно, не потеряв при этом содержимого. Такие операции в умных книжках называются сериализацией и дерериализацией. Serialize / DeSerialize. Прием, который позволяет развернуть данные в памяти программы. Например, когда ты сохраняешь свое прохождение в игре. Данные игрока сериализуются и сохраняются на диск. В следующем сеансе игры, при запуске, игра прочитает записанное на диск и вернет игрока к сохраненному состоянию. С того места, где ты закончил играть в прошлый раз. JSON — это один из самых распространенных стандартов сериализации данных. Большинство языков без проблем разворачивают данные из этого формата. Он удобен еще и тем, что его удобно читать человеку. Удобно чи-

84

Евгений Павлов. Знакомьтесь, Python

тать — удобно искать ошибки и отлаживать работу скрипта. Быстрое выявление ошибок становится все более и более важным для работы сложной программы. Это даже важнее скорости выполнения. Быстрое выявление и устранение ошибок помогает достичь главной цели — надежную работу программы. Еще одна важная веха в работе с данными на Питоне — пройдена. Можешь отложить ноутбук. Размяться и пройтись, завари чайку, постой у окна (вообще, сходи во двор, с ребятами мяч погоняй.) Отдохни как следует, чтобы с новыми силами начать следующее занятие. Шаг за шагом ты приближаешься к цели. Горжусь тобой.

SQL Для работы с базой данных придется обзавестись всем необходимым. Приступим: 1. создать базу mySQL; 2. с помощью DBeaver подключиться к созданной базе firstpython; 3. создать таблицу first_table и пару записей в ней; 4. установить пакет mysql-connector-python; 5. создать новый скрипт lesson3 и подключиться к базе; 6. вывести на консоль данные из нашей таблицы first_ table. Работы предстоит много, поэтому завари горячего чаю, запасись печеньками, поставь приятную музыку. Мы начинаем!

Data WareHouse: Как хранить данные?

85

Скачай DBeaver Community, чтобы подключаться к базе данных. Найди бесплатный mysql хостинг, например, db4free.net и зарегистрируйся на нем: База данных: firstpython Username: firstpython Заходим в DBeaver и создаем новые подключение к базе данных: Сервер: db4free.net База данных: firstpython Username: firstpython Password: который я указал при регистрации (надеюсь ты тоже придумал свой пароль) Мне удалось подключиться! Если ты подключился к своей базе данных, то получаешь достижение #DBeaver. Выбираю базу данных и нажимаю F3 (SQL Editor -> Open SQL Sript), чтобы создать SQL скрипт (справа), куда я буду вводить SQL команды. CREATE TABLE first_table (name1 VARCHAR (20), number2 INT); Нажимаю Ctrl+Enter, чтобы выполнить команду. Пишет что-то странное: rows updates 0. И слева таблицы в эксплорере не появилось. Но она там есть!

86

Евгений Павлов. Знакомьтесь, Python

Выбери Tables -> Refresh и увидишь, как обновится список таблиц, там появится наша новая табличка first_table! Давай добавим первую запись в таблицу. insert into first_table (name1, number2) values (“hi dude”, 1) Снова Ctrl+Enter. Интересно, что выполняется только одна команда, на которой находится наш курсор, поэтому можно не удалять старые команды, а спокойно переходить на новую строку и писать следующую команду. Теперь посмотрим, что строчка создалась: select * from first_table ft Нажимаем Ctrl+Enter и увидим нашу строчку. Я переключился с Greed на Text, чтобы результат был сплошным текстом без таблицы. name1 |number2| ———-+———-+ hi dude| 1| Круто! Ты поднял выделенный сервер в интернете, создал на нем MySQL базу, создал таблицу и наполнил ее данными. Шикарная работа, сейчас самое время сделать перерыв. Отлично! Давай продолжим собирать нашу махину. Запускай PowerShell: [Win] Po.. [Enter]

Data WareHouse: Как хранить данные?

87

cd C:\Projects\FirstPython\ .\venv\Scripts\activate (venv) PS D:\Projects\FirstPython> Сейчас мы находимся в нашем виртуальном окружении и нам нужно установить пакет для работы с mysql: pip install mysql-connector-python После выполнения, в консоли будет написано что-то типа: Installing collected packages: protobuf, mysql-connector-python Successfully installed mysql-connector-python-8.0.32 protobuf-3.20.3 Это значит, что пакет благополучно скачался и встал в виртуальном окружении нашего проекта. На этом консоль можно закрыть. Давай, наконец, запустим PyCharm: [Win] py.. [Enter] Создай новый скрипт lesson3.py и запусти его. Не забывай проверить запуск в верхнем правом углу именно lesson3.py!

import mysql.connector sql_connection = mysql.connector.connect ( user=’firstpython’, password=’xxx’, host=’db4free.net’, database=’firstpython’) sql_connection.close ()

88

Евгений Павлов. Знакомьтесь, Python

Наконец, наш скрипт подсоединился в базе данных на удаленном сервере, а затем закрыл соединение. Неплохо! Для начала, давай сделаем обертку для отлова ошибок, если что-то пойдет не так. import mysql.connector

try: sql_connection = mysql.connector.connect ( user=’firstpython1’, password=’xxx’, host=’db4free.net’, database=’firstpython’) except Exception as err: print (err) Если ты запустишь в таком виде (я испортил user), то получишь ошибку в консоли: 1045 (28000): Access denied for user ‘firstpython1’@’55.213.123.231’ (using password: YES) Поправь ошибку user и теперь выполним команду select. query_str = ‘select name1, number2 from first_ table’ sql_cursor = sql_connection.cursor () sql_cursor.execute (query_str) В результате выполнения, мы получили объект-курсор, в котором спрятан список строк из результата запроса. Осталось распечатать содержимое курсора.

for (name1, number2) in sql_cursor: print (f’number: {number2} name: {name1}’)

Data WareHouse: Как хранить данные?

89

Проверь, что команда sql_connection.close () пропала или находится в самом конце скрипта. Чтобы сначала выполнили запрос, а уже потом закрыли соединение, не наоборот! Запускай и смотри результат в консоли. У меня получилось вот такая строчка: number: 1 name: hi dude Добавим немного безопасности, изменив наш код. Финальный вариант скрипта будет выглядеть вот так: import mysql.connector

try: sql_connection = mysql.connector.connect ( user=’firstpython’, password=’xxx’, host=’db4free.net’, database=’firstpython’) except Exception as err: print (err) try: query_str = ‘select name1, number2 from first_ table’ sql_cursor = sql_connection.cursor () sql_cursor.execute (query_str) for (name1, number2) in sql_cursor: print (f’number: {number2} name: {name1}’) except Exception as err: print (err) finally: sql_connection.close ()

90

Евгений Павлов. Знакомьтесь, Python

Сделай контрольный запуск, чтобы убедиться, что все работает и результат прежний: number: 1 name: hi dude Все! Для первого раза хватит. Мы прошли основные этапы. Чтобы в следующий раз, когда ты будешь работать с базой данных, не запинаться об эти операции, а уже сосредоточиться на более продвинутых задачах. Теперь у тебя есть первый опыт работы с базами данных. Поднял сервер, занимался администрированием, написал SQL скрипт, управлял библиотеками Питона, при помощи скрипта достал данные из базы. Просто куча всего за небольшой урок! Закрой ноутбук, пройдись по комнате, разомни шею и плечи, посмотри вдаль. Можно перекусить и попить брусничного морса из холодильника. Твой мозг хорошо потрудился и ему нужно восстановить силы. Ты заслужил отдых!

Что почитать Кристофер Адамсон и Майкл Венерабле «Data Warehouse Design Solutions» Эта книга про проектирование и разработку хранилищ данных. Здесь описаны разные типы хранилищ данных и их архитектура, чем они отличаются от традиционных транзакционных баз данных. С примерами и практическими советами по проектированию и разработке хранилищ данных.

Data WareHouse: Как хранить данные?

91

Описана методология проектирования хранилищ данных: схема звезды (Star schema) или избыточная схема снежинки. Более того, ррассмотрен процесс разработки: от определения требований и проектирования модели данных, до загрузки данных и создания отчетов. Процесс ETL (Extract, Transform, Load) и рекомендации по оптимизации производительности хранилищ данных.

Задания и примеры: 1. открой (создай) файл на запись и напечатай туда 7 строк с номерами; 2. создай массив из семи чисел, преврати его в json и сохрани в файл; 3. напиши скрипт, который заполняет таблицу first_ table данными: название дней недели и числа 1—7. Если выполнил все эти задания, то получай достижение #DataWareHouse.

В сухом остатке. 1. Строки: f — Formatting, r — Raw; 2. File Descriptor — ключ для доступа к файлу в операционной системе; 3. JSON — JavaScript Object Notation; 4. SQL — Structured Query Language; 5. Connection — подключение к удаленному серверу; 6. Cursor — запрос для выполнения в базе данных и его результаты.

RELEASE: ГЛАВНЫЕ БИБЛИОТЕКИ ПИТОНА. УЧЕБНАЯ ПРАКТИКА

Зачем это надо?

П

ожалуй, самая сильная сторона Питона — это библиотеки. Десятки библиотек, для работы над разными задачами, от нейросетей до аналитики,

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

полезно научиться работать, чтобы устроиться на работу программистом Python.

Pandas В 2009 году Уэсом Маккини (англ. Wes McKinney) покинул инвестиционную компанию AQR Capital Management. Перед уходом из AQR ему удалось убедить руководство позволить опубликовать исходный код библиотеки под свободной лицензией.

94

Евгений Павлов. Знакомьтесь, Python

Уже в 2012 к нему присоединился коллега Чан Шэ. Библиотека набрала популярность в среде Python-разработчиков и к проекту присоединилось множество новых участников. С 2015-го года эта библиотека спонсируется компанией NumFOCUS, которая поддерживает open source проекты. NumPy работает с массивами данных. Pandas строится поверх библиотеки NumPy. Это более высокоуровневый интерфейс для работы с табличными данными: электронные таблицы и базы данных. Plotly — библиотека для построения интерактивных графиков. На выходе ты получаешь Java Script приложение, которое показывает интерфейс в браузере и рисует интерактивный график, который можно увеличивать переключать. Получается намного круче, чем статическая картинка. Руководству такое нравится. NumPy может быть более эффективным для работы с массивами и матрицами, чтобы выполнить быстрые математические операции над большими объемами данных. NumPy содержит кучу функций для работы с линейной алгеброй, статистикой и случайными числами. Одной из основных задач, которые Pandas делает лучше, чем NumPy — это анализ данных. Pandas загружает и обрабатывает данные из CSV-файлов (выгружаются из электронных таблиц или запросом из базы данных). Сырые данные нужно приготовить, чтобы представить их с помощью Plotly в отчете. Pandas может сгруппировать данные, отбросить лишнее, отсортировать по алфавиту. В том числе имеет удобный интерфейс для работы с разными форматами чисел и времени.

Release: Главные Библиотеки Питона. Учебная практика

95

С данными больше работают аналитики, которые используют Jupiter Notebook, который входит в состав IDE Anaconda. Перед использованием, библиотеки надо скачать и установить библиотеки pandas и plotly для Anaconda: 1. открой Anaconda Navigator; 2. нажми на кнопку «Channels» внизу окна и проверь, что выбраны каналы «conda-forge» и «defaults»; 3. открой «Environments» (меню слева) и выбери окружение; 4. введи «pandas» в поле поиска, выбери библиотеку Pandas и нажми на кнопку «Apply». Это установит библиотеку Pandas и все ее зависимости; 5. введи «plotly» в поле поиска, выбери библиотеку Plotly и нажми на кнопку «Apply». Это установит библиотеку Plotly. Другой способ — это установка pandas и plotly через командную строку Anaconda Prompt.

conda install pandas conda install -c plotly plotly Например, ты работаешь с данными о продажах в интернет-магазине и тебе надо проанализировать, как менялась выручка по месяцам в течение года. Используй Pandas для загрузки данных из CSV-файла, предварительной обработки данных, агрегации по месяцам и расчета суммарной выручки за каждый месяц. Пример кода для Jupiter Notebook:

import pandas as pd # Загрузка данных из CSV-файла sales_data = pd.read_csv (‘sales_data.csv’)

96

Евгений Павлов. Знакомьтесь, Python

# Преобразование даты в формат datetime sales_data [‘date’] = pd.to_datetime (sales_data [‘date’]) # Сгруппировать продажи по месяцам monthly_sales = sales_data.groupby (pd.Grouper (key=’date’, freq=’M’)).sum () # Расчет суммарной выручки за каждый месяц monthly_revenue = monthly_sales [‘revenue’] # Вывод результатов print (monthly_revenue) И, наконец, давай сделаем график!

import plotly.graph_objects as go # Создание интерактивного графика fig = go.Figure () fig.add_trace (go.Scatter (x=monthly_ revenue.index, y=monthly_revenue.values, mode=’lines+markers’)) fig.update_layout (title=’Выручка по месяцам’, xaxis_title=’Месяц’, yaxis_title=’Выручка’) fig.show () Этот код, после выполнения, покажет график в блокноте Jupiter. Если у тебя получилось вывести график на экран монитора, то ты получаешь достижение #Anaconda.

Release: Главные Библиотеки Питона. Учебная практика

97

А вот так можно выгрузить JS приложение в html файл, чтобы его можно было запустить в браузере:

# Сохранение графика в HTML файл fig.write_html (‘sales_graph.html’) Затем, можно выгрузить сгенерированный скрипт в html файл. Прикрепить этот html файл к документу в корпоративной википедии и вставить кусочек кода со ссылкой на прикрепленный html файл в текст документа — получилось безопасно и красиво! Confluence — это вики от Atlassian (создателей Jira, SourceTree и прочих инструментов для разработки программного софта c удобной интеграцией между собой). Приведу пример кода для вставки html в статью на wiki:

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

Django Django создали разработчики издания Lawrence-Journal World. Этой газете понадобился сайт, чтобы публиковать новости в интернете. Программисты Эдриан Головатый и Саймон Виллисон создали веб-приложение и сделали его публичным. Вокруг Django быстро сформировалось активное сообщество. Фреймворк стал стремительно развиваться усилиями волонтёров. Значительную роль в успехе Django сыграли несколько известных сайтов, которые использовали этот фреймворк. В их число входят Pinterest, Dropbox, Spotify, сайт The Washington Post. В настоящее время сообщество Django включает десятки тысяч программистов и сотни стран мира.

Release: Главные Библиотеки Питона. Учебная практика

99

Этот фреймворк используется большим количеством других библиотек, которые можно без проблем подключать к проекту Django по необходимости. В Django тоже есть типовые блоки. Например, блок авторизации или блок подписки на рассылку применяется практически в каждом проекте. Созданные с помощью фреймворка сайты состоят из таких независимых блоков. Когда разбираешься с Django и ищешь решение своей проблемы, чаще всего это не вызывает затруднений. Тысячи специалистов уже решали такие же проблемы и уже поделились своим опытом в интернете. Так работает сообщество Django. Django использует архитектуру MVT — Данные (Model), Вывод (View), Шаблон вывода для html (Template). После функционального программирования к этому сложно привыкнуть, когда освоишься — поймешь, что так на самом деле удобнее. Django подходит для разработки высоконагруженных веб-приложений, поэтому его так любят корпорации. Хочешь сделать что-то большое — используй Джанго! Давай создадим простой проект на Django: 1. установи Django

> pip install django

2. Создай новый проект Django

> django-admin startproject myproject

100

Евгений Павлов. Знакомьтесь, Python

Команда создаст каталог с именем myproject, в котором будут находиться файлы проекта. 3. Создай приложение Django

> python manage.py startapp myapp Команда создаст каталог с именем myapp, в котором будут находиться файлы приложения. 4. Настрой базу данных. Отредактируй файл settings.py в каталоге myproject. Например, чтобы использовать базу данных MySql надо написать:

DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘fisrtpython’, ‘USER’: ‘firstpython’, ‘PASSWORD’: ‘пароль из предыдущей главы’, ‘HOST’: ‘db4free.net’, ‘PORT’: ‘3306’, } } Не зря я рассказывал, как работать с базами данных! Без них — никуда. 5. Опиши структуру данных (Model). Отредактируй файл models.py в каталоге myapp. В этом файле надо определить таблицу в базе данных, которая будут использоваться в твоем приложении. Чтобы создать таблицу article, добавь в файл models.py:

Release: Главные Библиотеки Питона. Учебная практика

101

from django.db import models class Article (models.Model): title = models.CharField (max_length=200) content = models.TextField () pub_date = models.DateTimeField (auto_now_ add=True) 6. Создай миграции (таблицы в базе данных) > python manage.py makemigrations > python manage.py migrate Команда makemigrations создаст расширенный sql скрипт, для добавления таблиц (описанных в models.py) в базу данных. Команда migrate применит эти изменения к базе данных (описанной в settings.py). 7. Создай объекты Article в базе данных. Создай скрипт utils\add_article.py:

from myapp.models import Article article = Article (title=’Заголовок статьи’, author=’Имя автора’, content=’Текст статьи’) article.save () Запусти его. Этот код создаст новый объект Article и сохранит запись в базе данных в таблице article. 8. Создай представления (View), чтобы создать на сайте страницу index, которая будет показывать список статей, добавь в views.py:

102

Евгений Павлов. Знакомьтесь, Python

from django.shortcuts import render from.models import Article def index (request): articles = Article.objects.all () return render (request, ‘index.html’, {‘articles’: articles})

Здесь берется модель Article из файла models.py и создается страничка index, которая получает список записей из таблицы article и передает их в шаблон index.html. 9. Создай шаблоны (Template). Создай файл myapp\ templates\index.html. Здесь мы определим, как будет выглядеть страница index.html нашего сайта:

{% for article in articles%} {{article.title}}

{{article.content}}

{% endfor%} 10. Запусти сервер. > python manage.py runserver Команда запустит сервер разработки Django, который будет доступен по адресу http://127.0.0.1:8000/. 11. Открой браузер. Введи URL http://127.0.0.1:8000/ в браузере и посмотри список статей, которые вы добавили в базу данных.

Release: Главные Библиотеки Питона. Учебная практика

103

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

RabbitMQ В 2007 разработан Rabbit Technologies Ltd. В 2010 продан в SpringSource, подразделение VMware. В 2013 стал частью Pivotal Software. В 2019 выкуплен обратно в VMware. RabbitMQ — backend для хранения очередей (специальная база данных). В вашей инфраструктуре может быть 100500 очередей для самых разных задач. Pika — библиотека на python для работы с сервером rabbitMQ. Celery — библиотека на python для отложенного выполнения задач. Внутри используется очередь задач, которая хранится в отдельном сервисе (RabbitMQ). Celery работает с нею при помощи Pika. Использование RabbitMQ и Celery похоже на работу диспетчера и курьеров в городской доставке. RabbitMQ — это диспетчер, который получает задачи и распределяет их между курьерами Celery. Каждый курьер получает свою задачу и выполняет ее, а затем отправляет результат обратно

104

Евгений Павлов. Знакомьтесь, Python

диспетчеру. Таким образом, RabbitMQ и Celery позволяют эффективно распределять задачи на кластере серверов и управлять их выполнением в приложении на Python. Эта архитектура часто применяется на серверах банков, через которые проходят миллионы транзакций. Одна транзакция долго обрабатываться на выделенном сервере, поэтому обработкой всех транзакций занимаются десятки серверов. Балансировкой нагрузки на эти сервера занимается сервис RabbitMQ (тоже отдельный сервер балансировки). Программист пишет программу для обработки одной транзакции на Python, затем эта программа раскатывается на все сервера в кластере. Давай сначала установим RabbitMQ на Windows: 1. загрузи Windows Installer с официального сайта: rabbitmq.com; 2. следуя инструкциям, установи RabbitMQ; 3. после установки, открой командную строку и перейди в папку, куда был установлен RabbitMQ. Обычно по умолчанию это C:\Program Files\RabbitMQ\; 4. чтобы установить плагин RabbitMQ Management, запусти команду: rabbitmq-plugins enable rabbitmq_ management. RabbitMQ Management, позволяет управлять и мониторинг использования RabbitMQ в браузере; 5. чтобы запустить сервер RabbitMQ, в командной консоли запусти команду: rabbitmq-server start;

Release: Главные Библиотеки Питона. Учебная практика

105

6. теперь нужно открыть веб-интерфейс RabbitMQ Management. Открой браузер и введи адрес http://localhost: 15672. Ты увидишь страницу входа; 7. введи логин и пароль по умолчанию: guest/guest. При первом входе, появится возможность создать нового пользователя. Теперь ты сможешь использовать RabbitMQ для своих приложений. Чтобы работать Celery, установи библиотеку в рабочем окружении:

> pip install celery Затем создай файл tasks.py, где будут храниться задачи. Например, создадим задачу add, которая будет складывать два числа:

from celery import Celery cerely_app = Celery (‘tasks’, broker=’pyamqp:// guest@localhost//’) @cerely_app.task def add_two_numbers (x, y): return x + y Здесь мы создали объект cerely_app класса Celery и определили задачу add_two_numbers с использованием декоратора @cerely_app.task.

106

Евгений Павлов. Знакомьтесь, Python

Чтобы запустить задачу, создай файл run_task.py, который будет содержать код для запуска задачи. Например:

# импортируем задачу add_two_numbers из файла tasks.py from tasks import add_two_numbers # используем асинхронный запуск для задачи add_ two_numbers result = add_two_numbers.delay (3, 5) # печатаем что получилось print (result.get ()) При помощи магии наша задача будет выполнена в отдельном процессе (основная программа на это время засыпает в ожидании). Получаем результат работы в виде объекта AsyncResult, а печатаем его:

>8 У-ф-ф, разобрались с этими библиотеками! Если не забоялся работы, а действительно сел за компьютер, разобрался и сумел повторить, ты получаешь достижение #RabbitMQ. Я по-настоящему горжусь тобой!

Google и NASA В начале двухтысячных годов появился Python 2.0 и его начали использовать такие гиганты как Google и NASA.

Release: Главные Библиотеки Питона. Учебная практика

107

Python хорошо адаптирован для параллельного и распределенного программирования. Что важно для Google, который специализируется на построении масштабируемых систем. В 2018 Дата Центры (ЦОД) Корпорации Добра создавали почти половину выбросов CO2 от работы интернета. Что явно намекает на количество компьютеров Корпорации Добра. Для Python создано куча библиотек, чтобы обрабатывать данные. Миссия Google: систематизировать всю информацию в мире и сделать ее доступной для каждого пользователя. Обработка и масштабирование — отличные цели для Python и Google. Google создал несколько библиотек на Python: 1. Selenium — библиотека для тестирования; 2. Google App Engine — фреймворк для создания вебприложений; 3. TensorFlow — инструменты для машинного обучения. Python — основной язык программирования в известных проектах: YouTube, Google Search, Google Maps и куча других. Кроме денег, Гугл хочет видеть всю инфраструктуру Питона, живущую в своём облаке. В особенности, репозиторий pip, через который устанавливаются все библиотеки Python. NASA выбрала Python из-за библиотек для обработки данных и научных вычислений. National Aeronautics and Space Administration работают с научными исследованиями и космическими миссиями. Задачи для космоса связаны с большими данными и тяжелыми расчетами, а Python оказался хорошим

108

Евгений Павлов. Знакомьтесь, Python

инструментом для такой работы. Обошел на повороте Си и Java, потому что их тяжелее изучать и поэтому они не прижились в научном сообществе. Конечно, код для марсохода пишут на Си, как и драйвера для всего коммерческого оборудование, ведь язык Си максимально близок железу (язык роботов!) Си — промышленный стандарт. Поэтому, скомпилированный на Си код, будет корректно работать на самых экзотичных и специализированных процессорах и операционных системах. С другой стороны, специалисты пишут на том, на чем им удобнее. Поэтому Python — основной язык программирования для систем управления космическими аппаратами и обработки данных в NASA. Библиотека PyRAF (Python-based Reduction and Analysis Facility), была разработана в NASA для обработки данных, полученных с помощью телескопа Hubble. PyRAF предоставляет мощный инструментарий для обработки и анализа данных в астрофизике и используется в научных проектах. OpenMDAO (Open-source Multidisciplinary Analysis and Optimization) предоставляет инструменты для междисциплинарного анализа и оптимизации сложных систем. OpenMDAO используют в проектах NASA, связанных с проектированием и анализом космических аппаратов. Обрати внимание: прежде всего, программирование — это инструмент для исследований. Такой же, как телескоп или градусник, поэтому так важно не просто уметь программировать, но быть специалистом в какой-то области. Специалистом, который умеет использовать программирование на Питоне в своей работе.

Release: Главные Библиотеки Питона. Учебная практика

109

Хочешь вырасти как специалист? Изучай программирование и используй его в своей основной профессии: 1. управление проектами: планирование, отслеживание и контроль проектов; 2. маркетинг: создание сайтов, рекламных кампаний, анализ поведения пользователей; 3. финансы: финансовая отчетность, анализ данных, управление рисками, управление портфелем; 4. производство: управление производством, контроль качества; 5. логистика: цепочки поставок, отслеживание грузов, управление складами; 6. обслуживание клиентов: управление клиентскими отношениями, обработка заказов; 7. управление персоналом: управление кадрами, зарплатами, отпусками, сотрудничествами. Мы живем в реальности, где компьютерные технологии проникли в большинство областей. Если ты специалист в чем-то, то сможешь найти применение программированию в своей профессии. Основная преграда для этого — недостаточная гибкость мышления и недостаток опыта в поиске новых решений для хорошо известных тебе задач. Первый шаг в поиске — это хорошо сформулировать проблему, которая есть в твоей области. Второй шаг — найти данные, которые ты сможешь обработать для решения своей задачи. Тыжпрограммист — защитник планеты, Чинит всё, от холодильника до лыж. Процессор не включается, или интернета нету, Срочно посылай в космос сигнал «Тыж»!20 20

Научно-технический рэп — «Тыжпрограммист», 2015.

110

Евгений Павлов. Знакомьтесь, Python

Контрольные вопросы: 1. 2. 3. 4. 5.

Расширением какой библиотеки является Pandas? Какую архитектуру использует Django? Что делает команда makemigrations? Как связаны между собою RabbitMQ и Cerely? Расширение какой библиотеки является Cerely?

Если ответил на все вопросы — получай достижение #PythonLibraries.

В сухом остатке: 1. 2. 3. 4.

Anaconda, Jupiter Notebook, NumPy, Pandas Grafana, Plotly, Confluence, Jira Django — Model View Template, makemigrations RabbitMQ, Pika, Cerely, Decorator, Task

GIT: СИСТЕМА КОНТРОЛЯ ВЕРСИЙ. ГДЕ ХРАНИТЬ ИСХОДНИКИ

Октокот Мона Лиза

О

ктокот — это помесь осьминога и кота. Черный с пятью щупальцами. Кстати, это не кот, а кошка. Маскот (талисман) GitHub — крупнейшего сер-

виса для хранения открытого программного кода. Ее зовут Мона Лиза, или просто Мона. Есть множество картинок Моны в разных стилях: от звездных войн до Санта-Клауса. Особое развлечение — разглядывать ее многочисленные образы. Git (Global Information Tracker) — система контроля версий, созданная Линусом Торвальдсом. Для управления разработкой ядра Linux (Линукс), создателем которой он является. Очень быстрая система для хранения истории изменений документов, слияния разных версий и выпуска патчей. По другой версии, Git — это случайная комбинация трех букв, которая еще не использовалась в качестве других команд Linux.

114

Евгений Павлов. Знакомьтесь, Python

Git (мерзавец) — Торвальдс саркастически отозвался о выбранном им названии: “Я эгоистичный ублюдок и поэтому называю все свои проекты в честь себя. Сначала Linux, теперь git.” Этот мужчина знает толк в острых шутках! Люблю его юмор. >_< Когда программируешь, тебе нужно не просто иметь код программы, но и историю изменения этого кода. Например, чтобы иметь возможность откатить изменения назад, до того момента, когда была совершена ошибка и система перестала работать. Не представляю, как программисты раньше жили без этой системы? Git идеально подходит для хранения именно текста, будет это программный код, html страница или лицензионное соглашение. Ты с легкостью можешь узнать, что именно изменилось в последней версии документа. Работа с этим инструментом — важная часть работы программиста. Если над одним проектом команда из нескольких программистов — этот инструмент становится критически важным. Просто невозможно разруливать конфликты изменений от разных авторов другими способами! Не буду грузить тебя сложной теорией. На самом деле освоить git проще чем ездить на велосипеде. После нескольких слияний в групповом проекте, ты научишься этой технологии и перестанешь допускать ошибки. Чем раньше начнешь практиковать git, тем быстрее научишься. Есть одна полезная особенность github — ты можешь скачать и посмотреть чужие проекты. В 99% репозиториев ты ничего не поймешь даже с документацией, но даже попытка изучения чужого кода многому тебя научит. Наблюдать за работой мастеров программирования — очень полезно.

GIT: Система контроля версий. Где хранить исходники

115

Ludum Dare Люблю участвовать в фестивале скоростной разработки игр Ludum Dare. Когда тысячи команд по всему миру выбирают тему для небольшой игры и делают свой прототип за выходные. Настоящий 48-часовой марафон на выживание, который учит правильному планированию и распределению усилий по разработке. Мое достижение — это участие в таких марафонах 10 (десять) раз подряд. Почти четыре года (LD проводится 3 раза в год). И я каждый раз собирал команду, чтобы сделать очередную игру на Unity для Google Play на своем телефоне под Android. Многие участники используют GitHub для хранения своих проектов (больше 4-х тысяч репозиториев!). Часто изучаю исходный код в открытом доступе самых интересных проектов. Очень поучительно изучать историю поэтапной разработки. С чего начинают разработку нового проекта? В каком порядке добавлялись новые фичи? Как именно была реализована эта крутая механика или красивый интерфейс в игре? Как оформляется код у коллег? Есть еще один полезный момент от домашних проектов. Если у тебя есть домашний проект — именно на нем ты можешь ставить свои эксперименты с новыми версиям библиотек; попробовать новые технологии и подходы в разработке. Публичные репозитории похожих проектов очень помогают подсмотреть у коллег новые взгляды и технологии. На будущее, стоит подумать над своим домашним проектом (Pet Project). Будет над чем ставить эксперименты и что показывать работодателю.

116

Евгений Павлов. Знакомьтесь, Python

Опыт участия в подобных хакатонах стал очень полезным для меня, как для программиста, геймдизайнера и лидера команды. Я научился выделять самое главное в игре (Core Gameplay) и быстро это прототипировать. Научился работать в команде, нарезать задачи и планировать нашу общую работу; доводить проект до конца и полировать результат так, чтобы он засиял. А самое главное — научился грамотно распределять нагрузку и вовремя отдыхать во время разработки. Это суперполезные навыки для любого разработчика.

Создаем репозиторий Давай создадим репозиторий для нашего проекта на github. Открывай сайт github.com Нажимай кнопку [Sign Up] чтобы зарегистрироваться на этом сайте как новый пользователь. Укажи свою почту, придумай пароль для github. Обрати внимание, что в пароле нужны заглавные буквы и цифры, всего не меньше 8 символов. Придумай себе имя пользователя. В конце концов github — это социальная сеть для программистов. Один нюанс: это имя увидят твои работодатели, когда ты будешь присылать им свое тестовое задание, например. Придумай что-то более официальное, не повторяй мою ошибку! Согласись получать новости и реши капчу. После чего нажимай [Create Account]. Проверь почту, тебе должно прийти письмо из GitHub с заголовком “Your GitHub launch code” прочитай код и введи его на сайте.

GIT: Система контроля версий. Где хранить исходники

117

Ответь на вопросы анкеты: 1. как много людей будет работать над твоим проектом? 1; 2. ты учитель или студент? Студент; 3. какие фичи тебе интересно использовать? Никакие. На следующей странице выбирай бесплатный план [Continue for free]. Гиперпрыжок! Наконец, ты попал в GitHub. Если ты завершил регистрацию, получай ачивку #OctoCat. Ищи зеленую кнопку слева [Create Repository] и нажимай ее. Имя репозитория: FirstPython Описание: Учебный проект на Питоне. По книге: Знакомьтесь Питон. Публичный проект. Не стоит заморачиваться с приватностью — лишние сложности. Поставь галочку (checkbox) в пункте Add a README file Выбери шаблон для gitignore: Python (какие файлы не попадут в репозиторий, оставшись только на локальной машине) Лицензию оставь пустой: None Нажми зеленую кнопку [Create Repository]

118

Евгений Павлов. Знакомьтесь, Python

Ура! Проект создался. Оглядись в папке проекта. Посмотри какие там есть закладки. Куча непонятных кнопочек! Прямо как в космическом корабле. Сейчас нас интересует зеленая кнопка ближе к середине экрана [ Code]. Нажми на нее. Скопируй строчку с адресом проекта: https://github.com/ BloodJohn/FirstPython.git На этом пока закончим с GitHub и сделаем копию нашего проекта на локальной машине — клонируем проект. Я использую клиент SourceTree — он достаточно простой и удобный, чтобы перемещаться по веткам репозитория и управлять ими. Скачай exe файл для установки и запусти его. Registration — [skip] Pick Tools to Download and Install — git Кроме самого SourceTree нам нужна еще и сама программа/утилита git [Next] Preferences — укажи имя пользователя и почту, такие же как в github. Load SSH Key — No

GIT: Система контроля версий. Где хранить исходники

119

Клиент установлен и запущен! Давай клонируем наш проект из github: Нажимай кнопку [Clone] и вводи URL нашего проекта из github Кликни за пределы поля ввода и введи в появившемся окне свой логин и пароль на GitHub. Нажимай [Login] Следующее поле Destination Path: C:\Projects\ FirstPython — путь к нашему уже существующему проекту на Питоне Имя для закладки в SourceTree: FirstPython Local Folder: root Checkout Branch: main Нажимай синюю кнопку [Clone] И мы увидим ошибку: Cannot Clone Into Non-Empty Folder Давай поменяем директорию на C:\Projects\FirstPython2 и попробуем снова. Теперь все заработало! Проверь что репозиторий создал папку FirstPython2 с несколькими файлами внутри и одной скрытой директорией «git». Уф! Даже когда знаешь нюансы — этот процесс утомляет. Боюсь предположить, сколько раз у тебя не получалось. Самое обидное, что затык может возникать на ровном

120

Евгений Павлов. Знакомьтесь, Python

месте! Например, потому что в новой версии (в твоем будущем) изменился интерфейс и вот ты уже не можешь найти нужную кнопку, о которой пишет автор. Но ты справился! Время устроить перерыв. Закрой ноутбук, встань и пройдись. Наклони голову вперед-назад, вправо-влево, осторожно повращай шеей — почувствуй, как хрустят позвонки шеи. Покрути плечами — разгони кровь и почувствуй прилив удовольствия от движения. Налей себе воды и съешь вкусняшку. Посмотри на яркое солнышко за окном. Просто закрой глаза и постарайся ни о чем не думать. Пара минут медитации после усиленной работы головой — то что доктор прописал. Отдохни как следует и возвращайся к изучению Git. Если сделал зарядку, получай достижение #PythonGym

Сохраняем изменения Давай скопируем в папку нашего нового репозитория наш старый проект из C:\Projects\FirstPython. Просто скопируй все файлы из одной папки в другую. Теперь загляни в SourceTree. Надо немного подождать, когда изменения прогрузятся. Вкладка File Status. Панель UnStaged Files (несохраненные файлы), сделаем несколько действий: 1. нажми плюсики для файлов txt, py, json — все файлы, которые мы создавали в проекте; 2. на любом из файлов.idea правой кнопкой мыши, выбираем в контекстном меню Ignore..;

GIT: Система контроля версий. Где хранить исходники

121

3. в диалоге Ignore выбираем Ignore everything beneath [.idea]. Нажимаем кнопку [OK]; 4. появившийся желтый.gitIgnore — тоже нажимаем крестик и перемещаем его в сохраненные файлы Staged files. Остался еще один важный штрих. Надо сочинить описание нашего изменения (commit). Все программисты привыкли называть его коммит. Как привыкли говорить файл, вместо документа. Напиши свое описание для нового коммита в окошке, внизу SourceTree: Добавил проект со скриптами 1—3 уроков. Оба чекбокса оставляем пустыми: Push changes immediately to origin/main Amend latest commit DDL (Drop Down List) Commit Options — тоже не трогаем. Нажимай [Commit] Хорошо! После нажатия мы вновь видим дерево коммитов с новым узлом, нового коммита. А наверху подсветилась кнопка Push. Сейчас изменения зафиксированы, но находятся только на локальной машине (Workspace). Ктопка Push отправит изменения на сервер в репозиторий в главную (main) ветку. Нажимай кнопку [Push]. Появится диалоговое окно, где ничего не надо менять, а просто нажать [Push] еще разок.

122

Евгений Павлов. Знакомьтесь, Python

Далее появится диалог авторизации GitHub. Выбери Sign In your browser В браузере откроется страница Authorize Git Credential Manager Нажимай зеленую кнопку [authorize git credential manager] Можешь возвращаться в SourceTree — коммит запушился на GitHub! Зайди на сайт GitHub и посмотри страницу с репозиторием FirstPython. Погуляв по интерфейсу, ты сможешь найти список файлов в репозитории, а неприметная кнопочка “2 commits” — покажет страницу с историей коммитов (их пока два). Подозреваю, что не у каждого получится без проблем сделать все шаги, ведь количество непонятных кнопок просто зашкаливает. Если у тебя получилось залить проект на сервер, то ты получаешь достижение #FirstCommit. Например, я полчаса тупил, не понимая, почему не проходит авторизация github при попытке запушить на сервер. Мне пришлось скопировать текст ошибки и почитать советы на Stackoverflow, Но это не особенно помогло. Тогда я начал вбивать разные варианты фразы в поисковик гугла, в надежде увидеть подсказку. Наконец, я нашел статью “Git Commands Return Fatal: Authentication Failed21”. Где 3-й из 4 вариантов проблемы походил на мою. У меня устарел сам Git. Мне пришлось сходить на сайт и переу21

Peter Mortensen, сайт stackoverflow.com

GIT: Система контроля версий. Где хранить исходники

123

становить Git на компьютере. После установки в SourceTree поменялся диалог авторизации, и теперь все сработало нормально. Часто в работе не все идет гладко. Если найти ответ не получается ни с первого, ни со второго раза, не отчаивайся. В работе с компьютерами такое происходит постоянно. Мой совет: отвлекись от компьютера на 5—10 минут и прогуляйся. Новые варианты появляются в голове, когда она не занята суетой. Ты придумаешь еще пару гипотез и одна из них обязательно сработает. Это удивительно полезный навык для нашего перегруженного шумом времени — отложить все в сторону и просто посидеть наедине со своими мыслями в тишине, чтобы ничего не отвлекало. Во время медитации пыль осядет, и ты ясно увидишь новое решение.

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

124

Евгений Павлов. Знакомьтесь, Python

Иными словами, в каждой ветке свой уровень ошибок и наличие веток позволяет нам не выплескивать энтропию (это такая функция измерения хаоса в физике) в соседние отсеки, а делать это управляемо, вроде серии речных шлюзов. Только тут у нас не уровень воды в шлюзе, а уровень ошибок в коде. Зачем уходить на отдельную ветку? Чтобы иметь стабильную копию проекта. Будет очень неприятно, когда посреди работы твой файл изменят и сотрут все твои изменения. Печалька, если посреди отладки ты заберешь чужие изменения, которые сломают работу проекта — он перестанет компилироваться вообще. Как часто это происходит? Чаще, чем мне бы этого хотелось! Как вернуться в основную ветку? Сначала забери изменения из основной ветки в свою. Разберись с конфликтами: когда в разных версиях один и тот же участок кода был изменен. Надо выбрать, какое изменение останется, а какое сотрется. Или написал третье изменение, объединяющее первые два. Затем спокойно вливай свои изменения с уже решенными конфликтами в общую ветку разработки. Чтобы спустится вниз по реке (до продакшена), сначала проверяем тестированием и исправляем ошибки на рабочей машине (уменьшаем вероятность сбоев или саму энтропию). Уровень воды в отсеке-шлюзе опускается до уровня следующего отсека. Затем вливаем текущую версию в рабочую ветку. Открываем ворота шлюза в соседний отсек. Переходим в соседний отсек, ниже по течению. Пока не достигнем самого низкого уровня воды (ошибок в коде). И, наконец, выйдем в открытое море (продакшен).

GIT: Система контроля версий. Где хранить исходники

125

Как устроен Git GitFlic.ru — русский GitHub создан в 2021 году Gitee.com — китайский GitHub создан в 2016 году, как ответвление от другого проекта Gogs.io Git для Windows состоит из трех программ: 1. Remote Server — репозиторий на удаленном компьютере. 2. Git — утилита для работы с репозиторием. 3. SourceTree — графический интерфейс для работы с утилитой. Изменения Git делятся на четыре этапа: 1. ustaged files: локальный проект — файлы, которые лежат на диске; 2. staged files: зафиксированные изменения — файлы (часть изменений), которые пометил для отправки; 3. local branch: локальные коммиты — файлы (изменения), которые объединил в коммит; 4. remoute branch: репозиторий на сервере — коммит, который отправил на сервер Как с речным шлюзом: изменения (корабли) двигаются от 1 до 4 этапов (шлюзов). Git хранит только изменения файлов, вместо файлов полностью. Если ты исправил одну строку в файле с миллионом строк, то изменение будет весить ровно одну (исправленную) строку.

верхний бьеф

верхний бьеф

верхний бьеф

закрыто

закрыто

открыто

открыто закрыто закрыто

ВЫХОД ИЗ ШЛЮЗА

ПОДЪЕМ

нижний бьеф

нижний бьеф

ВХОД В ШЛЮЗ

нижний бьеф

126 Евгений Павлов. Знакомьтесь, Python

GIT: Система контроля версий. Где хранить исходники

127

Вот алгоритм работы с git которому я следую: 1. в любой непонятной ситуации создавай новую ветку; 2. работай только в своей ветке; 3. постоянно заливай изменения из главной ветки в свою ветку; 4. закончил вносить изменения? — Тестируй; 5. залей изменения из главной ветки в свою ветку; 6. реши конфликты. Проверь, что все по-прежнему работает; 7. можешь вливать изменения из своей ветки в общую. Чем чаще изменения вливаются, тем проще решать конфликты между версиями. И если когда-то я ловил серьезные проблемы при коммитах, то сейчас я очень редко сталкиваюсь со сложными случаями. Чем чаще делаешь слияния, чем проще они проходят. Возможно, поэтому я до сих пор не выучил 100500 опций для работы с командной строкой. Для меня это просто инструмент, который помогает в моей основной работе с кодом, не более. В общем, лучший способ изучить Git, вероятно, заключается в том, чтобы просто делать простые вещи и даже не смотреть на другие вещи до тех пор, пока ты не будешь уверенным в отношении основ22. (c) Линус Торвальдс

Начни использовать Git по-простому, а там видно будет.

Контрольные вопросы: 1. Как расшифровывается Git? 2. Что такое репозиторий? 22

Оригинал Jennifer Cloer, Lunix.com. Перевод @piva (habr.com)

128

Евгений Павлов. Знакомьтесь, Python

3. Что такое коммит? 4. Для чего нужен gitignore? 5. Зачем нужны отдельные ветки? Если ответил на все вопросы, получай достижение #GitQuiz

В сухом остатке: 1. 2. 3. 4. 5.

Git, GitHub, OctoCat, Mona Lisa Git, SourceTree Repository, Branch, Commit gitignore GitFlic.ru

FAQ: ГЛАВНЫЙ СЕКРЕТ ПРОГРАММИРОВАНИЯ...

ФОРМУЛИРОВАТЬ МЫСЛИ. ДЕКОМПОЗИЦИЯ. СВЕРХУ ВНИЗ

Как достичь мастерства

Г

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

Индейская поговорка.

132

Евгений Павлов. Знакомьтесь, Python

Какие предметы в школе самые полезные для программиста? Многие думают, что это математика. И в программировании, и в математике есть цифры. Наверное, умение работать с цифрой должно обязательно помочь. Конечно, склонность к точным наукам — очень полезная вещь. С возрастом ты начнешь работать с заказчиками и цифры тебе в этом никак не помогут. Большую часть времени ты будешь занимаешься созданием интерфейсов, чтобы пользователи могли заниматься вычислениями без твоей помощи. Какая ирония! Увы, математика — не самый полезный предмет в школе для программиста. Кстати, вычислениями занимаются аналитики. Аналитикам действительно требуется математика и навыки презентации. Плох тот математик, который не сможет объяснить результаты своих вычислений тем, кто в математике не разбирается. Я считаю, что три самых полезных школьных предмета для будущих программистов: физика, литература, английский.

Декомпозиция Физика — это первый предмет, который поможет в подготовке ума для программирования. Как и программисту, физику нужно изучить явление, разложить его на законы и посчитать. Именно физика развивает навык декомпозиции (когда сложное явление раскладывается на более простые части). До тех пор, пока каждая из частей не будет достаточно простой для моделирования и расчетов, чтобы объяснить ее и воспроизвести. Или предсказать.

FAQ: Главный секрет программирования...

133

Художник работает с композицией предметов на картине, когда составляет из нескольких простых объектов композицию. Взаимодействие предметов между друг другом создает новые свойства картины в целом, делая ее сложнее и глубже для наблюдателя. Вот 11 человечков на зеленом лугу. А вот футбольная команда из 11 игроков играет матч с другой командой на стадионе. Чувствуешь разницу? Это как взорвать ледяной айсберг, чтобы пройти сквозь ледяное крошево!

Программист действует наоборот. Раскладывает сложный объект на подсистемы. Например, продуктовый магазин состоит из камеры хранения, склада, торгового зала и кассы для оплаты покупок. А еще он состоит из покупателей, продавцов, грузчиков, кассиров и директора. Сложную систему можно разложить множеством разных способов на подсистемы. Выбирать один из этих способов — настоящее искусство. Искусство программирования. Как декомпозировать? Попробую показать на примере создания приложения для управления задачами (Task Manager). Задача по управлению задачами?! Попахивает рекурсией. Рамки применения? Сначала выясни контекст. Какие у тебя входные данные могут быть? Что нужно получить в итоге? Не ленись и выясняй на берегу как можно больше. Для начала, определимся с общей целью такого приложения: я хочу создать приложение, которое позволит пользователям: 1. создавать новую задачу; 2. смотреть список созданных задач;

134

Евгений Павлов. Знакомьтесь, Python

3. редактировать или менять задачу; 4. удалять задачи. Поиск аналогий — есть ли задачи, аналогичные твоей? В чем у вас отличие? Какие решения применяются там и сможем ли мы использовать что-то похожее? Раньше я записывал свои задачи в блокнот, поэтому интерфейс Task Manager должен напоминать блокнот. Я могу вспомнить как именно пользовался блокнотом и выполнить те же действия в своей новой программе. Сверху вниз — сначала напиши верхний уровень, пропиши заглушки для вызовов низкоуровневых объектов или функций. Главная ошибка новичков — бросать на полпути верхнеуровневое описание и углубляться в детализацию самого интересного для него аспекта. Давай попробуем расписать подробнее: 1. Создать интерфейс пользователя: — Экран входа в приложение. — Экран списка задач. — Экран создания новой задачи. — Экран редактирования задачи. — Экран просмотра деталей задачи. 2. Создать функциональность приложения: — Добавление новой задачи. — Изменение задачи. — Удаление задачи. — Просмотр деталей задачи (этот пункт я выкину). — Отметить, что задача выполнена. 3. Создать базу данных для хранения задач: — Создать таблицу задач. — Добавить поля:

FAQ: Главный секрет программирования...

135

Название Name Подробное описание Description Статус (нужен, и как я сразу не догадался?) Status Дата создания (или дата начала выполнения?) Created (StartDate) Дата выполнения (смогу посчитать время выполнения) CompletionDate 4. Создать логику приложения: — Класс для работы с базой данных (Model). — Класс для работы с задачами (View). — Класс для работы с пользователем (Controller). Проверь полноту — Прежде чем спускаться на уровень ниже, проверяй что полностью описал текущий уровень абстракции. Поначалу сложно различать к какому уровню относится та или иная функция. Навык приходит с практикой. Как я смогу понять, что мое приложение делает достаточно, чтобы я мог управлять с его помощью своими задачами? Вот несколько сценариев использования программы (User Journey). Надо проверить, что запланированного функционала будет достаточно для этих сценариев. 1. Создание новой задачи: — Пользователь открывает приложение Task Manager. — Пользователь нажимает кнопку «Добавить задачу». — Пользователь вводит название, описание и дату выполнения задачи. — Пользователь нажимает кнопку «Сохранить». — Новая задача сохраняется в базе данных приложения. 2. Просмотр списка задач: — Пользователь открывает приложение Task Manager. — Пользователь видит список задач, которые он уже создал.

136

Евгений Павлов. Знакомьтесь, Python

— Пользователь может отсортировать задачи по дате выполнения или по названию. — Пользователь может нажать на задачу, чтобы открыть ее для просмотра или редактирования. 3. Редактирование задачи: — Пользователь открывает приложение Task Manager. — Пользователь выбирает задачу, которую он хочет отредактировать. — Пользователь открывает задачу для редактирования. — Пользователь изменяет название, описание или дату выполнения задачи. — Пользователь нажимает кнопку «Сохранить». — Измененная задача сохраняется в базе данных приложения. 4. Удаление задачи: — Пользователь открывает приложение Task Manager. — Пользователь выбирает задачу, которую он хочет удалить. — Пользователь нажимает кнопку «Удалить». — Приложение запрашивает подтверждение удаления задачи. — Пользователь подтверждает удаление задачи. — Задача удаляется из базы данных приложения.

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

FAQ: Главный секрет программирования...

137

Дело в том, что программист часто меняет свое намерение, а беда в том, что со временем количество переменных функций и модулей растет, а вот количество имен, которые программист может придумать — остается прежним. Сначала у тебя есть одно дерево, поэтому ты называешь его Дерево. Потом их становится три: Дуб, Сосна и Береза. Пока ничего сложного, да? Я продолжу. Теперь у тебя есть Саженцы, Обычные деревья и Деревья для лесозаготовки. Немного поднапрягшись, ты придумаешь имена и для этих деревьев. Но я и не подумаю останавливаться. Теперь нам нужно различать среди деревьев для лесозаготовки, те что еще растут, уже срублены, уже готовые для транспортировки и пеньки, которые надо выкорчевать. Метафора сложновата, но ты уловил суть. Как бы ты ни старался придумывать имена, ты упрешься в свой словарный запас и начнешь придумывать новые названия. Ты будешь мучаться с недостаточным различием в терминах или, наоборот, слишком недостаточной похожестью. Если тебе не удастся придумать хорошее название для своей функции или переменной, ты не будешь понимать, какую роль она играет в твоей программе; как с ней работать и какие сложности могут возникнуть. Иными словами, плохое название переменной — плохое понимание кода. Основная проблема этой главы в том, что очень сложно придумать пример, чтобы ты увидел сложность в названиях. Ведь чтобы описать ситуацию, я уже придумал названия, а ситуации, в которых названия нельзя придумать — невозможно описать! Дон Хуан говорил нам, что человеческие существа разделены надвое. Правая сторона, которую он называл то-

138

Евгений Павлов. Знакомьтесь, Python

наль, схватывает все, что может воспринимать интеллект. Левая сторона — нагваль, — царство, черты которого неописуемы, мир, который невозможно заключить в слова.24

Теперь, когда мне удалось навести тень на плетень и окончательно тебя запутать, я попробую дать несколько правил, которые выработал для себя за все годы программирования (Name Convention). Это те самые правила, которые помогают немного уменьшить путаницу в понимании кода. Секреты мастерства, про которые я говорил в начале этой главы. Имена для классов, таблиц, структур и объектов. 1. Имя таблицы всегда называть в единственном числе: Attribute вместо Attributes. Это позволит избежать путаницы в дальнейшем, поскольку в коде (IDataRecord/IDataRecord) работа всегда идет с одной строкой таблицы. В целом, нагружать имена классов/переменных склонениями — путь к множеству ошибок/опечаток в коде. 2. Избегать слов Class, Object, Record, Entity. Такие имена будут сильно путать между предметной областью и терминами архитектуры. 3. Порядок слов должен быть таким, чтобы первым шло слово, объединяющее в группу с наследниками/предками/ свойствами объекта: EntityAttribute вместо AttributeEntity. Группировка по атрибутам не нужна для понимания декомпозиции сущностей. 4.

Иерархия абстракций: a. Вещь (шахта игрока) — Item

24 «Дар Орла. Огонь изнутри» Кастанеда Карлос Сезар Арана, 1993. Издательство «София».

FAQ: Главный секрет программирования...

139

b. Тип вещи (шахта) — ItemType c. Категория типов (здания) — ItemTypeCategory 5. Иерархия свойств: a. Временное изменение (бустер) — AttributeTemporary b. Свойство (значение для шахты игрока) — Attribute c. Типовое значение (значение для шахты) — AttributeDefault d. Базовое значение (если оно не определенно для этого типа вещей) — AtttributeUnassigned 6.

Иерархия ссылочности: a. Дом — House b. Свойство Дома — HouseAttribute c. Тип свойства Дома — HouseAttributeType d. Свойство Типа дома — HouseTypeAttribute e. Тип свойства для Типа дома — HouseTypeAttributeType (для полноты всех комбинаций)

7. Я провел небольшое исследование насчет property vs attribute: a. Атрибут фокусируется на том есть он, или его нет (подчиненная таблица со списком свойств). b. Свойство фокусируется на количестве/качестве (поля таблицы). 8.

Имена объектов: a. Имена классов — существительные с большой буквы: House b. Имена переменных — существительные с маленькой буквы: currentHouse c. Свойства (property get/set) — существительные с большой буквы: currentHouse.Name d. Имена функций — глагол с большой буквы: BuildHouse ()

140

Евгений Павлов. Знакомьтесь, Python

e. Имена таблиц — существительные с большой буквы: foreach (House house on HouseTable) f. Имена полей в таблица — существительные с маленькой буквы: select name from AW.dbo.HouseType

Комментарии в коде Второй школьный предмет, который помогает программисту — это литература. Чем больше школьных сочинений ты написал, тем легче тебе выразить свою мысль: структурировать, разложить по полочкам, аргументировать, презентовать. Умение рассказывать истории невозможно переоценить. Если ты сможешь понятно рассказать, как именно работает алгоритм, ты сможешь написать программу для его реализации. БОльшую часть времени программист тратит на чтение своего кода, а не на его написание. Большая часть — это 90%. Я серьезно. К сожалению, большинство даже не могут осознать или заметить этого. Чем проще читается код, тем больше времени и сил ты сэкономишь при его разработке. Тем легче ты находишь в нем ошибки и несоответствия. Дисциплина в именовании, оформлении и документации — пожалуй, главный секрет мастерства. Каждый раз, когда я слышу, что хороший код не нуждается в комментировании — я прекращаю спорить с этим человеком и интересоваться его мнением по поводу про-

FAQ: Главный секрет программирования...

141

граммирования. Между нами всегда будет стена непонимания. Я не смогу объяснить ему необходимость документировать код. Он никогда не осознает, что тут вообще может быть какая-то проблема. Это очень печально. Надеюсь достучаться до тебя, читатель, убедить в важности этих секретов. Принять их и научиться их практиковать. Как комментировать? Свободное письмо. Избавься от паралича и страха написать что-то не то. Открою тайну: комментарии кроме тебя никто не читает. Все, что ты написал в коде, скорее всего никто и никогда не прочтет. Это останется между тобою и компилятором. И октокошкой. Лиза умеет хранить тайны. Напиши пару матерных комментариев (это весело!), практикуй свободное письмо. В психологии есть такая техника: просто механически записывай все приходящие в голову мысли. Помогает найти неординарные решения. История переписки. Бережно сохраняй каждую букву, которую коллега обронил по поводу твоей задачи. Код — это, пожалуй, самое надежное место для хранения документации. Даже самые большие комментарии легко сворачиваются в редакторе и не мешают чтению основной программы. Ответы на вопросы. Каждый раз, когда ты потратил пару минут на то, чтобы разобраться, что именно делает этот кусок кода, где инициируется эта переменная и кто вызывает вон ту функцию — запиши все, что узнал. Это не последний раз, когда ты будешь возвращаться к этому коду и пытаться понять, что тут происходит.

142

Евгений Павлов. Знакомьтесь, Python

Тестовые данные. Любые данные или заглушки, которые ты использовал при тестировании, например, вызов внешнего API с тестовыми параметрами или подключение к тестовой базе данных, сохраняй в чулане (BackLog) комментариев. Исходники все стерпят. В крайнем случае сотрешь или воспользуешься, спустя год, когда вновь потребуется отлаживать этот участок. ToDo. все редакторы понимают и выделяют особым цветом эту комбинацию букв и все, что за ней следует. Тут есть секрет: если ты умеешь писать заметки “позже разберусь с этим”, у тебя не будет проблем с рефакторингом. Достаточно просто пройтись по списку todo в коде. Как оказалось, главные усилия по рефакторингу — это понять, что именно надо исправлять. А у тебя уже написано! Второй момент: как только ты написал проблему — ее можно выкинуть из головы до лучших времен. И сосредоточиться на текущей задаче. Это важная часть дисциплины тайм-менеджмента. Ты всегда будешь писать несовершенный код и всегда тебе будут приходить мысли, как его можно улучшить. Это болезнь перфекционизма знакома многим хорошим специалистам. Мастер умеет писать прототип быстро, используя временное решение, чтобы проверить будет ли работать то, как это нужно заказчику. В 80% случаев второго подхода не потребуется. Мы постоянно пишем временные решения, чтобы проверить гипотезу, а, не подтвердив ее, выбрасываем написанное. Фокус в том, чтобы экономить силы при написании временных решений. Фиксируя недостатки, ограничения и улучшения в ToDo комментариях

FAQ: Главный секрет программирования...

143

Quick Sort Однажды я написал авторский курс “Основы программирования на Си”, после чего пару лет вел семинары по этому курсу в ИТМО для абитуриентов. Я был молод и идеалистичен, поэтому решил, что основы программирования — это про корни программирования. Чтобы вернуться к корням Си — лучший язык! Язык роботов и промышленных стандартов, требующий хорошего понимания работы с низкоуровневыми ресурсами, вроде файлов, памяти или стека вызова. Когда-то я читал? что студентам тяжело дается понимание работы с памятью. Ерунда! Ребята вполне справлялись с массивами и однонаправленными списками из указателей. Сложности начинались при разборе работы стека вызовов, стековых объектов и как параметры превращаются аргументы функции (параметр — снаружи, аргумент — внутри). Вот тут — бабах! Мозг начинает закипать. Но самое крутой семинар из всего курса был посвящен не этому. Нет, сэр! Самый главный семинар был посвящен названиям функций и переменных на примере алгоритма быстрой сортировки. Происходило вот что: Я рассказывал про алгоритм быстрой сортировки, на всякий случай мы смотрели описание алгоритма в Википедии. Там есть хорошая анимация, как все происходит. Quick Sort: 1. выбираем посередине массива опорный элемент; 2. перебираем все элементы из массива; 3. если элемент меньше опорного — отправляем налево, если больше — направо;

144

Евгений Павлов. Знакомьтесь, Python

4. рекурсивно повторяем весь алгоритм: отдельно для правой и отдельно для левой части массива. Затем мы начинали разбирать этот алгоритм сверху вниз. От общего к деталям, от этапов алгоритма к конкретным операциям. Ребята по очереди выходили к доске, каждый придумывал название для функции или переменной, с которой эта функция работает. Пока кто-то мучился у доски, остальные сидели в безопасности и помогали ему советами, чтобы потом советчик сам оказался у доски и сам на себе почувствовал муки выбора. Это весело! Местами даже забавнее, чем игра в крокодила. Главная цель — сделать так, чтобы название отражало смысл происходящего. Когда ты сортируешь переменные A и B — это как на ощупь в темноте лепить пельмени. Но когда ты работаешь с headSortedList и tailSortedList — переменные обретают смысл. — Как понять, что ты влюбился? — Все непонятные песни обретают смысл25.

Примерно час требовался, чтобы разобрать алгоритм Хоара (quick sort) по косточкам. Подыскать названия для всех действий и всех переменных. В конце у нас получался алгоритм, записанный синим фломастером на белой доске. Правда, он был без единой команды на Си. Одни названия операций. После этого я давал команду “По машинам!”. Происходило чудо. За все эти годы ни один студент не задал ни одного вопроса “Че писать?”. Магия названий в действии! 25

Сериал «Касл», 2009-2016, Эндрю В. Марлоу.

FAQ: Главный секрет программирования...

145

Упражнение по декомпозиции: 1. выбери проект для декомпозиции: супермаркет или пиццерию; 2. выдели уровни абстракции для своего проекта; 3. распиши полный список объектов (классов) для каждого уровня; 4. придумай английские названия для каждого объекта, по вышесказанным правилам; 5. напиши техническое задание для программиста, который будет реализовывать твой проект; 6. опиши тесты, с помощью которых ты будешь проверять, что проект правильно работает. Если написал документ, содержащий все эти пункты, то получаешь достижение #Deconstruction.

В сухом остатке: 1. 2. 3. 4.

Декомпозиция: Рамки, Аналоги, Иерархия, Тесты Name Convention, иерархия имен Комментарии и документация todo заметки и рефакторинг

LINUX: КОНСОЛЬ, КОМАНДЫ, ЗАДАЧИ... УГОЛОК АДМИНА

Пингвин Такс

T

ux (Такс, сокращ. от английского tuxedo — смокинг, Torvalds UniX — Юникс Линуса Торвальдса) — официальный талисман (или маскот) Linux, созданный

в 1996 году Ларри Юингом. Это пухлый пингвин, выглядящий сытым и довольным. Идею использовать пингвина в качестве талисмана Linux выдвинул создатель этого ядра Линус Торвальдс. На рабочих машинах стоит Windows, на телефонах Android, на серверах Linux. Расскажу, как быстро создать Linux сервер для экспериментов. Вместе с тем, мы немного поэкспериментируем с удаленным терминалом (поиграем с пингвином Таксом). В половине вакансий пишут о необходимости работы с Linux. От тебя не требуется быть крутым администратором Линукса, но пару команд знать нужно, чтобы не бояться консоли. И, когда потребуется, разобраться в ней. Дружить с пингвином Таксом — полезно!

148

Евгений Павлов. Знакомьтесь, Python

VPS на Linux Самый простой способ — это арендовать выделенный сервер (Virtual Private Server). Для наших экспериментов нужна минимальная конфигурация на минимальный срок (месяц). Стоит — копейки, ищется в поисковике по ключевым словам: VPS linux. Важно! Не пытайся найти бесплатный VPS — большинство окажется мошенниками. Проще немного заплатить и спокойно работать. Если оплата будет по карте — не забудь закрыть подписку, чтобы не списался за следующий месяц. Все, кто арендовал свой сервер, получают достижение #PythonVPS. Например, для этой книги я купил сервер на adminvps. ru. Хостинг в России Promo стоил мне 119 рублей x 2 месяца. Оплачивал я через QR код, поэтому карточку нигде не светил и подписку не оформлял. После того, как ты арендовал сервер, нужно понять, как к нему подключиться по ssh. Видимо, у тебя будет root пароль и адрес твоего VPS сервера. Для подключения тебе понадобится клиент для SSH, например, MobaXterm. Скачай с официального сайта бесплатную Home версию. Установи и запусти. Добавь новую SSH сессию, укажи сервер, логин и пароль. Подключайся!

Linux: Консоль, Команды, Задачи...

149

Работать под администратором — дурной тон, поэтому сразу создай тестового пользователя firstpython для экспериментов.

# adduser firstpython Adding user `firstpython’ … Adding new group `firstpython’ (1001) … Adding new user `firstpython’ (1001) with group `firstpython’ … Creating home directory `/home/firstpython’ … Copying files from `/etc/skel’ … New password: Вводи пароль для нашего пользователя.

New password: Retype new password: passwd: password updated successfully Changing the user information for secondpython Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Вместо всяких имен и телефонов просто нажимай [Enter]. В конце нажми [Y]. Все! Новый пользователь создан. Выходи из-под рута. # exit

150

Евгений Павлов. Знакомьтесь, Python

И подключайся уже под новым пользователем firstpython. Начнем знакомиться с Linux.

Работа с файлами Классно, что у тебя есть свой сервер! Даже если что-то пойдет не так — ты точно ничего не сломаешь. Можно смело экспериментировать в этой песочнице. Но при этом у тебя есть права администратора и ты можешь немножко покомандовать собственным сервером. Давай немного оглядимся вокруг: login as: firstpython [email protected]’s password: Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-121-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage New release ‘22.04.2 LTS’ available. Run ‘do-release-upgrade’ to upgrade to it. Last login: Sun Apr 9 20:28:06 2023 from 62.217.189.231 Сейчас я нахожусь на сервере Ubuntu (одна из версий Linux) под пользователем firstpython. Возможно, твое сообщение при входе на сервер выглядит иначе.

Linux: Консоль, Команды, Задачи...

151

Давай посмотрим в какой директории ты находишься. pwd — present working directory. $ pwd /home/firstpython Это домашняя директория для этого пользователя. Стартовая локация, прямо как в MMO RPG (Massively Multiplayer Online Role-Playing Game). Давай прогуляемся на уровень выше при помощи команды cd — change directory Напомню, что одна точка — текущая директория, а две точки — директория выше. $ cd.. firstpython@firstpython:/home$ Теперь ты в директории, где находятся стартовые локации всех игроков этого сервера. Ой! В смысле пользователей. Мы тут серьезными вещами занимаемся, никаких игр. Давай выведем список этих директорий ls — list $ ls firstpython sammy firstpython@firstpython:/home$ Если запустить ls с ключом help — получим список всех возможных ключей. Например, есть ключ l (long) с более

152

Евгений Павлов. Знакомьтесь, Python

подробным описанием файлов. Чтобы придать вес нашим исследованиям. $ ls -l total 8 drwxr-xr-x 4 firstpython firstpython 4096 Apr 9 20:55 firstpython drwxr-xr-x 2 sammy sammy 4096 Mar 26 19:46 sammy Что такое total — я не знаю, хотя и пытался погуглить, но ничего не понял (возможно ты, читатель, окажешься умнее автора и сумеешь разобраться в загадке total. А мы продолжаем). Теперь я хочу создать файл со списком всех файлов, чтобы немного поиграться с его выводом. Файл создать очень просто: достаточно отправить вывод команды в файл, вместо консоли при помощи символа ‘>’. Одинарный — обнуление или создание нового файла. Двойной — создание нового или дописывание в старый. $ cd. / firstpython/ Не забывай использовать волшебную табуляцию, которая дописывает за тобой. Достаточно написать первые пару символов и жамкнуть [Tab], чтобы дружелюбный linux дописал за тебя остальное. У Linux дружелюбный интерфейс. Но друзей он выбирает очень тщательно. $ ls -al > list.txt

Linux: Консоль, Команды, Задачи...

153

Хорошо! Теперь у нас есть файл со список файлов (пакет для пакетов). Давай выведем его содержимое при помощи cat — concatenate (печать всех строк): $ cat list.txt total 40 drwxr-xr-x 4 firstpython firstpython 4096 Apr 10 19:20. drwxr-xr-x 4 root root 4096 Apr 6 17:34.. -rw———- 1 firstpython firstpython 877 Apr 9 21:35.bash_ history -rw-r — r— 1 firstpython firstpython 220 Mar 26 19:47.bash_ logout -rw-r — r— 1 firstpython firstpython 3771 Mar 26 19:47. bashrc drwx——— 2 firstpython firstpython 4096 Apr 6 17:29.cache -rw-rw-r— 1 firstpython firstpython 32 Apr 9 21:23 date.log drwxrwxr-x 3 firstpython firstpython 4096 Apr 9 20:45.local -rw-rw-r— 1 firstpython firstpython 0 Apr 10 19:20 ls.txt -rw-r — r— 1 firstpython firstpython 807 Mar 26 19:47.profile -rw-rw-r— 1 firstpython firstpython 66 Apr 9 20:45.selected_ editor -rw-r — r— 1 firstpython firstpython 0 Apr 9 20:18.sudo_as_ admin_successful Вау! Как много файлов. Заклинание слева — это права доступа к файлам Directory, Read, Write, eXecute: директория, чтение, запись, исполнение. Права на файл указываются для владельца, его группы и всех остальных (owner, group, all). Давай выведем первые 3 строчки: $ head -n 3 list.txt

154

Евгений Павлов. Знакомьтесь, Python

total 40 drwxr-xr-x 4 firstpython firstpython 4096 Apr 10 19:21. drwxr-xr-x 4 root root 4096 Apr 6 17:34.. А теперь, наоборот, последние 3 строчки из файла: $ tail -n 3 list.txt -rw-r — r— 1 firstpython firstpython 807 Mar 26 19:47.profile -rw-rw-r— 1 firstpython firstpython 66 Apr 9 20:45.selected_ editor -rw-r — r— 1 firstpython firstpython 0 Apr 9 20:18.sudo_as_ admin_successful Но настоящая магия начинается когда ты применяешь grep — поиск и печать в потоке вывода (search Globally for lines matching the Regular Expression, and Print them). Снова распечатай содержимое файла, но теперь при помощи символа ‘|’ (вертикальная черта) перенаправим вывод одной команды (cat) на ввод другой (grep), а командой grep вытащим все строчки с правами только на чтение (r, read) для группы и остальных пользователей. $ cat list.txt | grep r — r– -rw-r — r— 1 firstpython firstpython 220 Mar 26 19:47.bash_ logout -rw-r — r— 1 firstpython firstpython 3771 Mar 26 19:47. bashrc -rw-r — r— 1 firstpython firstpython 807 Mar 26 19:47.profile -rw-r — r— 1 firstpython firstpython 0 Apr 9 20:18.sudo_as_ admin_successful

Linux: Консоль, Команды, Задачи...

155

grep — очень полезная команда, помогает надергать из длинного списка только нужные нам строчки. И, наконец, последнее на сегодня — mkdir (make directory): создать директорию: $ mkdir my_new_dir Переместим туда наш файл: mv — (move) переместить файл $ mv list.txt./my_new_dir/list2.txt $ ls./my_new_dir list2.txt $ ls cat date.log my_new_dir Наш файл сменил имя и переехал в новую директорию, скопируем его обратно: cp — (copy) скопировать файл. $ cp./my_new_dir/list2.txt list.txt $ ls cat date.log list.txt my_new_dir Теперь у нас два файла, поэтому удалим лишний (тот, который находится в директории). Rm — (remove) удалить файл. Но его не просто удалим, а удалим директо-

156

Евгений Павлов. Знакомьтесь, Python

рию со всем ее содержимым. Для этого надо указать ключ -r recursive $ rm -r./my_new_dir/ $ ls cat date.log list.txt Ты создал директорию, переместил в нее файл, потом скопировал его обратно и удалил директорию со всем ее содержимым. Будто ничего и не было! На сегодня все. Это стартовый набор команд для новичка, с его помощью ты сможешь ходить по разным локациям и убивать монстров. В смысле, работать с файлами. Работать, не играть! Закрой консоль, а затем и ноутбук, чтобы пингвин не вырвался в нашу реальность. Встань, пройдись, сделай небольшую зарядку. Ты отлично поработал сегодня. Время подкрепиться и пойти погулять. Увидимся позже!

Планировщик задач Cron Мы пишем скрипты на Питоне для выполнения на linux серверах. Есть несколько способов запустить скрипт на сервере:

Linux: Консоль, Команды, Задачи...

1. 2. 3.

157

запустить вручную из консоли; через api http; по расписанию через crontab.

Давай разберемся как запускать chrontab (от греческого хронос — время). Открой новую сессию под firstpython: $ cron cron: can’t open or create /var/run/crond.pid: Permission denied Иными словами, у обычного пользователя не хватает прав, чтобы быть админом) Для выполнения команд, требующих прав администратора, используют команду sudo (Substitute User and DO). Чтобы выдать права, перезайдем под админом и добавим нашему пользователю прав: $ sudo adduser firstpython … $ sudo adduser firstpython sudo … $ id firstpython uid=1001 (firstpython) gid=1001 (firstpython) groups=1001 (firstpython),0 (root),27 (sudo) Теперь можно логинится через firstpython и заходить под sudo:

158

Евгений Павлов. Знакомьтесь, Python

$ sudo cron cron: can’t lock /var/run/crond.pid, otherpid may be 301: Resource temporarily unavailable Немного погуглив, я нашел указание: cron — это демон, он работает в фоновом режиме. Он стартует при загрузке ОС и специально его запускать не нужно. Вообще демонами управляют так: sudo service cron status sudo service cron start sudo service cron stop sudo service cron restart Давай посмотрим его статус: $ sudo service cron status cron.service — Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2023—04—06 17:22:19 BST; 3 days ago Docs: man: cron (8) Main PID: 301 (cron) Tasks: 1 (limit: 1102) Memory: 7.1M CGroup: /system.slice/cron.service 301 /usr/sbin/cron -f Хорошо, мы выяснили, что у нас есть запущенный демон (фоновый процесс) cron.

Linux: Консоль, Команды, Задачи...

159

Давай теперь разберемся со списком заданий для этого демона. Мы создадим простую задачку, которая записывает в файл логов текущее время. $ date Sun 09 Apr 2023 08:54:53 PM BST Сейчас эта команда выводит дату на экран. Чтобы записать в файл, перенаправляем стандартный поток stdout в файл. Будем дописывать в конец, а не обнулять каждый раз заново, поэтому два символа ‘>>’, вместо одного ‘>’ $ date >> date.log Теперь дата вместо консоли пишется в файл. Запусти команду второй раз. Теперь давай посмотрим, что туда уже записалось: $ cat date.log Sun 09 Apr 2023 08:55:12 PM BST Sun 09 Apr 2023 09:01:03 PM BST Отлично! Теперь у нас есть тестовая задача для нашего планировщика. Откроем конфигурационный файл: $ sudo crontab -e no crontab for root — using an empty one

160

Евгений Павлов. Знакомьтесь, Python

Select an editor. To change later, run ‘select-editor’. 1. /bin/nano > /home/firstpython/date.log

Или можешь поставить выполнение каждые 5 минут: */5 **** Сохрани изменения:

Ctrl + S

Выходи из редактора:

Ctrl + X

Подожди одну минуту и смотри результат в твоем файле логов:

$ cat /home/firstpython/date.log Sun 09 Apr 2023 08:55:12 PM BST Sun 09 Apr 2023 09:01:03 PM BST Sun 09 Apr 2023 09:15:01 PM BST

162

Евгений Павлов. Знакомьтесь, Python

Ура! Появилась третья строчка! А вскоре появится и 4-ая. Если тебе удалось получить такие же строчки на твоем сервере, ты получаешь ачивку #CronTab. Чтобы не переполнить диск мусором, останавливай нашу команду в cron — закомментируй свою строку: $ sudo crontab -e # */1 * * * * date >> /home/firstpython/date.log Ctrl+S Ctrl+X Сейчас в твоем логе многовато строчек, поэтому обнули его: $ date > /home/firstpython/date.log $ cat /home/firstpython/date.log Sun 09 Apr 2023 09:23:11 PM BST Победа! Наконец-то этот урок закончился. Сегодня ты добавил права для своего пользователя, затем добавил задачу в планировщик, которая пишет свое время каждую минуту. Более того, ты проверил, что задача действительно запускалась. Это хорошая работа, для знакомства с Linux!

Linux: Консоль, Команды, Задачи...

163

Полезные лайфхаки. Чтобы скопировать текст в консоли: 1. выдели текст, который надо скопировать и щелкни правой кнопкой мыши для его вставки (работает в Putty и других SSH-клиентах для Windows); 2. выдели текст, который надо скопировать и щелкни центральной кнопкой мыши (колесом прокрутки) для того, чтобы его вставить; 3. используйте комбинации клавиш Ctrl + Shift + C для копирования и Ctrl + Shift + V для вставки (у меня работает Ctlr+C и Ctrl+V). Ctrl-L. Очищает терминал. Ctrl + C. Нажми, если нужно остановить команду, которая выполняется прямо сейчас на переднем плане (не в фоновом режиме). Иногда помогает ввод quit в консоли. Но и это не всегда будет работать. Чтобы завершить консоль Питона, нажми Ctrl+D. У Питона свой дзен. Самый правильный способ прервать выполнение — это sys.exit (shota), потому что скрипт может быть многопоточным, а обрывать потоки в неизвестном месте — очень плохая идея. Из SSH, если хост завис и не реагирует на ввод: ~. (тильда точка). Если совсем точно, то [Enter] ~. Если в момент пропадания связи набирал символы, то без [Enter] не выйдет. Если подключился по SSH, а оттуда ещё по SSH и надо завершить вложенный SSH, то надо вводить ~~. $ command_1 –help. Вызывает справку для команды Linux. Практически все средства командной строки содержат справочную информацию, раскрывающую особенности их использования. Чтение справки поможет разобраться

164

Евгений Павлов. Знакомьтесь, Python

с основами этой команды. Кроме того, есть еще и документация: $ man command_1 $ cd — переход в предыдущую рабочую директорию. $ cd ~ переход в домашнюю директорию пользователя. ~ без имени пользователя = текущий пользователь. А вот cd ~user1 — зайти в домашнюю папку user1, например, /home/user1 (или что у него прописано в /etc/passwd). $ command_1; command_2; command_3. Выполнение команд в одной строке. Просто пиши их через точку с запятой, а потом выполняй последовательно. Чтобы запустить в фоне — добавь & в конце строки. $ command_1 && command_2. Command_2 будет выполняться только если command_1 завершит свою работу без ошибок. $ tail -f path_to_Log — когда нужно читать логи, которые прямо сейчас пополняются. $ tail -f path_to_log | grep search_term. Используй grep, чтобы показывать появление только нужных строчек в логе. $ mkdir my_new_dir $ cd!$ Создаем директорию, а потом переходим в неё, используя!$ — последний параметр предыдущей команды. Директорию может проще будет подобрать, используя tab, а вот какой-нибудь хитрый параметр или длинный ключ будет

Linux: Консоль, Команды, Задачи...

165

очень удобно повторить, используя всего два символа. Еще можно нажать Alt +. (точка). $ > filename — очистит содержимое файла без удаления самого файла.

Линус Торвальдс Один из самых крутых программистов нашего времени — финский швед Линус Торвальдс из города Хельсинки. Создатель Linux — операционной системы с открытым исходным кодом. Под Linux работает треть всех серверов в мире. Остальные две трети — это Unix и что-то неизвестное. Программное обеспечение — как секс: лучше, когда бесплатно26.

Немногие хоть что-то знают про этого программиста, он не очень много выступает. Никак не рекламирует себя. Но именно этот программист создал систему, которая выросла от 10 тысяч строк кода в 1991 до 30 миллионов в 2022 году. У него отличное чувство юмора — это одно из проявлений острого ума. Этот парень очень, очень умный! Сейчас его основная работа — это принимать запросы на добавление кода в репозиторий. Много, очень много запросов. На GitHub лежит репозиторий ядра Linux, где каждый может посмотреть этот гигантский проект с 30-летней 26

Линус Торвальдс на конференции Free Softwere Foundation, 1996.

166

Евгений Павлов. Знакомьтесь, Python

историей. Там же можно посмотреть статистику по работе Линуса. Он чудовищно продуктивен. Talk is cheap. Show me the code.

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

Задания и Примеры: 1. создай папку в своей домашней директории; 2. создай файл в своей домашней директории; 3. открой файл в редакторе, напиши пару слов и сохрани его; 4. распечатай список процессов на экране консоли.

В сухом остатке: 1. 2. 3. 4. 5. 6. 7.

VPS — Virtual Private Server SSH — Secure Shell drwx — Directory, Read, Write, eXecute stdin — Standard Input stdout — Standard Output sudo — Substitute User and DO cron — планировщик запуска задач для Linux

DEBUG: ТЕМНАЯ СТОРОНА. В ЛЮБОЙ НЕПОНЯТНОЙ СИТУАЦИИ

Что-то пошло не так

Н

е если, а когда твоя программа сломается, тебе придется ее исправлять. Даже сейчас, когда я пишу эти строки, мне не по себе. Сама мысль о том, что мой “безупречный” код сломается — вызывает стресс. Несмотря на весь мой опыт, не взирая на все мои старания — это все равно происходит! Исключительные ситуации — это рутина нашей профессии. Да! Мощь Джедая из Силы проистекает. Но опасайся тёмной стороны. Гнев, страх, агрессия — тёмная сторона всё это. Быстро они приходят во время битвы к тебе. Ступив однажды на Тёмный путь, навсегда судьбу твою он подчинит27.

Вопрос эмпатии. Ошибки программы вызывает стресс у всех причастных, поэтому так важно сохранять доброжелательность и деликатность в этой стрессовой ситуации. 27 «Звёздные войны: Эпизод 5 — Империя наносит ответный удар», 1980. Ирвин Кершнер.

170

Евгений Павлов. Знакомьтесь, Python

Хорошие люди в плохой ситуации. Вот как надо к этому относиться. Первым делом, воспроизведи проблему. Воспроизведение ошибки — это половина работы по ее исправлению. Бывает, что ошибку не получается повторить, поэтому ее невозможно исправить. Если ошибку не получается зафиксировать, сделай логирование ситуаций, при которых эта ошибка потенциально возникнет. Хороший багрепорт состоит из: 1. при каких обстоятельствах/зависимостях возникает ошибка? 2. как воспроизвести ошибку; 3. что неправильного наблюдаем; 4. что ожидали увидеть (как надо сделать); 5. приоритет исправления ошибки. Постарайся мягко донести до коллег эти пункты или сыграй в Шерлока, добывай их самостоятельно, если автор багрепорта ушел в отказ. Расследование серьезно увеличивает срок исправления ошибки. Стоит донести это до коллег, заинтересованных в ее исправлении. Важный момент: когда к тебе попадает отчет об ошибке, обязательно поблагодари за репорт. Какой бы неприятной ни была эта ошибка, цени усилия, которые приложил твой коллега, чтобы выявить эту ошибку. Никогда не встречай очередной репорт с негативом — это дурной тон. В конце концов, каждая найденная ошибка — это шанс улучшить ваш продукт. Было плохо — станет хорошо! Второе правило — создай задачу в таск трекере. Не пускай на самотек оформление ошибки. Если ты не проследишь — ее позабудут зафиксировать. А встретив второй раз, будут сильно огорчаться. Тебе сообщили про ошибку, а ты ее не исправил! Кроме того, задача в трекере — это ответ

Debug: Темная сторона. В любой непонятной ситуации

171

на вопрос «когда исправите?» Как только исправим — закроем задачу. Главное, что ошибка не потерялась и находится в очереди на исправление. Скорость исправления — это вопрос приоритета. Сначала должны быть сделаны важные задачи, а уже потом остальное. Третье правило — доведи до коллеги, заметившего ошибку результат своей работы по ее исправлению. Пусть это станет доброй традицией: когда тебе сообщают об ошибках — это ошибки исчезают. Если ошибка критическая — останови работу скрипта с ошибкой и устрани последствия его работы. Затем спокойно начинай исправлять. Именно в такой последовательности: останови ошибку, устрани последствия, начинай исправлять. Теперь, когда с внешними формальностями разобрались, давай разберем способы исправления ошибок в коде.

Пошаговая отладка В любой непонятной ситуации — запускай проблемную программу в отладочном режиме. Запусти PyCharm и открой проект FirstPython из предыдущих глав. [Win] Py [Enter] — чтобы найти в Windows редактор PyCharm и запустить его. В верхнем меню PyCharm находим пункт File/Open и выбираем его, чтобы запустить диалоговое окно Open File or Project.

172

Евгений Павлов. Знакомьтесь, Python

Найди папку с нашим проектом FirstPython и открой ее нажав кнопку [OK] Выбери в диалоговом окне Open Project вариант «This Window», чтобы открыть проект в текущем окне, вместо того чтобы запускать вторую копию PyCharm. CheckBox: “Don’t ask again” — не трогай, пусть спрашивает каждый раз для надежности. Давай запустим отладку (Debug) для скрипта lesson2. В панели Project слева выбери файл lesson2.py и открой его. Если нажать Debug — зеленого жука в правом верхнем углу — программа просто выполнится, распечатав уже знакомый тебе результат. Чтобы остановить выполнение программы, добавь Break Point на первой строчке. Просто кликни мышкой чуть правее номера строчки, чтобы появилась красная точка. Или, как настоящий хакер, сделай тоже самое быстрыми клавишами: Ctrl+F8. Снова запускай Debug клавишами Shift+F9. Бинго! Ты попал в режим отладки! Внизу появилась панель Debug. Наверху панели есть маленькие кнопочки с синими стрелочками, наводя на которые можно увидеть их названия: 1. Show Execution Point Alt+F10: вернуться к строчке, которая сейчас выполняется, на случай если заблудился в коде (такое часто случается).

Debug: Темная сторона. В любой непонятной ситуации

173

2. Step Over F8: выполнить одну строчку. Обрати внимание, что если в одной строке программы будет много команд, то они ВСЕ выполнятся. 3. Step Into F7: выполнить подпрограмму. Например, если будет вызов функции, то отладка перейдет внутрь функции на первую ее строчку. 4. Step Into My Code Alt+Shift+F7: выполнить подпрограмму без углубления в чужой код. Часто выполнение убегает в системные функции для которых тоже есть код. Не надо так делать. 5. Step Out Shift+F8: вернуться из подпрограммы. Например, если случайно углубился в вызов чужой библиотеки, именно эта кнопка поможет вернуться обратно вверх по стеку вызова к своей программе. 6. Run to Cursor Alt+F9: выполнить до текущей строчки. Например, когда не хочется выполнять 100500 шагов цикла, наведи курсор на строчку сразу после цикла и нажми эту кнопку, чтобы прокрутить выполнение этой до этой строки. Чуть левее находятся две закладки: 1. Debugger: MainThread — это наш главный поток выполнения, и единственный. 2. Console: уже знакомая нам консоль для вывода StdOut Понажимай пару раз F8, чтобы выполнить первые строчки программы. А как дойдешь до file_descriptor — остановись. file_descriptor = open (r’lesson2.json’, ‘w’, encoding=’utf-16’)

174

Евгений Павлов. Знакомьтесь, Python

Открой вкладку Debugger и увидишь справа кучу переменных, которые успели надобавляться после каждого выполнения строчки с объявлением и инициализацией этой переменной. 1. json_str = {str} ‘{\n «ключ1»: «значение 1»,\n «ключ2»: {\n «ключ21»: «значение 21»,\n «ключ22»: «значение 22»\n},\n «ключ3»: [\n «значение 31»,\n «значение 32»,\n «значение 33»\n] \n}’ 2. main_dic = {dict: 3} {‘ключ1’: ‘значение 1’, ‘ключ2’: {‘ключ21’: ‘значение 21’, ‘ключ22’: ‘значение 22’}, ‘ключ3’: [‘значение 31’, ‘значение 32’, ‘значение 33’]} 3. sample_array = {list: 3} [‘значение 31’, ‘значение 32’, ‘значение 33’] 4. sample_dic = {dict: 2} {‘ключ21’: ‘значение 21’, ‘ключ22’: ‘значение 22’} Эти же значения переменных редактор дописал в конец строчек с их объявлением. Кроме того, если в коде навести курсор мыши на переменную, появится подсказка, в которой будет написано значение этой переменной. Если нажать на переменную правой кнопкой мышки, появится контекстное меню. В контекстном меню найди пункты: 1. Add to Watches — добавить переменную в список наблюдения; 2. Add Inline Watch — добавить в список, который не исчезнет при перезапуске скрипта. Вот так и работает пошаговая отладка: 1. выполняешь программу по шагам; 2. смотришь как меняется значение переменных;

Debug: Темная сторона. В любой непонятной ситуации

175

3. ищешь момент, когда что-то начинает идти не по плану; 4. находишь ошибку; 5. исправляешь найденную ошибку. Довольно кропотливая работа — ползать с отладочной лупой по коду. Это требует много внимания. Настало время прерваться. Встань из-за компьютера, разомнись и погляди в окошко. Возвращайся, как восстановишь силы и будешь готов продолжать.

Логирование Существуют ошибки, которые случаются не постоянно, т. е. возникают время от времени в рандомный момент. Отловить их можно только логированием. Когда твоя программа сломается, ты пойдешь смотреть логи, чтобы выяснить, когда именно и что пошло не так. Давай создадим в нашем проекте PythonFirst новый скрипт lesson4.py Логированием в Питоне занимается модуль logging. Чтобы писать в файл, нам потребуется создать словарь настроек для логирования. За настройки отвечает модуль logging.config. Кроме того, для указания пути к файлу мы будем использовать уже знакомый модуль os.

176

Евгений Павлов. Знакомьтесь, Python

import os import logging.config Переменная со словарем настроек для lesson4 будет выглядеть примерно так:

LOGGING_CFG = { “version”: 1, ‘formatters’: { ‘lesson4_format’: { ‘format’: ‘% (asctime) s [% (levelname) s]% (filename) s:% (lineno) i% (message) s’ }, }, “handlers”: { “lesson4_handle”: { “level”: “INFO”, “class”: “logging.FileHandler”, ‘formatter’: ‘lesson4_format’, “filename”: os.path.join (os.getcwd (), “../ lesson4.log”), }, }, “loggers”: { “lesson4_log”: { “handlers”: [“lesson4_handle”], “level”: “INFO”, }, }, } Тут у нас есть: 1. formatter — формат строчки в файле логов, со всякой дополнительной информацией;

Debug: Темная сторона. В любой непонятной ситуации

177

2. handlers — указатель на объект (файл), куда будут складываться наши логи (и доп. информация из formatter); 3. loggers — настройки нашего лога, куда пишем и какой уровень (NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL). Скрипты у нас находятся в папке rep (эта папка сохраняется в репозитории), поэтому os.getcwd () вернет текущую директорию rep. Чтобы не сохранять в репозитории файл логов, мы сохраним его в директорию проекта, которая находится уровнем выше. Поэтому имя файла указывается как “../lesson4.log”. После объединения файловых путей командой os.path. join получаем: “project/rep” + “../lesson4.log” = “project/lesson4.log” Теперь заливаем все эти настройки в модуль логирования и создаем объект, который будет отвечать за логирование в нашем скрипте.

logging.config.dictConfig (LOGGING_CFG) logger = logging.getLogger (lesson4_log) logger.info (‘test’) И логируем ровно одно сообщение c уровнем INFO для теста при каждом запуске нашего скрипта

logger.info (‘test’) Добавляй в скрипт lesson4.py все строчки указанные курсивом и запускай скрипт.

178

Евгений Павлов. Знакомьтесь, Python

После запуска с корневом каталоге проекта появится файл “lesson4.log” внутри которого будет лежать одна строчка:

2023—06—12 13:39:02,022 [INFO] lesson4.py:29 test Если скрипт запустить несколько раз, то таких строчек будет уже несколько. Теперь у тебя есть логи твоего скрипта, куда ты можешь бросать всякую отладочную информацию, а когда что-то пойдет не так, легко сможешь посмотреть по логам, что именно поломалось. Например, в главе про SQL мы печатали ошибку (Exception) в консоль. Теперь, вместо консоли ошибку можно логировать в файл. Добавь логирование в скрипт с SQL и проверь, что в случае ошибки она сохраняется в нужный скрипт. Думаю, на этом первое знакомство с логированием можно завершить. Пора сделать перерыв, попить водички и сделать зарядку. Переключение на физические действия помогут проветрить голову. Ты хорошо поработал!

Слабое звено Когда программа вообще перестала запускаться, выдавая ошибку, которую непонятно как исправить — попробуй откатиться назад. Открой Git и вернись к предыдущей версии скрипта, когда он еще работал. Давай вернемся к FirstPython:

Debug: Темная сторона. В любой непонятной ситуации

179

1. нужно добавить в репозиторий новый файл lesson4. py; 2. затем откатить коммит, запустить проект без этого файла; 3. и, наконец, вернуть файл обратно. Открывай SourceTree: [Win] So [Enter] Нажимай кнопку [Commit] слева вверху Добавляй файл lesson4.py Выбери checkbox: Push changes immediately to origin/ main Напиши описание коммита, например, “добавил 4 урок с логированием” Нажимай кнопку [Commit] справа внизу Коммит ушел на сервер. Теперь давай откатим локальный репозиторий до предыдущей версии, будто последний коммит был ошибкой, из-за которой все перестало работать.%) Слева выбери Workspace / history. Выбери предыдущий коммит. У меня он называется “Добавил проект со скриптами 1—3 уроков”. Дважды кликни мышкой на этот коммит. Появится диалог: Confirm change working copy. Выбери checkbox: Clean (discard all changes)

180

Евгений Павлов. Знакомьтесь, Python

И нажимай [OK]. Теперь этот коммит будет выделен жирным шрифтом, как текущий в локальном репозитории. Все изменения пропадут в локальной копии репозитория, но остануться на сервере. Так что ты сможешь без проблем их вернуть. Открой директорию с репозиторием FirstPython и убедись, что файл rep\lesson4.py — пропал! Где-то тут надо запустить и убедиться, что в старой версии остальные скрипты — работают. Теперь вернемся обратно к новой версии. Выбери последний коммит в Workspace / history. Дважды кликни мышкой по самому верхнему коммиту (последний “добавил 4 урок с логированием”). Появится диалог: Warning: commits may be lost Нажми кнопку [Yes] Открой директорию с репозиторием FirstPython и убедись, что файл rep\lesson4.py — вернулся! Если ты достаточно часто фиксируешь изменения в проекте, то тебе будет легко выяснить, какие именно изменения сломали твой скрипт. Когда удастся локализовать ошибку в пределах одного коммита — ее будет сильно проще найти и исправить.

Debug: Темная сторона. В любой непонятной ситуации

181

Держи удар Хочу добавить еще пару слов про ментальное состояние. Что делать, если застрял на ошибке в коде. Без дисциплины не имеет значения, насколько ты хорош, ты ничто! Когда-нибудь ты встретишь крутого парня, который выдержит самые лучшие твои удары. И будет продолжать наступать, потому что он сильный. Не лишайся силы духа и мужества. Это время, когда дисциплина вступает в игру28.

Возьми паузу. В том состоянии, в котором ты эту ошибку сделал, ты не сможешь ее исправить. Иначе ты бы сразу не допустил эту ошибку. Сначала исправь свое состояние, а уже потом приступай к работе по исправлению кода, который ты в предыдущем состоянии написал. Объясни товарищу, что именно делает твоя программа. Пока пишешь — глаз замыливается. Порой достаточно объяснить другому, что происходит, чтобы найти ошибку. Пока объяснял — сам все понял. Для этого есть термин Duck Debugging. Фокус в том, что вместо товарища можно использовать уточку, которая внимательно тебя выслушает, не перебивая. Автор, вместо уточки использует Free Writing — пишет комментарии в коде с объяснениями будущему себе, что тут происходит. В общем, каждый выкручивается как может. Погугли, мы живем в будущем, когда на любую ошибку в интернете уже есть страница, где другой программист, 28

Майк Тайсон. Фильм «Tyson», 2008, режиссер Джеймс Тобэк.

182

Евгений Павлов. Знакомьтесь, Python

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

Контрольные вопросы: 1. 2. 3. 4. 5. Если

Как обрабатывать багрепорт? Чем отличается Inline Watch от Watch для Debug? Какими бывают уровни логов? Как Git помогает локализовать критические ошибки? Что такое Duck Debugging? ответил

на

все

вопросы,

получай

достижение

#DebugMaster.

В сухом остатке: 1. доброжелательность и деликатность; 2. возьми паузу, чтобы воспроизвести ошибку; 3. debug для пошаговой отладки;

Debug: Темная сторона. В любой непонятной ситуации

183

4. логирование для нестабильных ошибок; 5. история изменений для локализации критических ошибок; 6. неудобные вопросы к себе помогают выйти на следующий уровень.

CLEAN CODE: ПРАВИЛА ЧИСТОГО КОДА.

УГОЛОК АРХИТЕКТОРА. SOLID

Понятный, Расширяемый, Чистый

П

рограммист ВСЕГДА работает с программным кодом. В самом начале кода мало и его легко читать, но со временем он обрастает костылями и заплатками, превращаясь в говнокод. Первая Матрица была просто произведением искусства. Само совершенство. Её триумф сравним лишь с её монументальным крахом29.

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

«Матрица: Перезагрузка», 2003, братья Вачовски.

186

Евгений Павлов. Знакомьтесь, Python

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

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

Форматирование — новая Каллиграфия Форматирование кода полезно даже для маленьких программ в 10 строчек. Чем легче читать код, тем красивее он выглядит. Чем легче понять код, тем проще находить в нем ошибки. Вот почему так важно делать код красивым. 30 Warhammer 40,000, 1987 год, Издатель: Games Workshop.

Clean Code: Правила чистого кода...

187

Причесывать код и делать его более читаемым — навык, который достигается лишь практикой и осознанностью. PyCharm тоже умеет причесывать код. Нажми Ctrl+Alt+L чтобы IDE сама выровняла отступы и удалила лишние пробелы. Заведи правило: форматировать и поправлять написание кода, каждый раз, когда ты начинаешь его читать. Например, я часто выравниваю чужой код, когда мне надо в нем разобраться. Это как бы делает меня немножко соавтором этого кода, а значит, он уже не кажется таким враждебным и непонятным. Психологический трюк, но у меня он работает. Задайся вопросом: как сделать текст на экране еще более понятным? С практикой ты придумаешь собственные правила. Или начнешь понимать пользу от чужих правил, что поначалу даже лучше. 1. Добавить отступы, чтобы легче находить конец и начало цикла; 2. добавить пробелы, скобки и пустые строки — помогает разобраться в порядке вычисления сложного логического выражения. 3. сгруппировать команды по разным этапам (инициализация, поиск, исправление и т. д.). Парочка пустых строк подскажет, что группа команд закончилась и сейчас начнется новая. 4. менять названия сущностей — обычное дело, когда программа разрастается и смысл переменных и функций начинает размываться. 5. добавить комментарии. Задумался на секунду — напиши комментарий, чтобы следующий раз не думать. 6. исправь ошибки в названиях!

188

Евгений Павлов. Знакомьтесь, Python

SOLID — новый ООП Принципы SOLID начинают приносить пользу даже в небольших программах от 100 строк и выше. ООП — Объектно-ориентированное программирование. Это когда классы, конструктор, интерфейсы, наследование и перегрузка функций, в общем — объекты. В небольших проектах ты вряд ли увидишь иерархию больше чем из трех классов, что делает теорию ООП не очень практичной. Однако, ты наверняка столкнешься с необходимость автоматических тестов, работой со сторонними библиотеками и другими случаями группового программирования. Говоря по-умному, сейчас мы чаще сталкиваемся с безопасностью, чем с разнообразием в своем коде. Эта глава — на будущее. Прочитай для ознакомления. Однажды тебе потребуются архитектурные паттерны или принципы ООП. Ты уже будешь знать, что и где тебе искать. Для программирования уже не нужны принципы ООП, тебе нужны принципы SOLID. Single Responsibility Principle (принцип единственной ответственности) — не допускай, чтобы одна функция делала параллельно несколько вещей. Каждой задаче — отдельная функция. Когда моешь чашку — мой чашку. Open-Closed Principle (принцип открытости/закрытости) — написанную функцию не переписывают под новый случай. Вместо этого функция может сама подтягивать новые методы или данные для своей работы с новыми классами объектов. Умеешь мыть чашку — помоешь и тарелку.

Clean Code: Правила чистого кода...

189

Liskov Substitution Principle (принцип подстановки Барбары Лисков) — если твой алгоритм умеет мыть посуду, то он сможет вымыть тарелку, чашку, кастрюлю. Словом, ЛЮБУЮ посуду. Если ты придумаешь посуду, которую вымыть нельзя — это будет нарушением принципа. Interface Segregation Principle (принцип разделения интерфейсов) — куча небольших интерфейсов вместо одного большого: Функции для мытья посуды, функции для сервировки стола, функции для хранения в серванте — все это разные интерфейсы, которыми пользуются разные актеры (посудомой, официант, кладовщик). Dependency Inversion Principle (принцип инверсии зависимостей) — функции верхнего уровня не должны знать, как реализуются функции уровнем ниже. Другими словами, когда ты описываешь мытье посуды, ты не закладываешь, какая именно это будет посуда. Все, что знает посудомойка — это набор свойств для мытья посуды (смывает жир, оттирает пятна и т. п.) Все вместе эти 5 принципов как раз и образуют аббревиатуру SOLID!

Refactoring — как шатать программу Рефакторинг становится актуальным для большой программы от 1000 строк и выше. Если ты пишешь скрипты меньше чем 1000 строк — тебе не надо разбираться в архитектуре и рефакторинге.

190

Евгений Павлов. Знакомьтесь, Python

Рефакторинг программного кода можно сравнить с ремонтом и перестройкой дома. Как и в случае с домом, программный код может со временем стать устаревшим и неэффективным. Рефакторинг позволяет обновить и улучшить код, как замена старых окон и дверей, обновление электропроводки и трубопроводов в доме. Это позволяет сделать код более надежным, безопасным и эффективным; улучшить производительность и упростить его сопровождение в будущем. Как и в случае с ремонтом дома, рефакторинг может быть трудоемким и затратным процессом, но в конечном итоге он позволяет улучшить качество кода и сделать его более пригодным для использования. Спустя годы, рефакторинг — моя самая любимая часть программирования (и даже написания книги!). У меня уже есть работающая программа или черновик книги, есть тесты для проверки ее работоспособности. Я не пишу новое, а скорее шатаю уже наработанное, чтобы увидеть программу под новым углом, получить новые свойства для старого кода. Я занимаюсь полировкой названий, чтобы они лучше описывали текущее положение дел. Я меняю ее чтобы: 1. улучшить читабельность кода; 2. избавиться от запаха ошибок (самих ошибок я не вижу, но по опыту чувствую, что они могут тут возникнуть); 3. добавить возможность расширения функционала; 4. упростить алгоритм. Все это приходит с опытом, который нарабатывается годами. Чем больше больших проектов с запутанным кодом через тебя пройдет — тем больше будет твой опыт.

Clean Code: Правила чистого кода...

191

Что еще можно почитать? «Чистый Код» Роберт Мартин. Книга с кучей реальных примеров, чтобы взглянуть на код с разных сторон: сверху вниз, снизу вверх и даже изнутри. Научишься отличать хороший код от плохого. Узнаешь, как писать хороший код и как превращать плохой код в хороший. Книга состоит из трех частей: 1. описание принципов, шаблонов программирования и приемов написания чистого кода; 2. упражнениям по чистке кода или преобразованию проблемного кода в менее проблемный; 3. и, наконец, набор эвристических правил и «запахов кода». Это учит чтению, написанию и чистке кода. Макконнелл Стив «Совершенный код» Дьявол кроется в мелочах, с которыми приходится сталкиваться ежедневно. Книга отвечает на вопросы, которые не принято спрашивать: где поставить пробел, как назвать переменную, как и почему лучше обработать исключительную ситуацию, как проектировать классы и т. д. Книга все раскладывает по полочкам, рассказывая, как создавать совершенный код. Мартин Фаулер «Рефакторинг. Улучшение существующего кода» Каждый шаг рефакторинга прост, но совокупный эффект таких малых изменений в состоянии радикально улучшить проект или даже предотвратить распад плохо спроектированной программы.

192

Евгений Павлов. Знакомьтесь, Python

В книге описаны принципы и лучшие практики для рефакторинг; подсказки, где и когда следует начинать углубленное изучение кода для его улучшения. Есть подробный перечень из более 70-ти методов рефакторинга. Для каждого описана мотивация и техника испытанного на практике преобразования кода с примерами на Java. Эти методы позволяют поэтапно модифицировать код, делая небольшие изменения. Благодаря этому снижается риск сломать уже работающий проект.

Контрольные вопросы: 1. Чем хороший программист отличается от плохого? 2. Как улучшить даже небольшую программу? 3. До какого размера программы классы являются бесполезными? 4. Чем SOLID отличается от ООП? 5. Когда можно начинать рефакторинг? Если ответил на все вопросы, получаешь достижение #CleanCode.

В сухом остатке: 1. Форматирование — чтобы улучшить читаемость кода; 2. SOLID — чтобы обеспечить расширяемость и автоматическое тестирование; 3. рефакторинг — для устранения временных решений.

HUMAN RESOURCE: КАК ПРОЙТИ СОБЕСЕДОВАНИЕ

Как попасть в IT

Е

сли ты никогда не работал программистом, никогда не проходил собеседование на программиста — чего вообще ожидать и как правильно себя вести? Что за коллектив? Как складываются отношения? Что ценят в работе? Как начальник подбирает себе подчиненных? Как пройти через фильтр кадрового отдела? Пожалуй, главная ошибка новичка — это отсутствие своих целей. Звучит странно, но умение внятно рассказать про свои цели и мотивацию все упрощает. Если ты не знаешь, чего хочешь, то работодатель не понимает, чего от тебя ждать. Помни, не нужно нравиться всем подряд. Тебе нужно найти свою работу и объяснить, что им нужен именно ты. Для остальных — чем быстрее поймете, что не подходите друг другу, тем лучше для всех. Навык самопрезентации сложно переоценить. Elevator Pitch — минутная презентация, будто ты оказался в лифте с работодателем и тебе надо за минуту рассказать о себе. Только самое важное! Не надо перечислять свои достиже-

196

Евгений Павлов. Знакомьтесь, Python

ния или навыки. Чего ты ищешь и что готов предложить. В трех предложениях. Если заинтересуешь — тебя попросят рассказать поподробнее и пригласят на собеседование. Если знают кого-то, кто заинтересуется — направят к нему. Если не интересно — ты не отнял много времени/внимания, а значит не был навязчив — приличия соблюдены. Напиши про себя подробное сочинение на 10 страниц. Старое доброе свободное письмо, затем выкинь из него все, что можно. Сформулируй главную мысль из трех предложений. Не беда если что-то упустишь! Заодно сам сможешь понять свои сильные и слабые стороны. Про сильные рассказывай, над слабыми работай. Вот эту презентацию и рассказывай в любом первом разговоре с работодателем. По телефону, на собеседовании или в лифте. Если собрал свою минутную презентацию, забирай достижение #ElevatorPitch.

Понабрали по объявлениям Внимательно изучай объявления по вакансиям и присмотрись к формулировкам. Твоя цель — написать свое резюме так, чтобы в нем было как можно больше совпадений с вакансией по словам и названиям. Кадровики ищут и отбирают соискателей по ключевым словам. Поскольку ты новичок, обязательно ищи слово Junior в объявлении. Это значит, что тебя будут терпеть и тратить время на твое обучение. Для тебя — фронт работ

Human Resource: Как пройти собеседование

197

из простых задач (достаточно формализованных, чтобы ты разобрался и смог их сделать). Ставить самому себе задачи и искать работу в организации — следующий уровень сложности. Не парься из-за заплаты. В идеальном случае — готовься получать минимальную зарплату и нарабатывать свой первый практический опыт на работе. Не смотри на рынок, смотри на свои минимальные требования. Вилка состоит из 3х чисел: минимум (чтобы это было не в убыток для тебя), комфорт (чтобы ты смог на это жить), идеал (за сколько готов выйти прямо завтра). Всегда будут смотреть на комфорт. Смещение к миниуму или максиуму — это сигнал для тебя, что такая работа — временная. u Минимальная — потому что это направление не важное для работодателя и финансирование идет по остаточному принципу. u Максимальная — это когда работу надо срочно сделать, а когда критическая фаза пройдет — сократить расходы и персонал. Зарплата по рынку — скорее ориентир адекватности для соискателя. Идеальный для тебя вариант — попасть в хорошую компанию с опытными специалистами и налаженными процессами. Учиться на практике, доказывать свою полезность и уже потом расти в зарплате. Хороший работодатель сам заинтересован в росте сотрудников, а значит, и росте их зарплаты. Добрый совет: договаривайся на берегу о пересмотре зарплаты через полгода по результатам своей работы. Перед этой встречей подготовь презентацию своего прогресса и достижений. Не рассчитывай, что твой руководитель сам помнит, что ты там сделал и чего ты достиг.

198

Евгений Павлов. Знакомьтесь, Python

О чем говорят программисты Все работодатели спрашивают разное. Все зависит зависит от опыта начальника: один будет засыпать задачками с подвохом, про которые сам недавно узнал; другой будет пытать задачами на смекалку, стрессоустойчивость и воображение; третий будет спрашивать про задачи из работы. Добро пожаловать на галеру, фраерок. Скок стаж, где раньше мотал срок? Мы с пацанами кое-чё спросим с тебя по олдскулу. Присаживайся, у нас как раз два стула. Не обращайте внимания. Это мы вроде бы так шутим31.

Ты можешь не знать какие-то вещи. Для молодого специалиста простительно чего-то не знать. “Нет, я не умею писать тесты. Слышал лишь, что автоматические тесты — важный этап в разработке. Мне было бы интересно узнать про них больше и поработать над тестами для большого проекта. Даже если это будет немного однообразно — не беда. Я надеюсь, что я буду учиться у более опытных коллег.” У интервьюера стоит задача: узнать твои сильные стороны и выяснить риски, если он возьмет тебя на работу. Помоги ему в этом непростом деле. Ты должен хоть что-то знать. Обозначь область своих знаний и будь готов доказать, что ты ими действительно обладаешь. “Да, я работал с GIT. У меня есть аккаунт на GitHub, где я выложил несколько своих учебных проектов. Пожалуй, я бы хотел показать свой последний проект, 31

Научно-технический рэп – «Два стула», 2021.

Human Resource: Как пройти собеседование

199

где я читаю http страницу и сохраняю частотный словарь в виде json в файл. Я написал код и составил комментарии к нему, чтобы продемонстрировать свое умение оформлять программу, документацию и планы по расширению проекта.” Ты можешь попросить подсказку. Чтобы решить задачу, попроси подсказку и уже с ее помощью реши задачу. В конце концов, важен не ответ, а твое умение рассуждать и находить ответ. “Мне раньше не приходилось писать алгоритмы сортировки. Расскажите поподробнее, что именно должен сделать такой алгоритм, а я в свою очередь опишу, как именно планирую его написать, с чего начну и как буду проверять правильность работы моей программы.” Поиск работы — это конкурс. Возможно, работодатель выбирает между тобой и своим родственником; или между тобой и никем — никогда не угадаешь. Поэтому не переживай, если тебе отказали на первом же собеседовании. Для тебя это была разведка боем. Постарайся вспомнить все вопросы, которые были заданы и найди ответы на них дома — обязательно делай работу над ошибками! Когда втягиваешься в поиск работы — времени начинает не хватать и работа над ошибками может оказаться сложной из-за цейтнота. Но ты уж постарайся! Вопросы работодателю — важная часть собеседования. Спросить совета у экзаменатора — хорошая мысль. Подготовь вопросы заранее. Он может подсказать тебе, каких знаний тебе сейчас не хватает, где можно эти знания получить и когда можно прийти для второй попытки. После того, как ты изучишь недостающее, разумеется. Веди

200

Евгений Павлов. Знакомьтесь, Python

разговор, будто тебе надо не получить эту работу, а надо получить совет старшего товарища. Твой план — попасть на 5 собеседований. Ты не можешь контролировать, пройдешь ты их или нет, но ты можешь сделать первый шаг и договориться о нем (удивительно, как много соискателей отваливаются уже на этом этапе). Не жди результатов, смело переходи к следующему собеседованию. Получать отказы — это часть плана. Если сходил на 5 собеседований, получай достижение #JobInterview. Сначала хотел поставить достижение на 10 собеседований, но я пессимист. Скорее всего, работу ты найдешь намного раньше 10-го собеседования и забросишь это дело, не получив достижения, поэтому пяти собеседований будет достаточно. Если будешь делать работу над ошибками — результат твоих собеседований тебя приятно удивит.

Как вписаться в коллектив Вот тебе удалось пройти собеседование, сегодня твой первый день на новой работе. Испытательный срок — это второе, секретное собеседование. Тебя приглашают в коллектив, чтобы оценить, как ты впишешься в него, как будешь справляться с работой. Самое основное — как будешь учиться новому.

Human Resource: Как пройти собеседование

201

Здоровайся! Пожалуй, это главный совет, который я бы сейчас дал молодому себе. Знакомства и отношения на работе сильно легче наладить, если вы общаетесь. Любое общение начинается с вежливости: называй коллег по именам, искренне интересуйся (и восхищайся) их работой. Может даже тебе удастся помочь им с каким-то вопросом. Задавай правильные вопросы. С одной стороны, вопросы, на которые тяжело ответить — всех ужасно раздражают. С другой стороны, не спросишь — не узнаешь. Пожалуй, лучше всего, сначала попробовать сделать самому, а затем спросить, почему (по их мнению) у тебя не получилось. Правильный вопрос: Я попробовал и так, и эдак, но отчего-то не получается. Может я что-то не так делаю? Лучший вопрос — тот, на который можно коротко ответить «да» или «нет». Как правило у джунов такая каша в голове, что сама по себе попытка сформулировать вопрос приводит к серьезному улучшению дела. Планируй свое расписание. Предлагай руководителю план своей работы, исходя из того, что ты узнал по работе. Даже если ошибся — тебя поправят и подскажут. С другой стороны, тебе виднее, что тебе не хватает и что нужно сделать. Правильный вопрос: Вот мой план работы на следующую неделю. Правильно ли я расставил приоритеты по своим задачам? Ищи работу внутри. Интересуйся задачами-проблемами коллег. Предлагай свою помощь. Правильный вопрос: Чем еще я смогу быть полезным?

202

Евгений Павлов. Знакомьтесь, Python

Будь опрятен. И вообще будь на позитиве. Человек не способный позаботится о себе — вряд ли сможет помочь другим по работе.

Что еще можно почитать? Джим Кэмп «Сначала скажите «нет». Секреты профессиональных переговорщиков» Эта книга изменит твою жизнь. Новый способ решать сложнейшие личные и рабочие вопросы, оставаться спокойным и уверенным на собеседованиях, эффективно отстаивать свои настоящие интересы. Неважно, что думает твой собеседник, хочет тебя провести или найти компромисс. Если ты не можешь добиться желаемого от собеседника — откажись от переговоров и сэкономь свое время. Подход «выиграл-выиграл» плох в переговорах, потому что он ведет к уступкам в ущерб себе. Ты уступаешь и надеешься, что оппонент уступит в ответ. А он не будет уступать. В ходе коммуникации сразу определись, переговоры это или нет. Переговоры — соглашение между двумя или большим количеством сторон, где каждая из сторон имеет право вето. Каждый имеет право сказать нет. Не надейся, что собеседник заинтересован в долгосрочных результатах и готов пожертвовать выигрышем ради того, чтобы в будущем получить гораздо больше.

Human Resource: Как пройти собеседование

203

Система улучшает отношения между людьми, поскольку она даёт свободу тебе, а ты осознанно даешь ее собеседнику. Ты поощряешь все «нет» твоего собеседника. Ты учишься «уверенно и без агрессии отстаивать свои интересы». Черта характера, которая прямо противоположна манипулятивности, от которой страдают обе стороны. Это учебник по всем эффективным переговорам в твоей жизни. Собеседование — это переговоры. Дэвид Аллен «Как привести дела в порядок: искусство продуктивности без стресса» Вот сильно упрощенная схема управления временем, которая подходит для большинства ситуаций: 1. запиши все дела (сформируй backlog); 2. выдели 10 самых важных (отбрось второстепенное); 3. отсортируй их по приоритету (определи приоритет); 4. сделай первые три (рассчитывай свои силы); 5. остановись и отдыхай (планируй отдых!). Питер Тиль «От нуля к единице. Как создать стартап, который изменит будущее» Ты — это стартап. Продукт — это твой опыт и рабочее время. Твои заказчики — это работодатели. Правильно выбрать профессию — найти свою нишу на рынке. Самое провокационное утверждение Тиля: «конкуренция — для неудачников»; монополия — вот, что нужно предпринимателю. «Идеальный целевой рынок для стартапа — небольшая группа вполне определенных людей, которую обслуживает небольшое число конкурентов или вообще никто». 1. Лучше рискнуть и быть чересчур смелым, чем оказаться банальным.

204

Евгений Павлов. Знакомьтесь, Python

2. Плохой план лучше, чем отсутствие плана. 3. Высококонкурентные рынки убивают на прибыльность. 4. Продажи не менее важны, чем продукт.

надежду

Подготовка к собеседованию. 1. изучи вакансии на HeadHunter для junior и выпиши требования к вакансиям; 2. найди список вопросов на собеседовании для каждого из таких требований; 3. составь учебный план, чтобы постепенно изучить все, что требуется; 4. разберись, как надо отвечать на вопросы по теме. Сделай практические задачи; 5. сохрани код своих учебных примеров на gitflic. Оформи комментарии и документацию для своего кода; 6. найди отзывы сотрудников для понравившихся организаций из объявлений; 7. составь свое резюме и сопроводительные письма. Напиши несколько писем для выбранных тобой объявлений; 8. подготовь самопрезентацию.

В сухом остатке: 1. изучай требования к вакансиям на рынке; 2. определись с запросами: заплата, удаленность, экспертиза, перспективы; 3. изучи отзывы о работодателе; 4. подготовь вопросы к работодателю;

Human Resource: Как пройти собеседование

205

5. определись, что ты знаешь и умеешь, а с чем еще не разобрался; 6. делай работу над ошибками после собеседования; 7. задавай правильные вопросы; 8. составляй план своей работы.

BONUS: КАРЬЕРА И ЗДОРОВЬЕ. КАК ВКАЛЫВАТЬ И НЕ СГОРЕТЬ Идет медведь по лесу, видит, машина горит. Сел в нее и сгорел.32

Воля к жизни

Э

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

сгоришь, пытаясь забраться по отвесной стене. Чем выше цель, тем менее заметен прогресс.

Я решил дописать еще одну главу про ментальное и физическое здоровье. Возможно, именно эта глава поможет тебе быть в порядке и с энтузиазмом двигаться к своей главной цели (мировому господству). 32

Анекдот.

208

Евгений Павлов. Знакомьтесь, Python

Концентрация внимания Здесь нет никакой мистической ботвы. Медитация нужна для прокачки концентрации внимания. Каждый день по 20 минут “смотреть на ковер” и следить за своим дыханием. Паузы в работе — это не трата времени, а заточка косы.

С помощью медитации сможешь «перезагрузить» свой мозг, что благоприятно скажется на теле, мышлении и сознании. Медитация — это не про отдых, а скорее про очищение сознания (вроде того, как чистят желудок интервальным голоданием). Перекрыть поступление новой информации, чтобы полностью переварить и усвоить уже имеющуюся; додумать мысли до логического конца и двинуться дальше. Непонятно как, но это работает. Так почему бы не попробовать? Кажется, что ничего не делать 20 минут — по силам большинству людей. Осталось при помощи дисциплины превратить это в полезную привычку. Самое сложное в медитации — это найти для нее время.

Запланируй перерыв на полчаса, найди удобное место, сядь в спокойную позу, чтобы сохранять прямую спину. Для начала, продержись 5 минут. Фокус в том, чтобы безоценочно наблюдать за собой и возвращаться к дыханию. Мысли будут постоянно перескакивать на всякое, но это нормально. Просто следи за ними и время от времени возвращай внимание на дыхание. Как начнет получаться высидеть без суеты 5 минут, начинай увеличивать дозу до 10-ти минут, а затем до 20-ти.

Bonus: Карьера и здоровье. Как вкалывать и не сгореть

209

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

Планирование и отдых Это не про марафоны желаний. Только бездуховность, Scrum и циничный расчет. Прежде всего, я хочу разделить два этапа: постановка целей и планирование. Многие смешивают свои желания цели и планы в одну кучу. Но я делаю иначе. Цель — это то, чего ты хочешь достичь. Настолько сильно, что готов от чего-то отказаться, чтобы получить желаемое взамен. Это вопрос приоритета: пойти на утреннюю пробежку или сладко поспать еще часок. Семья или карьера. Деньги или счастье. Образование или развлечения. Здесь нет хорошего и плохого. Есть важное и то, от чего можно отказаться. Раз в год надо потратить день на размышления. Спокойно обдумай, выпиши все свои хотелки и все, что при-

210

Евгений Павлов. Знакомьтесь, Python

дет в голову, без ограничений и критики (снова свободное письмо). Заполни BackLog, прямо как в методологии Scrum. Мы так долго учимся самоограничению, что боимся желать. Представь себя в комнате желаний, где можно и нужно пожелать все, что тебе действительно хочется. Постарайся пожелать что-то еще, кроме денег:) Желать много денег — это как желать чек с номером в очереди за едой в Макдональдс. Будто тебе нужен кусочек бумаги с цифрами, а не вкусный гамбургер с горячей картошкой и сладкой газировкой. Приоритезируй Backlog и выдели ключевые цели на этот год. Например, первые десять целей. Остальное можно спрятать и договориться с собой пренебрегать ими в случае выбора. А выбор обязательно возникнет, он будет нелегким. Унылая учеба в начале семестра или эксклюзивная вечеринка только для приглашенных гостей. Неотложная задача на работе или свадьба сестры. Если ты не подумал заранее и спокойно не подготовил стратегическое решение, то будешь делать выбор на основе своих эмоций. Большинство людей именно так и поступают. Забудь про планирование, живи эмоциями (сарказм)! Приоритезация целей — это стратегия. Стратегия — это умение отказываться от чего-то. Если ты не отказываешься, то у тебя нет стратегии. Выбранные цели — это как полярная звезда (North Star), по которой ты сверяешь планы: ты удаляешься или приближаешься к ней? Выбранные метрики позволяют рационально оценить прогресс достижения цели. Как бы не бросала жизнь из стороны в сторону, смотри в сторону своей цели и ищи способы двигаться к ней. При подготовке к битве планы незаменимы, но как только битва началась, план становится совершенно бесполезным33. 33

Дуайт Эйзенхауэр, Sid Meier’s Civilization V, Firaxis Games, 2010.

Bonus: Карьера и здоровье. Как вкалывать и не сгореть

211

План — это набор действий для достижения цели. Раз в месяц я пишу планы. План — это то, как я буду достигать поставленных целей. Многие боятся планировать, потому что планы не осуществляются. На самом деле 40% выполненных планов — отличный результат. Я молодец. Сделал небольшой шаг. Завтра попробую ещё.

А вот 100% выполненный план — это паршиво. Это значит, что ты струсил ставить действительно смелые цели. Побоялся прыгнуть выше головы. Попахивает страхом и выученной беспомощностью. Когда планируешь — рассчитывай на лучшее. Душевное спокойствие зависит от многих причин, но, главное, «делай, что должно, и будь что будет»34.

Три секрета планирования: 1. выделяй время на планирование; 2. разделяй планирование и выполнение; 3. планируй отдых. Планирование и отдых — вещи, которые принято отодвигать на второй план, будто они не требуют времени и ресурсов. По остаточному принципу. На самом же деле, планирование требует абсолютных когнитивных усилий. Чтобы построить действительно хорошие планы, нужно иметь свежую голову. А свежую голову ты не сможешь получить только лишь хорошо отдохнув. 34 Марк Аврелий. «О стойкости мудреца (сборник)», Бородай Т.Ю., перевод на русский язык, комментарии. «РИПОЛ классик», 2017.

212

Евгений Павлов. Знакомьтесь, Python

Когда ты выполняешь план, кто-то должен позаботится о тебе, продумать все до мелочей, написать списки, узнать расписание, адреса и контакты. Устранить все, что отвлекает, чтобы ты смог полностью сфокусироваться на самой работе. Не надо ничего решать или узнавать, просто сделай то, что запланировано. Здесь и сейчас у тебя ровно одна задача, которую ты должен сделать. Обо всем остальном уже позаботились другие. Это сильно облегчает саму работу. Поэтому, когда планируешь — позаботься о будущем себе. Продумай заранее все, чтобы облегчить выполнение задачи исполнителю, устрани все сомнения и страхи исполнителя. Отправляешься в отпуск? Купи билеты и забронируй гостиницу. Пойдешь на тренировку? Подготовь свежую одежду и полотенце. Купи и приготовь вечером на завтрак еду со сложными углеводами перед тренировкой. Пойдешь на прием к зубному? Назначь часы приема, напиши напоминание в календарь, договорись на работе, что придешь попозже. Одним словом — позаботься о себе будущем! Научись замечать наиболее ранние признаки усталости и истощения. Это когда тебе хочется сладкого, соленого, кофе, взбодриться. Когда у тебя возникают слабые мысли: «почему я?», загнанность и безнадежность, «я не справляюсь», «я не способен». Отдыхай, прежде чем почувствуешь усталость. И ты никогда не будешь уставать.

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

Bonus: Карьера и здоровье. Как вкалывать и не сгореть

213

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

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

214

Евгений Павлов. Знакомьтесь, Python

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

Для успеха в жизни нужны связи, крепкие нейронные связи.

Лучший способ научиться принимать помощь окружающих — самому помогать тем, кто в этом нуждается. Только так ты научишься участвовать в подобной деятельности. Когда, у кого и как просить поддержки? Что ты можешь дать, а что будет для тебя неудобным? Когда помогаешь другим, понимаешь, как именно просить помощи самому. Помогая другим, мы становимся счастливее — так устроена наша психика. Неумение выстраивать отношения со старшими, в первую очередь, из-за непонимания, что ты можешь дать тому, у кого есть все, чего нет у тебя. И во вторую очередь, из-за неумения выделять ресурсы для решения задач старших. Все из-за того, что ты слишком зациклен на себе и своих проблемах! Главная когнитивная ошибка: большинство людей хотят, чтобы их услышали, но лишь единицы способны слышать окружающих. Поэтому, еще раз: учись задавать качественные вопросы. Задавая вопросы, ты можешь узнать что-то новое. Рассказывай сам — и ты никогда не узнаешь ничего нового и полезного для себя. Любая критика — это твой шанс стать лучше. Вопрос только в умении обрабатывать такую обратную связь.

Bonus: Карьера и здоровье. Как вкалывать и не сгореть

215

Полезные книги Осторожно! Эти книги действительно тяжелые для изучения. Если получится читать по странице в день и конспектировать прочитанное — уже хлеб. Андрей Беловешкин «Воля к жизни. Как использовать ресурсы здоровья по максимуму» Это учебник кандидата медицинских наук Андрея Беловешкина. Он рассказывает с позиции науки и доказательной медицины. Андрей нравится мне своим системным подходом, основанным на многочисленных научных исследованиях. Вот 7 вредных привычек, убивающих твое здоровье: 1. гиподинамия, cидячий образ жизни; 2. плохое питание; 3. дефицит солнечного света; 4. недосып; 5. хронический стресс и трудоголизм; 6. вынужденное одиночество; 7. бедность. В этом списке нет алкоголизма и курения, потому что риски от таких привычек сильно ниже. Выглядит парадоксально, но доказано наукой. Книга про то, как выстраивать свой образ жизни, чтобы не заработать подобные привычки (особенно бедность, ха-ха!) Елена Вавилова, Андрей Безруков «Нетворкинг для разведчиков. Как извлечь пользу из любого знакомства» Ты наверняка читал кучу цитат известных людей про важность нетворкинга. Пришло время научиться делать это

216

Евгений Павлов. Знакомьтесь, Python

по-взрослому. Нетворкинг — это основное занятие профессионального разведчика. Не случайный и эпизодический, но промышленный подход к выстраиванию полезных знакомств. Маленькая красная книжка от полковников Службы внешней разведки. Похоже на секретную методичку из школы разведчиков. Совершенно другой уровень подхода к предмету. В западных книжках такого не напишут. 1. Сформулируй свои цели; 2. нарисуй свой граф знакомств; 3. выдели три круга: ближний, достижимый, дальний; 4. определи ключевые узлы: коннекторы, привратники, аккумуляторы; 5. приоритезируй знакомства; 6. прилагай усилия для полезного общения; 7. ставь на паузу бесполезные взаимодействия. Александр Кравцов «Найди ментора. Как перейти на следующий уровень» Книга про знакомства с теми, кто намного выше тебя. Как выстраивать отношения со старшими товарищами. Считаю, полезно почитать вокруг темы про менторов. Забавно, что никто из окружающих толком не знает, что такое ментор и чем он отличается от тьютора, коуча, наставника, преподавателя или тренера. Это все разные роли с разными целями и задачами. Книга прежде всего про стратегию развития личностных ресурсов: 1. таланты — личные качества и способности; 2. компетенции — твои знания и умения; 3. связи — твое окружение; 4. репутация — твоя известность за пределами ближнего круга.

Bonus: Карьера и здоровье. Как вкалывать и не сгореть

217

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

Контрольные вопросы: 1. 2. 3. 4.

Зачем нужна медитация? Чем планы отличаются от целей? Зачем нужна поддержка? Зачем нужен ментор?

В сухом остатке: 1. 2. 3. 4.

делай перерывы; пиши планы; планируй отдых; помогай другим.

ACHIEVEMENTS: ТАБЛИЦА ДОСТИЖЕНИЙ. МЕТА-ИГРА В КНИЖКЕ

Н

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

Вот список достижений, которые разбросаны по главам моей книги: 1. #Concept — ответил на вопросы по главе «Для кого эта книга»; 2.

#HelloWorld на Python;



написал

первую

программу

3.

#LapTop — завел себе свой рабочий ноутбук;

4.

#Python — установил Python;

220

Евгений Павлов. Знакомьтесь, Python

5.

#PyCharm — установил PyCharm;

6.

#VirtualEnvironment — настроил виртуальное окружение;

7.

#StreamCoding — посмотрел час стрима с программированием на Python;

8.

#BriefHistory — вопросы по главе «Краткая история программирования»;

9.

#PythonIndustrial — ответил на вопросы по главе «Сорта Питона»;

10. #DBeaver — подключиться к удаленной базе данных; 11. #DataWareHouse — выполнил задания по главе «Как хранить данные»; 12. #Anaconda — установил Анаконду и нарисовал график; 13. #Django — создал приложение и посмотрел в браузере результат; 14. #RabbitMQ — установил сервер и выполнил задачу в очереди; 15. #PythonLibraries — ответил на вопросы по главе «Главные библиотеки Питона»; 16. #OctoCat — прошел регистрацию на GitHub; 17. #PythonGym — сделал зарядку после долгого сидения за компом; 18. #FirstCommit — залил свой проект на сервер Git; 19. #GitQuiz — ответил на вопросы по главе «Система контроля версий»; 20. #Deconstruction — расписал декомпозицию пиццерии или супермаркета; 21. #PythonVPS — арендовал свой линуксовый сервер;

Achievements: Таблица достижений. Мета-игра в книжке

221

22. #CronTab — создал и выполнил задачу в планировщике; 23. #DebugMaster — контрольные вопросы по исправлению ошибок в коде; 24. #CleanCode — ответил на контрольные вопросы по главе «Правила чистого кода»; 25. #ElevatorPitch — подготовил минутную самопрезентацию; 26. #JobInterview — сходил на 5 собеседований.

СОДЕРЖАНИЕ Concept: Для кого эта книга? И для чего?........................................... 7 Agile: Как перестать читать и начать программировать. Как побороть лень. Дофамин. .............................................. 15 IDE: Среда разработки. Hello World. Культура труда................. 27 Root: Краткая история программирования... Вехи развития. Тренды ......................................................... 45 Industrial: Сорта питона, и как их готовить. Области применения. Куда копать ..................................... 61 Data WareHouse: Как хранить данные? Источники и потоки данных. Новая нефть ........................ 73 Release: Главные Библиотеки Питона. Учебная практика .............. 93

223

GIT: Система контроля версий. Где хранить исходники ........ 113 FAQ: Главный секрет программирования. Формулировать мысли. Декомпозиция. Сверху вниз.......................................................................... 131 Linux: Консоль, Команды, Задачи. (Уголок админа) ................... 147 Debug: Темная сторона. В любой непонятной ситуации ............ 169 Clean Code: Правила чистого кода. Уголок архитектора. SOLID .................................................................................... 185 Human Resource: Как пройти собеседование. Как заходить в хату .............. 195 Bonus: Карьера и здоровье. Как вкалывать и не сгореть .............. 207 Achievements: Таблица достижений. Мета-игра в книжке ..................... 219

Научно-популярное издание ԑɵɥɵɦɢɛԝԕɚɪɚɥɵԕɛɚɫɩɚ Серия «Программирование для всех»

Евгений Павлов

ЗНАКОМЬТЕСЬ, PYTHON Секреты профессии

Ответственный редактор А. Ходякова Менеджер проекта В. Живина Технический редактор Н. Чернышева Дизайнер А. Шмулий Компьютерная верстка Н. Шаповалова Подписано в печать 22.09.2023. Формат 70x100/16. Уcл. печ. л. 18,2. Печать офсетная. Гарнитура SonetSerif. Бумага офсетная. Тираж 2000 экз. (Программирование для всех). Заказ № Произведено в Российской Федерации. Изготовлено в 2023 г. Оригинал-макет подготовлен редакцией «Времена», импринт «Альфа» Изготовитель: ООО «Издательство АСТ» 129085, Российская Федерация, г. Москва, Звездный бульвар, д. 21, стр. 1, комн. 705, пом. I, этаж 7 Наш сайт: WWW.AST.RU E-mail: [email protected] Общероссийский классификатор продукции ОК-034-2014 (КПЕС 2008); 58.11.1 - книги, брошюры печатные ©ȻɚɫɩɚȺɫɬɚªɞɟɝɟɧɈɈɈɝɆԥɫɤɟɭɀɭɥɞɵɡɞɵɝԛɥɡɚɪɞɤԝɪɵɥɵɦ ɛԧɥɦɟɩɨɦԕɚɛɚɬȻLɡɞLɧɡɥɟɤɬɪɨɧɞɵɤɦɟɤɟɧɠɚɣɦɵɡZZZDVWUX (PDLODVN#DVWUXɂɧɬɟɪɧɟɬɦɚɝɚɡɢɧZZZERRNN] ɂɧɬɟɪɧɟɬɞԛɤɟɧZZZERRNN] ɂɦɩɨɪɬɟɪɜɊɟɫɩɭɛɥɢɤɭɄɚɡɚɯɫɬɚɧɢɉɪɟɞɫɬɚɜɢɬɟɥɶɩɨɩɪɢɟɦɭɩɪɟɬɟɧɡɢɣ ɜɊɟɫɩɭɛɥɢɤɟɄɚɡɚɯɫɬɚɧ²ɌɈɈɊȾɐȺɥɦɚɬɵɝȺɥɦɚɬɵ ԔɚɡɚԕɫɬɚɧɊɟɫɩɭɛɥɢɤɚɫɵɧɚɢɦɩɨɪɬɬɚɭɲɵɠԥɧɟԔɚɡɚԕɫɬɚɧɊɟɫɩɭɛɥɢɤɚɫɵɧɞɚ ɧɚɪɚɡɵɥɵԕɬɚɪɞɵԕɚɛɵɥɞɚɭɛɨɣɵɧɲɚԧɤLɥ©ɊȾɐȺɥɦɚɬɵªɀɒɋȺɥɦɚɬɵ ԕȾɨɦɛɪɨɜɫɤɢɣɤԧɲ©ɚªȻɥɢɬɟɪLɨɮɢɫɌɟɥ   ɮɚɤɫ  LɲɤL(PDLO5'&$OPDW\#HNVPRN]ZZZERRNN] ɌɚɭɚɪɛɟɥɝLFL©ȺɋɌªԦɧɞLɪLɥɝɟɧɠɵɥɵ ԦɧLɦɧLɧɠɚɪɚɦɞɵɥɵԕɦHSɡLɦLɲɟɤɬɟɥɦɟɝɟɧ ɋɟɪɬɢɮɢɤɚɰɢɹԕɚɪɚɫɬɵɪɵɥɦɚԑɚɧ