kuwana-kbの開発/学習ブログ

プログラミング、クラウドインフラのWeb開発/学習ブログ

「プログラミングHaskell 第2版」 書評

おはようございます、 kuwana-kb です。

前回、「すごいHaskell たのしく学ぼう!」(以下すごいH本)の書評を投稿しました。 今回はさらにHaskellへの理解を深めるべく「プログラミングHaskell 第2版」を読んだので書評としてまとめたいと思います。

プログラミングHaskell 第2版

プログラミングHaskell 第2版

  • 作者:Grahum Hutton
  • 出版社/メーカー: ラムダノート
  • 発売日: 2019/08/02
  • メディア: 単行本(ソフトカバー)

本書の紹介

本書はHaskellの入門書です。 2009年に日本語訳の第1版が発売され、つい最近の2019年8月に第2版が発売されました。 私は第1版を読んだことがないのですが、第2版は最近のHaskellの変化に合わせて内容が刷新されているようです。

  • 前提となるコンパイラが現在の主流なもの(ghc)に変わった
  • ファンクター、アプリカティブ、モナドの解説が充実した
  • 一部動作しない例題が動作するようになった
  • 練習問題が増えた

具体的な違いについては、訳者の方が書かれている記事にて確認できます。

kazu-yamamoto.hatenablog.jp

ざっくり 3 行でいうと

  1. 題材がおもしろい
  2. モナドや再起処理の説明が丁寧
  3. すごいH本と比較すると内容は難しめ

この本の 3 つのポイント

1. 題材がおもしろい

本書ではHaskellを学ぶのに興味深い例題が登場します。 以下に例題をいくつか挙げます。

  • シーザー暗号
  • 投票アルゴリズム
  • カウントダウン問題
  • 三目並べ
  • 計算器(パーサー)

これらの例題は、それまでの章で学んだ概念を実践的に活用するので学習の方法として効果的でした。 また、数学的な要素も含まれるため問題を解く過程も勉強になりました。

特によかった問題は、カウントダウン問題と計算器(パーサー)です。

カウントダウン問題は、最も簡単な解決方法から実装して、後から性能を改善していくという工程がよかったですね。 最初と最後の実装を比較するとおよそ100倍の速度がある点に驚きました。

計算器(パーサー)の実装は、「文字列から構文木を生成して数式の結果を返す」という内容なのですが、モナドの便利さを実感できた題材でした。 また、パーサーの仕組みの理解にもつながりました。ちょうど最近Rustのproc_macroを触ったのですが、引数を解釈する処理も似たような構造になっているのかなーと。

2. モナド再帰処理の解説が丁寧

私の中でまだ理解が浅いモナド再帰処理の解説が丁寧だった点がよかったです。

わかりやすさに寄与していた要素としてまず挙げられるのが図でしょう。 例えば以下の図に助けられました。

  • 12章のStateモナド。関数のinputとoutputを図で表現していた
  • 13章のモナドパーサー。再帰的な構文木のデータ型を図で表現していた

また、再帰処理の解説において、式を1つずつ適応して途中の結果がどうなっているか説明がなされている点がよかったです。

ちなみに、個人的に一番良かった章はモナドパーサーの解説がある13章です。 関数が含まれた型であるParserに対してモナドを実装するというのが複雑に感じられたのですが、それをわかりやすく解説しています。 また、モナドのありがたみがわかりやすいという点でも良い章でした。

3. すごいH本と比較すると内容は難しめ

冒頭でも説明した通り、文体がアカデミックです。 こういう形式の本をよく読む人であれば問題ないと思いますが、すごいH本の直後にこれを読んだ私は少し戸惑いました。(すごいH本がポップすぎるという説もある)

また、題材もすごいH本と比べると難しめに感じました。 各章で取り上げられる例題は数学の要素も含んでいて、高校数学レベルの理解が必要そうです。 数学に苦手意識のある私にはちょっと難しく感じました。 恒真式検査器の例題で「そういや高校の頃こんなのやった気がするな〜」と懐かしい気持ちにもなりました。 ああ…高校数学からやり直さないと…

特に難しく感じたのは、最後の方にある「16章 プログラムの論証」と「17章 コンパイラの算出」です。 これは理解を深めてからまた読み直したい…

まとめ

「プログラミングHaskell 第2版」は、Haskellの理解を深めるのに適した本です。 すごいH本のあとに読んで正解だったと感じられる本でした。

「プログラミングHaskell 第2版」と「すごいHaskell たのしく学ぼう!」、どちらもHaskellの入門書ではありますが私としてはどちらか片方とは言わず、両方ともおすすめしたいです。

「すごいHaskell たのしく学ぼう! 」 書評

こんばんは、 kuwana-kb です。

職場の人のススメでHaskellの勉強をはじめました。 Haskellとは、純粋関数型言語の1つで例えば以下のような特徴を備えています。

  • 遅延評価
  • 参照透過性
  • 強力な型推論
  • モナド
  • 関数のカリー化と部分適用
  • 型クラス

参考: Haskell - Wikipedia

ん〜なんだかあまり見慣れない概念が多い…色々学べそうですね! 今回は、そんなHaskellに入門すべく「すごいHaskell たのしく学ぼう!」(通称:すごいH本) を読んだので書評していきます。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

ざっくり3行でいうと

  1. Haskellの良さが実感できた
  2. 初学者でも理解しやすいような配慮が随所に
  3. 内容が古い箇所があり、躓きポイントがある

この本の3つのポイント

1. Haskellの良さが実感できた

Haskellをやったことがない人向けに、まずは本書を通じて感じたHaskellの良さをまとめます。

