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

Мотивы для изучения Scala

Одна из моих технических целей в 2021 году - изучить Scala. Моя основная причина изучения Scala - это изучение функционального программирования для инженерии данных.

Возникает вопрос: зачем тратить силы на изучение Scala, если функциональное программирование поддерживается в Python?

Как я изучаю разные парадигмы программирования

Как сторонник языка, который верит в использование инструментов по прямому назначению, я считаю, что лучший способ изучить новую парадигму программирования (будь то объектно-ориентированное программирование или функциональное программирование) - это изучить подходящий язык программирования, который:

  1. Разработан в первую очередь для парадигмы целевого программирования (а не в последнюю очередь)
  2. По синтаксису и шаблонам кода похож на язык программирования, с которым вы уже знакомы.

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

Например, я изучил объектно-ориентированное программирование, заново познакомившись с C и постепенно перейдя на C ++, изучая объектно-ориентированные концепции, такие как классы, наследование и полиморфизм. Этот языковой переход помог ускорить процесс изучения Python, который изначально был разработан как объектно-ориентированный язык программирования, хотя этот язык поддерживает несколько парадигм программирования.

Почему Python не идеален для изучения функциональной инженерии данных

Изучая параллельное программирование на Python для науки о данных (и я настоятельно рекомендую вам посмотреть мой доклад PyData Global 2020 для яркого объяснения параллелизма), я узнал о функциональном программировании на Python через map и itertools. Меня удивило, насколько интуитивно я мог связать функциональное программирование с математическими функциями, которые имеют смысл, и как я уже подсознательно использую некоторые концепции функционального программирования для визуализации своих потоков данных.

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

Python - это прежде всего объектно-ориентированный язык программирования.

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

Параллельное программирование в Python не является по-настоящему параллельным из-за внутренней структуры Python

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

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

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

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

Зачем изучать Scala для инженерии данных

Разработчики могут выбирать для изучения Scala по разным причинам. Для некоторых это могло быть связано с веб-программированием. В последние годы популярной причиной изучения Scala являются большие данные.

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

Scala в первую очередь предназначена для функционального программирования и объектно-ориентированного программирования

Scala разработан для бесшовной интеграции парадигмы объектно-ориентированного программирования Java и парадигмы функционального программирования и направлен на устранение критики Java.

Синтаксис Scala похож на C / C ++ и Python

Scala использует синтаксис фигурных скобок, аналогичный C / C ++, а также поощряет отступы для вложенных логических блоков (например, функции внутри класса). Небольшая разница в том, что Scala использует 2 пробела вместо 4 пробелов или табуляции (как в Python).

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

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

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

Что дальше: мои успехи в изучении Scala как программиста на Python

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

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

Когда усложняется обучение, возникает соблазн вернуться к удобным шаблонам кода, особенно в многопарадигмальном языке программирования, таком как Python. Следовательно, я иногда чувствую себя ужасно непродуктивным, когда привыкаю (и меня «направляют») к написанию кода в функциональной парадигме. Я действительно люблю использовать аннотации типов в Scala - они значительно упрощают отладку в процессе разработки!

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

Хотите больше закулисных статей о моем образовательном путешествии в качестве специалиста по обработке данных? Посетите мой сайт по адресу https://ongchinhwee.me!

Первоначально опубликовано на https://ongchinhwee.me 18 апреля 2021 г.