勉強 その他

Web系インターンに行くまでにやったこと

プログラミング

具体的に何をしたか大学1年生から振り返ったブログを書きました->こちら

こんばんは、先日サマーインターン選考記録というブログを書いたんですが本当に結果っていうだけであまり参考になる部分は無かったと思います。なので今回は僕が大学に入ってから何をしたのか時系列でまとめたいと思います(これが役に立つのかも不明ですが)もちろん自分がやってきたことが正解だというつもりはありません。実際インターン選考結果も全てが満足いく結果だったわけではないです

*Amazonのリンク貼ってますが収益化してるわけではないです。ただの紹介です

プロフィール

関西の私大情報系学部の3回生(22卒)です。

所属サークルは映像系団体です。(厳密にはサークルでは無いのですが便宜上サークルとします)アルバイトは個別指導塾の講師をしています。

高校までは公立で普通科、剣道部とプログラミングとはほぼ関係無かったです。マイクラで色々やるためにJavaの本とか書いましたがほとんど読み切ることなく挫折しました。でもポートとか環境変数みたいな概念はマイクラで学べました。

物作りが好きだった?

どちらかといえば「いいえ」です。嫌いでは無いですが「苦手」でした。技術・美術は小学校の頃から不得意で10段階で4とかの評価でした。今はやれば意外にできることを知ったので結構好きです。

受験〜大学まで

ふつーーに受験勉強をしました。この時から情報系に行くことは決めてました。数学が苦手だったので数学ばっかりやってました…この時に数学やってて良かったなと最近思います。数学に加えて物理が苦手すぎたので初めから化学選択の私大志望でした。

第一志望は落ちたんですがまぁ受かったので2月中旬くらいから暇になります。せっかく情報系に行くんだし多少は勉強するか〜ということで基本情報技術者試験の勉強をしました。キタミ式の参考書過去問を2周くらいしました。

大学1年生

4月

晴れて大学生になることができ、サークル探しをします。プログラミング系のサークルがなさそうだった(ゲームを作るのはあった)ので周りの友達も入るからという理由で映像系の団体に入りました。100人くらいいて大きめな団体だと思います。

4月の基本情報技術者試験で無事合格できました。また、TOEIC(IP)で640?点くらい取れて結構良いじゃんってなりました。

5月〜7月

サークルで活動しつつ学校の勉強とバイトで手一杯な感じでした。漠然とスキルを高めたいと思っていたんですが何をすれば良いか分からず、なぜか中小企業診断士の勉強をしていました。サークルの同期・先輩が「デザインできるようになりたい〜とか編集技術あげたい〜」みたいな感じでやる気ある人が多く、自分自身も感化されていました。

また、TOEIC(IP)の点数が少し伸びて720?くらいになりました

8月〜9月

中小企業診断士の試験には無事落ち、次は秋に向けて応用情報技術者試験の勉強を始めました。同じくキタミ式と過去問を2周しました。

夏休みに入りバイトもほぼ毎日行って、サークルでも頻繁に活動がある状況でした。大学入学と同時にデスクトップPCを買ったので3D系のこともやりたいと思っていました。なので時間があればUnityを触ったりして簡単なゲームを作ったりしました。それに加えてHTML&CSSの基礎を「HTML5&CSS3標準デザイン講座」という本で学びました。情報系学部なら「HTMLとCSSくらいはマナー」みたいな意識を謎に持ってました。

Unityを触ってみたものの自分には美的センスが絶望的にない&3次元を理解(表現)するのも苦手なのでUnityの道に進むことはないだろうなぁと思ったりしていました。

10月〜12月

応用情報技術者試験に無事合格しました。

AfterEffectという映像編集ソフトで色々やるのにハマってました。この頃からアニメーションとかデザインに興味を持ち出し、絶望的なところから下手ってくらいになった気がします(?)サークルも結構忙しく学校の勉強ぐらいしかしてなかった気がします。授業ではC言語の実習を行なっていました。

1月

本来ならテスト期間で忙しいんですが謎の余裕を持っていました。無事応用情報技術者試験に合格したはずなのですが、自分一人では静的なWebページすら完成させる自信はありません。これはやばいぞってことになり、有用性がありそうでHTML&CSS+c言語の知識でできそうな物を探しました。その結果このブログができました。WordPressのPHP部分はほぼコピペで作成し、デザイン部分のみ色々やった感じです。ただこの時点ではサーバーを持っていないので公開していません。一応gitも使いました。全部 master pushですが…

