世界を動かす技術を、日本語で。

Jiraはチューリング完全である

概要

  • Jiraのオートメーション機能チューリング完全性 を持つことを証明
  • Minskyマシン (2レジスタ計算機)を Jira上で実装 する方法を解説
  • 課題リンク数・Epicのステータス で計算状態を表現
  • 加算・フィボナッチ計算例 で動作を実演
  • Jiraの実用的な複雑性 がプログラムと同等であることを示唆

Jiraはチューリング完全:MinskyマシンをAtlassian Automationで構築

  • Jira(Atlassianのプロジェクト管理ツール)チューリング完全 であるというエンジニアリングの通説
  • これまでは曖昧な主張が多かったが、本記事では 厳密な証明具体的な手順 を提示

Minskyマシンの計算モデル

  • Minskyレジスタマシン2つの無限カウンタ有限の命令集合 で構成
    • INC r; goto S (レジスタrをインクリメントし状態Sへ遷移)
    • DEC r; if r==0 goto S else goto S' (レジスタrをデクリメントし条件分岐)
  • 加算プログラム例
    1. DEC A; if A==0 goto 3 else goto 2
    2. INC B; goto 1
    3. HALT
  • Minsky(1967年)がこのモデルの チューリング完全性 を証明

Jiraへのモデル写像

  • レジスタA :Epicにリンクされた Bug課題の数
  • レジスタB :Epicにリンクされた Task課題の数
  • プログラムカウンタ :Epic課題の ステータス
  • ディスパッチテーブル :各状態ごとの Jira Automationルール
  • クロック :自動化による遷移、または手動トリガー
  • INC/DEC :課題の 作成/削除 で実現
  • 条件分岐JQL条件付きルール で実装

加算マシンの実装手順

  • 1. ワークフロー作成

    • ステータス: BACKLOG, TODO, DEV, PROD
    • どの状態からも他の状態へ遷移可能
    • Epic課題 をBACKLOGステータスで作成
  • 2. TODOルール(DEC A; if A=0 halt, else goto DEV)

    • トリガー:EpicのステータスがTODOに変更
    • Bug課題が1つ以上:Bugを1つ削除しEpicをDEVへ
    • それ以外:EpicをPRODへ(HALT)
  • 3. DEVルール(INC B; goto TODO)

    • トリガー:EpicのステータスがDEVに変更
    • 新規Task課題を作成しEpicにリンク、EpicをTODOへ遷移
  • 4. レジスタ初期化

    • Epicに Bug 2件(A=2)、Task 3件(B=3) をリンク
  • 5. マシン起動

    • EpicをTODOに遷移し、遷移チェーンが開始
    • 遷移例:(2,3)TODO →(1,3)DEV →(1,4)TODO →(0,4)DEV →(0,5)TODO →(0,5)PROD
    • 結果:EpicはPROD、Bug 0件、Task 5件(2+3=5の加算結果)

フィボナッチ計算の簡素化

  • Jira Automation の「課題タイプ変換(CONVERT)」で Minsky操作を簡略化
    • Bug→Story、Story→Taskなど即時変換
    • CONVERT=DEC+INC に相当し、分岐表を大幅に縮小
  • フィボナッチ計算例 (A=Bug, B=Task, C=Story)
    • ステータス: TODO, QA, DEV の3状態
    • TODO:TaskがあればTask→Story変換、BugをINC、TODOへ
    • QA:BugがあればBug→Task変換、QAへ
    • DEV:StoryがあればStory→Bug変換、DEVへ
    • 初期状態:A=1, B=1, C=0
    • Bの数として フィボナッチ数列 (1,1,2,3,5,8,13, …)が現れる
    • HALT状態なし、Jira Cloudのチェーン上限10で停止、手動で再トリガー可能

結論

  • Jiraのオートメーション言語2カウンタマシン をエンコード可能
  • Jira Cloudの物理的制限 はあるが、 チューリング完全性の証明 には影響しない
  • Jiraの複雑な自動化本質的にプログラム である理由の説明

