¿Cuál es el valor de las herramientas de flujo de trabajo? [cerrado]


22

Soy nuevo en el desarrollo de Workflow, y no creo que realmente esté entendiendo el "panorama general". O quizás para decirlo de otra manera, estas herramientas actualmente no "hacen clic" en mi cabeza.

Parece que a las compañías les gusta crear dibujos de negocios para describir procesos, y en algún momento alguien decidió que podrían usar una máquina de estado como un programa para controlar realmente los procesos desde una línea y cuadros como un diagrama. Diez años después, estas herramientas son enormes, extremadamente complicadas (mi compañía actualmente está jugando con WebSphere, y he asistido a algunas de las capacitaciones, es un monstruo, incluso las llamadas versiones "minimalistas" de estas herramientas de flujo de trabajo como Activiti son enorme y complicado, aunque no tan complicado como la bestia que es WebSphere afaict).

¿Cuál es el gran beneficio de hacerlo de esta manera? Puedo entender que los diagramas simples de líneas y cuadros son útiles, pero estas cosas, por lo que puedo decir, son lenguajes de programación visual en este punto, completos con condicionales y bucles. Los programadores aquí parecen estar haciendo una gran cantidad de trabajo en la capa de líneas y cuadros, lo que para mí parece un lenguaje de programación visual realmente horrible y básico.

Si vas a llegar tan lejos, ¿por qué no usar algún tipo de lenguaje de script? ¿La gente ha tirado al bebé con el agua del baño en esto? ¿Se han llevado las líneas y los cuadros a un nivel absurdo, o simplemente no entiendo el valor de todo esto?

Realmente me gustaría ver argumentos en defensa de esto por parte de personas que han trabajado con esta tecnología y entender por qué es útil. No veo el valor en él, pero reconozco que también soy nuevo en esto y es posible que todavía no lo entienda.


1
Las "herramientas de flujo de trabajo" no son más que "herramientas de programación visual", y creo que esta publicación de blog dice lo suficiente: blog.davor.se/blog/2012/09/09/Visual-programming
Doc Brown

1
Las herramientas de flujo de trabajo de Nope, son herramientas para reemplazar el papel y la forma en que las personas trabajan de manera estandarizada. Piense en un hospital, ¿no sería genial si todos los documentos oficiales pasaran por las mismas rutas, sin que algunas personas prefirieran la ruta X del documento, o hablaran o llamaran directamente por teléfono sobre la estandarización del trabajo, a menudo un requisito legal.
user613326

@ user613326: honestamente, deberías leer la pregunta nuevamente. Se ocupa exactamente de lo que escribí: herramientas de flujo de trabajo para controlar y ejecutar flujos de trabajo, no solo para modelarlos. No niego los beneficios de modelar flujos de trabajo (especialmente en forma electrónica en lugar de usar lápiz y papel), o estandarizarlos, pero cuando empiezo a usar las herramientas para la "programación visual", no espero mejores resultados como se describe en lo anterior Blog.
Doc Brown

Respuestas:


8

Desde el punto de vista de un desarrollador, tiene razón al decir que estos entornos "visuales" son realmente difíciles de trabajar. Los flujos de trabajo de SharePoint 2010, que utilizo, arrojan todas las mejores prácticas para crear un buen software empresarial: sin pruebas automatizadas, sin reutilización de código, software ilegible ... Cualquier cosa más compleja que una plantilla lista para usar puede ser dolorosa de mantener , como lo estás experimentando.

Pero desde el punto de vista empresarial, los flujos de trabajo tienen enormes beneficios, al menos en teoría. Para citar de este documento técnico , la eficiencia, la responsabilidad, el control y la facilidad de uso de un flujo de trabajo automatizado proporcionan enormes ganancias de productividad. Imagine cuánto más ineficiente sería un simple proceso de aprobación o incorporación sin esta automatización. Además, el acto mismo de definir un flujo de trabajo es valioso para una organización que está tratando de controlar sus procesos comerciales.

El estado actual del software de flujo de trabajo no es culpa de la empresa. Solo quieren facilitarles la vida, y los flujos de trabajo son excelentes para eso. Principalmente nos culparía a nosotros, el departamento de TI:

  1. Por no ser más transparente con el negocio sobre cuán complejo y frágil es realmente el sistema. Ocultamos toda la complejidad.
  2. Por no poder "rascarse la picazón" con soluciones intuitivas y simples de flujo de trabajo. Probablemente sea más una queja contra los grandes paquetes empresariales como SharePoint y SAP, pero son mejores que las soluciones personalizadas que existen.

