最近読んでいる本とプレッシャーについて

夏の間は体調を崩して結構ぐったりしていましたが、余裕がある時にこれらの本を読み進めていました。

Real World HTTP

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

前々回のエントリで、「フロントエンドより下の方についてもっと勉強して下地をしっかり作りたい」みたいなことを言っていたんですが、その下地作りのためにまだ読み続けています。いや、正確には読み進めていません。3章の途中でやっぱりGoの基本文法がわからなくなって書いていてあまり心地よくなかった & ひたすら文章を読み続けるのがどうにも疲れるという理由で他のことに浮気してしまいました。

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

Goの基本文法を調べていくうちに「やっぱり何か作り始めた方がすぐ覚えられて身につくのでは?」→「Web上のチュートリアルだと内容が古くて不安だなあ」→「せや、オライリー本を読んで集中して勉強したろ!」と考えが変遷しどんどん脱線していきました。大体のことは本のコードを写経 + 公式のリファレンスを見ればわかるし、頭にも入ってきやすい内容なので面白い。まだ2章の途中。

オブジェクト指向設計実践ガイド

最近 Qiita の記事で何%まで理解できるのか話題ですけど僕は正直全くわかっていないのでこれからの仕事をスムーズに進められるよう会社の人から借りました。寝る前に枕元に置いておいてちびちび読み進めています。3章まで読んだ。

プレッシャーについて

夏の間は本当に体調が悪くて、うまく睡眠がとれないせいで日中の勤務時間中も頭がちゃんと回らない状態が続いていました。そんな時でもTwitterのタイムラインを眺めていると技術情報がひっきりなしに飛び交っているので、あれもこれも目を通さなきゃ、と思って軽くパニクっていました。体調を整えればいいものを、自分の力量への不安から帰ってからも無理に勉強を進めようとして頭が休まらない→眠れない→仕事があまり捗らない という負のスパイラルに陥り、見えないプレッシャーと戦う日々でした。 プライベートでも何かと落ち込むことが多くて、これはまあ良くない、涼しくなるまで一旦休戦だと思い、帰ったらとにかく体を休めることに専念し、まず目の前にある自分の仕事を着々と進める方向に姿勢を転換することで、夏が過ぎ、ようやく心の落ち着きが戻ってきた気がします。 でも未だには「いったい自分の力量はどれくらいなのか」「何をやれば周りに追いつけるのか」という不安が煮こごりのように残っていて、半ば意識的に考えを逸らす方向で休息をとっています。どこが出来ていてどこがダメなのか、冷静にジャッジしてくれるメンターのような人と社外で会えれば自分の課題が曖昧じゃなくなって安心できるのかもしれないなあ。

自分への不信感と見えないプレッシャーから逃げるためのスペースを今もたらしてくれているのがProgate。 prog-8.com

もともとWebエンジニアを目指していた頃から RailsJava の基礎を勉強するために使っていて、最近業務で Laravel を使うことになったので PHP の基礎をおさらいするためにまた有料会員になりました。大きくて見やすいスライドとかわいいキャラクター(にんじゃわんこ最高!)が学習内容について解説してくれるうえ、エディタ上に穴埋め形式で回答のコードを書いていくので学習効率がたいへん高く愛好しています。 仕事が終わって帰宅した後、参考書だと重くて開けないんだけどProgateなら疲れた頭でも無理なく勉強を進められるというか。問題に正解すればゲームのように自分の LV が上がるので、「おお、なんだ俺もやればできんじゃん」というかすかな自信をもたらしてくれるのがいい。

学生の頃のように無尽蔵に体力があるわけではないので、社会人と生活をやりながら勉強を進めるって本当に辛いな、とここ数ヶ月で痛感しました。現職に就いてから半年ぐらいは無敵状態のように何でも前のめりにやれる日々が続いていたのですが、だんだん効力を失って、落ち込んだり無力さに苛まれるようになってしまい、そういう時にどうやって自分を建て直せばいいのか右往左往していました。 心身の病気じゃない場合は、自分でこなせる程度の、目の前にある課題を1つずつ片付けて毎日の生活をやっていくしかないんですよね。目に見える結果を求めて無理に詰め込もうとしても自滅するだけ。他の人が10ずつできることを自分が1しかできないとしても、今はその「1」を毎日積み重ねていくだけ。そのうちに力がついて2とか3ずつ進められるようになったり、積み重ねた結果が追い風になって7くらい進めるようになるかもしれない。そしてその効果もまた切れて、また1とか0.1しか進めなくなったりして、でも積み重ねた結果がまた自分を後押ししてくれて…という繰り返しをこれからずっとやっていくんだろうなあ。