Hackerたちの意見

すべてのワークフローとオーケストレーションエンジンはチューリング完全なんだよね。要するに、実行フローを自動化するためのものだから。

その中で無限に動き続けられるのはどれくらいあるの?人間が再トリガーして、途中から続けられるやつとか。

そうは思わないな。まず、JIRAはオーケストレーションじゃないし。次に、ワークフローがやるべきことは、外部情報とステータスを関連付けて、それを簡単に操作できるようにすることだよ。トリガーやルールが必要で、無限カウンターとか、2つのスタック、双方向テープみたいなものが必要だね。俺が間違ってるって証明してみてよ!

Jiraは本当に最悪で、他のどんな最悪なものにも挑戦できるポテンシャルがあるよね。

それとも、アホみたいに完全なのかな? :)

Jiraは疎外の概念の究極の例だね。マルクスがアトラシアンについて知ってたら、『グンドリッセ』はめちゃくちゃ面白くなってたはず。

一番最悪なのは、タスク管理製品を持ってる会社がみんなJiraに向かってること。2014年のGitHubのイシューと今のを比べてみてよ:https://github.com/features/issues それに、無駄な機能をどんどん追加してるし。

だから、どのJiraの操作が停止するかどうかを判断するのが不可能なんだね。

これ、過小評価されてるコメントだね!

それって「JiraでDoomができる」ってことになるの?Jiraはその結果出てくる悪魔を倒すためのポンプアクションショットガンを提供してくれるの?

以前に彼らの自動化フローを深く使ったことがあるなら、驚くことじゃないよね。驚くべきは、彼らの自動化フローツールがどれだけ使いにくいかってこと。やりたいことを達成するためにアセンブリ言語でプログラミングしてる気分になるよ。

Jiraは人気があって、好きな言語のための良いAPIラッパーがあるよね。企業のプログラマーたちがハッカー精神を持ってるのに、PythonのコマンドラインスクリプトとかでJiraでやるべきことを自動化してないのが意外だよ。自分にとってJiraを使いやすくすれば、押し付けられてる人たちよりも圧倒的に楽になる。そうなると、逆にJiraが自分を守るための道具になるんだよね。時には悪意を持ってJiraを使ったこともあるけど、あれは本当に役立つツールだよ。もし何か問題が起きたら、「これ、俺が書いた何百ものJiraの更新で全部明確にしてるから、読んでるよね?」って指摘すればいい。どうするつもりなんだろう?Jiraを使うなって言うの?今はAIがあるから、カスタムスクリプトで全部つなげてAIにJiraの面倒を見させちゃえばいいんだよ。

かなりの数の人がやってるけど、問題はJiraのインスタンスがそれぞれカスタムプロパティのフラクタルな雪の結晶みたいになってて、古い失敗したマイグレーションから新しい組織戦略まで何層にもなってることだね。APIがUIではできないことをできることも多いし、みんなUIに頼ってるから、カスタムフィールド5537とカスタムフィールド442をペアにしないと他の誰のダッシュボードにも表示されないってことに気づかずに変なところで壊れちゃう。さらに、カスタムフィールド10995は整数型のフィールドだって言ってるのに、XMLでは整数として返ってくる。でも、タスクを作成する時にはドキュメント化されてない魔法の定数文字列を使わないと、役に立たないエラーメッセージが出るんだ。ウェブUIはこれをやらないし(HTMLとリクエストではただの整数)、ドロップダウンの表示テキストと一致する文字列は80%しかない。Jiraの自動化は、今までで最悪のプログラミング体験だったよ。もっとシンプルな設定があるのは完全に信じられるし、たぶんかなり簡単なんだろうけど、ほんとにやばい。残念ながら、それでも努力する価値はある。めっちゃおすすめ。

