元々数理モデル構築・検証の研究をしていた僕が、約3年エンジニアとして働き、専門分野関連の仕事以外に、システム開発を0から勉強して開発に携わった。
そんな中で、自分が自分に対して楽しく働く上で大事にした方が良いと思うことを3つ挙げる。
何が嬉しいか、何が課題かを正しく理解する
システム開発で一番最初に入ったプロジェクトで既に出来上がっているシステムの保守だった。課題設定は字面では分かる、動いているロジックも(その時は完全に理解していたわけではないが)なんとなく分かるが、機械学習と特段関わりがある訳では無く、やる気が出なかった。その上、やる気が出ないとアウトプットの質が大きく低下する気分屋なので(社会人としてどうなんだというツッコミは至極真っ当・だからこそ面白いと思えるようにフレーミングすることが必要なんだけど)、システム自体の理解不足も相まってチームに貢献できておらず序盤はつらかった。
その後、問題としての難しさやシステム構築上の難しさを理解した上で資料を見ると、内容が頭に入り、問題意識に共感できるようになった。
大枠は分からずとも特定のタスクを処理することができる人も多いと思うが、自分は課題感の腹落ちがないと手が動かないタイプであると言うことがよく分かった。
ブラックボックスとして扱う範囲を決める
無知な僕がシステム開発について全部キャッチアップした上で開発に加わると途方もない時間がかかりチームにとって僕が何も貢献していないことになる。
それはチームにとって、ひいては僕の存在意義として良くないので、現在のタスクに直接的に関係がない部分については、「よく分からないけれどこれを入れたらこれが動いてこれが出てくる」と言うブラックボックスとして扱って今今のタスクに関係がある箇所のみ理解して開発を進めるという切り分けが大事だと思った。
ブラックボックスにした箇所は次のタスクで取り組むことになればベストだがそうでない場合は隙間で少しずつ理解していく。
数学の文脈で言うならば、ある定理の証明の一定の行間を取り出して命題とし、命題の証明は別途行った上でそれを用いて定理の証明とすることがよくある。その際に命題自体の証明は終えていないが事実として借用して定理の証明を行う感覚に近い。
PCで作業するときに、「A」のボタンを打ってなぜ画面に「あ」と言う文字が表示されるのか、調べ物をするときに検索ボックスに入力してエンターを押すとなぜ検索結果が表示されるのか、、を全てクリアにした上で仕事を進めることは現実的ではない。
上の例は極端だが、システム開発において、特に初心者が少しずつキャッチアップする過程において「今理解しなければならないもの」と「今必ずしも理解しなくても良いもの」を切り分けることは重要だと思った。
余白を見つける (例外あり)
「1. 何が嬉しいか、何が課題かを理解する」でも述べた通り、やる気にムラがあるタイプで、自分の目の前を面白い問題で満たすために重要なこと。
全てやることがToDoリストレベルで明確になった状態でパスを受けてやるだけの状態になると楽しくない。もう少し抽象度の高い状態でパスを受けて曖昧さの中で自分がやりたい方向性を見つけて進んでいくことがとても楽しい。
それだけだと飽き足らず、アルゴリズムの観点で遊べそうな問題を見つけて、それの改善をしたときは特に楽しかった。一部は上長の許可を得て、Qiitaに投稿している。
自分らしいアウトプットをすることを自己目的化することは良くないが、それでも何かプロジェクトを進める中で、自分が楽しめそうな問題設定を見つけて、切り出して、それに労力を割く行為がとても楽しい。反対にそれを正当な理由なく止められる場合は、僕がそのプロジェクトに参画する理由が無くなる。
但しこれには例外があり、特定の技術(e.g. プログラミング言語/ツール)にキャッチアップしたい or 特定のプロジェクトにキャッチアップしたい と言う場合だ。
その際に余白が存在してしまうと、パニックになりかねないので、具体的にやることを明確にした上でタスクをパスしてもらった方が良い。
かなり自分の性格に依存していると思う。