О выборе термина

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

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

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

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

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

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

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

Спасибо за пост!
В учебнике СМ2020 есть раздел под названием “слова-термины важны и не важны”. Он говорит как раз о двоякости терминов: с одной стороны, стоящие за словом/-ами концепты важнее, чем конкретный термин, и если вы в команде используете разные термины / нетипичные для профессионально области термины, но при этом понимаете друг друга, и с исполнителями внешних (по отношению к проекту команды) ролей договориться можете, то все ок.
С другой стороны, не слишком точно подобранный термин может затуманивать понимание, тк другие его использующие могут понять стоящие за ним концепты иначе, что и произошло в данном случае. В СМ есть похожий пример с ролями/стейкхолдерами: до 2019г в учебнике использовалось слово “стейкхолдер” вместо слова роль. И слово “стейкхолдер” частенько воспринималось как указание на конкретного человека, а не на его “одежку”, те на сложившееся в культуре название для <штуки>, демонстрирующей какое-то поведение / выполняющей функцию. Заменили на “роль” – стали лучше разделять человека-исполнителя и абстрактное название набора предписанных поведений.

Что касается других заинтересованных ролей в вашей ситуации: тут могла быть еще как минимум одна роль – “операционный менеджер”, исполнитель которой мог быть заинтересован в ситуации. Потому что время разработчиков (ресурс) не бесплатное, и если какая-то часть системы требует постоянных доработок и исправлений, то это как минимум повод поднять вопрос “что-то у нас куча задач постоянно на починку багов в одной и той же подсистеме уходит. Не потыкать ли вам ее палочкой, там, похоже, что-то не то?”
Такой вопрос мог быть по разным причинам не задан, но то, что подобный интерес тут в целом можно ожидать (и заранее готовить ответы на вопросы операционного менеджера), можно при помощи таблицы ролей в проекте и их интересов выявить. Собственно, поэтому при составлении такой таблицы мы рекомендуем пользоваться эвристикой “ролей в проекте всегда на 1 больше, чем вы нашли”. Очень помогает выявить недостающие, особенно если работа с ролями только началась.

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

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

А вот после этого у меня появились вопросы “почему эта штука так называется” и “а почему нельзя просто лишнее удалять”, которые постепенно и привели к нужным словам.