結果に git commit する

技術的なことはあまり書きません

2017年を振り返ってみる

はじめに

今年はプログラミング漬けの年でした。
このブログも今年の夏から始めました。
せっかくなので今年1年を振り返ってみようかと思います。

振り返ってみる

1月

Swiftはじめた

2016年の12月にYahoo! JAPAN主催のハッカソン「HACK U」に参加しました。
それ以来サービス開発に興味を持ち、プログラミング学習を開始しました。
たまたまiPhoneMacBook Airを持っていたという理由から、SwiftでのiOSアプリ開発についての学習をはじめました。
詳細! Swift 3 iPhoneアプリ開発 入門ノート Swift3 + Xcode 8対応という技術書を読んでiOS開発の概要を学びました。

大学の期末試験

大学の期末試験がありました。
9科目くらいありました。

2月

Swiftつづけた

引き続きiOS開発について学んでいました。
TODOアプリや家計簿アプリなどを自分で作ってみて練習しました。
デザインやリリースの経験もできて良かったです。
本を読むだけではなく、実際に何か作ってみることは上達の近道になったと思います。

実際の業務でSwiftを使ってみた

ある程度Swiftを勉強して、次は実際に世に出ているアプリに触ってみたくなりました。
そこで、SwiftでiOSアプリを開発しているところでインターンとして受け入れてもらえないか探しました。
その結果、2月から半年ほどスタートアップ企業でインターンすることになりました。
SwiftによるiOSアプリ開発Ruby on Railsによるバックエンド開発の経験を積むことができました。

3月

引き続きSwift

引き続きインターンでSwiftとRubyを勉強していました。
給料が低くて大変でした。
1月までに家庭教師をして貯めていたお金でなんとかしていました。
この頃は大きなイベントもなくあんまり記憶がありません。

4月

インターン

SwiftとRubyのお勉強。

家庭教師を再開した

ちょうど依頼が来たので、週1で家庭教師を再開しました。
経済的にしんどかったのでちょうど良かったです。
42歳のおじさんに中学数学を教えるというなかなか面白い体験をすることもできました。

5月

インターン

引き続きSwiftとRubyのお勉強。
給料が上がって少し余裕ができました。

サマーインターン応募開始

5月末くらいから各社のサマーインターン応募が始まってきました。
有名どころに10社ほど応募して5社合格くらいでした。
合格したのは、はてな楽天WantedlyGREEサイバーエージェントでした。
不合格だったのは、VOYAGE GROUP、クックパッド、LINE、DeNAでした。
選考を途中で辞退したのはYahoo!でした。

6月

インターン

引き続きSwiftとRubyお勉強。

サマーインターン選考

サマーインターンの面接や選考課題に時間を割いていました。

7月

インターン

引き続きSwiftとRubyのお勉強。
このインターンも夏休み前に終了することになりました。
約半年間お世話になりました。

サマーインターン選考

ほとんど6月に終わっていましたが、7月前半に少し残っていたものがありました。

大学の中間試験

大学の中間試験が7月末にありました。
10科目くらいありました。

8月

はてなサマーインターン

株式会社はてなのサマーインターンに参加させていただきました。
Webサービス開発のいろはを学べたとともに、自分のiOS開発力をさらに磨くことのできた良い機会になりました。

snowman-mh.hatenablog.com

9月

楽天ハッカソン形式インターン

楽天株式会社の短期サマーインターンに参加しました。
ハッカソン形式のインターンで会社のことはあまり分かりませんでしたが、iOS側をもう1人のメンバーと一緒に開発し、少ない日数でチーム開発する良い経験になりました。

snowman-mh.hatenablog.com

Wantedlyのサマーインターン

Wantedly株式会社のサマーインターンに参加しました。
Xcode9から大幅に機能が追加されたUITestについてキャッチアップしていたことを活かすことができて良かったです。

snowman-mh.hatenablog.com

iOSDCに参加した

iOSDCというiOSカンファレンスに参加しました。
とても楽しいカンファレンスでした。

snowman-mh.hatenablog.com

10月

ダラダラした

夏休みにいろいろサマーインターンに参加させていただき、とても充実した夏休みを送ることができました。
でもとても疲れたので10月はダラダラしていました。

JPHACKS

10月終わりにJPHACKSというハッカソンイベントに大学の友人と一緒に出場しました。
当日の朝にアイデアが変わったり、実装できる人が少なかったりと大変でしたが、良い経験になりました。

11月

サイバーエージェントでのインターン

11月中旬頃から1ヶ月ほど、サイバーエージェントFRESH!というサービスを開発しているチームのサーバサイドにインターンとして参加させていただきました。
このチームは、サイバーエージェントの中でも特に技術に攻めているチームで、サーバサイドKotlinを採用していたりしました。
もう一人のインターン生と協力して、gRPCで通信しているマイクロサービスのうちのKotilnで書かれているサービスにAPIを追加したり、あるバッチ処理を行うマイクロサービスをGoで開発したりしました。
今まで触ったことのない技術をたくさん触ることができて、非常に刺激を受けました。

12月

DeNAでのインターン

