Joel on Software

Joel on Software   Joel og hugbúnaður

 

Aðrar "Joel on Software" greinar á íslensku

Aðrar "Joel on Software" greinar á ensku

Sendið höfundi tölvupóst (aðeins á ensku)

 

Lögmálið um lekar yfirhylmingar


Eftir Joel Spolsky
Þýtt af Kári Harðarson
Próflesið af Villi Helgason
11.11.2002

Það eru ákveðnir galdrar við hönnun internetsins sem þú notar daglega.  Þeir eiga sér stað í TCP stakknum sem er einn af hornsteinunum netsins.

TCP er aðferð við að senda gögn á skilvirkan hátt.  Með þessu á ég við:  Ef þú sendir boð um net með TCP munu boðin berast á áfangastað án þess að skaddast eða brenglast.

Við notum TCP í flest allt á vefnum, t.d. að ná í vefsíður og senda tölvupóst.  Áreiðanleiki TCP er ástæðan fyrir því að allur þessi spennandi tölvupóstur frá glæpalýð í Austur-Afríku berst á leiðarenda eins og nýsleginn túskildingur.  En æðislegt.

Til samanburðar, þá er til önnur aðferð við að senda gögn sem heitir IP og er óskilvirk.  Enginn lofar að gögnin berist og þau gætu skaddast áður en þau berast.  Ef þú sendir fullt af boðum með IP þarftu ekki að undrast yfir að aðeins helmingurinn berst alla leið og í annari röð en hann var sendur, og að sumum boðanna hafi verið skipt út fyrir önnur boð, t.d. myndir af gasalega sætum órangútönum eða þá bara helv. drasli sem lítur út eins og efni bréfs frá Taiwan.

Hér er galdrahlutinn:  TCP hvílir ofaná IP.  Með öðrum orðum, TCP er gert að senda gögn á skilvirkan hátt með því að nota óskilvirkar gagnasendingar.

Til að útskýra hvers vegna þetta eru galdrar, vil ég að þú íhugir eftirfarand dæmisögu úr daglega lífinu sem er um margt sambærileg þótt hún sé reyndar út í hött.

Ímyndaðu þér að við hefðum aðferð við að senda leikara frá Broadway til Hollywood sem gengi út á að troða þeim í bíla og keyra þá þvert yfir Bandaríkin.  Sumir bílanna lenda í árekstri og leikara greyin drepast.  Stundum verða leikararnir fullir á leiðinni, krúnuraka sig og fá sér tattóveringu á nasirnar, og verða of ljótir til að vinna í Hollywood, og þeir berast ekki í réttri röð til Hollywood af því þeir velja mismunandi leiðir til að komast á áfangastað. Ímyndaðu þér nú nýtt þjónustufyrirtæki sem heitir Hollywood Express.  Þar lofa menn að afhenda leikara í Hollywood og ennfremur að þeir a) berist b) í réttri röð og c) í góðu ásigkomulagi.  Galdrarnir felast í því að nýja fyrirtækið hefur enga leið til að efna loforðið aðra en að senda leikarana í bílum þvert yfir landið eins og áður.  Fyrirtækið athugar hvort hver og einn leikari berist, ef hann gerir það ekki hringir það í aðalstöðvarnar og biður um að tvífari leikarans verði sendur í staðinn.  Ef leikararnir berast í vitlausri röð sér fyrirtækið um að raða leikurunum á áfangastað.  Ef fljúgandi furðuhlutur á leið inná Svæði 51 brotlendir á hraðbraut í Nevada og gerir hana allsendis ófæra eru allir leikarar á þeirri leið sendir um Arizona og fyrirtækið segir ekki einu sinni kvikmyndaleikstjórunum í Hollywood frá því sem gerðist.  Það eina sem þeir sjá eru leikarar sem mæta stopulla en venjulega og þeir frétta ekki einu sinni af brotlendingunnni.

