Ainda não consigo descobrir como programar?


122

Eu li muitos livros para várias linguagens de programação, Java, Python, C, etc. Entendo e conheço todos os conceitos básicos das linguagens e entendo algoritmos e estruturas de dados. (Equivalente a, digamos, dois anos de aulas de ciência da computação)

MAS, ainda não consigo descobrir como escrever um programa que faça alguma coisa útil.

Todos os livros de programação mostram como escrever a linguagem, mas NÃO como usá-la! Os exemplos de programação são todos muito básicos, como criar um catálogo de cartas para uma biblioteca ou um jogo simples ou usar algoritmos, etc. Eles não mostram como desenvolver programas complexos que realmente fazem qualquer coisa útil!

Eu olhei para programas de código aberto no SourceForge , mas eles não fazem muito sentido para mim. Existem centenas de arquivos em cada programa e milhares de linhas de código. Mas como eu aprendo como fazer isso? Não há nada em qualquer livro que eu possa comprar na Amazon que me dê as ferramentas para escrever qualquer um desses programas.

Como você vai da Introdução à Java ou à Programação Python, ou à Linguagem de programação C, etc. até poder dizer, eu tenho uma idéia para o programa X? É assim que eu desenvolvo?

Parece que há muito mais envolvido na elaboração de um programa do que você pode aprender em um livro ou em uma aula. Eu sinto que há algo.

Como posso ser colocado no caminho certo?


52
Algumas pessoas simplesmente não são programadas. Somente você pode responder se um caminho alternativo o classificaria ou se é hora de tentar outra coisa. É improvável que você obtenha uma resposta que seja útil aqui.
duffymo

3
O que você consideraria "útil"?

7
@ Michael - Eu, por um lado, votei como Fora do Tópico, mudo para P.SE. Eu pensei que seria um lugar mais apropriado para uma discussão sobre programação como carreira e profissão.

12
@duffymo: E algumas pessoas não devem comentar as perguntas.
Davidk01

4
Acho que você está dando saltos demais. Ir dos exemplos do livro para os projetos completos do Sourceforge é vasto e assustador. Em vez disso, tente estender o que você já construiu. Adicione recursos, adicione GUIs, adicione recursos de rede; e logo, imagino que você terá seu próprio projeto no Sourceforge.
gablin

Respostas:


93

A criação de programas mais complexos vem com a experiência. Quando programai, pensei que estava indo bem, se tivesse mais de 25 linhas (e precisei usar a barra de rolagem). Agora escrevo centenas de linhas por dia, durante anos, no mesmo aplicativo de projeto.

Você pode achar esta página interessante "Aprenda a Programar em Dez Anos" http://norvig.com/21-days.html

BTW: É muito difícil iniciar um programa. Um escritor pode chamá-lo de "bloco de escritores". Em vez disso, sugiro que você comece a escrever o código e melhorá-lo. Não tenha medo de excluir seções grandes que não fazem o que você precisa. Comece novamente, desta vez, você escreverá com uma idéia melhor do que está fazendo. Comece de novo e você descobrirá que não precisava da metade das coisas que escreveu da última vez. Quando um autor escreve uma história, leva muito tempo, muitas redações e reescrições, etc. muitas resenhas e feedback e só termina quando precisa ser publicado (lançado)


13
+1 pelo que Bill disse e por discutir o "bloqueio de escritor".
David Weiser

caramba, eu venho fazendo isso há alguns anos (10 + -2) e ainda escrevo um monte de código ocasionalmente e acabo excluindo-o. Eu tive alguns "refatores" nos quais trabalhei por alguns dias e desfiz (via controle de fonte) porque era um retardador (para ser franco).
Ken Henderson

5
+1 para a analogia de escrever uma história. Meus programas ainda estão no estágio "Era uma vez ...".
Andy

4
Uma das coisas mais assustadoras sobre programação é um documento vazio. Depois de superar esse obstáculo, você fez um bom progresso.
gablin

1
bloqueio de escritor. você acertou lá!
abel 23/05

70

Sempre fiquei impressionado com projetos muito grandes também, como os que você encontra no SourceForge ou no GitHub. Eu me perguntava como alguém, ou mesmo uma equipe, poderia entender o que estava acontecendo em arquivos de 10 ou 100, com milhares e milhares de linhas de código.

Ninguém faz. Pelo menos inicialmente.

Projetos são coisas orgânicas. O que começa como uma idéia realmente simples, pode se expandir rapidamente em um enorme trabalho. Esta é, penso eu, a principal razão do desenvolvimento iterativo, em vez da abordagem clássica em cascata.

Pense em construir um carro. Embora pareça bastante simples do lado de fora, investigando até um pouco, você descobre que há um grande número de considerações, trocas e casos inocentes que precisam ser tratados.

Exemplo:

No caso de um projeto semi-grande, geralmente começa pequeno. "Eu quero construir um servidor de cache". Assim, você passa alguns dias se esquivando e chega a algo que funciona, mas pode ser melhorado drasticamente. Então você adiciona o conceito de encadeamento.

Então você enfrenta problemas de simultaneidade devido a esse encadeamento. Portanto, você corrige alterando para estruturas de dados simultâneas.

Agora, o processo abrandou. Portanto, você altera as estruturas de dados simultâneas para as regulares, mas fornece mecanismos de bloqueio para sincronização.

Tudo parece estar funcionando bem, exceto que os usuários começam a reclamar que as operações não são atômicas e os dados estão sendo corrompidos.

Então você adiciona algumas operações atômicas clássicas, como incrementar e salvar. Isso funciona e seus usuários estão felizes. Mas alguém abre um ticket perguntando se é possível fazer operações de lista.

Assim, você passa uma ou duas semanas construindo esse recurso. Nesse momento, um amigo decide ajudá-lo. Você trabalha nisso juntos, conclui e libera.

Dois ingressos abertos. Há um erro no processamento da lista e há alguns casos raros que estão em conflito.

