Introducció pràctica a Python per a principiants, amb Jessica McKellar

Al youTube he trobat aquest tutorial sobre Pyhton. Es tracta d’un tutorial, en anglès, orientat als principiants. És de la PyCon 2014 celebrada l’any passat a Montreal. Podeu trobar més vídeos de la conferència de l’any passat al seu canal youTube.

La PyCon és l’organització que aplega la comunitat internacional de desenvolupadors en Python. Enguany la PyCon 2015 es va tornar a celebrar a Montreal, el passat mes d’abril (canal youTube) La conferència EuroPython es celebrarà a Bilbao del 20 al 26 de juliol.

El tutorial està presentat per Jessica McKellar, que tot i la seva joventut ja s’ha fet un nom reconegut dins el món pythonista.

Avui, doncs, un entretingut tutorial de presa de contacte amb el llenguatge Python.

També podeu trobar la conferència homònima de l’any anterior, més curta, impartida a la PyCon US2013 a Santa Clara, Califòrnia.

Anuncis

Un codificador de Huffman amb Python

Hi havia una vegada un MOOC

L’afició als MOOCs està fent que dediqui menys temps al blog però també em proporciona idees per a posts.

Concretament, el d’avui té el seu origen en el MOOC de Coursera Digital Signal Processing de l’École Polytechnique Fédérale de Lausanne, que tot just he acabat. En el meu cas, el MOOC m’ha servit per refrescar coneixements de la meva època d’universitari.

Aprofito per felicitar als professors del curs per l’extraordinari esforç didàctic del MOOC.

I per agraïr-lo. M’ho he passat molt bé fent aquest curs.

A una de les “video lectures” s’explicava el format jpeg i es parlava de l’us de la codificació de Huffman dins d’aquest format.

La codificació de Huffman és un algorisme de compressió de dades que assigna codis de longitud variable als símbols d’un alfabet. Els codis són més curts per als símbols més probables i més llargs per als menys probables.

la codificació huffman també es fa servir a compressors com pkzip o, a més del jpeg, en d’altres formats d’imatge, com el png.

En defintiva, que m’han vingut ganes de fer una cosa que tenia pendent des de l’epoca de l’universitat, i que no és altre que programar la meva pròpia implementació d’un codificador/decodificador de Huffman. En Python, que com més el faig servir, més m’agrada el llenguatge.

Teoria

La wikipedia proporciona bones explicacions teòriques sobre la codificació de Huffman.
La codificació de Huffman
L’algorisme de Huffman

En resum, es parteix d’una taula que ens dona per a cada símbol d’un alfabet la seva probabilitat d’aparició.

L’alfabet a codificar

Suposo un alfabet de set símbols, amb les següents probabilitats

“A”: 0.12
“B”: 0.15
“C”: 0.15
“D”: 0.18
“E”: 0.22
“F”: 0.12
“G”: 0.06

En Python ho codifico amb un diccionari

    # symbols,probabilities table
    symbols = {"A":0.12, "B": 0.15, "C": 0.15, "D": 0.18, "E": 0.22, "F": 0.12, "G": 0.06}

Aleshores, es tracta de construir un arbre binari en el que…

Comencem, cada símbol és una fulla de l’arbre.

Creo una classe auxiliar Node que em permetrà mantenir símbol, probabilitat i informació addicional. És una classe sense mètodes, només la faré servir per encapsular dades. Com una struct de C, per entendre’ns.

class Node:
    # properties
    probability = 0.0
    symbol = ""
    encoding = ""
    visited = False
    parent = -1

Inicialitza l’arbre

Ara inicialitzo l’arbre, creant un node per a cada símbol. És el que faig amb el mètode initNodes de la classe Huffman

    def initNodes(self, probs):
        for symbol in probs:
            node = Node()
            node.symbol = symbol 
            node.probability = probs[symbol]
            node.visited = False
            self.Nodes.append(node)
            self.probs[symbol]=probs[symbol]     

Invoco aquest mètode dins del constructor de la classe.

if __name__=="__main__":
    # symbols,probabilities table
    symbols = {"A":0.12, "B": 0.15, "C": 0.15, "D": 0.18, "E": 0.22, "F": 0.12, "G": 0.06}

    # instantiate encoder
    huffman = Huffman(symbols)

Per a crear l’arbre aprofitaré una llista de nodes (llista Nodes). L’estructura de l’arbre la proporciona la propietat parent de cada Node.

L’arbre