まず、書いていてとても楽しいです。 記法がシンプルなのに加えて、型推論やパターンマッチング、代数的データ型などの強力な言語機能がこれを実現していると感じます。 他の言語だと複雑になりがちな処理もHaskellだととてもシンプルになります。 以下は他言語とHaskellの比較をした記事です。 記事内のサンプルコードを一目見るだけでも、そのシンプルさが伝わると思います。

doisinkidney.com

Haskellのこのシンプルさは、プログラミングへの理解も深めてくれたように感じます。 例えば、私は複雑な高階関数再帰関数を読むのがあまり得意ではなかったのですが、 Haskellで表現すると、今まで複雑に感じていた構造もシンプルになり理解しやすかったです。 そして、Haskellで理解できるようになると、「Haskellでいうあの表現と同じか」と置き換えが効くようになるので、他言語でも応用が効くように感じました。

また、Haskellの持つ強力な言語機能も、コードの表現の幅を増やしてくれるように感じます。 例えば、Haskellのパターンマッチはコードをシンプルかつ読みやすくしてくれる良い機能です。 本書でパターンマッチの良さを実感した結果、「Rustのパターンマッチを有効活用しよう」と考えるよいきっかけになりました。 (逆にHaskellの言語機能が強力すぎて、Rustじゃこれできないのか…と不便を感じることもある)

参考:以下のように引数をパターンマッチで場合分けするこで、処理を切り替えることができる

add :: [String] -> IO ()
-- リストの中身が2要素の場合の処理
add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n")
-- リストの中身が上記以外の場合の処理
add _ = putStrLn  "The add command takes exactly two arguments"

2. 初学者でも理解しやすいような配慮が随所に

本書は初めてHaskellを触る人向けといえます。

まず全体の構成がとても良いです。 ざっくりと以下のような構成になっています。

  1. 序盤で基本的な構文や型について覚える
  2. 中盤で問題をHaskellを使って解いていく
  3. 後半でこれまで学んだ機能を抽象化した概念を学ぶ

HaskellにはMonadやFunctorといった抽象的なインターフェースがあり、 これがそこそこ難解なのですが、上記の段階的に学習する構成によって学習曲線がゆるくなっていると思います。

また、各章はその章で扱う標準的な関数や型を自分で書いてみることから始まります。 ライブラリの実装を確認して、自分の手で書いてみてどういう実装になっているか理解するという段取りです。 例えば、map, zip, elemといった関数や、 Maybe, Either, Listといったデータ型を自分で宣言します。 このように使い方の説明だけでなく、実装まで踏み込む入門書は結構珍しい気がします。 この解説法のメリットは仕様の理解につながるのに加えて、インタプリタ(ghci)の使い方や公式ドキュメントの参照にも慣れることができた点です。

入門書としてもう1つ大事な要素として「飽きずに読み切れるか」という点があるかと思います。 この点も全く問題ありませんでした。 文体はかなり砕けていて堅苦しさが全くありません。(逆に、人によっては冗長と感じるかもしれませんが…) 一方で、内容は初学者にもわかりやすく、上述の通りしっかりしています。 年末から読み始めましたが、特にペースが落ちることなく最後まで楽しく学習ができました。

3. 内容が古い箇所があり、躓きポイントがある

Haskellは言語機能やライブラリのアップデートが早いようで、 本書に記載されている内容だと動かなかったり躓くケースがいくつかありました。

  • 型クラスの関係性が変わっていて、コンパイルエラーになる
  • 関数が属するライブラリが変わっていて、コンパイルエラーになる
    • strMsgという関数。transformersというライブラリを入れる必要があった

本のとおりに書いてもちょくちょく動かないことがあるので、 その場合はコンパイラーのエラーを読んだり、Hoogleで公式のドキュメントを読むことで対処しました

また、エコシステム周りも色々と変化があるようです。 書籍上だとghcという標準的なコンパイラを使います。 しかし、書籍にはプロジェクト管理をしたくなったときの情報がなく、ネット上だとstack や cabalなどのツールの候補に関する情報が散見されて混乱しました。 私は以下の記事を参考にしました。

qiita.com

具体的な開発環境としては以下のようにしました。

他にもいいツール等あればぜひ教えて下さい!

まとめ

すごいH本はタイトル通りHaskellを楽しく学べる良い書籍でした。 ネット上のHaskellの記事を読むと、「Haskellが難しい」という情報が目に飛び込んできて敷居の高さを感じる人もいるかもですが、 ある程度プログラミングを経験した方であれば挫折することなく読み切れると思います。 ちなみに私は「ある程度理解はできたけど、いざ自分でなにかツールを作れと言われるとまだ難しい…」といった理解度なので、 まだまだHaskellは難しいなという感想です。とはいえ、こんなに良い書籍があるのですし、入門の敷居を必要以上に高く設定することもないのでは、と思いました。

ということで、Haskellに興味のある方はぜひすごいH本を読みましょう!

2019の振り返り&2020の抱負

あけましておめでとうございます。 kuwana-kbです。

お久しぶりです。 みなさんいかがお過ごしでしょうか。 私はこの連休でHaskellの入門と開発環境の整理をしていました。 明日から仕事が再開するのですが、いいスタートダッシュを切れそうです。

新年の仕事が始まることを受けて少し遅いですが、2019年の軽いまとめと2020年の抱負を書きたいと思います。

2019の振り返り

2019年は社会人になって5年で一番大きな変化があった年でした。 大きく2つです。

  • 環境を変えた
  • 新しい技術に挑戦できた

環境を変えた

