Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como um programador em nível intermediário pode se tornar um programador em nível avançado?

+1 voto
27,055 visitas
perguntada Abr 4, 2015 em Programação Computacional por danielcajueiro (5,081 pontos)  
reclassificado Abr 21, 2015 por danielcajueiro

Estou assumindo que estamos discutindo sobre uma linguagem de programação estruturada que permite orientação a objeto. É possível que você indique a linguagem a que você se refere. Exemplos de linguagens de interesse: C++, PHP, Python, R, Java, C#.

Compartilhe

2 Respostas

+2 votos
respondida Jun 22, 2015 por Rodrigo Miranda (231 pontos)  
selecionada Set 28, 2015 por danielcajueiro
 
Melhor resposta

Eu começo essa resposta do mesmo jeito que a de programação básica -> avançada:

Teach Yourself Programming in Ten Years

E reforço a necessidade de programar (learn by doing) e estudar bom código.

Aviso: Talvez a minha definição de programador avançado force um pouco a barra.

Agora você realmente precisa aprender a analisar e projetar algoritmos, e aí reforço a sugestão do Daniel do livro Introduction to Algorithms do Cormen et ali. Além disso, no meu entenderuma coisa que separa um programador avançado de um programador intermediário é a capacidade de transitar entre vários modelos mentais de computação.

Nenhuma das referências que vou passar é para ser lido de uma sentada. São livros para você ler, tentar entender o que está acontecendo, pensar um pouco.

Programação imperativa:

O primeiro, é o básico. A computação próxima da máquina, ou seja, saber como realmente um computador funciona. Programar um pouco de assembly vai aumentar o seu respeito e apreciação pelas bibliotecas e linguagens de alto nível, e você vai entender melhor como funciona uma máquina de Von Neumann. Na verdade, não precisa nem aprender assembly de um computador real. Eu sugiro usar o MMIX da série do Knuth:

The Art of Computer Programming

É a computação e o desenho de algoritmos destilado no nível mais básico, e com a matemática para acompanhar.

Além disso, é importante aprender como um programa grande funciona e está estruturado, e poucos programas são tão bem documentados (ou depurados) como sistemas operacionais e compiladores, então dois livros que eu acho excelentes para estudar o código são:

Lyons Commentary on Unix
A Retargetable C Compiler: Design and Implementation

E para ter uma idéia de como tudo isso se junta, num livro onde você vai de portas lógicas até o sistema operacional e uma linguagem de programação:

The Elements of Computing Systems: Building a Modern Computer from First Principles

E então um pouco sobre a ligação entre matemática e programação com o livro do Alexander Stepanov (autor da primeira versão da STL):

From Mathematics to Generic Programming

Agora passamos para Programação Funcional:

Se você nunca foi exposto a LISP, ML, Haskell, etc... em geral aprender realmente uma linguagem funcional é um divisor de águas. E recomendo começar com o SICP:

Structure and Interpretation of Computer Programas, do Abelson e Sussman

Tem várias versões desse livro pela web, e videos de aulas no OCW do MIT.

E feito isso, uma aplicação dessas idéias:

Paradigms of Artificial Intelligence Programming

A serie do Fellestein e Friedman (Little Schemer, Seasoned Schemer, Reasoned Schemer) também é altamente recomendada, mas aqui vou colocar só o:

The Little MLer

Que vai introduzir um modelo de programação que também é funcional, mas baseado em tipos de dados.

Da programação funcional, vamos para:

Programação Orientada a Objetos:

E aqui vou dar uma sugestão diferente das do Daniel: acho que se for aprender POO, recomendo fazer com Smalltalk. Com Smalltalk você vai encontrar um ambiente dinâmico onde tudo é um objeto e acessível ao programador.

O Stephane Ducasse tem uma lista de livros de smalltalk gratuitos:

Free Smalltalk Books

Eu recomendaria começar com o

Pharo by Example

e depois o

Deep into Pharo

Quanto à uma aplicação de POO, basta ver que o código do Pharo está disponível a qualquer instante no próprio ambiente para inspeção e modificação.

E além de aprender smalltalk, eu recomendo o livro da GofF:
Design Patterns: Elements of Reusable Software

Provavelmente o livro sugerido pelo Daniel (Headfirst Design Patterns) é uma referência melhor e mais atualizada do assunto.

