В чём разница между сочинением третьеклассника и статьёй в крупном таблоиде? Любой из нас сходу определит, что есть что. Даже если оба текста описывают одно и то же событие. А чем отличается код сеньора от кода мидла?

Разница в мелочах. В мелочах, которые при взгляде сверху дают совершенно другую картину. Лид статьи от профессионального редактора притянет внимание, структура и ход повествования доведут нас до последнего абзаца. Наш взгляд не споткнётся, мы буквально пролетим по тексту, улавливая суть каждого предложения. Так же и код сеньора нам покажется незамысловатым, словно прописные истины. Мы почти не приложим усилий, чтобы понять его. Невозможно написать качественный, читаемый, поддерживаемый код без навыка давать хороший нейминг. 

Нейминг — часть архитектурной работы. Наименования классов и переменных мигрируют в названия таблиц баз данных, улетают с событиями, проникают в другие системы через API. Проще сменить имя в паспорте, чем исправить контракт, который имеет тысячи использований. Ошибки в нейминге быстро масштабируются, увеличивая сложность системы на ровном месте. Зачастую их исправление стоит колоссальных усилий и средств. Не стоит забывать про документацию, тест-кейсы, аналитику.  

Что касается самого кода, то это отражение того, как мы поняли предметную область. Понимание предметной области, её задач и проработка решений — это то, что делает инженер в IT. Чтобы отразить предметную область, мы используем нейминг, даже если специально об этом не задумываемся.

Одной из проблем нейминга является непонимание, почему это так важно. В статье мы посмотрим на то, к чему приводит отсутствие системы нейминга и какие выгоды мы приобретаем, если в проекте построен процесс работы с ним.

Второй проблемой является отсутствие под рукой лёгких инструментов, чтобы быстро и понятно называть, каких-то простых приёмов. И в этой статье я поделюсь такими приёмами. Здесь не будет очередной теории нейминга, которую нужно разбирать и доносить до коллег. Я описываю простой процесс, позволяющий одинаково понимать домен, а все инструменты вы сможете использовать сразу же после прочтения. Их эффективность оказалась для меня поразительной — надеюсь, вы испытаете те же чувства, когда примените в своей команде.

Распространённые ошибки

Возможно, вы встречали подобные подборки ошибок в книгах и статьях. Этот список по-своему уникален тем, что специфичен для разработчиков, у которых английский не является родным языком.

Название переменной ничего не говорит о её предназначении

let data = {} // FIXME rename to requestPayload
let n = 1; // FIXME rename to startIndex
let var1 = "Something"; // FIXME rename to eventName
let value = {...data}; // FIXME rename to user
let array = [var1]; // FIXME rename to firedEvents
let info = var1 + " happened"; // FIXME rename to alertMessage

Переменная — это какие-то данные, какое-то значение, но не стоит её так и называть. Конкретизируйте. Что за значение мы хотим в ней хранить? Так и назовём переменную. Даже если мы пишем дженерик, то можно дать более конкретное название.

Избыточные названия

const addedDateTime = new DateTime(); // FIXME rename to addedAt
const basket = {
	basketId: 0, // FIXME rename to id
    items: []
}

В название добавляется тип переменной или избыточный префикс названия объекта. В итоге мы читаем код как «добавлено дата время» или «корзина — айди корзины». Код должен читаться без таких запинок «добавлено в 12:00», «корзина: айди: 4, элементы: […]».

Названия без контекста

const user = {
	id: 11,
	source: "linkedin", // FIXME rename to leadSource
	state: "Philadelphia", // FIXME rename to countryState
	status: "unemployed" // FIXME rename to employmentStatus
}

Только благодаря значениям  мы поняли, что за source имеется в виду, в каком смысле употреблены state, status. Без значений всё усложняется — придётся отвлекаться и уточнять, о чём идёт речь.

Неправильный перевод

public enum TravelMode // FIXME rename to TransportType
{
	Driving = 0, // FIXME rename to Vehicle
	Walking = 1, // FIXME rename to OnFoot
	Bicycling = 2 // FIXME rename to Bicycle
}

Часто одни и те же термины имеют разное происхождение в разных языках. Мы, русскоязычные, сможем догадаться, что это особенности перевода, что речь идёт о том, как курьер доставляет заказ. Но носитель другого языка, с большой вероятностью, окажется в тупике.

Калька со своего языка

var orderHandoverTime = {
	preparationTime: 651, // FIXME rename to cookingTime
    heatedShelfTime: 30,
	pizzeriaId: 3, // FIXME rename to unitId
}

var staffMember = {
	id: 52,
	medicalBookEnd: false, // FIXME rename to isHealthPermitExpired
	INN: "" // FIXME rename to taxIdentificationNumber
}

var employeeDinner; // FIXME rename to staffMeal
var salary; // FIXME rename to incentives

Иногда в русском одно и то же слово может обозначать разные объекты или действия, но в английском нет. Более того, некоторые заимствованные слова обрели разный смысл. Самым популярным примером может быть пара магазин — magazine. Смысл слов совпадает, если мы говорим про магазин к винтовке, но магазин с товарами мы уже переведём как shop (здесь стоит отметить, что magazine является заимствованием для обоих языков).

В примере разработчик перевёл «приготовление» как preparation, хотя речь о готовке еды. Ошибки можно избежать, если подобрать синонимы. Более специфичное слово «готовка» показало бы точный перевод.

Отдельной темой стоит бизнесовая или нишевая терминология, перевод которой совсем не прост. Гугл-транслейт, с большой вероятностью, приведёт нас не к тем переводам. Например, то, что мы называем «зарплата», в других странах даже формулируется иначе. В общем случае это «вознаграждения». 

В примере есть и более прямолинейные случаи перевода. Естественно, медкнижка — это исключительно русскоязычный термин.

Недостаточно точный термин

var avgWaitingTime = 2000; // FIXME rename to avgHeatedShelfTime
var avgServiceTime = 5000; // FIXME rename to avgDeliveryOrderFulfillmentTime
var avgDeveliryTime = 3000; // FIXME rename to avgOrderTripTime
var orderType: "restaurant" // FIXME rename to salesChannel
                			// also rename "restaurant" to "Dine-in"

Здесь мы видим неудачный нейминг в области с метриками времени у доставки заказов. В каждой строке возникают уточняющие вопросы «время ожидания чего?», «в какой момент отсчёт этого времени начался и в какой закончился?», «сервисное время? что имелось в виду?», «доставка — это от момента приёма заказа или от момента его готовности?». Такой нейминг порождает баги. Не все дотошно выясняют точное назначение каждой переменной.

Как правило, такой нейминг возникает от низкой погружённости в предметную область. Все мелкие нюансы выясняет инженер: от какого момента считать время на тепловой полке, от какого момента считается время доставки и тд.

Отдельный разговор про orderType. Один и тот же объект можно характеризовать с разных сторон. Заказ может быть отложенный или требующий немедленного приготовления, может быть отменённый или доставленный вовремя. Type может обозначать что угодно, лучше конкретизировать.

Абстрактные названия

var unitDeliveryEfficiency = {
	onePerTaskRate: 2, // FIXME rename to tripsWithOneOrderCount
	twoPerTaskRate: 4, // FIXME rename to tripsWithTwoOrdersCount
	threePerTaskRate: 0, // FIXME rename to tripsWithThreeOrdersCount
    fourPerTaskRate: 1, // FIXME rename to tripsWithFourOrdersCount
    morePerTaskRate: 0 // FIXME rename to tripsWithFiveOrMoreOrdersCount
}

По названию свойств сложно догадаться, о чём идёт речь. Почему бы не назвать свойства именем метрики, которую они несут? Не нужно придумывать лишние обозначения, которые не применяются в реальной жизни.

Но проблемный нейминг создал здесь ещё один прецедент — внимание на последнее свойство в объекте. Мы решили группировать те редкие случаи, когда курьер берёт более 4 заказов в одну поездку. Если чуть-чуть изменить наши правила, например, добавить поездки с 5 заказами, то все метрики поедут. А такую ошибку совершить очень просто, ведь название свойства ни к чему не привязано. 

На этом проблемы не закончились. Разработчик пошёл дальше и вывел на UI метрику в колонку «Более 4 заказов за поездку». «Более 4» — это 5. Надо так и писать: «5 и более заказов за поездку». Это лишнее действие в уме для разработчика и пользователя, которое появилось в результате такой ошибки.

Несколько вариантов для одного термина

В нашей системе можно встретить варианты нейминга одних и тех же терминов.

Заведение: Pizzeria, Restaurant, Store, **Unit**
Самовывоз: Pickup, **Takeaway**, Carryout
Заказ в ресторан: Stationary, **Dine-in**, Restaurant
Выручка: **Sales**, Revenue
Управляющий: **StoreManager**, Manager, Supervisor
Чек: Check, Cheque, Receipt

И если в некоторых случаях перевод просто некорректный и можно смело исправлять, то с чеком и пиццерией сложнее — сначала нужно договориться и выбрать одно значение.

Игнорирование конвенций нейминга языка программирования или компании

Мы должны знать общие правила нейминга в компании и своего языка программирования. Наш код должен быть достаточно близок к индустрии, из которой будут приходить люди, чтобы его поддерживать и развивать. В то же время в компании может быть своя прослойка правил, чтобы поддержка большой кодовой базы была проще и инженеры могли легко переключаться между проектами.

Нейминг — это понимание предметной области

Представим, что наш домен — хирургический набор. Это сейчас он аккуратно разложен перед нами на изображении ниже. Мы можем учесть все предметы и спроектировать домен. Мы не бросимся орудовать термином scissors налево-направо, так как понимаем, что ножниц много, они предназначены для разных операций. У нас будет всё так, как в жизни: BandageScissors, DissectingScrissors и так далее.

Набор хирургических инструментов.
Набор хирургических инструментов.

На практике, когда мы садимся за новый проект или подключаемся к существующему, перед нами не только нет подобного изображения, часто нет даже словесного описания. Предметная область, которую мы пытаемся оцифровать, является результатом нашей субъективной интерпретации на основании существующего кода или отрывочных фактов, которые мы сами соединяем в голове. Навряд ли у нас по счастливой случайности есть квалификация в области медицины или мы хотя бы раз видели такой набор. И если мы думаем о терминах на ходу, то плохо себе представляем, что же мы делаем. Отсюда выведем первое следствие:

 проблемы с неймингом → проблемы с пониманием предметной области.

Плохой нейминг — это работа, оставленная на потом. В моменте мы не уделили ему достаточно внимания, значит, будем уделять его потом — каждый раз, когда придётся работать с кодом или другими артефактами. Это похоже на захламлённую комнату. Подходя к неймингу несистемно, мы увеличиваем беспорядок. И нам становится всё сложнее ориентироваться, придётся держать много особенностей в голове.

Выведем остальные следствия плохого нейминга: 

требуется больше усилий → больше вероятность ошибки;

увеличивается энтропия → код сложнее поддерживать;

разработка идёт медленнее и труднее с нарастающим итогом.

Помимо прочего, так мы тратим собственные когнитивные ресурсы на ориентирование в коде. Тут дело даже не в эффективности. Это бесполезно упущенные время и энергия, которые нам ничто не компенсирует. И эти потери драматичны, поскольку неудачный нейминг прописывается единожды, но проявляет себя многократно и замедляет каждого, кто с ним сталкивается.

Как выстроить работу с неймингом в команде

Перед нами новый проект или уже существующий, которым мы плотно займёмся. До того как мы распишем нейминг, нужно погрузиться в предметную область. Для этого есть разные инструменты: от простого интро или экскурсии на производство до Event Storming или совместного составления User Story Map. Понять предметную область для инженера критически важно. Возможно, вы не раз слышали утверждение, что разработчик точнее знает бизнес-процесс, чем эксперт из бизнеса. Именно потому, что он его не только представляет, но и реализует до мельчайших подробностей. И каждый новый участник команды должен проходить погружение.

После погружения нужно составить словарик. В парадигме DDD это будет Ubiquitous Language. Для составления словарика собирается встреча — максимально все, кто будет участвовать в работе над проектом. Важнейшим критерием должно быть то, что в группе есть и бизнес, и технические эксперты. Драйвит составление словарика и его владение технический эксперт. Примерный состав группы:

  • менеджер продукта,

  • разработчик,

  • инженер по качеству,

  • дизайнер,

  • аналитик,

  • стейкхолдер,

  • эксперт со стороны бизнеса.

