Gemfile に書く require: false とは何か

久しぶりに Rails アプリを1から作るにあたり、Rubocop を導入しようとしたらいろいろと疑問が出てきたので調べた。

Rails アプリに Rubocop を入れる文脈で、こんな書き方をよく見かける。

Gemfile

gem 'rubocop', require: false
gem 'rubocop-rails', require: false

今さらだけど、require: falseって何だったっけ??

require をしないようにする設定っぽいが、そういえば、Rails アプリの場合各ファイルで require しなくていいのはなぜ?

手元にあった RubyRails の本を4冊見てみたところ、Bundler の基本的な使い方などはどの本にも書いてあったが、Bundler を使うとrequireがいらなくなるなんていう記述はない。

Bundler のドキュメントを読んでみる。

Gemfile の require についての項目。

Each gem MAY specify files that should be used when autorequiring via Bundler.require. You may pass an array with multiple files or true if the file you want required has the same name as gem or false to prevent any file from being autorequired.

gem "redis", :require => ["redis/connection/hiredis", "redis"]
gem "webmock", :require => false
gem "byebug", :require => true

The argument defaults to the name of the gem. For example, these are identical:

gem "nokogiri"
gem "nokogiri", :require => "nokogiri"
gem "nokogiri", :require => true

Bundler: gemfile #Require As

なるほど〜

gem 'rubocop'は、gem 'rubocop' require: 'rubocop'gem 'rubocop' require: trueと同じだったのか!

で、引用の前半部分。

requireにファイル名の配列かtrue(ファイル名がGem名と同じ場合)を渡すことで、Bundler.requireで自動読み込みするファイルを Gem ごとに指定できると書いてある。自動読み込みしないようにするにはfalseを渡す。

やっぱり自動読み込みしてくれるっぽい。でもBundler.requireなんて書いた覚えはない…。Rails のことだから自動でやってくれてるのかな?

これもドキュメントに書いてあった。

Bundler makes sure that Ruby can find all of the gems in the Gemfile (and all of their dependencies). If your app is a Rails app, your default application already has the code necessary to invoke bundler.
For another kind of application (such as a Sinatra application), you will need to set up bundler before trying to require any gems.

Bundler: How to use Bundler with Ruby #Setting Up Your Application to Use Bundler

前半を訳してみるとこんな感じだと思う。

「Bundler は、Gemfile の中のすべての Gem(とそれが依存するもの全部)を Ruby が見つけられるようにします。Rails アプリならデフォルトで Bundler を呼び出すのに必要なコードが含まれています。」

やっぱり!!さすが Rails

Sinatra アプリなどで、Gemfile 内の全Gem を自動読み込みさせる設定は以下とのこと。

require 'rubygems'
require 'bundler/setup'
Bundler.require(:default)

手元の Rails アプリのコードをよく見たら、ちゃんと書いてあった。


さて、ようやく本題。

require: falseを指定すると、自動読み込みしないようにする。

Rubocop は通常コマンドで使用するもので、Rails アプリの中から Rubocop のメソッドを呼び出すことはない。ということは自動読み込みさせる必要がないので、require: falseにすればよいということ。

プログラミング学習中の人が稼働中のシステムに不具合を発生させた話

これは、フィヨルドブートキャンプ Advent Calendar 2020(Part 1) 12日目の記事です。昨日は、ksm さんの プログラミング学習サービスに参加して100日経過した話 - improve.design でした。 フィヨルドブートキャンプ Advent Calender 2020(Part 2)もあります。

アドベントカレンダーというのは、12月1日からクリスマスまで、特定のテーマに沿った記事を公開していくという企画です)

参考:アドベントカレンダー - Wikipedia

先日、私の書いたコードが原因でフィヨルドブートキャンプの学習システムに不具合を起こしてしまいました。そのときの状況や学んだことについて書きます。

読んでもらいたい人

  • フィヨルドブートキャンプで勉強中の人、関係者の皆さん
  • フィヨルドブートキャンプに参加するか迷っている人
  • フィヨルドブートキャンプではどんなことをやっているか知りたい人
  • 読みたい人!

