Category: Desarrollo

C++ Ranges: Cuellos de botella de rendimiento y estrategias de optimización

2025-04-08

Este artículo profundiza en los problemas de rendimiento con los adaptadores C++ Ranges como `views::filter` y `views::take_while`. Estos adaptadores introducen comparaciones de iteradores redundantes, lo que afecta al rendimiento. El autor analiza las causas raíz y propone dos soluciones: utilizar la biblioteca Flux de Tristan Brindle, que mejora el rendimiento mediante la iteración interna y una mejor gestión de la memoria; y un enfoque más radical que aprovecha las características potenciales de las secuencias de tokens de C++ para generar código de bucle optimizado, eludiendo las limitaciones de Ranges. Ambas soluciones mejoran significativamente el rendimiento, especialmente para operaciones de rango complejas que involucran `views::reverse`.

Desarrollo

Resolviendo un rompecabezas de Layton con elegancia usando Prolog

2025-04-08
Resolviendo un rompecabezas de Layton con elegancia usando Prolog

El autor reescribió el capítulo sobre lenguajes de programación lógica en su libro "Lógica para Programadores", mostrando el poder de Prolog con un rompecabezas al estilo 'Layton'. El rompecabezas implica deducir la puntuación del cuarto estudiante en base a las puntuaciones de los tres primeros. Usando un código Prolog conciso (¡solo 15 líneas!), el autor resuelve elegantemente el problema, aprovechando la coincidencia de patrones y la bidireccionalidad de Prolog para encontrar todas las posibles claves de respuesta, determinando finalmente la puntuación del cuarto estudiante como 6. Se hace una comparación con una solución más larga y menos eficiente. Aunque el autor argumenta en contra del uso de rompecabezas para la enseñanza, este ejemplo demuestra el potencial de aplicación práctica de Prolog.

text-wrap: pretty en Safari: Una Nueva Era en la Tipografía Web

2025-04-08
text-wrap: pretty en Safari: Una Nueva Era en la Tipografía Web

Safari Technology Preview 216 introduce `text-wrap: pretty`, revolucionando el diseño de texto en la web. Utilizando algoritmos basados en párrafos, aborda problemas tipográficos de larga data, como líneas finales excesivamente cortas, bordes irregulares y ríos tipográficos que distraen. A diferencia de los algoritmos tradicionales línea por línea, `pretty` evalúa todo el párrafo, optimizando el diseño para mejorar la legibilidad y la estética. Si bien Chrome y otros navegadores admiten `pretty`, la implementación de Safari es más completa, ajustando todo el párrafo en lugar de solo las últimas líneas. `text-wrap: balance` se centra en hacer que todas las líneas tengan aproximadamente la misma longitud, ideal para títulos y textos más cortos. Los desarrolladores deben elegir el valor `text-wrap` adecuado según sus necesidades y ser conscientes de las implicaciones de rendimiento.

Desarrollo tipografía web

Coroot: Observabilidad accionable sin cambios de código

2025-04-08
Coroot: Observabilidad accionable sin cambios de código

Coroot es una plataforma de observabilidad de código abierto que recopila automáticamente métricas, registros y rastreos sin necesidad de modificar el código, convirtiendo estos datos en información procesable. Aprovechando eBPF para la monitorización sin instrumentación, proporciona un mapa de servicios, inspecciones predefinidas, resúmenes del estado de las aplicaciones, rastreo distribuido, análisis de registros y capacidades de creación de perfiles. Coroot identifica y resuelve problemas de aplicaciones rápidamente, se integra con Kubernetes y las principales plataformas en la nube, y ofrece seguimiento de SLO y monitorización de costes para ayudar a los desarrolladores a optimizar el rendimiento de las aplicaciones y reducir los costes en la nube.

Desarrollo

Sculptor: Un entorno de agentes de codificación impulsado por IA para las mejores prácticas de ingeniería de software

2025-04-08
Sculptor: Un entorno de agentes de codificación impulsado por IA para las mejores prácticas de ingeniería de software

Sculptor es un entorno revolucionario de agentes de codificación que integra las mejores prácticas de ingeniería de software en tu flujo de trabajo. Ejecuta tu código en un entorno seguro (sandbox), permitiéndote probar de forma segura, resolver problemas en paralelo y asignar tareas a agentes. Sculptor te ayuda a corregir errores, escribir pruebas, agregar nuevas funciones, mejorar la documentación, corregir problemas de estilo y mejorar tu código, independientemente de si fue escrito por un humano o un LLM. Actualmente en una vista previa de investigación temprana, Sculptor invita a los probadores a experimentar su poder y recibir regalos de Imbue.

