開発生産性を向上させるための複数のアプローチ
はじめに
こんにちは、としまつです。
今回、個人の開発生産性を向上させるにはどのようなことに取り組めばいいのかを考えてみました。そもそも開発生産性とは何かというところから考え始め、向上させていくために複数の観点から具体的取り組みを上げてみました。
少しでも参考になることがあれば幸いです!
※なお今回のテーマは、こちらのイベントの登壇テーマです!
生産性について
そもそも生産性とは何か
結論、生産性は「インプットに対するアウトプットの比率」であると言えます。
式にすると「生産性 = アウトプット ÷ インプット」となります。
ここでいうアウトプットは生産量・成果・付加価値などを意味していて、インプットは投資した時間・お金・人数などを意味しています。
つまり生産性とは、資源投入に対する生産量や付加価値の割合を指します。
生産性を高めるには何に着目すると良さそうか
生産性の定義が「生産性 = アウトプット ÷ インプット」であると記しました。この式に則って考えると、生産性を高めるためにはいかに少ないインプットでアウトプットを生み出せるかが大事だと考えます。
これは単純にインプットを減らすという考えではなく、アウトプットに対するインプットの割合を減らすという考えです。つまり「インプットの効率化」が求められると考えられます。
具体的にいうと、出したいアウトプットに対して投資する時間とお金(と人員)を効率的に減らしていこうということです。
以下では生産性を高めるにインプットを効率化していくという観点で、
具体的なアプローチを複数の観点から出してみました。
開発生産性を高めるアプローチ
1. 認知的負荷を軽減する
認知科学的観点から効率化を考えてみます。
まず「ワーキングメモリ」と「認知的負荷」という概念について記し、その後に認知的負荷を下げる対策を考えます。
概念について
ワーキングメモリとは
「問題の処理に用いられる短期記憶」のことを指します。
PCでいうところのRAMにあたります。情報を一時的に保持して、高速にアクセス、処理できる機能を持ったものです。机の上のスペースと喩えられたりもします。
ワーキングメモリは1度に2〜6個の事柄を処理する能力しかありません。認知的負荷とは
(ワーキングメモリの文脈にて)ワーキングメモリの制限容量のことを指します。
多くの要素を含む問題を解決しようとすると、ワーキングメモリが過負荷になり、認知的過負荷の状態となります。
この認知的負荷には3種類のタイプがあります。
・課題内在性負荷:その問題自体がどれくらい複雑か
・課題外在性負荷:その問題の妨げとなる外部要因
・学習関連負荷:考えたことを長期記憶に保持する際に引き起こされる認知的負荷
課題内在性負荷は、コード固有の複雑さによって生じるもの
課題外在性負荷は、(コードの書き方などにより)偶発的に、あるいはコードを書いた人と読む人の間の知識のギャップによって生じるもの
認知的負荷を下げるテクニック
課題内在性負荷に対する軽減テクニックは課題自体を変えるというようなものになるため、今回の生産性向上とは別問題のため対象外です。
課題外在性負荷に対する軽減テクニックについて、
・リファクタリング
・明確な命名
・早期リターン
・コメントを適切に使用する
リファクタリングは定番の方法ですね。コードの動作を変えずに内部構造を書き換えることで理解がしやすい単位に分解するための作業です。
(リファクタリングと言ってもやり方は無限にあり深い話題になると思うのでこれ以上はnot言及でお願いします!)
リファクタリングなどを通しても複雑であるコード、例えば状態の変化を長く追いかけていく必要があるコードなどの際は、状態遷移票を作成すると読み解きやすくなります。
※学習関連負荷については、その他の認知的負荷を下げ余裕があると長期記憶に保持、移行されていくというものです。詳しくは割愛します。プログラマー脳10章に詳しく載っています!
2. 環境を整える
作業を行う時の周りの環境から、個人の作業効率を考えてみます。
作業を行なっているとあらゆる所から割り込みが発生し集中力が削がれる、ということは多いと思います。割り込みが発生した後、元の作業に戻る時にどこまでやってたっけ?となったり別のことを考えだしたりすることが起こり得ますね。
書籍「プログラマー脳」でも言及されていました。
この割り込みは日常茶飯事に発生することなのでゼロにすることはできません。そこで上手に向き合うことが必要になります。割り込みに対して「備える」対策と「減らす」対策を立てましょう。
割り込みに備える
<メンタルモデルを保存するという対策>
割り込みが起きる際に少しでも時間があれば、作業時のメンタルモデルを保存しておきましょう。割り込み発生までに行なっていた作業の内容や思考の過程をコードやメモ帳などに書き残しておきます。そうすることで割り込みから戻ってきた時に直前まで行っていたことの回復が早くなります。
例えば、あるメソッドを修正中に割り込みが起きた際に、次の作業をコメントアウトで記すことや使用していたデータをメモしておくことなどが挙げられます。
割り込みに即時対応しなければならないことを事前に考慮し、いつ中断されてもいいように準備しておくのも手かもしれません。事前にコードを書く前に問題を小さなステップに分割してテキストとして記述しておくこと。例えば以下のイメージです。
# **APIを使いurlを取得する
# 取得したurlへリクエストし、データを取得する
# 取得したデータをS3に保存する
このように書いておくことで、作業の途中で即時中断されても戻りやすくなります。
割り込みを減らす
<割り込みが発生しづらい状況を作る>
割り込みには「slack通知」「slackでのメンション通知」「SNS通知」「直接声をかけられること」など様々あると思います。その発生頻度を下げることや起こりにくい状況を作っていく取り組みもやりましょう。
例えば
・slackにてメンション以外の新着情報はデスクトップ通知せず、決まったタイミングで見にいく
・不要なSNS通知を消す
・早朝に大事な作業を行う
などがありそうです。
あとは外部からの割り込み以外で、自分の頭の中での割り込みも抑制したいですね。Aを考えていた時にBという思考が生まれて、Bが気になって調べに行ってしまう…など。私はよくやってしまいがちです。
これを減らすには、気になったことは無視するか、メモに書き残して置いて後で時間ができた時に調べるのがいいかと思います。もし後から思い出せなかったら別に大事じゃなかったと判断もできるので良いと考えます。
3. 作業効率化ツールを使う(おすすめツールの紹介)
ツールを使った作業効率化です。
ここでは私のおすすめの作業効率化ツールやテクニックを4つ紹介します!
(1) Focus To-Do
ポモドーロテクニックとタスク管理ができるシンプルで強力なツールです。
個人的にタスク管理は活用していないですが、それでも強力に集中力を高めてくれるツールとして愛用しています。
1人で作業をしていると、時間を気にせずに、本来取り組むべきこと以外の作業に無駄な時間を費やしてしまうことが容易くできてしまいます。
このツールを使えば、時間管理をしつつ集中力を高めて作業に取り組むことが容易になります。
<ポイント>
・アプリでもPCでも使用可能
・ホワイトノイズ機能があり、心地よい作業音をだせる
・全画面モードがオシャでテンションが上がる
→PC作業時は携帯でこの画面を立ち上げておくとテンション(と集中力)が上がる
(2) Sidekickブラウザ
Chromeブラウザと互換性があり、作業効率を高める為の機能が標準装備されているブラウザです。Sidekickを使うと、タブが溢れかえらない、プロジェクトごとの切り替え作業が楽という点が気に入っています。
ブラウザを使った様々な効率化ツールがあると思いますが、個人的にはこのブラウザの標準装備で大方まかなえているのではと思っています。(あくまで個人的意見です!)
1番気に入っているのがセッション機能というもので、複数開いたタブに名前をつけて保存しておくことができる機能です。これがあることで取り組んでいるプロジェクトの切り替えがスムーズにでき、タブも溢れかえらないというメリットがあります。
あと、開発の際も検証ツールがChromeと同様に使用できるので特段困ったことは起きないですね。
<ポイント>
・よく使うアプリをサイドバーに置いておける
・セッション機能でプロジェクトごとにタブをまとめて保存しておける
・ブラウザ自体が高速
(3) Notion
ありきたりかもしれませんが、Notionはやっぱり便利です!!
個人的な使い方としては、タスク管理・プロジェクト管理・ストック情報管理として使っています。
<ポイント>
・使い方次第でなんでもできる
・タスク管理、プロジェクト管理が一貫してできる
・アプリとweb両方あり、どこからでも使用できる
(4) tig, コマンドエイリアス
tig(https://github.com/jonas/tig/blob/master/INSTALL.adoc)はコンソール上で使えるgitブラウザです。gitに関する操作が細かく、楽にできます。
どの変更がaddされているか、commitされているか、gitのログはどうなっているかなどの確認が見やすいです。
コマンドエイリアス
コンソール上で作業する時、長いコマンドを打つのは面倒ですよね。コマンドエイリアスを設定しておくと日々の作業が楽になるのでおすすめです。
個人的には「gps」が気に入っています。現在のブランチでリモートpushができます。ファイルを修正してtigでコミットしてgpsをパーンと打てばpush完了!という流れが好きです。
# ------ プロンプトカスタマイズ ------
PROMPT='
[%B%F{red}%f%b%F{green}%~%f]%F{cyan}$vcs_info_msg_0_%f
%F{yellow}$%f '
# ------ alias ------
alias be="bundle exec"
alias gs="git switch"
alias gb="git branch"
alias gsdp="git switch develop && git pull"
alias dc="docker-compose"
alias gbd="git branch -D"
alias gps='git push origin $(git rev-parse --abbrev-ref HEAD)'
## 直前のコミットを消す
alias grsh='git reset --soft HEAD^'
## stash関連
alias gss="git stash save"
alias gsa="git stash apply"
alias gsl="git stash list"
まとめ
個人の生産性向上について「認知科学」「作業環境」「効率化ツール」の3つの観点から考えてみました。他にもテクニック的なものはいくつもあると思いますが、こだわりすぎるとインプットが多くなり過ぎて生産性が下がりかねないので、重要なものだけ会得して生産性を上げていきたいですね!
ここまで読んでいただきありがとうございました。
それではまた!
参考にした書籍や記事
書籍
※SOFT SKILLSは4部の「生産性」の項目が参考になりました。
記事
この記事が気に入ったらサポートをしてみませんか?