
Недавно я опубликовал статью, в которой представил новый социальный подход к программированию под названием SOSAL. Несмотря на её краткость, она снискала большое количество внимания и конструктивной критики, что позволяет более подробно проработать подход.
Эта статья посвящена исправлению ошибок прошлой статьи: корректировка некоторых принципов, применение их на практике, а также ответы на многочисленные вопросы. Каждому принципу и теме будет выделена отдельная тема с подробным описанием.
SOSAL (Socially-Oriented Software Architecture & Logic) – это подход программирования, основанный на социальном взаимодействии членов команды, а также способствующий их развитию и обучению.
Основываясь на прошлой статье, SOSAL состоит из пяти принципов:
Socially-Conscious Code (Социально-осознанный код)
Open by Default (Открытость по умолчанию)
Simple Scalability (Сбалансированная/простая масштабируемость)
Agile Adaptivity (Адаптивность выше догм)
Learning-Driven Logic (Логика, основанная на обучении)
Ниже последует более подробный обзор каждого из принципа, дополненных примерами и актуализированных критикой.
Socially-Conscious Code
Принцип Socially-Conscious Code способствует самому главному процессу работы в команде: кооперации. Для продуктивной кооперации в команде, кодовая база проекта должна быть простой, чистой и понятной.
Качество кодовой базы достигается посредством различных мер, от базовых принципов программирования до комплексных методов.
Примером базовых принципов программирования является понятное именование переменных (и одним из самых сложных наряду с инвалидацией кэша). Следует избегать не интуитивные или не задекларированные сокращения, однобуквенные имена (за исключением случаев, когда это полезно).
// плохо, назначение переменной неясно
const f = 42;
// пожалуйста, НЕ ИСПОЛЬЗУЙТЕ ВЕНГЕРСКУЮ НОТАЦИЮ
const g_nSpeed = 69;
// слишком подробно, хотя довольно забавно
const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = 1337;
// приемлемо
for (let i = 0; i < 5; i++) {}
Более продвинутым советом является соблюдение специфичного для языка (или проекта) стиля кода. Некоторые аспекты этих стилей применимы для большого количества языков программирования (например пробелы между операндами или логическое разграничение блоков пустой строкой).
// плохо
function pow(x,n)
{
let result=1;
for(let i=0;i<n;i++) {result*=x;}
return result;
}
// хорошо
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
Анти-примером этого подхода можно назвать переусложнение кода разного рода однострочниками или цепями вызовов. Лучше всего разделить этот код на несколько строк, но так, чтобы он был понятен.
// плохо
const r=[1,2,3,4].map(x=>x*2).filter(x=>x>3);
// хорошо
const doubledValues = [1,2,3,4].map(x => x * 2);
const filtered = doubledValues.filter(x => x > 3);
Также не забывайте оставлять комментарии в тех местах, где это больше всего необходимо, например при особо сложной логике или для объяснения аргументов и результатов функции.
// хорошо
// Exists проверяет, существует ли значение x (не nil и не нулевое).
// Возвращает exists (true, если значение существует) и ok (true, если проверка успешна). удалось получить объект
func Exists(x any) (exists, ok bool) {
// плохо
// взято из https://github.com/xelaj/mtproto/blob/main/internal/aes_ige/ige_cipher.go#L162
// generateAESIGE ЭТО ЕБАНАЯ МАГИЧЕСКАЯ ФУНКЦИЯ ОНА НАХУЙ РАБОТАЕТ ПРОСТО БЛЯТЬ НЕ ТРОГАЙ ШАКАЛ ЕБАНЫЙ
//nolint:godox ты че ебанулся // TODO: порезать себе вены
func generateAESIGE(msg_key, auth_key []byte, decode bool) ([]byte, []byte) {
Перечислю менее важные, но всё равно значимые критерии качества кодовой базы: следование шаблонам проектирования, отсутствие “магических чисел”.
Open by Default
Принцип Open by Default гласит о том, что ваш проект должен быть открыт по умолчанию. Открытость заключается не только в открытости исходного кода, но также в документации и настраиваемости (customizability): наличие внутренней документации важно как для закрытого, так и для открытого проекта. В случае открытости проекта рекомендую вам создать README с подробными инструкциями по запуску и настройке. Для настраиваемости проекта рекомендуется иметь конфиг или обширный список флагов командной строки.
Simple Scalability
Принцип Simple Scalability призывает вас писать код с осознанием его масштабируемости.

Самым простым типом масштабируемости является вертикальная масштабируемость, то есть увеличение мощности отдельно взятого узла. Вы, конечно, можете накинуть на сервер больше оперативной памяти и процессор пожирнее, но это идёт против идей подхода SOSAL. Для увеличения мощности приложения на отдельно взятом узле вы можете использовать кэширование часто запрашиваемых данных, асинхронность (или вовсе архитектуру, завязанную на событиях (event)), а также, в крайних случаях, оптимизацию асимптотической сложности критически важных алгоритмов.
Горизонтальная масштабируемость подразумевает увеличение количества узлов приложения. Самым простым методом является деплой приложения на множестве узлов и использования распределителя нагрузки (load-balancer), но это лишь бегство от реальных оптимизаций. Популярным сегодня методом горизонтальной масштабируемости является микросервисная архитектура: она позволяет сузить зону ответственности отдельно взятого сервиса, одновременно позволяя прозрачную горизонтальную масштабируемость и эффективность за счёт частого использования в ней брокеров сообщений, что подразумевает event-driven architecture. Прошу обратить внимание, что если ваш монолит ещё справляется с нагрузками, перепись всего на раст на микросервисы может подождать.
Сложной темой масштабируемости являются highload паттерны, они позволяют создать более отказоустойчивую, расширяемую, и производительную систему, рекомендую вам ознакомиться с ними самостоятельно.
Agile Adaptivity
Принцип Agile Adaptivity рекомендует писать код с учётом возможных кардинальных изменений кодовой базы или требований.
Для кодовой базы, этот принцип предполагает использование таких средств, как: шаблоны проектирования, использование интерфейсов, разделение логики.
Шаблоны проектирования это общепринятые пути решения проблем, они делают приложение более гибким, а также позволяют новым читателям кода быстрее понять суть. Прошу заметить, что паттерны так же просто применить как применить их неправильно, рекомендую более подробно с ними ознакомиться перед использованием. Примером гибкого шаблона проектирования является Репозиторий (если ваш тимлид любит менять базу данных каждые две недели, но справедливости ради это упрощает мок-тестирование). Стоит отметить, что переиспользование шаблонов проектирования ведёт к обратному результату.
Интерфейсы позволяют сохранить один интерфейс, то есть слой взаимодействия двух частей, и в то же время полностью менять внутреннюю логику по требованию. Несколько реализаций, к примеру, Репозитория, помогут сохранить одно поведение при абсолютно разных внутренних условиях, чёткое разграничение логики помогает при необходимости переиспользовать кусок программы отдельно от другой
Если отойти от одной только кодовой базы, то прекрасным подходом является настройка CI/CD (Continuous Integration, Continuous Delivery). CI поможет вам выявить проблемы с проектом на стадии принятия изменений (если вы постарались и написали тесты), а CD позволит быстрее выпустить обновления в продакшн. Одной из техник CD является Canary-развёртывание, то есть постепенное развёртывание изменений для доступа пользователям, пример такого в Kubernetes:
strategy:
canary:
steps:
- setWeight: 5
- pause: { duration: 1h } # Мониторинг ошибок
- setWeight: 100
Learning-Driven Logic
Принцип Learning-Driven Logic призывает писать код так, чтобы в процессе написания он учил как вас, так и других. Рекомендую при решении новых или подзабытых задач прошерстить материалы на предмет наличия элегантного, эффективного и читабельного примера. Рефакторинг – это не пытка, а возможность сделать свой код лучше и научиться новому в процессе. При проведении ревью будет очень кстати оставлять ссылки на материалы, которые помогут в решении задачи, что сделает ревью быстрее, проще, и приятнее для всех участников. Отдельной темой для LDL является создание пет-проектов в нерабочее время, хотя некоторые компании выдают на это рабочее время. Пет-проекты дают вам свободу самовыражения при решении задачи, вы можете использовать лучшие решения, не оглядываясь на возможную кучу легаси в вашем проекте.
Часто задаваемые вопросы
В комментариях под прошлой статьёй множество людей задавали важные вопросы, и я постараюсь ответить на самые важные из них.
А как этот ваш SOSAL будет работать в парадигме GOVNO (https://govno.works/)? Противоречий не возникнет?)
Из-за общей природы SOSAL, каждый волен адаптировать этот подход под себя любыми методами, в пределах данных принципов. Подход GOVNO, например, более подробно раскрывает такие принципы SOSAL как Socially-Conscious Code и Open by Default, SOSAL только выигрывает от взаимодействия с другими подходами и идеологиями.
Как-то режет ухо название…
Для меня название – это не самое важное в подходе, более важным критерием оценки является эффективность и возможность оптимизации процессов в команде. Были также предложены различные варианты названия, такие как LASSO и LASOS. Надеюсь что читатель простит мне некоторую ассоциацию на фоне этого названия, но я считаю что описанные тут принципы действительно позволят улучшить качество разрабатываемых таким образом систем, каким бы не было название этого подхода.
Опять под видом хитрых методологий и заумных аббревиатур, нам подсовывают то, что каждый разработчик умеет со старта.
И правда, принципы подхода SOSAL могут быть очевидными и интуитивными для опытных разработчиков, но мы не можем забывать про только начинающих свой путь в программировании. Посредством формализации подхода SOSAL, мы можем распределить популярные знания между всеми участниками команды для более эффективной работы.
Зачем этот SOSAL, когда уже есть более простой и понятный LIZAL (Loose Interface, Zero Abstraction Layer)?
SOSAL – социальная идеология программирования, тогда как LIZAL и подобные (SOLID, DRY, KISS) более сосредоточены на конкретном коде и на конкретных аспектах программирования.
Лояльны ли компании из ОБОСРАЛСЯ* (Озон, Билайн, Окко, Сбер, Рамблер, Авито, ЛамодаТех, Сколково, Яндекс) к SOSAL?
Я не располагаю данными о введении данного подхода в популярных российских компаниях, но думаю что SOSAL останется непопулярным ещё некоторое время, но я очень надеюсь что данный подход сможет оставить свой след и в технических гигантах нашей страны.
Автор если и SOSAL, то сильно не имплементировал. Чисто так, по злому и без удовольствия попрограммировал и всё.
В моих мыслях, SOSAL – это идея, которой нужно придерживаться осознанно, искренне, со стремлением упростить работу своей команды, хотя я не порицаю вас если вы держитесь в программирования “чисто так по злому, без удовольствия”, чтобы получить деньги.
Заключение
В заключение хочу сказать, что SOSAL – это больше чем сухой свод правил. Я изложил своё видение определения принципов социального взаимодействия в области разработки IT-систем, их осознание и применение может наполнить мир разработки тем, чего нам в нём не хватает: дружбой, кооперацией, развитием и коллективным духом. Благодаря достаточно общей натуре этого подхода, каждый может использовать SOSAL в своих командах и проектах, и я надеюсь что после этой статьи, я смогу воодушевить большее количество людей на использование моего подхода.
Комментарии (91)
rikert
14.06.2025 20:19Возможно действительно если больше сосать то это улучшит качество программирования. Ждём отзывов.
Rorg
14.06.2025 20:19Рекомендую ознакомится с комментариями к первой статье. https://habr.com/ru/articles/914998/comments/
Там можно найти отзывы о этом и других "подходах", а также предложения о их "модификациях".
killyself
14.06.2025 20:19За аннотацию вида
Exists это функция, которая показывает существует объект или нет
// Возвращаемое значение exists показывает существует ли объект, ok равен false если не удалось получить объект
Я бы достал линейку и начал ей грозно покачивать в сторону юного пейсателя
xbt573 Автор
14.06.2025 20:19Да, комментарий вышел неудачный, если вы можете предложить что-то более интуитивное то я с радостью дополню этим свою статью
vkni
14.06.2025 20:19Достаточно очевидно, что комментарий должен быть написан с учётом людей со специальными возможностями:
// Функция. // Функция Exists(x any) проверяет, существует ли значение x // (не nil и не нулевое, иначе поведение неопределено). // Возвращает exists (true, если значение существует) и // ok (true, если проверка успешна), если удалось получить объект // // @param x значение x (икс), тип any // // @return функция возвращает exists (true, если значение существует) // и ok (true, если проверка успешна) // // Тело Функции Exists. func Exists(x any) (exists, ok bool) { ... } // Конец Функции Exists(x any)
Ведь согласно методологии, программист должен писать социально-ориентированный код.
Jijiki
14.06.2025 20:19// хорошо function pow( x, n ) { let result = 1; for ( let i = 0; i < n; i++ ) { result *= x; } return result; }
в итоге так читаемее на сколько бы не был большой файл, если между функциями будут еще больше отступы я по себе заметил будет еще читаемее, но тогда скролить просто больше придется
впринципе под такое даже специальный парсер можно написать если очень надо, чтобы удалять лишние отступы сохраняя только текст, проверить в редакторе можно выделив текст, в некоторых редакторах можно увидеть что выделяются лишние отступы вот эти отступы можно ловить парсером, ну я так делаю(1 раз сделал, чтобы вообще была возможность потом прочитать код), может это на любителя
вообще это старый стиль я его увидел в варианте на каком-то ресурсе какой-то версии Unix, там типо парочка примеров была и там код мега читаемый из-за этого
почему антипример плохой, потомучто слова и участки кода из букв или слов, сливаются только для машины типо того, я мог бы обьяснить более глубже, но это может быть не интересно просто, тоесть засечки-вектора-палочки они же слова-буквы должны быть интервально-характерно для человека разделены, наверно тоже самое относится и к отступам, ну потом просто читать можно код типо того
Jijiki
14.06.2025 20:19if(r.length()==1&&r.contains("}")){countCCCC--;} else if(r.length()==2&&r.contains("};")){countCCCC--;} for(int i=0;i<countCCCC;i++){if(r.equals("")){}else{ttt+=" ";}} if(r.length()==1&&r.contains("}")){countCCCC++;} else if(r.length()==2&&r.contains("};")){countCCCC++;} if(current.equals("*")&&next.equals("/")){ Green); Green);previous = current;current = next;next = it.hasNext() ? it.next() : null; break; }
иногда правда без одной строки не обойтись ставить там отступы бесполезно )
mayorovp
14.06.2025 20:19Ну, если вы строки на равенство проверяете через длину и contains, а ваши переменные называются countCCCC и ttt - то да, отступы тут и правда бесполезны.
ponikrf
14.06.2025 20:19Сколько было уже сказано. Все зависит от контекста.
Контекст понятен по названию функции. Логических блоков внутри функции нету.
Вот результат:
function pow( x, n ) { let result = 1 for ( let i = 0; i < n; i++ ) result *= x; return result; }
Нужно уметь не просто отделять операторы и тп друг от друга. А уметь отделять логические блоки друг от друга
Код выше, что был заминусован выглядит просто отвратительно
Я бы попробовал оформит его близко к этому (хотя к нему вопросов куда больше):
if ( r.length() == 1 && r.contains("}") ) countCCCC-- else if ( r.length() == 2 && r.contains("};") ) countCCCC-- for( let i = 0; i < countCCCC; i++ ) if (!r.equals("")) ttt+=" " if ( r.length() == 1 && r.contains("}") ) countCCCC++ else if ( r.length() == 2 && r.contains("};") ) countCCCC++ if ( current.equals("*") && next.equals("/") ) { previous = current current = next next = it.hasNext() ? it.next() : null break }
Это скажем так без без контекста.
Код в одну строку это не так страшно, если логически он делает конкретную вещь. Какой смысл ее расписывать в 20 строк?
Вы всегда можете подписать выше, что он делает по контексту, например:
// Возвращаем true если файл myfilename.txt найден for (const fn of this.getFileList) if (fn === "myfilename.txt") return true
Часто лучше обернуть тело цикла в метод , что бы изолировать логику и вписать ее в одну строку.
Например:
globalInit(){ // ... // Инициализация устройств for (const device of this.service.devices) this.initDevice(device) // ... }
В таком случае можно легко отделить логические блоки и не разбирать кучу контекстно ненужного вам кода.
PS: Если что я понимаю, что статья про юморок а не про программирование
Jijiki
14.06.2025 20:19да, вы правы, там уже такой код что хорошо что работает, я его без дебугера писал, отступы делал как в текстовом формате, потомучто чувствовал что потом буду его именно читать(да и пример я увидел 1 раз оформления кода ссылку потерял к сожалению), и так оно и случилось поэтому мне лично пока удобно ставить отступ как в текстовом документе, а как еще читать 5 тыщ строк, маленькие сжатые функции будут неудобны если не рассматривать правильность не правильность что всё в одном файле, придётся оформлять код к чтению именно в этом есть смысл, если текстовый редактор по метрике работает текст(екран текста), то там еще круче сделать можно на екран по функции
SolidSnack
14.06.2025 20:19Надо ещё уточнить что есть не только паттерны, но и антипатерны, например DRISTAL, или известная в простонародье как стрельба дробью. Код как бы размазывается по проекту
IuliusCaesar753
14.06.2025 20:19ОО
Это лучшее, что я читал за последнее время
Чтобы написать комментарий даже зарегистрировался здесь.
pnmv
14.06.2025 20:19основная часть банкета находится в обсуждении к первой публикации, на заданную тему.
Igor_Veto4kin
14.06.2025 20:19вот как правильно увеличивать численность пользовательей хабра, админы, учитесь)))
Aspray
14.06.2025 20:19Какой подход к програмированию используете сосал?
sheshanaag
14.06.2025 20:19Предлагаю следующий этап развития методологии назвать Next Advancement SOSAL (NASOSAL) - когда адепты SOSAL смогут показать результат своей деятельности, так сказать, похвастаться перед сообществом.
yatanai
14.06.2025 20:19Это уже какой-то метавёрс получается. Там и PODSOSAL и VSOSAL и NESOSAL и прочие диалекты
Zalechi
14.06.2025 20:19В данном случае либо NASOSAL либо NEDOSOSAL.
Иного не дано, — соотвественно оригинальной концепции естественно))
RichardMerlock
14.06.2025 20:19Да просто заголовок ваще неправильный. Надо: " OT SOSAL теории к практике"
MainTrain
14.06.2025 20:19Ещё забронировать sosal.net, что бы делиться открытым кодом с применением методики
pnmv
14.06.2025 20:19.net - является токсичным, платформозависимым доменом.
при выборе домена, следует исходить из более открытых принципов.
Vitimbo
14.06.2025 20:19.net уже давно опенсурс и прекрасно соответствует принципам SOSAL. Вообще, этим принципам ms всегда соответствовала.
pnmv
14.06.2025 20:19когда хочешь поставить студию, тебе впаривают под сорок гигов чистейшего опенсурса, прозрачного, как слеза жЫра, стекающая с плачущего монитора.
S1908
14.06.2025 20:19Это троллинг? Архитектура c# например по умолчанию поддерживает эту методологию.
ahdenchik
14.06.2025 20:19C# - SOSAL, да. Вообще, многие языки и фреймворки поддерживают. Но важно чтобы у автора кода SOSAL был частью повседневной практики, а не просто ещё одним умением, как DDD или SCRUM - которые, по факту, нужны и вспоминаются только на собеседованиях
xbt573 Автор
14.06.2025 20:19Это так. С момента создания этого подхода, я стараюсь использовать SOSAL во всех своих проектах и даже маленьких фрагментах кода
S1908
14.06.2025 20:19Буквы специально подобраны чтобы поддерживать смысловую аналогию с размножением видов? :D
a1111exe
14.06.2025 20:19В статье не хватает пункта, что после освоения подхода SOSAL начинающим разработчикам рекомендуется сразу начинать практиковать методологию GLOTAL - Guided Lean-Oriented Test & Agile Lifecycle.
pnmv
14.06.2025 20:19сообщество с нетерпением ждёт релиза системы мультипарадигменной вербальной разработки PROGLOT.
Bayram_dev
14.06.2025 20:19Были также предложены различные варианты названия, такие как LASSO и LASOS
LA SOS?
JobManKazakh
14.06.2025 20:19Просто функции отделяю, всё равно там их на сотни КБ, так что лишние строки наоборот усложнят перелистывание кода
Haizer
14.06.2025 20:19Лучше уже не будет. Эта идея уникальных методик, подходов и "сильных" аббревиатур пришла к своему логическому завершению.
Jijiki
14.06.2025 20:19статья шуточная конечно, но всё по делу, придётся писать (или даже интегрировать туториал, например справка по кейбиндам, в репе придётся описать все функции - возможности, и хайлоад придётся тоже сделать - eg многопоточка чтобы разгрузить уи например от тяжелой задачи - убрать в фон, ну и от визуала если отходить придётся делать дружественный интерфейс ))
дойти бы до этого в С++, пока я до этого допрыгнул на java ))
sets
14.06.2025 20:19Я хочу сказать так - весь год я был хорошим мальчиком и заслужил эту статью! Да, первую пропустил(
AlexeyOs
14.06.2025 20:19Проект PIDOR канул в лето
https://github.com/ApplePride/PIDORНо интересна теоретическая возможность сочетания архитектуры PIDOR для IOS приложений с подходом SOSAL
Схема архитектуры PIDOR x67
14.06.2025 20:19Аналитика должна соответствовать идеологии Holistic User Insight
И не забываем про подход Performance Indicator Zero-Delay Analysis
Igor_Veto4kin
14.06.2025 20:19это очень хорошо. Причем мне нравится, на какиих серьёзных щах все это обсуждается. Я очень хочу посмотреть, как какой-нибудь иностранец не выкупит тонкий айтишный юмор ( для англоговорящих юзеров SOSAL - это просто аббревиатура безо всякого подтекста) и через годик мы увидим доклад про это на какой-нибудь серьёзной научной конференции. Вот тогда действительно можно будет сказать, что шутка зашла слишком далеко
Ydav359
Надеюсь, это шутка
pnmv
он по всему интернету уже разнёс это.
через год, ожидайте в сурковом ынтырпрайзе.
yatanai
Нужно донести эту гениальную мысль до англоговорящих и тогда посмотрим как залетит
xbt573 Автор
Перевод изначальной статьи есть на Medium, им пока не заходит :(
Если эта понравится больше то попытаюсь перевести ещё раз
https://medium.com/@xbt573/sosal-revolutionary-social-programming-methodology-4ff635938cd9
pipewalker
Сделайте лендинг, прикиньтесь центром сертификации SOSAL, глядишь, кто-нибудь с ликендина и зацепится. Может, даже спросят, как сертифицироваться. С govno.works так и случилось :)
pnmv
и в каких зарубежных интерпрайзах задействовано это?
а то, такое ощущение, что смешной домен с некоторым манифестом, по известному адресу, есть, а применения этому делу нет.
pnmv
трудно было ожидать какой-либо другой реакции.
pnmv
с той стороны уже постучали. где-то пролетало про v-j-чего-то там. какая-то модель, что-ли. не то языковая, не то вибросамохвата...
mrqak
Enterprise Business Adaptive Logic
ahdenchik
Enterprise Business Adaptive Logic Integration
grvelvet
Шутка затянулась.