Þetta eru galdrarnir við TCP í hnotskurn.  Þetta er það sem tölvufræðingar kalla yfirhylming(abstraction):  einföldun á einhverju miklu flóknara sem á sér stað bak við tjöldin.  Reyndin er sú að megnið af tölvuforritun snýst um að byggja upp lög af yfirhylmingum.  Hvað er strengja-library?  Það er aðferð við að láta eins og að tölvur geti meðhöndlað textastrengi jafnauðveldlega og tölur.  Hvað er skráakerfi?  Það er aðferð við að láta eins og að harði diskurinn sé ekki bara bunki af málmplötum sem þeytast í hringi og geta geymt bita á ákveðnum stöðum, heldur skipulagt kerfi af möppum innan í möppum sem innihalda skrár sem innihalda gagnaskrár.

Vikjum aftur að TCP.  Áðan sagði ég ykkur smá hvíta lygi sem pirrar sum ykkar kannski af því hún er mjög pirrandi.  Ég sagði að TCP ábyrgðist að boðin bærust á áfangastað.  TCP gerir það reyndar ekki.  Ef gælusnákurinn ykkar nagaði sig í gegnum netsnúruna í tölvuna ykkar og IP pakkar geta ekki borist, þá getur TCP ekkert við því gert og boðin hætta að berast.  Ef þú móðgar kerfisstjórann og hann refsar þér með því að tengja tölvuna þína við elsta höbbinn í húsinu munu aðeins sumir pakkar berast, TCP er í lagi en netið óþolandi hægvirkt.

Þetta er það sem ég kalla leka yfirhylmingu.  TCP reynir að yfirhylma óáreiðanleika netsins en stundum lekur netið í gegnum yfirhylminguna og þú byrjar að finna fyrir hlutunum sem yfirhylmingin getur ekki verndað þig fyrir.  Þetta er bara eitt dæmi um lögmál sem ég hef kallað Lögmál hinna leku yfirhylminga.

Allar alvöru yfirhylmingar leka að einhverju leyti.

