Dicas ou técnicas para usar quando você não sabe codificar alguma coisa? [fechadas]

8

Tenho experiência como designer de interface do usuário. E percebi que é um pouco difícil para mim escrever um pedaço de lógica. Às vezes eu acerto, mas na maioria das vezes, acabo com algo hacky (e geralmente leva muito tempo). E não é que eu não goste de programação, na verdade, estou começando a gostar tanto quanto de design. Às vezes, acho que sou melhor em lidar com cores e formas do que com números e lógica (mas quero mudar isso).

O que costumo fazer é pesquisar a solução na Internet, copiar o exemplo e inseri-lo no meu aplicativo (sei que isso não é uma prática muito boa).

Ouvi dizer que uma dica era escrever a lógica em inglês comum como comentário antes de escrever o código real.

Que outras dicas e técnicas posso usar?

janoChen
fonte
@Yannis Rizos Obrigado, uau, eles são muito. Devo experimentá-los todos ou há alguns que são particularmente eficazes na programação?
perfil completo de janoChen

Respostas:

17

Passos de bebê.

Divida um grande problema em problemas menores. Em seguida, resolva os problemas menores.

Pontos de bônus se você puder fazer backup de suas soluções para problemas menores com testes de unidade automatizados.

Jim G.
fonte
10

Normalmente, escrevo as coisas no papel enquanto estou pensando. Dessa forma, eu posso escrever pseudo-código ou fazer desenhos (geralmente ambos), e não preciso me preocupar com as limitações do software de desenho ou com o que pode caber em um comentário.

Acho que se estou fazendo algo pelo menos levemente complicado, preciso realmente colocar as coisas no papel primeiro, ou então acabo com algo hacky, como você mencionou.

Se eu acabar com algo hacky, quase sempre funciona. Às vezes, eu posso invadir até que finalmente funcione, às vezes não. Se eu dedicar algum tempo a trabalhar no papel, geralmente ele funciona sem muitos problemas.

Michael Shaw
fonte
2
+1 para pensar antes de codificar. Isso quase sempre leva a uma solução melhor.
Paul Hiemstra 02/12/12
4

Acho que você meio que respondeu à sua própria pergunta, e não quero dizer isso de maneira ruim - é um conselho comum que a melhor maneira de aprender a codificar é simplesmente codificando. Eu pessoalmente tentaria evitar copiar código diretamente de uma fonte, a menos que seja absolutamente claro o que está acontecendo (isto é, que não há necessariamente outra boa maneira de fazer alguma coisa), embora muitos desses tipos de problemas são sintáticos. Dedicar tempo para entender o que está acontecendo e como você (ou outra pessoa) está implementando isso é o que mais importa.

Durante o tempo que aprendi a desenvolver, descobri que trabalhar com tecnologias MVC é uma ótima maneira de entender como fazer design, como Rails (com o que estou trabalhando agora) ou iOS / Cocoa Touch . Como você está trabalhando em um ambiente de design orientado a objetos, assim que começa a pensar em termos de modelos e a lógica deles sendo separada da visualização (com os controladores sendo a cola que os une), você também começa a pensar em termos de como você pode manter seus objetos abstraídos de uma maneira lógica, mas (espero!) descomplicada.

Isso se baseia em minhas próprias experiências, é claro, mas espero que meus pensamentos sobre sua pergunta possam ajudar.

Paulo
fonte
3

Além das respostas já dadas, uma das melhores maneiras de começar é aprender com um aplicativo simples e onde o código fonte está disponível.

É aqui que repositórios sociais como o Github brilham. Um lugar incrível para procurar exemplos. E quando você encontrar um, você pode bifurcar imediatamente como você mesmo e fazer o que quiser com o aplicativo, assim que tiver:

  • você pode executá-lo
  • ajustá-lo aqui e ali e ver como as coisas mudam
  • à medida que você se sente mais confortável, faz alterações maiores
  • você logo descobrirá que está realmente aprendendo

Outra opção é usar as implementações de referência de exemplo clássico que estão documentadas em tantos lugares diferentes. Por exemplo, o framework Spring do Java usa o venerável exemplo "Pet Store". Acho que você pode encontrar esse exemplo no Github.

