開発の「ブラックボックス」を解明せよ:Sublime Text × ActivityWatchで実現する、計測可能なエンジニアリングの極意
「今日、自分は本当に価値のあるコードを書いたか?」
この問いに即答できるエンジニアは、極めて稀です。私たちは日々IDEの迷宮を彷徨い、コンテキストスイッチの嵐に揉まれています。しかし、真に生産性の高いエンジニアは、自分の「時間」という最も貴重な資本が、どのファイルに、どの機能開発に投下されているかをデータで把握しています。
今回は、Sublime Textという極限まで軽量なエディタを、「ただのテキスト入力ツール」から「高精度な作業時間計測デバイス」へと進化させる、プロの実践術を伝授します。
—
1. なぜ「感覚」ではなく「データ」で時間を測るべきか
多くのエンジニアが陥る罠は、タイムトラッキングを「管理のため」の苦行と捉えることです。そうではありません。これは「自分の集中力のバイオリズムを可視化し、デバッグの沼にハマっている時間を特定するためのフィードバック・ループ」です。
ActivityWatchは、ローカルで完結するオープンソースの追跡ツールです。これをSublime Textと連携させることで、どのモジュールを修正している時に最も思考が停滞しているのか、あるいはどの言語のプロジェクトでフロー状態に入りやすいのかを、プライバシーを一切侵害することなく解析可能になります。
—
2. 実装の核心:Sublime Text APIでイベントをフックする
Sublime Textの真の力は、その強力なPython APIにあります。プラグインをインストールするのではなく、自ら`EventListener`を定義し、現在開いているファイルをActivityWatchのHTTP APIへ投げる「最小にして最強」のスクリプトを構築します。
以下のコードを、Sublime Textの `Packages/User/` 配下に `ActivityTracker.py` として保存してください。
import sublime
import sublime_plugin
import urllib.request
import json
ActivityWatchのデフォルトポート(5600)へイベントを送信
AW_ENDPOINT = “http://localhost:5600/api/0/buckets/sublime-text-tracker/heartbeat”
class ActivityTracker(sublime_plugin.EventListener):
def on_activated(self, view):
# ファイルがアクティブになった瞬間にメタデータを送信
self._send_heartbeat(view)
def on_post_save(self, view):
# 保存時もトリガーすることで、作業の区切りを明確化
self._send_heartbeat(view)
def _send_heartbeat(self, view):
filename = view.file_name() or “untitled”
data = {
“timestamp”: None, # ActivityWatch側で現在時刻を付与
“duration”: 5, # 5秒間のアクティビティとみなす
“data”: {
“file”: filename,
“project”: view.window().project_file_name() or “no-project”
}
}
# 非同期送信のロジックは必要に応じてスレッド化することを推奨
try:
req = urllib.request.Request(AW_ENDPOINT, data=json.dumps(data).encode(), method=’POST’)
req.add_header(‘Content-Type’, ‘application/json’)
urllib.request.urlopen(req, timeout=1)
except:
pass # サーバーがオフラインでもエディタを停止させない
—
3. 開発スピードを加速させる「神プラグイン」と設定の共有化
Sublime Textを使いこなす上で、プラグインは「道具」であり、設定は「思想」です。チーム開発において最も重要なのは、「エディタの挙動を標準化し、個人のカスタマイズによる認知負荷を最小化すること」です。
絶対に入れるべきパッケージ
- LSP: Language Server Protocolを統合。これなしの現代開発はあり得ません。
- Package Control: 必須のパッケージマネージャー。
- GitSavvy: ターミナルに戻ることなく、高度なGit操作(リベースやチェリーピック)をコマンドパレットで完結させるための必須ツールです。
チーム共有のための「プロジェクト設定」
`.sublime-project` ファイルをリポジトリルートに配置し、チームで設定を同期させましょう。これにより、環境依存を排除した開発フローを実現できます。
{
“folders”: [
{
“path”: “.”,
“folder_exclude_patterns”: [“node_modules”, “.git”, “dist”],
“file_exclude_patterns”: [“.log”, “.tmp”]
}
],
“settings”: {
// プロジェクトごとにインデントやタブ幅を強制統一
“tab_size”: 2,
“translate_tabs_to_spaces”: true,
“trim_trailing_white_space_on_save”: true,
“ensure_newline_at_eof_on_save”: true,
// LSPの設定をプロジェクト単位で有効化
“lsp_enabled”: true
}
}
—
4. 伝説のリードが教える:隠れた生産性ハック
最後に、操作性を劇的に変える「小技」を紹介します。
1. `Ctrl + P` (Goto Anything) の真の活用: 単なるファイル検索と思っていませんか? `:` を入力して行番号へジャンプ、`@` でシンボル検索、`#` でファイル内全文検索。これらを組み合わせることで、マウスに触れる回数がゼロになります。
2. 多重カーソル(Multi-Cursor)の多用: `Ctrl + D` で単語を選択し、次々と出現する同一単語を書き換える。これは正規表現置換よりも圧倒的に速く、ミスが少ない手法です。
3. コマンドパレットのカスタマイズ: `Sublime Text -> Preferences -> Key Bindings` に、頻繁に使うアクションを独自のショートカットで登録してください。例えば、`GitSavvy` のステータス確認に `Alt + G` を割り当てるだけで、開発のテンポは別次元へ加速します。
—
結論:計測し、最適化し、超越せよ
ActivityWatchを導入し、Sublime Textからデータを吸い上げることは、エンジニアとして「自分の働き方」というコードをリファクタリングする行為です。
「どのファイルに一番時間をかけたか?」という問いに対する答えが、ダッシュボード上に現れた時、あなたは初めて自分の開発スタイルを客観視できます。そのデータは、次回の見積もりの精度を上げ、無駄なコンテキストスイッチを減らし、あなたをよりクリエイティブな仕事へと導く羅針盤となるはずです。
今すぐ設定ファイルを開き、あなたのエディタに「意志」を与えてください。それが、プロフェッショナルとしての第一歩です。