12月終わりにDeNAのSWETグループで7日間インターンをさせていただきました。
Swift Package Managerを使ってCLIアプリケーションを開発しました。
勉強会などで登壇されている方が多いグループで、以前から興味のあったグループだったのでとても楽しかったです。
SWETグループの特徴も相まって、今まで考えたことがあまりない部分について気を配る必要があり、とても新鮮でした。

ボードを買った

前シーズンに生まれて初めてスノボに行きました。ハマりました。
今シーズンもいっぱい行きたいです。
ウェアとかは去年買ったのですが、今年ついにボードを買ってしまいました。

2018年の目標

2018年の目標は「もっとプログラミング以外のことをする」です。

大学を卒業します(正確には2019年卒ですが)。
友達と遊びます。スノボに行きます。彼女を作ります。
漫画を読みます。映画を見ます。テレビを見ます。
PS4を買います。モンハンをします。
もちろんプログラミングも引き続きやります。

高専から東大に編入すると強制的に留年する話

この記事は留年生 Advent Calendar 2017 - Qiitaの21日目の記事です。

はじめに

こんにちは、東京大学 工学部 電気電子工学科というところに通っている学部3年生です。
僕は「明石工業高等専門学校(明石高専)」という学校を卒業したあと、東京大学に「編入学」という形で入学しました。
現在22歳で大学4年生の歳ですが、大学3年生に所属しています。
今回はその謎を解き明かしていきましょう。

高専とは

高等専門学校」を省略して「高専」と呼ばれています。
日本全国で50個くらいあります。
僕は兵庫県明石市にある「明石高専」というところに通っていました。

高専は、中学校を卒業したあと、高校に入学するのと同じタイミングで入学する学校です。
そして、普通高校と違って高専は5年間通います。

歴史的には、終戦後に日本は技術者が少ない状況に陥り、専門技術を持った人間を素早く社会に放出するために高専という教育機関が作られたという経緯があったりします。

高専で学ぶこと

高専では、高校1年生の歳から専門的な知識を学ぶことができます。
専門分野は様々なものがあり、高専によっても違います。
僕が通っていた明石高専では、

の4つがあり、僕は電気情報工学科に所属していました。
電気情報工学科では、

  • 電気回路
  • 電子回路
  • ディジタル回路
  • 電気磁気学
  • プログラミング(C言語)
  • 電気情報工学実験

などの専門教科を1年生から学ぶことができます(一部1年生では履修しない科目もあります)。

高専生の進路

高専には5年間通うことになるので、卒業する頃には20歳、大学2年生の歳です。
その後の進路はどのようなものがあるのでしょうか?

結論から言うと、

  • 大学へ編入学
  • 就職
  • 専攻科に進学

の3つがあります(他にあったっけな…)。

大学へ編入学する際には大学1年生ではなく、途中の年次に編入することになりますが、詳細は後述します。
また、高専が技術者の早期育成のために作られたとだけあって就職率はほぼ100%となっており、求人が毎年たくさん来るので就職する人もいます。
さらに、高専は5年間通いますが、さらに2年通って専門技術をより深く学び、学術研究に活かすことを目的に専攻科というところに進むという進路もあります。

進学と就職の割合は高専によって大幅に変化し、僕が通っていた明石高専は進学:就職=7:3くらいですが、別の高専ではその割合が逆になったりします。

東大に編入すると留年する?

やっと本題ですね。
高専は5年間通うので、卒業する頃には20歳、大学2年生の歳です。
よって、だいたいの大学では大学へ編入すると3年生になります。

しかし、東京大学京都大学に編入した場合は2年生に編入することになります。
1年ずれて留年したみたいになるってことですね。
その謎を解き明かしましょう。
ちなみに、京都大学に編入すると2年生になる理由は知らないので誰か教えてください。

東大の教養学部進振り制度

東京大学に入学した学生は全員「教養学部」という学部に所属することになります。
教養学部ではスペイン語や社会生態学などの文系科目から微分方程式やベクトル解析などの理系科目を履修してそれぞれの単位を取得する必要があります。
そして、大学2年の夏に「進振り」という制度があり、今までの成績をもとに「工学部」や「理学部」、「文学部」などに進学することになります。

謎の真相

教養学部で単位を取ったあと進振り制度で学部に配属されることを前述しました。
しかし、高専からの編入生は「教養学部で取得する単位」を全部は持っていません。
それらを取得するために2年生から編入学する必要があったってのが2年次に編入する必要のある謎の真相でした。
高専で取得した単位がいくつか認められるので、1年生ではなく2年生からになる感じです。

実は3年生を2回やっている

あ、2年生に編入学すると言いましたが、あれは嘘です。
3年生に編入学します。
なぜなら、高専生は編入学という形で入学しますが、編入を管轄しているのは工学部で、教養学部のせいで工学部の最低学年が3年生になってしまうからです。
ということで、教養学部に入るというのも嘘です。工学部に入ります。

でも前述したように、1年目で教養学部の単位は取得する必要があるので、結果的に3年生を2回やることになります。
これは実質2年次編入しているのと同じなので、2年次編入と呼ばれています。
3年生の学生証を持った状態で1年生、2年生がいる教室に授業を受けに行くことになるので、ちょっとつらいですね。

高専に行って

高専から東大に編入すると強制的に留年する謎の真相を解き明かしました。
ここからは僕が高専に入って良かったこと・悪かったことを紹介したいと思います。
謎の真相が知れて満足した人はこの先は読む必要なかったりします。

