viernes, 1 de julio de 2016

Articulo - Full Stack Developer

Full Stack Developer

1. Introducción

En los últimos años, en los requerimientos de desarrolladores para las grandes empresas, sobre todo en Estados Unidos, piden perfiles como "Back-End Developer", "Front-End Developer" y "Full Stack Developer". La mayoría conocemos los 2 primeros pero este último no mucho, sobre todo en detalle.

El "Full Stack Developer", traducido al castellano sería algo como: "Programador de Soluciones Completas", en este artículo conoceremos un poco más de que se trata.

El termino "Full Stack Developer" empezó a ser usado en el Departamento de Ingenieria de Facebook en el 2010 para referirse a un profesional que conoce todo el proceso de desarrollo de software moderno, cuyo perfil va mas allá que un Ingeniero Senior o un Arquitecto de Software, los cuales son especialistas, en cambio, el Full Stack es mas completo.

2. Artículos

2.1. What is a Full Stack developer (Laurence Gellert)

Uno de los primeros artículos en la web sobre el tema fué: "What is a Full Stack developer?" escrito por Laurence Gellert en Agosto del 2012 en su Blog (http://www.laurencegellert.com/2012/08/what-is-a-full-stack-developer/) donde especifica los conocimientos que debe tener un Full Stack Developer:

1. Servidores, Redes y Hosting
2. Modelado de Datos
3. Lógica de Negocios
4. Capa de APIs, Capa de Acciones, MVC
5. Interface de Usuario (UI)
6. Experiencia de Usuario (UX)
7. Entiende lo que el cliente y el negocio necesitan (requerimientos)
8. Otros: Pruebas Unitarias, Documentación, Distribución, Seguridad

2.2. Being a Full Stack Developer (George Fekete)

Otro artículo llamado: "Being a Full Stack Developer" fue escrito por George Fekete en Setiembre del 2014 en el sitio web de SitePoint (https://www.sitepoint.com/full-stack-developer/) donde podemos resumir lo siguiente:

1. Full Stack en el 2000
- LAMP (Linux – Apache – MySQL – Perl/PHP)
2. Administracion de Sistemas
- Linux: Shell Scripting
- Computación en la Nube: Amazon, Rackspace, etc.
- Procesamiento de Fondo: Gearman, Redis
- Búsqueda: Elasticsearch, Sphinx, Solr
- Caching: Varnish, Memcached, APC / OpCache
- Monitoreo: Nagios
3. Herramientas de Desarrollo Web
- Control de Versiones: Git, Mercurial, SVN
- Virtualización: VirtualBox, Vagrant, Docker
4. Back-end
- Servidores Web: Apache, Nginx
- Lenguajes de Programación: PHP, NodeJS, Ruby
- Bases de Datos: MySQL, MongoDB, Cassandra, Redis, SQL/JSON
5. Front-end
- HTML & HTML5: Semantica Web
- CSS & CSS3: LESS, SASS, Media Queries
- JavaScript: jQuery, AngularJS, Knockout, etc.
- Compatibilidad entre Navegadores
- Diseño Web Adaptativo
- AJAX, JSON, XML, WebSocket
6. Diseño
- UI, UX
7. Móviles
- Apps Nativas: iOS y Android
- Hibridas: PhoneGap, Appcelerator

2.3. Front-end Vs Back-end Vs Full-stack Web Developers (Michael Wales)

Aunque hay más artículos sobre el tema, voy a mencionar un último: "Front-end Vs Back-end Vs Full-stack Web Developers" escrito por Michael Wales en Diciembre del 2014 en el Blog de Udacity (http://blog.udacity.com/2014/12/front-end-vs-back-end-vs-full-stack-web-developers.html) donde podemos resumir lo siguiente:

1. Front-End Developer
- Lenguajes: HTML, CSS, JavaScript
- Frameworks: Bootstrap, Foundation, Backbone, AngularJS, EmberJS
- Librerias: jQuery, LESS
- Técnicas: AJAX
2. Back-End Developer
- Lenguajes: PHP, Ruby, Python, Java, .NET
- Bases de Datos: MySQL, Oracle, SQL Server
- Frameworks PHP: Zend, Symfony, CakePHP
- Control de Versiones: SVN, CVS, GIT
- Sistemas Operativos: Linux, Windows
3. Full Stack Developer
- Conocimiento de Back-End y Front-End
- Lenguajes: HTML5, CSS3, JavaScript
- Machine Learning, Amazon
- MongoDB, Scala
- Sistemas Operativos: Android, iOS, Windows, Linux

3. Conocimientos de un Full Stack Developer

Un Full Stack Developer debe conocer todos los componentes de una solución de software, por ejemplo si se trata de una aplicación web, los elementos a conocer serían:

3.1. Servidor (Back-End)
- Sistemas Operativos
  -) Linux, Windows, Unix, etc.
- Servidores Web
  -) Apache, NginX, Microsoft IIS, Oracle WebLogic, IBM WebSphere, etc.
- Bases de Datos
  -) Relacionales (RDBMS): MySQL, PostgreSQL, SQL Server, Oracle, etc.
  -) NoSQL: Cassandra, Redis, MongoDB, CouchDB, RavenDB, ObjectDB, GemStone, etc.
  -) RealTime (RTDBS): RethinkDB, FireBaseDB, MemSQL, etc.