L’arbre es construeix a buildTree:

    def buildTree(self):
        indexMin1 = self.getNodeWithMinimumProb()
        indexMin2 = self.getNodeWithMinimumProb()
        
        while indexMin1 != -1 and indexMin2 != -1:
            node = Node()
            node.symbol = "."
            node.encoding = ""
            prob1 = self.Nodes[indexMin1].probability
            prob2 = self.Nodes[indexMin2].probability
            node.probability = prob1 + prob2
            node.visited = False
            node.parent = -1
            self.Nodes.append(node)
            self.Nodes[indexMin1].parent = len(self.Nodes) - 1
            self.Nodes[indexMin2].parent = len(self.Nodes) - 1
            
            # rule: 0 to highest probability, 1 to lowest.
            if prob1 >= prob2:
                self.Nodes[indexMin1].encoding = "0"
                self.Nodes[indexMin2].encoding = "1"
            else:
                self.Nodes[indexMin1].encoding = "1"
                self.Nodes[indexMin2].encoding = "0"
            
            # self.showTree()
            
            indexMin1 = self.getNodeWithMinimumProb()
            indexMin2 = self.getNodeWithMinimumProb()

El que fa build Tree és invocar dos cops al mètode getNodeWithMinimumProb

    def getNodeWithMinimumProb(self):
        minProb = 1.0
        indexMin = -1

        for index in range(0, len(self.Nodes)):
            if (self.Nodes[index].probability < minProb  and 
               (not self.Nodes[index].visited)):
                minProb = self.Nodes[index].probability
                indexMin = index

        if indexMin != -1:
            self.Nodes[indexMin].visited = True

        return indexMin

Que fa exactament això que diu el seu nom. Busca el node de mínima probabilitat i quan el troba, en retorna l’index i marca el node com a visitat, de forma que no el tindrà en compte en passades posteriors

buildTree invoca dos cops getNodeWithMinimumProb, és dir, obté els dos Nodes de probabilitat més baixa. Al de probabilitat més alta li assigna un zero, i al de més baixa un u.

Val a dir que aquesta assignació és arbitrària i simplement busca provocar que el node de probabilitat més alta tingui la codificació numèricament més petita, i el de probabilitat més baixa, la més alta. En realitat, com que estic generant un codi binari, el que realment compta és la longitud de la codificació, és dir, quants bits per símbol. Si en comptes de seguir el criteri indicat seguís el contrari, la codificació huffman que obtindria tindria la mateixa longitud en bits: els símbols de major probabilitat tindrien menys bits de codificació, i els de menor, al contrari, més bits.

És dir, el codi huffman em permet trobar codis òptims pel que fa a la longitus en bits de la codificació dels símbols. L’algorisme de Huffman no diu res sobre assignacions de zeros i uns, això depèn de la implementació.

En aquesta implementació, doncs, el criteri és assignar un 0 al node de major probabilitat i un1 al de menor.

Tenint en compte tot l’anterior, es crea un nou node amb probabilitat suma de les probabilitats dels nodes trobats, i afegeix el node a la taula Nodes.

Els nodes fills apunten la propietat parent al nou node creat.

El procés es repeteix fins que només queda el node arrel.

Simplificant: diccionari de símbols i codificacions

Un cop arribats a aquest punt, ja en tindria prou, però per simplificar els mètodes de codificació i decodificació, he afegit un pas addicional que construeix la taula de codificacions dictEncoder, que associa cada símbol amb la seva codificació binària. Això ho faig amb buildDictionary

    def buildDictionary(self):
        for symbol in self.probs:
            encoding = self.showSymbolEncoding(symbol)
            self.dictEncoder[symbol] = encoding

Que invoca showSymbolEncoding, que per a cada símbol torna la seva codificació.

    def showSymbolEncoding(self, symbol):
        found = False
        index = 0
        encoding = ""

        for i  in range(0, len(self.Nodes)):
            if self.Nodes[i].symbol == symbol:
                found = True
                index = i
                break 
        
        if found:
            while index != -1:
                encoding = "%s%s" % (self.Nodes[index].encoding, encoding)      
                index = self.Nodes[index].parent
        else:
            encoding = "Unknown symbol"

        return encoding

Encoder i Decoder

Un cop disposo del diccionari de simbols la codificació i la decodificació són trivials:

    def encode(self, plain):
        encoded = ""
        for symbol in plain:
            encoded = "%s%s" % (encoded, self.dictEncoder[symbol])

        return encoded 

    def decode(self, encoded):
        index = 0
        decoded = ""

        while index < len(encoded):
            founf = False
            aux = encoded[index:]
            for symbol in self.probs:
                if aux.startswith(self.dictEncoder[symbol]):
                    decoded = "%s%s" % (decoded, symbol)
                    index = index + len(self.dictEncoder[symbol])
                    break 
        
        return decoded

Provem-ho

I, per descomptat, tot plegat funciona

