Terminei o primeiro semestre de Sistemas de Informação e queria tirar uma(s) dúvida(s)

Terminei agora em Junho o primeiro semestre de S.I e estou estudando Java. Queria tirar algumas dúvidas:

1-) Devo começar a estudar paralelamente uma nova linguagem ou é melhor eu me aprofundar mais em Java e só mais para frente iniciar uma nova linguagem?

2-) Quais livros de Java vocês recomendam para quem está estudando Java? Já tenho o Java Como Programar da Deitel e Java Use a Cabeça! Os dois estão me ajudando e também estou fazendo um curso de Java básico na internet.

3-) Além de cursos, o que vocês me recomendam para treinar programação? Eu uso o Uri Online Judge, mas acho ele meio chatinho, queria algo mais interessante.

4-) Por enquanto acho que irei seguir carreira Back-End, mas é bom também saber Front-End?

Bom, galera, acho que é isso. Tenho 18 anos e sou novo nessa área e quero me aprofundar e melhorar cada vez mais, agradeço quem puder dar algumas dicas. Valeu!

  1. A menos que vc já tenha um claro objetivo que queira alcançar com uma linguagem especifica, sugiro que fique com Java. Vai evitar que vc se perca e possibilitar que aprenda mais.

  2. Se estão te ajudando quer dizer que não os terminou. Sugiro que não pense em material extra agora, foque nestes que já tem, extraia o máximo deles.

  3. Também vou ficar de olho nas dicas do outros colega quanto a isso ^^

  4. Sim. É bom ter uma noção de HTML, CSS e JavaScript. Não precisa se aprofundar, apenas conheça o suficiente pra não ficar perdido, mas também não precisa se preocupar com isso exatamente agora. Foca no Java, ganhe fluencia ao expressar suas idéias através da linguagem, depois vc se preocupa com o resto.

  1. Linguagem é uma ferramenta que você escolhe pensando no que vai fazer. Por exemplo, pra aplicações Desktop costumo ver as pessoas recomendando C/C++ ou C# ao invés de Java, porque pela abordagem “escreva uma vez e rode em todo lugar” do Java ele não se liga bem nas coisas de mais baixo nível do Computador, então, pelo que pesquisei, Java não grava CD, não consegue obter a temperatura do processador, a classe Robot para lançar eventos nativos de teclado é mero “quebra galho”, e por aí vai… Pra resolver essas coisas com Java, geralmente recomendam usar algo externo ao Java como uma biblioteca escrita em C que você chama através do Java.

Pelo que sei, PHP também é mais performático que o Java, e o desenvolvimento é mais rápido, mas ele vai ser pior se você quiser criar um sistema grande e complexo, com muitas regras, pois facilita bugs devido as “regras frouxas” da linguagem (é melhor encontrar bugs em tempo de compilação do que durante a execução).

  1. Na verdade nem acho muito importante você dominar bem uma linguagem agora, acho mais importante você aprender bem os conceitos e os mecanismos da Orientação a Objetos, como Polimorfismo, Herança, Sobreposição, Composição, etc. Talvez seja interessante dominar também os conceitos da programação estrutural, como Funções, Procedures, e estruturas de dados. Depois de aprender esses mecanismos, fica muito mais fácil aprender qualquer linguagem, porque em geral, elas se baseiam neles.

