A Programmer’s Regret: Neglecting Math at University | by Walter Schulze

क्या गणित मायने रखता है? गणित आपके विचार से अधिक और कम दोनों मायने रखता है…

द्वारा तसवीर शुभम शरण पर unsplash

हां, आप गणित को अनदेखा कर सकते हैं और अत्यधिक भुगतान वाले पेशेवर प्रोग्रामर बन सकते हैं। प्रोग्रामिंग एक विस्तृत पर्याप्त क्षेत्र है जिसे आप चुन सकते हैं कि आप किन क्षेत्रों पर ध्यान केंद्रित करना चाहते हैं – जिनमें से कुछ को गणित की आवश्यकता नहीं है – और फिर भी सफल रहें। दूसरी ओर:

  1. गणित है उपकरण विशेष समस्याओं को हल करने के लिए प्रयोग किया जाता है, और
  2. प्रोग्रामिंग गणित कर रहा है।

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

लेकिन पहले, एक कहानी। मेरे बारे में गणित की परवाह नहीं …

जब मैं विश्वविद्यालय में था, तो मुझे वास्तव में गणित की बात समझ में नहीं आई थी। हाई स्कूल में हमने जो गणित किया था, उससे यह इतना बड़ा बदलाव था, और मैं वास्तव में कार्यक्रम करना चाहता था। गणित मेरी डिग्री प्राप्त करने के लिए एक आवश्यक बुराई की तरह लग रहा था, ताकि मैं और अधिक प्रोग्रामिंग पर जा सकूं। सबूत सबसे कम प्रेरक थे, क्योंकि ऐसा लगा कि उन्हें केवल परीक्षा के लिए भरे जाने की जरूरत है और मेरे प्रोग्रामिंग करियर के लिए कोई मूल्य नहीं दिया। मेरे जिद्दी स्वभाव ने इसके बारे में इतना “सिद्धांत” महसूस किया कि मैंने प्रमाणों का अध्ययन करने से इनकार कर दिया। इसका परिणाम यह हुआ कि मुझे मेरे प्रथम वर्ष में खराब प्रदर्शन करने वाले छात्रों के लिए एक विशेष समूह में डाल दिया गया। बहुत गर्व (बेवकूफ पढ़ें), मैंने प्रमाणों का अध्ययन करने से इनकार कर दिया और परीक्षा में 40% प्रमाण होने के बावजूद बाल-बाल बच गए। अभी भी संदेश नहीं मिल रहा है, मुझे अपने दूसरे वर्ष में एक परीक्षा और एक परीक्षा फिर से लिखनी पड़ी। परीक्षा पुनर्लेखन वह जगह है जहां मैंने अंततः अपने “सिद्धांतों” से समझौता किया और सबूतों का अध्ययन करने के लिए अपनी अधिकांश गर्मी की छुट्टी छोड़नी पड़ी। मैं गणित को हैक नहीं कर सका, इसलिए मैंने एक छुट्टी खो दी और फिर भी यह नहीं समझा कि यह क्यों महत्वपूर्ण था। आपको लगता होगा कि इस बड़ी असफलता से मैं कुछ सीख लूंगा, लेकिन मैं अभी भी जिद से तिलमिला रहा था। कहने के लिए पर्याप्त है, जब गणित वैकल्पिक बन गया, तो मैंने इसे नहीं चुना! बाद में यह मेरे सबसे बड़े पछतावे में से एक है: पांच साल बाद मुझे पता चला कि जो समस्याएं मुझे सबसे दिलचस्प लगीं वे थीं सब गणित पर गहन रूप से आधारित।

मैंने आखिरकार सप्ताह में निर्धारित सामग्री को पढ़ने के लिए एक कंप्यूटर साइंस की किताब उठाई, जिसे मैं अपने मास्टर की थीसिस में सौंप रहा था। यही वह समय था जब मुझे अंततः यह एहसास हुआ कि गणित और कंप्यूटर विज्ञान एक तरह से जुड़े हुए थे जो मुझे वास्तव में दिलचस्प लगे। तब से मैं उन सभी छात्रों के साथ कैच-अप खेल रहा हूं जो वास्तव में कक्षा में ध्यान दे रहे थे, मेरे मूल्यवान काम के बाद के खाली समय के दौरान। यह दस साल से अधिक समय से चल रही प्रक्रिया है, जब मैं चार साल तक सिर्फ ध्यान दे सकता था कि यह मेरे चेहरे पर छाया हुआ था। यह दस साल है, मैं अपने साथियों की तरह नई चीजें सीखने में बिता सकता था, जिन्होंने ध्यान दिया, लेकिन इसके बजाय मेरा गणित अभी भी स्नातक स्तर पर नहीं है। कभी-कभी मुझे वास्तव में ऐसा लगता है कि मैंने अपना जीवन बर्बाद कर दिया, लेकिन इस पर और अधिक ध्यान देने के बजाय, आइए गणित के कुछ उदाहरण देखें जो प्रोग्रामिंग के लिए महत्वपूर्ण हैं।

