『Modern PHP』を読んでPHPとそのコミュニティがより好きになった

Modern PHPという本を読みました(日本語版なし)。

モダンなPHPを学べる教材としてはPHP: The Right Wayが有名ですが、物足りなさを感じたため、他に何かいい教材はないかと探したところ評判の良いこの本にたどり着きました。

著者はPHP: The Right Way、Slim FrameworkのメンテナーであるJosh Lockhartです。

Modernとは題していますが発売日が2015/02/09で、当時のPHP最新バージョンは5.6なため、古くなっている部分も多くあります。それでも学びの多い本でした。

コミュニティにより進化してきたPHP

特に面白かった章はChapter 3. Standardsで、PHPが中央集権的なフレームワークモデルから分散型コンポーネントによるエコシステムに進化した経緯を知ることができます。それを実現するための推奨であるPSRと、それを策定するPHP-FIGがコミュニティによって育てられてきたこと、基本にあるのはインターフェイスに対してコーディングするということが書かれています。

LaravelがSymfonyコンポーネントを多く利用していることは有名ですが、こういった取り組みの成果なのだなと知ることができました。

Composerの登場によってエコシステムが著しく改善されたことも大きかったようです。

コンポーネントベースで考える

Chapter 4. Componentsでは、実際にマイクロフレームワークをメンテナンスしている著者が考える良いコンポーネントとは何かについて書かれています。良いコンポーネントの特性として、一点集中、小さい、協力的、よくテストされている、よくドキュメント化されている、ということが挙げられています。

また、著者はPHPアプリを新規作成する際にすぐにフレームワークの選定には行かず、まずどの既存コンポーネントを組み合わせて問題を解決できるかを考えるそうです。フレームワークを選択した場合、そのフレームワークの未来に投資しており、上手くいかない場合もあるという考えからです。結果としてフレームワークに行き着くこともあるでしょうが、大事な考え方だと思いました。

HHVMとHack

Part III. Deployment, Testing, and Tuningはホスティングの選別やデプロイといったPHP周辺のトピックについてです。この辺りは最新の事情が変わってそうなのでざっと読み流しました。

ただ、面白かったのは最後の2章で、Facebook主導によるHHVMとHackについて触れられています。おそらく世界一巨大なPHPユーザーであるFacebookがどのようにしてそれらを必要とするようになり、開発してきたかについて述べられており興味深かったです。また、それによって競争が生まれ、PHP 7での劇的なパフォーマンス向上に寄与したことについても書かれていました。

まとめ

各章が丁度いい深さと分量でまとめられており、とても良い本でした。PHPは何かと物議を醸す言語ではありますが、歴史とともに形を変えながら進化し、コミュニティによって育てられていることを知ることができる良い本でした。

PHPやそのコミュニティがこれまでよりもっと好きになれた気がします。これからまたどう進化していくのか、楽しみです。

リンク

『エンジニアの知的生産術』で知識から新たな知識を生み出す方法を学ぶ

『エンジニアの知的生産術』を読みました。

『コーディングを支える技術』の著作などで有名なサイボウズ・ラボの西尾泰和さんによる、「効率的に学び、整理し、アウトプットする」(副題より)ための本です。

こういった「学び方を学ぶ」メタスキルは、これから色々なことを学んでいく上で早く身に付けるに越したことはないと思い以前から興味があり、少し前には”Learning How to Learn”というCourseraのコースを受講したりしていました。

tkykhk.hatenablog.com

知的生産性の研究に10年関わってきた著者が、インプットやアウトプットに関する、脳に関する研究などの豊富な文献や、目的を達成するためのGTDKJ法といった手法、Whole Mind Systemといった読書術などについて、時にはこの本自体を書くにあたって実践的に応用した例を取りながら紹介してくれます。抽象的な概念が登場することもありますが、解りやすい例え話で説明されたり図解されているものが多く、理解を助けてくれました。

具体的な手法などについては本を手にとって頂くとして、特に自分に響いた部分について書いていこうと思います。

目的を持つことの大切さ

