Jogos educativos de tabuleiro para programadores

Há uma situação interessante no mercado de trabalho no desenvolvimento Java. Existem mais de 100.000 currículos ativos para desenvolvedores e uma vaga por currículo. Ao mesmo tempo, empregadores e agências de recrutamento reclamam da falta de pessoal e, apesar de milhares de currículos, é difícil encontrar um bom especialista. Por exemplo, um desenvolvedor Java tem um produto escasso: é raro, seus cortes não são afetados, os salários estão aumentando e a concorrência está caindo. Não investigaremos as causas do fenômeno, mas falaremos sobre uma das maneiras de resolver esse problema.



Você pode procurar especialistas técnicos por um longo tempo, mas o trabalho não espera, portanto, é necessário contratar pessoal qualificado insuficiente e treinar o processo. Das opções: auto-estudo em seu tempo livre ou cursos e seminários no local de trabalho, mas você pode escolher jogos. Artyom Larin ( artem_larin ) explicará por que os métodos tradicionais de ensino não são confiáveis ​​e por que os jogos são, de certa forma, melhores que outros.

Os jogos de tabuleiro especiais da equipe não apenas ensinam tópicos complexos de desenvolvimento de software, envolvendo ativamente cada participante, mas também formam uma linguagem técnica comum na equipe, além de resolver o problema de formação de equipes e formar uma cultura corporativa.



Sobre o palestrante: Artyom Larin em Java desde 2004. Ele trabalha como desenvolvedor líder e, como sênior, treina colegas periodicamente, ministra palestras e seminários de treinamento interno. Infelizmente, houve uma experiência negativa de aprendizado que levou a Artyom à idéia de que os jogos de tabuleiro são necessários no desenvolvimento.



Será sobre como bombear a equipe não muito, mas muito habilidades técnicas. O relatório consiste em duas partes: humanitária e criativa. Mesmo que você não seja um técnico, na segunda parte você terá que esforçar seu cérebro humanitário, porque sem informações técnicas, em nenhum lugar - falarei sobre habilidades duras e seu nivelamento.

Questões de TI


Acredito que exista um grande problema em TI - e isso é falta de pessoal . O problema foi discutido várias vezes, há estatísticas do hh.ru e publicações sobre este tópico. Apenas no caso, verifique as estatísticas. Se você digitar “Java” no mecanismo de pesquisa hh.ru, veremos de 5 a 6 mil empregos na Rússia, e o número de currículos no mesmo hh.ru será superior a 100 mil. Parece que não há escassez de desenvolvedores - o currículo é uma ordem de magnitude maior que as vagas .





Vamos olhar do outro lado. O site hh.ru possui um índice especial, chamado de hh-index . Essa é a proporção de currículos e vagas ativos. Para uma solicitação Java, é aproximadamente igual a um: para uma vaga, um currículo. Mais uma vez, verifica-se que não há falta de pessoal? A empresa precisa de um programador, abre uma vaga e, de acordo com o índice, o idoso deve vir imediatamente, conseguir um emprego e fechar a vaga.

O senhor "deve" vir, mas não vem. Os números dizem que não há falta de pessoal, mas no mundo real, e não no mundo do índice hh, é. Java é uma profissão escassa. Há uma sangrenta busca por idosos em Java: RHs e recrutadores cercando-os com ofertas para conseguir um emprego. Em média, um desenvolvedor Java recebe de 5 a 6 ofertas , mesmo se empregado.

Qual é o problema? De onde veio a falta de pessoal? Pela minha experiência pessoal em entrevistas, acredito que o problema é que a maioria dos candidatos a emprego que enviam currículos e vêm para entrevistas têm educação insuficiente e baixa qualificação. Porém, como há escassez de pessoal, as empresas são obrigadas a contratar essas pessoas e a treinar por conta própria - pessoas com alta qualificação passam seu tempo educando pessoas com poucas habilidades.

Não podemos derrotar a fome de pessoal - apenas para declarar. Por isso, adaptamos e resolvemos o problema, por outro lado - treinamos. Vamos pensar em como educar as pessoas no setor de TI.

Maneiras de aprender na indústria de TI


