Trot

駆け出し前プログラマの学習記録

入社準備

先日、第一志望の自社開発企業から内定をいただきました。暗中模索の独学が身を結んだことは本当に喜ばしいですが、まだまだスタートラインに立つ権利を得たところで、実務に入るここからが大切だと思います。入社日まで出来る限りダレずに勉強しようと思っています。

 

Ruby+Railsを中心に学び、Node+Expressも少し触れたりもしましたが、入社先では今まで経験のないPHP+Laravelを使用することになるので、まずそれらの勉強は必要です。そのほか、自分が弱いフロントエンドや、「就職活動に不要」ということで泣く泣く学習スケジュールから外していた競技プログラミングにも再び取り組もうと思います。

 

まとめると以下です。

 

・フロントエンド(HTML+CSS+JavaScript)

PHP+Laravel

競技プログラミング(Atcoder + AOJ)

 

私は関西在住なので引っ越し等の状況準備や家探しなどで非常に忙しくなりますが、入社まで1ヶ月弱あるのでなんとかなるはずです。仮に達成できなかったとしても、その地点まで進めたメリットは得られるので損することはないはずです。 業務を完全に無視すれば、静的型付け言語を使用したアプリ開発ネイティヴアプリ、数学と機械学習などに興味がありますが、それは入社後の業務に余裕が出た時に取り組もうと思います。

面接・現在の課題・新たな課題

私は独学でプログラミングを学んできたため、常に勉強の方向性についての悩みが付き纏いました。しかし最近は、熟練エンジニアの方々と接する面接から勉強の方向性についてのヒントを得られることにより、方向性についての悩みが随分と減りました。勿論、面接においては合否が重要ではありますが、面接の過程で、誰かに対して自分の技術力を必死にプレゼンする経験それ自体から得られるものは多いと感じています。とりわけ、独学において最も難しい「自分に何が足りていないか」の認識に非常に役立ちます。詳細は割愛しますが、面接から得られた経験を活かし、現在進行中の課題に新たな課題を加え、しばらくはそれらを中心に学習を進めたいと思います。

 

現在進行中の課題

・Node.js+Express+Websocketを使用したユーザー登録制のチャットアプリ開発(5月中まで)

・自作Railsアプリの改修(5月中まで)

 

新たな課題

・Web技術の総復習

・ORMに生の頼らずSQLを書く練習