Seu amigo trabalha no erro de processamento da lista, enquanto você enfrenta um impasse. Você percebe que uma reescrita bastante significativa nas operações atômicas precisa ocorrer.

... e por aí vai.

Isso parece bastante típico de como um projeto cresce. Mais ou menos 10 arquivos cresceram para 20 em algumas semanas. Foram adicionados novos recursos que não faziam parte do plano original. Adicionadas correções de erros complicadas que aumentam o código de maneira não natural.

Meu conselho:

Não fique sobrecarregado. Se você tiver uma ideia, implemente partes da funcionalidade. Se vale a pena prosseguir depois disso, adicione pouco a pouco. Deixe seu projeto crescer naturalmente.


Sim, é quase como se tratava de uma experiência pessoal ...
NickAldwin

@ Nick, todos não tivemos uma experiência semelhante com o projeto "X" com os recursos "Y" e "Z"? Eu tive dois projetos semelhantes no ano passado. Nenhum deles era Redis = P
Josh Smeaton

Isso descreve quase todos os programas que eu escrevi.
Tim Post

Assim vai. Kurt Vonnegut conhece programação de computadores
Zoot

1
Excelente exemplo, mas se pudesse ter começado um pouco menor, teria sido ainda melhor. Por exemplo, começando com a construção de algumas estruturas de dados, um código que forneça uma API para essas estruturas de dados, um código que use essa API para implementar a função de cache e, finalmente, uma GUI sobre ela. Voilá, você escreveu um servidor de cache!
gablin

28

Até o maior programa começa com uma ideia e é escrito uma linha de cada vez.

A melhor (talvez a única) maneira de aprender a escrever programas do mundo real é começar a fazê-lo. Ao encontrar problemas, você pesquisa na web ou pede aqui soluções para esses problemas. Eventualmente, você ganhará experiência e precisará perguntar com menos frequência.

No entanto, há algumas coisas que você deve saber desde o início:

  • Quase nenhum aplicativo grande é escrito completamente do zero atualmente. Você pode fazer muito mais em um tempo muito mais curto se usar bibliotecas e estruturas de alta qualidade existentes. Começar com isso geralmente parece muito frustrante e mais trabalhoso do que fazer você mesmo, mas isso quase nunca é verdade.
  • Pensar cuidadosamente sobre como você estrutura seu programa (como projetá-lo) é muito importante quando seus programas aumentam. Passe algum tempo com isso e leia alguns livros sobre design (eu recomendaria especialmente "Código Limpo") e engenharia de software, bem como sobre o básico técnico.

6
"A melhor (talvez a única) maneira de aprender a escrever programas do mundo real é começar a fazê-lo." Mais ou menos o que eu vou dizer. Você só pode ler e "entender o básico" tanto ... a borracha tem que pegar a estrada em algum lugar.
WernerCD

1
+1 na linha "Comece a fazer isso". Você não pode aprender a experiência de um livro.
riwalk

+1 por mencionar o livro "Código Limpo". Você sempre deve tornar seu código legível. Fácil de ler == fácil de entender == fácil de modificar
Igor Popov

15

O que você está falando é mais engenharia de software do que programação. É um pouco de arquitetura, um pouco de "melhores práticas" e "padrões de design", um pouco de trabalho com outras pessoas. Embora existam livros que podem ajudar, a maior parte vem da experiência. Ninguém começa a escrever, digamos, o Microsoft Word.

Pense em um programa grande e "real" que você gostaria de escrever. Agora pense nas várias peças que você precisa construir para que funcione da maneira que você deseja. Por exemplo, em um jogo moderno em primeira pessoa, você precisará de um mecanismo de gráficos 3D, IA sem personagem, um módulo de música / som, um mecanismo de física e um módulo de nível superior que aplique as regras do jogo (sabe o "mapa", como os vários personagens interagem etc.). E há a arte e o design de personagens e a música, nenhuma das quais é código, mas é necessária para a conclusão do jogo.

Agora: Qual desses você vai construir e quais vai conseguir em outro lugar? A maioria dos grandes projetos de software não é programada do zero. Talvez você use um mecanismo 3D já disponível e um módulo de música / som e programa apenas as coisas que tornam seu jogo único. OK, então você precisa descobrir quais módulos de terceiros você usará, o que envolverá fatores como custo, quais idiomas eles trabalham, quais recursos eles têm, como a API é projetada (ou seja, quão completa é a API) é, quão bem ele se ajusta ao seu estilo de programação pessoal, etc.). Talvez você escreva "provas de conceito" ou programas de teste usando um ou dois candidatos para os vários módulos de terceiros para garantir que eles façam tudo o que você precisa e sejam fáceis de usar.

Além disso, mesmo o código que você deseja escrever pode ser um trabalho muito grande para você concluir sozinho dentro do prazo que você tem em mente. Quantos outros programadores você precisa para trabalhar no projeto? Como você vai dividir o trabalho? Como os vários módulos serão projetados para que todos se encaixem, mesmo que tenham sido escritos por pessoas diferentes? Como vocês trabalharão no mesmo código-fonte sem eliminar as alterações uns dos outros (resposta: controle de versão, que é extremamente útil quando você está trabalhando sozinho, mas indispensável ao trabalhar com outros).

Depois de descobrir quais módulos você deseja escrever internamente, você executa o mesmo processo. Descobrir as partes de cada módulo, como elas devem se encaixar, e quais você escreverá e quais receberá em outro lugar. Continue quebrando as coisas até que cada peça seja pequena o suficiente para você se lembrar, para dizer: "Sim, eu poderia escrever isso!" E então faça isso. Ao fazer isso, você encontrará obstáculos imprevistos na forma como as várias partes do seu programa se encaixam. Isso será frustrante, mas são oportunidades para você aprender mais sobre o seu ofício e deve ser visto dessa maneira.