Desarrollo

HNSW: Un Mundo Pequeño Navegable Jerárquico para la Búsqueda Eficiente de Vecinos Más Cercanos

2025-04-08
HNSW: Un Mundo Pequeño Navegable Jerárquico para la Búsqueda Eficiente de Vecinos Más Cercanos

HNSW es un algoritmo basado en un grafo de mundo pequeño navegable jerárquico para la búsqueda de vecinos más cercanos de incrustaciones vectoriales. Utiliza una estructura jerárquica para acelerar el proceso de búsqueda. El algoritmo construye estructuras de grafo dispersas y densas en diferentes niveles y busca de forma eficiente de arriba hacia abajo. El código es conciso, utilizando C++ moderno y Eigen para la aceleración SIMD, requiriendo solo alrededor de 500 líneas de código.

Árboles ternarios enraizados no ordenados: Una aventura combinatoria con Sage

2025-04-08
Árboles ternarios enraizados no ordenados: Una aventura combinatoria con Sage

Esta publicación de blog aborda el desafiante problema de contar árboles ternarios enraizados no ordenados utilizando combinatoria analítica, específicamente el método de Flajolet-Sedgewick. El autor primero resuelve el caso más simple de árboles ordenados, derivando una aproximación asintótica mediante funciones generadoras y análisis de singularidades, todo implementado y verificado en Sage. El caso no ordenado más complejo se aborda entonces utilizando el conteo de Pólya-Redfield, lo que lleva a una solución numérica y fórmula asintótica, nuevamente validada con Sage. La publicación proporciona una explicación clara y atractiva de conceptos de análisis complejo, como las series de Puiseux, y ofrece código Sage listo para usar, convirtiéndolo en un recurso valioso para aquellos interesados en la intersección de algoritmos y matemáticas.

Plugin LLM: Resume hilos de Hacker News con facilidad

2025-04-08
Plugin LLM: Resume hilos de Hacker News con facilidad

Un nuevo plugin LLM, `llm-hacker-news`, te permite resumir fácilmente hilos de conversación de Hacker News. Simplemente instala el plugin y usa el comando `llm -f hn:ID 'tu instrucción'` (por ejemplo, `llm -f hn:43615912 'resumen con citas directas ilustrativas'`) para obtener un resumen del hilo con el ID especificado (que se encuentra en la URL del hilo). Las instrucciones de instalación y configuración local se proporcionan en el README.

Desarrollo

Menos htmx, más HTML: Construyendo mejores sitios web

2025-04-08

Este artículo comparte la experiencia de dos años del autor construyendo servicios web con htmx, argumentando a favor de un enfoque minimalista: priorizar el HTML simple en lugar de depender en gran medida de las mejoras de htmx como `hx-boost`. Si bien `hx-boost` ofrece actualizaciones de página fluidas, introduce problemas como conflictos con el botón Atrás del navegador e interrupciones en otras bibliotecas. El autor aboga por el uso de enlaces y formularios HTML estándar, aprovechando los mecanismos de caché del navegador (ETags y encabezados Cache-Control) para actualizaciones eficientes y una experiencia de usuario superior. Los navegadores modernos ya poseen excelentes capacidades de optimización de rendimiento, eliminando la necesidad de depender demasiado de los frameworks de JavaScript para imitar las SPA. Solo cuando se requiere un estado de página persistente (como un reproductor de música), se deben considerar funciones avanzadas como `hx-boost`. En última instancia, el autor defiende la simplicidad y confiabilidad del HTML y HTTP para construir sitios web más fáciles de mantener y amigables para el usuario.

Desarrollo

Paradigm: Contratando Ingenieros Fundadores para un Espacio de Trabajo Nativo de IA

2025-04-08
Paradigm: Contratando Ingenieros Fundadores para un Espacio de Trabajo Nativo de IA

