<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Giustino Borzacchiello</title>
    <description>The latest articles on Forem by Giustino Borzacchiello (@jubstuff).</description>
    <link>https://forem.com/jubstuff</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F199353%2F805322a8-0b56-47dc-a73f-9a872a2b2438.jpg</url>
      <title>Forem: Giustino Borzacchiello</title>
      <link>https://forem.com/jubstuff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jubstuff"/>
    <language>en</language>
    <item>
      <title>A PHP time-lapse: tools and resources for Modern PHP</title>
      <dc:creator>Giustino Borzacchiello</dc:creator>
      <pubDate>Wed, 31 Jul 2019 20:36:59 +0000</pubDate>
      <link>https://forem.com/jubstuff/a-php-time-lapse-tools-and-resources-for-modern-php-1kb8</link>
      <guid>https://forem.com/jubstuff/a-php-time-lapse-tools-and-resources-for-modern-php-1kb8</guid>
      <description>&lt;p&gt;PHP has come a long way since its humble beginnings as a simple scripting language and Modern PHP has several peculiar &lt;em&gt;traits&lt;/em&gt; (see what I did there?)&lt;/p&gt;

&lt;p&gt;But with a simple Google search along with great material about how to write Modern PHP you will find a lot of outdated blog posts or resources that should be ignored. &lt;/p&gt;

&lt;p&gt;In this post, I've tried to collect &lt;strong&gt;a few outstanding resources that have helped me become a better PHP developer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But first, the time-lapse.&lt;/p&gt;




&lt;p&gt;I still remember the first website I created using PHP. It was during high school: I was teaching myself Turbo Pascal and I was able to do simple sites in HTML.&lt;/p&gt;

&lt;p&gt;Then I saw a friend of mine programming, and it wasn't Turbo Pascal. I remember that all those dollar signs were a bit strange.&lt;/p&gt;

&lt;p&gt;What's that?&lt;br&gt;
It's a new programming language, it's called PHP. You can build dynamic websites with it.&lt;br&gt;
What do you mean with &lt;em&gt;dynamic&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Without talking, he wrote something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;ul&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;li&amp;gt;Item number '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/li&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/ul&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And reloaded the page (he was using &lt;a href="https://www.easyphp.org/" rel="noopener noreferrer"&gt;EasyPHP&lt;/a&gt; as a local server).&lt;/p&gt;

&lt;p&gt;One thousand &lt;code&gt;li&lt;/code&gt; element created on the fly. ONE THOUSAND. It would have taken me a bit of time to write that in static HTML. I wanted, better, I needed to learn how to do that!&lt;/p&gt;

&lt;p&gt;I copied the EasyPHP installer on some random floppy disk, along with some PHP files to learn from. That evening I wrote my first &lt;em&gt;Hello, World&lt;/em&gt; and a great looking website that featured header, sidebar, main content, and footer all split into separate files and fetched via &lt;code&gt;include&lt;/code&gt;. I felt powerful! &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Fast forward five years&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I'm at university and I find a little part-time job as a web developer. I'm excited about all the things I'm going to learn. They told me I need to migrate an app from PHP4 to PHP5. Of course, I wasn't prepared for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//UPDATE LAST ACTION&lt;/span&gt;
&lt;span class="nv"&gt;$DB&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"UPDATE users SET last_action=NOW() WHERE id="&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'fw_userid'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//CHECK FOR EXPIRED PASSWORD&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$CONF&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'days_cpw'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$yy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$mm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$dd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;explode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"-"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'last_pw_change'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nv"&gt;$olddata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$mm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$dd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$yy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$span&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$olddata&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$days_passed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$span&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$days_passed&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$CONF&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'days_cpw'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;strstr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;SCRIPT_NAME&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;"mod_user"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;strstr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;SCRIPT_NAME&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;"calendar_iframe"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;strstr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;SCRIPT_NAME&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;"cron_web_start"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"location: "&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$CONF&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'url_base'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$CONF&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'dir_modules'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'admin/pages/mod_user.php?id='&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'fw_userid'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'&amp;amp;action=cp'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//Template inizialization&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"template.php"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Load Modules configuration in memory&lt;/span&gt;
&lt;span class="nf"&gt;load_modules_config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//Include permission manager&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"permission.php"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course PHP4 wasn't the problem...It was a rough ride, but it was fun!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Fast forward fifteen years&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I want to try out a new idea for a simple web app. I &lt;code&gt;cd&lt;/code&gt; into a folder and create a PHP file. &lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;php -S localhost:8000 -t public/&lt;/code&gt; will spin off a dev server for me. &lt;/p&gt;