「Webプログラミングが面白いほどわかる本」を読んだので感想を書いた

前回のエントリで紹介した本を2週間くらい前に読み終えたんだけど、感想をどうまとめたらいいのかよくわからなかったのでブログに書くのを放置してしまっていた。というわけでお盆休みが終わる前にまとめておこうと思います。

「Webプログラミングが面白いほどわかる本」を出版させてもらいました|Soichiro Yoshimura|note

所感

著者のsifueさんのnoteにもあるように、これはN予備校のプログラミングコースの一部を抜粋してまとめられている本で、主な読者層はプログラミング経験がほとんどない高校生を想定しているっぽい。それなら自分でも環境をセットしてさくさく読めるだろ〜、と侮っていたけど、Mac / Win の環境の違いを吸収するために Vagrant + Virtual Box で Ubuntu仮想マシンとしてブートさせるところから始めるように書かれていて思わず唸った。「Mac だからプログラミングに関するセットアップあれこれは今更やらんでもよくない?と」いう自分の気の緩みに水をぶっかけられて引き締まるような思いになった。そのあとの章でもあらゆる Linux コマンドや tmux の使い方のレクチャーが懇切丁寧に繰り広げられててとても勉強になったし「オレ、Linux について何も知らんでプログラミングしてたんだな…」と気付かされた。

この本の一番いいところ

各章の内容について逐一感想を書いているとキリがないので、絞って書く。 特定のプログラミング言語の入門としてではなく、「Web プログラミングに必要とされるツールや概念」の解説に重点を置かれて書かれているのがよかった。RubyJavaScript で「Hello, World!」とブラウザやコンソールに出力させるだけなら、書籍を読んで環境構築をするより今では Progate などのプログラミング教育サービスが充実しているので、それらを利用してブラウザ上のエディタでコードを書くほうが早い。 この本ではプログラミング体験の第一歩を「Hello World」と表示させる事に設定していない。何かしらのサンプルプログラムを作り上げる、という目に見える形の成果よりも、仮想環境の構築・シェルの操作・ネットワーク通信・アルゴリズム改善・Git でのリポジトリ管理などを重要視し、ひとつひとつを「第一歩の体験」として読者に提供することで、現代の職業Webプログラマに必要な知識を横断的に習得させようとしている。やり方は地味かもしれないが、これがとても素晴らしい点だと感じた*1。 先ほど書いたように、所有しているPCのOSによる違いを吸収するために Ubuntu を動かす体験を提供していることで、プログラミング初心者かつWinユーザーがよく陥る「環境構築でのつまづき」を回避するだけでなくその先にあるプログラミング体験の面白さに最短で読者を導いている。そのため過去にプログラミングに挑戦しようとして失敗した過去がある人や、IT業界にいてもモダンな開発手法に中々触れられないのでいちから勉強したい、という人にはまず第一にこの本を進めたい。特定の各言語への入門はこの本を読み終えた後で十分だし、学習成果を充実させられると思う。

*1:もちろん書籍の中では Slack Bot の作成やHTTPサーバの構築など目に見える成果物を作ることにもチャレンジさせている

職歴1年目のエンジニアが考えるインプットとアウトプットのうまいやり方について

記事の趣旨について

7/20 にサポーターズCoLabの「あえてジャンル不問の大LT大会」で発表をしたので、その内容についてエンジニアとして就職してからこれまでを振り返りつつ掘り下げてまとめています。

記事のスライド

URL

私について

SIerで5年、Web系の企業で1年ほどサービス運営の仕事などを経て、去年の10月からWeb系企業でエンジニアとして働いています。仕事で主に書いているのは JavaScript(Node.js / React) で、仕事としてコードをみっちり書くようになってからはまだ1年も経っていないペーペーです。

インプットについて

転職してから最初に任されたのが React のプロジェクトだったので、とにかく React, Redux 周りの情報収集、写経、ドキュメントの読み込みなどなどをひたすらやっていました。それに付随してフロントエンドのトレンドなどにも首を突っ込んだり、LTのイベントで情報を色々収集していたのですが、業務ではまだすぐには実践できない + 情報の流速と量に根負けしてしまったのでとりあえず React と Node.js の動向を追う以外はフロントエンドのインプットの優先順位を下げています。 他にも周囲の関心につられてラズパイを買ったり関数型言語について手を出そうとしたりしましたが、長続きしませんでした。 色々手を出そうとして中途半端になってしまったところで「ちゃんとプログラミングを仕事でやるようになったのにネットワークもOSもDBについても基礎的な部分への理解がおざなりじゃん」と冷静になったので、学ぶ内容を根本的に見直し、それに対して意味づけをするようにしました。具体的には以下の項目を重点的にやるつもりです。

  • Laravel (業務で使うから)
  • Docker (業務で使うから)
  • ネットワーク、OSなどのフロントエンドより下のレイヤ (トレンドで左右されないから)