この辺りからほぼ毎日プログラミングに関することをやり始めます。

このタイミングで、所属している団体の技術(カメラや編集を行う)のチーフになりました。

TOEIC(IP)で875点取れてテンション爆上げしました。1年間TOEICの過去問をとく授業があったおかげだと思います。僕はシス単推しです。

2月〜3月

ブログを完成させたことによりプログラミングのモチベが急上昇します。来年度からJavaの実習が始まるため「すっきりわかるJava入門シリーズ」を全て購入し読みました。それが終わった後「リーダブルコード」や「オブジェクト指向でなぜ作るのか」「明解C言語」を読みました。それと並行してJavaFxで簡単なGUIアプリを作ったりしました。でもJavaFxを触るのは古いデザインUIの組み合わせみたいであんまり楽しくなかったです。

この時は「エンジニア」になるか「一般企業でITにちょっと詳しい人」になるか「SE」になるか迷っていました。どちらかといえばSE寄りでした。プログラマという立ち位置がわかっていませんでしたね…下請けのようなイメージを抱いていました。

このくらいの時期にTwitterを始めた気がします。

大学2回生

4月〜5月

5月末にサークルで一番大きいイベントがあるためその準備に勤しみました。それと同時に新1回生が入って来るためその準備や対応を行い、かなり忙しかった記憶があります。

Javaがある程度できるようになったので何か作りたい!!ということで色々ぐぐった結果Springというwebのフレームワークがあるらしい。web開発面白そうじゃん。ということで「spring解体新書」という本を読み始めました。(内容は良いんだけど電子媒体だと読みにくいので紙版出ないかなぁ)

タイポグリセミアという現象(?)をネットで見たことがあり、クイズにしたら面白そうだと前に思っていたので、その後タイポグリセミアクイズという今見るとひどいデザイン&コードなサービスを作り始めます。サーバーサイドが何かもわからず、テンプレートエンジンもしらない、DIもわからない、mavenも知らない、DBも使ったことない、認証もわからない状態でやっていたのでかなりしんどかったです。でもエラーが出ても色々調べたりするのが思ったより苦ではなく解決した際の喜びが大きかったのでプログラミングに向いているのかなって思ったりしました。

6月

タイポグリセミアクイズとブログを公開したいなと思い始めました。その頃はクラウドなんて単語を知らなかったのでレンタルサーバーかVPSを探しました。勉強したいというのが一番だったので自由度の高いVPSでかつ、お手頃価格だったさくらのVPSさんを選びました。

言ってしまえばデプロイするだけなんですが、サーバーについて何も知らないのでかなり苦労しました。もちろん手動でjarファイルをscpしてコマンドで実行です。この講座が本当にわかりやすくて良かったです。

Apache・Nginxの設定とかMySQL・Firewall・DNSなどわからないことだらけでしたがなんとかデプロイできました。Google先生さまさまです。

後半はポートフォリオを作成していました。雰囲気でJavascriptを書きながらQiitaにも投稿しました。こちらはGithubPagesを用いて公開しました。

7月

サマーインターンというものの情報をTLで知りました。参加記録ブログを見たりしてめっちゃ楽しそう!!と思いながら色々申し込みました。まともに志望動機も書かなかったせいで普通に書類選考落ちしまくりました。一社スクール型のところは書類選考通ったのですが技術スタック(Railsだったかな?)に興味が薄かったので辞退しました。

学校はテスト期間ですがVue.jsを触り始めました。前にルーレットをしたい!って思った時にアプリはあってもweb上で簡単に使える奴が無かったので作ろうと思いMRouletteができました。公式チュートリアルでスムーズに理解できたのですぐ制作に取り掛かりました。2週間くらいで形にできたので良いスピード感だった気がします。

すっきりわかるシリーズのSQLも購入し、学習しました。これすごく良いです。

8~9月

夏休みに何をしたかは前にまとめました。インターンに全く通らなかったこともあり、実力不足を痛感し基礎力をもっとつけたいと思い始めます。それに加えインターンに言った先輩のgithubリポジトリやtwitter,ブログをみてどんなことが必要なのかを学んでいました。特にp1assさんの「DeNAのエンジニアサマーインターンで優勝してきた」という記事内の

