Solist Work Blog

ソフトウェアエンジニア / IT navigator

効率よく勉強するためにしていること

ソフトウェアエンジニアにとって研究や勉強は欠かせないものです。 ソフトウェアエンジニアが覚えなければならないことに限りがあるとは思えません。 Linuxカーネルのソースコードは数千万行あるので一日10000行読んだとしても読むだけで10年かかります。 そして10年かけて読んでいるうちにも開発が進むのでこのペースで読んで追いつくことは無理であるとわかります。 さらに、新しいソフトウェアが毎日GitHubなどから生み出されている状況ですから、 すべてを知ることは無理難題であることが理解できます。 また、同じ理由で大学の図書館にある本を全部読んだ学者もいないでしょう。 それに読む価値のないものもたくさんあると思います。 だからといって新しい知識と向き合うことをしないと開き直るのも愚かなことです。 時間にも限りがありますし、なるべく効率的にやることを考えなければいけません。

記憶するとはどういうことか

ソフトウェアエンジニアならコマンドやショートカットをそらで言えないが、 端末の前で打ち込んでみると指が勝手に動いてできてしまうことがあります。 俗にいう体で覚えている状態でしょうか。 こういうことは体がそれを使った頻度で覚えていることがほとんどだと思うので、 ここを追求してもメリットは少ないでしょう。 記憶には短期記憶や長期記憶などがあってそれを追求すれば覚えたいものを効率よく覚えたり、 忘れてはいけないことを忘れないようにできるのだと思います。

まず忘れにくいものを考えてみます。 ずっとなんとなく不便に思っていて新しいソフトウェアで何かが解決した時は その使い方とかコマンドを忘れないものです。 感動したり感心した事象は人間は簡単に忘れることはできません。 わたしはOn LispとかSICP詳解UNIXプログラミングは感動して読んだので内容を忘れることはないと思います。 ストーリーがあるものや理論的なものについては感動ベースの知識はなかなか忘れないので一生役に立つと思います。 この手の感動する書籍は残念ながら分厚くて読むのを躊躇する本に多いですが、 コンピュータ・サイエンスを丸暗記するのはつらいので使える方法だと思います。1

あまり使うことはないけれどたまに使う知識は忘れやすいです。 それは人間はそういう風にできているので仕方ありません。 いつまでも転んだときの痛みを脳が覚えているならば、人間はうまく生きてゆくことはできないでしょう。 しかし、使う頻度とその情報の有用性は比例しません。 めったに使うことはないがその情報を使わないと対処できない問題は多くあるので切り捨てることはできません。 こういった忘れてはいけない情報に向き合う方法を考えていきたいと思います。

情報を組織化して忘却に対処しよう

実際にどうやっているか書いていきます。 Emacs上のどこでもいいのでまず何かMemoすることがでてきたら

C-c c

を押すと以下の画面になります。

org-captureの画面

Memoを取りたいので m を押します。

org-modeでメモを取る

覚えたい内容を書き込みます。

org-modeでメモを取り終わった画面

書き終わったらC-c C-cを押します。 Memoをやめて破棄するにはC-c C-kです。

メモ一覧画面

C-; か C-x b を押すとivy-switch-bufferが立ち上がりmemoと打つだけでいつでもこのメモが開きます。2 開きたい情報まで n で移動して Tab で開きます。swiperで検索して移動してもよいでしょう。

org-modeメモを組織化する

Memoをとったところでとらないよりはましでしょうが人間は忘れる生き物です。 情報を組織化することで忘却に対処してゆきます。 あらゆるものをMemoしてゆくと収集がつかない状態になってくるので、月に一度くらい情報の棚卸しをします。

org-modeメモを組織化する

図にあるorg-mode codeの項目については完全に覚えているし忘れることはありえないと思ったので整理します。 あいまいなものは保留しておきます。また、来月の棚卸しで見直されるでしょう。

Archivesにメモを移動する

w を押してArchivesを選択するとこの項目だけがArchivesに移動します。 ショートカットを忘れても ? を押すとショートカットキーを教えてくれるので安心です。

Archivesにメモを移動した画面

Memoからorg-mode codeについて書かれた項目が消えたので次のものに対処します。

org-modeメモを整理している

vpn sshuttleは忘れていたしvpnをコマンド一回ではれて便利です。 これはぜひ覚えておきたいです。

Rememberにメモを移動する

