प्रोग्राम करना है या नहीं?
एक सॉफ्टवेयर उत्पाद के साथ एक समस्या को हल करने के लिए, आवश्यकताओं की समझ होने के बाद, आप कर सकते हैं या तो एक कार्यक्रम प्रोग्रामिंग भाषाओं का उपयोग कर लिखने या एक औपचारिक भाषा और उपयोग कोड पीढ़ी उपकरण का उपयोग कर कार्यक्रम निर्दिष्ट करें। उत्तरार्द्ध सिर्फ अमूर्तता का एक स्तर जोड़ता है।
चीजें सही कर रहे हैं या सही चीजें कर रहे हैं?
औपचारिक दृष्टिकोण आपको एक प्रमाण देता है कि आपका सॉफ़्टवेयर विनिर्देशों के अनुसार काम करता है। तो आपका उत्पाद चीजों को सही करता है। लेकिन क्या यह सही काम करता है?
जिन आवश्यकताओं पर आप काम कर रहे हैं वे अपूर्ण या अस्पष्ट हो सकती हैं। वे छोटी गाड़ी भी हो सकती हैं। सबसे खराब स्थिति में, वास्तविक जरूरतों को भी व्यक्त नहीं किया जाता है। लेकिन एक चित्र एक हजार शब्दों के लायक है, बस "ग्राहक क्या चाहता है" के लिए Google चित्र, उदाहरण के लिए इस लेख से :
औपचारिकता की लागत
एक आदर्श दुनिया में, आपके पास शुरू से ही पूरी तरह से विस्तृत और परिपूर्ण आवश्यकताएं होंगी। फिर आप अपने सॉफ़्टवेयर को पूरी तरह से निर्दिष्ट कर सकते हैं। यदि आप औपचारिक रूप से जाते हैं, तो आपका कोड अपने आप जेनरेट हो जाएगा ताकि आप अधिक उत्पादक बन सकें। उत्पादकता लाभ औपचारिक उपकरणों की लागत को ऑफसेट करेगा। और हर कोई अब औपचारिक तरीकों का उपयोग करेगा। तो यह क्यों नहीं है?
व्यवहार में, यह शायद ही कभी वास्तविकता है! यही कारण है कि इतने सारे झरने की परियोजनाएं विफल हो गईं , और क्यों पुनरावृत्ति विकास विधियों (फुर्तीली, रेड, आदि) ने नेतृत्व किया: वे अपूर्ण और अपूर्ण आवश्यकताओं को संभाल सकते हैं, डिजाइन और कार्यान्वयन कर सकते हैं और उन्हें ठीक कर सकते हैं जब तक कि वे ठीक न हों।
और यहाँ बात आती है। औपचारिक तरीकों के साथ, प्रत्येक पुनरावृत्ति के लिए पूरी तरह से सुसंगत औपचारिक कल्पना की आवश्यकता होती है। इसके लिए सावधानीपूर्वक सोचने और अतिरिक्त काम करने की आवश्यकता होती है, क्योंकि औपचारिक तर्क क्षमा नहीं करता है और अधूरे विचारों को पसंद नहीं करता है। इस गतिरोध के तहत सरल थ्रो-दूर प्रयोग महंगे हो जाते हैं। और इसलिए प्रत्येक पुनरावृत्ति होती है जो बैकट्रैकिंग का कारण बनती है (उदाहरण के लिए एक विचार जो काम नहीं करता था, या एक आवश्यकता जिसे गलत समझा गया था)।
प्रयोग में
जब कानूनी या संविदात्मक कारणों के लिए औपचारिक तरीकों का उपयोग करने के लिए बाध्य नहीं किया जाता है, तो आप अनुबंध आधारित प्रोग्रामिंग और अन्य अच्छी प्रथाओं (जैसे कोड समीक्षा, टीडीडी , आदि ...) का उपयोग करके उदाहरण के लिए, औपचारिक प्रणालियों के बिना बहुत उच्च गुणवत्ता प्राप्त कर सकते हैं । आप यह साबित नहीं कर पाएंगे कि आपका सॉफ़्टवेयर काम करता है, लेकिन आपके उपयोगकर्ता जल्द ही काम करने वाले सॉफ़्टवेयर का आनंद लेंगे।
अद्यतन: मापा प्रयास
एसीएम के संचार के अक्टूबर 2018 के अंक में प्रयास के कुछ अनुमानों के साथ वास्तविक दुनिया में औपचारिक रूप से सत्यापित सॉफ्टवेयर के बारे में एक दिलचस्प लेख है ।
दिलचस्प रूप से (सैन्य उपकरणों के लिए ओएस विकास पर आधारित), ऐसा लगता है कि औपचारिक रूप से सिद्ध सॉफ्टवेयर का निर्माण पारंपरिक इंजीनियरिंग तकनीकों की तुलना में 3.3 गुना अधिक प्रयास की आवश्यकता है । तो यह वास्तव में महंगा है।
दूसरी ओर, पारंपरिक रूप से इंजीनियर सॉफ्टवेयर के साथ उच्च सुरक्षा सॉफ्टवेयर प्राप्त करने के लिए इस तरह के 2.3 गुना कम प्रयास की आवश्यकता होती है यदि आप इस तरह के सॉफ़्टवेयर को उच्च सुरक्षा स्तर (ईएएल 7) पर प्रमाणित करने का प्रयास जोड़ते हैं। इसलिए यदि आपके पास उच्च विश्वसनीयता या सुरक्षा आवश्यकताएं हैं, तो निश्चित रूप से औपचारिक रूप से जाने के लिए एक व्यावसायिक मामला है।
seL4 डिजाइन और कोड विकास में दो व्यक्ति-वर्ष लगे। पिछले कुछ वर्षों में सी कोड की 8,700 लाइनों के लिए कुल 18 व्यक्ति-वर्ष आते हैं। इसकी तुलना में, L4Ka :: L4 परिवार में एक और माइक्रोकर्नल, पिस्ता, seL4 के आकार में तुलनीय है, इसे विकसित करने और आश्वासन का कोई महत्वपूर्ण स्तर प्रदान करने के लिए छह व्यक्ति-वर्ष लगे। इसका मतलब है कि सत्यापित सॉफ्टवेयर और पारंपरिक रूप से इंजीनियर सॉफ्टवेयर के बीच केवल एक कारक 3.3 है । Colbert और Boehm द्वारा अनुमान पद्धति के अनुसार, C कोड की 8,700 लाइनों के लिए एक सामान्य कॉमन क्राइटेरिया EAL7 प्रमाणन 45 से अधिक व्यक्ति-वर्ष लेगा। इसका मतलब है कि औपचारिक बाइनरी-स्तरीय कार्यान्वयन सत्यापन पहले से ही 2.3 के एक कारक से अधिक है आम मानदंड के उच्चतम प्रमाणीकरण स्तर की तुलना में कम महंगा अभी तक काफी मजबूत आश्वासन प्रदान करता है।