Inicialmente, você será capaz de manter apenas pequenas partes do seu programa - digamos, funções individuais - em sua mente e, portanto, terá que dividir bastante as coisas antes de começar a codificar. À medida que ganha experiência, você pensa em funções, em vez de precisar pensar em funções e começar a pensar em objetos. E então você estará pensando em objetos e pensando em módulos maiores. Finalmente, você estará pensando em módulos e pensando em programas inteiros, grandes e reais.

E então você descobrirá que ainda tem muito a aprender ... mas é assim. Se, como programador, você parar de aprender, ficará obsoleto e será substituído por um modelo mais novo.

De qualquer forma, não tenha medo, e não se preocupe se isso soa horrível ou impossível e você realmente não quer ser um programador, afinal. Não é para todos. Adoro música e sobremesas, posso tocar um pouco as teclas e cozinhar alguns pratos, mas não estou disposto a dedicar o tempo necessário para me tornar um ótimo músico ou um chef de cozinha.

Se você não quiser ser um programador escrevendo aplicativos grandes e reais para desktop, existem outros tipos de trabalhos de programação. Você pode se tornar um programador incorporado, por exemplo. Existem desafios definidos e interessantes envolvidos na criação de programas incorporados, e você está fazendo um trabalho útil, mas geralmente os programas são bem menores que os aplicativos de desktop. Ou você pode escrever aplicativos da web. Na Web, é fácil colar pequenos pedaços de funcionalidade, para que você possa escrever (por exemplo) um sistema de comentários na Web e seria útil mesmo que não seja um aplicativo Web inteiro. Também é fácil melhorar gradualmente as coisas na Web, para que você possa começar com (digamos) um cliente básico de email na Web e, com o tempo, evoluir para algo como o Gmail. (Mas não faça isso, porque você estará competindo com o Gmail.)

Se você não deseja ser um programador, mas ainda deseja trabalhar com computadores, possivelmente poderá entrar na área de TI ou em algum outro campo técnico. Nesses casos, conhecer o máximo de programação que você já faz é muito útil, porque seus colegas talvez nem tenham muito. Ou, você sabe, torne-se um músico se isso agrada, porque (como a maioria dos campos) hoje envolve computadores. Escreva pequenos programas que manipulam arquivos de áudio ou MIDI de várias maneiras inteligentes, tornando-o um músico melhor. Você descobrirá que quaisquer habilidades de programação que você tiver podem ser aplicadas em vários campos para melhorar seu trabalho.


Não concordo que os programas incorporados sejam geralmente menores que os aplicativos de desktop. Pode ter sido assim no passado, mas trabalhei em alguns produtos incorporados que levaram mais de 100 anos-homem de desenvolvimento e esses não foram considerados particularmente grandes.
Bart van Ingen Schenau

1
Eu acho que isso depende do que você quer dizer com "incorporado". Se você quer dizer algo como smartphones ou sistemas automotivos integrados, posso acreditar nos seus 100 homens-ano. Ainda existem muitos sistemas menores para trabalhar nesse espaço.
Kindall

+1 por começar a pensar em coisas menores e depois passar a pensar nas mesmas coisas e em coisas maiores.
gablin

1
Qual é o mal em competir com o GMail? Se algo que você escreveu sozinho pode realmente competir com algo lançado pelo Google, você pode se considerar um bom programador.
gablin

A principal razão é que considero que o GMail resolveu o correio da Web. Muitos programadores não acham muito interessante trabalhar em problemas que já foram resolvidos (e resolvidos bem) por outros. Provavelmente, você pode encontrar um problema que ainda não foi resolvido e muito mais divertido - e potencialmente trazê-lo ao mercado sem ter que competir com um gorila de 800 libras.
kindall

9

Você não descobrirá como programar, a menos que enfrente uma tarefa real. Nenhuma teoria jamais substituiria uma tarefa simples do mundo real. Antes de começar a trabalhar em cenários rw, eu estava lendo ingenuamente muitos livros, com todos os exemplos, mas quando enfrentei um problema real, não consegui reunir todo o meu conhecimento teórico para concluir a tarefa. Se você é iniciante, recomendo que você obtenha as tarefas de qualquer lugar que puder. Não pense que eles são inúteis, a menos que você os tenha resolvido. Como primeira etapa, tente resolver problemas de estrutura de dados, como classificar uma lista vinculada, executar DFS, BFS em árvores, gráficos etc. Não apenas irá melhorar suas habilidades de codificação, mas o mais importante, como também melhorar suas habilidades analíticas e de algo , que confia em mim é um conhecimento valioso. Então, quando você souber que pode usar ponteiros, recursão,

Linha de fundo. É tudo sobre prática. Apenas continue cavando e código, código, código.


7

Comece com jogos de computador, como todo mundo fez. Um bom jogo é tanto um desafio de programação quanto de design, precisa de uma reflexão cuidadosa sobre a estrutura interna e usa bibliotecas de sistema de maneiras que ensinam muito, mas não tendem a quebrar coisas e não exigem uma "boa razão com bom resultado" como o software "útil" real faz.

A regra geral é que, depois de escrever bastante material, algum tipo de iluminação inevitavelmente acontecerá.

Um bom ponto de partida (se você se sente como C) é http://gamedev.net/ , especialmente http://nehe.gamedev.net/ . Há também muitos outros bons pontos para começar: D


4
(Ah, e eu só percebi por que todo mundo começa com jogos brilhantes e coisas muito é motivador..)

10
todo mundo ? Reivindicação em negrito.

4
Eu não comecei com um jogo. Eu acho que além do complexo = P #
Josh Smeaton

4
Atualmente, a maioria das pessoas começa com um aplicativo da web, uma barreira muito menor à entrada (é apenas texto).
slebetman

4
Seu primeiro comentário foi provavelmente melhor do que sua resposta - coisas brilhantes e bonitas são motivadoras . É isso que importa.
Scorchio

6

