Robert C. Martin ਦੀ Clean Code ਧਾਰਨਾ: ਵਧੀਆ ਨਾਮ, ਸਪੱਸ਼ਟ ਬਾਉਂਡਰੀਜ਼ ਅਤੇ ਰੋਜ਼ਾਨਾ ਅਨੁਸ਼ਾਸਨ ਜੋ ਰਖ-ਰਖਾਅ ਅਤੇ ਟੀਮ ਰਫ਼ਤਾਰ ਨੂੰ ਤੇਜ਼ ਕਰਦੇ ਹਨ।

Robert C. Martin — ਜੋ ਅਕਸਰ “Uncle Bob” ਦੇ ਨਾਮ ਨਾਲ ਜਾਣੇ ਜਾਂਦੇ ਹਨ — Clean Code ਹਲਚਲ ਨੂੰ ਇਸ ਸਿਧਾਂਤ ਨਾਲ ਪ੍ਰਚਲਿਤ ਕੀਤਾ: ਕੋਡ ਹੁਣ ਤਾਂ ਉਸ ਅਗਲੇ ਵਿਅਕਤੀ ਲਈ ਲਿਖਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ ਜੋ ਇਸਨੂੰ ਬਦਲਣਾ ਪਵੇ (ਅਕਸਰ, ਉਹ ਵਿਅਕਤੀ ਤਿੰਨ ਹਫ਼ਤੇ ਬਾਦ ਤੁਸੀਂ ਹੀ ਹੋ ਸਕਦੇ ਹੋ)।
ਰਖ-ਰਖਾਅ ਇਸ ਗੱਲ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਤੁਹਾਡੀ ਟੀਮ ਕੋਡ ਨੂੰ ਕਿੰਨੀ ਆਸਾਨੀ ਨਾਲ ਸਮਝ ਸਕਦੀ ਹੈ, ਸੁਰੱਖਿਅਤ ਤਰੀਕੇ ਨਾਲ ਬਦਲ ਸਕਦੀ ਹੈ, ਅਤੇ ਬਿਨਾਂ ਅਣਜਾਣ ਨੁਕਸਾਨ ਦੇ ਉਹ ਬਦਲਾਵ ਰਿਲੀਜ਼ ਕਰ ਸਕਦੀ ਹੈ। ਜੇ ਹਰੇਕ ਛੋਟਾ ਸੋਧ ਖਤਰਨਾਕ ਮਹਿਸੂਸ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਰਖ-ਰਖਾਅ ਘੱਟ ਹੈ।
ਟੀਮ ਰਫ਼ਤਾਰ ਓਹ ਲਗਾਤਾਰ ਸਮਰੱਥਾ ਹੈ ਜਿਸ ਨਾਲ ਟੀਮ ਸਮੇਂ ਦੇ ਨਾਲ ਲਾਭਕਾਰੀ ਸੁਧਾਰ ਡਿਲਿਵਰ ਕਰਦੀ ਰਹਿੰਦੀ ਹੈ। ਇਹ “ਤੇਜ਼ ਟਾਈਪਿੰਗ” ਨਹੀਂ—ਇਹ ਇਸ ਗੱਲ ਦੀ ਗਤੀ ਹੈ ਕਿ ਤੁਸੀਂ ਵਿਚਾਰ ਤੋਂ ਕੰਮ ਕਰ ਰਹੇ ਸੋਫਟਵੇਅਰ ਤੱਕ ਕਿੰਨੀ ਤੇਜ਼ੀ ਨਾਲ ਪਹੁੰਚ ਸਕਦੇ ਹੋ, ਬਾਰ-ਬਾਰ, ਬਿਨਾਂ ਐਸੀਆਂ ਘਟਨਾਵਾਂ ਦੇ ਜੋ ਬਾਅਦ ਵਿੱਚ ਤੁਹਾਨੂੰ ਹੋਲਣਾ ਬਣਾਉਣ।
Clean Code ਕਿਸੇ ਇੱਕ ਡਿਵੈਲਪਰ ਦੀ ਸ਼ੈਲੀ ਦੀ ਗੱਲ ਨਹੀਂ ਹੈ। ਇਹ ਇਕ ਸਾਂਝਾ ਕਾਰਜ ਪਰਿਵੇਸ਼ ਹੈ। ਗਦਬਦ ਮੌਡੀਊਲ ਸਿਰਫ਼ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਹੀ ਨਿਰਾਸ਼ ਨਹੀਂ ਕਰਦਾ ਜਿਸਨੇ ਲਿਖਿਆ; ਇਹ ਰਿਵਿਊ ਸਮਾਂ ਵਧਾਉਂਦਾ ਹੈ, ਨਵੀਨਤਮਾਂ ਨੂੰ onboard ਕਰਨਾ ਮੁਸ਼ਕਿਲ ਬਣਾਉਂਦਾ ਹੈ, ਬੱਗ ਵੱਧਦੇ ਹਨ ਜੋ ਲੰਬਾ ਸਮਾਂ ਲੈਂਦੇ ਹਨ, ਅਤੇ ਸਭ ਨੂੰ ਧਿਆਨ ਨਾਲ ਅੱਗੇ ਵਧਣਾ ਪੈਂਦਾ ਹੈ।
ਜਦੋਂ ਕਈ ਲੋਕ ਇਕੋ ਕੋਡਬੇਸ ਵਿੱਚ ਯੋਗਦਾਨ ਪਾਉਂਦੇ ਹਨ, ਤਹਿਸੀਲਤਾ ਇੱਕ ਸਹਯੋਗ ਸੰਦ ਬਣ ਜਾਂਦੀ ਹੈ। ਲਕੱਸ ਬਣਾ ਕੇ ਰੱਖਣਾ ਲਕਸ਼্য ਨਹੀਂ, ਪਰ ਭਵਿੱਖੀ ਤਬਦੀਲੀ ਦਾ ਭਰੋਸਾ ਬਣਾਉਣਾ ਹੈ: ਟੀਮ ਦਾ ਕੋਈ ਵੀ ਮੈਂਬਰ ਅਪਡੇਟ ਕਰ ਸਕੇ, ਸਮਝ ਸਕੇ ਕਿ ਇਹ ਕੀ ਪ੍ਰਭਾਵ ਪਾਏਗੀ, ਅਤੇ ਭਰੋਸੇ ਨਾਲ ਮਰਜ ਕਰ ਸਕੇ।
Clean Code ਨੂੰ ਪੂਰਨਤਾ ਪਰੀਖਣ ਵਾਂਗ ਨਹੀਂ ਲੈਣਾ ਚਾਹੀਦਾ। ਆਧੁਨਿਕ ਟੀਮਾਂ ਨੂੰ ਐਸੇ ਰਾਹ-ਨਿਰਦੇਸ਼ ਚਾਹੀਦੇ ਹਨ ਜੋ ਅਸਲੀ ਡੈੱਡਲਾਈਨ ਹਾਲਤਾਂ ਵਿੱਚ ਫਾਇਦਾ ਦਿੰਦੇ ਹਨ। ਇਸਨੂੰ ਇਕ ਐਸੀ ਸੈੱਟ ਆਦਤਾਂ ਵਜੋਂ ਸੋਚੋ ਜੋ ਘਣ੍ਟੀਆਂ ਘਟਾਉਂਦੀਆਂ ਹਨ—ਛੋਟੇ ਚੋਣਾਂ ਜੋ ਮਿਲਕੇ ਤੇਜ਼ ਡਿਲਿਵਰੀ ਬਣਾਉਂਦੀਆਂ ਹਨ।
ਆਗਲੇ ਭਾਗ ਵਿੱਚ ਅਸੀਂ ਤਿੰਨ ਖੇਤਰਾਂ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ ਜੋ ਰਖ-ਰਖਾਅ ਅਤੇ ਰਫ਼ਤਾਰ ਨੂੰ ਸਿੱਧਾ ਪ੍ਰਭਾਵਤ ਕਰਦੇ ਹਨ:
Clean Code ਮੁੱਖ ਤੌਰ ਤੇ ਸੁੰਦਰਤਾ ਜਾਂ ਨਿੱਜੀ ਪਸੰਦ ਦੀ ਗੱਲ ਨਹੀਂ। ਇਸਦਾ ਮੁੱਖ ਮਕਸਦ ਪ੍ਰਯੋਗਕ ਹੈ: ਕੋਡ ਨੂੰ ਪੜ੍ਹਨ-ਯੋਗ, ਸੋਚਣ-ਯੋਗ ਅਤੇ ਇਸ ਲਈ ਬਦਲਣ-ਯੋਗ ਬਣਾਉਣਾ।
ਟੀਮਾਂ ਅਕਸਰ ਇਸ ਲਈ ਸੰਘਰਸ਼ ਕਰਦੀਆਂ ਹਨ ਕਿ ਉਹ ਨਵਾਂ ਕੋਡ ਨਹੀਂ ਲਿਖ ਸਕਦੀਆਂ—ਉਹ ਇਸ ਲਈ ਸੰਘਰਸ਼ ਕਰਦੀਆਂ ਹਨ ਕਿ ਮੌਜੂਦਾ ਕੋਡ ਨੂੰ ਸੁਰੱਖਿਅਤ ਤਰੀਕੇ ਨਾਲ ਬਦਲਣਾ ਮੁਸ਼ਕਿਲ ਹੈ। ਮੰਗਾਂ ਬਦਲਦੀਆਂ ਹਨ, ਐਜ਼ ਕੇਸ ਸਾਹਮਣੇ ਆਉਂਦੇ ਹਨ, ਅਤੇ ਡੈੱਡਲਾਈਨ ਇੰਜੀਨੀਅਰਾਂ ਲਈ ਰੁਕਦੀਆਂ ਨਹੀਂ।
“ਚਤੁਰ” ਕੋਡ ਅਕਸਰ ਲੇਖਕ ਦੀ ਤੁਰੰਤ ਸੰਤੁਸ਼ਟੀ ਲਈ ਅਨੁਕੂਲ ਹੁੰਦਾ ਹੈ: ਘਣਤਾ ਵਿੱਚ ਲਾਜ਼ਮੀ ਤਰਕ, ਅਚਾਨਕ ਛੁਟੀਆਂ, ਜਾਂ ਐਸੇ ਆਬਸਟਰੇਕਸ਼ਨ ਜੋ ਸੁੰਦਰ ਲੱਗਦੇ ਹਨ—ਜਦ ਤੱਕ ਕਿਸੇ ਹੋਰ ਨੂੰ ਉਹ ਸੋਧਣਾ ਨਾ ਪਵੇ।
“ਸਪਸ਼ਟ” ਕੋਡ ਅਗਲੇ ਬਦਲਾਅ ਲਈ ਅਪਟੀਮਾਈਜ਼ ਕਰਦਾ ਹੈ। ਇਹ ਸਧਾਰਣ ਕੰਟਰੋਲ ਫਲੋ, ਵਿਅਕਤੀਗਤ ਉਦੇਸ਼ ਅਤੇ ਉਹਨਾਂ ਨਾਮਾਂ ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ ਜੋ ਵਿਵਰਣ ਦਿੰਦੇ ਹਨ ਕਿ ਕਿਸ ਲਈ ਕੁਝ ਹੈ। ਲਕਸ਼्य ਇਹ ਨਹੀਂ ਕਿ ਸਾਰੀ ਜਟਿਲਤਾ ਹਟਾ ਦਿੱਤੀ ਜਾਵੇ (ਸਾਫਟਵੇਅਰ ਵਿੱਚ ਜਟਿਲਤਾ ਰਹਿੰਦੀ ਹੈ), ਪਰ ਇਹ ਹੈ ਕਿ ਜਟਿਲਤਾ ਉਸ ਜਗ੍ਹਾ ਤੇ ਹੋਏ ਜਿੱਥੇ ਇਸਦੀ ਜਰੂਰਤ ਹੈ ਅਤੇ ਪੜ੍ਹਨ ਯੋਗ ਰਹੇ।
ਜਦੋਂ ਕੋਡ ਸਮਝਣਾ ਮੁਸ਼ਕਿਲ ਹੁੰਦਾ ਹੈ, ਟੀਮਾਂ ਇਹ ਲਾਗਤ ਦਿੱਤੀਆਂ ਹਨ:
ਇਸ ਲਈ Clean Code ਸਿੱਧਾ ਟੀਮ ਰਫ਼ਤਾਰ ਨਾਲ ਜੁੜਦਾ ਹੈ: ਗ਼ਲਤ ਫਹਿਮੀਆਂ ਘਟਦੀਆਂ ਹਨ ਤਾਂ ਹਿਚਕਿਚਾਹਟ ਘਟਦੀ ਹੈ।
Clean Code ਇੱਕ ਐਸਾ ਸੈੱਟ ਹੈ ਜੋ ਟਰੇਡ-ਆਫ਼ਸ ਤੇ ਆਧਾਰਿਤ ਹੈ, ਕਠੋਰ ਨਿਯਮ ਨਹੀਂ। ਕਈ ਵਾਰੀ ਇੱਕ ਲੰਬਾ ਫੰਕਸ਼ਨ ਸਪਸ਼ਟਤਾ ਲਈ ਵਧੀਆ ਹੁੰਦਾ ਹੈ ਵਸ ਕਿ ਉਹਨੂੰ ਤੋੜ-ਤੋੜ ਕੇ ਛੋਟਾ ਕਰਨ ਤੋਂ। ਕਈ ਵਾਰੀ ਪ੍ਰਦਰਸ਼ਨ ਦੀਆਂ ਸੀਮਾਵਾਂ ਇਕ ਘੱਟ ‘ਸੁੰਦਰ’ ਪਹੁੰਚ ਦੀ ਵਜ੍ਹਾ ਬਣ ਸਕਦੀਆਂ ਹਨ। ਮੁੱਖ ਸਿਧਾਂਤ ਏਹੇ ਰਹਿੰਦਾ ਹੈ: ਉਹ ਚੋਣਾਂ ਤਰਜੀਹ ਦਿਓ ਜੋ ਭਵਿੱਖੀ ਬਦਲਾਅ ਨੂੰ ਸੁਰੱਖਿਅਤ, ਸਥਾਨਕ ਅਤੇ ਸਮਝਣਯੋਗ ਰੱਖਣ—ਕਿਉਂਕਿ ਬਦਲਾਅ ਅਸਲ ਸੌਫਟਵੇਅਰ ਦੀ ਡਿਫੌਲਟ ਸਥਿਤੀ ਹੈ।
ਜੇ ਤੁਸੀਂ ਉਹ ਕੋਡ ਚਾਹੁੰਦੇ ਹੋ ਜੋ ਆਸਾਨੀ ਨਾਲ ਬਦਲਿਆ ਜਾ ਸਕੇ, ਤਾਂ ਨਾਮਾਂ ਤੋਂ ਸ਼ੁਰੂ ਕਰੋ। ਇੱਕ ਵਧੀਆ ਨਾਂ ਪੜ੍ਹਨ ਵਾਲੇ ਦੀ “ਮਨੋ-ਅਨੁਵਾਦ” ਦੀ ਜ਼ਰੂਰਤ ਘਟਾ ਦਿੰਦਾ—ਤਾਂ ਕਿ ਉਹ ਵਿਵਹਾਰ ਤੇ ਧਿਆਨ ਦੇ ਸਕੇ, ਨਾ ਕਿ ਇਹ ਸਮਝਣ ਵਿੱਚ ਕਿ cheez ਦਾ ਕੀ ਮਤਲਬ ਹੈ।
ਇਕ ਲਾਭਕਾਰੀ ਨਾਂ ਜਾਣਕਾਰੀ ਲੈ ਕੇ ਆਉਂਦੀ ਹੈ:
Cents vs Dollars, Utc vs ਸਥਾਨਕ ਸਮਾਂ, Bytes vs Kb, string vs parsed object.ਜਦੋਂ ਇਹ ਵੇਰਵੇ ਗ਼ਾਇਬ ਹੁੰਦੇ ਹਨ, ਪੜ੍ਹਨ ਵਾਲੇ ਨੂੰ ਸਵਾਲ ਪੁੱਛਣੇ ਪੈਂਦੇ ਹਨ—ਜਾਂ ਵਧੀਆ, ਅਨੁਮਾਨ ਲਗਾਣਾ ਪੈਂਦਾ ਹੈ।
ਅਸਪਸ਼ਟ ਨਾਮ ਫੈਸਲਿਆਂ ਨੂੰ ਛੁਪਾਉਂਦੇ ਹਨ:
data, info, tmp, value, resultlist, items, map (ਬਿਨਾਂ ਪ੍ਰਸੰਗ ਦੇ)ਸਪਸ਼ਟ ਨਾਮ ਸੰਦਰਭ ਲੈ ਕੇ ਆਉਂਦੇ ਹਨ ਅਤੇ ਫਾਲੋਅੱਪ ਘਟਦੇ ਹਨ:
invoiceTotalCents (ਯੂਨਿਟ + ਡੋਮੇਨ)discountPercent (ਫਾਰਮੈਟ + ਮਤਲਬ)validatedEmailAddress (ਪਾਬੰਦੀ)customerIdsToDeactivate (ਸਕੋਪ + ਉਦੇਸ਼)expiresAtUtc (ਟਾਈਮ ਜ਼ੋਨ)ਛੋਟੀ ਰੀਨੇਮਿੰਗ ਵੀ ਬੱਗ ਰੋਕ ਸਕਦੀ ਹੈ: timeout ਅਸਪਸ਼ਟ ਹੈ; timeoutMs ਸਪਸ਼ਟ ਹੈ।
ਜਦੋਂ ਕੋਡ ਉਹੀ ਭਾਸ਼ਾ ਵਰਤਦਾ ਹੈ ਜੋ ਟਿਕਟਾਂ, UI ਨਕਲ, ਅਤੇ ਕਸਟਮਰ ਸਪੋਰਟ ਗੱਲ-ਬਾਤ ਵਿੱਚ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਟੀਮ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ ਵਧਦੀ ਹੈ। ਜੇ ਉਤਪਾਦ “subscription” ਕਹਿੰਦਾ ਹੈ, ਤਾਂ ਇੱਕ ਮੌਡੀਊਲ ਵਿੱਚ ਇਸਨੂੰ plan ਕਹਿਣ ਦੀ ਬਜਾਏ subscription ਕਹੋ—ਸਿਵਾਏ ਜੇ ਉਹ ਵਾਕਈ ਵੱਖ-ਵੱਖ ਧਾਰਣਾਵਾਂ ਹਨ।
ਹਰ ਜਗ੍ਹਾ ਇੱਕ ਸ਼ਬਦ ਚੁਣੋ ਤੇ ਉਸ ਨੂੰ ਲਗਾਤਾਰ ਵਰਤੋ: customer vs client, invoice vs bill, cancel vs deactivate. ਜੇ ਸ਼ਬਦ ਟਿੱਪਣੀ ਕਰਦੇ ਹਨ, ਤਾਂ ਅਰਥ ਵੀ ਟਿੱਪਣੀ ਕਰਦਾ ਹੈ।
ਵਧੀਆ ਨਾਮ ਛੋਟੀ ਡੌਕਯੂਮੈਂਟੇਸ਼ਨ ਵਾਂਗ ਹੁੰਦੇ ਹਨ। ਉਹ Slack ਸਵਾਲ ਘੱਟ ਕਰਦੇ ਹਨ (“tmp ਵਿੱਚ ਕੀ ਹੈ?”), ਰਿਵਿਊ ਚੱਕਰ ਘਟਾਉਂਦੇ ਹਨ, ਅਤੇ ਇੰਜੀਨੀਅਰ, QA ਅਤੇ ਪ੍ਰੋਡਕਟ ਵਿਚਕਾਰ ਗ਼ਲਤ ਫਹਿਮੀਆਂ ਰੋਕਦੇ ਹਨ।
ਕੰਮ ਨੂੰ ਕਮਿਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪੁੱਛੋ:
data ਵਰਗੇ “ਕੰਟੇਨਰ ਸ਼ਬਦ” ਤੋਂ ਬਚਦਾ ਹੈ ਜੇ ਡੋਮੇਨ ਸਪਸ਼ਟ ਨਹੀਂ?isActive, hasAccess, shouldRetry?ਵਧੀਆ ਨਾਮ ਇੱਕ ਵਾਅਦਾ ਹੁੰਦਾ ਹੈ: ਇਹ ਅਗਲਾ ਪੜ੍ਹਨ ਵਾਲਾ ਦੱਸਦਾ ਹੈ ਕਿ ਕੋਡ ਕੀ ਕਰਦਾ ਹੈ। ਸਮੱਸਿਆ ਇਹ ਹੈ ਕਿ ਕੋਡ ਨਾਮਾਂ ਨਾਲੋਂ ਤੇਜ਼ੀ ਨਾਲ ਬਦਲਦਾ ਹੈ। ਕਈ ਮਹੀਨਿਆਂ ਦੀਆਂ ਛੋਟੀਆਂ ਸੋਧਾਂ ਅਤੇ “ਸਿਰਫ਼ ਰਿਲੀਜ਼ ਕਰ ਦਿਉ” ਪਲਾਂ ਵਿੱਚ, ਇੱਕ ਫੰਕਸ਼ਨ validateUser() ਸਾਨੂੰ ਵਿਧਾਨ, ਪ੍ਰੋਵਿਜ਼ਨਿੰਗ ਅਤੇ ਵਿਸ਼ਲੇਸ਼ਣ ਵੀ ਕਰਨ ਲੱਗਦਾ ਹੈ। ਨਾਂ ਅਜੇ ਵੀ ਸੱਜਾ ਲੱਗਦਾ ਹੈ, ਪਰ ਹੁਣ ਇਹ ਗ਼ਲਤ ਮੇਲ ਖਾਂਦਾ ਹੈ—ਅਤੇ ਗ਼ਲਤ ਨਾਮਾਂ ਦੀ ਕੀਮਤ ਸਮਾਂ ਹੈ।
Clean Code ਦਾ ਮਤਲਬ ਇਹ ਨਹੀਂ ਕਿ ਇਕ ਵਾਰੀ ਸ਼ਾਨਦਾਰ ਨਾਮ ਚੁਣ ਲਏ ਜਾਵਨ। ਇਹ ਇਹ ਹੈ ਕਿ ਨਾਮ ਹਕੀਕਤ ਨਾਲ ਇਕੱਠੇ ਰਹਿਣ। ਜੇ ਨਾਮ ਪੁਰਾਣੇ ਕੰਮ ਦਾ ਵਰਣਨ ਕਰਦਾ ਹੈ, ਹਰ ਅਗਲਾ ਪੜ੍ਹਨ ਵਾਲਾ ਇੰਪਲੀਮੈਂਟੇਸ਼ਨ ਤੋਂ ਸੱਚਾਈ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਖੋਜ ਕਰੇਗਾ। ਇਸ ਨਾਲ ਮਨੋਬਲ ਵਧਦਾ ਹੈ, ਰਿਵਿਊ ਲੰਬੇ ਹੁੰਦੇ ਹਨ, ਅਤੇ ਛੋਟੇ ਸੋਧ ਵੀ ਖਤਰਨਾਕ ਬਣ ਜਾਂਦੇ ਹਨ।
Name drift ਆਕਸਰ ਜਾਣ-ਬੂਝ ਕੇ ਨਹੀਂ ਹੁੰਦਾ। ਇਹ ਆਮ ਤੌਰ 'ਤੇ ਹੁੰਦਾ ਹੈ:
ਤੁਹਾਨੂੰ ਨਾਮ ਬਣਾਉਣ ਵਾਲੀ ਕਮੇਟੀ ਦੀ ਲੋੜ ਨਹੀਂ। ਕੁਝ ਹਲਕੇ ਅਭਿਆਸ ਕਾਫ਼ੀ ਹਨ:
ਕੋਈ ਵੀ ਛੋਟੀ ਸੋਧ—ਬੱਗ ਫਿਕਸ, ਰੀਫੈਕਟਰ, ਜਾਂ ਫ਼ੀਚਰ ਟਵੀਕ—ਦੇ ਦੌਰਾਨ ਨਜ਼ਦੀਕੀ ਗਲਤ ਨਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ 30 ਸਕਿੰਟ ਲਓ। ਇਹ “ਟੱਚ ਕਰਦੇ ਸਮੇਂ ਨਾਂ ਰੀਨੇਮ” ਆਦਤ ਡਰਿਫਟ ਨੂੰ ਜਮ੍ਹਾ ਹੋਣ ਤੋਂ ਰੋਕਦੀ ਹੈ ਅਤੇ ਹਰ ਰੋਜ਼ ਦੇ ਕੰਮ ਨਾਲ ਪੜ੍ਹਨਯੋਗਤਾ ਵਿੱਚ ਸੁਧਾਰ ਲਿਆਉਂਦੀ ਹੈ।
Clean Code ਸਿਰਫ਼ ਸਾਫ਼ ਮੈਥਡਾਂ ਦਾ ਮਾਮਲਾ ਨਹੀਂ—ਇਹ ਸਪਸ਼ਟ ਬਾਉਂਡਰੀਜ਼ ਖਿੱਚਣ ਬਾਰੇ ਵੀ ਹੈ ਤਾਂ ਜੋ ਸੋਧ ਸਥਾਨਕ ਰਹੇ। ਬਾਉਂਡਰੀਜ਼ ਹਰਥਾਂ ਪ੍ਰਗਟ ਹੁੰਦੀਆਂ ਹਨ: ਮੌਡੀਊਲ, ਲੇਅਰ, ਸਰਵਿਸ, API, ਅਤੇ ਇੱਕ ਸਭਿਆਂ ਵਿੱਚ ਕਿ “ਕੌਣ ਕੀ ਸੰਭਾਲਦਾ ਹੈ” ਤੱਕ।
ਇੱਕ ਰਸੋਈ ਦੀ ਕਲਪਨਾ ਕਰੋ ਜਿਸ ਵਿੱਚ ਸਟੇਸ਼ਨ ਹਨ: ਪ੍ਰੈਪ, ਗਰਿੱਲ, ਪलेटਿੰਗ, ਅਤੇ ਡਿਸ਼ਵੌਸ਼। ਹਰ ਸਟੇਸ਼ਨ ਦਾ ਇੱਕ ਸਪਸ਼ਟ ਕੰਮ, ਸੰਦ, ਅਤੇ ਇੰਪੁੱਟ/ਆਉਟਪੁੱਟ ਹੁੰਦਾ ਹੈ। ਜੇ ਗਰਿੱਲ ਸਟੇਸ਼ਨ “ਸਿਰਫ਼ ਇੱਕ ਵਾਰੀ” ਬਰਤਨ ਧੋਣਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੈ, ਤਾਂ ਹਰ ਚੀਜ਼ ਮੁੜ ਜਾਏਗੀ: ਸੰਦ ਗਾਇਬ ਹੋਣ ਗਏ, ਕਤਾਰਾਂ ਬਣਨਗੀਆਂ, ਅਤੇ ਜਦ ਕੁਝ ਟੁੱਟੇ ਤਾਂ ਇਹ ਸਪਸ਼ਟ ਨਹੀਂ ਰਹੇਗਾ ਕਿ ਜਿੰਮੇਵਾਰ ਕੌਣ ਹੈ।
ਸੌਫਟਵੇਅਰ ਵੀ ਇਸੇ ਤਰ੍ਹਾਂ ਕੰਮ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਬਾਉਂਡਰੀਜ਼ ਸਪਸ਼ਟ ਹੁੰਦੀਆਂ ਹਨ, ਤੁਸੀਂ “ਗਰਿੱਲ ਸਟੇਸ਼ਨ” (ਬਿਜਨਸ ਲੌਜਿਕ) ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ ਬਿਨਾਂ “ਡਿਸ਼ਵੌਸ਼” (ਡੇਟਾ ਐਕਸੈਸ) ਜਾਂ “ਪਲੇਟਿੰਗ” (UI/API ਫਾਰਮੈਟਿੰਗ) ਨੂੰ ਦੁਬਾਰਾ ਸੰਗਠਤ ਕਰਨ ਦੇ।
ਅਸਪਸ਼ਟ ਬਾਉਂਡਰੀਜ਼ ਲਹਿਰ ਪ੍ਰਭਾਵ ਪੈਦਾ ਕਰਦੀਆਂ ਹਨ: ਇੱਕ ਛੋਟੀ ਸੋਧ ਬਹੁਤ ਸਾਰਿਆਂ ਖੇਤਰਾਂ ਵਿੱਚ ਸੋਧ ਮੰਗਦੀ ਹੈ, ਵਧੇਰੇ ਟੈਸਟਿੰਗ, ਰਿਵਿਊ ਚੱਕਰ ਦੀ ਵਾਪਸੀ, ਅਤੇ ਬਿਨਾ ਮਨਜ਼ੂਰ ਦੀਆਂ ਗਲਤੀਆਂ। ਟੀਮ ਹਿਚਕਿਚਾਉਣ ਲੱਗ ਜਾਂਦੀ ਹੈ—ਹਰ ਸੋਧ ਖਤਰਾ ਮਹਿਸੂਸ ਹੁੰਦੀ ਹੈ।
ਆਮ ਬਾਉਂਡਰੀਆਂ ਦੇ ‘ਸਮਾਨ’ ਹਨ:
ਚੰਗੀਆਂ ਬਾਉਂਡਰੀਜ਼ ਨਾਲ, ਟਿਕਟ ਪ੍ਰਿਡਿਕਟੇਬਲ ਹੁੰਦੇ ਹਨ। ਕੀਮਤ ਨਿਯਮ ਦੀ ਇੱਕ ਬਦਲਾਅ ਆਮ ਤੌਰ 'ਤੇ ਕੇਵਲ ਪ੍ਰਾਈਸਿੰਗ ਕੰਪੋਨੈਂਟ ਨੂੰ ਛੂਹਦਾ ਹੈ, ਅਤੇ ਟੈਸਟ ਆਪਣਾ ਤੇਜ਼ ਸੂਚਨ ਦਿੰਦੇ ਹਨ ਜੇ ਤੁਸੀਂ ਲਾਈਨ ਨੂੰ ਪਾਰ ਕੀਤਾ। ਕੋਡ ਰਿਵਿਊਜ਼ ਆਸਾਨ ਹੋ ਜਾਂਦੇ ਹਨ (“ਇਹ ਡੋਮੇਨ ਲੇਅਰ ਵਿੱਚ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ, ਨਾ ਕਿ ਕੰਟਰੋਲਰ ਵਿੱਚ”), ਅਤੇ ਡੀਬੱਗਿੰਗ ਤੇਜ਼ ਹੋ ਜਾਂਦੀ ਹੈ ਕਿਉਂਕਿ ਹਰ ਹਿੱਸੇ ਦੀ ਇਕ ਜਗ੍ਹਾ ਅਤੇ ਇਕ ਮਕਸਦ ਹੁੰਦਾ ਹੈ।
ਛੋਟੇ, ਕੇਂਦ੍ਰਿਤ ਫੰਕਸ਼ਨ ਕੋਡ ਨੂੰ ਬਦਲਣ ਯੋਗ ਬਣਾਉਂਦੇ ਹਨ ਕਿਉਂਕਿ ਉਹ ਤੁਹਾਡੇ ਦਿਮਾਗ ਵਿੱਚ ਰੱਖਣ ਵਾਲੇ ਸੰਦਰਭ ਦੀ ਮਾਤਰਾ ਘਟਾਉਂਦੇ ਹਨ। ਜਦੋਂ ਇੱਕ ਫੰਕਸ਼ਨ ਦਾ ਇਕ ਉਦੇਸ਼ ਹੁੰਦਾ ਹੈ, ਤੁਸੀਂ ਇਸਨੂੰ ਕੁਝ ਇਨਪੁਟਾਂ ਨਾਲ ਟੈਸਟ ਕਰ ਸਕਦੇ ਹੋ, ਹੋਰ ਥਾਵਾਂ 'ਤੇ ਰੀਯੂਜ਼ ਕਰ ਸਕਦੇ ਹੋ, ਅਤੇ ਫੇਲ੍ਹ ਹੋਣ 'ਤੇ ਐਸਾ ਸਮਝ ਸਕਦੇ ਹੋ ਬਿਨਾਂ ਲੰਬੇ-ਚੌੜੇ ਟਰੈਸਿੰਗ ਦੇ।
ਇੱਕ processOrder() ਨਾਂ ਵਾਲਾ ਫੰਕਸ਼ਨ ਵਿਚ ਸੋਚੋ ਜੋ: ਐਡਰੈੱਸ ਵੈਧਤਾ, ਟੈਕਸ ਕੈਲਕੁਲੇਟ, ਛੂਟ ਲਗਾਉਣਾ, ਕਾਰਡ ਚਾਰਜ ਕਰਨਾ, ਈਮੇਲ ਭੇਜਣਾ, ਅਤੇ ਆਡਿਟ ਲੌਗ ਲਿਖਨਾ ਕਰਦਾ ਹੈ। ਇਹ “ਆਰਡਰ ਪ੍ਰੋਸੈਸ ਕਰਨਾ” ਨਹੀਂ—ਇਹ ਪੰਜ ਫੈਸਲੇ ਅਤੇ ਤਿੰਨ ਸਾਈਡ-ਇਫੈਕਟ ਇਕਠੇ ਕਰਦਾ ਹੈ।
ਇੱਕ ਸਾਫ਼ ਦ੍ਰਿਸ਼ਟੀ ਇਹ ਹੈ ਕਿ ਉਦੇਸ਼ ਵੱਖਰੇ ਹੋਣ:
function processOrder(order) {
validate(order)
const priced = price(order)
const receipt = charge(priced)
sendConfirmation(receipt)
return receipt
}
ਹਰ ਹੈਲਪਰ ਨੂੰ ਅਲੱਗ ਟੈਸਟ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ ਮੁੜ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਉੱਪਰੀ ਸਤਰ ਦੀ ਫੰਕਸ਼ਨ ਇੱਕ ਛੋਟੀ ਕਹਾਣੀ ਵਾਂਗ ਪੜ੍ਹਦੀ ਹੈ।
ਲੰਬੇ ਫੰਕਸ਼ਨ ਫੈਸਲੇ ਬਿੰਦੂ ਅਤੇ ਐਜ ਕੇਸ ਨੂੰ ਛੁਪਾ ਦਿੰਦੀਆਂ ਹਨ ਕਿਉਂਕਿ ਉਹ ਅਣਸੰਬੰਧਤ ਕੰਮਾਂ ਦੇ ਵਿਚਕਾਰ “ਕੀ ਹੋਵੇਗਾ?” ਲਾਜ਼ਮੀ ਤਰ੍ਹਾਂ ਪਾਸੇ ਰੱਖ ਦਿੰਦੇ ਹਨ। ਇੱਕ ਅਲੱਗ if ਜੋ “ਅੰਤਰਰਾਸ਼ਟਰੀ ਪਤਾ” ਲਈ ਹੈ, ਟੈਕਸ, ਸ਼ਿਪਿੰਗ, ਅਤੇ ਈਮੇਲ ਸ਼ਬਦਚੋਣ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦਾ ਹੈ—ਪਰ ਜਦੋਂ ਉਹ 80 ਲਾਈਨਾਂ ਦੂਰ ਹੋਵੇ ਤਾਂ ਇਸ ਸਬੰਧ ਨੂੰ ਦੇਖਣਾ ਔਖਾ ਹੁੰਦਾ ਹੈ।
ਛੋਟੇ-ਛੋਟੇ ਸ਼ੁਰੂ ਕਰੋ:
calculateTax() ਜਾਂ formatEmail() ਵਿੱਚ ਲਿਜਾਓ।applyDiscounts vs doDiscountStuff).ਛੋਟਾ ਦਾ ਮਤਲਬ “ਬਹੁਤ ਛੋਟਾ ਹਰ ਹਾਲਤ ਵਿੱਚ” ਨਹੀਂ। ਜੇ ਤੁਸੀਂ ਬਹੁਤ ਸਾਰੀਆਂ ਇੱਕ-ਲਾਈਨ ਵਾਲੀਆਂ ਰੈਪਰ ਬਣਾਂਦੇ ਹੋ ਜਿਹੜੇ ਪੜ੍ਹਨ ਵਾਲੇ ਨੂੰ ਇੱਕ ਕੰਮ ਸਮਝਣ ਲਈ ਪੰਜ ਫਾਇਲਾਂ ਵਿੱਚ ਛੱਡਦੇ ਹਨ, ਤਾਂ ਤੁਸੀਂ ਸਪਸ਼ਟਤਾ ਦੀ ਬਜਾਏ ਇੰਡਾਇਰੈਕਸ਼ਨ ਵਧਾ ਦਿੱਤਾ। ਐਸੇ ਫੰਕਸ਼ਨ ਲੱਛਣਵਾਨ, ਅਰਥਪੂਰਨ, ਅਤੇ ਸਥਾਨਕ ਤੌਰ 'ਤੇ ਸਮਝਣਯੋਗ ਹੋਣ ਚਾਹੀਦੇ ਹਨ।
ਸਾਈਡ-ਇਫੈਕਟ ਉਹ ਕੋਈ ਵੀ ਬਦਲਾਅ ਹੈ ਜੋ ਇੱਕ ਫੰਕਸ਼ਨ ਆਪਣੀ ਵਾਪਸੀ ਵਾਲੀ ਵੈਲਯੂ ਤੋਂ ਇਲਾਵਾ ਕਰਦਾ ਹੈ। ਸਹੀ ਅਸਲ ਵਿੱਚ: ਤੁਸੀਂ ਇੱਕ ਹੈਲਪਰ ਕਾਲ ਕਰਦੇ ਹੋ ਜਿਸ ਤੋਂ ਤੁਸੀਂ ਇੱਕ ਜਵਾਬ ਉਮੀਦ ਕਰਦੇ ਹੋ, ਅਤੇ ਉਹ ਚੁਪਚਾਪ ਕੁਝ ਹੋਰ ਬਦਲ ਦਿੰਦਾ—ਫਾਇਲ ਲਿਖਦਾ, ਡੇਟਾਬੇਸ ਰੋ ਦਿੱਤਾਂ, ਸਾਂਝੇ ਆਬਜੈਕਟ ਨੂੰ ਮਿਊਟੇਟ ਕਰਦਾ, ਜਾਂ ਗਲੋਬਲ ਫਲੈਗ ਨੂੰ ਉਲਟਦਾ।
ਸਾਈਡ-ਇਫੈਕਟ ਆਟੋਮੈਟਿਕ ਤੌਰ 'ਤੇ “ਖਰਾਬ” ਨਹੀਂ ਹਨ। ਸਮੱਸਿਆ ਉਹਨਾਂ ਸਪਸ਼ਟ ਨਹੀੰ ਹੋਣੀਆਂ ਹਨ। ਉਹ ਕਾਲਰਾਂ ਨੂੰ ਹੈਰਾਨ ਕਰਦੇ ਹਨ, ਅਤੇ ਹੈਰਾਨੀ ਉਹੀ ਚੀਜ਼ ਹੈ ਜੋ ਸਧਾਰਨ ਸੋਧਾਂ ਨੂੰ ਲੰਬੇ ਡੀਬੱਗਿੰਗ ਸੈਸ਼ਨਾਂ ਵਿੱਚ ਬਦਲ ਦਿੰਦੀ ਹੈ।
ਚੁਪਚਾਪ ਬਦਲਾਅ ਵਰਤਾਰਾ ਅਣਪਛਾਤਾ ਕਰ ਦਿੰਦੇ ਹਨ। ਇਕ ਬੱਗ ਆਪਣੇ ਸਿਸਟਮ ਦੇ ਇੱਕ ਹਿੱਸੇ ਵਿੱਚ ਦਿਖ ਸਕਦਾ ਹੈ ਪਰ ਵਾਸਤਵ ਵਿੱਚ ਕਿਸੇ “ਸੁਵਿਧਾ” ਹੈਲਪਰ ਦੀ ਵਜ੍ਹਾ ਤੋਂ ਹੋ ਸਕਦਾ ਹੈ। ਇਹ ਅਣਪਛਾਤੀਵਾਦ ਰਫ਼ਤਾਰ ਨੂੰ ਮਾਰਦਾ: ਇੰਜੀਨੀਅਰ ਮੁੱਖ ਤੌਰ 'ਤੇ ਮੁੱਦੇ ਦੁਹਰਾਉਂਦੇ ਹਨ, ਅਸਥਾਈ ਲਾਗਿੰਗ ਜੋੜਦੇ ਹਨ, ਅਤੇ ਇਹ ਤੈਅ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਨ ਕਿ ਜਿੰਮੇਵਾਰੀ ਕਿੱਥੇ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।
ਉਹ ਕੋਡ ਨੂੰ ਟੈਸਟ ਕਰਨਾ ਵੀ ਮੁਸ਼ਕਿਲ ਬਣਾਉਂਦੇ ਹਨ। ਇੱਕ ਫੰਕਸ਼ਨ ਜੋ ਚੁਪਚਾਪ DB 'ਤੇ ਲਿਖਦਾ ਜਾਂ ਗਲੋਬਲ ਸਟੇਟ ਛੇੜਦਾ ਹੈ, ਉਸਨੂੰ ਸੇਟਅਪ/ਕਲੀਅਨਅਪ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ, ਅਤੇ ਟੈਸਟ ਉਹਨਾਂ ਕਾਰਨਾਂ ਲਈ ਫੇਲ ਹੋਣ ਲੱਗਦੇ ਹਨ ਜੋ ਨਵੇਂ ਫੀਚਰ ਨਾਲ ਸਬੰਧਿਤ ਨਹੀਂ।
ਸਪਸ਼ਟ ਇੰਪੁਟ ਅਤੇ ਆਉਟਪੁੱਟ ਵਾਲੇ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਤਰਜੀਹ ਦਿਓ। ਜੇ ਕੁਝ ਦੁਨੀਆ ਨੂੰ ਬਦਲਣਾ ਲਾਜ਼ਮੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਸਪਸ਼ਟ ਬਣਾਓ:
saveUser() vs getUser()).ਆਮ “ਗੋਟਚਾਜ਼” ਵਿੱਚ ਨੀਵੀਂ-ਸਤਹ ਹੈਲਪਿੰਗ ਵਿੱਚ ਲੌਗਿੰਗ, ਸਾਂਝੇ ਕਨਫਿਗ ਆਬਜੈਕਟਾਂ ਨੂੰ ਮਿਊਟੇਟ ਕਰਨਾ, ਅਤੇ ਫਾਰਮੈਟਿੰਗ ਜਾਂ ਵੈਧਤਾ ਕਦਮ ਦੌਰਾਨ ਡੇਟਾਬੇਸ ਲਿਖਾਈ ਹੋਣਾ ਸ਼ਾਮਿਲ ਹੋ ਸਕਦਾ ਹੈ।
ਕੋਡ ਰਿਵਿਊ ਦੌਰਾਨ ਇੱਕ ਸਧਾਰਣ ਸਵਾਲ ਪੁੱਛੋ: “ਵਾਪਸੀ ਵਾਲੀ ਵੈਲਯੂ ਤੋਂ ਇਲਾਵਾ ਕਿਹੜੀਆਂ ਚੀਜ਼ਾਂ ਬਦਲਦੀਆਂ ਹਨ?”
ਫਾਲੋ-ਅਪ: ਕੀ ਇਹ arguments ਨੂੰ ਮਿਊਟੇਟ ਕਰਦਾ ਹੈ? ਗਲੋਬਲ ਸਟੇਟ ਨੂੰ ਛੂਹਦਾ ਹੈ? ਡਿਸਕ/ਨੈਟਵਰਕ ਨੂੰ ਲਿਖਦਾ ਹੈ? ਬੈਕਗਰਾਉਂਡ ਜੌਬ ਟ੍ਰਿਗਰ ਕਰਦਾ ਹੈ? ਜੇ ਹਾਂ, ਕੀ ਇਸਨੂੰ ਸਪਸ਼ਟ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ—ਯਾ ਇਸਨੂੰ ਵਧੀਆ ਬਾਉਂਡਰੀ 'ਤੇ ਮੋਢਿਆ ਜਾ ਸਕਦਾ ਹੈ?
Clean Code ਸਿਰਫ਼ ਸਟਾਈਲ ਨਹੀਂ—ਇਹ ਅਨੁਸ਼ਾਸਨ ਹੈ: ਦੁਹਰਾਏ ਜਾਂਦੇ ਅਭਿਆਸ ਜੋ ਕੋਡਬੇਸ ਨੂੰ ਭਵਿੱਖੀ ਤਬਦੀਲੀਆਂ ਲਈ ਭਰੋਸੇਯੋਗ ਰੱਖਦੇ ਹਨ। ਇਸਨੂੰ “ਸੁੰਦਰ ਕੋਡ” ਲਿਖਣ ਦੀ ਸੋਚ ਤੋਂ ਘੱਟ ਸਮਝੋ ਅਤੇ ਅਜਿਹੇ ਰੂਟੀਨਾਂ ਵਜੋਂ ਜਿਹੜੇ ਵੈਰੀਐਂਸ ਘਟਾਉਂਦੇ ਹਨ: ਖਤਰਨਾਕ ਬਦਲਾਅ ਤੋਂ ਪਹਿਲਾਂ ਟੈਸਟ, ਜਦ ਤੱਕ ਤੁਸੀਂ ਕੋਡ ਤੇ ਕੰਮ ਕਰ ਰਹੇ ਹੋ ਤਦ ਉਸਨੂੰ ਛੋਟਾ ਰੀਫੈਕਟਰ ਕਰੋ, ਸਥਾਨਕ ਡੌਕਯੂਮੈਂਟੇਸ਼ਨ ਜਿੱਥੇ ਹਲ ਰੋਕੇ, ਅਤੇ ਰਿਵਿਊਜ ਜੋ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਜਲਦੀ ਪਕੜਦੇ ਹਨ।
ਟੀਮਾਂ ਅਕਸਰ ਅੱਜ “ਤੇਜ਼” ਹੋ ਸਕਦੀਆਂ ਹਨ ਜੇ ਉਹ ਇਹ ਅਭਿਆਸ ਸਕਿਪ ਕਰ ਦਿੰਦੀਆਂ ਹਨ। ਪਰ ਉਹ ਰਫ਼ਤਾਰ ਆਮ ਤੌਰ 'ਤੇ ਭਵਿੱਖ ਤੋਂ ਉਧਾਰ ਹੁੰਦੀ ਹੈ। ਬਿਲ ਆਉਂਦਾ ਹੈ ਜਦ flaky ਰਿਲੀਜ਼, ਅਚਾਨਕ ਰਿਗਰੇਸ਼ਨ, ਅਤੇ ਲੇਟ-ਸਾਈਕਲ ਝਟਕੇ ਆਉਂਦੇ ਹਨ ਜਦ ਇੱਕ ਸਧਾਰਨ ਸੋਧ ਇੱਕ ਚੇਨ ਪ੍ਰਤੀਕਿਰਿਆ ਸ਼ੁਰੂ ਕਰ ਦੇਂਦੀ ਹੈ।
ਅਨੁਸ਼ਾਸਨ ਇੱਕ ਛੋਟੀ, ਲਗਾਤਾਰ ਲਾਗਤ ਦਾ ਵਪਾਰ ਹੈ ਜੋ ਭਰੋਸੇਯੋਗਤਾ ਦਿੰਦਾ ਹੈ: ਘੱਟ ਐਮਰਜੈਂਸੀ, ਘੱਟ ਆਖ਼ਰੀ-ਮਿੰਟ ਫਿਕਸ, ਅਤੇ ਘੱਟ ਐਸੀਆਂ ਸਥਿਤੀਆਂ ਜਿੱਥੇ ਟੀਮ ਨੂੰ ਰਿਲੀਜ਼ ਨੂੰ ਸਥਿਰ ਕਰਨ ਲਈ ਸਭ ਕੁਝ ਰੋਕਣਾ ਪੈਂਦਾ ਹੈ। ਇੱਕ ਮਹੀਨੇ ਵਿੱਚ, ਉਹ ਭਰੋਸੇਯੋਗਤਾ ਹਕੀਕਤ ਵਿੱਚ throughput ਬਣ ਜਾਂਦੀ ਹੈ।
ਕੁਝ ਸਧਾਰਣ ਆਚਰਨ ਤੇਜ਼ੀ ਨਾਲ ਜੋੜ ਜੋੜਦੇ ਹਨ:
ਇਹ ਬਿਆਨਕ ਅਕਸਰ ਸਕਾਰਾਤਮਕ ਹੈ—ਪਰ ਲੰਬੇ ਸਮੇਂ ਵਿੱਚ ਮਹਿੰਗਾ। ਵਰਤੋਂਕਾਰੀ ਸਮਾਧਾਨ ਇਹ ਹੈ ਕਿ ਸਕੋਪ ਨੂੰ ਨਿਰਧਾਰਿਤ ਕਰੋ: ਇੱਕ ਵੱਡਾ ਰੀਫੈਕਟਰ ਨਾ ਸ਼ੈਡੀਉਲ ਕਰੋ; ਹਰਰੋਜ਼ ਕੰਮ ਦੇ ਕਿਨਾਰੇ ਅਨੁਸ਼ਾਸਨ ਲਗਾਓ। ਹਫ਼ਤਿਆਂ ਵਿੱਚ, ਉਹ ਛੋਟੇ ਜਮ੍ਹੇ ਟੈਕਨੀਕੀ ਕਰਜ਼ੇ ਘਟਾਉਂਦੇ ਹਨ ਅਤੇ ਡਿਲਿਵਰੀ ਗਤੀ ਵਧਾਉਂਦੇ ਹਨ ਬਿਨਾਂ ਵੱਡੇ ਰੀਰਾਇਟ ਦੇ।
ਟੈਸਟ ਸਿਰਫ਼ ਬੱਗ ਫੜਨ ਲਈ ਨਹੀਂ ਹਨ। Clean Code ਦੇ ਨਜ਼ਰੀਏ ਵਿੱਚ, ਉਹ ਬਾਉਂਡਰੀਜ਼ ਦੀ ਰੱਖਿਆ ਕਰਦੇ ਹਨ: ਉਹ ਪਬਲਿਕ ਵਿਵਹਾਰ ਜੋ ਤੁਹਾਡਾ ਕੋਡ ਸਿਸਟਮ ਦੇ ਹੋਰ ਹਿੱਸਿਆਂ ਨੂੰ ਵਾਅਦਾ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ ਅੰਦਰੂਨੀ ਬਣਤਰ ਬਦਲਦੇ ਹੋ—ਮੌਡੀਊਲ ਨੂੰ ਵੰਡਦੇ, ਨਾਂ ਰੀਨੇਮ ਕਰਦੇ, ਲੌਜਿਕ ਨੂੰ ਹਿਲਾਉਂਦੇ—ਚੰਗੇ ਟੈਸਟ ਇਹ ਪੱਕਾ ਕਰਦੇ ਹਨ ਕਿ ਤੁਸੀਂ ਚੁਪਚਾਪ ਕਰਾਰ ਦਾ ਉਲੰਘਣ ਨਹੀਂ ਕੀਤਾ।
ਇੱਕ ਤੂਟਦਾ ਟੈਸਟ ਨਾਲ ਤੁਰੰਤ ਫੀਡਬੈਕ ਸਸਤਾ ਹੈ: ਤੁਸੀਂ ਹਾਲੇ ਯਾਦ ਰੱਖਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਕੀ ਛੂਹਿਆ। ਤੁਲਨਾ ਕਰੋ ਉਹਨਾਂ ਬੱਗਾਂ ਨਾਲ ਜੋ ਦਿਨਾਂ ਬਾਅਦ QA ਜਾਂ ਪ੍ਰੋਡਕਸ਼ਨ ਵਿੱਚ ਲੱਭੇ ਜਾਂਦੇ ਹਨ—ਜਦ ਟਰੇਲ ਠੰਢੀ ਹੋ ਚੁਕੀ ਹੈ, ਫਿਕਸ ਜ਼ਿਆਦਾ ਖਤਰਨਾਕ ਹੈ, ਅਤੇ ਕਈ ਸੋਧ ਇਕਠੇ ਹੋ ਚੁੱਕੇ ਹੁੰਦੇ ਹਨ। ਤੇਜ਼ ਫੀਡਬੈਕ ਰੀਫੈਕਟਰੀੰਗ ਨੂੰ ਇੱਕ ਜੋਖਮ ਨਹੀਂ ਰਹਿਣ ਦਿੰਦਾ ਪਰ ਦੈਨੀਕ ਨਿਯਮ ਬਣਾਉਂਦਾ ਹੈ।
ਉਹ ਕਵਰੇਜ ਨਾਲ ਸ਼ੁਰੂ ਕਰੋ ਜੋ ਤੁਹਾਨੂੰ ਆਜ਼ਾਦੀ ਦਿੰਦੀ:
ਪ੍ਰਯੋਗਕ ਨਿਯਮ: ਜੇ ਕਿਸੇ ਬੱਗ ਦਾ ਫਿਕਸ ਮਹਿੰਗਾ ਜਾਂ ਸ਼ਰਮਨਾਕ ਹੋਵੇਗਾ, ਇੱਕ ਟੈਸਟ ਲਿਖੋ ਜੋ ਉਸਨੂੰ ਪਕੜ ਲੈਂਦਾ।
ਸਾਫ਼ ਟੈਸਟ ਤੇਜ਼ੀ ਨਾਲ ਬਦਲਾਅ ਨੂੰ ਤੇਜ਼ ਕਰਦੇ ਹਨ। ਉਨ੍ਹਾਂ ਨੂੰ ਇਹ ਤਰੀਕੇ ਨਾਲ ਲਿਖੋ ਕਿ ਉਹ ਕਾਰਜਕ ਉਦਾਹਰਨ ਹੋਣ:
rejects_expired_token() ਜਿਵੇਂ ਨਾਮ ਮੰਗ ਪੜ੍ਹਨ ਵਾਂਗ ਹੈ।ਟੈਸਟ ਇਕ ਟੈਕਸ ਬਣ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਉਹ ਤੁਹਾਨੂੰ ਅੱਜ ਦੀ ਬਣਤਰ ਵਿੱਚ ਫਸਾ ਦਿੰਦਾ—ਜ਼ਿਆਦਾ mocking, ਪ੍ਰਾਈਵੇਟ ਵੇਰਵਿਆਂ 'ਤੇ Assert ਕਰਨਾ, ਜਾਂ ਉਸ ਖਾਸ UI ਟੈਕਸਟ/HTML 'ਤੇ ਨਿਰਭਰ ਹੋਣਾ ਜਦ ਤੁਸੀਂ ਸਿਰਫ ਵਿਵਹਾਰ ਬਾਰੇ ਚਿੰਤਤ ਹੋ। brittle ਟੈਸਟ 'noise' ਲਈ fail ਹੁੰਦੇ ਹਨ ਅਤੇ ਟੀਮ ਨੂੰ red builds ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰਨ ਦੀ ਆਦਤ ਪਾ ਦਿੰਦੇ ਹਨ। ਉਹਨਾਂ ਟੈਸਟਾਂ ਨੂੰ ਲਕੜੀ ਬਣਾਓ ਜੋ ਸਿਰਫ਼ ਅਸਲੀ ਟੁੱਟਣ ਤੇ fail ਹੋਣ।
ਰੀਫੈਕਟਰੀੰਗ Clean Code ਦਾ ਸਭ ਤੋਂ ਵਿਹਾਰਕ ਸਬਕ ਹੈ: ਇਹ ਇਕ ਬਿਹੇਵਿਅਰ-ਪ੍ਰਜ਼ਰਵਿੰਗ ਸੁਧਾਰ ਹੈ ਜੋ ਕੋਡ ਦੀ ਸਰਚੰਨਾ ਨੂੰ ਬਦਲਦਾ ਹੈ। ਤੁਸੀਂ ਜੋ ਸਾਫਟਵੇਅਰ ਕਰਦਾ ਹੈ ਉਹ ਨਹੀਂ ਬਦਲ ਰਹੇ—ਤੁਸੀਂ ਇਸਨੂੰ ਅਗਲੀ ਵਾਰੀ ਕਿਵੇਂ ਅਸਾਨੀ ਨਾਲ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਇਸਨੂੰ ਬਦਲ ਰਹੇ ਹੋ।
ਇਕ ਸਧਾਰਣ ਮਨੋਦਸ਼ਾ ਹੈ Boy Scout Rule: "ਜੋ ਕੋਡ ਤੁਸੀਂ ਲੱਭਦੇ ਹੋ, ਉਸਨੂੰ ਥੋੜ੍ਹਾ ਸੁੱਧਾ ਛੱਡ ਦਿਓ"। ਇਸਦਾ ਮਤਲਬ ਸਭ ਕੁਝ ਪਾਲਿਸ਼ ਕਰਨਾ ਨਹੀਂ। ਇਹ ਛੋਟੇ ਸੁਧਾਰ ਕਰਨ ਦਾ ਮਤਲਬ ਹੈ ਜੋ ਅਗਲੇ ਵਿਅਕਤੀ (ਅਕਸਰ ਭਵਿੱਖ ਦਾ ਤੁਸੀਂ) ਲਈ friction ਘਟਾਉਂਦੇ ਹਨ।
ਸਭ ਤੋਂ ਵਧੀਆ ਰੀਫੈਕਟਰੇ ਆਲੋ-ਰਿਸਕ ਅਤੇ ਆਸਾਨ ਰਿਵਿਊ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਕੁਝ ਜਿਹੜੇ ਲਗਾਤਾਰ ਟੈਕਨੀਕੀ ਕਰਜ਼ੇ ਘਟਾਉਂਦੇ ਹਨ:
ਇਹਤੀਆਂ ਛੋਟੀਆਂ ਚੇਜ਼ਾਂ ਉਦੇਸ਼ ਸਪਸ਼ਟ ਬਣਾਉਂਦੀਆਂ ਹਨ—ਅਤੇ ਇਹ ਡੀਬੱਗਿੰਗ ਨੂੰ ਛੋਟਾ ਕਰਦੀਆਂ ਹਨ ਅਤੇ ਭਵਿੱਖੀ ਸੋਧ ਤੇਜ਼ ਕਰਦੀਆਂ ਹਨ।
ਰੀਫੈਕਟਰੀੰਗ ਸਭ ਤੋਂ ਵਧੀਆ ਤਬ ਹੋਂਦਾ ਹੈ ਜਦ ਇਹ ਅਸਲ ਕੰਮ ਨਾਲ ਜੁੜਿਆ ਹੋਵੇ:
ਰੀਫੈਕਟਰੀੰਗ ਅਨੰਤ "ਕਲਿਨ-ਅਪ" ਦਾ ਲਾਇਸੈਂਸ ਨਹੀਂ। ਠਹਿਰੋ ਜਦ ਯਤਨ ਇੱਕ ਰਿਅਰਾਈਟ ਵਿੱਚ ਬਦਲ ਜਾਵੇ ਬਿਨਾਂ ਕੋਈ ਸਪਸ਼ਟ, ਟੈਸਟਬਲ ਮਕਸਦ ਦੇ। ਜੇ ਇਹ ਬਦਲਾਅ ਇੱਕ ਲੜੀਵਾਰ, ਛੋਟੇ, ਰਿਵਿਊਯੋਗ ਕਦਮਾਂ ਦੇ ਰੂਪ ਵਿੱਚ ਪ੍ਰਗਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਤਾਂ ਇਸਨੂੰ ਛੋਟੇ ਮੀਲਸਟੋਨ ਵਿੱਚ ਵੰਡੋ—ਜਾਂ ਫਿਰ ਅਜੇ ਨਾ ਕਰੋ।
Clean Code ਤਦ ਹੀ ਟੀਮ ਰਫ਼ਤਾਰ ਵਧਾਉਂਦਾ ਹੈ ਜਦ ਇਹ ਟੀਮ ਰਿਫਲੈਕਸ ਬਣ ਜਾਂਦਾ ਹੈ—ਨ ਕਿ ਨਿੱਜੀ ਪਸੰਦ। ਕੋਡ ਰਿਵਿਊਜ਼ ਉਹ ਥਾਂ ਹਨ ਜਿੱਥੇ ਨਾਂਕਰਨ, ਬਾਉਂਡਰੀਜ਼, ਅਤੇ ਛੋਟੇ ਫੰਕਸ਼ਨਾਂ ਵਰਗੇ ਸਿਧਾਂਤ ਸਾਂਝੇ ਉਮੀਦਾਂ ਵਿੱਚ ਬਦਲ ਜਾਂਦੇ ਹਨ।
ਛੰਗਾ ਰਿਵਿਊ ਇਹਨਾਂ ਚੀਜ਼ਾਂ ਲਈ ਅਪਟੀਮਾਈਜ਼ ਕਰਦਾ ਹੈ:
ਇੱਕ ਦੁਹਰਾਏ ਯੋਗ ਚੈੱਕਲਿਸਟ ਵਰਤੋਂ ਤਾਂ ਕਿ ਮਨਜ਼ੂਰੀ ਤੇਜ਼ ਹੋਵੇ ਅਤੇ ਵਾਪਸੀ ਘਟੇ:
ਲਿਖੇ ਹੋਏ ਮਿਆਰ (ਨਾਮਕਰਨ ਨਿਯਮ, ਫੋਲਡਰ ਢਾਂਚਾ, 에ਰਰ ਹੈਂਡਲਿੰਗ ਨਮੂਨੇ) ਵਾਦ-ਵਿਵਾਦ ਘਟਾਉਂਦੇ ਹਨ। "ਮੈਨੂੰ ਪਸੰਦ ਹੈ" ਦੀ ਥਾਂ, ਰਿਵਿਊਅਰ "ਅਸੀਂ ਇਹ ਤਰੀਕਾ ਕਰਦੇ ਹਾਂ" ਕਹਿ ਸਕਦਾ ਹੈ, ਜੋ ਰਿਵਿਊਜ਼ ਨੂੰ ਤੇਜ਼ ਅਤੇ ਘੱਟ ਨਿੱਜੀ ਬਣਾਉਂਦਾ ਹੈ।
ਕੋਡ ਦੀ ਨਿੰਦ ਕਰੋਂ, ਡਿਵੈਲਪਰ ਦੀ ਨਹੀਂ। ਸਵਾਲ ਅਤੇ ਦੇਖਣ-ਵਿੱਚ-ਸਾਫ਼ ਵਾਕ-ਵਿਨਿਮਯ ਕਰੋ:
process() ਨੂੰ calculateInvoiceTotals() ਰੀਨੇਮ ਕਰ ਸਕਦੇ ਹਾਂ ਤਾਂ ਜੋ ਇਹ ਜੋ ਵਾਪਸ ਕਰ ਰਿਹਾ ਹੈ ਉਸਨੂੰ ਮਿਲੇ?”ਛੰਗੀ ਟਿੱਪਣੀ:
// Why: rounding must match the payment provider’s rules (see PAY-142).
ਸ਼ੋਰ ਵਾਲੀ ਟਿੱਪਣੀ:
// increment i
ਉਹ ਟਿੱਪਣੀਆਂ ਲਿਖੋ ਜੋ ਕਿਉਂ ਨੂੰ ਸਮਝਾਉਂਦੀਆਂ ਹਨ, ਨਾ ਕਿ ਕੀ ਜੋ ਕੋਡ ਪਹਿਲਾਂ ਹੀ ਕਹਿ ਚੁੱਕਿਆ।
Clean Code ਸਿਰਫ਼ ਤਦ ਹੀ ਮਦਦਗਾਰ ਹੈ ਜਦ ਇਹ ਬਦਲਾਅ ਨੂੰ ਆਸਾਨ ਬਣਾਉਂਦਾ। ਇਸਨੂੰ ਅਪਣਾਉਣ ਦਾ ਪ੍ਰਯੋਗਕ ਤਰੀਕਾ ਇਹ ਹੈ: ਕੁਝ ਆਚਰਨਾਂ ਤੇ ਸਹਿਮਤ ਹੋਵੋ, ਨਤੀਜਿਆਂ ਨੂੰ ਮਾਪੋ, ਅਤੇ ਉਹ ਰੱਖੋ ਜੋ ਮਾਪਯੋਗ ਤੌਰ 'ਤੇ friction ਘਟਾਉਂਦਾ ਹੈ।
ਇਹ ਉਸ ਵਕਤ ਹੋਰ ਵੀ ਮਹੱਤਵਪੂਰਨ ਹੈ ਜਦ ਟੀਮਾਂ ਵੱਧ ਤੋਂ ਵੱਧ AI-ਸਹਾਇਤ ਵਿਕਾਸ 'ਤੇ ਨਿਰਭਰ ਹੋ ਰਹੀਆਂ ਹਨ। ਚਾਹੇ ਤੁਸੀਂ LLM ਨਾਲ scaffolding ਜਨਰੇਟ ਕਰ ਰਹੇ ਹੋ ਜਾਂ Koder.ai ਵਰਗੇ vibe-coding ਵਰਕਫਲੋਅ ਵਿੱਚ ਦੁਹਰਾਅ ਕਰ ਰਹੇ ਹੋ, ਉਹੀ ਸਿਧਾਂਤ lagu ਹੁੰਦੇ ਹਨ: ਸਪਸ਼ਟ ਨਾਮ, ਖੁੱਲ੍ਹੀਆਂ ਬਾਉਂਡਰੀਜ਼, ਅਤੇ ਅਨੁਸ਼ਾਸਿਤ ਰੀਫੈਕਟਰਿੰਗ ਹਨ ਜੋ ਤੇਜ਼ Iteration ਨੂੰ ਗੂੰਝਲਦਾਰ ਨਹੀਂ ਬਣਨ ਦਿੰਦੀਆਂ। ਟੂਲ ਆਉਟਪੁੱਟ ਤੇਜ਼ ਕਰ ਸਕਦੇ ਹਨ, ਪਰ Clean Code ਆਦਤਾਂ ਕੰਟਰੋਲ ਨੂੰ ਬਣਾਈ ਰੱਖਦੀਆਂ ਹਨ।
ਸਟਾਈਲ ਦੀ ਓਡ ਤਰਕ ਕਰਨ ਦੀ ਥਾਂ, ਉਹ ਸਿਗਨਲ ਦੇਖੋ ਜੋ ਧੀਮਾਪਣ ਨਾਲ ਸੰਬੰਧਿਤ ਹਨ:
ਹਫ਼ਤੇ ਵਿੱਚ ਇਕ ਵਾਰੀ 10 ਮਿੰਟ ਦੇ ਕੇ ਦੁਹਰਾਏ ਮੁੱਦਿਆਂ ਨੂੰ ਸਾਂਝੀ ਨੋਟ ਵਿੱਚ ਦਰਜ ਕਰੋ:
ਕਾਲੀ ਸਮੇਂ ਵਿੱਚ, ਰੁਝਾਨ ਸਾਹਮਣੇ ਆਉਂਦੇ ਹਨ। ਉਹ ਤੁਹਾਨੂੰ ਦੱਸਦੇ ਹਨ ਕਿ ਅਗਲਾ Clean Code ਆਦਤ ਕਿੱਥੇ ਸਭ ਤੋਂ ਵਧੇਰਾ ਲਾਭ ਦੇਵੇਗੀ।
ਇਹ ਸادہ ਅਤੇ ਲਾਗੂ ਕਰਨ ਯੋਗ ਰੱਖੋ:
data, manager, process ਵਰਗੇ vague ਸ਼ਬਦਾਂ ਨੂੰ ਬੈਨ ਕਰੋ ਜੇ ਡੋਮੇਨ ਸਪਸ਼ਟ ਨਾ ਹੋ।ਹਰ ਹਫ਼ਤੇ ਦੇ ਅੰਤ 'ਤੇ ਮੈਟ੍ਰਿਕਸ ਰਿਵਿਊ ਕਰੋ ਅਤੇ ਫੈਸਲਾ ਕਰੋ ਕਿ ਕੀ ਰੱਖਣਾ ਹੈ।
Clean Code matters because it makes future changes safer and faster. When code is clear, teammates spend less time decoding intent, reviews move quicker, bugs are easier to diagnose, and edits are less likely to cause “ripple effect” breakages.
In practice, Clean Code is a way to protect maintainability, which directly supports steady team velocity over weeks and months.
Maintainability is how easily your team can understand, change, and ship code without breaking unrelated parts.
A quick gut-check: if small edits feel risky, require lots of manual checking, or only one person “dares” to touch an area, maintainability is low.
Team velocity is the team’s reliable ability to deliver useful improvements over time.
It’s not about typing speed—it’s about reducing hesitation and rework. Clear code, stable tests, and good boundaries mean you can go from idea → PR → release repeatedly without accumulating drag.
Start by making names carry the information a reader would otherwise have to guess:
Name drift happens when behavior changes but the name doesn’t (e.g., validateUser() starts provisioning and logging too).
Practical fixes:
Boundaries are lines that keep responsibilities separate (modules/layers/services). They matter because they keep change local.
Common boundary smells:
A good boundary makes it obvious where a change belongs and reduces cross-file side effects.
Prefer small, focused functions when it reduces the amount of context a reader must hold.
A practical pattern:
calculateTax(), applyDiscounts)If splitting makes intent clearer and tests simpler, it’s usually worth it.
A side effect is any change beyond returning a value (mutating inputs, writing to DB, touching globals, triggering jobs).
To reduce surprises:
saveUser() vs getUser())Tests act as a safety net for refactoring and a boundary enforcer for promised behavior.
When time is limited, prioritize tests for:
Write tests that assert outcomes, not internal steps, so you can change implementation safely.
Use reviews to turn principles into shared habits, not personal preferences.
A lightweight checklist:
Written standards reduce debate and speed up approvals.
timeoutMs, totalCents, expiresAtUtcvalidatedEmailAddress, discountPercentIf a name forces someone to open three files to understand it, it’s probably too vague.
During review, ask: “What changes besides the return value?”