Back to "कैसे मैं सॉफ्टवेयर बनाने के लिए: यह काम करें, सुंदर बनाओ, नीचे लॉक"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

Best Practices Craftsmanship Software Development TDD Testing

कैसे मैं सॉफ्टवेयर बनाने के लिए: यह काम करें, सुंदर बनाओ, नीचे लॉक

Wednesday, 19 November 2025

क्यों मैं पिछले परीक्षण लिख रहा हूँ, और क्यों आप इसका मतलब नहीं है कि

**कनवर्सेसन ले लो:**टेस्ट- अप विकास एक शानदार अभ्यास है जो सबसे सृजनात्मक कार्य के लिए गलत समस्या को हल करता है.

यहाँ बेहतर क्या काम करता है.

सॉफ्टवेयर बनाने के तीन चरण (कि वास्तव में काम करता है)

यह है कि मैं सॉफ्टवेयर का निर्माण कैसे है.

यह सरल है, यह प्रभावी है, और यह TDDED DDEDC को उनके buds को अनुकूल बनाता है:

काम करो.*बहुत सुंदर बनाओ.*जांच के साथ नीचे लॉक करें.

graph TB
    Start[New Feature Request] --> P1[Phase 1: Make It Work]

    P1 --> P1_Private[Private Exploration]
    P1_Private --> P1_Sketch["Sketch the solution<br/>Messy code OK<br/>No tests yet<br/>Focus on learning"]
    P1_Sketch --> P1_Run["Run it manually<br/>Try different inputs<br/>See what breaks<br/>Understand the problem"]
    P1_Run --> P1_Decision{Does it work<br/>basically?}
    P1_Decision -->|No| P1_Iterate[Try different approach]
    P1_Iterate --> P1_Sketch
    P1_Decision -->|Yes| P2

    P2[Phase 2: Make It Pretty] --> P2_Refine[Private Refinement]
    P2_Refine --> P2_Clean["Clean up the code<br/>Better names<br/>Type hints/annotations<br/>Clear structure"]
    P2_Clean --> P2_Align["Align with spec<br/>Cover all requirements<br/>Handle edge cases<br/>Polish API surface"]
    P2_Align --> P2_Optimise["Optimise<br/>Performance<br/>Readability<br/>Maintainability"]
    P2_Optimise --> P3

    P3[Phase 3: Lock It Down] --> P3_Share[Public Sharing]
    P3_Share --> P3_Tests["Write comprehensive tests<br/>Full coverage<br/>Edge cases<br/>Error conditions"]
    P3_Tests --> P3_CI["CI/CD Integration<br/>Automated testing<br/>Code review<br/>Documentation"]
    P3_CI --> P3_Deploy["Ready to Share<br/>Commit to main<br/>Deploy to prod<br/>Other devs can use it"]

    P3_Deploy --> Done[Well-Tested,<br/>Well-Designed Code]

    style P1 stroke:#ff6b6b,stroke-width:3px
    style P2 stroke:#4ecdc4,stroke-width:3px
    style P3 stroke:#95e1d3,stroke-width:3px
    style Done stroke:#38ada9,stroke-width:4px

उस क्रम में.*हमेशा.*नहीं क्योंकि मैं आलसी हूँ.

नहीं क्योंकि मैं परीक्षण मूल्य नहीं है.

लेकिन क्योंकि

यह कैसे सृजनात्मक कार्य है वास्तव में होता है

जब आप एक समस्या स्थान की जाँच कर रहे हैं... ... आप अभी तक पूरी तरह से समझ नहीं आता.

  • नहीं क्योंकि मैं आलसी हूँ.
  • नहीं क्योंकि मैं परीक्षण मूल्य नहीं है.
  • लेकिन क्योंकि
  • यह कैसे सृजनात्मक कार्य है वास्तव में होता है

जब आप एक समस्या स्थान की जाँच कर रहे हैं... ... आप अभी तक पूरी तरह से समझ नहीं आता.

आइए मैं आपको बताऊँ ।

फेस 1: यह काम करते हैं (निजी स्लेक)

यह गंदगी हिस्सा है.हिस्सा जहाँ मुझे पता नहीं है मैं क्या कर रहा हूँ.

मैं समझने की कोशिश कर रहा हूँ:

क्या यह एपीआई वास्तव में उस प्रकार काम करती है जिस प्रकार का दावा करता है?

क्या मैं भी मेरे पास औज़ारों के साथ इस समस्या को हल कर सकता हूँ?

"सही" इस संदर्भ में भी क्या मतलब है?*क्या यह दो घंटे की समस्या है या दो सप्ताह की समस्या है?*यह आविष्कार किया जाता है.

यह खोज रहा है.

यह ज़ैज है.

# Ugly, exploratory code
def process_thing(data):
    # TODO: This is terrible, fix later
    result = []
    for item in data:
        # Not sure if this is the right approach...
        x = item.get('value')
        if x:  # Is this even the right condition?
            result.append(x * 2)  # Why multiply by 2? Testing something...
    return result

और तुम्हें पता है कि ज़ैज को क्या मारता है?**"पहले परीक्षण" अपने कंधे के ऊपर खड़ा किसी ने कहा.**क्यों कोई परीक्षण फिर भी नहीं?