&lt;p&gt;I need to read some CSV file: &lt;code&gt;composer require league/csv&lt;/code&gt; is all I need to do to download a robust library for CSV handling.&lt;/p&gt;

&lt;p&gt;Since I want to make sure that my application is robust, let's install a testing framework: &lt;code&gt;composer require --dev phpunit/phpunit ^8&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I don't like to use &lt;code&gt;require_once&lt;/code&gt; all over the place: luckily Composer provides a &lt;a href="https://www.php-fig.org/psr/psr-4/" rel="noopener noreferrer"&gt;PSR-4 compliant autoloader&lt;/a&gt; for free.&lt;/p&gt;

&lt;p&gt;Now let's try to make an API for that: I can choose from multiple &lt;a href="https://www.php-fig.org/psr/psr-15/" rel="noopener noreferrer"&gt;PSR-15 Server Request Handlers&lt;/a&gt; that digest &lt;a href="https://www.php-fig.org/psr/psr-7/" rel="noopener noreferrer"&gt;PSR-7 HTTP messages&lt;/a&gt; and focus just on my business logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tools &amp;amp; Resources
&lt;/h2&gt;

&lt;p&gt;If you want to know more, here are several resources and tools that have helped me learn more about the language.&lt;/p&gt;

&lt;h3&gt;
  
  
  PHP: The Right Way
&lt;/h3&gt;

&lt;p&gt;If you could choose just one resource to know more about Modern PHP, then &lt;a href="https://phptherightway.com/" rel="noopener noreferrer"&gt;PHP: The Right Way&lt;/a&gt; would be that one.&lt;/p&gt;

&lt;p&gt;It's less about the language and more about the ecosystem and the best practices that have emerged during the years. &lt;/p&gt;

&lt;p&gt;An absolute must-read.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency management via Composer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Flogo-composer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Flogo-composer.png" alt="Composer logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can say without exaggeration that Composer is one of the best things happened to PHP. I always found PEAR confusing to use, while Composer is immediate and ubiquitous.&lt;/p&gt;

&lt;p&gt;Of course a dependency manager without packages to manage is a bit useless so I need to mention also &lt;a href="https://packagist.org/" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt;, a repository where (almost) all PHP libraries are uploaded and fetched by Composer.&lt;/p&gt;

&lt;p&gt;I think that Composer played a big part in the recent switch from monolithic framework to composing of libraries that &lt;/p&gt;

&lt;p&gt;Some great reads about this topic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kevinsmith.io/modern-php-without-a-framework" rel="noopener noreferrer"&gt;Modern PHP Without a Framework&lt;/a&gt; by &lt;a href="https://twitter.com/_kevinsmith" rel="noopener noreferrer"&gt;Kevin Smith&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://symfony.com/doc/current/create_framework/index.html" rel="noopener noreferrer"&gt;Create your own PHP Framework&lt;/a&gt; - Symfony docs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modern PHP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Fmodern-php-cover.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Fmodern-php-cover.jpg" alt="Modern PHP book cover"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if &lt;a href="https://www.amazon.com/Modern-PHP-Features-Good-Practices/dp/1491905018" rel="noopener noreferrer"&gt;this book&lt;/a&gt; by &lt;a href="https://twitter.com/codeguy" rel="noopener noreferrer"&gt;Josh Lockhart&lt;/a&gt; is a bit old, it does a great job at explaining "new" features introduced in PHP and other best practices. It's a great complement to PHP: The Right Way.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Psysh
&lt;/h3&gt;