2019年8月に5年間勤めたDMM.comを退職し、キャディに入社しました。 これは私の中で大きな変化だったと思います。 事のいきさつ等は以下の記事にまとめています。

DMM.comを退職しました - kuwana-kbの開発/学習ブログ

キャディ株式会社に入社しました - kuwana-kbの開発/学習ブログ

転職してよかったと感じることは、自身の知らない分野で強い人たちと仕事ができていることです。 一例を挙げると関数型言語が好きな人や数学畑の人がいます。 そういった人たちと行う業務は刺激的です。例えばペアプロ関数型言語が好きな人と行うペアプロは、小さな関数を組み合わせることで処理を実現したり、関数型言語であればこういう実装もできるといった話が聞けたり。 数学畑の人と行うペアプロは、自分では考えつかなかったような処理の書き方を数学の発想から考えていたり。 地味な点かもしれませんが、日々の業務で新しい気づきを得られるのは視野が広がりますし、モチベーションに繋がります。

逆にこの1年で私が課題として感じたことは、これまで得た知見・スキルをどう汎用的に適用するかです。 前職で何気なくやっていたことって、実は価値があったりするんですよね。 で、問題はそれをどう再現するの?ということです。 例えばスクラム開発を回す上でやっていた見積もりや振り返りの手法などです。 前職でこのやり方で上手く行ったのに、なんで今の環境だと上手く行かないんだ…的な。

これは、過去の成功事例だけをみていて、具体的にどのプロセスが起因して上手くいったのか分析ができていないことが大きいなと感じています。。 反省としては、事例から成功要因を抽出して汎用化すること。 具体的には、地道に過去を振り返りつつその手法と要因をドキュメントにまとめるのがよいのかなーと考えています。

新しい技術に挑戦できた

2019年は技術的に新しいことをたくさん学べた年でした。 やはりこれは環境を変えた影響が大きく、職場で採用している技術がそこそこ新しめというのがあります。

など今まであまり触れられなかったものに挑戦できました。

特にRustがよかったです。 インフラまわりは前職の経験が活きたこともありそこまで苦労しなかったのですが、 Rustは新しい概念が多くて時間を要しました。(そしてまだまだ学ぶことは多いです。) 今まで知らないことが多すぎたからこそそれだけの時間がかかったのだと考えると、Rustが私にくれたものは大きいと感じます。 何も具体的なことを言っていないのですが、それはいずれRustに関する記事を書くときお伝えできればなと…。

2020の抱負

2019年は変化が大きく、その変化がプラスに働いた年でした。 今年はこのプラスをより一層大きくする方向で動きたいです。 ということで以下2つ。

  • 目の前の業務を着実にこなす
  • 技術への理解を深める

目の前の業務を着実にこなす

今の職場に入ってもうすぐ半年が経とうとしていますが、まだまだ周りのレベルに追いつけていないと感じます。 知識しかりスキルしかり。 これを解消するには日々の業務を着実にこなすしかないと思っています。 それに平日の8時間を仕事に費やすのですから、自身の血肉としないともったいないです。 そのためにも予習復習も兼ねて以下について深堀っていきたいです。

技術の幅を広げる

一方で、日々の業務とは直接関係がない技術についても幅も広げたいと思っています。 具体的には以下2つ。

過去の1年でPHP -> Go -> Rustとプログラミング言語を触ってきて、言語の特性を理解することで表現の幅が広がることを実感しました。 Rustを始めてから関数型言語への興味が深まっています。 というか、職場で横から「Haskellだとこう書けるよ...」「Haskellまじ美しいよ...」といったサブリミナル効果が発生しておりまして、 おかげさまで(?)最近はHaskellをやっています。 これまたRustでは表現できない(しづらいだけ?)実装方法があったりして面白いです。 また、言語の特性を理解する上で数学周りの知識も欲しくなってきたので、高校数学からやりなおしたいと考えています。 数学的な思考は実装だけでなく、モデリングを考える上で活かせそうです。 昔は数学が大の苦手で避けるようにしていましたが、今になって知識欲が湧くという…昔の私よ…なぜがんばらなかった…

終わりに

ということで、今年の目標に対するアクションは、

  • 元気よく出社すること
  • インプット(技術書とチャート式かな?)を絶えず行うこと

になりそうです。

お気づきの方もいるかもしれませんが、今年の目標である「技術の幅を広げる」は今の職場の人から多大な影響を受けております。 そう考えると環境が与える影響ってすごいですね〜

雑な抱負でしたが、みなさん今年もよろしくお願いいたします!

Rust.Tokyo 2019 参加レポート

こんばんは、kuwana-kbです。

2019/10/26 に開催されたRust.Tokyo 2019に参加してきました。 Rust.Tokyoは今回が初開催とのことでしたが、およそ200名のRustacean(Rustプログラマーの通称)が集まり大盛況を収めました。

各セッションは30分で、RoomAとRoomBで2つのセッションが同時並行で行われました。 今回は、私の参加したセッションについてのレポートをまとめたいと思います。 Rust.Tokyoに来ることができなかった方にもどういったセッション内容だったかわかるように、各セッションの概要と所感を共有します。

※前提として、筆者はRustに入門して2ヶ月と知識が浅いです。内容に誤り等ありましたらご指摘くださいますと嬉しいです。

f:id:kuwana-kb:20191105040637j:plain
ノベルティのトートバッグ!

