Me preparando para o futuro ao aprender a programar [fechado]

10

Quero aprender a programar de maneira "à prova de futuro", se quiser. Embora o Windows domine o mercado de SOs de desktop (por enquanto), obviamente, há muito valor em aprender suas linguagens / estruturas / APIs e assim por diante - isso pode estar sujeito a alterações à medida que novos dispositivos surgem ou o Windows se atira no pé (sobre As visualizações amigáveis ​​do Windows 8 não parecem muito atraentes ...).

Eu estaria certo ao pensar que ter um sólido conhecimento de C / C ++ para lógica de back-end / programação de baixo nível e similares, combinado com uma linguagem extremamente portátil como Java para GUI e assim por diante, seria uma boa base para o desenvolvimento de software isso será útil na maior quantidade de sistemas? - Estou falando de PCs, tablets, telefones.

Anônimo
fonte
11
Não existe tal coisa #
586 Jó
Construa um esconderijo e preencha-o com livros.
Edward Strange,
4
Construa um esconderijo e encha-o com comida enlatada. O programador mais preparado para o futuro é o programador que está vivo após o apocalipse.
Tom Anderson
11
Não aprender linguagens de programação ou codificação, mas principalmente aprender a programação e que levam muitos anos , quase dez, e você deve continuar a aprender toda a sua vida
Basile Starynkevitch

Respostas:

31

Se você quer ser à prova do futuro, o melhor conselho que posso dar não é se envolver em uma tecnologia.

Portanto, não aprenda APIs às cegas. Aprenda como eles são concebidos. Quais são as filosofias por trás da cena? Quais são suas vantagens e defeitos? Pense em software em geral, não em uma tecnologia específica.

Você também pode trabalhar na boa concepção do programa, ir para OOP e AOP é uma boa opção IMO. Mas não apenas entenda o mecanismo, trabalhe verdadeiramente com a filosofia por trás do mecanismo.

Não negligencie a ciência da computação em geral, como estruturas de dados e algoritmos, porque eles são conhecimentos entre tecnologias, sempre úteis.

Também vá para boas práticas. Você costuma ter dúzias de maneiras de fazer algo, mas a maioria é uma porcaria: propensas a erros, difíceis de manter, difíceis de entender posteriormente ou por outro programador, etc. . . Geralmente, o código é mais difícil de ler do que escrever. Portanto, aprenda a gastar um pouco mais de esforço na escrita para facilitar a leitura (porque você lerá mais o código do que escreve).

Aprenda técnicas eficazes para depurar (uso inteligente de log e depurador) e testar (como escrever código que pode ser facilmente testado em unidade e como automatizar esses testes).

Então, você precisará de um histórico geral de tecnologia. Estou falando de um conhecimento muito amplo, como o funcionamento de um processador (falta de cache ou previsão de ramificação é um bom começo), sobre sistemas UNIX, sobre protocolos de rede como IP, TCP e Ethernet, etc. . .

No final, aprenda a aprender. Se você souber aprender, poderá se adaptar.

Você precisará de algum conhecimento forte em tecnologias específicas para conseguir um emprego, mas elas estão desatualizadas muito rapidamente (pense no COBOL, por exemplo, ou na programação da Web no momento da guerra do IE / Netscape). Portanto, não confie neles para ser à prova de futuro. Eles serão essenciais para serem contratados, mas definitivamente não o que faz um ótimo programador e o que tornará suas habilidades duráveis ​​ao longo do tempo.

Edição: Se você está apenas começando, você definitivamente deve fazer alguma coisa. Qualquer coisa, mesmo. Um jogo como Tetris ou cobra é um bom começo e divertido. Se você não fizer as coisas, gastará muito tempo aprendendo e realmente não terá a experiência necessária para entender completamente o que aprendeu.