この本を通して気づかされたのは、何かを始めるにあたって、そもそもの目的とは何なのかという意識を持つことです。

第1章「新しいことを学ぶには」に、「大学に入りなおすべき?」という項があります。僕は高校中退後、長いブランクのあと専門学校に入ったという経歴から、アカデミックなものに憧れがあり、いつか大学に入りたいと思っていたりするのですが、そもそも大学に入る目的とは何だろうとハッとさせられました。大学の講義自体はこの本で紹介されているようにMOOCで公開されているものも多く、教材についても参考図書を読んだりすればいい話なので、ただ憧れという曖昧なもので時間とお金を費やすのはどうなのだろうと考えさせられました。

また、コードリーディング力が足りないと感じることが多いのですが、Rubyの開発者Matzの言葉として、ソースコードを読むにあたっても、全体を読もうとせず目的を持って、時にはつまみ食いのように読むことが大事だと語られています。

よく手段と目的を履き違えるなと言いますが、何をするにしても、どこを目指しているのか問うことを忘れないようにしたいと思いました。

人間の脳のメモリに頼らない

この本では国内外のインプットやアウトプットの手法について紹介されていますが、共通しているのは頭の中でモヤモヤと考えず、まずはふせんなり何なりに書き出してみるということです。まずは書き出してみると、その過程で共通点や優先度などが判定できるようになり、整理しやすくなるというものです。

人間の脳の力というのは限られていて、この本によれば作業記憶は4個しかないと主張する心理学者もいるようです。いかにそれを外部に書き出して整理することが大事かが分かります。

これは何も創造的な活動に限らず、日々のモヤモヤなども書き出してみればスッキリすることもあるので、貧弱な脳のメモリに頼らず、外部にどんどん書き出していこうと思いました。

最後に

この本で紹介されている手法を全て実践しようとすると、負荷が高すぎてインプットやアウトプット自体が億劫になってしまいそうなので、取り入れられそうなところから実践してみようと思いました。実際に著者も手法を忠実に実践するのではなく、上手く組み合わせながら自分流にアレンジされているように思います。

本の最後に、この本のタイトルが「〜学び方」ではなく「〜知的生産術」になった経緯について語られています。応用の現場で必要なのは流通した知識ではなく現場の状況にフィットした新しい知識であるからということだそうです。

知識もただのコピーに終わっては役に立ちません。これから知識を自分の血肉にすることを助けてくれる貴重な一冊となってくれそうです。まずは大量のふせんを購入するところから始めてみようと思います。

リンク

ソフトウェアエンジニアが英語に慣れ親しむためのコンテンツ

PHPカンファレンス福岡2018で『ソフトウェアエンジニアが英語に慣れ親しむ方法』というLTで登壇しました。その中でおすすめコンテンツというのを紹介しましたが、それについてもっと掘り下げたものを記事として書いていこうと思います。

speakerdeck.com

なお、以前に海外の情報収集についてブログに書いたものと被っている部分があります。

tkykhk.hatenablog.com

ソーシャルニュースサイト

ソーシャルニュースサイトとはユーザーがリンクや 投稿に対して投票やコメントを通して議論できるサイトのことです。日本で使われているものでいえばスラドでしょうか。僕はこれらを中心に海外の情報収集を行っています。

reddit

Wikipediaの記事によると、月間ユニークユーザー数がアメリカでは3位、世界では6位を記録したこともある世界的に大人気のサイトです。

話題ごとにsubredditと呼ばれるセクションに分割されており、ソフトウェアの分野でも数多くのsubredditが存在します。総合的なsubredditだと以下のようなものがあります。

  • r/programming
  • r/webdev
  • r/compsci

あとは言語やフレームワーク別に subredditが存在するので、自分の興味のあるものを追っていけばいいと思います。