क्योंकि*आकार अभी - भी द्रव होता है ।*कल्पना कीजिए कि आप एक सलाहकार हैं।

"मैं एक पक्षी को तराशना चाहता हूँ।"

टीडी कहता है, "आप उस कगार को छूने से पहले, ठीक नीचे लिखिए कि एक पक्षी कैसा दिखता है.

अपने पंख की पंखियों को पारिभाषित करें.पंखों का कोण निर्दिष्ट करें.

"और ऐ अपराधियों! आज तुम छँटकर अलग हो जाओ*(या सॉफ्टवेयर लिखा जाता है, के रूप में यह जाता है.)*वास्तविक निर्माता

सबसे पहले रूप को किसी भी तरह से बाहर.वे चित्रित करते हैं.

वे लकीर बना देते हैं.*वे आम आकार खोजने के लिए पत्थर के बड़े टुकड़े दूर चिप.*केवल बाद में ही वे विवरणों को शुद्ध करते हैं ।

कोड वही है.

फेस 1 में, मैं लिख रहा हूँ:

यह कोड है

निजी।

यह अपने आप के साथ एक बातचीत है.

यह मैं कैसे पता चला है कि "काम" का मतलब भी क्या है।

इसके लिए परीक्षण बेकार से भी बदतर है, यह है

एक - दूसरे से हद - से - ज़्यादा की उम्मीद मत कीजिए ।

क्योंकि हर बार जब मैं जानता हूँ कि "रुको, यह पूरा तरीका गलत है," मुझे जाँच भी करनी होगी.

कि निराशर नहीं है.

यही कारण है कि बकवास है।

उपवास न करने की स्वतंत्रता

# Before (Phase 1) - Exploratory code
def process_thing(data):
    result = []
    for item in data:
        x = item.get('value')
        if x:
            result.append(x * 2)
    return result

# After (Phase 2) - Refined code
def extract_doubled_values(items: list[dict]) -> list[int]:
    """Extract 'value' field from items and double each one.

    Only includes items where 'value' is present and truthy.
    """
    return [
        item['value'] * 2
        for item in items
        if item.get('value')
    ]

फेस 1 के बारे में है

// Before (Phase 1) - Exploratory code
public List<int> ProcessThing(List<Dictionary<string, object>> data)
{
    var result = new List<int>();
    foreach (var item in data)
    {
        if (item.ContainsKey("value"))
        {
            var x = item["value"];
            if (x != null)
            {
                result.Add(Convert.ToInt32(x) * 2);
            }
        }
    }
    return result;
}

// After (Phase 2) - Refined code
/// <summary>
/// Extracts 'value' field from items and doubles each one.
/// Only includes items where 'value' is present and non-null.
/// </summary>

public IEnumerable<int> ExtractDoubledValues(IEnumerable<IDictionary<string, object>> items)
{
    return items
        .Where(item => item.ContainsKey("value") && item["value"] != null)
        .Select(item => Convert.ToInt32(item["value"]) * 2);
}

गति सीखना.

मैं एक घंटे में पांच अलग होने की कोशिश करने की जरूरत है.

मुझे पता लगाने की जरूरत है कि तीसरी विशेष लाइब्रेरी मैंने सोचा था कि मैं इस्तेमाल करेंगे ... विज्ञापन के रूप में काफी नहीं है.मैं मैं हल कर रहा हूँ समस्या मैं नहीं है समस्या है पता करने की जरूरत हैकोना चाहिए*हल किया जा रहा है.*परीक्षण इस धीमी गति से.

इसलिये नहीं कि परखे जाने में धीमा है, परन्तु इसलिये कि

  • समय - समय पर जाँच की जाती है मौत ।
  • मैं समस्या को समझने से पहले जाँच लिखता हूँ, मैं परीक्षण लिख रहा हूँ
  • गलत बात.

तो फिर मैं भावात्मक रूप से गलत बात में निवेश कर रहा हूँ.

तो मैं कोड समीक्षा में गलत बात की रक्षा कर रहा हूँ।

सबसे अच्छा है तेजी से, अकेले में, किसी भी परीक्षण को बनाए रखने के लिए और कोई अहंकार की रक्षा करने के लिए नहीं."कार्य" का मतलब क्या है PROW1 में 1इसका मतलब है: "मैं भाग गया.

मैं यह कुछ इनपुट दिया.

# Phase 1: Works, but awkward to use
process_thing(data)

# Phase 2: Clear, flexible, composable
extract_doubled_values(
    items,
    scale_factor=2.0,
    include_zeros=False
)

इसमें ऐसे आउटपुट उत्पन्‍न हुए जो तर्कसंगत प्रतीत होते हैं ।

// Phase 1: Works, but awkward to use
ProcessThing(data);

// Phase 2: Clear, flexible, composable
ExtractDoubledValues(
    items,
    scaleFactor: 2.0,
    includeZeros: false
);

// Or even better with a fluent API
items.ExtractValues()
     .Scale(by: 2.0)
     .ExcludingZeros()
     .ToList();

मुझे लगता है 60% मुझे यकीन है कि अब समस्या समझ में आ गया है।"

यह बात है.**कोई किनारा मामलों.**कोई त्रुटि संभाल नहीं.