うちの主な問題は、彼らが価格を信じられないほどつり上げてることだけだね。最近、ライセンスとユーザーの数を減らさざるを得なかった。めちゃくちゃ高かったから。

カスタムスクリプトで全部つなげてAIにJiraの面倒を見させちゃえばいいんだよ。まるでJiraの肥大化がまだ足りないかのようだね。もっとテキストを追加すると、すべてのテキストを常に自動的に処理しようとするから、さらに遅くなるよ。会社で暖房が必要なら、Jiraを使えばいい。

何年も前にJetbrainsのYouTrackに移行したんだけど、APIを使ってこんなことをやってるよ。かなり柔軟性があるんだ。AIのおかげで、さらに使いやすくなったね。

うちの会社は基本的にJiraで回ってる。ほとんどのプロセスがJiraに依存してて、特定の遷移が自動化のためにWebhookを発火させるんだ。AIにアクセスできるようになったとき、最初にやったのはJiraのMCPを作ることだった。最近はJiraに触らないようにしてるよ。ClaudeにJiraの課題を作らせたり、コメントを書かせたり、サブタスクを作ったり、課題をリンクさせたりしてる。以前は、何かを実装する方法を調べてタスクに分解するのが嫌だったんだ。細かく分ければ分けるほど、Jiraの課題をたくさん作らなきゃいけなくて。今は、全部ファイルにまとめてLLMにJiraの面倒を見てもらえるから楽になったよ。

ハッカー精神を持った企業プログラマーが、Jiraで頼まれたことのほとんどをPythonのコマンドラインスクリプトで自動化してないのが驚きだ。企業のITがトークンを2秒ごとに期限切れにするから、スクリプトが無駄になるんだよ。マジで、1時間ごとに期限切れになるトークンもあるし。

ハッカー精神を持った企業のプログラマーが、Jiraで求められることのほとんどをPythonのコマンドラインスクリプトとかで自動化してないのに驚いてる。俺が働いてたJIRAを使ってた多くの組織では、こういうことをするための資格を与えてくれなかった。

ここにはすごくナイーブな点が見えるね:* 「企業ハッカー」ってあんまり一般的じゃない。企業の世界では、ほとんどのプログラマーは言われたことをやるだけで、それ以上はしない。イニシアチブを取ると罰せられる。* APIラッパーは実際には良くない。API自体もかなり貧弱だし。JIRAは恣意的に物事を変える伝統があって、特に機能を削除したり、役立つ機能を隠したりする。よく設計されたり実行された製品じゃない。* AIはまだ成熟してなくて、バグトラッカーに求められることには役立たない。ほとんどの企業にとって、こういうやり方は高すぎる。* QAは通常、後回しにされる。予算削減や手抜きの話になると、そこは左も右も真ん中も関係なくなる。ほとんどの企業はQAを負担と見なしていて、価値を生んでるとは思ってない。顧客にQAがあるって言うために、ただそれを装ってるだけ。QAに意味のあることをさせるためには、優秀なエンジニアを雇ったり、開発時間を割いたり、計算リソースを割り当てたりしなきゃいけないけど…それは大変だよね!俺が見たQAのほとんどは、特に国際的な大企業では、見せかけのためだけで、同じほとんど役に立たない手動プロセスを踏んでるだけだった。QAをもっと効率的にするアイデアがいくつかあったけど、実際に成功する製品になる可能性があるか試してみた結果、誰もQAを改善したがってないって気づいた。もし製品が「認証」(製品をテストしたと主張する能力)を安くできれば、実現可能かもしれないけど…これは俺が行きたかった方向でもないし、バグトラッカーをこの方向で改善するのも本当に難しい。---- * 探索的テストっていうのは、ある種の「ファジング」なんだけど、もっと構造化されたもの。ファジングは通常、入力に適用されて、テスト中のプログラムを通るすべての可能な方法を探ろうとする。探索的テストは、組み合わせて長いテストを作ることができるモジュールで構成されるテストなんだ。これによって、プログラムの難しい「コーナー」ケースに到達する問題や、入力に直接(または全く)依存しないコードパスに到達する問題を解決する。