Outras estruturas / tecnologias, como a estrutura Grail do Groovy, usam outros clássicos, como um aplicativo Book, para persistir e visualizar livros e autores, etc.

A opção final que eu tentei é seguir um bom livro de programação e começar a digitar os exemplos manualmente e colocá-los em um repositório como o Github; isso tem pelo menos dois benefícios: 1) existe uma referência para você com suas próprias anotações que o ajudará a se lembrar de coisas legais de uma maneira que você se lembrará e 2) se você enfrentar situações difíceis, poderá facilmente conseguir amigos ou colegas para veja seu código e entre em contato com conselhos.

A ciência e especialmente a programação são realmente construídas sobre as experiências de outras pessoas. Figurativamente falando, copiar / colar e depois ajustar até você entender é o que ajuda os desenvolvedores a se tornarem engenheiros.

Johnnie
fonte
2
Copiar cegamente o código pode ser perigoso se você não entender o que ele faz. Especialmente na ciência, a cópia cega é muito ruim. Se você copiar, poderá adotar a idéia do código, mas ainda assim escrevê-lo do zero. Dessa forma, você entenderá melhor. É semelhante a fazer exercícios no final de um capítulo de estatísticas para ver se você realmente entendeu o que está acontecendo.
Paul Hiemstra 02/12/12
Tenha cuidado com implementações de referência. Eles geralmente mostram técnicas que poderiam ser usadas, mas não são realmente aplicáveis ​​à implementação atual.
BillThor
Completamente concordado. Estou usando 'copiar' como eufemismo ... todos começamos a aprender por imitação. E você está correto - precisamos ter cuidado e entender a nós mesmos o suficiente para saber quando estamos no modo de aprendizado / imitação. Obrigado por apontar isso.
quer
2

Imagine que você tenha que fazer um relatório sobre o seu problema para outra pessoa.
Analise o problema. Tente formulá-lo da maneira mais clara possível. Escreva pseudocódigo, desenhe diagramas.
Pense no que poderia estar causando o problema e por que sua abordagem está errada.
Pergunte a si mesmo se há outras perspectivas nas quais você possa ver o seu problema.
Não basta fazer isso em sua mente, coloque-o no papel (ou em um documento no seu computador).

Se nada disso ajudar você imediatamente, tente não pensar no problema por um tempo. Tenha uma boa noite de descanso. Ainda sem solução? Tente pesquisar seu problema no Google ou pesquisar na SO uma solução.

Se tudo mais falhar, faça uma pergunta sobre SO (ou Programadores SE, se for mais apropriado para sua pergunta em particular). Não se esqueça de incluir seu "relatório" (ou partes importantes) ao fazer a pergunta.
Quando você receber uma resposta, pergunte-se por que sua abordagem não funcionou e o que poderia ter ajudado você a encontrar a solução sozinho. Isso pode ajudá-lo a encontrar uma solução para algum problema que você se deparar no futuro que exija uma abordagem semelhante.

eu posso aprender
fonte
1

Eu concordo com o pensamento no papel. Como regra, identifico todos os itens de informações que precisarei e de onde virão, primeiro. Não precisa ser elegante, apenas preciso. Questões de lógica de negócios e estratégias de design geralmente vêm durante esse processo.

Com isso, como um desenvolvedor java trabalhando de ponta a ponta em um aplicativo, divido ainda mais as camadas por camadas: apresentação, web, lógica de negócios e a camada de acesso a dados. Quando tenho tempo, normalmente escrevo os nomes das minhas aulas durante esta parte.

Por fim, sempre me esforço para executar testes para o back-end, antes de escrever o código. Você pode conectar tudo com elegância, mas se não conseguir acessar o back-end: banco de dados ou serviço da web, por exemplo, não funcionará!


fonte
1

Alguns dos princípios do desenvolvimento orientado a testes ajudam muito aqui.

Uma das melhores maneiras de resolver problemas complexos é resolvê-lo para casos de uso específicos e, em seguida, descobrir uma generalização. O uso do TDD promove exatamente isso. Você cria um caso de teste simples e faz isso funcionar, depois cria outro caso de teste e faz isso funcionar. Finalmente, você vê se existe alguma generalização que permite que você lide com os dois casos de teste com a mesma lógica. Se você puder, provavelmente também lidará com muitos outros casos de teste. Como você pode executar todos os seus casos de teste a qualquer momento, fique à vontade para melhorar sua lógica sem se preocupar em quebrar algo. Dessa forma, uma solução hacky não precisa permanecer hacky.

