I divide the notion of software engineering into two major aspects: engineering and craft.
Engineering is the study of all of that process stuff that goes into making a software artifact by learning to see incoming problems, collaborating well with your teammates, and learning how to translate your work into the vocabulary of engineering. Ipso facto, there is nothing magical about such an intellectual process.
On the other hand, crafting skills are not easily teachable. In case of software engineering, they are mostly social skills such as knowing how to manage people, to work as a team member, and ultimately to be able to reach tacit knowledge (if need be) are required during the process.