そういうことはやってるけど、あまり話さないようにしてるんだ。「そんなことするな」って言われるのが嫌だから。実際、書きたくても書けないことがたくさんあって、そういうイタズラみたいなことをやってるんだ。自動スワイプとか、レストランの予約を競争したり、友達が家を買えるようにスクレイパーを作ったり、UXがクソなサイトの内部APIに接続したりね。利用規約をたくさん破ってるけど、まあ、楽になるからいいや。これがなかったら今の妻とも出会えなかったと思うし。自分はTinderの成功例かもしれないけど、自動スワイプで利用規約は破ったよ :’) でも、バンされたわけじゃない。特別なことはしてないから、検出もイマイチなんだよね。このコメントを見て複雑な気持ちになったなら、だからこそこういうことを詳しく書かないんだ。最近はLLMがこういうことを解決してくれるし、こういうのを振動コードするのはすごく面白い。今、どの内部APIを使ってるかは言わないけど、進捗を見える化するEdTechプラットフォームでの進捗を楽しんでるから、あまり進捗を見せないのが好きなんだ。Jiraに戻るけど、自分に合った代替UIを振動コードしたし、Googleカレンダーやオフィスにいる時を知るための他のツールとも統合したよ。

うん、前に働いてたところで、彼らのAPIを使って時間を節約するためのいくつかの小さなシェルスクリプトを作ったことがあるよ。各チケットに人間の説明を追加するカスタムテキストフィールドを作ったり、リリースが出た時に自動でタイムスタンプを入れるようにしたりね(デプロイスクリプト)。1回の作業として1つのチケットをリリースしてた(1日にたくさんのチケットを扱ってた)。これにカスタムフィルターを組み合わせることで、Jiraが各ボードや会社全体の人間が読める変更ログを提供してくれたんだ。このメッセージはビジネスにSlackで送られて、みんなが何がライブになってるかを把握できるようになってた。リリースのすべてを検索できる監査ログにもなってて、コード変更に結びついてた。デプロイプロセスもJiraのチケットを移行させるから、開発者はチケットをメインにマージする以上のことをする必要がなかったんだ。ルーチン作業のためのチケットを自動で作成する小さなスクリプトがたくさんあって、何年も超安定してたと思う。今も動いてるんじゃないかな。カスタムフィールドの命名規則はダサかったけど、チームがJiraの設定を管理してれば、みんなが同じページにいるのはそんなに難しくなかった。最初はJiraが嫌いだったし、何年も前は問題が多かったけど、今は設定さえすればそんなに悪くないよ。自分の会社に選ぶことはないけど、開発者として、管理者として、エンドユーザーとして使って、内部ツールを開発してきたから、設定して動かし始めればほとんど邪魔にならないね。

JIRAをまだ使ってる職場に戻ったんだけど、面接の時は「お、JIRA使ってるんだ、使えるよ」って感じだった。でも最新のJIRAを見て衝撃を受けた。小さな不具合が山ほどあって、一番ひどいのはテキストをダブルクリックするとフィールドがエディターモードに入っちゃうこと。俺が覚えてるのはJIRA Server 4.0で、ここで思い出に浸れるよ* - ズームインすれば、各課題にタイトル、タイプ、修正バージョン、影響を受けるバージョンなどがあって、コメントに直行する感じ。すごくシンプルだった。* https://www.jirastrategy.com/wp-content/uploads/2020/04/depl...

あのバージョンのJIRAは、簡単にひどく設定できちゃうからね。それがJIRAの主な問題なんだ。実際にまともに設定する力は、面倒くさがったり、時間がなかったり、毎日使ってない人たちに独占されてる。まあ、問題の一つだけどね。それに、信じられないくらい遅いし、課題が他の課題の親になれないみたいな変な制限もある。

