Jira é Turing-completa
(seriot.ch)- Jira Automation pode expressar uma máquina de Minsky com dois contadores infinitos e estados de instrução finitos, mostrando a completude de Turing do Jira
- O estado de um Epic funciona como contador de programa, e as quantidades de Bugs e Tasks vinculados viram os dois registradores, enquanto as regras de Automation formam a tabela de despacho por instrução
INCeDECsão implementados com criação e exclusão de issues vinculadas, e o desvio condicional é decidido por regras condicionais JQL que verificam a quantidade de issues vinculadas- O exemplo de adição, com
A=2eB=3, reduz Bugs e aumenta Tasks, chegando a 5 Tasks e ao estado de parada em uma execução real em*.atlassian.net - O exemplo de Fibonacci reduz os loops usando conversão de tipo de issue e, ao atingir o limite de profundidade de cadeia 10 do Jira Cloud, pode continuar com um novo disparo manual
Máquina de Minsky feita com automação do Jira
- Jira Automation consegue expressar uma máquina registradora de Minsky com dois contadores infinitos e um número finito de estados de instrução, o que permite uma redução que demonstra a completude de Turing do Jira
- O modelo provado por Minsky em 1967 é composto apenas por
INC r; goto Seif r == 0 goto S else (DEC r; goto S') - Os componentes do Jira correspondem a cada elemento da máquina de Minsky
- Registrador A: quantidade de issues Bug vinculadas
- Registrador B: quantidade de issues Task vinculadas
- Contador de programa: estado de uma única issue Epic
- Tabela de despacho: regras do Jira Automation para cada estado de instrução
- Clock: transições acionadas pela automação ou um novo disparo externo após o limite da cadeia
- O estado do Epic codifica a instrução atual, e as regras de Automation verificam a quantidade de issues vinculadas para fazer a transição ao próximo estado
INCeDECsão implementados criando e excluindo issues vinculadas do tipo correspondente, e o desvio condicional é tratado com regras condicionais JQL
Exemplos de execução e limitações
- O programa de adição é composto como um programa de Minsky que reduz
Aenquanto aumentaB1. if A == 0 goto 3 else (DEC A; goto 2) 2. INC B; goto 1 3. HALT - A implementação mínima é composta por um Epic, 5 issues vinculadas e uma regra de Automation para cada estado de instrução
-
Workflow e regras
- No Jira Workflow, crie o estado inicial
BACKLOGe depoisTODO,DEVePROD, configurando todos os estados para que possam transitar entre si - Crie um Epic no estado
BACKLOG - A regra
TODOimplementaDEC A; if A=0 halt, else goto DEV- É disparada quando o estado do Epic muda para
TODO - Se houver pelo menos um Bug vinculado, exclui um Bug e faz a transição do Epic para
DEV - Se não houver Bugs, faz a transição do Epic para
PRODe para
- É disparada quando o estado do Epic muda para
- A regra
DEVimplementaINC B; goto TODO- É disparada quando o estado do Epic muda para
DEV - Cria uma nova Task e a vincula ao Epic
- Faz a transição do Epic para
TODO
- É disparada quando o estado do Epic muda para
- Em ambas as regras, "Allow rule to trigger other rules" está ativado
- No Jira Workflow, crie o estado inicial
-
Valores iniciais e resultado
- Vincule 2 Bugs e 3 Tasks ao Epic para inicializar
A=2,B=3 - Ao fazer a transição do Epic para
TODO, a seguinte cadeia é executada(2,3) TODO → (1,3) DEV → (1,4) TODO → (0,4) DEV → (0,5) TODO → (0,5) PROD - Foi executado em uma instância real
*.atlassian.net, e ao final o Epic chega aPROD, com 0 Bugs e 5 Tasks vinculadas - Essa execução corresponde ao cálculo de
2 + 3 = 5pela automação do Jira
- Vincule 2 Bugs e 3 Tasks ao Epic para inicializar
-
Configuração de Fibonacci
- Convert Issue Type pode mudar imediatamente o tipo de uma issue, como Bug → Story ou Story → Task
CONVERTpode ser expresso comoDEC + INC, então não amplia o poder computacional, mas reduz a tabela de despacho dos loops de movimentação, facilitando lidar com programas mais complexos- Fibonacci é expresso como
(A, B) → (B, A+B), usando três registradoresA=Bug,B=Task,C=Storye três estadosTODO,QA,DEVTODO: if any linked Task exists: CONVERT Task → Story INC Bug transition to TODO else: transition to QA QA: if any linked Bug exists: CONVERT Bug → Task transition to QA else: transition to DEV DEV: if any linked Story exists: CONVERT Story → Bug transition to DEV else: transition to TODO - O estado inicial é
A=1,B=1,C=0, e a sequência1, 1, 2, 3, 5, 8, 13, ...aparece emB, que é a quantidade de Tasks - Diferentemente da máquina de adição, a máquina de Fibonacci não tem estado de parada e roda até atingir o limite de profundidade de cadeia 10 do Jira Cloud
- Ao atingir esse limite, o operador pode disparar o Epic novamente para continuar, e uma única edição de estado reinicia a execução em cadeia
- O Jira Data Center expõe
automation.rule.execution.timeoute configurações relacionadas como propriedades configuráveis - Assumindo criação infinita de issues e execução de regras, a linguagem de automação do Jira pode codificar uma máquina de dois contadores, e pelo critério usual de que computadores físicos também são finitos, as cotas finitas do Jira Cloud não refutam essa construção
1 comentários
Opiniões no Hacker News
O Jira é tão completamente terrível que tem o potencial de se transformar em qualquer outro tipo de terrível
Se Marx conhecesse a Atlassian, o Grundrisse teria saído em chamas
Basta comparar o GitHub Issues de 2014 com o que é hoje: https://github.com/features/issues
E continuam, continuam adicionando funcionalidades duplicadas
O Jira é popular e também tem bons wrappers de API para a linguagem da sua preferência
É surpreendente que desenvolvedores corporativos com espírito hacker ainda não tenham automatizado a maior parte do que o Jira manda fazer com alguma coisa como scripts de linha de comando em Python
Se eu conseguir torná-lo mais de uma ordem de grandeza mais fácil de usar do que para as pessoas que impõem o Jira, o jogo vira e o Jira passa a ser uma ferramenta que eu empurro para me proteger
Às vezes eu usava o Jira de forma quase maliciosa, e ele é excelente para evitar responsabilização
Quando algo dá errado, dá para dizer: “isso estava claramente escrito em cada uma das centenas de atualizações no Jira que eu fiz, você estava lendo, né?”
Agora ainda tem IA, então dá para amarrar tudo com scripts customizados e deixar a IA fazer o trabalho braçal do Jira
Muitas vezes a API consegue fazer coisas que a UI não permite, e como todo mundo se orienta pela UI, você acaba caindo em cantos estranhamente quebrados
Por exemplo, você pode não perceber que o custom_field_5537 precisa ser pareado com o custom_field_442 para aparecer no dashboard de outra pessoa
E o custom_field_10995 diz ser um campo inteiro e também retorna inteiro no XML, mas na criação da tarefa você precisa usar uma string de constante mágica não documentada, enquanto na atualização isso já não é necessário
A UI web não faz assim e, no HTML e nas requisições, entra só um inteiro, enquanto apenas 80% da string coincide com o texto mostrado no dropdown
A automação do Jira foi a pior experiência de programação que já tive
Configurações mais simples com certeza existem e podem até ser bem fáceis, mas ainda assim é absurdo demais
Tristemente, ainda valeu totalmente o esforço. Recomendo muito
Adicionamos a cada ticket um campo de texto customizado para uma descrição legível por humanos, e quando um release era implantado, o script de deploy preenchia automaticamente um timestamp
Fazíamos releases de um ticket por unidade de trabalho e processávamos vários tickets por dia
Combinado com filtros customizados, o Jira fornecia um changelog legível por humanos para cada board e para a empresa inteira, e essas mensagens eram enviadas ao Slack para o lado de negócios, para que todos soubessem o que estava sendo implantado
Também era um log de auditoria de releases pesquisável, ligado às mudanças de código
O processo de deploy também fazia a transição do status dos tickets no Jira, então o desenvolvedor só precisava dar merge do ticket na main para ele ser implantado e concluído no Jira
Também havia muitos pequenos scripts que criavam automaticamente tickets para tarefas recorrentes
Foi tudo muito robusto por anos e provavelmente ainda está rodando hoje
As convenções de nomenclatura dos campos customizados não eram grande coisa, mas se a equipe controla a configuração do Jira, não era difícil manter o mesmo padrão para todos
No começo eu não gostava do Jira e, há muito tempo, ele tinha vários problemas, mas hoje em dia, se você configurar direito, ele não é tão ruim assim
Eu não escolheria para a minha empresa, mas tendo usado como desenvolvedor, gestor, usuário final e desenvolvedor de ferramentas internas, quando ele está configurado e começa a funcionar, em geral não atrapalha muito
Se você adicionar mais texto, o Jira de algum modo vai continuar executando tudo automaticamente em cima de todo esse texto, então vai ficar ainda mais lento
Se a empresa precisar de aquecimento, é só usar o Jira
É bastante flexível e, graças à IA, abriu ainda mais possibilidades
A maioria dos processos depende do Jira, e certas transições disparam webhooks para automação
Assim que consegui acesso a IA, uma das primeiras coisas que fiz foi criar um Jira MCP
Agora eu quase não tento mais mexer no Jira diretamente, e peço ao Claude para criar issues no Jira, escrever comentários, criar subtarefas, vincular issues etc.
Antes eu ficava com medo sempre que precisava investigar como implementar algo e quebrar isso em tarefas
Porque quanto mais detalhadamente eu dividisse, mais issues no Jira eu teria que criar para acomodar cada tarefa
Agora é só organizar tudo num arquivo e deixar o modelo de linguagem grande cuidar do trabalho braçal do Jira
Voltei para um lugar onde trabalhei antes e eles ainda estavam usando JIRA
Na entrevista, obviamente eu disse: “ah, JIRA? vocês ainda usam isso? Consigo usar, sim”
Na prática eu consigo usar, mas fiquei realmente chocado ao ver o JIRA mais recente
Tem tipo mil pequenos incômodos, e um dos piores é que, quando você tenta selecionar texto com duplo clique, o campo de repente entra em modo de edição
O que eu lembrava era o JIRA Server 4.0, e dá para relembrar aqui: https://www.jirastrategy.com/wp-content/uploads/2020/04/depl...
Se ampliar o suficiente, cada issue tinha título, tipo, versão corrigida, versão afetada etc., e a estrutura levava direto aos comentários. Era muito simples
Irrita demais. Erra até no básico da manipulação de texto
Mas um gerente de projeto me disse que gosta disso
Porque não usa duplo clique e arrastar para selecionar uma palavra inteira
Como sempre, usuários mais habilidosos acabam sendo nivelados por baixo por causa da conveniência de gente que mal sabe usar computador
Fico pensando se perdi alguma coisa, se caí num buraco no tempo
Não entendo por que falam do Jira como se fosse Visicalc
Hoje não trabalho numa empresa de TI, então talvez eu tenha perdido alguma grande mudança nos últimos dois anos
Na transição do 4.x para o 6.x vieram também esses pequenos incômodos, como nas caixas cambaleantes do OFBiz e em produtos completamente diferentes com só a aparência combinando
Aqueles engenheiros foram embora faz tempo, e levaram junto os US$ 280 por ação
O problema central do JIRA é que a autoridade para configurá-lo direito sempre fica com poucas pessoas, e elas são preguiçosas, ou não têm tempo, ou não usam aquilo todo dia e por isso não se importam
Claro, esse não é o único problema
É incrivelmente lento e também tem limitações estranhas, como uma issue não poder ser pai de outra issue
O JIRA é lento demais, e os administradores pareciam não saber configurá-lo direito
Só de ter usado já tenho trauma
É só que não existe uma única pessoa neste planeta capaz de configurá-la corretamente
Não dá para responsabilizar a ferramenta pela incompetência humana
Aí a pergunta para quem ela foi feita é um assunto totalmente diferente, e não devemos entrar nisso agora
No fim das contas, um sistema de tickets não passa de um banco de dados com tickets, relações entre tickets e estados
Claro, se houver muitos tickets vinculados, campos personalizados e plugins, a complexidade pode explodir
Mesmo assim, não entendo como uma coisa que lida com dados de texto simples e anexos consegue ser tão insuportavelmente lenta
Finalmente ficou possível jogar Doom no Jira
https://mattrickard.com/accidentally-turing-complete
Então isso explica por que não dá para decidir se alguma tarefa do Jira vai parar ou não
O Jira também fornece uma espingarda pump-action para matar os demônios que surgirem como resultado?
Em compensação, experimente usar Azure Boards e você vai passar a amar o JIRA
Porque não existe software no mundo que a Microsoft não consiga piorar
É difícil encontrar palavras que expressem direito meu desprezo pelo Outlook, e dizer que eu “odeio” nem chega a ser um começo
Ele sofre até para fazer as tarefas mais básicas de receber e enviar e-mails
Recebo uma notificação de e-mail no celular, abro o app e não tem nada lá; puxo para baixo para atualizar e nada acontece
Normalmente ele só aparece de 1 a 15 minutos depois
Tudo o que faço no Outlook é absurdamente trabalhoso
Eu também usei Outlook lá na época do Office 2003 e não me lembro de ele ser tão ruim assim. Não sei como conseguiram regredir tanto
Nem quero começar a falar do Teams. Nem sei direito que problema aquele programa está tentando resolver
Os arquivos compartilhados estão no OneDrive, mas também estão no Teams e, por algum motivo, também no Outlook
Tive que mover arquivos de backup do computador, umas imagens do CloneZilla totalizando cerca de 30 GB, para OneDrive/Teams/Outlook, e isso levou uma eternidade, enquanto o ventilador do meu notebook Ryzen de 6 núcleos com Win11 ficou girando feito louco o tempo todo
Como? Por quê?
Todos os motores de workflow e orquestração são Turing-completos
Porque o próprio objetivo deles é automatizar fluxos de execução
Ou ser disparados de novo por uma pessoa e continuar de onde pararam?
Primeiro, JIRA não é orquestração
Segundo, o que um workflow deve fazer é conectar algum estado com informação externa e permitir manipular isso facilmente
Para ser Turing-completo, precisa de gatilhos e regras, algo como um contador infinito, duas pilhas, uma fita bidirecional etc.
Prove que estou errado
Gosto da automação do Jira
Quando entro num time novo que usa Jira, configuro automações para somar automaticamente os story points das subtarefas e preencher os story points da tarefa pai, ou para mover automaticamente tickets de volta para o backlog se faltarem atributos suficientemente refinados
Por exemplo, quando faltam responsável, story points, prioridade ou descrição
Depois de apenas uma sprint, o board do time fica muito mais organizado
Não sei por que isso não é o padrão, mas é fácil corrigir com automação
O responsável deveria ser atribuído a quem pegou aquela tarefa, e não fazer parte da etapa de refinamento