良かったこと

寮が楽しかった

僕の実家は大阪にあるので、明石高専に入学するときに寮に入りました。
高専は5年間通うので、寮には5年間も住むことになります。
5年間も同じ人と一緒にいるととても仲良くなります。
たのしいですね。

卒業研究ができた

高専普通高校と違って「卒業研究」をして「卒業論文」を書かないと卒業することができません。
卒業研究をする時間が必要なので大学編入試験は夏に行われるくらいです。
大学での研究などに比べるとレベルは低いかもしれませんが、研究活動を体験できるのは良い経験になったと思います。

東大に行けた

東大の編入試験は「数学・英語・物理」の3教科のみです。
大学2年までの内容が受験範囲になるので範囲こそ広いですが、そこまでひねった問題が出たりはしません。
広く浅くみたいな感じですね。
この傾向と5年間という余裕のある期間のおかげで東大に入ることができたと思います。
普通高校から普通に東大を受験していたら受かっていた気がしません。高校生の東大受験問題を見たことありませんが。

悪かったこと

女子が少ない

女子が少ないです。
全体で3割ほど。
僕が所属していた電気情報工学科では45人中3人とか。
かなしいですね。

誰も知らない

高専のことは誰も知りません。
知っているのは高専の近所に住んでいる人くらいです。
なのでどんな学校かとかを説明するのがとても大変です。
でも、これからはこの記事を読んでと言えば大丈夫になりますね。

東大に行って

次に、高専を卒業して東大に編入して良かったこと・悪かったことを紹介します。

良かったこと

環境が変わった

まず単純に、自分の身を置く環境を変えるというのは人生を豊かにすると思います。
東大に入らなくても環境を変えることはできますが、環境を変えると価値観の違う人たちに出会うことができます。
東大は何かと優秀な人が多いですしね。
アホな友達もいっぱいできて、そいつらとアホなことをするのもとても楽しいです。

プログラミングを学習する期間が取れた

東大は2年次編入です。
大阪大学などの他の大学に編入した人は3年生から始まるので、すぐに院試です。すぐに研究室配属です。

僕は院へは進学せず就職しようと思っています。
2年生からスタートだったので好きなことを勉強できる期間があり、そこでプログラミングを本格的に勉強しました(今もしていますが)。
様々な会社でインターンをさせていただきながらプログラミングを学習したりする中で、これを仕事にしたいと思うようになりました。
3年生からのスタートだとすぐに院試ですぐに研究室配属って感じで自分のキャリアをゆっくり考える時間がなかったと思います。
大学院へ進むのはもちろん良いことだと思いますし、就職することも良いことだと思います。
でも自分には就職があっているかもということを発見できたので、2年次編入で良かったと思っています。
まぁ就職したことがないのに就職が自分に合っていると思えたのは、ほぼ社員のように受け入れてくれた数々のインターン先のおかげなので、とても感謝しています。

ネームバリュー

やっぱり東大にはネームバリューがあります。
最終的に大事なのはもちろん自分のスキルですし、僕が入ろうとしている世界はその傾向が比較的強い業界です。
でも、第一印象が良いに越したことはありませんからね。

悪かったこと

女子が少ない

女子が少ないです。
全体で3割ほど。
僕が所属している電気電子工学科と電子情報工学科は130人中10人くらい?とか。
かなしいですね。

取得単位が多すぎる

詳細は省きますが、僕が所属している学科、通称EEICは取得する必要のある単位が多いです。
たくさん授業を履修しています。
全部に出席しているわけではないですが、僕はバカなので少なからず負担になっています。
まぁ頑張って卒業しないと就職できないので頑張ります。

おわりに

今回は「高専から東大に編入すると強制的に留年する謎の真相」と「高専・東大に行って良かったこと・悪かったこと」を紹介しました。
僕は自分の選択をまったく後悔していませんし、むしろ正解だったと思っています。
これからも頑張っていきたいと思います。

ワタシハFirefoxチョットデキル

目次

はじめに

この度、私 id:snowman_mh は、FirefoxJavaScriptエンジンである「SpiderMonkey」のコミッターになりました。
この記事では、その経緯やコントリビュートの方法などをまとめたいと思います。
何をしたか早く読みたい方は「やったこと」まで飛んでください。

自己紹介

僕は、「東京大学工学部電気電子学科」というところの学部3年生に所属しています。
大学の授業やインターンシップで日々プログラミングの勉強をしています。電気系の勉強もしています。
そして、僕が所属する電気電子学科および電子情報学科には「電気電子情報実験」という、欠席すると留年する授業があります。
今回は、その実験の一環でOSSにコントリビュートする経験ができましたので、実験報告書を兼ねたブログを書いている次第であります。

大規模ソフトウェアを手探る

実験というからには様々なテーマがあり、その中から自分の好きなテーマをある程度選択することができます。
今回僕が参加したのが、その中の1つである「大規模ソフトウェアを手探る」というテーマの実験です。

実験の目的

「『演習レベルの小さなプログラムが作れること』と『実用規模のプログラムが作れること』のギャップを埋める(ための知識と経験を得る)」ことを目的として実施されている実験です。
また、ソフトウェアを改良するためのアイデアを出し合ってみて、whatとhowを考える力を養うことも目的とされています。