フィヨルドブートキャンプのチーム開発

私は、2019年の12月から約1年間、FJORD BOOT CAMP(フィヨルドブートキャンプ) というプログラミングスクールで勉強しています。カリキュラムの終盤に「チーム開発」があり、それまで自分がずっと使ってきたフィヨルドブートキャンプの eラーニングシステムを開発することになります。

毎週、メンター&チーム開発参加者で振り返りミーティングと計画ミーティングを行い、成果物のデモ、Issue の割り当て、プランニングポーカーなどを行って、20ポイント分マージされたら終了です。

コードはオープンソースなので誰でも見ることができます。

GitHub - fjordllc/bootcamp: プログラマー向けEラーニングシステム

不具合の内容と対応

2週間ほど前に、このチーム開発での私の PR が原因で本番環境で不具合を起こしてしまいました。

アサインされたのはこの Issue。

自分の日報・提出物・イベントをWatchすると通知が二重になる · Issue #2013 · fjordllc/bootcamp

クリック

Issue の説明を書いたら長くなってしまったので、気になる方だけここをクリックして読んでください。

フィヨルドブートキャンプ参加者は、日々ブートキャンプアプリ上で日報や提出物を提出することになっているのですが、それにコメントがつくと、アプリ上で通知されるようになっています。これまでは、日報・提出物の作成者とコメントした人とが異なる場合に、日報・提出物作成者に通知されるようになっていました。

それとは別で、このアプリには「Watch」という機能があります。誰が作成したかにかかわらず、日報や提出物のコメント通知を受け取れる機能です。人の日報などにコメントすると自動で「Watch中」になり、その後のコメント通知が受け取れるようになります。

便利なのですが、自分の日報などにコメントがきて返信したりすると、自分の日報・提出物が「Watch中」になります。つまり、その後の通知は二重になってしまうという問題が発生していました(アプリ上での通知は1件にまとめられるが、メール通知は複数くる)。

ということで、コメント通知を「Watch」だけにして、これまでの「日報・提出物の作成者とコメントした人とが異なる場合に、作成者に通知」はしないようにしたいというIssue が立てられました。

(イベントも含まれますが、今のところイベントを作成した受講生がいないので記載を省略しているところがあります)


私が作成した PR。

日報・提出物・イベントのコメント通知をWatchに変更 by masuyama13 · Pull Request #2104 · fjordllc/bootcamp

この PR でやりたいことは2つありました。

  • ユーザーが日報・提出物・イベントを作成したら、自動で「Watch中」にすること(問題なし)
  • 既存の日報・提出物・イベントについて、作成者自身が「Watch中」となるようにすること(問題発生!)

問題のコード

既存の全ての日報・提出物・イベントの1件1件について、作成者自身のWatchデータを検索、なければ作成するRakeタスクです。ローカルでは問題なく動き、コードとして間違いというわけではありませんが、データベースへのアクセスが多すぎて時間がかかり処理に失敗するという結果になりました。

ActiveRecord::Base.transaction do
  Report.includes(:user, :watches).each do |report|
    Watch.find_or_create_by!(user: report.user, watchable: report)
  end
  Product.includes(:user, :watches).each do |product|
    Watch.find_or_create_by!(user: product.user, watchable: product)
  end
  Event.includes(:user, :watches).each do |event|
    Watch.find_or_create_by!(user: event.user, watchable: event)
  end
end

コードを書いた後に、全部eachで回すと結構重いのかも?という疑問が一瞬頭をよぎりましたが、 1回きりの処理だし全部で数千件ぐらいだからまあ大丈夫かな、includes を使えばOKだろうぐらいに深く考えませんでした(実際には日報だけで2万件以上ありました)。

結果として、既存の日報などのうち作成者本人がWatch中でないものにコメントがついても、通知されないという不具合が発生しました。

対応

1日目

BULK INSERT を試してみてとアドバイスいただいたので、まずそこから調べることに。言葉を聞いたことがある程度で、具体的なやり方など何も知らない状態でした。

調べた結果、insert_allというメソッドが使えそうだと思いました。

ActiveRecord::Persistence::ClassMethods