albert@atenea:~/Baixades$ python huffman.py 
show symbols
Symbol: A; encoding: 110
Symbol: C; encoding: 010
Symbol: B; encoding: 001
Symbol: E; encoding: 10
Symbol: D; encoding: 000
Symbol: G; encoding: 111
Symbol: F; encoding: 011
test: ABABCCFDADDEDAG; encoded: 11000111000101001001100011000000010000110111
encoded: 11000111000101001001100011000000010000110111; decoded: ABABCCFDADDEDAG
Success!
albert@atenea:~/Baixades$ 

GitHub

el codi complet es pot descarregar del GitHub

Algunes idees per seguir

El codificador de Huffman amb python que he presentat es pot ampliar per fer un compressor. Algunes idees: Es podria afegir un mètode que llegís el fitxer a comprimir i que calculés les freqüències dels símbols (màxim de 255 símbols), el fitxer comprimit hauria de desar un primer bloc amb la taula de probabilitats (Potser seria més pràctic desar el diccionari de codificació) i, a continuació el fitxer comprimit. Evidentment, caldria traduir la cadena de caràcters de zeros i uns a bits i agrupar en bytes (no tindria cap sentit desar cadenes de caràcters de ‘0’ i ‘1’!).

També, en una altre línia, és podria fer un mètode que calcules l’estalvi de bits que suposa fer servir aquest compressor en comptes de la codificació a 8 bits per caràcter. O també un mètode que calculés l’entropia de l’alfabet original i la comparés amb la longitud mitja dels bits del codi huffman generat.

En resum i per acabar, avui he presentat un codificador de Huffman que pot servir de base per a desenvolupaments més interessants i que pot il·lustar alguns elements de teoria de la informació.

Una variant del problema de Monty Hall (divertiment courserià)

Els cursos de Coursera estan resultant ser una de les coses més divertides que he fet últimament. Estic apuntat al MOOC Financial Engineering and Risk Management II i fa un parell de setmanes un dels exercicis era una adaptació de “El problema de Monty Hall“. Que ningú s’esveri: és un problema de probabilitats que es pot resoldre amb coneixements de batxillerat.

De la Viquipèdia:
“El problema de Monty Hall és un trencaclosques de probabilitat basat en el programa de televisió americà Let’s Make a Deal (“Fem un tracte”). El nom ve del presentador del programa, Monty Hall. El problema també s’anomena la paradoxa de Monty Hall.

hall_lmad

Una explicació coneguda del problema va ser publicada a la revista Parade:

«Suposa que ets al programa “Fem un tracte” i et deixen triar una de tres portes. Darrere una, hi ha un cotxe; darrere de les altres, cabres. Tries una porta, per exemple, la número 1, i Monty Hall que sap què hi ha darrere les portes obre una altra porta, per exemple la 3, que té una cabra. Després et diu: “Vols canviar a la 2?”

Hi surts guanyant si canvies el que havies triat? (Whitaker 1990)»

Com que no hi ha manera de saber quina de les dues portes no obertes és la guanyadora, la majoria de la gent creu que cada porta té les mateixes probabilitats i conclou que canviar de porta no importa. Però aquesta conclusió és incorrecta: de fet si el jugador canvia la probabilitat de guanyar passa d’1/3 a 2/3. Canviar no dóna cap avantatge si el jugador tria inicialment la porta guanyadora, el que té una probabilitat d’1/3. Triar inicialment la porta incorrecta té una probabilitat de 2/3; quan es revela l’altra porta incorrecta, canviar suposa guanyar. Així, la probabilitat de guanyar quan es canvia de porta és de 2/3.

Quan la solució del problema va aparèixer a la revista Parade, aproximadament 10.000 lectors, incloent uns 1.000 amb doctorat, van escriure a la revista dient que la resposta era incorrecta. Molta part de la controvèrsia fou perquè la versió de la revista del problema és tècnicament ambigua ja que hi ha aspectes que el presentador no explica, com que ha d’obrir una porta i ha d’oferir al concursant si vol canviar de porta.”

Doncs bé, al MOOC de Financial Engineering and Risk Managemnent II de Coursera, actualment en curs, han plantejat en un exercici una variació del problema de Monty Hall:

«Suposa que ets al programa “Fem un tracte” i et deixen triar una de quatre portes: dues amaguen cotxes i darrere les altres dues, hi han cabres. Tries una porta, per exemple, la número 1, i Monty Hall que sap què hi ha darrere les portes obre una altra porta, per exemple la 3, que té una cabra. Després et diu: “Vols canviar de porta?”

La probabilitat que el concursant triï una porta amb cotxe el primer cop és 1/2.

Què canvia quan el presentador obre una de les altres tres i mostra una cabra?