2
El enlace aún está muerto: no hay posibilidad de ver en qué experiencia del mundo real se basa el documento técnico cuando falta el recurso.
Doc Brown

7

Solo hay un beneficio real, pero es enorme: la separación de preocupaciones .

Entonces, en lugar de que la lógica de orquestación del proceso se incruste en nuestro sistema, se convierte en una configuración externa. Un mapa, básicamente. Puede cambiarlo (mucho más) de forma independiente, puede tener múltiples procesos, múltiples versiones de procesos, múltiples versiones de múltiples procesos ejecutándose al mismo tiempo, y eso es todo listo para usar en cualquier solución decente.


Históricamente, el concepto de SoC ha ganado muchas veces, comenzando por el principio de Unix "haz una cosa, pero hazlo bien", y se aplica una y otra vez, como tener componentes de servidor dedicados como ESB, diferentes sistemas de persistencia, almacenamiento en caché, equilibrio de carga , monitoreo, como dividir CSS de HTML, etc.

Su proceso de negocio y sus reglas de flujo a menudo son ortogonales a sus datos, "pantallas" de IU o "jerarquía" de usuarios. Por lo tanto, tiene mucho sentido desarrollarlo y cambiarlo por separado de los otros aspectos del sistema. Esa fue la premisa en la que BPM apareció a principios de la década de 1990.

Desde entonces, muchas de las herramientas y lenguajes se crearon para admitir este concepto, y el más conocido es BPMN , un lenguaje gráfico para crear "diagramas de flujo" que se asignan directamente a los procesos. Si bien la gente se queja de que es grande y difícil de manejar (que tiene más de 100 símbolos en el vocabulario), y aboga por enfoques modernos como S-BPM (tiene solo 5 símbolos básicos), la práctica actual de la industria es apegarse a BPMN o sus derivados, subconjuntos o hermanos.

No pareces satisfecho con BPMN:

Los programadores aquí parecen estar haciendo una gran cantidad de trabajo en la capa de líneas y cuadros, lo que para mí parece un lenguaje de programación visual realmente horrible y básico.

Pero no es tan malo) Hay una teoría detrás de esto. Y la versión 2.0 tomó una buena idea de las deficiencias 1.0.

Si vas a llegar tan lejos, ¿por qué no usar algún tipo de lenguaje de script?

Los paradigmas imperativos y los lenguajes de script no siempre son la mejor respuesta. Como probablemente haya visto en lenguajes declarativos (como HTML, CSS, SQL, Drools o internos de Nginx, Graddle y Maven, Puppet, etc.), el código resultante puede ser mucho más pequeño y limpio que una versión escrita en " lenguaje decente " . como Java o C ++ ".

En cuanto a su otro punto:

Por lo que puedo decir, son lenguajes de programación visual en este punto, completos con condicionales y bucles.

¿Has mirado en los eventos y disparadores ? BPMN es un idioma y debe aprenderlo antes de usarlo, o al menos familiarizarse con él.

Bajo el capó, BPMN es XML, por lo que puede editarlo a mano o generarlo. Y puede controlarlos por versión, porque XML está basado en texto. Sin embargo, el simple hecho de tener un XML que pueda traducirse en diagramas de flujo no parece que vaya a ayudarlo, y eso es correcto: escribir su propio analizador o editor es una tarea difícil y costosa con beneficios cuestionables.

Afortunadamente, ya existen herramientas en el mercado que hacen exactamente eso.


Activiti es gratis y bastante popular entre los desarrolladores y propietarios de negocios, debido a su precio inicial ( cero ), disponibilidad de información y humildad. El último punto es realmente único, ya que Activi solo se enfoca en administrar sus procesos comerciales, sin tratar de vincularlo con soluciones de paquete completo. Además, está abierto, por lo que solo necesita conocer Java y REST para ponerlo en funcionamiento. El inconveniente es que el lado del cliente, la integración y la lógica de aplicaciones / negocios y toda la arquitectura se dejan al desarrollador, por lo que si su equipo de desarrollo es débil, prepárese para el fracaso. El costo total de propiedad puede ser sorprendentemente alto para una herramienta gratuita ;)

