Learning languages in different families teaches you to abstract away the abstract algorithmic concepts from the language family specific concepts. If I were designing a CS program, I'd probably include:
- C (imperative)
- Python (object oriented)
- Scheme (functional)
Interesting with that selection is that none of those are my weapons of choice in their niches for actual projects (I prefer C++, Ruby and Scala), but those above are a bit cleaner since they cling more purely to their respective models.
C is indeed imperative, but so is python and scheme too. In fact, both scheme and python are multi-paradigm languages, where both support functional (lambda calculus), object-orientation and imperative statements. If you want to focus on learning your computer, in a von Neuman way, then C is perfect. C++ is a dead horse, that should be left alone. But with scheme, you can focus 100% on algorithm development. That is not true with C/C++, which strictly speaking requires extreme caution with regard to manual memory management. Python is fun too, but has mainly gained more momentum than scheme because it has a more pragmatic focus on building and maintaining libraries with backward comp.. If the God of scheme manages to summon their rXrs camps into one 'multi-cultural' one - then we can expect scheme to mainstream adoption.