Dica: eu recomento pensar duas (ou três vezes) antes de usar a “Herança de Estado” (que é quando se estende uma Classe, herdando os Atributos [estado]), porque ela traz limitações diminuindo a flexibilidade; ao invés de usá-la, prefira a Composição (que é quando um Objeto TEM outro Objeto). Para usufruir do Polimorfismo, prefira a “Herança de Tipo” apenas (que é quando você implementa uma Interface, herdando o Tipo e seu contrato).

  1. Acho que a maioria dos desenvolvedores não precisa estudar muito “programação” (com programação eu quero dizer o código que se cria dentro dos métodos/funções, como calcular imposto em preço de produto, validar dados inseridos pelo usuário, etc.) porque isso é fácil (é difícil em casos raros); o que precisa aprender bem é a fazer uma boa Arquitetura, e isto é muiiiito mais difícil! Nas questões de arquitetura você não se preocupa com o código dentro dos métodos, você se preocupa com coisas como: Quais Classes criar? O que colocar em cada Classe (quais métodos/funcionalidades, qual a responsabilidade de cada Classe)? Como organizar as classes em pacotes e definir a visibilidade? Como o Sistema vai crescer (quais Classes/Interfaces serão estendidas)? Como as Classes e módulos interagem entre si (como se relacionam) para fazer o que eu preciso que façam? A Arquitetura está apta para as prováveis alterações e futuras funcionalidades? Está muito acoplada? Está bem organizada para ser Testada? Está dividida em partes reaproveitáveis? Está fácil de entender ou é uma confusão? Etc.

Ficar fazendo “exercícios de programação” com sequência de fibonacci, cálculos com matriz, e outros tipos de coisa assim não vão te ajudar a aprender a fazer uma boa Arquitetura, que é o mais difícil e importante. Se você já sabe ordenar listas, separar Strings em partes, fazer cálculos, e domina ifs/elses e loops, acredito que você já pode partir pros desafios de Arquitetura ao invés de ficar gastando seu tempo com algoritmos pra fazer coisas matemáticas complexas que você provavelmente nunca vai precisar fazer na “vida real”.

Eu também estou estudando como fazer boas Arquiteturas de Sistemas, é muito difícil mesmo; mas a única forma que me parece realmente eficiente pra aprender sobre isso é partindo pra prática, tente criar um “sisteminha” imaginando algumas funcionalidades para ele, depois tente expandí-lo adicionando novas funcionalidades (quanto melhor a Arquitetura, mais fácil e rápido deverá ser adicionar novas funcionalidades e consertar bugs; numa Arquitetura ruim, você perderá o controle do “sisteminha” quando ele crescer).

  1. Sim, é bom saber o básico do Front-End como @wldomiciano falou, assim você entende as necessidades do pessoal “do outro lado” e consegue fazer soluções mais adaptadas pro que eles precisam.

De tudo que falei, acho que a melhor dica é essa: tente criar um “sisteminha” pequeno, e se conseguir, tente estendê-lo ou mesmo criar um outro sisteminha um pouco maior. Assim você pega experiência, aprende na prática, descobre os desafios, e, ainda, cria um portfólio pro primeiro emprego. :slight_smile:

1 curtida

Valeu pelas dicas! Ajudaram bastante! @wldomiciano @Douglas-Silva

Vou começar a focar em criar sistemas, acho que é uma forma melhor para treinar e aprender a programar melhor.

Vocês conhecem o Github? Sabem mais ou menos como funciona?

Eu comecei a ver algumas coisas do GitHub a pouco tempo, dá uma olhada aqui:

Também tem vários vídeos sobre Git e GitHub no youtube.

Eu procurei navegar pelos projetos lá pra ver o que podia aprender dos sistemas já feitos, mas, os que achei são muito complexos, acho que teria que baixar e abrir na IDE pra ir colocando breakpoints e ir descobrindo como funcionam. Ou procurar melhor sobre a documentação deles, se tiverem.

De qualquer forma, acho que seria necessária uma longa análise e bastante conhecimento pra entender esses sistemas e o porque deles terem sido feitos do jeito que foram. Só a partir disso pra Contribuir com eles adicionando novas funcionalidades.

Também não sei se você vai conseguir contribuições no seu projeto se criar um lá, mas, como Git e GitHub são extremamente usados (em empresas tb), faz muito sentido dominá-los (principalmente o Git); por causa disso eu acho uma ótima ideia vc começar a criar seus sistemas usando - pelo menos - o Git.