Em 1980, os Laboratórios Nacionais de Treinamento nos Estados Unidos realizaram pesquisas sobre a eficácia de diferentes métodos de treinamento. Verificou-se que as palestras e a leitura de livros têm uma eficiência extremamente baixa - apenas 5 a 10% . Em seguida, assista a aulas em vídeo e ouça o áudio. A eficiência máxima de 90% é o treinamento de pessoas de outras pessoas - mentoring e a aplicação imediata do conhecimento adquirido na prática.





Com base na pirâmide de treinamento, conduziremos uma análise expressa dos métodos de treinamento de TI.

Cursos


Certamente você conheceu publicidade contextual na Internet que promete transformar iniciantes em programadores profissionais: "Torne-se um desenvolvedor em 3 meses". Eu próprio fiz esses cursos várias vezes por uma questão de interesse e os aconselhei a meus alunos. Posso dizer que sim, esses cursos são eficazes, mas têm dois problemas: somente o conhecimento básico é fornecido nos cursos - eles não transformarão o mês de junho em um idoso, e a eficácia do treinamento não será superior a 20% . Os cursos são uma maneira ineficiente, por isso vamos esquecer.

Oficinas internas


Eu realmente amo os seminários internos e os realizei muitas vezes. Eu acredito que eles são eficazes apenas se o público interagir de forma interativa com o professor. Infelizmente, isso raramente é o caso. Geralmente, as pessoas vão a um seminário, sentam-se e ouvem passivamente um professor enquanto bebem gaivotas. Sem interatividade, baixa eficiência - máximo de 50% . Portanto, os seminários também podem ser esquecidos.

Conferências


O objetivo da conferência é introduzir inovações do setor, mas não um treinamento intenso. As conferências são comunicação , novas idéias, mas não treinamento - a eficácia neste caso é de apenas 5 a 30%. As conferências também não são o que precisamos.

Auto-aprendizagem


Eu, como a maioria dos meus amigos, programadores, entrei na profissão por auto-educação. Este é um método eficaz, eu daria 75% de eficiência , se não fosse uma grande desvantagem - uma lista de livros para estudar.



Esta é uma lista que eu dou a pessoas que desejam se tornar desenvolvedores de Java e escrevem códigos reais da indústria. Quando mostro aos iniciantes, vejo medo, desespero e desesperança nos olhos deles. O entusiasmo está morrendo rapidamente.

Para se tornar um programador, uma pessoa precisa passar pelo "platô do desespero". De acordo com esse conceito, depois que uma pessoa recebe conhecimento inicial após o entusiasmo, chega um longo período em que ele não recebe mais conhecimento e a auto-estima está caindo rapidamente.



Por analogia com o "platô do desespero", introduzi o conceito de "muro do desespero". Essa é uma parede de 15 livros grossos, que não permite que centenas de milhares de desenvolvedores iniciantes com hh.ru entrem nas cobiçadas 5 mil vagas ativas de nível sênior e médio.



Acontece que, para se tornar um desenvolvedor, um iniciante gasta tempo com auto-educação, e não com uma família ou um hobby. Parece que esse método também não é muito bom.

Mentoria e Coaching


Esta é a maneira mais eficaz, de acordo com a pirâmide da aprendizagem - 90% de eficiência . Mas ele também tem desvantagens que não permitem chamar esse método de "pílula mágica".

A tutoria é sempre uma proporção de 1: 1 , ou seja, um mentor e um menti - o aprendiz . Na minha prática, não vi casos em que um mentor possa treinar 10 pessoas. A tutoria é muito mal dimensionada e distrai os idosos do trabalho principal. Posso dizer pessoalmente por conta própria - eu tinha 2 menti, no máximo. E, ao mesmo tempo, metade do meu tempo de trabalho e, às vezes, mais, foi gasto em orientação e não em tarefas de produção pelas quais eu recebi dinheiro. Portanto, 3-4 pessoas ou mais, é impossível orientar, se falamos de orientação de alta qualidade.

Estudos de longo prazo - 1-2 anos. Na minha experiência, um programador trabalha há uma média de 2 anos em uma empresa. A imagem é triste: você orienta uma pessoa, direciona o conhecimento para ela, e então alguém desiste - você ou ela, e toda a orientação não leva a lugar algum.

