Angular como punto de partida para una aplicacion web moderna y organizada
Angular se presenta como un framework web de codigo abierto creado por Google para desarrollar aplicaciones dinamicas de una sola pagina. Esa definicion, tomada en apariencia como una introduccion basica, en realidad fija una decision tecnica de alto impacto: la aplicacion no se concibe como un conjunto disperso de archivos front-end, sino como una estructura organizada que soporta crecimiento, mantenimiento y cambios progresivos sin perder forma. En un contexto universitario esto es importante porque el estudiante suele comenzar desde la interfaz visible, pero en produccion la pregunta correcta no es solo como se ve una pantalla, sino bajo que estructura sera posible evolucionarla sin degradar el sistema con cada nueva funcionalidad.
Que Angular este basado en TypeScript tambien tiene un significado tecnico fuerte. La fuente lo presenta como una ventaja de organizacion y seguridad del codigo. Esa afirmacion no es decorativa. En la practica, cuando un proyecto aumenta en componentes, propiedades, servicios y flujos de datos, el desorden sintactico y semantico se vuelve deuda tecnica acumulativa. Angular parte de una base donde el codigo puede describirse y sostenerse de forma mas controlada. El impacto en mantenimiento es directo: una base mas organizada reduce interpretaciones ambiguas, facilita lectura de estructuras y disminuye errores derivados de contratos mal entendidos entre partes de la aplicacion.
La fuente tambien señala que Angular ofrece un ecosistema completo con herramientas como CLI, modulos, componentes, servicios y enrutamiento. Aunque en esta unidad el enrutamiento no se desarrolla como foco, la sola presencia de esa idea confirma algo importante: Angular no esta pensado como una suma accidental de ayudas, sino como un marco de trabajo coherente. Ese marco propone una arquitectura donde cada pieza tiene una responsabilidad visible. El trade-off de entrar en un framework de esta naturaleza es claro: al inicio puede parecer mas estructurado de lo que un principiante espera, pero precisamente esa estructura es la que despues evita improvisaciones costosas.
En un caso aplicado como un ecommerce o delivery universitario, Angular no aporta valor solo por permitir renderizar una lista de productos o una pantalla de pedidos. Su valor aparece cuando la aplicacion necesita separar secciones, controlar estados visibles, reutilizar partes de interfaz y mover datos entre logica y vista sin convertir el proyecto en un acoplamiento caotico. El problema real que resuelve no es “mostrar algo en navegador”, sino permitir que esa interfaz crezca con criterio. El impacto en rendimiento y mantenimiento se vuelve visible cuando el equipo ya no depende de una pagina monolitica, sino de piezas entendibles y reusables.
La fuente remarca ademas mejoras recientes orientadas a rendimiento y reactividad, pero en esta unidad el aprendizaje se centra en fundamentos: instalacion, configuracion del entorno, creacion de modulos y componentes, enlace de datos, directivas, servicios e inyeccion de dependencias. Esa seleccion es pedagogicamente correcta porque evita empezar por lo accesorio y obliga a construir primero la gramática del framework. El error real de industria, tambien visible en procesos formativos, consiste en saltar demasiado pronto a caracteristicas mas llamativas sin haber dominado la estructura base. La consecuencia es una aplicacion que funciona de forma parcial, pero que nadie puede explicar con claridad ni mantener con seguridad.
Desde una perspectiva de criterio arquitectonico inicial, la mejor lectura de Angular en esta fuente es esta: su fortaleza no esta solo en generar pantallas, sino en imponer una organizacion comprensible del trabajo. La alternativa descartada, aunque no se nombre explicitamente, seria comenzar de forma enteramente manual y ad hoc. Esa opcion puede parecer mas rapida en un ejercicio pequeño, pero deja oculto un costo: cuando la interfaz crece, cada cambio reabre incertidumbre sobre donde vive la logica, donde se declara la estructura y como se conectan los datos. El costo oculto de esa improvisacion es la fragilidad. Angular intenta neutralizar esa fragilidad desde el inicio.
Angular CLI como mecanismo de arranque estandarizado del proyecto
Angular CLI ocupa en esta unidad un lugar central porque es la herramienta oficial para crear, compilar y ejecutar proyectos Angular, ademas de generar modulos, componentes, servicios y directivas. Esa definicion trae una implicacion operativa importante: el arranque del proyecto ya no depende de una construccion manual de carpetas, configuraciones y scripts, sino de un procedimiento estandarizado. En un entorno academico eso ordena el aprendizaje. En un entorno real, reduce variaciones innecesarias entre desarrolladores y mejora la consistencia de la base inicial. Lo que parece un detalle de conveniencia se convierte en una garantia de homogeneidad tecnica.
La secuencia de la fuente es clara: primero se validan requisitos previos como Node.js LTS, npm o yarn y un editor como Visual Studio Code; despues se instala el CLI con npm install -g @angular/cli; luego se verifica con ng v; despues se crea el proyecto con ng new mi-proyecto; finalmente se ingresa al directorio y se ejecuta con ng serve –open. Esta cadena de pasos no debe verse como una receta mecanica, sino como una ruta de validacion progresiva del entorno. Cada paso responde a la pregunta “que condicion debe estar resuelta antes de seguir”.
Ese orden importa porque uno de los errores mas frecuentes al iniciar con Angular es diagnosticar mal los fallos. Cuando un estudiante intenta crear un proyecto sin haber confirmado que el CLI quedo correctamente instalado, cualquier error posterior se interpreta como falla del framework. La fuente, al introducir la verificacion con ng v, esta resolviendo precisamente ese punto ciego. El impacto en mantenimiento del entorno no parece tan visible como el del codigo, pero es fundamental: una instalacion no verificada abre una cadena de tiempo perdido, configuraciones confusas y aprendizaje distorsionado.
Tambien es relevante que la fuente mencione el caracter interactivo de ng new. Esa interaccion confirma que la creacion del proyecto no es un acto neutro. Cada respuesta condiciona estructura y dependencias iniciales. Incluso cuando se usan banderas como routing, style, strict o skip-install, la idea de fondo es la misma: el CLI no solo genera archivos; fija el marco inicial dentro del que la aplicacion sera desarrollada. El trade-off es que el desarrollador cede una parte del control manual del arranque a cambio de consistencia y velocidad. En casi todos los escenarios formativos y productivos de esta unidad, ese intercambio es positivo.
En un ecommerce o delivery universitario, el beneficio del CLI se percibe desde la primera iteracion. El equipo no pierde tiempo acordando una estructura base distinta para cada practica o cada integrante. El proyecto nace con una forma reconocible, una convencion comun y un punto de entrada compartido. Eso simplifica la enseñanza, pero tambien la coordinacion de trabajo. La alternativa descartada seria improvisar una estructura propia para cada ejercicio. El problema de esa alternativa no es solo estetico; es que afecta la mantenibilidad, dificulta la comparacion entre soluciones y vuelve mas costoso revisar errores o incorporar nuevas piezas.
La fuente incluso conecta este proceso con configuraciones de estilo, enrutamiento y tipado estricto. Sin desarrollar esos temas en profundidad, ya deja una conclusion util: el CLI no es un ejecutor de comandos aislados, sino el primer mecanismo de gobierno del proyecto. Un error real de industria consiste en tratar la herramienta solo como generador inicial y luego ignorar el valor de sus convenciones. La consecuencia es una mezcla irregular entre estructura automatizada y cambios arbitrarios que degradan la claridad del repositorio. La deuda tecnica potencial aparece cuando las decisiones posteriores dejan de respetar la logica del arranque estandarizado.
Concepto clave
La idea central hasta aqui es que Angular y Angular CLI no deben entenderse por separado. Angular propone una estructura de trabajo y Angular CLI la materializa de forma operativa desde el primer minuto del proyecto.
Error comun
Creer que instalar el CLI y ejecutar un comando equivale a comprender el framework. Ese enfoque produce estudiantes que repiten pasos, pero no saben explicar por que el proyecto queda organizado de esa manera.
Buena practica
Leer cada comando como una decision de estructura y no solo como una accion de consola. Instalar, verificar, crear y ejecutar deben verse como validaciones encadenadas del entorno y del proyecto.
Aplicacion real
En un sistema de delivery universitario, usar el CLI desde el inicio permite que todos los equipos del curso arranquen con la misma base. Eso mejora la comparacion de resultados, la retroalimentacion docente y la calidad de las practicas posteriores.
Estructura del proyecto, modulos y componentes como base de organizacion tecnica
Una vez creado y ejecutado el proyecto, la fuente dirige la atencion a su estructura. Se destacan src/app, angular.json, tsconfig.json y package.json, junto con la recomendacion de usar –strict. Esta seleccion no es casual. Lo que hace es delimitar rapidamente el mapa minimo que un estudiante necesita para no perderse dentro del workspace. En contextos reales, ese reconocimiento temprano evita una forma muy comun de improductividad: abrir archivos al azar sin comprender que responsabilidad tiene cada uno dentro del sistema.
angular.json aparece como configuracion de build; tsconfig.json como conjunto de opciones de TypeScript; package.json como espacio de dependencias y scripts; y src/app como zona donde viven los componentes principales. Sin introducir conceptos nuevos, la fuente ya permite una lectura disciplinada del proyecto: hay configuracion de compilacion, configuracion de lenguaje, gestion de dependencias y espacio de desarrollo de interfaz. Esa separacion ayuda a evitar el error de tratar la aplicacion como si todo ocurriera en un solo archivo o en una sola carpeta.
La unidad da luego un paso decisivo: introduce el concepto de modulo. El modulo se define como una unidad logica y estructural que agrupa componentes, directivas, tuberias y servicios. Su objetivo es organizar el codigo en partes funcionales y reutilizables. Esta formulacion resuelve un problema real: cuando una aplicacion crece sin una unidad de agrupacion clara, cada nueva funcionalidad tiende a invadir el espacio de las anteriores. El modulo permite construir agrupaciones con sentido. El impacto en mantenimiento es alto porque reduce dispersion y mejora trazabilidad conceptual dentro del proyecto.
El papel de AppModule como modulo principal tambien es estructuralmente importante. La fuente indica que alli se inicia la aplicacion mediante el componente raiz. Esa relacion entre modulo principal y componente de arranque muestra que Angular no organiza solo por carpetas, sino por responsabilidades de ejecucion. La presencia del decorador @NgModule y de metadatos como declarations, imports, exports, providers y bootstrap confirma que el modulo es un contrato de organizacion, no una simple agrupacion nominal. El trade-off aqui es la necesidad de aprender una sintaxis mas formal a cambio de obtener una estructura mas precisa.
Cuando la fuente pasa al componente, profundiza la unidad fundamental de la interfaz. El componente controla una parte especifica de la vista y contiene logica, diseño y estilos. La aplicacion se construye, entonces, a partir de muchos componentes conectados entre si. Esta idea es pedagogicamente potente porque cambia el foco de “hacer una pagina” por el de “construir piezas coordinadas”. En un ecommerce o delivery universitario, esto se puede visualizar sin introducir teoria adicional: un encabezado, una zona de contenido y un pie de pagina pueden pensarse como componentes distintos, cada uno con una responsabilidad reconocible.
La estructura del componente en tres archivos —TypeScript, HTML y CSS o SCSS— tambien expresa una decision de separacion clara. La logica no se mezcla con la estructura visual, y la estructura visual no se mezcla con los estilos. Un error real de industria aparece cuando la separacion existe formalmente, pero no se respeta semanticamente: se sobrecarga el archivo TypeScript con decisiones visuales o se llena la plantilla con complejidad impropia. La consecuencia a mediano plazo es que el componente pierde legibilidad. La deuda tecnica potencial surge cuando esa mala distribucion de responsabilidades se replica en docenas de componentes y hace costoso intervenir en cualquiera de ellos.
Lectura del componente, enlace de datos y directivas como mecanismo de relacion entre logica e interfaz
La fuente ofrece un ejemplo de componente basico donde aparece el decorador @Component con tres piezas visibles: selector, templateUrl y styleUrls, junto con una propiedad llamada titulo en la clase del componente. Esta configuracion, aunque simple, es suficiente para comprender una idea muy poderosa: Angular no renderiza una interfaz como un bloque indiferenciado, sino como la asociacion entre metadatos del componente, plantilla visual, estilos y estado de clase. Esa relacion es la que habilita despues el enlace de datos y la reactividad visible en pantalla.
El selector define el nombre de la etiqueta HTML personalizada con la que el componente sera usado; templateUrl señala la vista del componente; styleUrls referencia sus estilos asociados. Ninguna de estas piezas esta de mas. Si se elimina la lectura estructural del decorador, el estudiante tiende a memorizar sintaxis sin comprender por que existe. El valor docente de este ejemplo esta en que muestra la puerta de entrada a la unidad entre logica y presentacion. El impacto en mantenimiento es claro: cuando el equipo entiende esa distribucion, sabe donde intervenir segun el tipo de cambio requerido.
Sobre esa base entra el data binding. La fuente lo define como el mecanismo que permite sincronizar automaticamente el estado entre la logica del componente y la vista. Esa frase contiene el nucleo practico del trabajo con Angular. La propiedad de clase deja de ser un dato aislado y puede reflejarse en la plantilla. La fuente muestra dos formas principales: interpolacion y property binding. En la interpolacion, una expresion como un mensaje puede mostrarse dentro de la plantilla. En property binding, una propiedad del DOM como value o disabled queda vinculada con datos del componente. El resultado es una relacion viva entre estado y representacion.
La diferencia entre ambas formas no debe enseñarse como un detalle sintactico, sino como una decision de uso. Si se requiere mostrar un valor en la vista, la interpolacion es la via directa. Si se necesita controlar una propiedad del elemento, el property binding resulta apropiado. La fuente no obliga a ir mas alla, y esa contencion es sana. El error real en muchos procesos formativos consiste en acumular variantes antes de que el estudiante domine los principios de lectura. La consecuencia es una pseudo-comprension donde se repiten ejemplos, pero no se interpreta que se esta vinculando y con que proposito. El trade-off de una explicacion mas sobria es que parece menos espectacular, pero produce una base conceptual mas estable.
Las directivas amplian este puente entre logica e interfaz. La fuente las define como clases que agregan comportamiento o modifican la apariencia de elementos en la plantilla y las clasifica en estructurales y de atributo. Esa clasificacion es especialmente util porque impide mezclar efectos muy distintos bajo una sola etiqueta mental. Las directivas estructurales modifican la estructura del DOM; las de atributo cambian estilo, clase o comportamiento sin alterar dicha estructura. Tambien se presentan las sintaxis modernas de control de flujo, como @if, @for y @switch, en comparacion con las formas tradicionales *ngIf y *ngFor.
En un caso como el del delivery universitario, esta diferencia se puede aterrizar sin agregar teoria nueva. Si una lista de elementos debe mostrarse o repetirse, la cuestion es estructural. Si un estado visual como activo o un color debe cambiar dinamicamente, la cuestion es de atributo. De ahi la pertinencia de NgClass y NgStyle en la fuente. El impacto en legibilidad y mantenimiento aparece cuando el desarrollador comprende que no todo cambio visible implica la misma clase de operacion sobre la interfaz. El error de industria es tratar toda dinamica visual como si fuera equivalente. La consecuencia es una plantilla mas confusa y una semantica mas debil.
La fuente menciona ademas que Angular moderno incorpora mejoras de reactividad y rendimiento, pero incluso sin desarrollar esos puntos, deja establecida una leccion crucial: la plantilla no es un HTML pasivo. Es un espacio donde la logica del componente se proyecta de forma controlada. La deuda tecnica potencial surge cuando se usa ese poder sin criterio y se concentra demasiada complejidad directamente en la vista. Por eso la unidad combina esta parte con la siguiente: servicios e inyeccion de dependencias, que permiten separar mejor responsabilidades y evitar que el componente se convierta en una zona de acumulacion desordenada.
Concepto clave
Un componente Angular no solo define una vista; define una relacion entre metadatos, plantilla, estilos y estado. El data binding y las directivas hacen visible esa relacion dentro de la interfaz.
Error comun
Confundir interpolacion con cualquier otra forma de enlace, o usar directivas sin distinguir si modifican estructura o solo atributos. Ese error bloquea la lectura correcta de la plantilla.
Buena practica
Preguntar siempre que tipo de cambio se quiere producir: mostrar datos, controlar una propiedad del elemento, repetir estructura o cambiar estilo dinamico. Esa pregunta ordena la seleccion del mecanismo adecuado.
Aplicacion real
En un ecommerce universitario, una lista de productos puede repetirse con una directiva estructural, mientras que el estado visual de un item destacado puede manejarse con una directiva de atributo. La interfaz se vuelve mas clara cuando esa diferencia se respeta.
Servicios e inyeccion de dependencias como base de un codigo limpio y mantenible
La fuente define el servicio como una clase que encapsula logica de negocio, acceso a APIs o estado compartido, separada de la interfaz de usuario. Esa formulacion resuelve uno de los problemas mas importantes en cualquier aplicacion que crece: la tendencia a poner demasiada responsabilidad dentro del componente. Cuando la logica de datos, el consumo remoto y la coordinacion del estado se mezclan con la vista, el componente deja de ser un mediador claro y se convierte en un punto de congestion. Angular responde a este problema a traves de servicios, que permiten trasladar esas responsabilidades a una clase especializada.
La fuente muestra la creacion del servicio con ng generate service services/producto y luego presenta un ejemplo de ProductoService marcado con @Injectable({ providedIn: ‘root’ }). En ese servicio aparece un constructor que recibe HttpClient y un metodo getProductos() que retorna una consulta de productos. Sin salir de la fuente ya se puede extraer una conclusion madura: el componente no tiene que saber como se obtiene el dato a bajo nivel; su papel puede limitarse a solicitarlo y reaccionar al resultado. El impacto en mantenibilidad es inmediato porque la logica de acceso queda concentrada y reutilizable.
El detalle de providedIn: ‘root’ tambien importa dentro de la fuente porque expresa alcance de disponibilidad global. No es necesario desarrollar una teoria mas amplia para reconocer la ventaja: el servicio puede usarse sin registrarlo externamente en cada caso mostrado. Esto reduce friccion operativa y refuerza la idea de reuso. El trade-off natural de separar logica en servicios es que el proyecto gana mas clases y mas puntos de organizacion, pero precisamente ese aumento de estructura evita el caos que produciria centralizar toda la logica dentro de la interfaz.
La inyeccion de dependencias completa esta imagen. La fuente la presenta como un patron de diseño usado por Angular para proveer automaticamente las instancias que un componente, directiva o servicio necesita para funcionar. En lugar de crear manualmente los objetos, Angular los inyecta en el momento adecuado. Esa forma de trabajo cambia el modo en que se piensa el acoplamiento. El componente no “fabrica” su dependencia; la declara. Angular dispone de un Injector, registra dependencias mediante @Injectable() o providers, y luego las resuelve cuando son requeridas.
El ejemplo de ListaProductosComponent es tecnicamente muy valioso porque muestra la inyeccion en el constructor y el uso del servicio en ngOnInit() para cargar datos y asignarlos a una propiedad del componente. Esto permite explicar una de las mejores practicas implicitas en la fuente: el componente conserva su papel de coordinador de presentacion, mientras el servicio concentra la logica de acceso a datos. En un sistema de delivery universitario, esa separacion evita que una pantalla de lista de productos quede atada a detalles internos de obtencion de informacion. El impacto en prueba y mantenimiento es favorable porque los cambios en la fuente de datos pueden aislarse mejor.
El error real de industria que esta unidad ayuda a prevenir es el hardcodeo o la logica embebida de forma excesiva en la interfaz. La propia fuente lo sugiere al explicar que servicios e inyeccion de dependencias logran una aplicacion mas organizada y mantenible. La alternativa descartada seria que cada componente consulte directamente, arme estructuras de datos propias y replique logica comun. La consecuencia de esa alternativa es una duplicacion silenciosa que se vuelve cara a mediano plazo. La deuda tecnica potencial surge cuando varios componentes requieren el mismo comportamiento y cada uno implementa una version distinta.
La conclusion arquitectonica, siempre dentro de la fuente, es contundente: el CLI facilita la creacion y mantenimiento del proyecto; los componentes y modulos fomentan escalabilidad; data binding y directivas conectan logica con interfaz; y los servicios junto con la inyeccion de dependencias sostienen un codigo mas limpio y mantenible. No hace falta agregar teorias externas para llegar a una idea profesional robusta. El aprendizaje valioso aqui no es solo “como se escribe Angular”, sino “como se organiza una aplicacion Angular para que siga siendo entendible cuando crezca”.
Sintesis tecnica de la unidad
La progresion completa de la unidad responde a una logica muy precisa. Primero se entiende que Angular es un framework con estructura. Luego se aprende que Angular CLI convierte esa estructura en una base operativa concreta. Despues se reconoce la forma del proyecto y se entra a la organizacion por modulos y componentes. Finalmente se explica como la interfaz se relaciona con la logica a traves de bindings, directivas, servicios e inyeccion de dependencias. Esta progresion es valiosa porque cada capa depende de la anterior y evita construir conocimiento fragmentado.
Tambien queda claro que el mayor aporte de la unidad no esta en la complejidad tecnica de un solo ejemplo, sino en la coherencia de las decisiones iniciales. Instalar bien, verificar bien, crear con criterio, reconocer la estructura, separar responsabilidades y evitar acoplamientos innecesarios son acciones pequenas que producen grandes diferencias cuando el proyecto crece.
En el contexto del ecommerce o delivery universitario, la unidad no intenta construir aun el sistema completo. Lo que hace es dejar lista la base mental y tecnica con la que ese sistema podria empezar correctamente. Ese enfoque tiene valor academico y productivo, porque la mala base inicial suele ser mas costosa que cualquier funcionalidad faltante.
El rendimiento, la seguridad y el mantenimiento no aparecen aqui como temas independientes, sino como consecuencias de una organizacion tecnica adecuada. Una interfaz mejor separada, una logica mejor encapsulada y un arranque mejor estandarizado reducen friccion, mejoran claridad y facilitan evolucion.
Por eso, la mejor lectura profesional de esta unidad es que Angular no debe abordarse como una coleccion de comandos o decoradores, sino como un lenguaje de organizacion del proyecto. Esa es la diferencia entre usar una herramienta y desarrollar criterio sobre ella.
Autoevaluacion profesional
1. ¿Puedes explicar con claridad por que Angular CLI no debe entenderse solo como un instalador, sino como una herramienta de estandarizacion del proyecto?
2. ¿Puedes diferenciar la funcion de src/app, angular.json, tsconfig.json y package.json dentro del proyecto generado?
3. ¿Puedes justificar por que un modulo y un componente no cumplen la misma responsabilidad dentro de Angular?
4. ¿Puedes distinguir cuando conviene usar interpolacion y cuando conviene usar property binding en una plantilla?
5. ¿Puedes explicar por que mover logica a un servicio y recibirlo por inyeccion de dependencias mejora el mantenimiento del componente?
Continuacion formativa
El siguiente nivel natural de esta unidad es profundizar en la implementacion practica de componentes, la organizacion de vistas, el uso continuo de directivas y la ampliacion del trabajo con servicios dentro de un proyecto que ya fue creado y ejecutado correctamente. Antes de avanzar, conviene revisar nuevamente la secuencia completa de instalacion, arranque, lectura del modulo, lectura del componente y consumo del servicio.
Ejercicio aplicado sugerido: crea un proyecto Angular con el flujo mostrado en la unidad, identifica su estructura base, localiza el modulo principal, interpreta el componente raiz y explica por escrito como un servicio podria encargarse de recuperar una lista de productos sin mezclar esa logica con la plantilla.
Resumen tecnico de decisiones e impactos
| Decision trabajada | Proposito tecnico | Impacto esperado |
|---|---|---|
| Usar Angular CLI | Estandarizar creacion, compilacion y ejecucion del proyecto | Mayor consistencia operativa y menor error de arranque |
| Reconocer estructura base del proyecto | Ubicar configuracion, dependencias y espacio principal de desarrollo | Mejor orientacion tecnica y menor confusion inicial |
| Organizar por modulos | Agrupar piezas funcionales reutilizables | Mayor claridad estructural y escalabilidad |
| Construir la interfaz con componentes | Separar partes de la vista en unidades comprensibles | Mejor mantenimiento y reuso de interfaz |
| Usar data binding y directivas | Conectar estado del componente con la plantilla | Interfaz dinamica y mas controlada |
| Separar logica en servicios | Evitar sobrecarga del componente | Codigo mas limpio y reutilizable |
| Aplicar inyeccion de dependencias | Declarar dependencias sin crearlas manualmente | Menor acoplamiento y mejor mantenimiento |
Integracion con el ecosistema de aprendizaje
YouTube: https://www.youtube.com/@LideratecAcademy
Web academica: https://lideratecacademy.com/
Esta pieza puede integrarse como lectura de apoyo antes o despues del video, como base de aula virtual o como material de repaso para fijar la estructura minima con la que un proyecto Angular debe ser entendido desde su arranque.