どうやってチェックしていくかですが、僕はこのような感じでやっています

  • 基本的に毎日だいたい同じ時間にチェックする。
  • ここ24時間外に盛り上がった話題(投稿時間が”1 day ago”)をチェックするため”1 day”というキーワードでブラウザの検索、引っかかったpostをチェックする。
  • ソートをtopにしてここ24時間内に盛り上がったtopicをチェック。
  • 賑わっていない、またはそこまで重要でないsubredditはhttps://www. reddit.com/r/[subreddit名]/top/?sort=top&t=weekをブックマークに追加して毎週チェック。それらのブックマークをまとめたフォルダを作って、一気に全部開けるようにしておくと良い。

Hacker News

ポール・グレアムのY Combinatorによって運営されている、テクノロジー主体のソーシャルニュースサイトです。redditはジョーク受けがいいですが、こちらは真面目なコメントが上位に来やすいという印象があります。

そのままでは素っ気がなく、ポストの数も多く使いづらいので、僕はhnrssという、条件でフィルターしてRSSとして流してくれるサービスを経由して購読しています。具体的には http://hnrss.org/newest?points=200 というフィードで、200ポイント以上のポストだけ流れてくるようにしています。

あとはHacker News Enhancement SuiteというChrome拡張機能があるので、これも入れています。コメントの折りたたみなどが出来て重宝しています。

技術記事

スライドではMediumとdev.toを紹介しましたが、これらは投稿数も多く、コンテンツのクオリティもかなり玉石混交といった感じです。初心者向けの記事が多い印象も受けます。一時期はRSSで購読したりもしましたが、今はメールマガジンTwitter経由でキュレートされた記事をチェックするようにしています。

Medium

TwitterのCEOだったエヴァン・ウィリアムスが立ち上げたブログサービスです。Publicationと呼ばれる出版元として記事を配信しているところが多く、以下のようなものをフォローしています。

これらをLettersと呼ばれるメールマガジン機能でチェックしています。

dev.to

爆速として話題になった開発系情報共有サイトです。最近OSS化され盛り上がっています。

僕は公式Twitterのフォローと、メールマガジンでキュレートされた記事を興味があるものだけ読むようにしています。

タグをフォローする機能などあるようですが、僕は今のところ使っていません。

インタラクティブに学べるサイト

Coursera、Udacity、edXといったMOOCと呼ばれるサイトがおすすめです。ほとんどの講義は動画に英語字幕もついているので安心です。

Courseraが最大手だと思いますが、おすすめはGoogleなどの企業と協同でコンテンツを配信しているUdacityです。Nanodegreeという高額な有料プランもありますが、シラバスを見ることができるので、それに沿って学習すれば無料で学ぶことも可能です。

また、edXのCS50はコンピュータサイエンスの入門コースとして非常に評判が良いです。

Web開発の初心者向けにはfreeCodeCampというサイトもありおすすめです。

日本語でマイナーな技術の選定

ドキュメントが日本語で整備されていないような技術を選定することで、無理やり英語を読む必要性を作るという方法もアリだと思います。業務での導入は難しいかもしれないので、個人のサイドプロジェクトで使ってみるといいのではないでしょうか。

例えば最近だとモバイルアプリのクロスプラットフォームSDKであるFlutterが熱いと聞きます。

Slackワークスペース

各言語やフレームワークにはSlackのワークスペースが用意されていることが多いです。そういったものに参加することでドキュメントだけとは違う、生の技術に関する英会話に触れることができるのではないでしょうか。最近だとDiscordを使っているところも多いみたいですね。

Podcast

コンテンツとして挙げたものの、僕については日本語のポッドキャストを消化するのに精一杯で英語のPodcastは追えていません。

ちょっと古いですが、@miyagawaさんのこの記事などが参考になるのではないでしょうか。

weblog.bulknews.net

まとめ

以上、英語に慣れ親しむためのコンテンツを紹介しました。

これらを一気に全部となると負荷が高すぎて続かないと思うので、何か一つずつ、取り入れていってみてはいかがでしょうか。

Have fun with English!

『プログラミングの基礎』を読んだ

本書は関数型プログラミング言語OCamlを使用した、プログラミングの基礎を身につけるための本です。