インプットの優先度をどう見直したか

まず、職歴が浅いため、目の前にある自分の案件に必死に取り組まなければなりません。というわけで、現行のプロジェクトで使っている JavaScript については絶えず学んで行く必要があります。

Laravel, Dockerも同様で今後の案件で使うので優先順位を上げました。Laravel, もしかすると Rails にも共通して言えることかもしれませんが、MVCフレームワークにふれることで「プロダクト」としてのWebプログラミングに対して理解が深まると考えています。DBを自分で設計したりするのが結構楽しい。SPA + マイクロサービスの波がより大きくなるとMVCフレームワークの需要も減って行くのかもしれませんが、まだ色んなWebサービスがこの上で動いているのを考えると今勉強していても時代遅れとは言えない(むしろ気づきが多い)でしょう。また、自分のポートフォリオを充実させるためにオリジナルのWebアプリを制作したいので、これを下地にしたいと考えています。

3番目に「フロントエンドより下のレイヤ」を学ぼうと決めた理由は、自分に足りていない領域を補完して地力をつけるためです。フロントエンドのアプリを書いて、サーバーと通信をさせているのでネットワークについて知らないのはまずい。日々自分が開発環境として使っているOSのファイルシステムについて知らないのもまずい。そういった下のレイヤについて知ることで、Webプログラミングをもっと俯瞰的に見ることができます。

また、ネットワークやOSはプログラミングにおける「歴史」を学ぶのに等しいと考えているので、これからの変遷を予測し、備えるためにも役立ちそうです。 とはいえ、インプットに割ける時間は限られています。とてもではないがC言語の仕様書を読み込みにいくほどの時間は作れなさそうです。業後に寝食を惜しんでまで勉強できるほど体は丈夫ではないし、頭をフル回転できる余裕はもう年齢的にありません。 そのため、粒度を「ハードルが低めのほんを1冊ずつ読み終えていく」程度に設定し、以下の本を順に読んでいくことにしました。

7割くらい読み終わった。もともとプログラミングにあまり親しみのない高校生に向けて執筆された内容ながら、PCにVirtual Box + Vagrant をインストールして Linux (Ubuntu) を直接いじるところから始まるので、普段MacOSで開発している自分にとって結構刺激的でした。

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

2割くらい読み終わった。

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

まだ読み始めたばかり

下2冊の本は Go を書きながら学習できるので、もともと「何かサーバサイドの言語をもう1つやってみたいな」と思っていた自分にとっては一石二鳥っぽいです。

アウトプットについて

まだ1年目の自分にとって、勉強に使う時間は圧倒的にインプットに回すことが多く、なかなかアウトプットできないな、という悩みがありました。自分が属しているコミュニティのエンジニアには頻繁にQiitaに記事を書いたり、技術同人誌を執筆していてとても刺激を受けるのですがまだそういった類のアウトプットの難易度は高く感じます。自分でもQiitaに何回か投稿したことはありますが、結構似た内容はすでに詳しい人が投稿したりしているので、ちょっと尻込みしてしまいます。

そこで、インプットに時間を使いながら自分にもできる難易度の低いアウトプットは以下の通りかなと思いました。

  • 読書感想文
  • ハマったことの共有
  • LT登壇

今読んでいる本については、学習記録として読み終えたらこのブログに読書感想文を残しておこうと思います。後から読み返すことでその時点で自分が何を考えていたかの振り返りにもなるので、無駄ではないと考えています。また、新しいツールを導入しようとするとなぜかインストールでハマることが多かったりするので、再度環境構築を行うような場面で自分が困らないようにハマった点は同様にブログかQiitaに残すと後々役立ちそうです。 LT登壇も何回かやったことがありますが、技術的な話題からちょっと逸れた内容のものが多いので、今後やるときはちょっと内容を工夫したいです。使っている人がまだ少ないツールの紹介とかカッコいいなぁと思うので挑戦してみたいですね。

地力が身につくまでは上記のようなアウトプットを繰り返して、そこから余裕ができたらOSS活動やWebアプリの開発といった難易度が高めのアウトプットに取り組むのが今後の目標です。