ここで後輩に向けてのアドバイスを少ししておくと、サーバサイドをやりたいなら

・何かしらの言語でのAPIを実装

・DB(特にMySQL)

・Docker

・クラウド(AWS or GCP)

・GitHub

DeNAのエンジニアサマーインターンで優勝してきた

というものを見て勉強方針を立てていました。

このころから競技プログラミング(以下:競プロ)に手を出し始めます。主にAtcoderです。

Atcoderとは

日本国内最大級の競技プログラミングサイトです。最初はA問題、B問題に時間をかけて解くことができ、C問題は全然解けない。というレベル感でした。コンテストが土日に開催されることが多いのですがバイトが入っており頻繁には参加できませんでした。Atcoder Problemsという過去問で練習できるサイトがあり、こちらをメインで使っていました。

Leetcodeにも手を出してみました。

Leetcodeとは

コーディング面接対策のサイトです。Atcoderは数学的考察が必要なものが多いのですがこちらはComputer Scienceで必要な知識を問う問題が多いです。夏休みには少し手を出しただけでした。Googleに行く人は400問くらい解くらしいです。

競プロに手を出したこともありJavaでソート系のアルゴリズムを実装してみたりしました。

夏休みに読んだ書籍

マスタリングTCP/IP世界で闘うプログラミング力を鍛える本Vue.js入門Webを支える技術メモの魔力を読みました。世界で闘うプログラミング力を鍛える本は今だに半分くらいまでしか進められていません…これ問題解きながらやるの一生かかりそう()

どこかのQiitaの記事で初心者を脱するにはブラックジャックを作れば良いというのをみてブラックジャックをJavaで実装してみました。4時間くらいで実装できて実力が伸びてきた気がしました。

また、STOMPを用いてspringbootでwebsocketの通信をしたりしました。何かのプロダクトとして公開するほどではなくいわゆる技術の素振り程度ですね。

この夏休み辺りから本格的に「ソフトウェアエンジニア」として就職したいと思っていました。先輩がインターンに行ってるブログを読んだ影響が大きかったと思います。

そういえばサークルではここからサブリーダーになりました。100人規模の団体で意思決定をする経験は貴重だと思い、色々考えて取り組んでいます。9月はサークルで映画っぽいものを作成したりもしました。

10月

2回生秋になり大学でも情報系っぽい授業が増え始めました。DBについてや構造化プログラミング・オブジェクト指向について、情報理論(符号化)などです。応用情報技術者試験を取っていたこともあり復習的な面もありましたがやっていて楽しかったです。

学校の授業で「解説はしないがとある機械学習のプログラムを出せば単位が出る」ものがあり(実習ではない)機械学習を全くしたことが無かったんですが取り組みました。この辺りでなんとなく「頑張れば大体は実装できる」みたいな自信を持っていました。

継続的にAtcoderの問題は解いていましたが、特にLeetcodeに熱が入りました。「コーディング面接対策のために解きたいLeetCode 60問」を解いていました。これによりそこそこアルゴリズムについても自信が出始めました

このくらいでついにAtcoder茶色になります。ブログにもまとめました。

書籍としてはノンデザイナーズ・デザインブックjavaで学ぶデザインパターンを読みました。

前々から「2週間のコンタクトをいつ使い始めたか覚えてない!!」という悩みが自分にあり、決まった曜日に行わなくても良い & 繰り返すTodoを管理する「DOUTINE」というiosアプリを作り始めます。iosアプリ全く未経験とはいえまぁまぁ時間がかかりました。結局秋学期全て使い、1月ごろの完成になります。swiftの勉強には絶対に挫折しない iPhoneアプリ開発「超」入門 という本を使いました。

MixleapというYahooさんが開催している技術系イベントにも参加し、すげーってなっていました(小並感)。

研究室を選ぶ必要があったのですが、せっかくなら応用だけではなく基礎となるような知識をつけたい&セキュリティについてしっかり学びたいと思いセキュリティの研究室を選びました。

11月

継続して機械学習のプログラムとDOUTINEの開発・Leetcodeの精進を行っていました。サークルで発表する映像作品の作成もしました。