Você está olhando para todo o enorme programa e parece impossível. Mas a coisa toda é composta de pequenos programas estúpidos, como os que você está dizendo "não fazem nada de útil".

O que você precisa é experiência em dividir enormes tarefas complexas em pequenas tarefas simples. Essa é a raiz de toda a programação. O resto é apenas semântica.


6

Assim como dirigir ou cozinhar, programar é algo que você aprende a fazer. A prática é insubstituível.

Se os exemplos de livros didáticos já são muito básicos para você, isso é ótimo! Hora de mudar para algo mais complexo - e você já pode descobrir alguns exercícios desafiadores para si mesmo.

Ou, se você tiver uma ideia específica em mente, divida-a em pedaços. Resolva um pequeno subconjunto do problema primeiro. Então expanda. Quando a integração do novo código ao código existente se torna difícil, você redesenha tudo.


5

Escreva um script de 200 linhas. Então comece a melhorar.

Featuritis você terá 100 arquivos de origem e várias centenas de KLOC em pouco tempo :)


5

"Eles não mostram como desenvolver programas complexos que realmente fazem qualquer coisa útil!"

Sem uma definição de "útil", não há realmente muito que possamos fazer para colocá-lo no caminho "certo".

Não sabemos como você está falhando ou o que está errado. Não podemos dizer em que faixa você está.

De alguma forma, você tem uma noção na cabeça que não está se comunicando.

Software - programação - tem tudo a ver com tirar uma idéia da sua cabeça em alguma linguagem (Python, Java, Inglês, qualquer que seja).

Um passo importante na programação (e perguntas) é definir seus termos. O que você quer dizer com "faça alguma coisa útil"? Seja muito claro, muito completo e muito preciso.


Votado, estou realmente interessado na resposta do OP neste tópico.
Scorchio

5

Eu recebo essa pergunta o tempo todo, por exemplo, como começar. É simples mesmo. Aqui está um passo a passo.

  1. Venha com uma ideia. Parece que você já tem isso.
  2. Simplifique sua ideia até o âmago da questão - algo que você acha que pode enfrentar
  3. Layout da interface do usuário em um pedaço de papel ou guardanapo, qualquer que seja.
  4. Experimente e faça o layout da interface do usuário em seu ambiente de desenvolvimento.
  5. Se você encontrar dificuldades, google, google, google, faça perguntas sobre o stackoverflow, use a porcaria de recursos da Internet para obter ajuda. Peça a amigos e colegas de trabalho que são programadores que o ajudem em situações específicas. Volte para a etapa 4.
  6. Comece a escrever a lógica do seu aplicativo. Se você tiver dificuldades, vá para a etapa anterior e tente novamente.
  7. Em breve, você terá algo funcionando em breve.

+1 para o fluxo de trabalho - ele deve estar funcionando, de alguma forma. Não sei dizer o quão importante é o segundo passo. Talvez seja esse o passo que irá decidir se você pode lidar com a tarefa ou não.
Scorchio

"Parece que você já tem isso." Eu contestaria isso. Se houvesse uma ideia, isso faria parte da pergunta.
S.Lott

Na verdade, imho, você deve começar escrevendo a lógica do aplicativo e depois adicionar a interface do usuário. É mais simples.
CaffGeek

Se você pensar em ferramenta / aplicativo, você usaria isso ainda melhor. Projetos descartados podem ser desmotivadores. Seja como for, comece pequeno e construa a partir daí. Eu sugeriria uma ferramenta de linha de comando.
Carlosfocker

1
@Chad eu discordo de você. Para os noobs, a lógica é abstrata, mas a interface do usuário é fácil de entender. O inverso vem com a experiência.
AngryHacker

4

Crie algo pequeno. Não se preocupe, seu programa será o 1000º em fazer isso.

Algumas ideias:

  • um relógio (primeiro digital, depois analógico),
  • criador automático de labirinto,
  • visualizador de estrutura de diretório,
  • lista de álbuns mp3,
  • etc.

Escolhendo a plataforma, as ferramentas fazem parte da tarefa.


Na verdade, eu concordo com você em princípio. O OP está perguntando sobre software útil. Uma lista de álbuns mp3 seria uma boa escolha. Um mp3 player básico seria melhor, pois ele experimentaria as dificuldades que um projeto enfrenta. Incluindo LOC.
Josh Smeaton

@ Josh, a decodificação de mp3 não é trivial para acertar um programador iniciante.

@ Thor, absolutamente não é trivial. Mas seria útil e ensinaria muito rapidamente como os programas podem se tornar tão grandes. Todas as nuances, correções de erros, casos extremos. Pode não ser apropriado neste caso específico, mas pode ser apropriado em geral. Ser capaz de usar você mesmo um software que você escreveu é uma grande coisa.
Josh Smeaton

@ Josh, eu ainda não acho que um decodificador de MP3 seja algo pequeno e adequado para esse fim.

3

Ok, vamos começar com a sua idéia para o programa X que faz algo útil e vamos dividir:

  • Use papel, software de mapeamento mental ou de diagramação para planejar o fluxo / fluxos lógicos do programa.

  • Como você está começando, escolha UM desses itens (de preferência perto do início) e divida-o ainda mais.

  • Escreva seu código para isso primeiro e use-o para desenvolver

O Programa X precisa abrir um arquivo, manipulá-lo e criar um arquivo de saída? Veja se você pode abrir e repetir o arquivo como seu primeiro passo. Você quer uma boa interface de usuário? Crie um que possa executar o seu programa de eco de arquivo, etc. Você não apenas criará o código que poderá usar passo a passo em seu programa complexo, mas também desenvolverá o seu conhecimento de idioma à medida que precisar pesquisar e procurar informações.

Como diz o ditado - o Gnome não foi construído em um dia :-)


3

(já respondido acima nos comentários. Foi sugerido que você o enviasse como resposta depois que a pergunta fosse reaberta.)

