Railsで作るログイン可能なブログシステム
をRailsを説明したり自分で試してみるときにいつも作っているなぁと思ったのでマスターを作ってみました。エンジニアでブログを知らない人はいないので説明するとき便利なんですよね。
誰かの役に立つかも知れないので作業ログを公開します。
システム要件
- gitがインストールされていること
- sqlite3がインストールされていること
- Rails > 2.2
環境がない人はぜひUbuntuを使って環境構築しましょう!→Rails開発環境をUbuntu8.04に構築するメモ - koumiyaの日記
プロジェクト作成からDB作成まで
$ rails blog
$ cd blog
$ script/plugin install git://github.com/technoweenie/restful-authentication.git
$ script/generate authenticated user
$ script/generate scaffold blog title:string user:belongs_to
$ script/generate scaffold entry title:string body:text blog:belongs_to
$ rake db:migrate
変更のポイント
scaffoldで土台はできたのであとは生成されたファイルを変更するだけです。ポイントは、
- ルーティングにはRails 2.2のshallowオプションを使います。
- ブログとエントリーのコントローラはログインを必須にします。
- scaffoldのままではModel同士が関係を持っていないので、ログイン中のユーザーのブログ、選択したブログのエントリーという関係を持たせます。
変更
変更箇所のdiffを貼っておきます。
app/config/routes.rb
@@ -1,7 +1,7 @@ ActionController::Routing::Routes.draw do |map| - map.resources :entries - - map.resources :blogs + map.resources :blogs, :shallow => true do |blog| + blog.resources :entries + end map.logout '/logout', :controller => 'sessions', :action => 'destroy' map.login '/login', :controller => 'sessions', :action => 'new'
app/controllers/application.rb
@@ -2,11 +2,12 @@ # Likewise, all the methods added will be available for all controllers. class ApplicationController < ActionController::Base + include AuthenticatedSystem helper :all # include all helpers, all the time
app/controllers/blogs_controller.rb
@@ -1,8 +1,10 @@ class BlogsController < ApplicationController + before_filter :login_required + # GET /blogs # GET /blogs.xml def index - @blogs = Blog.find(:all) + @blogs = current_user.blogs respond_to do |format| format.html # index.html.erb @@ -40,7 +42,7 @@ # POST /blogs # POST /blogs.xml def create - @blog = Blog.new(params[:blog]) + @blog = current_user.blogs.build(params[:blog]) respond_to do |format| if @blog.save
app/controllers/entries_controller.rb
@@ -1,9 +1,10 @@ class EntriesController < ApplicationController + before_filter :login_required + before_filter :load_blog, :only => [:index, :new, :create] + # GET /entries # GET /entries.xml def index - @entries = Entry.find(:all) - respond_to do |format| format.html # index.html.erb format.xml { render :xml => @entries } @@ -40,7 +41,7 @@ # POST /entries # POST /entries.xml def create - @entry = Entry.new(params[:entry]) + @entry = @blog.entries.build(params[:entry]) respond_to do |format| if @entry.save @@ -78,8 +79,13 @@ @entry.destroy respond_to do |format| - format.html { redirect_to(entries_url) } + format.html { redirect_to(blog_entries_url(@entry.blog)) } format.xml { head :ok } end end + + private + def load_blog + @blog = Blog.find(params[:blog_id]) + end end
app/models/blog.rb
@@ -1,3 +1,4 @@ class Blog < ActiveRecord::Base belongs_to :user + has_many :entries end
app/models/user.rb
@@ -5,6 +5,8 @@ include Authentication::ByPassword include Authentication::ByCookieToken + has_many :blogs + validates_presence_of :login validates_length_of :login, :within => 3..40 validates_uniqueness_of :login
app/views/blogs/index.html.erb
@@ -9,8 +9,8 @@ <% for blog in @blogs %> <tr> <td><%=h blog.title %></td> - <td><%=h blog.user %></td> <td><%= link_to 'Show', blog %></td> + <td><%= link_to 'Show Entries', blog_entries_path(blog) %></td> <td><%= link_to 'Edit', edit_blog_path(blog) %></td> <td><%= link_to 'Destroy', blog, :confirm => 'Are you sure?', :method => :delete %></td> </tr>
app/views/blogs/show.html.erb
@@ -3,11 +3,6 @@ <%=h @blog.title %> </p> -<p> - <b>User:</b> - <%=h @blog.user %> -</p> - <%= link_to 'Edit', edit_blog_path(@blog) %> | <%= link_to 'Back', blogs_path %>
app/views/blogs/new.html.erb
@@ -8,10 +8,6 @@ <%= f.text_field :title %> </p> <p> - <%= f.label :user %><br /> - <%= f.text_field :user %> - </p> - <p> <%= f.submit "Create" %> </p> <% end %>
app/views/blogs/edit.html.erb
@@ -8,10 +8,6 @@ <%= f.text_field :title %> </p> <p> - <%= f.label :user %><br /> - <%= f.text_field :user %> - </p> - <p> <%= f.submit "Update" %> </p> <% end %>
app/views/entries/index.html.erb
@@ -7,11 +7,10 @@ <th>Blog</th> </tr> -<% for entry in @entries %> +<% for entry in @blog.entries %> <tr> <td><%=h entry.title %></td> <td><%=h entry.body %></td> - <td><%=h entry.blog %></td> <td><%= link_to 'Show', entry %></td> <td><%= link_to 'Edit', edit_entry_path(entry) %></td> <td><%= link_to 'Destroy', entry, :confirm => 'Are you sure?', :method => :delete %></td> @@ -21,4 +20,5 @@ <br /> -<%= link_to 'New entry', new_entry_path %> +<%= link_to 'New entry', new_blog_entry_path(@blog) %> +<%= link_to 'Blogs', blogs_path %>
app/views/entries/show.html.erb
@@ -8,11 +8,5 @@ <%=h @entry.body %> </p> -<p> - <b>Blog:</b> - <%=h @entry.blog %> -</p> - - <%= link_to 'Edit', edit_entry_path(@entry) %> | -<%= link_to 'Back', entries_path %> +<%= link_to 'Back', blog_entries_path(@entry.blog) %>
app/views/entries/new.html.erb
@@ -1,6 +1,6 @@ <h1>New entry</h1> -<% form_for(@entry) do |f| %> +<% form_for [@blog, @entry] do |f| %> <%= f.error_messages %> <p> @@ -12,12 +12,8 @@ <%= f.text_area :body %> </p> <p> - <%= f.label :blog %><br /> - <%= f.text_field :blog %> - </p> - <p> <%= f.submit "Create" %> </p> <% end %> -<%= link_to 'Back', entries_path %> +<%= link_to 'Back', blog_entries_path(@blog) %>
app/views/entries/edit.html.erb
@@ -12,13 +12,9 @@ <%= f.text_area :body %> </p> <p> - <%= f.label :blog %><br /> - <%= f.text_field :blog %> - </p> - <p> <%= f.submit "Update" %> </p> <% end %> <%= link_to 'Show', @entry %> | -<%= link_to 'Back', entries_path %> +<%= link_to 'Back', blog_entries_path(@entry.blog) %>
うわw長w
FirefoxのMake Linkが激しく便利な件
なんとブロガーフレンドリーなツールなんだ!
はてなダイアリーでは、他のページにリンクをはりたい時に
[http://d.hatena.ne.jp/koumiya:title=koumiyaの日記]
みたいに書いてあげることで、koumiyaの日記のようなリンクが生成される。
今までURLをコピーして→タイトルを写してって手順を踏んでたんだけど、Make Linkを見つけてそれが無意味であることを知った!Firefoxの人ならMake Link :: Firefox Add-onsを導入して、
設定から、
[%url%:title=%text%]
というフォーマットをHatenaという名前で作ってあげると、
右クリックからHatenaを選ぶだけではてな記法のリンクがクリップボードにコピーされる!
たぶんみんなやってるんだろうけど、まだ知らない人はこんないいものがあるんだよってことで。
よし、さっそくMakeLink使って仙台RubyKaigi01の感想かくぞ!
仙台RubyKaigi01感想
昨日(1/23)OSC仙台内で行われた仙台Ruby会議01にお邪魔してきたのでその感想をば。当日のまとめは、tggさんのメモがまとまってます。
運営者のみなさんありがとうございました!
まずは、片平さんはじめ企画と当日の運営をしてくださったみなさん、本当にありがとうございました!RubyKaigi本編、LT、2次回どれも非常に楽しむことができました。OSC仙台内でも一番活気のある会場になっていてすごいなーと関心するばかりでした。
次からはそれぞれのセッションの感想です。
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法/藤岡さん
東北にRubyistあり!トップバッターはcgi.rbのメンテナである藤岡さんのお話です。
ご本人のブログでスライド公開されてます。
cgi.rbを使ってWebアプリを組んでいた藤岡さんが、バグ報告をして、テストを書いて、ライブラリのコードにまで手を入れるまでの武勇伝。
私自身は去年からRubyをはじめたゆとりで、出来てるものを使わせてもらってる側だったので、ついソフトウェアははじめからそこにあるものいう錯覚をしてしまいます。使う側から提供する側にいった藤岡さんの話を聞いて、ソフトウェアは人が作っているもので自分にも貢献できる部分があるってことを再認識させてもらいました。
あと、1.9のM17Nの話は知識を持ってなかったので参考になりました。
まず好きなこと、そしてそれを続けること/須藤さん
ウサギとカメで進み具合が見れるプレゼンツールRabbitの開発者須藤さんのお話。
地方で悶々としているプログラミング好きな人向けの話ということで、バッチリ自分にあてはまってました。誤解を恐れずに一言でまとめると、「スキルアップするにはまずはじめること、そしてそれを続けることが大事、そのためには好きなことをやるのが一番」
自分も最近、成長したいと思ってる後輩にアドバイスする機会が増えてきたのであんなことやこんなことを書きつつ色々と考えているんですが、須藤さんのお話はすごくいいヒントになりました。ポイントを抽出すると、
- 好きなことをやろう!
- 実際に作ってみる
- 愛着の持てるもの欲しいものを作る
- せっかく作るならイベントや大会に参加する
- 好きなことを続ける
- すぐにはすごくなれないけど、すこしずつ続ければすごくなれる
たぶん私がこの話をしても説得力がないですが、須藤さんの奨学金免除やSummer of codeで認められた経験の上での話しはすごく説得力がありました。
あとは、すごい人にあったときに、自分の代名詞になるようなソフトを持っていると速く分かってもらえる、さらにソフトが有名になれば向こうから話かけてきてくれるという話をされてて、自分もそんなソフトを作りたい!と強く思いました。そういえば、RubyKaigi2008のときもERBの作者である関さんが代表作はh(ERBのメソッド)って話してるのを聞いて同じことを思ったけど未だ実現していないので、今度こそ!
Happy Life Hacking with Ruby on Rails 〜二人で育てるRuby on Rails〜/大場さんご夫妻
エンジニアが幸せな結婚生活を送るためのライフハックのお話。自分は結婚していないのであまり実感がわかなかったです。でも、おでかけマイレージ制とか本購入を理解してもらえないとか結婚生活は大変そうなので、きっといつか役にたつ情報になりそうです。
二次会で周りを見渡してみると東北のRubyistは既婚者が多いようなので、かなりニーズがある話だったんだろうなぁ。私もあやかりたいです。
Railsテスティング環境 2009 - Cucumber, Webrat and RSpec. -/諸橋さん
次はCucumberの予習をして望んだ諸橋さんの話です。やっぱプレゼンうまいですね!いきなり結論をもってきてその背景から具体的な内容にdescribeしていくプレゼンの仕方は非常に分かりやすかったです。なんと、事前にスライドが公開されていたらしい。
最新のテスティング環境としては、なるべくコントローラにはロジックを書かずにモデルに寄せるという方針の上で
- モデルのテストをRSpecで
- 機能間をまたいだインテグレーションテストをCucumberで
やっているとのこと。コントローラのテストはインテグレーションテストで担保できるという方針。この方針は私が今やっているプロジェクトと酷似(Cucumberは使ってないけど)していた。
ただ色々と課題も残っているようで、CucumberでJavascriptやCSSについてのテストはできないとのこと。やっぱりトータルでテストのガバレッジが100になるように、人の手での確認や他のツールを選んでいく必要はある。ただ、感覚としては、Cucumberで8割のガバレッジは担保できているので導入コストを考えてもおつりは来るとのことでした。個人的には、おそらく残りの2割をツールで担保しようとすると、コストと成果が見合わなくなると思うので素直に人の手で確認するのがいいだろうと思います。
steps(Cucumberで日本語で書いたストーリーをRubyで解釈するための命令郡)の量については、プロジェクトの開始時点で定義したものに3機能でひとつ追加が入るくらいという話でそんなに多くはならない様子。途中角谷さんから補足があって、ライトなプロジェクトで採用してみて使えるという段階なので、大きめのプロジェクトでの採用事例があるわけではない。Cucumberを使ったからといっていきなりExcelの仕様書をなくせるというわけではないとのことでした。それでも採用する価値は十分あるなぁ。
そういえば、その日の朝に送ったトラックバックがプレゼン資料のFAQに入ってて驚きましたwありがとうございます!
LT
トップバッターの武田さんのお題が「JavaからRubyへ」で、次の発表者が訳者の角谷さんになってて何を話すのかと楽しみにしていたんですが、期待以上に面白かった。めっちゃ笑わせてもらいました!スクリプト言語やるとモテるんですね!どうりで会場に既婚者が多いはず。全体として東京から角谷さんと高井さん、松田さんが札幌から島田さんが、福岡から新井さんがいらしていて東北の方以外が全国から集まっていた。RubyKaigiの全国への広がりを感じるLTでした。
二次会&三次会
お刺身&牛タンが出た豪勢な二次会と諸橋さんの大学時代のいきつけのバーでの三次会にも行ってきました。そういえば、三次会まで行ったのは今回がはじめて。二次会は料理が出てくるとみんなiPhoneで写真とってたなー。あと、フェルトのネコビーンがかわいかった!なのに会場でのNetBeansの知名度が低いのは残念、みなさんvimかemacsなんですね。
藤岡さんと福島のRuby & Railsをもりあげましょう!って話ができたり、諸橋さんにCucumber導入に関しての一歩踏み込んだ質問ができたりで非常に有意義でした。
三次会は高井さんと須藤さんの掛け合いが面白かったwちょ須藤さん俺に振らないでくださいw
こんな感じで、私にとって非常に有意義な仙台RubyKaigi01でした。最後に運営のみなさん、発表者のみなさん本当にお疲れ様でした!
※タイトルを今後のアクションにしてたが、感想が長くなったので別で。
Cucumber予習
creative commons photo by viZZZual.com
明日(もう今日か!)OSC仙台に参加してきます。OSCのページから何回事前登録しても「登録できません。」ってなるんだけど席空いてるのかなぁ。。
さて、Cucumberについてなんですが、id:moroさんがCucumberがアツい - moroの日記で紹介されてるインテグレーションテストツールで明日はそのセッションがあります。
個人的には、Excelのテスト仕様書と比べて作るコスト、テストの網羅性はどうなの?Ajaxなアプリでも使えるの?Viewのデザイン変更にも耐えられるの?などいろいろと疑問を持ってたりするんですが、方向性的にはすごく期待してます。
だって、Cucumberでできることってつまりは動く仕様書が作れるってことですもんね。最近、仕様書に求められているのは、(契約的な視点を除けば)「テストに使えること」と「仕様策定者と実装者のコミュニケーションの土台になれる」ことだと思っているので、動く仕様書はマジ魅力的です。
ってなわけで明日のセッション+二次会でパフォーマンスを発揮できるように(俺が発揮してどうすんだ!?)予習していこうと思います。
といってもソースはほぼ諸橋さんのブログなわけですがw
Cucumber
Cucumberがアツい - moroの日記
Cucumber Making BDD fun
featureは仕様を自然言語で書くファイル。
stepsはfeatureをrubyで解釈するための命令の集まり。命令の定義は正規表現でする。後方参照を変数として利用可能。
Cucumber自体はRuby以外にもJavaや.Net等環境を選ばずに動く。ただ、元々がRSpecのストーリーランナーを置き換える目的で作られたようでRuby発祥といえる。
Webrat
Webratがスゴい(続:Cucumberがアツい) - moroの日記
Webrat 0.1.0 released
Cucumberのstepsが使っているライブラリ。
visit new_entry_pathとかclicks_button("submit")とかUIレベルでブラックボックスなテストがRubyのDSLで書ける。すげ!
内部的には、test/unit or RSpecを使っている模様。
自分がやっている情報収集→整理→出力の仕方まとめ
前に、ティーンズに技術者として成長するためのポイントを話てきた。でホットな技術に触れるようってのとアウトプット重要ってのを上げてたのだけど、じゃ実際に
情報のインプット
↓
情報の整理
↓
情報のアウトプット
ってどうやればいいんのかってところまで話せなかった。なので、いつか話すかもしれないし自分が普段使っているものをまとめてみる。
インプット
Firefox
ブラウザはこれ。情報収集に関係するアドオンとして、SBMカウンタを入れている。
ソーシャルブックマークされてるページに行くと右下にコメントが表示されるので参考にしてる。たまに、関連するURLやツール名が書いてあったり。
はてなブックマーク人気エントリ
ホッテントリ総合
ホッテントリIT
とりあえず、ITカテゴリの人気エントリをチェックしておけば最近どんな技術やツールが熱いのかってのが分かる。前述のSBMカウンタと組み合わせて使うのがオススメ。
検索はGoogle。あえて挙げるほどじゃないけどw
以下の二つのGreasemonkey Scriptを入れると使いやすくなる。
Google Reader
RSSリーダ。人気エントリで見つけた人のブログで人気エントリ入りしなさそうな記事も読みたいなと思ったらこっちに登録。
情報の整理
はてなブックマーク
気になった記事をブックマーク。どこからでもブックマークできて見れるので便利。それと、その記事の要約でも思ったことでもいいからなにかしらコメントを書くと、情報の整理といっしょにアウトプットもできる。
マインドマップ
XMindで書いてる。主に、誰かと議論した後のメモや本の要約。
本を読むときは、まず真ん中にタイトルを書いて、目次と前書を見てから直下のノードに疑問を書く。その下に本を読んでいて見つけた答えを随時書いていくようにしている。そうすると、レバレッジ・リーディング的に目的を持って本を読むことができるのでより多くのことを吸収できる。
アウトプット
はてなダイアリー
なにかしら自分専用のブログを持ってアウトプットしよう。プログラム関係の仕事をしてるならやっぱりはてなダイアリーがいい。ソースコードに色つけて表示できるので。
こうして見ると、かなりソーシャルブックマークに頼った情報収集だな。あとは、オフラインで趣味の合う人に教えてもらってるのが大きい。こっちからもどんどん情報を提供するようにすれば、お互いいい関係が築けるはず。
その他のツールについては、インターネット上の情報を使って学習・勉強する方法について考えてみたがよくまとまってます。
なにか質問や意見はありませんか?
ってたまにバイト先でやる小規模な勉強会で受講者に聞くといつも静かになってしまう。がっくりしてしまう時もあるのだけれど、それってなんでだろうとふと思った。
で、たぶん理由が分かった!それは、「受講者が考えていない」ことがわかってしまうからだろう。いや、俺の話かたが威圧的だから質問できないのかもしれないんだけどさ。逆に勉強会が分かりやすすぎて質問が全く浮かばないのかもしれないけどwそれはないか…。
人の話を聞く時はなんらかの仮説を立てたり、話の内容を頭の中でイメージしながら聞くもんだろう。それが話を聞いて考えるってことだと思う。仮説を立てて聞けば予想と違う内容だったときになんで?ってなるだろうし、自分のイメージがあってるのか確認したいと思うもんじゃないだろうか。
前に参考になりますって答える人は考えてない!考えている人はなにが参考になるか言うはずだ!って増田の記事を見た覚えがあるんだけど、それに似てる。増田はすごいなぁ、そのとおりだよ。
ティーンズに技術者として成長するためのポイントを話てきた。
今日バイト先で頼まれて、WEBアプリ勉強会に参加してた大学生向けに「技術者として成長するためのポイント」みたいな話題で、勉強の仕方や持っておいて欲しいマインドについて話してきました。自分自身のコンピュータのど素人からはじまって今まで4年間の間に経験してきたことを元に話をしたんですが、即興で10分でまとめて15分くらいで話したので、後になって実はあれを伝えたかったんだというのが出てきたのでこの場にまとめ。
アウトライン
- 成長の二次曲線
- 技術を学ぶときのポイント
- 早く成長するためのコツ
成長の二次曲線
横軸に時間、縦軸に成長の度合いを取ると、成長は二次曲線のような弧を描きます。なにか新しい技術を学びはじめたときは、できることも少なくつまらない、ゆるやかな状態が続きますが継続して学び続けているうちにだんだんと二次曲線の傾きが急になって力がついた実感が持てるようになります。重要なのは、
- 継続して勉強する(最初つまらなくとも投げ出さない!)
- 成長曲線の先にある未来を具体化して計画を立てる
- とにかく行動に移す、成長曲線を少しずつ登り続けること
の3点です。成長して自分はどうなりたいのかという将来のビジョンを持っている人は、同じことをやっても他の人より吸収力がまるで違います。それを持っている人にとっては、何をやっても学びの場になりますが、ない人にとっては作業でしかありません。まぁ自分も初めてプロジェクトについた時は 仕事 = 作業 だったのでこんなことが言えるんですが、言われたことを黙々とやっているだけの時間は今思うと本当に勿体ない。もうね、かんなぎのDVDを買ったのに見ないでそのまま売っちゃうくらい勿体ない。それでもう中古のシール貼られてねたミシュランのネタですよ。美味しいとこ全部持ってかれちゃってる!
…かえって分かりにくくなった気がするので話を戻すと、将来のために使える時間は限られているので、時間あたりの価値を高めるためには、目の前の仕事にどれだけ意味を持たせられるかにかかっている。将来ああなりたいから、今はこれをやるべきという計画を立てて目の前の仕事に取り組むと、積極的に学びにいけるし、チャンスを逃さない。
学生の場合だと、ビジョンを半強制的に出さざるをえなくなる就活というイベントがありますが、周りがはじめるのを待ってないで早い時期から考えていたらきっと成長は早くなるはずです。だって、自分も周りも就活後に目の色変わったやつ多いですもん。
最後に、かならず行動に移すこと。将来のビジョンがはっきりしないならしないでいいんです。大事なのは行動を起こしてその結果からまた将来を考えてみること。ちょうど登山のように成長曲線を少し上ると、そこからの新しい景色が見えてくるので、また次の地点を目指せばいい。しいて言えば、将来の見通しが立つようになることが一番の成長と言えるのではないでしょうか。
技術を学ぶときのポイント
ポイントとして、10年後も使え(そうな)る、他の技術のベースとなっているような技術や考え方と、最近の流行の技術や時代の流れ等のホットな話題の二つを抑えることです。それぞれの特徴と具体例(今回はWEBの勉強会で、SAStrutsを使ってたのでそこらへんで)をあげると、
10年後も使える技術
長く使われており他の技術のベースとなっているもの、例えばHTTPはおよそ20年前に出来た仕様が少しずつ改良されて今にいたります。現在では、フレームワークに隠蔽されて意識しなくともアプリケーションの開発が出来るようになってきましたが、サーバー・クライアントモデルやGETやPUTの概念等はもちろん、プレインテキストでの通信といった内容は、いざという時に解決の糸口を探ったり、セキュリティやパフォーマンス等の品質に直結するものです。あとは、オブジェクト指向とか。学んでもすぐにモノは作れないけれど、最終的なモノの品質をあげたり作れるものの幅を広げる技術です。
ホットな技術
Javaのような言語やSAStrutsのようなフレームワークはホットな技術であることが多いです。次々と新しいものが出てきて、今の流行が1年後には時代遅れということもざらにあります。言語は同じ名前を冠していてもバージョンが異なるとかなり違ったりするのでこちらよりでしょう。こういった技術は、モノを作ることに直結していて比較的すぐに動かすことができます。ですので、やっていて楽しいしモチベーションも上がりやすいと思います。
どちらも大事な理由は、これらが切り離せないもので、「速く」「高品質」なものを作ろうとしたときにどちらも必要になってきます。学ぶという視点で見ると、ホットな技術を使って動くものを作ってモチベーションをあげつつ、その基礎として使われている技術をしっかり抑えるのがいいんじゃないでしょうか。ベースとなる考え方を抑えておくと、同じ基礎の上に成り立っている技術を習得するときに格段に効率があがります。例えば、Javaでオブジェクト指向を抑えていた人はRubyに移ってもすんなりとコードが書けるし(Java的なコードになりますがw)、HTTPの知識はWEBをやってれば使わないことはありません。
ベースとなる技術から順番にやっていくのが一番効率良さそうですが、自分の場合はモチベーションが続かないので、動かしてとりあえず経験してから本等をあたって情報を整理し、点と点を結ぶような勉強の仕方をしています。たまに、新しい言語は言語仕様を読むところから入るみたいな人がいますが、俺には絶対無理w
早く成長するためのコツ
端的に3つあげてきました。
必要になったら学ぶ(必要になるのを待つのではなく、必要な機会を自分から作る!)
目的がない状態でだらだら勉強するより、必要になったときに集中して勉強したほうが効率的だし身につく。遅延評価勉強法と呼ばれているあれです。
自分自身、昔バイト先がサーバーサイドの人ばっかりでJavascriptがニッチな領域だった頃があって、やってみようかなーと思って本を買って読んでみたけど、すぐに後輩に出来る人が現れてそれなりに時間かけたのに実を結ばなかったことがありました。その後間を明けて、あるサイトをカスタマイズするGreasemonkeyを書こうと思い立ち分からないながらもなんとかやってみて、めちゃくちゃで赤面しちゃいそうなコードだったんですがとりあえず動いて人に見せたら結構反響があったりして、楽しくなってもっと綺麗に書きたいと思ってMozillaのJavascript入門とかを見てるうちにプロトタイプベースのオブジェクト指向も分かちゃったよ!的なことがあったんですが、これが今思うとまさに必要な状況を作って勉強してたなと。
これをやるときに、出来た!動いた!で終わりじゃなくベースになっている技術や考え方を抑えておくといいと思います。
どんどん人に聞いてみる
自分の先を行っている人は、まだ自分が知らない感覚や効率的な勉強の方法を知っています。どんどん利用させてもらって早く追いついちゃうのがいいかと。その代わり肩を並べるようになれたら、自分からもどんどん情報提供していきましょう。
特に、新しい分野にチャレンジするときに全体像や雰囲気を掴むには人に聞くのが一番です。
これについてはちょうど前に似たような話をエントリーしました→教えるとき・教えてもらうときに大事だなと思ったこと
アウトプット重要
アウトプット重要だよねって各所で言われつくしていて、理由は色々あるけどとりあえずやっとくべきことの代表的な存在だと思います。似たものに、なんでも書き出してみるというセオリーがいます。
自分なりには理由が二つあって、
- 分からないということが分かるようになる
- 自信をつけるキッカケが出来る
ひとつめはそのまんまで、誰かに伝えようとしたときにはじめて、自分自身も分かっていなかったことに気づくのでどんどんアウトプットしようよ!という話で、うまく説明できなかったら謝って次ちゃんと説明できればいいじゃないという感じです。
もうひとつの自信をつけるキッカケというのは、自分自身が何に対しても自信が持てないなーという状況で3年生の前半くらいまでを過ごした経験を元に最近重要だと感じている理由です。まず、なんで自信が持てなかったかというところなんですが、人から承認してもらう機会が少なかったからだと思うんです。やっぱりチームや組織の中で行動する人間がこれでいいんだと思えるときって人から認められたときなんですよね。それってつまりは、自分がアウトプットしたものに対して相手からの同意が貰えたときなので、アウトプットを増やすということは承認の機会を増やすということになるわけです。
理解の段階が大きく二段階あるとして、理解はしていて自分の中では分かってる状態と、それを人に説明できる状態って差があると思うんですが自分のケースだと、とりあえず分かっているだけで満足してたのが原因でした。
それが、どんな些細なことでも少しずつアウトプットしてみようと心がけてから状況が変わりました。一番大きな変化は、納得いくまでやったことをアウトプットして認められればそれは嬉しいし、そうじゃなくても、自分が気づけなかった部分や足りなかった部分を指摘してもらえるのだから、次はもっといいものが出せると前向きに捕らえられるようになったことです。
それに慣れてしまうとアウトプットすれば、相手の反応はどうあれ必ず前進すると思えるのでよりアウトプットを重視するようになりました。こういう風に書くとちょっとおおげさかもしれませんが、元々議論とかあんまり好きじゃない自分が最近は議論したいと思うことのほうが多くなったので実際結構な変化があったと思います。いやー人間変わるもんですねー。
最後のほう技術ってところから話がそれちゃったけど気にしない。全体的にだらだらな感じなので後で直すかも、いや直す。