Paradigm, una startup de espacio de trabajo nativo de IA con sede en San Francisco y respaldada por Y Combinator y destacados fundadores de tecnología, busca ingenieros fundadores generalistas experimentados. Los candidatos ideales poseen experiencia en la construcción de aplicaciones de IA de producción, prosperan en entornos de ritmo rápido e idealmente tienen experiencia con GoLang, TypeScript y tecnologías relacionadas. Se ofrecen salarios y beneficios competitivos, incluida la participación en acciones.

La sobrecarga multijugador de Unreal Engine: una sorpresa de optimización de memoria

2025-04-08
La sobrecarga multijugador de Unreal Engine: una sorpresa de optimización de memoria

Un desarrollador de Unreal Engine, al usar un visualizador de diseño de memoria, descubrió inesperadamente que ciertas estructuras de datos agregadas para el soporte multijugador en Unreal Engine son redundantes en juegos para un solo jugador. Estas estructuras consumen una cantidad significativa de memoria; por ejemplo, structs personalizadas utilizadas para replicar los adjuntos de componentes y el movimiento del actor ocupan 120 y 216 bytes, respectivamente. Al comentar estas variables no utilizadas y el código relacionado en el modo para un solo jugador, se obtuvo un ahorro de memoria de aproximadamente 392 bytes por actor. Si bien no es significativo para la mayoría de los proyectos, esta optimización podría generar un ahorro considerable (potencialmente hasta 100 MB) para proyectos con una gran cantidad de actores (por ejemplo, más de 100.000).

Palabra clave `shell` de GitHub Actions: Flexibilidad inesperada e implicaciones de seguridad

2025-04-08

La palabra clave `shell` en GitHub Actions permite especificar el shell para un bloque de ejecución determinado. Sin embargo, esto es mucho más flexible de lo que sugiere la documentación. Admite no solo shells predefinidos como bash y pwsh, sino cualquier ejecutable en el `$PATH` del sistema. Esto significa que puede ejecutar código C usando un compilador C, o incluso modificar dinámicamente `$GITHUB_PATH` para cambiar el comportamiento del shell. Si bien esto ofrece flexibilidad, también introduce riesgos de seguridad, ya que las escrituras de archivos pueden implicar ejecución. Esto contrasta con la práctica inesperada de GitHub de realizar búsquedas en `$PATH` incluso para sus valores de shell "conocidos".

Desarrollo

¿Son las FreeBSD Jails contenedores? Un debate sobre definiciones

2025-04-08
¿Son las FreeBSD Jails contenedores? Un debate sobre definiciones

Este artículo explora el debate sobre si las FreeBSD Jails son contenedores. Los proponentes argumentan que las Jails preceden a Docker y Podman, y son consideradas contenedores por desarrolladores de FreeBSD como Allan Jude. Argumentan que limitar la definición de 'contenedor' al ecosistema Docker/Podman de Linux ignora la virtualización a nivel de sistema operativo de larga data en BSD. Los oponentes argumentan que las Jails carecen de características de contenedores OCI, como la abstracción de imagen y los modelos de implementación, y llamarlas contenedores lleva a engaño a los usuarios y perjudica la adopción de FreeBSD. El problema central es una divergencia en la comprensión de 'contenedor': como un término amplio para la virtualización a nivel de sistema operativo o específicamente como tecnología que se adhiere a los estándares OCI.

Desarrollo

Más Allá del Autocompletado: Cómo Hacer que la IA Entienda Realmente Tu Base de Código

2025-04-08

El autor expresa frustración con los asistentes de codificación de IA actuales, destacando su incapacidad para comprender realmente las bases de código como sistemas interconectados. Estas herramientas suelen cometer errores repetitivos y carecen de un modelo mental completo del proyecto. Para abordar esto, el autor desarrolló la "Sumarización Recursiva Clasificada Prismática" (PRRS), un algoritmo que trata la base de código como un grafo de conocimiento jerárquico, analizando el código a través de múltiples "lentes" (por ejemplo, arquitectura, flujo de datos, seguridad) para comprender la importancia. Este enfoque mejora significativamente la precisión y la eficiencia de la generación de código de IA, resolviendo problemas como la ubicación de archivos, el cumplimiento de patrones y la reutilización de código. El autor argumenta que el futuro de la generación de código de IA reside en una comprensión más profunda de la base de código, yendo más allá de la simple predicción de tokens.

(nmn.gl)

Tailwind CSS 4 y la Trampa del FOMO: Una Advertencia para Desarrolladores

2025-04-07

