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

Для связи @sa_bul
Download Telegram
Чисто позиционные параметры

В python 3.8 появилась возможность определять чисто позиционные параметры с помощью символа /. Параметры слева от / будут позиционными.

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

Комбинация * и / позволяет гибко управлять параметрами.

Функция summator возвращает сумму двух чисел по модулю. Первые два параметра просто числа, для них не важен порядок и у них нет какого-то осмысленного названия. Поэтому мы делаем эти параметры чисто позиционными — слева от /. Модуль, по которому будет суммирование, наоборот, имеет смысловую нагрузку. При вызове функции важно, что третий параметр именно модуль, поэтому мы его делаем чисто именованным и размещаем справа от *.

Отдельного внимания заслуживает четвертый вариант ответа
summator(a=1, b=12, 5)
Таким образом никогда не получится передать параметры в функцию. Позиционные параметры не могут идти после именованных.
👍10🌭6🔥311
Пятничное развлекательное

Разработчики — люди весёлые. Существует практика при создании игр, фильмов и программного обеспечения оставлять "пасхалки", они же easter eggs.

Google славится различными пасхалками. Всем знаком Динозавр, появляющийся в Chrome при отсутствии интернета.

Команда elgoog сохранила у себя многие пасхалки. Тактика игры в StarCraft Zerg rush уничтожит ваш поиск. Подводный поиск позволит побуянить вместе с рыбками. При нажатии на туфельки в Волшебнике страны Оз вы попадёте в ураган. Google gravity покажет поиск с гравитацией. Вообще у elgooG собрано много пасхалок от Google. На вики собран подробный перечень, но многие пасхалки оттуда были временными и уже не работают.

Atari оказала огромное влияние на видеоигры. Прямо в выдаче картинок в гугле можно поиграть в breakout, который является переизданием физического аркадного автомата Pong. Выпущенный в 1972 году, автомат Pong от Atari стал первой коммерчески успешной видеоигрой. Спустя 15 лет такой класс игр назвали Арканоид.

Многие пасхалки доступны на гугле прямо сейчас. Загуглите Томатина, нажмите на томат вверху. Поиск любого персонажа из сериала Друзья предоставит интерактивную отсылку. Например, Джо Триббиани, как известно, не делится едой. Некоторые простые запросы вроде кот или собака также интерактивны. Запрос рождество, если нажать на подарок, отправит вас в огромный набор детских игр и мультиков. Там даже есть игры про алгоритмы.

Все мы любим запрос о рекурсии. И игру Жизнь Конвея (только с компьютера).

А какие пасхалки любите вы?
#fun
👍5🌭52🔥2
Генеративно-состязательная сеть (GAN)

В машинном обучении наибольшую популярность приобрели нейронные сети. Существуют различные архитектуры нейронок. Потихоньку появляются новые. Более того, комбинация различных нейронных сетей может привести к неожиданным результатам. Так, в 2014 году Ian Goodfellow придумал GAN — комбинацию из пары нейронных сетей. Рассмотрим её идею на примере генерации фотореалистичного изображения.

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

Больше деталей о GAN, включая примеры кода, можно найти в статье Generative Adversarial Networks: Build Your First Models (перевод). Различные презентации от Ian Goodfellow можно найти на его личном сайте.

В прошлый раз мы писали, что deepfake уже применяется для мошенничества в виде замены голоса.
#devfm #skills #datascience
🌭3🔥211
Делаем код мягким и шелковистым

Мы уже говорили об утилите pre-commit, которая автоматизирует рутинный запуск анализаторов кода и не позволяет сделать коммит, пока проблемы не будут исправлены.

Теперь расскажем о тех утилитах, которые применяются в каждом нашем проекте:
flake8 — статический анализатор кода с поддержкой очень большого количества плагинов
black форматирует и приводит код в общему виду
mypy проверяет аннотации типов
reorder-python-imports единообразно организует импорты
autoflake удаляет неиспользуемые импорты и переменные
pyupgrade обновляет синтаксис до текущей версии python
yesqa удаляет ненужные #noqa

Применение всех утилит с настройками по умолчанию скорее вредно, поэтому вот несколько советов:
— настройте в pre-commit опцию exclude — список каталогов, для которых не применять анализатор
— в flake8 настройте игнорирование особо душных замечаний
— в autoflake настройте автоматическое исправление замечаний
— при использовании mypy совместно с pre-commit нужно пользоваться специальной версией

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