実験の内容

超簡単に説明すると、この実験では「10日間(1日4時間程度)かけて、OSSとして公開されている大規模なソフトウェアに手を入れる作業を体験してみる」ということをします。
僕はFirefoxJavaScriptエンジンである「SpiderMonkey」というソフトウェアを題材にしました。
他のチームは

  • Slackライクなチャットサービス「Gitter」
  • 仮想暗号通貨の「zcash」
  • 無料オフィスソフトの「LibreOffice
  • 皆さんご存知「Google Chrome (Chromium)」

などを題材としていました。

実験の報告書

さらに、この実験でのいわゆる報告書、レポートは「ブログ」という形で提出することが認められています。
この実験を担当している田浦先生の、「『やったことを10日間も顔を合わせた先生やTAにだけ見てもらう』のではなく、『全世界の同じようなことをしたい人たちに見てもらう』ほうが有意義である」という考えによるものらしいです(かっこいい)。

SpiderMonkeyについて

WebブラウザであるMozilla FirefoxJavaScriptエンジンの名前です。

ECMAScriptとは

JavaScriptは主にブラウザで動作する言語なので、処理系がブラウザに依存するという特徴があります。
しかし、ブラウザごとに書いたコードを動作が違うとプログラミングやめたくなります。
それを防ぐために(それだけではないが)、ECMAScriptという規格でJavaScriptの標準が定められています。
その標準に従ってそれぞれのブラウザがJavaScriptの処理系を実装しています。

JavaScriptエンジン

前述したように、JavaScriptエンジン(JavaScriptの処理系)はブラウザによって違います。
Google ChromeはV8という名前だったり、SafariJavaScriptCoreという名前だったりします。
そして今回コントリビュートしたMozilla FirefoxJavaScriptエンジンはSpiderMonkeyという名前です。
SpiderMonkeyでは、JavaScriptコードをコンパイラバイトコードと呼ばれる中間言語に変換し、インタプリタが解釈し、CPUがネイティブコードを実行する、という順序で処理されます。

コミッターがいた...

この実験には学部生をサポートするTAが数名います。
なんとその中にSpiderMonkeyに日頃からコントリビュートしているコミッターの方がいました。
Mozillaからウチで一緒にやらないかと言われているとかいないとか。
今回この題材を選んだのも、そんな凄腕コミッターのサポートが受けられるから、というのが大きいです。
なんてったってそのTAさんがIssueをアサインすることも、コードをレビューすることも、マージすることもできますからね。
自分の力だけでは絶対にここまでの成果を出すことはできませんでした。
TAさんには感謝してもし切れません。

やったこと

この実験で実際に行ったことをまとめます。

チュートリアル

最初に全員の共通課題として「gnuplot」というグラフ描画ソフトに変更を加えることをチュートリアルとして行います。
gnuplotでは、

gnuplot> plot sin(x)

とするとsin(x)が描画されますが、これを

gnuplot> sin(x)

とするだけで描画されるように変更するという内容でした。
詳しい手順はこちらにまとまっているので、体験したい方は読んでみてください。

SpiderMonkeyを手探る

さて、ここからやっと本題ですが、SpiderMonkeyのコードを手探っていこうかと思います。

まずは何よりも環境構築をする必要があります。
前述しましたが、この実験のTAにはSpiderMonkeyのコミッターがいます。
その方がまとめてくれている資料を参考にして環境構築を行いました。
そして、実験で僕が行ったコントリビュート手順の詳細は別記事にまとめました。
実験の背景とかはどうでも良いからコントリビュートする手順だけ知りたい人のためです。

qiita.com

エラーメッセージを改善する

僕は今回の実験のテーマとして「SpiderMonkeyのエラーメッセージを改善する」というのを選びました。
このページに改善すべきエラーメッセージがまとめられていて、比較的小さな変更から大きめの変更まで様々なBugがあり、小さなタスクでコントリビュートを体験してみて、最後に大きめのタスクに挑戦できそうというモチベーションで選びました。
結果として3つのIssueを解決することができたので、それぞれの詳細を紹介したいと思います。

その1 - クラスを再宣言したときのエラーメッセージ

JavaScriptでは、変数を定義するためのキーワードとしてvar, let, constなどがあります。
varで定義された変数は同名変数を定義することができますが、let, constは同名変数を定義することができません。

js> var a; var a;    // 問題なし
js> let b; let b;
SyntaxError: redeclaration of let b
js> const c = 1; const c = 1;
SyntaxError: redeclaration of const c

同様にclassも同名クラスを定義することができませんが、そのエラーメッセージを見てみましょう。

js> class Foo {}; class Foo {};
SyntaxError: redeclaration of let Foo

なんと、classなのにletとか言っちゃってます。
これを、

SyntaxError: redeclaration of class Foo

って言ってくれるように変更しました。
このバグレポートページはこちらです。
最後に僕の名前が入ったコミットページへのリンクもコメントされています。

変更内容としては5行程度でした。
軽い変更でコントリビュートが体験できたとともに、これだけで解決するIssueがあるんだなと思いました。
誰にでもコントリビュートのチャンスってあるんですね。

詳しい変更内容や、どのように変更点を探したのかは別記事にまとめました。

qiita.com

その2 - super();を呼ばなかったときのエラーメッセージ