ローカル環境でいろいろ動かしてみて、全部の日報などを各作成者が「Watch中」にすることはできました。しかし、「そのデータが既にあれば作らず、ない場合だけ作る」という条件分岐的なところがわからず詰まりました。いくつか解決策案を考えてみたものの、自分の実力では実現可能か調べるだけでかなりの時間が必要な中で、方向性が全くわからず不安になりました。

N+1 問題に関しては、これまでBullet(N+1を検知するGem)頼みだったため、コードから読み取る力が自分にはありませんでした。SQL入門書を読み直したり情報収集したりしましたが、この日は結局わかりませんでした。

2日目

これ以上時間をかけても自分の力だけで解決するのは難しいと思い、フィヨルドブートキャンプの Slack の wakaranチャンネルで状況を流しながら作業を進めることにしました。

wakaran チャンネル
わからないことを雑につぶやくチャンネル。Macの使い方から自作サービスの設計の迷いポイントでもなんでもOK!初歩的な質問大歓迎です!

wakaran チャンネルは、「質問するまでのハードルが高い」という受講生の声を受けて数ヶ月前にできたチャンネルで、質問にならない「wakaran」を気軽につぶやけるすばらしいチャンネルです!

状況を書き込むと、すぐにアドバイザーの @udzura さんがアドバイスくださいました。問題を分割することや、やりたいことをまず日本語できちんと整理することなど、問題に対処するときに大事なことをたくさん教えていただきました。

おかげで少しずつ進むことができたのですが、夜中まで頑張っても答えまでは出せませんでした。

3日目

次の日起きたら、今度はメンターの @jnchito さんからアドバイスが届いていました。具体的なコードだけでなく、メンタル的な部分(励ましの言葉など)、実際の現場での対応方法、コードもバルクインサートを使わないバージョン・使うバージョンなどものすごい情報量でした!(フィヨルドブートキャンプ生なら私の日報のリンクから見られます)

数時間後、なんとか PR ができ(ほとんど伊藤さんのコードそのままですが)、マージ。不具合解消となりました。

作成したPR。

既存の日報・提出物・イベントについて、作成者自身をWatch中にする by masuyama13 · Pull Request #2163 · fjordllc/bootcamp

ポイントとしては、テストを書いたことです。伊藤さんから、「できればデータ移行のロジックはモデルに移して、テストを書くことをオススメします。」とアドバイスいただいたのでやってみたのですが、実際テストがあると安心感が全然違いました。

今回の問題はテストがあれば防げたということではありませんが、1回きりの処理だからといってテストを書かなくていい理由にはならないので、やってみてよかったです。

学んだこと(技術面)

バルクインサートとは

今回のように DB に対し何万回もアクセスすると、パフォーマンスが悪くなり処理に失敗することもある。 そこで、大量のデータを1回の命令(問い合わせ/クエリ)でINSERTするのが BULK INSERT。

作業の過程で学んだことメモ

Report.joins(:watches).to_sql
=> "SELECT \"reports\".* FROM \"reports\" INNER JOIN \"watches\" ON 
\"watches\".\"watchable_type\" = 'Report' AND \"watches\".\"watchable_id\" 
= \"reports\".\"id\""

再発防止策案

  • 今回のPRではやりたいことが2つあった。ロジック変更とデータ移行をそれぞれ別のPRにして、データ移行を先行させる
  • 不具合に気づいた時点で一旦 revert する

今回のことを受けて、不具合発生時の対応についてドキュメントが作成されました。不具合は発生しないのが一番ですが、何かあったときにフローがあれば少しは落ち着いて行動できそうです。

学んだこと(技術以外の面)

Working Out Loud(大声作業)の大切さ

前にも一度書いたことがある Working Out Loud。フィヨルドブートキャンプの Slack で紹介されていて知ったものだったと思います。

masuyama13.hatenablog.com

  • 作業が途中であってもチームメンバーの目の触れる場所にガンガンアウトプットする
    • Slackなどのチャットツールで実況中継しながら作業したり
    • 設計やコーディングがWork in progressな状態でもフィードバックを募ったり
  • 作業で詰まったらとにかく尋ねる
    • 簡単に手伝ってもらえるのに1人で行き詰まっているというのはプロの振る舞いではない