La tria del jugador afecta a la porta que obre el presentador. Que el presentador obri una porta no es un esdeveniment totalment aleatori ni inconnex.

Si el concursant tria en la seva primera opció una porta amb cotxe (probabilitat 1/2), aleshores el presentador pot obrir dues de les tres portes que resten tancades. El jugador té probabilitats de guanyar el cotxe si canvia en la segona tria a una de les altres dues portes tancades, que amaguen un cotxe (probabilitat d’aquesta segona tria, doncs, 1/2)

Si el concursant ha triat una porta amb cabra en la seva primera opció (probabilitat 1/2), el presentador només pot obrir una de les altres tres portes, l’única que amagarà una cabra. Les altres dues portes amaguen un cotxe. Si el concursant canvia de porta, guanya segur (probabilitat d’aquesta segona tria igual a 1).

Resumint: si manté la tria original guanya només si la primera porta amagava un cotxe (amb probabilitat de 1/2).

Si canvia:
Guanya segur si en la primera opció ha triat una porta que amaga una cabra, perquè les altres portes tancades amaguen dos cotxes. (probabilitat = 1)
Si la porta de la tria inicial amagava un cotxe, la probabilitat de triar l’altre cotxe al canviar és de 1/2, perquè pot triar entre entre les altres dues portes, que amaguen un cotxe i una cabra.

Matemàticament, doncs:

Siguin els següents esdeveniments aleatoris:

W: guanyar, és dir, triar porta amb cotxe en la segona tria
G1: triar porta amb cabra en la primera tria
C1: triar porta amb cotxe en la primera tria

G1 i C1 són esdeveniments complementaris.

Probabilitat de G1 union C1 = P(G1 union C1) = 1 newline
Probabilitat de G1 intersection C1 = P(G1 intersection C1) = 0

Siguin les probabilitats
P(W) = Probabilitat de guanyar si canvia en segona opció
P(G1) = Probabilitat d’haver triat cabra en la primera opció (1/2)
P(Win | G1) = Probabilitat de guanyar si canvia en segona opció condicionat a haver triat cabra en la primera (1)
P(C1) = Probabilitat d’haver triat cotxe en la primera opció (1/2)
P(Win | C1) = Probabilitat de guanyar si canvia en segona opció condicionat a haver triat cotxe en la primera (1/2)

Aleshores:

Selecció_002

I Substituint:

(1/2) * (1/2) + 1 * (1/2) = 1/4 + 1/2 = 3/4 = 0.75

Per tant, l’estratègia correcta és canviar en la segona opció, ja que la probabilitat d’haver triat cotxe en la primera opció P(C1) és només de 1/2.

Aquest resultat xoca amb la intuïció. La majoria de la gent no veu que obrir la porta amb la cabra sigui motiu per canviar la porta triada. És un biaix psicològic relacionat amb l’efecte de dotació, o l’aversió a la pèrdua. Un cop el concursant “ha comprat” la primera porta, li atribueix més valor que el que realment pot tenir

Un llibre molt interessant (i llarg) que parla, d’entre moltes altres coses, d’aquest efecte és “Thinking, fast and slow” del premi Nobel, psicòleg i economista Daniel Kahneman, que amb Amos Tversky, va desenvolupar la denominada teoria de les perspectives (prospect theory), segons la qual els individus prenen decisions, en entorns d’incertesa, que s’aparten dels principis bàsics de la probabilitat.

El cas és que quan vaig llegir el problema per primer cop vaig caure de quatre potes al biaix cognitiu i la resposta ràpida que em va sortir era equivocada.

Ferit en l’orgull i com que els apunts de matemàtica em quedaven lluny vaig optar per solucionar el problema amb força bruta: Vaig escriure un programa en Python per repetir la versió modificada de l’experiment de Monty Hall tants cops com volgués, de forma que estimaria la probabilitat a partir de la freqüència dels resultats.

No cal dir que l’experiment confirma la teoria.

Es poden trobar molt bones explicacions teòriques del problema de Monty Hall a Internet i aquí n’he reproduït una adaptant-la al problema plantejat al MOOC.

Vet aquí el codi del simulador. Els casos de prova es poden ajustar amb la variable num_experiments (per defecte a 100.000)

No té truc: he definit una classe MontyHall que simula l’experiment al constructor que a mida que va progressant ajusta propietats. La classe té mètodes per consultar els valors de les propietats.

El bloc principal no és més que la repetició de l’experiment tants cops com digui num_experiments. A cada iteració acumula els valors. Finalment, calcula les probabilitats i mostra els resultats.

from random import *

