It's okay to be weird

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

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

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

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

プログラミングの基礎 ((Computer Science Library))

プログラミングの基礎 ((Computer Science Library))

読もうと思ったきっかけ

関数型プログラミングパラダイムが多くの言語に取り入れられたり、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による関数型プログラミングの基礎』といった感じにするかなぁと思いました。というのも、この本でプログラミング自体に入門しようとするには少し難易度が高いんじゃないかと思いますし、関数型プログラミングが注目されている中、そのキーワードを入れることで手に取る人が増えるのではないかと思うからです。

まとめ

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

リンク

プログラミングの基礎 ((Computer Science Library))

プログラミングの基礎 ((Computer Science Library))

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でのプロフィールはこちらです。良かったらフォローしてください: tommy6073 (Duolingo)

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

mikan中国語

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

まとめ

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

「你好世界!」

基本情報技術者試験を受けるべきか

私は情報系専門学校に通っていた時期に基本情報技術者試験を取得したのですが、ITの勉強を積んで、実際にITエンジニアとして働くようになった今、試験に対する見方が変わりました。試験を受けるかどうか、迷っている方の参考になればと思いこの記事を書くことにしました。

私の経験から書いていることなので、鵜呑みにはしない方がいいかと思います。あくまで一個人の意見として参考にして下さい。

結論

まず結論から書いてしまいます。理由については後述するのでそちらを参照ください。

まず、社会人で既にIT業務に既に携わっている方については、基本的に受ける必要は無い と思います。

そして、逆に私が思う受けた方がいいかもしれない方というのは、学生の中で、学歴だけがステータスとして通用しないような学校、 特に専門学校に所属する方 です。

受ける必要が無いケース、受けた方がいいケースについてこれから書いていきます。

受ける必要が無いケース

社会人でIT業務に関わっている方は既に就職をされているわけで、就活目的で資格を取る必要はもう無いのではないかと思います。

それでも基本情報技術者試験のメイン領域であるコンピュータサイエンスの勉強をしたいというのであれば、試験を受けるまでもなく、いい教材がたくさん存在します。例えば本で言うと、コンピュータサイエンス全般では入門 コンピュータ科学 ITを支える技術と理論の基礎知識といった本や、セキュリティでは体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践といった本です。月額1000円で学べるN予備校にはコンピュータサイエンスのコースも存在します。これはほんの一例で、ネットには素晴らしい教材があふれています。

なぜ試験を受けることを勧めないかというと、基本情報技術者試験の教材というのは、試験のための受かるためだけの教材といった感じで、原理や背景を説明せず、ただやみくもに頭に入れるというような本が多いです。試験の範囲が広範囲に渡っていることも原因でしょう。例外として、キタミ式イラストIT塾 基本情報技術者 平成30年度 (情報処理技術者試験)はイラスト豊富で大変解りやすく、試験受験者以外にもおすすめです。

社会人で受けた方がいいかもしれないケースとしては、会社で資格手当てを支給しているような場合や、会社の資格保持者数が案件を任される判断材料になるようなお仕事をされている場合です。そういった方は取得した方がいいかもしれません。

受けた方がいいケース

情報系の大学や、名前だけでステータスとなるような大学に通っている方は別ですが、それ以外の学校、特に専門学校は学歴としてなかなか通用しにくいところがあると思います。そこで資格をきっちり取ることで箔を付けることができます。就職対策として取得するわけです。

また、まともな情報系の大学ではしっかりとコンピュータサイエンスを教えてもらえると思いますが、専門学校では実技を優先してコンピュータサイエンスを疎かにしているところも多いのではないかと思います。その意味でコンピュータサイエンスを広く浅く学べる基本情報技術者試験はいい目標なのではないかと思います。コンピュータサイエンスの勉強というのは、すぐに実践で役に立たない部分も多く、モチベーションを保つのが大変だったりします。そこに試験という目標を用意することで勉強の動機を作るというわけです。

ただ、そうした学校に通っている方も、資格にこだわらず、自分で学んだことを使ってポートフォリオを作成した方が対象とする企業によっては就職に有利に働くかもしれません。志望する企業が業務系なのか、Web系なのかなどによっても変わってくるかもしれません。

あとは、試験を取れたからといって技術者と名乗っていいかというと全然そういうことはない資格だと思います。ただ、広く浅く学ぶことで、あとで実務で関わった時に「ああ、あれのことか」という下地にはなると思います。

まとめ

始めにいいましたが、あくまで一個人の意見です。「僕は取得したいんだ!」という気持ちがあれば是非そうした方がいいと思いますし、取っておいて損はない資格だと思います。ただ勉強するなら代替はいくらでもあるよということを言いたいです。