- Lenguajes de Programación
  -) PHP, Perl, Python, Ruby, Java, JavaScript (NodeJS), C#, etc.
- Frameworks de Programación
  -) PHP: Zend, Symfony, CakePHP, Lavarel, CodeIgniter, etc.
  -) Perl: Catalyst, Dancer, Mason, Maypole, Mojolicious, etc.
  -) Python: Django, Flask, Tornado, Pylons, Pyramic, Zope 2, etc.
  -) Ruby: Camping, Padrino, Ruby on Rails, Sinatra, PureMVC, etc.
  -) Java: Struts, Grails, ADF, Spring, Play, Dropwizard, Spark, etc.
  -) .NET: Enterprise Libraries, ADO.NET Entity Framework, LINQ, etc.
  -) ASP.NET: Dynamic Data, BFC, CSLA, MonoRail, OpenRasta, etc.

3.2. Cliente (Front-End)
- Lenguajes de Programación
  -) HTML5 (HTLM), CSS3 (CSS), JavaScript
- APIs de JavaScript
  -) Gráficos: Canvas, SVG, WebGL
  -) Almacenamiento: File API, File System API, IndexedDB, Web Storage
  -) Conectividad: Web Sockets, Messaging, WebRTC
  -) Acceso: Drag And Drop (D&D), FullScreen
  -) Estilos: CSS Object Model, Selectors
  -) Multimedia: Animation Timing, Media, Pointer Lock, Web Audio
  -) Performance: Browser, Shadow DOM, Typed Arrays, Web Workers
  -) Seguridad: WebCryptography
  -) Comunicación Asíncrona con el Servidor: Unidireccional (XHR) y Bidireccional (Web Sockets)
- Preprocesadores CSS
  -) Less, Sass, Stylus, Myth, etc.
- Frameworks Clientes
  -) HTML5: HTML5 Boilerplate, HTML5 KickStart, Kendo UI, Montage, 52Framework, etc.
  -) CSS3: Bootstrap, Material Design, Foundation, Skeleton, Schema, Less, Compass, etc.
  -) JavaScript: Angular, Knockout, Backbone, Ember, Express, Meteor, Sails, React, etc.
- Librerías JavaScript (simplifica las APIs)
  -) Iniciales: Dojo, jQuery, MooTols, Prototype, YUI, UnderScore, etc.
  -) Visualización de Datos: D3.js, Chart.js, Highcharts.js, Flot.js, jqPlot.js, etc.
  -) SVG: Raphael.js, Snap.svg, Svg.js, Fabric.js, Bonsai.js, Polymaps.js, etc.
  -) WebGL (3D): Three.js, BabylonJS, SceneJS, OSG.js, PlayCanvas, etc.
  -) Seguridad: Google CryptoJS, Stanford Javascript Crypto Library (SJCL.js), jscrypto, etc.
  -) Comunicación Asíncrona con el Servidor: Unidireccional (AJAX) y Bidireccional (Sockets.io)

3.3. Comunicación Cliente y Servidor
- Protocolos
  -) Internet: TCP/IP, HTTP, HTTP2, FTP
  -) Servicios: RPC, SOAP, REST (HTTP)
  -) Señales: STUN, TURN, ICE, NAT
  -) Correo electrónico: IMAP, POP3, SMTP
  -) Mensajería: AMQP, MQTT, STOMP
- Formatos de Datos
  -) Binario: ArrayBuffer, BLOB, etc.
  -) Texto: HTML, XML, JSON, BSON, CSV, etc.

