Yuki Watanabe's Blog

Yuki Watanabe's Blog

エンジニアリングと子育てについて

『Go言語 100Tips』を読んだ

『Go言語 100Tips ありがちなミスを把握し、実装を最適化する」を読んだので感想を書く。

読み初めの動機

本書を読み始めた動機は、業務でGoを1年以上書いているもののGoを使いこなせている感がなく、より深い知識をほしいと考えたからだ。 ここでいう"使いこなせている"とは、複数の書き方が考えた上で柔軟性・堅牢性が高い、書き方を知っている、くらいの感覚で使っている。

思い返すと以前の職場ではRubyを書いていて、ある程度使いこなせている感を得られていた。 おそらく仕事の傍らでRubyの言語仕様やベストプラクティスに関する本を何冊も読んだからであり、具体的には、『リファクタリング: Ruby エディション』や『Effective Ruby』、『メタプログラミングRuby』などの通読より一定の知見を得られていた。

1年前に原著『100 Go Mistakes and How to Avoid Them』の存在を知り、会社のSafari Booksを利用して少し読んでみたのだけれども、難易度の高いテーマを英語で理解するのに挫折してしまった。 内容が良いことは知っていたので、日本語訳版である『Go言語 100Tips ありがちなミスを把握し、実装を最適化する」の存在を知り、購入に至った。

感想

まず感想を一言で述べると、非常に良かった。 書籍のタイトルの通り100のTipsが紹介されているが、それぞれのTipsごとにおよそ下記のように構成されている。

  1. Bad practice
  2. Badである理由の解説
  3. Good practice
  4. Goodである理由の解説

そのため、解説を見る前に、なぜBadなのだろうか?なぜGoodなのだろうか?の思考をするStepを挟むことができ、その後の解説を読んだときの答え合わせ感がとても楽しいし、記憶に残りやすく感じた。

そして、タイトルには100のTipsとあるが実際にはメインの100Tipsに関連した豊富な豊富なサブTipsがある。

例えば、5つめのTipsである「インターフェース汚染」に関しては、下記の3つのサブTipsから構成されている。

  • インターフェースの概念
  • インターフェースを使う場合
  • インターフェース汚染

個人的に一番面白かった章は、第12章の「最適化」だった。難しい内容が多かったが、例えば構造体のFieldの順番によって確保されるメモリ量が異なるというのはなるほど、となった。 この章は主にCPUヘビーな処理をする際の最適化について述べられており、自分の関わるプロダクトではそこまでCPUヘビーな処理はないのだが、もし今後そういったタスクをやることになったらある程度自信を持って取り組めるのではないかと思う。

著者のTeiva Harsanyiさんは、AmazonのプロフィールによるとGoogleのSenior Software Engineerのようだ。GoはGoogle発であるため、Googleのエンジニアが書いているとなると、本書の信頼度は非常に高いように思う。

最後に

通読後には、コードを書く際やレビューする際に、テストしやすいか?パフォーマンスがよいか?と自問し、他のオプションも検討できるようになってきた。 これは元来感じていたGoを使いこなしている感を少しずつ得られているとも言える。こうした書籍は実際の課題と対峙することでより一層定着する面もあるため、1年後くらいにまた読み返してみたい。

『Web APIテスト技法』を読んだ

『Web APIテスト技法』を読んだので感想を書く。

読み初めの動機

本書を読み始めた動機はいくつかある。

  • Web API(マイクロサービスのバックエンド)の開発に携わっているため業務に活かせそうな点が多い
  • ソフトウェア開発の中で特にテスト領域に関心があり、中長期のキャリアでSETのキャリアに興味がある

私はテストの分野に強く興味を持っている。開発する際は大半のケースでテスト駆動開発を採用しているし、業務ではテスト基盤の改善を行い、記事を書いたりもしている。

engineering.mercari.com

最近、Software Engineer in Test(SET)というキャリアがあることを知りひっそりと興味を持っている。職務としては、

  • テストの自動化
  • CI/CDの構築
  • テスト基盤の整備

など幅広いようだ。

中長期でのキャリアのためにテスト分野に関するインプットをしておきたいと考えて、本書を手に取った。

感想

『Web APIテスト技法』は自分にとって良い書籍であった。

狭義のテスト技法ではなく、Web APIに必要とされるあらゆるテストをカバーしている。

  • テストを上流からと捉え、テスト戦略の立案に多くのページが割かれている
  • 広範なツールの紹介とその扱い方についても触れている

一番強く印象に残った一節はこちら。

品質とは、ある大切な人にとってのある時点での価値のことである。

テストとは品質を担保するための手段であるため、その品質とはなにか?という点から問う必要があることを知れた。 引用にある通り品質とは評価者に依存するため、ユーザー理解がとても必要であるということとも言える。