Você começa com um problema - algo que deseja resolver - não importa o quão complexo você pense que é. Então você pega esse problema e o anota e começa a dividi-lo em problemas menores. Em seguida, você divide esses problemas menores etc. até ter algo primitivo que já sabe como resolver ou pode fazê-lo com algum esforço. Você começa a codificar cada uma dessas peças e as organiza em diferentes funções ou classes, etc.

Então você trabalha no próximo subproblema. Enquanto você trabalha em cada problema, pode escrever pequenos casos de teste e até ver seu progresso se concretizando. Sempre haverá desafios ao longo do caminho, mas em nenhum momento será visto como algo colossal demais para ser abordado (o que parece estar lidando agora). Isso é verdade para a programação e muitos dos desafios da vida. A chave é acabar com isso.

Quanto ao que fazer - a ideia. Você pode tentar inventar algo novo, mas também pode usar algo pelo qual possa ter uma paixão e já existe, mas apenas torná-lo melhor ou até apenas diferente. Atualmente, estou escrevendo um aplicativo de afinador de violão para Android no meu tempo livre. Eu sei que já existem muitos outros aplicativos de afinador de violão, mas achei que esse seria um projeto divertido e desafiador, então aceitei. No começo, parecia quase impossível, mas depois que eu quebrei o problema em etapas menores, ele realmente se juntou bem. Divida e conquiste e seja persistente com seus objetivos.


3

Uma das coisas mais difíceis de fazer quando você é iniciante é definir metas realistas para o que um exercício "como posso melhorar" deve conter no seu nível atual.

Por isso, sugiro que você escolha praticar a resolução de pequenos exercícios, porque a capacidade de concluir um programa de acordo com uma determinada especificação é algo muito valioso para todos que programam para viver.

Eu sugiro que você dê uma olhada em http://projecteuler.net/, que possui muitos exercícios e um sistema automatizado de "verificação de respostas", permitindo que você trabalhe no seu próprio ritmo. Os exercícios são bem redigidos, mas podem exigir que você pense. Alguns podem até exigir que você pense muito, mas mesmo não resolvendo isso, ensinará algo útil.

A redação completa do problema 1 é:

Se listarmos todos os números naturais abaixo de 10 que são múltiplos de 3 ou 5, obtemos 3, 5, 6 e 9. A soma desses múltiplos é 23.

Encontre a soma de todos os múltiplos de 3 ou 5 abaixo de 1000.

Você acha que poderia resolver isso? Então faça!


3

Você precisa de experiência no mundo real !! . Nenhum livro pode te ensinar isso!

Você precisa aprender a ler o código de outros, como mantê-lo, como odiá-los (tanto o código quanto o codificador), como melhorá-lo, como pensar que pode fazê-lo melhor e, alguns meses depois, gritar em voz alta : matarei quem já escreveu esse trecho de código !!! Apenas para descobrir no controle da versão de origem, era você!

Você precisa entender que os livros são muito específicos e, às vezes, para pessoas que já sabem como desenvolver software.

Então, eu sugiro que você encontre algum trabalho de programação. Se necessário, solicite o nível de entrada mais básico. Provavelmente você não ganhará o que acha que merece, mas use alguns meses para aprender como o software é desenvolvido no mundo real (e nem sempre é tão perfeito e com todas as belas práticas recomendadas que lemos na web , muitas vezes, a qualidade do código é muito baixa, dependendo de onde você trabalha, mas isso faz parte da experiência)

Continue lendo seus livros, você descobrirá que todo ano você entende um pouco mais (ou diferentemente) o mesmo tópico, porque você pode vê-lo saber com o copo da experiência.

Se você conseguir um emprego com desenvolvedores talentosos, muito melhor. Aprenda com eles, não tenha medo de cometer erros.

Até que você tenha que corrigir seu primeiro bug urgente de produção ao vivo, você não saberá o que é um bug de software!

:)


2

Experimente um projeto de código aberto, veja se você pode se encaixar. Comece fazendo o download do código-fonte e veja se você pode obter alguns tíquetes


15
Programadores iniciantes não devem tentar ingressar em um projeto de código aberto; você vai simplesmente ficar no caminho. Projetos de código aberto não existem para orientar iniciantes.

uma alternativa para se envolver diretamente é dividir a fonte de um projeto e tentar corrigir tickets em sua própria filial e simplesmente deixar por isso mesmo. Os valores de leitura de código escritos e revisados ​​por várias pessoas, estruturas de projeto bem organizadas e que podem servir como modelos para suas próprias criações e a compreensão de como o processo de colaboração funciona são numerosos. Basta observar as partes públicas e mexer com o código em particular.
Jellyfishtree.

3
@jellyfishtree, se você não pode programar isso pode ser um pouco ambicioso.

@ Thorbjorn definitivamente, mas é algo que eu gostaria de ter feito mais quando comecei. Como em tudo, acho que você aprende muito apenas por osmose e mergulhando de cabeça primeiro. No mínimo, você terá uma melhor medida do que está por aí que não conhece / entende - algo muito mais valioso quando você está começando e deseja saber onde definir seus objetivos e para o que trabalhar.
jellyfishtree

@jellyfish, com certeza, e estou certo de que é um bom passo a dar, mas ainda não neste caso.

2

Quando quero aprender um novo idioma, geralmente tento implementar algum gráfico fractal. Dessa forma, você terá um feedback imediato sobre se funciona e é muito gratificante. E há muitas maneiras de melhorar um fractal. A implementação ingênua de mandelbrot é lenta como o inferno.

Não é muito útil, mas você aprende muito e é bonito de se olhar.


Eu gosto disso - uma maneira bastante poética de aprender um novo idioma. Mas não sei se devemos recomendar isso para iniciantes: D
Scorchio

2

A programação é sobre solução de problemas e comunicação, não escrevendo muito código. O código é apenas uma necessidade, você geralmente deve tentar escrever menos código, não mais.

Se você não sabe por onde começar, talvez não tenha problemas!