w を押してRememberを選択するとこの項目だけがRememberに移動します。 こうするとRememberには珠玉のリストができあがります。 どうしても覚えたい理由のあるものかどうやっても覚えられないものが集まることになります。 せっかく作った珠玉のリストですから、一週間に一回くらいはRememberを見る習慣をつけておきましょう。 orgzlyを使えばいつでもAndroidでチェックできるようになるので移動中のちょっとした時間に見るようにすれば時間を有効利用できてさらによいと思います。 月に一度の情報の棚卸し日になったら C-; か C-x b を押してivy-switch-buffer立ち上げてrememberと打ってRememberリストを開きます。3 Rememberリストで覚えたものはArchivesに移動し、 Rememberリストで覚えられないものもArchivesに移動します。4 これだけやって覚えられないものを覚えようとすることは時間の無駄です。 記憶には相性があってどうしても覚えられないことはどんな人間にもあるのです。 そのかわりに覚えていないものについてはインデックスをはっておくことにしましょう。 その情報が必要になったときに忘れているのは間違いないので検索してその情報を引き出せるようにしておくのです。 検索にかかりやすいように情報を書き直します。 未来の自分が検索しそうなワードをふんだんにいれて書きなおします。 すべて覚えることが目的ではなくソフトウェアエンジニアの仕事をうまくやることが目的なのでこれでよいのではないでしょうか。

Emacsで文芸的プログラミング

Experimentは将来使えそうな実験的な実装をメモしておくところです。 一流のコピーライターは浮かんだ言葉のフレーズを忘れないようにするために四六時中メモ帳を手放さないと聞きます。 ソフトウェアエンジニアも実装のアイデアはいつ舞い降りてくるかわかりません。 GitHubに上げる前の段階の実験的なコードと試行錯誤の記録は絶対に忘れるべきでない宝物だと思います。

C-c c

org-captureの画面

e を押すとExperimentが開きます。

#+BEGIN_SRC 

#+END_SRC

これがorg-modeのコードブロックです。 これは<sのあとtabを押せば補完されます。

org-modeコードブロックを使う

コードブロックの中は指定したプログラミング言語のシンタックスなので見やすいです。 コードブロックのなかで

C-c '

を押すと下に別のバッファが立ち上がってきます。

文芸的プログラミングをする

このバッファは完全にその言語でプログラミングをするのと同じモードなので コードジャンプも補完もすべて使えます。 編集が終わったら

C-c '

で戻ります。プログラミングとメモを一緒くたにしておけるので便利です。 この機能を使えば文芸的プログラミングが実現できるのではないでしょうか。

markdown-modeでも使えます

そしてこのコードブロックをつかった方法はmarkdown-modeでも使えます。5

markdown-modeでコードブロックを使う

コードブロックのなかで

C-c '

を押すと下に別のバッファが立ち上がってきます。

markdown-modeで文芸的プログラミング

このブログに書いてあるコードを動かしながら記事を書くことができるのです。 完全にその言語でプログラミングをするのと同じモードで作業ができます。

C-c '

を押すと記事に戻ることができます。 Emacsは最高のプログラミング記事の執筆環境だと思いませんか?

Taskを組織化して合理的に

さて忘れてはいけない情報にはタスクというものもあります。 まず絶対に忘れてはいけないアポイントメントはGoogleカレンダーに入れておいてアラートがくるようにしておきます。 Solist WorkMEETINGから予約されたオンラインミーティングは自動でGoogleカレンダーに登録されるので忘れる心配はありません。 こういうものは忘れないように作りこんでおきましょう。

アポイントメント以外のタスクをGoogleカレンダーに入れておくとアラートが鳴りすぎて、 アポイントメントが埋もれてしまい危険な状態になるのでGoogleカレンダーには入れないようにしておきます。 アポイントメント以外のタスクは以下のようにして管理しています。

C-c c

を押すと選択画面がでてきます。 わたしは今日やる作業くらいしか詳細に決めないことが多いです。 長期的なロードマップを詳細に決めても時間の無駄と思うからです。 では長期的なロードマップやガントチャートのようなものはまったくないのかといえば違います。 毎日この方法でTaskの記録をつけていると自分が一日どれくらいの仕事ができるのかわかってきます。 一日にこなせる仕事が正確にわかればあとは掛け算でいつまでに要望を実現できるかわかります。 ですから詳細にロードマップやガントチャートを書いても書かなくても結果は同じと言えるでしょう。 同じ結果を導き出せるものに時間を投資することは時間を投げ捨てているのと同じことだと思います。 というわけなので朝に今日やる作業を登録しましょう。

org-captureの画面

t を押してTaskを選択します。 Taskは期限のあるTaskを登録する用にしてあります。

org-modeでタスクを登録する

期限を聞いてくるので選択します。 デフォルトは今日になっているのでほとんどの場合そのままEnterでよいでしょう。

org-modeでtodoを登録する

今日やるタスクを登録します。書き終わったら C-c C-c で保存しましょう。

C-c a a

で今週のタスクを見ることができます。

org-agendaで今週のタスクを確認する