Расскажите, если на практике используете другие анализаторы кода.
#devfm #procode
🔥11👍721🌭1
Что я увидел в своих собеседованиях, часть 1

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

В самом начале собеседования возникала какая-то суета: включена ли камера и звук, открыто ли мое резюме, под рукой ли ручка с блокнотом.
Составил небольшой чеклист, по которому пробегался за пару минут до начала собеседования.

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

Я спешил ответить на вопрос интервьюера и начинал отвечать до завершения вопроса. Со стороны выглядело так, будто я просто перебиваю собеседника. Более того, иногда вопрос мог оказаться совсем не таким, как я думал.
Пункт "дослушивать вопрос и не перебивать собеседника" отправился в копилку заметок.

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

#devfm #edu #резюме
👍15🔥42🌭2
Внутренняя кухня малого ИТ-бизнеса

В статье ребята делятся своим опытом создания бизнеса на парсинге сайтов. Среди поднимаемых тем:
— Законность и этичность парсинга сайтов
— Средний чек их клиентов
— Их масштабы по железу и числу разработчиков
— У кого лучшая защита от парсинга на рынке
— Судебные угрозы, вызванные парсингом сайтов

Есть много годных видео, например, как открыть ИТ-бизнес и как быстро не закрыться.

Из интересного, у них можно взять полную базу из 4.5кк доменов в зонах ru/рф.
👍42🌭2🔥1😁1
Dependency Injection в python

Кому DI не знаком, статью Python Dependency Injection стоит не только прочитать, но и протыкать. На примере небольшого приложения отрисовки графиков погоды подробно рассказывается о важной концепции Dependency Injection.

Отметим две отличительные особенности:
— автор на примере подводит к ряду проблем, а потом показывает, как применение DI позволяет эти проблемы решить.
— разработка всего примера происходит с использованием достаточно популярной концепции Test-Driven Development — TDD. Это отличная возможность посмотреть на практике эту концепцию и решить, уместно ли её применение у вас.

Интересно узнать ваше мнение, применяете ли вы DI или TDD на практике? Как вы к ним относитесь?
#python
👍6🌭32
Пятничное развлекательное

Мафия — отличная игра для компании, в центре которой находится умение блефовать. У этой игры много вариаций. Например, в Находке для шпиона игрокам даётся локация и должность. По вопросам игроков и ответам на них нужно вычислить шпиона, который локацию не знает. При этом ответ нужно выстроить так, чтобы не дать шпиону лишней информации. Например, для локации "Орбитальная станция" можно сформулировать вопрос "Бегаешь ли ты по утрам в парке". Ответ "Да" однозначно идентифицирует шпиона.

К чему всё это. На ютубе есть канал Куб с записями игр "свой-чужой". Большинство названий выпусков выглядят слабыми, но название Программисты вычисляют учителей информатики привлекло внимание. Видео оказалось достаточно занятным. А как бы вы вычислили человека, не являющегося разработчиком?
#fun #youtube
👍3🌭211🔥1
Кино на выходные

Все они были мертвы. Последний выстрел поставил жирную точку в этой истории. Я снял палец с курка — всё было кончено.

Игра Max Payne на момент выхода в 2001 году поражала своей проработанностью, сложностью и саундтреком. Многочисленные пасхалки, интересный и захватывающий сюжет. Ключевым аспектом было вдохновлённое Матрицей замедление времени — bullet time, в котором перестрелки становились фантастическими.

В 2008 году сняли фильм Макс Пэйн. Он вышел достаточно проходным, но атмосферу жанра нуар передал отлично.

Для ностальгии — сюжет игры рассказывают в 35-минутном ролике.

В этом году Remedy объявила о будущем ремейке первых двух частей игры. Ждём.

#fun #films #games
4🔥4👍3🌭21
Синдром «я так и знал»

Он же — знание задним числом, интересно описанный в статье Юдковского. Того самого, который автор Гарри Поттера и методов рационального мышления.

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

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

В шестиминутном ролике есть интересный пример про результаты соц опроса.