俺の本業ではJiraとかのツールを使わなくなったから、純粋な好奇心から聞くんだけど、プロジェクトチーム全体(オタクだけじゃなくて)でのより良い代替案についての合意はどうなってるの?

編集モードにダブルクリックする件について:そうそう、めっちゃ同意!超イライラするよね。基本的なテキストのことすら間違えるし!でも、プロジェクトマネージャーが言ってたことがあるんだ…彼らはそれが好きなんだって。全単語を選択するのにダブルクリックドラッグなんて使わないから…うーん、コンピュータを上手に使える人が、ほとんど使えない人の便利さに引きずられてる感じ。

面接の時、俺は「JIRA、ああ、まだ使ってるの?」って言ったんだ。使えるよ、って。ちょっと待って、何か見逃した?タイムホールに落ちたのかな?なんでJiraの話をしてるのがVisicalcみたいになってるの?今はIT企業で働いてないから、過去2年間に何か大きなことを見逃したのかも…

うわぁ。JIRAはめっちゃ遅いし、マネージャーたちは正しく設定してるように見えない。使ってた時のトラウマがあるよ!

ほら、ツールのせいじゃないんだ。正しくツールを設定できる人がこの地球上にはいないんだよ…人間の無能さのせいでツールを責めることはできないよね。じゃあ、誰のために作られてるのかって?それは全く別の質問で、今はその話はしないことにしよう。

そうそう、その遅さがいつも気になるんだ。要するに、チケットシステムって単なるチケットのデータベースとチケットと状態の関係の集まりに過ぎないのにね。確かに、たくさんの相互接続されたチケットやカスタムフィールド、プラグインがあれば、爆発的に複雑になるけど。シンプルなテキストデータと添付ファイルだけで動くものが、どうしてこんなに遅くなるのか全く理解できないよ。

JIRAの自動化が大好き。新しいチームでJIRAを使い始めると、自動化を設定して、サブタスクのストーリーポイントを親タスクのストーリーポイントに自動でカウントしたり、完全に洗練されたプロパティがないチケットをバックログに自動で移動させたりするんだ。スプリントの間にチームのボードがもっと整理されるよ。なんでこれがデフォルトじゃないのか分からないけど、自動化で簡単に直せるから。

チケットが洗練されるためにはユーザーの割り当てが必要なの?それは作業をする人が誰に割り当てられるかによるべきで、洗練の一部ではないと思う。

JIRAを使ってる企業の60%以上は、Trelloだけで十分だと思う。タスク管理とレポートでこんなひどい混乱を作り出すなんて、どうやったらできるんだろう。でも、たぶんマネージャーやPOを忙しくさせるためなんだろうね :D

これって本当だよね。Trelloはシンプルさを制約にしてるから、ユーザーが大きな混乱を起こすことはない。でも、やっぱり混乱は起こせるし、真実のソースとしては、ちゃんと物を動かすのは人間だから、あんまり良くはならない。すべてのプロジェクト追跡アプリは、根本的な問題の原因は同じ:ユーザーなんだ。

Atlassianもこれを知ってると思うよ。Jiraで基本的なカンバンボードをセットアップすると、ほぼTrelloのボードになるんだ。デフォルトのオプションの一つとして提供されてるし、こんなシンプルな選択肢があるとはちょっと驚いたよ。もちろん、複雑さはあって、余分なカラムを追加したくなった瞬間、深い穴にハマっちゃうけどね。

たぶんそうだね。でも、Trelloは最近大規模な数日間の障害があって、コメントしたりカードを動かしたりできなかったから、今の時点で誰かに勧めるのは難しいな。

地球上のすべてのプロジェクトマネージャーが、朝のスタンドアップで「もう開発者はいらないかな、ハハ」ってジョークを言う前に、ここに書いておく。