個人開発の技術選定

※この記事は2019年10月に執筆したものです。当時とは状況や考えが変わって部分があります。

はじめまして、ダンと申します。

日々情報収集をしている中で、
「エンジニアとしての市場価値を高めるために重要となる技術」だったり、
「最先端のweb系企業で使われている注目の技術」に関する情報が多く、
「良いのプロダクトを速く作る技術」を求めている私向きの情報ではないと感じることが多くなってきました。

個人開発や、小規模プロジェクトの際に利用すると良い技術について、現在の雑感をまとめていこうと思います。
##前提
本来、技術選定は作りたいサービスが明確にあってこそのものです。
本記事は「webアプリの個人開発や小規模プロジェクトで力を発揮しやすい技術は何か」という基準で書いていきます。

私はいわゆるサービス志向エンジニアで、技術そのものよりも「その技術を使って何ができるか」の方に強い関心があります。

また技術力は他のみなさんと比較するとかなり低いです。
プログラミング歴はもうすぐ2年になりますが、本格的な実務経験はありません。
[PHPで書いたサイト](https://mcbattle-ch.jp/)をレンタルサーバーに公開して1年半ほど運用したり、コーディングやWordPress関係の仕事をいくつか受けたことがある程度です。
その他、いろんな技術のチュートリアル的なものにちょこちょこ手を出してます。
あと、最近(2019年9月)AWS SAAを取得しました。

今後は自分で本格的なWebサービスを作って、販売して行きたいと考えていて、技術情報はある程度追っている、といった状態です。

前置きが長くなりました。
以下、私が積極的に使っていこうと思っている技術になります。

##HTML、CSS
HTML、CSSが書けなければ始まりません。
CSSは直接書くのではなく、Sassで書いてコンパイルする方が良いです。すごく書きやすくなります。
はじめてSassを使った時は感動しました。学習コストもかなり低いので、使わない手はありません。

~~また、CSSフレームワークはBootstrapを使うことが多いです。
定番で情報量も多いですし、これといった不満もないので。ついでに名前も好きです。~~
(2019/12/19 追記)
フレームワークは自作する方針に変えました。
その方が速いし、無駄が少ないし、カスタマイズしやすいし、かゆいところに手が届きます。

##Javascript
Javascriptの基本的な文法に関しても、必ずどこかのタイミングで必要になってくるので、学習する必要があります。
フレームワークに関しては、jQueryを使うか、ReactやVueなどを使うかの選択があります。
この点については色々と考えましたが、現状ではjQueryを使うのが良いのではないかと考えています。
理由としては以下の通りです。
####SPAに興味が持てない
(2020/6/30追記)
今は普通に興味があります。こんな記事も書いてます。
[モノリスはクラピカ - Qiita](https://qiita.com/d0ne1s/items/27ce08271f96aec89de3)

SPAのメリットとして、サクサク動く、表現が豊かになるなどがあげられますが、実装できる機能自体が大幅に増えることはなさそうだと感じています。
表示速度は通信技術の発達に伴ってどんどん上がっていくでしょうし、表現に関してもHTMLの進化で改善されていく気がします。（限界があるとは思いますが）
また、サーバーサイドレンダリング(SSR)をしっかりやらないと、SEOが弱くなってしまうとの話を聞いたことがあります。
普通のSEOを実現するために、工数を増やすのはあまり気持ちの良いことではありません。
しかもSSRはなかなか学習コストが高いみたいです。
####学習コスト
前述のSSRの件もそうですが、全体的にjQueryの方がサクッと使える感じがします。
React等のメリットとして「複雑なコードをわかりやすい形で書ける」というのがあるようですが、それが特に力を発揮するのは人数の多いプロジェクトのような気がしています。
逆に、シンプルな動きをつける時のコードを見比べると、jQueryの方がスッキリしている気がしました。

####情報量、ライブラリの数
歴史が違う分、情報量やライブラリの数ではjQueryが圧倒しています。
React等の情報はこれからどんどん増えていくと思われますが、React、Vue、Angularと3つの人気フレームワークが乱立している状況では、増え方もこれまでのjQueryと比較すると緩やかなのかな、と思っています。

####ネイティブアプリについて
Reactが書けるようになると、ReactNativeというフレームワークを使って、スマホ用のネイティブアプリが比較的簡単に（元のコードを活かしながら）作れるというメリットがあります。
これについて、個人的にスマホのネイティブアプリにそこまで興味がないので、それだけのためにReactを使うのは違うな、と思っています。
あとスマホのネイティブアプリについてはあんまり調べてないので、よくわかってません。
webviewがどんどん進化してるらしいですね。

(2019/12/19 追記)
今は「ReactよりjQueryが良い」というより「jQueryに不満が出てくるまではjQueryを使い続けよう」くらいの感覚です。
Reactのことあんまり分かっていないですし、なんだかんだjQuery依存のライブラリとか使っちゃうので。
でも世の中の流れ的には完全にReact一強みたいになってきてますよね。
あと、最近は普通にネイティブアプリにも興味あります。ホーム画面にアイコンを置けるとか、プッシュ通知を送信できるとかって、サービスの利用率をあげるのにめっちゃ貢献しますよね、きっと。

(2020/3/20 追記)
今はRailsやDockerの学習がひと段落したら、Vue.jsをやろうと思ってます。
Reactより小規模プロジェクト向けっぽいので。

##Ruby on Rails
サーバーサイドはやはりRuby on Railsかなって結論です。
そもそもRails自体が少人数のスタートアップでのプロダクト開発用に作られたフレームワークらしいです。
疎結合を犠牲に、速さと綺麗さの両立を追求して作られたとのこと。

最近はすごい勢いで人気が落ちているらしいですが、言語自体の問題というより
- 他のモダンな技術の登場
- 大規模サービスのRails離れ（Railsは大規模サービスにはあまり向いていないらしい）
- Railsに対する飽き
などから、「イケてる感」がなくなってきたことが原因なんじゃないかと個人的に推測しています。

Ruby on Railsは、ライブラリや情報量、学習コストなど、どこを取っても小規模プロジェクトにはもってこいの技術なんじゃないかと思っています。

ちなみに、Node.jsを使ってサーバーサイドもフロントエンドもJavaScriptを使うと良いのでは？って考えもありましたが、別にSPAを作りたい訳ではないので、JavaScriptをゴリゴリ書くことにこだわる必要もないと思ってやめました。

大半のロジックはRuby on Railsで書いて、必要な時にだけJavaScript及びjQueryを使うのが良いのではないかと思っています。

##Heroku
インフラはもうHerokuかなと思ってます。インフラに工数をかけたくないです。多少割高になっても、パフォーマンスが落ちても、コスト、リスク、時間とかを総合的に考えたらHerokuだろうと。
個人的にインフラ周りの勉強が好きじゃないので、EC2とかで自前のインフラを構築することが必須になるサービスはそもそもやりたくないと思ってます。

#Lambda、SQSなど
実際にほとんど使ったことがないのですが、LambdaとかSQS、SES、CloudFront、S3のような便利な外部サービスは積極的に活用したいと思っています。
AWS SAAを取得して1ヶ月ということもあり、AWSのサービスばかり挙げてしまいましたが、AWS以外のサービスでも便利なものはどんどん活用していきたいです。
どんなサービスがあって、何ができるのかをある程度頭に入れるようにして、必要に応じて勉強していきます。

(2019/11/4 追記)
Stripe（決済）とかAlgolia（検索）とかも使ってみたいです。

##必要かどうかわからないこと
####Docker
Docker、使うのが常識になっているみたいですけど、どうなんですかね。
ドットインストールのチュートリアルを半年くらい前にやったっきりなので、Dockerに対する理解がかなり浅いです。
- 複数人で開発する時に、開発環境のセットアップが楽になる
- 開発環境と本番環境の差分を減らすことができる
というあたりはざっくりと理解しているのですが、
- Herokuを使う場合にも利用するのが一般的なのか
- Gitのように、開発環境をそのまま丸ごと本番環境にデプロイできたりしないのか
- アプリケーションとDBは別のコンテナにするもの？判断の基準は？
などなど、「何言ってんだこいつw」と思われてしまうかもしれないレベルの疑問がたくさんあります。
1つでもわかる方がいらっしゃいましたら教えてください！

(2019/11/1 追記）
Dockerは開発環境と本番環境の差分を減らすという役割もありますが、今使われまくってるのは「開発環境を簡単に構築（共有）する」って目的の方が強そうな印象です。一旦後回しにします。

####CD/CI
HerokuとGithubを連携させて、Githubの更新を検知して自動でデプロイする、という動きは超簡単に作れます。
CircleCIやGithubActionsを使うと、何が嬉しいのでしょうか。
テストというものを書いたことがないため、その辺りを学習するとわかるのかもしれません。勉強します。

(2019/11/1 追記）
「デプロイの属人化」は個人開発では問題にならないので、とりあえず優先度は低めで。余裕があるとき、気が向いたときに触ってみようと思います。

##終わりに
以上が、個人開発の技術選定に関する現状の考えです。

少しでも違和感を感じた箇所があれば、どんどん指摘してください。
ちょっとした感想も、否定的なコメントも大歓迎です。
みなさんのご意見、感想を受けて理解を深めていきたいと考えています。
よろしくお願いいたします！

##参考
- [ボクココ](https://www.bokukoko.info/)
- [Railsは2019年も「あり」か？](https://techracho.bpsinc.jp/hachi8833/2019_01_25/68846)