&lt;p&gt;The one thing I missed from my times as a Python developer was the iPython REPL. After discovering &lt;a href="https://psysh.org/" rel="noopener noreferrer"&gt;Psysh&lt;/a&gt;, my nostalgia faded away.&lt;/p&gt;

&lt;p&gt;It's simply the best REPL for PHP, and its &lt;code&gt;doc&lt;/code&gt; feature give me the ability to check the PHPdoc without leaving the terminal every time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Fpsysh-doc-command.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Fpsysh-doc-command.png" alt="The doc command for array_map"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;A list like this wouldn't be complete without mentioning some testing-related resource. But it will be a really obvious one. &lt;/p&gt;

&lt;p&gt;I still feel that the best place to start is the &lt;a href="https://phpunit.readthedocs.io/en/8.2/" rel="noopener noreferrer"&gt;PHPUnit Manual&lt;/a&gt; as far as PHP is concerned. &lt;/p&gt;

&lt;p&gt;Then, if you want to learn more about testing in general and TDD, these are my top recommendations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.growing-object-oriented-software.com/" rel="noopener noreferrer"&gt;Growing Object-Oriented Software Guided by Tests&lt;/a&gt;: one of best books about software design and TDD and tests in general,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.it/Test-Driven-Development-Example-Kent-Beck/dp/0321146530" rel="noopener noreferrer"&gt;Test-Driven Development By Example&lt;/a&gt;: a must-read if you're serious about TDD,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pragprog.com/book/jrtest/the-way-of-the-web-tester" rel="noopener noreferrer"&gt;The Way of the Web Tester&lt;/a&gt;: a gentle introduction if you don't know anything about tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modernizing Legacy Applications In PHP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Fmodernizing-legacy-applications-php-book-cover.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiustino.blog%2Fwp-content%2Fuploads%2F2019%2F07%2Fmodernizing-legacy-applications-php-book-cover.png" alt="Modernizing Legacy applications with PHP book cover"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've all been there. During the interview, you're sold futuristic technology and once you're at your new job, you're faced with a big, leaking bull of mud. And you just want to run away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://leanpub.com/mlaphp" rel="noopener noreferrer"&gt;Modernizing Legacy Applications In PHP&lt;/a&gt; by &lt;a href="http://paul-m-jones.com/" rel="noopener noreferrer"&gt;Paul M. Jones&lt;/a&gt; helps you step by step untangle that mess. Really well written!.&lt;/p&gt;




&lt;p&gt;So these are my favorite resources about Modern PHP: did I miss something? What's yours?&lt;/p&gt;

</description>
      <category>php</category>
      <category>resources</category>
    </item>
    <item>
      <title>10 challenges I've failed, and it's not the end of the world</title>
      <dc:creator>Giustino Borzacchiello</dc:creator>
      <pubDate>Fri, 26 Jul 2019 18:42:40 +0000</pubDate>
      <link>https://forem.com/jubstuff/10-challenges-i-ve-failed-and-it-s-not-the-end-of-the-world-1dec</link>
      <guid>https://forem.com/jubstuff/10-challenges-i-ve-failed-and-it-s-not-the-end-of-the-world-1dec</guid>
      <description>&lt;p&gt;I have to admit it: I'm not very consistent when it comes to personal challenges.&lt;/p&gt;

&lt;p&gt;During the years I've challenged myself in various and often creative ways:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;
&lt;a href="http://hundredpushups.com/"&gt;One hundred pushups&lt;/a&gt;. &lt;strong&gt;Failed&lt;/strong&gt; &lt;em&gt;(also, the sister project &lt;a href="http://www.twohundredsitups.com/"&gt;Two hundred situps&lt;/a&gt;)&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Playing piano 30 minutes a week. &lt;strong&gt;Failed&lt;/strong&gt;
&lt;/li&gt;
    &lt;li&gt;Finishing &lt;a href="https://projecteuler.net/"&gt;"Project Euler"&lt;/a&gt;. &lt;strong&gt;Failed&lt;/strong&gt;
&lt;/li&gt;
    &lt;li&gt;Doing at least one kata from &lt;a href="https://www.codewars.com/"&gt;Codewars&lt;/a&gt; a week. &lt;strong&gt;Failed&lt;/strong&gt;