graph LR
    subgraph "Phase 2 Refinement Process"
        A[Rough Code] --> B[Clean Structure]
        B --> C[Add Types]
        C --> D[Polish API]
        D --> E[Static Analysis]
        E --> F{Quality Gates Pass?}
        F -->|No| G[Fix Issues]
        G --> B
        F -->|Yes| H[Ready for Phase 3]
    end

    style A stroke:#ff6b6b,stroke-width:3px
    style H stroke:#95e1d3,stroke-width:3px

कोई गैस.

*बस एक जाल.*संकल्प का एक सबूत.

एक छवि।PRT 2: इसे सुंदर बनाते हैं (पुष्टि)

ठीक है, तो अब मैं समस्या को समझते हैं.मेरे पास कुछ है जो काम करता है, कम से कम खुश पथ के लिए.

अब मैं गुणवत्ता के बारे में परवाह शुरू कर सकते हैं.

  • फेस 2 है जहां मैं:
  • 1 ..
  • मुझमें साफ - सफाई

पायथन उदाहरण:*C# उदाहरण:*बेहतर नाम.

एनोटेशन टाइप करें.*एक्सएमएल दस्तावेज़.*साफ LNONEQ.

2

आयत पर निशान लगाइए

अब मुझे पता है कि मैं वास्तव में इमारत क्या कर रहा हूँ पता है, मैं मूल आवश्यकताओं के लिए वापस जाना और सुनिश्चित करें कि मैं हल कर रहा हूँ

दाहिना

समस्या, सिर्फ नहीं

एकसमस्या.

अक्सर यह बिन्दुओं को प्रकट करता है:

"ओह, वे यह चाहता था नकारात्मक संख्या को अलग तरीके से संभालने के लिए."

  1. "रुको, वहाँ एक किनारे मामला है जहां मान कोई vs हो सकता है. 0. ""सेट कहते हैं 'दोहर' लेकिन मुझे लगता है कि वे एक कॉन्फ़िगरेबल कारक द्वारा पैमाने का मतलब था.
  2. **मैं इन ठीक है.**कभी कभी कभी मैं स्पेस पर धक्का: "कार्यपूर्वक, हमें एक्स एक्स करना चाहिए क्योंकि Y."
  3. 3पोलिश सतह
  4. यह है जहां मैं के बारे में सोचते हैंकॉलर का

अनुभव ।**पायथन:**C#:

बेहतर नामकरण।

  • संवेदनशील डिफ़ॉल्ट.
  • विन्यास जहाँ यह बात है.
  • फ्लू के लिए जहाँ उपयुक्‍त हो.
  • यह है
  • व्यवसाय.

यह जहां अच्छा सॉफ्टवेयर से आता है.

क्यों फिर भी कोई परीक्षण नहीं?

def test_extract_doubled_values_basic():
    items = [{'value': 5}, {'value': 10}]
    assert extract_doubled_values(items) == [10, 20]

def test_extract_doubled_values_skips_missing_values():
    items = [{'value': 5}, {'name': 'foo'}, {'value': 3}]
    assert extract_doubled_values(items) == [10, 6]

def test_extract_doubled_values_handles_zeros():
    items = [{'value': 0}, {'value': 5}]
    # By default, zeros are excluded (falsy)
    assert extract_doubled_values(items) == [10]

def test_extract_doubled_values_includes_zeros_when_configured():
    items = [{'value': 0}, {'value': 5}]
    assert extract_doubled_values(items, include_zeros=True) == [0, 10]

def test_extract_doubled_values_custom_scale_factor():
    items = [{'value': 5}]
    assert extract_doubled_values(items, scale_factor=3.0) == [15.0]

def test_extract_doubled_values_rejects_negative_scale_factor():
    with pytest.raises(ValueError):
        extract_doubled_values([], scale_factor=-1.0)

def test_extract_doubled_values_handles_empty_list():
    assert extract_doubled_values([]) == []

def test_extract_doubled_values_handles_non_numeric_values():
    items = [{'value': 'not a number'}]
    with pytest.raises(TypeError):
        extract_doubled_values(items)

ओह, मैं इसे लगातार चल रहा हूँ.

मैं एक निरीक्षण खुला है.

  • मैं अलग इनपुट कोशिश कर रहा हूँ.
  • मैं सभी पथ अभ्यास कर रहा हूँ.
  • लेकिन मैं नहीं हूँ
  • उन परीक्षणों को अभी तक औपचारिक जाँच के रूप में लिख रहे हैं.

क्यों?

क्योंकि

# This comment will drift from reality:
# Doubles all numeric values, skipping None

# This test will fail if reality changes:
def test_extract_doubled_values_skips_none_values():
    items = [{'value': None}, {'value': 5}]
    assert extract_doubled_values(items) == [10]

मैं अभी भी जाँच के लायक क्या है पता चला हूँ.

1, मैं नहीं जानता था कि यह समारोह भी अस्तित्व में होगा.फेस 2 में, मैं खोज रहा हूँ:"ओह, स्केल कारक नकारात्मक नहीं हो सकता.

यही कारण है कि एक वैध है।"

"यदि सूची रिक्त है, हम खाली वापस करना चाहिए, कुछ नहीं."हम गैर-मेरिक मूल्यों को हल करने की जरूरत है।"

ये अन्तर्दृष्टिएँ

फिर उस वक्त (दुश्मन के) दिल में घुस जाते हैं