github実践入門セキュリティコンテストチャレンジブックなどを読みました。

12月

相変わらずDOUTINEの開発とLeetcodeを解いていました。

強い先輩は冬からインターンに行っている!!ということで冬と春インターンを探したのですがあんまり開催されませんでした…悲しい

3社面接まで行って、1つは「21卒の人優先したいのでごめんなさい」と言われてしまいました。1つは普通に人事面接落ちをし、あと1つ(チームラボさん)に合格をいただくことができました。

Goを使うインターンの情報が上がってきたのもありこの辺でGoに触れ始めます。A Tour of goをやったくらいですが…また、Javascriptについて雰囲気で書いていたのでjavascript本格入門を読み勉強しました。

そしてこの辺で英会話もできた方が良いよね〜ってことで英会話を始めます。おすすめは NativeCampです。好きなタイミングで1日何回でもできるのが良かったです。フィリピンの人を選ぶとすごく楽しくやりやすかったです。

正直この頃はGoogleとかの入社試験も受けれるなら受けてみたい!みたいな気持ちもあり そっち向けの対策に興味がありました。

1月

このころもAtcoderやLeetcodeを中心に解いていました。

授業課題でPhina.jsを使ってゲームを作ったりしてました。

Goプログラミング実践入門を読みました。レポートやインターンのテスト・面接・学校のテストなどがあったのであまり進捗出てません。

2月

初めてインターンに参加しました!その時の様子はこちらの記事にあります。お給料をもらってプログラミングするのは初めてでした。とにかく給料以上の成果を出すぞ!という気持ちが強かったです。

技術スタックはReact.js+playframework(java)でReact触ったことなかったけど結果が出せた&メンターの方に結構褒められたのもあって自信が得られました。

gitも学べて英語力もついてお得!って気持ちでProgit(英語版)を読み始めました。

また、2月後半からはHackUにサークルメンバーと共に参加しました。プログラミング経験があるのは僕だけ(みんな0ってわけではないけど)だったので技術的なところは全てやりました。AR_MenkoというAr.jsを使った作品を作成しました。サーバーサイドはSpring Bootで書き、AWS(ec2,RDS)などに初めて触れました。更にインターン先でJenkinsのデプロイボタンを押した(だけ)というのもありJenkinsでCD環境を整えたりもしました。正直ハッカソンにしては整えすぎな気もします。

このくらいの時期からコード以外の部分も学習する余裕が出始めます。

3月

リクルートさんのスピードハッカソンに参加できました。正直テストの時点で落ちたと思っていたのでかなり嬉しかったです。チームメンバーのおかげで優勝もできました。その時のブログはこちらです。ここでフロントツヨツヨな人たちと出会ったことでフロントもサーバも面白いし何を深めていこうか迷い始めます。

中旬くらいから逆求人の情報が公開され始めます。

逆求人とは

企業の方と1対1で30分程度お話しできるイベントです。企業の説明を聞くだけではなく自分のことを知ってもらうとても良い機会です。ここで選考スキップのお誘いなどがいただけたりします。強い先輩エンジニアはみんな参加している気がしました(偏見)自分は サポーターズさんキャリアセレクトさんのイベントに参加させていただきました。

夏インターンの募集も始まり、コーディングテストや面接を受け始めます。正直今までの経験から少し自信が出始めていたのですが普通に落ちており、何がいけないんだろうと悩みました。多分得意な技術領域がなく、今後どうなりたいかというビジョンが固まっていなかったからだと思います。

所属団体で5月に行われるイベントに向けてGoでサーバーサイドを書いてスタンプラリー的なのを作ろうとしたんですがイベントが中止になり中途半端なところで終わりました。Gin,Gorm,GorpやDockerの使い方とかを学びました。

研究室の活動が始まり、ネットワークの基礎について学びました。

3年生

4月

逆求人に参加しました。その後いろんな企業の方と個別面談を組んでいただくことができ、インターン選考も本格的になっていきました。ほぼ毎日どこかの企業さんと面接・面談を行っていました。基本的にどの企業さんにも褒められたのは「なぜ作ったのか・作った反省・改善余地」が記載されていて背景がわかる。ということでした。技術は手段でありどんな技術を使ったからすごいっていうわけではないんだと改めて思いました。

