This article divides PHP programmers into two categories: intermediate and advanced programmers, and explores the skills that these two categories of programmers should have.
Intermediate PHP Programmer
1.Linux:
Be able to use Shell scripts smoothly to complete many automated tasks ; awk/sed/perl also operates well and can complete a lot of text processing and data statistics; it can basically install most non-special Linux programs (including various libraries, packages, third-party dependencies, etc., such as MongoDB/Redis /Sphinx/Luncene/SVN and the like); understand basic Linux services, know how to view Linux performance indicator data, know basic issue tracking under Linux, etc.
2. Nginx:
Based on the first stage, understand the more complex Nginx configuration; including multi-core configuration, events, proxy_pass, sendfile/tcp_* configuration, know the timeout and other related configuration and performance impact; know that nginx is in addition to the web server , can also undertake the configuration of proxy servers, reverse static servers, etc.; know basic nginx configuration tuning; know how to configure permissions, compile an nginx extension to nginx; know the basic nginx operating principles (master/worker mechanism, epoll), know Knowledge about why nginx performance is better than apache performance;
3. MySQL/MongoDB:
On the basis of the first stage, I have mastered many small skills in MySQL development. Skills, including general SQL optimization (group by/order by/rand optimization, etc.); in addition to being able to build MySQL, you can also hot and cold backup MySQL data, and you also know the configuration options that affect innodb/myisam performance (such as key_buffer/query_cache /sort_buffer/innodb_buffer_pool_size /innodb_flush_log_at_trx_commit, etc.), and also know the appropriate values for configuring these options; in addition, I also know some special configuration options, such as knowing how to set up a mysql master-slave synchronization environment, knowing the differences between various binlog_format; knowing the performance tracking of MySQL, including slow_log/ explain, etc., you can also know basic index creation processing and other knowledge; understand the basic MySQL architecture (Server storage engine) in terms of principles, know the basic InnoDB/MyISAM index storage structure and differences (clustered index, B-tree); know the basic InnoDB transaction processing mechanism; understand the solutions to most MySQL exceptions (or know where to find the solutions). If conditions permit, it is recommended to learn about the MongoDB database, a representative of NoSQL, and compare the differences with MySQL. Colleagues can use MongoDB safely and prudently in suitable application scenarios, and know the basic combined development of PHP and MongoDB.
4. Redis/Memcached:
In most medium-sized systems, cache processing will definitely be involved, so you must understand the basic cache; know Memcached and Redis Similarities, differences and application scenarios, be able to install Redis/Memcached independently, understand some basic features and limitations of Memcached, such as the maximum value, and know how to combine PHP with their use; understand the basic working principles and usage of Redis, understand conventional data types, and know Which types should be used in what scenarios, understand Redis transactions, etc. In the principle part, you can have a general understanding of the memory structure of Memcached (slab mechanism). Redis understands the underlying implementation storage structure of common data types (SDS/linked list/SkipList/HashTable), etc. By the way, you can learn more about Redis's transactions, RDB, AOF and other mechanisms. Good
5. PHP:
In addition to the first stage capabilities, in terms of installation and configuration, you can freely install the compilation and installation configuration of PHP and various third-party extensions; understand PHP -Most of the configuration options and meanings of fpm (such as max_requests/max_children/request_terminate_timeout and other configurations that affect performance), know the difference between mod_php/fastcgi; have become proficient in various basic technologies in PHP, including various more in-depth PHP, including in-depth understanding of PHP object-oriented/SPL/special features at the syntax level such as reflection; in terms of frameworks, I have read the code of at least one conventional PHP MVC framework, and know the internal implementation mechanism and design of the basic PHP framework Thought; in PHP development, you have become proficient in using conventional design patterns for application development (abstract factory/single case/observer/command chain/strategy/adapter, etc. patterns); it is recommended to develop your own PHP MVC framework to fully liberalize development , let yourself deeply understand the MVC model, and also enable yourself to quickly upgrade in business project development; be familiar with various code optimization methods of PHP, and be familiar with solving most PHP security problems; be familiar with the basic PHP execution mechanism principles (Zend Basic working mechanism of engine/expansion);
6. System design:
Able to design website architecture, database, and basic PHP framework selection for most medium-sized systems; performance Testing, troubleshooting, etc.; can complete basic design, development and maintenance of websites similar to: browser-> CDN (Squid) -> Nginx PHP -> cache-> database structure; can support millions to tens of millions of basic traffic every day Website development and maintenance work;
Senior PHP Programmer
Focus: In addition to basic LNMP programs, you can also have in-depth study in a certain direction or field. (Deep dimension development)
Goal: In addition to being able to complete basic PHP business development, you can also solve most in-depth and complex technical problems, and can independently design and complete medium and large-scale system design and development work; you can independently hold a deep dive into a certain technical direction, and work in This one is more professional. (For example, in-depth research in any direction such as MySQL, Nginx, PHP, Redis, etc.)
1. Linux:
In addition to the second stage capabilities, under Linux In addition to regular operations and performance monitoring and tracking, you can also use many advanced and complex commands to complete the work (watch/tcpdump/starce/ldd/ar, etc.); in terms of shell scripts, you can already write relatively complex shell scripts (more than 500 lines) Shell to assist in completing many tasks including backup, automated processing, monitoring, etc.; has become proficient in applications such as awk/sed/perl, and can freely operate, control, process, text statistics and analyze data in various complex formats; has knowledge of Linux internal mechanisms Some understanding, basic processing of kernel module loading, startup error handling, etc.; also some understanding of other related things, such as NFS, disk management, etc.;
2. Nginx:
On the basis of the second stage, I have been able to operate Nginx very proficiently and can perform more in-depth operation and maintenance work on Nginx, such as monitoring, performance optimization, complex problem handling, etc.; see For personal interests, you can consider focusing on in-depth study of the working principle of Nginx, mainly starting from reading the source code, such as the specific master/worker working mechanism, Nginx internal event processing, memory management, etc.; at the same time, you can learn Nginx In the development of extensions, you can customize some of your own private extensions; at the same time, you can have a certain degree of understanding of Nginx Lua to see if it can be combined and applied to create a better model; the requirement at this stage is an in-depth understanding of the principles of Nginx, and you can consider becoming an Nginx developer In-depth professional in the direction.
3. MySQL/MongoDB:
Based on the second stage, in terms of MySQL applications, in addition to the previous basic SQL optimization, some complex tasks can also be completed. Operations, such as importing and exporting large batches of data, changing table structures or adding or deleting index fields for online large batches of data, and other high-risk operations; in addition to installation and configuration, it has been able to handle more complex MySQL problems, such as the tracing of various problems. Solving the master-slave synchronization delay problem, cross-machine room synchronization data solutions, MySQL high-availability architecture, etc. are all involved; for the MySQL application level, I am familiar with the core key technologies of MySQL, such as transaction mechanisms (isolation levels, locks, etc.), Have a certain understanding and application of technologies such as triggers and partitions; MySQL performance includes disk optimization (SAS migration to SSD), server optimization (memory, server configuration), and other core performance optimization options in addition to the second stage (innodb_log_buffer_size/ back_log/table_open_cache /thread_cache_size/innodb_lock_wait_timeout, etc.), connection pool software selection application, have in-depth understanding of operation statements such as show * (show status/show profile), and can complete most performance problem tracing; in-depth familiarity with MySQL backup technology, Including disaster recovery and restoration, in-depth understanding of Binlog, hot and cold backup, multi-IDC backup, etc.; have a better understanding of MySQL principles, such as starting to read some source codes for the working mechanism of MySQL, such as master-slave synchronization (replication) technology Source code learning, or source code learning and understanding of a certain storage engine (MyISAM/Innodb/TokuDB), etc. If conditions permit, you can refer to the CSV engine to develop your own simple storage engine to save some data and enhance your understanding of MySQL; In this process, if you are interested, you can also consider developing in the direction of DBA. At the MongoDB level, you can consider, for example, starting to apply MongoDB online when writing less and reading more, or doing some online data analysis and processing operations. The specific scenarios can be based on the work, but the core is to have a better and in-depth understanding of RMDBS. For applications in different scenarios from NoSQL, if conditions or interests permit, you can start to learn more about the working mechanism of MongoDB.
4. Redis/Memcached:
Based on the second stage, more in-depth application and learning can be achieved. Because Memcached is not particularly complicated, it is recommended to read the source code, especially the memory management part, to facilitate in-depth understanding; in the Redis part, you can do more complex data structure applications (zset is used for ranking ranking operations/transaction processing to ensure Atomicity is used in flash sale scenario applications); it mostly involves learning applications of synchronization mechanisms such as aof, and designing a highly available Redis application architecture and cluster; it is recommended that you study the source code of Redis in depth and put it into the second stage The accumulated knowledge can be applied. In particular, you can read about core event management, memory management, internal core data structure, etc. to fully understand it. If your interest allows, you can become a very professional user of Redis.
5. PHP:
As basic core skills, we need more in-depth study and application based on the second stage. In terms of basic code application, you can solve 95% of the problems encountered in PHP development and understand most PHP techniques; you can quickly start using most PHP frameworks within a day, and understand the advantages of each mainstream PHP framework. Disadvantages: It can quickly and conveniently make technology selection in project development; in terms of configuration, in addition to the knowledge of the regular second stage, you will also understand some more obscure configuration options (php auto_prepend_file/auto_append_file), including some complex advanced configurations in extensions and principles (such as memcache.hash_strategy in memcached extension configuration, apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection in apc extension configuration, etc.); have a good understanding of the working mechanism of php, including php-fpm working mechanism (such as php-fpm enables process number calculation and principle under different configuration machines), has basic familiarity with the zend engine (vm/gc/stream processing), has read the basic PHP kernel source code (or read related articles), and has an understanding of the internal mechanism of PHP Have an understanding of the implementation of most core data structures (basic types/Array/Object), and have an in-depth understanding of the core infrastructure (zval/hashtable/gc); be able to carry out basic PHP extension development, and understand some intermediate and advanced knowledge of extension development (minit/rinit, etc.), be familiar with the details of different communication and interaction methods between php and apache/nginx (mod_php/fastcgi); in addition to developing PHP extensions, you can consider learning to develop Zend extensions to understand PHP from a lower level.
6. C/C:
Based on the second stage, you can have a deeper understanding of the C/C language and be able to complete small and medium-sized C programs. /C system development work; in addition to the basic C/C syntax and data structure in the second stage, you can also learn some special data structures (b-tree/rb-tree/skiplist/lsm-tree/trie-tree, etc.) for convenience Required in special work; in terms of system programming, familiar with multi-process and multi-thread programming; in multi-process situations, understand most of the communication methods between multi-processes, and be able to flexibly choose communication methods (shared memory/semaphore/pipeline, etc.); Multi-threaded programming can well solve lock conflict problems, and can develop and debug multi-threaded programs; at the same time, he is familiar with network programming, understands the differences and selections of multi-process models/multi-thread models/asynchronous network IO models, and is familiar with different The principles and differences of asynchronous network IO models (select/poll/epoll/iocp, etc.), and you are familiar with common asynchronous frameworks (ACE/ICE /libev/libevent/libuv/Boost.ASIO, etc.) and their uses. You can also take a look if you have time. Some domestically developed libraries (such as muduo); at the same time, able to design good high-concurrency program architecture (leader-follow/master-worker, etc.); understand most of the problems in C/C back-end server development (memory management, log printing , high concurrency, front-end and back-end communication protocols, service monitoring), know the RPC communication issues of each back-end service (struct/http/thirft/protobuf, etc.); be able to use GCC and GDB more familiarly to develop compilation and debugging programs, and online programs After the core is dropped, the problem can be quickly traced and solved; in terms of general module development, some general tools or libraries can be accumulated or developed (such as asynchronous network framework, log library, memory pool, thread pool, etc.), but you should be cautious whether to apply it after development. Save yourself the trouble of chasing bugs;
7. Front-end:
Deeply understand the HTTP protocol (including each detailed protocol, special protocol code and the reasons behind it, such as 302 static files Cached, 502 means that php behind nginx is down, etc.); In addition to the previous integration capabilities of various framework applications in the front-end, if you are interested in learning the front-end, you can go deeper, in the form of developing something similar to jQuery yourself. Front-end framework, or developing a rich text editor is a relatively trivial test of JavaScript skills;
8. Language learning in other fields:
In basic PHP/C /C language has basic accumulation. It is recommended that you try to learn different programming languages at the current stage, depending on your personal interests and hobbies. For scripting languages, you can learn Python/Ruby, and for functional programming languages, you can try Lisp/Haskell/Scala. /Erlang and the like. For static languages, you can try Java /Golang. For data statistical analysis, you can learn about R language. If you want to change your perspective and do back-end business, you can try Node.js and the aforementioned Nginx_Lua combined with Nginx. wait. Learning different languages is mainly about improving your own vision and the differences in problem-solving methods. For example, you will understand that in addition to processes/threads, there are also lightweight coroutines; for example, in cross-machine communication scenarios, Erlang's solution is surprisingly simple; for example If you don't want to choose C/C, there are also similar efficient Erlang/Golang available, etc.; mainly to improve your horizons.
9. Study in other professional directions:
At this stage, in addition to basic LNMP skills, we will also consider learning knowledge in other fields. These are all possible, depending on personal interests and long-term goals. At present, there are many fields to choose from, such as cloud computing (distributed storage, distributed computing, virtual machines, etc.), machine learning (data mining, pattern recognition, etc., applied to statistics, personalized recommendations), natural language processing ( Chinese word segmentation, etc.), search engine technology, graphics and images, speech recognition, etc. In addition to these advanced ones, there are also many places where you can learn more about engineering, such as high-performance systems, mobile development (Android/IOS), computer security, embedded systems, hardware, etc.
10. System design:
Based on the second stage, system design can apply the experience and skills mastered to design relatively complex medium and large systems. It can solve most of the problems of various complex online systems and complete tasks such as browser-> CDN -> load balancing-> access layer-> Nginx PHP -> business cache-> database-> Various complex back-end RPC interactions (storage back-end, logic back-end, anti-cheating back-end, external services) -> More complex back-end business; able to support the normal development of websites with tens to hundreds of millions of traffic every day maintenance work.