En el otro lado del espectro está Pega (Pega PRPC), el rey reinante de los sistemas BPM (según Gartner y Forester), que se ve sorprendentemente bien para su edad. Este gigante de fregadero y cocina es incluso capaz de CRM, OCR y (si no me equivoco) capacidades de reconocimiento de voz, análisis predictivo, gestión de reglas comerciales y editor de interfaz de usuario WYSIWYG. Sin embargo, viene con una etiqueta de precio seria. No solo cuesta una fortuna, sino que todo el desarrollo se realiza dentro de una aplicación web, lo que significa que debe usar el navegador, que es IE8 (más algunos complementos, más hacks feos, como usar Excel para editar tablas de datos). Además, la edición de Java, Javascript o HTML / CSS también se está haciendo dentro del navegador web, así que despídase de las pruebas unitarias, el resaltado del código IDE, la refactorización y todos sus juguetes de programación que le han encantado.

Buen lado de eso? puede implementar un sistema complejo DENTRO DE SEMANAS [ PDF , consulte la página 22]. Y sí, el resultado no está garantizado.

IBM haber algo recientemente (accoring al ritmo de tiempo de la empresa) han comprado Lombardi, y ahora está ofreciendo una solución muy competitiva (pero entonces usted tendrá que comprar todo lo IBM , you'know). Appian es un proveedor joven que tiene ideas interesantes y comentarios positivos, pero la forma en que están escritos (dos lenguajes DSL adicionales además del visual) simplemente no me atrae.

Hay otros jugadores y sus soluciones. La mayoría de ellos son simplemente horribles. Me gusta: tus ojos, cerebro y corazón sangrarían literalmente cuando simplemente los miras. Por lo tanto, confíe en sus agallas y no haga que sus desarrolladores y usuarios lo odien.


Nota de cierre:

El sistema BPM es el mismo para los procesos, lo que Photoshop es para las imágenes. No tengas miedo de que sea visual. No haga que haga el trabajo que no le conviene (¿recuerda los sitios web creados completamente en Photoshop, que eran casi imposibles de editar?). Mantenlo simple y no hagas errores;)


3

Hace años, antes de que naciera la mayoría de nosotros, los desarrolladores de software tuvieron que escribir su propio código para almacenar datos. Si necesitaba guardar el estado del programa, bueno, eso se veía como parte de la función del código, por lo que muchos desarrolladores de software terminaron escribiendo código para organizar los datos y guardarlos, leerlos, etc.

Y entonces alguien se dio cuenta de que esto era algo que sucedió mucho: que la lógica para guardar, organizar, leer y buscar datos era en realidad un componente que se usaba tan comúnmente que debería ser su propio componente. Y tenemos bases de datos.

En los últimos 10 a 15 años, los departamentos de TI se han dado cuenta de que la lógica para coreografiar y / u organizar procesos de negocio es tan común que también debería ser su propio componente, lo que ha llevado a todo tipo de herramientas de flujo de trabajo diferentes.

Hay 3 beneficios principales de una herramienta de flujo de trabajo:

  1. Tiempo necesario para realizar e implementar cambios : puede desarrollar y cambiar la lógica de un flujo de trabajo sin los mismos riesgos técnicos que tiene al cambiar un fragmento de código.
  2. Transparencia : la lógica de negocios en un sistema basado en BPM está inmediatamente disponible y legible por el analista de negocios, mientras que solo los desarrolladores podrán leer la lógica de negocios en sistemas "basados ​​en código".
  3. Reutilización de componentes técnicos : las herramientas BPM a menudo se usan junto con sistemas que tienen una Arquitectura Orientada a Servicios. Al separar la lógica empresarial de los componentes técnicos, especialmente para los sistemas empresariales que deben implementar cientos o miles de procesos comerciales diferentes, puede reutilizar los componentes técnicos mientras dedica relativamente poco tiempo a desarrollar la lógica empresarial (con un flujo de trabajo herramienta).

Sin embargo, uno de los problemas más comunes con los que me encuentro con el flujo de trabajo y el uso de la herramienta BPM es que los desarrolladores aún intentan "enterrar" la lógica empresarial en un código no transparente.

