toraMasa's blog

toraMasa’s blog

新真虎のテックブログ

サイバーエージェントのAMoAdで3ヶ月間内定者アルバイトをしました!

自己紹介

22卒でサイバーエージェントに内定を頂いているバックエンドエンジニアです。

github.com

AMoAdについて

AMoAdはアドネットワークのプロダクトです。

定量的な振り返り

  • リリース: 12回
  • コミット数: 116
  • PR数 19
  • 書いたesaの数: 79
  • Slackの発言数(検索ボックスでfrom:meで検索して出てきた数): 627

はじめてエンジニアとしてインターンしたときと比較すると、PRとドキュメントの数はほぼ一緒(コミット数は不明)だけど、Slackの発言数がやたら多い。なんでだろう。前回どうやってカウントしたか忘れちゃったけど、カウント方法が原因なような気もする

やったこと

学んだこと

自分にとって新しい技術・知識の習得

  • Java, Scala, Kubernetes
  • アドテクノロジーについての知識
  • 自分にとって未知の技術でもキャッチアップする自信がついた
  • 未知の技術(言語)を高速に習得するコツ

レガシーコードについての知見。

  • 成功したプロダクトほどレガシーになる。むしろ成功したからレガシーになる(レガシーになるということは、サービスの寿命が技術のライフサイクルより長いということ)。逆に言うと、しょぼいサービスはレガシーにならない。それを脱却するにはなにはともあれテストを書くこと。
  • 既存のテストのものまねでテストを書くのではなく、あるべき場所にあるべきテストを書く
    • とはいえ、他とスタイルを揃えることは横展開しやすくなるので利点もあるなと思った
  • テストの実装スピードが自分のDXにすごく影響するなと思った。テストの実装に時間がかかるととても苦痛
    • 学生のエンジニアにしてはテストに対して意識高い方だとは思うけど、もっと勉強しようと思った
  • 結局気持ち(レガシーに立ち向かう気概とプロダクトに対する責任感)が大事なのかな?とも思った

アドテクのプロダクトならではの知見

  • トランザクションやキャッシュ周りの設計, AMQP・RabbitMQ, ログの永続化の設計, SQLの最適化など今まで(自分が)考えたことがなかったことを学べた
  • お金をめちゃくちゃ稼いでいるプロダクトだからこそ、リリースやアラートに対する緊張感が今まで自分が携わったサービスとは違うレベルだった
    • その分やりがいもあった

エンジニアとしての基礎的な知識

  • コードの読み方
    • テストコードを読むとコードの意図をつかめる。
    • デバッガーを使ってデータの流れを追う。
  • デバッグのやり方
  • エディタ(JetBrains系)の使い方
  • 優先順位に対する意識。今までは何か問題とか改善点を見つけたら何も考えずに取り掛かっていたが、今回のバイトでは優先順位を考えた上でどの程度までテストを網羅すべきか、どの程度リファクタリングに時間を使うべきか、などを判断して取り組めた(その判断の質に関しては自信がないが、少なくとも判断しようとした)。

その他

  • チームのすごい開発責任者を間近に見て、円滑な業務遂行やビジネスの方とのコミュニケーションなど色々学んだ。チームの雰囲気がとても良くて働きやすかったです。
  • 頑張ればなんとかなるということ
    • 一見難しそうだと思ったタスクも、頑張ればなんとかなった。逆に言うと、今までの自分は実装の困難さを過大評価していたような気がする。今まで実装できなそうと思って諦めていたアイデアの中にも、本当は実現できたものがいっぱいあるかもしれないと思った。
  • 実装の難易度と貢献度は比例しないということ
    • 簡単だけど周りにすごく喜ばれる実装と、時間をかけてもあんまり喜ばれない実装があると気づいた
      • 喜ばれる実装かどうかを判断する方法の仮説
        • 責任者やビジネスの方に聞く
        • MVPをできるだけ高速で作ってチームの人に見せる
        • ドメイン知識やビジネス要件をもとに判断する
    • 難易度が低い割に汎用的に喜ばれることもあるな〜と思った
      • レビューを依頼された瞬間にやる。自分がチームの方にやってもらってとてもありがたかった
  • MVCの弊害
    • どこかがファットになってしまうのはあるあるなんだと知った

