@owen:
Jest jeszcze jedna bardzo ważna rzecz związana z programowaniem, której nawet nie wymieniłeś: inżynieria oprogramowania.
Zalicza się do niej również planowanie i projektowanie systemu, ale przede wszystkim chodzi w niej o to, by zapewnić naszemu kodowi jak najwyższą jakość. "Nauczenie się języka", szczególnie tak minimalistycznego jak C, to nie jest wcale tak duży problem. Dobrzy programiści muszą jednak tworzyć czytelny, odpowiednio uniwersalny/abstrakcyjny kod. W dodatku nie zawierający zbyt wielu błędów. To już jest znacznie większym wyzwaniem!
Chodzi o takie rzeczy, jak nazewnictwo zmiennych, czy funkcji. Jak zmniejszanie powiązań pomiędzy poszczególnymi modułami, dzięki czemu po zmianie w jednym nie trzeba zmieniać dziesięciu innych. Albo inne zagadnienie: testowanie programu, czy raczej jego składowych. Pisze się automatyczne testy, które można wykonać jednym kliknięciem/jedną komendą i które aplikacja musi przechodzić po każdej zmianie.
W czystym C nie poznasz też programowania obiektowego, a to chyba w nim tworzy się większość współczesnego kodu. No chyba że naprawdę chcesz pracować na niskim poziomie (w sensie: bliskim maszyny; nie mówię że to coś złego).
Tak czy siak, znajomość C bardzo Ci zaprocentuje. Musisz w nim opanować wskaźniki i nie możesz się chronić przed implementacją rzeczy takich jak klasyczne stringi. Naprawdę warto to zrozumieć, bo potem używa się tego w językach wyższego poziomu, tyle że tam jesteśmy już od tej implementacji oddzieleni przez solidną warstwę syntaktycznego cukru. Tymczasem stringi są zwykle zaimplementowane bardzo podobnie do stringów z C i ta wiedza może czasem wiele wyjaśniać.
Można też powiedzieć, że składnia wielu języków opiera się na C. O C++ nie muszę chyba wspominać, ale na C wzorowana była też Java, a także C#, czy nawet PHP. Dobre poznanie tej składni to podstawa.
Ogólnie myślę, że nauczenie się C jak najbardziej zaprocentuje, ale prawdopodobnie będziesz chciał się przenieść na język wyższego poziomu. Znajomość składni C sprawi jednak, że sporo będziesz rozumiał od razu.
Co do algorytmów i struktur to hmm... Ze struktur danych będziesz korzystał praktycznie zawsze i wszędzie. Musisz posiadać więc o nich pewną wiedzę. Listy, mapy, drzewa -- to wszystko trzeba dobrze rozumieć. Ale nie są to skomplikowane rzeczy. W przypadku algorytmów mam wrażenie, że jest odrobinę inaczej. Będziesz pewnie korzystał często np. z sortowania czy przeglądania drzewa. To pierwsze jednak jest zaimplementowane w bibliotekach standardowych i istnieje mała szansa, że zrobiłbyś to lepiej. Przeglądanie drzewa będziesz robił sam, rekurencyjnie, w ten czy inny sposób. Ale to jest dość proste.
Ah, rekurencja. Ją też dobrze by było, żebyś ogarniał. No i złożoność obliczeniowa: powinieneś wiedzieć z czym to się je. Ogólnie uważaj na zajęciach z AiSD, ale prawdopodobnie nie będziesz musiał mieć tego wykutego na blachę w pracy.