00:00:00(उत्साहपूर्ण संगीत) - ठीक है, आप सभी का धन्यवाद, नमस्कार।
00:00:07मेरा नाम ल्यूक सैंडबर्ग है।
00:00:09मैं वर्सेल में एक सॉफ्टवेयर इंजीनियर हूँ,
00:00:10टर्बो पैक पर काम कर रहा हूँ।
00:00:12तो मैं लगभग छह महीनों से वर्सेल में हूँ,
00:00:15जिसने मुझे मंच पर आकर उन सभी शानदार कामों के बारे में बताने के लिए पर्याप्त समय दिया है जो मैंने नहीं किए।
00:00:23वर्सेल में आने से पहले,
00:00:24मैं गूगल में था,
00:00:25जहाँ मुझे हमारी आंतरिक वेब टूल चेन पर काम करने और टीएसएक्स से जावा बाइट कोड कंपाइलर बनाने जैसे अजीबोगरीब काम करने और क्लोजर कंपाइलर पर काम करने का भी मौका मिला।
00:00:37तो जब मैं वर्सेल पहुँचा,
00:00:39यह वास्तव में किसी दूसरे ग्रह पर कदम रखने जैसा था,
00:00:43जैसे सब कुछ अलग था।
00:00:45और मैं टीम में हमारे द्वारा किए गए सभी कामों से और हमारे लक्ष्यों से काफी हैरान था।
00:00:50तो आज मैं टर्बो पैक में हमारे द्वारा किए गए कुछ डिज़ाइन विकल्पों को साझा करूँगा और मुझे लगता है कि वे हमें पहले से मौजूद शानदार प्रदर्शन को और बेहतर बनाने में कैसे मदद करेंगे।
00:01:01तो इसे प्रेरित करने में मदद करने के लिए,
00:01:03यह हमारा समग्र डिज़ाइन लक्ष्य है।
00:01:06तो इससे,
00:01:06आप तुरंत अनुमान लगा सकते हैं कि हमने शायद कुछ कठिन विकल्प चुने हैं।
00:01:14तो कोल्ड बिल्ड के बारे में क्या?
00:01:17वे महत्वपूर्ण हैं,
00:01:18लेकिन हमारा एक विचार यह है कि आपको उनका बिल्कुल भी अनुभव नहीं करना चाहिए।
00:01:22और इसी पर यह बात केंद्रित होगी।
00:01:24कीनोट में,
00:01:25आपने थोड़ा सुना होगा कि हम बंडलिंग प्रदर्शन को बेहतर बनाने के लिए कैसे इंक्रीमेंटैलिटी का लाभ उठाते हैं।
00:01:31इंक्रीमेंटैलिटी के लिए हमारा एक मुख्य विचार कैशिंग के बारे में है।
00:01:35हम बंडलर द्वारा किए जाने वाले हर एक काम को कैशेबल बनाना चाहते हैं ताकि जब भी आप कोई बदलाव करें,
00:01:40हमें केवल उस बदलाव से संबंधित काम को ही दोबारा करना पड़े।
00:01:43या शायद इसे दूसरे तरीके से कहें तो,
00:01:45आपके बिल्ड की लागत वास्तव में आपके बदलाव के आकार या जटिलता के साथ बढ़नी चाहिए न कि आपके एप्लिकेशन के आकार या जटिलता के साथ।
00:01:53और इस तरह हम यह सुनिश्चित कर सकते हैं कि टर्बो पैक डेवलपर्स को अच्छा प्रदर्शन देता रहेगा,
00:01:59चाहे आप कितनी भी आइकन लाइब्रेरी आयात करें।
00:02:01तो उस विचार को समझने और प्रेरित करने में मदद करने के लिए,
00:02:05आइए दुनिया के सबसे सरल बंडलर की कल्पना करें,
00:02:08जो शायद ऐसा दिखता है।
00:02:09तो यह हमारा बेबी बंडलर है।
00:02:12और यह शायद एक स्लाइड पर रखने के लिए थोड़ा ज़्यादा कोड है,
00:02:15लेकिन यह और खराब होने वाला है।
00:02:17तो यहाँ हम हर एंट्री पॉइंट को पार्स करते हैं।
00:02:20हम उनके इम्पोर्ट्स का पालन करते हैं,
00:02:22उनके रेफरेंस को हल करते हैं,
00:02:23एप्लिकेशन में रिकर्सिवली वह सब कुछ खोजने के लिए जिस पर आप निर्भर करते हैं।
00:02:28फिर अंत में,
00:02:28हम बस हर एंट्री पॉइंट पर निर्भर सभी चीजों को इकट्ठा करते हैं और उसे एक आउटपुट फ़ाइल में डाल देते हैं।
00:02:35तो हुर्रे, हमारे पास एक बेबी बंडलर है।
00:02:38तो जाहिर है यह भोलापन है,
00:02:40लेकिन अगर हम इसे इंक्रीमेंटल दृष्टिकोण से देखें,
00:02:42तो इसका कोई भी हिस्सा इंक्रीमेंटल नहीं है।
00:02:45तो हम निश्चित रूप से कुछ फ़ाइलों को कई बार पार्स करेंगे,
00:02:48शायद इस बात पर निर्भर करता है कि आप उन्हें कितनी बार इम्पोर्ट करते हैं,
00:02:52यह भयानक है।
00:02:53हम निश्चित रूप से रिएक्ट इम्पोर्ट को सैकड़ों या हजारों बार हल करेंगे।
00:02:57तो, उफ़।
00:03:01तो अगर हम इसे कम से कम थोड़ा और इंक्रीमेंटल बनाना चाहते हैं,
00:03:04तो हमें अनावश्यक काम से बचने का एक तरीका खोजना होगा।
00:03:08तो आइए एक कैश जोड़ें।
00:03:10तो आप कल्पना कर सकते हैं कि यह हमारा पार्स फ़ंक्शन है।
00:03:15यह काफी सरल है।
00:03:15और यह शायद हमारे बंडलर का वर्कहॉर्स है।
00:03:19आप जानते हैं, बहुत सरल।
00:03:19हम फ़ाइल सामग्री पढ़ते हैं,
00:03:21उन्हें एसडब्ल्यूसी को सौंपते हैं ताकि हमें एक एएसटी मिल सके।
00:03:25तो आइए एक कैश जोड़ें।
00:03:27ठीक है, तो यह स्पष्ट रूप से एक अच्छी और सरल जीत है।
00:03:31लेकिन,
00:03:32आप जानते हैं,
00:03:32मुझे यकीन है कि आप में से कुछ ने पहले कैशिंग कोड लिखा होगा।
00:03:36शायद यहाँ कुछ समस्याएँ हैं।
00:03:38जैसे, आप जानते हैं, अगर फ़ाइल बदल जाती है तो क्या होगा?
00:03:41यह स्पष्ट रूप से कुछ ऐसा है जिसकी हमें परवाह है।
00:03:46और,
00:03:46आप जानते हैं,
00:03:47क्या होगा अगर फ़ाइल वास्तव में एक फ़ाइल नहीं है,
00:03:50बल्कि यह एक ट्रेंच कोड में तीन सिम्लिंक हैं?
00:03:52बहुत सारे पैकेज मैनेजर निर्भरताओं को इसी तरह व्यवस्थित करते हैं।
00:03:55और हम फ़ाइल नाम को कैश कुंजी के रूप में उपयोग कर रहे हैं।
00:03:59क्या यह पर्याप्त है?
00:04:00जैसे,
00:04:00आप जानते हैं,
00:04:01हम क्लाइंट और सर्वर के लिए बंडलिंग कर रहे हैं।
00:04:03वही फ़ाइलें दोनों में समाप्त होती हैं।
00:04:04क्या वह काम करता है?
00:04:05हम एएसटी को भी स्टोर कर रहे हैं और उसे वापस कर रहे हैं।
00:04:08तो अब हमें म्यूटेशन के बारे में चिंता करनी होगी।
00:04:11तो,
00:04:11आप जानते हैं,
00:04:12और फिर अंत में,
00:04:13क्या यह पार्स करने का एक बहुत ही भोला तरीका नहीं है?
00:04:16मुझे पता है कि हर किसी के पास कंपाइलर के लिए बड़े कॉन्फ़िगरेशन होते हैं।
00:04:21जैसे, उनमें से कुछ को यहाँ आना होगा।
00:04:23तो, हाँ, यह सब शानदार प्रतिक्रिया है।
00:04:27और यह एक बहुत ही भोला दृष्टिकोण है।
00:04:32और उस पर,
00:04:33निश्चित रूप से,
00:04:34मैं कहूँगा,
00:04:34हाँ,
00:04:35यह काम नहीं करेगा।
00:04:36तो इन समस्याओं को ठीक करने के लिए हम क्या करते हैं?
00:04:39कृपया ठीक करें और कोई गलती न करें।
00:04:44तो, ठीक है।
00:04:46तो शायद यह थोड़ा बेहतर है।
00:04:49आप जानते हैं,
00:04:49आप यहाँ देख सकते हैं कि हमारे पास कुछ ट्रांसफ़ॉर्म हैं।
00:04:52हमें प्रत्येक फ़ाइल के लिए अनुकूलित चीजें करने की आवश्यकता है,
00:04:56जैसे शायद डाउन-लेवलिंग या यूज़ कैश लागू करना।
00:04:58हमारे पास कुछ कॉन्फ़िगरेशन भी हैं।
00:05:00और इसलिए,
00:05:01निश्चित रूप से,
00:05:02हमें उसे अपने कैश की कुंजी में शामिल करना होगा।
00:05:04लेकिन शायद तुरंत ही आपको संदेह हो।
00:05:08जैसे, क्या यह सही है?
00:05:09जैसे,
00:05:10क्या नाम के आधार पर किसी ट्रांसफ़ॉर्म की पहचान करना वास्तव में पर्याप्त है?
00:05:13मुझे नहीं पता, शायद उसका अपना कुछ जटिल कॉन्फ़िगरेशन हो।
00:05:16और,
00:05:17ठीक है,
00:05:17और जैसे,
00:05:18क्या यह JSON मान वास्तव में वह सब कुछ कैप्चर करेगा जिसकी हमें परवाह है?
00:05:24क्या डेवलपर्स इसे बनाए रखेंगे?
00:05:26ये कैश कुंजियाँ कितनी बड़ी होंगी?
00:05:29हमारे पास कॉन्फ़िग की कितनी प्रतियाँ होंगी?
00:05:31तो मैंने वास्तव में व्यक्तिगत रूप से बिल्कुल ऐसा ही कोड देखा है,
00:05:34और मुझे इसके बारे में तर्क करना लगभग असंभव लगता है।
00:05:37ठीक है,
00:05:37हमने इनवैलिडेशन से संबंधित इस दूसरी समस्या को भी ठीक करने की कोशिश की।
00:05:43तो हमने फ़ाइल पढ़ने के लिए एक कॉलबैक एपीआई जोड़ा।
00:05:46यह बहुत अच्छा है,
00:05:47तो अगर फ़ाइल बदल जाती है,
00:05:49तो हम इसे कैश से हटा सकते हैं,
00:05:51ताकि हम पुरानी सामग्री परोसते न रहें।
00:05:55ठीक है,
00:05:55लेकिन यह वास्तव में काफी भोलापन है,
00:05:57क्योंकि,
00:05:57निश्चित रूप से,
00:05:58हमें अपना कैश हटाना होगा,
00:05:59लेकिन हमारे कॉलर को भी यह जानने की ज़रूरत है कि उन्हें एक नई कॉपी प्राप्त करनी है।
00:06:03तो, ठीक है, तो आइए कॉलबैक को थ्रेड करना शुरू करें।
00:06:06ठीक है, हमने कर लिया।
00:06:09हमने स्टैक के माध्यम से कॉलबैक को थ्रेड किया।
00:06:12आप यहाँ देख सकते हैं कि हम अपने कॉलर को परिवर्तनों की सदस्यता लेने की अनुमति देते हैं।
00:06:16अगर कुछ भी बदलता है,
00:06:17तो हम पूरे बंडल को फिर से चला सकते हैं,
00:06:19और अगर कोई फ़ाइल बदलती है,
00:06:21तो हम उसे कॉल करते हैं।
00:06:22बहुत बढ़िया, हमारे पास एक रिएक्टिव बंडलर है।
00:06:25लेकिन यह अभी भी शायद ही इंक्रीमेंटल है।
00:06:28तो अगर कोई फ़ाइल बदलती है,
00:06:31तो हमें सभी मॉड्यूल को फिर से देखना होगा और सभी आउटपुट फ़ाइलें बनानी होंगी।
00:06:37तो,
00:06:38आप जानते हैं,
00:06:39हमने अपने पार्स कैश के कारण बहुत सारा काम बचाया,
00:06:42लेकिन यह वास्तव में पर्याप्त नहीं है।
00:06:45और फिर अंत में, यह सारा अन्य अनावश्यक काम है।
00:06:49जैसे, हम निश्चित रूप से इम्पोर्ट्स को कैश करना चाहते हैं।
00:06:52हमें एक फ़ाइल कई बार मिल सकती है,
00:06:53और हमें उसके इम्पोर्ट्स की लगातार ज़रूरत होती है,
00:06:55तो हम वहाँ एक कैश डालना चाहते हैं।
00:06:57और,
00:06:58आप जानते हैं,
00:06:58हल किए गए परिणाम वास्तव में काफी जटिल होते हैं,
00:07:01तो हमें निश्चित रूप से उसे कैश करना चाहिए ताकि हम रिएक्ट को हल करने में किए गए काम का पुन: उपयोग कर सकें।
00:07:08लेकिन, ठीक है, अब हमारे पास एक और समस्या है।
00:07:11जब आप निर्भरताओं को अपडेट करते हैं या नई फ़ाइलें जोड़ते हैं तो आपके हल किए गए परिणाम बदल जाते हैं,
00:07:16तो हमें वहाँ एक और कॉलबैक की ज़रूरत है।
00:07:18और हम निश्चित रूप से आउटपुट बनाने के तर्क को भी कैश करना चाहते हैं क्योंकि आप एक एचएमआर सत्र में इसके बारे में सोचते हैं,
00:07:25आप एप्लिकेशन के एक हिस्से को संपादित कर रहे हैं,
00:07:28तो हम हर बार सभी आउटपुट को फिर से क्यों लिख रहे हैं?
00:07:31और साथ ही,
00:07:32आप शायद एक आउटपुट फ़ाइल हटा सकते हैं,
00:07:35तो हमें शायद वहाँ भी परिवर्तनों को सुनना चाहिए।
00:07:39ठीक है,
00:07:39तो शायद हमने उन सभी चीजों को हल कर लिया है,
00:07:42लेकिन हमारे पास अभी भी यह समस्या है,
00:07:44कि हर बार जब कुछ भी बदलता है,
00:07:46तो हम शुरू से शुरू करते हैं।
00:07:48तो,
00:07:48इस फ़ंक्शन का पूरा कंट्रोल फ्लो काम नहीं करता है क्योंकि अगर एक फ़ाइल बदलती है,
00:07:53तो हम वास्तव में उस फॉर लूप के बीच में कूदना चाहेंगे।
00:07:56और फिर,
00:07:57अंत में,
00:07:58हमारे कॉलर के लिए हमारा एपीआई भी निराशाजनक रूप से भोला है।
00:08:03वे शायद वास्तव में जानना चाहते हैं कि कौन सी फ़ाइल बदल गई है,
00:08:06ताकि वे क्लाइंट को अपडेट भेज सकें।
00:08:07तो, हाँ।
00:08:11तो, यह दृष्टिकोण वास्तव में काम नहीं करता है।
00:08:13और भले ही हमने किसी तरह इन सभी जगहों पर सभी कॉलबैक को थ्रेड किया हो,
00:08:17क्या आपको लगता है कि आप वास्तव में इस कोड को बनाए रख सकते हैं?
00:08:21क्या आपको लगता है कि आप इसमें कोई नई सुविधा जोड़ सकते हैं?
00:08:24मुझे नहीं लगता।
00:08:25मुझे लगता है कि यह बस क्रैश हो जाएगा और जल जाएगा।
00:08:28और, आप जानते हैं, उस पर, मैं कहूँगा, हाँ।
00:08:34तो, एक बार फिर, हमें क्या करना चाहिए?
00:08:36आप जानते हैं,
00:08:37ठीक वैसे ही जैसे आप एक एलएलएम के साथ चैट कर रहे होते हैं,
00:08:40आपको वास्तव में पहले यह जानना होगा कि आप क्या चाहते हैं।
00:08:43और फिर आपको इसके बारे में बेहद स्पष्ट होना होगा।
00:08:48तो, हम आखिर चाहते क्या हैं?
00:08:50तो,
00:08:50आप जानते हैं,
00:08:51हमने बहुत सारे अलग-अलग दृष्टिकोणों पर विचार किया,
00:08:54और टीम में कई लोगों को वास्तव में बंडलर पर काम करने का बहुत अनुभव था।
00:08:59तो, हम इस तरह की मोटी-मोटी आवश्यकताओं के साथ आए।
00:09:02तो,
00:09:02हम निश्चित रूप से बंडलर में हर महंगी ऑपरेशन को कैश करने में सक्षम होना चाहते हैं।
00:09:05और इसे करना वास्तव में आसान होना चाहिए।
00:09:08जैसे,
00:09:09हर बार जब आप एक नया कैश जोड़ते हैं तो आपको अपने कोड रिव्यू पर 15 टिप्पणियाँ नहीं मिलनी चाहिए।
00:09:12और फिर मैं वास्तव में डेवलपर्स पर सही कैश कुंजियाँ लिखने पर या इनपुट को ट्रैक करने या निर्भरताओं को हाथ से ट्रैक करने पर भरोसा नहीं करता।
00:09:24तो, हमें इसे संभालना चाहिए।
00:09:26हमें इसे निश्चित रूप से फुलप्रूफ बनाना चाहिए।
00:09:30अगला, हमें बदलते इनपुट को संभालना होगा।
00:09:33यह एचएमआर में एक बड़ा विचार है, लेकिन सत्रों के पार भी।
00:09:36तो,
00:09:36ज्यादातर यह फ़ाइलें होंगी,
00:09:38लेकिन यह कॉन्फ़िग सेटिंग्स जैसी चीजें भी हो सकती हैं।
00:09:40और फ़ाइल सिस्टम कैश के साथ,
00:09:41यह वास्तव में पर्यावरण चर जैसी चीजें भी बन जाती है।
00:09:45तो, हम रिएक्टिव होना चाहते हैं।
00:09:47हम चाहते हैं कि जैसे ही कुछ भी बदले,
00:09:49हम चीजों को फिर से कंप्यूट कर सकें,
00:09:51और हम हर जगह कॉलबैक को थ्रेड नहीं करना चाहते।
00:09:54अंत में,
00:09:55हमें बस आधुनिक आर्किटेक्चर का लाभ उठाना होगा और मल्टी-थ्रेडेड और बस आम तौर पर तेज़ होना होगा।
00:10:02तो,
00:10:03शायद आप आवश्यकताओं के इस सेट को देख रहे हैं,
00:10:07और आप में से कुछ सोच रहे हैं,
00:10:09इसका बंडलर से क्या लेना-देना है?
00:10:12और उस पर,
00:10:12मैं कहूँगा,
00:10:13निश्चित रूप से,
00:10:14मेरी प्रबंधन टीम कमरे में है,
00:10:16तो हमें वास्तव में उस बारे में बात करने की ज़रूरत नहीं है।
00:10:20लेकिन वास्तव में,
00:10:21मुझे लगता है कि आप में से बहुत से लोग कहीं अधिक स्पष्ट निष्कर्ष पर पहुँचे होंगे।
00:10:24यह बहुत कुछ सिग्नलों जैसा लगता है।
00:10:28और हाँ,
00:10:29मैं एक ऐसी प्रणाली का वर्णन कर रहा हूँ जो सिग्नलों जैसी लगती है।
00:10:31यह गणनाओं को संयोजित करने,
00:10:33निर्भरताओं को ट्रैक करने का एक तरीका है,
00:10:35कुछ हद तक स्वचालित मेमोइज़ेशन के साथ।
00:10:37और मुझे यह बताना चाहिए कि हमने सभी प्रकार की प्रणालियों से प्रेरणा ली,
00:10:42विशेष रूप से रस्ट कंपाइलर और साल्सा नामक एक प्रणाली से।
00:10:45और इन अवधारणाओं पर एक अकादमिक साहित्य भी है जिसे एडाप्टन्स कहा जाता है,
00:10:50यदि आप रुचि रखते हैं।
00:10:51ठीक है,
00:10:51तो आइए देखें कि क्या है,
00:10:53आइए देखें कि व्यवहार में यह कैसा दिखता है,
00:10:55और फिर हम जावास्क्रिप्ट से रस्ट में कोड नमूनों से एक बहुत ही चौंकाने वाली छलांग लगाने जा रहे हैं।
00:11:01तो यहाँ हमने जो इंफ्रास्ट्रक्चर बनाया है, उसका एक उदाहरण है।
00:11:05एक टर्बोटस्क फ़ंक्शन हमारे कंपाइलर में काम की एक कैशे की गई इकाई है।
00:11:12तो हम कर सकते हैं,
00:11:13एक बार जब आप इस तरह के फ़ंक्शन को एनोटेट करते हैं,
00:11:16तो हम इसे ट्रैक कर सकते हैं,
00:11:18हम इसके मापदंडों से एक कैश कुंजी बना सकते हैं,
00:11:21और वह हमें इसे कैश करने और ज़रूरत पड़ने पर इसे फिर से निष्पादित करने दोनों की अनुमति देता है।
00:11:28यहाँ ये वीसी प्रकार,
00:11:29आप उन्हें सिग्नलों की तरह सोच सकते हैं,
00:11:32यह एक रिएक्टिव मान है,
00:11:34वीसी का मतलब वैल्यू सेल है,
00:11:36लेकिन सिग्नल थोड़ा बेहतर नाम हो सकता है।
00:11:39जब आप इस तरह के पैरामीटर की घोषणा करते हैं,
00:11:41तो आप कह रहे हैं कि यह बदल सकता है,
00:11:43मैं चाहता हूँ कि जब यह बदले तो इसे फिर से निष्पादित किया जाए।
00:11:47तो हमें यह कैसे पता चलता है?
00:11:49तो हम इन मानों को 'अवेट' के माध्यम से पढ़ते हैं।
00:11:52एक बार जब आप इस तरह के रिएक्टिव मान का 'अवेट' करते हैं,
00:11:55तो हम स्वचालित रूप से निर्भरता को ट्रैक करते हैं।
00:11:58और फिर अंत में,
00:11:59निश्चित रूप से,
00:12:00हम वह वास्तविक गणना करते हैं जो हम करना चाहते थे,
00:12:04और हम इसे एक सेल में संग्रहीत करते हैं।
00:12:07तो क्योंकि हमने स्वचालित रूप से निर्भरताओं को ट्रैक किया है,
00:12:11हम जानते हैं कि यह फ़ंक्शन फ़ाइल की सामग्री और कॉन्फ़िग के मान दोनों पर निर्भर करता है।
00:12:17और हर बार जब हम सेल में एक नया परिणाम संग्रहीत करते हैं,
00:12:20तो हम उसकी पिछली वाले से तुलना कर सकते हैं,
00:12:23और फिर अगर यह बदल गया है,
00:12:25तो हम उस मान को पढ़ने वाले सभी को सूचनाएँ प्रसारित कर सकते हैं।
00:12:29तो बदलने की यह अवधारणा इंक्रीमेंटैलिटी के प्रति हमारे दृष्टिकोण की कुंजी है।
00:12:33और हाँ, फिर से, सबसे सरल मामला यहीं है।
00:12:37अगर फ़ाइल बदलती है,
00:12:38तो टर्बो पैक उसे देखेगा,
00:12:40इस फ़ंक्शन निष्पादन को अमान्य करेगा,
00:12:42और इसे तुरंत फिर से निष्पादित करेगा।
00:12:45और फिर अगर हम वही एएसटी उत्पन्न करते हैं,
00:12:48तो हम वहीं रुक जाएंगे क्योंकि हम वही सेल कंप्यूट करते हैं।
00:12:53अब,
00:12:54एक फ़ाइल को पार्स करने के लिए,
00:12:56आप इसमें शायद ही कोई ऐसा संपादन कर सकते हैं जो वास्तव में एएसटी को न बदले।
00:13:00लेकिन हम टर्बो पैक फ़ंक्शंस की मूलभूत कंपोज़ेबिलिटी का लाभ उठा सकते हैं इसे आगे ले जाने के लिए।
00:13:07तो यहाँ,
00:13:08हम एक और टर्बो पैक कैश फ़ंक्शन देखते हैं जो एक मॉड्यूल से इम्पोर्ट्स निकाल रहा है।
00:13:15आप कल्पना कर सकते हैं कि यह बंडलर में हमारा एक बहुत ही सामान्य कार्य है।
00:13:20हमें वास्तव में आपके एप्लिकेशन में सभी मॉड्यूल खोजने के लिए इम्पोर्ट्स निकालने की आवश्यकता है।
00:13:25हम उनका लाभ उठाते हैं ताकि मॉड्यूल को चंक्स में एक साथ समूहित करने का सबसे अच्छा तरीका चुन सकें।
00:13:29और निश्चित रूप से,
00:13:30इम्पोर्ट ग्राफ ट्री शेकिंग जैसे बुनियादी कार्यों के लिए महत्वपूर्ण है।
00:13:34और क्योंकि इम्पोर्ट्स डेटा के इतने सारे अलग-अलग उपभोक्ता हैं,
00:13:38एक कैश बहुत मायने रखता है।
00:13:41तो यह कार्यान्वयन वास्तव में विशेष नहीं है।
00:13:44यह वैसा ही है जैसा आपको किसी भी प्रकार के बंडलर में मिलेगा।
00:13:46हम एएसटी को देखते हैं,
00:13:47इम्पोर्ट्स को कुछ विशेष डेटा संरचना में इकट्ठा करते हैं जो हमें पसंद है,
00:13:52और फिर हम उन्हें वापस करते हैं।
00:13:55लेकिन यहाँ मुख्य विचार यह है कि हम उन्हें एक और सेल में संग्रहीत करते हैं।
00:13:58तो अगर मॉड्यूल बदलता है,
00:14:00तो हमें इस फ़ंक्शन को फिर से चलाने की आवश्यकता है क्योंकि हमने इसे पढ़ा है।
00:14:05लेकिन अगर आप उन परिवर्तनों के बारे में सोचते हैं जो आप मॉड्यूल में करते हैं,
00:14:09तो उनमें से बहुत कम वास्तव में इम्पोर्ट्स को प्रभावित करते हैं।
00:14:12तो आप मॉड्यूल बदलते हैं,
00:14:13आप फ़ंक्शन बॉडी,
00:14:15एक स्ट्रिंग लिटरल,
00:14:16किसी भी प्रकार के कार्यान्वयन विवरण को अपडेट करते हैं।
00:14:20यह इस फ़ंक्शन को अमान्य कर देगा और फिर हम इम्पोर्ट्स के उसी सेट की गणना करेंगे।
00:14:25और फिर हम किसी भी ऐसी चीज़ को अमान्य नहीं करते हैं जिसने इसे पढ़ा है।
00:14:29तो अगर आप इसे एक एचएमआर सत्र में सोचते हैं,
00:14:31तो इसका मतलब है कि हमें आपकी फ़ाइल को फिर से पार्स करने की आवश्यकता है,
00:14:36लेकिन हमें अब चंकिंग निर्णयों के बारे में सोचने की वास्तव में ज़रूरत नहीं है।
00:14:40हमें किसी भी प्रकार के ट्री शेकिंग परिणामों के बारे में सोचने की ज़रूरत नहीं है क्योंकि हम जानते हैं कि वे नहीं बदले।
00:14:45तो हम फ़ाइल को पार्स करने से तुरंत कूद सकते हैं,
00:14:48यह सरल विश्लेषण करते हुए,
00:14:50और फिर सीधे आउटपुट बनाने पर कूद सकते हैं।
00:14:53और यह उन तरीकों में से एक है जिससे हमारे पास वास्तव में तेज़ रीफ्रेश समय होता है।
00:14:57तो यह काफी अनिवार्य है।
00:15:02इस बुनियादी विचार के बारे में सोचने का एक और तरीका नोड्स के ग्राफ के रूप में है।
00:15:06तो यहाँ बाईं ओर, आप एक कोल्ड बिल्ड की कल्पना कर सकते हैं।
00:15:12शुरुआत में,
00:15:12हमें वास्तव में हर फ़ाइल को पढ़ना होता है,
00:15:14उन सभी को पार्स करना होता है,
00:15:15सभी इम्पोर्ट्स का विश्लेषण करना होता है।
00:15:17और उसके एक साइड इफेक्ट के रूप में,
00:15:18हमने आपके एप्लिकेशन से सभी निर्भरता जानकारी एकत्र की है।
00:15:21और फिर जब कुछ बदलता है,
00:15:22तो हम उस निर्भरता ग्राफ का लाभ उठा सकते हैं जिसे हमने बनाया था अमान्यताओं को प्रसारित करने के लिए,
00:15:28स्टैक को वापस ऊपर ले जाने के लिए,
00:15:29और टर्बो पैक फ़ंक्शंस को फिर से निष्पादित करने के लिए।
00:15:32और इसलिए यदि वे एक नया मान उत्पन्न करते हैं,
00:15:34तो हम वहीं रुक जाते हैं।
00:15:35अन्यथा, हम अमान्यता को प्रसारित करते रहते हैं।
00:15:37तो बहुत बढ़िया।
00:15:41आप जानते हैं,
00:15:42यह वास्तव में जो हम व्यवहार में कर रहे हैं,
00:15:44उसका एक बहुत बड़ा सरलीकरण है,
00:15:46आप कल्पना कर सकते हैं।
00:15:47तो आज टर्बो पैक में,
00:15:49लगभग 2,
00:15:50500 विभिन्न टर्बो टास्क फ़ंक्शंस हैं।
00:15:53और एक सामान्य बिल्ड में,
00:15:54हमारे पास शाब्दिक रूप से लाखों विभिन्न कार्य हो सकते हैं।
00:15:58तो यह वास्तव में शायद थोड़ा और ऐसा दिखता है।
00:16:01अब, मैं वास्तव में आपसे इसे पढ़ने की उम्मीद नहीं करता।
00:16:04इसे वास्तव में स्लाइड पर फिट नहीं कर सका।
00:16:06तो शायद हमें ज़ूम आउट करना चाहिए।
00:16:08ठीक है, तो वह स्पष्ट रूप से मददगार नहीं है।
00:16:14वास्तव में,
00:16:15हमारे पास टर्बो पैक के अंदर क्या हो रहा है,
00:16:17उसे ट्रैक करने और विज़ुअलाइज़ करने के बेहतर तरीके हैं।
00:16:21लेकिन मौलिक रूप से,
00:16:22वे निर्भरता जानकारी के विशाल बहुमत को बाहर फेंककर काम करते हैं।
00:16:26और अब मुझे लगता है कि आप में से कुछ को शायद सिग्नलों के साथ काम करने का अनुभव है,
00:16:33शायद बुरे अनुभव।
00:16:34आप जानते हैं,
00:16:35मुझे व्यक्तिगत रूप से स्टैक ट्रेस पसंद हैं और एक डीबगर में फ़ंक्शंस में कदम रखने और बाहर निकलने में सक्षम होना।
00:16:41तो शायद आपको संदेह है कि यह पूर्ण रामबाण है।
00:16:45जैसे यह स्पष्ट रूप से ट्रेड-ऑफ के साथ आता है।
00:16:47और हाँ,
00:16:48तो और उस पर मैं निश्चित रूप से कहूँगा,
00:16:51ठीक है,
00:16:52आप जानते हैं,
00:16:53मैं वास्तव में कहूँगा कि सभी सॉफ्टवेयर इंजीनियरिंग ट्रेड-ऑफ्स को प्रबंधित करने के बारे में है।
00:17:01हम हमेशा समस्याओं को ठीक से हल नहीं कर रहे हैं,
00:17:04लेकिन हम वास्तव में मूल्य प्रदान करने के लिए ट्रेड-ऑफ्स के नए सेट चुन रहे हैं।
00:17:08तो टर्बो पैक में इंक्रीमेंटल बिल्ड के आसपास हमारे डिज़ाइन लक्ष्यों को प्राप्त करने के लिए,
00:17:14हमने इस इंक्रीमेंटल रिएक्टिव प्रोग्रामिंग मॉडल पर अपने सभी दांव लगाए।
00:17:19और इसके निश्चित रूप से कुछ बहुत ही स्वाभाविक परिणाम हुए।
00:17:23तो,
00:17:24आप जानते हैं,
00:17:25शायद हमने वास्तव में हाथ से बनाए गए कैशिंग सिस्टम की समस्या को हल कर लिया है और बोझिल अमान्यता तर्क को।
00:17:33बदले में,
00:17:34हमें कुछ जटिल कैशिंग इंफ्रास्ट्रक्चर को प्रबंधित करना होगा।
00:17:39और निश्चित रूप से,
00:17:40आप जानते हैं,
00:17:40यह मुझे एक बहुत अच्छा ट्रेड-ऑफ लगता है।
00:17:42मुझे जटिल कैशिंग इंफ्रास्ट्रक्चर पसंद है,
00:17:45लेकिन हम सभी को परिणामों के साथ जीना होगा।
00:17:48तो पहला निश्चित रूप से इस प्रणाली के मुख्य ओवरहेड्स हैं।
00:17:54आप जानते हैं,
00:17:55तो यदि आप इसे किसी दिए गए बिल्ड या एचएमआर सत्र में सोचते हैं,
00:18:00तो आप वास्तव में बहुत कुछ नहीं बदल रहे हैं।
00:18:04तो हम आपके एप्लिकेशन में हर इम्पोर्ट और हर हल किए गए परिणाम के बीच सभी निर्भरता जानकारी को ट्रैक करते हैं,
00:18:10लेकिन आप वास्तव में उनमें से केवल कुछ को ही बदलेंगे।
00:18:13तो हम जो अधिकांश निर्भरता जानकारी एकत्र करते हैं,
00:18:15उसकी वास्तव में कभी आवश्यकता नहीं होती है।
00:18:16तो,
00:18:17आप जानते हैं,
00:18:18इसे प्रबंधित करने के लिए,
00:18:19हमें इस कैशिंग परत के प्रदर्शन को बेहतर बनाने पर बहुत ध्यान केंद्रित करना पड़ा है ताकि ओवरहेड्स को कम किया जा सके और हमारी प्रणाली को बड़े और बड़े अनुप्रयोगों तक बढ़ाया जा सके।
00:18:30और अगला और सबसे स्पष्ट बस मेमोरी है।
00:18:34आप जानते हैं,
00:18:35कैश हमेशा मौलिक रूप से समय बनाम मेमोरी का एक ट्रेड-ऑफ होते हैं।
00:18:38और हमारा वास्तव में वहाँ कुछ भी अलग नहीं करता है।
00:18:41हमारा सरल लक्ष्य यह है कि कैश का आकार आपके एप्लिकेशन के आकार के साथ रैखिक रूप से बढ़ना चाहिए।
00:18:49लेकिन फिर से, हमें ओवरहेड्स के बारे में सावधान रहना होगा।
00:18:51यह अगला वाला थोड़ा सूक्ष्म है।
00:18:54तो हमारे पास बंडलर में बहुत सारे एल्गोरिदम हैं जैसा कि आप उम्मीद कर सकते हैं।
00:18:58और उनमें से कुछ को आपके एप्लिकेशन के बारे में कुछ वैश्विक समझने की आवश्यकता होती है।
00:19:03खैर,
00:19:03यह एक समस्या है क्योंकि जब भी आप वैश्विक जानकारी पर निर्भर करते हैं,
00:19:07तो इसका मतलब है कि कोई भी बदलाव उस ऑपरेशन को अमान्य कर सकता है।
00:19:10तो हमें इन एल्गोरिदम को कैसे डिज़ाइन करते हैं,
00:19:12इस बारे में सावधान रहना होगा,
00:19:14चीजों को सावधानी से संयोजित करना होगा ताकि हम इंक्रीमेंटैलिटी को बनाए रख सकें।
00:19:17और अंत में, यह शायद थोड़ी व्यक्तिगत शिकायत है।
00:19:24टर्बो पैक में सब कुछ एसिंक है।
00:19:27और इसलिए यह क्षैतिज स्केलेबिलिटी के लिए बहुत अच्छा है,
00:19:29लेकिन एक बार फिर,
00:19:30यह हमारे मौलिक,
00:19:30जैसे,
00:19:31आप जानते हैं,
00:19:31डिबगिंग प्रदर्शन प्रोफाइलिंग लक्ष्यों को नुकसान पहुँचाता है।
00:19:38तो मुझे यकीन है कि आप में से बहुत से लोगों को क्रोम देव टूल्स में एसिंक को डीबग करने का अनुभव है।
00:19:46और यह आम तौर पर एक काफी अच्छा अनुभव है।
00:19:48हमेशा आदर्श नहीं।
00:19:49और मैं आपको विश्वास दिलाता हूँ कि एलएलडीबी के साथ रस्ट प्रकाश वर्ष पीछे है।
00:19:53तो उसे प्रबंधित करने के लिए,
00:19:55हमें कस्टम विज़ुअलाइज़ेशन,
00:19:57इंस्ट्रूमेंटेशन और ट्रेसिंग टूल्स में निवेश करना पड़ा है।
00:20:01और उसे देखो,
00:20:02जैसे एक और इंफ्रास्ट्रक्चर प्रोजेक्ट जो बंडलर नहीं है।
00:20:07ठीक है, तो आइए देखें कि क्या हमने सही दांव लगाया।
00:20:11तो वर्सेल में,
00:20:12हमारे पास एक बहुत बड़ा प्रोडक्शन एप्लिकेशन है।
00:20:17हमें लगता है कि यह शायद दुनिया के सबसे बड़े में से एक है,
00:20:19लेकिन आप जानते हैं,
00:20:20हमें वास्तव में नहीं पता।
00:20:21लेकिन इसमें लगभग 80,000 मॉड्यूल हैं।
00:20:23तो आइए देखें कि टर्बो पैक इस पर कैसा प्रदर्शन करता है।
00:20:26तेज़ रीफ्रेश के लिए,
00:20:28हम वास्तव में वेब पैक जो प्रदान करने में सक्षम है,
00:20:31उस पर हावी हैं।
00:20:32लेकिन यह एक तरह से पुरानी खबर है।
00:20:33देव के लिए टर्बो पैक कुछ समय से बाहर है,
00:20:35और मुझे वास्तव में उम्मीद है कि हर कोई कम से कम इसे डेवलपमेंट में उपयोग कर रहा है।
00:20:39लेकिन आप जानते हैं,
00:20:39आज यहाँ नई बात,
00:20:40निश्चित रूप से,
00:20:41यह है कि बिल्ड स्थिर हैं।
00:20:42तो आइए एक बिल्ड देखें।
00:20:44और यहाँ आप इस एप्लिकेशन के लिए वेब पैक पर एक महत्वपूर्ण जीत देख सकते हैं।
00:20:49यह विशेष बिल्ड वास्तव में हमारी नई प्रायोगिक फ़ाइल सिस्टम कैशिंग परत के साथ चल रहा है।
00:20:53तो उन 94 सेकंड में से लगभग 16 सेकंड बस अंत में कैश को बाहर निकालने में लगते हैं।
00:20:59और यह कुछ ऐसा है जिसे हम बेहतर बनाने पर काम करेंगे जैसे ही फ़ाइल सिस्टम कैशिंग स्थिर हो जाती है।
00:21:04लेकिन निश्चित रूप से,
00:21:05कोल्ड बिल्ड के बारे में बात यह है कि वे कोल्ड होते हैं,
00:21:06कुछ भी इंक्रीमेंटल नहीं होता।
00:21:07तो आइए एक वास्तविक वार्म बिल्ड देखें।
00:21:10तो कोल्ड बिल्ड से कैश का उपयोग करके, हम यह देख सकते हैं।
00:21:14तो यह बस एक झलक है कि हम आज कहाँ हैं।
00:21:17क्योंकि हमारे पास यह फाइन-ग्रेन्ड कैशिंग सिस्टम है,
00:21:19हम वास्तव में कैश को डिस्क पर लिख सकते हैं,
00:21:21और फिर अगले बिल्ड पर,
00:21:22उसे वापस पढ़ सकते हैं,
00:21:23पता लगा सकते हैं कि क्या बदला,
00:21:25और बिल्ड को पूरा कर सकते हैं।
00:21:26ठीक है,
00:21:27तो यह काफी अच्छा लग रहा है,
00:21:28लेकिन आप में से बहुत से लोग सोच रहे होंगे,
00:21:30खैर,
00:21:30शायद मेरे पास व्यक्तिगत रूप से दुनिया का सबसे बड़ा नेक्स्ट.जेएस एप्लिकेशन नहीं है।
00:21:34तो आइए एक छोटा उदाहरण देखें।
00:21:37react.dev वेबसाइट काफी छोटी है।
00:21:41यह भी दिलचस्प है क्योंकि यह एक रिएक्ट कंपाइलर है।
00:21:44यह आश्चर्यजनक रूप से रिएक्ट कंपाइलर का एक प्रारंभिक अपनाने वाला है।
00:21:47और रिएक्ट कंपाइलर बैबेल में लागू किया गया है।
00:21:49और यह हमारे दृष्टिकोण के लिए एक तरह की समस्या है क्योंकि इसका मतलब है कि एप्लिकेशन में हर फ़ाइल के लिए,
00:21:53हमें बैबेल से उसे प्रोसेस करने के लिए कहना होगा।
00:21:55तो,
00:21:55और मौलिक रूप से,
00:21:57मैं कहूँगा कि हम,
00:21:58या मैं,
00:21:58रिएक्ट कंपाइलर को तेज़ नहीं बना सकता।
00:22:01यह मेरा काम नहीं है।
00:22:02मेरा काम टर्बो पैक है।
00:22:03लेकिन हम यह पता लगा सकते हैं कि इसे कब कॉल करना है।
00:22:07तो तेज़ रीफ्रेश समय को देखते हुए,
00:22:10मैं वास्तव में इस परिणाम से थोड़ा निराश था।
00:22:13और यह पता चला कि उन 140 मिलीसेकंड में से लगभग 130 मिलीसेकंड रिएक्ट कंपाइलर का है।
00:22:18और टर्बो पैक और वेब पैक दोनों ऐसा कर रहे हैं।
00:22:22लेकिन टर्बो पैक के साथ,
00:22:23हम,
00:22:24रिएक्ट कंपाइलर द्वारा इस बदलाव को प्रोसेस करने के बाद,
00:22:27हम देख सकते हैं,
00:22:27ओह,
00:22:28इम्पोर्ट्स नहीं बदले।
00:22:29इसे आउटपुट में डालो और आगे बढ़ो।
00:22:31एक बार फिर,
00:22:32कोल्ड बिल्ड पर,
00:22:33हम इस तरह की लगातार 3x जीत देखते हैं।
00:22:37और स्पष्ट करने के लिए, यह मेरी मशीन पर है।
00:22:39लेकिन फिर से, एक कोल्ड बिल्ड में कोई इंक्रीमेंटैलिटी नहीं।
00:22:44और एक वार्म बिल्ड में, हम यह बहुत बेहतर समय देखते हैं।
00:22:47तो फिर से,
00:22:47एक वार्म बिल्ड के साथ,
00:22:49हमारे पास डिस्क पर पहले से ही कैश है।
00:22:52हमें बस मूल रूप से यह करना है,
00:22:53एक बार जब हम शुरू करते हैं,
00:22:54तो पता लगाएं कि एप्लिकेशन में कौन सी फ़ाइलें बदलती हैं,
00:22:57उन कार्यों को फिर से निष्पादित करें,
00:22:59और फिर पिछली बिल्ड से बाकी सब कुछ का पुन: उपयोग करें।
00:23:01तो मूल प्रश्न यह है, क्या हम अभी तक टर्बो हैं?
00:23:05हाँ।
00:23:06तो हाँ, इस पर कीनोट में चर्चा की गई थी, निश्चित रूप से।
00:23:09टर्बो पैक नेक्स्ट 16 से स्थिर है।
00:23:12और हम नेक्स्ट के लिए डिफ़ॉल्ट बंडलर भी हैं।
00:23:14तो, आप जानते हैं, मिशन पूरा हुआ, आपका स्वागत है।
00:23:17लेकिन। (हंसता है) (दर्शक तालियाँ बजाते हैं)
00:23:23और अगर आपने कीनोट में वह रीवर्ट चीज़ देखी हो,
00:23:26तो वह मैं था जो टर्बो पैक को डिफ़ॉल्ट बनाने की कोशिश कर रहा था।
00:23:30इसमें केवल तीन प्रयास लगे।
00:23:31लेकिन मैं आपको फिर से जिसके साथ छोड़ना चाहता हूँ, वह यह है।
00:23:35आप जानते हैं, क्योंकि हमने अभी तक काम पूरा नहीं किया है।
00:23:37हमें अभी भी प्रदर्शन पर बहुत कुछ करना है,
00:23:39और फ़ाइल सिस्टम कैशिंग परत पर काम पूरा करना है।
00:23:42मैं आप सभी को इसे देव में आज़माने का सुझाव देता हूँ।
00:23:44और बस इतना ही।
00:23:46आपका बहुत-बहुत धन्यवाद।
00:23:47कृपया मुझे ढूँढें, मुझसे प्रश्न पूछें।
00:23:49(दर्शक तालियाँ बजाते हैं) (उत्साहपूर्ण संगीत) (उत्साहपूर्ण संगीत)