Mejores prácticas para Jitterbit App Builder
Introducción
Las aplicaciones de App Builder pueden crecer en tamaño y complejidad, a menudo involucrando el trabajo de varios desarrolladores durante muchos meses o años. Estas mejores prácticas te ayudarán a gestionar esta complejidad, hacer que tus aplicaciones sean más fáciles de mantener y mantenerlas funcionando a un rendimiento óptimo.
El ciclo de vida del desarrollo de aplicaciones
Construye tus aplicaciones iterando sobre las siguientes tareas:
1. Descubrir: Reunir requisitos
Antes de comenzar a construir una aplicación, deberías tener un esquema de lo que hará y quién la usará. Aquí hay algunas ideas sobre cómo puedes obtener esta información:
-
Escuchar y aprender: Organiza talleres y sesiones de diseño en persona para entender quién usará la aplicación y qué debería hacer.
-
Identificar información clave: Reúne y documenta los requisitos fundamentales para datos, personas usuarias, procesos de negocio y acceso y seguridad.
-
Evitar suposiciones: Haz preguntas para hacer que el usuario de la aplicación piense críticamente sobre lo que te está pidiendo que construyas. Desafía la lógica y el razonamiento detrás de los procesos de negocio de tus usuarios.
-
Confirmar comprensión: Lee de vuelta tu comprensión de los requisitos con los usuarios de tu aplicación y otros interesados. Utiliza diagramas de flujo y otras herramientas visuales para comunicar mejor las necesidades técnicas a usuarios no técnicos.
2. Modelar: Diseñar la base
Un modelo de datos sólido es la base de una aplicación exitosa. Esté dispuesto a dedicar tiempo a este paso para evitar una re-trabajo significativo más adelante.
- Crear un diagrama de entidad-relación (ERD): Un ERD documenta tu modelo de datos, facilitando la comprensión de las estructuras de las tablas y las relaciones. Proporciona una experiencia similar a una pizarra donde puedes hacer cambios fácilmente antes de comprometerlos a la base de datos. El siguiente es un ejemplo de un ERD simple:
erDiagram
Student {
UUID student_id PK "Student ID"
string name
}
Course {
UUID course_id PK "Course ID"
string title
}
Enrollment {
UUID enrollment_id PK "Enrollment ID"
UUID student_id FK "Student ID"
UUID course_id FK "Course ID"
string grade
}
Student ||--o{ Enrollment : "takes"
Course ||--o{ Enrollment : "has"
- Diseñar elementos fundamentales: Además del modelo de datos, crea diagramas de flujo, diagramas de carriles, wireframes y mapas del sitio según sea necesario para desarrollar el diseño de la aplicación.
3. Construir y demostrar: Desarrollo iterativo
Con un diseño sólido en su lugar, puedes comenzar a construir la aplicación.
-
Construir en capas: Desarrolla tu aplicación en capas distintas: Datos, Lógica de Negocio y Interfaz de Usuario. Construye desde la capa de datos hacia arriba.
-
Definir un producto mínimo viable (MVP): Define y enumera los elementos centrales de la aplicación y obtén la aprobación de los usuarios de la aplicación antes de comenzar la construcción principal.
-
Demostrar temprano y a menudo: Programa demostraciones regulares de las partes funcionales de la aplicación. Esto ayuda a los usuarios a entender lo que es posible y ajustar sus expectativas y requisitos.
4. Refinar y probar: Incorporar comentarios y QA
-
Refinar: Incorpora comentarios de las sesiones de demostración para refinar la aplicación y agregar características de diseño UI/UX más detalladas.
-
Probar: Es importante realizar pruebas exhaustivas.
-
QA interno: Siempre realiza pruebas internas primero para detectar errores.
-
UAT de usuario final: Permite que los usuarios de la aplicación realicen Pruebas de Aceptación del Usuario. Ellos conocen mejor el proceso de negocio y pueden proporcionar comentarios valiosos.
-
Usar datos realistas: Utiliza datos de prueba realistas para asegurar que las características se prueben de la manera en que los usuarios finales las utilizarían.
-
Pruebas positivas y negativas: Prueba tanto los resultados esperados (pruebas positivas) como los comportamientos inesperados (pruebas negativas).
-
5. Desplegar: Gestión de lanzamientos
-
Empaquetar e instalar: Utiliza la Gestión de Lanzamientos de App Builder para promover cambios en el esquema y actualizaciones de la aplicación entre entornos. Esto asegura que los cambios se repliquen en el orden correcto y reduce el riesgo de error humano.
-
Lanzamiento inicial: El MVP está en producción. El desarrollo generalmente se congela por un corto período para enfocarse en el soporte de producción.
-
Lanzamientos futuros: El proceso de desarrollo se reinicia para nuevas características y lanzamientos futuros.
6. Documentar y mantener
-
Documentar el proceso de negocio: Esto es esencial para la transferencia de conocimiento, la incorporación de nuevos desarrolladores y para el mantenimiento futuro.
-
Eliminar objetos no utilizados: Eliminar regularmente tablas, reglas y páginas no utilizadas para reducir la complejidad de la aplicación y facilitar el trabajo.
-
No dejar cosas rotas: Termina las características en las que estás trabajando. Una característica rota o incompleta crea confusión para otros desarrolladores y es más difícil de completar más tarde.
Capa de datos
Modelado de datos
-
Convenciones de nomenclatura:
-
Usa sustantivos distintos, singulares y descriptivos para las tablas (por ejemplo,
Customer
,Order
). Evita abreviarlos siempre que sea posible. -
Usa UUIDs para todas las claves primarias y foráneas. Una buena convención de nomenclatura es
TableNameID
(por ejemplo,CustomerID
). -
Prefija los campos booleanos con "is" (por ejemplo,
isActive
). -
Las reglas de negocio tienden a proliferar. Usa convenciones de nomenclatura de reglas de negocio para hacer un seguimiento de ellas.
-
-
Claves e indexación:
-
Claves primarias de una sola parte: Usa claves primarias UUID de una sola parte. Esto simplifica el modelo de datos y admite automáticamente las capacidades de auditoría completas de App Builder.
-
Columnas de índice: Indexa todas las claves foráneas. Además, indexa cualquier campo que se use comúnmente para ordenar, filtrar o unir datos para optimizar el rendimiento.
-
-
Relaciones:
- Usa tablas puente o de unión para gestionar relaciones de muchos a muchos. Evita diseños planos (agregar múltiples columnas para datos relacionados en una sola tabla), ya que no son escalables.
Diseño de tablas
-
Datos configurables: Diseña tu modelo de datos para que sea configurable. Por ejemplo:
-
Los valores que pueden cambiar con el tiempo (como los estados) deben almacenarse en tablas de búsqueda separadas en lugar de estar codificados de forma rígida en la lógica de negocio.
-
Para datos basados en el tiempo (como precios), usa una tabla de nivel inferior con rangos de fechas efectivas.
-
-
Habilitar auditoría: Habilita Audit Lite o Full Audit para todas las tablas para rastrear automáticamente los cambios de datos para la historia y el cumplimiento.
-
Definir el uso de tablas: Al crear tablas, define su tipo de uso (Desarrollador, Compartido o Datos de Usuario). Esto controla cómo se promueve la información entre entornos y es crucial para la gestión de lanzamientos.
-
Valores consistentes: Sé consistente en cómo usas valores como
NULL
. Un valorNULL
debe tener un significado claro y consistente en todo tu modelo de datos.
Tablas de búsqueda y parámetros
-
Tablas de búsqueda: Utiliza tablas de búsqueda para gestionar listas de valores. Deben incluir lo siguiente:
-
Título
: Un valor de visualización legible por humanos. App Builder utiliza el tipo de usoTítulo
para generar automáticamente controles de lista. -
Enum
: Un valor enumerado estático y legible por humanos. Usar enums en la lógica de negocio es mucho más claro que hacer referencia a un UUID en bruto. -
IsActive
: Un booleano para controlar qué valores están disponibles para selección en la interfaz de usuario. -
Índice
: Una columna entera para controlar el orden de clasificación predeterminado de la lista.
-
-
Tabla de parámetros: Cada aplicación debe tener una tabla de parámetros. Esta es una tabla única que contiene solo un registro y se utiliza para almacenar configuraciones y constantes globales de la aplicación. Esto evita la codificación rígida de valores y permite a los administradores cambiarlos a través de la interfaz de usuario.
Conexiones de datos
-
Conexiones seguras: Configura conexiones seguras a fuentes de datos externas.
-
Usar conectores de App Builder: Cuando necesites usar datos de la base de datos de otra aplicación en el mismo servidor, utiliza un Conector de App Builder. Esto reduce las dependencias de implementación, ya que no necesitas enviar los modelos lógicos y físicos de ambas bases de datos simultáneamente.
Lógica de negocio
Diseño de reglas
-
Conocer los tipos de reglas disponibles: Entiende cuándo usar objetos de negocio (para mostrar datos), validaciones (para verificar datos) y reglas CRUD (para cambiar datos).
-
Mantener las reglas simples: Simplificar cómo se construyen los objetos y las reglas. Utilizar subconsultas reutilizables siempre que sea posible para evitar duplicar la lógica.
-
Lógica impulsada por datos:
-
Configurar más, codificar menos: Almacenar valores cambiantes en tablas de configuración, no directamente en las reglas. Esto permite actualizaciones fáciles a través de la interfaz de usuario sin requerir un desarrollador.
-
Hacer cumplir la lógica a través del modelo de datos: Construir la lógica basada en la configuración de la tabla en lugar de codificar valores. Por ejemplo, utilizar un campo booleano en una tabla para controlar un proceso en lugar de una declaración
IIF
con un estado codificado.
-
-
Usar funciones de manera eficiente: Utilizar las funciones mvSQL integradas en App Builder para tareas comunes.
Convenciones de nomenclatura de reglas de negocio
Una convención de nomenclatura consistente para las reglas de negocio ayuda a mantener aplicaciones complejas. Utilizar el siguiente patrón general: Objetivo (Propósito o Subtipo) Descriptor – Filtro Opcional
.
Tipo de Regla | Patrón de Nomenclatura | Ejemplo |
---|---|---|
Objeto de Negocio (Eventos) | {{Objetivo}} ({{Descriptor}}) |
Cliente (Detalles) |
Objeto de Negocio (Informes) | {{Objetivo}} ({{Subtipo de Caso Especial}}) {{Descriptor}} |
Cliente (Gráfico) Tendencia de Ventas |
Lista | {{Objetivo}} (Lista) {{Descriptor Opcional}} |
Cliente (Lista) |
Subconsulta | {{Objetivo}} (Subconsulta) {{Descriptor}} |
Cliente (Subconsulta) Término de Búsqueda Concatenado |
CRUD (Insertar/Agregar) | {{Objetivo}} ({{Subtipo}}) {{Descriptor|Fuente}} |
Cliente (Insertar) Salesforce |
CRUD (Actualizar) | {{Objetivo}} ({{Subtipo}}) {{Descriptor|Nombres de Campos}} |
Cliente (Actualizar) ID de Estado |
CRUD (Eliminar) | {{Objetivo}} ({{Subtipo}}) {{Descriptor}} |
Cliente (Eliminar) Sin Actividad |
Predeterminado | {{Objetivo}} (Predeterminado) {{NombresDeCampos}} – {{TablaFuente}} |
Cliente (Predeterminado) IDEstadoCuenta |
SQL de Rendimiento | {{Objetivo}} {{Función SQL}} {{Descriptor}} |
Cliente (Agrupar Por) País, Estado |
Validación | {{Objetivo}} (Validación) {{Descriptor}} |
Cliente (Validación) Nombre demasiado corto |
Visibilidad | {{Objetivo}} (Visibilidad) {{Descriptor|Tabla Fuente}} |
Cliente (Visibilidad) TipoDeCliente |
Puente | {{Objetivo}} (Puente) {{Descripción}} |
Orden (Puente) Fallido |
Alcance | {{Objetivo}} (Alcance) {{Descriptor|Tabla Fuente}} |
Cliente (Alcance) TipoDeCliente |
Webhook | {{Objetivo}} (Webhook) {{Descriptor}} |
Cliente (Webhook) Externo |
Optimización de consultas
-
Selecciona solo las columnas necesarias: Incluye solo las columnas que necesitas en tus reglas.
-
Une por claves: Une tablas utilizando sus claves UUID para obtener el mejor rendimiento.
-
Uniones inteligentes: Usa el tipo de unión apropiado para tus necesidades. Prefiere usar un solo tipo de unión externa (como
LEFT JOIN
) en una consulta. -
Optimiza las cláusulas WHERE: Evita usar expresiones en ambos lados de un operador de cláusula
WHERE
, ya que esto puede afectar negativamente el rendimiento. -
Unión en el nivel más alto: Al combinar conjuntos de datos, utiliza
UNION
en el nivel más alto posible en tu consulta para un mejor rendimiento.
Eventos y acciones
-
Registra eventos a nivel de tabla: Siempre que sea posible, registra eventos (como validaciones y acciones) a nivel de tabla. Esto permite que otras reglas de negocio hereden esa lógica, proporcionando un único lugar para gestionarla.
-
Encadena acciones: Usa acciones de éxito y fracaso para vincular múltiples reglas y validaciones para flujos de trabajo complejos de "si esto, entonces aquello".
-
Entiende los disparadores: Conoce qué inicia un evento (una acción del sistema o una acción del usuario).
Validaciones
-
Imponer calidad de datos: Usa validaciones para asegurar que los datos sean correctos antes de que se guarden.
-
Imposición en capas: Aplica validaciones a nivel de lógica de negocio o de tabla, no solo en la interfaz de usuario, para asegurar la integridad de los datos.
UI/UX
Un buen diseño de UI/UX es crítico para el éxito de una aplicación. Una interfaz bien diseñada debe ser intuitiva, eficiente y cómoda para el usuario de la aplicación.
Principios de alto nivel
-
Funcionalidad primero: Enfócate en crear una aplicación funcional antes de refinar el diseño visual. La lógica de negocio y las estructuras de datos pueden cambiar durante el desarrollo, lo que podría requerir rehacer cualquier trabajo de UI prematuro.
-
La consistencia es clave: Todos los elementos, desde botones y fuentes hasta colores y diseño, deben ser consistentes en toda la aplicación. Esto crea una experiencia cómoda y predecible para los usuarios.
-
Mantenlo limpio:
-
Sé generoso con el espacio: No aprietes los elementos en la interfaz de usuario. Un espaciado adecuado reduce el desorden y la carga cognitiva, haciendo que la información sea más fácil de digerir.
-
Usa un estilo sutil: Utiliza un estilo limpio y moderno. Por ejemplo, las sombras deben ser ligeras y sutiles, no oscuras y abrumadoras (a menos que esa sea tu elección de estilo corporativo).
-
Elimina objetos no utilizados: Remueve páginas y otros objetos no utilizados para reducir la sobrecarga de la aplicación y facilitar el mantenimiento.
-
Diseño y navegación
-
Elige la navegación adecuada:
-
La navegación lateral es generalmente la mejor opción, ya que es receptiva, escalable y puede mostrar claramente una estructura de carpetas/árbol. Es más adecuada para aplicaciones con muchos elementos de navegación.
-
La navegación superior funciona bien para aplicaciones con muy pocos elementos de nivel superior, donde el espacio en pantalla es una prioridad. No es adecuada para diseño responsivo o submenús profundos.
-
-
Establece una jerarquía visual: Usa tamaño, peso y color para guiar la vista del usuario de la aplicación hacia la información más importante en la página. Los encabezados de panel, subtítulos y contenido deben ser distintos.
-
Simplifica las acciones: Proporciona a los usuarios de tu aplicación un lugar único y claro para realizar una acción específica. Evita ofrecer múltiples formas de hacer lo mismo.
-
Organiza el contenido:
-
Agrupa el contenido: Organiza pantallas complejas con grupos lógicos o pestañas.
-
Vincula paneles: Conecta paneles de la interfaz de usuario para que seleccionar un elemento en uno actualice automáticamente la información relacionada en otro.
-
Usa ventanas emergentes correctamente: Utiliza ventanas emergentes para detalles o entrada de datos. Nunca muestres múltiples ventanas emergentes apiladas una sobre la otra.
-
Entrada e interacción del usuario
-
Diseña botones claros:
-
Texto orientado a la acción: Usa verbos de acción en los botones (por ejemplo, "Crear Informe", "Guardar para Más Tarde") en lugar de texto genérico como "Sí" o "No".
-
Jerarquía de botones: Crea una clara distinción visual entre acciones primarias (colores sólidos y audaces) y acciones secundarias (contornos o menos prominentes).
-
-
Proporcionar mensajes de error útiles: Los mensajes de error deben utilizar un lenguaje sencillo, identificar claramente el problema y sugerir constructivamente una solución. No se debe depender únicamente del color para indicar un error.
-
Usar íconos de manera efectiva:
-
Usar etiquetas con íconos reconocibles: Utilizar íconos bien conocidos (como una lupa para búsqueda) en combinación con etiquetas de texto significativas. Muchos íconos no son universalmente entendidos por los usuarios de la aplicación por sí solos.
-
Mantener un estilo consistente: Usar íconos que compartan el mismo estilo visual (por ejemplo, relleno, trazo y tamaño).
-
-
Mejorar la entrada de datos:
-
Marcar campos obligatorios: Indicar claramente cuáles campos son obligatorios.
-
Usar controles de lista: Ofrecer opciones predefinidas para la entrada de datos para asegurar consistencia.
-
-
Usar el diseñador en vivo: Hacer ajustes en la interfaz de usuario en tiempo real directamente en la aplicación para refinar rápidamente la experiencia del usuario.
Tipografía y color
-
Usar fuentes legibles y consistentes:
-
Limitar familias de fuentes: No usar más de dos familias de fuentes. Una a menudo es suficiente.
-
Considerar combinaciones de fuentes: Si se utilizan dos fuentes, usar una para los encabezados y otra para el texto del cuerpo.
-
Evitar mayúsculas: No usar mayúsculas para el texto del cuerpo, ya que es más lento de leer. Solo debe usarse para alertas cortas o encabezados grandes.
-
-
Usar una paleta de colores clara:
-
Limitar colores: Apuntar a 3 o 4 colores: uno dominante, uno secundario y uno o dos colores de acento.
-
Usar colores semánticos: Utilizar colores comúnmente asociados para proporcionar información sobre el estado (por ejemplo, rojo para una advertencia, verde para éxito, gris para un botón deshabilitado).
-
Diseñando para la accesibilidad
-
Asegurar un alto contraste de color: El texto debe tener una alta relación de contraste con su fondo (al menos 4.5:1 para texto normal).
-
Diseñar para la navegación por teclado: Asegurarse de que todos los formularios y elementos interactivos funcionen para los usuarios de la aplicación que solo pueden navegar por teclado.
-
Asegurar que los elementos clicables sean lo suficientemente grandes: En pantallas móviles y táctiles, asegurarse de que los botones, enlaces y otros elementos clicables sean lo suficientemente grandes para ser utilizados fácilmente. Un tamaño mínimo de 32x32 píxeles es un buen punto de partida.
-
Prueba en dispositivos móviles reales: La mejor manera de confirmar que tu aplicación es verdaderamente receptiva y utilizable es probarla en dispositivos móviles reales, no solo en emuladores de navegador.
Entornos y despliegues
El enfoque de 3 niveles
Desarrolla tus aplicaciones en instancias de App Builder en al menos estos tres entornos:
-
DEV (Desarrollo): Este entorno permite a los desarrolladores trabajar en nuevas características sin afectar a los usuarios. Todas las modificaciones y esfuerzos de desarrollo deben realizarse aquí.
-
QA (Aseguramiento de Calidad): Proporciona a los usuarios de la aplicación un entorno para probar sin afectar a los desarrolladores o a los datos de producción.
-
PROD (Producción): El entorno en vivo para los usuarios de la aplicación.
Gestión de lanzamientos y cambios
-
Nunca modifiques QA o PROD directamente: Siempre construye en DEV, promueve a QA para pruebas y luego promueve a PROD después de la aprobación de QA. Hacer cambios directamente en entornos superiores puede desincronizar tus sistemas y poner en peligro futuros despliegues.
-
Utiliza la gestión de lanzamientos de App Builder: Esto asegura que cualquier cambio que realices en DEV se replique en QA y PROD en el mismo orden, previniendo errores humanos.
-
Realiza copias de seguridad de bases de datos: Siempre toma una copia de seguridad de la base de datos de tus entornos antes de un despliegue de aplicación o una actualización de versión de App Builder.
-
Registros de cambios descriptivos: Cierra los registros de gestión de cambios con frecuencia y sé descriptivo sobre lo que cambió. Esto facilita la revisión de cambios históricos si necesitas solucionar un problema.
-
Planifica los despliegues: Sé metódico al mover aplicaciones a producción y establece expectativas con anticipación. Planifica los despliegues para después del horario laboral para minimizar el impacto.
Seguridad de la aplicación
-
Utiliza proveedores de seguridad: Siempre que sea posible, utiliza un proveedor de seguridad para la autenticación. No asignes seguridad manualmente.
-
Acceso basado en roles (RBAC): Asigna roles a los usuarios de la aplicación para controlar el acceso a páginas y acciones. Los elementos de la interfaz de usuario pueden configurarse para adaptarse según el rol de un usuario de la aplicación.
-
Gestión eficiente de grupos: Organiza a los usuarios de la aplicación en grupos para simplificar la gestión de permisos.
-
Seguridad a nivel de fila: Utiliza reglas de alcance para mostrar diferentes subconjuntos de datos a diferentes usuarios de la aplicación en la misma pantalla.
-
Integrar SSO: Utiliza el inicio de sesión único (SSO) para una autenticación de usuario simplificada y segura.
Sistemas de notificación
-
Notificaciones bidireccionales: Diseña notificaciones para que los usuarios de la aplicación puedan responder con opciones que actualicen los datos de la aplicación.
-
Contenido personalizado: Utiliza datos dinámicos en los mensajes para notificaciones personalizadas.
-
Enlace a páginas públicas: Asegúrate de que cualquier página de la aplicación vinculada desde una notificación sea accesible públicamente.
-
Disparadores consistentes: Registra notificaciones a nivel de tabla para un disparo confiable.
-
Mensajes configurables por el usuario: Permite que los usuarios de la aplicación modifiquen el texto de las notificaciones a través de la interfaz de usuario. Esto reduce la necesidad de la intervención de desarrolladores para cambios simples de texto.