積み重ねてきた技術と知恵

10月4日金曜日、晴れ(朝は雨)

後輩くんが Jenkins の設定で悩んでいたので手伝う。

ビルドの結果生成される .dSYM を Jenkins のジョブ成果物として登録したい、というもの。(会社システムの都合上、ジョブ成果物ではなくファイルサーバーに置いてほしいと考えていたけれど、そこは追い追い)

ファイルシステムの構造。ルートディレクトリーからパスを追いかけていくことでファイルへの唯一のアクセス方法を決める絶対パス指定。カレント(.)と一階層上(..)をつかって現在位置から特定する相対パス指定。
find コマンドによる検索。検索指定で使える正規表現。
シェルによる任意文字マッチ(?)と任意文字列マッチ(*)の展開、環境変数展開。文字列の、クオートなし

$STRING

シングルクオート

'$STRING'

ダブルクオート

"$STRING"

での扱いの違い。(空白文字が区切り文字になるか、ならないか。シェルによる環境変数やパス文字展開が実行されるか否か、という違い)
これら変数展開が、起動するコマンドに渡される「前」にシェルによって解釈実行されていること。(「ls *.txt」は「*.txt」にマッチするファイルをシェルが探して展開しつくしてから「ls」コマンドに複数の引数としてファイル名が渡ってくる)
コマンドのリダイレクト、パイプライン、標準入出力と標準エラー出力。(「find」した結果を「grep」したり「sort」したり、「head」で数を絞ったり……)(そういえばコマンド戻り値までは話が及ばなかった)(でも「touch」コマンドでダミーファイルをつくったとき何しているのか聞かれ、タイムスタンプの話になり差分コンパイルの話に飛んだりはした)

僕は、誰かが教えてくれたというのはなくて、本に書かれていることやネットの情報、あるいはマニュアル(man ページ)を漁っては試し、実践で体得してきた。
僕の年齢プラマイ5歳のプログラマーたちも、まず間違いなくそうだろう。

「そういうものだ、苦労して学びなさい」なんて言う気はさらさら無い。ただ、あまりに自分が自然に使いこなしている(使っている意識さえない)基礎技術のために「教える」必要が感じられないのが問題。
プログラマーをやっているということの裏には、膨大な、気が遠くなるほどの知識が、技術が積み上がっているんだなあ……。

(dSYM という名前から「ああ、デバッグシンボルのことだろうな。リリースパッケージだとストリップして抜いてしまうからシンボル情報なくなるものな」と推測が働くとか)

* * *

シェルスクリプトを書き、 Makefile を書き、その裏で使える数々のコマンドを知り、システムの設定を知り、アプリケーションが動くということの背景を知り(ダイナミックリンクライブラリーだとかエントリーポイントとか)、コンパイラーがあるいはインタープリターが使え、必要となるライブラリーを掻き集められ、セキュアコーディングでき、正しい暗号アルゴリズムの使い方を知っていて、SQL を使えてテーブル設計ができ……。

知っていなくても、できることはある。けれど、知っていればこそ素早くできることがたくさんある。実際、昼会でもたびたび助言を与えていた新人くんが一週間かかってそれでもできなかったことを、僕は30分程度でより良い形で実現できてしまう。
これはうん10年とこの世界で生き抜いてきた中で身につけた知識・技術の差。教えられたものでないから体系だてて教え、伝えることが、できない。

でもこれを、なんとか教え、伝えられるように、なりたい。(それを学びたい、受け取りたいという奇特な人がいるかは不明だけれど……)

(今日はふだん感じられない自分の知識の分厚さにちょっと驚き、そしてちょっと気分がよくなった)


この記事が気に入ったらサポートをしてみませんか?