Veja o Linux e outros sistemas semelhantes ao Unix: todos eles consistem em muitos aplicativos pequenos que fazem apenas uma coisa, mas fazem bem .

Quando eu precisava de um script para encontrar 10 arquivos maiores em uma pasta no meu computador, eu não estava lendo livros. Acabei de pesquisar no Google e usei uma das soluções existentes. Eu escrevi algum código? - Não. O problema está resolvido? - Sim. Este programa de uma linha é útil? - Claro que sim.

Programas com milhares de linhas de código geralmente são escritos por mais de um programador. Você não será capaz de escrever sistemas operacionais inteiros sozinho e não precisará. Eles também costumam usar truques como controle de versão e teste de unidade .


Por favor, não mencione o controle de versão e o teste de unidade como "truques". Fazer backups do seu trabalho e trabalhar com isso é uma necessidade. O controle de versão apenas ajuda a manter a sanidade. O mesmo acontece com o teste de unidade: todos que escreveram uma única linha de código sabem que alguns testes devem ser feitos, por que não mantê-lo organizado?
Scorchio

@ Scorchio, eu apenas quis dizer que o uso do controle de versão e do teste de unidade está lhe dando vantagem sobre as pessoas que não os usam (o suficiente). Especialmente quando se lida com grandes projetos.
Kolobos

2

Dividir e conquistar.

É tão simples ou difícil quanto isso.


2

Quando comecei a programar, adorei jogos de computador. Então eu comecei a escrever meus próprios jogos, assim que eu tinha ferramentas em mãos para fazer isso.

Naturalmente, meu primeiro jogo foi uma aventura de texto. Da mesma forma, você pode começar com um questionário ou algo assim, ou algum tipo de jogo de adivinhação.

Além disso, você pode começar com algo, como uma máquina caça-níqueis (você realmente não precisa de animações ou até de figuras. Basta usar A = maçã, L = limão, S = iniciar, P = Ameixa etc.).

Isso ensinará o básico de como lidar com algumas informações do usuário, mantendo o estado do jogo e gerando resultados de acordo.

Eu segui esta estrada bastante longe. Eu aprendi progressivamente, como ler o estado do teclado ou do mouse, como usar o código gráfico. Aprendi mais sobre o próprio idioma (comecei com o PASCAL) e usei isso para aprimorar meus jogos existentes ou apenas comecei algo novo.

Eu acho que os jogos são ótimos para aprender programação. Mesmo com pouca experiência, você pode criar pequenas coisas que proporcionam pequenos momentos de orgulho. Porque você cria algo, isso é divertido. Construir aplicativos reais é inútil, porque é preciso muito trabalho para criar algo, que é realmente útil, embora seja surpreendentemente simples criar um jogo pequeno, que se torne viciante.

Você pode realmente usar uma linguagem educacional (no meu caso, era PASCAL e, retrospectivamente, acho que provou ser uma boa escolha). Muitos deles visam especificamente criar jogos e coisas do tipo.

Criar aplicativos é mais do que apenas criar algoritmos. Você precisa criar recursos, organizar e estruturar seu código em diferentes camadas e módulos. Ao contrário dos problemas bastante "atômicos" que você enfrenta na universidade, às vezes os aplicativos são melhor desenvolvidos de maneira incremental. Você começa com algo e adiciona coisas a ele. Assim, já tendo algo para começar (como faria em alguns dos idiomas listados no artigo da Wikipedia), você economiza muita frustração e começa a criar algo imediatamente. (Um colega meu começou a programar escrevendo dois mods de terremoto). Em algum momento, você encontrará as limitações dessas ferramentas fáceis de usar, mas até então, terá muito mais insight e entendimento. Provavelmente,


2

Na faculdade, havia uma classe chamada estágio de programação que basicamente ensinava essa rampa. No início, você recebia uma interface do usuário para um aplicativo básico de compras e precisava codificar o back-end; o último mês foi o Tetris do zero. Eu acho que cerca de 50% dos novos alunos (sem retomar a aula) falharam, porque subir de pequeno para grande é incrivelmente difícil.

Sugiro um ou mais dos seguintes procedimentos:

  • Baixe um projeto de código aberto e adicione algo. Não precisa ser útil nem bom, mas você precisará observar a estrutura, o que lhe dará uma ideia do tamanho do projeto.

  • Basta criar seu projeto final em papel, com setas para dependências. Se você está criando cobra, você pode ter cabeça de cobra, cauda de cobra, comida, espaço vazio, parede, quadro, direção atual, etc. Pode ajudá-lo a perceber se o seu projeto é muito maior do que você pensa.

  • Pegue um projeto básico e torne-o cada vez maior. Você provavelmente fará muita refatoração e esperançosamente aprenderá como criar projetos menores aos quais pode ser facilmente adicionado.

  • Se você conhece alguém experiente, conte a sua idéia para um projeto e peça que ele escreva suas aulas + alguns métodos importantes, provavelmente levaria uma hora. Dessa forma, você pode simplesmente preencher os métodos e sempre saber o que precisa fazer a seguir.

Finalmente, faça o que fizer, você provavelmente deve usar um padrão básico de design MVC (Model, View, Controller). Sem entrar em muitos detalhes, coloque sua visualização (UI) em mais de uma classe, seu controlador (entrada, saída, etc.) em mais de uma classe e seu modelo (lógica, dados, basicamente tudo o resto) em várias classes. É uma maneira fácil de obter organização básica.

Lembre-se, este passo é difícil. É verdade que algumas pessoas simplesmente não podem programar, mas você provavelmente só está preso nesse estágio. Boa sorte!


2

