Universities and vocational schools often lay a heavier focus on either theory or practice. While this may be fine in some disciplines, and even needed in some others (there is intrinsically little practice when studying ancient Greek literature), Computer Science is intrinsically different. Computer Science lies right between the mathematical theory of logic, and the fluency of language. It is indeed shown that programming is essentially equivalent to proving a long series of small mathematical assertions (this is a fascinating concept in and of itself, known as the Curry-Howard-Lambek correspondence). Because of its hybrid nature, the study of Computer Science cannot be limited to only mathematical foundations, or only programming practice.
The theory is needed in order to provide a framework to understand why it works.
The practice is needed in order to understand how it works.
Without practice, the theory results empty and pointless, and its examples and abstractions feel almost contrived. Without theory programming languages seem convoluted and most of the underlying structures and similarities, which define the fundamental quality of programs, are invisible.