Как мы разрабатываем Sphinx Аксенов Андрей Sphinx Technologies Inc Что такое Sphinx? Что такое Sphinx? • • • • Программа такая Для серверов (и мобильных телефонов) Делает поиск Бесплатная, открытая, итп • Сам сервер ~90K строк, ~2.6 MB, C++ • И еще всякое (API, секретные тулы…) Про что доклад • • • • • Как у нас устроен процесс разработки И, местами, почему так (спрашивайте!) Никаких революций Все очень тупо и стандартно Ничего нового не узнаете уот уаабще (1) • Russian marketing in action!!! (1) Вопрос знатокам: как расшифровывается слово Sphinx? Мы говорим Ленин... • Команда разработчиков Мы говорим Ленин... • Команда разработчиков Мы говорим Ленин... • Команда разработчиков • Маленькая, очень • Удаленная, полностью • Звездочка, исторически • Диктатура, вынужденно • Ничто не религия – так сложилось • Работа по домам – и плюсы и минусы Вольно пасущиеся коты (2) • Внешняя часть • Mantis, форум, изредка IRC • Внутренняя часть • IRC, Skype, email, телефон • Eventum, Wiki, Mantis • Google Docs (2) Вопрос знатокам: кого рекламирует “заглавный” видеоролик? Кафка. «Процесс». - Холст, сыр, масло • • • • • Как устроен процесс “про код”? Какие именно Мега Практики есть? Каких нету, каких зря, каких спецом? Как и почему именно так получилось? Полтора выстраданных опытом фокуса “Мы е…и все на свете” • • • • • Waterfall ? Agile ? SCRUM ? Kanban ? Six Sigma ? ... “Мы е…и все на свете” Waterfall ? Agile ? SCRUM ? Kanban ? Six Sigma ? ... • X3M ! • • • • • “Do the reasonable thing” • • • • • • • По-русски, возможно, “включи мозг” Раскидываем баги, фичи, редкий R&D Мини-лекции и “атаки” по потребности Отчитываемся (еженедельный звонок) Итерации типично короткие Результаты типично прозрачные Ничего особенного, как и обещал Зоопарк VCS • Внутренний svn • Публичный svn (R/O зеркало, Gcode) • Внутренний hg • Для длинных веток • Для секретных веток • Для промежуточных патчей • Личный git Эволюция зоопарка • Было • svn исторически, зеркало очевидно • hg все (!) освоили “для себя” • git пока личный (?) эксперимент • Будет… может быть • svn + git ? • git / github ? Зоопарк сред разработки • Каждый строчит, как он хочет • MSVS 2005+ • gcc CLI • Codeblocks • Xcode • Довольно кроссплатформенно • Платформо-зависимого кода... МАЛО Про кодстиль for ( int i=0; i<m_tSchema.GetAttrsCount(); i++ ) { const CSphColumnInfo & tCol = m_tSchema.GetAttr(i); ESphAttr eAttrType = tCol.m_eAttrType; if ( eAttrType==SPH_ATTR_UINT64SET ) { if ( tCol.m_eSrc==SPH_ATTRSRC_FIELD ) bHaveFieldMVAs = true; dMvaIndexes.Add ( i ); dMvaLocators.Add ( tCol.m_tLocator ); Про кодстиль • Своеобразный • Пробелы • Мини-венгерская нотация • Смесь систем именования типов • Но оправданный! • Мгновенный контекст • Читаемость без подсветки и в целом Про кодстиль • Форсирую стиль • Форсирую компактность • Политика? • Религия? • Прагматика! • Ревью на старте. Типично ~1 мес • Линт и сразу и потом. Google ftw Про библиотеки итп STL • STL, boost исторически не пользуемся • Было нельзя, сейчас незачем • Только вручную, только хардкор! (3) • Сторонние библиотеки, эээ, по ситуации • libstemmer, libre2 линкуем • libaot, часть стеммеров переписали (3) Вопрос знатокам: чему равен номер “старой школы”? Про ревью • Пока (?) без спецтулзов • Тупо обмен патчами (см. помойка) • Цели? • Баги так ловить нельзя • Проверка стиля итп дури • Проверка “туда ли идем” • Двойные проверки особо важного Внутренняя документация • Есть полу-публичная, • doc/internals*.txt (4) • Есть совсем внутренняя • Особо секретная, так надо!!! • Пока маленькая, всего 10 страниц • Авось будем расширять и углублять (4) Вопрос знатокам: как расшифровывается “VLB”? Программа != продукт • Продукт = Программа + • Тестирование • Документация • Поддержка Про документацию БОЛЬ Программисты (это я) плоховато пишут Юзеры (это вы) редко и мало спрошают Нужен уникальный спец-человек • Штоп разбирался • Штоп интересовался • Пока не нашли! • • • • Про платную поддержку • Консультанты VS разработчики • Читаем доки вслух • К должны, Р теоретически могут • Помогаем придумать и внедрить фокусы • К должны, Р должны • Фиксим в коде старое, делаем новое • К не при делах, Р должны Про бесплатную поддержку • Форум – чистая личная доблесть • Пит, Барри • Mantis – политика партии! • Цель “смотреть все” • Получается пока не всегдец :( • Eventum, очевидно, приоритетнее • GPL=freemium, либо гринд, либо.. Про тестирование • Внутреннее, мы сами • Автоматические тесты (см. Оч.Мал.) • Примерно 3-4 разных видов • Внешнее, пользователи • 10 Баг (через Mantis или Eventum) • 20 Фикс [+ автоматический тест] • 30 GOTO 10 Ежеминутный дзен • Регрессионная тест-сюита, test/ • Не сразу, примерно через 1.5 года… Apr 2006 vs Nov 2007 • Рождена комбинаторным взрывом • Сегодня ~200 тестов (5) • Сегодня 3000+ запросов • “1 клик” (на самом деле 2) (5) Вопрос знатокам: сколько в точности тестов в 2.0.2-beta? Ежеминутный дзен • Регрессионная тест-сюита, test/ • Написана на PHP, это минус • Заодно тестирует API, это плюс • PHP API, C API остальное • Тестируется вся система • Дескрипторы и мутаторы • Данные, запросы, варианты, QL Ежеминутный дзен • Юнит-тесты, src/tests.cpp • “Фреймворк” assert.h • Рождена внутренним рефактором • Используется для “точечных” тестов • Используется и для регрессий тоже • Заодно там же микробенчмарки • Debug=test, Release=bench :) Ежечасный дзен • • • • • 1*regression ~= 2-3min 1*quick-regression ~= 1 min 2*(regression+unit+capi) ~= 5+min Все в “1 клик”, но этого мало Тесты и почта на каждый коммит • Либо исправляем почти сразу • Либо ревертим!!! (Это редко) Ежеминутный дзен • Регрессионная тест-сюита, test/ • Написана на PHP, это, кхм, минус!!! • Заодно тестирует PHP API, это плюс • Тестируется вся система • Дескрипторы и мутаторы • Данные, запросы, варианты • API, QL Еженощный дзен Acceptance: проверяем результаты Performance: мерим QPS 1M (1.3G) документов, 1K+ запросов Несколько режимов • fork, threads, prefork, ... • trunk, rel20, … • “Вчерашняя” ачивка: графики!!! • • • • “Толька! Этого мало!” (6) • Все равно проникают адовые баги :) • Баги бывают трех классов, A, B, C • Но иногда! бывают баги класса Ы • issue-72, issue-136, … • bug-660, bug-1117, … • И отдельной строкой performance issues • prefork spin, O(n^2) zones, … (6) Вопрос знатокам: до скольки qps только что было на графике? Про билды • До июля 2010 считай не было • Только source + win32 • Это плохо, так нельзя • Постепенно научились собирать пакеты • Как обычно, россыпь виртуалок • Как обычно, скрипты в 1-клик • MacOS пока сопротивляется Про цикл релизов • Был заторможенный, 1 раз в год (ууу) • Всегда можно взять транк!!! • Но не всем, говорят, дают (хехе) • Теперь разгоняем, раз в 1-2 мес • Очередная попытка maintenance • Пока что, тьфу-тьфу, получается!!! • Следующая цель: разогнать “беты” Про именование версий • Dev • Тупо текущий “транк” • Beta • “Известных” “крупных” багов нет • Добавляются новые фичи • Code-freeze пока не отличить • RC? Gamma? Нуегонафиг? Про именование версий • Release • 1-2 месяца после code-freeze beta • “Известных” багов уаабще нет • Но это ничего не значит!!! • После этого только багфиксы • Перед этим, в общем-то, тоже Почему важны баги • Ну... • Нас пока еще меньше 1000 человек • А разнообразные комбинаторные взрывы никто не отменял! (7) Вопрос знатокам: как звали маму Дарта? Виды багрепортов • Бывают правильные • Вкратце – все нужные данные • Особый шок – когда прям сразу • Бывают как обычно • “Ааа все пропало мы все умрем” • И, конечно, зачем отвечать на почту Про 1 клик • Билды в 1 клик • Тесты в 1 клик • Линт в 1 клик • Промежуточные (!!!) эксперименты тоже в 1 клик Про 1 клик @echo off set PATH=C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;%PATH%; devenv sphinx05.sln /rebuild release bin\release\indexer aot echo diffing... md5sum C:\Work\sphinx\indexes\aot.* >cur.txt diff cur.txt ref.txt Про 1 клик call hgrm del src\*.orig del src\*.rej del doc\*.orig del doc\*.rej hg up -r 1309 hg merge -r %1 hg id Про общую Мега Парадигму • Стратегия, дизайн-принципы кода ядра • Пиши просто • Пиши кратко • Смерть “скрытым платежам” • Кто не пользуется – тот не платит • Крути гайки насмерть • Ослабить никогда не поздно Про общую Мега Парадигму • Тактика, полезные фокусы • Порядок. Кодстиль, линт, краткость • Автоматизация. Всякое в 1-клик • Тестирование. Тотальное и хуже • Багфиксы. Сначала они Как отмазаться в понедельник • Делайте тесты, иначе тяжело • Автоматизируйте всякое, иначе тяжело • Запуск в 1-клик • Либо быстро исполняться • Либо настраивать автобота • Пишите код хорошо, а плохо не пишите • Не апгрейдитесь в пятницу! Вопросы? Аксенов Андрей Sphinx Technologies Inc shodan@sphinxsearch.com +1 (888) 333-1345 (8)