Koodi korduvkasutatavus vs juhuslik tavalisus

Üks bitimaid, konsensuskriitilisi vigu (CVE-2018–17144) on hiljuti avastatud tarkvaras Bitcoin Core, millel enne seda oli olnud peaaegu puutumatu ajalugu. Jimmy Song on sellest veast suurepärase jaotuse kirjutanud.

Vea lühikokkuvõte on 4 juhtumit, kus tarkvara Bitcoin Core peab kontrollima topeltkulude üle. Kõigil 4 juhtumil oli algselt sama koodi täitmise voog. Pärast koodi peent kordamist mitme aasta jooksul läks üks neljast juhtumist (“ühekordne tx-topelt-kuluta-in-a-plokis”) vahele, mis võimaldaks kaevuril potentsiaalselt mõnd sõlme petta blokeerida nõustuda mis suurendab Bitcoini pakkumist.

Selle vea olemus tuletab mulle meelde pidevat konflikti järgmiste vahel:

a) koodi korduvkasutatavuse ja optimeerimise vajadus

b) kukkumisoht, mida ma nimetan juhuslikuks tavalisuseks: asjad, mis on sarnased mitte konstruktsiooni, vaid juhuslikkuse tõttu

Juhuslik tavalisus loob viljaka pinnase õudusunenägude ja võimalike vigade, näiteks CVE-2018–17144, reflekteerimiseks.

Juhuslik tavalisus

Mõni taust, kui te pole tarkvaratehnikaga tuttav:
 
Tarkvaras on see suur nägemus, et tarkvara komponendid on ideaalselt modulaarsed - sarnaselt nende füüsikalise tehnika kolleegidega. Mõjuval põhjusel ei pea te igal pool kaasas kandma teist tüüpi laadijat või USB-juhet.

Nii et koodide korduvkasutatavus on alati olnud tugev. Liigse koodi kirjutamine on sageli pahaks tehtud. Miks teha sama tööd kaks korda, kui saate seda teha üks kord?

Tarkvaras on leiutatud ka pikaajaline ajalugu, mis annab koodide taaskasutatavusele prioriteetide loendis veelgi kõrgema prioriteedi. Koodi korduvkasutatavust peetakse sageli üheks valdkonna parimateks tavadeks. Kandideeriv noorem tarkvaraarendaja võib kalduda arvama, et koodi korduvkasutatavus on null.

Koodide äärmuslik korduvkasutatavus on aga varjatud oht - ja ma ei usu, et seda kraami koolides kunagi õigesti õpetatakse -.

Äärmuslik taaskasutatavus tähendab mis tahes kahe sarnase väljanägemisega kooditüki kokkulangemist üheks, sõltumata nende kasutusjuhtudest ja algsest kavatsusest.

Mis paljudel kordadel lõppeb koodiga, millel on juhuslik ühilduvus.

Võib-olla pole ilmne, miks juhuslik tavalisus halb on, kuid selleks, et aru saada, miks on vaja pikka aega säilitada piisavalt suurt tarkvaraprojekti.

See on halb, sest tootenõuded muutuvad ja tarkvara on pidevalt arenev, mitte kunagi päris valmis toode.

See pidevalt liikuv sihtmärgi probleem on tarkvara jaoks üsna ainulaadne. Kui olete ehitusinsener, ei peaks teid maja muutma 20-korruseliseks kõrghooneks või autot lendavaks taldrikuks. Kuid tarkvara abil teeme seda pidevalt.

Kui tootenõuded ja kasutusjuhud muutuvad, ei pruugi põhieeldused, mille jaoks tarkvara algselt kirjutati, enam kohaldatavad.

Nii et see uhke ühiskoodi tükk, mille ümber kujundasite (kuid olete nüüd täiesti unustanud), ei tööta enam nii, nagu arvate.

Olen kaotanud arvu, kui palju valusaid refrakteerimisprojekte või vastikaid vigu olen näinud enneaegse optimeerimise või juhusliku tavapärasuse otseseks tagajärjeks - kuni punktini, kus ma nüüd väldin selliseid asju nagu pärand nagu katk.

Juhusliku sarnasusega asjad paljastavad kiiresti nende erinevused, kui nad arenevad algsest olekust välja. Mis tahes jäikus koodide ühilduvuses oleks siis tohutu laius, millest vabaneda.

Mida rohkem on juhusliku tavapärasuse kihte koodis, seda enam on miiniväljal navigeerida. CVE-2018–17144 on selle suurepärane näide.