स्पष्ट रूप से खेलों और फिल्मों में ग्राफिक्स प्रोग्रामिंग के लिए भौतिकी ज्ञान की आवश्यकता होती है, लेकिन चूंकि सटीक भौतिकी ठीक से अनुकरण करने के लिए बहुत महंगी हो सकती है, इसलिए हम आम तौर पर गणित से न्यूमेरिकल विधियों का उपयोग करते हैं, उदाहरण के लिए वेरलेट इंटीग्रेशन का उपयोग करके रैगडॉल भौतिकी का अनुमान लगाया जाता है:

कम स्पष्ट Google की वेब खोज एल्गोरिथम हो सकती है। आप सोच सकते हैं कि यह केवल वेब पेजों पर शब्दों की गिनती करना है और शीर्ष पर संबंधित शब्द की उच्चतम संख्या वाला पेज दिखाना है, लेकिन इस रैंकिंग में हेरफेर करना बहुत आसान है, उदाहरण के लिए एक वेब पेज जो गणित शब्द को दोहराता है, नहीं करता है वास्तव में कोई गणित शामिल है। शीर्ष पर सबसे अधिक प्रासंगिक परिणाम प्राप्त करने के लिए पृष्ठों की रैंकिंग करना बहुत कठिन समस्या है। पेजरैंक एल्गोरिद्म किसी वेब पेज से आने-जाने के लिंक की संख्या को ध्यान में रखता है और उन्हें एक मैट्रिक्स में रखता है, फिर यह अधिक प्रासंगिक रैंकिंग की गणना करने के लिए रैखिक बीजगणित से एक ईजेनवेक्टर के सन्निकटन का उपयोग करता है:

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

मुझे लगता है कि वे पर्याप्त उदाहरण हैं, जो विशेष समस्याओं को हल करने के लिए गणित को उपकरण के रूप में उपयोग करते हैं। मैं अब कम स्पष्ट के बारे में बात करना चाहता हूं और दिखाना चाहता हूं कि गणित प्रोग्रामिंग है, जो अब मुझे और भी पेचीदा लगता है।

एपेटाइज़र के रूप में अमूर्तता

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

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

कोई आश्चर्य नहीं … गणित में सार बीजगणित नामक एक उपयुक्त लगने वाला उप क्षेत्र है। यहाँ सार बीजगणित का एक छोटा सा स्वाद है, एक समूह की व्याख्या के साथ:

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

यह अमूर्तता उपयोगी है क्योंकि अब हम किसी भी मोनोइड के लिए काम करने वाले कार्यों के एकल कार्यान्वयन को लिख सकते हैं। उदाहरण के लिए:

  • एक साधारण कार्य mconcat, जो मोनोइड तत्वों की सूची लेता है और उन्हें एक तत्व में जोड़ता है। पूर्णांकों की सूची का योग करना अब छवियों की सूची को आच्छादित करने जैसा ही है।
  • एक अधिक जटिल कार्य foldMap पुनरावर्ती रूप से एक पेड़ पर चल सकते हैं और या तो:
    – वापसी करें कि क्या कोई तत्व सत्य है,
    – पता लगाएं कि क्या कोई तत्व 5 से बड़ा है, या
    – तह करने योग्य संरचना को एक सेट में बदलना,
    यह सब हमारे द्वारा उपयोग किए जाने वाले मोनोइड के प्रकार पर निर्भर करता है।

हम और भी सार कर सकते हैं और न केवल इस फ़ंक्शन को पेड़ों के लिए काम कर सकते हैं, बल्कि किसी भी फोल्ड करने योग्य कंटेनर के लिए, दूसरे शब्दों में, किसी भी कंटेनर को सूची में परिवर्तित किया जा सकता है।

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

यहां हमने साझा कार्यान्वयन बनाने के लिए अमूर्तता का उपयोग किया, लेकिन अमूर्तता इससे अधिक उपयोगी हो सकती है और होनी चाहिए। अमूर्तता संबंधों को समझाने या खोजने की सेवा में है।

मुख्य पाठ्यक्रम की संरचना

मनुष्यों द्वारा एक जटिल समस्या को हल करने का एक काफी लोकप्रिय तरीका विभाजित करना और जीतना है। समस्या को छोटे-छोटे भागों में तोड़ दें, उन छोटी समस्याओं को हल करें और फिर उन समाधानों को बड़ी समस्या के समाधान के रूप में लिखें। क्या आप दूसरा (सामान्य) तरीका सोच सकते हैं? …

प्रोग्रामिंग में हम एक समस्या को कई छोटे कार्यों में तोड़ते हैं जो छोटी समस्याओं को हल करते हैं और फिर उन्हें एक साथ बड़े और बड़े कार्यों में बनाते हैं जो अंततः बड़ी समस्या को हल करते हैं। कार्यों को एक साथ लिखने का सबसे अच्छा तरीका क्या होगा? मुझे आश्चर्य है कि क्या गणित के पास कोई विचार है जिसे हम चुरा सकते हैं?