苦労したこと

ドメイン知識。

  • タスクを理解するにも実装にもまずドメイン知識がいっぱい必要。
  • はじめてのバックログでチームの方が話していることが全く聞き取れなかったのを覚えていますw

フロントがない

  • 今までtoCWebサービスしかやったことがなかったので、フロントエンドがない開発に戸惑いました

動作確認

  • 動作確認のために広告を作るのも苦労しました。結構手順が複雑なので、不具合があっても実装が悪いのか広告の設定が悪いのかの切り分けが大変でした。

工夫したこと

ドメイン知識にキャッチアップするための工夫

  • MTGの議事録を取る
    • スプリントバックログなどのMTGの議事録を勝手にとっていました。これはやってよかったとすごく思います。
      • メリット
        • 会議に集中できる
        • ドメイン知識の勉強になる
        • 周りのメンバーのタスクを把握できるのでチームの優先順位がわかる
        • 自分のわからないところが明確になる
  • ビジのMTGに参加させてもらう
    • ビジネス職のメンバーのMTGに参加させていただきました。特に発言はできなかったですが、勉強になりましたし単純に面白かったです(社会科見学感覚)
  • アドテクの本を一通り読む
    • アドテクの本を最初に8冊くらい読みました。だいたい3冊読んだあたりから会話についていけるようになりました

開発

  • 拙速
    • PRも設計もミニマムのものを可能な限り早く作って見てもらう、ということをしていました。自分の勘違いや設計上の問題点などクリティカルな部分を早めに修正できたので、手戻りが少なかったと思います。
      • 見てくださるチームの先輩方がいてくださったからこそですが
  • document書く・共有し合う
    • 文書化されていない手続きやREADMEを積極的に直していました。ドキュメントを書く、みたいな部分は今までも意識的にやっていましたが、チームによりすごいドキュメントを書く方がいらっしゃったので刺激を受けました。
  • テスト駆動開発
    • とにかく稼いでいるプロダクトなので、バグを出さないためにテスト駆動開発を試していました。

その他

  • ドキュメントやコードの気になる点・負債などをメモっておいて後で共有する
  • 自分のコミットログを日報に入れる
    • あんまり効果なかった

良かったこと

目標達成できた

  • サイバーで安心して働けそう
    • 長期インターンを経験せずに内定承諾したので、パワハラ会社だったらどうしようと怯えていました。なので楽しく働けるイメージが持てて本当に良かったです
  • 貢献と自己成長の両立
    • バイト代くらいは貢献できた(と思う)
    • 新しい技術学べた
  • 自分の実装が大きな額の案件に使われる(予定) 月締め会でも紹介してもらった

キャリア

  • 会社についての理解が深まった
  • 就活のときに持っていた価値観やこだわりが無意味なものだとわかったり、変わったりした
    • toCで慈善性の高いプロダクトが良いと思ってた→toBの広告プロダクトだったけどとても楽しかった

技術・知識

  • 新しい技術学んだ
  • アドテク詳しくなった、面白い
  • 周りの優秀なエンジニアから学べた
  • 本番でバグ出さなかった

その他

  • チームの方にランチに連れて行って頂きました。美味しかったです。

f:id:toraMasa:20210730191443j:plainf:id:toraMasa:20210730191453j:plainf:id:toraMasa:20210730191555j:plain

  • 売上好調な雰囲気の中で働くのが楽しかった

反省点

  • 積極性
    • 意見とかももうちょっと積極的に言えば良かった。様子見をしてるうちに終わってしまった
  • (多分無理だけど)全部出社できればより良かった。でもそれは(起きれないから)厳しそうとわかった。逆に週5だったらできるかも?