O desenvolvimento orientado a testes também promove

  • dividindo grandes problemas em outros menores, para que seja mais fácil obter uma boa cobertura de teste.
  • pensando antecipadamente sobre o que você realmente deseja alcançar antes de se deparar com os detalhes da implementação.
  • evitando o excesso de engenharia, tentando fazer com que os testes passem da maneira mais simples possível, e as soluções simples são geralmente as melhores.
Vaughn Cato
fonte
Aqui está um contra-argumento: TDD não é uma boa maneira de resolver algo com o qual você não está familiarizado. Veja o infame Como não resolver um Sudoku onde o "especialista" do TDD Ron Jeffries falha embaraçosamente em fornecer uma solução enquanto usa o TDD às cegas, e Peter Norvig resolve isso usando o bom e velho antiquado "conhecimento sobre o assunto" e "pensando sobre ele". Você não pode generalizar uma solução algorítmica a partir de casos de TDD, a menos que seja trivial ou se já conhece seu objetivo com antecedência.
Andres F.
@AndresF .: Definitivamente, é um exemplo interessante. Eu acho que a questão aqui é "cegamente". Eu acho que você sempre quer dar um passo atrás e dar uma olhada em como o seu código está evoluindo para obter algumas dicas sobre o problema. Já tive muitas vezes em que não consegui ver uma solução geral no início, mas depois de ver como resolver alguns casos de teste simples, a solução mais geral ficou clara.
Vaughn Cato
Concordou que "cegamente" é o culpado mais provável. Mas se Ron Jeffries , um especialista em TDD e co-fundador do XP, não pode fazer o que é certo, então quem pode? : P Mais seriamente, acho que as outras respostas a essa pergunta são mais relevantes que o TDD: quebrar o problema em blocos menores e raciocinar sobre eles, escrever pseudocódigo, escrever uma prova no papel etc. são todos mais importantes que o design orientado a teste e "teste primeiro". Quando o problema é de natureza algorítmica e não trivial, o TDD não ajuda (tanto). O TDD irá ajudá-lo a escrever CRUDs.
Andres F.
@AndresF .: Isso pode ser verdade. Não tive a impressão do OP de que esses eram problemas algorítmicos difíceis. Parecia estar relacionado aos vários bits de lógica que surgem nas interfaces do usuário, que geralmente têm soluções bastante triviais, mas são fáceis de errar. Essa pode não ser a situação real do OP. Eu diria que, mesmo para problemas algorítmicos difíceis, trabalhar com casos de teste pode ser um grande benefício para a compreensão, e tornar o código testável inerentemente envolve dividi-lo em partes menores e mais gerenciáveis.
Vaughn Cato
Ah, os casos de teste são definitivamente parte da solução de problemas. O TDD não é apenas sobre casos de teste. Estou discordando do TDD, não do teste! Estou discordando da parte de design do TDD. (Embora agora eu concordo com você, talvez o cenário algoritmo não se aplica à situação do OP)
Andres F.
0

Na verdade, há um livro que responde exatamente a essa pergunta:

Como criar programas - Uma introdução à programação e computação de Matthias Felleisen, Robert Bruce Findler, Matthew Flatt e Shriram Krishnamurthi

No momento, eles estão trabalhando em uma segunda edição e, depois, em um segundo volume (Como criar componentes).

O mais interessante deste livro é que ele fornece um conjunto de receitas para a criação de programas. Em outras palavras, fornece instruções passo a passo que você pode (semi-) seguir sem pensar para criar um programa.

Ou, colocando de outra maneira: contém um conjunto de programas para escrever programas, para que você não precise descobrir como escrever um programa: os autores descobriram isso para você!

Jörg W Mittag
fonte
0

Além das respostas acima, às vezes não se trata de conhecer a própria lógica, mas de conhecer a estrutura e a linguagem com as quais você está trabalhando. Cada estrutura ou linguagem tem sua própria característica e é uma grande ajuda para se familiarizar com isso.

arfo
fonte