ご参考にしていただければと思います。

Siriのとても有効な活用方法を発見した: それはリマインダー

今年はブログを積極的に書いていこうと思います。よろしくお願いします。

今日、新発見したことがありまして、まぁタイトルの通りなんですが、Siriでリマインダーを作成するというものです。

元々忘れやすい体質なので、あとでやろうと思ってたことをすぐ忘れてしまうんですよね。日々のタスク管理にはTodoistを使ってはいるし、「忘れるようなことは大事でないこと」とも言いますが、あとで「あれやるんだったー」となることも多いです。映画を観ている時にぽっとやることが浮かんだりもするんで、そういう時は頭を空っぽにして集中するためにもさくっと入力したいものです。

そこで、いっそ自分で入力簡単で超シンプルなTodoアプリを作ってしまうかとも考えたんですが、思いついたのが「あれ、Siriで入力すれば即入力できるし、標準のリマインダーと組み合わせれば最強じゃね?」というものです。

やり方としては「○○をリマンド」と入力すればオッケーです。例えば「PHPのexplodeがどんな関数か調べるをリマインド」みたいな感じです。

実際に試したのですが超いい感じです。僕はApple Watchでやってますが、外部と通信してるSFのエージェントっぽくていい (かもしれない) です。欠点は音声入力なので外でやるのがちょっと恥ずかしかったり、声を出せない場面だと難しいことでしょうか。

スマートスピーカー全盛で音声入力時代の幕開けのご時世です。皆さんも試してみてはいかがでしょうか。

追記: 運用方法を改善できた

標準アプリからTodoアプリへ

ブログ記事を書いた後、monoさんから以下のリプライをいただきました。

ブログを書いた時点では標準アプリにしかタスクを作成させず、標準アプリにはバッジ機能がないため見返すのを忘れる恐れがあったのですが、真似をして自分のTodoistでも取り組むようにしてみました。OmniFocusと違いTodoistにはそのような機能はありませんでしたが、IFTTTにレシピがあったのでそれを使いました。

やってみるとなるほど快適です。アイディアをいただいたmonoさんに感謝です。

入力は最低限に

音声入力の精度は上がったとは言え、まだまだ正確に聞き取ってくれません。前回の記事では「PHPのexplodeがどんな関数か調べるをリマインド」という例を取りましたが、これではぐちゃぐちゃになる可能性大です。そこで「ピーの爆発を調べるをリマインド」と単純化します。すぐに見返すタスク用にTodoを作るので、思い出せればオッケーという方針です。 まとめ

しばらく使ってみての運用方法を紹介しました。ライフチェンジングとまではいかないですが、なるべく脳を空っぽにするという姿勢を保つのにいい技です。皆さんもいかがでしょうか。

『テスト駆動開発』を読んだ

去年末から読み始めていた『テスト駆動開発』を読み終えました。原書は古いとはいえとても新鮮な体験が出来ていい本でした。

テスト駆動開発

テスト駆動開発

情報

Kent BeckによるTest-Driven Development by Example (2003) を和田卓人氏が訳した新訳版。TDDを忠実に実践しようとしているわけではないですが、ユニットテストを書く仕事を任せられており、参考になりそうなので読み始めました。

第I部、第II部で実際にTDDを実践しながら少しずつコードを書いていく例を取り、第III部でベストプラクティスを学ぶ本となっています。また、新訳版では和田卓人氏によるテスト駆動開発の現在について書かれた付録Cが追加されています。

感想

和田卓人氏もおっしゃってますが、写経をしながら第I部、第II部を読み進めることで本領を発揮する本だと思います。コードとは最終的なアウトプットが評価されるものではありますが、それが生まれる過程を追体験できるからです。

第I部、第II部で実践したあとでベストプラクティスを学ぶという構成がいいと思いました。やっぱ手を動かさないとプログラミングは身につかないものです。

あとは元はJavaPythonで書かれた例コードをPHPで写経しながら書いたのですが、元々がJavaプログラマーだったせいかPHPだとどう書けばいいか解らない場面も多く、特にキャストや、引数・戻り値の型指定など、動的型付けの部分に慣れていないせいで戸惑ったもののPHPそのものの勉強になりました。

もはや固有名詞となった「付録C」にも書かれていますが、教条主義的になってしまった面もあるTDDの目的とはそもそも、より良く設計されたコードを生み出すため、小さく自信を持って進めるための手段でしかないということが大事だと思います。TDDそのものが目的となってはいけないのだということでしょう。これはどんなプログラミング手法にも言えるのではないかと思います。よりよい成果物を生み出せるよう、最適な手法を取捨選択できるようになりたいと思いました。

リンク

テスト駆動開発

テスト駆動開発