Nombres Significativos

Nombres significativos

En este capítulo se trata un tema el cual me importa especialmente, nombrar variables, métodos, clases o cualquier cosa que requiera ser nombrada. Es algo que en los inicios de mi aprendizaje con la programación nadie me dijo y después de dos años me di cuenta y he ido corrigiendo poco a poco.

Evita la desinformación & Usa nombres que revelen infromación

Dar un buen nombre puede llevar tiempo, pero ayuda a ahorrar más en el futuro. Supongamos tenemos lo siguiente

private void calcula(int numero){
// haz algo largo y lioso
...
}

Cuando nos encontremos en nuestro programa esto tendremos que mirar primero si hay algún buen comentario que nos diga que hace, con suerte, o pasar una divertida tarde descifrando que es lo que obtenemos de todo esto y si realmente es lo que queremos porque “calcula” pero que es lo que calcula. Esto es un ejemplo extremista pero queda más claro de esta forma.

Si en lugar de esto tuviésemos esto otro sería mucho más fácil

private void calculaPresiónDelAgua(int metrosCubicos){
// haz algo largo y lioso
...
}

Nombres pronunciable

De igual manera los nombres tienen que ser pronunciables no le demos nombres cortos con siglas que hace que a la hora de nombrarlo sea imposible. Imagina tienes un campo que guarda la fecha con el formato año-mes-dia-hora-minuto-segundo y decides llamar a este private date genamdhms; cuando trates de preguntar a otra persona del equipo por este campo ¿como lo nombrarás? y claro, suerte para que tus compañeros le den el mismo nombre y sean capaces de ponerse de acuerdo. Mejor si lo llamas de la forma private date generateTimestamp


Nombres buscables

Es bastante normal ver trozos de código como este

for (int j=0; j<34; j++){
    s += (t[j]*4/5);
}

Que no está mal cumple su función (cualquiera que sea, supongo) pero si queremos corregir, por ejemplo ese “34” en algún momento prque ha cambiado el límite, para empezar no sabemos que es lo que indica y segundo ¿como lo piensas buscar entre todas las líneas de código? sería mejor si hicieramos esto en su lugar

int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j=0; j < NUMBER_OF_TASKS; j++) {
    int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
    int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
    sum += realTaskWeeks;
}

De esta forma en un futuro si queremos cambiar el número de tareas o como se calculan estas por día, solo tendremos que usar el buscador y cambiarlo donde esté la constante.


Notación húngara

Por bagajes culturales de los primeros lenguajes de programación donde indicaban en el nombre de la propia variable el tipo de esta, entiendo que porque era más cómodo al no tener los lenguajes actuales de tipado fuerte y los potentes IDE que tenemos en la actualidad. Pero a día de hoy estoy no es necesario el propio compilador te avisa si no es compatible la variable (en caso de Java, por ejemplo). No hagas String telefonoString


Nombres de clase

Estos deben de ser nombres no verbos usar Customer, Wikipage, Account en lugar de Manager, Processor, Data

Nombres de métodos

De forma contraria los métodos deben de ser nombrados como verbos, identificando una acción postPayment, deletePage, save

No seas lindo

Nombrar tratando de ser gracioso por alguna broma que tienes con cierto compañero, o porque está relacionado con una serie de televisión famosa que “todo el mundo conoce” o “está claro lo que significa” no es una buena idea, por mucho que te vayas a reir cuando lo leas. Recuerda no todas las personas tienen el mismo nivel de cultura en los mismos temas que tú y no tienen porque saber que significan esas siglas.

No añadas contexto gratuitamente

Si estás desarrollando una aplicación que se llama “Gas Station Deluxe” es mala idea nombrar todas las clases con el prefijo “GSD”. Te estás añadiendo ruido cada vez que pulses “G” para usar algún método, variable, etc que realmente si empieza por esta letra el IDE te hará sugerencias de todo lo que no necesitas.

A parte de estos puntos que he resumido de forma muy simple, hay otros puntos que se tratan en el libro que he decidido no añadir.

Puntos no descritos

  • Make Meaningful Distinctions
  • Avoid Encodings
  • Member Prefixes
  • Interfaces and Implementation
  • Avoid Mental Mapping
  • Pick One Word per Concept
  • Don’t Pun
  • Use Solution Domain Names
  • Use Problem Domain Names
  • Add Meaningful Context

