Cómo ganar dinero con PHP

¿Sabías que si mejoras tus habilidades duras o técnicas, también llamadas hard skills, se te van a presentar más oportunidades en la vida y vas a ganar mucho dinero? ¡Hay que ser optimista!

Tengo un secreto para ganar dinero como programador.

Cada vez son más los empleadores que necesitan programadores que, además de comunicarse de manera efectiva con su equipo, sepan solucionar problemas como verdaderos expertos desarrolladores.

Se trata de una sencilla dinámica del mercado de trabajo.

Ahora mismo no tengo estadísticas aquí pero hay decenas de miles de empresas en Europa, América, en todo el mundo, que no pueden cubrir sus necesidades técnicas de desarrollo de software.

Faltan programadoras y programadores

Como consecuencia del desequilibrio de las fuerzas de oferta y demanda en el mercado laboral IT, muchas empresas terminan abrumadas contratando a personal que escribirá código como sea, a veces rápido y mal, a bajo coste. En tan agitado contexto aparece la necesidad de seguir formándose continuamente porque la tecnología avanza rápido.

La rueda no puede detenerse aunque el desarrollo de apps, visto así, pueda causar problemas de comunicación entre los integrantes de un equipo, genere errores de mantenimiento y seguridad...

Mira qué contradicción:

  • Empresas impacientes
  • Te presionan a hacer cosas nuevas rápido y mal
  • Hackers rusos y chinos, de todo el mundo, se hacen con los datos

¿Te suena de algo? No digo que esta contradicción esté siempre presente, pero es sin duda un tema apasionante que no podemos tratar en este post por falta de tiempo.

Hoy, vengo con un truco para ganar miles de dólares.

Compártelo con tus amigas y amigos desde ya. Ayúdales a hacer las cosas mejor para que hagan ese viaje que tanto anhelan, envía también este artículo a tus familiares y allegados.

Apliquen técnicas TDD en sus proyectos

TDD (Test-driven development) significa desarrollo guiado por pruebas de software. Como su nombre indica, es una técnica de programación que consiste en ir escribiendo tests a medida que se desarrolla una funcionalidad nueva en una aplicación.

En Internet hay cientos de tutoriales y cursos muy buenos que te explican cómo hacer TDD desde cero, paso a paso, de manera secuencial desde el principio. En mi opinión humilde este enfoque está bien, claro que sí, sobre todo al principio, pero... (siempre hay un pero) requiere bastante tiempo y puede resultar estresante.

O frustrante, si lo prefieres llamar así, porque aprendiendo desde el principio bajo presión posiblemente no obtengas resultados inmediatos a corto plazo. Es como aprender un idioma nuevo. Los seres humanos somos un poco así, a veces lo queremos todo ya.

Como dice Peter Norvig en Aprende a programar en diez años:

La conclusión es que, o bien la gente tiene un gran afán por saber de computadoras, o bien las computadoras son algo fabulosamente más fácil de aprender que cualquiera otra cosa.

En realidad hay que hacer muchas prácticas para interiorizar los conocimientos adquiridos.

Respira hondo, ¡relájate y disfruta!

Empieza navegando por GitHub hasta encontrar un proyecto donde se apliquen las técnicas de las que estamos hablando hoy, es decir, TDD. Observa cómo otros expertos hacen las cosas.

No quieras aprender a escribir pruebas unitarias hoy mismo en cuestión de horas, como si de la noche a la mañana tu empresa necesitara que programes un juego de pruebas crítico.

Ahora intentaremos concretar todo lo dicho estudiando las pruebas unitarias de un proyecto específico. ¿Os parece bien?

Estudia el código de un proyecto ya hecho

searchars.programarivm.com es una aplicación frontend que sirve para buscar iconos de todo tipo por nombre: emojis, emoticonos, animalitos graciosos, en definitiva, cualquier carácter especial Unicode.

Figura 1

Figura 1. Resultado de la búsqueda por palabra clave: hands

La app está disponible en GitHub y emplea estas tecnologías: HTML, JavaScript y CSS. En esta ocasión no ha hecho falta utilizar una base de datos; fíjate que el repositorio contiene un archivo unicode.json (2.2 MB) con decenas de miles de caracteres Unicode junto con su descripción breve. Esta descripción, o nombre, viene determinada por el estándar Unicode.

Vayamos ahora al backend. El archivo unicode.json se ha generado utilizando la librería PHP Unicode Ranges, más concretamente con este script PHP.

// examples/ranges/04-all-names.php

require __DIR__.'/../../vendor/autoload.php';

use UnicodeRanges\Ranges;
use UnicodeRanges\Converter;

$ranges = (new Ranges)->all();
$converter = new Converter();

$names = [];
foreach ($ranges as $range) {
    $table = $converter->range2table([$range->range()[0], $range->range()[1]]);
    foreach ($table as $key => $val) {
        $names[$converter->unicode2name($val)] = $val;
    }
}