・静的型付け言語によるアプリ開発(C# or Java)

・Oauthの理解(とそれを用いたアプリ開発)

 

「知識は開発によって定着するが、知識の全てを開発で使えるわけではない」という非常に悩ましい問題がありますが、様々なものを開発する過程で、様々な知識を使用し、少しずつ定着させる以外道はないと思います。今後とも、知識獲得と開発の一方に偏らず、両方のバランスを上手く保ちながら勉強を進めたいと思います。

 

Expressの進捗

引き続きExpressを学んでいます。Railsを試行錯誤して学んだ蓄積があるからでしょうか、まだ数日程度ですが、ミドルウェア定義、テンプレートエンジン(EJS)、ヴァリデーション、CRUD実装、ファイルアップロード実装、ログイン機能(express-session)の実装は一通り出来るようになりました。とりわけ、CRUDとログインの実装はアプリ開発の基本の基本だと考えているため、ある程度の理解を伴ってそれらを実装できたことには結構な満足感があります。

 

また、少し文面では説明が難しいですが、非ログイン状態で要ログインページAにアクセスした際にログインページにリダイレクトし、ログイン完了後に要ログインページAにリダイレクトする親切機能です。30分ほどで実装できたので、時間的にも満足しています。Expressというフレームワーク全体の理解度が自然に上がっていたのかもしれません。適宜参照が必要ではありますが、基本的実装の速度についてはあとは慣れの問題ではないかと思います。しかし、まだスタート地点に立ったに過ぎませんし、このまま精進したいと思います。

 

そういえば、TwitterBotを作ろうと思っていましたが、Twitter APIの申請が中々通らず難儀しているため、先にWebSocketを活用したアプリを開発しようかなとも思っています。

 

Node.js + websocketsによるチャットアプリ

引き続きNode.jsを勉強しています。前回はRESTfulなAPIを作成しましたが、今回はチャットアプリに挑戦してみました。参考にしたのは以下の記事です。

 

完成品はこのような感じになります。

 

小さい部分ではありますが、独自の機能拡張もしています。サンプルコードを触って大まかな動作確認ができたので、Bootstrapを導入し、ラジオボタンでClassに要素を加え、それに対応して色が変更するようにしてみました。最低限の動作を理解していなければ拡張できないはずなので、この一筆加える行為は、自分の理解度の確認と向上に非常に役立ちます。

 

 

まだまだExpressに触れて数日ですが、現在は「ひたすら作って慣れるステップ」だと思います。初めからオリジナルなものを求めてしまうと手が止まり、手が止まることで理解も遅くなってしまうと思うので、今はオリジナルかどうかに捉われず、無心に習作を作り続けたいと思います。 もう少し全体像が掴めたら細部を攻めます。次はTwitterBotを作ろうと思っています。

Node.js + Express + Sequelize によるRESTful API

先日、Node.js向けのWebアプリケーションフレームワークExpressに興味がわき、ここ数日間は主にExpressを勉強してみます。フレームワーク全体構成の理解も良いですが、兎にも角にも触ってみないことには始まらないと思ったため、「CRUD機能を実装する」を目下目標と定めて勉強を進めました。

 

まずExpress公式チュートリアルで概要を把握し、簡単なアソシエーションなどの実装をしてみました。そして次に、以下のハンズオン教材に従ってCRUD機能を持ったRESTfulなAPIを作ってみました。内容的にはそれだけでも十分ですが、ORMのSequelizeを使用してMySQLと連携し、Axiosを使用してフロントエンドフレームワークにVue.jsを導入するところまで学べてしまう非常に充実した教材です。

 

ローカル環境で実際に動かすとこのような感じです。

 

Expressは、 Railsと同じMVCアーキテクチャーを採用しているフレームワークですが、例えばディレクトリ構造など、Railsと比較して標準化されている部分が少なく、構成の自由度が高い印象を受けます。Expressはその自由度を上手く活かさなければ、全体がまとまりのないものになる気がします。一方、その自由度を適切に運用することができれば、小さなアプリを作るためにRailsのように巨大なフレームワークを導入する必要がなく、部品のようにして様々な部分に組み込みやすいのかなとも思います。

 

まだまだ全体は見えてきませんが、今しばらくは何かを作りながらExpressにおける開発の流れのようなものを身体に入れたいと思います。

新しい言語模索

RubyRailsの学習を一段落させて、新しい言語を模索しています。動的型付け言語かつ軽量プログラミング言語Rubyを中心に据えて学習してきましたが、もっと幅を広げたいからです。「Rubyと異なる特徴を持っていること」を技術選定の基準として、とにかくいろいろと触っています。やはり、言語比較サイトにあるカタログスペックを眺めるよりも、実際に手を動かして色々触ってみることが一番楽しく、はやく、経験値も得られるので一石三鳥です。

 

まず、静的型付け言語としてKotlin、TypeScriptの順番で基本文法を押さえてみました。個人的嗜好としては、静的型付け言語の方が好きかもしれません。理由は、Rubyのコードは型が可視化されていないため、型の相性が悪いことが原因のデバックが非常に大変だからです。一方、静的型付け言語は、変数・関数・返り値・引数に型を指定・注釈することができるため、常にコメントで詳細な説明と単体テストを書きながらプログラミングをしているような感覚があり、非常に安心してコードを書けます。「値や関数の役割が記述されているのでわかりやすい」という感じでしょうか。

 

また、KotlinとTypeScriptの両方を学んでみた感想としては、同じ静的型付け言語ということもあってか、両方が非常によく似ていたため、一方を知っているともう一方の学習コストが大幅に下がることも実感しました。やはり様々な特徴を持った言語に触れることで、汎用言語運用能力のようなものが向上するのかもしれません。

 

色々と手を付けるとどれも中途半端になるデメリットがありますが、「色々」を知ることで比較によって理解が進むメリットがあります。やはり、「狭く深く」と「広く浅く」の両方のアプローチを適宜使い分けることが大切なのかもしれません。

作業の山場

最近はSNSも控え作業に集中しています。11月からプログラミングの独学を始め、随分と寄り道をしてきましたが、作業の終わりが見えてきました。プログラミング仲間やメンターと言える人たちは全くいませんが、幸いなことに現在まで「勉強辛い...」となったことはありません。毎日淡々と作業を進め、時々貰えるご褒美に心の中でガッツポーズする生活です。

 

プログラミングのどこが楽しいかは人それぞれにあると思いますが、私は、自分の考えたロジックで謎解きをすることに楽しみを覚えるタイプかもしれません。例えば、あるコード群がエラーを出している際、コード群をA・B・Cの3セクションに分解し、A、B+C、A+Cといった様々な組み合わせを試してエラーの原因を探ったりする時が楽しいです。

 

そういえば、ここ2~3ヶ月くらいで積極的にメモを使うようになりました。大きい課題とそれを細分化した小さな課題を作業の中心に据え、行き詰まって自分を客観視できなくなった際のQ&Aを用意しています。原始的な方法ですが、入浴中・休憩中・就寝前に眺めてぼんやりと問題を考えたりと、想像以上に役立っています。

f:id:twins-twins:20200412192417p:plain

メモを見てわかる通り、現在の作業の大部分は、UIを整えるためのhtml/erb/cssいじりです。後はしっかりRspecでテストを書いてデプロイすれば終わりです。作業終期が近づくに連れ、ビューいじりが増え、コントローラーとモデルをいじる機会が減り、少し寂しく思っています。