DevFM
2.35K subscribers
80 photos
5 videos
492 links
О разработке: технологии, инструменты, system design, процессы, команды

Для связи @sa_bul
Download Telegram
Что выведет первый print в 16 строке?
Anonymous Quiz
14%
Исключение AttributeError
44%
U1
9%
["U1","U2", "U3"]
19%
0
14%
Исключение NameError
6🌭3👍2👎2🔥21
😁6🌭5👍3🔥21
Хитрости __getattr__
В примере выше мы создаём класс Users, который, по сути, скрывает внутри обычный список пользователей.

Для получения первого и последнего пользователя потребуется писать self.users[0] и self.users[-1]. Такие конструкции раскрывают внутреннее устройство класса, загрязняют код и делают его менее читабельным. Мы заставляем внешнего потребителя класса разбираться в его внутреннем устройстве.

Один из вариантов решения — декоратор @property и создание нужных атрибутов. Но для большого количества атрибутов будет спагетти из однотипных property.

Другой приём — использование динамических атрибутов. Создаём словарь, где ключом будет имя, а значением индекс в списке пользователей. Метод getattr проверяет наличие искомого атрибута среди ключей словаря, если такой есть — то возвращает пользователя по индексу из словаря.

Детали решения
Почему первый print выведет U1?
Вся суть в том, как python ищет атрибуты. Атрибут ищется в классе. В нашем случае атрибута first нет. Далее производится поиск по иерархии наследования, и тоже безуспешно. Только в этом случае вызывается магический метод __getattr__, и параметром ему передаётся имя аргумента в виде строки "first". По словарю first превратится в нулевой индекс из self.users, что соответствует выводу U1.

Почему второй print выведет new_user?
В 17 строке явно создаем атрибут first и присваиваем ему значение new_user. В 18 строке в классе будет найден атрибут first и метод getattr не будет вызываться.

Обратите внимание ещё на одну интересность. Вывод self.users.users[0] всё ещё даст U1. Получается некая несогласованность. Мы переопределили first, и это уже не первый пользователь.

Поставьте 🔥, если интересно возможное решение такой проблемы.
🔥3632👍1🌭1
История поиска работы "Борис опять"

Недавно вышла интересная серия постов о поиске работы machine learning-инженером. Пожалуй, самое ценное в ней — личный опыт и нешаблонные советы автора. История ещё не закончена, автор продолжает рассказывать о своём опыте переезда и искренне делится эмоциями.

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

2. "Нельзя врать", — говорит автор. Врать действительно нельзя, но приукрасить можно. Грань между "приукрасить" и "врать" заслуживает отдельного поста.

3. Интересно увидеть реальное CV автора. Не будем вдаваться в нюансы составления CV, но хорошей практикой считается summary часть. В ней следует тезисно рассказать кто вы, что умеете и что хотите. Автор сетует на блок CV с перечислением технологий, которыми владеешь. И что он — инженер, готовый овладеть всеми необходимыми для решения задачи навыками. Как раз об этом и стоило бы сказать в summary. Способность осваивать новое для решения задач — скилл хорошего разработчика. А блок технологий полезен для HR, которые умеют только grep-ать резюме.

4. По этой серии постов молодой разработчик сможет приземлиться, понять, что IT это не радужное место с гарантированными 300кк/с. Найти хорошо оплачиваемую работу — это труд и дисциплина.

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

6. Переговоры — важная часть собеседований. "Уметь говорить нет" выглядит простым и понятным советом, который на деле применять совсем не просто. Хорошо работает приём, будто решение принимаете не вы, и нужно обязательно посоветоваться с третьей стороной, от которой зависит финальное решение.
#devfm #edu #резюме
👍321🔥1😁1🌭1
Миграция БД без даунтайма

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

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

В статье Migrating a production database without any downtime (перевод) рассказывается на примерах и с картинками, как пошагово решать проблему обратной совместимости базы данных и приложения.

#skills #database
👍422🔥2
Pattern Matching

В python 3.10 появилась долгожданная возможность использовать конструкцию match/case. На первый взгляд это классический switch, но в питоне пошли дальше.

В статье Recipes and Tricks for Effective Structural Pattern Matching in Python автор рассказывает о неочевидных возможностях pattern matching:
— как использовать в блоке case регулярные выражения, хотя это не предусмотрено по умолчанию
— как с помощью атрибута __match_args__ сделать позиционные аргументы в клаccе и использовать их в case
— как хитро проверить ключи и их значения в json-объектах
— и несколько ещё менее очевидных применений

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

