Адиль Хаштамов

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

Агрегатор вакансий об удалённой работе

Представляю на обозрение мой новый небольшой проект задача которого собрать в сети лучшие предложения об удалённой работе в Интернете — Remotelist.ru. Мой личный опыт удалённой работы вот вот приблизится к 4-м годам, более того, я активно поддерживаю такой вид занятости потому что у него куда больше плюсов чем минусов. Обещаю следующий мой пост посвятить лайфхакам удалённой работы.

О чём этот проект? Если вы находитесь в активном поиске  работы, то вам нередко приходится мониторить множество предложений с различных сайтов: Мой Круг, Stackoverflow, VC.ru, HH.ru, LinkedIn и многих других. Задача моего сайта собрать как можно больше предложений об удалённой работе в одном месте и оповещать вас о них. Проще говоря, Remotelist это агрегатор вакансий. В планах у меня есть мысль реализовать функцию постинга вакансии, но она появится чуть позже при условии востребованности сайта 🚀.

Сейчас помимо самого сайта, кросс-постинг вакансий в виде дайджестов в автоматическом режиме публикуется и в телеграм-канал @remotelist каждые 3 часа, при условии наличия новых предложений разумеется.

Если звёзды сойдутся благоприятно для сайта, то он будет развиваться в сторону персонализации. Что это значит? Если вы читатель моего блога, то в курсе, что я активно изучаю тему машинного обучения, и этот проект неплохая возможность потренировать свои навыки. Будет реализован личный кабинет с возможностью подключения своего github/stackoverflow/linkedin/etc аккаунта. На основе информации о специалисте, сайт будет рекомендовать наиболее подходящие вакансии, тем самым экономя время и нервы при поиске. Поживём-увидим.

Если вас заинтересовал проект, то, пожалуйста, подпишитесь на телеграм-канал @remotelist, а также добавьте мой сайт в закладки 😄

читать дальше

Designing Data-Intensive Applications

Где-то в середине 2017 года на глаза мне попалась интересная книга издательства O’Reilly под названием “Designing Data-Intensive Applications”. В то время я активно искал информацию в сети на тему Data Engineering. Как оказалось, материала по теме не так много, поэтому книга оказалась для меня открытием. Что же такого примечательного в ней?

Тема “data engineering” заслуживает отдельного поста, который появится в ближайшее время как только соберусь с мыслями. Для меня работа с большими данными это в первую очередь фундаментальные знания об устройстве распределенных систем. Книга Designing Data-Intensive Applications поможет вам окунуться в эту тему с головой и послужит хорошим стартом. Здесь Martin Kleppmann простым языком и очень подробно рассказывает как устроены современные базы данных, как работают sql/nosql/newsql хранилища, в чем разница между B-Tree+ и LSM-Tree, а также достаточно подробное описание современных форматов кодирования данных Avro, Thrift, Protobuf.

Особенно полезна книга будет тем, кто хочет связать свою карьеру с распределенными системами. Автор даёт достаточно информации по таким темам как репликация, партицирование, работа транзакций, а также раскрывает проблемы, возникающие при взаимодействии удаленных узлов. Ну и конечно же куда нам без CAP-теоремы. В книге также упоминаются современные методы обработки данных — Batch Processing и Stream Processing. А в последней главе нас ждет небольшое лирическое отступление и размышления на тему будущего больших данных.

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

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

читать дальше

Машинное обучение и Big Data

Около месяца назад начал проходить сразу 2 специализации на платформе Coursera:

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

Хочу поделиться мыслями о курсах. Начнём с первого.

Цель курса "Математика и Python для анализа данных" — обозначить необходимый набор навыков для успешного прохождения всей специализации. Здесь вы найдёте небольшое введение в язык Python и его инструменты для анализа данных: pandas, numpy, scipy, остальная же часть курса посвящена математическому аппарату, а именно темам из линейной алгебры (матрицы, векторы, векторное пространство), теории вероятностей и немного затронут математический анализ — предел и производная. Особенно понравился упор на прикладные задачи, т.е. изучая, например, матрицы или векторы, понимаешь как их применять для решения прикладных задач. Но курс всё таки требует некоторой предварительной подготовки по обозначенным мною темам.

Эти материалы возможно помогут при прохождении курса:

Big Data Essentials это первый из 5 курсов, посвященных "горячей" нынче теме про построение инфраструктуры для эффективного анализа данных. Анонс специализации я делал у себя в Telegram канале в первой половине октября. Тогда я только присматривался, в итоге решил проходить. Что из себя представляет первый курс? Это плавное введение в основные инструменты анализа больших данных — Apache Hadoop и Apache Spark. Из 6 недель курса, 2 недели исключительно практические, вообще практических заданий тут хватает. Материалы курса предполагают некоторый опыт программирования, от себя добавлю, что большим плюсом будет наличие навыка в функциональном программировании. К сожалению, есть и ряд минусов. Так как материал появился относительно недавно, в нём есть ошибки из-за которых я терял время. Во-первых, встречаются задания с ошибками в формулах и коде, частенько "валился" удалённый hadoop/spark кластер. Мой совет перед выполнением заданий — активно читайте форум, тестируйте код локально на небольших кусках данных, по возможности поднимите свой docker-контейнер с hadoop или spark (в материалах есть ссылка на контейнер, а на форуме инструкция по настройке). Ещё смущает дичайший русский акцент, иногда в речи встречаются неверно составленные предложения, но к этому можно привыкнуть.