Libro original

¿Que es el código limpio?

Código limpio

Todo este capítulo se dedica a hacernos ver la importancia que tiene el código, que este sea lo más limpio posible y, los diferentes puntos de vista sobre que es código limpio. Además muestra como afecta en gran medida en los proyectos actuales y a los equipos que lo desarrollan.

¿Que es el código limpio?

Para algunos de los autores que nombra, el código limpio es un código el cual es placentero de leer, otros nombran que tiene que ser enfocado, sin rodeos, elegante entre otros calificativos con los que estoy bastante de acuerdo. Y si es tan bueno, ¿porque todos no lo hacen de esta forma?. El libro lo deja bastante claro con un símil entre el código y el arte.

Una persona es capaz de diferenciar un buen cuadro en el que el artista ha representado bien un objeto (por ejemplo) pero por mucho que esa persona vea cuadros o lea sobre ellos no va a saber pintar uno.

Con el código limpio ocurre de igual forma, un programador al verlo lo reconoce pero por mucho que vea y lea sobre patrones y técnicas, sin las horas suficientes de práctica no logrará hacerlo. Y para muchos que ya se encuentran en el sector trabajando reaccionan: “Para que voy a aprender chino, si ya funciona como estoy” y no se molestan en aprender y practicar las nuevas técnicas.

Equipos sufren problemas por código lioso/sucio

Muestra como ha visto mermar la productividad de equipos profesionales de desarrollo porque empiezan a implementar código lioso excusándose en: “Si no, no llegaremos al deadline. Después lo arreglo” y este “después” es nunca y termina por ser un software lioso y desastroso que ha llegado a tal punto de descontrol que ni los mismos creadores son capaces de manejar. Y cuando el inversor ve lo que está pasando solicita que rescriban el código completo, contratando a un nuevo equipo que se encargará de ello mientras los otros continuan desarrollando paralelamente. Esta situación puede alargarse durante mucho tiempo, ha llegado a ver casos en los que tardan hasta 10 años, con los costes que esto conlleva.

¿Para quien escribimos el código?

Un detalle a tener en cuenta cuando escribimos código es saber para quien escribimos este, algunas personas piensan que el código que escriben es para los usuarios finales de la aplicación ¿eres uno de ellos? para unos usuarios finales a los que se le da una aplicación empaquetada, compilada, ofuscada en algunos casos, que solo le importa si le soluciona su problema y en un tiempo comprensible, ¿para ellos?

Escribimos código para otros programadores, otros que usaran nuestras librerías, otros que se incorporarán al equipo a mitad, otros que tratarán de ayudarnos a solucionar problemas del que no vemos salida, incluso para nosotros mismos en el futuro. Pasamos más tiempo leyendo código que escribiendo, mejor si lo que escribimos es claro y no requiere de grandes esfuerzos para comprenderlo.

Libro origina

Clean Code

Se resume en una frase: “Las pequeñas cosas si importan”

La filosofía de las 5 S:

  • Sort, ordenar, saber dónde están las cosas. Darles nombres significativos para que se más fácil.
  • Systematize, sistematizar. Como dice el dicho: Un lugar para cada cosa y cada cosa en su lugar. Cada trozo de código debe estar donde se espera que esté y, si no lo está, refactor ya!!
  • Shine, limpieza. Mantener el espacio de trabajo limpio no dejes trozos de código comentados porque “Me harán falta en el futuro” eso no ocurre.
  • Standarization, estandarización. El grupo de trabajo tiene que estar de acuerdo sobre como dejar el espacio de trabajo limpio y donde va cada cosa, así todos lo harán de la misma forma.
  • Self-discipline, auto-disciplina. Para mí la más importante, tienes que tener la capacidad de seguir las practicas y ser capaz de ver su trabajo sin creer que es la mejor creación del universo, reflexionar y estar dispuesto a cambiar.

Introdución

wtf

Para lograr escribir código limpio no basta con leer sobre los principios y patrones. Aprender es más que conocer el conocimiento requiere conocerlo y aplicarlo, trabajar con ello, practicar y aprender aún más. Este es el objetivo del libro hacerte trabajar y ¡trabajar duro!

