ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

ソフトウェアエンジニアリングと認知

職業ソフトウェアエンジニアを7年+ やってきて、いわゆる新卒、ジュニアからキャリアをスタートし、今は Site Reliability Engineering 領域で Lead をしている。

こうした中で、自分自身のことを振り返ると、ソフトウェアエンジニアリングとは自己認知との戦いではないか、と思う。

自分自身、自分の認知の歪みでパフォーマンスが著しく出なかった経験が何度もあった。そして認知の矯正によってパフォーマンスが急に出るようになった経験、その両方がある。

昨日たまたま、エンジニアリングと認知について話す機会があったのでついでに記録しておく。

ソフトウェアエンジニアリングに対する認知

ソフトウェアエンジニアリング、システムプログラミング、なんでもいいが、こういったものを取り扱ってビジネス価値を発揮している我々にとって、機械の上で動く、なんらかの入力を通じて動く何某は当然目に見えないし、ソースコードを丹念に追わないと動作原理は理解できない。

そういった「理解できない」こと。「わからないこと」と呼ぼう。あるいは「問題」と呼ぼう。新規開発だろうが既存プロダクトの保守だろうが、大きく我々は「問題」を解決している。その問題解決のためにはこれら「わからないこと」と正しく向き合う必要がある。

「わからないことと正しく向き合う」ということは、対象に対して正しく認知することに他ならない。

問題を正しく認知するとはどういうことか。そのために、どのようなアプローチが有効か。

  • エラーメッセージを正しく読みとり、その指示に従う
  • 自分がした行動と結果を記録し、その因果を捉える
  • 問題の再現させ、発生条件を狭める
  • 内部の仕組みを理解するために、該当するソースコードを読む

正しく認知できてないとはどういうことか。誤ったアプローチとはどういうことか。

  • google で検索し、検索結果に出る対象コマンドをコピペで打ってみる
  • 対象のソフトウェアの参考書を引っ張り出して0から読み直す
  • 同僚に「うまくいきません!」と助けを求める

上記は別に 100% 間違っているわけではない。たまたまそれで解決することもある。しかし、その行動は問題の対象に正しく向き合っておらず、有効性の低いアプローチだと思うだろう。

文字にすればびっくりするが、ここまで極端でないにせよ、後者のアプローチのようなことを取っていたことが僕にはあった。

人間は何らかの外的要因、例えば精神的な安定性であったり、周囲に対する心理的安全性であったりで驚くほど簡単に認知能力が下がり、パフォーマンスが出なくなる。

ここで言いたいのは、

  • 認知能力がソフトウェアエンジニアリングにもっとも重要であり、
  • その認知能力は外的要因で簡単に狂ってしまうものであり、
  • 自身の認知能力を認知する、メタ認知こそがジュニアソフトウェアエンジニアにとって最初に超えるべき壁である

ということだ。ある程度経験を積んできた僕たちは、こういったことを伝え続けるとともに、認知能力を下げない環境づくりに力を割かないといけないと思う。「経験を積むしかない」ことはある意味事実であることは認めるが、それ以上にできることがあると思う。

チームメンバーに対する認知

ジュニアソフトウェアエンジニアの育成、という文脈からもわかるように、(おそらく圧倒的多数を占める)チームでのソフトウェア開発について取り上げる。複数人で協業してソフトウェアを扱う仕事をするにあたって、前述したソフトウェアだけでなく、人間というチームメンバーとも向き合う必要がある。

"正しさ"は環境によって異なる。チームが醸成する価値観によって異なる。ある問題に対してどうアプローチを取るかに対して、絶対的な正解があるとはいえない。だからこそ、もっとも正しいらしいものを、時にはチームで議論をして合意を得ながら、時には個人の責任感を持って、意思決定していく。

チームメンバーはいろんなコミュニケーションの方法を使ってメンバーと協業していくだろう。その代表的な方法として我々は言葉を使う。「こうしたほうがいい」「この方法だとこの面でデメリットがある」「ここの考慮事項を考えておいたほうがいい」様々だ。