Для интересующихся темой когнитивных искажений человека мы уже рекомендовали фильм Я и другие.
#edu #devfm
👍7🔥61🌭1
Backup: октябрь

Hardskills:
1. Docker. Практические советы
2. Тернистый путь к ClickHouse
3. ИИ на службе мошенников 
4. Dependency Injection в python
5. Генеративно-состязательная сеть (GAN)

О программировании:
1. Pre-commit — must have утилита любого проекта
2. Делаем код мягким и шелковистым
3. Технический долг 
4. Git — исход 

Разбираем код:
1. Реализуем read-only атрибуты
2. Поверхностное копирование объектов и изменяемость типов
3. Чисто позиционные параметры

Нетехнические навыки:
1. Какие знания нужны разработчику?
2. Проблемы курсов по программированию
3. Теория разбитых окон
4. Синдром «я так и знал»

Собеседования:
1. Завышать ли опыт в резюме?
2. Пересмотри своё собеседование
3. Что я увидел в своих собеседованиях, часть 1

#backup
🔥9👍63
Google Global Cache

Чем быстрее загружается контент, тем комфортнее пользователю. Как ускорить доставку контента?

Google принял интересное решение — давайте поставим интернет-провайдеру своё железо, которое будет выступать прозрачным кэширующим прокси. Провайдер обеспечивает стойку, электричество и интернет. Гугл обеспечивает сервер и удалённое администрирование. В результате у пользователей провайдера youtube и прочее грузится быстрее, при этом внешняя нагрузка на сеть провайдера снижается.

GGC сохраняет недавно просмотренные видео в масштабе района, вероятно, способен делать упреждающую загрузку для набирающих популярность видео и прочую чёрную магию. У самого гугла про это довольно лаконичная страница. Немного дополнительных сведений есть в старой статье Google Global Cache — для избранных.

Сама система запатентована в 2006 году.

#skills
🔥8🌭21👍1
Что я увидел в своих собеседованиях (часть 2)

Продолжаем начатое...

Оказалось, что есть типовые вопросы, которые часто задают на собеседованиях, но к которым я специально не готовился. ООП, SOLID, микросервис vs монолит и подобное — без подготовки ответ выходит путанным.
Подботал типовые вопросы.

В какой-то момент я забывался, что нахожусь на интервью и общался с интервьюером, как с коллегой: рассказывал о каких-то негативных моментах в прошлых проектах, говорил от имени команды в контексте "Мы”.
На интервью должна быть дружеская атмосфера, но не нужно забываться. Интервьюера нужно убедить, что я именно тот специалист, который им нужен. На работу устраиваюсь Я, значит в моих рассказах должно быть побольше Я и поменьше Мы. В эту же сторону, поменьше рассказывать о каких-то проблемных местах, побольше рассказывать о удачно решённых задачах.

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

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

Какие у вас были проблемы на собесе?

#devfm #edu #резюме
👍10🌭31🔥1
Ключевая способность программиста

В статье Почему твоя мама всё ещё не прогает? поднимается интересный вопрос: существует ли талант к программированию? Что именно требуется человеку, чтобы преуспеть в ИТ? Процитируем центральный момент статьи:

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

За деталями отправляем к первоисточнику. Аргументация местами спорная, но с выводом тяжело не согласиться. В профессиональной разработке мы непрерывно сталкиваемся с вопросом "WTF оно не работает". Или, что хуже, с вопросом "как оно вообще работает". И весь инструментарий разработчика направлен на снижение когнитивной сложности за счёт декомпозиции на мелкие, управляемые сущности.

Важно уметь доводить до конца, как поделились историей в комментариях.
#edu
👍831🔥1🌭1
Проблемы MongoDB

В статье Ошибки выбора MongoDB в качестве основной БД в стартапе подмечены некоторые сложности mongo:
— будет беда, если работать напрямую со словарями из базы
— отсутствие привычных схемы и миграций может создать проблемы
— сложные query по вложенным документам могут заставить грустить

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

MongoDB самая популярная NoSQL база данных, если верить опросу StackOverflow. Ранее мы писали об этом. Если у вас проблемы с mongo, то либо вы решаете не ту задачу и вам нужен другой инструмент, либо вы что-то делаете не так.

