Вихревой проект с большим влиянием

Два года назад я начал работать разработчиком в стартапах. Стало очевидно, что самый важный навык, которым должен обладать разработчик, - это способность быстро осваивать новые технологии. Мой подход к изучению новой технологии очень похож независимо от технологии. Я начинаю с прочтения страницы «Информация», пытаясь определить проблему, которую пытается решить технология. Затем я просматриваю варианты использования и просматриваю краткое руководство. Наконец, я перейду к написанию того, что мне нужно. Сначала я найду пример в Интернете, а затем, возможно, попробую адаптировать существующий код или угадаю и проверим свою собственную реализацию. Затем я запущу код и буду следить за сообщениями об ошибках. За прошедшие годы я очень хорошо научился читать трассировки, и это сделало меня гораздо лучшим программистом. А также stackoverflow, stackoverflow и stackoverflow. Мне напомнили о том, насколько важен навык быстрого изучения новых технологий во время недавнего проекта, когда я обнаружил, что программирую на 5 разных языках за 5 дней. Моей задачей было построить конвейер данных, который обрабатывал изображения до того, как они были использованы для обучения сверточной нейронной сети.

День 1. Ruby on Rails

Хотя я работаю в команде R&D, команда backend разрабатывает с использованием Ruby on Rails. Они разработали Ruby-скрипт, который анонимизирует данные, а затем выгружает их для использования НИОКР. У нас были встречи, чтобы определить, какие таблицы / столбцы из производственной базы данных, которые R&D могут использовать для построения нейронных сетей, но я заметил, что процедура анонимизации данных никогда не обновлялась. Я обратил на это внимание инженеров, и они предложили мне обновить процедуру, потому что я точно знал, какие столбцы требуются. Таким образом, в первый день мне потребовалось написать код на Ruby, языке, с которым у меня не было опыта. Это было не слишком сложно, поскольку я просто обновлял существующий скрипт.

День 2: SQL

Теперь у меня были URL-адреса необработанных изображений, которые нужно было обработать для нейронной сети. Наряду с URL-адресами изображения должны были быть связаны с их типом и параметрами изменения размера, однако эта информация была фрагментирована по шести таблицам в базе данных. Мне нужно было написать процедуру SQL, которая очищала и собирала данные в одну таблицу. Раньше я работал с базой данных при разработке веб-приложения Django, но одна действительно хорошая вещь в Django - это его объектно-реляционная модель (ORM). Это означает, что я никогда не писал необработанный SQL, а вместо этого использовал API Python. Однако в моем текущем проекте я больше не был избалован удобством ORM, и мне пришлось писать необработанный SQL. SQL - не самый сложный язык, но у него есть некоторые особенности, которые я не сразу нашел очевидными. Например, вы не можете выбрать столбцы во время группы, если вы также не агрегируете этот столбец (это имеет смысл, если подумать). Вместо этого вам нужно выполнить обратное соединение с исходной таблицей на основе уникального поля (эффективно агрегируя этот столбец). Кроме того, при объединении двух таблиц вы можете вернуть больше строк, чем присутствует в любой отдельной таблице. К концу я полюбил декларативное программирование, и оно мне даже начало нравиться.

День 3 + 4: C ++ и Python

После успешного изменения процедуры дампа данных и написания скрипта очистки sql у меня были данные, которые мне нужно было обработать. Этот проект, сфокусированный на сегментации изображений, нуждался в дальнейшей обработке изображений и связывании их с метаданными, прежде чем они могут быть введены в нейронную сеть. Это было написано на C ++, другом языке, с которым я никогда не работал и, честно говоря, опасался (я никогда не работал с компилируемым языком). Возможно, было бы нормально оставить половину моих сценариев обработки на python, а другую половину на C ++, но мне было бы очень сложно вносить изменения в сценарий C ++, поэтому я решил перевести код C ++ на python. Для этого мне пришлось скомпилировать и запустить код C ++, понять его, а затем написать его эквивалент на python. Это было действительно сложно, но мой коллега помог мне настроить среду сборки с помощью xcode. Честно говоря, я нашел отладку C ++ действительно сложной задачей, главным образом потому, что я не мог открыть интерпретатор и проверить свою логику. Когда я говорил об этом со своим коллегой, он привел контрапункт, что это хорошо, потому что позволяет избежать ошибок времени выполнения. Одна вещь, которую я заметил, это то, насколько медленнее был код Python (* шмыгать шмыгом *).

День 5. Язык конфигурации Hashicorp (HCL) - Terraform

Теперь, когда у меня были сценарии обработки (на Python) и соответствующие данные (таблица postgres), пришло время фактически обработать изображения - задача, которая могла занять много часов, а может быть, даже дней. Единственная проблема заключалась в том, что эти изображения находились в частных корзинах S3. Мне кажется, что каждая компания могла бы использовать вдвое больше инженеров DevOps. Мне было неудобно просить небольшую команду DevOps отвлечься от поддержки и разработки рабочего приложения, поэтому вместо этого, следуя их указаниям, я погрузился в terraform, инфраструктуру как платформу кода. Используя эту структуру, я написал код, чтобы снабдить машину соответствующими модулями, которые могли бы обрабатывать изображения. Это было очень сложно. Я знаю, как программировать программы, но настройка VPC, групп безопасности, ресурсов S3 была совершенно не для меня. Благодаря терраформному реестру готовых модулей и помощи DevOps я смог кое-что собрать вместе. Боковое примечание: облачная наука о данных - это многообещающая область, которая называется DataOps. Это очень интересно, и этот опыт максимально приблизил меня к этому.

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