Изучение продолжается. На очереди у меня "Обучение на размеченных данных" и "Big Data Analysis: Hive, Spark SQL, DataFrames and GraphFrames". Скучно точно не будет :)

читать дальше

Строим Data Pipeline на Python и Luigi

Data Pipeline

Введение

В эпоху data-intensive приложений рядовым разработчикам всё чаще приходится сталкиваться с задачами по обработке и анализу данных. Ещё десять лет назад данные большинства проектов могли уместиться на жестком диске одного компьютера в какой-нибудь реляционной базе данных типа MySQL. А задачи по извлечению и обработке хранящихся данных решались за счёт непростых (или простых) SQL запросов. С тех пор мир информационных технологий значительно поменялся. С приходом Internet of Things, мобильных телефонов и дешевого мобильного интернета, объем генерируемых данных вырос в десятки тысяч раз. Ежедневно в мире генерируются эксабайты данных. Анализировать такой поток информации вручную, а тем более извлекать полезные для бизнеса или науки данные, практически невозможно. Но технологии как и время не стоят на месте, появляются новые инструменты, наука двигает прогресс. Если вы хоть чуточку следите за новостями из мира высоких технологий, то фразы "биг дата", "машинное обучение", "глубокое обучение" вас не испугают. С приходом больших данных появились новые профессии и специализации такие как Data Scientist/Analyst (по-русски аналитик данных), Data Engineer. Задачи этих ребят тесно связаны с обработкой, анализом и хранением "нефти 21 века", т.е. информации. Но насколько эффективно они выполняются?

читать дальше

Обновляем подсистему Linux на Windows 10

Пару недель назад вышло обновление для ОС Windows 10 под кодовым названием Creators Update. Помимо ежегодных плюшек в пользовательском интерфейсе и улучшений в производительности, с этим обновлением также "прилетел" апдейт для подсистемы Linux внутри Windows 10. Год назад я уже писал о том как установить Ubuntu в Windows 10. На момент прошлой заметки, в Windows 10 была возможность включить полноценный дистрибутив Linux — Ubuntu версии 14.04 LTS. Всё бы хорошо, но 14.04 вышла 3 года назад, пора бы идти в ногу со временем и обновиться до более свежей версии (учитывая, что в 14.04 стоит Python аж версии 2.7.6). С приходом подсистемы Linux, таким разработчикам как я (любителям Windows) можно забыть про использование инструментов вроде Vagrant для унификации систем развертывания и разработки.

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

читать дальше

Введение в pandas: анализ данных на Python

Python pandas

pandas это высокоуровневая Python библиотека для анализа данных. Почему я её называю высокоуровневой, потому что построена она поверх более низкоуровневой библиотеки NumPy (написана на Си), что является большим плюсом в производительности. В экосистеме Python, pandas является наиболее продвинутой и быстроразвивающейся библиотекой для обработки и анализа данных. В своей работе мне приходится пользоваться ею практически каждый день, поэтому я пишу эту краткую заметку для того, чтобы в будущем ссылаться к ней, если вдруг что-то забуду. Также надеюсь, что читателям блога заметка поможет в решении их собственных задач с помощью pandas, и послужит небольшим введением в возможности этой библиотеки.

DataFrame и Series

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

Series

Структура/объект Series представляет из себя объект, похожий на одномерный массив (питоновский список, например), но отличительной его чертой является наличие ассоциированных меток, т.н. индексов, вдоль каждого элемента из списка. Такая особенность превращает его в ассоциативный массив или словарь в Python.

читать дальше

Используем KVM для создания виртуальных машин на сервере

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

Сейчас передо мной встал вопрос аренды хорошего сервера с большим объёмом оперативной памяти и объёмным жестким диском. Но запускать проекты прямо на хост-машине не хочется, поэтому буду разграничивать их по отдельным небольшим виртуальным серверам с ОС Linux или docker-контейнерам (о них расскажу в другой статье).

Все современные облачные хостинги работают по такому же принципу, т.е. хостер на хорошем железе поднимает кучу виртуальных серверов, которые мы привыкли называть VPS/VDS, и раздаёт их пользователям, либо автоматизирует этот процесс (привет, DigitalOcean).

читать дальше

Блог на английском языке

Английская версия блога

Начал потихоньку исполнять свой план на 2017 год с перевода статьи про работу с Celery на английский язык - Celery Best Practices: practical approach. В планах у меня начать английскую версию блога с перевода топа самых популярных статей, будут появляться по мере сил.

