Capaz de ler o Código, mas esforçando-se para escrevê-lo [fechado]

22

Eu fiz meu primeiro exame de programação recentemente ... e bem, eu quase o fracassei. Não fez muito bem. Eu só tenho a mim mesma que, fora do período da faculdade, praticamente não fiz nada.

Agora tenho outro próximo do verão e não vou permitir que isso aconteça novamente. Há algumas semanas que eu tenho lido, lido e lido um pouco mais. Continuo revisando as coisas mais antigas que perdi e as mais recentes que estamos fazendo. Então, obviamente, eu posso notar uma enorme diferença na minha compreensão do idioma. No entanto, é isso. Eu posso ler o código e agora tenho uma idéia do que está acontecendo no código ... mas quando se trata de escrever o código sozinho, sou apenas ignorante. É como se eu nunca soubesse qual abordagem adotar e nunca possa realmente compreender completamente as perguntas.

Eu leio bastante (lendo cerca de 5 a 6 horas no mês passado) todos os dias ... Mas, ao abrir meu IDE, sempre me sinto condenado, é realmente desmotivador. Especialmente porque tenho conhecimento de nós, listas, listas de matrizes, interfaces etc., além de lê-los em uma página sobre isso. Eu posso apontar exatamente tudo o que está acontecendo em um programa, para anotar um código de pré-amostra que acho bom ... mas escrever meu próprio código é outra história.

user3339333
fonte
8
Ajuda a ter um objetivo. Se, por exemplo, você quisesse criar um jogo, poderia baixar uma estrutura ou biblioteca e seguir os tutoriais introdutórios. Se algo menos complexo, você pode começar procurando exemplos desses programas, desconstruí-los e modificá-los para atender às suas necessidades ou interesses.
Kai Qing
10
Leia menos e programe mais. Encontre projetos simples e faça-os. Não se preocupe em fazê-lo perfeitamente, basta levá-los a fazer o que deveriam estar fazendo. Então pense em como você pode fazer melhor.
Philipp
1
Há algumas semanas que eu tenho lido, lido e lido um pouco mais. - A leitura é um começo, na verdade, a codificação é muito melhor. Tente escrever um programa em psuedocode no papel e depois traduza-o para java. É um pouco mais fácil se você já sabe o que precisa fazer.
Andreas
1
Achei este artigo muito interessante enquanto tentava descobrir como codificar e ensinar aos outros o básico da codificação: The Camel has Two Humps . Algumas pessoas simplesmente entendem imediatamente, outras nunca - mas a maioria de nós pode aprender. Se você pode ler e entender o código, você está fora de um grande começo :)
brichins

Respostas:

45

Você aprende a escrever programas escrevendo programas.

Mas você precisa começar pequeno, cara.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}  

A partir daí, comece a construir ...

public class HelloWorld {
    static String test = "This is a test";

    public static void main(String[] args) {
        System.out.println(test);
    }
}

e depois...

public class HelloClass {
    String test;

    public void setTest(String str)
    {
        test = str;
    }  

    public String getTest()
    {
        return test;
    }
}

public class HelloWorld {
    HelloClass myHelloInstance;

    public static void main(String[] args) {
        myHelloInstance = new HelloClass();
        myHelloInstance.SetTest("Hello World.")
        String myResult = myHelloInstance.getTest();
        System.out.println(myResult);
    }
}  

... e assim por diante. Depois de entender o básico de como os objetos funcionam, será muito mais fácil escrever programas maiores.

Robert Harvey
fonte
8
Seu segundo exemplo deve falhar na compilação porque você está acessando uma variável não estática em um contexto estático.
Brandon
34
@Brandon: então é um exercício de depuração agradável e precoce.
precisa
É assim que todo mundo aprende a codificar, eu acho, ou deveria aprender a codificar.
27414 mrudult
1
Abrace seu Nike interno e "apenas faça".
NotMe 27/02
15

Ótima pergunta! É importante perceber que você tem várias curvas de aprendizado para escalar. Apenas para que você não pense que está apenas aprendendo uma linguagem de programação. Você está fazendo um pouco mais do que isso.

Você está aprendendo sobre ...

  1. As ferramentas que você usa para escrever código. Seu ambiente de desenvolvimento, o editor, o depurador, seu compilador. Existem manuais e arquivos de ajuda para todas essas ferramentas, verifique-os. Quanto mais você conhece as ferramentas, mais fácil é criar código.
  2. A sintaxe da linguagem de programação em estudo, a partir de sua postagem, parece que você está colocando muito foco aqui e certamente precisa.
  3. Habilidades de design da solução . Como reunir um pedaço de código útil e sustentável. Este é o músculo que você precisa construir. Como outros pôsteres apontaram, você aprende fazendo.