Словарик состоит из сущностей, акторов, процессов из предметной области. Иначе говоря, нам нужно «нарезать» домен на сущности. Выдвигая каждый термин, мы расписываем его определение, что мы понимаем под этим. В процессе формулирования терминов и их определений происходит обмен контекстами между техническими и бизнес-экспертами. 

Во время встречи происходит выравнивание картины у всех участников. На нашей практике обнаружилось, что даже у разработчиков одной команды, которые не первый месяц поддерживали продукт, было совершенно разное понимание одних и тех же вещей. Мы были очень рады, что заранее всё это проговорили. Помимо синхронизации на поверхность всплывает множество мелких деталей и вопросов, которые были в голове у кого-то одного, но теперь будут вписаны в общую картину. Более того, мы впервые можем показать бизнесу то, что собираемся делать, ещё не сделав ничего! Наше видение будущей системы уже может быть сопоставлено с ожиданиями стейкхолдеров. Для представителей бизнеса важно и интересно быть вовлечёнными в создание продукта, которым они же и будут пользоваться, который станет их активом.

Так выглядит словарик после нескольких встреч с командой
Так выглядит словарик после нескольких встреч с командой

Вполне может случиться, что найдутся непроработанные детали, которые нужно выяснить и взять на исследование. Паркуем спорные моменты и двигаемся дальше. Как правило, с одной встречи словарик составить не выходит — всегда вылезают какие-то детали, о которых нужно подумать отдельно.

Что делать, если идёт тяжело, термины для словарика не генерируются? Во-первых это нормально. Работа над неймингом — это часть архитектурной работы. Размышляя над терминами и их значением, мы прикидываем архитектуру нашей системы. Опыт тоже играет роль. Но, как правило, это показатель слабой погружённости в предметную область. Погрузитесь сильнее, выясните больше деталей.

Важный момент, что изначально мы составляем словарик на том языке, на котором говорит бизнес. Программы для бухгалтерий так и пишутся на русском. Это логичное решение, поскольку усилия, потраченные на перевод терминологии, которая нужна только для русскоязычного рынка, будут напрасными. Но больше случаев, когда нужно переводить терминологию на английский. 

У нас есть глоссарий бизнес-терминов на английском. Лучше, если он будет глобальным для компании. Как упоминалось выше, перевод бизнес и нишевой терминологии — задача нетривиальная. Переводчику нужно обладать экспертизой в бизнесе, чтобы правильно подбирать терминологию. Так что такому глоссарию обязательно нужен владелец, который будет аппрувить или помогать с переводами.

Для перевода мы не пользуемся гугл-транслейтом. Наши инструменты:

Если вам сложно выбрать из двух-трёх терминов, вбивайте в поиск термины как в примере: staff member vs employee и вы попадёте на форумы, где носители языка помогают разобраться с контекстом употребления.

Глоссарий с переводами бизнес-терминов.
Глоссарий с переводами бизнес-терминов.

После того как мы составили словарик, добавляем его прямо в readme проекта. Он должен быть актуальным и лежать на виду, рядом с кодом.

Следующий шаг — это контроль, за это отвечает код-ревью. В процессе код-ревью по неймингу учитываем следующее:

  • верифицируем все новые термины;

  • смотрим на нейминг так, словно вы никогда не работали с этим доменом;

  • из названия должно быть сразу понятно, что это;

  • у термина не должно быть нескольких трактовок.

Как это назвать? Практические советы

Давать наименования — это навык, и на старте может быть сложно. Однако есть два простых правила, которыми можно пользоваться всегда:

  1. Отталкивайтесь от значения. Выпишите его. Как бы вы это назвали? Начните с русского наименования. Совместите значение и название — должно звучать складно, без лишних слов, на которых «спотыкаешься» — как человеческая речь.

  2. Не можете назвать лаконично — назовите предложением, потом сокращайте:

Количество заказов на курьера в час 
→ ordersCountPerCourierPerHour 
→ ordersPerCourierLabourHour

Пример. Назовём массив с объектами. Для начала просто выпишем структуру:

стоп-продажи по причине нехватки ингредиентов:
- ингредиент, из-за которого остановлены продажи: халапеньо
- продажи были остановлены в: 2023-01-05T10:00
- остановка продаж закончилась в: 2023-01-05T15:00
- сотрудник, который остановил продажи: Мельников А.
- сотрудник, который возобновил продажи: Мельников А.
- точка продаж: Сыктывкар-1

Теперь переведём:

var stopSalesByIngredients = [{
	ingredientName: "jalapeno",
	startedAt: "2023-01-05T10:00",
	endedAt: "2023-01-05T15:00",
	staffNameWhoStopped: "Melnikov A.",
	staffNameWhoResumed: "Melnikov A.",
	unitName: "Syktyvkar-1"
}]

Дополнительные советы, которые помогут сделать нейминг лучше

  1. Явное > неявное. Отвлекитесь на секунду и представьте, что прошёл год. Пронеслась череда событий и вы снова вернулись к этому коду. Вспомните ли вы все нюансы, которые не отразили в названии? Представьте, что видите этот код в первый раз и что не выясняли с болью всякие мелкие особенности, которые могут скрываться за этой конструкцией. Например, переменная содержит время окончания всего цикла или только какой-то стадии цикла. Укажите это явно в обоих случаях. Сколько возможностей для багов можно посеять, если не уточнить и оставить загадку другому разработчику или даже самому себе!

  2. Не стремитесь называть максимально коротко. Нейминг из 3-4 слов — это нормально. Передать конкретику одним словом, чаще всего, нельзя.

  3. Одна переменная — одна цель. Например, вы хотите записать дату и время окончания смены и одновременно по этой же переменной понимать, закончилась ли смена. Никогда так не делайте! Только явное обозначение в другой булевой переменной. ShiftEndedAt, IsShiftEnded.

  4. Отрицание только усложняет, а также это пример неявного поведения. Используйте явные наименования. Не «недоступно», а «доступ запрещён».

  5. Вырабатывайте единую структуру. Например, используйте одинаковые суффиксы и префиксы:
    Avg, Count, Percentage, Total, At, Name
    unitName, productName
    tripsDuration, couriersShiftsDuration

  6. Используйте глаголы или прилагательные для уточнения контекста:
    addedIngredients, removedIngredients, lateOrdersCount

  7. Стандартизируйте нейминг для времени. Если система фиксирует какое-то событие, то используйте глагол в прошедшем времени + суффикс At: happenedAt, startedAt.
    Если по умолчанию храните время в UTC (что рекомендуется делать), а в контракте отдаёте локальное, то добавляйте ещё один суффикс Local: happenedAtLocal.

  8. Опирайтесь на словари синонимов и значений.

Что делать с легаси

Если проект требует минимальной поддержки, то инвестиции в переделку нейминга не окупятся. Тут мы принимаем, что каждая задача делается дольше и оставляем всё как есть. Но даже в таком случае можно подчищать места с несколькими наименованиями для одного термина или переменными, смысл которых совершенно непонятен.

Но если мы приходим всерьёз и с большими задачами на легаси, то:

  1. Составляем словарик с новой единой терминологией.

  2. Делаем фасады для всего нового кода, чтобы локализовать область, где останется старый нейминг.

  3. Применяем правило бойскаута — каждый раз понемногу рефакторим нейминг.

Как работать с возражениями

Нам так удобнее называть, нам такие названия понятны.
Я не эксперт в бизнесе, а задачу надо делать сейчас.
Так уже было в проекте.
Проверил в Google Translate, там такой перевод.
Это не так важно, главное качество кода.

Я придерживаюсь мнения, что в IT нет правильных или неправильных решений. Мы стремимся выбирать оптимальное, исходя из наших возможностей и обстоятельств. Порой срезание углов делается преднамеренно, например, когда у нас каждый час на счету и мы готовы потом разгребать все долги. Здесь я сошлюсь на Technical Debt Quadrant Фаулера. Сложно в двух словах объяснить коллегам важность работы с неймингом, особенно если это не тема встречи и об этом раньше сильно не задумывались. Но если мы понимаем, что их аргументы попадают в область Reckless Deliberate (преднамеренное безрассудство), то соглашаться с ними, конечно, не стоит, и начать разговор нужно именно с этого.

Квадрат технического долга
Источник — https://martinfowler.com/bliki/TechnicalDebtQuadrant.html
Квадрат технического долга Источник — https://martinfowler.com/bliki/TechnicalDebtQuadrant.html

Ещё одна рекомендация — не обсуждайте нейминг текстом (во время ревью или составляя словарик), старайтесь делать это синхронно. Иначе это вымотает всех.

Как объяснить ценность бизнесу

Зависимость скорости выпуска фич от техдолга
Источник — https://martinfowler.com/articles/is-quality-worth-cost.html
Зависимость скорости выпуска фич от техдолга Источник — https://martinfowler.com/articles/is-quality-worth-cost.html

Главный плюс для бизнеса — это скорость. Словарик, составленный на старте, эти несколько встреч будут окупать себя многократно: в ходе начальной разработки проекта, при каждом онбординге нового человека и команды, при каждом возвращении спустя несколько месяцев, чтобы добавить новые фичи.


Язык определяет мышление — так формулируется гипотеза лингвистической относительности. Выше мы разбирали проблемы и решения, которые вытекают из этой простой формулировки. К современному инженеру предъявляются гораздо более высокие требования по коммуникативной грамотности, чем к инженерам ещё несколько десятилетий назад. И в IT это особенно чувствуется, ведь всё, что мы делаем — это текст. Осознание значительной гуманитарной составляющей в профессии инженера существенно изменило мой подход к делу.

Конечно, чтобы «третьекласснику» дорасти до «редактора» нужен не только навык крутого нейминга. Мелочи, из которых складывается общая картина, разбросаны по множеству книг, статей, проектов. Однако чистый и понятный код даёт уже очень много. Ещё больше про мелочи в коде рассказывает Роберт Мартин в книге «Чистый код». Если вы ещё не открывали эту книгу или делали это давно, то сейчас самый подходящий момент.

А ещё про нейминг у каждого есть свои байки и казусы, поделитесь ими в комментариях. Вы также можете поделиться этой статьёй с коллегами. Она самодостаточна, чтобы стать отправной точкой к улучшению нейминга в проекте, над которым вы работаете.