В последнее время стал замечать, что мой блог регулярно стали посещать пользователи из США и других англоговорящих стран, мне пока непонятно откуда они на него переходят (если кто знает как посмотреть отчёт в разрезе страна-источник в Я.Метрике, напишите, пожалуйста), но тенденция радует. Сейчас, конечно,  процент отказов среди таких пользователей высокий, но постараюсь его снизить путем интересного контента.

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

На английскую версию блога можно перейти из верхнего меню либо по ссылке - English version.

читать дальше

Блогу исполнился 1 год!

Ровно 1 год назад появился самый первый пост в этом блоге. Удивительно, но я всё таки не забросил его. Прошлый опыт говорил об обратном. Что произошло за это время?

За этот год:

  • Я написал 30 постов, включая этот. Изначально я планировал чаще писать, но ввиду некоторых обстоятельств и лени этого добиться не удалось.
  • На момент написания этого поста блог посетило 41 123 уникальных посетителя. Хороший показатель для узкоспециализированного блога с небольшим количеством контента.
  • Ежедневная аудитория увеличилась с 0 до 350 уникальных посетителей.

  • Более 60% аудитории проживает в России

Топ-5 самых популярных постов

Суммарно эти 5 статей принесли блогу 57% всех уникальных посетителей. Помните правило 80/20 ? :)

Более 85% пользователей читают статьи, используя ПК, 11% заходят через смартфон и только 3% через планшет. Это логично, так как программисты в своей работе привыкли пользоваться компьютером :)

А вот статистика по операционным системам используемых устройств:

Windows рулит :)

А вот стата по браузерам среди разработчиков:

Безоговорочный лидер Google Chrome.

Благодаря блогу в моём Telegram канале для разработчиков уже 252 подписчика! Если вы до сих пор не подписаны, то смело делайте это.

Планы на следующий год

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

  • Создать английскую версию блога. В англоязычном сегменте Интернета куда больше трафика и людей, ищущих статьи на те или иные темы. Также это неплохая возможность и дальше практиковать письменный английский, знакомиться с новыми и интересными людьми.
  • Чаще писать статьи на актуальные темы для разработчиков. Тут у меня уклон больше в сторону Python. Сейчас в работе я применяю инструменты анализа данных и машинного обучения, поэтому хотелось бы раскрыть эти темы более подробно. В планах также углубление в сторону сложных интерфейсов в веб-приложениях, об этом я уже писал в заметке про progressive web apps. Серия статей на эту тему не заставит себя долго ждать :)
  • Больше контента, а значит и больше трафика. Цель на 2017 год - 2 000 уникальных посетителей в сутки.
читать дальше

Теория разбитых окон в программировании

Теория разбитых окон в программировании

В криминалистике существует интересная теория под названием "Теория разбитых окон" (ТРО). Суть её в том, что разбитое окно, при несвоевременной замене, влечёт за собой целую серию разбитых окон. Более того, серия разбитых окон может быть индикатором повышающегося уровня преступности в заданном регионе. На ум сразу приходит известная всем фраза "Чисто не там, где убирают, а там где не сорят". Согласно этой теории, чисто именно там, где убирают, стимулируя тем самым людей не сорить в будущем. Стоит заметить, что это применимо не только к окнам :) Автолюбителям наверняка знакома эта теория на дорогах, хотя они могут и не догадываться о её существовании. Я не раз замечал большое скопление автомобилей, припаркованных под знаком "Остановка запрещена". Стоит лишь одному остановиться под ним, остальные водители не заставят себя долго ждать. Удивительно как мало внимания дорожная полиция уделяет этому факту. Правонарушения должны своевременно пресекаться.

Но вернёмся всё же в мир разработки программного обеспечения. Удивительно, но и здесь ТРО находит свой отклик. Современный процесс создания ПО находится под жестким прессингом сроков. Бизнесу очень важно как можно раньше поставить продукт на рынок по ряду причин. Отсюда рождаются различные методологии управления вроде Agile, Lean, формируются концепции MVP (Minimum Viable Product). Как следствие, страдает качество кода, он начинает "протухать". С "вонючим кодом" можно жить, более того, практически всегда он есть в той или иной степени, это нормально. Но его нарастающая доля служит одним из первых индикаторов того, что пора "бить во все колокола". Почему? Основываясь на собственном опыте скажу, что программист охотнее "говнокодит" там, где этого "говнокода" предостаточно. И наоборот, человек несколько раз подумает, прежде чем отправлять свой шедевр на код ревью, если в проекте стараются соблюдать чистоту кода. Помимо прочего, "разбитое окно" в коде создаёт ощущение наплевательского отношения к проекту, тем самым порождая чувство безразличности к нему. Зачем пытаться что-то изменить, если всем наплевать?

Чините "разбитые окна" в коде как можно чаще.

Вам может быть интересно почитать также:

читать дальше