Working Out Loud 大声作業(しなさい)、チームメンバー同士でのトレーニング文化の醸成 - Quipper Product Team Blog

他業種から転職を目指す私のような人間から見ると、信じられないような考え方かもしれません。それまでの人生経験によるところが大きそうですが、記事を読んだだけで簡単に実践できるようなものでもないと思います。

でも、エンジニアとして仕事をするなら大事なスキル。私も、最初知ったときはなかなかできませんでしたが、フィヨルドブートキャンプという心理的安全性の高い環境に長くいたおかげで、だんだんできるようになってきました。

今回、自分だけの力では無理だと思ったとき、すぐ wakaran チャンネルで作業した点はよかったと思います。毎日オンラインで行われている「質問・雑談タイム」(メンターのプロのエンジニアの方に質問できる時間)にも参加し、たくさんの方に助けていただきました。

技術的な面だけでなく、「実際の現場でもよくある話だから焦らず落ち着いて対応しましょう」といったアドバイスもいただき、ネガティブにならずに問題の解決に集中することができました。「一人でやってる感」が全くなかったです。

フィヨルドブートキャンプの学習システムでも「分報」機能が実装される予定なので、トラブルになる前から Working Out Loud したらもっとよさそうです。

自分の手がける問題について、「聞きまくれる相手」がいる、というのはスキルの一部だ。
(イシューからはじめよ)

ある意味、フィヨルドブートキャンプはお金を払うだけで「スキル」が手に入るスクールですね(怪しい響きですが、アフィリエイトは一切やっておりません)。

もし FJORD BOOT CAMP(フィヨルドブートキャンプ) に興味を持った方がいたら、冒頭にもはった ksm さんの昨日の記事がいい点・イマイチな点など詳しく書かれていて参考になると思います。まだの方はぜひ読んでみてください〜

そして輪読会開催へ

あらためてデータベースについて学ぶことの必要性を痛感したので、今月末から 達人に学ぶDB設計 徹底指南書 の輪読会を始めることになりました。フィヨルドブートキャンプの参考書籍でもあり、以前さらっとは読んだのですが、難しすぎてほとんど記憶にない…。

第1章は「データベースを制する者はシステムを制す」

そういうことらしいです。システムを制したい人、一緒にやりましょう!

RubyMine をコマンドラインから開く(Mac)

先日、RubyMine を導入した。

ちょこっとしたコードのときは VSCode を使うことが多いとはいえ、VSCodecode コマンドみたいにターミナルから開けるようにしたい。

調べたところ、RubyMine のヘルプに書いてあった。Mac の場合、自分でシェルスクリプトを置く必要があるとのこと。

コマンドラインインターフェース - ヘルプ | RubyMine

#!/bin/sh

open -na "RubyMine.app" --args "$@"

ヘルプではスクリプト名を rubymine としているが、長くない…?

うーん、ruby はだめだし、rm もかぶる…。とりあえず mine にしとくか。

これで、開けるようになった!

# カレントディレクトリを RubyMine で開く
% mine .

シェルスクリプトの作り方について詳しくは以下の記事を参照。

masuyama13.hatenablog.com

Rails link_to の使い方

Rails はいろいろといい感じにやってくれるので便利だけど、理解しないままなんとなく使ってしまっているところが多いので整理した。

link_to

link_to は、リンク先を指示するヘルパーメソッド。

書き方

ERB

<%= link_to リンクテキスト, パス[, オプション] %>

slim

= link_to リンクテキスト, パス[, オプション]

以下のような<a>タグが生成される。

<a href="パス">リンクテキスト</a>

パスの書き方

 <%= link_to "Profile", profile_path(@profile) %>
 # => <a href="/profiles/1">Profile</a>

show/update/destroyアクションの場合は、パスをオブジェクト名だけで指定することができる。profile_path(@profile)と書かずに@profileだけで OK。

上の例(show)だと、次のように書ける。

 <%= link_to "Profile", @profile %>
 # => <a href="/profiles/1">Profile</a>

