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

Для связи @sa_bul
Download Telegram
На рынке в РФ в категории Desktop Яндекс лидирует с 55% против 40% у Google. Провал справа технический, там yandex.ru заменился на yandex.
👍3🔥1
На глобальном рынке поиска в категории Mobile Google занимает 95%.
👍3🔥3
Для Mobile в РФ яндекс проигрывает гуглу. Почему? Средний пользователь мобильного телефона не лезет в настройки и пользуется всем по умолчанию. Отсюда всякие законодательные инициативы о предустановке или обязанности предоставления выбора при первом запуске
👍3🔥3👎1
Как удобно использовать сложный пароль? Речь про конструкции вроде

JVoZlEoHk~?rsnJFCZ1pJ%IEp

На помощь приходят менеджеры паролей:
– 1Password
– Bitwarden
– LastPass
– KeePass
и многие другие. Тут важна безопасность, поэтому убедитесь в отсутствии громких утечек от выбранного менеджера паролей за последние годы.

Можно пользоваться только оффлайн-хранилищем и не использовать облачную синхронизацию. Чуть менее удобно, зато ваши пароли не утекут. Можно синхронизировать пароли через файловую шару типа дропбокса. А если файл с паролями ещё и зашифровать... Ляпота.

PS: не доверяйте свои пароли браузеру. Мы же параноики, верно?
#skills
👍11🔥2
Пятничное развлекательное

Немного разобраться в себе и окружающих поможет старый советский фильм Я и другие – 50 минут результатов психологических исследований. Способны ли вы идти против мнения толпы? Насколько точна ваша память? Есть ли на столе черная пирамидка или обе белые?

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

#fun #films #edu
🔥10👍7
Господа, нас круглое число – 128. Планируем захват мира через 3...2...^C

#ToTheMoon
🔥30🤯5👍2
DevFM
Одним из вариантов безопасной пересылки данных является передача зашифрованного rar/zip архива с паролем. В rar есть удобная галочка "шифровать имена файлов", когда названия файлов внутри архива не показываются. Но rar формат проприетарный, что плохо с точки…
Как сформировать надёжный мастер-пароль для менеджера паролей, о которых мы писали ранее? Самым простым, при этом самым неломаемым вариантом будет кусок стихотворения со всей пунктуацией.

Я вас любил: любовь ещё, быть может,

Это почти идеальный пароль. Можно ещё добавить спецсимволов вместо пробелов или ещё как-то усложнить текст одному вам понятным образом.

PS: Не используйте свои любимые цитаты. Выбранный фрагмент должен иметь нулевую связь с вами, как личностью.
#skills #sudo #devfm
👍12🔥2
Попроси программиста проверить 10 строк кода, он найдёт 10 проблем. Попроси его проверить 500 строк кода, он скажет: "выглядит норм".

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

Как научиться писать хороший код? Прочитанное в книгах совсем не сразу преобразуется в ваш опыт. В разработке огромный пласт знаний образуется в результате практики написания и, что более важно, чтения чужого кода. Читайте чужой код, господа — это самый быстрый способ роста скилла разработки. Если код хорош — то вы научитесь как надо писать. Если код плох — вы увидите, как писать не надо, и сможете дать обратную связь (если вас об этом попросили, прошу заметить).

#procode #devfm
👍3🔥2
Давайте посмотрим на 10 строк кода.

Вроде всё хорошо. Классическое открытие файла с помощью контекстного менеджера with, классическая построчная обработка. Разбиваем строку, записываем в список словарей. Всё ли по канону? Неа:

1. Смотрим документацию: readlines возвращает список всех строк файла. Значит, для большого файла может быть беда. Современный питон позволяет итерироваться сразу по объекту file_. Просто пишем
for line in file_:

2. raw_line[0] и прочие индексы — это всегда ужас. Заменяем на
fio, login = line.split(";")

Вроде то же самое, но мы сразу понимаем, что было в строке. И тут же видим следующую проблему.

3. А что, если в строке нет двоеточия, или этих двоеточий больше одного? То есть нужна обработка ошибок на исключение ValueError, если справа split вернул не два значения. Добавляем try-except.

4. Частая проблема split — это лишние пробелы. Скорее всего, потребуется strip всем переменным после split.

Итого 4 ошибки на 10 строк кода

#python #codereview #devfm
👍14🔥4
Hoverboard — небольшой интерактивный комикс... Как бы не так. Это почти бесконечное полотно с миллиардом отсылок. Простой выйдите за пределы карты. Саму карту и объяснение отсылок можно найти тут. А zoomable-карту от фанатов — тут

#fun #xkcd
🔥7
Теперь посмотрим на переработанный код. Docstring вырезан для краткости. Код теперь крут:
1. Есть аннотация типов
2. С файлом работаем через контекстный менеджер, то есть закрыть не забудем — оно само
3. Не забыли про запрет использования file как ключевого слова, поэтому file_
4. При разбиении строки по точке с запятой используем именованные переменные
5. При ошибках — кастомные исключения. DownloadError название спорное, я бы заменил на ParsingError. Но если файл побился при скачивании, то самое то
6. Добавляем значения в список, не забывая обрезать лишние пробелы по бокам.