もっと実務に近いコードを書く必要があると思い始め、この頃から環境をDockerで用意したりテストコードを書いたりし始めます。更にSQLを復習したり正規表現について学んだりしました。正規表現はこちらの記事に大変お世話になりました。また、けんちょんさんの記事をみてアルゴリズムの勉強をしつつこの記事で実際にAtcoderの問題を解いていました。

授業で機械学習の実習が始まるのでPythonの勉強を軽くしたり、インターン課題にScalaで開発する必要があったので学んだりしてました。こちらの記事にお世話になりました。あとはgoogle analyticsをみに行くのがめんどくさかったので毎日lineに表示件数を通知してくれるBOTを作ったりしました。

研究室のメンバーで情報危機管理コンテストに参加することになり、その勉強や予選などを行なっていました。情報危機管理コンテストについてはこちらの記事を見てください。DDOSやXSS・SQLインジェクション・Firewallの設定などについてかなり調べて勉強しました。実際にDDOSを行い防御する練習とかもやって楽しかったです。

研究室の先輩がネットワークつよつよだったのでそちらのモチベが上がってきました。

そういえばちょっとだけ Hack the boxを解いたりしてました。楽しかったんですが学べる技術についての優先度が自分の中で低いのでまた時間ができたらやりたいです。

PaizaでSランクをとったりしてました。PaizaはAtcoderなどと比べて簡単なのでSも余裕!みたいなブログやツイートをよく見ますが最近は簡単なSランクは外されており難易度は上がっていると思います。

ちなみに英会話は毎回やるぞ!って気持ちにならないと始められなくてやめてしまいました。

5月

相変わらずAtcoderを解くのと危機管理コンテストの勉強をしていました。また、インターンでRailsを求められることが多かったのでRailsチュートリアルをやり始めます。

今までの経験から自分は技術を学ぶのに「本を読む」->「何か作る」というプロセスが重要だと思いました。何か作る際にエラーが発生し、それを解決するためにググりまくるのが大事だと感じていました。そのためRailsでも何か作ろうと思いRailsでましの質問箱を作りました。サーバーをGCPで準備しました。Cloud monitoringで簡単な監視とかもやってみました。

また、具体的に研究テーマが確定し先輩とともに研究を始めます。先行研究の論文を読みつつシステム開発し始めました。Goで書くことができたので嬉しかったです。Dockerのネットワーク的ななんちゃらをしています。

この辺りでやっぱりサーバーサイドが楽しいのでサーバーサイドを深めようと思いました。

6月

CyberAgentさんのサーバーサイドチューニングインターンに参加しました。ブログはこちらです。このためにISUCON参加者のブログを読み漁り、実際にこのブログを運用しているサーバーでチューニングしたりしました。「計測」->「改善」というプロセスが当たり前のようで当たり前にできていないことを痛感しました。redisとかSQLのN+1問題についてちょっとだけ知りました。

Pythonではじめる機械学習ゼロから作るDeepLearningを読んで機械学習のお気持ちが少しわかりました。

Kubernatesの素振りをしました。あとは研究のために色々調べたり実装したりしてiptablesとかの知識がつきました。サーバー側も大体どんな設定があるのかがわかり始めてきました。

この辺でAtcoder緑にタッチします(その後茶色に落ちます)

ミラーレス一眼のNikon Z50を買った。カメラはいいぞ。

7月

サマーインターン前にツヨツヨになっちゃおうの会を主催しました。そのための準備とかを色々してました。詳しくは こちら

上記LT会でREST APIについてLTするためRESTの論文読んだりと勉強したりしました。

世間的にオンラインの勉強会も増え、Goのものを中心に色々参加してみました。ちなみにイベントを探すにはconnpassを使っています。

また、春のインターンでReactを使ったのですがフロントに自信がなさすぎるのでReact+Typescriptでフロントを作ってGoでサーバーサイドを書く練習をしています。良いプロダクト案がなかったのでとりあえずTODOアプリを作っています。Dockerで環境を準備しつつホットリロードされるようにしたりしてます。ましの質問箱もテストをRspecで書いたりしました。

テストを意識するとコードの書き方もまた変わってきて難しいけど面白いなって気持ちになってきています。

まとめ