A mentoria é eficaz, mas por causa das deficiências, pensei - por que não encontrar uma maneira que seria eficaz como mentoria, mas sem os pontos negativos: divertido, interessante e escalável. Pensando, tive a ideia de jogos - é divertido, gosto de pessoas e resolve os problemas de orientação.

Jogos!


Que jogos conhecemos? Damas, xadrez, carretéis e dominós são uma ocupação intelectual, apesar da simplicidade.



As cartas também são um jogo intelectual. Quem não gosta do clássico, há "Magic: The Gathering". Muitas pessoas de TI adoram esse jogo, inclusive eu. Muitas empresas de TI organizam torneios inteiros dedicados a ela.



Todos esses jogos são jogos de entretenimento, não de programadores, e eu me perguntava - existem jogos para programadores? E eu achei, por exemplo, um jogo assim.



O jogador opera com blocos de cores, compila o código fonte deles para controlar o astronauta. Obviamente, o jogo é completamente infantil, eu diria - jardim de infância. Ela não transforma o jogador em um veterano.

Então o jogo é abrupto: paisagem 3D e herói-robô tridimensional.



Em alguma linguagem C, você precisa escrever pseudo-código para controlar o robô.

Abaixo está uma captura de tela do terceiro jogo que encontrei.


Aqui, novamente, em um pseudocódigo, você precisa escrever um programa para controlar o personagem: mova-o pelo labirinto, abra e feche portas, manipule objetos.

Todos os outros jogos são semelhantes a esses três e todos têm muitas falhas sérias.

Desvantagens do jogo


Esses jogos ensinam apenas conceitos básicos - como variáveis, loops, funções - algo que até os juniores aprendem no instituto. Os jogos são divorciados de tarefas industriais reais , porque não têm multithreading nem transacionalidade - tudo o que o sênior ou o meio conhece. Jogos como esse não são ensinados, e esse é o problema deles.

O jogador controla o personagem ou o "robô" , enquanto na realidade os senhores e intermediários trabalham com objetos de negócios muito complexos. Além disso, o jogador está sempre sozinho , enquanto em TI trabalha em equipe. Qualquer projeto de software é um trabalho em equipe. Como muitos programadores cresceram a partir de introvertidos e o trabalho em equipe costuma ser difícil para nós, eu gostaria que o jogo também aumentasse as habilidades da equipe.

Experiência de jogo pessoal


Ao mesmo tempo, existe uma rica cultura de jogos de tabuleiro no mundo: Munchkin, Magic: The Gathering, Dungeons & Dragons. Mas, infelizmente, não encontrei o "desktop" para programadores.

Pessoalmente, eu e toda a minha família: esposa, filha e gato Tishka, amamos os “desktops”. Além disso, minha filha e eu adoramos criá-las. Nós inventamos o jogo de acordo com o popular programa de uma vez "Revizorro" e vários outros jogos de aventura. Nestas fotos simples, existem 3 exemplos de nossos "desktops".



Como surgiu a idéia de jogos de tabuleiro para programadores? Passei por quatro estágios: a experiência negativa de treinar funcionários, a análise decepcionante dos jogos atuais , a experiência de jogar "truques" e a experiência de criá-los . Tudo isso me levou ao "desktop" para programadores. De fato, por que não fazer o jogo você mesmo?

Requisitos de jogo


Quanto deve ser futurista ou realista?



Uma curta sessão de jogo não dura mais de 15 a 20 minutos, porque, conforme planejado, você precisa jogar este jogo durante o horário de trabalho. Jogando por mais de 20 minutos, as pessoas se empolgam e abandonam o processo de produção, e os chefes caminham e cortam a grama. Portanto, 20 minutos é o ideal: jogamos e continuamos a trabalhar.

O jogo deve ensinar tarefas industriais reais que idosos e médios enfrentam: multithreading, JPA, bancos de dados e estruturas de dados simultâneas . Esses são os tópicos que geralmente não permitem que os juniores pulem na cabeça um certo nível técnico e se tornem idosos. Estou falando não apenas sobre Java, mas em geral sobre todas as linguagens, incluindo Python, C ++ - em todos os lugares há multithreading, bancos de dados e estruturas simultâneas.

