ਸਾਈਟ ਦੇ ਪਬਲਿਸ਼ਿੰਗ ਪਲੇਟਫਾਰਮ 'ਤੇ ਚਲਾਈ ਗਈ ਇੱਕ ਕਲੀਨਅੱਪ ਸਕ੍ਰਿਪਟ ਨੇ ਗਲਤੀ ਨਾਲ ਕੋਡ ਸਨੀਪੇਟਸ (code snippets) ਨੂੰ ਗਲਤ Liquid ਵੇਰੀਏਬਲ ਸਮਝ ਲਿਆ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਹਰ ਉਸ ਆਰਟੀਕਲ ਵਿੱਚੋਂ ਹਟਾ ਦਿੱਤਾ ਜਿਸ ਵਿੱਚ ਉਹ ਮੌਜੂਦ ਸਨ। ਇਸ ਖਰਾਬੀ ਕਾਰਨ ਦਰਜਨਾਂ ਤਕਨੀਕੀ ਪੋਸਟਾਂ ਉਹਨਾਂ ਉਦਾਹਰਣ ਕੋਡਾਂ ਤੋਂ ਬਿਨਾਂ ਰਹਿ ਗਈਆਂ ਜਿਨ੍ਹਾਂ 'ਤੇ ਪਾਠਕ ਨਿਰਭਰ ਕਰਦੇ ਹਨ, ਜਿਸ ਕਾਰਨ ਤੁਰੰਤ ਰੋਲਬੈਕ (rollback) ਕਰਨ ਅਤੇ ਕੰਟੈਂਟ ਮਾਈਗ੍ਰੇਸ਼ਨ ਦੀ ਟੈਸਟਿੰਗ ਦੇ ਤਰੀਕੇ ਬਾਰੇ ਮੁੜ ਵਿਚਾਰ ਕਰਨ ਦੀ ਲੋੜ ਪਈ।

ਇਹ ਬੱਗ (bug) ਕਿਵੇਂ ਹੋਇਆ

ਇਹ ਪਲੇਟਫਾਰਮ Liquid ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ ਇੱਕ ਟੈਂਪਲੇਟਿੰਗ ਭਾਸ਼ਾ ਹੈ ਜੋ {{ … }} ਵਰਗੇ ਟੈਗਸ ਨਾਲ ਡਾਇਨਾਮਿਕ ਕੰਟੈਂਟ ਨੂੰ ਮਾਰਕ ਕਰਦੀ ਹੈ। ਇੱਕ ਰੁਟੀਨ ਮੇਨਟੇਨੈਂਸ ਕੰਮ ਦਾ ਉਦੇਸ਼ ਉਹਨਾਂ ਫਾਲਤੂ ਟੈਗਸ ਨੂੰ ਹਟਾਉਣਾ ਸੀ ਜੋ ਰੈਂਡਰਿੰਗ (rendering) ਨੂੰ ਖਰਾਬ ਕਰ ਸਕਦੇ ਸਨ। ਸਕ੍ਰਿਪਟ ਦੇ ਪਾਰਸਰ (parser) ਨੇ ਅਜਿਹੇ ਓਪਨਿੰਗ ਟੈਗਸ ਦੀ ਭਾਲ ਕੀਤੀ ਜਿਨ੍ਹਾਂ ਦੇ ਨਾਲ ਕੋਈ ਮੈਚਿੰਗ ਕਲੋਜ਼ਿੰਗ ਟੈਗ ਨਹੀਂ ਸੀ, ਅਤੇ ਜਦੋਂ ਉਸਨੂੰ ਅਜਿਹਾ ਕੋਈ ਟੈਗ ਮਿਲਿਆ, ਤਾਂ ਉਸਨੇ ਗਲਤੀ ਨੂੰ "ਠੀਕ" ਕਰਨ ਲਈ ਪੂਰੇ ਬਲਾਕ ਨੂੰ ਹੀ ਡਿਲੀਟ ਕਰ ਦਿੱਤਾ।

