Как и во многих других языках, независимо opensource или нет:
- Комментируй всё неочевидное. Описание используемых алгоритмов, или причины выбора тех или иных подходов при написании кода.
- Придерживайся хоть каких-то стандартов (своих или чужих). Посмотри например на MISRA и Linux Kernel Coding Style.
- Не игнорируй предупреждения компилятора. Пусть проблемы на ранних этапах находят автоматические инструменты, а не пользователи. Подробнее тут: https://habr.com/ru/post/490850/
- Используй инструменты статического анализа - Sonar Qube, PVS-Studio и так далее, как дополнение к предыдущему пункту.
- Пиши unit-тесты
- Пиши документацию так, чтобы человек не знакомый с твоим кодом мог с нуля его собрать, запустить, и понять как работать с решением и самим кодом.
- Автоматизируй сборку, чтобы она была независима от твоего компьютера.
- Ну и по мелочи - не усложняй, не используй goto, если можно не использовать, следи за цикломатической и когнитивной сложностью. Между понятностью и краткостью всегда выбирай понятность. А выбирая между производительностью и поддерживаемостью, очень хорошо подумай.
А для гибкости и расширяемости можно применять принципы KISS, DRY, а также, частично, SOLID и GRASP (они придумывались для ООП, так что для совсем чистого си без самодельного ООП некоторые принципы не имеют смысла)