Este artículo relata la frustrante experiencia del autor con Tailwind CSS 4, que depende de Bun.js y falló en su antiguo Mac Pro debido a la falta de instrucciones AVX2. Depurar este problema le llevó varios días, obligándolo a comprar un nuevo equipo y abandonar Tailwind CSS 4. El autor reflexiona sobre el 'miedo a perderse algo' (FOMO) en la industria tecnológica y los peligros de perseguir ciegamente nuevas tecnologías. La experiencia subraya la importancia de una cuidadosa selección de tecnologías, priorizando las necesidades personales y las realidades del proyecto, en lugar de dejarse llevar por las tendencias.

Desarrollo

arXivLabs: Proyectos experimentales con colaboración comunitaria

2025-04-07
arXivLabs: Proyectos experimentales con colaboración comunitaria

arXivLabs es un marco que permite a los colaboradores desarrollar y compartir nuevas funciones de arXiv directamente en nuestro sitio web. Tanto las personas como las organizaciones que trabajan con arXivLabs han adoptado y aceptado nuestros valores de apertura, comunidad, excelencia y privacidad de datos de usuario. arXiv está comprometido con estos valores y solo trabaja con socios que los respetan. ¿Tiene una idea para un proyecto que agregará valor a la comunidad de arXiv? Obtenga más información sobre arXivLabs.

Desarrollo

Servidor MCP ligero: Datos meteorológicos en tiempo real para Claude

2025-04-07
Servidor MCP ligero: Datos meteorológicos en tiempo real para Claude

Este proyecto crea un servidor ligero de Protocolo de Contexto de Modelo (MCP) que permite a asistentes de IA como Claude acceder e interpretar datos meteorológicos en tiempo real. Los usuarios simplemente agregan el servidor a su configuración de Claude, compilan el binario usando `go build`, configuran una clave API meteorológica y pueden consultar información meteorológica para ciudades específicas dentro de Claude. El proyecto presenta un diseño modular que abarca el manejo del servidor, la lógica de negocios, servicios simulados para pruebas y plantillas de vista, y está licenciado bajo la Licencia MIT.

Ingenieros de software ofrecen recompensa de $10.000 por puesto de seis cifras

2025-04-07
Ingenieros de software ofrecen recompensa de $10.000 por puesto de seis cifras

Ante un mercado laboral competitivo, los ingenieros de software Argenis De La Rosa y Ryan Prescott adoptaron un enfoque poco convencional. Ofrecieron una recompensa de $10.000 a cualquiera que pudiera conseguirles un puesto de desarrollador de software de seis cifras. La publicación en LinkedIn se volvió viral, generando numerosas respuestas, incluida ayuda no solicitada. Esta estrategia audaz no solo les aseguró varias entrevistas, sino que también destaca la necesidad de una búsqueda de empleo creativa en el desafiante panorama tecnológico actual.

Árboles de componentes de React como máquinas de estado: Comprensión de las actualizaciones asíncronas y las características concurrentes

2025-04-07
Árboles de componentes de React como máquinas de estado: Comprensión de las actualizaciones asíncronas y las características concurrentes

Este artículo explica cómo modelar un árbol de componentes de React como una máquina de estado, lo que ayuda a aclarar las implicaciones de las actualizaciones asíncronas y las características concurrentes de React. Una aplicación de React puede verse como un modelo de máquina de estado donde la IU es una función del estado: IU = f(estado). Sin embargo, las actualizaciones asíncronas rompen esta garantía síncrona, lo que lleva a posibles actualizaciones inválidas por parte de los usuarios. El artículo sugiere el uso de actualizaciones optimistas o estados intermedios (pendientes) para solucionar esto, y enfatiza que las características concurrentes de React (como startTransition) también necesitan un manejo síncrono similar para evitar acciones inválidas.

20º Aniversario de Git: De Humildes Comienzos al Dominio del Control de Versiones

2025-04-07
20º Aniversario de Git: De Humildes Comienzos al Dominio del Control de Versiones

Hace veinte años, Linus Torvalds realizó el primer commit en Git. Desde entonces, se ha convertido en el sistema de control de versiones dominante. Este artículo relata la historia temprana de Git, desde sus orígenes como una herramienta para abordar los desafíos de control de versiones y colaboración en la comunidad del kernel de Linux, hasta su evolución en el poderoso sistema que conocemos hoy. El autor Scott Chacon comparte su viaje personal con Git, explicando cómo se transformó de un simple rastreador de contenido "estúpido" en un VCS con muchas funciones que remodeló el desarrollo de software. La historia también profundiza en los orígenes de algunos comandos principales de Git y en el nacimiento del icónico Octocat de GitHub.

