Povestea lui Mel, un programator adevarat

Aceasta istorisire a fost transmisa prin USENET de catre autorul ei, Ed Nather la 21 mai 1983. Va voi ruga sa faceti abstractie de limbajul usor tehnic si sa incercati sa duceti lectura pana la capat deoarece faptele din spatele cuvintelor conteazä.

Un articol recent dedicat ''atotputerniciei'' programarii continea urmatoarea declaratie seaca: programatorii adevarati folosec limbajul FORTRAN.

Poate ca o fac acum, in aceasta era decadenta a berii usoare, a calculatoarelor personale si asoftului prietenos cu utilizatorii, dar inainte, in acele zile de glorie cand termenul ''software'' avea o rezonanta ciudata, iar Computerele Adevarate erau facute din cilindri si lampi, Programatorii Adevarati scriau in cod masina. Nu FORTRAN. Nu RATFOR. Si nici chiar in limbaj de asamblare.

Codul masina.
Cifre aride, seci, de nepatruns: numere hexazecimale.
Direct.

O intreaga generatie de noi programatori a crescut in ignoranta si nu cunoaste acest trecut glorios. Ma simt dator sa descriu - si voi incerca s-o fac intr-un mod cat mai accesibil pentru aceasta generatie - modul in care scria programe un Programator Adevarat. L-am numit Mel pentru ca acesta era numele lui.

L-am intalnit prima oara pe Mel atunci cand m-am angajat la Royal McBee Computer Corp., o sectie acum defuncta a unei companii de masini de scris. Firma producea LGP-30, un computer mic (in raport cu standardele vremii), si tocmai incepuse productia lui RGP-4000, un model mult imbunatatit, mai mare, mai rapid, tot cu memorie pe baza de ferita. Miezurile de memorie costau foarte mult. Oricum nu se mai folosesc acum (de aceea n-ati auzit de companie si nici de computerele pe care aceasta le fabrica).

Fusesem angajat sa scriu un compilator de FORTRAN pentru aceasta noua minune, iar Mel era calauza mea in secretele masinii. El nu era de acord cu compilatoarele. Obisnuia sa spuna: ''Daca un program nu poate sa-si scrie propriul cod, la ce bun?''

Mel scrisese in limbaj-masina cel mai popular program de calculator pe care il avea compania. Programul era executat pe un LGP-30 si juca blackjack (21) cu clientii potentiali la expozitiile de computere. Efectul jocului era extraordinar: sectorul din expozitie ocupat de masinile LGP-30 era intodeauna ticsit de lume, iar agentii de la IBM se in varteau prin jur si susoteau intre ei. Daca in felul acesta crestea rata vanzarilor, asta era o chestiune pe care n-o discutam niciodata.

Sarcina lui Mel era sa rescrie programul pentru RPC-4000. (Se putea folosi un port. Dar ce este un port?) Noul computer avea o schema de adresare unu-plus-unu, in care fiecare instructiune pentru masina, in afara de codul de operare si de adresa , avea o a doua adresa care indica localizarea urmatoarei instructiuni pentru cilindrul care evolua. In exprimare moderna fiecare instructiune in dividuala era urmata de un GO TO! (Pune chestia asta intr-o pipa PASCAL si fumeaz-o!)

Lui Mel îi placea RPC-4000 deoarece îi dadea posibilitatea sä-si amelioreze codul: adica sa localizeze o instructiune pe cilindru, astfel ca imediat ce una îsi termina rularea urmatoarea sa ajunga la capul de citire si sa fie gata pentru o executare imadiata. Exista un program care facea acest lucru, un ''asamblator de optimizare'', dar Mel refuza sä-l utilizeze: ''Nu stii niciodata unde pune el lucrurile -explica el- asa ca va trebui sa folosesti constante separate''.

Pe atunci, eu nu întelegeam remarca aceasta. Întrucât Mel stia valoarea numerica a fiecarui cod de operare si desemna proriile sale adrese pentru cilindri, fiecare instructiune pe care o scria putea fi considerata si ea o constantä numericä. Codul lui nu putea fi lesne modificat de cätre altcineva.

Am comparat programele de optimizare manuala ale lui Mel cu codul utilizat de asamblorul de optimizare si am vazut ca ale lui Mel lucrau intotodeauna mai rapid. Si asta pentru ca metoda ''de-sus-in-jos'' a designului programelor nu fusese in ca inventata. El scria mai întâi cele mai intime parti ala buclelor programului, astfel ca ele sa gaseasca la prima optiune locatiile adreselor optime pe cilindru. Asamblorul de optimizare nu era destul de destept ca sa procedeze astfel.

Mel nu scria niciodata bucle de temporizare, nici chiar atunci cand greoiul Flexowriter cerea o pauza intre caractere pentru a lucra corect. El doar localiza instructiunile pe cilindru in asa fel ca in succesiunea lor ele sa se plaseze imediat dupa capul de citire, cand aceasta era necesar; in felul acesta cilindrul nu trebuia sa execute o rotatie completa pentru a gasi urmatoarea instructiune.

