डीडब्ल्यू का जवाब बहुत अच्छा है , लेकिन मैं एक बिंदु पर विस्तार करना चाहता हूं। एक विनिर्देश केवल एक संदर्भ नहीं है जिसके खिलाफ कोड सत्यापित है। औपचारिक विनिर्देश होने के कारणों में से एक यह है कि कुछ मूलभूत गुणों को साबित करके इसे मान्य किया जाए। बेशक, विनिर्देश पूरी तरह से मान्य नहीं किया जा सकता है - सत्यापन विनिर्देश के रूप में ही जटिल होगा, इसलिए यह एक अंतहीन प्रक्रिया होगी। लेकिन सत्यापन हमें कुछ महत्वपूर्ण गुणों पर एक मजबूत गारंटी प्राप्त करने की अनुमति देता है।
उदाहरण के लिए, मान लीजिए कि आप एक कार ऑटोपायलट डिजाइन कर रहे हैं। यह एक बहुत जटिल चीज है जिसमें बहुत सारे पैरामीटर शामिल हैं। ऑटोपायलट की शुद्धता गुणों में "कार एक दीवार के खिलाफ दुर्घटनाग्रस्त नहीं होगी" और "कार को वह स्थान बताएगा जहां इसे जाना है"। "कार एक दीवार के खिलाफ दुर्घटना नहीं होगी" जैसी संपत्ति वास्तव में महत्वपूर्ण है, इसलिए हम यह साबित करना चाहेंगे। चूंकि सिस्टम भौतिक दुनिया में संचालित होता है, इसलिए आपको कुछ भौतिक बाधाओं को जोड़ना होगा; कम्प्यूटेशनल प्रणाली की वास्तविक संपत्ति कुछ इस तरह होगी "सामग्री विज्ञान के बारे में इन धारणाओं के तहत, और कार के सेंसर द्वारा बाधाओं की धारणा के बारे में ये धारणाएं, कार एक दीवार के खिलाफ दुर्घटनाग्रस्त नहीं होगी"। लेकिन फिर भी, परिणाम अपेक्षाकृत सरल संपत्ति है जो स्पष्ट रूप से वांछनीय है।
क्या आप कोड से इस संपत्ति को साबित कर सकते हैं? अंत में, यह वही है जो चल रहा है, यदि आप पूरी तरह से औपचारिक दृष्टिकोण का पालन कर रहे हैं। लेकिन कोड के कई अलग-अलग हिस्से हैं; ब्रेक, कैमरा, इंजन आदि सभी को स्वायत्त रूप से नियंत्रित किया जाता है। ब्रेक की शुद्धता संपत्ति कुछ इस तरह होगी "यदि 'ब्रेक लागू होता है' संकेत है तो ब्रेक लागू होते हैं"। इंजन की शुद्धता संपत्ति "यदि क्लच सिग्नल बंद है तो इंजन पहियों को नहीं चला रहा है"। उन सभी को एक साथ रखने के लिए यह एक बहुत ही उच्च-स्तरीय दृश्य है। एक विनिर्देश एक मध्यवर्ती परत बनाता है जहां सिस्टम के विभिन्न घटकों को एक साथ जोड़ा जा सकता है।
वास्तव में, कार ऑटोपायलट के रूप में इस तरह की एक जटिल प्रणाली में कई प्रकार के विनिर्देश होंगे जिनमें अलग-अलग मात्रा में परिशोधन होते हैं। एक परिशोधन दृष्टिकोण अक्सर डिजाइन में उपयोग किया जाता है: कुछ उच्च-स्तरीय गुणों के साथ शुरू करें जैसे "कार एक दीवार के खिलाफ दुर्घटनाग्रस्त नहीं होगी", फिर यह पता लगाएं कि इसके लिए सेंसर और ब्रेक की आवश्यकता होती है और सेंसर के लिए कुछ बुनियादी आवश्यकताओं को पूरा करता है, ब्रेक और पायलट सॉफ्टवेयर, फिर घटक की डिज़ाइन में उन बुनियादी आवश्यकताओं को फिर से परिष्कृत करें (सेंसर के लिए, मुझे एक रडार, एक डीएसपी, एक छवि प्रसंस्करण पुस्तकालय, ...), आदि की आवश्यकता है, एक औपचारिक विकास प्रक्रिया में, विनिर्देश का प्रत्येक स्तर इसके ऊपर के स्तर से निर्धारित आवश्यकताओं को पूरा करने के लिए सिद्ध होता है, सभी उच्चतम स्तर के गुणों से लेकर कोड तक।
यह सुनिश्चित करना असंभव है कि विनिर्देश सही है। उदाहरण के लिए, यदि आपको भौतिकी गलत लगी है, तो ब्रेक प्रभावी नहीं हो सकता है, जबकि औपचारिक आवश्यकताओं के लिए ब्रेक कोड से संबंधित गणित सही है। यह साबित करने के लिए अच्छा नहीं है कि ब्रेक 500 किलोग्राम भार के साथ प्रभावी हैं यदि आपके पास वास्तव में 5000 किलोग्राम है। लेकिन यह देखना आसान है कि 500 किलोग्राम ब्रेक कोड के अंदर देखने की तुलना में गलत है कि वे कार के भौतिक मापदंडों के लिए पर्याप्त नहीं होंगे।
A पूरी तरह से औपचारिक दृष्टिकोण के विपरीत "मुझे लगता है कि यह काम करता है, लेकिन मुझे यकीन नहीं हो सकता है"। जब आप इस पर अपना जीवन दांव पर लगा रहे हैं, तो यह इतना अच्छा नहीं लगता।