Estou assumindo que você já é um programador em nível iniciante. Ou seja,
Nível básico: Um programador deve ser hábil para implementar algoritmos simples, em sua linguagem de escolha, usando controles de fluxo e loops. O ideal é que já seja capaz de modularizar seu código usando funções.
Isso significa que você já sabe conversar com o computador. Você já sabe pedir para ele seguir um caminho de execução ou outro, você já sabe pedir para ele repetir parte de um código, você já consegue separar seu código em módulos e, finalmente, você já consegue resolver problemas simples em sua área de interesse.
Como me tornar um programador em nível intermediário?
1) Você precisa perceber que um mesmo problema pode ser resolvido de várias formas diferentes e algumas delas são mais interessantes que outras.
Por exemplo, considere o problema de ordenação de números (veja essa pergunta relacionada). De quantas formas diferentes você consegue resolver esse problema computacionalmente? Você na vida real ordena ítens diferentes de forma totalmente diferentes. Por exemplo, considere que você gostaria de ordenar formulários pela idade das pessoas. Esse problema provavelmente você resolveria de forma diferente se fosse ordenar cartas de um baralho.
Um outro exemplo interessante é o caso da sequência de Fibonacci que pode também ser implementada de várias formas diferentes.
De uma forma geral, existem várias estratégias básicas que podem ser usadas para resolver um problema computacional, por exemplo,
a) Recursão
b) Divida e conquiste
c) Reduza e conquiste
d) Programação dinâmica
Um livro com uma excelente apresentação a esse assunto é:
Anany Levitin - Introduction to the Design and Analysis of Algorithms, 2011.
2 - Depois que você perceber que existem várias formas diferentes de resolver um mesmo problema, você perceberá também que cada forma de resolver um problema está associada a um custo computacional. Por isso, vale a pena a você dar uma olhada em Complexidade Computacional. Um livro muito bom (e clássico agora) sobre esse assunto é:
Thomas H. Cormen e Charles E. Leiserson - Algorithms
3 - Usando como base esses novos instrumentos na sua caixa de ferramentas que tal fazer uma aeróbica computacional? Um problema por dia? Você pode por exemplo trabalhar com os problemas do Euler Project
4 - Você deve começar a perceber que embora você se sinta mais a vontade com uma linguagem de programação, você é capaz de fazer programas simples em várias linguagens diferentes. Isso ocorre simplesmente porque linguagens estruturadas são bem parecidas. Especialmente, pyhton, C++, java... Todas elas vêm da mesma linhagem. Dependendo de sua área, escolha uma outra linguagem para brincar.
5 - Que tal agora brincar com bases de dados? Você pode baixar bases do banco central, IPEA ou IBGE e brincar de fundir essas bases e colocar num formato interessante para ser usado em regressão ou outro tipo de estudo.
6 - Agora você deve passar uma mudança de paradigma e perceber a importância de orientação a objeto. Sendo honesto, essa foi uma fase difícil para mim, pois para o tipo de programação científica que eu fazia, parecia não ser necessário. Entretando, aprendendo noções de programação a objeto, você será capaz de fazer programas melhor estruturados e mais fáceis de serem mantidos.
Eu acho que a idéia geral (independe da linguagem) você pode pegar no livro
Brett D. McLaughlin, Gary Pollice e Dave West. Head First Object-Oriented Analysis and Design Paperback, 2006.
Mas se você quizer realmente aprender os objetivos de Orientação a Objeto, você precisa ir para
Eric Freeman, Bert Bates, Kathy Sierra, Elisabeth Robson
Head First Design Patterns Paperback, 2004
Se você for realmente, você já estará próximo de ser um programador avançado.
Um exercício interessante é repetir os padrões desses livros na linguagem de seu interesse.
Áreas de interesse da computação científica:
Física
Economia
Outras perguntas relacionadas?
Qual a melhor linguagem de programação para começar?
Quais os melhores livros para iniciar em Python?
Quais os melhores livros para iniciar em R?
Como iniciar programação em Python?
Como um programador em nível intermediário pode-se tornar um programador em nível avançado?