1)
они просто прописали margin: 0, что идет в разрез с их же правилами
— Нет, как раз нулевое значение для всех блоков и позволяет соблюсти «невлияние на внешнюю геометрию». Т. е. это нормально и допустимо для любого блока — обнулить его margin, position (border'ы, в принципе, можно оставить при указании корректного box-sizing)
2) в идеале должно быть достаточно «сделать только класс button_size_small», а за порядком должен следить сборщик. Если использовать «вложенные селекторы», то будет нагляднее:
.button {
padding: 20px;
&_size_small {
padding: 10px;
}
}
3) Размер шрифта вполне может быть задан в модификаторе size:
.heading {
margin: 0;
font-feight: bold;
&_size_s { font-size: 18px; }
&_size_m { font-size: 24px; }
&_size_l { font-size: 30px; }
}
А тот, кто будет менять положение блока в HTML, помимо «вырезать-вставить» сможет ещё и обновить модификатор, изменив размер шрифта без залезания в CSS.
4) Следовать БЭМ достаточно непросто, если держать эти правила в голове. БЭМ-разработчики используют инструменты (т. н. «БЭМ-стек»), которые автоматизируют всю рутину, но порог вхождения достаточно высок. Могу лишь посоветовать не стесняться задавать подобные вопросы в чатике
https://t.me/bem_ru