वे स्पष्ट नहीं कर रहे हैं.

  1. **अगर मैं रक्षा 1 में जाँच लिख दिया होता, तो मैं उन्हें अब फिर से लिखना होगा.**मैं उन्हें लिखते हैं
  2. पश्चातमैंने कार्यान्वयन को शुद्ध किया है, वे पहली बार सही हो जाएगा.
  3. **CTH 3: ताला इसे जाँच के साथ नीचे बंद कर दें (अग्रेजी में साझा)**ठीक है, अब यह असली है.

कोड साफ है.*एपीआई समझ में आता है.*मैंने किनारे के मामलों को कवर किया है.

मुझे यकीन है कि मैं क्या बनाया है में हूँ.

अब मैं जांच लिखता हूँ.

परीक्षणों के बहुत.

पूर्ण-रूप जांच के रूप में।क्यों?

क्योंकि

जाँच एक साझा यांत्रिकी है.वे अब मेरे लिए नहीं कर रहे हैं.

मैं पहले से ही इस कोड को अच्छी तरह से समझते हैं.

  • मैं घंटों या दिनों के लिए यह में रहता है.
  • जाँच के लिए हैं:
  • भविष्य मुझे
  • जो कुछ तीन महीने में है, वह अनक़रीब ही भुला देगामेरे टोली टोली(जो इस कोड कर्मों पर भरोसा करने की जरूरत है)

सीआई पाइपलाइन

(किस को रीग्रेसन को रोकने की जरूरत है)

भविष्य मेंटेनर

(और दीन के बिल्कुल) सीधे रास्ते पर (साबित क़दम) हो

परीक्षण कर रहे हैंप्रस्तुतीकरणName

मेरे कार्यान्वयन के लिए.वे दस्तावेज़:

यह कोड क्या करता हैक्या इनपुट वैध हैंकौन - से आउटपुट की अपेक्षा करते हैं

मैं किस तरह के मामलों पर विचार किया है

मैं क्या यकीन कर रहा हूँ मैं कर रहा हूँ

पूर्ण आवरण, कोई समझौता नहीं

  • 3 सामने 3 मैं परीक्षण पर कठिन चलते हैं:
  • यह सुरक्षा जाल है.
  • अब मेरी टीमएं कर सकते हैं:

इस फ़ंक्शन को विश्वसनीय रूप से परिवर्धित करें

  • किनारे के मामलों को समझना
  • रीग्रेसन तत्काल देखें
  • बिना डर के रीफ्रेक्टर

दस्तावेज़ीकरण के रूप में परीक्षण

  • टिप्पणी से बेहतर जाँच पत्र हैं:*परीक्षण झूठ नहीं है.*वे बहाव नहीं कर सकते.
  • यदि व्यवहार परिवर्तन होता है, जांच ब्रेक.
  • यही कारण है कि

एक्जीक्यूटेबल दस्तावेज.

  • यही कारण है कि परीक्षण मूल्यवान बनाता है।
  • साझेदारी सीमा*यहाँ महत्वपूर्ण बात है:*PROC 3 इससे पहले कि किसी अन्य कोड को छूने से पहले होता है.
  • मैं परीक्षण के बिना कोड साझा नहीं है.

कभी.

graph TB
    subgraph "Traditional TDD (Red-Green-Refactor)"
        TDD1[Write Failing Test] --> TDD2[Write Minimal Code to Pass]
        TDD2 --> TDD3[Refactor]
        TDD3 --> TDD1
    end

    subgraph "Three-Phase Approach (Explore-Refine-Lock)"
        P1[Explore Solution Space] --> P2[Refine Implementation]
        P2 --> P3[Write Comprehensive Tests]
        P3 --> P4[Share With Team]
    end

    style TDD1 stroke:#ffaa00,stroke-width:2px
    style TDD2 stroke:#ffaa00,stroke-width:2px
    style TDD3 stroke:#ffaa00,stroke-width:2px
    style P1 stroke:#ff6b6b,stroke-width:3px
    style P2 stroke:#4ecdc4,stroke-width:3px
    style P3 stroke:#95e1d3,stroke-width:3px

**लेकिन मैं कोड साझा करने के लिए तैयार है पहले परीक्षण भी नहीं लिखते हैं.**चरण हैं:

निजी खोज(सिर्फ मुझे, कोई जांच नहीं)

निजी सुधार

(सिर्फ मुझे, अब भी कोई जांच नहीं) |-----|-------------| सार्वजनिक साझेदारी ( प्रमाणपत्र, सीआई, कोड समीक्षा, पूरी नौ गज की दूरी) यह दोनों मेरे सृजनात्मकता की रक्षा करता हैऔर | मेरी टीम की विवेक. क्यों यह बनाने की प्रवृत्ति की रक्षा करता है

TD समर्थक कहते हैं कि "मुझे यकीन है कि आप फिर से इनकार करने के लिए विश्वास दे."

सच है!लेकिन अगर आप पहले से ही जानते हैं कि आप क्या निर्माण कर रहे हैं।

जब मैं Pacent 1, में हूँ मैं रीफ्रेक्टर के लिए विश्वास की जरूरत नहीं है.