Eu suspeito que é o ponto três onde você está lutando. Você está aprendendo a dizer coisas no código (sintaxe), mas realmente está nos perguntando o que devo dizer no código. Existe uma maneira certa e uma maneira errada de fazer as coisas?

Eu sugeriria que você aceitasse um desafio. Dê uma olhada no seguinte como exercício.

http://en.wikipedia.org/wiki/Eight_queens_puzzle

Agora, este é um desafio difícil. Você precisa colocar oito rainhas em um tabuleiro de xadrez para que cada uma delas fique a salvo uma da outra.

Portanto, como aluno, isso pode ser um alcance excessivo, no entanto, você pode analisar esse problema e usá-lo para aprender a escrever código.

Aqui está uma estratégia para experimentar ...

  1. Repita o problema para que seja muito mais simples que o problema declarado a ser resolvido . Esqueça as oito rainhas. Concentre-se em apenas um. Aprenda a escrever o código para representar um tabuleiro de xadrez na memória, colocar uma única rainha nesse tabuleiro e exibi-lo ao usuário na tela em apenas texto.

  2. Depois de fazer uma facada na Etapa 1. Coloque duas rainhas de forma que elas sejam seguras.

  3. Por fim, tente colocar mais de duas rainhas no tabuleiro para que elas sejam todas seguras.

As etapas acima são uma reviravolta em uma estratégia de design chamada Refinamento por etapas. É um pouco antiquado em termos de design, mas o levará de uma tela em branco para um código interessante em pouco tempo.

Existem outras estratégias de design e implementação: Design Orientado a Testes, Design Orientado a Objetos e Padrões de Design, para citar alguns.

Com o tempo, você adicionará essas estratégias ao arsenal e as usará como e quando necessário. Quanto mais estratégias de design você estuda e pratica, mais fácil se tornará.

Que a fonte esteja com você.

Roubar
fonte
Qual a diferença entre OO Design e Design Patterns? Ou você está colocando os dois juntos?
Pierre Arlaud 27/02
1
O refinamento por etapas e o OO também não são mutuamente exclusivos, mas você provavelmente sabe disso. Que a fonte esteja com você. 1
Gusdor 27/02
15

Prefácio Rápido

Aprenda fazendo: conhecimento versus know-how

Há uma enorme diferença de conhecimento e know-how. É um erro comum que os novos alunos pensem que, como eles podem "entender" um programa enquanto o lêem, eles realmente entendem o motivo pelo qual o programa está sendo escrito da maneira que é.

E a única maneira de chegar a essa segunda parte é praticar. Sente-se, abra um editor de texto, uma linha de comando e vá direto ao assunto.

Programação no Small

É provável (e esperado) que, neste estágio, sua capacidade de compreender como vários componentes de software complexos interagem entre si seja limitada. E é realmente uma coisa boa, pois força você a começar do básico. Não pule a arma e mova-se no ritmo certo: comece com pequenos exercícios para pequenas tarefas.

Para ser sincero, nunca me convenci de que começar a aprender programação com Java é o caminho a seguir (eu costumava ensinar programação para morar na universidade e ainda ocasionalmente fazer aulas particulares). É complexo demais para você começar, e a maioria dos livros sobre Java parecerá bastante assustadora. No entanto, certamente isso pode ser feito (pelo menos em algumas áreas desse conhecimento global que esperamos dos programadores), desde que você se restrinja a aprender passo a passo.

Livros

Como você define Java, e se precisar de um livro decente sobre Java, recomendo:

  • Pensando em Java . Tudo bem, embora agora um pouco desatualizado.
  • O tutorial de Java . Não é exatamente o melhor companheiro do aluno, mas uma ótima referência para se manter à mão, pois abrange todos os conceitos básicos e fornece exemplos. A trilha Aprendendo a linguagem Java provavelmente deve estar na sua lista de leitura, embora eu ache que pode ser assustador para iniciantes completos, pois introduz conceitos que podem ser difíceis de entender a princípio.
  • Java eficaz . Não é um ótimo livro para aprender, mas também uma referência incrível que você deve ter em mãos para mais tarde. Não para ler em uma sessão, mas em pedaços pequenos.

Só estou mencionando isso porque não sei o que você usa em sala de aula. Há muitos outros livros. Alguns são bons. Alguns aleijarão os alunos por anos.