edit などの場合は省略できないので、次のようになる。

 <%= link_to "Edit Profile", edit_profile_path(@profile) %>

(参考)link_toメソッドを使ったリンクの作成 - Ruby on Rails入門

ブロックを渡す書き方

link_toには、ブロックを渡すこともできる。

ERB

<%= link_to パス[, オプション] do %>
  リンクテキストや画像など
<% end %>

slim

 = link_to パス[, オプション] do
   = リンクテキストや画像など

画像にリンクを張る例。

slim

 = link_to image_tag(company.logo_url, alt: company.name, class: "company-icon"), company
 
 / こう書ける  
 = link_to company do
   = image_tag company.logo_url, alt: company.name, class: "company-icon"

ActionView::Helpers::UrlHelper

チーム開発でのGitHubの流れ

先月から、フィヨルドブートキャンプでチーム開発に入らせてもらった。

これまでの課題も GitHub 上の自分のリポジトリに PR を作ってレビューしてもらっていたので、GitHub には慣れているつもりだったが、最初は戸惑うところがあったのでメモしておく。

チームによって方針が異なるので、ここに書くのは一例でしかなく、こうしなければいけないというものではない。

流れ

最初だけ必要な作業

  1. 自分の GitHub アカウントをコラボレーターに追加してもらう
  2. リモートリポジトリをローカル(自分のマシン)に clone する
  3. README を見てセットアップする

Issue ごとに繰り返す作業の流れ

  1. かんばんで、自分が作業する Issue を「作業中」に移動させる
  2. ローカルリポジトリmasterブランチから開発用のブランチ(例: some-feature)を切る
    • $ git checkout -b some-feature
  3. some-featureブランチで作業してコミット
  4. 作業終了
  5. プル
    • $ git pull origin master
    • masterブランチを最新状態に
  6. リベース
    • some-featureブランチで、$ git rebase master
    • some-featureブランチの根元が、最新のmasterの先端になる
  7. リモートリポジトリにプッシュ
    • $ git push origin some-feature
  8. PR(プルリクエスト)作成
    • 作業前に Draft として PR を作成してもいい
  9. CI が通ったことを確認してから、レビュー依頼
  10. (修正作業など)
  11. 動作確認後、Issue を close する

