Gairebé tothom ha fet servir un programa avui: una alarma que sona, un missatge que arriba, un rebut que es calcula sol. Molt poca gent, en canvi, ha vist de prop què és exactament un programa i per què una màquina que no entén res és capaç de fer alguna cosa útil. Aquesta lliçó respon a aquesta pregunta des del principi, sense donar per suposat cap coneixement previ. En acabar-la sabràs què és una instrucció, quina diferència hi ha entre el codi que escriu una persona i el que executa el processador, i per què existeixen els compiladors i els intèrprets.
És la lliçó més important del curs, tot i que sembli la més senzilla. Programar no consisteix a memoritzar paraules estranyes: consisteix a traduir una intenció humana a instruccions inequívoques. Si aquesta idea queda ben assentada, tota la resta —variables, bucles, funcions, objectes— són detalls de forma. Si no queda assentada, la resta del curs es converteix en copiar símbols sense entendre'ls.
A més, aquí coneixeràs el cas que ens acompanyarà de principi a fi: Estudi Alba i el seu gestor de tasques TascaFàcil. Tot el que aprenguem ho aplicarem a aquest projecte, mòdul a mòdul, fins a tenir un programa complet.
Contingut
- Programar és traduir una intenció a instruccions
- Instrucció, programa i codi font
- Maquinari i programari en una frase
- Del codi font a l'execució: codi màquina
- Compilador contra intèrpret
- Per a què serveix programar: automatització, resolució de problemes i escala
- El cas del curs: Estudi Alba i el seu problema
- Què hauria de fer TascaFàcil
- Primer contacte amb Python: la salutació del programa
- Errors comuns i consells
- Exercicis
- Conclusió
- Programar és traduir una intenció a instruccions
Imagina't que demanes a un company de feina: «prepara la sala per a la reunió». Ho entendrà. Sap què és una sala, què significa preparar i deduirà el que falta: cadires, projector, aigua. Ha omplert pel seu compte un munt de buits que tu no has explicat.
Un ordinador no omple buits. Un ordinador fa exactament el que se li diu, en l'ordre en què se li diu, sense interpretar la intenció. Si li demanes que prepari la sala, no farà res: no sap què és preparar. Cal dir-li-ho així:
- Compta quantes persones vénen.
- Col·loca aquest nombre de cadires al voltant de la taula.
- Si hi ha presentació, encén el projector.
- Posa una ampolla d'aigua per cada dues persones.
Això, i cap altra cosa, és programar: descompondre una intenció humana en passos tan precisos que una màquina que no entén res els pugui executar i produir el resultat esperat.
D'aquesta definició en surten les dues habilitats reals de l'ofici:
- Pensar amb precisió: detectar els buits que un humà ompliria tot sol i tapar-los. Què passa si no ve ningú? I si en vénen trenta i només hi ha deu cadires?
- Expressar aquest pensament en un llenguatge que la màquina accepti. Aquesta part és la més visible —és «escriure codi»— però és la menys difícil de les dues.
Molta gent creu que no pot programar perquè no se li dóna bé la part tècnica. Gairebé sempre passa el contrari: la sintaxi s'aprèn en setmanes, i el que costa anys d'afinar és la precisió en pensar.
L'ordinador no és llest, és ràpid i obedient
Convé desmuntar com abans millor la idea que l'ordinador «sap». No sap res. Les seves dues virtuts són:
- Velocitat: executa milers de milions d'operacions elementals per segon.
- Obediència literal: repeteix la mateixa instrucció un milió de vegades sense cansar-se, sense distreure's i sense corregir-te.
Aquesta obediència literal és una arma de doble tall. Si la teva instrucció és correcta, l'executarà perfectament un milió de vegades. Si és incorrecta, s'equivocarà perfectament un milió de vegades.
- Instrucció, programa i codi font
Fixem tres termes que farem servir durant tot el curs.
- Una instrucció és una ordre elemental que la màquina pot executar: sumar dos nombres, desar un valor, mostrar un text per pantalla, comparar dues quantitats.
- Un programa és un conjunt ordenat d'instruccions que, executades, resolen una tasca concreta.
- El codi font és el text que escriu la persona programadora, en un llenguatge de programació, i que expressa aquest programa de manera llegible per a humans.
| Terme | Què és | Qui el llegeix | Exemple |
|---|---|---|---|
| Instrucció | Una ordre elemental | La màquina | «Mostra el text Hola» |
| Programa | Conjunt ordenat d'instruccions | La màquina, en executar-lo | Un gestor de tasques complet |
| Codi font | Text del programa en un llenguatge | Les persones | Un fitxer tascafacil.py |
| Codi màquina | Instruccions en binari | El processador | 10110000 01100001 |
El codi font es desa en fitxers de text normal i corrent. Un fitxer de Python és un fitxer de text amb extensió .py: es pot obrir amb qualsevol editor i llegir-lo. No té res de màgic a dins.
- Maquinari i programari en una frase
Per al que necessitem ara n'hi ha prou amb una distinció molt curta:
- El maquinari (hardware) és la part física: processador, memòria, disc, pantalla, teclat.
- El programari (software) és el conjunt d'instruccions que diuen al maquinari què ha de fer.
El maquinari sense programari és un objecte car que s'escalfa. El programari sense maquinari és un text. Programar consisteix a escriure programari; el maquinari el posa l'ordinador.
- Del codi font a l'execució: codi màquina
Aquí apareix la primera peça que sorprèn qui comença. El processador no entén Python. Tampoc no entén Java, ni C, ni cap llenguatge pensat per a humans. El processador només entén codi màquina: seqüències de nombres binaris (uns i zeros) que representen operacions molt elementals.
Un fragment de codi màquina, escrit tal qual, té aquest aspecte:
Ningú no escriu programari modern així, per raons evidents: és il·legible, específic de cada model de processador i pràcticament impossible de corregir. Per això es van inventar els llenguatges de programació d'alt nivell, que permeten escriure això:
...i deixar que un altre programa s'encarregui de convertir-ho en les seqüències binàries corresponents. Aquest «altre programa» és un traductor, i n'hi ha dues famílies: els compiladors i els intèrprets.
- Compilador contra intèrpret
Tots dos resolen el mateix problema —passar del codi font a alguna cosa que el processador executi— però amb estratègies diferents.
- Un compilador tradueix tot el codi font d'una sola vegada, abans d'executar-lo, i produeix un fitxer executable en codi màquina. Després aquest executable es llança quan es vulgui, sense tornar a traduir. És el model de C o de Rust.
- Un intèrpret llegeix el codi font i el va executant sobre la marxa, instrucció a instrucció, sense generar un executable independent. És el model de Python.
Aquest és el recorregut de tots dos casos:
flowchart TD
A["Codi font<br/>(escrit per una persona)"] --> B{"Com es tradueix?"}
B -->|Compilacio| C["Compilador<br/>tradueix tot d'una vegada"]
C --> D["Fitxer executable<br/>en codi maquina"]
D --> E["El processador executa"]
B -->|Interpretacio| F["Interpret<br/>llegeix i executa linia a linia"]
F --> E
E --> G["Resultat per pantalla"]
Les conseqüències pràctiques per a qui aprèn són aquestes:
| Aspecte | Compilat | Interpretat |
|---|---|---|
| Quan es tradueix | Abans d'executar, una sola vegada | Durant l'execució, cada vegada |
| Què es distribueix | Un executable | El codi font + l'intèrpret |
| Velocitat d'execució | Generalment més gran | Generalment més petita |
| Rapidesa per provar un canvi | Cal recompilar | S'executa directament |
| Detecció de certs errors | Abans d'executar | En arribar a la línia fallida |
Per aprendre, un llenguatge interpretat és còmode: escrius una línia, l'executes i veus el resultat en dos segons. Aquest cicle curt és or quan estàs començant, i és una de les raons per les quals aquest curs fa servir Python. La comparació completa entre llenguatges, amb les seves màquines virtuals i els seus casos intermedis, la veurem a la lliçó Llenguatges de programació.
- Per a què serveix programar: automatització, resolució de problemes i escala
Hi ha tres motius pels quals a una organització li compensa que algú programi.
Automatització. Qualsevol tasca repetitiva i amb regles clares pot passar de fer-se a mà a fer-se sola. Reanomenar 400 fitxers, enviar el mateix avís a 50 clients, comprovar cada matí si un servidor respon. L'ordinador no s'avorreix i no es salta el fitxer 217.
Resolució de problemes. Programar obliga a definir el problema amb precisió, i moltes vegades aquesta definició ja és mitja solució. En escriure el programa descobreixes regles que ningú no havia explicitat: què passa si dues tasques tenen la mateixa prioritat? Pot una tasca no tenir responsable? Aquestes preguntes milloren el procés encara que el programa no s'arribi a escriure.
Escala. Un procediment manual que funciona amb 10 elements se sol trencar amb 10.000. Un programa correcte tracta 10.000 elements amb el mateix esforç humà que 10: el cost és a escriure'l una vegada, no a executar-lo moltes.
| Sense programa | Amb programa |
|---|---|
| L'esforç creix amb el volum | L'esforç es paga una vegada, en escriure'l |
| Errors humans aleatoris i difícils de rastrejar | Errors sistemàtics, reproduïbles i corregibles |
| El coneixement viu al cap d'una persona | El coneixement queda escrit al codi |
| Difícil de repetir igual dues vegades | Idèntic a cada execució |
Fixa't en la segona fila: que un programa s'equivoqui sempre igual és un avantatge, no un defecte. Un error reproduïble es pot localitzar i arreglar. Un error humà aleatori, no.
- El cas del curs: Estudi Alba i el seu problema
Estudi Alba és un petit estudi de disseny gràfic fictici. El formen tres persones:
- Marta, coordinadora. Reparteix la feina i parla amb els clients.
- Luis, dissenyador. S'ocupa sobretot d'identitat visual.
- Nuria, dissenyadora. Porta maquetació i materials impresos.
La seva manera actual d'organitzar-se és aquesta: la Marta apunta cada encàrrec en una nota de paper i la deixa sobre la taula de qui correspongui. Va funcionar bé el primer any. Ara no:
- Les notes es perden. Un encàrrec d'un client va desaparèixer sota un munt de proves de color i es va lliurar amb nou dies de retard.
- Ningú no sap què té l'altre. La Marta pregunta en veu alta «tu com vas?» diverses vegades al dia i interromp la feina de tothom.
- No hi ha prioritats explícites. Totes les notes semblen igual d'urgents perquè estan escrites en el mateix paper groc.
- No queda historial. Quan un client pregunta què es va fer al març, ningú no pot respondre.
La Marta ha decidit que vol un programa que resolgui això. No vol una eina comercial cara i plena d'opcions que no faran servir: vol una cosa petita, pròpia i exactament adaptada a com treballen. Aquest programa es dirà TascaFàcil i és el que construirem al llarg del curs.
Fixa't en un detall important: el problema d'Estudi Alba no és un problema informàtic. És un problema d'organització. La programació només és l'eina amb què l'atacarem. Això és el normal al món real: el programari gairebé mai no és un fi, és un mitjà.
- Què hauria de fer TascaFàcil
Abans d'escriure res, convé posar per escrit què esperem del programa. Això s'anomena definir els requisits i és el pas que més gent es salta, amb resultats previsibles.
Després de parlar amb la Marta, el Luis i la Nuria, la llista queda així:
| Núm. | El programa ha de... | Per què ho demanen |
|---|---|---|
| R1 | Registrar una tasca amb títol, descripció, responsable, prioritat i estat | Substituir la nota de paper |
| R2 | Acceptar només tres prioritats: alta, mitjana, baixa |
Que «urgent» signifiqui el mateix per als tres |
| R3 | Assignar cada tasca a la Marta, el Luis o la Nuria | Saber de qui és cada cosa |
| R4 | Llistar totes les tasques i filtrar-les per responsable o per estat | Respondre a «tu com vas?» sense interrompre |
| R5 | Marcar una tasca com a completada | Distingir el fet del pendent |
| R6 | Desar la informació encara que es tanqui el programa | Que no es perdi res en apagar l'ordinador |
Cada tasca de TascaFàcil tindrà, per tant, cinc dades:
- Títol: una frase curta. Exemple: «Dissenyar logotip per al Forn Solé».
- Descripció: el detall. Exemple: «Tres propostes en blanc i negre, format vectorial».
- Responsable: Marta, Luis o Nuria.
- Prioritat:
alta,mitjanaobaixa. - Estat: pendent o completada.
Encara no implementarem res de tot això. Desar dades entre execucions (R6), per exemple, és cosa de la lliçó Desar dades en fitxers, al final del mòdul 5. El que sí que convé és tenir la llista al davant: cada mòdul del curs anirà ratllant requisits.
- Primer contacte amb Python: la salutació del programa
Ja podem escriure la nostra primera línia de codi real. Serà modesta —mostrar un text per pantalla— però és un programa complet i funcional.
En Python, la instrucció per mostrar alguna cosa per pantalla és print:
Desmenucem aquesta línia, perquè cada símbol compta:
printés el nom de la instrucció. Significa «mostra per pantalla». S'escriu en minúscules:PrintoPRINTdonarien error, perquè Python distingeix majúscules de minúscules.- Els parèntesis
(i)tanquen allò que volem mostrar. Sempre hi han de ser tots dos, un d'obertura i un de tancament. - Les cometes
"marquen el principi i el final d'un text. Tot el que va entre cometes es mostra tal qual, sense que Python intenti interpretar-ho. També hi han de ser totes dues.
Si executem aquest fitxer, per pantalla apareix exactament:
Ni cometes, ni parèntesis, ni la paraula print. Només el text. Les cometes diuen a Python on comença i acaba el text, però no en formen part.
Un programa pot tenir diverses instruccions, una per línia, i s'executen en ordre, de dalt a baix. Això és una pantalla de benvinguda completa per a TascaFàcil:
print("========================================")
print(" TascaFacil v0.1")
print(" Gestor de tasques d'Estudi Alba")
print("========================================")
print("Equip: Marta, Luis i Nuria")
print("Prioritats disponibles: alta, mitjana, baixa")
print("")
print("Encara no fa res. Tot per construir.")I això és el que surt per pantalla:
======================================== TascaFacil v0.1 Gestor de tasques d'Estudi Alba ======================================== Equip: Marta, Luis i Nuria Prioritats disponibles: alta, mitjana, baixa Encara no fa res. Tot per construir.
Tres observacions sobre aquest exemple:
- L'ordre importa. Si mous la primera línia al final, la línia d'
=apareixeria a baix. Python no reordena res pel seu compte. - Els espais dins de les cometes es respecten. Per això
" TascaFacil v0.1"apareix indentat: aquests dos espais són dins del text. print("")amb cometes buides mostra una línia en blanc. És la manera habitual de separar blocs visualment.
Això és, literalment, un programa. Fa poca cosa, però és un programa complet: té instruccions, un ordre i un resultat observable. Com escriure'l en un fitxer i executar-lo al teu propi ordinador ho veuràs a la lliçó Entorns de desenvolupament.
Errors Comuns i Consells
Creure que cal saber matemàtiques avançades. Per a la immensa majoria del programari professional n'hi ha prou amb sumar, restar, comparar i raonar amb lògica. El que sí que cal és tolerància a la frustració: passaràs molt de temps amb programes que no funcionen, i això és normal, no un senyal que no vals.
Oblidar tancar cometes o parèntesis. És l'error número u de la primera setmana. print("Hola) no funciona perquè el text no es tanca mai; print("Hola" tampoc, perquè falta el parèntesi. Consell: escriu sempre els dos símbols seguits —() i ""— i després col·loca el contingut al mig.
Escriure Print en lloc de print. Python distingeix majúscules de minúscules: print, Print i PRINT són tres noms diferents i només existeix el primer. El mateix passarà amb els noms que t'inventis més endavant.
Confondre «no entenc el codi» amb «no entenc el problema». Quan t'encallis, pregunta't primer si sabries resoldre-ho a mà, amb paper. Si la resposta és no, el problema no és Python. Torna a l'enunciat abans de tocar el teclat.
Voler escriure el programa sencer a la primera. Ningú no ho fa. El programari es construeix per capes: alguna cosa mínima que funcioni, i a sobre una altra cosa. TascaFàcil comença sent vuit print i acabarà sent un programa complet, però el camí són desenes de versions intermèdies.
Consell de mètode: escriu el resultat esperat abans d'executar. Abans de llançar un programa, apunta en un paper què creus que sortirà per pantalla. Si encertes, ho has entès. Si falles, acabes de descobrir un buit en el teu model mental, que és exactament el que buscaves.
Exercicis
Exercici 1: Instruccions inequívoques
Escriu, en català i en forma de llista numerada, les instruccions que seguiria una màquina per preparar una tassa de te. La màquina no sap res: no sap què és una tassa, però sí que pot agafar, abocar, esperar i comprovar. Sigues tan precís que no quedi cap buit per omplir. Després, assenyala com a mínim dos buits que un humà ompliria tot sol i que tu has hagut d'explicitar.
Exercici 2: Compilat o interpretat
Per a cada situació, indica si descriu un llenguatge compilat o un d'interpretat, i justifica la resposta en una frase:
- Canvies una línia del programa i el tornes a llançar immediatament, sense cap pas intermedi.
- Lliures al client un únic fitxer executable; el client no rep el teu codi.
- El programa s'atura amb un error just en arribar a la línia 80, després d'haver executat correctament les 79 anteriors.
- Abans de poder provar res, esperes 40 segons que acabi un procés de traducció.
Exercici 3: La pantalla de benvinguda de TascaFàcil
Escriu un programa Python fent servir només print que mostri exactament això per pantalla:
### TascaFacil ### Estudi Alba ----------------- Responsables: Marta / Luis / Nuria Tasques pendents: per implementar
Fixa't en la línia en blanc abans de l'última línia: hi ha de ser.
Solucions
Solució 1.
Una versió prou precisa seria:
- Comprova si hi ha aigua al bullidor. Si no n'hi ha, omple el bullidor amb 250 ml d'aigua.
- Encén el bullidor.
- Espera fins que l'aigua arribi als 95 graus.
- Agafa una tassa buida i col·loca-la sobre l'encimera.
- Agafa una bosseta de te i deixa-la dins de la tassa.
- Aboca l'aigua del bullidor a la tassa fins a 1 cm per sota de la vora.
- Espera 3 minuts.
- Treu la bosseta de la tassa i llença-la a les escombraries.
- Apaga el bullidor.
Buits que un humà ompliria tot sol i que hem hagut d'explicitar:
- La quantitat d'aigua i la temperatura. Un humà entén «aigua calenta»; una màquina necessita 250 ml i 95 graus.
- El temps de repòs. «Deixa reposar» no és una instrucció: 3 minuts sí que ho és.
- Que la tassa estigui buida i al seu lloc. Ningú no diria en veu alta «agafa una tassa buida», però la màquina en podria agafar una de plena.
- Què fer amb la bosseta al final. Si no ho dius, es queda a dins.
Bonus: hi falta una comprovació. I si no queda cap bosseta de te? Un programa robust hauria de decidir què fer en aquest cas. Això s'anomena tractar els casos excepcionals i ho treballarem al mòdul 8.
Solució 2.
- Interpretat. No hi ha pas de traducció previ: l'intèrpret llegeix el codi i l'executa al moment.
- Compilat. S'ha generat un executable en codi màquina, independent del codi font, i és l'única cosa que es distribueix.
- Interpretat. L'error apareix en arribar a la línia 80, cosa que indica que les línies es van processant durant l'execució i no es van revisar totes abans.
- Compilat. Aquests 40 segons són el compilador traduint tot el programa abans que res s'executi.
Solució 3.
print("### TascaFacil ###")
print("Estudi Alba")
print("-----------------")
print("Responsables: Marta / Luis / Nuria")
print("")
print("Tasques pendents: per implementar")Punts on se sol fallar:
- Oblidar el
print("")de la línia en blanc. Sense ell, les dues últimes línies surten enganxades. - Escriure
print(### TascaFacil ###)sense cometes. Python intentaria interpretar aquests símbols com a codi i donaria error: tot text literal va entre cometes. - Fer servir sis línies de contingut però en un altre ordre. Recorda: s'executen de dalt a baix, exactament com estan escrites.
Conclusió
Programar és traduir una intenció humana a instruccions tan precises que una màquina obedient i ràpida, però que no entén res, les pugui executar. Aquest text precís és el codi font; el processador, en canvi, només entén codi màquina, i entre tots dos hi ha sempre un traductor: un compilador, que tradueix tot de cop abans d'executar, o un intèrpret, que va llegint i executant sobre la marxa, com fa Python.
Programem per tres raons: per automatitzar el que és repetitiu, per resoldre problemes obligant-nos a definir-los amb precisió i per escalar, pagant l'esforç una vegada i executant-lo moltes. Les tres es veuen en el cas que ens acompanyarà tot el curs: Estudi Alba perd notes de paper i necessita TascaFàcil, els sis requisits del qual ja tenim per escrit. I hem escrit el nostre primer programa real: uns quants print que dibuixen la pantalla de benvinguda.
Ara bé, res de tot això no va aparèixer de cop. Els llenguatges que avui ens permeten escriure print("Hola") en lloc de seqüències d'uns i zeros són el resultat de gairebé dos segles d'intents, fracassos i bones idees acumulades. A la lliçó següent, Història de la programació, recorrerem aquest camí: no com una llista de dates, sinó entenent quin problema concret va resoldre cada etapa i per què l'ofici és avui com és.
Fonaments de la Programació
Mòdul 1: Introducció a la Programació
- Què és la programació?
- Història de la programació
- Llenguatges de programació
- Entorns de desenvolupament
- Del problema a l'algorisme
Mòdul 2: Conceptes Bàsics
- Variables i tipus de dades
- Operadors i expressions
- Entrada i sortida de dades
- Conversió de tipus i validació de dades
Mòdul 3: Estructures de Control
Mòdul 4: Funcions i Procediments
- Definició i ús de funcions
- Paràmetres i retorn de valors
- Àmbit de variables
- Descompondre un programa en funcions
- Funcions com a valors: lambda i ordre superior
Mòdul 5: Estructures de Dades
- Llistes i arrays
- Cadenes de caràcters
- Diccionaris i conjunts
- Tuples i estructures imbricades
- Desar dades en fitxers: text, CSV i JSON
Mòdul 6: Algorismes Bàsics
Mòdul 7: Objectes i Organització del Codi
- De les dades als objectes: classes i instàncies
- Atributs, mètodes i constructor
- Col·leccions d'objectes
- Mòduls, paquets i importacions
Mòdul 8: Bones Pràctiques i Eines
- Documentació i comentaris
- Depuració i gestió d'errors
- Control de versions
- Proves automatitzades
- Estil, llegibilitat i refactorització