Desarrollo

Lux: ¡Un gestor de paquetes moderno para Lua, por fin!

2025-04-07

Lux es un nuevo gestor de paquetes para Lua diseñado para abordar las deficiencias de Luarocks, ofreciendo una experiencia moderna e intuitiva. Cuenta con una CLI sencilla, un sólido soporte para archivos lock, compilaciones paralelas e integración perfecta con Neovim y Nix. Lux utiliza la configuración TOML, impone SemVer y mantiene la compatibilidad con el ecosistema luarocks existente. Promete mejoras significativas en la velocidad de compilación, la gestión de dependencias y la reproducibilidad para proyectos Lua, beneficiando especialmente a los desarrolladores de plugins de Neovim con un aumento de velocidad y estabilidad.

Desarrollo

Kahuna: Tu gestor de bases de datos IndexedDB

2025-04-07
Kahuna: Tu gestor de bases de datos IndexedDB

Kahuna es una extensión de navegador para Firefox y navegadores basados en Chromium que simplifica la gestión de bases de datos IndexedDB. Te permite crear, modificar, ver, consultar, editar, importar y exportar datos IndexedDB. Incluye funciones como filtrado de datos, paginación, ejecución de código JavaScript e importación/exportación en varios formatos (Dexie, JSON, CSV). Aunque la documentación está en progreso, Kahuna es una herramienta poderosa para desarrolladores que trabajan con IndexedDB.

Desarrollo

Browser MCP: Automatización de navegador local

2025-04-07

Browser MCP es una herramienta de automatización de navegador local que prioriza la velocidad, la seguridad y la comodidad. La automatización se realiza localmente, lo que resulta en un mejor rendimiento sin latencia de red y mantiene su actividad de navegación privada: no se envían datos a servidores remotos. Utiliza su perfil de navegador existente, manteniendo su estado de inicio de sesión en todos los servicios, y evita la detección de bots y CAPTCHAs utilizando su verdadera huella digital del navegador.

Desarrollo

OpenPrompt: Integración fluida de código en LLMs

2025-04-07
OpenPrompt: Integración fluida de código en LLMs

OpenPrompt simplifica el proceso de alimentar código en modelos de lenguaje grandes como Claude, GPT-4 y Grok. Esta herramienta serializa rápidamente archivos y carpetas en XML, facilitando la carga de tu base de código. Disponible para Windows, macOS y Linux (con ejecutables proporcionados), OpenPrompt te permite seleccionar directorios, filtrar archivos, añadir instrucciones y generar un prompt XML listo para pegar en tu LLM elegido. Los casos de uso incluyen revisiones de código, generación de documentación, asistencia de refactorización, búsqueda de errores, aprendizaje de nuevas bases de código y análisis arquitectural.

Recreando sonidos de Game Boy con la Web Audio API: Serie de Fourier vs. Wave Shaper

2025-04-07

Al crear un rastreador de música al estilo Game Boy basado en la web, el autor se encontró con el desafío de recrear fielmente los icónicos sonidos de onda cuadrada del Game Boy. Los canales de pulso del Game Boy admitían ciclos de trabajo variables, pero el OscillatorNode de la Web Audio API solo proporciona una onda cuadrada con un ciclo de trabajo del 50%. El artículo explora dos soluciones: generar una forma de onda personalizada usando la serie de Fourier y dar forma a una onda de diente de sierra con un WaveShaperNode. El enfoque de la serie de Fourier ofrece mayor precisión, pero es computacionalmente costoso; el método WaveShaperNode es más simple, pero puede introducir algo de ruido. El autor prefiere el enfoque WaveShaperNode por su simplicidad y su capacidad para producir un sonido más auténtico del Game Boy.

Desarrollo Síntesis de Sonido

GitMCP: Acceso sencillo a la documentación de proyectos de GitHub con IA

2025-04-07
GitMCP: Acceso sencillo a la documentación de proyectos de GitHub con IA

