सभी आर्टिकल
ट्यूटोरियल · 6 min read

पुनरुत्पादनीय बिखराव: सीड्स, नियतिवाद और बिखरे स्तर का संस्करण नियंत्रण

क्यों प्रक्रियात्मक बिखराव नियतात्मक होना चाहिए: कैसे सीड्स यादृच्छिकता को दोहराने योग्य बनाते हैं, क्यों नेटिव इंस्टेंसेस में बेक करना एक बिखरे स्तर को diff करने योग्य और merge करने योग्य बनाता है, और कैसे एक टीम की वनस्पति को स्रोत नियंत्रण के तहत चुपचाप बदलने से रोका जाए।

Coloured prayer flags strung across a mossy, fern-covered forest floor

संक्षेप में: प्रक्रियात्मक बिखराव केवल तब भरोसेमंद है जब यह पुनरुत्पादनीय हो: वही इनपुट को हर मशीन और हर बिल्ड पर हमेशा वही जंगल पैदा करना चाहिए। इसका मतलब है सीड्स को समझना (यादृच्छिकता को दोहराने योग्य कैसे बनाया जाए), क्यों एक जीवित प्रक्रियात्मक सिस्टम स्रोत नियंत्रण के तहत खतरनाक है, और क्यों एक बिखराव को नेटिव इंजन इंस्टेंसेस में बेक करना एक अनmergeable ब्लैक बॉक्स को एक diff करने योग्य, समीक्षा करने योग्य, संस्करण-नियंत्रण करने योग्य एसेट में बदल देता है। यह लेख नियतिवाद, सीड्स, और कैसे एक टीम की वनस्पति को सभी के पैरों के नीचे चुपचाप बदलने से रोका जाए, कवर करता है।

फर्न जो जंगल के फर्श को दोहराए हुए लेकिन विविध गुच्छों में कालीन बना रहे हैं यह यादृच्छिक लगता है, लेकिन एक टीम के लिए यह दोहराने योग्य यादृच्छिकता होनी चाहिए: तुम्हारी मशीन पर, तुम्हारे टीम के साथी की, और बिल्ड सर्वर पर एक ही। नियतिवाद वह है जो एक सुंदर बिखराव को कुछ ऐसे में बदलता है जिसे तुम वास्तव में शिप और बनाए रख सकते हो।

नियतिवाद क्यों मायने रखता है

यदि एक बिखराव हर बार खोलने या बनाने पर अलग तरह से पुनर्जनित होता है, तुम्हारा स्तर चुपचाप बदल जाता है: टक्कर हिलती है, छिपी वस्तुएं दिखाई देती हैं, प्लेटेस्ट्स दोहराने योग्य होना बंद कर देते हैं। नियतात्मक बिखराव हमेशा वही इनपुट से बिल्कुल वही परिणाम पैदा करता है।

यादृच्छिकता जो दोहराने योग्य नहीं है, एक स्तर में एक बग कारखाना है। यदि एक अलग मशीन पर दृश्य खोलना, या अगले हफ्ते इसे फिर से बनाना, फिर से फेरबदल करता है कि हर पत्थर और झाड़ी कहां उतरती है, तो एक जगह जो साफ थी अब अवरुद्ध है, एक दृष्टि रेखा जिसे तुमने ट्यून किया वह टूटी है, और एक प्लेटेस्ट परिणाम पर भरोसा नहीं किया जा सकता क्योंकि परीक्षण के तहत स्तर वह स्तर नहीं है जो तुमने शिप किया। नियतिवाद (वही इनपुट, वही आउटपुट, हमेशा) वह है जो एक प्रक्रियात्मक बिखराव को सुरक्षित बनाता है। यह "कंप्यूटर ने कुछ पौधे रखे" और "स्तर की एक परिभाषित, स्थिर स्थिति है जिस पर मैं भरोसा कर सकता हूं" के बीच का अंतर है।

सीड्स: यादृच्छिकता को दोहराने योग्य बनाना

एक सीड एक यादृच्छिक अनुक्रम के लिए प्रारंभिक संख्या है। वही सीड → हर बार वही "यादृच्छिक" प्लेसमेंट। सीड को उजागर करो और सहेजो, और तुम्हारा बिखराव पुनरुत्पादनीय है; इसे सच्ची यादृच्छिकता पर छोड़ दो और यह हर रन पर एक अलग स्तर है।