応用情報技術者試験取得した

4月に応用情報技術者試験を受けて合格してたので簡単に振り返る。

午後問題

午後問題はセキュリティに加えて

2.経営戦略

3.プログラミング

6.データベース

8.情報システム開発

を選択した。他の分野はある程度出題範囲によって得点がばらつきそうだが、プログラミングとデータベースはできる人ならコンスタントに得点できそう。特にプログラミングは知識がなくても問題文を読めば確実に得点できると思う。情報システム開発はWeb系の経験が活きそうだったので選択した。

経営戦略も問題文を読めば一般常識で解けそうな年も多い。年によっては財務諸表の知識が必要なこともあるっぽい。

したこと

対策というか準備は以下。勉強時間は75時間くらい。

正直この本は範囲を絞り過ぎだし、説明も簡略化し過ぎてて雑だったりしたので他の参考書の方が良いかもしれない。

絵で書かれているからわかりやすいか、というとそうでもないと思う。

これはわかりやすくておすすめ。最後の方の章はいらないと思うけど。

  • 会計周りの知識はマネーフォワードのサイトがわかりやすかった。

会計の基礎知識|会計ソフト「マネーフォワード クラウド会計」

  • あとファイナンスの漫画を読んだ。これはそこまで必要なかったかもしれない。教養としては良かった。

感想

本番思ったよりできなくて焦った。

あと、お腹が痛くなって辛かった。以来外出するときは正露丸を持ち歩いている。

Image from Gyazo

slidevでスライドを作ってみた

はじめに

Product huntとかで話題のslidevを使ってスライドを作ってみました。

slidevとは

マークダウンやHTML, CSSを使ってプログラマブルにスライドを作れるツールです。

github.com

www.youtube.com

作ったスライド

感想

  • コードでスライドが作れるのはめちゃくちゃ便利。今後一人で作るスライドはslidevで作ろうと思った。
  • ただ作ったスライドを見てもらえばわかるようにpdfにエクスポートすると貼り付けた画像の位置がおかしくなったりする等のバグが結構ある。
  • 最近できたツールだから当たり前だけど情報源が公式ドキュメントしかない。
    • 公式ドキュメントに「コードを読んでください」みたいなの書いてあったりする。

おわりに

結論めちゃおすすめです!

『関数プログラミング実践入門』を読んだ

5月から新しくアルバイトをはじめるのですが、その部署ではScalaが使われているようなのでScalaの勉強をはじめました。

その一環として、『関数プログラミング実践入門』という本を読んだので、その感想を書きます。

本の内容

0章要約

勉強のため0章『【入門】関数プログラミング』を要約してみました。

『関数プログラミング実践入門』 第0章の要約 · GitHub

感想

  • Reactの参照透過性やPython等のラムダ式など、関数プログラミングの影響を受けた概念の意味がよくわかって良かったです。
  • 再帰的な考え方に慣れることができる(慣れざるを得ない)のも、関数プログラミングを学ぶ利点かなと思います。
  • コードがある程度以上のサイズになると全く意味がわからなくなって辛かったです。理論的にはメリットが多くても実際に採用されづらい理由がなんとなくわかりました。
  • モナドの章は正直あまりわからなかったです。
  • 関数プログラミングの概念が単純に面白いのと、今まで使ってきた命令型プログラミングやオブジェクト指向プログラミングを客観視できたので読んで良かったです。

3月に読んだ本

3月に読んだ本をざっくりまとめてみる。

web

就職する会社がGoをメインに使ってる会社なのでGoを中心に勉強していた。

Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ

この本とA Tour of GoをやりながらWeb APIを書いたりした。フレームワークに頼らずAPIを書くのは良い勉強になった。

それから前のバイト先でオススメされていたWeb API: The Good Partsも読んだ。特にキャッシュの設計の話とかは全く知らなかったので読んでよかった。薄いし。

