Вопрос, вынесенный в заглавие поста, донимает меня уже изрядное время. А после вчерашней статьи на Хабре и комментариев к ней появилось желание найти таки на него ответ.
Суть вот в чем: при обсуждениях SO-5 на публике рано или поздно, в той или иной форме, но всплывает вопрос о том, а чем же SO-5 отличается от CAF? (Ну, или в несколько другой формулировке: чем SO-5 лучше CAF?). Но если три года назад ответ на этот вопрос был интересен мне самому и было какое-то желание участвовать в разговорах на эту тему, то теперь и вопрос нисколько не интересен, и желания отвечать на него нет.
Как по мне, SObjectizer и CAF -- это совершенно разные продукты. У них разная история, разные цели, разные способы достижения этих целей и разные подходы к развитию, да и к самой разработке. Объединяет их одно: оба фреймворка предоставляют реализации Модели Акторов для C++. Но как раз таки эта единственная общая черта и приводит к интересу публики: мол, если и то, и другое реализует Модель Акторов, то в чем именно различия?
Вопрос резонный. Еще более резонно то, что он адресуется нам, как разработчикам SObjectizer, а не авторам CAF-а. Ведь CAF пропиарен намного сильнее, в мире C++ о CAF-е знают очень многие, чего нельзя сказать про SObjectizer. Ну и поскольку спрашивающий, как правило, знает про CAF, но не знает про SObjectizer, то естественно, он думает, что это SObjectizer пытается угнаться за CAF-ом и именно нам, как разработчикам SObjectizer, нужно объяснять что к чему. Чем же так плох CAF, что нужен еще и какой-то SObjectizer?
Только вот не смотря на осознание все этой резонности, желания ввязываться в сравнение двух этих фреймворков все равно нет. И здесь нельзя не отметить два, возможно, субъективных фактора.
Во-первых, есть ощущение, что проведение таких сравнений -- это пустая трата времени. Мне бы хотелось, чтобы читатели понимали, что время -- это невосполнимый ресурс. Времени на разработку SObjectizer нужно гораздо больше, чем есть у нас в наличии. И отнимать его часть на то, чтобы проштудировать куски документации по CAF, просмотреть примеры, сделать какие-то выводы, затем проверить эти выводы в каких-то экспериментах... Ну очень и очень жалко этого времени, ибо полезный выхлоп, по ощущениям, совсем небольшой. Ну напишем мы в очередной раз, что в SO-5 всего один вид акторов, есть диспетчеры, но нет распределености, в отличии от. Ну и что?
Во-вторых, вступая в такие разговоры мы как бы соглашаемся на то, что SO-5 является аутсайдером по отношению к CAF-у. Что, на мой взгляд, сильно не так. Ну и когда ты слышишь от стороннего разработчика "Если вам нужно что-то работающее, берите лучше SObjectizer", то убеждаешься в этом еще раз.
Поэтому я склоняюсь к тому, чтобы перестать делать какие-то сравнения между SO-5 и CAF-ом. И, соответственно, перестать отвечать на вопросы о том, чем SO-5 лучше CAF и наоборот. Вместо этого, имхо, гораздо продуктивнее будет переводить разговоры в такую плоскость: "Расскажите, какого рода проблема перед вами стоит и я попробую рассказать, как вы сможете решить ее с помощью SObjectizer. Ну или объясню, почему в вашем случае SObjectizer не будет хорошим выбором".
Укрепляет меня в этой мысли еще и то, что лично мне сложно высказывать объективные суждения по поводу соотношения SObjectizer и CAF, т.к. я лицо, во-первых, заинтересованное, и, во-вторых, лично у меня не самые позитивные ощущения от того, что и как делают авторы CAF-а. Из-за этого всегда есть риск сорваться и высказать что-то нелицеприятное в адрес CAF-а, причем это будет сугубо субъективное впечатление, возможно, абсолютно неправильное. А это уж точно никому не нужно.
В общем, есть большое желание не принимать участия в каких-либо сравнениях CAF-а с SObjectizer-ом (равно как и с другими реализациями). Но, блин, нет уверенности, что это правильно.
PS. Мы пробовали заслать на awesome-cpp PR с информацией о SObjectizer. Но его не приняли. Может быть, одного PR от аффилированных лиц было недостаточно. Поэтому буду признателен, если кто-нибудь из читателей найдет время дабы сделать PR, например, вот с таким текстом:
[SObjectizer](https://sourceforge.net/projects/sobjectizer) - A small framework with implementations of Actor, Pub/Sub and CSP models. [BSD]