Improve Quality with Software Components
While web application development is a relatively new branch of software engineering, many of the traditional software engineering practices apply to it:
Following proper software engineering techniques (or modifying them for web development) can have a substantial impact on overall system usability primarily because it enables developers to achieve higher quality.
Usability for the Web: Designing Web Sites that Work, 2001
Web development as an industry has grown up from something that was considered tinkering with something secondary to a crucial business function. In the last five years or so the advent of Version Control (and GitHub as a platform), Automated Testing and Packet Management have given the web development community shared tools to achieve better quality than ever before.
None of these concepts are really new as creation complex software, like Operating Systems, has required similar tools to be able to be built at all. Sure the old tools (even Subversion today) seem cumbersome to use and limited in functionality - but they all served the same goal: Help developers work in teams to achieve a common goal.
All of the above is just tooling, but it also takes other things to achieve better quality. For a long time web developers in general were subject to the NIH (Not Invented Here) syndrome.
Web developers - all grown up
Web developers have gone through the typical evolution cycle. We first tended to build everything from scratch in our programming language of choice. Then we moved forward to adding structure and common methods via Web Application Frameworks, but we still spent a lot of time working on similar problems.
Today it is quite commonplace for Node.js and PHP developers to first look at NPM or Packagist if there is a software component that would help us do a particular task in our software. Perl developers had CPAN (the Comprehensive Perl Archive Network) since the nineties, so this concept is not exactly new either.
It's great that mainstream web developers have learned to put their ego aside to achieve higher productivity and better quality. Components shared with a whole community of users and use scenarios are bound to be more robust over time.
Software Components in PHP
In the realm of this blog, Symfony and other PHP components, with strong decoupling (independency of the core application, such as a CMS, of any individual component) are a great thing. PHP has matured to something that allows us to build complex software with a flexible architecture to evolve during the application lifetime cycle.
So instead of PHP developers separately solving problems of traversing filesystems or SQL abstractions, we can now share and take these into use easily. Please note that this is a shared responsibility that is underlined in a tweet from Lukas Kahwe Smith, on the state of contributions to popular Symfony Bundles FOSUserBundle and FOSRestBundle:
countless contributors to #Symfony core but FOSUserBundle and FOSRestBundle are unable to keep up in terms of resources. its a big problem
— Lukas Kahwe Smith (@lsmith) July 10, 2015
One of the best examples of reuse of common components like templating, HTTP communications, configuration file processing, and more are Content Management Systems. There's still likely room for improvement here, but read how three different CMS products (Bolt, Drupal and eZ Platform) have taken Symfony Components into use.
This all obviously focuses on the server side application development, which pales in comparison to the improvements, like web components, that have taken the front end developer community by storm.
For perspective and examples of popular components, the top ten packages on Packagist.org at the time of writing are:
- monolog/monolog
Sends your logs to files, sockets, inboxes, databases and various web services - psr/log
Common interface for logging libraries - symfony/event-dispatcher
Symfony EventDispatcher Component - phpunit/php-code-coverage
Library that provides collection, processing, and rendering functionality for PHP code coverage information. - symfony/yaml
Symfony Yaml Component - symfony/console
Symfony Console Component - phpunit/phpunit
The PHP Unit Testing framework. - phpunit/phpunit-mock-objects
Mock Object library for PHPUnit - phpunit/php-text-template
Simple template engine. - phpunit/php-token-stream
Wrapper around PHP's tokenizer extension.