該当タスクに取り掛かるときに該当タスクの行で I を入力すると Emacsがタスクに取り組んでいる時間をはかってくれるようになります。 I はタスクにInするイメージでしょうか。 画像では I を押すとタスクが終わるまでその行が赤くなっています。 タスクが終わったら該当タスクの行で O を入力すると時間の計測が終わり赤い行が消えます。 O はタスクからOutするイメージでしょうか。 月末にまとめて何時間働いたか必要なときはコマンド一つで集計できます。

** TODO 不具合Aの修正をする
SCHEDULED: <2018-10-25 木>
:LOGBOOK:
CLOCK: [2018-10-25 木 16:18]--[2018-10-25 木 16:58] =>  0:40
CLOCK: [2018-10-25 木 14:54]--[2018-10-25 木 15:18] =>  0:24
:END:

このようにEmacsが測ってくれる時間は経過時間だけではないので 作業していないときはきちんと O を入力しておけば実際の作業時間が一目瞭然です。 正確な記録をとればどの時間に何をやれば効率がよいか自己分析することもできるでしょう。 I を押してタスクが赤くなっている作業中のときに 別のタスクを始めるために I を押すと前のタスクで O を押したのと同じ状態になります。 Emacsが勝手に前のタスクを終了させて次のタスクにInできるようにしてくれます。 普通の人間は一度に2つのタスクはこなせないと思うのでこれは便利な機能だと思います。6 タスクを始めるときに I を押すことさえ忘れなければよいということになります。

org-agendaでタスクを完了する

タスクが終わったら該当タスクの行で t を入力すると TODO から DONE になります。

Emacs org-modeの設定

org-modeのリポジトリは

(require 'package)
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t)

を設定して

M-x package-install org-plus-contrib

でインストールします。

最後に設定を書いておきます。

(require 'org)

(setq org-log-done 'time)
(setq org-use-speed-commands t)
(setq org-src-fontify-natively t)
(setq org-agenda-files '("~/Dropbox/emacs/org/task.org"))

(bind-key "C-c a" 'org-agenda)
(bind-key "C-c c" 'org-capture)

(setq org-capture-templates
      '(("e" "Experiment" entry (file+headline "~/Dropbox/emacs/org/experiment.org" "Experiment")
	 "* %? %U %i\n
#+BEGIN_SRC emacs-lisp

#+END_SRC"")
	("i" "Idea" entry (file+headline "~/Dropbox/emacs/org/idea.org" "Idea")
	 "* %? %U %i")
	("r" "Remember" entry (file+headline "~/Dropbox/emacs/org/remember.org" "Remember")
	 "* %? %U %i")
	("m" "Memo" entry (file+headline "~/Dropbox/emacs/org/memo.org" "Memo")
	 "* %? %U %i")
	("s" "Story" entry (file+headline "~/Dropbox/emacs/org/story.org" "Story")
	 "* %? %U %i")
	("f" "Future Task" entry (file+headline "~/Dropbox/emacs/org/task_future.org" "Future Task")
	 "** TODO %? \n")
	("t" "Task" entry (file+headline "~/Dropbox/emacs/org/task.org" "Task")
	 "** TODO %? \n   SCHEDULED: %^t \n")
	("p" "Priority task" entry (file "~/Dropbox/emacs/org/priority_task.org")
         "* %?\n" :clock-in t :clock-resume t)))

(setq org-refile-targets
      (quote (("~/Dropbox/emacs/org/archives.org" :level . 1)
	      ("~/Dropbox/emacs/org/remember.org" :level . 1)
	      ("~/Dropbox/emacs/org/memo.org" :level . 1)
	      ("~/Dropbox/emacs/org/task.org" :level . 1))))

  1. 感動する本は人それぞれ違う可能性もあるので自分が感動する本を探さないといけないという難題があるのも事実です。
  2. Emacsのブックマークにmemo.orgファイルを登録しているからできます。Emacsのブックマークに登録するには登録したいファイル上でC-x r m を押すとよいでしょう。dotfilesを公開する場合はbookmarksは公開しないほうがセキュリティ上好ましいので、(setq bookmark-file “~/Dropbox/emacs/bookmarks”)でブックマークデータを退避することができます。ivy-switch-bufferはcounselをインストールしてショートカットに割り当てればよいです。詳しくは私のdotfilesで確認してください。
  3. Emacsのブックマークにremember.orgファイルを登録しているからできます。
  4. 一週間くらい前にRememberリストにいれたばかりのものなどの棚卸しは翌月に回したほうがよりよいでしょう。
  5. edit-indirectのインストールをするように言ってくるのでインストールします。前もってインストールしておいてもよいでしょう。
  6. 万が一あなたが一度に複数のタスクを同時にこなせる天賦の才をお持ちならば、その天賦の才を使って必要な機能を実装してオープンソースにすればよいと思います。天賦の才は人類に奉仕するために使うべきでしょう。

タグ一覧

お仕事の依頼などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