Hour 1: Write test for API I haven't designed yet
Hour 2: Realize the API is wrong, rewrite test
Hour 3: Discover a better approach, rewrite both
Hour 4: Finally get it working
Hour 5: Rewrite tests to match what actually works

मैं सब कुछ दूर फेंक करने के लिए अनुमति की जरूरत है.

Hour 1: Explore 3 different APIs, settle on the best one
Hour 2: Refine the implementation, handle edge cases
Hour 3: Write comprehensive tests for what I built
Hour 4: All tests pass, commit with confidence

परीक्षण मनोवैज्ञानिक ऋण बनाने.

एक बार मैं उन्हें लिखा है, मैं उन्हें मिटाने के लिए झिझक रहा हूँ.

यहां तक कि अगर वे गलत बात की जाँच कर रहे हैं।जब तक जाँच खत्म नहीं हो जाती, तब तक 3, मैं 1 और 2 खड़े रहता हूँ

मनोवैज्ञानिक.

मैं कर सकते हैं:

  • जंगली विचारों की कोशिश करें
  • पूरे नज़दीक से दूर फेंक दो
  • रेडिकल रूप से डिजाइन बदल जाता है

समस्या का पता चला मैं हूँअसल मेंहल करना

"लेकिन मैं उन सभी परीक्षणों के बिना. "

यह कैसे सृजनात्मक काम करता है.

// Test 1: Write test first (but I don't know the right API yet)
[Test]
public void TestProcessData()
{
    var processor = new DataProcessor();
    var result = processor.Process(new[] { 1, 2, 3 });
    Assert.That(result, Is.EqualTo(new[] { 2, 4, 6 }));
}

// Implementation 1: Make it pass
public class DataProcessor
{
    public int[] Process(int[] data) => data.Select(x => x * 2).ToArray();
}

// Later: Realize I need configurability, rewrite test
[Test]
public void TestProcessDataWithFactor()
{
    var processor = new DataProcessor();
    var result = processor.Process(new[] { 1, 2, 3 }, factor: 3);
    Assert.That(result, Is.EqualTo(new[] { 3, 6, 9 }));
}

// Later: Realize I should use IEnumerable, rewrite test again
[Test]
public void TestProcessDataEnumerable()
{
    var processor = new DataProcessor();
    var data = GetLargeDataset(); // This should be lazy
    var result = processor.Process(data, factor: 3);
    Assert.That(result.Take(3), Is.EqualTo(new[] { 3, 6, 9 }));
}

तुम पहली बार अनुचित रूप से रंगका रंग.

आप विवरण के साथ शुरू नहीं है.

// Phase 1: Explore (no tests yet)
public int[] ProcessThing(int[] data)
{
    return data.Select(x => x * 2).ToArray();
}
// Try it: var result = ProcessThing(new[] { 1, 2, 3 });
// Hmm, what about configurability? What about lazy evaluation?

// Phase 2: Refine (still no tests)
public static class DataProcessorExtensions
{
    public static IEnumerable<int> Scale(
        this IEnumerable<int> source,
        int factor = 2)
    {
        return source.Select(x => x * factor);
    }
}
// Try it: var result = data.Scale(factor: 3).ToList();
// Much better API!

// Phase 3: Lock it down (NOW write tests, correctly)
[TestFixture]
public class DataProcessorTests
{
    [Test]
    public void Scale_DefaultFactor_DoublesValues()
    {
        var result = new[] { 1, 2, 3 }.Scale();
        Assert.That(result, Is.EqualTo(new[] { 2, 4, 6 }));
    }

    [Test]
    public void Scale_CustomFactor_ScalesCorrectly()
    {
        var result = new[] { 1, 2, 3 }.Scale(factor: 3);
        Assert.That(result, Is.EqualTo(new[] { 3, 6, 9 }));
    }

    [Test]
    public void Scale_LazyEvaluation_DoesNotEnumerateImmediately()
    {
        var enumerated = false;
        var data = GetTestData(() => enumerated = true);
        var scaled = data.Scale(factor: 2);

        Assert.That(enumerated, Is.False, "Should not enumerate yet");

        scaled.ToList();
        Assert.That(enumerated, Is.True, "Should enumerate on materialization");
    }

    [Test]
    public void Scale_EmptySequence_ReturnsEmpty()
    {
        var result = Enumerable.Empty<int>().Scale();
        Assert.That(result, Is.Empty);
    }
}

यह किस तरह एग और एक्सपी के अनुरूप है (और जहाँ यह अश्‍वेत है)

चलो कुछ के बारे में स्पष्ट हो:

यह ‘ बाद में विकास ’ नहीं है.

यह है

  • " विकसित होने के समय, लेकिन सही समय पर।"समय का
  • कब

इकाई जाँच को जोड़ने के लिए गंभीर है.

  • बहुत जल्दी और आप अज्ञात निर्दिष्ट कर रहे हैं.
  • बहुत देर हो चुकी है और आप सुरक्षा जाल के बिना यातायात कर रहे हैं.

एक्सपी अभ्यास मैं बनाए रखता है

  • हद - से - ज़्यादा सीखने की कोशिश करना बहुत ज़रूरी है:
  • एक - दूसरे के साथ एक - दूसरे का रिश्‍ता