Mel a gasit un termen memorabil pentru aceasta procedura. Desi ''optim'' este un termen absolut, ca si ''unic'', a devenit o practica verbala obisnuita folosirea lui cu sens relativ ''nu tocmai optim'', sau ''mai putin optim'', sau ''nu prea optim''. Mel a numit locatiile pentru maximum de temporizare ''cele mai neoptime''.

Dupa ce aterminat programul ''blackjack'' si l-a facut sa mearga (''Pana si initializatorul este optimizat'' spunea el cu mandrie), el aprimit o cerere de modificare de la departamentul de vanzari. Programul utiliza un generator de numere aleatoare elegant (optimizat) pentru amestecarea si impartirea ''cartilor'' din ''pachet''. Cererea se referea la modificarea programului in asa fel incat, cu ajutorul unui inversor de sens, vanzatorii sa poata schimba numerele pentru a-i lasa pe clienti sa castige.

Mel a refuzat. El considera ca acest lucru nu e cinstit si, mai mult, este o lezare a integritatii lui morale ca programator. Dupa multe insisitente din partea Sefului de Vanzari si a Marelui Boss, Mel a scris codul dar a facut in asa fel ca la modificarea sensului programul sa castige mereu. Mel era incantat de noua varianta si spunea ca subconstientul lui este incontrolabil din punct de vedere etic. A refuzat, de data aceasta categoric, sa mai faca vreo modificare.

Dupa plecarea lui Mel de la companie, Marele Boss mi-a cerut sa ma uit la cod, sa vad daca pot gasi testul pentru a-l inversa.

Cu oarecari rezeve, am consimtit sa cercetez codul. Cand era vorba de un cod de-al lui Mel, asta insemna o adevarata aventura. Am fost de parere intotdeauna ca programarea este un fel de arta a carei valoare reala nu poate fi apreciata decat de un cunoscator al secretelor sale. Poti afla multe despre cineva doar analizandu-i programele, chiar daca sunt scrise in limbaj hexazecimal. In ceea ce il priveste pe Mel, el era un geniu, unul necunoscut, caruia nimeni nu-i adusese vreodata elogii.

Poate ca cel mai mare soc l-am avut cand am gasit o bucla nevinovata care nu continea nici un test. Absolut nici un test. Bunul meu simt imi spunea ca ar fi trebuit sa existe o bucla inchisa, in care programul sa se invarteasca mereu, la nesfarsit. Mi-au trebuit doua saptamani ca sa ma lamuresc asupra acestui aspect.

Computerul RPC-4000 avea o facilitate cu adevarat moderna, numita registru indexat. Ea permitea programatorului sa scrie o bucla ce utilizeaza o instructiuna interna indexata; la fiecare executie numarul registrului indexat era adaugat la adresa acelei instructiuni, astfel ca el indica informatia urmatoare dintr-o serie. Trebuia doar sa incrementezi registrul de fiecare data. Mel nu a folosit niciodata aceasta facilitate. În schimb, el introducea instructiunea int-un registru al masinii, adauga unu la adresa lui si îl rememora. Apoi el executa instructiunea modificata direct din registru.

Bucla fiind scrisa, aceasta executie suplimentara era luata in considerare. Imediat ce se termina o instructiune, urmatoarea se afla chiar sub capul de citire al cilindrului, gata sa fie citita si pusa in executie.
Dar bucla nu continea nici un test.
Revelatia am avut-o cand am obsevat ca bitul registrului, bitul care se afla intre adresa si codul de operare din instructiune era activ. Dar eu stiam ca Mel nu folosea niciodata registrul indexat lasandu-l intotdeauna zero!
Lumina aproape ca m-a orbit.
El pusese datele cu care lucra in partea superioara a memoriei -cele mai mari spatii pe care instructiunile le puteau adresa- astfel ca dupa accesarea ultimei informatii, aceasta devenea excesiva prin in crementare adresei de instructiuni. Cand era adaugat 1 la codul operatiei, acesta devenea codul urmatot din setul de instructiuni. Era deci vorba despre o instructiune ''jump''. Urmatoarea instructiune era la adresa zero si astfel programul îsi urma fericit drumul.

Eu nu mentinusem legatura cu Mel asa ca nu stiam daca el cunostea cursul schimbarilor care aveau loc in tehnicile de programare de cand el ne parasise.
Îmi place sa cred ca nu le cunostea

Indiferent de care era adevarul, impresionat de cele aflate pana atunci, am renuntat sa mai caut acel test nenorocit si i-am spus Marelui Boss ca nu l-am putut gasi. El nu s-a aratat surprins.

Cand am parasit eu compania, ''blackjack'' continua sa faca feste cand se apasa butonul care modifica sensul, iar eu credeam ca asa trebuie sa fie. Nu ma simtisem deloc in largul meu cand am cotrobäit prin codul unui Adevarat Programator.


Alte povestiri:
Butonul Magic >>>
Motorola contra Xerox >>>
Portretul Robot al Hackerului >>>