JavaScriptではクラスを継承することができます。
以下のJavaScriptコードを見てください。

class B {};
class A extends B {
    constructor() {
        this.someValue = 'value';
    }
}
new A();

このコードはReferenceError: |this| used uninitialized in A class constructorというエラーを吐きます。
これは継承先のコンストラクタで、継承元のコンストラクタを呼ぶ前にthisにアクセスしていることによって起きているエラーですが、とても分かりにくいという問題が報告されていました。
以下のコードのようにsuper();を呼ぶ必要があります。

class B {};
class A extends B {
    constructor() {
        super();
        this.someValue = 'value';
    }
}
new A();

これで正常に動作します。
同様に、継承元のコンストラクタでアローファンクション内でthisにアクセスしても似たようなエラーを吐きます。

class B {};
class A extends B {
    constructor() {
        (() => {
            this.someValue = 'value';
        })()
    }
}
new A();
ReferenceError: |this| used uninitialized in arrow function in class constructor

こちらも同様にアローファンクションの前にsuper();を呼ぶと解決します。
これらのエラーメッセージを次のように表示されるように変更しました。

ReferenceError: must call super constructor before using |this| in A class constructor
ReferenceError: must call super constructor before using |this| in arrow function in derived class constructor

このバグレポートページはこちらです。

変更内容としてはこちらも5行程度でした。
っていうか1個目のIssueよりも簡単でした(文字列を変えただけなので…)。
しかし、1個目と違ってテストにも変更を加えたので、3個目に活きる体験ができました。

詳しい変更内容や、どのように変更点を探したのかは別記事にまとめました。

qiita.com

その3 - in演算子に関するエラーメッセージ

JavaScriptでは、in演算子という二項演算子があります。
inは、右辺のオブジェクトが左辺の名前のプロパティを持っているかどうかの真偽値を返します。

js> class A {};
js> let a = new A();
js> "hello" in a;
false
js> a.hello = "hello world";
js> "hello" in a;
true

inの右辺にオブジェクトでない値(文字列や真偽値など)を持ってきてしまった場合、次のようなエラーを吐きます。

js> 'hello' in 'hello world';
TypeError: invalid 'in' operand "hello world"

オペランドにオブジェクト以外を取ることができないので当たり前ですね。
しかし、Pythonを書いていた人から見ると、「なんで文字列をオペランドに取れないの!?」となります。
なぜならPythonでは、'hello' in 'hello world'と書くとTrueが返ってくるからです。
そう、Pythonでは、in演算子というと、部分文字列が文字列内に含まれるかどうかの真偽値を返す演算子なのです。
ここでは、右辺にオブジェクト以外の値を持ってきたことが悪いと伝わりにくいエラーメッセージを出力していたことが問題となっていました。

そこで、次のようなエラーメッセージが出力されるように変更しました。

js> 'hello' in 'hello world';
TypeError: cannot use 'in' operator to search for 'hello' in 'hello world'

また、非常に長い文字列を両辺に取った場合、文字列が省略されて表示されるようにしました。
Google Chromeでは長い文字列のまま表示されているので、Firefoxの勝ちですね!!!

js> 'hello'.repeat(100) in 'hello'.repeat(100)
TypeError: cannot use 'in' operator to search for 'hellohellohelloh...' in 'hellohellohelloh...'

このバグレポートページはこちらです。

変更内容としては90行程度でした。
比較的大きな変更を加えることができて嬉しいです。

詳しい変更内容や、どのように変更点を探したのかは別記事にまとめました。

qiita.com

おわりに

大学の授業やインターンシップでプログラミングを勉強していますが、ここまでガッツリOSSにコントリビュートしたのは初めてで、非常に刺激的で有意義な経験ができました。
今回の実験で得た大規模なソフトウェアを手探るコツのようなものはこれからも活かすことのできる貴重なスキルになっていくと思います。
今回僕が行ったことのすべては本記事およびリンク先の別記事にまとめてありますので、それを読めば誰でもFirefoxSpiderMonkeyのコミッターになれるはずです(?)。

また、ひよっこエンジニアの僕がここまでの成果を出すことができたのも、ひとえにSpiderMonkeyのコミッターであるTAさんが手取り足取り指導くださったおかげです。
本当にありがとうございました!

最後になりますが、このような貴重な体験のできる実験を用意してくださった先生にもとても感謝しています。
今までの実験レポートは前日に徹夜で書くことが多かったのですが、このレポートは実験終了前に書き始めたくらい楽しかったです。

リリースパーティ (2017/11/25 追記)

後日、Mozilla日本オフィスの近くで開催されたFirefox Quantumのリリースパーティに招待していただきました!
Firefoxのアニメーションまわりの開発に日本から参加していた方や、Firefoxのアドオンを開発しまくっている方などにお会いすることができました。


GitHubのコミット (2017/12/24 追記)

GitHubミラーリングされているリポジトリから自分のコミットを発掘したので貼っておきます。

github.com

github.com

github.com

CyberAgentのAdTech Challengeに参加してきた

はじめに

10月21日、22日に開催された株式会社サイバーエージェントの「AdTech Challenge」に参加してきました。
そこで学んだことを残したいと思います。

f:id:snowman_mh:20171024223610j:plain

インターンの内容