हर सुविधा CI के माध्यम से जाता है इससे पहले कि

  • ऑटोमैप जांच प्रत्येक कमिट पर मुख्य में चलाता हैकोई ब्रेक- बिल्डिंग नहींविमान प्रोग्रामिंग / कोड समीक्षा
  • CTA 3 कोड साझा करने से पहले समीक्षा हो जाता है

परीक्षण समीक्षा योग्य कला का भाग हैं

कोलाबरेशन सुधार डिजाइन को बेहतर बनाता हैसरल डिज़ाइन

फेस 2 है

  • सभी के बारे में
  • सरलीकरण
  • आप की जरूरत नहीं है कि क्या हटाएँ
  • इसे उतना सरल बनाइए जितना संभव हो, आसान नहीं

रीफ्रेक्टरिंग

फेस 2 समर्पित रीफ्रेक्टिंग समय हैकोड साफ करेंपहले

इसे नीचे कर रखें

**जाँच रीफ्रेक्टिंग की रक्षा करते हैं (पास 3+ में)**सख्त टी. वी.

टीडी कहता है:"पहले जाँच.

हमेशा.रेड-हर-पुंजर ही एकमात्र रास्ता है।

मैं कहता हूँ:" जाँच करो जब तुम्हें पता है कि तुम क्या परीक्षण कर रहे हैं.

Sep-R-R-RP- लॉक और अधिक प्राकृतिक है."

मुख्य भिन्नता:

DBDB- 3-PapaparaphoreSTAREGTERTEARTEARYEARTEAL को पारिभाषित करता है

  • IMDRERT-color- setson- set- लॉक प्रगति
  • चल छवि के पहले लिखा जा चुका है
  • साझेदारी

हर चीज के लिए अच्छी जांच पहली बार जाँच हर चीज के लिए सही समय पर जाँच करें

  • माइक्रोफ़ॉर्मेट माइक्रोस्कोप (मिनटों) खुदाएएस (घंटे/दिन)
  • समय का पाबंद होना बहुत मुश्‍किल है
  • यहाँ महत्वपूर्ण अन्तर्दृष्टि है:
  • यह "पिछले" नहीं है. यह है " बाँटने से पहले।"
  • गलत समय (बहुत जल्दी):

उचित समय (eeee) 3):

वही गुण परिणाम ।*आधा टुकड़ा.*यह मुस्कुराता है

मुस्कुराते हुए कहते हैं:

"एक योजना के बाद परिवर्तन करने के लिए फिर. "टी. वी.

एक बार आप लिखित जाँच की है, आप मनोवैज्ञानिक रूप से उस डिजाइन के लिए सौंपा गया है.

  • मेरी बातचीत में बदलाव आ गया है:
  • PRUC 1: जल्दी से परिवर्तन, सही समाधान पता लगाएँ
  • फेस 2: जानबूझकर परिवर्तित करें, कैलिफ़ेंस की ओर शुद्ध करें
  • फेस ३: ध्यान से बदलें, जो काम करते हैं उनकी रक्षा कीजिए

यह हैअधिक

एडस्‌ से ज़्यादा, क्योंकि यह जब तक आपके पास जानकारी न हो, निर्णय लेने में विलम्ब करता है ।

अलग - अलग जवाब: C# उदाहरण

सख्त बातचीत के लिए:

ध्यान दीजिए?

तीन जाँच डिजाइन विकास के रूप में पुनः लिखना शुरू करते हैं ।

  1. **तीन के पास यहाँ है:**परीक्षण का एक सेट.
  2. **एक बार लिखा गया.**पहली बार सही करें.
  3. **क्योंकि मैं मैं मैं निर्माण क्या था पता था.**विशिष्ट कनेक्शन

मान याद रखें:

व्यापक दस्तावेजों पर आधारित सॉफ्टवेयर का कार्य

फेस 1 सॉफ्टवेयर को काम करने के लिए हो जाता है

तेज

  1. CUR 3 ज्ञात दस्तावेज़ों को जांचता है"एक योजना का अनुसरण करने पर परिवर्तन के लिए फिर से जाँच"
  2. फेस 1-2 गोदी परिवर्तनअंतिम डिजाइन में फेस 3 ताला
  3. **"अनुभ्यता और प्रक्रियाओं और उपकरणों के बारे में संपर्क"**टीडी. डी.

जब यह मदद करता है (पीव 2-3), अकेले में पता लगाइए जब यह नहीं होता (Peeep 1)

"मार्थी से अधिक सहयोग"

स्पेस के साथ फेस 2 संरेखित करता है

पश्चात

  1. समस्या को समझनावे जो कुछ भी देते हैं, उसे बचाने के लिए उन्हें क्या चाहिए?
  2. क्यों यह व्यर्थ चूकन का प्रयोग कम करता हैटीडी का गंदा रहस्य:
  3. **कार्यान्वयन के पहले अधिकतर जाँच लिखी गई है या मिटाया जा चुका है.**क्यों?

क्योंकि:

आपने उनकी माँगों को गलत समझा

आप अभी तक किनारे के मामलों को नहीं पता थाआपने एक बेहतर एपीआई डिजाइन खोजाआप सुविधा की आवश्यकता नहीं थी

हर जाँच आप PRF1 में लिखते हैं संभवतः प्रयास बेकार है.

लिखने के लिए बेहतर

एक

