• Неформальные отношения в команде: зачем и как ими управлять
    +10
    Я долго работаю в Баду и не хожу на корпоративные посиделки, потому что предпочитаю провести время с семьёй. Меня не увольняют :)
  • Memcached plugin: NoSQL в MySQL
    0
    Я думаю что этот плагин плохо подходит для работы с бинарными данными из-за наличия разделителей. То есть в качестве разделителя надо выбрать такой символ, которого не может быть в ваших данных. Тут проще и надёжнее делать base64 или что-то похожее, но это увеличит размер данных

    Про производительность я в последнем разделе написал, что у нас там нет большой нагрузки и скорее всего в ближайшее время не появится. Поэтому на наших цифрах судить о производительности бессмысленно. У нас сейчас всё работает на дефолтных настройках на серверах, на которых есть и другая нагрузка, и нам пока даже нет смысла тратить время на исследования и оптимизации.
    Цифры будут зависеть от многих факторов
    • есть ли другая нагрзука на сервер,
    • реплицируются ли данные,
    • включено ли кеширование (здесь про cache_policies )
    • размеры батчей (см здесь)

    Если мы всё же решимся использовать этот плагин в каком-нибудь высоконагруженном месте, то скорее напишем отдельную статью с цифрами
  • Memcached plugin: NoSQL в MySQL
    0
    Да, вы правы.
    Похоже я тут был не совсем точен. Судя по доке ограничение на 250 символов — это ограничение именно memcached, а не memcached-протокола
    Также судя по доке, innodb_memcached поддерживает бинарный протокол. Но мы пока использовали только текстовый
  • Memcached plugin: NoSQL в MySQL
    0
    там есть dev.mysql.com/doc/refman/8.0/en/innodb-memcached-security.html но оно никак не привязано к mysql-юзерам. Но деталей не знаю, мы этим не пользовались
  • Статистика и мониторинг PHP скриптов в реальном времени. ClickHouse и Grafana идут на помощь к Pinba
    0
    Процесс установки pinba2 не стал особо легче.

    А докер эту проблему не решает?
  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    0
    Через год сами разработчики уже в собственном коде не могут разобраться
    У нас 12-летний легаси и мы как-то справляемся :) С этой проблемой очень помогают правильно настроенные процессы. В частности у нас все коммиты привязаны к тикетам в jira. Поэтому сделав git blame и посмотрев описание коммит а, я вижу в каком тикете были сделаны данные изменения и обычно из тикета ясны почти все детали.

    Что касатеся перехода на другие языки, то я в начале статьи писал, что у нас миллионы строк php-кода. Их нельзя по-быстрому переписать на руби или питон. Но у нас есть движение в сторону более активного использования Go.
  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    +1
    Напоминаю, что я не автор psalm-а, претензии лучше высказывать напрямую автору
    На такой пример psalm ругается — getpsalm.org/r/075628070d, так что я думаю, что дело как раз в обработке ошибок.
  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    –1
    вы считаете psalm должен здесь ругаться на то что file_get_contents() может вернуть false?
    В этом случае будет сгенерирован warning, многие современные фреймворки конвертируют их в Exception-ы. Анализаторы, как мне кажется, считают что эти случаи можно не анализировать.
  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    0
    А вы пробовали писать автору psalm-а? Все зарепорченные нами баги он довольно быстро исправил. Хотя возможно наши баги не были такими сложными.

    Так что анализатор в целом может помочь, но расслабляться ни в коем случае нельзя.
    Всё верно. Именно поэтому мы используем все 3 анализатора + тесты + ручное тестирование
  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    +4
    Ну, за желания не судят :) До реальных действий дело не дошло

    Но про патч я всё-таки поясню.
    В типичном PHP-коде, написаном без strict_types, все эти неявные преобразования уже происходят. Такова система типов PHP, по крайней мере до времён strict_types.
    PHP-программисты часто используют например var_export($some_var,1) и это работает так, как программист ожидает, хотя вторым параметром надо передавать boolean. Патч показал бы нам такие места.
  • Оптимизация веб-серверов для повышения пропускной способности и уменьшения задержки
    +1
    Поправили. Спасибо!
  • Оптимизация веб-серверов для повышения пропускной способности и уменьшения задержки
    +1
    Спасибо тебе за такую полезную статью! Мы ломали голову – стоит ли писать последний абзац, но не решились :)
  • Чистый код на PHP
    +1
    решение для «Избегайте проверки типов (часть 1)» будет ещё лучше если интерфейсы использовать:
    interface Movable { public function move(...); }
    function travelToTexas(Movable $vehicle) { ... }
    
  • Семантика exactly-once в Apache Kafka
    0
    По-моему непонимание происходит из-за того, что вы воспринимаете кафку как очередную message queue.
    В обычных message queue producer кидает событие в очередь, consumer (обычно один) получает это сообщение из очереди и выполняет свою работу и если всё ok, отвечает очереди что сообщение обработано (если это at-least-once) и это сообщение удаляется из очереди.

    Кафка может быть использована как очередь сообщений, но в целом это более универсальная штука — распределённый лог событий. Producer добавляют в лог событие. Если кафка отвечает ему ok, это значит что она получила это событие и сохранила его на диск в указанный topic. Всё! Это сообщение больше не потеряется, кафка сохранила его на диск, producer может на этом успокоиться и больше не посылать это сообщение в кафку.

    Далее в ход идут consumers. Одно сообщение в кафке может быть обработано несколькими разными consumer-ами.
    То есть например юзер оплатил товар, система сохранила в кафку в topic ORDERS, что такой-то юзер оплатил такой-то товар, который надо доставить по такому-то адресу. Один consumer занимается тем что формирует заявку для склада, другой — добавляет это событие в финансовые отчёты, третий — сохраняет это событие в систему бизнес-аналитики. 3 разных консумера обрабатывают одно и то же событие. И после того как они обработают его, событие из кафки никуда не удаляется, оно там остаётся в течение какого-то времени (день, неделя, месяц — как настроите).

    Если в одном из консумеров нашёлся баг, можно исправить баг и перезапустить консумера по всем данным которые есть в topic ORDERS — например перезалить данные в систему бизнес-аналитики.

    В такой системе producer вообще не знает, обработано ли его сообщение, потому что он не знает, сколько consumer-ов его обработают и когда они должны его обработать.

    Семантика exactly-once на стороне producer-а решает немного другую проблему.
    В предыдущем комменте я писал:
    consumer должен сам позаботиться чтобы не обработать одну и ту же запись несколько раз. Для этого можно использовать offset, который есть у каждого event-а и который монотонно растёт. То есть клиент может у себя в хранилище сохранять последний обработанный offset и по нему фильтровать дубли

    эта штука работает нормально только если в самой кафке нет дублей. То есть в старых версиях могла быть ситуация, когда producer мог сохранить одно и то же сообщение в кафке дважды. В этом случае у этих 2-х сообщений будут разные offset-ы и эта схема дедупликации не сработает (можно делать дедупликацию вручную, зная какие данные у тебя в событии, но тогда для каждого события должен быть свой код для дедупликации)
  • Семантика exactly-once в Apache Kafka
    0
    не уверен что понял вопрос точно
    В кафке есть 2 типа «клиентов» — producer (кто сохраняет события в кафку) и consumer (потребляет события)
    Механизм exactly-once — он только для producer-ов, то есть если producer по какой-то причине не уверен, сохранилось ли сообщение в кафку (например разрыв соединения), он просто перепошлёт сообщение в кафку с тем же ID и механизм exactly-once гарантирует, что event не будет продублирован

    Полагаю что вопрос всё же был про consumer-ов.
    Здесь кафка не даёт гарантий exactly-once и consumer должен сам позаботиться чтобы не обработать одну и ту же запись несколько раз. Для этого можно использовать offset, который есть у каждого event-а и который монотонно растёт. То есть клиент может у себя в хранилище сохранять последний обработанный offset и по нему фильтровать дубли
  • HTTP/2 Server Push не так прост, как я думал
    +1
    Сильно зависит от реализации на стороне сервера.

    Насколько я понимаю, идеальный вариант — самый первый запрос в HTTP/2 соединении должен вернуть ответ + пушнуть эту таблицу стилей с правильными заголовками, чтобы стили попали в HTTP-кеш. Все последующие запросы внутри этого HTTP/2-соединения не должны пушить эту таблицу стилей, браузер и так из http-кеша возьмёт её. Если соединение разорвалось, то в новом HTTP/2-соединении на первый запрос можно отвечать даже без пуша стилей — они ведь и так есть в кеше. Но определить всё это на стороне сервера — довольно муторное занятие.

    Я пока соглашусь с самым первым комментарием: «Слишком мало профита для столь сложной технологии.»
  • HTTP/2 Server Push не так прост, как я думал
    0
    удалено, промахнулся с ответом
  • HTTP/2 Server Push не так прост, как я думал
    +1
    про все кеши я не смогу рассказать, но про кеш сервис-воркеров наверное можно почитать статью того же автора — https://jakearchibald.com/2014/offline-cookbook/ или курс на udacity https://www.udacity.com/course/offline-web-applications--ud899
    насчёт preload кеша речь, насколько я понимаю, идёт о https://w3c.github.io/preload/
    Там в разделе Processing (https://w3c.github.io/preload/#processing) в заметках в конце есть пример, объясняющий почему для preload-а может понадобиться отдельный кеш, а не http-cache
  • HTTP/2 Server Push не так прост, как я думал
    0
    да, спасибо поправил
  • HTTP/2 Server Push не так прост, как я думал
    0
    спасибо исправил
  • Gogland: Новая Go IDE от JetBrains
    +23
    название Gopnik можно не предлагать? ;)
  • Обзор курсов по Deep Learning
    0
    ох, нифига себе списочек.
    Спасибо
  • Обзор курсов по Deep Learning
    0
    А кто-нибудь может посоветовать нормальные курсы по математике, которые бы упрощали вход в machine learning / deep learning?
  • Когда использовать статические методы
    0
    Я для себя сформировал такое правило — если функция чистая (https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D1%82%D0%BE%D1%82%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8) — то её можно делать статической. Правда даже в этом случае есть проблемы — тяжело уследить когда метод перестал быть чистым и пора отрефакторить его и его использование
  • Как в Badoo генерируются изображения для «шаринга» в соцсетях
    +1
    Проблемы там скорее с разбиением на строки — нет классических пробелов и нельзя разбивать на произвольном месте,
    В интернете говорят что Maximum Matching — стандартный алгоритм для разбиения японских текстов на слова. В этой лекции class.coursera.org/nlp/lecture/127 где-то с 10-ой минуты про него рассказывают. Но там нужен словарь японских слов.
  • Опрос: вы работаете лучше чем ваш среднестатистический коллега?
    +16
    опрос напомнил старую шутку:
    Как известно, 20% сотрудников делают 80% всей работы в компании. Недавние исследования показали что 80% сотрудников считают что входят в эти 20%

    :)
  • Badoo PHP Code Formatter. Теперь в open source!
    +3
    1. В статье сказано почему нам не подошёл phpcs — он мог проверить формат, но не мог отформатировать код.
    2. Про автоформат.
    Вы настаиваете что автоформат всего репозитория в нашем случае было бы правильным решением? Почему?
    Очевидно что если бы мы решили его делать, то это был бы отдельный комит, но всё равно это сделало бы работу с репозиторием менее удобной — менее удобно было бы получать историю по всем строкам, задетым в момент форматирования. Баду репозиторий существует наверное более 8 лет, вопрос с форматированием кода начали решать где-то 3-4 года назад (могу ошибаться, точно не помню). То есть большАя часть кода в репозитории за первые 4-5 лет в git blame указывала бы на коммит автоформата, вместо того чтобы указывать на реальные «боевые» коммиты. С таким репозиторием неудобно работать.
    И не стоит думать что мы сразу кинулись писать php экстеншен, сначало конечно был простенький скриптик на чистом php.

    На остальные вопросы затрудняюсь ответить — я лишь пользователь phpcf, а не его разработчик.
  • Badoo PHP Code Formatter. Теперь в open source!
    +2
    > пожамкать им в два клика целый проект?
    именно этого нам и хотелось избежать. Изначально (примерно 6-8 лет назад), у нас не было никакого стандарта. Точнее он был, но скорее как рекомендации и во многих местах он не был соблюден. Компания росла и в какой-то момент вопросы стандарта кодирования стали возникать всё чаще.
    Было 2 варианта — отформатировать разом весь репозиторий, или сделать так чтобы весь новый код был по стандарту, а старый код постепенно бы менялся/рефакторился и тем самым попал бы под новое форматирование.
    Полный реформат репозитория не понравился тем что сильно загрязнится история в git-е — много строк кода будут ссылаться на комит в котором был сделан реформат. Это неудобно потому что нам довольно часто приходится читать старый код, искать кто и почему написал ту или иную строку кода. Поэтому был выбран второй вариант
  • Что дешевле: новое железо или труд разработчиков?
    +1
    Какое-то поверхностное описание.
    В компании должно быть достаточно программистов, чтобы в случае подобной ситуации можно было бы выделить хотя бы одного человека разобраться в причине.
    Далее в компании должен быть кто-то (тех-лид, архитектор, хз кто, может быть несколько человек) кто бы мог оценить что в данном конкретном случае выгоднее — купить память или заоптимизировать. Оптимизация — это не обязательно рефакторинг, это может быть маленький, хорошо задокументированный костыль :)
    Универсального ответа нет — иногда нужно рефакторить/оптимизировать, иногда нужно покупать железо. Бесконечно железо покупать не сможешь, рано или поздно упрёшься в какие-то лимиты
  • Что нового нас ожидает в Django 1.7
    +9
    А как отечественные django-девелоперы относятся к грядущей замене терминов master/slave на leader / follower в django?
    github.com/django/django/pull/2692
  • Comment from a drafted post.
  • Machine Learning. Курс от Яндекса для тех, кто хочет провести новогодние каникулы с пользой
    +7
    Они нас совсем за дикарей считают, что ли?
    Вопрос риторический
  • Machine Learning. Курс от Яндекса для тех, кто хочет провести новогодние каникулы с пользой
    0
    Этот курс хорош, только вот он уже закончился :)
    Скоро стартует похожий стенфордский курс class.stanford.edu/courses/HumanitiesScience/StatLearning/Winter2014/about
  • Machine Learning. Курс от Яндекса для тех, кто хочет провести новогодние каникулы с пользой
    +3
    Спасибо!
    Было бы класно, если бы вы их выложили в itunes, например как itunes.stanford.edu/
  • Миграция фотографий или ещё одна очередь на MySQL
    +3
    Слабо верится. Фреймворк конечно замедляет выполнение процесса, но 23 секунды — это из области фантастики. Скорее всего где-то в фреймворке что-то не так используется, где-то неявные лишние вызовы чего-то, запись в папку с миллионом файлов или sleep(23) от предыдущего недовольного сотрудника
  • Haskell в продакте: Отчёт менеджера проекта
    0
    Спасибо за рассказ, очень интересно.
    Будете ли продолжать использовать хаскель дальше или же откажетесь от него?
  • Оптимальная параллелизация юнит-тестов или 17000 тестов за 4 минуты
    +10
    от компании котиков :))
  • Процесс разработки в Badoo
    +1
    Спасибо, скоро (скорее всего завтра) появится
  • Процесс разработки в Badoo
    0
    6. зависит от важности задачи и сложности исправления бага. Можем подождать фикс, а можем и выкинуть задачу из деплоя.
  • Процесс разработки в Badoo
    +3
    про деплой у нас был доклад на одной из конференций: addconf.ru/event.sdf/ru/add_3/authors/YuriyNasretdinov/786