Seu Processo de Estudo

O fluxo de trabalho básico

A partir de agora, recomendamos que você siga este processo em duas etapas para todos os exercícios e exemplos de código que você viu na aula:

  1. Leia e estude
    1. leia os exercícios
    2. certifique-se de entendê-los
  2. código
    1. feche o livro
    2. sente-se na frente de um computador com esse editor de código e linha de comando
    3. tente reescrever o programa sozinho

Em caso de falha

Se você falhar e sentir que precisa dar uma olhada no livro, é provável que sua falha seja:

  • (provavelmente) que você realmente não entendeu a solução,
  • (menos provável) que você tenha esquecido a aparência de uma parte específica da solução: sintaxe, uso da API, ...

É provável que a primeira causa seja o que você enfrenta com mais frequência. O segundo é anedótico. Ambos são abordados pela prática recorrente.

Toda vez que você falha na implementação de um desses exemplos anteriores, olhe o livro novamente e feche-o novamente. Não codifique enquanto olha para o livro. Eu até aconselho que você exclua toda a solução e comece de novo. A repetição é uma parte irritante, mas importante, do processo de aprendizado.

Não leve isso de ânimo leve. Toda vez que você sentir vontade de dizer a si mesmo "sim, ok, eu sei disso" ou "estou 90% lá, está quase tão bom quanto feito" e quiser pular para outra seção, lute contra essa vontade e comece de novo. É muito difícil ter a honestidade de admitir para si mesmo que você não entendeu completamente um conceito.

Nota lateral: Considero um grande desserviço que a maioria dos programas escolares agora tente "dar um pontapé inicial" nos cursos de programação, simplificando demais as coisas e fornecendo ferramentas avançadas demais para os alunos: o objetivo não é tornar sua vida miserável ou para você também aprender de cor, coisas que mais tarde em sua carreira serão automatizadas por suas ferramentas e que às vezes você nem se lembra. É para lhe ensinar todas as partes que flutuam por aí.

Em Caso de Sucesso: Vá Além!

Se você conseguir implementar seu exercício, não salte diretamente para o próximo. Tente ver o que você pode fazer para melhorar isso. Você pode alterar a saída solicitada? Adicionar um pequeno recurso? Uma opção? Tente, pois agora você está naquela zona divertida onde passou pela principal dificuldade, e esses pequenos requisitos auto-impostos são mais propensos a manter um pouco de ânimo.

Porém, não exagere: você não imprime o alfabeto e o inverte para que apareça de repente em uma diagonal na tela com um gradiente de cores. Dê pequenos passos. O aprendizado é um processo longo e interativo, e você precisa abordar problemas com níveis crescentes de dificuldade (por exemplo, veja como eu geralmente penso em explicar a recursão ).


É apenas aprendizado - uma comparação

Seu problema não está realmente relacionado à programação. É o mesmo problema que milhares de pessoas encontram quando tentam aprender matemática.

Se você lhes der um problema, eles não verão como chegar à solução. No entanto, se você escrever a solução para eles, a maioria entenderá e pensará "caramba, isso foi tão simples!". No entanto, você lhes dará um problema semelhante com diferentes medidas e hipóteses e eles não conseguirão resolvê-lo: eles não entenderam a lógica por trás disso e precisam de prática para poder fazer isso sozinhos.

Observe que esse é um problema comum com a matemática, mas, na minha opinião, você o vê em vários outros campos em que há alguma lógica necessária: aprendizado de solfege, gramática de linguagem, física, etc ... E não se resume a uma habilidade "natural" para entender essas coisas: tudo se resume à prática (seja nessa área ou em outras que levem o indivíduo a entender conceitos neste campo mais facilmente).

Não há motivo para você não aprender a escrever código. Você apenas continua tentando até chegar a esse "ah AH!" Momento Eureka. Em seguida, passe para o próximo problema mais difícil.


Isso também pode ajudar (mais tarde):

haylem
fonte
6

Sei que essa não é a resposta que você deseja ouvir, mas: escreva mais código!

Mais especificamente, disseca o código que você entende. Muitas vezes me ajuda a "traduzi-lo" para o inglês comum (como eu sou um iniciante em relação).

Não tenha medo de debater sua ideia para escrever um pedaço de código primeiro (ou seja, "Quero declarar uma variável aqui, iterar por esse segmento, etc") e, em seguida, procure peça por peça como fazer esses vários segmentos.