3.4. Computación en la Nube (Cloud Computing)
- Tipos de Servicios
  -) Software como Servicio (SaaS)
  -) Plataforma como Servicio (PaaS)
  -) Infraestructura como Servicio (IaaS)
- Tipos de Nubes
  -) Nubes Públicas
  -) Nubes Privadas
  -) Nubes Hibridas
- Plataformas Populares
  -) Amazon Web Services (AWS)
  -) Microsoft Azure
  -) Google Cloud Platform
- Aplicaciones Populares
  -) Box (Box Inc), Dropbox (Dropbox)
  -) Drive (Google), iCloud (Apple)
  -) OneDrive (Microsoft), SalesForce.com (SalesForce Inc)

3.5. Rendimiento de un Sitio Web (Performance Web Site)
- Características mas Importantes de un Sitio Web
  -) Rendimiento (Ancho de banda)
  -) Tiempo de Respuesta (latencia)
  -) Escalabilidad
  -) Disponibilidad
  -) Seguridad
-) Métricas para medir la Performance de una página
  -) Tiempo de carga (Load Time)
  -) Tiempo del primer byte recibido (First Byte)
  -) Índice de velocidad (Speed Index)
  -) Elementos del Modelo de Objetos del Documento (DOM Elements)
- Principales Reglas de Performance
  -) Hacer la menor cantidad de solicitudes (pocos archivos)
  -) Enviar la menor cantidad de datos posible (reducir tamaño)
  -) Hacer llamadas asíncronas (XHR, AJAX)
  -) Trabajar en forma desconectada (JavaScript, HTML)
- Herramientas para Pruebas de Performance Web (Performance Tools)
  -) YSlow: URL: http://yslow.org/
  -) PageSpeed Insights: https://developers.google.com/speed/pagespeed/insights/
  -) WebPageTest: http://www.webpagetest.org/
- Herramientas para reducir el tamaño de las imagenes (Images Tools)
  -) Sprites: CSS Sprite Generator, Sprite Creator, Instant Sprite, SpritePad, etc.
  -) JPG: jpeg Optimizer, jpeg Reducer, Compress JPEG, etc.
  -) PNG: pngOptimizer, Tiny png, PunyPNG, etc.
  -) JPG, PNG, GIF: Trimage, image Optim, image Optimizer, Kraken.io, CompressNow, etc.

3.6. Seguridad de Sitios Web
- Principales Riesgos de Seguridad según OWASP Top 10
  -) Riesgo 1: Inyección
  -) Riesgo 2: Pérdida de Autenticación y Gestión de Sesiones
  -) Riesgo 3: Secuencia de Comandos en Sitios Cruzados (XSS)
  -) Riesgo 4: Referencia directa insegura a objetos
  -) Riesgo 5: Configuración de seguridad incorrecta
  -) Riesgo 6: Exposición de datos sensibles
  -) Riesgo 7: Inexistente control de acceso a nivel de funcionalidades
  -) Riesgo 8: Falsificación de Peticiones en Sitios Cruzados (CSRF)
  -) Riesgo 9: Uso de componentes con vulnerabilidades conocidas
  -) Riesgo 10: Redirecciones y reenvíos no válidos
- Herramientas para Probar Seguridad (Security Testing Tools)
  -) OWASP: Zed Attack Proxy (ZAP), WebScarab (Framework), Mantra (Framework), etc.
  -) Otros: SPIKE, Burp Proxy, FireBug, Odysseus Proxy, WATOBO, etc.
  -) DOM XSS: DOMinator Pro
  -) AJAX: OWASP Sprajax Project
  -) SQL Injection: OWASP SQLiX, SqlNinja, SQLInjector, etc.
  -) SSL: O-Saft, sslyze, TestSSLServer, SSLScan, SSLLabs, etc.
  -) Fuerza Bruta Claves: THC Hydra, Brutus, Medusa, Ncat, etc.
  -) Sobrecarga de Memoria: OllyDbg, Spike, BFB, Metasploit, etc.

3.7. Aplicaciones Móviles (Mobile)
- Sistemas Operativos
  -) Nativos: Android, iOS, Windows Mobile
  -) Web: WebOS, FireFoxOS, Tizen, etc.
- Lenguajes de Programación
  -) Nativos: Java, Objetive-C (Swift), C#/XAML
  -) Web: HTML5, CSS3, JavaScript
- Frameworks Hibridos
  -) Apache Cordova (Ex Phonegap), React Native, Ionic, Meteor, Xamarin, Titanium, Famo.us,
  -) Sencha Touch, Kendo UI, Onsen UI, JQuery Mobile, Mobile Angular UI, Trigger.io, etc.