कंप्यूटर सच्ची यादृच्छिकता नहीं करते: वे नियतात्मक अनुक्रम चलाते हैं जो यादृच्छिक दिखते हैं, प्रत्येक अनुक्रम एक प्रारंभिक संख्या द्वारा परिभाषित होता है जिसे सीड कहा जाता है। वही सीड खिलाओ और तुम्हें वही अनुक्रम मिलता है, इसलिए वही प्लेसमेंट, हर एक बार। यह पुनरुत्पादनीय बिखराव की कुंजी है: उपकरण एक सीड को उजागर करता है, तुम इसे दृश्य के साथ सहेजते हो, और जंगल अब (सीड + पैरामीटर + सतह) का शुद्ध फ़ंक्शन है। एक अलग व्यवस्था जो तुम्हें पसंद है उसे खोजने के लिए सीड बदलो, फिर इसे लॉक करो। कुछ भी जो इसके बजाय वास्तव में असीडेड यादृच्छिक स्रोत से खींचता है (घड़ी, हर खुलने पर एक ताजा रोल) एक स्तर पैदा करता है जो हर बार लोड होने पर अलग है, जो उत्पादन के लिए अनुपयोगी है।

संस्करण नियंत्रण की समस्या

"एक सिस्टम + पैरामीटर" के रूप में संग्रहीत एक जीवित प्रक्रियात्मक बिखराव स्रोत नियंत्रण के लिए एक ब्लैक बॉक्स है: तुम इसे diff नहीं कर सकते, समीक्षा नहीं कर सकते, और दो लोग इसे संपादित करते हुए एक unmergeable संघर्ष पैदा करते हैं। टीमों को एक ऐसे रूप में बिखराव की आवश्यकता होती है जिसे Git या Perforce वास्तव में ट्रैक कर सकें।

यहीं बिखराव एक टीम की वास्तविकता से मिलता है। यदि तुम्हारा जंगल केवल "इन सेटिंग्स के साथ एक बिखराव सिस्टम" के रूप में मौजूद है, स्रोत नियंत्रण नहीं देख सकता कि क्या इसने पैदा किया: केवल कि कुछ पैरामीटर बदले। तुम एक पुल रिक्वेस्ट में प्लेसमेंट परिवर्तन की समीक्षा नहीं कर सकते, तुम नहीं बता सकते कि क्या हिला, और यदि दो कलाकार एक ही बिखराव को छूते हैं, तुम्हें एक merge संघर्ष मिलता है जिसे कोई भी उपकरण अर्थपूर्ण तरीके से हल नहीं कर सकता। एक बिखरा स्तर जो केवल एक जीवित जनरेटर के भीतर रहता है, उन सिस्टम्स के लिए अदृश्य है जिन पर टीमें सुरक्षित रूप से सहयोग करने के लिए भरोसा करती हैं, यही कारण है कि "यह सब प्रक्रियात्मक है" चुपचाप "कोई भी जंगल को सुरक्षित रूप से संपादित नहीं कर सकता" बन सकता है।

जंगल के फर्श पर बिखरे छोटे मशरूम इनमें से हर एक स्थिति, घूर्णन और पैमाने के साथ एक इंस्टेंस है। जब बिखराव नेटिव इंस्टेंसेस में बेक किया जाता है, वे वास्तविक, निरीक्षण योग्य डेटा बन जाते हैं: जंगल एक सूत्र होना बंद कर देता है और कुछ ऐसा बन जाता है जिसे तुम पंक्ति दर पंक्ति समीक्षा कर सकते हो।

बेक करना इसे diff करने योग्य बनाता है

बिखराव को नेटिव इंजन इंस्टेंसेस में बेक करो: ठोस परिवर्तनों के साथ वास्तविक रखी वस्तुएं। अब यह सामान्य दृश्य डेटा है: diff करने योग्य, समीक्षा करने योग्य, merge करने योग्य, और हर मशीन पर समान क्योंकि यह संग्रहीत है, पुनर्जनित नहीं।

नियतिवाद और संस्करण नियंत्रण दोनों का समाधान वही चाल है: बेक। एक जीवित जनरेटर शिप करने के बजाय, तुम बिखराव को साधारण नेटिव इंजन इंस्टेंसेस में बेक करते हो: दृश्य में संग्रहीत ठोस स्थितियों, घूर्णनों और पैमानों के साथ वास्तविक रखी मेशेस। यह हर समस्या को एक बार में गिरा देता है। यह परिभाषा के अनुसार नियतात्मक है (यह संग्रहीत डेटा है, फिर से रोल नहीं)। यह diff करने योग्य है (स्रोत नियंत्रण बदले हुए ठोस परिवर्तन देखता है)। यह समीक्षा करने योग्य है (एक लीड एक पुल रिक्वेस्ट में देख सकता है कि वास्तव में क्या हिला)। और यह रनटाइम पर इंजन को कुछ भी असामान्य नहीं खर्च करता, क्योंकि यह केवल इंस्टेंस मेशेस हैं। एक वर्कफ्लो जो नियमों के साथ घनत्व पेंट करता है और फिर नेटिव इंस्टेंसेस में बेक करता है: जैसे कि Numivo काम करता है: तुम्हें प्रक्रियात्मक बिखराव की ऑथरिंग गति और हाथ से रखी सामग्री की स्थिरता देता है, ब्लैक-बॉक्स भंगुरता के बिना।

एक टीम की वनस्पति को स्थिर रखना