参加セッション一覧

  • Visualization of mechanical CAD drawings using WebAssembly and WebGL
  • Lifetime: A survival guide
    • Eric Findlayさん / Software and Currency Engineering
  • Rustによる数値計算の現状と課題
    • termoshttさん(@termoshtt) / Software Engeneer@RICOS Co. Ltd.
  • Web-based Data Visualization with Rust and WebAssembly
  • いつの間にか社の中核製品にRustが使われていた件について
    • 斎藤さん(@aznhe21) / OPTiM R&D Engineer
  • Rustを採用したサービス開発事例について
    • 高藤 謙佑さん / CADDi Inc.
  • Contributing to Rust
    • Florian Gilcherさん(@Argorak) / Rust team member and community person

Visualization of mechanical CAD drawings using WebAssembly and WebGL

スライド

speakerdeck.com

概要

  • 発表者: 小橋 昭文さん (@TaigaMerlin) / CADDi Inc.
  • Rust, WebAssembly(WASM), WebGL を駆使してWebブラウザ上で2D描画を実践した話
  • WebAssmebly(WASM)とは
    • ホスト環境で走るバイナリコードフォーマット
    • RustからWASMのコードフォーマットに変換して、jsから呼び出すことでWebブラウザでの実行を実現する
    • 近年はほとんどのWebブラウザでWASMがサポートされていて、Figmaや1Passwordなどでも採用されている
  • WebGLとは
    • ブラウザで3Dを描画するための標準仕様
  • RustとJavaScriptの相性は良い。Rust <=> JSで相互に呼び出しが可能だし、重い処理をRust側で実行できるといったメリットがある
  • 最終的に2D描画をRust, WASM, WebGLで実現することができた。現状はまだ多くのハックを必要とするが、今後の発展に期待ができる

所感

私の所属する会社、キャディのCTOの発表です。(ちなみにキャディはRust.Tokyo2019のゴールドスポンサーもしてました。)

お恥ずかしながらWASMやWebGLについてよく知らなかったのですが、WASMを用いることでRustのコードをブラウザ上で直接実行できるということに驚きました。 近年リッチ化が進むフロントエンドにおいて、JSだけでは実現が難しい仕様もこれらの技術を駆使することで幅が広がりそうですね。 WASMの採用事例として挙げられたFigmaを業務で使っていますが、確かに動作は軽快です。

気になったのはブラウザで実行する関係上バイナリのサイズを少なくする必要があり、そのために標準ライブラリが使えないという制約です。 必要最低限のサイズに収めるためにもライブラリの自作が必要であり、この点はまだハードルが高いと感じました。 (もちろんパフォーマンスを無視すれば標準ライブラリを入れる選択もできるとのこと。)

Lifetime: A survival guide

スライド

github.com

概要

  • 発表者: Eric Findlayさん
  • Rustのライフタイムと借用システムについての話
  • ライフタイムとは何かをカプセル化と依存関係という視点で解説

所感

Rust入門者にとってのハードルとしてよく挙げられるRustのライフタイムについての講義でした。解説では図やサンプルコードを多く用いられていて、わかりやすかったです。 「Rustの借用システムは参照先の存在を保証してくれない」という文脈からライフタイムの意義が解説されていて納得感がありました。

質問コーナーでは、ライフタイムに関する困りごとの話が多く挙がっていました。その中で、「コンパイラ駆動開発でとりあえず動かしてみよう。最初はわからなくてもコンパイラと格闘しているうちにわかってくることがある。」という登壇者の言葉が印象的でした。私がRustに入門したての頃は、コンパイラの言う通りにエラーを修正する作業に不安を覚えた記憶があります。まあ結局コンパイルエラーに何度もぶつかっていくうちに、Rustの仕様理解が深まっていくのですが、他のRustaceanも同じような方法でRustへの理解を深めているのだなぁと。

Rustによる数値計算の現状と課題

スライド

概要

  • 発表者: termoshttさん(@termoshtt) / Software Engeneer@RICOS Co. Ltd.
  • Rustで数値計算を実践した話
  • 数値計算とは何か
    • 理学光学の問題の多くは紙とペンでは解けず、数値的に解く必要あり
    • 問題ごとにソフトウェアを作る必要がある
  • 数値計算に必要なもの
  • なぜRustか
    • LLVMを通して最適化するのでCと同程度に高速
    • 強い型付け
    • Traitを用いた抽象化
    • メモリに対する完全な管理権限
    • GCがない
    • マシンに乗るギリギリの計算を行える
  • なぜRustか(開発環境)
    • パッケージ管理機構がある、ライブラリが容易に使える
    • 普及しているプログラミング言語としての恩恵はそのまま得られる

所感

数値計算アルゴリズム周りに疎いのですが、数値計算にはどういう要求があってRustがそれをどう満たしているかという文脈で語られていたため理解がしやすかったです。 お話の中でもあったように、C/C++/FORTRAN等の既存のライブラリを使い回せるのは不要な再発明を減らせるという点で大きなメリットですね。 なぜC++ユーザーがRustに移行しているかの理解に繋がりました。

また、周辺ツールとして紹介されていた「Benchmarking」と「Perfomance Profiling: FlameGraph」が興味深かったです。branch別に速度を比較したり、関数ごとの処理速度の計測ができたりと便利そうなので使ってみたいでです。

Web-based Data Visualization with Rust and WebAssembly

スライド

speakerdeck.com