В общем, каждая строка на своём месте. Что можно улучшить? Я бы заменил result на logins, тогда и выходной словарик будет называться как надо.

#python #codereview #devfm
🔥9
Словарь student (или result) во вчерашнем примере не является удобной конструкцией, ФИО доступно как student["fio"]. Кроме того, мы демонстрируем наружу внутреннее представление, нарушая принцип инкапсуляции. Замена словаря на список, например, заставит переписать весь код, который использует эту структуру данных. Какой может быть выход?

Создадим класс Student и превратим словарь в экземпляр класса. Можно использовать namedtuple из collections, но мы пойдём своим путём. Бонусов много:
1. Мы скрываем внутреннее устройство студента. Наружу мы отдаём только пару полей, откуда мы их берём никто снаружи не знает
2. Можем к студенту добавлять методы. Например, вывод фамилии с инициалами в стиле Иванов И.И. — теперь это в нашей власти
3. Можем добавить новые способы создания этого студента, например, данные брать из базы данных.

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

#python #codereview
👍8🔥2
Нельзя использовать goto

Часто говорят, что goto плох. А собственно, почему?

В ассемблерном коде на машинном уровне все управляющие конструкции (if, while, for и другие) преобразуются в набор команд с безусловным переходом jmp. А такой переход — самый настоящий goto. То есть ты весь такой изящный во фраке пишешь циклы, а наглый компилятор/интерпретатор выкидывает всю красоту и делает goto.

Так почему же сам goto является признаком плохого кода, если он на самом деле везде?

Ответ кроется в умении сохранять контекст. Человек может в голове держать 5-9 сущностей, больше не получается. Поэтому придумали функции, и придумали держать их небольшими — для снижения когнитивной сложности. Конструкция if переведёт тебя в одну из веток ниже, циклы for и while выполнят тело цикла или выбросят за его пределы. Команда goto сложность привносит — прыжок может быть куда угодно. А повышение сложности всегда приводит к росту числа ошибок.

Ну а ещё из-за goto может напасть велоцираптор.

#procode #devfm
👍9🔥5
— Без требований программирование представляет собой искусство добавления багов в пустой текстовый файл
— Тесты позволяют улучшать API
— Наличие "и" в описании функции — это плохо
— Магическое число 7
— Важность умения запускать код без IDE
— Мой любимый git add -p

Полезные и не очень советы в статье Чему я научился на своём горьком опыте (за 30 лет в разработке ПО). Какие-то пункты устарели, какие-то не универсальны, с какими-то я не согласен.

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

Кстати, пример с getUserMessage(userId, true) в питоне решается именованным параметром getUserMessage(userId, retrieveFullMessage=true)
#procode
👍10🔥4
Пятничное развлекательное

В августе у многих появляется время почитать. Порекомендую вам очень опасную художественную книгу. Автор — Элиезер Юдковский, американский специалист по искусственному интеллекту, исследующий проблемы технологической сингулярности и выступающий за создание дружественного искусственного интеллекта (ИИ).

Чем же опасна эта книга? После неё другие книги начинают выглядеть слабо. В этом романе персонажи ведут себя разумно и логично (не путать с "правильно"). В заданных условиях они действуют так, что их мотивация понятна.

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

#fun #books
🔥9💩5
Некоторые вещи разработчику в среднем не нужны. Например, как устроен процессор. Нет в нашем любимом Python регистров процессора, мы максимально далеки от них. Тем не менее у меня для вас древняя (2013 год) статья-перевод Путешествие через вычислительный конвейер процессора (оригинал на gamedev).

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

Но вообще, конвейер — это просто интересно. Что такое hyperthreading? А спекулятивное выполнение и предсказатель переходов — слышали о таких штуках? В 2017 году с их помощью были реализованы уязвимости Meltdown/Spectre, наделавшие много шума. Об этом позже
#skills
👍5🔥2
Месяц назад мы обсуждали, что можно сделать с неработающим кодом. Два дня назад своё видение дебага и отладки раскрыл канал Диджитализируй в ролике Кладём баги на лопатки (24 минуты). Он касается следующих тем:
1. локализация проблемы
2. изучение проблемного участка с помощью отладчика или логгирования. Рассматриваете пример логгирования endpoint-а вебсервера
3. тезис "не доверять ни одному фрагменту кода"
4. бан фразы "у меня всё работает"
5. рассуждения о коде как структуре

На разобранном примере кода с добавлением логгинга в связи с нехваткой времени куча недоработок:
— можно настроить, чтобы имя функции само выводилось в логгере, а не вписывать руками
— непонятно, где какие уровни логгера ставить. У него везде debug
— начиная с python 3.8, в f-строках можно писать f"{var=}" вместо f"var = {var}", тогда будет выведено var=значение

#youtube #procode
🔥6