しかし、「こうしたほうがいい」という言葉1つにとっても、これを「正しく認知する」ことが求められる。コードレビューの文脈でもよくあるが、コードへの指摘が個人攻撃だと捉えることは十分にありえる。誰もが正しく認知できるわけではないのだ。こうしたほうがいい -> お前は間違っている -> お前のコードは最悪だ -> お前はソフトウェアエンジニアの適性がない あえて極端な例を書いたが、こういう状況は起きうる。これが良い悪いではない、起きうるということを言っている。

ここで言いたいのは、

  • チーム開発が必要な場面において、チームメンバーとの協業の過程でメンバーの言動を正しく認知することが重要だが、
  • その認知能力は外的要因で簡単に狂ってしまうものであり、
  • 自身の認知能力を認知する、メタ認知こそがジュニアソフトウェアエンジニアにとって最初に超えるべき壁である

後ろ2つをあえて同じことを書いた。対エンジニアリングだけでなく、対人間に対しても同じことが言える。

だからこそ、正しく他者の言動を正しく認知するためには相手の言動のその背景を理解する必要があるし、自分が誤解してそうだと思えばその意図を確認する必要がある。

Tech Lead, Senior / Stuff Engineer 相当の Role の人間に高いドキュメンテーション能力や、言語化能力、コミュニケーション能力が求められるのは、大きなインパクトを、多くの人間が関わる中で、より正しく遂行する必要があるからだと思う。

自分にとってのブレイクスルー: 分からないことを受け入れること

自分自身、自分の認知の歪みでパフォーマンスが著しく出なかった経験が何度もあった。そして認知の矯正によってパフォーマンスが急に出るようになった経験、その両方がある。

7年も職業 Software Engineer をやっていると、それなりに挫折も経験したし、良い意味でのブレイクスルーも何度も経験した。

一番直近のブレイクスルーは、直属のマネージャからかけられた「(あの Senior Software Engineer だって)わからないんです。」という言葉だった。

この頃、得体のしれない「技術力」が足りない、という漠然とした課題感があった。しかし、何がどう足りなくて、どういった状態が足りていて、そのために何をすればいいのか、そのすべてが分からない状態だった。

1on1 で、技術力があると思うひとは誰だと思いますか?という問いにいくつかの人をあげた。それに対して、直近あった、難易度が高い問題に対して、そういったクラスの人たちが集まって取り組んでいた事例をあげながら、「この人だって最初から分かってるわけではないんです。この人でも分からないことはあるんです」と言ったことを言ってくれた。

それと同時に、自分がこれまでしてきたことに対して「これまでこういうことをしてきましたよね。だから、もうできるんです。分かってるんですよ。」とも言ってくれた。

これを受けて、分からなくてもいいんだと、分からないことは普通で、当たり前で、そこからどうするかが大事ということと、 自分も分かっていることだってあって、それは肯定して良い、ということを感じることができた。

今思えば、この時、無意識下にあった「分からないことに対する漠然とした不安」が自分の認知能力を奪っていたんだと思う。

この後、テクニカルに難易度が高く、インパクトの大きい仕事をいくつか完遂し、自信を持つことができ、Software Enginering のスキルがあがることで、もともと得意だったコミュニケーションスキルを活かして Team / Project Lead をやれている。周囲から見てもきっとそうだと思うが、自分から見ても、パフォーマンスは大きく変わり、成長できたと思う。

おわりに

当時の自分に、あるいはこれから業界に入ってくるエンジニアに対して、自分ができることは、こういった認知能力の大切さを伝え続けることと、それを阻害しない環境づくりをしつづけることだと思う。

こういうことが書けるようになり、ここまで成長するまで見守ってくれた、手を差し伸べてくれた、前職と現職の全ての方に、心から感謝します。特に、現職の SRE Team にいた・いる上司、同僚が、挑戦と失敗を辛抱強く見守ってくれたおかげです。

業界への恩返しとして、こういうことをやっているので、よかったらどうぞ。