あとコマンドラインツールを作ってみたかったので改訂2版 みんなのGo言語も読んだ。

面白かったけど、色んな人がそれぞれ好きなテーマを書いている感じだったので役に立たない部分もかなり多かった。超いまさらだけどpecoに感動したりした。

その他MongoDBの薄い本とかKubernetesチュートリアルとかやっていた。

低レイヤ

仮想化についてちゃんと理解したいと思って色々勉強していた。

とりあえずC言語を覚えないと行けないと思ってプログラミング言語C 第2版 ANSI規格準拠を読んだ。 正直演習がむずくてできてないやつの方が多い。というかC言語以前に情報理論?の知識が全然足りないとわかった。

ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道も読んだ。バイト先で意味をよく理解しないまま打っていたコマンドや用語の意味がどんどん解消されていった。というかこういう基本的なことも知らないままやっていたんだなーと改めて思った。

それからC言語の練習がてら自作エミュレータで学ぶx86アーキテクチャ-コンピュータが動く仕組みを徹底理解!を読んだ。

↓作ったCPUエミュレータ github.com

思ったより薄いし、ポインタとかアセンブリについての知識もついて良かった。途中からレジスタの名前がこんがらがってよくわからなくなったけど。

ハイパーバイザの作り方は正直あんま理解できなかった。理解するにはlinuxやハードウェアの知識がもっと必要だと思う。

その後、コンピュータの仕組みの全体像を掴みたいと思ってこの本を読んだ。

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

これはまだやってる途中だけど、論理回路からはじめてCPU作ってアセンブラ作ってコンパイラ作ってOS作って、最後にゲームを動かす、という内容でめちゃくちゃおもしろい。

github.com

サイバーエージェント

あとは就職先についての本を読んだ。

渋谷ではたらく社長の告白〈新装版〉

憂鬱でなければ、仕事じゃない (講談社+α文庫)

藤田晋の成長論

藤田晋の仕事学 -自己成長を促す77の新セオリーー

感想は書かない。

その他

ザ・ファブル(1) (ヤングマガジンコミックス)を全巻読んだ。

殺し屋モノだけどグロくなくてギャグ多めで良かった。

Railsガイドv6.0全部読む#4-1 Action Controllerの概要編

railsguides.jp

1 コントローラの役割

  • コントローラはモデルとビューの間を仲介する
  • リクエストを受け取り、適切な出力を行う

2 コントローラの命名規則

  • コントローラは複数形であることが望ましい
    • resourcesで一括ルーティングできる

3 メソッドとアクション

4 パラメータ

  • Railsではクエリ文字列パラメータとPOSTデータをどちらもparamsハッシュで取得できる
  • paramsでids=["1", "2", "3"]を渡すには、以下のようにする
GET /clients?ids[]=1&ids[]=2&ids[]=3
  • パラメータの値はすべて文字列
  • paramsにnilがあると自動で[]に置き換えられる
  • paramsではキーとしてシンボルも文字列も指定できる
  • config.wrap_parameters, wrap_parametersはじめて知った
    • ちょっとよくわからん
  • 4.3ルーティングパラメータどういう意味かわからない
  • default_url_optionsもはじめて知った
    • 'I18n.locale'ってなんや
  • requiredなパラメータないと400帰る
  • 'Person.create(params[:person])'これだめなんだ。
  • permitのとこに書くやつは許可済みスカラー値って名前らしい
  • Numericってなんや
  • TrueClass、FalseClassっていうのがあるの初めて知った
  • permit!は要注意。
    • 使われてるの見たこと無いけど。
  • ネストしたパラメータ複雑。
  • 4.5.3 その他の事例ようわからん