GitMCP es un servicio gratuito y de código abierto que transforma sin problemas cualquier proyecto de GitHub en un punto final remoto del Protocolo de Contexto del Modelo (MCP), permitiendo que los asistentes de IA accedan y comprendan la documentación del proyecto sin esfuerzo. No se requiere configuración; GitMCP funciona de inmediato y es totalmente gratuito y privado, sin recopilar ninguna información de identificación personal o consultas. Los usuarios acceden a repositorios de GitHub o sitios de GitHub Pages mediante formatos de URL simples. Los asistentes de IA pueden acceder a la documentación del proyecto a través de GitMCP, utilizando la búsqueda semántica para optimizar el uso de tokens. GitMCP actúa como un puente entre la documentación del repositorio de GitHub y los asistentes de IA, implementando el MCP, garantizando una entrega eficiente y precisa de la información.

Ingeniería inversa de un procesador de texto hebreo-inglés de los años 90

2025-04-07
Ingeniería inversa de un procesador de texto hebreo-inglés de los años 90

Esta entrada de blog detalla el proceso de ingeniería inversa de QText, un procesador de texto hebreo-inglés de la era DOS escrito en Turbo Pascal de mediados de los años 90, para descifrar sus documentos bloqueados. Los autores, enfrentados a la contraseña perdida de un cliente, aprovecharon la simplicidad del algoritmo de cifrado – la clave estaba incrustada en el archivo – y emplearon enfoques de fuerza bruta e ingeniería inversa para reconstruir el algoritmo de derivación de claves. Consiguieron reconstruir el algoritmo y desarrollaron un script en Python para el descifrado automatizado. El caso de estudio ofrece información sobre la criptografía del desarrollo de software antiguo y las técnicas de ingeniería inversa, destacando la evolución de la seguridad de la información.

Desarrollo

Análisis de fechas en Excel: ¿Un error de 400 años?

2025-04-07
Análisis de fechas en Excel: ¿Un error de 400 años?

Al construir Quadratic, una hoja de cálculo de IA, el equipo descubrió peculiaridades extrañas en el análisis de fechas de Excel. Ingresar "1/2" y agregar 1 produce 45660; "10:75" se convierte en 0.46875. Esto se debe al sistema de fechas seriales de Excel, contando los días desde el 1 de enero de 1900. Sin embargo, inexactitudes históricas (considerar 1900 como un año bisiesto y el cambio al calendario gregoriano) crean discrepancias. Quadratic usa la biblioteca chrono de Rust, evitando estos problemas e integrándose perfectamente con Python, SQL y otras herramientas modernas. El equipo corrigió el error del año bisiesto de 1900, restaurando el equilibrio al universo.

Desarrollo Análisis de fechas

Curl Seguro: Creando Código C Confiable para Miles de Millones de Instalaciones

2025-04-07
Curl Seguro: Creando Código C Confiable para Miles de Millones de Instalaciones

El equipo de curl comparte sus prácticas para crear herramientas de transferencia de red seguras y confiables en C. Destacan la importancia de las pruebas exhaustivas, incluyendo el análisis estático y el fuzzing. Aproximadamente el 40% de sus vulnerabilidades de seguridad provienen de la falta de seguridad de memoria de C, pero las normas de codificación estrictas, la aplicación de estilos y la evitación de funciones riesgosas mantienen este número bajo. El estilo de codificación de curl enfatiza la legibilidad y el mantenimiento a través de límites de longitud de línea, nombres de variables cortos y compilaciones sin advertencias. El manejo robusto de errores, la estabilidad de la API y la gestión cuidadosa de la memoria son cruciales para la fiabilidad y la seguridad del software.

Desarrollo Seguridad C

¡Deja de perder el tiempo en trabajo improductivo!

2025-04-07

Muchos ingenieros se centran en trabajos no lucrativos, como mejoras de rendimiento y accesibilidad, solo para ser despedidos por no ser valorados. El artículo argumenta que las empresas de tecnología están impulsadas por el beneficio, y el valor de un ingeniero está directamente relacionado con la contribución de su trabajo a ese beneficio. El autor aconseja a los ingenieros que comprendan el modelo de negocio de sus empresas, conecten su trabajo con la rentabilidad y, así, aseguren su puesto. Incluso los trabajos aparentemente improductivos pueden generar valor a escala en grandes empresas.

← Previous 1 3 4 5 6 7 8 9 92 93