It's okay to be weird

レールの無い道を行くプログラマーのブログ

『Refactoring, Second Edition』を読んだ

本書は最近ではマイクロサービスの提唱者として有名なMartin Fowlerによる、リファクタリングという言葉を広く普及させた名著の第2版です。1999年の初版発売から実に20年近くぶりに刷新されました。

例に使用する言語は初版ではJavaでしたが、第2版ではJavaScriptになったことでも話題になりました。一番広く読んでもらえる言語であろうということが採用に至った理由のようです。

martinfowler.com

まだ日本語訳版は出版されいないですが、InformITで電子版を購入し、著者がCanonicalバージョンと呼ぶブラウザで読むWeb版を読みました。

構成

本書は以下のような構成になっています。

Kent Beckによるテスト駆動開発本と同じく、いきなり原則から入らず、まずは小さな例を取ってリファクタリングがどういうものか導入するという構成になっています。そのためリファクタリングがとても実践的なものだということが実際の例で解り、その後に続く原則やカタログが頭に入ってきやすかったです。

Martin Fowlerというと小難しい文章を書く人なのかなという先入観があったのですが、平易な文章で時にはジョークも混ぜて解りやすく書いてあったため理解しやすかったです。

感想

リファクタリングを行う大前提として対象コードにテストが書いてあることが条件としてあります。テストがあるからこそ小さなステップで動作を確認しながら変更を行うことができます。テストを書くことの重要性を再度認識しました。

また、リファクタリングはただコードを綺麗にしたり、エンジニアリング実践をするためのものではなく、結果として機能追加やデバッグを速くする経済的なものであると著者は言っています。 当たり前ですが、ソフトウェアというものは一度作成したら完成というものではなく、常に変化するものです。その変化を容易にする手段としてリファクタリングが重要になってくるのだと思います。最初から完璧なコードを書くことは不可能なので、いかに小さなステップでイテレートして改善していくかが大事なのではないでしょうか。

IDEリファクタリングの機能が搭載されていたり、テストが実行しやすくなったり、昔よりもリファクタリングが行いやすい環境になっていると思います。リファクタリングできそうなコードを見つけたら積極的に行っていきたいです。

最後に

本書の中で出てくるKent Beckのこの言葉が印象的でした。

I’m not a great programmer; I’m just a good programmer with great habits.

ボーイスカウト・ルールを意識しつつ、良い習慣を持つプログラマーになれるよう日々努力していきたいと思いました。

リンク

2019抱負

皆さん新年はいかがお過ごしでしょうか。Perfumeのエレクトロ・ワールド最高でした。お茶の間に、かしゆか曰く「怒号」をファンクラブ会員みんなでとどろかせました。最高のひとときでした。

さて、年の始めなので目標を立ててみました。目標は宣言した方が良いと言うので技術、趣味と分けて記事として書いてみようと思います。

技術

baserCMS 5

まずはbaserCMSのメジャーアップデートを成功に導くことが大きな目標です。ベースとしているCakePHPを2系から3系(もしくは4系)にアップデートするという、かなり大がかりなものとなりますが、コラボレーターとしてプロジェクトに参加させていただいているので頑張っていきたいです。OSSの大規模アップデートにここまで密接に関われる機会は滅多にないと思うので、アップデートを通して良い開発経験を積んでいきたいです。

サイドプロジェクト

個人的に進めているプロジェクトとして、スキルを身につけるためのロードマップ(イメージとしてはこういうやつ)を作成、閲覧できるWebアプリがあります。その開発を少しずつ進めていっています。このWebアプリの公開も今年の目標にしたいと思います。Laravel、Vue.jsを使用しているため、この辺りを周辺技術も含めて身につけたいです。

きまべんで進捗を記録しながら、#100DaysOfCodeというハッシュタグで毎日つぶやいていきます。

最近は勉強のための勉強をしていて、チュートリアル煉獄から抜け出せずに手を動かすことが足りてないなと思っていたので、この開発を通じてモダンな技術をどんどん吸収していきたいです。

趣味

ここ数年、フットサルやらサイクリングやら山登りやら色々手を出しましたが、今年はメインは一本に絞っていこうと思っています。

ギター

練習しては休んでを繰り返して、中途半端な状態がずっと続いていたのですが、友達の音楽サークルに入れてもらえることになり、ギター熱が再燃しました。そちらでのセッションを楽しんでいきたいです。