今年の2月に読み始めた後、しばらく積読になっていましたが、6月中旬ごろからまた読み始めて無事読了しました。タイトルとは裏腹に練習問題もたっぷりで個人的にはなかなか骨が折れる本でしたが、良い体験となりました。

読もうと思ったきっかけ

関数型プログラミングパラダイムが多くの言語に取り入れられたり、ScalaやElixirなどの関数型言語が実戦に投入されたりするなど、関数型プログラミングが注目を上げている中、前々から関数型言語を何か触ってみたいという気持ちがありました。

そんな中、@bleisさんの以下の記事の中で「関数型言語を何でもいいからやってみたい!という人」にオススメされていたことから、いつかこの本を読もうと思っていました。

bleis-tift.hatenablog.com

最近になって読み始めたはいいものの積読になっていた折に、同じ30代前半でWebの世界に飛び込んだという共通点で勝手に親近感を抱いている@numb_86さんが最近読み終わったということに刺激を受け、再開しました。

numb86-tech.hatenablog.com

どういう本か

本書の目的として以下の3つが挙げられています。

  • デザインレシピの習得
  • アルゴリズムとデータ構造の習得
  • メトロネットワーク最短路問題を解くプログラム

最後のプログラムは実践的な課題なので、実質的にはデザインレシピの習得、アルゴリズムとデータ構造の習得の2つが目的と言えると思います。

では、1つ目のデザインレシピとは何かと言うと、基本的には以下の4つで構成されるものです。

  • 目的: 作成する関数が「何を」するものか
  • 例: 望まれる入出力の例
  • 本体: 「どうやって」実現するかの本体
  • テスト: 望む動作をしているか確認

目的に関数の型などを書き、例でテストプログラムを書き、それを実現するための本体を書き、テストを行い、望む動作をしたら完成、しなかったら原因を考え誤りを正す、という流れでプログラムを作成します。

最近、業務でユニットテストを書く機会があったり、『テスト駆動開発』を読んだこともあり、テストの重要性を理解できていたので、まずテストを書くこの流れはとても腑に落ちましたし、理にかなっていると思いました。

2つ目のアルゴリズムとデータ構造の習得についてですが、リスト、グラフ、ツリー、クイックソートなどは出てくるものの、ひととおり網羅しているとは言えず、本格的な習得は他の本に譲ったほうがいいと感じました。

関数型スタイルを学べる

冒頭で骨が折れる本だったと書きましたが、文を1つずつ書いていく命令型プログラミングに慣れきっている身には、本書で提示されているような、セミコロンでの文の区切りを一切挟まず、入力が与えられたらそのまま出力を返すというスタイルで書くのに苦労したためです。

例えば未確定の駅のリスト v を必要に応じて更新したリストを返す関数はこんな感じです。

let koushin p v ekikan_tree = match p with 
  {namae = pn; saitan_kyori = ps; temae_list = pt} -> 
    List.map (fun q -> match q with 
           {namae = qn; saitan_kyori = qs; temae_list = qt} -> 
         try 
           let kyori = get_ekikan_kyori pn qn ekikan_tree in 
           if ps +. kyori < qs 
           then {namae = qn; saitan_kyori = ps +. kyori; 
                     temae_list = qn :: pt} 
           else q 
         with Not_found -> q) 
v 

関数型プログラミングに馴染みのない方には普段見慣れているプログラムとは違ったものに映るのではないでしょうか。

OCamlの公式サイトには

OCaml is an industrial strength programming language supporting functional, imperative and object-oriented styles

とあるので、命令型的に書くこともできる言語なのでしょうが、本書のようなスタイルに制限されることで、関数型のスタイルで書くことを学ぶことができて良かったです。

特にforループやwhileループを使わず再帰で書くスタイルを繰り返し練習できたのは再帰が苦手な身としては良かったです。データ構造に基づいたパターンマッチを基本とすることで、ベースケースとそうでないケースを明確に区別して考えることができました。

目的としては書かれていませんが、関数型プログラミングを習得できるということが本書の大きな特徴だと思います。

