Как мы разрабатываем
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 FilesMicrosoft
  Visual Studio 8Common7IDE;%PATH%;
devenv sphinx05.sln /rebuild release
binreleaseindexer aot
echo diffing...
md5sum C:Worksphinxindexesaot.*
  >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   (8)

+1 (888) 333-1345
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx

CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx

  • 1.
  • 2.
  • 4.
    Что такое Sphinx? • Программа такая • Для серверов (и мобильных телефонов) • Делает поиск • Бесплатная, открытая, итп • Сам сервер ~90K строк, ~2.6 MB, C++ • И еще всякое (API, секретные тулы…)
  • 5.
    Про что доклад • Как у нас устроен процесс разработки • И, местами, почему так (спрашивайте!) • Никаких революций • Все очень тупо и стандартно • Ничего нового не узнаете уот уаабще (1) • Russian marketing in action!!! (1) Вопрос знатокам: как расшифровывается слово Sphinx?
  • 6.
    Мы говорим Ленин... •Команда разработчиков
  • 7.
    Мы говорим Ленин... •Команда разработчиков
  • 8.
    Мы говорим Ленин... •Команда разработчиков • Маленькая, очень • Удаленная, полностью • Звездочка, исторически • Диктатура, вынужденно • Ничто не религия – так сложилось • Работа по домам – и плюсы и минусы
  • 9.
    Вольно пасущиеся коты(2) • Внешняя часть • Mantis, форум, изредка IRC • Внутренняя часть • IRC, Skype, email, телефон • Eventum, Wiki, Mantis • Google Docs (2) Вопрос знатокам: кого рекламирует “заглавный” видеоролик?
  • 10.
    Кафка. «Процесс». - Холст, сыр, масло • Как устроен процесс “про код”? • Какие именно Мега Практики есть? • Каких нету, каких зря, каких спецом? • Как и почему именно так получилось? • Полтора выстраданных опытом фокуса
  • 11.
    “Мы е…и всена свете” • Waterfall ? • Agile ? • SCRUM ? • Kanban ? • Six Sigma ? ...
  • 13.
    “Мы е…и всена свете” • Waterfall ? • Agile ? • SCRUM ? • Kanban ? • Six Sigma ? ... • X3M !
  • 14.
    “Do the reasonablething” • По-русски, возможно, “включи мозг” • Раскидываем баги, фичи, редкий R&D • Мини-лекции и “атаки” по потребности • Отчитываемся (еженедельный звонок) • Итерации типично короткие • Результаты типично прозрачные • Ничего особенного, как и обещал
  • 15.
    Зоопарк VCS • Внутреннийsvn • Публичный svn (R/O зеркало, Gcode) • Внутренний hg • Для длинных веток • Для секретных веток • Для промежуточных патчей • Личный git
  • 16.
    Эволюция зоопарка • Было • svn исторически, зеркало очевидно • hg все (!) освоили “для себя” • git пока личный (?) эксперимент • Будет… может быть • svn + git ? • git / github ?
  • 17.
    Зоопарк сред разработки •Каждый строчит, как он хочет • MSVS 2005+ • gcc CLI • Codeblocks • Xcode • Довольно кроссплатформенно • Платформо-зависимого кода... МАЛО
  • 18.
    Про кодстиль 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 );
  • 19.
    Про кодстиль • Своеобразный • Пробелы • Мини-венгерская нотация • Смесь систем именования типов • Но оправданный! • Мгновенный контекст • Читаемость без подсветки и в целом
  • 20.
    Про кодстиль • Форсируюстиль • Форсирую компактность • Политика? • Религия? • Прагматика! • Ревью на старте. Типично ~1 мес • Линт и сразу и потом. Google ftw
  • 21.
    Про библиотеки итпSTL • STL, boost исторически не пользуемся • Было нельзя, сейчас незачем • Только вручную, только хардкор! (3) • Сторонние библиотеки, эээ, по ситуации • libstemmer, libre2 линкуем • libaot, часть стеммеров переписали (3) Вопрос знатокам: чему равен номер “старой школы”?
  • 23.
    Про ревью • Пока(?) без спецтулзов • Тупо обмен патчами (см. помойка) • Цели? • Баги так ловить нельзя • Проверка стиля итп дури • Проверка “туда ли идем” • Двойные проверки особо важного
  • 24.
    Внутренняя документация • Естьполу-публичная, • doc/internals*.txt (4) • Есть совсем внутренняя • Особо секретная, так надо!!! • Пока маленькая, всего 10 страниц • Авось будем расширять и углублять (4) Вопрос знатокам: как расшифровывается “VLB”?
  • 25.
    Программа != продукт •Продукт = Программа + • Тестирование • Документация • Поддержка
  • 26.
    Про документацию • БОЛЬ •Программисты (это я) плоховато пишут • Юзеры (это вы) редко и мало спрошают • Нужен уникальный спец-человек • Штоп разбирался • Штоп интересовался • Пока не нашли!
  • 28.
    Про платную поддержку •Консультанты VS разработчики • Читаем доки вслух • К должны, Р теоретически могут • Помогаем придумать и внедрить фокусы • К должны, Р должны • Фиксим в коде старое, делаем новое • К не при делах, Р должны
  • 29.
    Про бесплатную поддержку •Форум – чистая личная доблесть • Пит, Барри • Mantis – политика партии! • Цель “смотреть все” • Получается пока не всегдец :( • Eventum, очевидно, приоритетнее • GPL=freemium, либо гринд, либо..
  • 30.
    Про тестирование • Внутреннее,мы сами • Автоматические тесты (см. Оч.Мал.) • Примерно 3-4 разных видов • Внешнее, пользователи • 10 Баг (через Mantis или Eventum) • 20 Фикс [+ автоматический тест] • 30 GOTO 10
  • 31.
    Ежеминутный дзен • Регрессионнаятест-сюита, test/ • Не сразу, примерно через 1.5 года… Apr 2006 vs Nov 2007 • Рождена комбинаторным взрывом • Сегодня ~200 тестов (5) • Сегодня 3000+ запросов • “1 клик” (на самом деле 2) (5) Вопрос знатокам: сколько в точности тестов в 2.0.2-beta?
  • 32.
    Ежеминутный дзен • Регрессионнаятест-сюита, test/ • Написана на PHP, это минус • Заодно тестирует API, это плюс • PHP API, C API остальное • Тестируется вся система • Дескрипторы и мутаторы • Данные, запросы, варианты, QL
  • 33.
    Ежеминутный дзен • Юнит-тесты,src/tests.cpp • “Фреймворк” assert.h • Рождена внутренним рефактором • Используется для “точечных” тестов • Используется и для регрессий тоже • Заодно там же микробенчмарки • Debug=test, Release=bench :)
  • 34.
    Ежечасный дзен • 1*regression ~= 2-3min • 1*quick-regression ~= 1 min • 2*(regression+unit+capi) ~= 5+min • Все в “1 клик”, но этого мало • Тесты и почта на каждый коммит • Либо исправляем почти сразу • Либо ревертим!!! (Это редко)
  • 35.
    Ежеминутный дзен • Регрессионнаятест-сюита, test/ • Написана на PHP, это, кхм, минус!!! • Заодно тестирует PHP API, это плюс • Тестируется вся система • Дескрипторы и мутаторы • Данные, запросы, варианты • API, QL
  • 36.
    Еженощный дзен • Acceptance:проверяем результаты • Performance: мерим QPS • 1M (1.3G) документов, 1K+ запросов • Несколько режимов • fork, threads, prefork, ... • trunk, rel20, … • “Вчерашняя” ачивка: графики!!!
  • 39.
    “Толька! Этого мало!”(6) • Все равно проникают адовые баги :) • Баги бывают трех классов, A, B, C • Но иногда! бывают баги класса Ы • issue-72, issue-136, … • bug-660, bug-1117, … • И отдельной строкой performance issues • prefork spin, O(n^2) zones, … (6) Вопрос знатокам: до скольки qps только что было на графике?
  • 40.
    Про билды • Доиюля 2010 считай не было • Только source + win32 • Это плохо, так нельзя • Постепенно научились собирать пакеты • Как обычно, россыпь виртуалок • Как обычно, скрипты в 1-клик • MacOS пока сопротивляется
  • 41.
    Про цикл релизов •Был заторможенный, 1 раз в год (ууу) • Всегда можно взять транк!!! • Но не всем, говорят, дают (хехе) • Теперь разгоняем, раз в 1-2 мес • Очередная попытка maintenance • Пока что, тьфу-тьфу, получается!!! • Следующая цель: разогнать “беты”
  • 42.
    Про именование версий •Dev • Тупо текущий “транк” • Beta • “Известных” “крупных” багов нет • Добавляются новые фичи • Code-freeze пока не отличить • RC? Gamma? Нуегонафиг?
  • 43.
    Про именование версий •Release • 1-2 месяца после code-freeze beta • “Известных” багов уаабще нет • Но это ничего не значит!!! • После этого только багфиксы • Перед этим, в общем-то, тоже
  • 44.
    Почему важны баги •Ну... • Нас пока еще меньше 1000 человек • А разнообразные комбинаторные взрывы никто не отменял!
  • 45.
    (7) Вопрос знатокам:как звали маму Дарта?
  • 46.
    Виды багрепортов • Бываютправильные • Вкратце – все нужные данные • Особый шок – когда прям сразу • Бывают как обычно • “Ааа все пропало мы все умрем” • И, конечно, зачем отвечать на почту
  • 47.
    Про 1 клик •Билды в 1 клик • Тесты в 1 клик • Линт в 1 клик • Промежуточные (!!!) эксперименты тоже в 1 клик
  • 48.
    Про 1 клик @echooff set PATH=C:Program FilesMicrosoft Visual Studio 8Common7IDE;%PATH%; devenv sphinx05.sln /rebuild release binreleaseindexer aot echo diffing... md5sum C:Worksphinxindexesaot.* >cur.txt diff cur.txt ref.txt
  • 49.
    Про 1 клик callhgrm del src*.orig del src*.rej del doc*.orig del doc*.rej hg up -r 1309 hg merge -r %1 hg id
  • 50.
    Про общую МегаПарадигму • Стратегия, дизайн-принципы кода ядра • Пиши просто • Пиши кратко • Смерть “скрытым платежам” • Кто не пользуется – тот не платит • Крути гайки насмерть • Ослабить никогда не поздно
  • 51.
    Про общую МегаПарадигму • Тактика, полезные фокусы • Порядок. Кодстиль, линт, краткость • Автоматизация. Всякое в 1-клик • Тестирование. Тотальное и хуже • Багфиксы. Сначала они
  • 52.
    Как отмазаться впонедельник • Делайте тесты, иначе тяжело • Автоматизируйте всякое, иначе тяжело • Запуск в 1-клик • Либо быстро исполняться • Либо настраивать автобота • Пишите код хорошо, а плохо не пишите • Не апгрейдитесь в пятницу!
  • 53.
    Вопросы? Аксенов Андрей Sphinx TechnologiesInc shodan@sphinxsearch.com (8) +1 (888) 333-1345