Programatorii Adevarati
Daca tot discutam subtilitati de teoria programarii masinilor numerice sub acoperirea unor intamplari absolut banale - acoperire care spre incantarea mea n-a impiedicat cititorii sa urmareasca firul discutiei - hai sa spunem doua vorbe despre Programatorii Adevarati. Si anume, repetand vorbele lui utastro!nather din 1983, pe care uite ca usenet-ul le-a pastrat pana-n zilele noastre. Deci :
-
Un articol recent devotat partii "macho" a programarii facea fara ezitare afirmatia trufasa ca "Programatorii Adevarati nu scriu in FORTRAN".
Poate ca astazi scriu,
in aceasta era decadenta
a berii light si calculatoarelor de mana si programelor "user-friendly"
dar in Zilele de Demult
pe cand cuvantul "software" suna ciudat
si Computerele Adevarate erau facute din role de memorie si tuburi de vid
Programatorii Adevarati scriau cod masina
Nu FORTRAN. Nu RATFOR. Nici macar asamblare.
Cod masina.
Brut, nedecorat, inscrutabil : numere hexadecimale.
Direct.
De teama ca o intreaga generatie de programatori
va creste in ignoranta fata de acest trecut glorios
simt ca-i de datoria mea sa descriu
asa cum pot, peste prapastia dintre generatii,
cum scrie cod un Programator Adevarat.
Il voi numi Mel,
pentru ca asa-l chema.
L-am intalnit prima oara pe Mel cand m-am angajat la Royal McBee Computer Corp.,
o subsidiara de-acum defuncta a producatorului de masini de batut.
Firma producea LGP-30,
un mic, ieftin (dupa standardele de-atunci)
computer cu memorie pe rola
Integratele costau prea mult
si oricum n-aveau nici un viitor
(De-asta n-ati auzit nici de companie
nici de computer)
Fusesem angajat sa scriu un compilator de FORTRAN
pentru aceasta minune a tehnicii, si Mel imi era ghidul in splendorile ei
Mel nu era de acord cu compilatoarele.
"Daca un program nu-si poate rescrie codul",
m-a intrebat, "la ce foloseste ?"
Mel scrisese,
in hex
cel mai popular program pe care-l avea compania
rula pe LGP-30
si juca blackjack cu eventualii clienti
la trade-show-uri
Efectul era intotdeauna dramatic
Standul LGP-30 era intotdeauna plin la fiecare show
si vanzatorii IBM stateau imprejur
povestind intre ei.
Daca asta chiar vindea computere
nu s-a discutat niciodata.
Sarcina lui Mel era sa rescrie
programul de blackjack pentru RPC-4000
(A porta ? Ce-i aia ?)
Acest computer nou avea o schema de adresare
unu-plus-unu,
in care fiecare instructiune masina
pe langa codul operatiei
si adresa operandului
avea inca o adresa care indica unde, pe rola in rotatie,
se gaseste noua instructiune.
In vorbele moderne,
fiecare instructiune era urmata de un GO TO!
Puneti asta in pipa Pascal-ului si fumati-o.
Mel iubea RPC-4000-ul
pentru ca putea sa-si optimizeze codul :
asta inseamna, sa localizeze instructiunile pe rola
asa incat pe masura ce una isi termina treaba,
urmatoarea tocmai ce ajungea la capul de citire
si putea fi executata imediat.
Exista un program care sa faca treaba asta,
un "assembler cu optimizare"
dar Mel refuza sa-l foloseasca.
"Nu stii niciodata unde va pune chestiile"
a explicat, "asa incat ai fi silit sa folosesti constante separate".
A trecut mult timp pan-am priceput ce vroia sa zica.
Deoarece Mel cunostea valoarea numerica
a fiecarei instructiuni
si isi aloca singur adresele
fiecare instructiune pe care-o scria putea de asemenea sa fie
o constanta numerica
Putea sa aghete o adunare anterioara, de exemplu
si sa inmulteasca cu ea
daca avea valoarea numerica corecta.
Codul scris de el nu era usor de modificat pentru altii.
Am comparat programele optimizate de mana lui Mel
cu aceleasi prelucrate de assembler-ul cu optimizare,
si programele lui Mel intotdeauna rulau mai repede.
Asta pentru ca design-ul de sus in jos nu fusese inventat inca
oricum Mel nu l-ar fi folosit.
Isi scria rutinele cele mai adanci intai,
asa incat sa le poata plasa cat mai convenabil
pe adresele optime de pe rola.
Optimizatorul nu era suficient de inteligent sa faca acelasi lucru.
Mel nu scria niciodata bucle de intarziere,
chiar si cand greoiul Flexowriter
necesita o pauza intre caracterele trimise pentru a functiona corect.
El pur si simplu localiza instructiunile pe rola
asa incat fiecare tocmai trecuse de capul de citire
cand ii venea randul ;
Rola trebuia atunci sa execute o revolutie completa
ca sa-si gaseasca instructiunea urmatoare.
A inventat un termen de neuitat pentru acest procedeu.
Desi "optim" e un superlativ absolut,
ca si "unic", devenise practica lingvistica comuna
sa fie tratat drept relativ :
"nu chiar optim" sau "mai putin optim"
sau "nu prea optim".
Mel numea localizarile cu intarziere maxima
"cel mai pessimum".
Dupa ce si-a terminat programul de blackjack
si l-a pornit
("Pana si initializatorul e optimizat"
a spus cu mandrie)
a primit o Cerere de Modificare din partea departamentului de vanzari.
Programul folosea un elegant (si optimizat)
generator de numere aleatoare
pentru a amesteca "cartile" si-a distribui mainile
iar unii dintre vanzatori erau de parere ca-i prea cinstit,
deoarece uneori clientii pierdeau.
Vroiau ca Mel sa modifice programul
asa fel incat la apasarea unui buton pe consola
sa poata modifica sansele si sa permita clientilor sa castige.
Mel s-a opus.
I se parea ca asa ceva e pur si simplu necinstit,
ceea ce era adevarat,
si ca aducea atingere integritatii lui personale, ca programator,
ceea ce era adevarat,
asa incat a refuzat sa faca modificarea.
Seful departamentului de vanzari a vorbit cu Mel,
asa cum a vorbit si Seful Mare, si, la rugamintea lui,
cativa alti Colegi Programatori.
In cele din urma Mel a cedat si-a modificat programul,
dar l-a nimerit pe dos,
asa incat, cand butonul era apasat,
programul trisa, castigand intotdeauna.
Mel a fost incantat de rezultat,
declarand ca subconstientul lui era in mod necontrolabil etic
si a refuzat cu hotarare sa repare problema.
Dupa ce Mel a parasit firma plecand spre pajisti mai inver$ite
Seful cel Mare m-a rugat sa ma uit la program,
si sa vad daca pot gasi testul sa-l inversez.
Oarecum ezitant, am fost de acord sa incerc.
A urmari codul lui Mel era o adevarata aventura.
De multe ori mi-a parut ca programarea calculatoarelor este o arta,
a carei adevarata frumusete poate fi apreciata
doar de un altul priceput in aceeasi arcana ;
exista nestemate stralucitoare si lovituri de maestru
ascunse de ochii si admiratia oamenilor, uneori pentru totdeauna,
de chiar natura procesului.
Poti afla multe despre un individ
doar citindu-i codul,
chiar si in hex.
Mel era, cred, un geniu necunoscut.
Probabil cel mai mare soc l-am suferit
cand am gasit o bucla inocenta care n-avea nici un test.
Nici un test. Nici unul.
Cel mai elementar bun simt indica c-ar fi trebuit sa ramana o bucla inchisa,
in care programul si-ar petrece, in cercuri, eternitatea, pentru totdeauna.
Executia curgea fara probleme prin ea totusi,
si iesea in siguranta de partea cealalta.
Mi-a luat doua saptamani sa ma prind.
RPC-4000-ul avea o facilitate cu adevarat moderna,
numita un registru index.
El permitea programatorului sa scrie o bucla
care folosea o instructiune indexata de-acolo;
de fiecare data,
numarul din registrul index
era adaugat adresei instructiunii,
asa incat referinta
trecea la urmatoarea data intr-o serie.
Tot ce-avea de facut era sa incrementeze registrul
de fiecare data.
Mel nu-l folosea niciodata.
In loc, incarca instructiunile intr-un registru masina
adauga unu la adresa
si-o salva la loc
Executa apoi instructiunea modificata
direct din registru.
Bucla era scrisa asa fel incat acest timp aditional de executie
era luat in considerare -
chiar pe cand instructiunea termina, urmatoarea era fix sub capul de citire
gata de executie.
Dar bucla n-avea nici un test in ea.
Am remarcat indiciul crucial cand am observat
ca bitul indexului registru
bitul care se afla intre adresa si codul masina in cuvantul-instructiune
era aprins -
si totusi, Mel nu folosea niciodata indexul registru,
lasandu-l mereu 0.
Cand s-a aprins lumina aproape ca m-a orbit.
Pozitionase datele pe care lucra
aproape de varful memoriei -
cele mai mari locatii pe care instructiunile le puteau adresa
asa incat, dupa ce ultima data era gestionata,
incrementarea adresei instructiunii
ducea la overflow.
Carry-bit-ul adauga unu la
instructiunea masina, transformand-o in urmatoarea din set :
un jump.
Asa cum v-ati astepta, urmatoarea instructiune era la adresa 0
si programul isi continuna fericit poteca.
N-am tinut legatura cu Mel,
si nu stiu daca a cedat sau nu deluviului de
schimbari care-au curs peste tehnicile de programare
din acele zile demult trecute si pana astazi.
Imi place sa cred ca n-a cedat.
In tot cazul,
am fost suficient de impresionat incat am renuntat la a cauta
testul in discutie
spunandu-i Sefului Mare ca nu l-am putut gasi.
N-a parut surprins.
Cand am parasit firma,
programul de blackjack inca trisa
daca-i apasai butonul de pe consola
si cred ca asa si trebuia sa fie.
Eu unul nu m-am simtit pregatit
sa hacui codul unui Programator Adevarat.
Friday, 2 July 2010
Nu suna la fel de bine in romana.
Friday, 2 July 2010
Pai si cine-i de vina ?
:p
Saturday, 3 July 2010
eminescu! cel mai mare haxor de limba romana. :D
Saturday, 3 July 2010
Lol
Saturday, 3 July 2010
Un programator bun si un basist bun...cele mai greu de gasit lucruri :D
Saturday, 3 July 2010
Si-un barbat educabil.
Saturday, 3 July 2010
Mai sus e vorba de versuri sau de folosirea necorespunzatoare a functiei copy/paste ?
Saturday, 3 July 2010
La origine a fost scris in paragrafe uzuale, insa pe masura ce a calatorit pe internete cineva i-a dat forma versificata. Traducerea respecta versiunea populara.
Saturday, 3 July 2010
by the way, "put that in your pipe and smoke it" ar veni "baga la capatana si las-o sa dea un clocot". Nu-mi prea dau seama cum s-ar putea translata sensul in jurul lui Pascal .. "Gandeste-te acum la Pascal si las-o (lasa ideea) sa dea un clocot"?
Saturday, 3 July 2010
@dAImon "So basically usenet hacked the story of Mel. We think this is somehow appropriate."
E mai dur de-atat, put X in your pipe and smoke it implica ca tragi cocaina la pipa de sticla, adica metaforic ca traiesti intr-un univers paralel, sau mai bine zis ortogonal realitatii. Am preferat sa traduc pedestru pentru ca orice vorbitor de engleza sa inteleaga de la ce referinta originala am pornit, avand in vedere ca limba romana, incantata cum este sa ingaduie oamenilor sa traiasca fara greturi in universuri ortogonale realitatii (vezi cazul Marian) nu detine o expresie de-aceeasi tarie.
Monday, 5 July 2010
Să înțelegem că programatorii care își neglijează latura umană/afectivă sunt contrafăcuți? :D
Monday, 5 July 2010
Asa sa intelegem!
Wednesday, 14 July 2010
Imi aduc si eu aminte ca primul meu contact cu computerul a fost cu unul pe cartele cu gauri, si cum se tineau cartelele in sertare, si cum un var de al meu care lucra in asa ceva imi citea cartoanele uitanduse la ele, eu nu intelegeam nicmi, nu vedeam decat niste gauri puse haotic pe niste hartii, ei bine eram si un pusti pe atunci.
Primul meu computer a fosit un HP2000 si am facut cateva programe atunci in basic si nu imi mergea si tot acel amic mi-a facut el un moc program care nu facea mult, facea cateva calcule si muta o minge pe ecran in cod masina, mi sa parut ca e un geniu nebun care nu inteleg cumpoate tine minte asa ceva.
Si anul trecut am avut o experienta cu cineva care mi-a programat casa de marcat de la firma direct in cod masina, zicea ca dureaza mai putin ca a ainvatat toate comenzile in cof masina si pe calea celalata prin care o conecta la PC puteau aparea de multe ori erori, eu nu inteleg cum aparea erori mai putin, eu unul care gresesc mereu cate un caracter
Wednesday, 14 July 2010
Pai ai fi bun de chirurg :D
Saturday, 13 August 2011
Fain, dar la capitolul mentenanță lasă de dorit :-)
Saturday, 13 August 2011
Mentenanta ? Ce e aia ?
Un program bine facut e bine facut. Pentru totdeauna. Restul nu merita rulate.
Saturday, 13 August 2011
lol mirshea comunistul
Saturday, 13 August 2011
Acum e cu Agile, chestii de-astea. In mediul asta, cam cel mai important lucru e sa poti modifica aplicatia cat mai rapid si cat mai sigur. In ultimii 10 ani la asta s-a lucrat la capitolul software engineering.