自分なら…

余談ですが、『プログラミングの基礎』というタイトルは、僕だったら『OCamlによる関数型プログラミングの基礎』といった感じにするかなぁと思いました。というのも、この本でプログラミング自体に入門しようとするには少し難易度が高いんじゃないかと思いますし、関数型プログラミングが注目されている中、そのキーワードを入れることで手に取る人が増えるのではないかと思うからです。

まとめ

読み始める前の僕のように、関数型プログラミングに触れてみたいという方がいたら、手に取ってみてはいかがでしょうか。おすすめです。

リンク

PHPカンファレンス福岡2018 #phpconfuk で英語ネタのLT登壇してきた

2015年から今年で4回目を迎える、2018/06/16(土)に開催されたPHPカンファレンス福岡2018に参加してきました。僕にとって特別だったのは、ただ参加したというだけでなく、LTの登壇者として参加したということです。

phpcon.fukuoka.jp

今年の目標として、何らかのイベントで初めて登壇するということを掲げていたのですが、LTとはいえ、よりによってこのような大きなイベントを選んだのは我ながら頑張ったなと思います。

今回は登壇者視点の記事を書きます。参加者視点の記事は別に書こうと思っています。発表内容についてはあまり触れておらず、初登壇の体験記といった形です。

当日まで

当日に至るまで、実は色々あって、自分の能力のなさに自信を無くしたりして調子を崩し、参加する1ヶ月ぐらい前までは正直なところ辞退してしまおうかとも考えていました。しかし、会社の方々を始め色んな方の支えで何とか復帰して繋ぐことができ、当日に臨めました。改めて自分は周りの人に恵まれていると感じました。感謝しています。

登壇すると腹を決めましたが、資料作りは結局ズルズルと前日まで手をつけませんでした。かなり現実逃避しちゃっていました。

構想はまとまっていたものの、5分という時間で伝えたいことを凝縮しようとするとなかなか大変でした。色んなLTやスライドに関する記事を参考にし、ポストイットを使って話の流れを決めていったりしました。Keynoteの操作に慣れていないせいで、グラフを1つ作成するのに手こずって、本質的でないところで時間を浪費(プログラミングでもあるあるかも)してしまったりといったこともありましたが、1日を使い、資料はなんとか作り終えることができました。

いざ登壇

いよいよ当日を迎え、朝から緊張がじわじわと止まりませんでしたが、不思議と腹は据わっていてその緊張感を楽しめていました。大げさに言うと生きてる実感みたいなものを緊張から感じられて、これはステージに立つ側の特権だなぁと思いました。

そして、いざ自分の出番を迎え、壇上に立ち100人以上の観衆を前にすると、マイクを持つ左手の震えは止まらず、会場の反応を見る余裕もありませんでした。しかし、PHPカンファレンス福岡LT名物の5分を超えると鳴らされてしまうドラも鳴らされることなく、無事発表を終えることができました。

speakerdeck.com

ステージを下り、Twitterハッシュタグを覗いてみると、生の好意的な反応をいただいていて、思わずニヤニヤしてしまいました。大きな達成感がありました。

登壇を終えて

このTOEIC 960取れたネタ、スライドで言及した記事も2016年の記事ですし、 くもキャストというPodcastに出演したときにも触れていただいたりと、かなり使いまわしていて、ウケはいいものの、そろそろこれに頼るのも止めたいなと思っていたりします。次にどこかで登壇する時はがっつり技術ネタでいきたいところです。

また、LTという短い時間だったので、おすすめコンテンツの具体的な利用方法までは紹介しきれませんでした。そのことについては別にブログ記事を書きたいなと思っています。

PHPカンファレンス福岡2018でのLT登壇、平成最後の年に自分がやった事として僕の人生に刻み込まれましたし、この規模のイベントで登壇できたことは大きな自信となりました。人間結局やるかやらないかの部分も大きいなと実感しました。

このような場を用意してくださった、スタッフの方々を始め、参加者の方々、コミュニティに感謝です。PHPカンファレンス福岡最高!

