Timp estimat de citire: 5-6 minute
“Își mai aduce aminte cineva de organizarea directa a fișierelor pe disc în FORTRAN?”
Sa nu credeți ca eram vreun fan al notițelor. La multe cursuri aveam o relație simpla: ele mă urmăreau, eu fugeam. Dar cele legate de programare le-am păstrat. Nu din pietate, ci din interes. Programarea, pe atunci, nu era doar “meserie”. Era considerata si “o arta” si dădea bine să fi un artist bun programator.
Eram la începutul lui 1972. La Institut rulam pe Siemens 4004, dar scoală mea serioasă fusese pe IBM 360 de la ASE. Asta contează. In epoca aia, “arta a programării” nu era o metafora frumoasă pentru conferințe. Era o necesitate: memorie putină, disc scump, timp de UC (Unitate Centrala) limitat, iar fiecare greșeala se taxa în hârtie tipărită si în nervi. Azi, când nu merge ceva, dai refresh. Atunci, când nu mergea, așteptai listarea. Se lucra în batch. Iți lăsai cutia cu cartele la “Recepție” si așteptai rularea să vezi ce rezultate obții. Si așteptarea listării era, de multe ori, mai lunga decât răbdarea. De aceea mi-am păstrat nu doar notițele, ci si listingurile programelor care îmi ieșiseră bine. Erau “surse” în sensul cel mai concret: foile tipărite cu programul, ordonate cu un elastic si puse într-o mapa de carton. Nu exista Git, nu exista cloud, nu exista “am pus pe drive”. Backup-ul era mapa. Daca o scăpai pe jos, se făcea “merge conflict” în toata regula, doar ca rezolvarea se făcea cu mâinile, nu cu mouse-ul.
In mapa aceea aveam doua feluri de comori.
Unele erau algoritmi: sortarea unei tabele în memorie, căutarea prin dihotomie (care suna a procedura medicala, dar era doar metoda civilizata de a nu caută ca orbii).
Altele erau “artificii” tehnologice: cum să legi un program FORTRAN de o rutina COBOL, adică cum să faci doua lumi care se priveau urat să lucreze împreuna. Azi ii spui interfațare. Atunci ii spuneai, în gând, “să nu crape la link-edit”.
Si acum vine întrebarea pe care o pun ca pe o poza de epoca:
Își mai aduce aminte cineva de organizarea directa a fișierelor pe disc în FORTRAN?
Pe atunci, daca voiai să găsești repede o înregistrare într-un fișier mare, nu aveai “baza de date”, nu aveai “index”, nu aveai “search”.
Aveai discul.
Un disc cu piste si sectoare, care se învârtea blând, dar nu avea niciun chef să fie citit ca un roman de la prima pagină la ultima. Voiam să ajung direct la o înregistrare – de pilda, la un cod de vagon său la o marca.
Si atunci foloseam un truc care azi e din nou la moda, doar ca ambalat mai elegant: hashing.
Hashing-ul, pe înțelesul tuturor, e o regula prin care transformi o cheie (un număr, un cod, un nume) într-o poziție unde ar trebui s-o găsești. Ca si cum ai lua “Popescu, Ion” si, fără să deschizi cartea de telefoane, ai ști din start pe ce raft se afla. Nu pentru ca ești vrăjitor, ci pentru ca folosești o formula. In anii ’70 formula clasica era simpla si practica: împărțeai cheia la un număr prim si luai restul.
Restul acela nu era poezie. Era adresă. Un loc real pe disc, cu un sens aproape geografic: “aici, în zona asta”. De ce număr prim? Pentru ca cheile au obiceiuri proaste. Vin în serii, au tipare, se termina în 0, sunt multipli de 2 său de 5 – exact ca oamenii care, daca le dai o singura intrare, se înghesuie toți pe aceeași ușă. Un număr prim reduce genul asta de “congregare”. Nu face minuni, dar distribuie mai uniform. E o disciplina blânda, ca un portar bun: nu te oprește, doar te împrăștie.
Sigur ca apăreau coliziuni: doua chei diferite puteau să dea același rest. Atunci aveai o soluție simpla, de epoca: zona de overflow. O anexa a fișierului, un fel de magazie în care puneai “dublurile”. Nu era frumos, dar funcționa.
Si pe vremea aia, frumosul era opțional; funcționatul era obligatoriu. Astăzi, când folosești un dicționar în Python său un hash-map în Java, faci același lucru, doar ca fără să vezi mecanismul. Cheia se transforma într-un index într-un tabel din memorie. Adresă nu mai e fizica (pista/sector), e logica (un loc într-o structura).
Daca structura se umple, sistemul își mărește singur spațiul si muta totul, recalculează, reaseaza. Rehashing. Pe scurt: mutare de mobila făcuta noaptea, fără să-ti ceara voie.