💡

エンジニアリング、マネジメントに続く第三の領域「ナレッジング(Knowledging)」

に公開

エンジニアリング、マネジメントに続く第三の領域

ナレッジング(Knowleding) と名付けました。

ナレッジ(概念)を扱う専門職です。

皆さんも日頃から様々な概念を扱っていると思います。いくつか挙げます:

  • 心理的安全性
  • エンゲージメント
  • 1on1
  • AMA
  • ティール組織
  • スクワッド(Spotifyモデルの分隊)
  • SSoT(信頼できる唯一の情報源)

このような概念を知っているのと知らないのとでは、だいぶ違います。また、このような概念を 必要に応じて新しくつくったり、少しカスタマイズできたり するとなお強いです。

エンジニア、マネージャー、そしてナレジャー

いずれにせよ概念を扱っているわけですが、これには高い専門性が必要のようです。少なくともエンジニアやマネージャーにできることではない。畑が違います。エンジニアはソフトウェアを扱い、マネージャーは人を扱いますが、どちらも 概念は扱っていない。概念を扱うには、もう一つ別の役割が要るのだということがわかってきました。これを ナレジャー(Knowledger) と名付けました。

概念については、従来は「エンジニアリングやマネジメントをやってきて」「上手く行ったものを」「あとから言語化して概念の形で整理した」という事後的なつくりかたばかりでしたが、今後は それだけではありません。事前に仮説的に概念をつくって議論したり試したりできます。あるいは、巷の概念を持ち込んで、少しカスタマイズしてフィットさせることもできます。

別の言い方をすると、従来は誰もが概念に対して無力だったのです。SIer に開発を任せるように、世の中のどこかが「上手くいって、かつ言語化されたもの」を下ろしてくるまで待つしかなかった。そうではなく、自らの手で概念の荒波を泳げるのです。ナレジャーなら可能です。

ひとりのナレジャーとして発信を始めます

ひとまず英語圏向けに、DEV Community でブログを始めます。

以下は DEV Community への投稿フロー

本編はここで終わりです。

あとは DEV Community にどうやって投稿しているか(翻訳含む)という技術的な話を整理します。

VSCode を使って Markdown で書いてます

日本語記事は普通に書いて、OpenAI API で英語に翻訳します

Cline につくらせました。

# Translator 仕様

## 実装方法
- Python でつくる
- OpenAI API を使う

## 動作
- 下書き `xxxx.md` が与えられると、その英訳を OpenAI API により作成し、清書 `xxxx_EN.md` として保存する
- 使用するプロンプトはファイルの形で与えられる。**プロンプトファイル(Prompt File)** という

コマンドラインは次のようになる。

$ python translator.py --input xxxx.md --prompt prompt.md

## VSCode コマンド機能として
- Translator は VSCode のコマンド機能から呼び出せるようにする
- 具体的には「Execute Translator for DEV COMMNUNITY」コマンドを追加し、今開いている xxxx.md に対して実行できるようにする

## プロンプトファイルについて
- markdown ファイルとして記述する
- 変数として `%body%` をサポートしており、Translator はプロンプトをつくる段階で以下のようにする
    - 1: 下書きファイルとプロンプトファイルを読み込む
    - 2: プロンプトファイルの `%body%` の部分を、下書きファイルの内容に置換する
    - 3: 2 の内容が正式なプロンプトとして、これを API に投げる
        - この正式なプロンプトを **オフィシャルプロンプト(Official Prompt)** という
- 文脈と指示はすべてオフィシャルプロンプトに書いてあるとみなして良い

#!/usr/bin/env python3
"""
translator.py

日本語のMarkdown下書きを英訳し、DEV Community向けの清書ファイルを生成するスクリプトです。

Usage:
    python translator.py --input xxxx.md --prompt prompt.md

環境変数 OPENAI_API_KEY に OpenAI API キーを設定しておく必要があります。
"""

import argparse
import os
import sys

import openai

openai.api_key = os.environ["OPENAI_API_KEY"]
client = openai.OpenAI()

def request_to_model(model_name, prompt, timeout=130):
    try:
        response = client.chat.completions.create(
            model=model_name,
            messages=[
                {'role': 'user', 'content': prompt},
            ],
            timeout=timeout
        )
        return response.choices[0].message.content
    except Exception as e:
        return f"[ERROR in {model_name}]: {str(e)}"