Vamos dar um exemplo com padrões de design. Os padrões de design são ótimos e você deve usá-los definitivamente. Mas, se forem usados ​​em excesso, eles tornarão seu código complicado e difícil de entender. Você terá que enfrentar o problema que um padrão de design resolve e perder algum tempo tentando resolvê-lo ou seus efeitos colaterais para entender completamente do que se trata o padrão de design. Os padrões de design devem ser usados ​​como pequenas refatorações ao longo do tempo, quando o código cresce. E você saberá quando um padrão de design é necessário quando o benefício for maior que a complexidade do código induzida por seu uso. Isso requer experiência.

Então, definitivamente, faça as coisas, elas aprendem com seus erros. Não posso insistir mais: FAÇA AS COISAS !

deadalnix
fonte
Bom ... Ótima resposta * e algo que eu entendo - eu entendo a necessidade de entender o tópico de 'programação' como um todo, não cada um dos tópicos que você mencionou. Não estou muito preocupado em encontrar um emprego em campo, pois tenho um bom currículo gerenciando um site de comércio eletrônico com o qual estou definitivamente feliz pelo previsível. Meu interesse em programação eu classificaria como um hobby sério, embora eu gostaria de usá-lo para aprimorar o meu e o de outros no trabalho.
Anônimo
Foi adicionada uma edição para tornar as coisas mais claras como um ponto de vista para iniciantes.
deadalnix
4

O que separa os bons programadores dos ruins é sua capacidade de programar em QUALQUER linguagem. Como outros pôsteres observaram, conhecer qualquer linguagem significativa orientada a objetos fornecerá as ferramentas para criar ótimos programas e demandar.

Além disso, se você ainda estiver na escola, tenha aulas de redação. Os melhores engenheiros e programadores também são os que comunicam bem suas idéias.

Depois de começar a trabalhar, a melhor coisa a fazer para evitar ser obsoleto é acompanhar as tendências atuais. Não tenha medo de deixar um emprego para outro, se eles não estiverem usando a tecnologia atual ou tiverem um processo terrível, etc. A pior coisa que você pode fazer por sua carreira é aceitar um emprego em que você trabalha com tecnologia antiga ou com processos fracos.

Bill Leeper
fonte
Aprecio que um bom conhecimento dos conceitos de programação é essencial para ser bom 'neste jogo', mas ter conhecimento da sintaxe real da linguagem / biblioteca padrão e do que ainda não se mostra essencial para a utilização de todos os recursos da linguagem (quando apropriado). Infelizmente, eu ainda não estou na escola, estou trabalhando - embora, como eu tenha dito em um comentário anterior, eu seja bem pago, então não estou muito preocupado com esse aspecto. Obrigado pela resposta. =)
Anônimo
4

A resposta do @deadalnix é boa. Eu acrescentaria três coisas:

  1. informações reutilizáveis ​​vêm do meio, não dos extremos. Minsky apresenta isso em detalhes em seu livro Society of Mind, então vou resumir da seguinte forma: a camada superior está muito próxima da solução específica para que grande parte seja aplicada ao próximo problema, enquanto a camada inferior está muito próxima da plataforma específica para que grande parte seja aplicada ao próximo problema. A camada intermediária é onde as informações reutilizáveis ​​são encontradas - os algoritmos, padrões, taxonomias, táticas, estratégias, técnicas, organizações, protocolos etc. geralmente úteis para resolver problemas semelhantes, independentemente do domínio (camada superior) ou plataforma (camada inferior) ) Nota: essas camadas não têm nada a ver com a arquitetura de três camadas, aqui estamos falando da semântica do problema-espaço / espaço da solução.
  2. você não saberá o que é comum / geral / reutilizável até ver pelo menos duas instâncias. Portanto, estude como o Windows funciona internamente, depois estude como o linux / unix funciona internamente e compare os dois. As coisas comuns são reutilizáveis. As coisas diferentes são decisões de design, que também podem resultar em insights reutilizáveis.
  3. para qualquer situação ou problema, pense em como você pode implementar a solução, compare sua solução de poltrona com a solução real e tente entender as possíveis razões por trás das diferenças.
Steven A. Lowe
fonte
Grandes adições!
deadalnix
2