О неочевидных проблемах автор также не забывает:
— порядок case важен, потому что какой-то case может быть недостижим
— неожиданное поведение при несовпадении ни с одним из case
#python
🔥622👍2🌭1
Пятничное развлекательное.

Среди ИТ-тусовки весьма популярны комиксы xkcd. К каждому комиксу есть интересное текстовое дополнение, которое в английской версии появляется после наведения на картинку, в русской — сразу показывается под картинкой. На Дзене есть крутая статья про историю xkcd. Приготовили для вас подборку наших любимых комиксов на ИТ-тематику:

Хороший код
Себе из будущего (код придётся переписать)
Успех (критерий успешности при сборке Linux)
Усилок рок-группы (умный инженер)
Руководства (man sudoers)
Самоописание (изящная рекурсия)
Разница (учёный vs нормальный человек)

#fun #xkcd
🔥5👍321🌭1
Кино на выходные

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

Идея не нова. Уже в 2016 году в серии Нырок e1s3 сериала Чёрное зеркало показывалось возможное развитие событий. Как повлияет на людей возможность оценить любой поступок человека?

Ещё раньше, в 2015 году в серии Ты не Иелпишь e19s4 мультсериала Южный парк рассматривался вопрос массовых рейтингов, в частности, оценки кафе и ресторанов. Велико ли влияние инфлюенсеров? Кого вообще считать инфлюенсером?

Предупреждение — в целом сериал Чёрное зеркало достаточно мрачный, а Южный парк наполнен сарказмом, перегибами, матом и местами жестью.

#fun #films
🌭4👍311🔥1
Как обмануть нейронную сеть

В статье One pixel attack for fooling deep neural networks изложен метод атаки на нейросеть, когда в результате замены всего одного пикселя на изображении распознавание становится некорректным. Чёрным подписано исходное изображение, в скобках "уверенность" нейросети, синим — распознавание после замены пикселя. И чашка становится супницей, детская люлька — бумажным полотенцем, чайник — джойстиком, а хомяк — соской.

Что это значит на практике? Дорожный знак из-за небольшой наклейки может превратиться в "кирпич" для беспилотного автомобиля, заставив машину остановиться. В современном машинном обучении многие непозволительно мало внимания уделяют злонамеренным атакам.
#skills #datascience
🔥123👍32🌭1
Backup: сентябрь

Python
1. Типовая структура python-проекта без веба
2. Вопросы для junior python developer 
3. Зачем WSGI в Python?
4. Почему стоит выбрать Python
5. Возможности f-строк 
6. Разработка надёжных Python-скриптов 
7. Pattern Matching 

Нетехнические навыки:
1. Социальная инженерия Кевина Митника
2. Хорошая и плохая прокрастинация 
3. История поиска работы "Борис опять"

Рассуждаем о программировании:
1. Sublime Merge — графический git-клиент
2. Магия CORS 

Разбираем код:
1. Что же не так в этом коде?
2. Хитрости getattr

Hardskills:
1. Брокер сообщений Apache Kafka 
2. Проектируем сервис: поиск организаций по картам
3. Поиск команд в консоли с помощью ctrl+r 
4. Постигаем git stash 
5. Мониторинг важен. Рабочий мониторинг ещё важнее
6. Продолжаем о собеседованиях 
7. Миграция БД без даунтайма

#backup
🔥8👍321
О правах на код в канале ЦИФРА

Мы рассказываем об IT-технологиях. Существует другой уровень абстракции с не менее интересными процессами. Высокоуровневое понимание цифрового права необходимо современному разработчику. Кому принадлежат права на разработанную программу?

В посте ребята освещают спорный вопрос о праве на код. Программист обвиняет компанию в неправомерном использовании разработанной им программы. Захватывает внимание отсутствие единогласия судов разных инстанций и игнорирование очевидных разработчикам фактов. Спор дошёл до Конституционного суда, где автор доказывал свое право на судебную защиту.
#edu
32👍2🔥1
Теория разбитых окон

10% людей* всегда несут фантик до мусорки, 5% людей всегда бросают фантик под ноги. Остальные 85% людей действует по ситуации — если вокруг уже грязно, то бросают под ноги, а если чисто — то несут до мусорки.