class MontyHall():
    rand = None
    door = []
    first_selection = 0
    door_goat = 0
    new_user_selection = 0
    has_changed = 0
    has_won = 0
    
    def __init__(self):
        self.door = ["Car", "Car", "Car", "Car"]
    
        self.rand = Random()
        D1 = self.rand.randint(1,4)
        D2 = self.rand.randint(1,4)
		
        while( D1 == D2):
            D2 = self.rand.randint(1,4)
			
        self.door[D1-1] = "Goat"
        self.door[D2-1] = "Goat"

        #print "---------------------------"
        #print self.door

        # first user selection
        self.first_selection = self.rand.randint(1,4)
        #print "User selects door %d" % self.first_selection 

        # monty halls shows a goat
        for i in range(1,5):
            if (self.door[i-1] == "Goat") and (i != self.first_selection):
                self.door_goat = i
                break;

        #print "Monty Hall shows goat on door %d" % self.door_goat

                
        # user selects new door
        self.new_user_selection = self.rand.randint(1,4)
        while(self.new_user_selection == self.door_goat):
            self.new_user_selection = self.rand.randint(1,4)

        # has changed?
        if (self.new_user_selection != self.first_selection):
            self.has_changed = 1
            #print "User has changed from door %d to door %d" % (self.first_selection, self.new_user_selection)
        #else:
            #print "User has not changed and remains on door %d" % self.first_selection


        # User wins?
        #print "In door %d got a %s " % (self.new_user_selection, self.door[self.new_user_selection-1]) 
        if (self.door[self.new_user_selection-1] == "Car"):
            self.has_won = 1
            #print "User wins!"
        #else:
            #print "User loses!"

    def get_has_won(self):
        return self.has_won

    def get_has_changed(self):
        return self.has_changed;

    def show_new_user_selection(self):
        print self.new_user_selection

    def show_goat_door(self):
        print self.door_goat

    def show_first_selection(self):
        print self.first_selection
		
    def show(self):
        print self.door
		
# ---- main ----
num_experiments = 100000

for j in range(0, 10):

    count_changes = 0.0
    count_no_change_won = 0.0
    count_change_won = 0.0

    for i in range(1,num_experiments + 1):
        montyHall = MontyHall()
        count_changes = count_changes + montyHall.get_has_changed()
        if montyHall.get_has_changed() == 1:
            count_change_won = count_change_won + montyHall.get_has_won()
        else:
            count_no_change_won = count_no_change_won + montyHall.get_has_won()

    print "---------------------------"
    print "Totals:"
    print "Num. experiments: %d" % num_experiments
    print "Num changes: %d" % count_changes
    print "Num no changes: %d" % (num_experiments - count_changes)
    print "Num changes won: %d" % count_change_won
    print "Num no changes won: %d" % count_no_change_won
    print "Num changes won/Num changes = %f" % (count_change_won / count_changes)
    print "Num no changes won/Num no changes = %f" % (count_no_change_won / (num_experiments - count_changes))

Un bon experiment per a noies i nois de batxillerat.

El codi es pot descarregar del meu github: https://github.com/abaranguer/montyhall.

Una reflexió sobre els MOOC (again)

Fa un parell de mesos vaig cursar (i superar, amb els corresponents certificats) un parell de MOOC de MiríadaX: “Android: Programación de Aplicaciones“, per la Universitat Politècnica de València i el “Curso Fundamental de Microeconomía“, per la Universidad Rey Juan Carlos de Madrid. També, per la plataforma MOOC de la UNED, “La Contabilidad, el lenguaje de los negocios” del que també he obtingut el certificat corresponent.

Tots aquests MOOC es feien en castellà. Una cosa que tenia pendent era provar els MOOC de Coursera, en anglès.

Em picava la curiositat dels MOOC en anglès i vaig decidir de començar amb alguna cosa “fàcil” en la que em sentís còmode. Un curs de Python tenia tot l’aspecte de ser el candidat ideal. Dit i fet, em vaig apuntar al MOOC “An Introduction to Interactive Programming in Python” de la Rice University de Houston, Texas.

