それで、あなたとあなたの共同創設者はこの素晴らしいビジネスアイデアを持っていますよね?
あなたは頭の中に機能を追加してきました。
あなたは頻繁に潜在的なクライアントに彼らの意見を求めます、そして彼らは皆あなたを愛しています。
さて、人々はそれを望んでいます。儲けるお金は少しでもあります。そして、彼らがそれを取得できない唯一の理由は、あなたがそれらをまだ実装していないからです。
そして最後に、ある日座って「やってみよう!」と言います。間もなく、アプリケーションのビジネスロジック、つまり製品を前進させるキラー機能を適用する方法を理解しようとしています。その方法がわかったので、それができることがわかりました。
コーディング言語の作り方
「完了!動作します!」あなたは言う。概念実証は成功です!あとは、Webアプリケーションにパッケージ化するだけです。
「わかりました、サイトを作りましょう」とあなたは言います。
そして、あなたは真実に気づきます。プログラミング言語を選択する必要があります。プラットフォーム(モダン)を選択する必要があります。いくつかのフレームワーク(最新)を選択する必要があります。スペース、データベース、ホスティングプロバイダーを構成(および購入)する必要があります。管理インターフェースが必要です。許可システムが必要です。コンテンツマネージャーが必要です。
あなたは簡潔になりたい、機敏になりたい。短期的および長期的に成功するのに役立つテクノロジーを使用したいと考えています。そして、それらは必ずしも簡単に選択できるとは限りません数十から数十のアーキテクチャ上の決定を行う必要があります。そして、適切なものを採用したいと考えています。迅速な開発、一定の反復、最大の効率、速度、堅牢性などを可能にするテクノロジーを使用したいと考えています。あなたは簡潔になりたい、機敏になりたい。短期的および長期的に成功するのに役立つテクノロジーを使用したいと考えています。そして、それらは必ずしも簡単に選択できるとは限りません。
「私は圧倒されています」とあなたは言います。あなたのエネルギーは以前と同じではありません。ピースを合わせようとしますが、それは大変な作業です。
あなたの概念実証は枯れてゆっくりと死んでいきます。
このようにたくさんのアイデアを捨てた後、私はソリューションを設計することにしました。私はそれをプロジェクトと呼んでいます ' 初期化 '(開始)(またはinit.js)。
アイデアの核心は、他のすべてを開始し、開発者または技術的創設者が同時にそれらの決定を下し、それらの決定に基づいて開始するための適切なテンプレートを受け取る単純なプロジェクトを持つことです。私は、否定論者が「1つの解決策がすべての問題に適用できるわけではない」と言うことを知っています(憎しみは嫌いです)。そして、彼らは正しいかもしれません。しかし、私たちは大まかな解決策を作成するために最善を尽くすことができます、そして私は思います 初期化 十分に近いです。
この目標をよりよく達成するには、いくつかの重要なアイデアを念頭に置く必要があります。 Initを開発していたとき、私は次のことを考慮しました。
コンポーネント
モジュール化は、さまざまなプロジェクト間でソフトウェアコンポーネントを再利用できるため、あらゆるシステムの重要な機能です。これは、 初期化 。しかし、モジュール化には製品ごとの「交換可能性」も付属しています。これは、「ほぼ」同じソリューションでさまざまなタイプの問題を攻撃する場合の最善の味方です。
開発のしやすさ
いくつかの問題については、どこかに書かれたより良い解決策があります [Brainf * ck] (https://en.wikipedia.org/wiki/Brainfuck)。または脳をファック)。しかし、そのソリューションを実装します( Brainf * uck )読むことはもちろん、書くこともほぼ不可能です。それはあなたに時間と莫大な量の努力を要するでしょう。一般に、開発を容易にし、自分(または後でそれを使用できる人)にとって難しくない言語とプラットフォームを使用する必要があります。
コミュニティ
どちらのプラットフォームを選択する場合でも、優れたコミュニティがあり、最も一般的な問題とあまり一般的でない問題を解決できるコミュニティがあることを確認してください。覚えておいてください:jQueryはほとんどではないかもしれません 速い 、最も 掃除 、または最も素晴らしい—しかし、それだけで勝者です コミュニティ 。
これらの目標を念頭に置いて、作成時に自分で決定した方法を紹介します 初期化 。
Initは、その核となる部分で「 フルスタックJavaScript '(一部の人々は彼または彼の一部を、 MEANスタック )。このセットで作業する場合、 初期化 は、Webアプリケーションを開発するための非常に柔軟でフル機能の環境を作成しながら、単一の言語のみを使用することができます。要約すれば、 初期化 JavaScriptは、クライアント側とサーバー側の開発だけでなく、ビルド、テスト、レイアウトなどにも使用できます。
しかし、少し速度を落とし、自問してみましょう。JavaScriptは本当に良いアイデアですか?
私は1998年からWeb開発者です。 当時はPerlを使っていました サーバー側の開発のほとんどで、当時もクライアント側のJavaScriptがありました。それ以来、サーバーサイドWebテクノロジーは大きく変化しました:ほんの数例を挙げると、PHP、ASP、JSP、.NET、Ruby、Pythonなどのさまざまなテクノロジーや言語の波が次々と発生しました。開発者は、クライアント環境とサーバー環境に2つの異なる言語を使用することが事態を複雑にしていることに気付き始めました。 1つの言語で統合する最初の試みは、サーバー側のクライアントコンポーネントを作成し、それらをJavaScriptにコンパイルすることでした。これは期待どおりに機能せず、それらのプロジェクトの多くは失敗しました(ASP MVCの置き換えなど) ASP.NETWebフォーム 、そしてそれは言うことができます GWT に置き換えられます ポリマー )。近い将来に)。しかし、それは本質的に優れたアイデアでした。クライアントとサーバー上の単一の言語により、コンポーネントとリソースを再利用できるようになりました(これが重要です。 リソース )。
答えは簡単でした。サーバーでJavaScriptを使用してください。
実際、JavaScriptは JavaScriptサーバー側 Netscape Enterprise Server上にありますが、その時点では言語の準備ができていませんでした。何年にもわたる試行錯誤の末、 Node.js 最終的に出現し、JavaScriptをサーバーに配置するだけでなく、 ノンブロッキングプログラミング 、「fread」(I / O)の書き方を永遠に変える(続きを読む ここに 。
一言で言えば、ノンブロッキングスケジューリングは、時間のかかるタスクを脇に置き、通常、これらのタスクが完了したら何をすべきかを指定し、その間にプロセッサが他の要求を処理できるようにすることを目的としています。しかし、それらのアイデアは新しいものではありませんでした。それでは、なぜそれらがNode.jsでそれほど人気になったのでしょうか。シンプルでノンブロッキングのプログラミングは、さまざまな方法で実現できます。おそらく最も簡単なのは、コールバックと ループイベント 。ほとんどの言語では、これは簡単な作業ではありません。「コールバック」は一部の言語では一般的な機能ですが、ループイベントはそうではなく、通常は外部ライブラリ(Python、 ツイスター )。しかしJavaScriptでは、 コールバック は言語とイベントループに組み込まれており、JavaScriptに手を出したほとんどすべてのプログラマーはそれらに精通しています(または少なくともそれらを使用したことがありますが ループイベントの意味を完全に理解していない )。突然、Planet Earthの各スタートアップは、クライアント側とサーバー側の両方で開発者(リソースなど)を再利用して、解決することができました。 「Pythonの達人が必要」の問題 。
突然、Planet Earthのすべてのスタートアップは、クライアント側とサーバー側の両方で開発者(リソースなど)を再利用して、「PythonGuruNeeded」の問題を解決できるようになりました。だから今私たちは持っています 燃えるような高速プラットフォーム (ノンブロッキングプログラミングのおかげで)信じられないほど使いやすいプログラミング言語で(JavaScriptのおかげで)。しかし、それで十分ですか?それは続くのでしょうか? JavaScriptは将来重要な位置を占めると確信しています。理由をお話ししましょう。
関数型プログラミング
JavaScriptは最初のプログラミング言語でした 機能パラダイムを主導 大衆に(もちろんLispが最初に来ましたが、ほとんどの開発者は本番用のLispアプリケーションを構築したことがありません)。 LispとSelf、 Javascriptの主な影響 、彼らは革新的なアイデアでいっぱいです。これらのアイデアは、私たちの心を解放して、新しい技術、パターン、およびパラダイムを探求することができます。そしてそれらはすべてJavaScriptにつながります。見て モナド 、 教会のコーディング 、または(より実用的な例として)関数のコレクション](http://underscorejs.org/#collections)、から Underscore.js これにより、行とコード行を節約できます。
動的オブジェクトとプロトタイプ継承
クラスレスオブジェクト指向プログラミング(および無限のクラス継承なし)は、高速開発(オブジェクトの作成、メソッドの追加、およびそれらの使用)を可能にしますが、最も重要なことは、開発者がクラスではなくオブジェクトのインスタンスを変更できるようにすることで、メンテナンスタスク中のリファクタリング時間を短縮します。このスピードと柔軟性は、迅速な開発への道を開きます。
JavaScriptitインターネット
JavaScriptは インターネット用に設計 、最初からここにあり、そして 去るつもりはない 。それを破壊するすべての試みは失敗しました、例えば、の落下を見てください アプレットJava 、VBScriptの代替 Microsoft、TypeScript (JavaScriptにコンパイルされた)、そしてモバイル市場とHTML5の手によるFlashの崩壊。何百万ものウェブページを壊さずにJavascriptを置き換えることは不可能なので、私たちの長期的な目標はそれを改善することです。そして、その仕事に彼ほど優れた人はいない 技術委員会39 ECMAによる。
わかりました、JavaScriptの代替は毎日生まれています、どのように CoffeeScript 、 TypeScript 、 そしてその JavaScriptにコンパイルされる何百万もの言語 。これらの代替案は、開発の段階に役立ちます( ソースコードのマッピング )が、2つの理由から、長期的にはJavaScriptの偽装に失敗します。コミュニティが大きくなることはなく、最高の機能がECMAスクリプト(JavaScriptなど)に採用されることです。 JavaScriptはアセンブリ言語のようなものではありません。JavaScriptは、理解できるソースコードを備えた高級プログラミング言語です。理解する必要があります。
css画面幅メディアクエリ
したがって、これらがJavaScriptを使用する理由です。ここで、Node.jsとMongoDBを使用する理由としてJavaScriptを使用します。
Node.js
Node.jsは、高速でスケーラブルなネットワークアプリケーションを構築するためのプラットフォームです。これは、基本的にNode.jsサイトが言っていることです。ただし、Node.jsはそれだけではありません。JavaScriptI/ Oアクセスを使用するすべてのアプリケーションに推奨されるランタイムです。 Node.jsを使用してメインサーバーアプリケーションを作成する予定がない場合でも、Node.js上に構築された組み込みツールを使用して開発プロセスを改善できます。例えば: Mocha.js ユニットテスト用、 Grunt.js 自動化された建設作業のために、あるいは ブラケット コード編集を完了します。
したがって、サーバーまたはクライアントのJavaScriptアプリケーションを作成する場合は、Node.jsを毎日使用する必要があるため、Node.jsに精通している必要があります。興味深いものがいくつかあります 代替案 )、しかしそれらのどれもNode.jsコミュニティの10%にさえ到達しません。
MongoDB
MongoDB それはデータベースです NoSQL クエリ言語としてJavaScriptを使用するドキュメントに基づいており、JavaScriptプラットフォームをエンドツーエンドで完成させることができます。しかし、それがこのデータベースを選択する主な理由でもありません。
MongoDBは スキーマレスデータベース これにより、オブジェクトを柔軟に維持できるため、変化する要件により迅速に適応できます。さらに、それは非常に スケーラブル Y map-reduceに基づく 、データ集約型のアプリケーションに適しています。 MongoDBは非常に柔軟性があるため、スキーマレスドキュメントデータベース、リレーショナルデータストアとして使用できます(ただし、 トランザクション )、またはキャッシュされた応答用のKey-Valueストレージですらあります。
サーバー側でのモジュール化は決して簡単ではありません。しかし、 Express.js (Y Connect.js )のアイデアが来ました 「ミドルウェア」 (またはミドルウェア)。私の意見では、ミドルウェアはサーバー上のコンポーネントを定義するための最良の方法です。既知の標準と比較したい場合は、チューブやフィルターにかなり近いです。
基本的な考え方は、コンポーネントがパイプの一部であるということです。パイプラインは要求(入力)を処理し、応答(出力)を生成しますが、コンポーネントは完全な応答を担当しません。代わりに、必要なものを変更してから、他のパイプに委任するだけです。パイプの最後の部分がプロセスを終了すると、応答がクライアントに送信されます。
これらの「パイプピース」を「ミドルウェア」と呼びます。明らかに、2つのタイプを作成できます ミドルウェア :
中級 :要求と応答を処理するが、応答自体に完全に責任があるわけではないため、次のミドルウェアに委任します。
決勝 :最終回答に全責任を負う者。要求と応答を処理および変更しますが、次のミドルウェアに委任する必要はありません。実際には、アーキテクチャに柔軟性を持たせるために(たとえば、後でミドルウェアを追加するなど)、そのミドルウェアが存在しない場合でも(その場合、答えはクライアントに直接送信されます)、とにかく次のミドルウェアに委任することをお勧めします。
具体的な例として、サーバー上のコンポーネント「administratoruser」について考えてみます。ミドルウェアに関しては、エンドポイントとミドルウェアの両方があります。私たちの目的のために、ユーザーの作成やユーザーの一覧表示などの機能があります。ただし、これらのアクションを実行する前に、認証用の仲介者が必要です(認証されていないユーザーを作成する要求を望まないため)。これらの認証仲介者を作成したら、既存の非認証機能を認証付きの機能に変えたい場所にプラグインするだけです。
プロジェクト 初期化 作成に焦点を当てる シングルページアプリケーション(SPA-シングルページアプリケーション) 。多くのWeb開発者は、SPAの構築を試みようと何度も誘惑されてきました。私はいくつかの(ほとんどがプロプライエタリ)を使用して開発しましたが、それらは単にWebアプリケーションの未来であると自信を持って言えます。 SPAをモバイル接続の通常のWebアプリケーションと比較したことがありますか?応答の違いは数十秒です。
C ++を学ぶのに最適な場所SPAをモバイル接続の通常のWebアプリケーションと比較したことがありますか?応答の違いは数十秒です。
SPAはWebの未来です。では、なぜ古い形式で製品を作成するのでしょうか。私が聞く一般的な議論は、人々がSEOについて心配しているということです。しかし、あなたが物事を正しく処理するならば、これは問題ではないはずです:グーグル自体は とても良いチュートリアル それを行う方法について、そして非常に良いコメントがあります ここに あまりにも。
多くのことが言われています SPAを介したMVC *フレームワーク 。複雑な決断ですが、上位3つは Backbone.js 、 Ember.js 、Y Angular.js 。
3つすべてが高く評価されています。 しかし、どれがあなたに最適ですか?
残念ながら、私はAngular.jsの使用経験が非常に限られていることを認めなければならないので、この議論から除外します。現在、Ember.jsとBackbone.jsは、同じ問題を攻撃する2つの異なる方法を表しています。
Backbone.js ミニマリストでシンプルで、シンプルなSPAを作成するのに十分です。一方、Ember.jsは、SPAを作成するための完全にプロフェッショナルなフレームワークです。それはより多くのフリルを持っていますが、より大きな学習曲線も持っています。
アプリケーションのサイズによっては、使用されている機能と使用可能な機能の比率を確認するのと同じくらい簡単に決定できる場合があります。これにより、大きな手がかりが得られます。
の場合 初期化 、ほとんどのシナリオをカバーしたかったので、SPAを簡単に作成するためにBackbone.jsを選択し、モジュール化のためにBackbone.Marionette.Viewを選択しました。このように、各コンポーネントは単純なアプリケーションであり、最終的なアプリケーションは必要に応じて複雑にすることができます。
スタイリングも課題ですが、繰り返しになりますが、私たちを救うためのフレームワークを持つことができます。 CSSの場合、これ以上のことはありません。 Twitterブートストラップ 、すぐに使用できるスタイルの完全なセットを提供します。 カスタマイズが簡単 。
Booststrapは言語を使用して作成されました もっと少なく これはオープンソースなので、必要に応じて変更できます。たくさんのユーザビリティコントロールが付属しています。 Bootstrapサイトで十分に文書化されています 。また、 カスタマイズモデル これにより、独自のコントロールを作成できます。彼は間違いなくその仕事の人です。
最後に、いくつかのベストプラクティスを定義し、Initがそれらの実装と保守にどのように役立つかを確認する必要があります。私たちのソリューションは、Node.jsに基づくいくつかのツールに焦点を当てています。
Mocha.js そして Chai.js :
これらのツールを使用すると、適用することで開発プロセスを改善できます。 TDD または BDD 、ユニットテストを整理するためのインフラストラクチャとそれらを自動的に実行するためのランチャーを提供します。
がある 数千人 JavaScriptのユニットテストのためのフレームワークの。では、なぜMocha.jsを使用するのでしょうか。簡単な答え:それは柔軟で包括的です。
長い答え:2つの重要な機能(インターフェース、レポーター)と1つの重要な不在( アサーション )。説明させてください。
Chai.jsは柔軟なアサーションライブラリであり、次の3つの最も重要なスタイルのアサーションのいずれかを使用できます。
主張する :古典的な古い学校の主張スタイル。例:
assert.equal(variable, ”valor”);
期待する :BDDで最も一般的に使用される連鎖可能なアサーションのタイプ。例:
expect(variable).to.equal(“valor”);
すべき :BDDでも使用されますが、_ 'it _動作仕様(「何かを行う必要があります..」-「何かを行う必要があります」)と繰り返し聞こえるため、Expectを好みます。例:
variable.should.equal(“valor”);
Chai.jsはMocha.jsと完全に調和しています。これら2つのライブラリのみを使用して、TDD、BDD、または考えられる任意のスタイルでテストを記述できます。
Grunt.js :
Grunt.jsを使用すると、単純なコピーして貼り付けた連結ファイルから、プリコンパイル済みテンプレート、コンパイル済み言語スタイル(SASSやLESSなど)、単体テスト(mocha.jsを使用)、コードのリンティングと圧縮(例:と UglifyJS または クロージャーコンパイラ )。独自の自動化されたタスクをGruntに追加するか、 うなり声ログ 、何百ものプラグインが利用可能です(ここでも、背後に大きなコミュニティがあるツールを使用すると効果があります)。グラントもできます ファイルを監視する 変更されたときにアクションをトリガーします。
RequireJS :
RequireJSは、モジュールをロードする別の方法のように聞こえるかもしれません。 AMD 、しかし私はそれがそれ以上のものであることをあなたに保証することができます。その理由を理解するには、最初にモジュールの名前空間(demo.views.helloなど)のアイデアに言及する必要があります。これにより、各モジュールを独自の名前空間でラップすることで、グローバル名前空間の汚染を回避できます。問題は、これらのモジュールは再利用できないことです。「インスタンス」の名前空間を変更すると、すべての「インスタンス」の名前空間が変更されます。それとは対照的に、RequireJSを使用すると、再利用可能なモジュールを最初から定義できます。 (また、それはあなたが採用するのに役立ちます 依存性注入 ために モジュールがグローバル変数にアクセスできないようにする )。
CoverJS :
コードカバレッジ これは、テストを評価するためのメトリック測定です。名前が示すように、現在のテストスイートでカバーされているコードの量がわかります。 CoverJSは、ステートメントをインストルメント化することにより、テストのコードカバレッジを測定します(次のようなコード行の代わりに) JSCoverage )そして、コードのインストルメント化されたバージョンを生成します。また、サーバーにフィードするレポートを生成します 継続的インテグレーション 。
私が始めたとき 初期化 、ユーザーがプロジェクトで必要になる可能性のあるさまざまな機能をオンまたはオフにする方法が必要でした。この機能を実装するために、gitの分岐システムで根本的なアプローチを取ることにしました。
本質的に、各ブランチは、ユーザーが含めることができる1つまたは複数の機能を表します。プロジェクトを最初から開始する場合は、必要な最小限のブランチから始めてから、ブランチを他の目的のブランチとマージして他のテクノロジーを追加します。たとえば、Backbone.jsとMarionette.jsを使用してプロジェクトを開始するとします。そうですね、Backbone.jsブランチから始めて、Marionetteブランチとマージし、そこから追加する機能ごとに続けていくことができます。
今のところ、機能を追加するためにマージするというアイデアは、テクノロジーテンプレート(バックボーン、ノード、エクスプレスなど)にのみ使用できます。ただし、将来的には、バックエンド(MongoDBからPostgresなど)とクライアント側の実装を切り替えることができるようになります。
プロジェクトを開始する簡単な方法はかつてありませんでした。に移動 GitHubリポジトリ 、最新のコミットでブランチを確認し(現在はusermanagerですが、将来変更される可能性があります)、次に:
Initを使用してリモートサーバーを追加する
git remote add init git: //github.com/picanteverde/init.git
必要なブランチをダウンロードします
Windows10はどの言語で書かれていますか
git pull init usermanager
Herokuプロセスファイルを取得する
git pull init heroku-webprocess
とともに Heroku Toolbelt インストール、アプリを作成
heroku create
マスターブランチをHerokuにプッシュします
git push heroku master
これで、ほんの数行のコードでキラー機能の開発を開始できます。それだけでなく、可能な限り自動化された開発スイートで、最新かつ最も効率的なテクノロジーを使用して開発することになります。
あなたが使用できることを願っています 初期化 あなたの次の素晴らしいアイデアを始めるために。 Initリポジトリで修正と機能を確認することを忘れないでください。その開発は非常に活発であり、フィードバックをお待ちしています。
のメンバーであるPabloFabregatによって翻訳されたコンテンツ TransBunko 、技術翻訳の市場。