3.8. Otros Conocimientos
- Diseño
  -) Degradación agraciada (Degrade Gracefully)
  -) Mejora Progresiva (Progressive Enhancement)
  -) Diseño Web Adaptativo (Responsive Web Design)
  -) Interface de Usuario (UI)
  -) Experiencia de Usuario (UX)
- Herramientas de Control y Distribución
  -) Control de Versiones: GIT, Mercurial, SVN
  -) Virtualization: VirtualBox, Vagrant, Docker
- Motores de Búsqueda (Search Engines)
  -) Search Engine Optimization (SEO)
  -) Search Engine Marketing (SEM)
- Tecnologías
  -) Realidad Virtual (VR, WebVR)
  -) Internet de las Cosas (IoT)
  -) Machine Learning (ML)
  -) Cognitive Services (CS)
  -) Business Inteligence (BI)
  -) Big Data, Analytics, etc.

4. Programas para un Conjunto de Soluciones (Software Stack)

Existen "paquetes" de programas que usan comunmente los Full Stack Developers a los cuales se les conoce como "Software Stack", entre los mas conocidos tenemos:

4.1. LAMP
- Sistema Operativo: Linux
- Servidor Web: Apache
- Base de Datos: MySQL o MariaDB
- Lenguajes de Programación: PHP, Perl y/o Python

4.2. LYME y LYCE
- Sistema Operativo: Linux
- Servidor Web: Yaws (Erlang)
- Base de Datos: Mnesia (LYME) o CouchDB (LYCE)
- Lenguaje de Programación: Erlang

4.3. GLASS
- Servidor de Aplicaciones y Base de Datos: GemStone
- Sistema Operativo: Linux
- Servidor Web: Apache
- Framework Web: Seaside
- Lenguaje de Programación: Smalltalk

4.4. LEAP
- Sistema Operativo: Linux
- Servicio Almacenamiento en la Nube: Eucalyptus (alternativa a EC2 o Amazon Elastic Compute Cloud)
- Framework en la Nube: AppScale (alternativa a Google App Engine)
- Lenguaje de Programación: Python

4.5. LNOJ
- Sistema Operativo: Linux
- Servidor Web: NginX
- Base de Datos: OracleDB
- Lenguaje de Programación: Java

4.6. WISN
- Sistema Operativo: Windows
- Servidor Web: IIS
- Base de Datos: SQL Server
- Lenguajes de Programación: .NET (C#, VB.NET, F#, etc)

4.7. RAPB
- Lenguaje de Programación: Ruby on Rails
- AngularJS
- Base de Datos: PostgreSQL
- Bootstrap

4.8. MEAN (Full Stack JavaScript)
- Base de Datos: MongoDB
- Framework Web para Node.js: ExpressJS
- Framework Aplicaciones Web: AngularJS
- Lenguaje de Programación: NodeJS

Existen muchas mas combinaciones de programas que un Full Stack Developer puede usar para resolver un problema, pero hemos descrito las mas usadas.

5. Comentario Final

Aunque el artículo es un poco extenso era necesario detallar todo lo referente a este tipo muy importante de desarrollador que como vemos debe ser una persona con muchos años de experiencia, ya que conocer bien el Back-End aunque sea de un tipo por ejemplo LAMP (Linux, Apache, MySQL, PHP) o WISN (Windows, IIS, SQL Server, .NET) requiere de mucho tiempo. También es lo mismo si nos inclinamos por un Full Stack JavaScript como MEAN (MongoDB, ExpressJS, AngularJS, NodeJS).

Un Full Stack Developer podría reemplazar a muchos desarrolladores especialistas de varios campos: Front-End, Back-End, Mobiles, etc. Aunque lo recomendable que dicho reemplazo sea para proyectos pequeños, pero para proyectos grandes mas bien este debe trabajar de la mano con un grupo de especialistas.

Finalmente, creo que siempre se necesitarán de especialistas, pero ahora mas que nunca necesitamos "expertos en todo" es decir "Full Stack Developers" que ayuden a solucionar problemas de una forma integral incluyendo no solo temas de Programación (Sistemas Operativos, Lenguajes, Base de Datos, Frameworks), sino Diseño (Design), Rendimiento (Performance), Seguridad (Security), etc.

Espero que les guste el artículo, que después de tiempo vuelvo a escribir y que mejor, regresar con algo que resume muchas cosas: perfiles, programas, tecnologías, etc.