Yfirhylmingar bregðast.  Stundum svolítið, stundum mikið.  Það er alltaf leki.  Hlutir fara úrskeiðis.  Þetta gerist útum allt þar sem yfirhylmingar eru í gangi.  Hér eru nokkur dæmi.

  • Jafn einföld aðgerð og að lesa sig í gegnum tvívítt fylki getur verið mjög mis fljótleg eftir því hvort þú lest þvert í gegnum fylkið eða langsum, eftir því hvernig "gárurnar liggja í viðnum" -- önnur lestrarleiðin gæti valdið miklu fleiri Page Fault villum en hin leiðin og Page Fault kostar mjög mikinn tíma.  Jafnvel á neðsta planinu kemur þetta fyrir, smalamálsforritarar eiga að geta látið eins og þeir hafi ótakmarkað minni, en sýndarminni er bara yfirhylming, sem lekur ef Page Fault villa á sér stað og einn lestur úr minni kostar því þúsundfalt meira en annar lestur.
  • SQL málið á að hylma yfir öll skrefin sem þarf til að lesa úr gagnagrunni og leyfa þér að skilgreina bara hvað gögn þú þarft og láta svo SQL finna bestu leiðina við að ná í gögnin.   Samt sem áður eru sumar SQL fyrirspurnir þúsundfalt hægari en aðrar sem ná í sömu gögnin.  Frægt dæmi um þetta er að sumir SQL þjónar eru miklu fljótari ef þú skrifar yrðinguna "where a=b and b=c and a=c" í stað yrðingarinnar "where a=b and b=c" jafnvel þó niðurstaðan verði sú sama.  Þú átt ekki að þurfa að hafa áhyggjur af þessu.  En stundum lekur yfirhylmingin og veldur hryllilegri frammistöðu og þú þarft að fara inn í Query Analyser og reyna að skilja hvað það er sem SQL gerir vitlaust og hvað þú getur gert til að hjálpa.
  • Þó að netlibrary eins og NFS og SMB leyfi þér að láta eins og skrár á öðrum tölvum séu í raun á þinni tölvu , þá verður netsambandið stundum hægt eða þá það bregst og skráin hættir að láta eins og hún sé á þinni tölvu og forritarar þurfa þá að skrifa kóða sem bregst við þessu.  Yfirhylmingin "skrá á annari vél er eins og skrá á þinni vél" lekur.  Hér er mjög týpískt dæmi fyrir Unix kerfisstjóra.  Ef þú setur heimadrif notenda á diska sem eru mountaðir í NFS (ein yfirhylming) og notendurnir búa til .forward skrár til að áframsenda póstinn sinn (önnur yfirhylming) og NFS þjónninn fer niður á meðan nýr póstur berst þá áframsendist pósturinn ekki af því .forward skráin finnst ekki.  Lekinn í yfirhylmingunni veldur því að póstur glatast.
  • C++ strengjaklassar eiga að leyfa þér að láta eins og að strengir séu C++ fyrsta flokks gögn.  Þeir reyna að yfirhylma þá staðreynd að strengir eru erfiðir og leyfa þér að láta eins og þeir séu jafnauðveldir og heilar tölur.  Næstum allir strengjaklassar skilgreina "+" aðgerðina svo þú getur skrifað s+"bar" til að skeyta saman strengi.  En veistu hvað?  Alveg sama hversu mikið er reynt þá er enginn strengjaklassi sem leyfir þér að skrifa "foo" + "bar", af því strengjafastar í C++ eru alltaf af gerðinni char*, aldrei strengir.  Yfirhylmingin lekur og forritunarmálið leyfir þér ekki einu sinni að gera við lekann.  (Reyndar helgast saga C++ af tilraunum til að gera við einmitt þennan leka.  Hvers vegna þeir gátu ekki bara sett strengjatýpu í málið sjálft skil ég ekki í augnablikinu).
  • Þú getur ekki keyrt eins hratt í rigningu, jafnvel þótt bíllinn sé með vinnukonur og ljós og þak og miðstöð sem eiga að vernda þig frá rigningunni (yfirhylming yfir veðrið) því þú þarft að passa þig á að skauta ekki á vatninu (Hydroplaning) og stundum er rigningin svo mikil að þú sérð ekki svo þú verður að hægja á þér.  Veðrið lætur ekki yfirhylma sig.

Ein leiðinleg afleiðing af lögmálinu um lekar yfirhylmingar er að þær einfalda lífið ekki eins mikið og við hefðum viljað.  Þegar ég kenni einhverjum C++ þá væri mjög þægilegt ef ég þyrfti ekki að kenna þeim neitt um char* og bendla.  Það væri best að kenna bara STL strengi.  En einn daginn mun viðkomandi skrifa "foo"+"bar" og undarlegir hlutir byrja að gerast og þá þarf ég hvort sem er að stanza og kenna viðkomandi á char* þrátt fyrir allt.  Eða þá, hann reynir að kalla í Windows API rútínu sem skilar OUT LPTSTR týpu og getur ekki skilið hvernig á að nota hana fyrr en hann lærir  á char* og bendla og Unicode og whcar_t og TCHAR header skrár, og allt þetta drasl sem lekur upp á yfirborðið.

Þegar ég kenni COM forritun, væri þá ekki frábært ef ég gæti bara sýnt þeim hvernig á að nota "Wizards" í Visual Studio og  alla fídusana sem búa sjálfkrafa til kóda, en ef eitthvað klikkar í því ferli munu þeir ekki hafa hugmynd um hvað gerðist eða hvernig á að leita að villunni og laga hana.  Ég þarf því að kenna þeim allt um IUnknown og CLSIDs og ProgIDS og .. ó pína !

