I think that you've asked two slightly different questions which are both worth answering. Other answers are good for the question in the title, but I want to focus on the word "fundamental" in your second question.
For large fragments of most mainstream programming languages, there exists a native type theory (discussed at nCafé: 1 2 3) which describes the behavior of common syntactic elements like expressions and subroutines under evaluation. Constructing the native type theory for a particular language is a non-trivial adventure, but even basic versions have been enlightening. Thus, type theory is fundamental to programming and software engineering, even if we aren't yet experts at examining those foundations.