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