നിങ്ങൾ വിശ്വസിക്കുന്ന ലൈബ്രറികളിൽ ഒളിഞ്ഞിരിക്കുന്ന ഒരേപോലെയുള്ള ചില ബഗുകൾ
Langchain, Vite, Bat തുടങ്ങിയ വലിയ റെപ്പോസിറ്ററികളിലേക്ക് (repositories) ചെറിയ പരിഹാരങ്ങൾ (fixes) അയച്ചുകൊണ്ട് ഞാൻ സമയം ചെലവഴിക്കാറുണ്ട്.
ഈ പ്രോജക്റ്റുകൾ വ്യത്യസ്ത ഭാഷകളും വ്യത്യസ്ത മേഖലകളും ഉപയോഗിക്കുന്നവയാണ്. ഇവയുടെ മെയിന്റൈനർമാർ (maintainers) വിദഗ്ധരാണ്.
ബഗുകളുടെ എണ്ണമല്ല അതിശയിപ്പിക്കുന്ന കാര്യം. മറിച്ച് അവയുടെ പാറ്റേണുകളാണ് (patterns). മിക്ക ബഗുകളും വ്യത്യസ്ത വേഷങ്ങൾ ധരിച്ച ഒരേപോലെയുള്ള ചില രൂപങ്ങൾ മാത്രമാണ്.
ഈ രൂപങ്ങൾ തിരിച്ചറിഞ്ഞാൽ, അവ പ്രൊഡക്ഷനിൽ (production) എത്തുന്നതിന് മുമ്പ് തന്നെ നിങ്ങൾക്ക് അവ കണ്ടെത്താനാകും. ഞാൻ കണ്ടെത്തിയ അഞ്ച് പൊതുവായ പാറ്റേണുകൾ താഴെ പറയുന്നവയാണ്:
തെറ്റായ ഇൻപുട്ട് കീകൾ (Wrong Input Keys) In Langchain, ഒരു rename ഫംഗ്ഷൻ
old_pathഎന്ന കീ തിരയുകയായിരുന്നു. എന്നാൽ സിസ്റ്റം യഥാർത്ഥത്തിൽ അയച്ചത്pathഎന്ന കീ ആയിരുന്നു. ഇത് കോഡ് ക്രാഷ് ആകാൻ കാരണമായി. എന്തുകൊണ്ടാണ് ഇത് റിവ്യൂവിൽ നിന്ന് രക്ഷപ്പെടുന്നത്: ഡെവലപ്പർ ഫംഗ്ഷന് ആവശ്യമുള്ള ഇൻപുട്ട് നേരിട്ട് നിർമ്മിച്ചതുകൊണ്ട് യൂണിറ്റ് ടെസ്റ്റ് (unit test) വിജയിച്ചു, സിസ്റ്റം യഥാർത്ഥത്തിൽ അയക്കുന്ന ഇൻപുട്ട് ഉപയോഗിച്ചല്ല അത് ചെയ്തത്. പരിശോധിക്കേണ്ട രീതി: ഒരു ഫംഗ്ഷൻ ഒരു കീ വായിക്കുന്നുണ്ടെങ്കിൽ, ആ ഒബ്ജക്റ്റ് (object) എവിടെയാണ് നിർമ്മിക്കുന്നത് എന്ന് കണ്ടെത്തുക. ആ കീ സെറ്റ് ചെയ്യുന്ന മറ്റൊന്നുമില്ലെങ്കിൽ, നിങ്ങൾ ഒരു ബഗ് കണ്ടെത്തിയിരിക്കുന്നു. യഥാർത്ഥ കോൾ ചെയ്യുന്ന ഭാഗവുമായി (real caller) ടെസ്റ്റ് ചെയ്യുക.ട്രൂത്തിനസ്സ് കെണികൾ (Truthiness Traps) "ഈ വാല്യൂ സെറ്റ് ചെയ്തിട്ടുണ്ടോ" എന്ന് പരിശോധിക്കാൻ ഉദ്ദേശിക്കുമ്പോൾ ഒരു truthiness ചെക്ക് ഉപയോഗിക്കുന്നത് സാധാരണയായി സംഭവിക്കുന്ന ഒരു തെറ്റാണ്. ഉദാഹരണം:
const clause = defaultValue ? \DEFAULT ${defaultValue}` : '';` വാല്യൂ 0 ആണെങ്കിൽ, കോഡ് ആ ഭാഗം ഒഴിവാക്കും. 0 എന്നത് ഒരു യഥാർത്ഥ വാല്യൂ ആണ്, പക്ഷേ അത് "falsy" ആണ്. പരിശോധിക്കേണ്ട രീതി: എപ്പോഴും 0, ശൂന്യമായ സ്ട്രിംഗുകൾ (empty strings), false എന്നിവ ഉപയോഗിച്ച് ടെസ്റ്റ് ചെയ്യുക. "വാല്യൂ ഇല്ല" എന്നതും "വാല്യൂ ഉണ്ട് പക്ഷേ അത് പൂജ്യമാണ്" എന്നതും തമ്മിലുള്ള വ്യത്യാസം തിരിച്ചറിയാൻ നിങ്ങളുടെ കോഡിന് കഴിയുന്നില്ലെങ്കിൽ, അത് തകരാറിലാണ്.അൺസൈൻഡ് ഇന്റീജർ അണ്ടർഫ്ലോ (Unsigned Integer Underflow) Bat പ്രോജക്റ്റിൽ, ടെർമിനൽ വീതി (terminal width) കണക്കാക്കാൻ മാത്തമാറ്റിക്സ് ഉപയോഗിച്ചിരുന്നു. വീതി വളരെ കുറവാണെങ്കിൽ, കുറയ്ക്കൽ (subtraction) ഒരു അണ്ടർഫ്ലോയ്ക്ക് (underflow) കാരണമാകും. അൺസൈൻഡ് ടൈപ്പുകളിൽ (unsigned types), ഇത് വളരെ വലിയൊരു സംഖ്യയായി മാറുന്നതിനോ അല്ലെങ്കിൽ ക്രാഷ് ആകുന്നതിനോ കാരണമാകും. പരിശോധിക്കേണ്ട രീതി: യൂസർ ഇൻപുട്ട് ഉപയോഗിച്ച് ഒരു അൺസൈൻഡ് ടൈപ്പിൽ നടത്തുന്ന ഏതൊരു കുറയ്ക്കലും (subtraction) ഒരു saturating subtraction ആയിരിക്കണം. 0, 1 എന്നിവ ഉപയോഗിച്ച് ടെസ്റ്റ് ചെയ്യുക.
എൻകോഡിംഗും എഡ്ജ് കേസുകളും (Encoding and Edge Cases) നോൺ-ASCII (non-ASCII) ക്യാരക്ടറുകൾ കാണുന്നത് വരെ ടെക്സ്റ്റ് നിയമങ്ങൾ ലളിതമായി തോന്നാം. ഒരു ജനറേറ്റർ നിർമ്മിച്ചേക്കാവുന്ന സ്റ്റാക്ക്ഡ് ഡെലിമിറ്ററുകളുമായി (stacked delimiters) Mistune-ന് പ്രശ്നങ്ങളുണ്ടായിരുന്നു. Unicode combining marks കൈകാര്യം ചെയ്യുമ്പോൾ Wenmode പരാജയപ്പെട്ടു. എന്തുകൊണ്ടാണ് ഇത് റിവ്യൂവിൽ നിന്ന് രക്ഷപ്പെടുന്നത്: ASCII എല്ലാ ടെസ്റ്റുകളും വിജയിക്കും. നിങ്ങൾ നേരിട്ട് ടൈപ്പ് ചെയ്യാത്ത ഇൻപുട്ടുകൾ വരുമ്പോൾ മാത്രമേ ബഗുകൾ പ്രത്യക്ഷപ്പെടുകയുള്ളൂ. പരിശോധിക്കേണ്ട രീതി: ഒരു ഡിഫറൻഷ്യൽ ടെസ്റ്റ് (differential test) ഉപയോഗിക്കുക. നിങ്ങളുടെ ഔട്ട്പുട്ടിനെ മറ്റൊരു തെളിയിക്കപ്പെട്ട ഇംപ്ലിമെന്റേഷനുമായി (implementation) താരതമ്യം ചെയ്യുക.
സുരക്ഷിതമല്ലാത്ത പാഴ്സിംഗ് (Unsafe Parsing) Vite-ൽ ഒരു ഗാർഡ് (guard) ഇല്ലാതെ URL-കൾ ഡീകോഡ് ചെയ്യുന്ന ഒരു മിഡിൽവെയർ (middleware) ഉണ്ടായിരുന്നു. തെറ്റായ രീതിയിലുള്ള ഒരു URL വന്നാൽ അത് URIError ഉണ്ടാക്കുകയും മിഡിൽവെയർ ക്രാഷ് ആകുകയും ചെയ്യും. പരിശോധിക്കേണ്ട രീതി: നിങ്ങൾ നിർമ്മിക്കാത്ത ഏതൊരു ഡീകോഡിംഗോ പാഴ്സിംഗോ നടത്തുമ്പോൾ ഒരു try/catch ബ്ലോക്ക് ആവശ്യമാണ്. നിങ്ങളുടെ കോഡ് തകരാറിലാകുന്നുണ്ടോ എന്ന് പരിശോധിക്കാൻ തെറ്റായ സ്ട്രിംഗുകൾ (broken strings) നൽകി നോക്കുക.
എന്റെ ശീലം ലളിതമാണ്. ഞാൻ ഒരു ബഗ് പരിഹരിക്കുമ്പോൾ, അതിന്റെ തൊട്ടടുത്തുള്ള കോഡ് കൂടി പരിശോധിക്കാറുണ്ട്. ഒരു ഹാൻഡ്ലറിൽ (handler) ബഗ് ഉണ്ടെങ്കിൽ, അതിന്റെ സഹോദര ഹാൻഡ്ലറിലും (sibling handler) പലപ്പോഴും ഇതേ പാറ്റേൺ കാണാറുണ്ട്.
Source: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