「きまべん」というオンライン勉強グループ活動が盛り上がっている

皆さんは業務外で個人勉強やってますか?

業務内で全ての学習を終わらせるのが理想ですが、そうもいかないし、個人的にやる勉強ってなかなか楽しいものですよね。ただ、独りでやる勉強ってモチベーションを維持するのが大変でなかなか続かないものです。

そこで、私が参加しているオンライン勉強グループ「きまべん」がとても楽しい活動となっているので紹介したいと思います。

What is きまべん

この「きまべん」という勉強グループは「“きま”った時間に”べん”きょう」の略です。

これは@gaaamiiさんが発起人となって立ち上がったプロジェクトで、ScrapboxというWebノートアプリの共同編集機能を使って、各々が決まった時間に勉強をし、記録をつけるというものです。詳しくはこちらのページに書いてあるのでご覧ください。

2017年5月に立ち上がり、しばらく活動していたものの段々と誰も記録をつけないようになり、いったん自然消滅していたのですが、今回@tsu_neraさんが新たに加わって、新規記入があった時にSlackに通知させるという連携をさせたことでまた活発化しています。

この活動の何がいいかというと、Slack通知が来ることで、「お、やってるな。僕もやらなきゃ。」と思えていい勉強のきっかけになることと、他の方がやっている勉強に興味を持つことができることです。例えば機械学習スマートスピーカーの勉強の記録をしている方がいるのですが、それを見ると、ニュースでは耳にすることの多いこれらのトピックも身近に感じることができ、より興味を持つことができます。

また、Scrapboxのアイコン機能を使って、気軽に励ましあうことができるのがいい感じです。 f:id:tkykhk:20190313145425p:plain

仲間募集中です

まだ参加人数は10人に満たないですが、影響を与え合うことのできるとても良い活動となっております。

勉強する題材は技術・開発に限定しておらず、参加条件も無いに等しいぐらい緩いですので、興味を持った方がいましたら、気軽にご参加ください。楽しいですよ。

ご参加はこちらから

中国語をカジュアルに学び始めた

去年の秋に太宰府天満宮に行きまして、そしたら中国人の方の多いこと多いこと。今更ながら福岡もアジアの一都市なんだなという感覚を覚えるとともに、これからは中国人を相手に出来ることが重要だなと思いました。

深センの話とかもよく聞くし、川上量生さんなんかもN高等学校では英語より中国語を教えたいという方針みたいですし、これは中国語やっておいた方がよさそうだなと思いまして、2018年は中国語を学ぶことにしました。

勉強方法

勉強方法なんですが、他にもやることはたくさんあるのでガッツリはやらずカジュアルにやることにしました。

Duolingo

そこで最適だと思ったのがDuolingoというアプリです。

このアプリはゲーム感覚でクイズに答えて学習するアプリで、UIの可愛らしさやいわゆるゲーミフィケーション(死語?)化された体験など、とてもよく出来てます。これで言語をマスターできるかというと全くそんなことは無いのですが、まぁ中国語に浅く親しめればいいやという感覚でこのアプリを選びました。 学習モードが存在しており、まさにカジュアルモードという1日5分程度のモードがあるのでそれで学習しています。

日本語での学習は現在対応していないので、英語で学習しています。こういう時に英語の優位性を感じます。

ちなみに、Duolingoでのプロフィールはこちらです。良かったらフォローしてください: tnagatomi (Duolingo)

あと、「ソフトウェアエンジニアの中国語」というClub(グループ機能)を作りました。招待コードは F9MASP です。気軽にご参加ください。

mikan中国語

もうひとつはmikan中国語というアプリです。こちらは単語帳アプリで、勉強SNSのStudyplusのタイムラインで英語版を使っている方を見かけたので使い始めました。Studyplus APIと連携して学習記録をつけられるのがいい感じです。

まとめ

カジュアルに、という方針なので、一日15分程度気楽にやっていこうと思っています。皆さんも中国語どうでしょう。

「你好世界!」