सीड्स लॉक करो, कमिट से पहले बेक करो, और बेक किए गए परिणाम को सत्य के स्रोत के रूप में मानो। जानबूझकर फिर से बिखराओ (सीड बंप करो, diff समीक्षा करो), कभी दुर्घटनावश नहीं, ताकि जंगल केवल तब बदले जब कोई चाहे।

एक टीम के लिए व्यावहारिक अनुशासन छोटा है। सीड लॉक करो ताकि बिखराव पुनरुत्पादनीय हो। कमिट से पहले बेक करो, ताकि स्रोत नियंत्रण में जो है वह ठोस परिणाम हो जो सभी साझा करते हैं, प्रति मशीन फिर से रोल करने वाला नुस्खा नहीं। बेक किए गए इंस्टेंसेस को सत्य के स्रोत के रूप में मानो: वह चीज जिसे तुम समीक्षा करते हो और शिप करते हो। और जब तुम जंगल को बदलना चाहते हो, इसे जानबूझकर करो: पैरामीटर या सीड समायोजित करो, फिर से बेक करो, और diff की समीक्षा किसी भी अन्य परिवर्तन की तरह करो। लक्ष्य एक जंगल है जो केवल तब बदलता है जब एक मानव तय करता है कि यह होना चाहिए, और जिसका हर परिवर्तन दृश्यमान और समीक्षा योग्य है: वही मानक जो तुम स्तर के किसी भी अन्य हिस्से पर रखते। गति के लिए प्रक्रियात्मक, स्थिरता के लिए बेक किया गया: यही पूरी तरकीब है।

चुराने योग्य फील्ड संख्याएं

  • नियतिवाद नियम: वही इनपुट → वही आउटपुट, हमेशा, या तुम्हारा स्तर बहता है
  • एक सीड यादृच्छिकता को दोहराने योग्य बनाता है: उजागर करो, सहेजो, लॉक करो
  • एक जीवित प्रक्रियात्मक बिखराव Git/Perforce के लिए एक ब्लैक बॉक्स है: undiffable, unmergeable
  • नेटिव इंस्टेंसेस में बेक करो → diff करने योग्य, समीक्षा करने योग्य, merge करने योग्य, हर जगह समान
  • टीम की आदत: सीड लॉक → बेक → कमिट; जानबूझकर फिर से बिखराओ, कभी दुर्घटनावश नहीं

मिनी-FAQ

क्या मैं बस बिखराव को प्रक्रियात्मक रख नहीं सकता और कभी बेक नहीं कर सकता? एक अकेले त्वरित परियोजना के लिए, शायद। एक टीम या कुछ ऐसा जो तुम बनाए रखोगे, नहीं: तुम diffing, समीक्षा और सुरक्षित merging खो देते हो, और तुम मौन बहाव का जोखिम उठाते हो। बेक करना वह है जो प्रक्रियात्मक बिखराव को उत्पादन सुरक्षित बनाता है।

मुझे स्रोत नियंत्रण के तहत बिल्कुल क्या रखना चाहिए: सेटिंग्स या परिणाम? बेक किया गया परिणाम सत्य का स्रोत है; सेटिंग्स/सीड भी रखो ताकि तुम जानबूझकर पुनर्जनित कर सको। केवल सेटिंग्स कमिट करने का मतलब है कि स्रोत नियंत्रण नहीं देख सकता कि वास्तव में स्तर में क्या बदला।

दो कलाकारों ने एक ही जंगल संपादित किया: हम कैसे merge करें? बेक किए गए इंस्टेंसेस के साथ, यह सामान्य दृश्य डेटा है और तुम्हारे सामान्य merge उपकरण लागू होते हैं। एक जीवित जनरेटर के साथ, यह अक्सर अनसुलझा है, जो कमिट से पहले बेक करने और कौन एक दिए गए बिखराव का मालिक है इसे समन्वित करने के लिए केंद्रीय तर्क है।

क्या बेक करना मुझे बाद में ट्वीक करने की क्षमता खर्च करता है? नहीं: सीड और पैरामीटर रखो, और फिर से बेक करना जब भी तुम व्यवस्था बदलना चाहते हो एक जानबूझकर कदम है। तुम्हें पुनरावृत्ति और स्थिरता मिलती है, जब तक कि फिर से बिखराव अपने आप होने वाली किसी चीज के बजाय एक जानबूझकर, समीक्षा की गई क्रिया है।

प्रक्रियात्मक बिखराव केवल तब अपना स्थान अर्जित करता है जब यह पुनरुत्पादनीय हो। अपने सीड्स को लॉक करो, नेटिव इंस्टेंसेस में बेक करो, और उस बेक किए गए परिणाम को स्तर की सच्चाई के रूप में मानो, और तुम्हारा जंगल कुछ ऐसा बन जाता है जिस पर एक पूरी टीम निर्माण कर सकती है: ऑथर करने में तेज़, शिप करने में स्थिर, और केवल तब सुरक्षित रूप से बदलने वाला जब कोई चाहे।