tl;dr
- Estude inglês
- Faça iniciação científica para descobrir se você quer seguir na academia ou na indústria profissional
- Estude fundamentos, principalmente arquitetura de computadores, algoritmos e estruturas de dados
- Mesmo que queira focar em outra linguagem, não deixe de estudar C
- Fique atento às novas tendências, principalmente programação para hardware diferente da CPU
Olá William. Pra começar bem, já te adianto o primeiro passo do roadmap: estude inglês. Pra qualquer carreira que você seguir na computação, o inglês vai sempre te abrir portas e oportunidades.
Existem algumas áreas que são exploradas tanto pela indústria (trabalhar em empresas) quanto pela academia (pesquisa científica), e computação paralela é uma delas. Eu diria até que existe mais espaço para quem quer se aprofundar nessa área na academia do que na indústria.
Então, eu recomendo que você pense se você quer seguir carreira acadêmica ou profissional. Como você está começando agora (segundo semestre), a minha recomendação é: faça iniciação científica. Isso vai te dar uma boa noção de como funciona a pesquisa científica e a academia, e vai te ajudar a decidir entre seguir a carreira acadêmica ou investir em um currículo profissional.
Programação paralela e distribuída
A programação paralela e distribuída (alguns separam elas e outros consideram a mesma área) é considerada uma sub-área da computação de alto desempenho (High-Performance Computing ou HPC).
Em resumo, essa área busca extrair o máximo desempenho possível dos componentes que estão disponíveis, sempre objetivando uma maior produtividade do programador. Então, basicamente as pessoas que trabalham com isso se preocupam em (1) estudar novas formas eficientes de explorar o hardware e em (2) prover abstrações (bibliotecas, frameworks) para que outros programadores sem tanto conhecimento possam explorar o hardware de forma eficiente.
Conhecimentos básicos/essenciais
Para se dar bem nessa área é preciso um excelente entendimento do funcionamento dos componentes do computador, pois como comentei acima o objetivo é justamente extrair o máximo desempenho. Então, você precisa estudar a fundo arquitetura de computadores, algoritmos e estruturas de dados. É importantíssimo entender a lógica de funcionamento da CPU e GPU, fundamentos de Sistemas Operacionais, conceitos como núcleos de processamento físicos e lógicos, processos, threads, assincronicidade, atomicidade, filas (queues), mutex, locks, sincronização, etc.
Se você já possuir um nível bom de inglês, lhe recomendo ler o livro: "The Art of Multiprocessor Programming", escrito por Maurice Herlihy e Nir Shavit. Creio que a edição mais recente é a 2ª de 2012 (a original foi publicada em 2008). Esse livro apresenta quase todos esses conceitos com certo nível de abstração (pois os exemplos são em Java, que é mais abstrato do que C).
Caso queiras mais alguma referência, posso lhe recomendar "Principles of Concurrent and Distributed Programming", também em inglês, escrito por M. Ben-Ari. Este é um pouco mais antigo, creio que a última edição é a 2ª de 2006.
Linguagens de programação
A maioria dos trabalhos nessa área ainda são feitos em C, então sugiro continuar investindo no seu conhecimento nessa linguagem pois há um espaço enorme de aprendizado até dominá-la (sendo mais sincero e direto: não acredito que você esteja em um nível bom de conhecimento dela em 2 semestres de faculdade). O motivo para o grande domínio do C é simples: nenhuma outra linguagem de programação geral até hoje demonstrou ser capaz de bater o desempenho dele, oferecendo níveis similares de abstração. Até mesmo C++ tem certo overhead, então alguns pesquisadores e profissionais evitam até mesmo ele e ficam no C. Por exemplo, na academia, grande parte dos estudos em programação distribuída ainda é baseada na biblioteca MPI (a sigla significa Message Passing Interface, mas quase ninguém usa por extenso, a sigla em si é muito mais famosa), que é originalmente escrita em C. Outro exemplo, agora a nível profissional: o banco de dados Redis que foca em uso eficiente de memória e velocidade, é todo escrito em linguagem C.
Rust é uma linguagem que tem ganhado bastante espaço e está crescendo rapidamente, veja por exemplo os números dela no GitHub e no TIOBE. Mas, como você pode ver pelos números, ainda vai levar um bom tempo (eu diria anos) pra ela ser amplamente utilizada e aceita, então isso pode ser encarado de duas formas:
(a) é uma linguagem relativamente nova e pode cair no esquecimento e você acaba sem conseguir aproveitar seu conhecimento adquirido nela.
ou
(b) é uma linguagem relativamente nova e portanto tem poucos estudantes e profissionais com domínio dela, portanto caso o interesse nela continue crescendo vão aparecer cada vez mais vagas e você será valorizado pelo conhecimento que tem dela.
Mas tem uma coisa que é preciso estar atento quando você olha esses gráficos de linguagens: eles não separam as áreas da programação. Nos gráficos você vê muitas linguagens sendo largamente adotadas e crescendo muito, mas é importante lembrar que cada linguagem tem foco em determinada área, cada uma tem seus pontos fortes e pontos fracos. Por exemplo, o JavaScript é muito utilizado, mas não faz o menor sentido falarmos dele quando estamos falando em programação de alto desempenho. Algumas linguagens foram criadas pensando na programação de scripts (PHP, Python, Bash) enquanot outras são voltadas pra programação de sistemas complexos (Java, C#). Isso não quer dizer que eu não possa fazer um sistema em Python ou um script em Java, mas não muda o fato de que o foco da linguagem não é esse.
Um ponto que precisa ser lembrado é que várias linguagens de programação permitem a interoperabilidade com C, então é muito comum ver as bibliotecas de alto desempenho serem escritas em C, e invocadas por programas escritos em outras linguagens. Por exemplo, Python é a linguagem adotada pelos programadores de Data Science e inteligência artificial (IA), então ela têm crescido enormemente. Mas praticamente todos os frameworks dessas áreas chamam bibliotecas escritas em C para fazer o processamento pesado dos dados, pelo simples fato de que o C é várias ordens de magnitude mais rápido que Python. Então, o crescimento das áreas onde o Python é usado também leva a um crescimento no interesse do próprio C.
O ponto principal dessa seção é: a linguagem C ainda é líder isolada na área de programação de alto desempenho. Você pode investir em outras e é muito interessante que faça, mas mantenha em mente que se você vai trabalhar nessa área, dificilmente vai conseguir fugir completamente do C.
Tendências
Existe muito movimento na área de computação de alto desempenho no sentido da programação de hardwares diferentes da CPU tradicional, principalmente GPUs, FPGAs (Field-programmable gate array) e ASICs (Application-Specific Integrated Circuit), principalmente voltados para cargas de trabalho de IA. Do ponto de vista da programação, esses hardwares basicamente se diferenciam pela abstração:
- GPU você compra pronta, só instala no computador, programa uma aplicação pra usar ela através de um framework específico (mais detalhes abaixo) e pode rodar. Dentro dos hardwares específicos, ela é a mais genérica.
- FPGA você compra, instala no computador e tem que programar ela com o algoritmo que deseja executar através de uma linguagem específica (hardware description language ou HDL). Após aplicar esse programa na FPGA você adapta a aplicação pra chamar ela e aí pode rodar.
- ASIC é um chip desenhado especificamente para uma aplicação. Eles não são comprados, e sim construídos por empresas ou pesquisadores que buscam extrair o máximo desempenho gastando o mínimo de energia para fazer alguma computação extremamente específica. Por exemplo, existem ASICs construídos especificamente para minerar Bitcoin e eles são tão específicos que não conseguem nem minerar outras criptomoedas (como Ethereum), apenas Bitcoin.
Para simplificar, vamos focar na programação de GPUs: enfatizando o que comentei na seção anterior, atualmente programação de GPU é completamente baseada em linguagem C. Por exemplo, os frameworks que dominam a programação para GPU atualmente são CUDA (da NVIDIA), OpenCL (padrão aberto suportado pela NVIDIA, AMD, e outros) e OpenACC e todos são na linguagem C.
Em suma, existem muitas sub-áreas da programação paralela e distribuída que tem recebido atenção e são ótimas oportunidades para você investir seu tempo e aprender mais a fundo. Mas todas elas requerem aqueles conhecimentos básicos/essenciais que listei na seção acima. Então, como você está começando, sugiro que foque em dominar eles, e com o tempo comece a estudar a área que lhe interessar mais. Assim você estará preparado para agarrar as oportunidades que surgirem.
Se tiver mais dúvidas, responde aí :)
Bons estudos!