位置情報データを秒間2000リクエストで流すサーバが用意されていて、その膨大な位置情報データを処理して集計する基盤をGoogle Cloud Platformを利用して作成しました。
その位置情報データに基づく問題が用意されていて、その問題に対する解答の精度を7チーム(1チーム = 学生3人 + 現場社員1人)で競うという内容でした。

僕は順番に流れてくるデータを処理してBigQueryやCloud Datastoreに保存する部分の実装をCloud Dataflowを利用して行いました。
Goを使うと思って勉強していったのにDataflowのストリーミング用SDKJavaにしか対応していなくて2日でJavaをマスターすることになりました。
このインターンでGoとJavaが使えるようになりました。笑

学ぶことに投資してくれる文化

サイバーエージェントは学ぶことに投資してくれる文化が根付いているなと思いました。
「既に技術が身に付いていて、実務経験もあって、そういう人が生み出す成果に期待する」のではなく、「学ぶ力があって吸収力の高い人に、学ぶところから投資して、その人が企業に還元することを期待している」そうです。
あくまで社員さんと話して僕が感じたことで、社員さんが上記のことを明言したわけではないですよ。
うまく説明できているか分かりませんが、そういう文化はとても好きだなぁと思いました。

長期インターンなどを探していても、既に持っている技術を活かして業務に参加するパターンが多くてなかなか新しい技術に挑戦できないことが多いと思うので、学ぶことに投資してくれるところで働きたいと思いました。
まぁ長期インターンは出勤時間がそんなに多くない中で成果を出す必要があるのである程度は仕方ないとは思いますが…。

変化の激しい技術についていく

今回のインターンで僕が担当した部分はCloud Dataflowを利用したデータ処理部分で、JavaSDKを利用して開発しました。
そのSDKがかなりの頻度で変更されており、GitHubの誰かのプロジェクトに12日前にコミットされたコードですら動かないということがあったくらいです。
公式リファレンスも更新されていなかったり情報が不十分だったりしました。

そんな状況の中で、最初はどうやって動くコードを書くのか全然分かりませんでした。
メンターさんがどうやって最新のコードを探しているのかを見ていると、GitHubにプッシュされている意識の高い人のリポジトリから同じような動作をしているコードを探していました。
それをマネして、メンターさんに手助けを頂きながらGitHubから最新の動くコードを探していきました。
GitHubで最新の実用的なコードを探すコツみたいなものを少しは盗めたかなと思います。
エンジニアをやっているとよくやることだとは思いますが、今までできていなかったことだったので、これからも絶対に役に立つスキルを身に付けることができて良かったです。

おわりに

今までに触ったことのない技術にたくさん触れることができた楽しいインターンでした。
成果物に満足することはできませんでしたが、成果物を作るまでのチーム開発の過程には満足することができたので良かったと思います。
とても良いチームでした。
また、サイバーエージェントという興味のあった企業について少しでも知ることができたのも良かったです。

せっかくGoの勉強をしたのでGoを使う長期インターンみたいなのがあったら参加したいですね。

シゴトでココロオドル人を増やしてきた

はじめに

9月19日〜22日の4日間の期間でWantedly株式会社のサマーインターンに参加してきました。
Wantedly Visitを開発しているチームに配属されました。
そこで学んだことを残したいと思います。

f:id:snowman_mh:20170924163621p:plain

インターンの内容

Wantedlyインターンは実際のサービス開発に参加することができ、Wantedlyでの仕事を体験することができます。
インターンをしている目的が自分に合う企業を探していることが一番の僕にとっては良い環境でのインターンでした。
もちろん、2番目の目的である技術力をつけるというのも達成することができるインターンでもありました。

初日にインターン期間中に達成できそうなタスクをいくつか教えてもらって、その中から自分がやりたいタスクを選んで開発を始めるという感じでした。
僕は今回、ディープリンクからアプリに飛んできたときに意図した画面が表示されているかどうかを検証するUI Testを導入しました。

GitHubに残す文化

Wantedlyでは、GitHubに情報を残す文化が定着しています。
GitHubに口頭で話したことや実装の方針を残すことは様々な会社で実践されていると思いますし、インターンをしてそのようなところを見てきました。
しかし、Wantedlyではそれが本当に徹底的に行われていました。
僕もそれをマネして、実装を進めるに当たってリサーチしたことや決定した方針などをできるだけ残すようにしました。
その際、「これは残すべき内容か」「これで残す内容として過不足はないか」などを考えるのが難しかったですが、勉強になりました。
また、GitHubに残すことに集中しすぎて口頭でのコミュニケーションが減らないように気をつけないとと思いました。

新しい技術へのキャッチアップ

qiita.com

上の記事にまとめていますが、WWDCで発表されたXcode9からの新APIについて勉強していた経験がありました。
その知識が今回のタスクを進めるのに非常に役に立ちました。
「新しい技術にキャッチアップすること」は「選択肢の多様化」に繋がるので、実装の方針を考える際に良い選択ができる可能性が高くなります。
まぁなんか良いことあるやろ、と思って勉強していたことですが、今回それが役に立つことを体験できたので、これからも続けようと思いました。

OSSを読む