def main():
    parser = argparse.ArgumentParser(
        description='Markdown下書きをOpenAI APIで英訳し、`_EN.md`ファイルを出力します。'
    )
    parser.add_argument(
        '--input', '-i',
        required=True,
        help='入力下書きMarkdownファイルのパス (例: draft.md)'
    )
    parser.add_argument(
        '--prompt', '-p',
        required=True,
        help='プロンプトテンプレートファイルのパス (例: prompt.md)'
    )
    args = parser.parse_args()

    api_key = os.getenv('OPENAI_API_KEY')
    if not api_key:
        print('Error: 環境変数 OPENAI_API_KEY を設定してください。', file=sys.stderr)
        sys.exit(1)
    openai.api_key = api_key

    # プロンプトテンプレートを読み込み
    try:
        with open(args.prompt, 'r', encoding='utf-8') as pf:
            prompt_template = pf.read()
    except Exception as e:
        print(f'Error: プロンプトファイルの読み込みに失敗しました: {e}', file=sys.stderr)
        sys.exit(1)

    # 下書き本文を読み込み
    try:
        with open(args.input, 'r', encoding='utf-8') as inf:
            body = inf.read()
    except Exception as e:
        print(f'Error: 入力ファイルの読み込みに失敗しました: {e}', file=sys.stderr)
        sys.exit(1)

    # %body% を置換してオフィシャルプロンプトを生成
    official_prompt = prompt_template.replace('%body%', body)

    # OpenAI API で英訳を取得
    translation = request_to_model('gpt-4o', official_prompt)

    # 後処理
    translation = translation.replace("’", "'") # プロンプトでも直らんので荒療治

    # 出力ファイル名を生成して書き込み
    base, ext = os.path.splitext(args.input)
    output_file = f"{base}_EN{ext}"
    try:
        with open(output_file, 'w', encoding='utf-8') as outf:
            outf.write(translation)
    except Exception as e:
        print(f'Error: 出力ファイルの書き込みに失敗しました: {e}', file=sys.stderr)
        sys.exit(1)

    print(f'Translatorが正常に完了しました。生成ファイル: {output_file}')

if __name__ == '__main__':
    main()

ちゃんとした英文記事を出してもらうために、プロンプトはチューニングしました

現時点の内容を載せます。

細かい Markdown 文法を指定したり、ナレッジングに関する用語定義をしたりしています。また英語圏向けに日付表記を ISO 8601 にする、など細かい指示も入れています。

※なお、これらは GPT-4o 前提のプロンプトであり、他のモデルを使った場合は当然通用しない可能性があります。

あなたはプロのバイリンガルライターです。日本語の Markdown 形式のブログ記事を、DEV Community 向けに自然な英語に翻訳してください。

翻訳時は、以下に従ってください。

- 元の Markdown 構造(見出し、リスト、コードブロック、引用など)を保持してください
- サブリストのインデントは必ず 4 space で出力してください
    - たとえばこのようになります(深さ2)
        - たとえばこのようになります(深さ3)
            - たとえばこのようになります(深さ4)
- 本文中の定義を優先的に使用してください。
- アポストロフィーは半角を使ってください。`’` ではありません。`'`を使います。
- 引用記法中の空行はそのまま使ってください。
    - `> ` には意味があります。スペースも含んでいます。このまま使ってください。`>` のように Right Trim しないでください
- 見出し行の次の行には空行を入れないでください
- `YYYY/MM/DD` フォーマットの日付文字列は、ISO 8601 フォーマットに変換してください。これは英語圏用に読みやすくするためです
- 生成した結果の全体を markdown コードブロックで囲わないでください。生成した結果はそのまま出力してください

また以下の用語集も踏まえてください。

- ナレッジング(Knowledging)
    - ナレッジを扱うこと。言語化ステップ、生産ステップ、共有ステップ、啓蒙ステップの4つのステップから成る
- ナレジャー(Knowledger)
    - ナレッジングの専門職
    - マネジメントはマネージャー、エンジニアリングはエンジニアが行うように、ナレッジングはナレジャーが行う
- ナレジニア(Knowledgineer)
    - ナレジャーの一種で、生産ステップでソフトウェアをつくる
- ナレッジ・ライター(Knowledge Writer)
    - ナレジャーの一種で、生産ステップでドキュメントをつくる
- カタリスト(Catalyst)
    - 組織の内外を行き来してナレッジを持ち込んだり持っていったりする、ナレッジの媒介・伝達・啓蒙役
- ナレッジ・アーキテクト(Knowledge Architect)
    - 組織としてナレッジングに取り組む際の「仕組み」とその全体像をリードする役割。アーキテクト職は多数存在するが、そのナレッジング版

以下、翻訳対象の本文です。

%body%

翻訳処理はショートカットキーからすぐ呼べるようにします

tasks.json を定義して、タスクとして実行できるようにしました。

これにより、VScode からは

  • ctrl + shift + p
  • 「Tasks: Run Task」を選んで Enter
  • 「Run Translator for DEV Community」を選んで Enter

の 3 ステップですぐ呼び出せるようになります。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Run Translator for DEV Community",
            "type": "shell",
            "command": "python",
            "args": [
                "${workspaceFolder}/translator.py",
                "--input",
                "${file}",
                "--prompt",
                "${workspaceFolder}/prompt.md"
            ],
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared"
            },
            "problemMatcher": []
        }
    ]
}

DEV Community への投稿は手作業コピペです

どうせタグの指定やプレビュー内容の確認をするので、ここまでは自動化に踏み込みません。また管理がややこしくなるので、DEV Community 側とも連携はしていません。

ついでに GitHub Pages も整える

静的サイトで一覧で見れると便利ですので、ついでに整えました。GitHub.com からリポジトリの設定画面を開いて、有効にするだけです。

トップページは index.md になるので、これをつくるスクリプトもつくりました(Cline につくってもらいました)。

おわりに

前半では、新しい領域「ナレッジング」について提唱しました。

後半では、DEV Community で英語ブログを始めたことをご紹介しつつ、内部でどう記事管理や翻訳をしているかを解説しました。

生成 AI のおかげで便利な時代になったなとつくづく感じます。それではまた。

GitHubで編集を提案

Discussion