概要

  • 発表者:Yosuke Onoueさん(@ _likr) / 日本大学 文理学部 情報科学科 准教授
  • 情報可視化のアプリケーションをRustとWASMで実装した話
  • Visual Analyticsは人間がデータと対話する場といえる。視覚敵かつ対話的なインターフェースを作ることで、ユーザー層をエキスパートから専門家でない人にまで広げていく
  • web based VAの要求
    • レンダリングパフォーマンス
      • 60FPS(16ms per frame)
    • 計算パフォーマンス
      • 分析では、複雑なアルゴリズムを使う。計算処理能力が必要
      • ユーザーの操作に対してリアルタイムでレスポンスする(<100ms)
  • Rustを選んだ理由
    • 実行時のオーバーヘッド少ない
    • Native support マルチスレッド、SIMD
    • first class support wasm
  • パフォーマンスの観点
    • パフォーマンスの観点では、言語の境界を行き来するのはオーバーヘッドが高い。(例:Rust <=> JS)
    • jsはCPU性能の単体分しか使えないという点で、wasmはwebアプリケーションの限界を越えるキーテクノロジーといえる
  • web技術の拡大を目指す
    • ハイパフォーマンスなアプリケーションは特定のユーザーの要求を満たすことができる。つまるところはwebの領域を押し上げるためにも必要となる

所感

スライド内にVisualAnalyticsのアプリケーションのサンプルが載っているのですが、大量のエッジとノードを用いた計算は確かに処理が重そうです。 こういった類のアプリケーションは基本的にデスクトップアプリの印象が強いのですが、Web上で扱えるようになっているなんてすごいですね。Webの可能性が広がっているのを感じました。

いつの間にか社の中核製品にRustが使われていた件について

スライド

リンク見つけられず…

概要

  • 発表者: 斎藤さん(@aznhe21) / OPTiM R&D Engineer
  • OPTiM社の製品にRustを採用した話
  • 既に5つの製品にRustを採用している
  • Rustを採用した理由
    • 安全性
      • セグフォやリソース競合が原則として発生しない
      • enumの分岐漏れや未処理のエラーを忘れることがない
    • 高速性
      • 簡単なプログラムではC/C++と同程度の速度
      • ゼロコスト抽象化や高度なライブラリによってC/C++を上回る
      • パフォーマンスが必要な場合はunsafeブロックにより檻を抜け出せる
    • エコシステム
      • rustupですべてが入るので環境構築が楽
      • cargo buildでprotobufからのコード生成が一発でおわる
    • FFI
      • C/C++製の資産を利用可能

所感

OPTiMさんは既に複数の製品にRustを採用されているようです。C++との比較でRustが語られていた点が印象的でした。

Rustを採用したサービス開発事例について

スライド

speakerdeck.com

概要

  • 発表者: 高藤 謙佑さん / CADDi Inc.
  • なぜRust?
    • 型安全性
    • 開発者体験
    • パフォーマンス(今回はあんまりふれない)
  • 型安全性
    • Resultでエラーをつつめる
      • DBの検索結果をOptionでくるめる
      • panicやunwrapはプロダクションなので使わない
  • キャディでAPIサーバをRustを使って実装している話
  • Rustの開発者体験について
    • cargoは優秀で、特にfmtとclippyはよい。チーム内の議論のコストを下げられる
    • Rustの社内教育は、「The Book」と使った。業務へのアサインでは、実装アプリケーションの雛形を用意することで段階的に業務につけた。8月入社のRust未経験者も開発できるようになった。
  • Rustの表現力について
    • 独自の新しい型を作ることができる
    • 幽霊型
      • 文字数制限を幽霊型で簡単に切り替える
    • コードでなにをしているか表現しやすい

所感

私の所属するチームでテックリードしている方の発表です。

実際に業務で関わっているので所感ではなく補足を書きます。 発表内容で出てきた「8月入社のRust未経験者」とは私のことです笑 Rustの学習について、「The Book」はRustだけでなくプログラミングの勉強にもなりました。無料で読めるなんてほんとにすごい。

また、実装アプリケーションの雛形は実装すべきコードのイメージを事前に把握できた点でありがたかったです。 Rust.Tokyoの後半には懇親会もあったのですが、Rustの社内教育という観点は皆さん興味を持たれていたようでした。

Contributing to Rust

スライド

リンク見つけられず…