メンターの方に質問すると、RxSwiftなどのOSSのコードを参考にした解決策を提示してくれることが多くありました。
今まで分からないことを検索するときに英語を使うのは結構意識してやってきましたが、OSSのコードを参考にすることはありませんでした。
これから意識してやってみようと思いました。
しかし、同じような要件を実装しているコードをOSSから探すのは結構難しいと思うので、話題になったリポジトリや有名なライブラリのコードを日頃から読むことが大切だと思います。
大切だと思ってるだけで実際にできていませんが。。。
そういえば、先日のiOSDCでもOSSコードリーディングを勧めているLTがありましたね。

おわりに

正直Wantedlyインターンが決まったあとに悪い話をよく聞いていて少し心配はありましたが、まったく問題なく、むしろ楽しかったです。
同じチームでインターンをしていたのは僕を含めて2人と少なかったのもあるかもしれませんが、メンターの人の隣の机を使うことができて、質問もバンバンできました。

8月14日からはてなインターンが始まり、そこから休みなく色々な会社でのインターンに参加していましたが、やっと昨日から夏休みが始まりました。
夏休みは家でダラダラして過ごそうと思います。
明日から学校が始まります。

iOSDC 2017にタダで参加させていただいてきた

iOSDC 2017に行ってきました

9月16日、17日に開催された「iOSDC 2017」に参加してきましたので学んだことを残そうと思います。

f:id:snowman_mh:20170924132203j:plainf:id:snowman_mh:20170924132247j:plain

素晴らしいカンファレンスでした

まず初めに、素晴らしいカンファレンスを開催してくださったスタッフの皆さん、ありがとうございました!
僕はこのようなカンファレンスに参加したのは初めてでしたが、とても楽しめました。
スタッフの人がすべてのブログを読むと言っていたので、これも読んでくれているはずです。
来年も参加したいと思います!
スタッフ側で参加できたらいいなぁ

Wantedlyスカラシップスポンサー

今回のiOSDC 2017は、Wantedly株式会社が提供していたスカラシップスポンサー枠として参加させていただきました。
タイトルはなんか軽い感じで書いてしまいましたが、安くはないチケット代を負担していただけるのは学生としてとても嬉しいことで、とても感謝しております。
僕は東京に住んでいるので当てはまりませんでしたが、他の参加者は会場までの交通費や宿泊費なども援助されていたようです。

プレゼンについて学んだこと

いくつもセッションを聞いた中で、技術的な話の前に、プレゼンをするに当たって気をつけるべきと学んだことを残します。

理解してほしいことと理解しなくてもOKなことを明確にする

このような場でセッションをすると、限られた長くはない時間の中で、伝えたいことを伝えて理解してもらう必要があります。
そのためには、「この部分は雰囲気が分かれば良い」「ここはしっかり理解してほしい」「ここは名前だけ覚えておいてほしい」などを明確にすることが大事だと思いました。
今聞いている部分はどのあたりまでの理解度であれば問題ないのかがオーディエンスにオープンになっていると聞きやすいと思いました。

コードは最小限に、大きな文字で見やすく

技術カンファレンスではコードをスライドに含めることは多いと思います。
その際に、必要なコードのみ、必要なタイミングでのみ、最適なサイズで見せることが大切だと思いました。
コードをスライドに出すと、オーディエンスはそれを読み始めるので、読む必要がある分だけ出しながら話すのがベストです。
また、先程の「どのくらい理解してほしいか明確にする」に共通している部分はありますが、理解してほしいコードのみを出しながら、コードをどれくらい理解してほしいかを示しながら話すとオーディエンスは聞きやすいと思いました。

技術的な学び

本当に素晴らしい内容のセッションばかりでした。
qiita.com
このような素晴らしいまとめ記事がQiitaに上がっているので、内容についてはそちらを参照すると良いと思います。

ここでは、数あったセッションの中から、特に「なるほど勉強になった!」と個人的に思ったことを一言で紹介していきたいと思います。

「Build high performance and maintainable UI library」より
  • 「アプリと違ってライブラリは様々な状況で使用されることを想定する必要がある」
  • 「可読性とパフォーマンスのようなトレードオフを知る、優秀なエンジニアほどその見極めができる」
Xcode Source Editor Extensionの世界」より
「結婚式を支えた技術 Firebaseを活用したサーバレスiOSアプリケーション開発」より
  • 「やらないことを決めた」
  • 「チームメンバーに無力感を与えない」
「Human Interface Guidelinesから滲み出る限界感を考える」より
  • 「HIGが作った指針を崩さない程度にHIGを逸脱するオリジナルを加えていくと魅力的なデザインになる」
  • AppleがどのようにHIGを逸脱しているかを参考にする」

おわりに

インターンでお世話になった方や、Qiitaやブログなどでアイコンだけ見たことある人に会えたりしました。
知っている人が結構いて、自分もこの世界で勉強できてるのかなと思えてちょっと嬉しかったです。
これからも頑張っていこうと思いました。

楽天サマーインターンで優勝してきた

目次

はじめに

9/11〜9/15の5日間で開催された楽天株式会社のサマーインターン、「二子玉川 夏の陣 2017」に参加してきました。
そこで学んだことをまとめたいと思います。

corp.rakuten.co.jp

自己紹介

インターンの内容