Lo que veo, todo el tiempo , es que los desarrolladores todavía intentan agregar la lógica de negocios de la manera más técnica posible, en lugar de la forma más transparente posible. Esto es natural, porque los desarrolladores son, por su propia naturaleza, mucho más cómodos con el código que con una herramienta de flujo de trabajo. Además, mientras más lógica mantenga de manera técnica, más se le necesitará como desarrollador. Desafortunadamente, esto es lo peor que un desarrollador puede hacer a un sistema BPM porque está socavando los principales beneficios del uso de BPM.

Por último, la mayoría de las herramientas BPM no son lo suficientemente lejos como para que los analistas de negocios puedan desarrollar los flujos de trabajo ellos mismos: sin embargo, ese es el objetivo. Idealmente, los analistas de negocios desarrollarían los diagramas de flujo de trabajo / proceso de negocio y los desarrolladores solo trabajarían en los componentes técnicos que son llamados por el motor de flujo de trabajo.


1
Gracias por su respuesta. Entonces, afaik, hay herramientas básicas de flujo de trabajo basadas en gráficos directamente, y hay herramientas complejas de flujo de trabajo, que son esencialmente representaciones visuales de los lenguajes de programación completos de Turing. Lo que no entiendo es si necesita un lenguaje de programación completo de Turing ... ¿por qué no hacerlo con un lenguaje de programación real de uso general? Si usa bucles y condicionales, ¿por qué no lo hace en digamos ... Python?
user16549

2
Debido a que las representaciones visuales de los lenguajes de programación completos de Turing son accesibles para una audiencia mucho mayor que los desarrolladores, lo que significa que las empresas que usan estas herramientas solo tienen que contratar desarrolladores para componentes técnicos y pueden dejar que los expertos en el dominio hagan el resto (con la herramienta de flujo de trabajo). Además, las representaciones visuales son inmediatamente transparentes, a diferencia del código de cualquier tipo.
Marco

¿Consideró que la razón real para que los desarrolladores implementen la lógica de negocios en el código en "líneas y cuadros" no es porque "los desarrolladores se sientan más cómodos en el código", sino que la mayoría de las herramientas de flujo de trabajo gráfico simplemente no son adecuadas para describir el mundo real flujos de trabajo de manera ejecutable (eso significa, con todas las excepciones, manejo de fallas, manejo de fallas en parte, visualización de estado, requisitos no funcionales, etc.)
Doc Brown

@DocBrown El objetivo de las herramientas de flujo de trabajo es evitar situaciones en las que los desarrolladores implementen la lógica empresarial. Idealmente, los deverlopers solo pasan su tiempo implementando componentes técnicos y permiten que los analistas de negocios (con la ayuda de las herramientas de flujo de trabajo) desarrollen y mantengan los componentes de lógica de negocios.
Marco

@Marco: la conclusión que extraigo de lo que escribió es que las herramientas están lejos de cumplir con las expectativas, de lo contrario, los desarrolladores ni siquiera tendrían la tarea de desarrollar la lógica del flujo de trabajo.
Doc Brown

1

Las declaraciones a continuación son mi experiencia personal al usar herramientas de flujo de trabajo, específicamente Oracle BPM Suite (10.3G y 11G). Primero en especificar, su pregunta se centra en las herramientas de flujo de trabajo que permiten modelar modelos de procesos ejecutables, estas herramientas son parte de Business Process Management Systems (BPMS). Este modelado de proceso específico definitivamente se está desarrollando y puede referirse a él como un lenguaje de programación visual.

El principal beneficio es la agilidad de comprender y cambiar la lógica del proceso.

Con los modelos de procesos de negocio, cubre una explicación visual de la lógica del proceso y, al mismo tiempo, un componente integrable ejecutable. Esto permite la entrada y salida de programadores más rápido, ya que debe documentarse menos documentación sobre las transiciones, condicionales (Gateways o Business Rules) y el flujo de procesos en general, ya que es parte del desarrollo.

Además, ha adjuntado capacidades de informes / monitoreo, lo que tendría que desarrollar individualmente para cada aplicación, que está cubierto por la mayoría de los BPMS.