Какие базы используете вы? Поделитесь недавней болью в комментариях.
#skills #database
👍3🌭31🔥1
Пятничное развлекательное

Очередная подборка комиксов от xkcd. В фокусе опять IT. И грусть.

Кому докладывает Linux о нарушении sudo? Победим ли мы в войне против роботов? Мысли об установки приложений и важности чтения мануалов. Концепция цифровой археологии личности и ужасно бедный марсоход.

Инцидент
Сражение с лотком CD (война роботов)
Установка программ
RTFM (тостер)
Старые файлы
Спирит (марсоход)

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

Серия фильмов Терминатор является классикой о восстании машин. Первый фильм 1984 года с брутальным Арнольдом Шварценеггером в роли Терминатора запомнился неотвратимостью машин. Терминатор 2: Судный день 1991 года расширяет возможности роботов, Роберт Патрик в роли жидкого металла Т-1000 существенно повышает градус опасности. Здесь же поднимается вопрос ценности человеческой жизни и идея обучения робота человеческому. Оба фильма заслуживают просмотра.

Следующие фильмы, кажется, были порождены жаждой денег, да и ригинального режиссёра первых двух частей Джеймса Кэмерона в 3-5 частях не задействовали. Отсюда слабые рейтинги, незапоминающийся сюжет и куча нестыковок. Возврат Кэмерона в 6 части делу не помог.

Бэдкомедиан сделал обзор на пятую и шестую части франшизы.

#fun #films
🌭4👍3🔥21
Шаблонизатор HTML — Jinja

На прошлом видео про WSGI рассматривался веб-запрос с момента пользовательского перехода на сайт до демонстрации ему строчки текста. Но современная веб-страница — это не просто текст, а фарш из HTML, CSS и javascript. Обычно сейчас frontend является отдельным проектом на angular/vue/react, а python код отдаёт лишь json для дальнейшей отрисовки на фронте.

Если нет сложных требований к фронтовой части приложения, можно воспользоваться html-шаблонизатором. Собственно, это HTML плюс небольшой язык управляющих конструкций типа for и if. Разработчик формирует шаблон — классическую HTML-страницу, в которой будущие данные оформлены в виде управляющих конструкций с внешними переменными. Из кода на python мы выбираем шаблон и подаём входные данные. Шаблонизатор подставляет входные данные в управляющие конструкции и формирует итоговую HTML-страницу для пользователя.

Наиболее популярным HTML-шаблонизатором для python является Jinja. Он применяется в Flask и FastAPI, его можно подключить в Django вместо Django template language.

Небольшой гайд по Jinja в рамках работы с Flask.

Полная документация по Jinja.
#python #devfm
2👍21👎1🔥1🌭1
Задача на собеседовании — проектируем динамическую фильтрацию

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

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

После уточнения задачи получаем следующие вводные:
— имеется клиент-серверное приложение интернет-магазина с возможностью поиска товаров

— количество записей в результате поиска может доходить до 1кк

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

— у разных категорий товаров разный набор фильтров

— после применения конкретного фильтра появляется новая выборка и для нее также должны отображаться только актуальные фильтры
Рассмотрим пример. Для телефонов должны быть фильтры "производитель" и "операционная система". После применения фильтра "производитель: Apple" в фильтрах ОС уже не может быть значения Android.

— для каждого значения фильтра необходимо отображать количество подходящих товаров. После выбора одного фильтра все счетчики должны пересчитываться.
Было "производитель": "Apple: 10", "Xiaomi: 20", "Встроенная память": "128 Гб: 10", “256 Гб: 20". Выбрали "128 Гб", после применения станет, например, "производитель": "Apple: 7", "Xiaomi: 19". То есть 3 модели Apple и 1 модель Xiaomi не попали под выбранный фильтр.

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

Как на настоящем собеседовании, уточняющие вопросы можно задать в комментариях. Наше решение задачи в 20:00 понедельника.
#devfm #skills #резюме
🌭532🔥1
Нас круглое число 2^10=1024. Все помнят, что в 1024 году родился Магнус I Добрый, король Норвегии и Дании.

Сегодня читаем Теорию жоп, шуточную статью о теории управления проектами. Или не шуточную...

Залипнуть во фрактальные картинки можно на сайте медузы и жопы.

#ToTheMoon
🔥10👍32🌭2