O teste não é para iniciantes

Eu sou um grande fã de testes. Escrevo sobre isso no meu blog e lista de discussão, discuto com outros desenvolvedores no meu tempo livre, fui até criar um curso de treinamento em testes no Go.

Mas, apesar de todo o meu amor por testar, não o recomendo para iniciantes.

Soa selvagem, certo? Neste artigo, vou esclarecer meu ponto de vista com mais detalhes, mas o ponto todo se resume a dois pontos:

  1. Iniciantes não têm conhecimento suficiente para escrever nada além dos testes mais simples. Isso inevitavelmente leva ao próximo ponto ...
  2. Tentar treinar as habilidades necessárias para escrever testes realistas enquanto aprende a programação é extremamente difícil

Entendo que esse seja, em princípio, um ponto. De qualquer forma, dividi-o em dois para facilitar a compreensão.

Sei que muitos de vocês discordam de mim, mas por favor leia o artigo e, se depois de ler você não estiver convencido, terei prazer em discutir isso com você. No final, estou aqui para estudar

Os iniciantes não têm conhecimento para escrever nada além dos testes mais simples


Sempre que um iniciante escreve código, seu principal objetivo não é decompor tarefas, evitar variáveis ​​globais ou escrever código de teste. Honestamente, a maioria dos iniciantes provavelmente não tem ideia do que é tudo isso. De fato, seu principal objetivo é simples - fazer essa coisa maldita funcionar. Só isso.

Confirmando que é improvável que exija algum esforço, basta olhar para o código escrito pelo novato.

Ir aplicação web? Certamente eles escrevem consultas SQL em todos os lugares do código, e a conexão com o banco de dados é quase garantida para ser armazenada em uma variável global.

Aplicação Rails? Certamente você verá a lógica comercial nas visualizações e toneladas de atolamentos lógicos nos controladores.

Aplicação web PHP? Não ficarei surpreso se TODA a lógica estiver em um único arquivo php - análise de formulário, interação com o banco de dados, etc.

Mesmo se tomarmos algo elementar, digamos, uma calculadora com funcionalidade limitada, ainda encontraremos exemplos como os que descrevi. Isso não se deve ao fato de que os iniciantes não dão a mínima, eles ainda não sabem como fazer melhor.

Os iniciantes não sabem o que é injeção de dependência, eles não entendem como as variáveis ​​globais complicam os testes, provavelmente não sabem o que é simulação, então é ridículo esperar que eles entendam como criar código fácil de codificar.

Como resultado, para iniciantes, apenas os testes mais simples como esses fazem sentido:

func Add(a, b int) int { return a+b } // And a test... func TestAdd(t *testing.T) { got := Add(2, 4) want := 6 if got != want { t.Errorf("Add() = %d; want %d", got, want) } } 

Embora eu não tenha nenhum problema em mostrar isso para iniciantes e dar uma idéia do que é o teste, acho ridículo mostrar esse código a eles e fingir que é algo como um teste real.

No final, isso leva ao fato de começarmos a ensiná-los mais. Estamos tentando explicar o que é injeção de dependência, por que variáveis ​​globais complicam os testes, como time.Now () pode dificultar a verificação de casos de fronteira. E nesse lugar eu começo a me preocupar, porque não ensinamos mais o iniciante a escrever código. Neste momento, ensinamos a ele como escrever código e como testar ao mesmo tempo. E isso me leva ao segundo ponto ...

Tentar treinar as habilidades necessárias para escrever testes realistas enquanto aprende a programação é extremamente difícil


Como antes, quero que você pense no código escrito pelo novato, mas desta vez quero que você se lembre de alguns dos primeiros programas que escreveu.

Se você era como eu, seu primeiro aplicativo da Web poderia ser algo como isto:

 <p> <?php // This may not work. I don't know PHP anymore. $name = $_GET['name']; echo "Hello, " . $name; ?> </p> 

Uma obra de arte, certo?

Agora imagine que você acabou de escrever esse código pela primeira vez e alguém lhe diz que você deve testá-lo. E você tem que usar o React. E o quadro. Ah, e não faria mal em você ajustar o banco de dados e possivelmente o GraphQL para trabalhar com ele.