Además, en la mayoría de los entornos de desarrollo de BPM, los adaptadores de servicios están preconstruidos (por ejemplo, JMS, servicios web, JDBC, etc.), lo que permite desarrollar soluciones de middleware más rápido en una integración interactiva paso a paso, reduciendo los errores humanos en la codificación.

La siguiente plataforma de flujo de trabajo logra muchos de los beneficios mencionados anteriormente: enfoque basado en la plataforma para la automatización de los flujos de trabajo


0

El valor

La propuesta de valor es que los flujos de trabajo pueden crearse o modificarse rápida y fácilmente para adaptarse a la naturaleza cambiante de un negocio. Una parte importante de la realización de esta propuesta de valor es que los procesos comerciales en sí mismos son unidades de recursos en el sistema.

Los flujos de trabajo como unidades de recursos significan que un proceso de negocio se define como una única 'unidad'. Para entender lo que quiero decir con esto, considere cualquier programa de computadora escrito para un negocio. Implementa un proceso de negocio seguro, pero es probable que la lógica de ese proceso se extienda en cierta medida alrededor del código fuente. Una herramienta de flujo de trabajo debe permitir que el proceso se defina en un lugar bien contenido. Podría estar en un solo archivo de configuración, o extraído de un diagrama visual, o podría significar que el flujo de trabajo está en un solo módulo de código que se puede enchufar, incluso intercambiar o configurar sobre la marcha.

Por qué el valor puede no realizarse

Esta propuesta de valor puede verse socavada por las dificultades de cubrir casos que no son de vainilla, integrarse con tecnología de interfaz de usuario que cambia muy rápidamente, malas prácticas como usar la herramienta de flujo de trabajo solo como envoltorio y poner la lógica real en el código de todos modos.

El mal diseño de las propias herramientas puede ser un factor limitante. Un ejemplo sería una herramienta que requiere que todos los parámetros pasados ​​entre los procesos estén en un mapa de Java, con restricciones sobre los valores que realmente puede poner en el mapa, en lugar de los parámetros de métodos antiguos simples (estoy pensando en uno de los más herramientas populares en particular que hace esto).

Creo que probablemente sea justo decir que IBM, como gran jugador con un gran ecosistema tecnológico, tiene mejores ferias que los demás. Si también controlan la tecnología de interfaz de usuario y la tecnología de base de datos y SOA que se utiliza junto con la herramienta de flujo de trabajo, tienen una mejor oportunidad de crear un ecosistema que se integre bien y cree una oportunidad para aprovechar realmente esta idea.

Es definitivamente cierto que el esfuerzo de escribir la interfaz entre una herramienta de flujo de trabajo y las otras partes de un sistema puede negar por completo toda la propuesta de valor. Siempre vale la pena considerar si hay una mejor manera de hacer las cosas.

La programación es flujo de trabajo

La verdad es que la programación (al menos en lenguajes imperativos) ES FLUJO DE TRABAJO. Es posible que tenga un código que implemente el flujo de trabajo que tiene que ver con el manejo de la tecnología del sistema; acceder a archivos y ejecutar consultas SQL, etc. Es posible que tenga un código que implemente el flujo de trabajo empresarial; establecer el estado de un documento y pasarlo a un revisor, por ejemplo.

Reconocer esto y diseñar su código para dividir limpiamente estas inquietudes separadas es difícil de lograr por completo, pero ciertamente puede hacer un largo camino haciendo eso.

Estoy de acuerdo con usted, a veces terminamos usando estas herramientas porque alguien más decidió que era una buena idea, y son demasiado complejas y dificultan nuestro trabajo. No creo que ese sea siempre el caso, necesita una cuidadosa consideración para decidir si vale la pena o no.


1
"No creo que sea siempre el caso". ¿Puede respaldar esto con alguna experiencia del mundo real? Eso puede ser interesante.
Doc Brown

@DocBrown Lamentablemente no. He escuchado a otros reclamar éxitos con estas herramientas y rápidos cambios de nuevos procesos. Las únicas experiencias directas que he tenido de ellos han sido de enormes, difíciles de manejar y enormemente largos esfuerzos que me llevan a dudar seriamente de su valor. Me resistiré a nombrar al proveedor de herramientas ya que solía trabajar para ellos, pero mi sensación fue que gran parte de la falla estaba en la herramienta en sí y en la forma en que hacía que la programación fuera más incómoda.
usuario2800708

