私が知っている多くの PHP/LNMP プログラマーの開発軌跡によると、個人的な経験と組み合わせることで、多くのプログラマーの将来、特にテクノロジーの学習についての混乱を抽象化しています。パニックに陥った私は、多くの PHP プログラムが比較し、学習と成長の目標を設定できるように、各段階での PHP プログラマーの技術的要件を単純に整理しました。
この記事は、現在の主流のテクノロジーに基づいて基本的な概要を作成しています。設定全体は、PHP プログラマーがあまりしっかりとした基礎を持っていないという前提に基づいており、すべての設定が非常に具体的かつ明確であるため、不快に感じるかもしれません。ご家族を代表してのみご利用いただけますことをご了承ください。 (将来の技術変化については議論の範囲外です)
第一段階:基礎段階(基本的なPHPプログラマ)
キーポイント: LNMP に習熟する (中心となるのはインストールと構成の基本操作です)
目標: 基本的な LNMP システムのインストール、簡単な構成、およびメンテナンスを完了できるようにする。簡単なシステムの基本的な PHP 開発を実行できるようにする。中規模の PHP システムで特定の PHP 関数モジュールの開発をサポートできるようにする。
時間: この段階を完了するまでにかかる時間は人によって異なります。半年より早く成長する人もいれば、2、3 年かけてゆっくり成長する人もいます。
1.Linux:
基本的なコマンド、操作、起動、基本的なサービス構成 (rpm インストール ファイル、さまざまなサービス構成などを含む) は、単純なシェル スクリプトや awk/sed スクリプト コマンドなどを作成できます。
2.Nginx:
nginx+php をインストールして構成できるようになり、基本的な nginx コア構成オプションを理解し、server/fastcgi_pass/access_log などの基本構成を理解できるようになります。目標は、nginx+php_fpm をスムーズに動作させることです。
3.MySQL:
mysql を自分で構築でき、基本的な mysql 設定オプションを理解でき、innodb と myisam の違いを理解し、InnoDB と MyISAM の 2 つのエンジンの異なる設定オプションを理解できる。
2 つのエンジンの基本的な違いと、上記の選択肢の違いを理解し、純粋に手動で MySQL データベースをコンパイルおよび構築し、正常に安定して実行できるようにエンコーディングを構成できるようにすること。主な目的は、実行可能な MySQL を構築できるようにすることです。データベース。
配列、文字列、データベース、XML、ソケット、GD/ImageMgk 画像処理などの基本的な構文、MySQL 操作にリンクされたさまざまな API (mysql/mysqli/PDO) に精通しており、さまざまなコーディングの問題の解決方法を知っている。定期的に PHP フレームワーク (ThinkPHP、Zendframework、Yii、Yaf など) を使用します。
MVC の基本的な動作メカニズムとその理由を理解し、さまざまな PHP フレームワークの違いについて少し知っておくと、MVC フレームワークをすぐに学習できるようになります。開発プロジェクトのファイル ディレクトリ構成を理解し、基本的な優れたコード構造とスタイルを備え、小規模システムの開発と中規模システムの特定のモジュールの開発を完了できる。
5. フロントエンド:
JavaScript プログラミングの基本的な知識を理解します。
6. システム設計:
焦点: LNMP スキルを向上させ、LNMP をより包括的かつ熟練的に適用できるようになります。
目標: いつでもどこでも LNMP 環境をセットアップし、日常的な構成を迅速に完了して、発生する開発環境およびオンライン環境の問題のほとんどを追跡および解決できるようにする。 中規模システムのアーキテクチャと開発作業を独立して行うことができる; 大規模システムの中規模のモジュールの開発作業を行うことができる;1. リナックス:
最初の段階に基づいて、シェル スクリプトを使用して多くの自動化された作業を完了することができ、awk/sed/perl も適切に動作し、多くのテキスト処理とデータ統計を完了できます。
基本的に、特別ではないほとんどの Linux プログラム (MongoDB/Redis/Sphinx/Luncene/SVN などのさまざまなライブラリ、パッケージ、サードパーティの依存関係などを含む) をインストールできます。
基本的な Linux サービスを理解し、Linux パフォーマンス指標データを表示する方法を理解し、Linux での基本的な問題追跡について理解します。
最初の段階に基づいて、マルチコア構成、イベント、proxy_pass、sendfile/tcp_* 構成を含む、より複雑な Nginx 構成を理解し、タイムアウトやその他の関連する構成とパフォーマンスへの影響を把握します。
nginx は Web サーバーに加えて、プロキシ サーバーやリバース静的サーバーなどの構成も実行できることを理解し、基本的な nginx 構成のチューニングを理解し、nginx をコンパイルして nginx に拡張する方法を理解します。
nginx の基本的な動作原理 (マスター/ワーカーメカニズム、epoll) を理解し、nginx のパフォーマンスが Apache のパフォーマンスよりも優れている理由を理解します
;
3. MySQL/MongoDB:
第 1 段階に基づいて、通常の SQL 最適化 (group by/order by/rand 最適化など) を含む MySQL 開発の多くのヒントを習得します。
MySQL を構築できることに加えて、MySQL データをホットおよびコールド バックアップすることもできます (key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit など)。また、これらのオプションを構成するための適切な値もわかります。
さらに、mysql マスター/スレーブ同期環境の構築方法や binlog_format の違いなど、いくつかの特別な設定オプションについても知っています。
throw_log/explain などの MySQL パフォーマンス トレースを理解し、基本的なインデックスの作成と処理についても理解していること。
原理に関しては、基本的な MySQL アーキテクチャ (サーバー + ストレージ エンジン) を理解し、基本的な InnoDB/MyISAM インデックス ストレージ構造と相違点 (クラスター化インデックス、B ツリー) を理解します。
ほとんどの MySQL 例外に対する解決策を理解します (または、解決策がどこにあるかを知っています)。
条件が許せば、NoSQL の代表的なデータベースである MongoDB について学び、MySQL との違いを比較すると同時に、適切なアプリケーション シナリオで MongoDB を安全かつ慎重に使用し、PHP の基本的な組み合わせ開発を知ることをお勧めします。そしてMongoDB。
4.Redis/Memcached:
ほとんどの中規模システムでは、キャッシュ処理が必ず関与するため、基本的なキャッシュについて理解する必要があります
Memcached と Redis の類似点、相違点、アプリケーション シナリオを理解し、Redis/Memcached を個別にインストールできるようになり、Memcahed の基本的な機能と制限 (最大値など) を理解し、PHP とその使用法を組み合わせる方法を理解します。
Redis の基本的な動作原理と使用法を理解する、従来のデータ型を理解する、どの型がどのシナリオで使用されるかを知る、Redis トランザクションを理解するなど。原理部分では、Memcached のメモリ構造 (スラブ機構) を大まかに理解できます。Redis は、一般的なデータ型 (SDS/リンクリスト/SkipList/HashTable) などの基盤となる実装ストレージ構造を理解します。 Redis のトランザクション、RDB、AOF、その他のメカニズムについて詳しく学ぶことができます。
5.PHP:
6.C/C++:
特定の C/C++ 言語に手を出し始め、基本的な C/C++ コードを記述できるようになり、基本的な C/C++ 構文 (ポインター、配列操作、文字列、通常の標準 API) とデータ構造 (リンク リスト、ツリー) に精通する、ハッシュ、キュー)にはある程度の馴染みがあります
Linux での C 言語開発の基本を理解し、簡単な Makefile ファイルを作成でき、簡単な GCC/GDB プログラムを使用して簡単なデバッグ作業をコンパイルできること。
基本的なネットワーク プログラミングについて一般的に理解していること。 (この項目はより高いレベルへの基礎を築くためのものです)
最初の段階に基づいて、基本的な HTTP プロトコル (プロトコル コード 200/300/400/500、基本的な HTTP インタラクション ヘッダー) について理解します。
条件が許せば、もう少し洗練された HTML+CSS+JavaScript を詳細に記述することも、単にいくつかのフロントエンド フレームワーク (jQuery/YUI/ExtJS/RequireJS/BootStrap など) を使用することもできます。
条件が許せば、クロージャーメカニズムや DOM 処理などの JavaScript プログラミングを詳しく学ぶことができ、さらに詳しく学ぶ場合は、jQuery のソースコードを読んで詳しく学ぶことができます。 (フロントエンドに興味がない限り、この項目は重要な調査ではありません)
8. システム設計:
ほとんどの中規模システム向けに Web サイトのアーキテクチャ、データベース、および基本的な PHP フレームワークを設計でき、次のようなタスクを実行できます。 +PHP -> キャッシュ -> データベース構造の Web サイトの基本的な設計、開発、保守。毎日数百万から数千万のトラフィックが発生する Web サイトの開発と保守をサポートします。
第3段階:上級段階(上級PHPプログラマー)
キーポイント: 基本的な LNMP プログラムに加えて、特定の方向または分野についての詳細な学習も可能です。 (詳細な開発)
目標: 基本的な PHP ビジネス開発を完了することに加えて、ほとんどの詳細で複雑な技術的問題も解決でき、中規模および大規模なシステム設計と開発作業を独立して設計して完了できます。
私は特定の技術的方向性を独立して保持し、深く掘り下げることができ、この分野では比較的専門的です。 (たとえば、MySQL、Nginx、PHP、Redis など、あらゆる方向の詳細な調査)
第 2 段階の機能に加えて、Linux での通常の操作とパフォーマンスの監視と追跡に加えて、多くの高度で複雑なコマンドを使用して作業を完了することもできます (watch/tcpdump/starce/ldd/ar など)。シェル スクリプトに関しては、バックアップ、自動処理、監視などの多くのシェル タスクの完了を支援する比較的複雑なシェル スクリプト (500 行以上) をすでに作成できます。
私は awk/sed/perl などのアプリケーションに習熟し、テキスト統計を制御および処理し、さまざまな複雑な形式のデータを自由に分析できるようになりました。
Linux の内部メカニズム、カーネル モジュールの読み込みの基本処理、起動エラーの処理などをある程度理解します。また、NFS、ディスク管理などのその他の関連事項も理解します。
2.Nginx:
第 2 段階の基礎に基づいて、私は Nginx を非常に上手に操作できるようになり、モニタリング、パフォーマンスの最適化、複雑な問題の処理など、Nginx 上でより詳細な運用および保守作業を実行できるようになりました。
個人的な興味に応じて、主にソース コードを読むことから始めて、特定のマスター/ワーカーの動作メカニズム、Nginx の内部イベント処理、メモリ管理など、Nginx の動作原理の詳細な学習に焦点を当てることを検討できます。 ; 同時に学習することもできます Nginx 拡張機能の開発では、独自のプライベート拡張機能の一部をカスタマイズできます。
同時に、Nginx+Lua をある程度理解して、より良いモデルを組み合わせて適用できるかどうかを確認できます。この段階での要件は、Nginx の原則を深く理解することです。 Nginx の分野に精通したプロフェッショナル。
第 2 段階に基づいて、MySQL アプリケーションに関しては、以前の基本的な SQL 最適化に加えて、大規模なデータ バッチのインポートとエクスポート、オンラインの大規模バッチのテーブル構造の変更など、いくつかの複雑な操作を完了することもできます。データ、インデックス フィールドの追加または削除など。リスクの高い操作を待機しています。
インストールと構成に加えて、さまざまな問題のトレース、マスターとスレーブの同期遅延問題の解決、マシンルーム間のデータ同期ソリューション、MySQL の高可用性アーキテクチャなど、より複雑な MySQL の問題も処理できるようになりました。 MySQL アプリケーション レベルを理解しており、トランザクション メカニズム (分離レベル、ロックなど) などの MySQL の主要なテクノロジに精通しており、トリガー、パーティション、およびその他のテクノロジに関して一定の理解と応用を持っています。ディスク最適化 (SSD への SAS 移行)、サーバー最適化 (メモリ、サーバー構成)、第 2 段階 (innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout など) に加えてその他のコア パフォーマンス最適化オプション、接続を含む MySQL パフォーマンスのプール ソフトウェアの選択とアプリケーション、show * (show status/show profile) タイプ 操作ステートメントを深く理解し、ほとんどのパフォーマンス問題の追跡を完了できる。
災害復旧とリカバリ、Binlog、ホットおよびコールド バックアップ、マルチ IDC バックアップなどの深い理解
を含む、MySQL バックアップ テクノロジーに関する深い知識。
MySQLの原理に関しては、マスター・スレーブ同期(レプリケーション)技術のソースコードを学ぶなど、MySQLの動作メカニズムについてソースコードの一部を読み始めたり、あるストレージについて学んだりと、より知識が増えました。エンジン (MyISAM/Innodb/TokuDB) など。ソース コードの学習と理解。このプロセス中に、CSV エンジンを参照して独自のシンプルなストレージ エンジンを開発し、データを保存できます。興味があれば、DBA の方向で開発することも検討できます。
MongoDB レベルでは、たとえば、書き込みを減らし読み取りを増やす場合に MongoDB のオンライン適用を開始することや、オンライン データ分析と処理操作を実行することを検討できます。特定のシナリオは作業に基づいていますが、中心となるのは次のとおりです。 NoSQL とは異なるシナリオのアプリケーションについて、条件や関心が許せば、MongoDB の動作メカニズムについてさらに詳しく学び始めることができます。
4.Redis/Memcached:
第 2 段階に基づいて、より深い応用と学習を達成できます。 Memcached は特に複雑ではないため、深く理解するためにソース コード、特にメモリ管理の部分を読むことをお勧めします。
Redis 部分では、より複雑なデータ構造アプリケーションを実行できます (zset はランキング操作に使用され、トランザクション処理はフラッシュ セール シナリオ アプリケーションやその他の操作のアトミック性を確保するために使用されます)。
aof などの同期メカニズムを含むアプリケーションを学習するには、可用性の高い Redis アプリケーション アーキテクチャとクラスターを設計します。
Redis のソース コードを深く学習し、特にコア イベント管理、メモリ管理、内部コア データ構造などについて理解するために、第 2 段階で蓄積された知識を適用することをお勧めします。興味があれば、Redis の非常にプロフェッショナルなユーザーになることができます。
5.PHP:
基礎的なコアスキルとして、第2段階を踏まえたより深い学習と応用が必要です。基本的なコードの適用に関しては、PHP 開発で遭遇する問題の 95% を解決でき、PHP スキルのほとんどを理解できます。
ほとんどの PHP フレームワークは 1 日以内にすぐに使い始めることができ、主流の各 PHP フレームワークの長所と短所を理解できるため、2 番目で学習する知識に加えて、プロジェクト開発におけるテクノロジの選択が容易になります。この段階では、いくつかの複雑な高度な設定と拡張機能の原則 (memcached 拡張機能設定の memcache.hash_strategy、apc.mmap_file_mask/apc.slam_defense/apc. など) を含む、さらに不明瞭な設定オプション (php auto_prepend_file/auto_append_file) を理解できるようになります。 apc 拡張子の設定 file_update_protection など);
php-fpm の動作メカニズム (さまざまな構成マシンで php-fpm によって有効になるプロセス数の計算と原理など) を含む、php の動作メカニズムをよく理解していること、zend エンジンについての基本的な知識があること(vm/gc/stream 処理)、基本的な PHP カーネル ソース コードを読んでいること (または関連記事を読んでいること)、PHP の内部メカニズムのほとんどのコア データ構造 (基本型/配列/オブジェクト) の実装を理解していること、およびコアインフラストラクチャ (zval/hashtable/gc) を深く理解しており、基本的な PHP 拡張機能の開発を実行でき、拡張機能開発に関する中級および上級の知識 (minit/rinit など) を理解しており、 php と apache/nginx の間のさまざまな通信および対話方法の詳細 (mod_php/fastcgi);
PHP 拡張機能の開発に加えて、PHP をより低いレベルから理解するために Zend 拡張機能の開発を学習することを検討できます。
6.C/C++:
マルチプロセスの状況下では、マルチプロセス間の通信方法のほとんどを理解しており、通信方法 (共有メモリ/セマフォ/パイプラインなど) を柔軟に選択できます。マルチスレッドプログラミングはロック競合の問題をうまく解決できます。マルチスレッド プログラムを開発できると同時に、ネットワーク プログラミングに精通し、マルチプロセス モデル/マルチスレッド モデル/非同期ネットワーク IO モデルの違いと選択を理解し、原理と違いを理解します。また、一般的な非同期フレームワーク (ACE/ICE/libev/libevent/libuv/Boost.ASIO など) とその使用方法についてもよく知っています。自由な時間があれば、国内で開発されたライブラリ (Muduo など) を検討することもできます。同時に、優れた同時実行性の高いプログラム (リーダーフォロー/マスターワーカーなど) を設計することもできます。
C/C++ バックエンド サーバー開発におけるほとんどの問題 (メモリ管理、ログ出力、高い同時実行性、フロントエンドとバックエンドの通信プロトコル、サービスの監視) を理解し、各バックエンド サービスの RPC 通信の問題を理解している(struct/http/thirft/protobuf など) ; GCC と GDB をより使いやすくコンパイルおよびデバッグ プログラムを開発できるようになり、一般的なモジュール開発に関してオンライン プログラムのコア化後の問題を迅速にトレースおよび解決できるようになります。いくつかの一般的なツールやライブラリ (非同期ネットワーク フレームワーク、ログ ライブラリ、メモリ プール、スレッド プールなど) を蓄積または開発できますが、バグを追う必要がないように、開発後にそれを適用するかどうかに注意する必要があります。
7. フロントエンド:
HTTP プロトコルについての深い理解 (前に説明したものに加えて、各詳細なプロトコル、特別なプロトコル コードとその背後にある理由、たとえば 302 個の静的ファイルがキャッシュされている、502 は nginx の背後にある PHP がダウンしていることを意味するなど)。 - さまざまなフレームワーク アプリケーション統合機能のエンド側面、フロントエンド側面 学習に興味がある場合は、jQuery などのいくつかのフロントエンド フレームワークの開発や、比較的簡単なリッチ テキスト エディターの開発という形でさらに深く学ぶことができます。 JavaScript スキルの簡単なテスト
基本的な PHP/C/C++ 言語の基礎が蓄積されています。個人的な興味や趣味に応じて、現時点でさまざまなプログラミング言語を学習することをお勧めします。スクリプト言語については、Python/Ruby を学ぶことができます。関数型プログラミング言語については、Lisp/Haskell/Scala/Erlang などを試してください。データ統計分析については、R 言語について学ぶことができます。バックエンドビジネスを行う場合は、上記のように Nginx_Lua と Nginx などを組み合わせて試すことができます。さまざまな言語を学ぶことは、主に自分自身のビジョンと問題解決方法の違いを改善することです。たとえば、クロスマシン通信シナリオには、プロセス/スレッドに加えて軽量のコルーチンもあることを理解するでしょう。 , Erlang の解決策は驚くほど簡単です。たとえば、C/C++ を選択したくない場合は、主に視野を広げるために、同様の効率的な Erlang/Golang も利用できます。
9. 他の専門的な方向で勉強する:
この段階では、基本的な LNMP スキルに加えて、個人の興味や長期的な目標に応じて、他の分野の知識を学ぶことも検討します。現在、クラウドコンピューティング(分散ストレージ、分散コンピューティング、仮想マシンなど)、機械学習(データマイニング、パターン認識など、統計への応用、パーソナライズされたレコメンデーション)、自然科学など、選択できる分野は数多くあります。言語処理 (中国語の単語分割など)、検索エンジン技術、グラフィックスと画像、音声認識など。これらの高度な分野に加えて、高性能システム、モバイル開発 (Android/IOS)、コンピュータ セキュリティ、組み込みシステム、ハードウェアなど、エンジニアリングについてさらに学ぶことができる分野も数多くあります。
10. システム設計:
システム設計の第 2 段階に基づいて、習得した経験とスキルを応用して、比較的複雑な中規模および大規模システムを設計できます。これにより、さまざまなオンラインの複雑なシステムの問題のほとんどを解決でき、ブラウザと同様のタスクを完了できます。 ; CDN - > アクセス層 - > ビジネス キャッシュ - > さまざまなバックエンド RPC 相互作用 (ストレージ バックエンド、アンチチート バックエンド、外部サービス) -> 毎日数千万から数億のトラフィックがある Web サイトの通常の開発と保守をサポートできる、より複雑なバックエンド サービス。
フェーズ 4: アーキテクチャフェーズ (アーキテクト)
第5段階:エキスパートステージ(ディレクション分野のエキスパート)
第6ステージ:科学者ステージ
「夜の通行人」ブログより転載。