श्रेणी सिद्धांत, गणित का एक अन्य उपक्षेत्र है, जिसे मैं अमूर्त सार बीजगणित कहना पसंद करता हूं, लेकिन वास्तव में यह रचना का गणित है, जहां हम वस्तुओं के संदर्भ में उनकी सामग्री के बजाय अध्ययन करते हैं। यहाँ हम कई उपयोगी विचार पा सकते हैं, जैसे:

  • फ़ंक्टर, जो हमें मैप फ़ंक्शन का उपयोग करके कंटेनर में प्रत्येक तत्व के लिए एक फ़ंक्शन लागू करने की अनुमति देता है, जैसे कि पायथन में सूची, स्ट्रीम एपीआई और जावा में वैकल्पिक, या यहां तक ​​​​कि हास्केल में फ़ंक्शन।
  • मोनाड्स, जो पायथन में सूची की समझ का आधार हैं, LINQ in C#, Scala में पार्सर कॉम्बिनेटर, IO और हास्केल में सबसे अधिक संगामिति, आदि। मुझे एक प्रोग्रामिंग भाषा खोजें और मैं आपको उस भाषा में एक उपयोगी मोनाड ढूंढूंगा।
  • एफ-अलजेब्रस, जो हमें पुनरावर्तन पर अमूर्त करने की अनुमति देता है – लेकिन ईमानदारी से कहूं तो अब हम अपने ज्ञान के किनारे पर हैं।

इन अत्यंत अमूर्त अवधारणाओं को आपके मस्तिष्क में परिपक्व होने में कुछ समय लग सकता है, इसलिए जितनी जल्दी आप शुरुआत करें उतना अच्छा है। नीचे एक छोटा वीडियो देखें जो सन्यासियों को समझाने की कोशिश करता है:

खुद के मरने से स्वर्ग मिलता है

यह आपके गणित के भोजन का सबसे मीठा और अंतिम भाग है।

अब, आपको याद होगा कि मैंने कहा था कि मुझे विश्वविद्यालय में गणित करने का सबसे कम प्रेरक हिस्सा होने के प्रमाण मिले हैं। खैर क्या हुआ अगर मैंने आपको बताया कि प्रकारों को प्रस्तावों के रूप में और कार्यक्रमों को प्रमाण के रूप में देखा जा सकता है:

यहाँ कुछ सिद्ध गुण हैं:

  • x + y = y + x
  • P & (Q & R) = (P & Q) | (P & R)
  • length(filter(predicate,list) ≤ length(list)
  • निष्पादन योग्य कोड सी कंपाइलर पैदा करता है, जैसा कि स्रोत सी प्रोग्राम के शब्दार्थ द्वारा निर्दिष्ट किया गया है, देखें CompCert

अब जब मुझे पता है कि मैं चीजों को गणितीय रूप से साबित करने के लिए प्रोग्रामिंग का उपयोग कर सकता हूं, तो मुझे प्रोग्रामिंग के बारे में सबसे दिलचस्प चीज होने के प्रमाण मिलते हैं। प्रूफ़ हमें कम त्रुटियों वाले सुरक्षित प्रोग्राम लिखने की अनुमति देते हैं, क्योंकि हम केवल उनका परीक्षण करने के बजाय गुणों को सिद्ध कर सकते हैं।

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

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

हमने Coq प्रूफ असिस्टेंट, करेक्ट कोड बाय कंस्ट्रक्शन के थोड़े लंबे परिचय पर Devoxx UK 2022 में बात की। अगर आप मुझे एक बिल्डर के आउटफिट में और कुछ चिकन के हाई विज़ में देखना चाहते हैं:

तो यह बात आपके लिए है:

ऐसा लगता है कि जिस चीज से मैं हर कीमत पर बचने की कोशिश कर रहा था, वही चीज निकली जिसे करना मुझे सबसे ज्यादा पसंद था। मैंने जो गलती की थी, वही गलती न करें: अपने अनिवार्य गणित विषयों को सर्वश्रेष्ठ बनाएं या आप बाद में पछताएंगे।

यदि आपके शिक्षक या शिक्षा सामग्री आपको ज्ञान के इस विशाल क्षेत्र का पता लगाने के लिए प्रेरित नहीं कर रहे हैं, तो कृपया YouTube, कौरसेरा या एडएक्स जैसे वैकल्पिक ऑनलाइन संसाधनों की अधिकता की ओर मुड़ें या एक बेहतर पुस्तक खोजने का प्रयास करें। कोई है जो एक कठिन अवधारणा को समझा सकता है और आपको प्रेरित कर सकता है – आपको बस उन्हें खोजने के लिए समय निकालने की आवश्यकता है। आपको प्रोग्रामिंग का अभ्यास करने की तरह ही अभ्यासों का उपयोग करने का अभ्यास करने की भी आवश्यकता है।

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

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

Leave a Reply