A próxima tarefa que o jogo deve resolver é aumentar as habilidades no trabalho em equipe : a formação de uma única linguagem técnica dentro da equipe e a capacidade de discutir o código. Agora, quase toda empresa tem uma revisão de código, e uma situação é frequentemente encontrada: desenvolvedores, especialmente iniciantes, veem o código-fonte, mas não podem descrever em palavras o que está acontecendo nele. Eles podem escrever código, mas não podem discuti-lo - não há dicionário técnico na cabeça. Eu gostaria que o jogo bombeasse este dicionário técnico. Além disso, ter uma linguagem técnica ajuda a escrever documentação de qualidade.

A formação de equipes é um requisito que o RH desfrutará. Não estou falando de teambuilding, onde as pessoas se reúnem e bebem álcool, mas de reuniões em que discutem o código-fonte. Existe essa formação de equipe, e a tarefa do jogo está nela.

Para agradar o senhor e a equipe. Quero que o jogo seja apreciado pessoalmente por mim, como o senhor, o anfitrião e a equipe - para que seja interessante, divertido e até provocador em algum lugar.

O último requisito é muito importante - o jogo deve ser um jogo de tabuleiro real, não online, apenas offline . Várias vezes me pediram para escrever uma versão online deste jogo, mas sempre me recusei. Muitos estão familiarizados com o jogo Go, mas nem todo mundo sabe que, em um jogo chinês real, os chips pretos são feitos de basalto e branco - a partir de uma concha especial do mar. Lascas de plástico não são mais o jogo de Go. Os chineses são sensíveis às sensações táteis durante o jogo - eles devem fazer parte dele. Eu penso exatamente o mesmo. Portanto, meu jogo também deve ser animado e proporcionar prazer tátil.

Um exemplo de "Tabelas"


O jogo que desenvolvi se chama "Quem roubou o monitor?" Como somos todos técnicos, sabemos que o monitor não é a TV que assistimos no trabalho, mas o conceito de multiencadeamento. O objetivo do jogo é apresentar de forma colaborativa à equipe um impasse no multithreading Java . Os jogadores de uma equipe não competem entre si, mas resolvem em conjunto um problema comum - uma verdadeira formação de equipe. Eu escolhi o tópico multithreading, porque esse é o padrão para junho, pelo qual ele muitas vezes não consegue pular, e começa a escrever um bom código industrial. Os negócios exigem grandes capacidades da nossa parte e quase todos os programas industriais são multithread . Portanto, é fundamental que os negócios e os programadores saibam o que é multithreading.

Elementos do jogo


O primeiro elemento é o campo Código-fonte em uma grande folha de papelão grosso. Ele mostra um determinado pedaço de código - em nossa linguagem Java.



O próximo elemento são as varinhas das linhas atuais . São quadros coloridos feitos de arame.



Cada jogador, por sua vez, move sua equipe de transmissão pelo código fonte, exibindo a barra de progresso atual.



O jogo tem dois campos de jogo. A primeira é uma máquina de estado - quadrados e flechas com inscrições.



Tirei a máquina de estado da documentação Java padrão. Todo sênior, médio e até um júnior deve conhecer essa máquina de estado de cor, mas, na minha experiência, nem todos os desenvolvedores de Java sabem, muitos escrevem código sem esse conhecimento. Uma das tarefas do jogo é aumentar as habilidades em conhecer a máquina de estado dos encadeamentos Java .

O próximo elemento são os tokens de fluxo de dupla face .



De um lado, os olhos fechados são atraídos - isso significa que o fluxo está inativo. Por outro lado - um homem correndo - um fluxo está ativo.

Ilustrarei como os chips se movem pela máquina de estado. Se o encadeamento começou a funcionar, o player move o token de status para o estado “novo” - o estado inicial quando o encadeamento acaba de ser criado.



Durante o jogo, como resultado de alguns eventos, o jogador move o chip para o estado "executável" , não esquecendo de entregá-lo ao lado em que o homenzinho está sendo atraído, o que significa que agora seu fluxo está funcionando.