В статье О разбитых окнах проводится параллель между разбитыми окнами и проектной разработкой. Выстраивание правильных процессов даёт долгосрочный положительный эффект. На наш взгляд, в правильном процессе обязательны:
— документация (Docstrings, Readme)
— статический анализ кода (pylint, mypy, ...)
— тесты
— постановка задач и тракт issue — branch — merge request
— code review
— CI/CD
— онбординг новых разработчиков

Эксперименты про теорию разбитых окон интересно описаны в вики.

*наши наблюдения.
#edu #devfm
👍821🔥1🌭1
В прошлый раз мы разобрались, как сделать удобный доступ к первому и последнему элементу объекта users. Для этого использовали динамические атрибуты и реализовали магический метод __getattr__.

При выполнении self.first = "new_user" происходит нежелательное поведение, и атрибут first перестанет указывать на первый элемент.

Для решения проблемы сделаем атрибуты first и second read only. Для этого определим магический метод __setattr__. Обратите внимание: __getattr__ вызывается, только если искомого атрибута нет, а метод __setattr__ вызывается каждый раз при присваивании значения атрибуту.

При попытке присвоить значение атрибуту проверяется содержится ли он в shortcut_names. Если содержится, то порождается исключение. Если не содержится, вызывается родительский __setattr__.
#codereview
👍6🌭431
Тернистый путь к ClickHouse

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

Внедрение новой технологии не возникает на пустом месте. Нужно критически подходить к этому вопросу.
1. Сначала обнаруживается проблема. Если проблемы нет, то и чинить не нужно. В статье обозначена проблема сбора и анализа большого количества данных о действиях пользователей из разных систем и их вечном хранении.
2. Решение следует начинать с анализа предметной области и формирования важных критериев. Автор выделил сложность внедрения и сопровождения, порог входа для аналитиков данных, цену использования.
3. Предлагаемые решения сравниваются по сформированным критериям.

Помимо описания процесса выбора и возникающих сложностей интересно узнать в ретроспективе об архитектуре хранения и работы с данными: MariaDB -> Elasticsearch -> ClickHouse.

Для желающих погрузиться в технические особенности рекомендуем статью от тех же авторов: Репликация ClickHouse без костылей: ожидание и реальность
#skills #database
🔥522
Пятничное развлекательное — клипы

В этот день вместо профильного контента у нас культурный код.

Заряд динамической музыки вы найдёте в клипе Gigi D'Agostino Bla Bla Bla. В нём показана необычная история о путешествии, о единстве и борьбе противоположностей, о дружбе и соперничестве. Или нет, абстрактное искусство оно такое.

Если у вас нет настроения для драйва, можете расслабиться за просмотром ASMR Programming - Coding Matrix - No Talking. Vim, механическая клавиатура, немного javascript — и через 15 минут у вас заставка из Матрицы на экране. Кстати, Матрицу мы вспоминали в подборке фильмов про реальность нашего мира. А кто не знаком с ASMR — поищите другие ролики, вам может понравиться.

#fun
5🔥3👍1
Кино на выходные

Продолжаем подборку любимых фильмов о времени.

Эффект бабочки 2003 года поднимает вопрос влияния на историю в классической постановке фантастов. Может ли незначительное изменение прошлого изменить будущее? Рассказывается история Эвана, способного возвращаться в прошлое. У фильма несколько концовок. Режиссёрская версия заслуживает просмотра. Популярность фильма обеспечила выход двух совершенно провальных сиквелов.

Исходный код 2011 года показывает интересную возможность детективного расследования инцидента в прошлом за счёт перемещения сознания. Имитация реальности наше всё.

Для совместного времяпрепровождения отличным решением может быть мелодрама Кейт и Лео 2001 года. Хью Джекман в роли герцога из прошлого, оказавшегося в нашем времени. Кино оставляет приятные впечатления.

Нельзя не вспомнить Невероятные приключения Билла и Теда 1989 года. Молодой Киану Ривз уже тогда был хорош. Неплохая комедия своего времени.

В прошлые разы мы вспоминали Назад в будущее и фильмы о зацикленном времени. Приятного просмотра.

#fun #films
4🔥42👍1
ИИ на службе мошенников

Технология deepfake уже лет 5 известна широкой публике. Замена лиц на видеозаписях получается всё качественнее, а артефактов на изображении всё меньше. Изменять таким образом можно не только видео, но и аудио, причём в режиме реального времени.