備考

  • レビューやデザインを依頼するなどして「待ち」になるまで、他の Issue の作業を始めてはいけない
  • 今開発しているリポジトリはまだmainではなくmasterブランチを使っているのでそのまま書いている
  • 5〜6はpull --rebaseでまとめられる(プル・リベースについてはこちらの記事

フォースプッシュは結構使う

Git を1からやり直す(リベース編) で、「一度プッシュしたコミットはリベースしない!」と書いたが、実際の開発ではしょっちゅうリベースしている。

作業途中でコードを見てもらいたいときや特に理由がなくても、作業完了前にプッシュすることはよくある。レビューを依頼するときには最新のmasterブランチを取り込んでおく必要があるため、上の手順の5以降をやることになる。

最初のプッシュをした後にmasterブランチが更新されていると、リベースかマージをする必要がある(どちらをやるかはチームにより異なる)。今のチームではリベースすることになっているため、同じコミットでもコミットのハッシュが変わり、プッシュできなくなる。

そこで、以下のコマンドでフォースプッシュ(強制プッシュ)する。

$ git push -f origin some-feature

フィヨルドブートキャンプの開発では、一つのブランチを複数人で触ることはないので特に問題は起こらない。

自分が作業するブランチを他の人も触る可能性がある場合は、--force-with-lease オプションを使うと、誰かがプッシュしている場合に強制プッシュできなくなるので安心。--force-with-lease-fエイリアスにしてもよさそう。

(参考)現場で使える Ruby on Rails 5速習実践ガイド(9-1)

『Team Geek』を読んだ

どんな本か

複数のプログラマが関わる場合、優れたコードを書くだけではプロジェクトは成功しません。
全員が最終目標に向かって協力することが重要であり、チームの協力関係はプロジェクト成功のカギとなります。
本書は、Subversionをはじめ、たくさんのフリーソフトウェア開発に関わり、その後Googleプログラマを経てリーダーを務めるようになった著者が、「エンジニアが他人とうまくやる」コツを紹介。
「チームを作る三本柱」や「チーム文化のつくり方」から「有害な人への対処法」まで、エンジニアに求められる社会性について楽しい逸話とともに解説します。
Amazon.co.jp より

なぜ読んだのか

「角谷トーク」で知って、「ほしい物リスト」に入れていた本。

Kindle 版がないため購入を躊躇していたが、先日LT会で紹介されているのを見て、さらに読みたくなったので買うことに。

フィヨルドブートキャンプでもチーム開発の課題に入ったので、タイミング的にも今読もうと思った。

この本を読む目的・この本から得たいこと

  • チームの協力関係の築き方を知る
  • 「エンジニアが他人とうまくやる」コツを知る
  • チーム内の一人のエンジニアとして、どういうことを考え、どう動けばいいかのヒントを得る

大事だと思ったことをメモ

  • 「早い段階で、高速に、何度も失敗せよ」
  • ソフトウェア開発はチームスポーツである
    • ビジョンを共有しよう
    • 仕事を分担しよう
    • 他人から学ぼう
    • 素晴らしいチームを作る
  • チームで働くときのポイント
    • HRT(ハート)
    • 謙虚(Humility)
      • 世界の中心は君ではない。君は全知全能ではないし、絶対に正しいわけでもない。常に自分を改善していこう。
    • 尊敬(Respect)
      • 一緒に働く人のことを心から思いやろう。相手を1人の人間として扱い、その能力や功績を高く評価しよう。
    • 信頼(Trust)
      • 自分以外の人は有能であり、正しいことをすると信じよう。そうすれば、仕事を任せることができる。
  • あらゆる人間関係の衝突は、謙虚・尊敬・信頼の欠如によるもの
  • コードを批判されても、自分の性格や人間としての価値が攻撃されたと思わないこと
    • プログラミングスキルは練習すれば向上する
  • 相手に伝えるときは、自分の疑問として謙虚に聞く
  • 議論しているのはコードのことであり、誰かの価値やコーディングスキルのことではない
  • チームの文化
    • エンジニアリングチームが共有する経験・価値・目標のこと
  • 強い文化は改善に対してオープンだが、害を与える急激な変化に対しては防御的
  • 許可を求めるより寛容を求めるほうが簡単
  • 「運」は鍛えることができる
    • 運のいい人は「チャンスに気がつく」
  • 他人がそのソフトウェアを使って幸せにならなければいけない
    • ソフトウェアを使ってもらい、そのフィードバックを受けてプロダクトを改良していくフィードバックループを回さなければ、ソフトウェアは死んでしまう
  • ユーザーに集中すれば、他のことはすべてついてくる
    • ハードルを下げる
    • プロダクトは、最初の体験が超重要
    • ユーザー数ではなく利用(アクティブ数)を計測する
    • 速度重要
    • Less is more(少ないことはよいこと)
    • 怠けない
      • フォームの入力値は寛容に
    • 複雑さを隠す
    • ユーザーの意見を直接聞く
    • 見下さない
      • ユーザーには常に敬意を払う
    • 我慢する
      • 多くのユーザーは問題をうまく表現できない
      • 何を意図しているかを理解することが重要なスキル
    • 信頼は最も大切なリソース
  • ユーザーのことを忘れない
    • ソフトウェアを書く理由
      • 自分、チーム、会社のためではない
      • ユーザーの生活を豊かにするため

所感

そろそろ就職活動をしなければいけないということもあり、一緒に働くことになる人たちの考え方やビジネスなどについて学びたいと思い、最近いろいろな本を読んでいる。

プログラミングに直接関係ない本も多いが、だんだん共通点が見えるようになってきた!面白い。

『Team Geek』のHRTは、チームで働く上で大事なことだ。確かに、今までの自分を振り返ってみても、謙虚(Humility)・尊敬(Respect)・信頼(Trust)の3つを忘れずに行動すれば、人間関係についての多くの問題は起こらなかった気がする。

コードを批判されても、自分の性格や人間としての価値が攻撃されたと思わないこと

少し前に教えてもらった「認知行動療法」っぽい考え方かなと思った。認知行動療法についてはまだよく知らないので、今度そういう本を読んでみたいと思っている。

“ユーザーに集中すれば、他のことはすべてついてくる” というのは覚えやすくてうれしい。

ソフトウェアを使ってもらい、そのフィードバックを受けてプロダクトを改良していくフィードバックループを回さなければ、“ソフトウェアは死んでしまう”。「死んでしまう」とまで強い言い方になっていたのが印象的だった。

『アジャイルサムライ』にも書いてあったが、ユーザーの声に真摯に耳を傾け、改良していくループを回し続けることが大事で、それがユーザーの幸せにつながる。

自分の仕事が誰かの幸せにつながるなんて素晴らしい。

仕事を始めたら読み直したい本。就活しなきゃ…

『やり抜く力』を読んだ

どんな本か

IQでも才能でもない、成功に必要な第3の要素とは? 全米社会に絶大な影響を与えた成功と目標達成の画期的な理論! 人生の成否を決定づける「やり抜く力」について、自分での身につけ方から、子どもなど他人の「やり抜く力」を伸ばす方法まで徹底的に明らかにする。これまでのあらゆる常識がくつがえる衝撃の一冊!
Amazon.co.jp より

なぜ読んだのか

先日のLT会で紹介されていて、そのLTに感動したので、読んでみた。

大事だと思ったことをメモ

  • 「やり抜く力」とは、「情熱」と「粘り強さ」
    • 「情熱」とは、ひとつのことに専念すること
  • 偉大な人とふつうの人の決定的なちがいは「動機の持続性」
    • 「情熱」と「粘り強さ」と似ている
  • 「やり抜く力」を強くする4ステップ
    • 興味
    • 練習
    • 目的
    • 希望
  • エキスパートになるためには、「意図的な練習」が必要
    1. ある1点に的を絞って、ストレッチ目標(高めの目標)を設定する
    2. しっかりと集中して、努力を惜しまずに、ストレッチ目標の達成を目指す
    3. 改善すべき点がわかったあとは、うまくできるまで何度でも繰り返し練習する
      • 時間の長さより「どう練習するか」がカギ -「目標設定 → クリア」を繰り返し続ける
      • ラクな練習」はいくら続けても意味がない
      • 「優秀な人」の姿勢を知る
      • 「習慣(ルーティーン)」をつくる
  • 「情熱」の源は「興味」と「目的」
    • 「これは人の役に立っている」と考える
    • 幸福になる方法は「快楽を追うこと」と「目的」を追うこと
  • レンガ職人の話
    • 「なにをしているんですか?」
      1. 「レンガを積んでるんだよ」 → 仕事
      2. 「教会をつくっているんだ」 → キャリア
      3. 「歴史に残る大聖堂を造っているんだ」 → 天職
    • 職種による違いはない
    • 自分がどうとらえるか
  • 「大きな目的」のためなら、人は粘り強く頑張れる
  • 「楽観主義者」は無力感を乗り越えられる
  • 「やり抜く力」は伸ばせる

所感

レンガ職人の話が印象的で、でもどっかで聞いたことあるような…と考えていたら、思い出した。

「角谷トーク」 で何度も出てきた文。

単に石を切り出す場合でも、常に心に聖堂を思い描かねばならない。
-- 採石場作業者の心得
『達人プログラマー』より

よく似た話だ。『達人プログラマー』も読みたい。

自分が何のためにそれをやるのか、常に目的や問題の全体像を考える、または意識することが大切だということだと思う。

“「才能」は、努力によってスキルが上達する速さのこと” と書かれていたが、結局は努力しなければ才能は花開かないということで、努力を続けられることが一番大事。

努力を続けるためには、興味と目的を持って取り組むこと。

好きなものがあるというのは、それだけで強みになるのかもしれない。

あと自分は元々楽観的なタイプなので、そこはよかった。

好きなことを仕事にできるように、頑張ろう。