O próximo elemento do jogo são as placas de monitor .



Essas cartas primeiro estão na pilha comum e, em seguida, os jogadores as tomam em suas próprias mãos. Cada monitor é anexado a um objeto Java, dos quais existem dois: "um" e "dois".

O último elemento são as horas dos fluxos .



Provavelmente, todos os técnicos sabem que os fios podem "adormecer" por um certo tempo. Para medir esse tempo no jogo, existem relógios nos quais você pode mover os ponteiros.

Considere alguns movimentos de uma sessão de jogo.

Exemplo de Sessão de Jogo


Temos três jogadores:

  • Michael trabalha para o segmento "principal" - o principal segmento Java.
  • Eugene - fluxo "t1".
  • Svetlana - o fluxo "t2".

Cada um dos jogadores se coloca no lugar de uma das correntes e vive sua vida no processo do jogo. Então ele entende o que significa ser um encadeamento Java.

Michael move a varinha de fluxo para a primeira linha de código.



Eugene e Svetlana ainda estão dormindo - seus threads não foram criados e Mikhail move sua equipe de stream para a próxima linha de código, onde diz <code> Thread t1 = new Thread () </code> - isso significa que o stream será criado por Eugene "t1" .



Eugene não boceja, pega seu chip de fluxo e o coloca no estado "executável" - o lado do homem que está correndo.

Exemplo de trabalho em equipe


Svetlana diz a Eugene:

  • Eugene, por que você colocou o chip do seu fluxo não no estado "novo", mas imediatamente no estado "executável"?

  • Porque não

Pode-se ver que Eugene é o júnior mais inexperiente da equipe, mas Svetlana é mais experiente e diz:

  • Eugene, de acordo com a máquina de estados, o estado inicial do fluxo é "novo".

Eugene concorda com Svetlana e move o chip de seu fluxo para a posição correta.



Este é um exemplo de como a equipe transfere conhecimento durante o jogo. O jogo continua ...

A certa altura, Michael já faz um comentário para Eugene:

  • Eugene, você entrou no bloco sincronizado, mas esqueceu de fazer algo ...

  • Exatamente, eu esqueci de pegar o monitor desse objeto!

Eugene pega o monitor do " um" objeto. Acontece que o fluxo "t1" Eugene possui este monitor.



Então vem o jogo: muitos movimentos, omissões, funcionam com o relógio. Leia mais no vídeo ou nos slides da apresentação .

No final do jogo, Eugene tem um monitor e Svetlana tem outro, e o fluxo de cada um deles é bloqueado pela expectativa dos monitores . Como resultado, o fluxo "t1" e o fluxo "t2" estão no estado "bloqueado", ou seja, observamos um impasse.

Durante a sessão do jogo, cada um dos jogadores verificará pessoalmente, sentirá o que é o impasse, como ele surge e o que é.

Conclusões


A sessão do jogo é curta . 20 , , , . , — 1:n .

. , , . Deadlock — — , «» — heisenbug, .

. , , , . .


. , . : Delphi, — C++, — Haskell.

, Java- 20 . 5 , .



, — , , , . .


deadlock, :

  • Race conditions — , .
  • wait/notify .
  • join/isAlive .

?


, , . , .

JPA- JEE/Spring. , JPA-.

Google, « JPA-».



, , — .



, «» .

  • JEE.
  • SQL.
  • : , , HashMap.
  • java.util.concurrent.

, , .

, , - . , - , . - , .


, . , . , : , , , . - , , .

— «». , . , . .

Linkedin-Artyom Larina ou no GitHub. A partir daqui, você pode baixar os elementos e tentar implementar o jogo em casa.

Este relatório é apenas um daqueles que nos ajudaram a entender a relevância do tópico treinamento e transferência de conhecimento. Como resultado, em 26 de abril , estamos conduzindo o KnowledgeConf totalmente dedicado a isso. E sobre formas modernas e não padronizadas de aprendizado, e sobre a transferência de experiências para iniciantes, haverá muitos relatórios úteis . Junte-se a nós e o problema do crescimento dos funcionários e do compartilhamento de conhecimentos em uma equipe deixará de ser insolúvel para você.

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


All Articles