Primeiro, você já está fazendo os pré-requisitos, tendo aulas, lendo material de referência, analisando projetos de código aberto e ficando curioso com perguntas. Enfatizo isso porque eu pessoalmente encontrei perguntas semelhantes antes que a pessoa fizesse algum trabalho de perna da parte deles (especificamente, indivíduos que contornam as aulas e esperam tomar atalhos). Agora, penso em quando tínhamos laboratórios sobre máquinas de Turing e como na época eu sentia que não era uma programação real. Essas são as experiências que você terá que qualquer pessoa que esteja tomando atalhos está pulando.

  • Inscreva-se nos projetos dos alunos. Eu me envolvi com (CSUA) um grupo de estudantes afins para construir um jogo para o estande de carnaval no meu último ano. Se você continuar gostando e achar que deseja expandir seu envolvimento, aproveite realmente os recursos. Descubra projetos, converse com seus colegas de classe, professores e faça um estágio.

  • Sente-se com um programador experiente. Houve cerca de três vezes na minha história quando assisti a outro programa de pessoas que foi verdadeiramente inspirador. Para eles, eles estavam apenas escrevendo código e pensando em voz alta. Sem exagero, eu senti como se tivesse absorvido mais por ouvi-los do que por anos sozinho. Se você encontrar mais, é muito mais rico. Temos a sorte de estar em uma época em que podemos assistir a vídeos, inspecionar repositórios de código-fonte completos e pesquisar instantaneamente uma enorme loja online de conhecimento. Não substitui a experiência pessoal, mas, na ausência de um mentor, é uma melhoria dramática em relação ao material tradicional. Analisar o código bruto por outros, por si só, pode não levar a nada. Você quer ter algo em mente e um bom depurador para entrar na lógica. Um dos meus melhores momentos foi fazer um mod Quake e não era o mod em si que tinha algo memorável. Estava vendo a lógica do jogo de Carmack. O mod foi apenas um motivo para eu mergulhar.

  • Pratique explicar e responder a perguntas feitas pelo seu parceiro de laboratório. Ofereça-se para ajudar a ensinar. Talvez forme um grupo de estudo e exija que cada membro se torne um especialista em um tópico da classe. Em seguida, grelhe essa pessoa e peça para grelhar você. Quando você é forçado a responder perguntas, será obrigado a aprender as respostas sozinho. Quando você pode explicar claramente os conceitos a outras pessoas, enriqueceu seu próprio entendimento a ponto de poder transmiti-lo para fora de um livro e de seus pensamentos.

  • Por fim, não tenha medo de aprender da maneira mais difícil, suja as mãos, cometa erros. Isso também pode ser chamado de experiência. Como um exemplo mais prático em relação à sua pergunta sobre projetos com base de código pesada e grande número de arquivos, faça este exercício: use um único arquivo para o seu trabalho. Realmente não estou brincando. Essa mesma pergunta surgiu na minha empresa atual e na anterior. Aqui outro desenvolvedor observou que eu prefiro manter um arquivo para cada classe. Isso lhe parecia estranho e, em um assunto relacionado, ele também não gostava de aulas parciais. Portanto, uma maneira de você ter uma noção de quando ou onde é apropriado dividir a lógica em arquivos separados seria começar com apenas um único arquivo. Depois de praticar a regra de um arquivo em vários projetos, com esperança de aumentar a complexidade, você pode executar um projeto no qual possui tantas classes no arquivo que acha difícil ler ou devido ao controle de versão se torna difícil colaborar. Neste ponto, você deseja criar arquivos separados para agrupar classes diferentes. De acordo com sua preferência, você pode decidir desde cedo que gosta de todas as classes de dados em um arquivo. Por outro lado, talvez mais tarde, você pode decidir que gosta de arquivos separados, mesmo entre as classes de dados como um grupo.


+1 boa resposta. É preciso dizer que sentar com um programador experiente também pode ser intimidador quando você está começando para novas pessoas. Acelerando através de coisas que levariam uma quantidade substancial de tempo. Mas, dependendo do tipo de pessoa em que você é, essas coisas podem ser um fator motivador e acender um pouco desse fogo em sua barriga. Empurrando você para querer chutar asno.
Terrance

1

Você não precisa ter uma ótima idéia para começar a programar alguma coisa. Eu começaria da parte fácil. Como, um programa que você já usa. Tente fazer algo que você já sabe como funciona. Enfrenta seus problemas, então você aprenderá mais rapidamente. Depois de ter mais experiência, você começará a ter boas idéias de programas para facilitar sua vida durante a programação ou apenas um bom programa para fazer algo que você nunca pensou antes. Venho programando Java há quase um ano e outras linguagens há alguns anos. Levou tempo para começar a fazer o que eu realmente queria fazer. Eu apenas comecei a fazer minhas próprias coisas. Graças ao StackOverflow. Eu não sabia disso antes.


1

Portanto, há uma tonelada de respostas, então me perdoe se eu repetir muito do que já foi dito, mas aqui estão meus 2 centavos.

Primeiro escolha uma ideia. Qualquer idéia vai ficar bem, algo simples provavelmente seria melhor do que grande. Os projetos tendem a crescer em seu escopo muito rapidamente (alguns chamam de recurso de fluência).

Em seguida, faça um esqueleto para o projeto. Isso exigirá um pouco de conhecimento de arquitetura e design, e você provavelmente errará nas primeiras dez vezes em que experimentou - tentei. Simplesmente crie uma estrutura de arquivos decente e talvez um pequeno esqueleto de código que mostre as partes importantes do sistema.

Salve o esqueleto no seu VCS (pegue seu veneno com este e segure-o quando isso levar a uma guerra santa). Depois de começar a usar o VCS, usá-lo constantemente para pequenas alterações se torna uma segunda natureza, mas certifique-se de começar.

Agora escolha um recurso pequeno, mas importante para o sistema e faça-o. Não se preocupe em garantir que você tenha tudo encapsulado perfeitamente e que ele tenha o "melhor" design (que evoluirá com o sistema). Basta conseguir algo que funcione. A realização de alguns testes de unidade também ajudará a garantir que você saiba o que aconteceu quando algo quebra, se você executar os testes regularmente.

