Коллекции
Во всём мире Python часто используют для работы с данными. Объём данных может быть небольшим — такой сможет обработать и один слабый компьютер. Но данных может быть и наcтолько много, что потребуются целые вычислительные кластеры (так называют несколько компьютеров, объединённых в сеть и решающих общую задачу), ибо только такие мощности способны переварить подобные объемы информации.
Есть даже такая отрасль — data science, наука о данных. И Python — один из основных инструментов, которые применяются в данной сфере. Машинное обучение, экспертные системы, интеллектуальный анализ данных — со всем этим работают питонисты!
Любые данные нужно как-то представлять в памяти компьютера и делать это нужно так, чтобы с данными было удобно и эффективно работать. В программах данные часто хранятся в коллекциях. Список пользователей, список страниц, список дат, список строк, список серверов — все эти сущности могут быть представлены в коде в виде коллекций. Python известен тем, что поставляется с набором готовых видов коллекций, которые работают очень эффективно и удобны в использовании. Как говорят, "батарейки входят в комплект". Вот основные встроенные типы коллекций в Python:
- списки ("lists")
- словари ("dictionaries")
- множества/наборы ("sets")
Подробнее о возможностях языка и основах синтаксиса можно прочитать здесь
Ввод/вывод IO
Любая программа, которую мы пишем, так или иначе взаимодействует со внешним миром. Когда мы говорим о программе на Python, то таковая может
- общаться с операционной системой, чтобы узнать текущее время, свободное место на диске;
- писать и читать файлы в различных форматах;
- взаимодействовать с другими программами через различные средства IPC (Inter-Process Communication, Межпроцессного Взаимодействия).
Представим, что вы реализуете web-приложение, пользователь которого может загружать изображения и просматривать как в оригинальном размере, так и в виде галереи миниатюр (уменьшенных копий изображений). Не правда ли, задача вполне реалистична. Подумаем, какие виды взаимодействия будет использовать программа на Python, выступающая в роли сервера. Когда пользователь выберет файл в браузере и нажмёт кнопку отправить, программа
- примет запрос (взаимодействие с сетью).
- проверит наличие доступного места на диске (спросит об этом у операционной системы).
- запишет файл изображения на диск.
- вызовет программу, которая сформирует для загруженного изображения миниатюру (IPC с дочерним процессом через "буферы стандартного ввода-вывода" (stdin/stdout)).
- сохранит на диске миниатюру.
- отправит серверу базы данных (это отдельная программа, запущенная параллельно нашей, возможно даже на другой машине) запрос на добавление информации о загруженном изображении и о том, где оно хранится на диске (это тоже IPC, но через специальный канал — socket).
- сформирует ответ для пользователя в виде web-страницы, шаблон для которой считает с диска.
- отправит пользователю ответ (через сеть).
Это далеко не полный список операций ввода-вывода (Input-Output, IO), которые выполняет даже сравнительно простой сервер web-приложения.
HTTP
Популярный вопрос на собеседовании веб-разработчиков часто звучит так: «Что происходит после того, как в браузер ввели адрес сайта?». Подробный ответ на этот вопрос можно найти здесь. Главное, что хочет услышать собеседующий — ваш уровень понимания HTTP (Hyper-Text Transferring Protocol).
пару слов о том, что такое протокол. Протокол — это набор соглашений, правил, по которым разные программы могут обмениваться информацией. HTTP — это набор правил, который известен и вашему компьютеру и физически отдалённому компьютеру. С помощью него общаются браузер и веб-сервер.
Веб-сервер — программа, установленная на сервере и обслуживающая входящие соединения, например, от браузеров. В рамках такого соединения от браузера передаётся информация о том, какую страницу и какого сайта мы хотим загрузить, а веб-сервер, в свою очередь, возвращает браузеру содержимое страницы этого сайта.
http нужно не просто знать, но и уметь делать сырые http-запросы — не косвенно через браузер, а самостоятельно, эмулируя поведение браузера. Для этой задачи используют программу telnet.
Вкратце:
- Работа с формами, загрузка файлов, перенаправления.
- Аутентификация целиком зависит от http.
- Извлечение информации о запросе (например, определение браузера, из которого был выполнен запрос).
- Увеличение производительности. Кеширование.
- Обеспечение безопасности. http — текстовый протокол без шифрования, он не безопасен.
HTTPS
Кроме http, в сети всё большее распространение получает https. Каждый пользователь сети должен знать, что нельзя выполнять действия, связанные с любыми секретными данными (например кредитками), на страницах, работающих по протоколу http. В таком случае любой человек, имеющий доступ к оборудованию, которое лежит между вами и сервером, обслуживающим сайт, сможет прочитать эти данные. Обратите внимание, что на популярных сайтах страницы оплаты всегда отдаются по https. В свою очередь, умение работать с https сразу добавляет новые понятия:
- Шифрование, асимметричное шифрование
- Сертификаты
- Цифровая подпись
TCP/IP
http существует не сам по себе, а поверх стека протоколов TCP/IP. Базовое знание сетей важно по следующим причинам:
- Безопасность. Очень легко совершить ошибку и быть взломанным.
- Отладка. Немалая часть вопросов запуска и конфигурирования сайтов и их частей (в том числе базы данных) связана с сетевыми сокетами. Не зная сети вы будете останавливаться на любой простейшей проблеме без понимания, что вообще делать.
DNS
DNS, служба доменных имён. Каждый раз, когда мы вбиваем адрес в браузер, он выполняет DNS запросы к соответствующим серверам для выяснения того, какой ip-адрес принадлежит сайту. Дело в том, что соединение с сервером идёт по tcp/ip, а не по http. http начинает работать уже после того, как было установлено tcp соединение. Знание DNS важно по следующим причинам:
- Зная DNS вы сможете не только купить домен, но и привязать его к вашему серверу
- Почта для домена, верификация вашего проекта различными сервисами — всё это работает через возможности DNS
- Опять же, отладка. Нередко проблемы загрузки связаны с DNS.
Тесты
С ростом приложения вносить изменения становится все сложнее, растут зависимости и как следствие какскадом проявляются влияния ошибок на код. Конечно, степень влияния зависит от того, насколько ваш проект хорошо спроектирован, но, в любом случае. Чем больше проект, тем связей больше и стоимость внесения изменений выше.
Единственный по-настоящему действенный способ проверить, всё ли хорошо — автоматизированные тесты.
Автоматизированное тестирование — достаточно большая тема, которая не обходит стороной ни одного профессионального разработчика. Чем раньше вы научитесь их писать, тем лучше сформируетесь как специалист, а ваш код станет гораздо надёжнее. Но правильно писать тесты — целая история.
Написание тестов (особенно до кода) входит в методологию, называемую XP или экстремальное программирование. Она включает в себя лучшие практики, помогающие писать качественный код.
Двенадцать основных приёмов экстремального программирования (по первому изданию книги Extreme programming explained) могут быть объединены в четыре группы:
- Короткий цикл обратной связи (Fine-scale feedback)
- Разработка через тестирование (Test-driven development)
- Игра в планирование (Planning game)
- Заказчик всегда рядом (Whole team, Onsite customer)
- Парное программирование (Pair programming)
- Непрерывный, а не пакетный процесс
- Непрерывная интеграция (Continuous integration)
- Рефакторинг (Design improvement, Refactoring)
- Частые небольшие релизы (Small releases)
- Понимание, разделяемое всеми
- Простота проектирования (Simple design)
- Метафора системы
- Коллективное владение кодом (Collective code ownership) или выбранными шаблонами проектирования (Collective patterns ownership)
- Стандарт оформления кода (Coding standard or Coding conventions)
- Социальная защищённость программиста (Programmer welfare):
- 40-часовая рабочая неделя (Sustainable pace, Forty-hour week)
Анализ больших объёмов данных
Часто Python применяют для анализа больших объёмов данных. Это и машинное обучение, и нейронные сети. Python используется в статистических расчётах и в компьютерном зрении (Computer Vision, см. OpenVC), успешно помогает работать с естественными языками (Natural Language Processing).
Создание интерфейсов взаимодействия с пользователем.
Многие Python-программы предоставляет пользователю графический интерфейс (GUI, Graphical User Interface). Другие программы общаются с пользователями голосом (голосовые помощники) или текстом (чат-боты). В целом организация взаимодействия "человек-машина" — огромная отрасль со своими техниками, законами, научным фундаментом. И отрасль важная, ведь программа настолько успешна, насколько доволен её пользователь!
Инфраструктура
Пилить фичи — только полдела. Чтобы начать разрабатывать нужно для начала настроить окружение разработчика, используя Docker Compose. Затем, чтобы было куда выкладываться, нужно настроить production-окружение (то, где будет работать сайт) и в конце концов задеплоить (развернуть) туда сайт.
Современная инфраструктура — тоже код, и её нужно программировать. Вот список самых важных программ, созданных для этого: Ansible, Terraform, Docker.
Эксплуатация
Сайт, находящийся в работе, тоже нуждается в заботе. Проблемы могут прийти из любого места. Закончилось место на диске, произошёл сетевой сбой, произошла ошибка в логике работы, проявляющаяся только при определённых входных данных. Обо всем этом нужно узнавать как можно раньше. Эксплуатация ПО включает в себя такие понятия как мониторинг, alerting, сбор логов и другие инструменты.
Програмимист Алексей Пирогов, автор курса по которому я написал данный конспект, рекомендует начать с DataDog и Rollbar.