print_r(
    json_encode($names, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
);

El programa obtiene todos los rangos UnicodeRanges\Ranges para construir un sencillo array asociativo cuyas claves son el nombre Unicode; los valores correspondientes son el carácter Unicode en sí. Luego el array se convierte a formato JSON mediante la función json_encode() de PHP.

Tan solo hay que ejecutar el script en la línea de comandos (CLI) para generar el práctico unicode.json con los preciados datos Unicode.

$ php examples/ranges/04-all-names.php > unicode.json
{
    "AEGEAN WORD SEPARATOR LINE": "𐄀",
    "AEGEAN WORD SEPARATOR DOT": "𐄁",
    "AEGEAN CHECK MARK": "𐄂",
    "": "꒏",
    "AEGEAN NUMBER ONE": "𐄇",
    "AEGEAN NUMBER TWO": "𐄈",
    "AEGEAN NUMBER THREE": "𐄉",
    ...
    "HEXAGRAM FOR INNER TRUTH": "䷼",
    "HEXAGRAM FOR SMALL PREPONDERANCE": "䷽",
    "HEXAGRAM FOR AFTER COMPLETION": "䷾",
    "HEXAGRAM FOR BEFORE COMPLETION": "䷿"
}

Te invito a enviar una PR

Si has llegado hasta aquí, ¡felicidades!

¿Te animas a enviar una PR al repo programarivm/unicode-ranges de código abierto que estoy desarrollando? Déjame enseñarte un ejemplo de PR para que tú puedas enviar una igual. Es fácil.

Se desea que la librería Unicode Ranges permita describir bloques Unicode mediante el uso de palabras clave, de este modo a los usuarios de searchars.programarivm.com se les podrá mostrar resultados más relevantes cuando realicen búsquedas.

Un ejemplo de rango ya descrito con palabras clave es UnicodeRanges\Range\AncientSymbols.

namespace UnicodeRanges\Range;

use UnicodeRanges\AbstractRange;

class AncientSymbols extends AbstractRange
{
    const RANGE_NAME = 'Ancient Symbols';

    public function __construct()
    {
        $this->name = self::RANGE_NAME;

        $this->range = [
            '10190',
            '101CF',
        ];

        $this->keywords = [
            'roman',
            'currency',
            'weight',
            'measure',
            'dead',
        ];
    }
}

La Wikipedia nos dice que este rango Unicode contiene caracteres romanos antiguos para describir unidades monetarias, pesos y medidas; así pues la propiedad $keywords de esta clase contiene las palabras: roman, currency, weight, measure y dead.

Ahora supongamos que nos piden que hagamos lo mismo para el bloque UnicodeRanges\Range\Balinese. ¿Qué dice Wikipedia acerca de este bloque Unicode?

Balinese is a Unicode block containing characters of Balinese script for the Balinese language. Balinese language is mainly spoken on the island of Bali, Indonesia.

Esta vez solo encontramos una palabra clave (indonesia) que permita describir este bloque, por lo tanto editamos el archivo tests/Range/BalineseTest.php y añadimos el test get_keywords() como se muestra a continuación.

    ...

    /**
     * @test
     */
    public function get_keywords()
    {
      $keywords = $this->charRange->keywords();

      $expected = [
        'indonesia',
      ];

      $this->assertTrue($expected == $keywords);
    }
}

Por supuesto, si ahora ejecutamos los tests de UnicodeRanges\Range\Balinese el que acabamos de escribir get_keywords() va a fallar.

$ vendor/bin/phpunit tests/Range/BalineseTest.php
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

..F                                                                 3 / 3 (100%)

Time: 23 ms, Memory: 4.00MB

There was 1 failure:

1) UnicodeRanges\Range\Tests\BalineseTest::get_keywords
Failed asserting that false is true.

/home/standard/projects/unicode-ranges/tests/Range/BalineseTest.php:47

FAILURES!
Tests: 3, Assertions: 4, Failures: 1.

En esto consiste el desarrollo guiado por pruebas de software (TDD).

El primer test tiene que fallar obviamente porque el código que necesitamos todavía no existe. El siguiente paso es asegurarnos de que la prueba pasa satisfactoriamente, para lo cual hay que escribir el código correspondiente en el archivo src/Range/Balinese.php.

namespace UnicodeRanges\Range;

use UnicodeRanges\AbstractRange;

class Balinese extends AbstractRange
{
    const RANGE_NAME = 'Balinese';

    public function __construct()
    {
        $this->name = self::RANGE_NAME;

        $this->range = [
            '1B00',
            '1B7F',
        ];

        $this->keywords = [
            'indonesia',
        ];
    }
}

Si añadimos la palabra indonesia a la propiedad $keywords de UnicodeRanges\Range\Balinese el test pasa.

$ vendor/bin/phpunit tests/Range/BalineseTest.php
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 23 ms, Memory: 4.00MB

OK (3 tests, 4 assertions)

¡Misión cumplida! Acabamos de describir un rango Unicode con palabras clave.

Este sencillo ciclo TDD está implementado en este commit en GitHub:

Como digo estáis invitados a describir más rangos Unicode siguiendo los mismos pasos.

Conclusión

En el mercado laboral faltan desarrolladoras y desarrolladores de software, hay empresas dispuestas a pagar mucho dinero por alguien como tú que pueda escribir código de calidad.

¡Tú puedes ganar más dinero si aplicas técnicas TDD!

Escribir tests unitarios es una habilidad dura, una destreza técnica que solo se consigue por medio de la formación, y con mucha práctica. Si estás empezando desde cero es importante que te lo tomes con calma porque de otro modo podrías frustrarte al no observar resultados inmediatos. Aprender TDD es como aprender un idioma nuevo.

Recuerda, tu organización no debe caer en esta trampa:

  • Empresa impaciente
  • Te presionan a trabajar rápido y mal
  • Hackers se hacen con los datos

Una buena idea para aprender a escribir programas de calidad es navegar por GitHub y estudiar el código de algún repositorio que siga una metodología TDD y ya tenga tests unitarios. Unicode Ranges es uno de esos repositorios. Estáis todos y todas invitados a enviar una PR para describir un bloque Unicode.

Added keywords to Balinese es un commit de ejemplo que contiene un sencillo ciclo TDD.

También te puede interesar leer esto...

Previous Post Next Post