フロー状態: ソフトウェアエンジニアがパフォーマンスを最大化するための戦略
はじめに
ソフトウェア開発において、まるで時間を忘れるかのようにタスクに没頭する時間。それはエンジニアにとって最も生産的で充実した時間と言えるでしょう。反対に、タスクへの集中が途切れ、ただ時間が過ぎ去るだけの日は、一日の終わりに満足感を感じづらくなることでしょう。(これは私自身もよく経験します)
これら「時間を忘れて没頭する」瞬間を再現し、増やすことは可能でしょうか。この記事では、そのような状態を「フロー状態」と呼び、ソフトウェアエンジニアがこの状態をどのように達成できるのかを探求します。
フロー状態とは
「時間を忘れて没頭する体験」を心理学者のミハリ・チクセントミハイ氏(以下チクセントミハイ氏)は「フロー」と定義しています。彼はこの感覚についてチェスプレイヤーやロッククライマー、作曲家など多岐にわたる人々にインタビューを行いました。その際、多くの人が「まるで川の流れに乗っているかのような感覚」と説明したことから、この用語が生まれたようです。
では、フロー状態になると人はどうなるのでしょうか。フロー状態になると、個人は特定の活動に全面的に没頭します。集中力が増し、その作業自体から喜びを感じるようになります。結果として、驚くほどのパフォーマンスを発揮できるのです。さらに、他人の視線が気にならなくなり、時間の感覚が変化します。スポーツ選手の場合、一瞬の出来事が非常に長く感じられたり、一方、芸術家の場合は時間が一瞬で過ぎ去ったように感じることがあるのです。
フローに入るための条件
チクセントミハイ氏は、多数のインタビューや実験を通じて、フロー状態になるための共通の条件を特定しました。彼の著書「クリエイティヴィティ フロー体験と創造性の心理学」[1]によれば、フローに入るための条件は次の通りです。
- 目標の明確さ: 何をすべきか、どうやってすべきか理解している
- どれくらいうまくいっているかを知ること: ただちにフィードバックが得られる
- 挑戦と能力の釣り合いを保つこと: 活動が易しすぎず、難しすぎない
- 行為と意識の融合: 実際に行っている活動と意識が同一である(他のこと考えながら作業していない)
- 注意の散漫を避ける: 活動に深く集中し探求する機会を持つ
- 自己、時間、周囲の状況を忘れる: 日頃の現実から離れたような、忘我を感じている
- 自己目的的な経験としての創造性: 活動に本質的な価値がある、だから活動が苦にならない
ソフトウェアエンジニアがフロー状態に入るためには?
ソフトウェアエンジニアとして働く我々には、フロー状態を体験しやすい環境が整っていると言えます。芸術家や小説家のように目標が不明確でフィードバックを得るのが難しい職種と比較して、我々の目標は通常明確で、フィードバックも即座に得ることが可能です(作成したプログラムがどのように動作するかを確認できます)。
しかしながら、現代の働き方の中では、SlackやDiscordなどのチャットツール、TwitterやInstagramなどのリアルタイムに更新され、通知が届くサービスの普及により、開発への集中が中断されやすい状況にあります。また、障害対応やバグ修正など、緊急性の高いタスクがマルチタスク化を引き起こし、フロー状態への道を阻む要因となることもあります。
ここからは、私がどのようにこれらの障害要因を取り除き、フローを促進する方法を実践してきたのかについてお話しします。
1. 達成すべきゴールを明確にする
ソフトウェアエンジニアはしばしば曖昧な目標を提示されることがあります。例えばタイトルだけのチケットや、正常系しか記載されていないPRDなどです。まず初めに私たちが行うべきことは、どうすればタスクを完了したと言えるのか、そのゴール設定を明確にすることです。要求に応じた正常系の動作は確認されているか、また、準異常系の動作は保証されているか、そしてユニットテストは全面的に設計され、全てが問題なく通過するかなど、タスクのゴールは明確でなければなりません。そうでなければ、私たちは何がゴールか分からずに曖昧なまま進行し、結果的に何となくタスクを終えてしまうことになります。この状態では、集中することが非常に難しくなります。
2. チャレンジとスキルのバランスをとる
タスクが自身のスキルを十分に活用し、かつ新たな学びを得られるようなチャレンジ性があることが重要です。チクセントミハイ氏は以下の図でフローの状態を示しています。[2]
タスクへのチャレンジが高難易度なのにも関わらず、スキルが低い時、人は不安の状態になりうまくパフォーマンスを発揮できないでしょう。また、スキルの高い状態で低難易度のタスクは簡単すぎて退屈の状態になってしまい、この時もまた驚くようなパフォーマンスを発揮できません。
そのタスクのチャレンジ度を調整しましょう。そのタスクがあなたにとって簡単すぎる場合、難易度を上げる必要があります。私がよく使う方法としてはタスクの達成までの厳しい時間制限を加えることです。これによってタスク達成への緊張感とどのようにスピードを上げて達成するかというチャレンジ性が生まれます。またタスクがあなたにとって難しすぎる場合は何をすべきかわかるまでタスクの粒度を分解しましょう。また達成方法がわからない場合は人に相談することも重要です。スキル自体がまだ低い場合はまず覚醒の位置を目指すとよいとされています。チャレンジし、スキルの成長を目指しましょう。
3. 不必要な刺激を排除する
不必要な刺激は集中力を削ぎ、タスク達成への道を遮るので、それらを避けることが重要です。作業を始める前に作業環境に不要なものがないかチェックしましょう。例えば、スマートフォンは通知が気になる可能性があるため視界から外すと良いでしょう。また、Slackなどの即時メッセージングツールも視界に入ってしまうと、更新情報が気になり作業に集中できません。そのため、作業に必要なものだけを視界に入れ、余計な情報が入らないよう工夫しましょう。
4. リアルタイムのフィードバックを活用する
タスクの進行状況をリアルタイムに把握するために、即時のフィードバックを受けることが重要です。ソフトウェアの開発では以下のような方法が行えます。
テスト駆動開発(TDD)を活用する
自動テストは即時のフィードバックを得る上で優れた手段です。短時間でソースコードが正しく動作しているかをフィードバックできます。ソースコードレビューもフィードバックの一つですが、これはリアルタイムには行えません。そのため、自身の進行状況を把握するためには、設定した目標に向けてステップを順調に進めているか、それを指標にすることが重要です。もちろん、これは「他者からのフィードバックが不要」という意味ではありません。最終的な成果物は他者にレビューしてもらいましょう。
ペアプログラミング・モブプログラミングを採用する
ソースコードレビューは非同期なタスクなので、リアルタイムのフィードバックを得ることは難しいです。しかし、ペアプログラミングやモブプログラミングなら、その限りではありません。これらの方法の利点は、タスクについてリアルタイムのフィードバックを得られることです。さらに、複数人で作業する際には、明確な目標を常に共有することが求められるため、他の条件も同時に満たすことになります。
5. 一つのタスクに集中する
マルチタスクは注意力を散漫にし、何をすべきかやどこに向かっているのかを見失いがちです。例えば、設計作業中にSlackのメッセージに気を取られ、その応答をしながら勤怠の修正を思い出し、そしてまたSlackの更新を見つつ新たな調査依頼に対応...そんな一日が終わり、「今日は何をしたんだろう?」と自問自答する経験はないでしょうか。(私は経験あります)
必要なタスクを事前に全てリストアップし、一つのタスクが終わるごとに新たなタスクを追加し、優先順位を再調整するようにしましょう。意識の中心を最優先のタスクに据え、他のタスクは一旦忘れるようにしましょう。作業への集中こそが、フロー状態へと繋がる鍵となります。
6. 独り言を言いながら作業する
行為と意識の融合がフロー状態への移行に必要です。独り言を言いながらの作業は、他のタスクのことを考えることがなく、行為と意識が同期します。もしあなたが独り言を言っても問題ない環境であるなら、何をしているのか、次に何をしようとしているのかを呟きながら作業することは良い方法です。
7. 作業時間を保証する
断片的な作業時間だけでは、集中するのは至難の業です。ミーティングと30分の作業、再びミーティングと30分の作業...そんなスケジュールでは集中力が維持できません。個人的には、最低でも3時間の連続した作業時間が確保できると助かります。チームと協力して、まとまった作業時間を確保することが大切です。「ミーティングフリーデー」を設けるのも一つの有効な手段です。
8. 集中できない時は諦める
全ての時に完璧に集中することは難しいのが現実です。オフィスでは声をかけられることもあるでしょうし、リモートワークでも家に家族がいれば色々な声が聞こえるでしょう(小さいお子さんがいれば遠慮なく作業中に部屋へ入ってきますよね!)。これらの障害に対して「どうして集中できないんだ」と自分自身を責めるのは避けましょう。集中せねばと強く思うと、集中できない要因に対してストレスに感じてしまいます。タスクの準備はきちんと行ったはずです。後は集中するかどうかは、時には自然に任せるしかないのです。
まとめ
フロー状態は生産性を飛躍的に向上させる強力な状態でありますが、それは仕事自体の、ひいては人生の満足度を向上させるための状態でもあります。そしてフロー状態になるためにはタスクを開始する前に準備が欠かせません。上記の手順を実践して、開発作業の満足度と効果を最大化しましょう。
参照
[1] M・チクセントミハイ(2016). クリエイティビティ フロー体験と創造性の心理学 世界思想社
[2] チクセントミハイ:フローについて
Discussion