概要

  • 発表者: Florian Gilcherさん(@Argorak) / Rust team member and community person
  • Rustにcontributeするとはどういうことか
  • contributionの例
    • 実装
    • レビュー
    • infra整備
    • 翻訳
    • ドキュメント整備
    • 法関連も
    • ミートアップ
    • ライブラリ書いたり
  • Rustにどうcontributeできるか
    • contributeには壁がない方が良いという考え。チームへのjoinとleaveは簡単。また、必ずしもチームに属している必要はない。
    • 1週間に30分~2時間のcontributeは普通だ
  • Rust projectの抱える課題
    • 組織の再編成
    • 成長痛
    • projectの情報のフロー
    • ドキュメントが欠けている件
    • Easier in-person meeting(timezoneに依存するモンダイ
  • まとめ
    • 自分のcontributionのリズムをみつけよう
    • 関心のあるtopicをみつけよう
    • 地域のpeerを見つけよう
    • 関係のあるチームに連絡しよう
    • 何かあればrust-lang.orgで質問しよう

所感

Rustを実際に開発しているRust Projectの方のお話です。 言語の開発プロジェクトがどういった形で運用されているのかを知ることができる発表内容でした。 開発以外のタスクもたくさんあるのですね。 言語へのContributeはハードルが高いように感じていましたが、「1週間に30分~2時間のcontributeは普通だ」と聞くと自分も何か貢献できるかも、という気がしてきました。

また、Rustのコミュニティ運営はProjectチームがマネジメントするのではなく、コミュニティが主導してProjectチームはサポートする姿勢というのも印象的でした。 Rustの支援者には他言語のコミュニティを作ってきた人が多いそうなのですが、そこで得られた知見が活かされているのだなと。

終わりに

全体を通してみて、以下のような感想を持ちました。

  • 参加者のRustへの熱量を感じられる良いカンファレンスだった
  • RustはC++ユーザーの代替言語として人気な印象
    • エコシステムがよく設計されていて、安全かつ高速に作っていける
    • 既存の資産を有効活用もできる
  • RustをWASMやJSと組み合わせることでWebでできることの範囲が広がりつつある
  • 色々な分野のRust採用事例を聞くことができた
    • 情報可視化や数値計算、組み込みなど多岐にわたる分野でRustは使われていた
  • (懇親会で自分が聞いた範囲の話だが)個人でRustを使っている人が多い印象
    • 仕事で使っている(使えている)人の割合はまだ少なそうだったが、今後取り入れていきたいという方は何人もいらっしゃった

最後に、運営のみなさま本当にお疲れさまでした。 どのセッションも興味深く、たくさんのRustaceanと交流できる素晴らしい場だったと感じています。 ノベルティのトートバッグはとても素敵でしたし、懇親会のご飯もおいしかったです。 次回のRust.Tokyoもとても楽しみです!

関連リンク

「Kubernetes完全ガイド」 書評

こんばんは、 kuwana-kb です。

新しい職場で働き始めてはや2ヶ月が経過しました。 最近はAPIの実装に加えて、インフラまわりのタスクもしています。 インフラでは、Kubernetesを利用しているのですが、私は今までKubetnetesをあまり触ったことがありませんでした。 そこでKubernetesを仕事で使うためのキャッチアップとして、「Kubernetes完全ガイド」を読んだので書評したいと思います。

Kubernetes完全ガイド impress top gearシリーズ

Kubernetes完全ガイド impress top gearシリーズ

この本の紹介

本書は、Kubernetesの入門書です。これからKubernetesを使っていきたいという方に最適な書籍だと思います。

ネット上には、PodやDeploymentなどのKubernetesリソースを動かすための入門記事もありますが、 私がそれらをやってみて思ったのは「なんだかよくわからないけどとりあえず動かせた…」ということです。 それだけKubernetesは複雑であり、学習コストが相応にかかるものだと思います。 実際、Kubernetesには複数のコンポーネントとリソースがあり、それら1つ1つの概念とその関係性を理解するのは容易ではありません。

本書では、Kubernetesを扱う上で必要となる知識を1つ1つ丁寧に解説しています。

ざっくり2行でいうと

  • Kubernetes入門者に最適
  • 外部ツールの解説も充実している

この本の2つのポイント

1. Kubernetes入門者に最適

本書を一通り読み終えて思ったのは、「Kubernetes入門者に最適な1冊である」ということです。

冒頭でも説明したとおり、Kubernetesには多様なリソースの概念があります。 一例ををあげるとPod, ReplicaSet, Deployment, Serviceなどです。これ以外にもたくさんあります。 それら1つ1つの特徴と関係性を理解するのは容易ではありません。 本書では、これらのリソースについて1つ1つ丁寧に解説しています。

また、本書はハンズオン形式で解説が進みます。 具体的には、GCPGoogle Kubernetes Engine(GKE)でリソースを作っていきます。 gcpkubernetesの操作で必要となるコマンドは、書籍上にすべて書いてあるので詰まることなく構築を進められます。 また、kubernetesのリソース作成に必要なソースコード(manifest)も筆者のリポジトリに上がっているため、詰まったらそちらを見れば解決できるでしょう。

ちなみに、GCPを利用すると聞いて課金が不安になった方もいるかもしれませんがその心配はいりません。 GCPでは、300ドル分の無料利用枠があるのですが、その枠内で書籍の内容をすべて実践できました。 私の場合、3週間ほどデフォルト性能のGKEクラスタをつけっぱなしにしていましたが、22,054.48 円余りました。 ただ、使い終わったあとにリソースの削除を忘れると請求がきてしまうのでお掃除は忘れないようにしましょう。

外部ツールの解説も充実している

本書はKubernetesだけでなく、Kubernetesと関わりの深いOSS, ツールの解説も充実しています。 以下に具体例を列挙します。

  • セキュリティ(kubesec)
  • マニフェスト汎用化(Helm, Ksonnet, Kustomize)
  • モニタリング(Datadog, Prometheus)
  • ロギング(fluentd, Datadog Logs)
  • CI/CD(Spinnaker, Skaffold, Jenkins X)
  • サービスメッシュ(Linkerd, Conduit, Istio)

私の場合、kubesec, Kustomize, Skaffold あたりは直近で使う必要があったため、とても役立ちました。

また、サービスメッシュは名前をよく聞くもののあまり理解していなかったため、キャッチアップに最適でした。 特に良かったのは、各OSSの特徴がわかりやすくまとめられていることです。 「Aというリソースは今一番勢いがある。Bは〇〇という環境を想定して作られている」といった形で簡潔に違いがまとめられています。 知識が浅くKubernetesの開発情勢に疎い初学者にとって、こうした全体像の解説はありがたいです。

まとめ

正直、Kubernetesをあまり知らなかった私は、Kubernetes複雑すぎない…?AWSのECSで十分じゃない…?という感想を持っていました。 しかし、本書を読み終えてKubernetesに幅広い可能性を感じました。 特に、Kubernetesにはマネージド・サービスの代替となる可能性があることや仮にKubernetesが他のOSSにシェアを取られたとしても、 Kubernetesで学ぶことのできるコンセプトは他でも活きるといった著者の考え方は、私にとって新たな知見でした。

Kubernetes完全ガイド」は、Kubernetesに入門するすべての方に対しておすすめできる良書です。

キャディ株式会社に入社しました

こんばんは、kuwana-kbです。

f:id:kuwana-kb:20190927194234j:plain

いまから1ヶ月ほど前に「キャディ株式会社」というスタートアップに転職しました。 最近は仕事にも慣れてきて、毎日楽しく開発しています。 今回はせっかくなので、入社エントリーを書いてみたいと思います。

誰?

kuwana-kbと申します。 2015年に新卒でDMM.comに入社して4年間働いてました。 以下、簡単な経歴です。

  • 2015 ~ 2018 Webディレクター
  • 2017 ~ 2018 スクラムマスター
  • 2018 ~ 2019 バックエンドエンジニア
  • 2019年8月9日にDMMを退職

Webディレクターとしては、リプレイス案件のプロジェクト進行やスクラムチームの組成、たまに障害対応の旗振りとかをやっていました。 最後の1年は、技術がわからない自分に不安を感じてバックエンドエンジニアに転向することに。 GoとAWSをメインにユーザーレビュー基盤のAPI開発をしてました。

転職理由やエンジニア転向の話などは退職エントリーにまとめていますので、興味のある方はそちらご覧ください。

キャディってどんな会社?

キャディが現在展開しているサービスは、「製造業における受発注プラットフォーム」です。 簡単にいうとお客様から製品の図面をいただいて、キャディはその製品の制作をパートナーである町工場さんに依頼して、最終的にお客様に納品します。

これ、すごく単純に説明しちゃってるんですが、実は製造業の調達領域ってこれまで技術的なイノベーションがほとんどなくて大変なんです。 見積もりの算出・発注先の選出・サプライチェーンの管理などで、とてもコストと時間がかかるんです。 キャディはこれをテクノロジーを駆使して解決しようとしている会社です。(ちなみにテクノロジーだけでなく、オペレーションや事業そのものも面白い仕組みになってますよ)

エンジニアとして気になるであろうテクノロジーの活かしどころですが、以下のようなものが挙げられます。

  • 図面データ解析による瞬時の見積もり
  • 独自ロジックによるパートナーの自動選定
  • 独自オペレーションシステムによるオペレーションの最適化

もっと詳しく知りたい!という方は、SpeakerDeckの資料があるのでよければご覧ください。

キャディの事業を知る - Speaker Deck

キャディの技術を知る - Speaker Deck

なんでキャディに?

キャディの存在を知ったのは、転職サービスのスカウトがきっかけです。 今年の5月終わり頃、CTOの小橋さんからメッセージが届きました。私のプロフィールをきちんと見てくれてるんだな〜と感じる内容でした。 そして、メッセージに添付された社員のプロフィール情報を拝見したところ、CTOを始めとしてすごそうな人たちがいっぱいいることが目に留まりました。 技術的に強い人達と働きたいという希望があったので話をきいてみることに。

最初はCTOとのカジュアル面談で、クラウドアーキテクチャの話や過去に自分が経験した開発手法の話なんかをしました。特に面接されている感じはなくて、情報交換という具合です。 その後、テックリード・PM・社長とお話する機会をいただいて、会話をする中でスキルの尖った魅力的な人たちが多いことを実感しました。 元々は情報収集メインで年末くらいに転職できればいいか、くらいに考えていたんですが一緒に働いてみたいと感じる気持ちが強くなり転職に踏み切りました。

どんな仕事してる?

私の業務は社内オペレーションシステムのバックエンド開発です。 APIの実装をしたり、ドメインモデリングアーキテクチャ設計の議論に参加したりしてます。

今私が業務で使っている技術や設計手法は、

  • Rust
  • gRPC
  • Docker
  • Postgres
  • Redis
  • DDD
  • CleanArchitecture

あたりです。 今私が担当しているシステムは全体の一部に過ぎず、今後は他の方が開発しているインフラやフロントまわりにも参加することになりそうです。 インフラだと GCP / Kubernetes / microservices、フロントだとTypeScript / React / GraphQL が主な使用技術です。

ちなみに、Rustは今まで使ったことがなかったんですが、使っていてとても楽しい言語です! 独自のライフタイムや所有権という概念があったり、トリッキーな構文があったりでとっかかりが難しいんですが、 公式ドキュメントが充実していて、コンパイラがとても優秀、そしてコミュニティも活発なので少しずつでも確実に学んでいくことができます。

一ヶ月経ってみてどう?

強い人たちに囲まれた環境で、毎日が刺激的

どういう人達がいるか、一部ですが雑に説明します。

特に、アルゴリズムチームの仕事風景は新鮮です。ホワイトボード一面に数式がいっぱい書いてあります。私には何が書いてあるかわからないのですが…

とまあ強い人達の紹介をしてみたわけですが、僕が人の威を借りてる感がすごいですね… 自分の今のスキルが少し恥ずかしくなってしまうのですが、こういった周りの人たちと自信を持って肩を並べられるようにがんばろう!という気持ちになれます。

ちなみに私が採用された理由は、ポテンシャル採用とのことでした。 Webディレクターの経験と日々のブログのアウトプットだったり、ネスペやPMの資格取得といった学習の姿勢が評価されました。

ドメイン駆動開発に積極的

キャディの開発チームはドメインへの意識が強いと思います。 エンジニアだけでなく、プロダクトマネージャーもドメイン設計に積極的に参加します。 また、社内の複雑なオペレーションをシステム化するということをやっていて、社内のドメインエキスパートも開発に参加します。 ドメイン設計の話題を毎日していく中で、日々ドメインモデルが洗練されていくのは楽しいです。

オフィスがキレイ

7月にオフィスを移転したばかりなんですが、とてもキレイで広いです。 エンジニアのフロアはまだスペースが半分以上空いていて、開放感があります。

気に入ってる設備をいくつか挙げてみます。

  • オフィスコンビニ
  • イートインスペース
  • オープンスペース
  • 1 on 1 ルーム(5部屋)
  • 会議室(6部屋)

f:id:kuwana-kb:20190927194004j:plain
オープンスペース

f:id:kuwana-kb:20190927193912j:plain
1 on 1 ルーム

オフィスコンビニは手軽にお水とかコーヒーを買えるのが嬉しいです(電子マネー決済もできる)。 あと、オープンスペースはおそらく100人分くらいキャパがありまして、「勉強会とか自由に開いてOKだから言ってね〜」とのことでこれもとてもありがたい!

ちなみに立地は浅草の蔵前という場所です。 飲食店は駅の方に結構ありますし、お昼も600円前後で済ませることができるのでお財布に優しいです。

終わりに

とまあ初めての転職で心配な部分もありましたが、おかげさまでこの1ヶ月間充実した日々を過ごせています。

最後になりますが、キャディでは一緒に働いてくださるメンバーを募集しています。 特に、今後の組織拡大に向けてテックリード/マネジメント層の方を募集中です。

募集要項は以下から確認いただけます。
キャディ株式会社のエンジニア採用サイト

ちょうど最近、マネジメント層募集のスライドが公開されました。 あわせてご覧ください。

それでは、ご応募お待ちしています!

「The Rust Programming Language」 書評

こんばんは、 kuwana-kb です。

前回の書評からしばらく時間が空いてしまいました。 転職してしばらくドタバタしていたのですが、ようやく落ち着いてきました。 新しい職場では Rust を使っています。 Rust のキャッチアップのため「The Rust Programming Language」を読んだので書評したいと思います。

この本の紹介

f:id:kuwana-kb:20190926231552p:plain
The Rust Programming Language(日本語訳)

この本は、 Rust プロジェクトの公式ドキュメントであり、Rust の入門書です。Rust コミュニティでは「The Book」という呼称で親しまれているようです。 上に貼られているキャプチャをご覧のとおり、本書は Web 上で無料で公開されています。 元は英語の本ですが、有志によって翻訳された日本語訳もあります。 また、ブラウザ上で HTML で読むことができるのに加えて、 PDF で電子書籍としても読むこともできます。 内容はとても充実していて、質もさることながら量も多いです。 PDF に変換するとおよそ550ページに及びます。

原本: https://doc.rust-lang.org/book/
日本語訳: https://doc.rust-jp.rs/book/second-edition/

なお2019年現在、日本語訳は 1st Edition(v1.6, v1.9) と 2nd Edition が存在します。 言語仕様がアップデートされているため、 2nd Edition を読む方が良いでしょう。

ざっくり3行でいうと

  • Rust 入門におすすめできる1冊
  • 言語仕様以外の学びもある
  • 一部理解するのが難しい章もあったが、全体的にとても満足

この本の3つのポイント

1. Rust 入門におすすめできる1冊

本書は、 Rust 入門におすすめできる1冊です。解説は丁寧で、背景の説明もしっかりしています。 なぜそういう仕様なのか、なぜそういう名称なのかなどの疑問に答えてくれているので腹落ちします。 Rust を理解する上で難しいといわれる「所有権」や「ライフタイム」などについてもしっかりと説明がされていました。

この本は、細かな言語仕様を網羅的に解説しているわけではありません。例えば基本型や演算子の一覧だとかを1つ1つ細かく見ていくようなことはしていないです(付録としてはついてますが)。 どちらかというと各章で取り扱う概念を身に着けるために、実際にコードを書きながらトライアンドエラーを繰り返す形になっています。

2. 言語仕様以外の学びもある

本書を読んで驚いたことは、Rust の言語仕様以外の解説も充実している点です。 例えば、コンピュータの基礎知識で「スタックとかヒープはもちろん知ってるよね!」という感じで置いてけぼりにされることはなく、解説コラムがあります。 実際に「4. 所有権を理解する」ではスタックとヒープを、「12. 入出力プロジェクト:コマンドラインプログラムを構築」ではリファクタリングの方法やテスト駆動開発のやり方を実践的に解説しています。

他にも Rust におけるオブジェクト指向プログラミングの技法や Web サーバ構築を通じたシングルスレッド・マルチスレッドの解説もありました。

3. 一部理解するのが難しい章もあったが、全体的にとても満足

一部理解するのが難しかった部分もありました。 具体的には、「15. スマートポインタ」と「19. 高度な機能」の箇所です。 Rc<T>RefCell<T>unsafe とかですね…。 これはこの本の問題というより、私のレベルだったり言語仕様に起因することな気がしますが…。 実際、私のメモリ周りのイメージがあやふやなのがいけない気がしています。

まとめ

一部難しい箇所はありましたが、「The Rust Programming Language」は入門書としておすすめできる書籍です。 Rust 関係なく、純粋なプログラミングの教科書としても良いくらい素晴らしい出来だと感じました。 これがネット上で無料で読めてしまうなんて… Rust コミュニティのみなさん、本当にありがとうございます。

ちなみに私はまだ読めていないのですが、「実践Rust入門」という書籍も Rust コミュニティ内でよく話題になります(というか専用のSlackチャンネルがあります)。 「The Book」を翻訳された方が書いているそうで、そのうち読んでみたいと思っています。気になる方はぜひ手にとってみて感想を教えていただけると嬉しいです。

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]