5 セッション

  • セッションはコントローラとビューのみ利用できる
  • セッションの保存先ストレージ全部初めて知った
    • デフォルトはCookieStore
    • セッションIDは必ずcookieで渡す
    • 正直セッションとCookieの意味よくわかってない
  • モデルインスタンスは基本的なRubyオブジェクトではない?
  • lazy_loadは理解したがeager_loadの意味を忘れた
  • メモ化ってなに
  • flash.keepって初めて知った

6 Cookie

  • Railsではcookieをhashのように扱える。
  • cookieに複雑なオブジェクトを保存するとJSONとして変換されないケースがあるので、できるだけ単純な値だけを保存するようにする。

7 XMLJSONデータを出力する

8 フィルタ

  • フィルタにはbefore, after, aroundがある
    • aroundはbeforeとafter両方で実行される
    • aroudでは必ずyieldを実行しないといけない
      • yieldってなんすか
  • 一般的にはprivateメソッドを定義して、そのメソッドをフィルタとして追加する
    • ブロックとして与えることもできる
    • sendメソッドを使うとprivateメソッドを呼び出せる
    • クラスを渡すならbeforeメソッド必要
      • beforeメソッドって初めて知った

9 リクエストフォージェリからの保護

  • リクエストフォージェリを防ぐ第一歩は、RESTful規則にそってアプリケーションを開発すること
  • リクエストの偽造から保護するには、すべてのリクエストに予測不可能なトークンを追加すること
  • formヘルパーを使っていたら心配ない。APIとかを作るときには気をつけないといけないと思うけど、あんま書いてない。書いて欲しい。

10 requestオブジェクトとresponseオブジェクト

11 HTTP認証

  • RailsではBASIC認証とダイジェスト認証がビルトインされている

12 ストリーミングとファイルダウンロード

  • send_data, send_fileメソッドでファイルを返せる
    • 前者は新しくファイルを作成する場合、後者は既存のファイルを返す場合に使う
    • PDFって文字列だったんだ
  • ただし利点はあんまない。publicフォルダに置いておいてwebサーバーからダウンロードさせる方が良い。
  • mixin = includeで使用すること
  • カラオケアプリを作る時はストリーミングを使う
    • むずい。ようわからん

13 ログをフィルタする

  • ログに出力したくない情報をフィルタリングできる
    • 使ったことないんだけど大丈夫なんだろうか。

14 Rescue

  • Procオブジェクトってなんぞや
  • rescue_fromにExceptionとかStandardErrorを指定しないほうが良い

15 HTTPSプロトコルを強制する

  • configで設定できる

サマーインターンかんたんに振り返る

はじめに

2020の夏休みにいくつかサマーインターンに参加しました。本当は一つ一つブログに書こうと思ってましたが、時間がなくて後回しにしているうちに忘れてしまいそうなので全部まとめて軽く振り返ります。

参加したインターン

振り返り

サイバーエージェント

www.cyberagent.co.jp

これは詳細を別記事に書きました。

toramasa.hatenablog.jp

某社

概要

やったこと

選考

  • ES + 面接

感想

  • 詳細を記事に書いて公開して良いか聞いたんですが社内の審査がすごい大変そうだったので公開は控えます。
  • でもめちゃくちゃ楽しかったし社員の方がすごいエンジニアばかりでした。参加したハッカソン型のインターンの中では自分的には一番良いものを作れたと思ってます。

AWS

概要

aws.amazon.com

  • 期間: 3日間

やったこと

  • AWS のサービスを組み合わせてお客様の課題解決を技術的に支援するソリューションアーキテクトの業務を想定して、学生数名チームで実在する大規模コンシューマー向けサービスを実現するアーキテクチャを設計し、その内容を他のインターン参加者や社員に対して発表するという課題を予定しています。インターシップのプログラムの中には他のポジションの紹介や、社員との交流会も予定しているため、Amazon/AWSのカルチャーやキャリアパス等についても学べる場となっております。当インターンシップは選考直結型のプログラムです。
  • 自分はwell architected frameworkの勉強をしていたのとAWSの構築・運用の経験が一応あったのでアーキテクチャの設計や質疑応答等を中心になってやっていました。
  • ただ質疑応答で社員の方に見事に論破されて結果負けたので責任を感じてます。