あとは弾き語り教室に通ってみたいなと思っています。プログラミングはほぼ独学でやってきて、人に何かを習うということを久しくやっていないので、そういうのもいいんじゃないかなと思ったからです。

ギターに関しては今年中に何かしら人前で発表することを目標にしたいです。 まずはBUMP OF CHICKENスノースマイルCDJで聴けた人うらやましい!)を練習中なので、「冬が寒くって 本当に良かった」と感じれる季節のうちに全体を弾けるようになりたいです。

いい年にしたい

f:id:tkykhk:20190313152636j:plain
遠征先の横浜市鶴見の總持寺でひいた大吉おみくじ

Perfumeのカウントダウンライブでこれ以上ない年明けを迎えられたので、最高の年になる気がしています。

去年は色んな方のおかげでいい軌道に乗れた1年でした。 最高を求めて、この道を走り進み進み進み続けていきたいと思います。

グッドバイ2018

2018年も終わりに近づこうとしているので、振り返り記事を書いてみたいと思います。

ちなみに大晦日は横浜アリーナで行われるPerfumeのカウントダウンライブに参戦する予定なので非常にそわそわしております。今年はPerfumeのライブはカウントダウンも含めると遠征4公演、福岡3公演参戦しました。正直、自分でも引くレベルですが大好きなのでしょうがありません。

去年の振り返りはどんなことを書いたっけと見てみるとブログをMediumに引っ越したのも2018年初からだったようです。何だか随分昔のことのように思えますが、それだけ密度の濃い1年だったのかもしれません。

イベント

今年はとにかく色々経験させてもらいました。

baserCMS開発合宿

1月にはbaserCMS開発合宿に参加しました。僕が所属しているキャッチアップでは社長がファウンダーであるbaserCMSというオープンソースのCMSを利用したお仕事をメインにしているのですが、そのbaserCMSのための開発合宿です。会社や所属を超えて協業できるオープンソースという文化っていいなと実際に顔をつきあわせることで改めて認識できました。田川市にある廃校を利用したいいかねPaletteもいい場所でした(そういや今年はいのしし年ですが、猪バーガーなんてものが提供されています)。

くもキャスト出演

2月にはくもキャストというポッドキャストに出演させていただきました。ホストの@gaaamiiさんとはプログラミング初心者の頃から5年以上の付き合いなのですが、こちらから声をかけて出演させていただきました。英語や福岡について語りました。

kumocast.jp

PHPカンファレンス福岡2018 LT登壇

6月にはPHPカンファレンス福岡2018に参加しました。2018年の目標として何かしらのイベントで登壇するというのを掲げていたのですが、初っ端からけっこうな規模のイベントで登壇することとなりました。とても緊張しましたが、度胸をつけることが出来、いい経験になりました。

tkykhk.hatenablog.com

これに付随して書いたブログ記事がバズったりして、英語が得意であるという武器をこれからも活かしていきたいと思いました。

tkykhk.hatenablog.com

キャッチアップ開発合宿

8月にはキャッチアップの開発合宿を担当者として実行しました。企画とかお金の計算とかめちゃくちゃ苦手なのですが、助けていただきながら成功に導けたので良かったです。

catchup.co.jp

baserCMS開発者ミーティング@島根

11月にはbaserCMSのバージョン5を見据えた島根でのミーティングに参加しました。島根とてもいいところでした。開発に関わりながら旅も一緒にできるなんて最高です。

basercms.net

ざっとカレンダーなどを振り返ってみて印象に残っているイベントは以上です。

勉強

勉強に関しては、『達人プログラマー』の「知識ポートフォリオ」という節の中で、「毎月1冊技術書を読もう」と書かれており、それを目指していました。途中失速して空白期間が出来たりして結果的には達成できませんでしたが、去年の5冊から2倍の10冊は読めました。来年は12冊読めるよう頑張りたいです。

scrapbox.io

あとはいい加減、勉強のための勉強から脱却して、プロジェクトベースで何か作りながら学んでいく方針にしていきたいです。「何を読んだ」、ではなく「何が出来る」を目指したいです。

最後に

とにかく人に助けてもらった一年でした。ダメになりそうな時に引っ張ってもらうことがなければ違う道を歩んでいたと思います。

僕は覚えも悪いし、頭の回転も速い方ではないので、多分技術的に尖ったり、バリバリ超人的に仕事ができる人間にはなれないんじゃないかと思っています(そこを目指してはいますが)。

