La configuración se queda corta
Considero legítima la necesidad si ya se ha explorado lo que trae la plataforma y falta algo concreto. Compruebo qué opciones se evaluaron y con qué resultado.
Moodle · Ingeniería
En muchos de los desarrollos que he revisado, el bloqueo no procedía de una mala implementación aislada, sino de depender de una parte de la plataforma que nunca había sido estable. He encontrado estas prácticas: llamar a funciones internas en lugar de usar las interfaces públicas, escribir directamente en tablas del núcleo, modificar ficheros de Moodle y resolver mediante código lo que ya resolvía la configuración. Respondo cuatro preguntas antes de escribir la primera línea: ¿puede resolverlo la configuración del núcleo?, ¿existe ya una extensión mantenida que lo haga?, ¿debe formar parte de Moodle o quedar fuera?, ¿merece la pena mantenerlo? En mi experiencia, con la última descarto muchas ideas antes de que generen trabajo de mantenimiento.
Diseño extensiones sobre interfaces públicas, sin modificar el núcleo ni escribir directamente en sus tablas. Respeto la estructura del tipo de extensión, declaro privacidad, copia y restauración, documento el código según el estándar y compruebo su comportamiento bajo carga y en las versiones objetivo disponibles.
Mi trayectoriaDistingo cuatro orígenes habituales. En dos de ellos, suelo concluir que lo correcto es no desarrollar nada.
Considero legítima la necesidad si ya se ha explorado lo que trae la plataforma y falta algo concreto. Compruebo qué opciones se evaluaron y con qué resultado.
Puede ser la solución o una dependencia sin mantenimiento que bloqueará la próxima actualización. Miro quién la mantiene y desde cuándo para decidir si la instalo.
A veces reviso el procedimiento: reproducir dentro de Moodle uno que existía en otro sitio genera desarrollos grandes que envejecen mal.
He visto escribir código solo porque era posible. Buena parte de ese código acaba sin uso, pero todos lo mantienen.
Cinco preguntas que respondo antes de aprobar un desarrollo.
Pido el nombre de quien lo ha comprobado y el detalle de lo que ha probado. Un «no se puede» dicho de memoria explica una parte importante del código innecesario que hay en producción.
Si nadie responde, doy el desarrollo por huérfano. Entonces decido si asumo el compromiso o busco otra vía.
Mantengo dentro de Moodle lo relacionado con cursos, actividades y evaluación. Dejo fuera los procesos corporativos y los comunico mediante interfaces, porque así suelen envejecer mejor.
Comparo los costes fijos de actualización, pruebas y soporte de una funcionalidad de poco uso con su criticidad y su alcance antes de construirla.
Si la respuesta depende de que una persona recuerde algo, descarto el diseño. Compruebo que la actualización siga el procedimiento normal.
Compruebo cinco condiciones. Cumplirlas no garantiza que la actualización sea gratis, pero me permite tratarla como una revisión en vez de como un proyecto.
Uso en el código externo las interfaces que documenta la plataforma. Sé que todo lo demás puede cambiar sin previo aviso entre versiones, y cambia. Esa diferencia determina si adapto una extensión o la reescribo.
Respeto el lugar, los ficheros esperados y el ciclo de vida de cada tipo de extensión. Esa estructura permite que la plataforma instale, actualice y desinstale la extensión sin intervención manual.
Compruebo si la extensión trata datos personales. Si los trata, reviso que declare su tratamiento en la Privacy API; si no, que implemente el proveedor nulo previsto por Moodle. Si almacena datos ligados a cursos o actividades, verifico su integración en las API de copia y restauración correspondientes a su tipo. También compruebo que la implementación coincida con el tratamiento y los datos reales.
Sigo la guía oficial, que fija la nomenclatura, la indentación, la documentación y las prácticas prohibidas. No la sigo por estética, sino para que otra persona entienda el código dentro de tres años sin hacer arqueología.
Busco consultas dentro de bucles, índices ausentes y trabajo pesado dentro de la petición, porque con diez usuarios pasan inadvertidos. Aparecen el día del examen, cuando la extensión ya está en producción.
Seis defectos que encuentro una y otra vez revisando desarrollos de terceros.
Una extensión funciona hasta que la plataforma cambia algo por dentro. Identifico las llamadas a funciones internas no públicas como una causa frecuente de que deje de funcionar en una versión nueva.
Compruebo que las herramientas de privacidad no ven los datos personales que guarda la extensión. Por eso, una solicitud de supresión deja esos datos sin borrar.
Pruebo la restauración del curso para detectar si la funcionalidad aparece vacía. Sin esa comprobación, el fallo no se descubre hasta la edición siguiente, cuando ya nadie recuerda que la extensión era la responsable.
Compruebo de forma explícita el contexto y la capacidad en cada punto de entrada. No doy por hecho que quien llega a la página tenga permiso para acceder a ella.
En pruebas no lo veo; con volumen, hunde el rendimiento. Es el patrón que más veces he encontrado detrás de una degradación sin causa aparente.
Sin pruebas automatizadas, compruebo todo a mano después de cada actualización. Adaptar una extensión puede costar casi tanto como reescribir partes relevantes.
Aplico estas diez comprobaciones tanto al desarrollo propio como a lo que entrega un proveedor.
Aplico un criterio más estricto a medida que crece lo construido.
Ajusto las pruebas al impacto de la extensión, a los datos que trata y a los privilegios con los que opera, aunque sea la única del sitio. Las interfaces públicas reducen el riesgo de compatibilidad, pero no lo eliminan.
Mantengo un inventario, aplico un criterio común de revisión y automatizo al menos las pruebas de la lógica propia. Así evito que las actualizaciones sean impredecibles.
Defino reglas por escrito, analizo automáticamente cada cambio, reviso con criterios explícitos y despliego de forma reproducible. Con desarrollo continuo y un equipo, el liderazgo técnico es imprescindible.
Fijo los criterios de aceptación en el contrato y los compruebo antes de aceptar la entrega. Si los reviso después de aceptar y pagar, tengo mucho menos margen para exigir las correcciones previstas en el contrato.
En cinco filas, muestro qué separa un desarrollo mantenible de otro que solo funciona.
| Requisito | Evidencia exigible | Criterio de aceptación |
|---|---|---|
| Usar exclusivamente interfaces públicas | Revisar el código y analizar las llamadas | No usar funciones internas ni escribir directamente en las tablas del núcleo |
| Sin modificaciones del núcleo | Comprobación de integridad frente al núcleo oficial | Ninguna diferencia respecto a la versión publicada |
| Declaración de privacidad completa | Implementación de la interfaz de privacidad | La exportación incluye los datos de la extensión y el borrado los elimina |
| Compatibilidad con la copia y la restauración | Prueba de copia y restauración de un curso que use la extensión | El curso restaurado conserva los datos de la extensión |
| Estándar de código y pruebas | Ejecución del análisis estático y de las pruebas automatizadas | Sin incidencias bloqueantes y con todas las pruebas superadas |
Los tres funcionan hoy. He visto plataformas imposibles de actualizar por culpa de estos tres atajos.
Modificar un fichero de Moodle resuelve el problema en minutos. Después, reconciliamos el cambio y repetimos la validación en cada actualización. Según el procedimiento de actualización, el cambio puede quedar sobrescrito o producir conflictos. Si se va la única persona que conoce la modificación, perdemos ese conocimiento.
Uso las interfaces para insertar o modificar registros. Si me las salto y trabajo a mano, dejo el sistema en estados que la plataforma no espera: cachés desincronizadas, eventos que no se lanzan y datos que no cuadran.
Heredo su forma de hacer las cosas, incluidas las llamadas a funciones que ya estaban señaladas como obsoletas. El desarrollo arrastra deuda desde el primer día.
Referencias
Nomenclatura, estructura de ficheros, documentación obligatoria y funciones prohibidas. Consultado el 1 de agosto de 2026.
Estructura esperada y ciclo de vida de cada tipo de extensión. Consultado el 1 de agosto de 2026.
Cómo declara una extensión los datos personales que almacena. Consultado el 1 de agosto de 2026.
El orden de las cuatro alternativas antes de desarrollar es criterio propio, no una recomendación oficial, aunque se apoya en el modelo de extensiones que documenta la plataforma. Los requisitos técnicos concretos cambian entre versiones y hay que comprobarlos siempre en la documentación para desarrolladores enlazada. Lo que cuenta como interfaz pública también evoluciona: algo estable hoy puede quedar marcado como obsoleto mañana, y por eso conviene revisar las notas de cada versión.
Blog
En el blog desarrollo casos particulares, pruebas y fuentes que amplían esta página de referencia.
Ir a blog.albertolarah.comContacto
Empiezo por la necesidad que hay que resolver, por lo que ya se ha intentado mediante la configuración, por cuánta gente lo usaría y por quién lo mantendría después. Muchas veces esa conversación termina en que no hace falta construir nada.
hola@albertolarah.comLinkedIn ↗