Eu gosto do modelo Design by Contract da linguagem Eiffel também, então sugiro o livro do Bertrand Meyer:

Object-Oriented Software Construction

Mas eu coloquei o link para a primeira edição. Eu li a segunda também, mas ainda prefiro a primeira. É um livro brilhante.

E para completude, programação em Lógica:

Logic for Problem Solving
The Art of Prolog

Quando dá para usar Prolog ou algo similar para resolver o seu problema, é fantástico.

Agora que você já passeou por vários modelos de programação, vale a pena entender como eles estão relacionados, já que todos eles são equivalentes. E alguns são mais práticos em umas situações, e menos em outra. Para isso é importante aprender lógica, teoria da computação, máquinas formais, e de computação paralela, e etc. Os livros a seguir são muito bons (o de autômatos, eu estudei a primeira edição, mas tem uma atualizada que deve ser boa).

A Mathematical Introduction to Logic
Introduction to Automata Theory, Languages, and Computation
The Nature of Computation
Distributed Algorithms

E finalmente:

Gödel, Escher, Bach, an Eternal Golden Braid

E Um modelo de programação que hoje não tem muita propaganda é o modelo de threaded-programming em pilha do Forth. Que eu acho também muito interessante. E para mim, a melhor referência é:

Thinking Forth

Bom, por enquanto é só, pessoal.

Bom, eu garanto que se você passar por isso tudo com cuidado, sempre programando (sem pressa, 10 anos, lembra?) você vai ser um programador mais que avançado.

comentou Jun 22, 2015 por danielcajueiro (5,081 pontos)  
Existem sugestões de frameworks para MMIX e programação funcional?
comentou Jun 22, 2015 por Rodrigo Miranda (231 pontos)  
O MIX e o MMIX são conjuntos de instruções de máquina inventados pelo Knuth para que ele tivesse um conjunto de instruções estáveis para o livro dele, que não fosse amarrado a um fabricante e tecnologia (todos os algoritmos nos livros TAoCP são implementados em assembly do MIX ou MMIX).

 Mais referências aqui: http://mmix.cs.hm.edu

Quanto a frameworks para linguagens funcionais, existem muitos, dependendo da linguagem e do objetivo do framework (web, computação algébrica, computação distribuída, processamento estatístico, etc)

Depois eu coloco algo dos que eu conheço numa outra pergunta.
+1 voto
respondida Abr 12, 2015 por danielcajueiro (5,081 pontos)  

Eu não sei se sou a pessoa mais adequada para responder essa pergunta, meu aprendizado de programação computacional começou há muito tempo e de forma errática (nunca tendo exatamente uma formação formal) - numa época que pouco se falava de programação orientada a objeto, pelo menos no meu círculo de pessoas). Mas talvez respondendo essa questão de forma genérica, talvez outros se motivem a fazer o mesmo e no fim do dia teremos um tutorial no PRorum que possa servir de guia para as pessoas aprenderem a programar.

1) 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.

2) Nível intermediário:

a) O programador deve ser hábil para lidar com grande parte dos problemas discutidos em um livro intermediário de algoritmos como, por exemplo, o livro do Thomas H. Cormen e Charles E. Leiserson e também aprender sobre complexidade de algoritmos:

A imagem será apresentada aqui.

b) O programador deve se sentir confortável com noções de programação orientada a objeto como, por exemplo, herança, encapsulamento e polimorfismo.

c) O programador deve ter noções de programação orientada e desenvolver interfaces simples para o usuário.

d) O programador deve ter noções de como usar e abusar de bases de dados como, por exemplo, MySQL.

3) Como passar de um nível intermediário para um nível avançado?

a) Entender como programação orientada a objeto pode ser usada para a criação de design patterns úteis.

b) Se envolver em projetos open-source de sua escolha para descobrir como programadores mais avançados escrevem os códigos

c) Se preocupar e muito com estilo de programação. O objetivo não é mais agora ter um programa resolva um problema, mas sim que resolva da forma mais elegante.

Outras questões relacionadas com essa aqui no PRorum:

Melhores livros para se aprender design patterns

Melhor livro para se aprender orientação a objeto em C++

Áreas interessantes da aplicação da Computação Científica:

Economia

Física

...