Skripti ya usafishaji iliyofanyiwa kazi kwenye jukwaa la uchapishaji la tovuti ilitambua vipande vya kodi kimakosa kama vigezo vya Liquid visivyo sahihi na kuviondoa katika kila makala vilivyokuwemo. Hitilafu hiyo iliacha makala nyingi za kiufundi bila kodi za mifano ambazo wasomaji wanategemea, jambo lililopelekea kufanywa kwa rollback ya haraka na kufikiria upya jinsi uhamiaji wa maudhui unavyofanyiwa majaribio.
Jinsi hitilafu ilivyopita bila kugundulika
Jukwaa hilo linatumia Liquid, lugha ya kutengeneza kiolezo (templating language) inayoweka lebo kwenye maudhui yanayobadilika kwa kutumia lebo kama {{ … }}. Kazi ya kawaida ya matengenezo ilikusudiwa kuondoa lebo zilizotangatanga ambazo zingeweza kuharibu uonyeshaji (rendering). Parser ya skripti hiyo ilitafuta lebo za kufungua ambazo hazikuwa na lebo za kufunga zinazoendana nazo, na ilipozipata, ilifuta vizuizi vyote ili "kurekebisha" hitilafu hiyo.
Katika utendaji wake, parser ilishindwa kutambua lebo za {% raw %} na {% endraw %} zinazozunguka vizuizi vya kodi. Lebo hizo zinaambia Liquid ichukulie kila kitu kilicho ndani yake kama maandishi halisi, lakini skripti hiyo yenye hitilafu ilichukulia {% raw %} ya kufungua kama kigezo kisichofungwa ({{% raw %}) na kuondoa kodi inayozunguka. Ujumbe wa hitilafu uliorekodiwa ulikuwa:
Liquid syntax error: Variable '{{% raw %}' was not properly terminated.
Kwa sababu skripti hiyo ilifanya kazi kwenye ghala la maudhui halisi (live content repository), uondoaji huo ulifanyika kwa wingi, ukifuta mifano ya kodi kutoka kwa makala zote zilizoathiriwa kwa mara moja.
Hatari iliyopo
Makala za kiufundi hutegemea vipande vya kodi ili kuelezea dhana, kurudia matokeo, na kuwaongoza wasomaji kupitia taratibu za hatua kwa hatua. Kupoteza vizuizi hivyo hufanya makala kuwa zisizo na manufaa kwa kiasi kikubwa, huwalazimisha waandishi kuandika upya maudhui, na kupunguza imani katika uaminifu wa jukwaa. Kwa tovuti inayojenga sifa yake kupitia nyaraka za watengenezaji (developer documentation) za hali ya juu, tukio hili linatishia idadi ya wasomaji na nia njema ya wachangiaji.
Maelezo ambayo wasomaji wengi wanayapuuza
- Uchakataji wa pamoja bila sandboxing – Skripti ilitekelezwa moja kwa moja kwenye data za uzalishaji (production data) badala ya nakala ya majaribio (staging copy).
- Usimamizi duni wa lebo – Ni sehemu ndogo tu ya lebo za Liquid ilizingatiwa;
{% raw %}ilikosekana kwenye orodha nyeupe (whitelist). - Ukosefu wa majaribio ya hatua kwa hatua – Kazi hiyo ilitekelezwa kwenye seti nzima ya data bila kufanya jaribio la awali (pilot run) kwenye sampuli ndogo.
Nini kingeweza kuzuia hili
- Fanya uhamiaji kwenye nakala – Tumia mabadiliko yoyote makubwa kwenye toleo la sandboxed la kanzidata kwanza.
- Fanya unit-test kwa parser dhidi ya aina zote za lebo – Jumuisha matukio ya kipekee (edge cases) kama vile vizuizi vya raw, lebo za maoni (comment tags), na miundo iliyojificha (nested structures).
- Utekelezaji wa hatua kwa hatua – Chukua idadi ndogo ya makala, thibitisha matokeo, kisha ongeza kiwango.
Upande wa pili
Baadhi wanahoji kuwa kufanya majaribio ya kila skripti kwenye nakala kamili (full backup) si jambo la kufaa kwa tovuti zinazokua kwa kasi, na kwamba hatari ya kupoteza data inazidi hitaji la marekebisho ya haraka. Ingawa kasi ni muhimu, gharama ya kufuta uondoaji wa pamoja – katika muda wa watengenezaji na uharibifu wa sifa – mara nyingi inazidi ucheleweshaji unaosababishwa na utekelezaji wa tahadhari.
Nini cha kufuatilia baadaye
Timu imerejesha kodi iliyopotea kutoka kwenye nakala za akiba (backups) na inafanyia marekebisho zana ya usafishaji ili kutambua miundo yote ya Liquid. Wanapanga kuchapisha uchambuzi wa baada ya tukio (post-mortem) unaoelezea mtiririko wa kazi wa majaribio uliosasishwa, na kushiriki skripti iliyorekebishwa hadharani ili wachapishaji wengine waepuke kosa lile lile. Tukio hili linatumika kama ukumbusho: hata hitilafu ndogo ya parser inaweza kufuta juhudi za wiki kadhaa za mwandishi, na kufanya majaribio makali kuwa jambo lisiloweza kujadiliwa.
