Resol tots els exercicis. Justifica decisions tècniques, indica supòsits i valida resultats.
Es valorarà la correcció, l'eficiència, la seguretat i la claredat expositiva.
12.5 punts
Modelatge relacional d'una acadèmia· Disseny de base de dades
Una acadèmia prepara opositors de diferents especialitats. Es demana:
a) Dissenyar un model relacional (taules, PK/FK) per gestionar alumnat, cursos,
matrícules, simulacres i resultats. (1,25)
b) Escriure una consulta SQL que retorni els 10 alumnes amb millor mitjana
dels últims 30 dies, incloent especialitat i nombre de simulacres fets. (0,75)
c) Proposar 3 índexs i justificar-los. (0,5)
Solució
Esquema mínim:
- students(id PK, name, email UNIQUE, specialty_code, created_at)
- courses(id PK, specialty_code, title, level)
- enrollments(id PK, student_id FK, course_id FK, enrolled_at, status)
- mock_exams(id PK, course_id FK, title, published_at)
- mock_results(id PK, mock_exam_id FK, student_id FK, score NUMERIC(5,2), submitted_at)
Restriccions:
- UNIQUE(mock_exam_id, student_id) a mock_results
- CHECK(score BETWEEN 0 AND 10)
SQL (exemple):
SELECT
s.id,
s.name,
s.specialty_code,
ROUND(AVG(r.score),2) AS avg_score,
COUNT(*) AS mocks_done
FROM students s
JOIN mock_results r ON r.student_id = s.id
WHERE r.submitted_at >= NOW() - INTERVAL '30 days'
GROUP BY s.id, s.name, s.specialty_code
HAVING COUNT(*) >= 2
ORDER BY avg_score DESC, mocks_done DESC
LIMIT 10;
Índexs recomanats:
1) mock_results(student_id, submitted_at DESC)
2) mock_results(mock_exam_id, student_id) UNIQUE
3) students(specialty_code)
Rúbrica de correcció
- Model relacional coherent i normalitzat: 1,25 pts
- Consulta SQL correcta i optimitzada: 0,75 pts
- Índexs justificats: 0,5 pts
22.5 punts
Anàlisi de complexitat i optimització· Algorísmia
Es dona una funció que rep una llista d'intents i retorna el millor intent per alumne:
for i in range(n):
for j in range(n):
if attempts[i].student_id == attempts[j].student_id:
best = max(best, attempts[j].score)
a) Calcula la complexitat temporal i espacial. (0,75)
b) Proposa una solució O(n) amb taula hash i pseudocodi. (1,0)
c) Explica com validaries el codi amb tests de caixa negra i blanca. (0,75)
Solució
a) L'algorisme original és O(n²) en temps i O(1) espai extra (ignorant sortida).
b) Solució O(n):
best_by_student = {}
for attempt in attempts:
sid = attempt.student_id
if sid not in best_by_student or attempt.score > best_by_student[sid]:
best_by_student[sid] = attempt.score
Temps O(n), espai O(k) (k = nombre d'alumnes únics).
c) Tests:
- Caixa negra: casos normals, llista buida, empats, valors límit (0 i 10), duplicats.
- Caixa blanca: cobertura de branques (alta/baixa score), mutació de condicions,
i proves de regressió per evitar trencaments en refactors.
Rúbrica de correcció
- Complexitat correcta: 0,75 pts
- Pseudocodi O(n) vàlid: 1,0 pts
- Estratègia de proves completa: 0,75 pts
32.5 punts
Arquitectura segura per a plataforma educativa· Xarxes i seguretat
Dissenya una arquitectura per una aplicació web d'oposicions amb:
- Frontend, API, base de dades, emmagatzematge d'àudio
- Autenticació d'usuaris i rols (admin, professor, alumne)
a) Proposa diagrama lògic i controls de seguretat principals. (1,0)
b) Explica com mitigaries SQLi, XSS, CSRF i brute force. (1,0)
c) Defineix una política bàsica de backups i recuperació (RPO/RTO). (0,5)
Solució
a) Arquitectura: CDN/WAF -> Frontend -> API Gateway -> serveis backend -> PostgreSQL + object storage.
Secrets en gestor segur, TLS obligatori, logs centralitzats.
b) Mitigacions:
- SQLi: consultes parametritzades + ORM + mínim privilegi DB
- XSS: escapament output + CSP + sanitització input ric
- CSRF: tokens anti-CSRF + SameSite cookies
- Brute force: rate limiting, lockout progressiu, MFA opcional
c) Backups:
- Snapshots DB cada 6h + WAL continu
- Object storage versionat diari
- RPO: 1h, RTO: 4h
- Test de restauració mensual
Rúbrica de correcció
- Arquitectura clara i justificable: 1,0 pt
- Mesures de seguretat concretes: 1,0 pt
- DRP viable amb RPO/RTO: 0,5 pts
42.5 punts
Pla de desenvolupament i qualitat· Enginyeria del programari
En un equip petit que construeix un mòdul de simulacres IA:
a) Defineix backlog inicial de 6 user stories prioritzades. (0,75)
b) Proposa pipeline CI/CD amb portes de qualitat. (1,0)
c) Indica 5 mètriques de producte/enginyeria i com actuar davant desviacions. (0,75)
Solució
a) Stories prioritzades (resum):
1) Com alumne, vull fer un simulacre cronometrat.
2) Com alumne, vull feedback automàtic per pregunta.
3) Com professor, vull veure errors recurrents per tema.
4) Com admin, vull configurar pesos de dificultat.
5) Com alumne, vull reprendre simulacres interromputs.
6) Com alumne, vull historial i recomanacions.
b) CI/CD:
- PR checks: lint + tests unitaris + cobertura mínima 80%
- SAST i dependabot
- Build immutable artifact
- Deploy staging automàtic, prod amb aprovació
- Smoke tests postdeploy i rollback automàtic si falla
c) Mètriques:
- Lead time
- Change failure rate
- P95 latència API
- Conversió trial->pagament
- Retenció setmanal
Acció: alertes per llindar, anàlisi causa arrel i pla correctiu en 24h.
Rúbrica de correcció
- Backlog ben prioritzat: 0,75 pts
- Pipeline CI/CD realista: 1,0 pt
- Mètriques accionables: 0,75 pts