それでも色んな人が支えてくれて世話をしてくれます。自分で言うのも変ですが、何かしら放っておけない部分があるのかなと思っています。そうやって気にかけてくれる人たちへの感謝を忘れず、関係性を大事にしていきたいです。テクノロジーに関わる人間とはいえ、結局は人と人との繋がりでこの世界は成り立っているのですからね。

2019年はどういう年にしようかとけっこう迷いが生じているのですが、ほぼ日手帳に載っていた言葉で、平野レミさんが良いことを言っていました。

今年の抱負? 今年も去年といっしょでいいの、 ずっといっしょでいい、 毎日一生懸命、生きているから。

達成したいことはたくさんありますが、毎日を頑張って生き、気づいたらたどってきた道に達成したものが並んでいる。2019年はそんな1年にしていきたいと思います。

baserCMSプロジェクトに貢献する色々な方法

この記事はbaserCMS Advent Calendar 2018 10日目の記事です。

こんにちは!baserCMSリリースマネージャーの永冨隆之 (@tommy6073) です。

今回は技術的な話ではなく、オープンソースプロジェクトであるbaserCMSに貢献する色々な方法について紹介したいと思います。OSSに貢献というとなるとプルリクエスト、と思うかもしれませんが、貢献できる方法は意外と多いのです。

baserCMSでサイトを作る

まずはbaserCMSがどういうものであるか知っていただくためにもご自身でWebサイトを構築していただくことが一番だと思います。使っていただいた体験があってこそ、これから挙げていく他の方法に繋がるでしょう。

まずはbaserCMSを実際に使ってみて下さい!

難易度: 低
必要なスキル: Web制作に関する基礎知識

ユーザーズフォーラム

baserCMSにはbaserCMS ユーザーズフォーラムという公式フォーラムが存在します。「ひとりぼっちは許しません」をモットーに運営されており、質問やバグ報告、改善要望などが書き込めます。

書き込むだけで貢献に繋がるの?と思うかもしれませんが、生のユーザーの方の声により修正点や問題点が見つかり、それがbaserCMSの改善に繋がることも多いのです。

困ったことがあったら是非ユーザーズフォーラムを利用してみて下さい。

難易度: 低
必要なスキル: baserCMSの基礎知識

プラグイン・テーマの作成

baserCMSは機能をプラグイン、見た目をテーマとしてユーザーが拡張することができます。これら作成したものはbaserマーケットに公開することができます。無料ではもちろん、有料で販売することもできます。

質の高いプラグイン・テーマがあることで、baserCMSの利用者が増えることにつながるため、貢献度はかなり高いといえるでしょう。

是非、素のbaserCMSに物足りなさを感じたら、プラグインやテーマを作って拡張してみてくだfdsaさい。

難易度: 中
必要なスキル: baserCMS、CakePHP、HTML/CSS/JavaScript、デザインの知識など

コアパッケージへのプルリクエスト

最後にやはりプルリクエストは外せません。baserCMSはオープンソースなプロジェクトです。リポジトリはGitHubで管理されており、どなたでもプルリクエストを送ることができます。

現在分かっている課題はRedmineでチケットとして管理されているため、自分で探してみるのもいいでしょう。

マージされたときの喜びはひとしおです。是非、細かな修正でもいいのでプルリクエストを送ってみて下さい。

難易度: 中〜高
必要なスキル: baserCMS、CakePHP、HTML/CSS/JavaScriptの知識など

まとめ

以上、baserCMSに貢献する様々な方法について紹介しました。

具体的な参加方法は、公式サイトに記載されていますのでご参考下さい。他にもコミュニティに参加していただくと、よりbaserCMSと親しくなれると思います。

baserCMS 5の開発も始まっており、baserCMSプロジェクトに関わる機会としては絶好の時です。今こそbaserCMSプロジェクトに貢献してみませんか?

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

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

Modern PHP: New Features and Good Practices

Modern PHP: New Features and Good Practices

モダンな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やそのコミュニティがこれまでよりもっと好きになれた気がします。これからまたどう進化していくのか、楽しみです。

リンク

Modern PHP: New Features and Good Practices

Modern PHP: New Features and Good Practices

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

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

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

こういった「学び方を学ぶ」メタスキルは、これから色々なことを学んでいく上で早く身に付けるに越したことはないと思い以前から興味があり、少し前には”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が存在するので、自分の興味のあるものを追っていけばいいと思います。

  • r/javascript
  • r/laravel
  • r/vuejs

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

  • 基本的に毎日だいたい同じ時間にチェックする。
  • ここ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!