こんにちは。Go言語が好きなエンジニアの武田(@takedajs)です。
最近はGo言語の外部勉強会が多く開催されて嬉しいのですが、定員オーバーで参加できないことが多いですね。前に行われたGoカンファレンス参加したかったです・・・

さて、本題です。
今回は普段僕が行っているポモドーロテクニックについてと、それに利用するポモドーロタイマーを作成しましたのでお話します。

ポモドーロテクニックとは

25分の集中した時間を1ポモドーロとし、1ポモドーロが終わるたびに5分の休憩します。
そして、4ポモドーロが終わったら、15分程度の休憩を入れるというのを繰り返して行う作業効率アップのテクニックです。
今、このブログもポモドーロ・テクニックを利用して書いています。

海外のエンジニアから人気の洋書で、最近日本語訳が発売されたエンジニアのライフハック本でも取り上げられていました。実際に試して効果を実感している方も多いと思います。

実際に行ってみて

僕自身、大学の頃からこのテクニックを利用しています。
長時間作業して気が向いたら休憩するのとは違い、25分作業して強制的に休憩することで、高い集中力を保って作業ができます。
また、25分という制限を1日何度も行うことで、この25分中には〜を終わらせる!という締め切り効果も生まれます。

ポモドーロテクニックを行うと細かい休憩を多く挟むので、実践している人の中では、休憩時間に何をするか?という悩みがあると思います。
僕はポモドーロ間の5分休憩を以下のように過ごしています。

【5分休憩】

  • 席を立ち歩く
  • お茶をいれに行く
  • お菓子を食べる
  • トイレに行く
  • 上司に報連相する

また、15分休憩のタイミングで、気分を変えるために作業する場所を変えています。
エンジニアは1日中社内にいるので、同じ場所にずっとは辛いですよね。

  • スタンディングデスク (景色が良いです。スタンディングで作業すれば更に集中できます。)
    IMG_0085

  • ソファー (リラックスして作業できます。)
    IMG_0088

  • テラス (まだ一度もここでは作業したことがありません笑)
    IMG_0080

ポモドーロタイマー

普通のタイマーアプリでもポモドーロテクニックを行うことができます。
ただ、専用タイマー(25分と5分を交互に自動で計ってくれる)を用意した方がよりスムーズに作業が行えます。

そこで、弊社が利用しているhipchatとGo言語を利用してシンプルなポモドーロタイマーを実装しました。ターミナル上で動作します。

タイマーの使い方

1: hipchatにポモドーロ専用のルームを作成します。
2: ターミナル上で以下のオプション付きのコマンドを叩きタイマーを実行します。

go run main.go -t 【hipchatのAPI Auth Token】 -r 【作成したルーム名】 -u 【メッセージの宛名】

3: タイマーが実行されると、作業開始や休憩開始を選択したルームに通知します。
4: タイマー起動中は、ターミナル上で指定のキーを入力するとポモドーロのリスタートと終了を行います。
[r] リスタート
[f] 終了(スタートから終了までの達成したポモドーロの回数を通知します。)

デモ

デモのため一時的に設定を変更して、ポップアップ通知が来る間隔を早くしています。
(画像をクリックして拡大表示すると見やすいです。)

pomodoro

hipchatを見ていなくてもポップアップ通知が来るので、休憩するタイミングなどが分かります。
作業が乗ってきたときは、休憩の通知を無視することが多々ありますが・・・笑

実装コード


package main

import (
    "flag"
    "fmt"
    "log"
    "time"

    "github.com/andybons/hipchat"
    "github.com/tlorens/go-ibgetkey"
)

var pom_time int
var token *string
var room_name *string
var user_name *string

func main() {

    token = flag.String("t", "", "hipchat access token")
    room_name = flag.String("r", "", "send message room name")
    user_name = flag.String("u", "", "send message user name")
    flag.Parse()

    kill := make(chan bool)
    finished := make(chan bool)

    restart__key := "r"
    t := int(restart__key[0])

    finish_key := "f"
    f := int(finish_key[0])

    go pomTimerGoroutine(kill, finished)

loop:
    for {
        input := keyboard.ReadKey()
        select {
        case <-finished:
            break loop
        default:
            if input == t {
                fmt.Println("\nrestart")
                kill <- true
                go pomTimerGoroutine(kill, finished)
            }
            if input == f {
                kill <- true
                break loop
            }
        }
    }

    fmt.Println("\nfinish")
    hipchatSend(fmt.Sprintf("%dポモドーロ完了です。お疲れ様でした。", pom_time), "red")
}

func pomTimerGoroutine(kill, finished chan bool) {
    fmt.Print("\npomodoro running")

    for i := 0; i < 4; i++ {
        hipchatSend("25分作業 (気合を入れていきましょう。)", "gray")
        fmt.Print("\n【25min work】****************************")
        //25m = 1500s
        for j := 0; j < 1500; j++ {
            if j%60 == 0 {
                fmt.Printf("\n%dmin", j/60)
            } else {
                fmt.Print(".")
            }
            time.Sleep(1 * time.Second)
            select {
            case <-kill:
                return
            default:
            }
        }
        pom_time++
        hipchatSend("5分休憩 (歩きましょう。)", "green")
        fmt.Print("\n【5min rest】****************************")
        //5m = 300s
        for j := 0; j < 300; j++ {
            if j%60 == 0 {
                fmt.Printf("\n%dmin", j/60)
            } else {
                fmt.Print(".")
            }
            time.Sleep(1 * time.Second)
            select {
            case <-kill:
                return
            default:
            }
        }
    }
    finished <- true
    return
}

func hipchatSend(msg string, bg_color string) {
    c := hipchat.NewClient(*token)

    req := hipchat.MessageRequest{
        RoomId:        *room_name,
        From:          "Pom",
        Message:       "@" + *user_name + " " + msg,
        Color:         bg_color,
        MessageFormat: hipchat.FormatText,
        Notify:        true,
    }

    if err := c.PostMessage(req); err != nil {
        log.Printf("Expected no error, but got %q", err)
    }
}

まとめ

ポモドーロ・テクニックはタイマー1つで行える作業効率アップテクニックです。
簡単に行えますが、実際に試してみるとその効果の大きさを実感できると思いますので、是非試してみてください。
引き続き、社内でも作業効率アップのナレッジを共有し合い、生産性を上げていきたいと思います。
自分がやって効果があった作業効率アップの仕組みを発表し合う社内LT会を開催するのも良いかもしれませんね。

Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにきてください。

IT×ブライダルで業界を変える!プロフェッショナルなWEBエンジニア募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る