Não sei por que, mas nós desenvolvedores temos o hábito de usar as habilidades adquiridas ao longo de muitos anos de experiência e prática e esperar que outras pessoas, especialmente iniciantes, façam o mesmo . Isso é ridículo! Isso é de se esperar de alguém que ele entenderá matemática apenas porque você já estudou trigonometria, álgebra e muito mais e poderá usar a matemática para resolver problemas específicos.

Se algo funciona bem para você, isso não significa que será adequado para iniciantes. Eles podem estar fora de contexto, sem a experiência e a prática necessárias para se beneficiar do que você usa. Ou talvez os problemas com os quais eles estão enfrentando sejam realmente simples demais para usar todas essas soluções complexas.

É como se tivéssemos esquecido como estudamos passo a passo como as solicitações HTTP funcionam. Como funcionam os cabeçalhos. Cookies Formulários. Como funciona uma solicitação POST ao servidor - ou mesmo que existem métodos HTTP EXTREMELY diferentes. E aprendemos tudo isso com o bom e velho método de tentativa e erro.

Na verdade, não acho que os testes sejam os culpados, o verdadeiro problema é que acreditamos firmemente que você deve aprender programação, testes, criação de sites e um milhão de outras coisas ao mesmo tempo. Realmente não sei como isso aconteceu, mas suspeito que parte do problema é que não nos preocupamos em pensar sobre o que custará estudar tudo isso. Um iniciante pergunta "o que devo aprender?" e começamos a "aprender a testar, reagir, graphql e pronto, mas use apenas a biblioteca padrão ..."

Não, não, e novamente não. Apenas pare.



Isso é ridículo, pois em outras condições o absurdo dessa abordagem é óbvio. Se você quiser ensinar alguém a jogar futebol, começará com o básico, como fazer as malas e driblar. Você não começará dizendo "É assim que os profissionais fazem", ligue o vídeo de Ronaldo e vá embora. Então, o que diabos estamos fazendo com os novatos em programação?

Tentamos nos justificar dizendo: “Bem, é claro que eles entendem que é impossível aprender tudo isso ao mesmo tempo”, mas eles não entendem! A situação é agravada pelo fato de que desenvolvedores iniciantes, que caem nessa armadilha, se sentem um lixo por estarem presos. Parece-lhes que eles simplesmente não têm o que é preciso para se tornar um desenvolvedor e é uma pena para você e para mim, porque muitos deles adorariam programar se não colidissem com essa parede de tijolos.

E isso me leva ao que eu realmente queria dizer - muitos de nós estudam melhor se focamos em estudar várias coisas ao mesmo tempo. Queremos novos desafios, queremos experimentar coisas novas, mas não queremos nos confundir e cair em um estupor. Aprender sobre testes e qualquer outra coisa - por exemplo, como criar um aplicativo Web, como http, cookie etc. funciona - é uma maneira fácil de cair nessa armadilha. E, como resultado, geralmente recomendo que você estude o restante primeiro e faça o teste por último. Você sempre pode voltar para seus projetos antigos e ver como os reconstruiria agora, quando estudasse os testes, mas isso só é possível se você não estiver sobrecarregado, chateado e, no final, não tiver abandonado esse negócio.

Mas e se eu quiser aprender a testar ?! (e um milhão de outros "what if")


Legal para a frente! Obviamente, você pode estudar os testes primeiro, e somente então o desenvolvimento da Web ou algum outro tópico. Tenho certeza que alguns fizeram exatamente isso e você pode gostar mais dessa maneira. Quando digo que o teste não é para iniciantes, não digo que esse seja um tópico ruim para estudar, quero dizer que tentar aprender o teste e mais qualquer outra coisa é um erro.

A maioria das pessoas quer aprender como criar aplicativos da Web ou algo visual primeiro, mas isso não significa que você precise começar com isso; é possível começar muito bem com o teste. Você provavelmente não começará a entender nada até conseguir o que quer, mas não me deixe impedi-lo de aprender o que deseja.

Isso também não significa que você não possa estudar durante a programação em pares ou algo assim. Com um mentor, você pode aprender muitas coisas ao mesmo tempo e suportar com êxito essa carga, porque você tem alguém que o guiará por tudo isso. Nesta situação, se você se perder, não chegará a um beco sem saída e não se sentirá um fracasso, porque haverá alguém que diz: “Você está indo bem, é muito difícil por enquanto. Da próxima vez, tente X e Y! ” Simplificando, nesse cenário, você não ficará confuso, decepcionado e sairá.

Source: https://habr.com/ru/post/pt451118/


All Articles