継続的にやってたことの積み上げは以下な感じです

  • githubのリポジトリは40個くらい
  • Atcoderは400問くらい、Leetcodeは105問解いた
  • 本は30冊くらい読んだ(教科書とか入れるともうちょいあるけど)

もっとこうすればよかった or これからやりたい

  • OSS貢献
  • 技術の深掘り(得意な技術を身に着ける)
  • すごく注力した自信のあるプロジェクト・作品を1つ作る
  • プログラミング系のアルバイト or 長期インターンをする
  • もっとLT登壇する
  • チームでの開発

この辺りが弱かったかなぁという気はしています。これから頑張りたいです。サーバーサイドに興味があるのでそれ系の技術を学んでいきたい。

なんか全般的な話

正直プログラミング学習において、「崖から突き落として上がってきた人だけできる」という面はあると思います。どうしても自分で頑張れないと教えられただけではできるようになりません。その上で意識した方が良さそうなことを述べてみます。(自分も全部できてるわけじゃなく、意識したいなという自戒を込めてます)

目的を持つ

何がしたいのか。「〇〇を学びたい」なのか「〇〇という問題を解決したい」なのかなんのためにやっているのかを考えるのは大事だと思います。

仮説を立てる

なんでこのエラーが出るのか、うまくいかないのか。とりあえずエラー文をググって解決すれば良いのですがうまくいかないことも多いです。「おそらくこの関数がおかしい」->「呼び出されてない?実装がおかしい?」など仮説を立てて検証していくプロセスが踏めていれば良いと思います。もちろん早いうちにデバッガーの使い方を知ってプログラムの流れを追うのも大切です。

意外にもエラーが出た瞬間にエラー文を読まずに放棄する人は多いです。エラー文が読める人はえらい!

学生エンジニアをフォローする

近い年齢で頑張っている人や結果を出している人を見るのは非常に刺激になります。もちろん周りがすごすぎて辛くなる時もありますが、それ以上にこんなことができるのか、そんなことを考えられているのかとワクワクします。周りが頑張ってると自分も頑張らないといけない気持ちになれますし、何か困った時に助け合えます。ということでましをフォローしませんか?

自分の技術の学び方

これはアドバイスじゃなくて僕はこうしてるっていうものです。大雑把にこういうステップを踏んでいます。

  • 入門書を読んでその言語のコードをみた時に大体何をしているかわかるようになる。
  • 自分で作品を作ってみる。
  • エラーが出たらググるの繰り返し。

初心者あるあるだと思うんですが僕はHTML&CSS完全理解しないとwebページなんて作れない!って思ってました。でもwebページ作ったこともないのに完全に理解できるはずないんですよね。作りながら学ぶ方が良いと思います。でもこれはチュートリアルに沿ってアプリを開発するって話じゃなくて自分で考えたものを作った方が良いと思います。答えがない方が色々考え・調べるので力がつく気がします。

もっと早く知りたかったこと

mac標準のターミナルじゃなくてiterm2ってのが便利ですよ!!

こんな感じでターミナル分割がすぐできたりします。

標準のbashも良いけどfish便利よ!

コマンドの候補を薄く表示してくれます!!便利!!

ただ、ネットで拾ってきたよくわからないシェル芸をコピペしたら大体bash用なので動かなくなります。ちゃんと理解して使える人なら問題ないと思います。僕はシェル芸使いたい時だけbashに戻してます。

homebrew入れようね

大体のものはhomebrewでインストールできます。バージョン管理とかもhomebrewでできるようになるので最高です。

バージョン管理複雑じゃない?asdf便利

バージョン管理ツールってpyenvとかgoenvとか色々言語ごとにあるじゃないですか。そうじゃなくて複数言語をまとめて管理してくれるやつです。すすめときながら僕のmacにはrbenvやasdfが混在しています…

curlするのめんどくさくない? talend api tester 使おう

curlより圧倒的にわかりやすくhttpリクエストを投げれます。

レスポンシブ対応の確認めんどくさい… Responsive Viewerを使おう

複数デバイスでの表示を一気に確認できます。

さいごに

まぁなんか長々と色々書いたんですけど少しでも誰かの役に立つような内容があれば嬉しいです。雑談も技術の話も好きなんで気軽に絡んでください

Twitter : @masibw
Github: masibw