Construa seu sistema. Esse também seria um bom momento para obter um sistema de compilação automatizado e integração contínua. Se você não sabe o que são, aprenda e tente, ou apenas continue por seu próprio risco; de qualquer maneira, continue trabalhando.

Agora escolha outro recurso e repita e repita e repita.

Quando achar que funciona bem, mostre a um amigo. O amigo não precisa saber como programar ou mesmo saber o que o programa faz. Um você se sentirá bem em mostrar para alguém e dois o ajudará a saber exatamente o que o sistema faz.

Se você chegar ao ponto em que está muito confiante com o que fez, libere-o on-line e tente obter feedback. Um hub de repositório ou o subreditador de programadores pode fornecer algumas críticas construtivas. Tente encontrar um professor de CS / SE e peça a ele que olhe para ele. Talvez pergunte a um programador profissional. Basta ter outra opinião de programadores.

Depois de terminar (ou provavelmente antes), você perceberá que o código que você escreveu inicialmente é muito pior do que o que você criou recentemente. Isso é perfeitamente natural e acontece com todos nós. Agora você precisa encontrar um novo projeto e aprender algo novo - talvez uma nova estratégia de teste ou como usar a Arquitetura Orientada a Serviços.


1

Algo que pode ajudar é pensar em um problema simples que você tem no dia a dia em que algo que você pode fazer com lápis e papel pode ser substituído por um programa.

Isso gera um problema relativamente simples com uma solução bastante conhecida que precisa apenas de um nível de automação. Lembre-se de que esse não precisa ser o próximo MS Word / WordPad / NotePad; apenas algo que resolve seu problema (simples).

Por exemplo, um problema que eu continuo reimplementando ao trabalhar com um novo idioma é um aplicativo simples de cronometrista. O aplicativo é usado para rastrear horas faturáveis ​​para diferentes projetos durante um dia. Um programa bastante simples, com muitas dicas, como lidar com reinicializações no meio do dia ou como adicionar / remover itens da sua lista.


1

Eu acho que parte do problema é que, quando você lê livros de programação, eles apenas ensinam a linguagem. Eles não mencionam que, para programar quase tudo, você precisa ter acesso à programação de BIBLIOTECAS e SDKS, etc. Apenas conhecer o idioma infelizmente não é suficiente.


1

Eu acho que o seu problema vem de: 1. o conflito entre a teoria e a prática, e também que ... 2. ... você deve perceber que seu código será executado pelo código de outros. 3. você não pode codificar algo se não tiver idéia do que poderia fazer. 4. Você conhece metade da dificuldade

  1. Conhecer um idioma pela teoria não significa que você "fale": é a diferença entre ler inglês e falar. Além disso, o grande número de ferramentas disponíveis para compilar, vincular e editar um código-fonte fará sua cabeça girar.

  2. ao aprender a programar, principalmente se o tempo em que um terminal for usado para entrada / saída de texto, porque essa é a maneira mais simples de lidar com a programação. De fato, os programadores usam bibliotecas (como Qt), frameworks (django, eu acho) e outros códigos de atalho para serem produtivos. É claro que se você acha que pode escrever sua própria roda, não a reinvente e leia livros sobre design de compilador e design de kernel: há muito a aprender neles: talvez você sinta que é estúpido para aplicativos que não exigem muito de tecnicidade.

  3. Invente algo ! Claro que você pode criar um editor de texto, um jogo etc. O problema é que você não o fará se não encontrar motivo para isso: esses programas serão inúteis para você se tudo o que você pensa já tiver sido feito . Pessoalmente, ainda sonho em poder codificar um protocolo p2p descentralizado do tipo facebook com bate-papo, mensagens offline etc. tudo em um, para que possa ser usado com dispositivos sem fio incorporados. Internet oferece muitas possibilidades, não se esqueça de pensar nisso.

  4. De fato, é necessário praticar a teoria, mas isso não é tudo: algoritmos e técnicas não fazem parte da teoria da programação, existem muitos paradigmas e outra maneira "padrão" de fazer seu código: padrões de design, listas vinculadas, etc etc.


1

Talvez você possa escolher uma linguagem de script para começar. Comecei a programar com a linguagem C. Na minha opinião, é fácil começar a linguagem C, mas é necessário muito mais tempo para conhecer o algoritmo e algo sobre o sistema operacional. E toda vez que faço exercícios é simplesmente com uma GUI do DOS, que me deixa deprimido.

E depois escolhi uma linguagem de script chamada ActionScript para iniciar. A linguagem de script é uma linguagem orientada a objetos e pode controlar o comportamento de um filme em Flash. A linguagem de script é fácil para realizar algum trabalho próximo ao domínio do problema , assim como trace("HelloWorld")no ActionScript para gerar uma string. E possui um IDE poderoso para permitir que você verifique se o seu programa está indo bem.

Em uma palavra, se você deseja iniciar a programação rapidamente , uma linguagem de script pode ser uma boa opção :-)


1

Escreva uma especificação. O que você quer que seu programa faça? As telas (se for um programa baseado na interface do usuário), a lógica, a entrada / saída, etc. Mantenha o escopo limitado ao que você pode fazer em um período de tempo razoável (uma semana? Um mês?).

Então construa. Atenha-se à especificação, faça-a funcionar de acordo com o que a especificação precisa. Claro que você encontrará distrações, com certeza precisará fazer alguma pesquisa porque nunca enfrentou um problema específico antes, mas criará algo que deseja construir. Isso é diferente de criar algo que você simplesmente 'pode' construir.

Quando terminar, refatorar seu código, tente torná-lo mais eficiente. Então, se você acha que seu programa ainda não terminou, reinicie, melhore a especificação, melhore o código e continue fazendo isso.

Lembre-se de que a maioria dos softwares comerciais resolve uma necessidade. É muito importante definir a necessidade e a solução para preenchê-la antes de realmente resolver o problema. E conforme a necessidade cresce cada vez mais, seu software também cresce com o tempo!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.