Þegar ég kenni á ASP.NET forritun væri gott ef ég gæti bara sagt að ef þeir tvísmella á hluti og skrifa svo kóda sem keyrir á miðlaranum þegar notandinn smellir á þessa sömu hluti.   ASP.NET yfirhylmir einmitt muninn á að meðhöndla músarsmell á hlekk (<a href>... )og músarsmell á takka.  Þetta er gert með því að búa til nokkrar línur í JavaScript og tengja með On Click handler við hlekkinn.  Yfirhylmingin lekur samt sem áður.  Ef notandinn slekkur á JavaScript mun forritið ekki virka og ef forritarinn veit ekki hvað ASP.NET var að gera bak við tjöldin getur hann ekki einu sinni byrjað að leita að villunni.

Lögmál hinna leku yfirhylminga þýðir að þegar einhver finnur upp á rosa flottu verkfæri sem býr til kóda sem á að gera forritara svo afkastamikla heyrir maður fók segja: "lærðu að gera þetta í höndunum fyrst, svo getur þú notað verkfærið til að spara tíma".  Verkfæri sem búa til kóda eru lek eins og allar aðrar yfirhylmingar og eina leiðin til að bregðast við því er að skilja hvað er á bak við yfirhylminguna.  Yfirhylmingarnar spara tíma en hlífa okkur ekki við lærdómnum.

Mótsögnin í þessu öllu er, að þótt við fáum betri og betri forritunarverkfæri með betri og betri yfirhylmingum hefur aldrei verið erfiðara að vera góður forritari.

Þegar ég vann fyrst hjá Microsoft skrifaði ég strengja-library fyrir Macintosh.  Dæmigert verkefni hjá mér þá:  Skrifaðu strcat rútínu sem skilar bendli á endann á nýja strengnum.  Nokkrar línur í C.  Allt sem ég þurfti var K&R C handbókin -- ein þunn bók um C forritunar málið.

Til að vinna við forritun á CityDesk í dag, þarf ég að kunna Visual Basic, COM, ATL, C++, InnoSetup, innviði Internet Explorer, Reglubundnar segðir (Regular Expressions), DOM, HTML, CSS, og  XML.  Þessi verkfæri eru öll á háu plani samanborið við K & R dótið, en ég þarf samt að kunna K & R dótið annars lendi ég í klúðri.

Fyrir tíu árum héldum við að nýjar forritunaraðferðir hefðu gert okkur lífið léttara í dag.  Reyndar hafa yfirhylmingarnar sem við höfum skapað í gegnum árin leyft okkur að höndla miklu meira flækjustig í forritun sem við þurftum ekki að eiga við og gátum reyndar ekki átt við fyrir tíu til fimmtán árum eins og t.d.  GUI forritun og netforritun.  Og þrátt fyrir að verkfæri eins og hlutbundin forritun geri okkur kleift að koma miklu í verk á skömmum tíma, þá þurfum við einn daginn að finna hvar yfirhylming lekur og þá tekur það tvær vikur.  Og þegar þú  ræður mann til að forrita í VisualBasic, þá dugir ekki að ráða VisualBasic forritara því hann á eftir að lenda í klandri í hvert skipti sem VisualBasic yfirhylmingin bregst honum.

Lögmál hinna leku yfirhylmingu er dragbítur.



Greinin birtist upphaflega á ensku undir heitinu The Law of Leaky Abstractions  

Joel Spolsky er stofnandi Fog Creek Software sem er lítið hugbúnaðarfyrirtæki staðsett í New York. Hann útskrifaðist frá Yale háskóla og hefur unnið fyrir sér sem forritari og verkstjóri hjá fyrirtækjunum Microsoft, Viacom og Juno.


Þessar blaðsíður geyma skoðanir einnar manneskju.
© Öll réttindi á textanum áskilin Joel Spolsky 1999-2005.

FogBUGZ | CityDesk | Fog Creek Software | Joel Spolsky