Este libro se ha dividido en tres partes fundamentales, la primera más teórica, preparatoria para los dos siguientes donde introducir los principios y patrones que se usarán en los dos siguientes. Por ello tiene menos partes de código ejemplificativas.

La segunda parte consta de ejercicios que van evolucionando en cuanto a dificultad. Ejercicios han de tomarse con calma y comprender.

El tercero y último es la recompensa, una lista resumiendo lo que hemos aprendido en los ejemplos (ejercicios) anteriores.

AVISO: Si lees solamente el primer y tercer capítulo de este libro añadirás uno más a la lista de “sentirse bien” pero si decides detenerte debidamente en el segundo asentarás estos conocimientos mucho mejor

Libro origina

Mi experiencia en Google Developer Challenge Scholarship 2017-2018

Udacity Developer Challenge Scholarship

El pasado 3 de Noviembre me llegó un mensaje al correo que no me esperaba, Google me había seleccionado para Developer Challenge Scholarship, en el apartado de android. Hace dos años intenté hacer este mismo curso con mis compañeros de Google Developer Group Gran Canaria pero por esa época, sentía que no iba a ser capaz no tenía conocimientos. Excusas tontas, miedos sin sentido, pero ahora lo he enfocado de manera distinta y con muchas ganas.

Udacity Developer Challenge Scholarship
Udacity Google Developer Challenge Scholarship 2017/2018

El primer día fue un caos total, se abrió el Slack y era incontrolable. Los mismos administradores quedaron perplejos, creando canales como locos, mensajes, mensajes y más mensajes. Era imposible ser capaz de leer o enterarte de nada. Me agobió tanto que volví a entrar en el Slack dos semanas más tarde, aquí la cosa cambió bastante. Ya era todo más controlable y comenzaba una buena experiencia.

A partir de este punto las sesiones de AMA (Ask Me Anything) fueron de bastante ayuda. Además los administradores tuvieron la consideración de transcribir las preguntas a un documento en línea, para los que no podíamos estar en todas las sesiones o simplemente quisiéramos consultar algo a posteriori. Y en el canal en español nuestro compañero Felipe Joglar se curró unos apuntes impresionantes los cuales compartió con nosotros. Gracias!

Mi ejecución en este curso no ha sido la correcta, en parte porque he tenido exámenes y trabajos que no me han permitido dedicarme todo lo que debiera. Y por otra parte porque han habido lecciones las cuales me han costado bastante más de lo que esperaba, llegando a estar dos semanas con ellas. Pero a pesar de todo he logrado terminar exitosamente, comprendiendo casi casi todo lo que he hecho. Una de las clases que más me gustó por el contenido ha sido la referente a Polishing the UI por varias razones, ya era la recta final y la afrontaba con bastante ilusión. Y en general todo lo referente con interfaz de usuario me llama bastante la atención porque, soy tan malo con este tema, que me fascina ver como de bien se puede llegar a hacer.

En términos generales la experiencia ha sido satisfactoria, me queda mucho por delante hasta lograr comprender la magia del desarrollo en Android. Se que seguiré formándome sobre este tema porque es, a día de hoy, el que más me gusta sin duda. Y nada más que agradecer a todos tanto administradores, como a los compañeros de todas partes del mundo por la ayuda que han dado 🙂 Veremos quien pasa a la segunda fase.

PD: no he pasado a la segunda fase.

Usar Symfony desde 0 en ubuntu parte 5 primera pagina y controlador

Primera página y controlador

Para crear nuestra primera página basta con crear un nuevo documento PHP

// src/Controller/LuckyController.php
namespace App\Controller;  
use Symfony\Component\HttpFoundation\Response;  

class LuckyController 
{ 
    public function number(){ 
        $number = mt_rand(0, 100); 
        return new Response( 
            'Lucky number: '.$number.'' 
        ); 
    } 
}

Y luego añadir en nuestro archivo config/routes.yaml la siguiente línea:

app_lucky_number: 
    path: /lucky/number 
    controller: App\Controller\LuckyController::number

Si entramos en localhost:8000/lucky/number veremos el resultado.

Anotaciones

