വികസനം (development) നിർത്തിവെക്കാൻ നിങ്ങൾക്ക് കഴിയില്ല. അത് ആദ്യം അംഗീകരിക്കേണ്ട കാര്യമാണ്. ടിക്കറ്റുകൾ വന്നുകൊണ്ടേയിരിക്കും, ഉപഭോക്താക്കൾ ഷിപ്പിംഗുകൾ പ്രതീക്ഷിക്കുന്നു, നിങ്ങൾ ഡോക്യുമെന്റ് ചെയ്യാൻ തീരുമാനിച്ചതുകൊണ്ട് മാത്രം നിലവിലുള്ള കോഡ് പ്രവർത്തിക്കുന്നത് നിൽക്കില്ല. ആദ്യ ദിവസം മുതൽ ഉണ്ടായിരിക്കേണ്ട സ്പെസിഫിക്കേഷൻ എഴുതാൻ വേണ്ടി ടീമിന് ഒരു മാസത്തെ ഇടവേള നൽകാൻ ഒരു എഞ്ചിനീയറിംഗ് മാനേജരും സമ്മതിക്കില്ല. OpenSpec നിർമ്മിച്ചിരിക്കുന്നത് യാഥാർത്ഥ്യത്തിന് വേണ്ടിയാണ്, അല്ലാതെ പുതിയ പ്രോജക്റ്റുകളുടെ സങ്കൽപ്പങ്ങൾക്കല്ല. നിങ്ങളുടെ കൈവശമുള്ള കാര്യങ്ങളോടൊപ്പം തന്നെ ഇത് ചേർത്ത് ഉപയോഗിക്കുമ്പോഴാണ് ഇത് ഏറ്റവും നന്നായി പ്രവർത്തിക്കുന്നത്.
ഇവിടെ ലക്ഷ്യം ഒരു റീറൈറ്റ് (rewrite) അല്ല. മറിച്ച് സത്യസന്ധമായ ഒരു അന്വേഷണമാണ്. പ്രൊഡക്ഷനിൽ യഥാർത്ഥത്തിൽ എന്താണ് പ്രവർത്തിക്കുന്നത് എന്ന് നിങ്ങൾ കണ്ടെത്തുകയും, അത് കൃത്യമായി വിവരിക്കുകയും, കോഡ് മാറുന്നതിനനുസരിച്ച് ആ വിവരണവും മാറാൻ അനുവദിക്കുകയും വേണം. നിങ്ങളുടെ സ്പെസിഫിക്കേഷൻ സിസ്റ്റവുമായി പൊരുത്തപ്പെടുമ്പോൾ, അടുത്ത ക്വാർട്ടറിൽ ജോലിക്കെത്തുന്ന എഞ്ചിനീയർമാർക്കും നിങ്ങളുടെ IDE-യിൽ ഇപ്പോൾ ഉപയോഗിക്കുന്ന AI ടൂളുകൾക്കും അത് കാര്യങ്ങൾ എളുപ്പമാക്കും. ഒരു റിലീസും നഷ്ടപ്പെടാതെ ഇത് എങ്ങനെ ചെയ്യാം എന്ന് നോക്കാം.
നിങ്ങൾ യഥാർത്ഥത്തിൽ ചെയ്യുന്നത് കൊണ്ട് തുടങ്ങുക
നിങ്ങളുടെ റിപ്പോസിറ്ററി തുറന്നാൽ controllers, models, services, utils എന്നിങ്ങനെയുള്ള ഫോൾഡറുകൾ കാണാം. അവ സാങ്കേതിക പാളികളാണ് (technical layers), അവ നിങ്ങളെ തെറ്റിദ്ധരിപ്പിച്ചേക്കാം. നിങ്ങളുടെ സിസ്റ്റം ബിസിനസ്സിനായി എന്താണ് ചെയ്യുന്നത് എന്ന് അവ വിവരിക്കുന്നില്ല. ജാവാസ്ക്രിപ്റ്റ് ഫയലുകൾ നിറഞ്ഞ ഒരു ഫോൾഡർ ഒരു ഓർഡർ എങ്ങനെ ഒരു ഷിപ്പിംഗ് ആയി മാറുന്നു എന്ന് വിശദീകരിക്കുന്നില്ല. OpenSpec നടപ്പിലാക്കാൻ, നിങ്ങൾ 'കപ്പാബിലിറ്റികളെ' (capabilities) അടിസ്ഥാനമാക്കി ചിന്തിക്കേണ്ടതുണ്ട്.
നിങ്ങൾ മുഴുവൻ സ്റ്റാക്കും മറ്റൊരു ഭാഷയിൽ മാറ്റിയെഴുതുകയാണെങ്കിൽ പോലും നിലനിൽക്കുന്ന സ്ഥിരതയുള്ള ബിസിനസ്സ് പ്രവർത്തനങ്ങൾക്കായി നോക്കുക. മിക്ക ഉൽപ്പന്ന കമ്പനികളിലും ഇവ വീണ്ടും വീണ്ടും കാണപ്പെടുന്നു: Orders, Billing, Inventory, Customers, మరియు Notifications. ഇവയിൽ അഞ്ചോ എട്ടോ പ്രധാന കപ്പാബിലിറ്റികൾ പേര് നൽകുക.
ഓരോന്നിനും, അഞ്ച് പ്രത്യേക ചോദ്യങ്ങൾക്ക് ഉത്തരം നൽകാൻ സ്വയം നിർബന്ധിക്കുക. ഈ കപ്പാബിലിറ്റി ഏത് യഥാർത്ഥ പ്രശ്നമാണ് പരിഹരിക്കുന്നത്? കോഡ് യഥാർത്ഥത്തിൽ എവിടെയാണ് ഇരിക്കുന്നത്—ഒരു സർവീസിലാണോ, മൂന്ന് മൈക്രോസർവീസുകളിലാണോ, അതോ ആരും തൊടാൻ ആഗ്രഹിക്കാത്ത ഒരു ലെഗസി മോഡ്യൂളിലാണോ? ഇത് എന്തിനെയാണ് ഉത്തേജിപ്പിക്കുന്നത് (trigger): ഒരു യൂസർ ക്ലിക്ക്, ഒരു ഷെഡ്യൂൾ ചെയ്ത ക്രോൺ ജോബ് (cron job), അതോ ഒരു ഇൻബൗണ്ട് വെബ്ഹുക്ക് (inbound webhook) ആണോ? ഇതിലേക്ക് ഏത് ഡാറ്റയാണ് വരുന്നത്, പുറത്തേക്ക് ഏത് ഡാറ്റയാണ് വരുന്നത്? അവസാനമായി, മറ്റ് ഏത് സിസ്റ്റങ്ങളാണ് ഇതിനെ ആശ്രയിച്ചിരിക്കുന്നത്, അതായത് ഈ ഭാഗം പ്രവർത്തിക്കാതായാൽ എന്താണ് തകരാറിലാകുന്നത്?
തികഞ്ഞ സത്യസന്ധത പുലർത്തുക. നിങ്ങളുടെ "Customers" കപ്പാബിലിറ്റി ഒരു Rails monolith, ഒരു Node API, കൂടാതെ ഒരു എക്സ്റ്റേണൽ CRM എന്നിവയിൽ ചിതറിക്കിടക്കുകയാണെങ്കിൽ, അത് കൃത്യമായി എഴുതുക. നിങ്ങളുടെ മാപ്പ് ഒരു ആർക്കിടെക്റ്റിന്റെ സ്വപ്നമായിരിക്കരുത്, മറിച്ച് യഥാർത്ഥ സാഹചര്യത്തെപ്പോലെ ആയിരിക്കണം.
സത്യം എഴുതുക, ആഗ്രഹിക്കലല്ല
ഏതൊരു ഡോക്യുമെന്റേഷൻ ശ്രമത്തിലെയും ഏറ്റവും അപകടകരമായ വാചകം ഇതാണ്, "ഇത് എഴുതുന്ന സമയത്ത്, നമുക്ക് ഇത് ശരിയാക്കിയാലോ?" നിൽക്കൂ. നിങ്ങൾ ചെക്കൗട്ട് ഫ്ലോ (checkout flow) പുനർരൂപകൽപ്പന ചെയ്യുകയല്ല. ഇപ്പോൾ യഥാർത്ഥ ക്രെഡിറ്റ് കാർഡുകൾ ചാർജ് ചെയ്യുന്ന ചെക്കൗട്ട് ഫ്ലോയെയാണ് നിങ്ങൾ വിവരിക്കുന്നത്.
ഒരു ഓർഡർ നൽകുന്നത് ഉടൻ തന്നെ പേയ്മെന്റ് ക്യാപ്ചർ ചെയ്യുകയും തുടർന്ന് ഒരു ബാക്ക്ഗ്രൗണ്ട് വർക്കർ വഴി ഇമെയിൽ അയക്കുകയും ചെയ്യുന്നുണ്ടെങ്കിൽ, ആ കൃത്യമായ ക്രമം തന്നെ രേഖപ്പെടുത്തുക. അടുത്ത ക്വാർട്ടറിൽ നിങ്ങൾ ചേർക്കാൻ ഉദ്ദേശിക്കുന്ന ഒരു ഇവന്റ് ക്യൂ (event queue) ഇതിൽ ഉൾപ്പെടുത്തരുത്. വാലിഡേഷൻ യഥാർത്ഥത്തിൽ ഒരു സർവീസ് ക്ലാസിനുള്ളിലാണ് നടക്കുന്നത് എങ്കിൽ, അത് API എഡ്ജിൽ (API edge) നടക്കുന്നു എന്ന് അവകാശപ്പെടരുത്. ആഗ്രഹങ്ങളേക്കാൾ കൃത്യതയ്ക്കാണ് പ്രാധാന്യം.
തെറ്റായ ഡോക്യുമെന്റേഷൻ ഒന്നുമില്ലാത്തതിനേക്കാൾ മോശമാണ്. നിലവിലില്ലാത്ത പെരുമാറ്റങ്ങൾ പ്രതീക്ഷിക്കാൻ ഇത് പുതിയ ജീവനക്കാരെ പഠിപ്പിക്കുന്നു. ആഗ്രഹങ്ങളെ അടിസ്ഥാനമാക്കി ഇത് AI കോഡിംഗ് അസിസ്റ്റന്റുകളെ തെറ്റായ പാതകളിലേക്ക് നയിക്കുന്നു. നിങ്ങളുടെ സ്പെസിഫിക്കേഷൻ പ്രൊഡക്ഷനുമായി പൊരുത്തപ്പെടുമ്പോൾ, നിങ്ങൾ ഒരു വിശ്വസനീയമായ അടിസ്ഥാനം സൃഷ്ടിക്കുന്നു. "ഉദ്ദേശിച്ച" ഫ്ലോയെക്കുറിച്ച് ഊഹിക്കുന്നത് നിർത്തുന്നതുകൊണ്ട് ഡീബഗ്ഗിംഗ് വേഗത്തിലാകുന്നു. തുടക്കസ്ഥാനം യഥാർത്ഥമാണെന്ന് അറിയാവുന്നത് കൊണ്ട് റീഫാക്റ്ററിംഗ് (refactoring) കൂടുതൽ സുരക്ഷിതമാകുന്നു.
നിങ്ങളുടെ API-കളിൽ നിന്ന് കോൺട്രാക്റ്റുകൾ വേർതിരിച്ചെടുക്കുക
നിങ്ങളുടെ API എൻഡ്പോയിന്റുകൾ ഇതിനകം തന്നെ നിയമങ്ങൾ നടപ്പിലാക്കുന്നുണ്ട്. അവ അവയെ അവ്യക്തമായി (implicit) മാത്രമേ സൂക്ഷിക്കുന്നുള്ളൂ. OpenSpec നടപ്പിലാക്കുക എന്നാൽ ആ നിയമങ്ങളെ പരസ്യമാക്കുക എന്നാണ് അർത്ഥം.
ഇൻപുട്ടുകളും വാലിഡേഷനും (validation) ഉപയോഗിച്ച് തുടങ്ങുക. എൻഡ്പോയിന്റ് യഥാർത്ഥത്തിൽ എന്താണ് സ്വീകരിക്കുന്നത്? ടൈപ്പുകൾ, ആവശ്യമായ ഫീൽഡുകൾ, പരമാവധി നീളം, ക്രോസ്-ഫീൽഡ് ഡിപെൻഡൻസികൾ എന്നിവ രേഖപ്പെടുത്തുക. തുടർന്ന് ബിസിനസ്സ് പെരുമാറ്റം വിവരിക്കുക. ഈ കോൾ ഒരു റെക്കോർഡ് സൃഷ്ടിക്കുന്നുണ്ടോ, ഒരു സൈഡ് ഇഫക്റ്റ് ഉണ്ടാക്കുന്നുണ്ടോ, അതോ മറ്റൊരു സർവീസുമായി സ്റ്റേറ്റ് വാലിഡേറ്റ് ചെയ്യുന്നുണ്ടോ? കൃത്യമായി പറയുക.
അവസാനമായി, റെസ്പോൺസുകൾ (responses) പട്ടികപ്പെടുത്തുക. സക്സസ് (success) ആണെങ്കിൽ എന്താണ് ലഭിക്കുക? കൃത്യമായ എറർ കോഡുകൾ എന്തൊക്കെയാണ്, അവ ഏത് സാഹചര്യത്തിലാണ് വരുന്നത്? "returns an error" എന്ന് എഴുതരുത്. "billing address ഇല്ലാതിരിക്കുമ്പോൾ 422-ഉം, ഇൻവെന്ററി മറ്റൊരു പ്രക്രിയയാൽ നേരത്തെ റിസർവ് ചെയ്യപ്പെട്ടിട്ടുണ്ടെങ്കിൽ 409-ഉം റിട്ടേൺ ചെയ്യുന്നു" എന്ന് എഴുതുക. ഇത്തരത്തിലുള്ള കൃത്യത, ഒരു അവ്യക്തമായ റൗട്ടിനെ ഫ്രണ്ട്എൻഡ് ടീമുകൾക്കും QA എഞ്ചിനീയർമാർക്കും ഓട്ടോമേറ്റഡ് ടൂളുകൾക്കും വിശ്വസിക്കാവുന്ന ഒരു കോൺട്രാക്റ്റാക്കി മാറ്റുന്നു.
ഒളിഞ്ഞിരിക്കുന്ന നിയമങ്ങളെ കണ്ടെത്തുക
നിങ്ങളുടെ സിസ്റ്റത്തിലെ ഏറ്റവും വിലപ്പെട്ട അറിവുകളിൽ ചിലത് കാണപ്പെടാത്ത ഇടങ്ങളിലാണ് ഒളിഞ്ഞിരിക്കുന്നത്. അവ സർവീസ് ക്ലാസുകൾക്കുള്ളിലെ കണ്ടീഷണൽ ബ്ലോക്കുകളിലോ, ഡാറ്റാബേസ് ട്രിഗറുകളിലോ, അല്ലെങ്കിൽ രണ്ടു വർഷമായി ആരും തൊടാത്ത സ്റ്റോർഡ് പ്രൊസീജറുകളിലോ കുടുങ്ങിക്കിടക്കുന്നു. ഇവയാണ് നിങ്ങളുടെ ബിസിനസ്സ് നിയമങ്ങൾ; ഇവ സാധാരണയായി സിസ്റ്റം തകരാറിലാകുമ്പോഴോ അല്ലെങ്കിൽ തുടക്കം മുതൽ കൂടെയുള്ള ഏക എഞ്ചിനീയറെ കണ്ടെത്തുമ്പോഴോ ആണ് വീണ്ടും തിരിച്ചറിയപ്പെടുന്നത്.
അവയെ വെളിച്ചത്തുകൊണ്ടുവരിക. നിങ്ങൾക്ക് നേരത്തെ അറിയാവുന്നവയിൽ നിന്ന് തുടങ്ങുക. ഒരു നിശ്ചിത തുകയ്ക്ക് മുകളിലുള്ള ഓർഡറുകൾക്ക് മുന്നോട്ട് പോകുന്നതിന് മുമ്പ് മാനേജരുടെ അനുമതി ആവശ്യമാണ്. നിഷ്ക്രിയമായ യൂസർ അക്കൗണ്ടുകൾക്ക് പുതിയ ഓർഡറുകൾ നൽകാൻ കഴിയില്ല. സെറ്റിൽമെന്റ് പൂർത്തിയാകുന്നതിന് മുമ്പ് മാത്രമേ റീഫണ്ടുകൾ അനുവദിക്കൂ. ഓരോ നിയമവും അത് നിയന്ത്രിക്കുന്ന പ്രവർത്തനത്തിന് തൊട്ടടുത്ത് തന്നെ എഴുതുക; ഒരു പ്രൊഡക്റ്റ് മാനേജർക്ക് പോലും ഒരു വിവർത്തകൻ ഇല്ലാതെ വായിക്കാൻ കഴിയുന്നത്ര ലളിതമായ ഭാഷയിലായിരിക്കണം അത്.
ഈ നിയമങ്ങൾ നിങ്ങൾ കേന്ദ്രീകരിക്കുമ്പോൾ, അവ വെറുതെ രേഖപ്പെടുത്തുക മാത്രമല്ല നിങ്ങൾ ചെയ്യുന്നത്. നിങ്ങൾ ആവർത്തനങ്ങൾ കണ്ടെത്തുന്നു. വൈരുദ്ധ്യങ്ങൾ വെളിപ്പെടുത്തുന്നു. കൂടാതെ, നിങ്ങൾ മറന്നുപോയ ഒരു നിബന്ധനയെ അബദ്ധവശാൽ ലംഘിക്കുന്ന രീതിയിലുള്ള ഒരു ചെറിയ മാറ്റം ആരെങ്കിലും വരുത്തുന്നതിന് മുമ്പ്, നയങ്ങളെക്കുറിച്ച് ചർച്ച ചെയ്യാൻ ടീമിന് മുഴുവനും ഒരു പൊതു ഇടം നൽകുന്നു.
സിസ്റ്റത്തിന്റെ ഘടന മാപ്പ് ചെയ്യുക
ആധുനിക സിസ്റ്റങ്ങൾ ഇവന്റുകളെ (events) അടിസ്ഥാനമാക്കിയാണ് പ്രവർത്തിക്കുന്നത്. ഒരു സർവീസിലെ ഒരു പ്രവർത്തനം ഉപയോക്താവിന് കാണാൻ കഴിയുന്നതിന് മുമ്പ് തന്നെ മറ്റ് പകുതിയിലധികം സർവീസുകളിലും സ്വാധീനം ചെലുത്തുന്നു. ആ സ്വാധീനങ്ങളെ നിങ്ങൾ രേഖപ്പെടുത്തേണ്ടതുണ്ട്. നിങ്ങളുടെ പ്രധാന വർക്ക്ഫ്ലോകളിൽ ഒരു ഇവന്റിൽ നിന്ന് അടുത്തതിലേക്കുള്ള ഒഴുക്ക് മാപ്പ് ചെയ്യുക. 'ഓർഡർ ക്രിയേറ്റ് ചെയ്യപ്പെട്ടു' എന്നത് 'ഇൻവെന്ററി റിസർവ് ചെയ്യപ്പെട്ടു' എന്നതിലേക്കും, അത് 'പേയ്മെന്റ് കൺഫേം ചെയ്യപ്പെട്ടു' എന്നതിലേക്കും നയിക്കുന്നു. ചില ഘട്ടങ്ങൾ ദുർബലമാണെന്നോ വ്യത്യസ്ത പ്രോട്ടോക്കോളുകൾ ഉപയോഗിക്കുന്നുണ്ടെന്നോ തോന്നിയാലും, ആ മുഴുവൻ ശൃംഖലയും വരച്ചുചേർക്കുക.
ആഭ്യന്തര ട്രാഫിക്കിൽ മാത്രം ഒതുങ്ങരുത്. നിങ്ങൾ അവയെ അങ്ങനെ കണക്കാക്കിയാലും ഇല്ലെങ്കിലും, ബാഹ്യ സർവീസുകളും നിങ്ങളുടെ സിസ്റ്റത്തിന്റെ ഭാഗമാണ്. ഓരോ ഇന്റഗ്രേഷനും അതിന്റെ ഉദ്ദേശ്യം, നിങ്ങളുടെ ആപ്ലിക്കേഷൻ എങ്ങനെ അതന്റിക്കേറ്റ് ചെയ്യുന്നു, അത് എങ്ങനെ പരാജയപ്പെടുന്നു എന്നിവ രേഖപ്പെടുത്തുക. പേയ്മെന്റ് ഗേറ്റ്വേ മുപ്പത് സെക്കൻഡിന് ശേഷം ടൈമൗട്ട് ആകുകയും ഒരു ജനറിക് 500 എറർ നൽകുകയും ചെയ്യുന്നുണ്ടോ? ഷിപ്പിംഗ് API വാരാന്ത്യങ്ങളിൽ തെറ്റായ (malformed) JSON നൽകുന്നുണ്ടോ? ഐഡന്റിറ്റി പ്രൊവൈഡർ അതിന്റെ ഡോക്യുമെന്റേഷനിൽ പറയുന്നതിനേക്കാൾ നേരത്തെ റീഫ്രഷ് ടോക്കണുകൾ റദ്ദാക്കുന്നുണ്ടോ? ഈ വിവരങ്ങൾ അപ്രധാനമായി തോന്നാം