3, जब आप वास्तव में जानते हैं कि आप क्या निर्माण कर रहे हैं के रूप में जाँच 3 में सेट, जांच के दौरान लिखने के लिए पहले से ही लिखें.**और सच मुच होने वाली (क़यामत)**टीडी वायदा:

"Write code that solves the specification.
Don't worry about perfection yet.
Just get it working."

" जाँच अपने डिजाइन ड्राइव!

  • वे आपको अच्छे एपीआई खोज करने में मदद करते हैं!
  • टीडी सत्य:
  • "मैं एक एपीआई के लिए जाँच लिखा मैंने सोचा कि बुद्धि बनाया गया था.
  • फिर मैं ने उसे लागू किया और समझ गया कि एपीआई अजीब है.

अब मैं जांच और कोड दोनों फिर से लोड कर रहा हूँ."**यही कारण है कि डिजाइन नहीं है।**यही कारण है कि

गिलना.मेरा तरीका:

कार्यान्वयन के माध्यम से डिजाइन करें, तब इसे जाँच के साथ बंद करें.

  1. अंतिम परिणाम एक ही है - अच्छी तरह से जाँच, अच्छी तरह से तय कोड.
  2. लेकिन मैं आधा कवर के साथ वहाँ मिल गया.
  3. क्यों यह अभी भी अनुशासन देते हुए सॉफ्टवेयर को मुक्‍त करता है
  4. यहाँ क्या हो रहा है
  5. नहीं:
  6. "उल्ला लड़का कोडिंग"

"कोई परीक्षण नहीं"*" जहाज और प्रार्थना"*जब तक मैं Crat 3 के साथ काम कर रहा हूँ, मेरे कोड है:

चूके गए जाँच विस्तारकिनारा मामलों को हैंडल करें

साफ, पढ़ने योग्य कार्यान्वयन

एपीआई डिजाइन साफ करेंदस्तावेज़ीकरण (क्रिया जांच)

बिलकुल वैसी ही टीडी.

  1. फर्क है

    • कब
    • उन जाँचों को लिखा गया ।
    • अनुशासन गुप्त रूप से आता है
  2. नियम सरल है:

    - flake8 (style checking)
    - pylint (code quality)
    - mypy (type checking)
    - black (formatting)
    - radon (complexity analysis)
    
  3. **कोई कोड 2 मुखंवर 3 के बिना सामने आ जाता है.**मैं नहीं:

    for iteration in range(3):
        # Measure current performance
        metrics = measure_performance(code)
    
        # Generate improved version
        better_code = optimise(code, metrics)
    
        # Keep if better, discard if worse
        if better_code.score > code.score:
            code = better_code
    

कमिट कोडबिना जाँच के राजकुमार खोलेंCITo के बिना मुख्य में सम्मिलित करें

  • विस्तार रिपोर्ट के बिना Doopy
  • यह अनुशासन परीक्षणों में जल्दी लिखने में नहीं है.
  • यह अंदर है
  • जाँच किए बगैर कोड साझा नहीं करें.
  • सायफ्ट मेटा क्लैप

यह नया विचार नहीं है.यह कैसे सृष्टि कार्य हमेशा काम किया है:

डचचक ग्यूश रीफ्रेश

पेंटर अंतिम ब्रश ब्रश के साथ शुरू नहीं करते।*वे:*स्केल्सस्वर (पावरी)

पेंट*परतों (पावरी 2)*वेनिशName

# Test generation happens AFTER optimisation
def generate_unit_tests(specification, optimized_code):
    """Generate comprehensive tests for refined code.

    This happens in Phase 3, after we know:
    - What the code actually does
    - What edge cases exist
    - What the API surface looks like
    """
    return llm.generate(
        f"""Generate comprehensive unit tests for this code.

Specification: {specification}
Implementation: {optimized_code}

Include tests for:
- Happy path (from spec examples)
- Edge cases (discovered during optimisation)
- Error conditions (based on actual error handling)
- Performance bounds (based on measured metrics)
"""
    )

संरक्षित करने और वर्तमान (पीएसी) की रक्षा करने के लिए

  • वोरिश पहले नहीं आती है.
  • लेकिन यह वैकल्पिक नहीं है.
  • ड्राफ्ट QXml
  • लेखक वे मसौदा के रूप में संपादित नहीं करते.

वे:मसौदाMARIG (अथास १)

  1. संपादन**कठोर (श्वास 2)**प्रकाशन
  2. भरोसा के साथ (श्‍यक 3)**" नशे में पड़ा हो, संपादन करें" गंभीर जीवन सलाह है लेकिन महान लेखन सलाह है.**क्लेरिट offfffory
  3. कुम्हार बनाने से पहले तेज नहीं है.**वे:**फेंक दें
  4. मिट्टी (पावर १)ट्राम तथा साफ करेंफ़ॉर्म (घरा 2)ग्लैडियेटर और आग

**Adrrices के लिए (पी. 3)**खुशी की बात है ।

लेकिन यह पिछले आता है.

किस तरह इस नक्शे को प्रिंट कोड पाइप में बदला जा सकता हैयहाँ है जहां यह दिलचस्प हो जाता है: मैं वास्तव में हैलागू किया