Комментарии (220)


  1. astypalaia
    00.00.0000 00:00
    +32

    Еще одна иллюстрация старой истины: в программировании только две проблемы - именование переменных и инвалидация кэша.

    А вообще за четверть века в профессиональной разработке я понял, что глобально у кода есть только одна характеристика: человек думал о том, что он кодит, или не думал, а еще точнее - человеку нравится его работа или лишь бы поскорее этот клятый тимлид наконец от меня отстал (в частности с вопросом почему у тебя сущность называется Pizza, хотя на самом деле это Cappuccino - ведь компилятору вообще без разницы)


    1. DrGluck07
      00.00.0000 00:00
      +13

      Еще одна иллюстрация старой истины: в программировании только две проблемы - именование переменных и инвалидация кэша.

      Ещё круглые кнопки на Delphi.


      1. alexxz
        00.00.0000 00:00

        Это какой-то мем?


        1. DrGluck07
          00.00.0000 00:00
          +3

          На любом форуме по Дельфям в начале нулевых было много вопросов на тему "как сделать кнопку круглой/овальной/любой формы".


          1. voidMan
            00.00.0000 00:00

            И хренова куча сторонних компонентов на эту тему)


    1. shigorin
      00.00.0000 00:00
      +2

      В разрезе «ремесленник/мастер» оказались интересны "Раздумья ездового пса" В.В. Ершова… можно по ключевым словам «мальчик на тойоте» глянуть именно те места.

      Ещё хорошо выходит, когда получается понять задачу на своём месте, глазами заказчика и в шкуре того, кому с этим непосредственно работать — для такого бывает полезно не ограничиться ТЗ, а провести денёк с будущими пользователями, примечая то, что в ТЗ бы попросту не попало, но выяснялось на ходу (это в случае заказной разработки, конечно — хотя и при продуктовой могут быть случаи, когда первые желающие уже известны).


    1. anwender95
      00.00.0000 00:00
      +25

      Дополню:
      В программировании две проблемы — именование переменных, инвалидация кэша и ошибка на единицу)


      1. Tasta_Blud
        00.00.0000 00:00

        а как же разыменование нулевого указателя (оно же NullReferenceException), деление на ноль и самое страшное - утечки памяти?
        (впрочем, я слишком молода и, возможно, не распознала мем)


        1. mukhinid
          00.00.0000 00:00
          +1

          впрочем, я слишком молода и, возможно, не распознала мем

          Таки-да, мемом является фраза про инвалидацию кеша и именование пременных, а уж на её основе родилась куча вариаций: https://martinfowler.com/bliki/TwoHardThings.html


          1. khajiit
            00.00.0000 00:00

            Naming (things) это еще и перечисление. Две сложные вещи: инвалидация кеша и перечисление вещей.
            Отчего шутка становится более программистской.


      1. Lukerman
        00.00.0000 00:00
        +5

        Done)


  1. aleksandy
    00.00.0000 00:00
    +4

    TL;DR Cиняя книга права, единый язык нужОн.


    1. plutarh
      00.00.0000 00:00
      +2

      Вы, конечно же, имеете в виду книгу Эрик Эванс. Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем?


      1. aleksandy
        00.00.0000 00:00

        А какие ещё варианты?


        1. onehell
          00.00.0000 00:00
          +5

          Мало ли синих книг про единый язык, начиная с букваря.


        1. plutarh
          00.00.0000 00:00

          Есть еще более "синяя", точнее, сине-зеленая книга "Предметно-ориентированное проектирование, самое основное", Вон Вернон.


          1. aleksandy
            00.00.0000 00:00

            Книжка Вернона красная.


            1. Robastik
              00.00.0000 00:00

              Синева в глазах смотрящего. (Ну, или краснота.)


    1. FinnParnish
      00.00.0000 00:00

      А как же Зелёная книга?


  1. Grey6000
    00.00.0000 00:00
    -14

    А зачем вообще переводить на англ? если бизнес на русском и разработчики тоже русскоязычные, было бы логичней писать бизнес-логику на русском, а не мучаться со словарями для терминов

    Писать на русском не привычно, но код внезапно был бы более понятный чем couriersShiftsDuration, ordersPerCourierLabourHour, Health permit, Nutrition facts


    1. xxlagr Автор
      00.00.0000 00:00
      +22

      Было бы логично, если продукт никогда не будет выходить в другие страны. У нас сейчас 17 стран и в этих странах разработчики (которые пользуются API например) — они совсем не знают русский.


      1. Max_Pershin
        00.00.0000 00:00
        -11

        Так пусть учат. Чем мы хуже?


        1. xxlagr Автор
          00.00.0000 00:00
          +11

          Извините, но это ложная альтернатива: «не учат язык = считают нас хуже».
          До 20 века международным языком был французский, сейчас английский. Нашим разработчикам приходилось читать инструкции по немецки, когда нужно было интегрироваться с немецкими системами оплаты. Было больно, без претензий к немецкому. Просто даже второй язык выучить не то, чтобы просто.


          1. Max_Pershin
            00.00.0000 00:00
            -11

            Так вы главные - пусть учат. И тут не язык - тут набор терминов. Это же не инструкция а имена переменных. Спутник выучили и остальное выучат. Главное начать.


            1. xxlagr Автор
              00.00.0000 00:00
              +11

              Возможно вы знаете секрет как мотивировать иностранца купить франшизу, вложить средства в открытия ресторанов и при этом в обязательном порядке выучить русский. И вроде хочется начать, но не знаю с чего.


              1. Max_Pershin
                00.00.0000 00:00
                -12

                Просто скажите что если посмотреть граф совпадений корней русского языка с остальными индоевропейскими то он будет на втором месте после санскрита.


                1. SteamEngine
                  00.00.0000 00:00
                  +9

                  Если вам верить, санскрит вообще на первом, но его почему-то мало кто учит. Задумайтесь, почему.


                  1. Max_Pershin
                    00.00.0000 00:00
                    -7

                    Потому что это МЁРТВЫЙ язык!


                    1. SteamEngine
                      00.00.0000 00:00
                      +5

                      Именно. Мёртвый - то есть им не пользуются. И русским в окружении иностранца тоже не пользуются. Так какая для него конкретно разница между санскритом и русским?


                    1. p07a1330
                      00.00.0000 00:00
                      -6

                      Ну и русскому недолго осталось


                1. lair
                  00.00.0000 00:00
                  +6

                  И какое до этого дело, скажем, жителю США?



              1. Max_Pershin
                00.00.0000 00:00
                +1

                Ещё, кстати русский - один из 5-ти официальных языков ООН.


                1. tyomitch
                  00.00.0000 00:00
                  +5

                  Кто ещё среди них? арабский и китайский? -- точно, давайте называть переменные по-арабски да по-китайски, чтобы всем европейским программистам было в равной степени больно.


                1. vadim_bv
                  00.00.0000 00:00
                  +2

                  Внезапно, английский — тоже.


          1. khacsam
            00.00.0000 00:00

            Судя по тенденции на геополитической арене, следующим lingua franca будет арабский или китайский. Что тогда станут делать программисты?
            И я бы заглянул ещё на полшага вперёд: в связи с тем, что Госдума приняла закон о запрете применения иностранных слов, за исключением случаев, когда нет эквивалента, что будет, если особо ретивые чиновники/руководятлы начнут применять нормы закона и к коду на ЯП? ))

            P.S. Минусаторы, расслабьтесь, это всего-лишь размышления.


            1. xxlagr Автор
              00.00.0000 00:00

              У китайского языка очень сильное ограничение — нет алфавита.


              1. Aldrog
                00.00.0000 00:00

                Всё лучше, чем английский с его шестью вариантами произношения "ough" и прочим весельем. В китайском эта неоднозначность прочтения хотя бы явно выражена, как мы, программисты, и любим.
                /s


    1. Hungryee
      00.00.0000 00:00
      +15

      Потому что все, что вы написали - это заблуждение. Программист без знания базового английского - не программист, а макака, передвигающая операторы.
      Любой такой программист поплывет на задании чуть сложнее чем обычно, когда нужно будет внезапно! заглянуть в документацию к новому материалу.

      Писать переменные на русском или в транлитерации - неуважение прежде всего к себе, коллегам (даже если они все русскоговорящие) и к IT сфере в общем


      1. Grey6000
        00.00.0000 00:00
        +8

        Дело не в знании англ, я специально подчеркнул про бизнес-логику, однозначный перевод бизнес терминов на англ довольно сложно перевести, ИНН какой-нибудь к примеру, склад тоже может быть как store или warehouse, и это только что-то простое, а если бизнес связан с медициной, там нужны специфичные знания англ.

        чуть более сложных названий можно ссделать комментарий на русский, но его его придется дублировать в гетерах/сеттера/dto


        Задачи ставит бизнес на русском вот и выходит бессмысленный перевод туда-сюда, перевод ради перевода


        1. Vizmaros
          00.00.0000 00:00
          +7

          Даже если опустить все аргументы «Разработчики иностранцы» и тому подобное, останется проблема написания. Транслитерация неудобна в чтении, смена язык для именования переменных излишняя трата времени. Оно действительно стоит затрат, если учесть что опытный разработчик английский понимает достаточно свободно, а неопытному нет разницы между необходимостью переводить и необходимостью понимать ее назначение, в обоих случаях ему смысл переменной одинаково неизвестен


          1. Grey6000
            00.00.0000 00:00
            +2

            вот не опытному было бы проще даже без понимания, просто поискать по названию бизнес-сущности, а не по ее переводу, тем более как ниже указали есть британский и американский англ, в которых одно и тоже будет называться по разному


            1. thevlad
              00.00.0000 00:00
              +6

              Проблема в том что у вас наверняка будут библиотеки и возможно сторонний код "на английском". В результате получится мешанина, которая точно никому не поможет.


          1. DivoTech
            00.00.0000 00:00
            +5

            >смена язык для именования переменных излишняя трата времени
            А набирать переменную в пол строки -- не трата времени? А изучать значение каждого слова в нескольких источниках? А составлять словари переменных?


            1. XAHOK
              00.00.0000 00:00
              +2

              А набирать переменную в пол строки -- не трата времени?

              3-5 первых символов, CTRL+SPACE, TAB. Трата времени только при работе в блокноте. И это намного лучше, чем лезешь в код, а там всякие TextBoxN и весь алфавит, в котором хранятся магические данные. Причем сам разработчик уже через неделю не может понять как оно работает.

              А изучать значение каждого слова в нескольких источниках?

              Для разработчика очень даже полезно, за одно погрузится в предметную область и меньше будет ляпать в коде.

              А составлять словари переменных?

              А еще использовать всякие аналайзеры, писать стайлбуки и пинать шлангом по пяткам за отступы. У нас и так много обвеса, что бы следить за чистотой кода, что бы была проблема от добавления ко всему этому маленького словарика с основными терминами.


              1. DivoTech
                00.00.0000 00:00

                3-5 первых символов, CTRL+SPACE, TAB

                В статье приводятся примеры "правильных" названий перменных:

                tripsWithOneOrderCount
                tripsWithTwoOrdersCount
                tripsWithThreeOrdersCount
                tripsWithFourOrdersCount
                tripsWithFiveOrMoreOrdersCount

                Я тут насчитал 10-11 символов до "CTRL+SPACE, TAB". И это далеко не самые страшные случаи при таком подходе

                Для разработчика очень даже полезно, за одно погрузится в предметную область и меньше будет ляпать в коде.

                Примерно как знание, что Пномпень это столица Камбоджи — может где-то когда-то пригодиться, но количество таких знаний стремится к бесконечности, а польза от них — к нулю

                У нас и так много обвеса

                Видимо, это потому что процесс важнее результата

                Но вообще, смысл моего сообщения был в том, что это всё занимает намного больше времени, чем пеключение языка. Т.е. с таким подходом цель явно не в его экономии


                1. XAHOK
                  00.00.0000 00:00
                  +2

                  Я тут насчитал 10-11 символов

                  Или пара нажатий стрелок.

                  Примерно как знание, что Пномпень это столица Камбоджи

                  Если вы работаете там, где важно знание, что Пномпень - это столица Комбоджи, то да - это важное знание.

                  Видимо, это потому что процесс важнее результата

                  Это потому что мы не пишем одноразовый софт, где вообще пофиг на качество кода. Хороший код тогда, когда новый человек может легко читать его, а что бы он быстро привык писать в общей стилистике, сама среда его бьет за нарушение оформления.


                1. Chamie
                  00.00.0000 00:00

                  Я тут насчитал 10-11 символов до «CTRL+SPACE, TAB». И это далеко не самые страшные случаи при таком подходе
                  Там, на самом деле, обычно, не нужно именно первые писать. Можно вводить что-нибудь типа «trwt», чтобы подсказка выдала ранее объявленную «tripsWithTwoOrdersCount».


        1. Hungryee
          00.00.0000 00:00
          +11

          Ну так запишите ИНН как INN вместо какого-нибудь Tax Number (может быть много вариаций)
          Но только проблема будет в том, что само по себе абстрактный INN тоже ни черта не понятная вещь, и придется добавлять комментарии.

          В случае со складом - создайте класс Warehouse, и в будущем все программисты будут его использовать, никому не придет в голову создавать еще один класс для склада с названием Store. Я вообще не понимаю в чем проблема «можно перевести разными способами», если достаточно создать имя классу всего однажды, и все будут его использовать, и IDE поможет, и документацию (внезапно) можно подключить к кодовой базе.

          Не оправдывайте банальную лень придуманными проблемами. В 2024 году не знаешь английский = ты мертвый специалист.


          1. Grey6000
            00.00.0000 00:00
            +7

            В DDD есть принцип Единный Язык (Ubiquitous Language)

            Эксперты предметной области (Domain Experts) и разработчики программного обеспечения работают вместе, чтобы создать общий язык для разрабатываемых бизнесс-сфер. Тут не может быть противопоставления, это единная команда. Разработка программного обеспечения это инвестиция в бизнес, а не просто статья расходов. Усилия, прилогаемые к созданию Единого Языка (Ubiquitous Language), помогают распространить глубокое понимание Домена (Domain) среди всех членов команды.

            и выходит так что эта часть не работает вне англоязычных странах, потому что будет все равно 2 языка, англ и национальный язык

            • Единный Язык (Ubiquitous Language): Эксперты предметной области (Domain Experts) и разработчики программного обеспечения работают вместе, чтобы создать общий язык для разрабатываемых бизнесс-сфер. Тут не может быть противопоставления, это единная команда. Разработка программного обеспечения это инвестиция в бизнес, а не просто статья расходов. Усилия, прилогаемые к созданию Единого Языка (Ubiquitous Language), помогают распространить глубокое понимание Домена (Domain) среди всех членов команды.


            1. lyay
              00.00.0000 00:00

              Полностью согласен. Программист должен говорить на языке заказчика. Иначе время разработки растёт многократно.

              Конечно, можно на лету переводить термины туда-сюда, но это пустая трата сил.


          1. Zy2ba
            00.00.0000 00:00
            +4

            Справедливости ради, видел проект, где в процессе разработки разъехались переводы терминов у фронтенда и бэкенда, так что "никому не придет в голову создавать еще один класс" - слабый аргумент.


        1. Simpre_falta_algo
          00.00.0000 00:00
          -1

          А ещё англ слова короче. В среднем на одну букву. В тысячах строк кода - это тысячи букв.


          1. Sirion
            00.00.0000 00:00
            -3

            И сколько букв в английском эквиваленте слова "защищающийся"?)


            1. EVolans
              00.00.0000 00:00
              +1

              Если у вас код с такими названиями переменных, мне вас жаль.


              1. Arbuzer
                00.00.0000 00:00
                +1

                Ещё и транслитом - бррр


              1. FinnParnish
                00.00.0000 00:00

                Да тут даже не совсем в этом проблема....


              1. Sirion
                00.00.0000 00:00
                +2

                У меня нет, но в целом не вижу ничего странного, если такой нейминг понадобится в коде какой-нибудь рпг.

                Вообще я за английский как лингва франка. Но аргумент, что в нём слова короче, довольно глупый. Я могу придумать язык, где все слова однобуквенные. Но в итоге почти все понятия в нём будут выражаться фразами из эн слов.


            1. Arbuzer
              00.00.0000 00:00

              Defender - 8


              1. trinxery
                00.00.0000 00:00
                +5

                Defender

                но это защитник


                1. OneManStudio
                  00.00.0000 00:00

                  в этом и проблема, проблема даже не в переводе, а в том зачем использовать конкретно такое имя, а не более простое и подходящее. Даже в рамках создания игр такое имя переменной врядли разумно использовать.


                1. Arbuzer
                  00.00.0000 00:00

                  Context.reverso по запросу "защищающийся" как раз и выдал "defender". Равно, как и "defending". Зависит от контекста, конечно, но имеет место быть


            1. skymal4ik
              00.00.0000 00:00
              +2

              Defending? 9 против 12


              1. gtwenty
                00.00.0000 00:00
                +2

                Это - защищающий


                1. skymal4ik
                  00.00.0000 00:00
                  +1

                  Верно, правильнее тогда self-defending


                  1. Sirion
                    00.00.0000 00:00
                    +1

                    Это вообще не существительное, а причастие


                    1. tyomitch
                      00.00.0000 00:00
                      +1

                      Равно как и "защищающийся"


                1. Oska2
                  00.00.0000 00:00
                  -1

                  дефенсибля)


            1. SteamEngine
              00.00.0000 00:00
              +1

              Defendant?


              1. tyomitch
                00.00.0000 00:00

                Это "ответчик"


            1. Simpre_falta_algo
              00.00.0000 00:00
              -1

              Нейминг - это не просто перевод. А деепричастиям и причастиям нечего делать в коде.


              1. XAHOK
                00.00.0000 00:00

                А деепричастиям и причастиям нечего делать в коде.

                Псссс, вы только мелкософту не говорите об этом, а то они не в курсе, потому в их злобном дотнете регулярно встречаются всякие IsTerminating и прочие инговые.


      1. xxlagr Автор
        00.00.0000 00:00
        +10

        Перевод бизнес терминологии — это не базовый английский.
        Софт для бухгалтерий в СНГ пишется на русском. И это ок, потому что слишком специфичен, такой софт сложно адаптировать под другие регионы не только из-за правовых особенностей, но и из-за особенностей рынков, где доминируют другие платформы.


        1. Hungryee
          00.00.0000 00:00
          -13

          Назовите, пожалуйста, пример такого термина, что не попадает в категорию базового английского.

          Если вы опираетесь на 1С в своих аргументах, то это скорее антипример из ада. Этот софт должен умереть, а программисты 1С/на 1С - пройти курс психотерапии и реабилитации


          1. Survtur
            00.00.0000 00:00
            +2

            СНИСЛ?


            1. kspshnik
              00.00.0000 00:00

              SSI

              P.S. Он СНИЛС :)


              1. tyomitch
                00.00.0000 00:00
                +2

                СНИЛС -- это SSN, а SSI -- это Server Side Includes :)


                1. kspshnik
                  00.00.0000 00:00

                  Или social security income ;o)

                  Но да, ssn.


          1. Grey6000
            00.00.0000 00:00

            Экстракорпоральное оплодотворение (ЭКО), штрихкод, Контрольно-кассовая машина (ККМ)


            1. isolomatov
              00.00.0000 00:00

              Про ЭКО не скажу, но остальное barcode и till


              1. tyomitch
                00.00.0000 00:00

                Till -- это что-то из прошлого века :)

                Сейчас это POS (point of sale)


            1. kspshnik
              00.00.0000 00:00
              +2

              in vitro fertilization


          1. xxlagr Автор
            00.00.0000 00:00

            В статье есть такой пример - зарплата. Переведёте это как salary и будет ошибка.


            1. ASobolevskiy
              00.00.0000 00:00
              +3

              Честно говоря, не совсем понимаю, что с salary не так


              1. xxlagr Автор
                00.00.0000 00:00
                +2

                Мы называем зарплатой всё, любой вид вознаграждений. Десятилетия социализма отразились в нашем языке. В то время как в английском salary — это фиксированное ежемесячное вознаграждение за умственный труд. У таксиста не может быть salary и у рабочего на заводе тоже.


                1. ASobolevskiy
                  00.00.0000 00:00
                  +3

                  По поводу таксиста соглашусь (правда при условии, что он работает не на некую компанию).

                  Согласно Collins English Dictionary:

                  A salary is the money that someone is paid each month by their employer, especially when they are in a profession such as teaching, law, or medicine.

                  Сумма денег выплачиваемая работнику работодателем ежемесячно, особенно, если сфера деятельности обучение, право или медицина.

                  В то время как incentives согласно тому же словарю:

                  1. motivating influencestimulus (мотивация, стимул)

                  2. a. an additional payment made to employees as a means of increasing production (дополнительная оплата работнику, призванная увеличить производительность - т.е. есть фактически премия)

                  Я так понимаю, что именно вот этот момент и намекает на исключительно умственный труд - "особенно если сфера деятельности обучение, право или медицина"?

                  А вообще, все это только лишь подтверждает идею о том, что правильный нейминг выбрать довольно сложно)


                  1. xxlagr Автор
                    00.00.0000 00:00
                    +5

                    Всё верно. Мы выбрали максимально общее incentives, потому что это агрегат, внутри которого есть wages, premiums и прочее.
                    Пока отправляем весь нейминг на ревью нашим международным бизнес-девелоперам, которые шарят что там как именуется правильно (уточню, что пока это касается внешних API и новых проектов). Очень важен контекст, просто сторонний переводчик может не так перевести. И вот имея накопленный словарь уже можем смелее сами орудовать терминами. Так что да, это сложно и научить каждого разработчика так переводить не получится. Нужно находить возможность построить такой процесс внутри организации.


                    1. ASobolevskiy
                      00.00.0000 00:00
                      +1

                      Спасибо Вам большое за статью и за разъяснения)


                    1. NNikolay
                      00.00.0000 00:00
                      +4

                      Я как бы согласен с идеей статьи, но вот тут на мой взгляд перебор. Неправильно считать, что все англоговорящие коллеги вот прям совершенно верно понимают словарную разницу между incentives и salary. А ещё будут сотрудники из других стран, для которых английский тоже не родной. Я 10 лет в англоязычной среде живу и много видел:) Если термин не совершенно в доску очевидный, то лучше не полениться и уже писать base monthly salary, variable premium и там total fixed and variable monthly pay - ну например, я не сильно долго думал. Куча людей не прочитав словаря скажут, что incentives, bonuses and premiums - это синонимы. Даже если Вы формально правы.


                    1. alexeyrom
                      00.00.0000 00:00

                      Внутри incentives ещё и не-денежная мотивация должна быть. И условно денежная, но не выплачиваемая работнику: медицинская и прочая страховка, обещанное повышение по должности и так далее.


                    1. tba
                      00.00.0000 00:00
                      +1

                      А они точно шарят? Максимально близкий к русской "премии" термин в контексте оплаты за труд это "bonus". "Premium" это премиальный, или, по-русски, первосортный, например "premium ingredients".

                      Для термина "incentives", как Вы его поясняете в комментарии выше, существует давно устоявшееся C&B - compensation and benefits. И т.д.

                      Плюньте. Составьте словарик транслита для зарубежных разработчиков - они привыкнут, а вашим будет проще и понятней. Как писал выше медицинских книжек в западном общепите (по крайней мере в той части где приходилось работать) не существует как понятия. Трудовых книжек не существует как понятия. Многих справок не существует как понятия. В части бюрократически-государственных терминов с русским языком сравнится только немецкий. Английский здесь бедноват.


                      1. tyomitch
                        00.00.0000 00:00

                        "Premium" это премиальный, или, по-русски, первосортный, например "premium ingredients".

                        Да, но не только: https://en.wiktionary.org/wiki/premium#Noun



                      1. anonymous
                        00.00.0000 00:00

                        НЛО прилетело и опубликовало эту надпись здесь


                      1. xxlagr Автор
                        00.00.0000 00:00
                        +2

                        Не исключено, что вы шарите лучше. Тем не менее premiums был совершенно сознательно выбран.
                        В плане транслита — плохо масштабируется. Прочувствовать подобный опыт можно, если читать на турецком, например. Такие слова даже запомнить тяжело, что уже говорить о том, чтобы не опечататься или использовать их в коммуникации. Хотя вроде латиница.


                      1. tba
                        00.00.0000 00:00
                        +1

                        Турецкие разработчики как раз вовсю используют привычный им турецкий (с английским хуже чем в РФ) и никакого дискомфорта по поводу своего английского не испытывают. Зато все всем понятно. А уж если в проект занесло иностранца (редко, но бывает) и ему непонятно, но почему-то надо разобраться в коде, то выучить сотню турецких слов совсем несложно.


                      1. 1001
                        00.00.0000 00:00

                        У турок, видать, комплекс неполноценности недостаточно развит, не то, что у эксСССР...


                      1. Rrs
                        00.00.0000 00:00
                        +2

                        У русских слова заимствованы из всех заметных культур-мультур. Греческий, латынь, французский, немецкий, английский - все это есть в русском языке, именах и даже смыслах. Комплекс неполноценности это страхи, что подростки говорящие на руглише, или программисты, знающие английский и смешивающие слова в рабочем общении могут как-то этой культуре повредить.


          1. Simpre_falta_algo
            00.00.0000 00:00

            Первое событие в бух учёте. ;)


          1. comdivuz
            00.00.0000 00:00

            Хотя я выше и написал кому то что переменные надо на английский переводить для того чтобы код читаемый был. Но когда такие комментарии как ваш вижу... Так и хочется спросить кто вы такой в плане экспертизы? Что отправляете флагманскую и вполне рабочую бухгалтерию в ад и не считаетесь с очевидным - есть 100500 продуктов и сайтов и API, в российском сегменте, где есть ИНН. В 99% поле будет называться inn, а не tin, потому что это самое читаемое для всех и понятное. Также и "физлицо" многие обозначат как FL, и не будут морочаться с Person, Human или Individial. Кроме вашего мира радикального есть ещё и практика реальная, в которой много конвенций.


          1. lyay
            00.00.0000 00:00

            ПерерасчетНДФЛ

            Маткапитал
            ФСБУ5
            Фз42


        1. sasha_semen
          00.00.0000 00:00

          А еще есть sap, где проскакивают немецкие корни, например дебит/кредит это внезапно H(aben)/S(oll)


      1. tohodov
        00.00.0000 00:00
        +1

        Метить каждому сайту ларька в мировые монополисты? Не только лишь все из них будут выходить на мировой рынок, мало кто будет так делать. А значит язык программистов в будущем не изменится и англификация окажется преждевременной оптимизацией за которую будут платить члены команды временем на переспрос.


    1. 12rbah
      00.00.0000 00:00
      +6

      а не мучаться со словарями для терминов

      Скорее всего сильное влияние оказывает то, что 90% информации ищется на английском. И тут уже личное мнение, что название переменных вроде PoleznayaNagruzkaZaprosa режет глаз, многие языки конечно поддерживают utf-8 но мешать два языка как-то не очень(опять же мое мнение), ну и в целом в большинстве проектов нейминг +/- предсказуемый и большинство пониамет о чём идёи речь.


      1. tommyangelo27
        00.00.0000 00:00
        +2

        Плюс подключение библиотек, которые вероятно будут тоже на английском. И получится мешанина, что-то вроде

        $handler->sendToQueue($platezhka)


        1. Grey6000
          00.00.0000 00:00
          -1

          1) в русском и так часто есть вкрапления английских слов, например e-mail, Mysql, XML, HTTP, KFC, McDonalds и др слова, бренды и аббривиатуры

          2) я против транскрипции, мы же не поляки

          3) ваш пример выглядел бы так: обработчик->вОчередь(платежка) или вроде того

          UPD для добавления внешних библиотек в целом стоит использовать свои интерфейсы см паттерн мост (Bridge)


          1. tommyangelo27
            00.00.0000 00:00

            Ну да, вопрос стратегии. Лично я вижу только три варианта:
            — придерживаться локальных названий в своей логике, и забить на мешанину;
            — придерживаться локальных названий в своей логике, и писать обёртки для библиотек (что само по себе МОЖЕТ иметь смысл, не только из-за языка);
            — перейти на английские наименования, чтобы избежать смешения языков.

            Лично я придерживаюсь последней стратегии, потому что писать фасады/мосты для подключаемого кода в 80% случаев будет напрасным трудом (в моей работе), а смешивать понятия из разных языков не люблю, перфекционизм мешает.


          1. tommyangelo27
            00.00.0000 00:00
            +6

            BTW проблема не конкретно в русском языке и кириллице. Для польского программиста код вроде

            $zasob->dodajDoKolejki($zamowienie)

            выглядит так же кринжово, как для русскоязычного программиста код 1С (говорю как активный потребитель мемов).

            Примерно два года назад работал в чисто польской фирме (был единственным иностранцем), и мы пилили проект на польский и чешский рынок. Тикеты в джире на польском, конфлюенс на польском, общение в команде тоже. А код — на английском. Потому что мировой стандарт.


            1. Grey6000
              00.00.0000 00:00
              -6

              То что код на английском - стандарт я знаю, вопрос в другом, а правильно ли это? ведь все рекомендации к разработке в первую очередь предназначены для них, а весь мир подстраивается, к примеру, если бы у нас была развита информатика как в штатах, мы в нашу сферу влияния могли бы войти славянские страны и те кто кириллицу использует


              1. tyomitch
                00.00.0000 00:00
                +8

                Если бы да кабы‚ да во рту росли б грибы, тогда был бы не рот, а целый огород.


              1. XAHOK
                00.00.0000 00:00
                +2

                все рекомендации к разработке в первую очередь предназначены для них, а весь мир подстраивается

                Все рекомендации пишутся на том языке, который понимает большинство. Если посмотреть научные статьи, то, внезапно, даже китайцы пишут международные статьи на английском, потому что его знают почти все, а не только лишь в Азии.

                Да, есть руководства на русском, есть русификации интерфейса, и т.п. Но, все равно, многие возвращают на английский, потому что на нем информации намного больше и не надо на лету в голове картинки переводить, пытаясь англоязычный ман сопоставить с русскоязычным интерфейсом.

                в нашу сферу влияния могли бы войти славянские страны и те кто кириллицу использует

                Вы чешский или белорусский свободно понимаете? Кирилица != русский язык.


        1. zuek
          00.00.0000 00:00

          Это ещё что! Вот у меня в одном проекте есть такой смешной фрагмент:

          Quer = New Query;
          Quer.Text = Catalogs.ОтчётыWebСервиса.FindByDescription(NameReport,True).ЗапросКБазе;

          Это после "рефакторинга" обработки web-сервиса 1С на англоязычный синтаксис осталось...


          1. Grey6000
            00.00.0000 00:00

            А зачем его вообще делали?


    1. DivoTech
      00.00.0000 00:00
      +2

      Перевод терминов на уровне носителей языка могут делать только носители языка. Даже хороший программист не всегда знает английский до таких тонкостей (да и не должен). И тратить его время на изучение особенностей названий того же заработка — не очень разумно.
      Иногда такие переводы и вовсе могут ввести в заблуждение и привести к ошибкам, хотя вроде как всё это делалось для их избежания.
      Так что по этой части нужен явно не тот подход, что указан в статье. Хотя в остальном мысли здравые


    1. tba
      00.00.0000 00:00
      +5

      Вы совершенно правы.
      Проблема не в незнании английского - проблема в недостаточном знании предметной терминологии как на английском, так, зачастую, и на русском. Пример прямо из текста статьи: Health Permit как аналог медицинской книжки. Ближайший русский аналог термина Health Permit - это "Разрешение на соответствие санитарным нормам", выдаваемое Роспотребнадзором предприятию (раньше сертификат СЭС), а не сотруднику. А вот ближайший аналог российской медицинской книжки, теперь называемой санитарная книжка сотрудника, это Health Clearance/Health Certificate и, нет, это не книжка.
      Я сам когда-то ратовал за правильные английские названия, но вскоре пришел к выводу: если большая часть разработчиков русскоязычные, то пусть пишут на русском английскими буквами, главное чтобы это было а) понятно и б) чтобы одни и те же понятия разные разрабы называли одинаково (единое понятийное пространство). А для зарубежных коллег, многие из которых, даже владея английским, не владеют терминологией предметной области (тут они ничем не отличаются от "наших") специально выделенный человек пишет пояснения прямо в коде - они очень быстро привыкают.


      1. xxlagr Автор
        00.00.0000 00:00

        Если условия позволяют и всем удобно, можно принять за правило и транслит.
        Однако мы используем языки и фреймворки, паттерны, термины, которые не принято переводить. Транслитерация тоже по-своему сложна. Я вроде Arsenii по правилам транслитерации, но никогда так своё имя не писал. И всё это вносит неопределённость вместо пользы. А ещё и воспринимается иначе: vykladka vs deployment. Тут же остаётся добавить, что мы читаем документации, статьи, книги на английском (их существенно больше, чем на русском и они свежее). А ещё open source, где с таким подходом не пройдёшь ревью.
        Идеальные переводы как недостижимый идеал. Но это не значит, что не стоит к этому стремиться. Это тоже часть порядка. И я бы даже сказал, что единство терминологии > точность перевода.


    1. vassabi
      00.00.0000 00:00

      если вы не 1С пишете, то буквы-то все равно латинские ...

      так-то словарик бизнес-терминов все равно будет "имя латиницей - описание на родном языке"


    1. lovermann
      00.00.0000 00:00
      -1

      Ну, он как обычно бывает: начинаешь бизнес для своего села, а через несколько лет уже осваиваешь материки. Никогда не знаешь, кто будет работать с кодом. Да, и вообще, я удивляюсь тем, кто в код вбивает свой родной язык.


    1. comdivuz
      00.00.0000 00:00

      Ну есть 1с там и язык сам на русском. И названия по русски. Тут такое дело, что имена переменных вплетаются в язык. То есть хорошо читается или "привет, как дела" или "hello, how are you", но не "привет, how дела you"


    1. lyay
      00.00.0000 00:00

      Полностью согласен. Надо исходить из области распространения проекта, времени его жизни, команды поддержки. Если пишешь внутреннюю автоматизацию ларька и полностью передаёшь код заказчику, то русский - самое оно. Работаешь с Египтом, значит пиши по-английски. Потому что арабское письмо не очень.


  1. Survtur
    00.00.0000 00:00

    Ещё одна рекомендация — не обсуждайте нейминг текстом (во время ревью или составляя словарик), старайтесь делать это синхронно.

    Поясните, плиз. Я не понял эту фразу. Синхронно - это как? Не понимаю как это противопоставляется обсуждения/ревью?


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Синхронно = голосом. Например, если проводить ревью и оставлять комменты в гитхабе, то это может сильно затянуться. Для того, чей код ревьюят, это выматывающая история, когда в PR раз за разом прилетают уточнения или он не понимает, что от него хотят. Если замечаний по неймингу много или есть сложные моменты, лучше обсудить голосом, возможно сразу добавить в словарик что-то новое. Опыт показал, что текстом всё идёт долго и процесс начинает казаться мешающей формальностью. После того, как команда научится, словарик составится, будет проще.


      1. zuek
        00.00.0000 00:00

        Странно... я наоборот придерживался всегда тактики "сохранения следа" - чтобы было понятно, откуда и почему родилось решение, особенно если речь не про то, во сколько сегодня идти на обед, а про что-то важное (а "пространство имён" - по-моему, весьма важный момент). Да, через PR такое футболить - сомнительная идея, но собраться в группе и обсудить с сохранением истории, а если ещё и с посылом "переспать с этим списком" - по-моему, намного продуктивнее "обсудили в курилке"/"пошумели в переговорке".


        1. xxlagr Автор
          00.00.0000 00:00

          В статье тоже говорю про это «если идёт тяжело — погрузитесь сильнее, узнайте больше деталей». Возможно стоит отложить принятие финальных решений.
          По поводу «следа». Если на проекте недавно, то, конечно, лучше продолжать делать как было. Но при должном погружении, к сожалению, видишь, что никакой глубокой мысли не было. Системная работа с неймингом сразу бросается в глаза.


    1. JuryPol
      00.00.0000 00:00
      +5

      Может быть, подразумевались всякие чаты… такая нечаянная иллюстрация важности нейминга


  1. wolfy_str
    00.00.0000 00:00
    -5

    Как всё таки иногда разражает эти проблемы джунов и синьоров - нейминги, какой фреймфорк использовать и прочие холиварные темы, которые по большей части не имеют смысла. А как доки не так написаны, коммиты не по правилам, а вот доки к тесту не так написаны. Очень сильно раздувает процесс разработки. Все эти придирки к называниям, докам и прочему занимают 95% код ревью. Тогда как по существу на саму логику тратится от 5 до 10, максимум 15% времени, и то 15% я такое не встречал, хотя логика это основа всего, её же практически никто не проверяет. Потому что те же тесты можно так мокировать, что никто не поймёт что программа работает не правильно. Тем более тесты это ручной ввод по типу "2+2" должно быть равно 4. Тут любой алгоритм можно подобрать так что 2+2 будет равно 5, а при должной снаровки можно сделать так что никто ничего не поймёт и тесты будут проходить всегда.

    Вообщем действительно есть проблема что саму логику не смотрят и ей почти никогда не уделяют времени, на уровне от джун+ до мидл+, на последних надеются что и так будет работать, насчёт первых не знаю. Но логику подправить никогда практически на это не обращают внимания, уделяя всё внимание неймингу и прочей оболочке. И да рефакторинг это вообще далеко не самая сложная, скорее даже самая простая вещь при должном подходе, переменная которая используется 5, 10, 20 раз меняется за 10-20 секунд вдумчивого подхода.


    1. alexxxnf
      00.00.0000 00:00
      +38

      Вы себе даже не представляете, какого труда мне стоило прочитать ваш комментарий. Мой мозг постоянно спотыкался о неправильные окончания, склонения, знаки препинания. Такой уж у меня мозг. Мне пришлось сделать над собой усилие, чтобы сосредоточиться на содержании, а не на форме. Я ни в коем случае не обвиняю, просто вот так по-дурацки работает мой мозг.

      То же самое относится к код-ревью. Если код написан без соблюдения стилей и нэйминга и у меня есть возможность поручить ревью кому-то другому, то я именно так и сделаю. В противном случае я потрачу на ревью в 3 раза больше времени, чем надо. Просто потому что, если мой мозг замечает дерьмо в коде, то ни на что другое переключить внимание он уже не может.

      Так что если вас волнуют когнитивные усилия читателей, пишите красиво. Если не волнуют, пишите, как хотите.


      1. wolfy_str
        00.00.0000 00:00
        +2

        простите у меня с этим проблемы :( с речью тоже. Но исправить плохой стиль кода как раз не проблема, проблема написать работающую логику. Собственно за час могу сделать рефакторинг, а вот с логикой беда могу и сутки делать одну функцию/метод. В любой среде есть способы рефакторинга, когда за 20 секунд меняем 20 переменных, это делает среда как минимум во всём сервисе.

        Да и так как не могу сразу написать комментарий то продолжу. Вполне можно потратить день два чтобы привести код в проекте к нормальному состоянию, тем более рефакторинг идёт в 5 - 10 раз быстрее простого написания кода, а если сравнить как я пишу, то и до 100 раз быстрее. Я вот понимаю все концепции солида чистого кода, но не могу не понимаю логику довольно часто, с этим у меня проблемы.


        1. Survtur
          00.00.0000 00:00
          +2

          Так вам всего лишь нужно пару раз перечитать и отрефакторить свой собственный комментарий.


    1. xxlagr Автор
      00.00.0000 00:00
      +3

      Обращу внимание, что статья говорит не только про аккуратность в нейминге. Изменить нейминг через горячие клавиши далеко не всегда удастся. Представьте, что с вашим API взаимодействуют сотни внешних систем. Да даже если десяток — уже сложно. А если одну и ту же переменную использовали для разных целей, потому что не поняли её предназначение?
      Избыточные процессы мешают. Но бывает, что проблема в том, что люди выполняют какие-то действия не понимая, для чего это нужно. Статья как раз доносит, почему важно вкладываться в нейминг. Это совсем не nice to have история.
      По поводу проверки бизнес-логики во время ревью. Это не лишнее, но, всё же, лучше отладить процессы тестирования. И посмотреть в сторону пирамиды тестирования, где есть не только юнит-тесты.


    1. tetelevm
      00.00.0000 00:00
      +14

      Переменную не переименовать за 10-20 секунд. Варианты:

      • поле у бд-модели, которое отвечает за столбец

      • по 5 вперёд-назад строчкам непонятно, за что именно она отвечает

      • вызывается где-то в неявном виде ([getattr(smth, f"get_{field}") for field in smth_fields])

      • этот класс используется у третьих сторон через rpc

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

      У меня обратный опыт, я больше попадал на доработку реализованных систем, и поэтому меня эти вещи крайне важны. Например, как быстро понять, что за что отвечают условные поля user.tools: integer или car.delivery: char, которые появились с коммитом added new logic? Понять можно, но нужно сначала придётся попрыгать по файлам и поискать по всему проекту (найдите использование поля smth.type в проекте), а затем надеяться, что из-за переименования у пользователей не начнёт дублироваться списание денег.

      Да, я согласен, что логика первична (в реальном мире код лишь инструмент для бизнеса), но знать всю логику вы сможете только если:

      • вы с самого начала проекта на нём (либо уже давно пришли на него)

      • он не слишком большой, всю логику возможно охватить

      • команда небольшая и вы знаете, кто чем занимается

      Если же что-то из этого не работает, то понимать всю логику проекта невозможно, и приходится работать не с логикой, а с контекстом. А в работе с контекстом как раз и помогают те 85+% шелухи - нейминг, коммиты, документация, организация кода, ... .


      1. wolfy_str
        00.00.0000 00:00
        +3

        Я согласен скорее у меня проблема с пониманием и тем что самой логике уделяют крайне мало внимания не более 10% времени. И если ты не знаешь как написать логику то тогда говорят что ты вообще ничего не умеешь. Напротив на обсуждение довольно понятных вещей уходит львинная часть времени любых обсуждений или code review

        Насчёт быстрого переименования и имел ввиду что за 20 осмысленных секунд в IDEA или какой либо другой оболочке вы пользуясь методом Рефакторинга можно изменить переменную во всём сервисе. Это как минимум. Про третьи стороны это да, не подходит.

        Надеюсь разъяснил. И да у меня не получается понятно выразить свои мысли, извиняюсь у самого с этим проблемы в жизни :(


      1. Fr0sT-Brutal
        00.00.0000 00:00

        Варианты:

        • поле у бд-модели, которое отвечает за столбец

        • по 5 вперёд-назад строчкам непонятно, за что именно она отвечает

        • вызывается где-то в неявном виде ([getattr(smth, f"get_{field}") for field in smth_fields])

        • этот класс используется у третьих сторон через rpc

        А если где-то в глубине вызовов найдется JSON.serialize(object), то вообще пиши пропало


    1. ggo
      00.00.0000 00:00
      +7

      Вам надо всего лишь поработать на уже долго живущем проекте, и некоторое время фиксить на нем баги и пилить новые фичи. Где сменились поколения разрабов.

      Когда из-за неудачного нейминга, вы полдня ковыряли код, чтобы понять его логику...

      После этого полезность правильного нейминга перестанет быть неочевидной.
      И про сопроводительный текст для коммитов тоже самое.


  1. Fedorkov
    00.00.0000 00:00
    +2

    Подписываюсь практически под каждым словом. Я сам во всех своих проектах начинаю с составления глоссария, и только потом перехожу к сбору или уточнению требований.

    Один тонкий нюанс, который вы явным образом не затронули: имена всё же бывают слишком длинными. Нейминг из 3-4 слов — это нормально, но не когда все имена такие. Всё же главное в стиле — это лёгкость чтения, и ради него иногда стоит отступиться от педантичной строгости.

    Но это требует соблюдения ещё одного принципа, который тоже стоит упомянуть: код надо писать так, чтобы будущие вероятные ошибки, как минимум, мозолили глаза. А ещё лучше — чтобы вылезали на этапе компиляции.


  1. Fedorkov
    00.00.0000 00:00
    +1

    → ordersPerCourierLabourHour

    Всё-таки лингва франка программистов - это американский английский, так что labor. А ещё лучше - ordersPerCourierManHour.


    1. xxlagr Автор
      00.00.0000 00:00

      Да, такой вариант тоже корректен. Но «рабочие часы» больше нам подходят, культура компании такова, что «человекочасы» коробят, так не говорим.
      Про американский английский крутое замечание!


    1. Chamie
      00.00.0000 00:00

      ManHour — гендерно не нейтральный.


      1. aleksandy
        00.00.0000 00:00
        +1

        Как будто это что-то плохое.


        1. xxlagr Автор
          00.00.0000 00:00
          +1

          Для бизнеса в другой культурной среде это может быть критично


          1. shigorin
            00.00.0000 00:00
            +2

            Во-первых, не культурной, а контркультурной — если ещё не слышали про отмену тех же математики с физикой как расистских наук. Во-вторых, это проблемы титаника — далеко не все согласны расчеловечиваться, дорожка-то именно туда.


            1. xxlagr Автор
              00.00.0000 00:00
              +1

              Ходить в крестовые походы и спорить у кого культура правильная — дело сугубо личное. Можно одно и то же явление рассматривать и как результат эмансипации и как «расчеловечивания». Вопрос этики в разработке интересный. Кто-то делает онлайн-казино, кто-то бы не стал бы. Возможно вопрос нейтральности для вас принципиальный.


        1. Chamie
          00.00.0000 00:00

          А во сколько мужчино-часов вы оцениваете час работы сотрудницы?


          1. aleksandy
            00.00.0000 00:00
            +1

            Эм, 1? Что мешает сотруднице отработать, согласно вашей же терминалогии, мужчино-час?

            Или вопрос задан ради срача?


            1. Chamie
              00.00.0000 00:00
              -2

              Это не «моя терминология», это буквальный перевод выражения man-hour.


          1. vassabi
            00.00.0000 00:00
            +1

            часы должны быть общие - висеть на стене и показывать всем время одинаково


    1. withkittens
      00.00.0000 00:00
      +1

      Всё-таки лингва франка программистов - это американский английский,

      А все эти люди об этом знают?


  1. Fedorkov
    00.00.0000 00:00
    +2

    Начните с русского наименования. Совместите значение и название — должно звучать складно, без лишних слов, на которых «спотыкаешься» — как человеческая речь.

    Часто каша в понятиях становтся очевидной ещё до того, как вникнешь в предметную область, по чисто формальным признакам

    Если речь заказчика изобилует оборотами типа "масса для" и "время кроме", то это очевидный симптом косяков в архитектуре или в рабочих процессах, после исправления которых исходную проблему решать уже не придётся.


    1. xxlagr Автор
      00.00.0000 00:00
      +2

      Неоднократно было: формализуешь бизнес-процесс и оказывается, что проблема решается менеджментом. Сам факт того, что к тебе приходят «сделайте нам конкретно это» должен вызывать подозрение.


    1. YegorP
      00.00.0000 00:00

      Справедливо для начала разработки. Но никаких ресурсов не хватит всякий раз решать проблему на корню. Рано или поздно заказчик приходит с очередной идеей, которая не укладывается в ранее заложенные абстракции, а на закладку новых нет времени. И вот тогда вместо специализированного крепежа вы достаёте гвозди / изоленту / клей да идёте обмазывать всё техническим долгом (в том числе имена в коде).


  1. Chamie
    00.00.0000 00:00
    +5

    public enum TravelMode // FIXME rename to TransportType
    {
    Driving = 0, // FIXME rename to Vehicle
    Walking = 1, // FIXME rename to OnFoot
    Bicycling = 2 // FIXME rename to Bicycle
    }
    A bicycle, also called a pedal cycle, bike, push-bike or cycle,
    is a human-powered or motor-powered assisted, pedal-driven, single-track
    vehicle
    en.wikipedia.org/wiki/Bicycle


    1. xxlagr Автор
      00.00.0000 00:00

      Отлично! Через нейминг увидели, что домен несовершенно спроектирован.
      А история там такая, что сначала в енуме было 2 значения, а потом, в одной стране потребовалось выделить велосипедистов отдельно.


  1. Hint
    00.00.0000 00:00
    +16

    Вполне возможно я не прав, но по-моему слишком длинные названия тоже мешают. Такой код сложнее читать. Пока дочитываешь названия, теряешь локальный контекст (я буквально про текущую строку кода и пару соседних). Это про пример из статьи: avgDeliveryOrderFulfillmentTime.

    Например:

    avgDeliveryOrderFulfillmentTime = superLongVarNameWithAdditionalInfo + anotherOneLongVarName / 2;

    И ещё я считаю, что чем меньше область видимости, тем короче могут быть переменные. Нормально же использовать i для цикла. Если функция на 5 строк, то зачем переусложнять (понятно, что иногда бывает нужно, но это исключения).


    1. SimSonic
      00.00.0000 00:00
      +1

      Добавлю, что читать длинные строки трудно. Вместо того, чтобы читать код в плоскости высота+ширина (и тем более листать вправо), легче воспринимаются более вертикальные, одноразмерные конструкции. IMHO, в примере выше разбиение по строкам несколько помогает.

      avgDeliveryOrderFulfillmentTime = superLongVarNameWithAdditionalInfo
                                        + anotherOneLongVarName / 2;

      А вообще, тут ещё режет не длина, а отсутствие смысла. Смесь смысла и не-смысла. Если вместо абстрактных superLongVarNameWithAdditionalInfo и anotherOneLongVarName подставить бизнесовые смыслы, внезапно формула становится эмоционально приятнее.

      avgDeliveryOrderFulfillmentTime = avgOrderCookingAndPackagingTime
                                        + maxOrderCourierDeliveryTime / 2;

      Но в целом, конечно, да. Короткие скоупы -- очень хорошо. Иногда и i имеет право на жизнь, хотя я стараюсь всё-таки писать orderId :)


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Да, хочется лаконичности. Но это не всегда возможно. Например, когда у вас контракт, состоящий из очень разных метрик. Тогда нужно тащить в нейминге весь контекст этой метрики.


    1. yatanai
      00.00.0000 00:00

      Я использую определения в таком случае. Грубо говоря мой код превращается в

      int idx = p_arg; //Index of humanity 

      Также стараюсь максимально сжимать контекст используя всякие штуки по кодстайлу. Грубо говоря

      class Foo
      {
        int ref;
      public:
        int& GetRefCount(); 
        int& r_ref();
      }; //C++

      Где префикс [r_] означает ссылку на объект. В целом читая код понятно что он делает, но вот с "публичным api" приходится возится.


  1. kt97679
    00.00.0000 00:00
    +4

    Однажды один бывший коллега писал код слушая ну очень прогрессивную музыку. И названия переменным он давал созвучно песням, которые слушал. Код ушел партнерам и они очень удивились, посмотрев внутрь. После этого в наших билдах повилась проверка, которая назвалась bad_words.


  1. shigorin
    00.00.0000 00:00
    +4

    > В чём разница между сочинением третьеклассника
    > и статьёй в крупном таблоиде?
    В сочинении может оказаться правда.

    PS: меня как переводчика между несколькими языками и разработчика на ещё нескольких от такого суржика (не путать с терминологией) от подобных текстов малость коробит; искренне желаю научиться говорить красиво, тогда и у кода есть шансы стать красивей.


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      За пожелание спасибо. Но запрошу конкретику:
      что конкретно вызывает коробление?
      как бы это звучало красиво?


      1. shigorin
        00.00.0000 00:00
        +1

        Да вот прям название статьи (но предназначение «зацепить» оно при этом выполнило :)).

        Как думаете — «назови меня тихо по имени» не зацепило бы?

        А коробит суржик, как и сказал; впрочем, мне доводилось и тернопольчанам таковой вправлять на месте, зная и ту пару языков тоже (тогда и пришёл к выводу, что суржик скорее индикатор ограниченности, поскольку человек смешивает языки, не зная действительно хорошо ни один из них и даже не замечая этого — т.е. злонамерения нет, но и красоты, о которой статья на самом деле, как мне показалось — тоже).

        Не примите как наезд — докапываюсь тогда, когда вижу смысл, и благодарен многим тем, кто за всю мою жизнь там или сям решил, что есть смысл докопаться по делу в мой адрес :)


        1. xxlagr Автор
          00.00.0000 00:00
          +2

          С такой стороны я на свой текст не смотрел. Действительно, выразительные средства языка можно использовать лучше. Хотя отсылка к песне Любэ здесь чуть меньше подходит, на мой взгляд. У русского языка мощная система, она переваривает в себе любые заимствования. Как и любой другой язык он живёт и развивается. Когда-то кандидат филологических наук посоветовал мне не переживать по поводу неуместного употребления слова «одел». Если так удобно, то люди так будут говорить и станет это нормой в языке. Возможно и «суржик» так же приживётся. Заимствованные слова — это ведь не всегда аналоги ещё. Многих терминов в нашем языке просто нет. Или они обозначают что-то похожее, но не в точности то же самое.


        1. Chamie
          00.00.0000 00:00
          +2

          Как думаете — «назови меня тихо по имени» не зацепило бы?
          Не иллюстрировало бы проблему трудностей с неймингом. Вы статьи на Лурке читали? Когда любое явление, если его можно проявить лексически, применяется, собственно, к его описанию. Ну, или, например, слово «ачепятка» — вас тоже коробит?
          А в плане именно «зацепило», статья с названием «назови меня тихо по имени» может быть о чём угодно, это название практически не несёт информации. Статья с названием «делай нейминг как сеньор» — точно будет про нейминг в разработке и про проблемы с ним, причём, скорее всего, не самые базовые вещи, очевидные даже джунам. Статьи ни о чём/непонятно, о чём — открывать не хочется. Мало ли о чём оно там будет.


  1. evgsavosin
    00.00.0000 00:00
    +1

    Не стремитесь называть максимально коротко. Нейминг из 3-4 слов — это нормально. Передать конкретику одним словом, чаще всего, нельзя.

    Наоборот имеет смысл стремиться это делать, если мы работаем в рамках одного контекста. Здесь вопрос не в стремлении или любви это делать, а в том, насколько это и вовсе уместно на конкретном участке кода. Если вы используете функциональное программирование, то проблем с неймингом будет в несколько раз выше, чем у объектно-ориентированного, у которого есть возможность задавать контекст в рамках конкретного класса.

    Нужно найти золотую середину, чтобы чистота кода не страдала, но, в тоже время, чтобы всё было предельно ясно и понятно.


    1. xxlagr Автор
      00.00.0000 00:00

      С опытом чувствуешь баланс длина/понятность. Но, пока опыта нет, предпочтительнее длинно, чем непонятно.


  1. ProRules
    00.00.0000 00:00
    -5

    Сразу увидел "basket" вместо cart (корзина на сайте)... Эх знали бы ещё эти мудрецы лучше английский ????‍♂️


    1. haqreu
      00.00.0000 00:00
      +4



      1. ProRules
        00.00.0000 00:00
        +1

        А самое смешное кстати Если зайти в "Basket" то там написано https://s.mail.ru/Vbx8/EYydMoXzx Your Amazon Cart is empty


        1. Ivan22
          00.00.0000 00:00
          +2

          вот пример того как важен правильный нейминг с самого начала


    1. tyomitch
      00.00.0000 00:00
      +1

      Это разные предметы:


    1. warhamster
      00.00.0000 00:00
      +1

      Вот этим еще можно рассказать, какие они нутупые: https://dictionary.cambridge.org/dictionary/english/shopping-basket


  1. ev_i
    00.00.0000 00:00
    +1

    Отличная статья. Хотелось бы ещё про таксономию в IT почитать.


  1. iBljad
    00.00.0000 00:00
    +5

    Никогда не забуду нейминг вида

    String[] massiveString


    1. aldekotan
      00.00.0000 00:00

      Узнаю свой нейминг! :) Тогда я, после нескольких часов в попытках понять для чего предназначен этот и другие массивы, решил помочь себе хотя бы так. Сейчас понимаю, что решение было опрометчивым.

      p.s. потом свои труды передал опытному человеку. Его реакцию трудно передать словами


  1. acordell
    00.00.0000 00:00
    +1

    Спасибо, полезно. Только вот по моему опыту в крупных многолетних проектах не все так просто. Тут зачастую словарь быстро растет как на дрожжах и становится больше похож на произведения Льва Толстого. При этом ранние произведения не всегда стыкуются с поздними. Да и в бизнесе жизнь же тоже совсем не статична, и туда тоже приходят и уходят целые пласты терминов. Иногда это долетает до словаря. А иногда - нет. Плюс, еще, как правило, есть огромный кусок легаси, который в разные годы писали разные команды, и, ясное дело, каждая со своим видением прекрасного... В итоге к словарю получается нужен толмач. Да не один.

    В текущем проекте, переломав немеряно копий, пришли к тому, что верхнеуровневый нейминг - часть задачи. Аналитика с архитектурой предлагает свои варианты, разработка - свои. И это утресаем ровно так же, как и все остальные части задачи. Да, конечно, на переменные внутри методов никто не претендует, но имена сервисов, таблицы, столбцы, интерфейсы совместно продумываются со всех сторон. А когда это есть, и есть понимание, что это важно, то и переменные внутри кода как-то называть NNN народ уже особо не тянет. За джунами, конечно, приглядываешь, но с ростом опыта, люди втягиваются, и постепенно бардака становится меньше.


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Практику разделения проекта на домены применяете? Чтобы для каждого свой словарик составлять. В масштабах большого проекта и словарь поддерживать тяжело и разработчики начинают специализироваться больше на каком-то одном участке.


      1. acordell
        00.00.0000 00:00

        Да. Несколько, правда, специфично. Вертикальные срезы, под названием "секция". У нас есть особо толстые клиенты, каждый со своей спецификой, ради которых кастомизируется процесс. За каждым таким закреплена отдельная группа. Плюс есть сами по себе специфические секции, которые даже в рамках другого законодательства работают. Под них тоже отдельные люди. Но за этим всем есть ядро системы, которое все это пытается свести в одно и вынуждено с каждым говорить на его языке.


  1. NNikolay
    00.00.0000 00:00
    +2

    А давайте вспоминать какой кто видел ацкий нейминг. Мой герой это файл в проекте с именем satya.mp3. Satya это имя разработчика запилившего фичу со звуковым файлом.


    1. xxlagr Автор
      00.00.0000 00:00
      +2

      основной файл стилей назывался temporary_new.css


    1. acordell
      00.00.0000 00:00
      +4

      Не знаю годится это в примеры или нет, но я как-то накопал в могучем легаси, среди костей динозавров метод:

      bool isJopa()
      {
          return true;
      }

      Который вызывался там из ряда мест, но больше удивило не это, а, так сказать, безвариантность ситуации. То есть, что бы ты не делал, а всегда ж...


    1. XaBoK
      00.00.0000 00:00
      +1

      Как то в довелось ревьють комит, где разработчик написал функцию прохождения по дереву для проверки иерархии. Часть параметров наследовалось от родителя, что было противоположно обычному ходу дел. Так что было важно при наличии такого параметра "убедить" детей. Ну и вот вам мультикультурность - в родном языке разработчика говорят не родительская нода, а нода отец. Так что на английском у него получилась функция с именем: LookAmIYourFather.

      Я не удержался и часть ревью выглядела так:


  1. Max_Pershin
    00.00.0000 00:00

    Называй переменные понятно. Суть не в английском а чтобы было понятно. И всем. И даже моей бабушке. Если бы вы написали заголовок статьи на русском, я бы считал что вы умеете программировать - поскольку такое имя статьи явно понятнее.


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Называй понятно, но как этого добиться? В этом и есть сложность, про это и есть статья. Чтобы было понятно даже бабушке, нужно опереться на какую-то систему, которая уже существует. Изобретение собственных велосипедов, как правило, помогает обогнуть какую-то локальную «неровность» с названиями, но не построить процесс на сотни человек.
      Переменные — это про код. Нейминг — шире: код, документация, аналитика, тест-кейсы, события и тд.


  1. Max_Pershin
    00.00.0000 00:00

    Давайте конкретнее. Вот RatePerHour - вот как из названия понять - это какой-то промежуточный коэффициент по которому начисляется зарплата или сумма зарплаты в рублях в час?


    1. xxlagr Автор
      00.00.0000 00:00

      Вы встречали когда-нибудь «промежуточный коэффициент, по которому начисляется зарплата»? Возможно я не в курсе, что такое существует.


      1. Max_Pershin
        00.00.0000 00:00

        Но это же "оценка" дословно и как бы значений много - вот откройте словарь английский напечатанный, там идут варианты перевода по убыванию частоты - и "оценка" будет на первом месте. Но а если коэффициент ъ да, есть, в макдоналдс пока у тебя первые 2 месяца коэффициент 0.75 от зарплаты рядового сотрудника, у сотрудника мак-кафе он 1.2, я могу путаться - но примерно, в выходные помножается вообще у всех по трудовому кодексу.


        1. xxlagr Автор
          00.00.0000 00:00

          Вы всё правильно понимаете. Есть ставка почасовая. Ночью или в праздничные дни применяется повышенный коэффициент, на который умножается ставка. Например коэффициент ночью = 1.2
          Да, английский контекстный. Домены помогают однозначно понимать такую терминологию. RatePerHour находится внутри домена Incentives.


  1. skywalk7
    00.00.0000 00:00
    +2

    var avgWaitingTime = 2000; // FIXME rename to avgHeatedShelfTime

    Видно, что писал джуниор, сеньор напишет avgHeatedShelfTimeInMs, ну или использует специальный тип для хранения TimeDelta.


    1. xxlagr Автор
      00.00.0000 00:00

      Замечание справедливое, но мы так сознательно сделали. Во всём API возвращаем TimeSpan в секундах и пишем этот момент везде в спецификациях. Внутри системы мы оперируем типом TimeSpan.


  1. XaBoK
    00.00.0000 00:00
    +3

    Хорошо и по делу. Правильный нейминг - это уже документация. Код читается легко и понятно, что он делает. Спорный момент в "избыточности".

    basketId: 0, // FIXME rename to id

    Возможно мой опыт связан с определенными платформами и языками, но я оооочень рекомендую избегать ambiguous naming. Особенно с такими полями как id и name. Иначе обработка полиморфных коллекций и всякие linq будут источником проблем в долгосрочной перспективе. Каждый рефакторинг будет головняком. То же относиться и к запросам в бд. Имя кого и чего почти всегда не понятно из контекста при массовой обработке данных.


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Тоже так делаем. Если в объекте есть несколько идентификаторов и имён, то лучше добавить контекста.


    1. wibotwi
      00.00.0000 00:00

      Согласен. Меня тоже смутило это. clang-tidy например выдаёт ворнинг если название переменной меньше 3 символов. Зачастую такие поля кладутся в базы данных, где очень удобно делать natural join. Также они могут отправляться по сети, или в названия форм на вебке. Постоянно перекладывать в коде из id в basketId и обратно неудобно. Так же слово basketId удобно делать поиск по всем файлам, включая и код и документацию и csv файлы с данными для тестов. Слово id грепать будет то еще удовольствие.


      1. Aldrog
        00.00.0000 00:00

        Зачастую такие поля кладутся в базы данных, где очень удобно делать natural join.

        В БД я не эксперт, но даже если там действительно удобнее иметь поле basketId, почему бы не сделать перебрасывание id<->basketId в хранимых процедурах? Как-то странно менять именования в коде приложения ради небольшого удобства DBA.


        Также они могут отправляться по сети, или в названия форм на вебке.

        А что плохого в отправке json вида {"basket":{"id":1234,...?


        Так же слово basketId удобно делать поиск по всем файлам, включая и код и документацию и csv файлы с данными для тестов. Слово id грепать будет то еще удовольствие.

        В любом современном редакторе кода можно сделать поиск использований символа. Единственный минус — не найдёт упоминания в комментариях и в коде, тем или иным образом выключенном из проекта.


        Ну и если у вас язык с динамической типизацией, то могут быть проблемы.


        1. wibotwi
          00.00.0000 00:00

          Хранимые процедуры не во всех БД есть, и переименовывать в них что-то это безобразие, такой костыль потом никогда не найдешь.

          И идея была не "менять код ради БД" а "именовать сущность везде одинакого, включая код, документацию, БД, и так далее". Даже в Slack если я спрошу какой id у вас застрял, меня не поймут если я не уточню что это basketId.

          А причем тут json? Речь была про разные плоские протоколы, где нет объектов.

          Впервые слышу про любой современный редактор который умеет искать символ в документации (файле README или еще каком тестовом формате типа Tex), в CSV файлах, в XML файлах. В таких файлах даже человек не сразу поймет про какое id идет речь.


          1. Aldrog
            00.00.0000 00:00

            Вся ваша аргументация имеет смысл только при условии, что вообще все поля всех сущностей во всём проекте имеют уникальные имена. На мой взгляд, отслеживать это крайне непрактично и бессмысленно.
            И что будете делать, если в ваш стек понадобится добавить язык или протокол, не поддерживающий принятый у вас формат именования? Например, не имеющий case sensitivity, а у вас всё в camelCase.


            Гораздо разумнее определить простые и однозначные правила конвертации имён для тех случаев, где нужна уникальность или другие особые правила именования. Например, для передачи по плоскому протоколу нескольких объектов, на уровне сериализатора добавляйте к каждому полю имя объекта или типа.


            Даже в Slack если я спрошу какой id у вас застрял, меня не поймут если я не уточню что это basketId.

            Так спрашивайте про basket.id. И в документации пишите и ищите не просто id, а basket и basket.id. Естественно, просто id должен встречаться только в контексте описания самой сущности basket, где из контекста и так очевидно, что это за id.


  1. Artem_7
    00.00.0000 00:00
    +2

    Спасибо за статью. Забавно, что инвайт на Хабр я получил 10 лет назад именно за статью о нэйминге (https://habr.com/ru/post/207102/). Я уже и сам не согласен с частью правил, которые там озвучил. Но большинству следую и по сей день (да, устав бороться с разработчиками, я ,в итоге, сам стал разработчиком).

    Стикеры в тему:

    "Нэйминг - это фундамент, на котором возводится небоскреб проекта. "

    "Не умеешь в нэйминг - меняй профессию"

    "Театр начинается с вешалки, а программирование с нэйминга"


    1. xxlagr Автор
      00.00.0000 00:00
      +3

      Спасибо, что поделились. Я искал подобные статьи, но слово «именования» для поиска не использовал, поэтому статью не видел. Вот такая ирония про нейминг.


      1. Artem_7
        00.00.0000 00:00
        +1

        Ирония в том, что слово "нейминг" - это транслитерация, которая является антипаттерном при "нэйминге" :) Поэтому я использовал русское слово "именование" в названии статьи. Но плакат назвал Naming Convention. Ирония в квадрате :)


  1. astypalaia
    00.00.0000 00:00
    +1

    проблемы с неймингом → проблемы с пониманием предметной области

    "Истину глаголишь, боярин" (с). Вот прямо сейчас я вынужден отклонять код ревью по причине не понимания разработчиком предметной области. А всего-то казалось делов: взять нужный ISO стандарт, выделить из него суть, и перенести эту суть в код в виде именованных констант. Но нет.

    А статья хорошая, спасибо! В смысле все это так или иначе описано в разных известных трудах, но лишний раз навести порядок в мозгу - никогда не повредит.


  1. Tyusha
    00.00.0000 00:00

    Вопрос к спецам (я не профи, программирую по необходимости в научной работе). У меня часто возникают затруднения (скорее внутренний дискомфорт):

    1). слово number в названии переменной можно трактовать, как общее количество чего либо, а можно как порядковый номер?

    2). Наименование массивов давать во множественном числе или в единственном? Например при инициализации var shops = [ 'Василёк', 'Ромашка', ... ] — выглядит органично. Но там где обращаюсь к конкретному элементу, выглядит уже странно shops[ i ]. Зато хорошо читается конструкция for ( shop in shops ).

    Однако часто вижу использование единственного числа в наименовании массивов в довольно прилично написанном и авторитетном коде. Как правильно?


    1. tyomitch
      00.00.0000 00:00
      +1

      1) лучше использовать однозначные count и index


    1. xxlagr Автор
      00.00.0000 00:00

      По поводу number уже ответили дельно, это специфичное слово, лучше его как «суффикс» не использовать.
      По поводу множественного числа, пусть вас не смущает. Например в наименованиях путей в REST очень рекомендуется использовать множественное число: /shops/{id}. Что и в случае с REST, когда у нас есть «каталог» с сущностями, так же и с массивом, который содержит сущности, действует принцип вложенности и отражается в наименованиях.


    1. ookami_kb
      00.00.0000 00:00
      +2

      1. Общее количество – обычно count или qty. Порядковый номер – index, может еще position.

      2. Или shops, или shopList. Просто shop для массива – имхо, вводит в заблуждение. shops[i] не выглядит странно – это, по сути, "первый из магазинов", "второй из магазинов", вполне органично.


    1. vadim_bv
      00.00.0000 00:00

      1) количество — можно amount, amt; порядковый номер — ordinal, ord (ну и num тоже видел)
      2) нужно во множественном числе: как раз сразу будет понятно, что речь идёт о массиве/списке.


  1. murad88
    00.00.0000 00:00
    +2

    До сих пор помню

    `bool _isOnlyTrue = true;`


    1. XaBoK
      00.00.0000 00:00

      А как было бы круто если б `bool _isOnlyTrue = false;`

      Приходилось видеть всякие константы типа DoNotChangeThisValue с историей изменении чуть ли не каждый день и FirstFunctionToCall где-то в середине списка вызовов в Main... Тот самый вариант бездумного нейминга, когда имя идёт вместо коментария, а смысл и суть функции/переменной остаются загадкой. Просто очередное Magic Value.


  1. MSBlast
    00.00.0000 00:00

    Статью в принципе можно сократить - хорошему программисту необходимы хорошие знания английского языка.


    1. Simpre_falta_algo
      00.00.0000 00:00

      Хорошему специалисту (необязательно программисту) необходимы адекватные знания.


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Идея статьи не в этом. Нет серебрянной пули, чего-то одного, что всё решит. Инженеру обязательно погружаться в предметную область. Хорошее знание языка сильно поможет, но не решит проблему с неймингом. И инструменты, как системно работать с неймингом, как продавать эту идею, как поддерживать.


  1. comdivuz
    00.00.0000 00:00
    +2

    Про basketId - вот не всегда, особенно если это сущность из базы. В БД часто из-за объединений в таблицах делают явные имена полей и их лучше и в коде такими оставить. Также часто бывает, что тип ид это что-то известное, типа cardId какого то, а сущность типа CartHandler синтетическая, и лучше оставить некоторую избыточность, но узнавабелтность. Но статья хорошая много тем закрывает, но 99% назовут поле с ИНН inn, а не tin и будут правы, если софт для России. Всё же главное это конвенции и простота и однозначность прочтения.


  1. uszer
    00.00.0000 00:00

    Как правило, для переменных использую общий подход: первые два символа - тип переменной. Следующие два-три символа - "имя" переменной (как правило - бз глснх). Если переменная используется в функции, текст которой помещается на экран целиком - переменные (особенно "временные", и интенсивно используемые) вообще могут быть в одну букву. Такой подход резко сокращает "геометрические" размеры кода. Наверное, я не думаю о будущих поколениях. Но мне нравится так и эта ламповая вкусовщина уходит корнями в прекрасное далёко, когда символами на переменные не разбрасывались.


    1. nnikolaev
      00.00.0000 00:00
      +1

      У вас динамический язык программирования, или IDE не показывает тип переменной? Не совсем понимаю зачем сейчас использовать тип переменной в её названии. Вы не используется минификаторы кода? Зачем так жёстко сокращать имена переменных?


      1. uszer
        00.00.0000 00:00

        К сожалению или счастью - сейчас практически не приходится пользоваться никакими "продвинутыми" IDE (mc editor и notepad++ - не в счет).


    1. kspshnik
      00.00.0000 00:00

      Ооооо, Симонаи ещё помнят :)


      1. uszer
        00.00.0000 00:00

        Да, точно. Уже и забыл автора!


  1. steaze
    00.00.0000 00:00

    Часть советов уже применял, но всё равно статья полезная, иногда нужно почувствовать, что делаешь правильно, а не как советуют коллеги. Сомнения только возникают когда получаешь, например, даты диапазона с фронта: start и end, в DateTime преобразую уже в startAt и endAt. Ещё сомневаюсь в правильности использования Get при получении данных. По идее это действие, как Add*, Remove* и др. Но когда методов Get* набирается уже больше десяти, начинаешь задумываться, правильно ли так писать.


    1. xxlagr Автор
      00.00.0000 00:00

      StartAt — ’начинать в ’, по-человечески лучше в прошедшем времени. Или мы используем periodFrom, если это фильтр. Просто start для временного отрезка не самый удачный выбор. Да и без разницы фронтенд или бекенд —суффиксы нужны.
      Для методов REST есть описанные стандарты.


  1. Tab10id
    00.00.0000 00:00
    +1

    Моё "любимое" с текущего места работы:

    перевели слово "выгрузка" (csv, xml) как "unloading".

    Проросло.


  1. babysas
    00.00.0000 00:00
    +2

    Статья зашла. Включу "встречу по неймингу" в начало работы. Занимаюсь продуктовой аналитикой, naming convention - это обязательная часть работы по разметке продукта событиями и свойствами.

    Самая популярная ошибка - разные названия для одних и тех же сущностей, в мой работе это баг, который "как правило" не позволяет делать фильтрацию/разбивку данных или делает ее очень трудоемкой (зависит от инструмента)

    Понимание "зачем нужно внятно называть" приходит при просмотре действий пользователей - если с неймингом беда - интерпретировать очень трудоемко.


    1. xxlagr Автор
      00.00.0000 00:00
      +1

      Очень рад, что вам пригодилось!