Desde que você está no começo, eu diria que apenas aprendeu um idioma, não importa qual deles. A dificuldade não está na própria linguagem (sintaxe), mas na compreensão dos conceitos; e esses conceitos gerais de programação se aplicam a todas as linguagens de programação, portanto, aprender o segundo, o terceiro e o quarto (...) idioma será muito mais fácil.

Portanto, no começo, não pense muito em ser "à prova de futuro". No entanto, à medida que avança, tente se tornar proficiente em idiomas muito diferentes um do outro. Basicamente, (como você disse), você deve usar uma linguagem de baixo nível (-ish) como C / C ++, uma linguagem de programação de nível superior como Java e também uma linguagem de script (Python, Ruby, etc.). Se você quiser ir para coisas realmente avançadas, também deve conhecer Assembly.

Mas não se estresse demais com isso agora. Aprender a programar leva anos. Por enquanto, basta escolher uma linguagem como Java ou C # ou qualquer outra coisa e seguir em frente. :)

Paulo
fonte
Gosto do 'escolher um' e adoro essa atitude ... provavelmente vou adotá-lo. Sim ou não, para escolher uma linguagem de baixo nível (C), uma de alto nível (Java) e uma de script (Python) e aprender as três simultaneamente?
Anônimo
Você está apenas começando a programar? Então não aprenda mais de um idioma de cada vez, pois você ficará confuso. O que você precisa aprender no início são os conceitos, não os idiomas. Você só deve mudar para novos idiomas quando for necessário. Por exemplo, apenas recentemente senti a necessidade de entrar em linguagens de script, e foi por isso que decidi tornar meu jogo programável em Python.
Paulo
Eu não diria apenas começando - eu conheço html / css há anos (embora eles realmente não se qualifiquem / sejam irrelevantes) e venho construindo sites PHP / MySQL há alguns meses. Desenvolvimento Web com o qual posso me adaptar, é o desenvolvimento de software que estou abordando. Eu vou prestar atenção no que você está dizendo.
Anônimo
If you want to go into the really advanced stuff you must also know Assembly- Você pode fazer isso em qualquer nível, os desafios são diferentes.
sixtyfootersdude
1

Eu estaria certo ao pensar que ter um sólido conhecimento de C / C ++ para lógica de back-end / programação de baixo nível e similares, combinado com uma linguagem extremamente portátil como Java para GUI e assim por diante, seria uma boa base para o desenvolvimento de software isso será útil na maior quantidade de sistemas?

Estou falando de PCs, tablets, telefones.

Não. Nada disso vai ajudar.

Um conhecimento sólido de estruturas de dados e algoritmos - independente de qualquer linguagem de programação específica - é mais valioso do que "programação de baixo nível e similares".

Uma "linguagem extremamente portátil como Java" é tão portátil quanto C e não ajuda. A próxima grande novidade será tão diferente dessas linguagens que seu Java super-portátil será um passivo, não um ativo.

O Mac OS (desktop, tablet e telefone) é todo feito no Objetivo C. Esse pode ser o lugar para começar.

O Windows (desktop, mesa e telefone) é todo feito em C #. Esse pode ser o lugar para começar.

S.Lott
fonte
Eu estava comparando Java a C como sendo duas linguagens portáteis - com Java sendo de baixo e alto nível, respectivamente, o que é verdade ... Como você mesmo disse, Mac OS = Obj-C, Windows = C #, que é onde eu não quero me especializar em um e cortar minhas opções, ou ambos, e ser um 'mestre de ninguém' se você entender minha tendência. Aprecio o que você está dizendo, mas um conhecimento sólido de estruturas de dados e algoritmos sem o conhecimento de uma linguagem de programação é tão inútil quanto o conhecimento de uma linguagem de programação sem a última.
Anônimo
@ Chris Bridgett: Você está completamente enganando o ponto. Existem fundamentos universais e uma linguagem de programação também não. Primeiro, aprenda os fundamentos. Então, um idioma (ou sistema operacional) está simplesmente congelando. Os fundamentos são o bolo e são à prova de futuro.
S.Lott