El curs ha estat molt divertit, i també he obtingut una acreditació conforme l’he superat. La cosa ha anat de fer videojocs com Pong, Asteroids, o BlackJack amb una versió online i educativa de Pyhton desenvolupada amb JavaScript: el CodeSkulptor (http://www.codeskulptor.org/).

Divertit. Però si en comptes de portar un munt d’anys programant en llenguatges diversos; i que el Python, de fet, no era un llenguatge desconegut per mi, segurament no m’hauria divertit tant. Opino que el curs era prou fort com per a intimidar a un neòfit, i que per molta experiència prèvia que es tingués, calien hores de feina per a completar els treballs proposats.

Poc després d’encetar el curs de Python, em vaig apuntar al MOOC Finance (https://venture-lab.org/finance13/index) de la Stanford University a la plataforma Venture-Lab, perquè al temari es tocava un tema que m’interessava laboralment.

Bé, doncs tampoc ha estat “tan fàcil” (també he obtingut un certificat de participació).

M’ha agradat la dinàmica de formació continua dels MOOC. Actualment estic apuntat a un parell de MOOC, actualment en curs: “Introduction to Finance” (https://class.coursera.org/introfinance-003/class/index) de la University of Michigan (ja que el curs d’Stanford m’ha fet adonar que em calia reforçar aquest tema); i “Startup Engineering” (https://class.coursera.org/startup-001/class/index) de la Stanford University, però ara per Coursera.

Les vacances seran un bon moment per dedicar a la formació.

No són cursos trivials i és el correcte. Després d’haver fet MOOC a MiríadaX, Venture-Lab i Coursera m’adono que els MOOC han de tenir nivell d’exigència.

És fonamental que siguin exigents per al seu èxit.

El nivell d’exigència que he trobat als MOOC americans ha estat clarament superior al que he trobat a MiríadaX, o al COMA de la UNED. Crec que l’èxit dels MOOC nord-americans és, justament, que se’ls prenen seriosament tant les universitats que els imparteixen com els estudiants que els segueixen. L’èxit és l’exigència.

Perquè el model de negoci està en crear marca, no en regalar certificats.

Marca, per les universitats que ofereixen MOOC, són estudiants que han après de forma sòlida, que són capaços de posar aquests coneixements en pràctica i que les empreses constaten que, efectivament, aquests estudiants aporten coneixement útil.

Des de la meva experiència, crec que els MOOC són ideals per a professionals en actiu que poden prendre un o dos cursos durant un parell de mesos sobre alguna qüestió concreta fins obtenir un nivell de suficiència o, àdhuc, un nivell superior.

Aquests professionals potser voldran, posteriorment, prendre cursos amb acreditació oficial; o les empreses poden demanar cursos específics a les universitats; o els estudiants d’un MOOC específic poden ser “oferts” en una base de dades amb la garantia de la “marca” de la universitat.

Hi ha un retorn per a les Universitats que ofereixen aquesta formació gratuïta.

No només hi ha model de negoci per a les Universitats, encara més important, hi ha un aprenentatge real per als estudiants. A Rice, a Michigan a Stanford, al MIT… ho saben. No en tenen cap dubte. Els cursos, encara que gratuïts, tenen un nivell d’exigència alt.

No es regalen els certificats. Un certificat amb la “marca” de la universitat ha de ser merescut. L’estudiant ha d’esforçar-se. Si no està preparat, no obté la certificació. Ara bé, l’estudiant aprèn i, si no ho ha aconseguit ara, pot tornar a intentar-ho en un futur. No ha perdut diners. No se’l frustra. Si vols aprendre, aprens.

En cap cas un certificat de participació (o d’aprofitament, en diversos graus) en un MOOC és un títol oficial. Però els MOOC creen un ecosistema formatiu en que el títol oficial no és tan important. En canvi, el reconeixement comunitari, sí que ho és. Els MOOC creen i ofereixen el reconeixement comunitari. No debades en la presentació dels cursos sempre insisteixen en la participació als fòrums. Estem enmig del procés de construcció de les marques Coursera, EdX, Venture-Lab…

Els MOOC són socials, però tot aprenentatge és individual. Fins i tot quan s’assisteix a classes presencials, és l’estudiant, i només l’estudiant, el que decideix prestar atenció, estudiar, fer els exercicis o meditar sobre els conceptes apresos. El MOOC, per tant, demana l’esforç individual. La millora és que aporta interacció social útil a l’estudiant.

La combinació en plataformes d’aprenentatge de calendaris, programes de curs, examens… de material didàctic com vídeos, apunts, exercicis, qüestionaris… i xarxes socials, de fòrums, d’equips de treball distribuïts coordinats per xats i hangouts… és un espai social virtual en el que el guiatge i la consulta al professor es substitueix per la consulta a la comunitat i uns programes ben apamats.

Aquesta esforç individual sobre una combinació de recursos online s’ha anat refinant amb el temps i és el que s’estava prefigurant amb, per exemple, eines com Moodle, que ja té alguns anys

La novetat és que s’ha descobert com obtenir un retorn econòmic d’aquest servei formatiu gratuït i que les universitats, sobretot les nord-americanes, han decidit entrar en el joc. El resultat és una explosió de les plataformes MOOC.

A més, és el moment. crec que als EUA, sobretot, han entès que la forma de mantenir el lideratge en un món globalitzat és alliberant el màxim de coneixement, fer-lo circular, crear xarxa, i captar talent. El lideratge passa per una societat amb molta formació. És una frase que es repeteix molt, però pocs se la creuen. Els MOOC van en la línia d’incrementar el nivell formatiu de la societat. S’integren en el vector de canvi social que és la formació en línia.

Això dels MOOC és seriós. És una amenaça? Potser sí. És una amenaça per a la visió de l’educació com a producte empaquetat, com objecte de luxe, o com privilegi de classe. De forma semblant al que passa a la indústria editorial. Es tracta de vells negocis del segle XX que amb la xarxa veuen que el seu plantejament original s’enfonsa.

Les “indústries” educatives, editorials, culturals… Han de reinventar-se per al segle XXI, i adaptar-se a les xarxes i a la intel·ligència col·lectiva.

Els MOOC són una amenaça? Només si es tem el canvi. Només si no es pot oferir quelcom millor.

Aquest article de la UOC és molt interessant: “La irrupció dels MOOC sacseja el debat sobre els ensenyaments en línia

En reprodueixo aquest paràgraf clau: “El passat mes de setembre, durant la inauguració oficial del curs universitari català, el conseller d’Economia i Coneixement, Andreu Mas-Colell, es va referir als MOOC com una amenaça ja que «les grans universitats del món se’ns ficaran a casa sense crear cap lloc de treball. Cal anticipar-se aquí, i una altra vegada la col·laboració entre universitats pot ser essencial». De fet, Coursera ja ha signat amb més de disset universitats de prestigi, la majoria dels Estats Units, com ara la Universitat Brown i la Universitat de Colúmbia, per oferir els seus cursos a prop d’1,35 milions d’estudiants, situats en un 61,5% fora dels Estats Units.”

En definitiva, els MOOC una amenaça? Ho plantejo així: l’educació lliure, gratuita i de qualitat és una amenaça?

Temem la globalització o en som protagonistes?

Una bona Notícia: la Universitat Autònoma de Barcelona ja ofereix MOOC a Coursera. Ben fet. de moment, en castellà. Espero que aviat en anglès. La Universitat Pompeu Fabra i la Universitat de Girona ofereixen MOOC a MiríadaX.

Més enllà del negoci, només aquells que creuen profundament en el poder de l’educació i de la formació són prou lúcids per crear plataformes de formació lliure, gratuita i de qualitat.

Aprofito per afegir la secció MOOC al curriculum vitae. També els poso al LinkedIn.

I poso, un cop més, la llista de les principals plataformes MOOC:

Agregador de MOOC:
http://www.class-central.com/

Plataformes principalment en anglès (es poden trobar MOOC en altres idiomes):
https://www.coursera.org/
https://venture-lab.org/
https://www.edx.org/
http://eportfolio.saylor.org/
https://www.canvas.net/
https://www.khanacademy.org/

Plataformes MOOC en castellà:
http://miriadax.net/
https://unedcoma.es/

MOOC realitzat: “Android: Programación de Aplicaciones” de la UPV, a MiríadaX

Tot just he acabt el MOOC “Android: Programación de Aplicaciones” de la Universitat Politècnica de València, sobre la plataforma MiríadaX.

De moment, només dir que ja tinc el meu primer “badge“, que ve a ser el reconeixement de participació al MOOC que fa MiríadaX.EL reconeixement per badges admet graduacions i em temo que el que fa MiríadaX és el més bàsic. No té en compte, per exemple, les puntuacions obtingudes als tests, o els exercicis realitzats.

Per a un proper post queda pendent, ara des de l’experiència de primera ma que dona haver-ne fet un, explicar com ha anat la cosa. En un parell de setmanes, a més he d’acabar algun altre MOOC que també estic realitzant o sigui que, a més, podré donar també una opinió comparada.

En tot cas, he trobat aquesta experiència positiva i enriquidora. No era el primer cop que feia formacions online i tenia una idea prèvia del que em trobaria. Però ha superat les expectatives. He de dir que el curs de la UPV ha estat, amb diferència, el millor en que he participat en format online: 10 mòduls, amb abundants exercicis pràctics, tests i un examen per cada mòdul. Una novetat per mi: les “correccions” comunitàries d’exercicis als fòrums i , brillant, les classes de repàs amb àudio i vídeo en directe fent servir els hangouts de Google+. Déu n’hi do. Afegim bon material de vídeo i, potser, escàs material escrit, però enllaçat si més no.

Bé, ara ja soc un especialista en desenvolupament amb Android 😉 que era una mica la idea de fer aquest MOOC.

El MOOC. Un enorme camp de possibilitats d’auto-formació i de dissenyar un currículum a mida.

El següent pas: revisar l’oferta de Coursera.

OpenCourseWare i MOOC.

La formació és clau. A les TIC encara més.

Els reptes que plantegen les TIC demanen, a més, una renovació constant dels coneixements. Aquest dinamisme del sector exigeix dels professionals un esforç important. Les institucions de formació continua aporten estudis oficials que tracten d’adaptar-se a les condicions de treball dels professionals i podem trobar una oferta formativa prou variada.

Tanmateix, no sempre es poden assumir els requisits previs d’accés, calendari, preus (l’increment de les taxes universitàries no ajuda), o d’altres raons, per accedir als estudis oficials.

Però el desig de formació segueix allà. En ocasions ens trobarem que, senzillament, no ens cal una titulació oficial. Només ens interessa la formació pròpiament dita. O potser, simplement, volem estudiar pel plaer d’estudiar.

El món universitari, en general, ha estat relacionat de forma molt íntima amb el moviment Open Source i Free Software. És fàcil veure una afinitat entre ambdós mons.

Potser calia esperar, doncs, un cop la tecnologia ho ha permès, que les Universitats decidissin fer el pas de posar a l’abast de tothom la seva oferta formativa d’una forma flexible i sense lligar-la a titulacions oficials.

És així q1ue no fa pas gaires anys es parlava dels OpenCourseWare: Essencialment, els materials didàctics, llibres, apunts, exercicis… organitzats segons cursos i alliberats per a que tothom els pugui utilitzar.

A l’OpenCourseWare Coonsortium hom pot trobar els OpenCourseWare d’Universitats d’arreu del món. Les universitats catalanes ofereixen els seus materials als respectius OpenCourseWares:

Universitat Oberta de Catalunya: http://ocw.uoc.edu/
Universitat Politècnica de Catalunya: http://ocw.upc.edu/
Universitat Autònoma de Bellaterra: http://ocw.uab.cat/
Universitat de Barcelona: http://ocw.ub.edu/
Universitat de Girona: http://www.udg.edu/ocw/Presentacio/tabid/9467/language/ca-ES/Default.aspx
Universitat de Lleida: http://ocw.udl.cat/

El següent pas, després de la publicació dels materials és la oferta de cursos complerts en línia. ELs materias docents, però també classes gravades en vídeo, correcció d’exercicis i tutories virtuals. Algunes universitats ofereixen, fins i tot, certificats d’haver completat el curs. Parlem d’autèntica formació online. Es tracta dels MOOC, Massive Open Online Course. Massive i Open és perquè, virtualment, tothom s’hi pot apuntar de forma gratuita.

Les següents webs agrupen MOOC de vàries universitats:

https://www.coursera.org/
http://www.udacity.com/
https://www.edx.org
https://www.khanacademy.org/

Una llista més genèrica, en aquesta adreça: http://www.mooc-list.com/

També es poden trobar MOOC en altres llengües a part de l’anglès. Per exemple, la UNED disposa d’un espai on ofereix MOOC, o COMA, en castellà: https://unedcoma.es/

Les universitats catalanes, de moment, sembla que s’ho miren amb expectació. És interessant aquest reportatge aparegut a la “sala de prensa” de la UOC.

Tanmateix, algunes universitats catalanes ja ofereixen MOOC. La UDG i la UPF ofereixen MOOC en castellà adreçats al públic llatinoamericà (Des de la plataforma Miríada X del portal Universia. Llegiu també aquest post del Bloc de la Unitat Tecno-Didàctica del Tecnocampus de Mataró).

La pregunta que hom es fa és, com en finança això? Probablement, el model de negoci del MOOC de la UNED té poc a veure amb el de Stanford. Aquest article, per exemple, explica el model de Coursera: les empreses que fan cerca de talent, paguen per accedir als perfils dels estudiants. Evidentment això implica vàries coses: els MOOC mereixen la confiança dels headhunters; els headhunters confien en que hi trobaran el talent.

Parlem, doncs, d’excel·lència en la formació, i de perfils d’estudiants personalitzats i especialitzats. Els MOOC amplien el ventall d’oferta de formació continua. No s’oposen a la formació universitària tradicional, si no que la complementen, la perfiles, personalitzen i enriqueixen el curriculum.

El debat a favor i en contra del model d’ensenyament que representen els MOOC, està servit. En tot cas, des del punt de vista del professional que demana formació, l’opció MOOC és una possibilitat a tenir en compte. Es tracta, a més, d’una tendència creixent: a la web de Coursera parlen de prop de 2.500.000 de “courserians”.

Formació superior on la distància o el preu ja no són barreres. Online. En anglès, principalment. A escala planetària. Global, la paraula és important en aquest cas. D’accés gratuït… Atents, doncs. Potser seria bona idea fer un cop d’ull a l’oferta de cursos.