@DocBrown Debo agregar, se ha sugerido que usemos dicha herramienta en mi proyecto de trabajo actual. Por lo tanto, actualmente estoy tratando de considerar si vale la pena en lugar de lanzar nuestro propio código. Puede valer la pena explorar algo más liviano que las herramientas grandes, hasta ahora no sé qué sería.
user2800708

@DocBrown vale la pena señalar que la pregunta actualmente tiene una recompensa que dice "Buscando un sorteo de respuestas de fuentes confiables y / u oficiales". A la luz de esto, puramente especulativa respuesta no parece particularmente útil (es de extrañar lo que podría ser la razón para votar hacia arriba)
mosquito

-2

No está muy claro qué herramienta está utilizando. Supongo que puede estar refiriéndose al conjunto general de herramientas llamadas herramientas de modelado de procesos empresariales. Hay una buena razón para usar tales herramientas. Cualquier empresa de calidad define sus funciones en términos de procesos y analistas, así como los expertos empresariales pueden dibujar dichos procesos cómodamente (hasta que los vincule con los estándares ...). Puede crear dichos procesos en el nivel conceptual sin ningún conocimiento de programación web y, si tiene la herramienta adecuada, también puede convertir el proceso en una aplicación de trabajo (las personas experimentadas deben participar para que esta magia entre en producción por supuesto). Entonces la idea es buena.

El objetivo de las herramientas visuales no es solo la documentación de los procesos. El uso de las herramientas está destinado a ayudar a los procesos de reingeniería profesional y, a veces, ejecutar simulaciones para descubrir puntos donde los procesos son menos eficientes de lo deseado para que se puedan establecer planes para eliminar los cuellos de botella.

Hay una forma estándar que muchas empresas usan hoy en día llamada BPMN 2.0 (notación de modelado de procesos comerciales). Le recomiendo que entienda esta notación si su herramienta la está utilizando.

El Business Knowledge Management Body of Knowledge es un recurso famoso, que también puede considerar.

Lo anterior cubre el lado comercial. El aspecto técnico requiere SOA y BPEL, aunque no estoy seguro de poder dar consejos sobre eso aquí y ahora.


2
OP está mencionando qué herramientas tiene en mente, y esas no son herramientas de modelado o simulación. De hecho, las herramientas BPM son principalmente para "crear dibujos de negocios para describir procesos", y el OP ve el valor en ellos. La pregunta es sobre herramientas para controlar esos procesos.
Doc Brown

@DocBrown, aclaración apreciada.
NoChance

1
@doc Brown: ¡las herramientas en cuestión controlan la ejecución de componentes utilizando los diversos Modelos y diagramas como "código"! (Y funciona tan bien como cabría esperar, de ahí el desgarro del cabello y el crujir de dientes del OP).
James Anderson

-2

En simple ejemplo por la historia.

Edad de Piedra

Al principio, tenías pequeñas compañías de menhires donde la gente decía dónde hacer y lo hacían. A veces las cosas van mal, y se culpa a la Persona X o Y (nunca estoy seguro de quién lo hizo realmente).

Luego se inventó Internet y correo electrónico.

La gente ahora escribía a otros qué hacer, y esas personas a menudo tenían problemas con su correo electrónico, lo leían mal o simplemente borraban un correo electrónico sin leerlo nunca; tan a menudo las cosas no se culpan de mal correo electrónico

El flujo de trabajo evolucionó a partir de la administración Al estandarizar las acciones, finalmente las personas pudieron ver en qué fase detuvieron un proceso y, al mismo tiempo, obtuvieron una visión digital de lo que realmente se había hecho. Esto funcionó bien hasta que las personas quisieron cambiar los procesos estándar, o hasta que una persona XY desconocida causó una solicitud incorrecta de la base de datos que resultó en la corrupción de la base de datos, lo que envió la producción a la edad de piedra.


1
¿Es esta simplemente su opinión, o puede respaldarla de alguna manera? Tenga en cuenta que la pregunta actualmente tiene una recompensa que dice "Buscando un sorteo de respuestas de fuentes confiables y / u oficiales".
mosquito

está basado en la historia, fue un ejemplo hilarante, pero no todos entienden el flujo de trabajo y el humor juntos que veo.
user613326
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.