楽天O-netや楽天競馬などを開発しているOSPDという名前の部署で、平日5日間を利用して行われる短期インターンでした。
高齢者と若者をつなげるWebアプリ」というテーマでチームごとにプロダクトを作り、最後にプレゼンをして順位を決めるという形式でした。
4人のチームにリードエンジニアレベルのメンターの方が3人ついてくださり、サービス企画から実装、プレゼンまでずっとフィードバックを与え続けていただけるという贅沢な環境でした。
サービス開発の醍醐味を感じられたと思います。
参加人数は学生12人で、4人1チームとして3チームに別れて競う形式でした。

サービス企画

まずは最初の1日と2日目の夕方くらいまでをサービス企画の時間に使いました。
いつも使わない脳を使ってとても疲れましたが、得るものも多かったです。
チームメンバーでアイデアをまとめ、メンターの方々にフィードバックをもらってブラッシュアップしました。
そして、2日目の午前にOSPDのプロデューサー陣にプレゼン形式で発表し、またフィードバックをもらってブラッシュアップしました。

コンセンサスを取ることの難しさと重要性

4人のチームで1日半という短期間でどのようなサービスを作るかを考えるには、「コンセンサス」を取ることがとても大事になってきます。

サービス企画に慣れていなかったので、アイデアを固めるのはとても難しかったですが、それよりも難しかったのは、「細かい部分でみんなの意見を一致させる」ことです。
大枠の意見は一致していても、細かい部分まで確認していくと、「あれ、そうやったっけ?」とメンバー同士が疑問を持ち合うことは珍しくなかったです。
とことんチームで話して細かい部分まで一致させていく必要がありました。
そのあたりをどこまで確認し、一致させ、コンセンサスをチームで取ることの重要性とその難しさを学びました。

煮詰まったときの対応

イデアが煮詰まったときには「第三者の意見を聞く」のと「課題から見つめ直す」というのが大事だな、と学びました。
言葉にすると当たり前に聞こえますが、これが意外と難しく、そして大事でした。
第三者の意見を聞く場合は、「今まで自分たちがどのように考えて、どのような結論に至っているが、どのような問題があるか」を言葉にして説明する必要があります。
さらに、課題を見つめ直し、その課題を解決するようなアプローチを考えることが一番良いサービス企画のやり方です。

チーム開発

サービス企画が終了すると、2日目の夕方から4日目の午前中までの期間で実装に落とし込みました。
チーム開発の経験はありましたが、0からチーム開発をスタートした経験はあまりなかったので良い経験になりました。

0からのチーム開発

4人チームのうち僕を含めた2人はSwiftでクライアントサイドを開発し、他の2人はサーバサイドをPHPで開発しました。
チーム開発自体は初めての経験ではありませんでしたが、学生だけで0からチーム開発を「始める」経験は初めてでした。

.gitignoreの設定などのiOS開発の一般的な知識を共有せずに開発を始めてしまったため、コンフリクトが頻発してしまったりしました。
自分だけが理解していても、チームメンバーが知らなかったり、いくつかのスタイルがあったりするので、開発を開始する前にコーディングスタイルや.gitignoreについて共有・確認するべきでした。

「妥協する」ことの意味

「妥協する」とは、「目的を達成するために手段を代替する」という意味で、目的を変えてしまうものは妥協ではありません。
妥協したために最初に設定した目的が達成されない場合、それは妥協ではありません。
妥協することの意味を今まで理解しているようで理解していなかったと思いました。

短い実装期間であったため、時間の都合で実装できない部分がいくつかありました。
そのとき、妥協して実装しない部分を決めることは珍しくありませんでした。
しかし、そのとき、本当の意味での妥協をして、期間内に収まるように調整することが大切だと学びました。

プレゼンテーションと結果発表

優勝した

3チームそれぞれが成果をプレゼンする発表会にOSPDの偉い人たちが50人くらい参加してくださいました。
「アイデア・新規性」、「プレゼン力」、「技術力」、「テーマに合っているか」、「デモ完成度」の5軸評価を用いて投票で順位が決められました。

僕たちのチームは優勝することができました🎉
本当に優秀なチームメンバーに恵まれました。

優勝賞品として最近楽天が提携したバルセロナの公式ユニフォームをいただきました!
(めっちゃ高いらしい)

f:id:snowman_mh:20170918163239j:plain

残念だったこと

今回のインターンシップはとても得るものが多く、充実した5日間を過ごすことができました。
しかし、僕がこの夏にインターンに参加しているのは「自分の成長」のためもありますが、「仕事の進め方が自分に合う企業を探す」という目的もあります。

今回のインターンでは社員の方と一緒に働くことはできなかったため、楽天のエンジニアの方がどのような開発環境で、どのような開発フローで仕事をしているのかを体験できませんでした。
社員の方とコミュニケーションを取ることはたくさんでき、一緒に働きたいと思ったので、機会があれば長期インターンに参加できたらなぁと思いました。

おわりに

楽天バルセロナと提携をしたあと、バルセロナの主要選手が楽天のオフィスに遊びにきたらしいです。

さらに最近、NBAのチーム「Golden State Warriors」と提携しました!!!
最近NBAは見れていませんが、僕の大好きなチームです。
楽天の人事の人にウォーリアーズが楽天オフィスに来るときは絶対呼んでくださいと伝えたので、カリーとハイタッチできる未来も遠くないはずです。
とても楽しみです。