ブログ

ターミナル操作の「質」を向上させる:シニアエンジニアが意識している決定的な習慣

今回は、The 6 Terminal Habits That Separate Senior Engineers From Everyone Else という記事を参考に、シニアエンジニアとそれ以外のエンジニアを分けるターミナル操作の習慣について、実務に役立つポイントを整理して紹介します。

シニアエンジニアとそうでない人の違いは、単に「知っているコマンドの数」だけではありません。シェルというツールをどう捉え、いかに「自滅するミス」を未然に防いでいるか、というメンタルモデルの違いにあります。

私自身、以前は自分のエイリアス設定や派手なプロンプトに満足していましたが、熟練のエンジニアとペア作業をした際、自分の操作がいかに危ういものだったか痛感したことがあります。彼らが速いのはショートカットのおかげではなく、一歩先を読んだ「守りの習慣」があるからでした。

特に実務で差が出る3つの習慣について、具体的なコードを交えて見ていきましょう。


1. 自滅を防ぐスクリプトヘッダーの徹底

キャリアの浅いうちに書くBashスクリプトには、エラーハンドリングが抜けていることがよくあります。コマンドが失敗しているのに処理がそのまま進んでしまい、気づいた時には中途半端な状態でデプロイが完了していた、といった経験はないでしょうか。

シニアエンジニアが呼吸をするように書くのが、以下のヘッダーです。

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

この数行があるだけで、スクリプトの堅牢性は劇的に向上します。それぞれのオプションの役割を表にまとめてみました。

オプション 役割 メリット
set -e エラーが発生した時点で停止 失敗に気づかず処理が進むのを防ぐ
set -u 未定義の変数を参照するとエラー 空文字による予期せぬ挙動(rm -rf $VAR/ など)を回避
set -o pipefail パイプ内のエラーをキャッチ パイプラインの途中での失敗を見逃さない
IFS のリセット 区切り文字を改行とタブに限定 ファイル名に含まれるスペースによるバグを防ぐ

処理の流れをイメージにすると、以下のような違いになります。

flowchart TD
    subgraph 一般的なスクリプト
    A[コマンド1失敗] --> B[コマンド2実行] --> C[何となく終了]
    C -.-> D[不整合な状態が発生]
    end

    subgraph シニアのスクリプト
    E[コマンド1失敗] --> F{set -e有効?}
    F -- Yes --> G[即座に異常終了]
    F -- No --> H[後続へ]
    G -.-> I[安全性が保たれる]
    end

このように、最初から「失敗することを前提」に組んでおくのがシニアの流儀といえます。


2. 一時ファイルを作らない「プロセス置換」の活用

設定ファイルの差分を確認したり、複数のコマンドの結果を組み合わせたりする際、つい「一時ファイル」を作ってしまっていませんか?

たとえば、リモートサーバーの設定とローカルのGitにある設定を比較する場合、以前の私はこのようにしていました。 1. ssh で取得した内容を temp1.yaml に保存 2. Gitの内容を temp2.yaml に保存 3. diff を実行 4. 一時ファイルを削除

しかし、シニアエンジニアは「プロセス置換(Process Substitution)」を使い、これらをストリームとして処理します。

# 一時ファイルを作らずに比較
diff <(ssh prod-server cat /etc/app/config.yaml) <(git show HEAD:config/config.yaml)

# 出力を複数の処理に同時に渡す
some-expensive-command | tee >(process-a) >(process-b) > /dev/null

<(command) という書き方により、bashが一時的なファイル記述子(ファイルディスクリプタ)を作成してくれます。

graph LR
    subgraph プロセス置換のイメージ
    A[コマンドAの出力] -- Stream --> C[diff / 比較]
    B[コマンドBの出力] -- Stream --> C
    end

「ファイルという形あるもの」として考えるのではなく、「データの流れ(ストリーム)」として捉えることで、ディレクトリを汚さず、クリーンアップの手間も省けるようになります。


3. ジョブ制御を使いこなし、コンテキストを維持する

急な割り込み作業が入った際、新しくターミナルやタブを開き直していませんか? シニアエンジニアは、今あるセッションの中でジョブを器用に切り替えます。

特に便利なのが Ctrl+Zfg の組み合わせです。

  1. Ctrl+Z: 実行中のプロセス(vimや重い処理など)を一時停止し、バックグラウンドへ送ります。
  2. 作業: 別のコマンド(grepで検索など)を実行します。
  3. fg: foreground の略。中断していたプロセスを元の状態から再開します。
sequenceDiagram
    participant U as ユーザー
    participant S as シェル
    participant P as メインプロセス(Vim等)

    U->>P: 編集作業中
    U->>P: Ctrl+Z (一時停止)
    P-->>S: バックグラウンドへ退避
    S-->>U: プロンプトを返す
    U->>S: 別の調査コマンド
    S-->>U: 結果を表示
    U->>S: fg
    S-->>P: フォアグラウンドへ復帰
    P-->>U: 作業再開

「新しいタブを開く」という動作は、脳のワーキングメモリを消費しがちです。一つの画面の中でコンテキストを切り替える習慣がつくと、集中力を維持したまま作業を進められるようになるかと思います。


まとめ

今回紹介した習慣は、どれも「派手さ」はありません。しかし、これらを無意識に行えるようになることで、予期せぬバグを防ぎ、思考のノイズを減らすことができます。

まずは自分のシェルスクリプトに set -euo pipefail を入れるところから始めてみてはいかがでしょうか。少しずつ「守り」を固めていくことが、結果としてシニアらしい、速くて正確な仕事に繋がるのだと思います。

参照記事