Lembre-se de que a codificação é menos como um exercício de memorização e como descobrir uma maneira de construir algo a partir dos blocos de construção. Assim como aprender uma língua estrangeira de verdade, a compreensão vem primeiro, este é um bom sinal de que você está no caminho certo.

Apenas acredite que quanto mais você escreve e lê códigos, mais faz sentido.

Xelad1
fonte
5

Como outros já disseram, este é um caso em que você deve praticar, praticar, praticar.

Escreva vários programas pequenos que resolvem apenas um problema

Às vezes, a parte mais difícil é criar algo que vale a pena programar. Se puder, tente trabalhar em um tópico com o qual você pensa estar lutando - como classes, herança etc. etc. Algumas ideias estão em alta:

  • Gere 1000 números aleatórios e insira-os em uma coleção (fila, lista, etc.). Classifique a coleção sem usar nenhum método fornecido que classifique a coleção para você.
  • Liste 10 pessoas que você conhece. Primeiro, classifique seus nomes com base nos primeiros e os exiba. Em seguida, classifique seus nomes com base nos sobrenomes e exiba-os. Em seguida, tente classificá-los com base no padrão "último, primeiro" (ou seja, Smith, Andrew estaria antes de Smith, Jessica).
  • Encontre todos os números primos entre 1 e 100.
  • (Herança) Crie uma classe Polygon e atribua a função GetArea. Agora, torne as classes Triangle e Rectangle herdadas de Polygon e verifique se elas implementam GetArea. Continue fazendo isso para polígonos de ordem superior (pentágono, hexágono etc.).
  • Tente escolher itens da troca de pilha de código de golfe *

* O objetivo do código golf é executar a tarefa fornecida usando a menor quantidade de caracteres, bytes ou alguma outra métrica indicada na pergunta. Se você ler algumas das respostas, aprecia rapidamente as maneiras inteligentes pelas quais as pessoas resolvem esses problemas. Não se concentre em resolver o problema no menor número de bytes! As pessoas que postam para codificar golfe são programadores muito experientes. Mas, algumas das perguntas oferecem tarefas fáceis por si só.

Alguns exemplos divertidos de código de golfe:

  • Poderes de 4 . Não se preocupe em resolver com uma regex (é bastante difícil, como você pode ver pelas respostas). Mas, em vez disso, resolva a pergunta "Dada uma corda s, seu comprimento é divisível por uma potência de 4?" Você também pode fazer ramificações: O comprimento de uma string é divisível por 4? É divisível por 6? É excelente (isso é difícil para longas cordas, então tente se você for corajoso!)?
  • Substrings . Dada uma string s, produza todas as substrings possíveis.
  • Contagem de palavras . Este pode ser complicado, dependendo de quão longe você está em seus estudos de programação. Existem algumas coisas que facilitam muito (como coleções associativas), mas se você não souber essas coisas, pode ser difícil.
  • Se o título lhe parecer enigmático, ignore a pergunta. Como eu disse, o código de golfe é para programadores experientes. Apenas se concentre nos problemas simples e tente encontrar uma resposta simples.

Estrutura básica para resolver um problema:

Muitos deles dão uma boa idéia de como deve ser uma função. Dado X, Y e o resultado deve ser Z:

void foo()
{
    // Set up X here

    // Do Y here

    // Display Z here
}

Com o objetivo de aprender o básico e se familiarizar com um idioma, o modelo acima é suficiente. Um modelo mais orientado a objetos seria:

Z foo(input X)
{
    Z result;
    // Do Y to X
    return result;
}

Se ajudar, anote também no papel. Fale consigo mesmo através do processo de como você , como ser humano, resolveria esse problema. Exemplo: dados os números i, j ek, exiba-os em ordem decrescente. Como pessoa, é fácil de resolver. A parte difícil é traduzir suas idéias em instruções linha por linha para que um computador possa resolvê-las.

Tente criar suas próprias idéias também. Pode ser difícil, mas mesmo o mais simples dos programas pode ensinar algo que você não sabia. O ponto principal é se aprofundar no básico, até que eles se tornem uma segunda natureza.

Shaz
fonte
4

Você não chegará a lugar algum apenas lendo o código; você precisa escrever código. Basta escrever o código. Não se preocupe se o código que você escreve é ​​uma porcaria; todo mundo escreveu código porcaria. Algumas pessoas ganham a vida com isso. Ninguém começa a escrever um bom código e sou da opinião de que, enquanto aprende, é quase necessário escrever um código incorreto, porque só então a diferença entre código válido e incorreto se torna realmente aparente.

