質問: VBAで社内の生産管理ソフトの作成をしていますが、要求のレベルと機能に限界を感じ、 モダンな言語を改めてしっかりと学習したいと思い、ここ1・2ヶ月javascriptの学習をしておりましたが、 実装したい機能に対してのマストな選択、また、それを学ぶための最適解を 未だ見いだせない状態ですので識者の方に助言いただければと存じます。 #### 最終的な目標 * 社内のシステム化(製造業) ・製品・部材をバーコード管理し在庫管理・入出庫を携帯端末でできるように ・製造の進捗状況の登録・モニタリング ・製造スケジュール・受注・出荷状況の登録 ・各種申請のペーパーレス化 ※VBAにて実装済機能がいくつかありますが、必要に応じて作り直しも検討しています ※既に可動しているデータ(mysqlにて管理)の変更は難しいのでmysqlはそのまま運用する予定です。 * +(個人的に)スマートフォンアプリを制作したい #### 経緯 * 前職で軽くPHPを触っていたこともあり、またマルチプラットフォーム対応の容易さから WEB関連の言語を選択 * 腰を据えて学習するならモダンな言語を学びたかったのでjavascriptを選択 * 規模を考慮しAngularを選択→学習 * フレームワーク以前に圧倒的にjavascriptの知識が足りていなかったので javascript・Typescriptの学習を開始 * 情報・選択肢の多さからパニック状態 #### 所見・疑問点 * 大前提としてMySQLの運用がある上でのNode.jsの選択は間違いだったのか? 調べてみるとNode.js・ExpressでのMySQL運用記事は多数あるが、 Node.jsはNoSQL前提、のような記事も見かけるため、良否がわからない。 とはいえ、NoSQLは複雑なデータの取扱には適さないとの見解らしく 「複雑なデータの取扱がある案件」→「Node.jsが選択肢から外れる」 とは到底思えないので、多少楽観視はしている。 * javascriptとTypescript、どちらを学べばよいのか? そもそもどう学べばよいか。 TypeScriptをきちんと理解する上でjavascriptを学びたいのだが、 著名な書籍はバージョンの古いものばかりで、それを学んで良いのかもわからない。 また、最新のjavascriptの情報を見ていると、Typescriptよりjavascriptの方が 記述が容易に思えたもの(async/await(ES2017)等)あり、どちらを学べばよいかの 良否判断ができていない。(TypeScriptの書籍が少ないことも懸念事項) * どのツールが適しているのか 例えばMysqlとの接続をとっても、mysql2、promise-mysqlと2つあり、Promissについても promise-mysqlを使えばよいのかmysql2/promissで良いのか、async/awaitを使えばそれで 十分なのかがわかりません。 * また、現在小規模機能を作成しつつ学習を進めているのですが、小規模であってもwebpackや Expressを導入したほうがいいのか(Angularはjavascriptをある程度理解してから使用する予定です) #### 開発環境 macOS Mojave VSCode #### 学習環境? 主にQiitaやteratail、書籍を元に調べています。 英語のリファレンスや投稿サイトのほうが情報量も鮮度も高いのは理解しているのですが Google翻訳を使いながらなんとか読める程度の読解力なので、少し敬遠気味です。 #### 他 開発者としての経験も浅く、まだまだ未熟者ですのでご指導ご鞭撻いただければと存じます。
回答: > > 大前提としてMySQLの運用がある上でのNode.jsの選択は間違いだったのか? > > > もし貴方が今の企業が嫌になり、Web系企業に転職するという選択を取る場合、大間違いです。 これは単純にPHPとRubyが人気がありすぎる為に、Node.jsを使っている企業が少ないという理由です。 Node.js製のWebサーバ自体はJSによるプログラミングとNode.jsのローカルルールにさえ慣れてしまえば無双出来るポテンシャルはありますね。 JS(主にNode.js)はALGOLの皮を被ったLispなので、モチベーションを保つなら「ハッカーと画家」を読むと良いかもしれません。 > > javascriptとTypescript、どちらを学べばよいのか? > > > あなたはIDEを利用して、型に守られたプログラミングは好きですか? TypeScriptはMS社がJavaScriptを触って「型が無いとかダメだろ」とJSに型を付けた言語です。 TypeScriptは所謂AltJSで、コンパイルするとネイティブのJavaScriptに変換され、Node.jsやブラウザ上で利用されます。 TypeScriptは思想としてn年後のデファクトスタンダードJavaScriptという思想を掲げており、 型情報を付与したヘンテコな関数宣言が出来るくらいの違いしかありません。 それ以外は最新のECMAScriptに対応したドノーマルJavaScriptであり、JavaScriptのソースコードをベタっとコピペしてTypeScriptとして動かしても動く程だそうです。 (私はCoffeeScript教徒の信者なのでTypeScript教はシネと思ってますので伝聞でしかありません) つまり、JavaScriptで培ったスキルや資産は全てTypeScriptへ持っていけます。 懸念のasync/await構文も当然動くでしょう、むしろ動かなかったらTypeScriptの存在価値無いし、鵜呑みのした私大うそつきじゃん。 先にJavaScript中心で勉強し、規模が大きくなり必要に迫られてTypeScriptを覚えても、 TypeScriptを使いながら平行してJavaScriptの扱いを勉強しても最終的なゴールは同じになります。 一人開発の場合、型が好きで好きで仕方ないならTypeScriptを使えば良いですし、 そうでもないならJavaScriptからやれば良いんじゃないですかね。 > > Node.jsはNoSQL前提、のような記事も見かける > > > MySQLは別にNode.jsと相性が悪い訳ではなく、他の言語同様に相性は良好です。 これは私は因果関係が逆だと思っています。 NoSQLのMongoDBなんかはストアドプロシジャにJavaScriptを採用するほどのJS寄りで、 MongoDB使うのに、なんでNode.jsじゃなくてJavaやRuby使うの???みたいな感じでNode.js前提な所があります。 > > どのツールが適しているのか > > > ん〜、私はmysql2しか使った事ありませんが、どちらでも良いと思います。 async/awaitはPromiseをスマートに扱う糖衣構文です。 Promiseは基本的にPromiseインスタンスを受け取り、後続のやりたいことの記述がしたければ`.then(fn)`という風にthenメソッドにやりたい事を関数化してぶら下げる記述をする必要があります。 async/awaitを使えば、promiseの完了をawaitで待つ事が出来るようになる上、resolveの結果を取り出して代入したり他の関数の引数として渡したりできるようになります。 これが超便利で、ソースコード上では普通の同期処理であるかのように書けるのでめっちゃ捗ります。 これはmysql2/promiseでasync/awaitを併用したサンプルですが、これ覚えておけば全てのPromiseを同じように扱えるんで、Promiseとasync/awaitは死ぬほど勉強して覚えてください。 > > 小規模であってもwebpackや > > Expressを導入したほうがいいのか(Angularはjavascriptをある程度理解してから使用する予定です) > > > Node.jsの存在意義の半分がJadeやSASS等の静的HTMLジェネレータにありますので、 何かしらのタスクランナー(+コンパイルツール)を扱うのはマストです。 私はwebpackじゃなくて、マニュアル的なnpm-scriptsを使っていますが、 流行のwebpackに乗っかっておけば間違いないと思います。 webpackでビルドしてください前提のプロジェクトは結構あって、Angularもwebpackだったかもしれません(適当 Node.jsのhttpモジュールは死ぬほど使い勝手が悪いので、 Express.jsの使用はマスト!むしろこっちがデフォルトくらいの勢いです。 AngularはJS初心者が手を出すと挫折するほど導入が辛いかも知れません。 例えVue.jsで妥協したとしても、何かしらのJSフレームワークはこの段階で絶対に習得してください。 大規模なWebアプリをJSで実装する段階でネイティブJSやjQueryだと横並びの修正作業項目だらけになって確実に死にます。 > > 学習環境? > > > 知らない機能やメソッドを見かけたら、 必ずこれらのサイトで裏付けを取ってください。 * MDN: Firefox作ってる団体のJavaScript解説サイト、全ての組み込み関数やメソッドの挙動はこのサイトで確認出来る * Node.jsドキュメント * ExpressJS公式: APIドキュメントは英語だが、ガイドまでは日本語で読めるのでニュアンスを理解すれば頑張れるはず