Para evitar tener que poner cada ruta en este archivo manualmente, usaremos las anotaciones. Para instalar estas (añadir la dependencia) desde el directorio del proyecto en la consola ejecutamos:

composer require annotations

Con esto ya podremos eliminar las líneas que habíamos puesto en routes.yaml

// src/Controller/LuckyController.php 
namespace App\Controller; 
use Symfony\Component\HttpFoundation\Response;  
use Symfony\Component\Routing\Annotation\Route; 

class LuckyController 
{ 
    /**  
     * @Route("/lucky/number")  
     * @return Response  
     */ 
    public function number() 
    { 
        $number = mt_rand(0, 100); 
        return new Response( 
            'Lucky number: '.$number.'' 
        ); 
    } 
}

Si entramos en localhost:8000/lucky/number veremos como todo sigue funcionando de la misma manera. Una vez en este punto al intentar desplegar en Heroku me dio problemas:

       Script cache:clear returned with error code 255 
       !!  PHP Fatal error:  Uncaught RuntimeException: APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" 
 as a Composer dependency to load variables from a .env file. in /tmp/build_28bf132bc15e00a1674b37dec1340dc6/CrisKrus-My-Symfony-Project-f31cfde/bin/console:20 
       !!  Stack trace: 
       !!  #0 {main} 
       !!    thrown in /tmp/build_28bf132bc15e00a1674b37dec1340dc6/CrisKrus-My-Symfony-Project-f31cfde/bin/console on line 20 
       !! 
 !     Push rejected, failed to compile PHP app. 
 !     Push failed

Para solucionar este problema basta con seguir las instrucciones del error, las cuales nos indica que con añadir la dependencia de “dotenv” con Composer, estando dentro del directorio del proyecto.

composer require dotenv

Otro problema mas, si nos dirigimos a la aplicación una vez ya tenemos todo en master correctamente, veremos como no hay nada desplegado realmente. Eso es porque no hemos indicado que directorio es el que queremos que use, se lo tenemos que indicar de la siguiente forma. Creando el archivo Procfile indicando al servidor de Heroku que carpeta, public en nuestro caso.

web: vendor/bin/heroku-php-apache2 public/

Añadir framework-extra-bundle dependencia. *Esto no se hasta que punto es realmente necesario.

composer require sensio/framework-extra-bundle

 

Referencias

Symfony, primera página

Symfony, extra bundle dependencia

Symfony, crear procfile

Usar Symfony desde 0 en ubuntu parte 4 configurar el IDE Phpstorm

Configurar el IDE

En este caso usaré para el desarrollo el PhpStorm, instalaremos el plug-in de Symfony desde > File > Settings > Plugins > Browse repositories…

Donde lo buscaremos e instalaremos.

Una vez instalados lo configuraremos para nuestro proyecto > File > Settings > Languages & Frameworks > PHP > Symfony

Marcamos Enable Plugin for this Project cerramos el proyecto y lo volvemos a abrir.

Tras ello podemos configurar el estilo del código de acuerdo con Symfony, si queremos > File > Settings > Editor > Code Style > PHP > Set from… > Predefined Style > Symfony

Referencias

Jetbrains, instalar add-ons

Usar Symfony desde 0 en ubuntu parte 3 desplegar en Heroku

Desplegar en Heroku

Tras subir el proyecto a Github, podremos desplegarlo en Heroku de manera bastante sencilla.

  1. Entramos a nuestra cuenta de Heroku y creamos una nueva aplicación.
  2. Le damos un nombre y en la parte de desplegar deployment lo conectamos con nuestra cuenta de Github.
  3. Buscamos nuestro proyecto y lo seleccionamos.
  4. A continuación, para evitarnos tener que desplegar cada versión a mano y dado que trabajaremos desde la rama develop en nuestro repositorio, marcamos la opción de Enable Automatic Deploys haciendo que con cada push a master, se despliegue automáticamente.
  5. En caso de que sea necesaria una base de datos, vamos a la pestaña Resources luego en el apartado Add-ons y pulsamos sobre Find more add-ons donde veremos los distintos add-ons disponibles, entre ellos bases de datos como MongoDB y PostgreSQL.

Usar Symfony desde 0 en ubuntu parte 2 iniciar proyecto Symfony

Iniciar el proyecto Symfony