選考

  • レジュメ + 技術課題 + (面接)

感想

  • インフラは個人だと取り組める範囲に限界があるので貴重な経験でした。
  • 個人的に面白かったのは、懇親会に社員の方がスライドを作ってきていたことです。笑 学生がポテチを食いながら社員さんのLTを聞いているのがシュールでした。(Amazonってスライド作っていいんだ。。。笑
  • あとアレクサをもらいました。

Sansan

概要

www.wantedly.com

  • 期間: 1day

やったこと

  • 名刺アプリ作成ワークショップ(Rails)

github.com

選考

  • ES

感想

  • 参加する前は1dayのインターンって役に立つのかな、と思っていましたがめちゃくちゃ参加してよかったです。(本当は就業形に参加したかったんですが書類選考で落ちました。書類選考で落ちたのはここだけだったので辛かった)
  • コードレビューめっちゃ丁寧にしてもらえて勉強になりました。コードきれいって言ってもらえて嬉しかった。
  • CTOの藤倉さんの話をめちゃくちゃ聞くことができて最高でした。

Cookpad

概要

internship.cookpad.jp

  • 期間: 5日間

やったこと

  • 1.5日 web開発講義(RailsAWSのCodeDeployを使ったCI/CD環境構築)
  • 1.5日 サービス開発講義
  • 2日 PBL

github.com

選考

  • ES + プログラミングテスト + 面接

感想

  • 一番おもしろかったです。技術だけじゃなくてサービス開発とは、みたいなところを学べました。こんなにサービスについて真剣に考えたことははじめてだったのでしんどくもあり楽しくもありという感じでした。
  • ここでFigmaがっつり触ったおかげで後々のインターンでモック作ったりするとき役立ちました。Figmaは色々使えて便利。

toramasa.hatenablog.jp

github.com

techlife.cookpad.com

NTTドコモ

概要

information.nttdocomo-fresh.jp

やったこと

感想

  • 色々あって自分ひとりで全部開発したのでちょっと辛かったです。
  • クラッシャー気味な人がいて、その人ともうまくやろうと試行錯誤する中でファシリテーションだったりリーダーシップ的な能力の大切さを実感できました。

ハウテレビジョン

概要

www.wantedly.com

  • 期間: 6日間

やったこと

  • 外資就活ドットコムを運営するハウテレビジョンは実務経験型のエンジニアインターンを開催します。
  • インターンでは、みなさんが使っている「外資就活ドットコム」の機能を実際に開発、リリースするまでを目指していただきます。 いつも使っているサービスを、自分が書いたコードで動かす、みんなが使う、そんなエキサイティングな経験をしてみませんか。 期間中は参加者同士でチームを組み、メンター社員のサポートのもと新機能開発に挑戦していただきます。

選考

  • ES + 面接 + プログラミングテスト

感想

  • GoでCRUDを一通り書けるようになりました。
  • Goで書かれたプロダクションコードをはじめてがっつり読みました。クリーンアーキテクチャよくわかってなくて大変でした。笑
  • 心配になるくらい待遇が良かったです(参加10万 + 優勝するとプラス10万、寿司とか叙々苑弁当が毎日出ました)。
  • やたら東大生が多かったです。

Wantedly

概要

www.wantedly.com - 期間: 3週間の就業形インターン

選考

  • アンケート + (プログラミングテスト) + 面接

感想

  • これは今やってる最中なので終わったら別記事に書く予定です。

最後に

  • 時間的に参加できなかったものもありますが、色々経験できて良かったです。
  • ただその分インプットに割ける時間はあまりなかったので、今学期はCS等の勉強に時間を使いたいと思ってます。
  • 貴重な経験をさせて頂きました。本当にありがとうございました。