ユーザー理解まで範疇を広げると、もはやプロダクトマネジメントの領域にも近くなってくるし、テストに関わる領域は幅広くて面白いなと感じた。


翻訳者は「長尾 高弘」さんという方。訳書にありがちな違和感が全く無くて読みやすかった。

ちなみに、長尾さんは非常に多くの訳書を手掛けられている。 私はこの方の書籍を何冊も読んだことがあり、良かった書籍を紹介しておく。

  • 『Effective Ruby
  • リファクタリング:Rubyエディション』
  • 『SOFT SKILLS ソフトウェア開発者の人生マニュアル』
  • 『CAREER SKILLS ソフトウェア開発者の完全キャリアガイド』
  • 『モブプログラミング・ベストプラクティス ソフトウェアの品質と生産性をチームで高める』

今後

Web APIのテストには広範な知識が必要であることを認識できた。 本書ではセキュリティテストやパフォーマンステストについても触れられていたが、特にパフォーマンステストは知見が少ない分野であり強化していきたいと考えている。

『みんなのフィードバック大全』を読んだ

『みんなのフィードバック大全』を読んだので感想を書く。

ソフトウェア開発には組織の成長が重要であり、その観点からソフトウェアエンジニアとしてこの書籍を読めたのは大きな財産とった。

読み初めの動機

所属のチームには8月からインターン生を受け入れる予定であり、自分がメンターを担当する。 メンターにはフィードバック力が欠かせないとのことで、チームのEM(Engineering Manager)から奨められたため、読み始めた。

感想

良かった点は、フィードバックを「する」側の視点はもちろんのこと、フィードバックを「される」側の視点も学べたこと。

フィードバックをする際には、2つの側面から相手の反応を見ながらするのが良いというのは学びだった。

  • ポジティブフィードバック: 良い言動に対して称賛
  • ギャップフィードバック: 現状と理想のギャップに対してのアドバイス

どうしてもフィードバックというとギャップフィードバックに偏りがちであり、これからはポジティブなフィードバックもしていくべきと感じた。

また、自分の成長のためには他者からのフィードバックは非常に重要であるとの気づきを得た。 できるだけ自分にフィードバックしやすい雰囲気を作るべく、たとえ耳が痛いフィードバックをもらっても、感謝の意を示すことを忘れないようにしようと思った。

今後

『みんなのフィードバック大全』を通読し、フィードバックに関する知識を得ることができた。 これからは日々の1on1や振り返り等での自分の振る舞いに活かしながら、自分とメンバーの成長のサイクルをつくていきたい。

『スタッフエンジニア』を読んだ

『スタッフエンジニア マネジメントを超えるリーダーシップ』を読んだので感想を書く。

読み初めの動機

本書を読み始めた動機は、スタッフエンジニアと呼ばれる上級エンジニアの思考や習慣を知り、自分の仕事に活かしたいと考えたからだ。今までのキャリアを振り返ると、テックリードやシニアエンジニアといったエンジニアには出会ったことがあるものの、より上級のエンジニアとなるとそうそうない。書籍からそうした人々の思想に触れられるのは貴重だと感じた。

ハイライトと感想

スタッフエンジニアへのインタビューが豊富に掲載されているのが良かった。具体性に富んでおり、仕事の向き合い方に活かせる点が多かった。

ハイライトはこちら。

  1. スタッフエンジニアにおけるタイプにはテックリード、アーキテクト、ソルバー、右腕の4タイプがある
  2. リーダーシップとは現状と理想のギャップを把握し、その解決に取り組める資質のことである
  3. スタッフエンジニアは技術力に加え、ソフトスキルの重要度が上がる

まず、今後のキャリアとして、テックリードやアーキテクトに面白みを感じた。プロダクト開発が好きでエンジニアに転身してきて、3年経った現在も楽しさが日々増している。なので、今後もプロダクト開発に近いところでやっていきたいと思う。

次に、リーダーシップについてだが、意外と現状でも発揮できているシーンはいくつか想起できた。返りなどのスクラムイベントにおいて、現状の課題を共有し打ち手を提案するような場面などである。

このリーダーシップをより強く発揮するには何ができるかを現在の業務に落とし込んで考察した。

  • 現状を知る: 監視や分析系のツールへの習熟度を上げて、現状をより定量的に理解できるようにする
  • 理想を知る: 社内外からのインプットを増やす。特に書籍を通じてアーキテクチャデザインパターンを学ぶことに重きを置く。
  • 現状と理想を埋めるための行動: 振り返りなど、課題感を共有する場を大切にし、日々感じる技術・組織課題を(できれば解決策も込み)で共有する