É difícil apreciar a diferença entre código bom e ruim ao ler dois blocos de código que fazem a mesma coisa, mas quando você escreve um script e obtém alguém com conhecimento para analisá-lo e fornecer feedback, a diferença geralmente se torna muito mais aparente porque você pode aplicá-lo diretamente ao que sabe.

Programar não é algo que você pode aprender memorizando; não é como suas tabelas de horários ou datas no histórico. A programação é uma habilidade prática que requer prática constante para se manter nítido. Aprender programação sem escrever código é como aprender a nadar lendo um livro.

Roy
fonte
1

Essa pergunta já tem algumas respostas realmente boas, mas há alguns pensamentos que ainda não vi.

Aprender uma linguagem de programação é como aprender uma linguagem 'real': é sempre muito mais fácil ler do que escrever, seja uma frase única, um artigo científico ou um livro. Ao ler, muito pode ser descoberto apenas a partir do contexto, entendendo o texto ou o código enquanto você o lê. Quando você vê uma palavra que não conhece, talvez conheça outra palavra com o mesmo radical; quando você vê um método, o nome do método fornece uma boa idéia do que ele faz. Ao escrever, você deve se lembrar não apenas da sintaxe, mas também das palavras reais a serem usadas. E é o mesmo para a programação.

Como outros já disseram, você não pode aprender a escrever programas apenas lendo programas.

Comece pequeno. Procure um tutorial sobre Java e faça todas as unidades, uma após a outra. E quando estiver confiante o suficiente, escolha um pequeno projeto para testar suas habilidades, talvez um jogo simples que você conheça bem e que não exija muita interação da GUI. Quando você decidir, não basta abrir o Eclipse e olhar para a 'página em branco'. Crie um storyboard. Você não precisa desenhar diagramas UML elaborados, pense em como certos aspectos do programa poderiam ser resolvidos - como a história ou o seu argumento se desenrola, por assim dizer. E ao escrever o código, comece com um rascunho. Normalmente, escrevo muitos comentários, descrevendo o que o programa deve fazer, em que ordem e depois começo a preencher o código do programa.

tobias_k
fonte
1

Como outros dizem, você só precisa praticar a escrita de código. Para que isso seja satisfatório, você precisa desafiar-se a solucionar algum tipo de problema, seja imprimindo mensagens predefinidas, criando uma calculadora interativa simples ou resolvendo alguma tarefa específica.

Se você está com pouca inspiração, o Project Euler tem uma infinidade de exercícios de matemática / programação de dificuldade crescente. Eles oferecem objetivos claros e desafiadores a serem alcançados e devem ajudá-lo a se sentir mais confortável em criar programas.

Emil Lundberg
fonte
1

Só pensei em falar sobre esse tópico porque ele realmente bate perto de casa.

Você só precisa começar a codificar. Não me interpretem mal, a leitura é ótima, mas o que realmente lhe dá esse conhecimento de codificação de trabalho está realmente construindo algo. Aprendi mais com um único estágio de verão do que no ano anterior lendo sobre ele.

Devo acrescentar também que você não deve começar a codificar às cegas . Faça um projeto para si mesmo. Você precisa de algum tipo de orientação para se colocar, para saber o que deseja fazer. Você ficará surpreso ao ver o quanto aprenderá rapidamente. Se você apenas abrir um IDE e começar a fazer exemplos simples de olá mundo, esse sentimento desmotivador surgirá rapidamente em você. Encontre algo com um pouco de profundidade e, antes que você perceba, estará expandindo.

SeanWM
fonte
isso parece acrescentar algo substancial sobre o que já foi publicado em respostas anteriores #
306
@gnat Estou assumindo que você quis dizer "Não" e essa é a sua opinião. Passei exatamente pela mesma situação em que ele está passando e estou compartilhando o que me ajudou. Se você esqueceu a introdução à sua pergunta aqui é: "Vocês poderiam dar alguma dica ..."
SeanWM
@SeanWM - Os programadores são um pouco diferentes do que você pode estar acostumado com o SO. Se algo já foi respondido bem, reiterar os mesmos pontos em sua própria resposta não é tão construtivo. E isso independentemente de o OP estar pedindo dicas ou opiniões. Simplesmente não contribui para boas perguntas e respostas. É melhor votar nas respostas existentes e possivelmente deixar um comentário construtivo indicando uma faceta que foi perdida.
+1, essa resposta adiciona algo importante à mistura. Essa é a importância de ter um projeto real para trabalhar, não apenas exemplos e pequenos programas de teste.
GrandmasterB