Cuando estamos utilizando un ordenador, una tablet o un teléfono móvil, ¿qué tipos de aplicaciones o programas podemos estar utilizando? Básicamente distinguimos dos grandes grupos:
Aplicaciones sin conexión a Internet. Este tipo de aplicaciones no necesitan ninguna conexión a Internet o a una red local de ordenadores para funcionar. Suelen llamarse aplicaciones de escritorio, y podemos encontrar ejemplos muy variados: un procesador de textos, un lector de libros electrónicos, un reproductor de música o vídeo, e incluso videojuegos que tengamos instalados.
Aplicaciones con conexión a Internet. Estas aplicaciones sí necesitan conexión, ya sea a Internet o a una red local. Dentro de este grupo, encontramos varios subtipos:
Una aplicación web es un tipo de software que se ejecuta en un servidor y se accede a través de un navegador web. El navegador actúa como interfaz entre el usuario y el servidor, donde se procesa la lógica de negocio, se accede a bases de datos y se genera la respuesta que el navegador presenta al usuario.
Con el avance de las tecnologías web, el concepto de aplicación web se ha ampliado. Actualmente, se considera aplicación web a cualquier software desarrollado con tecnologías como HTML, CSS, JavaScript, PHP, etc., que se ejecuta en un navegador o en un entorno que lo emula, como un WebView o un motor de navegador embebido.
WebView es un componente que permite incrustar contenido web dentro de una aplicación móvil nativa. Es común en aplicaciones como Facebook o Instagram, donde se cargan páginas externas sin abrir el navegador del sistema. Aunque su uso es más controlado, ofrece rapidez y cohesión dentro de la app.
Hoy en día, podemos identificar varios tipos de aplicaciones web modernas según su entorno de ejecución y sus capacidades:
La web es una plataforma global que permite acceder a una gran variedad de contenidos y servicios: páginas informativas, aplicaciones interactivas, redes sociales, foros, vídeos, videojuegos, etc.
Desde sus inicios en los años 90, con páginas estáticas y correo electrónico, ha evolucionado hasta convertirse en una plataforma compleja y dinámica. La llamada Web 2.0 introdujo la participación del usuario (blogs, redes sociales, wikis), y hoy día hablamos incluso de una Web 3.0, más centrada en la descentralización, la inteligencia artificial y la personalización.
Una aplicación web moderna suele estar compuesta por tres elementos principales que trabajan de forma coordinada:
Las aplicaciones web siguen una arquitectura cliente-servidor, en la que las tareas se reparten entre:
Secuencia básica de funcionamiento
En muchas aplicaciones web modernas, el servidor no es un único sistema. En su lugar, se organiza en una arquitectura en capas (también llamada multi-tier), donde diferentes servicios o máquinas se especializan en funciones concretas. Esto mejora el rendimiento, la escalabilidad y la seguridad del sistema.
Por ejemplo:
Ejemplo práctico
Supongamos que un usuario accede a una aplicación web para consultar noticias. Este proceso puede ser representado con un diagrama de secuencia como el siguiente:
En función de cómo se organizan los elementos del sistema, podemos distinguir dos modelos principales:
Arquitectura de dos niveles (2-tier), tanto el servidor web como el servidor de bases de datos se ejecutan en la misma máquina. Es una solución sencilla y económica, adecuada para proyectos pequeños, entornos de desarrollo o pruebas. Sin embargo, presenta limitaciones importantes en términos de seguridad, escalabilidad y rendimiento, especialmente cuando el número de usuarios o el volumen de datos crece.
Arquitectura de tres niveles (3-tier), el servidor web y el servidor de bases de datos están separados físicamente, lo que permite distribuir mejor la carga, mejorar el rendimiento, y aumentar la seguridad. Es el modelo más común en entornos empresariales y sistemas en producción.
Más allá de estos modelos clásicos, hoy en día también se emplean otras arquitecturas modernas, como:
La arquitectura de microservicios, donde cada funcionalidad (autenticación, pagos, búsqueda, etc.) se implementa como un servicio independiente, lo que permite desplegar, escalar y mantener cada uno por separado.
La arquitectura desacoplada (frontend-backend), en la que el frontend (interfaz) y el backend (la lógica y datos) se desarrollan y despliegan por separado, comunicándose a través de una API (normalmente REST o GraphQL). Esto permite más flexibilidad y reutilización entre plataformas (web, móvil, etc.).
Para que una aplicación web esté disponible en Internet y accesible desde cualquier navegador, es necesario tener en cuenta tres elementos clave:
En este apartado se abordan los conceptos básicos necesarios para comprender cómo se publica una aplicación web y cómo se accede a ella desde cualquier parte del mundo. Algunos aspectos más técnicos, como los protocolos de comunicación y el sistema DNS, se estudiarán en detalle en apartados posteriores.
El hosting es el servicio que permite almacenar y servir los archivos de una aplicación web (HTML, CSS, JS, imágenes, bases de datos, etc.) desde un servidor conectado permanentemente a Internet.
Existen distintas opciones de alojamiento según el tipo de proyecto, el nivel técnico del equipo y los recursos disponibles:
Servidor propio: implica desplegar la aplicación en una máquina física gestionada directamente por la empresa o el equipo de desarrollo. Ofrece control total, pero requiere conocimientos avanzados, mantenimiento continuo y una inversión inicial considerable.
Aunque las aplicaciones web están alojadas en servidores identificados por su dirección IP (por ejemplo, 172.217.168.78), estos números no son prácticos para el uso diario.
Para facilitar el acceso, se utilizan nombres de dominio, que son direcciones web legibles y fáciles de recordar, como www.iessanvicente.com. Internamente, el nombre de dominio está asociado a la IP real del servidor donde se aloja la aplicación. Gracias a esta asociación, el navegador puede dirigir correctamente las solicitudes sin que el usuario conozca la dirección IP.
Por ejemplo, al acceder a www.google.es, el sistema traduce ese nombre en la dirección IP correspondiente a uno de los servidores de Google. Esta conversión la realiza un sistema llamado DNS (Domain Name System), que se explicará en profundidad.
Para disponer de un dominio propio, es necesario realizar un registro de dominio, un proceso gestionado por empresas autorizadas por la ICANN (Internet Corporation for Assigned Names and Numbers).
Para registrar un dominio, es necesario:
Una vez registrado y vinculado al servidor mediante el sistema DNS, el dominio estará activo y accesible desde Internet.
Una URL (Uniform Resource Locator) es la dirección completa que se usa para localizar un recurso específico dentro de una aplicación web. Es la forma en la que los navegadores realizan peticiones a los servidores.
Por ejemplo, cuando escribimos en un navegador una dirección como http://www.miweb.com/paginas/pagina.html, estamos introduciendo una URL para localizar un recurso (en este caso, una página HTML).
La estructura general de una URL es la siguiente:
protocolo://subdominio.dominio.com/carpeta/pagina?param=valor
Este formato permite acceder de forma precisa y estructurada a cualquier recurso dentro de una aplicación web.
Ejercicio 1:
Hemos visto que la ICANN autoriza a diversas empresas para gestionar el registro de nombres de dominio en Internet. Estas empresas, conocidas como agentes registradores de dominio, ofrecen distintos planes de pago para este servicio. Busca en Internet una lista de agentes registradores de dominio oficiales para España y consulta los precios que tienen algunos de ellos.
Para que los clientes y servidores puedan comunicarse, deben seguir un protocolo de comunicación. Un protocolo define una serie de reglas que especifican qué tipo de mensajes se van a intercambiar, en qué orden y cómo debe interpretarlos cada parte. Esto garantiza que ambos extremos de la comunicación se entiendan, incluso si son tecnologías distintas.
Todas las comunicaciones en Internet se apoyan en la familia de protocolos TCP/IP, que se compone de dos elementos principales:
Sobre esta base se construyen protocolos más específicos, como los que usan las aplicaciones web, el correo electrónico o la transferencia de archivos.
En el caso de las aplicaciones web, los protocolos más utilizados son:
Aunque no se usan directamente en aplicaciones web, existen otros protocolos de comunicación esenciales para servicios en Internet:
El protocolo HTTP, y su versión segura HTTPS, son la base de la comunicación en las aplicaciones web. Ambos funcionan bajo un modelo cliente-servidor, donde el navegador (cliente) realiza una petición y el servidor responde con el contenido solicitado o un mensaje de error. Esta comunicación se realiza siguiendo un formato estandarizado, que permite que ambos extremos puedan interpretarla correctamente.
Peticiones HTTP (requests)
Una petición HTTP es el mensaje que el cliente envía al servidor para solicitar un recurso. Suele estar compuesta por:
Internamente, esta información se encapsula en paquetes que se fragmentan y envían siguiendo las reglas del protocolo TCP.
Respuestas HTTP (response)
El servidor analiza la petición y responde con un mensaje estructurado, que incluye:
Para observar este intercambio en tiempo real, se puede usar la herramienta de desarrolladores de Google Chrome, en la pestaña Network, para analizar cualquier comunicación entre el navegador y un servidor web. Esto permite identificar códigos de estado, cabeceras y contenido transferido.
Accede a una web conocida (por ejemplo, ceice.gva.es), y comprueba la información enviada y recibida:
Ejercicio 2:
Utiliza Google Chrome (opción de Herramientas para desarrolladores, pestaña Network) para ver el esquema de petición y respuesta HTTP hacia alguna web conocida. Identifica el código de estado, las cabeceras de respuesta (trata de identificar algunas de ellas) y el contenido.
Cuando dos equipos se comunican a través de Internet, el dispositivo de origen necesita conocer dos elementos fundamentales del destino: su dirección IP, que identifica de forma única a un equipo dentro de la red, y el puerto, que indica el servicio específico al que se desea acceder dentro de ese equipo, como puede ser una página web o un servidor de correo.
Por ejemplo, al acceder a una página como www.google.es, el navegador necesita saber cuál es la dirección IP del servidor donde está alojado el sitio, así como el puerto del servicio web correspondiente, que normalmente es el puerto 80 para conexiones HTTP o el 443 para HTTPS.
Ambos datos son esenciales para establecer la conexión correctamente. Si no se conoce la dirección IP, los datos no pueden llegar al destino; si no se conoce el puerto, el servidor no sabría qué aplicación debe responder a la petición.
Aunque es técnicamente posible escribir directamente una dirección IP en el navegador para acceder a un sitio web, esto no es práctico ni intuitivo. Las direcciones IP son difíciles de memorizar y, además, pueden cambiar con el tiempo. Por el contrario, los nombres de dominio como www.google.es son más fáciles de recordar y comprender. Sin embargo, dado que los equipos de red funcionan internamente con direcciones IP, es necesario un sistema que realice la traducción entre nombres y direcciones.
Ese sistema es el DNS, o Sistema de Nombres de Dominio (Domain Name System), que se encarga de traducir nombres de dominio a direcciones IP y viceversa. Este proceso se denomina resolución DNS y resulta fundamental para el funcionamiento de Internet.
El DNS utiliza una base de datos que presenta una estructura jerárquica y distribuida.
El DNS admite tanto direcciones IPv4 como IPv6, y almacena la información necesaria en registros especiales llamados registros de recursos (Resource Records o RR). Estos registros pueden contener datos como direcciones IP, alias de dominios, información de servidores de correo, entre otros. Estos registros se agrupan en zonas, que son partes del espacio de nombres gestionadas por un servidor autoritativo responsable de mantener y proporcionar esa información de forma actualizada.
A continuación se profundizará en estos elementos y en el funcionamiento detallado del sistema DNS.
El DNS se estructura en tres componentes principales: el espacio de nombres de dominio, los servidores de nombres y los resolvers.
El espacio de nombres de dominio es una estructura jerárquica en forma de árbol invertido donde cada nodo contiene registros de recursos (RR) que proporcionan información sobre los componentes hardware y software que respaldan dicho dominio, como por ejemplo, los hosts, los servidores de nombres, los servidores web, los servidores de correo, etc.
Del nodo raíz, situado en el nivel más alto, parten las ramas que conforman las zonas. Éstas, a su vez, pueden contener uno o más nodos o dominios que a su vez pueden dividirse en subdominios según se baja en la jerarquía.
Es importante no confundir los conceptos de zona y dominio. Mientras el dominio hace referencia al nombre lógico en la jerarquía del DNS, una zona es la porción de la base de datos que administra un servidor DNS determinado. Un dominio puede dividirse en varias zonas si se distribuye su gestión.
En la figura anterior hay tantos dominios como recuadros de letras agrupados en 4 zonas delimitadas por las líneas discontinuas. El nombre de dominio correspondiente a cada zona (se nombran según su nodo superior) es A, B.A, C.A, I.C.A. Cada una de estas cuatro zonas tendrá uno o más servidores DNS para gestionarla.
Los servidores de nombres son servidores encargados de mantener y proporcionar información del espacio de nombres o dominios.
Con esta organización de servidores de nombres, y su intercomunicación, se consigue la distribución y redundancia del espacio de dominios.
El resolver es una rutina o componente del sistema operativo que actúa como intermediario entre las aplicaciones del usuario (como un navegador) y los servidores DNS. Cuando una aplicación necesita la dirección IP correspondiente a un nombre de dominio, el resolver se encarga de gestionar esa petición y devolver la información en el formato que el sistema pueda utilizar. Normalmente, se comunica con un servidor DNS configurado por defecto en el sistema o la red.
La principal función de un servidor DNS es responder a consultas de clientes o de otros servidores DNS. Existen dos tipos principales de consultas:
En resumen, las consultas recursivas son generalmente generadas por los clientes DNS, mientras que las consultas iterativas son creadas por los servidores DNS al consultar a otros servidores.
En términos generales, el proceso que se sigue en una resolución DNS es el siguiente.
Veamos un ejemplo concreto de resolución de nombres para comprender mejor el proceso. Supongamos que un cliente necesita localizar el equipo www.educacion.gob.es y envía una petición a su servidor DNS. Asumamos también que su servidor no tiene información sobre ese dominio. Así, observaremos cómo se lleva a cabo la resolución completa
Este proceso consume bastante ancho de banda, por lo que es recomendable implementar una solución DNS interna con caché, especialmente en redes con alto tráfico hacia el exterior, como colegios, universidades, bibliotecas o grandes empresas. Esto permite obtener tiempos de respuesta más rápidos y una mejor experiencia de navegación web.
Herramienta DIG
DIG (Domain Information Gopher) es una herramienta de línea de comandos que realiza búsquedas en los registros DNS, a través de los nombres de servidores, y muestra el resultado. Se puede ejecutar tanto en Linux como en Windows aunque, en este último, es posible que sea necesaria su instalación previa.
Veamos un ejemplo de cómo funciona con el comando dig www.gva.es
:
Explicación de la salida:
Si se ejecuta DIG especificando la opción +trace, se muestra una traza de los servidores por los que pasa la consulta hasta llegar al servidor autoritativo, permitiendo ver la lista completa de nodos y pasos de resolución de un nombre. Esto es muy útil para entender cómo funciona el sistema de nombres de dominio.
Después de revisar los tipos de aplicaciones web, la arquitectura básica, los protocolos más comunes y el papel del DNS, llegamos a un componente esencial en el desarrollo de aplicaciones web robustas, mantenibles y eficientes: los patrones de diseño.
Un patrón de diseño es un conjunto de buenas prácticas, directrices estructurales y componentes organizados que proporcionan una solución reutilizable a problemas comunes en el desarrollo de software. Su objetivo principal es estandarizar la forma en que se diseñan y construyen las aplicaciones, facilitando la comprensión del sistema, la colaboración entre desarrolladores y la reutilización de componentes. Además, permiten generar estructuras modulares, predecibles y escalables, haciendo que el código sea más fácil de mantener y extender.
En el ámbito de las aplicaciones web, existen diversos patrones de diseño que nos orientan a la hora de organizar el código, separar responsabilidades y estructurar los distintos componentes. Uno de los más utilizados (y probablemente el más conocido) es el patrón MVC, que veremos a continuación. A partir de él han surgido otros enfoques, diseñados para adaptarse a necesidades concretas, entornos modernos o filosofías distintas de interacción. En este apartado revisaremos MVC y algunas de sus variantes más relevantes.
MVC son las siglas de Modelo-Vista-Controlador (Model-View-Controller), y representa uno de los patrones más utilizados tanto en aplicaciones web como en muchas aplicaciones de escritorio.
Este patrón se basa en la división del sistema en tres componentes fundamentales, cada uno con una responsabilidad claramente definida:
Una de las principales ventajas de este patrón es que separa claramente responsabilidades, lo que permite dividir el trabajo entre distintos perfiles profesionales. Por ejemplo, un diseñador puede centrarse en las vistas sin necesidad de conocer la lógica del modelo o del servidor, mientras que un desarrollador backend puede trabajar en el controlador y el modelo sin preocuparse del diseño visual.
En forma de esquema, podríamos representarlo así:
A partir de la popularidad y estructura de MVC han surgido otros patrones que lo adaptan o reinterpretan para entornos específicos. En la mayoría de estos patrones se mantiene el modelo de datos y la vista como componentes clave, y se modifica o reemplaza el papel del controlador. Esta familia de patrones se conoce genéricamente como MVW, (Modelo-Vista-Cualquier cosa, o Model-View-Whatever), lo que refleja la flexibilidad del tercer componente.
Estos patrones suelen buscar una mayor modularidad, eliminar la lógica centralizada de los controladores o facilitar la interactividad directa entre modelo y vista. A continuación, se describen los más representativos.
El patrón MVVM
El patrón MVVM (Modelo-Vista-VistaModelo, o Model-View-ViewModel) sustituye el controlador de MVC por un nuevo componente denominado ViewModel (VistaModelo), y se centra exclusivamente en los componentes del modelo y la vista.
En este enfoque, el usuario interactúa directamente con la vista, que está vinculada al modelo a través del ViewModel. Este componente intermedio contiene la lógica necesaria para transformar los datos del modelo en una forma adecuada para ser mostrada en la vista, y también recoge las acciones del usuario para modificar el modelo. La comunicación entre el modelo y la vista es bidireccional: los cambios en la vista actualizan el modelo, y los cambios en el modelo se reflejan automáticamente en la vista. Esto se conoce como data binding (enlace de datos).
MVVM es especialmente útil en aplicaciones donde hay una única vista principal que se actualiza dinámicamente, como es el caso de muchas Single Page Applications (SPA), donde no se recargan páginas completas sino que se actualizan secciones específicas. Dado que en estas aplicaciones no es necesario decidir qué vista cargar (sólo hay una), el controlador pierde relevancia y puede ser sustituido por este vínculo directo modelo-vista. Frameworks modernos como Angular o Vue.js incorporan conceptos de MVVM, con distintos niveles de formalidad.
El patrón MOVE
El patrón MOVE (Modelo-Operación-Vista-Evento, o Model-Operation-View-Event) propone una división distinta del rol del controlador, reemplazándolo por dos componentes: eventos y operaciones. Los eventos representan acciones o sucesos que ocurren en la aplicación, generalmente generados por la interacción del usuario (como hacer clic en un botón, enviar un formulario, etc.). Estos eventos desencadenan operaciones, que definen las tareas que la aplicación puede realizar (como validar datos, consultar el modelo o actualizar la interfaz).
En este patrón, cuando ocurre un evento, se ejecuta una operación asociada, que puede acceder al modelo para obtener o modificar datos, y generar una vista que se muestra al usuario como respuesta. De esta forma, la lógica que en MVC estaba concentrada en el controlador se reparte entre los eventos que la activan y las operaciones que la implementan. Esta separación puede facilitar la organización del código y el manejo de aplicaciones con muchas acciones simultáneas o asincrónicas.
El patrón MVP
El patrón MVP (Modelo-Vista-Presentador, o Model-View-Presenter) sustituye el controlador de MVC por un componente llamado presentador. A diferencia del controlador, que en MVC puede gestionar múltiples vistas, en MVP cada vista tiene asociado su propio presentador, lo que refuerza el encapsulamiento.
En este enfoque, la vista es pasiva y no interactúa directamente con el modelo. Todo el flujo pasa por el presentador: cuando el usuario realiza una acción, esta se envía al presentador, que accede al modelo, obtiene o actualiza datos, y luego actualiza la vista. Esto crea una relación clara entre cada par vista-presentador, lo que facilita la separación de responsabilidades y mejora la capacidad de realizar pruebas automatizadas.
El patrón MVP es muy común en el desarrollo de interfaces gráficas complejas, tanto en aplicaciones de escritorio como móviles, como en entornos .NET o aplicaciones Android.
Para implantar una aplicación web y que los clientes puedan utilizarla, es necesario contar con una serie de recursos tanto de hardware como de software.
En el lado del cliente, simplemente habrá que contar con un equipo con el hardware necesario (dependiendo de la aplicación web que sea, podrá ser un móvil, una tablet, portátil, PC…), y, típicamente, un navegador web instalado (aunque también podría tratarse de una aplicación híbrida para móvil, o de escritorio, en cuyo caso haría falta la aplicación en sí).
En el lado del servidor, normalmente necesitaremos al menos un equipo con características de hardware adecuadas, especialmente en lo que respecta a procesador, memoria RAM y capacidad de almacenamiento. En ese servidor será necesario instalar:
En el desarrollo de aplicaciones web es importante identificar los lenguajes de programación utilizados, que se clasifican según el entorno en que se ejecutan:
Lenguajes del entorno cliente (o lenguajes cliente): se ejecutan en el navegador del usuario y permiten la interacción directa con la aplicación. En este contexto, se utilizan lenguajes como HTML y CSS para el diseño y estructura de las páginas (aunque no se consideran lenguajes de programación en sentido estricto), y JavaScript para manejar eventos, validar formularios, crear animaciones, etc. También existen herramientas y preprocesadores como SASS, que amplían las capacidades de CSS, así como frameworks y librerías JavaScript como Angular, React o Vue, que facilitan el desarrollo de interfaces dinámicas. Además, existen lenguajes como TypeScript, una evolución de JavaScript que añade tipado estático y mayor estructura, lo que facilita el desarrollo de aplicaciones grandes y escalables.
Lenguajes del entorno servidor (o lenguajes servidor): se ejecutan en el servidor web y permiten realizar operaciones como consultas a bases de datos, manejo de archivos o gestión de sesiones. Uno de los lenguajes más utilizados tradicionalmente en este ámbito ha sido PHP, que sigue siendo muy común para aplicaciones web dinámicas, especialmente en combinación con servidores Apache. Otro lenguaje ampliamente adoptado es JavaScript, que gracias al entorno de ejecución Node.js también puede utilizarse en el servidor, permitiendo escribir tanto el backend como el frontend de una aplicación en un único lenguaje. Sobre Node.js se apoya el uso de TypeScript, que se está consolidando como una herramienta clave en el desarrollo moderno del lado servidor, al aportar tipado estático, una mayor organización del código y mejor soporte para proyectos de gran tamaño. En aplicaciones que utilizan tecnología Microsoft, también se emplea ASP.NET, que se ejecuta sobre el servidor IIS y se integra con el ecosistema Windows.
A continuación se describen los programas concretos que se utilizarán durante el curso, tanto en el lado cliente como en el servidor.
En el cliente, necesitaremos un navegador web para visualizar e interactuar con las aplicaciones. Existen varias opciones disponibles, como Mozilla Firefox, Google Chrome, Microsoft Edge (antes Internet Explorer), Safari o Opera, aunque probablemente las mejores alternativas por compatibilidad, rendimiento y herramientas para desarrolladores sean Google Chrome y Mozilla Firefox.
En el servidor, el software a utilizar dependerá del lenguaje de programación elegido y del sistema operativo, aunque en nuestro caso, utilizaremos entornos compatibles con Windows.
Respecto al servidor de bases de datos, existen múltiples alternativas. Por un lado, tenemos las bases de datos relacionales, como MySQL/MariaDB, PostgreSQL, Oracle o SQL Server, todas ellas disponibles en versiones gratuitas o comerciales según las necesidades del proyecto. Por otro lado, existen opciones no relacionales o NoSQL, como MongoDB, que permiten almacenar documentos en formato JSON y se adaptan especialmente bien a estructuras de datos flexibles y dinámicas.
En nuestro curso, utilizaremos MySQL/MariaDB (integrado con Apache y PHP mediante XAMPP) y MongoDB (en combinación con Node.js) como soluciones principales para almacenamiento de datos.
IDEs
Para el desarrollo de aplicaciones es necesario contar con un buen entorno de desarrollo o IDE con el que editar el código, depurar y probar las aplicaciones.
Existen multitud de opciones disponibles, la mayoría de ellas gratuitas. Desde entornos de propósito general válidos para muchos lenguajes (Atom, Sublime, Visual Studio Code…) a otros más específicos y orientados a algún lenguaje en concreto, como PhpStorm.
En nuestro caso, optaremos por Visual Studio Code, por su versatilidad y popularidad creciente. Permite instalar multitud de extensiones para trabajar con distintos tipos de lenguajes y frameworks, y nos permite también una fácil integración con PHP y Node.js.
A continuación se enumeran algunas webs donde consultar o descargar los recursos indicados en este tema, para el desarrollo de aplicaciones en entorno servidor.
Ejercicio 3:
Utiliza la herramienta Google Trends para buscar los términos de Laravel, Symfony y Node.js. Deduce a partir de las búsquedas cuál de ellos crees que es más popular actualmente. Después, acude a la web de InfoJobs y busca ofertas de trabajo con estos tres frameworks, para determinar cuál es el más demandado en la actualidad.