最後に、ソフトスキルについては、自分がエンジニアになり一番強化してきたスキルかもしれない。というのも、自分はハードスキル、つまり個別具体の技術スキル1本で戦うのには向いていないと認識している。技術自体は好きではあるが、その技術を寝食も忘れるくらい大好きな人には、時間やモチベーションでは勝てっこない。しかし、ソフトスキルではどの組織でも重要なことではあるものの、エンジニアでソフトスキルをを意識的に学んでいる人は少なく、意外とブルーオーシャンに感じているからだ。

書籍の改善して欲しい点

非常に良い内容ではあったのだが、難点としてはKindle版において、本文中の注釈へのリンクがついておらず注釈の確認が大変だった。 この点が改善されると、読みやすさが大幅に上がると思う。

最後に

『スタッフエンジニア』は自身のエンジニア経験によって刺さるポイントは異なるだろうから、読んだ人と意見交換をしてみたい。

今はソフトスキルの強化のためにコンサルタント向けの書籍を読んでいる。こちらも良い内容なので読み終えたら感想を書きたいと思っている。

『System Design Interview』を読んだ

『System Design Interview – An insider's guide』(以下、System Design Interview)を読んだ。この書籍は転職面接の対策本*1ではあるものの、システム設計の学習用途として非常に有用だったので、感想を書く。

なお、最近日本語訳版が発売されたが、今回は原著の感想となる。

読み初めの動機

本書を読み始めた動機は、さまざまなシステムの設計を学びたいと考えたからだ。

目次を見るとわかるが、Chapter4~Chapter16はすべてシステムデザインに関して記載されている。YouTubeGoogle Driveなど面白そうなテーマが扱われており興味を持った。

Chapter 1: Scale From Zero To Millions Of Users
Chapter 2: Back-of-the-envelope Estimation
Chapter 3: A Framework For System Design Interviews
Chapter 4: Design A Rate Limiter
Chapter 5: Design Consistent Hashing
Chapter 6: Design A Key-value Store
Chapter 7: Design A Unique Id Generator In Distributed Systems
Chapter 8: Design A Url Shortener
Chapter 9: Design A Web Crawler
Chapter 10: Design A Notification System
Chapter 11: Design A News Feed System
Chapter 12: Design A Chat System
Chapter 13: Design A Search Autocomplete System
Chapter 14: Design Youtube
Chapter 15: Design Google Drive
Chapter 16: The Learning Continues

感想

やはり良かった点は、様々なシステムの設計を知れること。 興味のあるChapterから読み進めたが、どのChapterも面白く結局全て読み通した。

例えば、Chapter 12ではチャットシステムを実現するために次の機構が紹介されていたが、Long Pollingは初めて知る用語であり、知識の幅を増やすことができた。

  • Polling
  • Long Polling
  • Web Socket

構成として、はじめはシンプルな設計を紹介し概要を示してから、Deep Diveと称して可用性やスケーラビリティ、エラーハンドリングなどを考慮して設計を磨いていくスタイルとなっている。図が豊富に使われていて都度理解しながら読むことが出来た。

次に、英語が非常に平易であり読みやすい。構文解釈に時間が取られず読み進められたため、英語ではあるが時間あたりの学習効率は日本語とさほど変わらなかった。

今後

『System Design Interview』はとにかく面白い本だった。続編となるVolume2も読みたいとは思っているが、電子版が無いのが難点であり、まだ手が出せていない。

同内容のウェブコンテンツである、ByteByteGoの方も面白そうではある。 FinTech領域に身をおいているため、Payment SystemやDigital Walletの設計はあまりにも興味深い。 bytebytego.com

*1:現状転職をする予定は全くない

苦手だった英語のリスニングを克服した

先日2年ぶりに受けたTOEICの結果が出た。

リスニングのスコアが前回より140点ほど上昇し、365/495点となった。 もちろん自慢できる点数ではないが、これまで英語のリスニングが大の苦手だったことを考えると、大きな成長を感じる。

せっかくなので、どういった過程を経たのかを記事にしてみようと思う。

これまでの英語リスニングスコア

大学受験をしたのはもう14年前。当時はリスニングがセンター試験と国立の二次試験で課されるくらいで非常にウェイトが少なかったため、学習時間をほとんど投下しなかった。 結果、センター試験のリスニングが26/50だったのを記憶している。

大学2年目と社会人8年目でTOEICを受けたが、リスニングのスコアはそれぞれ275/495, 225/495だった。 試験では音声をまったく聞き取れず、ほぼ勘でマークをするしかなかった。

自分は英語のリスニングができないのではなく、根本的に耳が悪いのではないかとすら思っていた。

2022/10~11: 転機 "英語喉"との出会い