&lt;/li&gt;
    &lt;li&gt;Doing at least two lessons on &lt;a href="https://www.duolingo.com/"&gt;Duolingo&lt;/a&gt; (French) a day. &lt;strong&gt;Failed&lt;/strong&gt; &lt;em&gt;(I survived two months)&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Track my daily activities on &lt;a href="https://home.idonethis.com/"&gt;I Done This&lt;/a&gt;. &lt;strong&gt;Failed&lt;/strong&gt;
&lt;/li&gt;
    &lt;li&gt;Publish a weekly screencast about PHPStorm. &lt;strong&gt;Failed&lt;/strong&gt; &lt;em&gt;(&lt;a href="https://www.youtube.com/watch?v=W98qHLTfMQk"&gt;I managed to publish one&lt;/a&gt;) &lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Write &lt;a href="http://juliacameronlive.com/basic-tools/morning-pages/"&gt;morning&lt;/a&gt; &lt;a href="https://www.theguardian.com/lifeandstyle/2014/oct/03/morning-pages-change-your-life-oliver-burkeman"&gt;pages&lt;/a&gt; daily. &lt;strong&gt;Failed&lt;/strong&gt; &lt;em&gt;(I wrote maybe ten, or twelve)&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Wake up and go for a run three times a week. &lt;strong&gt;Failed&lt;/strong&gt;  &lt;em&gt;(I survived three months)&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Submit a patch to WordPress Core weekly. &lt;strong&gt;Failed&lt;/strong&gt; &lt;em&gt;(I did just three and, boy, were they trivial)&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Blog more, at least once weekly. &lt;strong&gt;Failed&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are just the first things that came to my mind: I can assure you that there are a lot more.&lt;/p&gt;

&lt;p&gt;There was a time that, looking at all those &lt;strong&gt;Failed&lt;/strong&gt;, I would've thought that I wasn't good enough. &lt;em&gt;"You just need to push it more!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But, in retrospective:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;I can't do one hundred pushups, but I can manage to survive to 25.&lt;/li&gt;
    &lt;li&gt;I can't play piano as when I was studying music, but I still can play a tune or two, when I'm with friends.&lt;/li&gt;
    &lt;li&gt;During my day job I've used some principles that came from Project Euler problems.&lt;/li&gt;
    &lt;li&gt;And Codewars too!&lt;/li&gt;
    &lt;li&gt;I'm not fluent, but I can say &lt;em&gt;"Bonjour, je m'appelle Giustino. Ça va?" &lt;/em&gt;and other basic sentences.&lt;/li&gt;
    &lt;li&gt;Tracking my activities for a few days helped me understand where to put my efforts.&lt;/li&gt;
    &lt;li&gt;
&lt;a href="http://www.bluemic.com/products/yeti/"&gt;This mic&lt;/a&gt; was a nice side effect of my screencast challenge.&lt;/li&gt;
    &lt;li&gt;It was nice to handwrite a few pages (cramps included!).&lt;/li&gt;
    &lt;li&gt;I understood that I don't like running.&lt;/li&gt;
    &lt;li&gt;Sorry WordPress Core people, I just don't have excuses for this.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We can't always follow our plans, Life just doesn't align with those. But you have to keep going and try harder.&lt;/p&gt;

&lt;p&gt;So, to celebrate all my failed past challenges, here are some new ones:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
&lt;a href="https://giustino.blog/one-year-53-books-personal-challenge/"&gt;Reading 53 books before October 31&lt;/a&gt; &lt;em&gt;(I'm on book 6!)&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Blogging daily (I was heavily inspired from &lt;a href="https://luca.blog/2016/05/29/3-rules-for-a-successful-daily-blog/"&gt;Luca Sartoni&lt;/a&gt;. Thanks, Luca :) ) &lt;em&gt;(One month streak, and counting! )&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;Exercise more, at least three times a week &lt;em&gt;(I exercised 10 days in the past two weeks)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Will I fail these? I'm sure I will. But that's the content for another post!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

</description>
      <category>goals</category>
      <category>improvement</category>
    </item>
  </channel>
</rss>