ਅਸਲ ਵਿੱਚ, ਪਾਰਸਰ {% raw %} ਅਤੇ {% endraw %} ਟੈਗਸ ਨੂੰ ਪਛਾਣਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ ਜੋ ਕੋਡ ਬਲਾਕਸ ਨੂੰ ਘੇਰਦੇ ਹਨ। ਉਹ ਟੈਗਸ Liquid ਨੂੰ ਇਹ ਦੱਸਦੇ ਹਨ ਕਿ ਅੰਦਰਲੀ ਹਰ ਚੀਜ਼ ਨੂੰ ਲਿਟਰਲ ਟੈਕਸਟ (literal text) ਵਜੋਂ ਲਿਆ ਜਾਵੇ, ਪਰ ਖਰਾਬ ਸਕ੍ਰਿਪਟ ਨੇ ਓਪਨਿੰਗ {% raw %} ਨੂੰ ਇੱਕ ਅਣਖੁੱਲ੍ਹੇ ਵੇਰੀਏਬਲ ({{% raw %}) ਵਜੋਂ ਲਿਆ ਅਤੇ ਆਲੇ-ਦੁਆਲੇ ਦੇ ਕੋਡ ਨੂੰ ਹਟਾ ਦਿੱਤਾ। ਲੌਗ ਕੀਤਾ ਗਿਆ ਐਰਰ ਮੈਸੇਜ ਸੀ:

Liquid syntax error: Variable '{{% raw %}' was not properly terminated.

ਕਿਉਂਕਿ ਸਕ੍ਰਿਪਟ ਲਾਈਵ ਕੰਟੈਂਟ ਰਿਪੋਜ਼ਟਰੀ 'ਤੇ ਚੱਲ ਰਹੀ ਸੀ, ਇਸ ਲਈ ਇਹ ਡਿਲੀਸ਼ਨ ਵੱਡੇ ਪੱਧਰ 'ਤੇ ਹੋਈ, ਜਿਸ ਨਾਲ ਇੱਕੋ ਵਾਰ ਵਿੱਚ ਸਾਰੇ ਪ੍ਰਭਾਵਿਤ ਆਰਟੀਕਲਜ਼ ਵਿੱਚੋਂ ਕੋਡ ਉਦਾਹਰਣਾਂ ਮਿਟ ਗਈਆਂ।

ਕੀ ਖਤਰੇ ਵਿੱਚ ਹੈ

ਤਕਨੀਕੀ ਆਰਟੀਕਲ ਸੰਕਲਪਾਂ ਨੂੰ ਸਮਝਾਉਣ, ਨਤੀਜਿਆਂ ਨੂੰ ਦੁਹਰਾਉਣ ਅਤੇ ਪਾਠਕਾਂ ਨੂੰ ਕਦਮ-ਦਰ-ਕਦਮ ਪ੍ਰਕਿਰਿਆਵਾਂ ਰਾਹੀਂ ਮਾਰਗਦਰਸ਼ਨ ਕਰਨ ਲਈ ਕੋਡ ਸਨੀਪੇਟਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ। ਉਹਨਾਂ ਬਲਾਕਾਂ ਦੇ ਗੁੰਮ ਹੋਣ ਨਾਲ ਪੋਸਟਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ ਬੇਕਾਰ ਹੋ ਜਾਂਦੀਆਂ ਹਨ, ਲੇਖਕਾਂ ਨੂੰ ਕੰਟੈਂਟ ਦੁਬਾਰਾ ਲਿਖਣ ਲਈ ਮਜਬੂਰ ਕਰਨਾ ਪੈਂਦਾ ਹੈ, ਅਤੇ ਪਲੇਟਫਾਰਮ ਦੀ ਭਰੋਸੇਯੋਗਤਾ ਵਿੱਚ ਵਿਸ਼ਵਾਸ ਘਟਦਾ ਹੈ। ਇੱਕ ਅਜਿਹੀ ਸਾਈਟ ਲਈ ਜੋ ਉੱਚ-ਗੁਣਵੱਤਾ ਵਾਲੀ ਡਿਵੈਲਪਰ ਡਾਕੂਮੈਂਟੇਸ਼ਨ 'ਤੇ ਆਪਣੀ ਸਾਖ ਬਣਾਉਂਦੀ ਹੈ, ਇਹ ਘਟਨਾ ਪਾਠਕਾਂ ਦੀ ਗਿਣਤੀ ਅਤੇ ਯੋਗਦਾਨ ਪਾਉਣ ਵਾਲਿਆਂ ਦੇ ਭਰੋਸੇ, ਦੋਵਾਂ ਲਈ ਖਤਰਾ ਹੈ।

ਉਹ ਵੇਰਵੇ ਜੋ ਜ਼ਿਆਦਾਤਰ ਪਾਠਕ ਮਿਸ ਕਰਦੇ ਹਨ

  • ਸੈਂਡਬਾਕਸਿੰਗ (sandboxing) ਤੋਂ ਬਿਨਾਂ ਬੈਚ ਪ੍ਰੋਸੈਸਿੰਗ – ਸਕ੍ਰਿਪਟ ਨੂੰ ਸਟੇਜਿੰਗ ਕਾਪੀ ਦੀ ਬਜਾਏ ਸਿੱਧਾ ਪ੍ਰੋਡਕਸ਼ਨ ਡੇਟਾ 'ਤੇ ਚਲਾਇਆ ਗਿਆ ਸੀ।
  • ਨਾਕਾਫ਼ੀ ਟੈਗ ਹੈਂਡਲਿੰਗ – ਸਿਰਫ਼ Liquid ਟੈਗਸ ਦੇ ਇੱਕ ਹਿੱਸੇ ਨੂੰ ਹੀ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਸੀ; {% raw %} ਨੂੰ ਵ੍ਹਾਈਟਲਿਸਟ (whitelist) ਵਿੱਚੋਂ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਸੀ।
  • ਇਨਕਰੀਮੈਂਟਲ ਟੈਸਟਿੰਗ ਦੀ ਘਾਟ – ਕੰਮ ਨੂੰ ਛੋਟੇ ਸੈਂਪਲ 'ਤੇ ਪਾਇਲਟ ਰਨ ਕੀਤੇ ਬਿਨਾਂ ਪੂਰੇ ਡੇਟਾਸੈਟ 'ਤੇ ਲਾਗੂ ਕਰ ਦਿੱਤਾ ਗਿਆ ਸੀ।

ਇਸ ਨੂੰ ਕੀ ਰੋਕ ਸਕਦਾ ਸੀ

  • ਕਾਪੀ 'ਤੇ ਮਾਈਗ੍ਰੇਸ਼ਨ ਚਲਾਓ – ਕਿਸੇ ਵੀ ਬਲਕ ਟ੍ਰਾਂਸਫਾਰਮੇਸ਼ਨ ਨੂੰ ਪਹਿਲਾਂ ਡੇਟਾਬੇਸ ਦੇ ਸੈਂਡਬਾਕਸਡ (sandboxed) ਵਰਜ਼ਨ 'ਤੇ ਲਾਗੂ ਕਰੋ।
  • ਸਾਰੇ ਟੈਗ ਵੇਰੀਏਸ਼ਨਾਂ ਦੇ ਵਿਰੁੱਧ ਪਾਰਸਰਾਂ ਦਾ ਯੂਨਿਟ-ਟੈਸਟ ਕਰੋ – ਰੋਅ ਬਲਾਕਸ (raw blocks), ਕਮੈਂਟ ਟੈਗਸ ਅਤੇ ਨੇਸਟਡ (nested) ਢਾਂਚੇ ਵਰਗੇ ਐਜ ਕੇਸਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ।
  • ਹੌਲੀ-ਹੌਲੀ ਲਾਗੂ ਕਰਨਾ (Gradual rollout) – ਸੀਮਤ ਗਿਣਤੀ ਵਿੱਚ ਆਰਟੀਕਲਸ ਨੂੰ ਪ੍ਰੋਸੈਸ ਕਰੋ, ਨਤੀਜਿਆਂ ਦੀ ਜਾਂਚ ਕਰੋ, ਫਿਰ ਇਸ ਦਾ ਪੈਮਾਨਾ ਵਧਾਓ।

ਵਿਰੋਧੀ ਵਿਚਾਰ

ਕੁਝ ਲੋਕਾਂ ਦਾ ਤਰਕ ਹੈ ਕਿ ਤੇਜ਼ੀ ਨਾਲ ਚੱਲਣ ਵਾਲੀਆਂ ਸਾਈਟਾਂ ਲਈ ਪੂਰੇ ਬੈਕਅੱਪ 'ਤੇ ਹਰ ਸਕ੍ਰਿਪਟ ਦੀ ਟੈਸਟਿੰਗ ਕਰਨਾ ਅਵਿਵਹਾਰਕ ਹੈ, ਅਤੇ ਡੇਟਾ ਗੁੰਮ ਹੋਣ ਦਾ ਖਤਰਾ ਤੇਜ਼ੀ ਨਾਲ ਸੁਧਾਰ ਕਰਨ ਦੀ ਲੋੜ ਦੇ ਸਾਹਮਣੇ ਛੋਟਾ ਹੈ। ਹਾਲਾਂਕਿ ਗਤੀ ਮਹੱਤਵਪੂਰਨ ਹੈ, ਪਰ ਵੱਡੇ ਪੱਧਰ 'ਤੇ ਡਿਲੀਸ਼ਨ ਨੂੰ ਉਲਟਾਉਣ ਦੀ ਕੀਮਤ – ਡਿਵੈਲਪਰ ਦੇ ਸਮੇਂ ਅਤੇ ਸਾਖ ਦੇ ਨੁਕਸਾਨ, ਦੋਵਾਂ ਦੇ ਰੂਪ ਵਿੱਚ – ਅਕਸਰ ਸਾਵਧਾਨੀ ਨਾਲ ਲਾਗੂ ਕੀਤੇ ਗਏ ਰੋਲਆਊਟ ਦੁਆਰਾ ਹੋਣ ਵਾਲੀ ਦੇਰੀ ਨਾਲੋਂ ਵੱਧ ਹੁੰਦੀ ਹੈ।

ਅੱਗੇ ਕੀ ਦੇਖਣਾ ਹੈ

ਟੀਮ ਨੇ ਬੈਕਅੱਪ ਤੋਂ ਗੁੰਮ ਹੋਏ ਕੋਡ ਨੂੰ ਬਹਾਲ ਕਰ ਦਿੱਤਾ ਹੈ ਅਤੇ ਸਾਰੇ Liquid ਕੰਸਟਰਕਟਸ (constructs) ਨੂੰ ਪਛਾਣਨ ਲਈ ਕਲੀਨਅੱਪ ਟੂਲ ਦੀ ਸਮੀਖਿਆ ਕਰ ਰਹੀ ਹੈ। ਉਹਨਾਂ ਦੀ ਯੋਜਨਾ ਅਪਡੇਟ ਕੀਤੇ ਗਏ ਟੈਸਟਿੰਗ ਵਰਕਫਲੋ ਦੇ ਵੇਰਵੇ ਦੇਣ ਵਾਲਾ ਇੱਕ ਪੋਸਟ-ਮੋਰਟਮ (post-mortem) ਪ੍ਰਕਾਸ਼ਿਤ ਕਰਨ ਦੀ ਹੈ, ਅਤੇ ਸੋਧੇ ਹੋਏ ਸਕ੍ਰਿਪਟ ਨੂੰ ਜਨਤਕ ਤੌਰ 'ਤੇ ਸਾਂਝਾ ਕਰਨ ਦੀ ਹੈ ਤਾਂ ਜੋ ਹੋਰ ਪਬਲਿਸ਼ਰ ਇੱਕੋ ਜਿਹੀ ਗਲਤੀ ਤੋਂ ਬਚ ਸਕਣ। ਇਹ ਘਟਨਾ ਇੱਕ ਯਾਦ ਦਿਵਾਉਂਦੀ ਹੈ: ਇੱਕ ਛੋਟੀ ਜਿਹੀ ਪਾਰਸਿੰਗ ਗਲਤੀ ਵੀ ਲੇਖਕ ਦੀ ਹਫ਼ਤਿਆਂ ਦੀ ਮਿਹਨਤ ਨੂੰ ਮਿਟਾ ਸਕਦੀ ਹੈ, ਜੋ ਸਖ਼ਤ ਟੈਸਟਿੰਗ ਨੂੰ ਲਾਜ਼ਮੀ ਬਣਾਉਂਦੀ ਹੈ।