दिमाग में इस तत्त्वज्ञान (प्रयोगिक विकास) प्रणाली में।

  • कोड सादा ढंग से इन तीन चरणों में आता है:
  • Rance में 1 चरण: UGEDENDDDDEND चरण
  • जब आप सोचते हैं कि क्या समस्या है, तो यह सही लिखने के लिए सीधे नहीं कूदता, परखा कोड.
  • इसके बजाय,

सामान्य

  • (कोडमा या समान) स्पष्ट आदेश मिलता है:
  • तंत्र समयबद्ध कोड तैयार करता है:
  • खुश मार्ग पर ध्यान केंद्रित
  • न्यूनतम त्रुटि नियंत्रण

समयबद्ध नहीं

  • बस इतना पता लगाने के लिएतबचलाना
  • यह चला जाता है.*औपचारिक इकाई जाँच के साथ नहीं है, सिर्फ विशेष से इनपुट के साथ.*अगर यह असफल हो गया?
  • कोई समस्या नहीं है.यही कारण है किसीखना ।
  • तंत्र में 6 मंच पर एडाप्टिव परीक्षण है:

तेज मॉडल की कोशिश करें (बड़ा तापक्रम)

उच्च सृजनात्मकता के साथ फिर से कोशिश करें (बड़ा तापमान)

User: "Calculate fibonacci numbers"

[Phase 1: Exploration - 3 attempts]
  Attempt 1: Works for small inputs, explodes on large ones (no safety limit)
  Attempt 2: Adds safety limit, but inefficient recursive approach
  Attempt 3: Switches to iterative DP (PASS)

[Phase 2: Optimization - 3 iterations]
  Iteration 1: Add type hints, improve naming (Score: 1.05)
  Iteration 2: Optimize memory usage with generator (Score: 1.10)
  Iteration 3: Add input validation (Score: 1.15)

[Phase 3: Testing and Storage]
  Generated 8 unit tests covering:
    - Basic cases (n=0, n=1, n=5, n=10)
    - Edge cases (n=negative, n=100, n=None)
    - Type validation

  All tests pass ✓

  Stored in RAG with quality score: 1.15
  Available for reuse: YES

एक और शक्‍तिशाली मॉडल की मिसाल पर गौर कीजिए

  • असफलों को समझने में डीबग डीबग करें
  • शक्‍तिशाली मॉडल के लिए पूरा संदर्भ दें
  • पिछले गंतव्य के रूप में "ईश्- लेवल" मॉडल का प्रयोग करें
  • यह है

ठीक हैफेस 1.

यह प्रणाली समाधान अंतरिक्ष की जाँच कर रही है, यह जानने की कोशिश कर रही है कि कौन - से कार्य, असफलता, और अनुकूलता क्या है ।

इस चरण में कोई जाँच लिखी नहीं गयी है.कोड पीढ़ी प्रक्रिया में निजी है.

Rance में 2 चरण: निराशा की घड़ीएक बार जब कोड मूल चलाने के लिए चला जाता है, डिथरिंग की ओर चला जाता हैअनुकूलन.

  1. **यह सुधार चरण है.**सिस्टम:
  2. कार्यान्वयन साफ करता हैडिबग लॉगिंग को मिटाएँ जो कि असफल होने के दौरान जोड़ा गया था
  3. समान्य जटिल कोड सिमुलेट करेंनामकरण तथा संरचना को बेहतर बनाता है
  4. स्थिर विश्लेषण चलाता हैस्थायी रूप से संपादित करें

(डिफ़ॉल्ट से दिखाता है)

यह हैठीक है

फेस 2.

कोड अभी तक निजी नहीं है (जो अब तक रजिस्ट्री में नहीं है), लेकिन हम इसे तराश रहे हैं:बेहतर नाम

टाइप संकेतसाफ स्ट्रक्चर

निचला जटिलता

बेहतर प्रदर्शनइस आकार में अब पानी नहीं है ।

हम हम निर्माण क्या कर रहे हैं पता है.

  1. अब हम इसे बनाते हैंअच्छा है.
  2. Rance में क़दम 3: जाँच और भंडारण चरणसिर्फ
  3. पश्चातदिमाग को निखारता है और दौड़ता है

इकाई जाँच.

  • यहाँ महत्वपूर्ण हिस्सा है: जाँचें तैयार की जाती हैं
  • साफ विशेषताएँ तथा कार्यान्वयन
  • , आरंभिक खोज नहीं है.

जाँच कवरः*विशिष्ट उदाहरण (सहीता)*शीट 2 के दौरान किनारा मामलों का पता चला

सुधार के दौरान उससे निपटने में त्रुटि हुई

परफ़ॉर्मेंस विशेषताएँ निर्धारित की गईं*तब,*सिर्फ तभी जब जांच हो

कोड है:

स्टोर में जमा

RAG मेमोरी

# I know what sort() should do. Tests first? Sure!
def test_sort_empty_list():
    assert sort([]) == []

def test_sort_single_element():
    assert sort([5]) == [5]

def test_sort_multiple_elements():
    assert sort([3, 1, 2]) == [1, 2, 3]

(कैप्चर के साथ)

जोड़ा गयानोड रजिस्ट्री:

  1. (एक चलाने योग्य वाक्यांश के रूप में)
  2. के लिए उपलब्ध किया गया
  3. फिर से इस्तेमाल करें

भविष्य में काम करते वक्‍त

के साथ ट्रैक किया

गुण अंक

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.