В 2019 состоялся один из самых первых известных случаев применения искусственного интеллекта мошенниками. В новостной статье Fraudsters Used AI to Mimic CEO’s Voice in Unusual Cybercrime Case (русскоязычная статья по мотивам) рассказывается об этом случае. Мошенник позвонил исполнительному директору компании, представился генеральным директором и велел срочно перевести 220 тысяч евро поставщику. Из-за использования программы коррекции голоса мошенник звучал в точности как гендир, с учётом акцента и других особенностей голоса.

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

С высокой вероятностью, злоумышленник также знал внутренние особенности компании, например, наличие срочных переводов по звонку. Тогда можно этот случай ещё и пример социальной инженерии, о которой мы писали ранее.
#skills #datascience
63👍3🔥1
Git исход

Удивительные факты:
— при разработке Linux системы контроля версий (СКВ) уже существовали*, но долгое время не использовались. Все изменения приходили по email в виде набора патчей Линусу.
— BitKeeper стал первой СКВ, которую начали использовать при разработке Linux. Ирония в том, что для символа open source использовали СКВ с закрытым исходным кодом и очень ограничивающей лицензией.

А git так возможно и не появился бы, если не одно НО. Об этом можно почитать в захватывающей статье со скучным названием A Git Origin Story.

*Linux был опубликован в 1991. Первая СКВ была создана в 1982 году — RCS. В 2000 появился BitKeeper.
#procode
😁53🌭31
Docker. Практические советы

Мы активно пропагандируем использовать Docker для разработки и прода. Он упрощает управление зависимостями, позволяет в один клик поднимать окружение разработчика, обеспечивает стабильность деплоя и многое другое.

В статье Docker Best Practices for Python Developers собран полный набор практических советов по работе с докером. Важными считаем:
— располагать в docker файле команды в правильном порядке
— минимизировать количество слоёв в образе
— не запускать процессы от рута
— понимать разницу entrypoint и cmd
— использовать multi stage сборку
— использовать маленькие базовые образы

От себя дополним статью:
— вместо sudo docker... настройте запуск Docker as a non-root user
— замените устаревший docker-compose на docker compose. В свежих версиях compose является частью докера
— в compose файле можно не указывать поле version

Если знаете другие полезные советы напишите, пожалуйста, о них в комментариях.
#skills #docker
👍10🔥321
Завышать ли опыт в резюме?

Раскроем мысль приукрашивания резюме из прошлого поста. Начнём издалека. Сотрудник отдела кадров (HR) просматривает поток резюме на предмет первичного соответствия вакансии. Можно сказать, что это такой человеческий grep по ключевым словам с целью отбраковки неподходящих резюме. Завышение опыта в резюме увеличивает шанс пройти скрининг и попасть на собеседование с техническим специалистом.

На техническом собеседовании уже никому нет дела до циферок, которые вы указали в резюме. Проверяют ваши реальные навыки. Или бездумно копируют методы собеседования из FAANG и спрашивают, почему люки круглые. К таким нужно относиться настороженно.

Завысить опыт можно, но важно отличать преувеличение от вранья. Если преувеличение сложно выявить, то враньё распознается очень просто. Полгода и год опыта стоят рядом, а между "нет опыта" и "5 лет опыта" есть заметная невооружённым взглядом разница. Стоит также помнить, что количественный показатель опыта относителен. Год опыта однотипного клепания сайтов — не то же самое, что год работы над высоконагруженным проектом в команде сильных разработчиков. Эту разницу grep от HR не в состоянии оценить.

При этом не следует приписывать себе несуществующие навыки. Не надо указывать в резюме технологию, о которой что-то слышали. Добавляйте в резюме только те технологии, в которых разбираетесь выше уровня hello world.

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

Помните: собеседование всегда заканчивается хорошо. Вы получаете либо оффер, либо ценный опыт.
#devfm #edu #резюме
👍134🔥31
Технический долг

В статье Мартина Фаулера TechnicalDebt (перевод) описана проблема технического долга. Когда быстро сделал костыль здесь и сейчас для решения задачи, то есть словно взял кредит. Через полгода из-за этого решения потратил время на поиск бага — выплатил долг по кредиту.

Будьте внимательны! Нередко написать правильно и без технического долга по времени занимает столько же, сколько написать неправильно. Например, начинающие разработчики часто полагают, что юнит-тесты отнимают у них время, не осознавая, сколько потом времени тратится на отладку.
#procode
👍731🔥1