Estando en el directorio en el que queremos crear el proyecto ejecutamos

composer create-project symfony/skeleton my_project

Siendo my_project el nombre del proyecto.

Una vez descargado todo, se crea el árbol de directorios y nos indica que debemos entrar en el directorio del proyecto y ejecutar

php -S 127.0.0.1:8000 public/index.php

Con ello nuestro terminal quedara “inutilizado” ejecutando el proyecto, para cerrarla bastara con pulsar la combinación de teclas Ctrl + c

Tras ello si vamos a nuestro explorador web y entramos en http://localhost:8000/ veremos la pagina de inicio de nuestro proyecto.

NOTA: Se puede usar cualquier otro puerto si este se encuentra en uso, en mi caso el 8000 no hay problema.

Referencias

Symfont, configuracion symfony

Curso en video, primeros pasos con symfony

Usar Symfony desde 0 en ubuntu parte 1 PHP y estándares

Instalar PHP

Instalar PHP y algún extra

sudo apt-get install php
sudo apt-get install php-xdebug
sudo apt-get install php-intl

Comprobar la versión de PHP instalada

php -v

Instalar los estándares del estilo de código y comentarios que sigue Symfony, estos son los PSR-0 PSR-1 PSR-2 PSR-4 de PHP. Para esto instalaremos php-codesniffer

sudo apt-get install php-codesniffer

Instalar estándares de código

Con esto ya tendremos donde instalar estándares de desarrollo, en mi caso:

/usr/share/php/PHP/CodeSniffer/src/Standards

Nos moveremos hasta el para posteriormente incluir los estándares.

cd /usr/share/php/PHP/CodeSniffer/src/Standards

*En caso de no tener instalado git en el sistema lo instalamos para poder clonar el repositorio.

sudo apt-get install git

Si buscamos “symfony coding standard” en Google, en el primer resultado de Github podremos clonarlo:

git clone git://github.com/djoos/Symfony-coding-standard.git

AVISO: en el paso tres nos colocamos en el repositorio “/usr/share/php/PHP/CodeSniffer/src/Standards” debemos seguir en él.

Añadir el repositorio clonado a las rutas de codesniffer, especificaremos la ruta absoluta.

sudo phpcs --config-set installed_paths /usr/share/php/PHP/CodeSniffer/src/Standards/Symfony-coding-standard/

Comprobamos que ha sido instalado correctamente

phpcs -i

En la consola tendría que aparecer Symfony entre otros.

Referencias

David Morales, instalacion de PHP

David Joos, standares

Me presento

¿Quien soy?

Mi nombre es Cristian Suárez Vera soy un chico de 22 años, que si todo sale bien este 2018 será Graduado en Ingeniería Informática, residente en las Islas Canarias. Me gusta el mundo de la programación y el emprendimiento.

¿Esto que es?

Mi blog personal, o mejor dicho es el lugar donde escribiré mis divagaciones sobre cualquier tema que se me ocurra, por varias razones las cuales te contaré justo ahora.

  1. Mejorar mi redacción. En un futuro megustaría también en inglés, pero primero lo primero, mi lengua nativa.
  2. Aprender más y mejorar con markdown.
  3. Aprender como es tener un sitio web y administrarlo o, en su defecto, una aplicación de cualquier tipo web, móvil, lo que sea realmente. Quiero saber como es y conocer el mundo de lanzar uana aplicación que tu mismo has hecho y enfrentarse a ello.
  4. Ser más estricto y centrarme, consiguiendo superar los objetivos del dia a dia.

¿Porque hago esto?

Con esto busco empezar con un hábito semanal con el que ir mejorando mi escritura, comunicación y markdown. Supuestamente deberia de estar en una web la cual yo tendría que gestionar y de momento va por buen camino.

¿A ti que te importa como lector todo esto?

A ti como lector te importa más bien poco. A ver, no digo que no lo tengas que leer pero, no soy alguien tan relevante (de momento, dame tiempo) como para que esto te importe, ni estoy contando nada tan interesante como para llegar a nadie. Esta publicación es mi manera de obligarme a cumplir todo esto yl, si alguien se anima por un casual a leer a este loco pues me alegro ;D

Let’s go 2018 I’ll smash you!