英語は喉で発音するとクリアに発音できる、発音できると聞き取れるようになるという"英語喉"というメソッドを、Twitterでたまたま見かけた。

英語喉を提唱されている"KAZ先生"の動画を見ると妙に納得感を得て、もしかしたらリスニングを克服できるかもしれないと感じた。

さっそく著書を2冊読み、喉を使った発音やシラブル(音節)について学んだ。 特にシラブルを知れたことは大きく、英語の音の繋がりやリズムに理論があることに驚いた。

書籍を読んですぐにリスニング力が上がったという感覚はなかったけど、今後のインプットを通じてリスニング力を鍛えられたのは、英語喉のメソッドを知れたからこそだった。

2022/12~: 音読、オーバーラッピング、シャドーウィング

次は英語喉を実践するため、ひたすらオーバーラッピングやシャドーウィング、音読をした。 昔からフレーズで覚えるタイプの英単語帳*1が好きだったので、教材は『ALL IN ONE TOEIC テスト 音速チャージ!』を選んだ。

はじめは音声のみを数回聞き、その後テキストを読んで、さらにシャドーイングを繰り返すといったサイクルを、すべての251英文で実践した。 ここでのシャドーイングは、できるだけ英語喉のメソッドに倣うように意識した。

単語帳を進めるにつれて徐々に聞き取れるようになり、リスニング力が少しずつ上っている感覚を持った。

ちなみに、オーバーラッピングやシャドーウィング、音読という学習法は、英語学習について体系的に知りたいと思い手にとった『英語上達完全マップ』でも推奨されていたので、納得感を持って進めることができた。

2023/01~: 英会話

英語学習の目的は、英語を話せるようになることなので、オンライン英会話に入会した。

nativecamp.net

英会話自体がリスニングにどれほど貢献したかはわからないが、講師の先生から発音に対してネガティヴなフィードバックをもらうことは少なく、自分のやり方の方向性が悪くはないことを認識できた。

2023/02: TOEIC

せっかくリスニング力が上がってきたので、実力測定のためにTOEICを受けることにした。

事前に解き方のコツを掴もうと考え、試験1ヶ月前に『TOEIC(R) L&Rテスト 直前の技術(以下、直前の技術)』を購入し、3回解いた。

しかし、リスニングのPart3, Part4はやはり難しく、問題文に気を取られて音声に集中できず、リズムを崩してパニックに陥るということが多々あった。 YouTubeでリスニングの問題の解き方やマインドを学び自分に合った方法を確立して、試験本番でもできるだけ冷静に回答できるように心がけ、以下の方法を採った。

  • 問題の先読みは、基本設問だけで解答は読まない
  • リスニングでは、聞くことのみに集中する
  • 解答は、リスニング後に行う

www.youtube.com

試験1週間前に公式問題集を購入した。時間がないため問題は解かずに、リスニングのPart3, Part4の音源でオーバーラッピング、シャドーウィングを繰り返した。 限られた時間で、各国の話者の声に効率よく慣れることができたように思う。

試験当日は、緊張もあり、練習通りには全然聞き取れなかった。 しかし、できるだけ自分のペースを崩さずに、冷静に対処するようにした。 解き方をある程度確立できていたことが大きかったように思う。

そして、冒頭にも書いたとおり、TOEICの結果が発表され、リスニングのスコアが365/495点まで上昇していた。 いつのまにかリスニングへの苦手意識が払拭でき、そこそこ聞き取れるようになってきたのが嬉しい。

2023/03: 今後

今後はテスト対策などを目的とせず、生の英語に触れていきたい。 YouTubeの「ByteByte Go」というチャンネルは、システムデザインに関する動画がメインで非常に面白く、かつスピーカーの方の声も聞き取りやすいため、当分はこのチャンネルを見ていきたいと思っている。

www.youtube.com

*1:DUO3.0

『[改訂新版]プログラマのための文字コード技術入門』を読んだ

『[改訂新版]プログラマのための文字コード技術入門』を読んだので、感想を書く。

結論としては、文字コードにまつわる話題が1冊にまとまっており、仕事でプログラムを書く人にとっては1度読んでおくと長期的に役立つことが多い書籍だと感じた。

読み初めの動機

テキスト処理をする際に、文字コードについてハマることが度々あり、その都度調べるもののすぐ忘れてしまうため、一度体系的に学ぼうと考えた。

感想

文字コードに関連する話題がわかりやすくまとまっていてよかった。リファレンス的に今後も読み直すことだろう。

本書を読むことで下記について理解できた。

いつものことながら、基本用語をMarkdownでまとめた。

github.com

今後

今回の文字コードのように、都度調べては忘れてしまうことは一度体系的に学ぶと知識の定着率が高くなる。こうしたトピックがあれば今後も短期集中で学んでいきたい。