Não se assuste. Programação é uma coisa apaixonante se você for contaminado. Eu comecei escrevendo sobre linguagens de programação e compiladores e, sem perceber, acabei com um texto que vai servir para uns três anos da sua faculdade
Use o que você conseguir aproveitar.
---
Para começar, separe as coisas umas das outras: linguagem, compilador, editor de texto e IDE. C é a linguagem; GCC é um compilador; Gedit, vim, emacs, etc. são editores de texto; Eclipse e Netbeans são IDEs. Como o objetivo é didático, recomendo não começar usando IDEs -- use o compilador manualmente e entenda como ele funciona. Só depois parta para uma IDE.
Aprenda C (não confunda com C++, são linguagens diferentes embora muitas pessoas inventam de misturar as coisas logo no começo, isso não é nada didático). Mesmo que você não vá programar em C profissionalmente, é importante saber usá-lo para coisas que exigem desempenho ou alguma proximidade do hardware. Mas não acredite em ningué que diz "tudo que for escrito em C é rápido": é possível escrever código extremamente ineficiente em C, mais lento que o código equivalente em linguagens interpretadas, se o programador não souber o que está fazendo, mas aí está parte da importância dele no aprendizado. Nas mãos de um programador experiente, C é imbatível para muitas coisas.
Muito código importante hoje é escrito em C (sistemas operacionais, compiladores servidores web, de bancos de dados, os interpretatores e máquinas virtuais de virtualmente qualquer outra linguagem) e existe um bocado de oportunidades de trabalho nessa área -- eu desenvolvo software embarcado para equipamentos de rede, quase tudo em C.
Os livros didáticos normalmente só ensinam como usar a biblioteca padrão C, mas estude algumas bibliotecas mais práticas quando ganhar confiança. Código do mundo real raramente se limita à bibioteca padrão. Veja as funções POSIX (a API nativa do Linux e outros Unices) e só depois brinque um pouco com a
GTK+ -- ela é fantástica, mas não é simples. Exige um bocado de conhecimento além de C; para começo de conversa, ela é orientada a objeto
em C (novamente, não é C++). Não se assuste com esse o termo: você terá uma cadeira de orientação a objetos lá pelo segundo ou terceiro semestre do seu curso, e muitos professores parecem ignorar que orientação a objetos é uma forma de projetar software, não um recurso exclusivo das linguagens orientadas a objeto (Java, etc).
Note que há uma separação entre o compilador C e o pré-processador. Muitos livros e professores deixam isso passar.
Pegue um Linux ou o FreeBSD e entenda o ecossistema; o que cada componente faz, como as bibliotecas, processos e daemons se relacionam, etc. Isso é importantíssimo. Há vários sistemas virtualização (como o
VirtualBox) que você pode usar para fuçar e experimentar sem arriscar a instalação do seu sistema operacional normal ou ter que dedicar um segundo computador só para isso. Aprenda a usá-los!
Aprenda como funcionam os build-systems para o compilador. Compilar programas não-triviais é não-trivial (!), e provavelmente você vai esberar em alguns deles nas experimentações que sugeri no parágrafo anterior... há muita coisa importante em sequências como "./configure && make && make install" ! Entenda separar programas complexos em módulos, como escrever um Makefile e usá-lo para automatizar a compilação dos seus programas.
Aprenda
algumas linguagens interpretadas de nível mais elevado, Python e Java são dois bons exemplos. Elas tem bibliotecas padrões imensas e já vem "de fábrica" com coisas que, em C, você teria que criar do zero ou procurar bibliotecas externas. Estude as diferenças entre as linguagens, como elas lidam com tipos de dados e com a memória. Aprenda a diferença entre tipagem forte e fraca e estática e dinâmica. Estude como as máquinas virtuais dessas linguagens se comportam e porque elas são ótimas para muitas coisas e péssimas para outras tantas.
Eu tenho alguns projetos envolvendo uma linguagem chamada
Lua e recomendo (meio parcialmente) que você estude-a. Ela é extremamente elegante (um conceito interessante para linguagens de programação, você verá) e tem recursos muito poderosos, mesmo que não o pareçam a primeira vista -- não se assuste com os termos, mas coisas como closures, funções como objetos de primeira classe e co-rotinas são a base de muitas construções de alto nível.
PHP é uma linguagem
horrível que serve para fazer coisas ótimas. Estude-a para entender o que há e errado e porque é
difícil fazer a coisa certa com ela. Mas você precisará de algum conhecimento da arquitetura da Web e do funcionamento do HTTP antes.
Depois de tudo isso, aprenda LISP. Sim, Common LISP, aquela linguagem assustadora e cheia de parênteses que você provavelmente não usará profissionalmente (escrevo isso apesar de eu ter usado AutoLISP por alguns anos no meu emprego anterior) mas que tem
todos os recursos das linguagens modernas. O valor didático de conhecê-la é imenso. Talvez você passe a encher suas frases de parênteses depois disso.
Aprenda algoritmos. Não aquela coisa de portugol (ainda usam esse termo?) , mas os conceitos subjacentes. Você provavelmente terá uma cadeira de análise de algoritmos depois de alguma de ciência da computação teórica -- "a Ciência da Computação está para computadores assim como a Astronomia está para telescópios" como (acho) dizia o Dijkstra. Muitas coisas ficam mais claras sabendo a diferença entre O(1), O(n), (n^m) e O (m^n), O(n!), etc.
Aprenda estrutura de dados e como implementá-las na linguagem de escolha. Conseguir organizar informação em uma forma adequada ao processamento é fundamental. Você terá cadeiras de estruturas de dados durante dois ou três semestres. Saber quando usar um vetor, lista, fila, árvore, hash, etc. é importante, mesmo que depois tudo que você faça será enfiar esses dados em um banco de dados -- que implementará essas estruturas, então você precisará saber delas para
Aprenda a pensar paralelamente. Você terá uma ou duas cadeiras de programação paralela ou algo assim. Isso não é novidade, mas separar a execução de um programa em segmentos semi-independentes é fundamental para aproveitar os processadores multi-core que são padrões hoje ou distribuir programas imensos e complexos entre vários computadores.
Se isso não te assustou ainda, não se preocupe. Dá para
aprender a programar em 10 anos (mas esse texto é sério e vale a leitura!)
Aprenda a usar um sistema de controle de versão. Esse tipo de ferramenta é fundamental para qualquer desenvolvimento sério e qualquer empresa da área precisa usar uma delas (*) para qualquer código não-trivial. Sugiro o
Git, que é prático, rápido, fácil de usar, distribuído e é usado por montes de
projetos de alta estirpe.
Um sistema de versionamento distruido é interessante porque você pode ter várias instâncias do repositório espalhadas em computadores diferentes, com pessoas diferentes ou hospedadas em sites específicos (como o
GitHub) compartilhando código e o histórico do projeto entre si. A utilidade disso pode não ficar clara no começo, mas acredite: quando você descobrir, não conseguirá mais viver sem.
Outras opções são o Mercurial, Bazaar e Subversion -- esse último não é distribuído e mostra sinais de cansaço, mas funciona bem para alguns estilos de projeto (o MUD é o único dos meus projetos que não migrei para o Git exatamente porque ele cai nessa categoria). Há alguns sistemas (muito bem) pagos como o ClearCase e o Perforce que estão fora de cogitação para o seu caso, mas você pode encontrar eles em uso em alguma empresa em que trabalhar. Ah, fuja do CVS como se fosse a praga!
Pegue código de software open source e estude como eles funcionam; faça mudanças e brinque. Acompanhe o desenvolvimento de alguns deles e veja como a equipe se relaciona, como features são planejadas e implementadas e como bugs são corrigidos.
(*) Há quem não use, mas não conto esse tipo de desenvolvedor entre os "profissionais da área".