Велика кількість бібліотек, сувора динамічна типізація та проста логіка. Розробники — про переваги та недоліки Python
Python — одна з найпопулярніших мов програмування, про що свідчать різноманітні рейтинги. За даними DOU, з 2020 року Python — улюблена мова програмування респондентів, проте в комерційному використанні вперше за декілька років частка Python знизилась.
Ми запитали в досвідчених Python-розробників про те, за що вони люблять мову, а що хотіли б покращити.
Пишіть у коментарях, про яку мову хочете прочитати далі.
«На Python можна швидко створювати програми. Бібліотеки досить розвинені, мова високорівнева»
Роман Могилатов, VP of Engineering at Portside, Inc.
З Python я працюю з 2013 року. Ознайомився з мовою, вже маючи шість років комерційного досвіду в розробці. Моїм першим продакшн-проєктом на Python був асинхронний високонавантажений сервіс на фреймворку Twisted. Не питайте, чому так було потрібно. Хто писав на Twisted
Попри високий поріг входу в Twisted, сама мова Python дуже сподобалася. Освоюючи кожну нову конструкцію, все більше закохувався в неї. З кожним новим завданням поринав усе глибше — пам’ятаю, яким відкриттям були metaclass, модуль inspect, list comprehensions та генератори. Адже раніше я писав на PHP, і там цього всього не було.
З 2013 року вдалося випробувати мову для різних цілей: для побудови API, мікросервісної архітектури, асинхронних застосунків, ETL-систем, Telegram-бота для пошуку менторів, найпопулярнішого Dependency Injection фреймворку, переписування його на Cython, а також у проведенні понад 300 технічних інтерв’ю.
Отже, які особливості я зауважую?
У Python сувора динамічна типізація — це коли «42» + 42 викидає помилку. З несуворою типізацією результат буде 84 або 4242, залежно від мови. Мені ця сувора типізація в Python подобається, вона допомагає уникнути помилок, і код читати легше.
Динамічна типізація — це коли foo = 42, а не int foo = 42. Можна змінити тип змінної після її створення: foo = «42», а потім foo = 42. Це корисно, коли наводиш типи перед обчисленнями foo = int(foo ). З іншого боку, можна зробити так: foo = 42, а потім foo = {}. Python це дозволяє, але я намагаюся так не робити. Коли змінна змінює тип на несумісний, то такий код важко виправляти.
У Python мені завжди подобалося, що не потрібно вказувати тип, але останнім часом я перестав цим користуватися. У Dependency Injector я обираю Cython і майже всюди вказую типи для підвищення продуктивності. Коли пишу на Python, використовую mypy. Так звик, відмовлятися не хочу.
Я завжди вважав, що mypy — це більше про engineering perfection. Пам’ятаю своє здивування, коли під час першого використання вдалося знайти кілька справжніх помилок.
Підкреслення як спосіб інкапсуляції. Якщо ім’я методу, функції або властивості Python починається з підкреслення «_foo», значить воно protected — його не можна використовувати за межами класу. Хіба що дуже хочеться: мова не викине помилку, якщо ви зробите foo._bar().
Але ми в Python-спільноті домовилися так не робити. І не робимо. У будь-якого Python-розробника, який побачить foo._bar(), почне посмикуватися око і з’явиться відчуття, що тут щось не те. На код-рев’ю вам нагадають, що так робити не варто, тому що це порушує інкапсуляцію і може призвести до помилок.
Виходить, що ключового слова protected немає, а його функція виконується — ідеальне рішення за TRIZ. Я завжди відчуваю піднесення, коли про це розповідаю. Тобто можна просто домовитися і прибрати ціле ключове слово з мови? Це ж так круто, домовмося ще про щось!
Сфера застосування. Я ознайомлений з Python з погляду бекенд-розробки. Але сфера застосування мови значно ширша. Python хороший (або навіть найкращий) для роботи з даними, на ньому можна написати десктоп GUI, а незабаром, може, і фронтенд (привіт, WASM, pyodide). Асинхронна мережна програма,
Думаю, це сильна сторона — більше користувачів, бібліотек і підходів — усе це розвиває та зміцнює мову.
Продуктивність. За продуктивністю Python — не майстер спорту. Принаймні його еталонний інтерпретатор CPython. Python-розробник скаже, що продуктивність — не завжди вузьке місце, є інші інтерпретатори (PyPy, Jython тощо), і взагалі, проблемні місця можна переписати на Cython/C/C++ або Rust. Це так, щоправда, краще б усе просто працювало швидко з «коробки». I have a dream that one day.., як казав Мартін Лютер Кінг.
Коли я переписував Dependency Injector на Cython, приріст у швидкості був приблизно в 50 разів. Фактично DI створював об’єкти з «ін’єкціями» так само швидко, як якби я вказав їх вручну. Зараз перевірити неможливо, тому що немає точного аналога DI на чистому Python, але думаю, порядок цифр такий самий.
Багатопотоковість, мультипроцесинг та IPC. У багатопотоковості в Python є відома особливість — GIL. GIL накладає певні обмеження на застосування потоків. Він робить їх марними, але якщо не знати цю особливість, можна значно погіршити продуктивність програми навіть у порівнянні з роботою в одному потоці. Користь від GIL теж є — про це завжди можна запитати на інтерв’ю :)
Мультипроцесинг у Python, на мій погляд, зроблено класно. З системного погляду все організовано правильно, API є високорівневим і зрозумілим, всі потрібні перемикачі на місці. IPC (Inter Process Communication): у стандартній бібліотеці є реалізація черги, shared memory об’єктів і всіх необхідних примітивів синхронізації.
Поширеність. Зараз моя робота — менеджерська, і частина моїх обов’язків — це пошук спеціалістів. У Python тут все дуже добре. У 2021 році мова стала найпопулярнішою за версією сайту Statistics and Data.
Також помітив, що мова стає все популярнішою за статистикою відвідування документації з Dependency Injector. Щороку щонайменше на 30%.
Скриншот з Google Analytics
Вважаю популярність мови великим плюсом як для фахівців, так і для бізнесу.
Швидкість розробки. На Python можна швидко створювати програми. Бібліотеки досить розвинені, мова високорівнева. На фреймворках Django та REST можна за місяць зробити REST API для кількох десятків сутностей. Django-адмінка — у подарунок. Так, до неї багато претензій, але бізнесу подобається.
«Щоб закрити слабкі сторони Python, ми у вакансіях вказуємо, що потрібні знання анотацій типів, а також вміння писати автоматизовані тести»
Володимир Обризан, технічний директор Design and Test Lab, к. т. н.
Популярність мови виражається в кількості претендентів на позицію Python-програміста та у великій кількості технічної документації та рішень на Stack Overflow.
Сильні сторони мови: низький поріг входження для програмістів-початківців, стандартна бібліотека та велика кількість пакетів з відкритим вихідним кодом. Таким чином, можна підібрати готове рішення під практично будь-яке завдання.
Наприклад, в одному з наших проєктів з аналізу та моделювання інженерних мереж міст треба було вирішити завдання, пов’язані з алгоритмами на графах: пошук найкоротшого шляху, декомпозиція, досяжність. Ми скористалися готовою бібліотекою NetworkX, в якій реалізовано сотні алгоритмів та операцій над графами, заощадили багато часу, а замовнику — грошей.
Окремо зауважу про підтримку у вигляді Python SDK від різних вебсервісів (наприклад, бібліотека boto3 для роботи з будь-яким сервісом Amazon Web Services).
Серед недоліків — те, що в ніші розробки вебсайтів і вебсервісів Python більше асоціюється з невеликими програмами, MVP, тому є небагато джерел інформації, як розробити великі програми, наприклад інтегрувати безліч доменів і сервісів.
А ще тут є анотації типів (type hints): проанотований код не дає гарантії, що там немає помилок типізації, адже типізація перевіряється тільки на етапі введення інструкцій і під час лінтингу, а в момент виконання можна підставити об’єкт будь-якого типу (інтерпретатор Python каже: «Я все це хаваю, у мене немає вибору» :)
У результаті, щоб закрити слабкі сторони, ми у вакансіях вказуємо, що потрібні знання анотацій типів, а також вміння писати автоматизовані тести. А якщо кандидат їх не знає, то доучуємо на етапі адаптації. Подітися нікуди — на код-рев’ю ми не приймаємо код без анотацій і тестів.
«Python став основою сучасних мов програмування. Він показав, що спрощувати синтаксис і знижувати поріг входження — це правильно»
Михайло Кашкін, Founder в Okumy та автор курсів з Python
Я розглядаю Python на кількох рівнях: як програміст, який колись виділив час, щоб його вивчити, і як менеджер, який вибирає Python як технологію. Почну з того, чому це моя улюблена мова.
Стабільність. Основи Python мало змінилися протягом останніх
Простота. Спочатку програмування було для людей з вищою освітою. Але Python показав, що зрозуміле краще, ніж незрозуміле. У синтаксисі Python дуже мало складних рішень. Гвідо ван Россум, творець мови, охороняв її від впливу різних модних віянь. Python має філософію — «Дзен Python» (The Zen of Python), і вона вплинула на майже всі нові мови програмування. Код Python дуже зрозумілий, й інші мови теж прагнуть спрощувати синтаксис.
Чітка структура. Раніше вважали, що це не актуально, мовляв, навіщо ж там мільйони пробілів. Але майже всі нові мови програмування випускають із вбудованим форматувальником, який робить те саме, що й Python.
Багатий вибір інструментів. Мову використовували в науковому середовищі, де заведено втілювати колаборації, працювати спільно над чимось. І замість того, щоб створювати
Недоліки. Перше — це те, що немає широкої підтримки мобільної розробки. Хоча я гадаю, що це питання часу.
Друге — багато хто називає Python повільним. Я не згоден. Щоб зрозуміти ціну «повільності», спочатку варто усвідомити, яку роль відіграє саме мова у конкретному бізнесі.
Наприклад, візьмемо Djinni, де колись були проблеми з продуктивністю. Припускаю, що його обслуговують два сервери, і якби ми використовували якусь технологію, яка збільшила б швидкість у 500 разів і достатньо було одного сервера, то, найімовірніше, протягом року Макс Іщенко на своєму проєкті Djinni зміг би заощадити дуже маленьку суму грошей. У нього є співробітники, обороти, рекламні компанії тощо — і це великі статті витрат. Оренда серверів коштує недорого — наприклад, на сайт заходить 10 тисяч людей на день, і його може обробляти сервер за 30 євро на місяць. Якщо ти прискориш, то зможеш заощадити зовсім небагато.
Програмісти прагнуть досконалості, але для бізнесу збільшення продуктивності кінцевого коду має невелику цінність. Набагато важливіша швидкість розробки. І Python у цьому сенсі є дуже продуктивною мовою.
Бізнес вибирає Python, тому що він показує результат в стислі терміни. Тому я не розглядаю швидкість Python як суттєвий недолік.
У світі досі використовують Ruby, який у 100 разів повільніший за Python. І він чомусь продовжує жити. А Python при правильному використанні можна порівняти за швидкістю з Go, яку вважають високопродуктивною мовою.
Серед недоліків Python виділяють те, що немає суворої типізації, і я частково погоджуся з цим. Також неможливо використовувати Python всередині браузера для побудови клієнтської частини. Весь проєкт зробити на Python, включаючи UI, не вдасться.
«Велика безкоштовна екосистема бібліотек і обмежена здатність до рефакторингу»
Сергій Зайченко, архітектор-консультант у Design and Test Lab, R&D Engineer у Sigasi, к. т. н.
Python добре вписується в проєкти, де домінує модель обчислень async/await, тобто одночасні запити з тривалими очікуваннями зовнішніх систем через мережу, очікування сховищ тощо. Навпаки, застосовувати його для завдань з інтенсивними обчисленнями на CPU безглуздо, хіба що йдеться про інтеграцію бібліотек з Python API, але нативною реалізацією на C/C++.
Сильні сторони:
- Нема потреби застосовувати платні інструменти для розробки, платні фреймворки, application-сервери для деплою тощо. Є велика безкоштовна екосистема бібліотек, фреймворків, а також взаємозамінних альтернатив. Принаймні на початкових етапах проєкту можна обійтися мінімальними витратами на інструменти.
- Багата екосистема для спеціалізованих ніш, таких як AI та Data Science. Мабуть, найкращий вибір навчальних ресурсів, які не потребують тривалої адаптації та занурення.
Слабкі сторони:
- Обмежена здатність до рефакторингу. Навіть з анотаціями типів та щільним покриттям модульними тестами не завжди виходить рефакторити без регресій, особливо якщо в коді використано мовні засоби на кшталт **kwargs або нетипізовані словники, де вже безсилий лінтинг.
- Немає стандартного засобу застосування залежностей out-of-the-box. Деякі бібліотеки або поєднуються з типізацією, або вимагають написати стільки ж boilerplate-коду, скільки організовувати використання залежностей самостійно.
- Оскільки типізація поверхова і необов’язкова, Python критично залежить від покриття коду модульними тестами. Якщо код не активізовано, не факт, що він взагалі коректний навіть на рівні відповідності імен методів, які є в об’єкті. Високе покриття модульними тестами обов’язкове.
«Python дають вивчати дітям як вступ до програмування»
Оксана Лобко, Co-founder в achievki.io
Python — майже як псевдокод, має мінімалістичну чисту логіку. Зараз його дають вивчати дітям як вступ до програмування.
Натрапляла на пораду для підготовки до FAANG-інтерв’ю — вивчити Python лише для того, щоб швидко і правильно вирішувати алгоритмічні задачі, що є найскладнішим бар’єром для отримання оферу в FAANG. Чому саме Python? Бо буде менше коду і чиста логіка.
У Python є безліч бібліотек для будь-яких завдань. На ньому більшість проєктів вдасться будувати найшвидше.
Коли вперше побачила код djinni, то здивувалась, як там багато бізнес-логіки, автоматизації процесів та спеціальних кейсів і як просто це все описано. Збоку було видно лише вершину айсбергу. Якби хтось захотів «усе переписати» і зробити технічне завдання на djinni, то було б значно більше тексту, ніж просто взяти Python-код.
Цієї мови мені вистачає для всього на бекенді. Але люди кажуть, що на highload-частинах треба окремі шматки коду переписувати на чомусь швидшому — Cython, Golang, Rust, C.
«Python можуть використовувати не тільки програмісти»
Святослав Потєєнко, Team Lead, Senior Python Developer, DataArt
У 2015 році мій знайомий купив квартиру, а його відповідь на моє запитання «Як заробив?» була «Python». Так я збагнув, що час переходити з PHP на мову з більшим рейтом.
Одна українська компанія мала потребу в автоматизації обліку, тому я почав розбиратися з Django. Система трансформувалася в повноцінну ERP, пережила багато автоматизаторів, які хотіли її замінити, й працює досі.
Для мене Python — як швейцарський ніж. На ньому швидко можна розгорнути адмінку вебсайту, провести експеримент з даними або побудувати лінію обробки даних у хмарі.
Коли я розробляв ERP-систему 2015 року, я взагалі не знав, за що берусь і які кінцеві вимоги будуть до неї. Але Django дала змогу реалізувати всі побажання замовника у довгостроковій перспективі: SMS-розсилки, фінансові звіти, друк платіжок та облік відносин з клієнтами тощо.
Для іншої задачі потрібно було побудувати систему для збору біржових даних. При цьому вона мала стабільно працювати у нестабільних умовах. Прототип вдалося запустити за тиждень!
Загалом я рекомендую використовувати Python для обробки даних, бекенду вебсайтів та, звісно ж, data-аналітики.
За що я люблю Python? Хотів відповісти «стильно, модно, молодіжно», але подумав, що зараз є більш популярні мови. У 2015 році Python був не настільки широковживаним. Це була серйозна і структурована мова програмування, що давала впевненість у тривалому терміні життя написаних продуктів. Думаю, що того року мені пощастило потрапити в правильне місце у правильний час на початку цього тренду.
Люблю Python за привітне ком’юніті та базові речі: Django для швидкої підготовки CRUD, зручний пакетний менеджер і багато бібліотек на всі випадки життя.
Ще одна фішка полягає в тому, що Python можуть використовувати не тільки програмісти. Є багато інструментів, які дають змогу застосовувати його для аналітики та дослідження даних в інтерактивному режимі (Jupyter Notebook, pandas).
За що не люблю Python? Найперше — невелика швидкість обробки даних, якщо порівняти з іншими компільованими мовами. Але на моїх проєктах завжди можна налаштувати паралелізацію: розбивати задачі та масштабувати кількість одночасних процесів.
У 2021 році навколо Python виник хайп: всюди почала з’являтися реклама курсів, якість яких дуже сумнівна (всім обіцяють підозріло швидкий результат). Хоча насправді далеко не кожен може опанувати програмування або аналітику з нуля, маючи одне лише бажання заробити, а терпіння вчитися роками при цьому не вистачає.
Це призвело до того, що на ринку з’являється багато випускників, які не можуть виконати просту задачу на реальних проєктах. Це збільшує навантаження на команду, яка мусить дотягувати цю людину до потрібного рівня та одночасно робити все за неї.
Помічаю, що у початківців виникають складнощі з розумінням базових системних речей: як працює HTTP-протокол, безпека вебсайтів, процеси, потоки, що і де краще використовувати. А універсальна порада для всіх — намагайтеся писати свій код з думкою, що він буде написаний один раз, а прочитаний десять разів. Це стосується і коментарів, прийнятних назв змінних і загалом структури програми.
«Мене захоплює широкий вибір напрямів розробки, який дає Python»
Михайло Годісь, Software Engineer в N-iX
З Python я стикнувся наприкінці студентських років, коли потрібно було підготувати дипломну роботу. Оскільки проєктом була система з вебінтерфейсом, тоді на думку спав саме Python, який я вивчав під час поїздок у метро. Бажання рухатись саме в цьому напрямку підкріпили кілька переглянутих відеоуроків про Django.
Звісно ж, тепер кумедно згадувати ті фактори, якими керувався при виборі технологій, проте від того часу на комерційному рівні здебільшого стикався саме з Python. За понад чотири роки використання вдалось випробувати мову з різних сторін та у різних галузях (fintech, healthcare, cybersecurity, retail).
Python уже давно завоював прихильність розробників за свою простоту, швидкість роботи та чудовий синтаксис. Але мене найбільше захоплює широкий вибір напрямів розробки, який дає ця мова.
Ти початківець і хочеш розібратись? Без питань, веброзробка — чудовий напрям, де є проєкти будь-якої складності. Хочеш бути ближчим до науки або спробувати свої сили у чомусь новому? Data Science та Machine Learning до ваших послуг. А як щодо нижчих рівнів, можливо, роботи з приладами? Більше ані слова — хапай Raspberry Pi й твори. Якщо ж усе це поєднати, то можна тільки уявити, які цікаві проєкти отримаємо.
Варто відзначити Python-спільноту, завдяки якій доступна велика кількість бібліотек. Окрема подяка всім тим авторам, які підтримують документацію в стандартизованому та зрозумілому вигляді. Все це дає змогу зайнятися новими технологіями за лічені хвилини й робить поріг входження для новачків низьким, навіть якщо ви вперше бачите ту чи іншу бібліотеку.
Проте є й інша сторона Python — open-source мови. Неодноразово доводилось стикатися з тривалими кодовими детективами та зрештою розумінням, що 3rd party бібліотека, з якою працюєш, містить помилки й потрібно щось із цим робити. Не наважуюсь назвати це недоліком, тому радше скажу, що це особливість. Варто пам’ятати про це й частіше заглядати у код самих бібліотек або шукати відповідне issue в репозиторіях розробників, щоб не витрачати час на пошуки проблеми самостійно.
Також не забувайте, що Python — інтерпретована мова, і мізерні помилки у коді можуть призвести до серйозного головного болю. Думаю, багато хто потрапляв у ситуацію, коли пропущена кома в списку рядків призводила до годинного (хто більше?) пошуку проблеми та щирого нерозуміння, що відбувається. В такий момент розумієш важливість хорошого покриття коду тестами.
Наостанок зауважу, що через свої особливості Python не дає змоги зрозуміти деяких базових понять у світі програмування, як-от інші мови. Наприклад, не розкриває деталей структур даних і має своєрідне поняття про багатопотоковість процесів. Зрозуміло, що схоже мають пояснювати під час навчання в університеті або на відповідних курсах, проте ні для кого не секрет, що доволі багато людей починають свій шлях іншим способом.
Python — чудова мова, яка, як і будь-яка інша, при вмілому використанні стане надійним партнером у ваших цілях. Всім дзену!