Rob Pike के प्रोग्रामिंग के 5 नियम (1989)
(cs.unc.edu)- नियम 1: यह अनुमान नहीं लगाया जा सकता कि प्रोग्राम अपना समय कहाँ खर्च करेगा। bottleneck अक्सर अप्रत्याशित जगहों पर आते हैं, इसलिए जब तक वास्तव में यह साबित न हो जाए कि वही bottleneck है, तब तक speed सुधारने की कोशिश न करें
- नियम 2: measurement पहले। speed tuning केवल measurement के बाद करें, और optimization पर तभी विचार करें जब code का कोई एक हिस्सा पूरे सिस्टम पर हावी हो
- नियम 3: जटिल algorithms छोटे n पर धीमे होते हैं। जटिल algorithms में बड़े constants होते हैं, इसलिए जब तक n अक्सर बड़ा न हो, सरल तरीका अपनाएँ। n बड़ा हो तब भी पहले नियम 2 लागू करें
- नियम 4: जटिल algorithms में bugs ज़्यादा होते हैं और उन्हें implement करना कठिन होता है। सरल algorithms और सरल data structures का उपयोग करना बेहतर है
- नियम 5: data ही मुख्य है। सही data structure चुनकर और उसे अच्छी तरह व्यवस्थित करके, algorithm लगभग अपने-आप स्पष्ट हो जाता है। प्रोग्रामिंग का केंद्र algorithms नहीं, बल्कि data structures हैं
संबंधित दर्शन और उद्धरण
- नियम 1 और 2, Tony Hoare के “premature optimization is the root of all evil” वाले कथन के समान अर्थ रखते हैं
- Ken Thompson ने नियम 3 और 4 को “संदेह हो तो सरल तरीका (Brute Force) अपनाओ” के रूप में पुनर्व्याख्यायित किया
- नियम 3 और 4, KISS (Keep It Simple, Stupid) design philosophy के उदाहरण हैं
- नियम 5 का उल्लेख Fred Brooks ने पहले ही 『The Mythical Man-Month』 में किया था,
और इसे अक्सर “smart objects का उपयोग करके simple code लिखो” के रूप में संक्षेपित किया जाता है
1 टिप्पणियां
Hacker News की राय
इससे Jonathan Blow की talk याद आ गई
उन्होंने productivity के नज़रिए से बात की थी। Braid के शुरुआती development में उन्होंने लगभग हर चीज़ को simple array के रूप में implement किया, और केवल bottleneck आने पर ही बदला
“speed या memory से भी ज़्यादा महत्वपूर्ण है, एक program को implement करने में लगने वाला ज़िंदगी का समय” — यह बात खास लगी
अगर Rule 1 को सच में स्वीकार कर लिया जाए, तो Rule 3~5 स्वाभाविक रूप से पीछे-पीछे आते हैं
जब यह मान लेते हैं कि bottleneck का अनुमान नहीं लगाया जा सकता, तो simple code लिखना और measure करना ही एकमात्र तर्कसंगत strategy बन जाती है
असल में सबसे आम विफलता early optimization नहीं, बल्कि early abstraction होती है। ज़रूरत न होने वाली flexibility के लिए complex layers बना दी जाती हैं, और वही maintenance cost बढ़ा देती हैं
90 के दशक में रात 2 बजे dataset search feature implement करने का अनुभव रहा है
थकान में मैंने पहले linear search से implement किया और बाद में ठीक करने का सोचा, लेकिन असल में 4 घंटे के test में सिर्फ 6 सेकंड का ही फर्क निकला
आखिरकार मैंने उसे बदला, लेकिन कोई सार्थक अंतर नहीं था
Rule 5 से मैं पूरी तरह सहमत हूँ
जितनी कठिन समस्या होती है, उतना ही उसका हल data structures और API के iterative refinement से निकलता है। structure सही बन जाए तो control flow अपने आप स्वाभाविक हो जाता है
LLM इस तरह की structural thinking में कमजोर हैं। वे complex control flow तो अच्छी तरह सुझाते हैं, लेकिन composable data structure design में उतने अच्छे नहीं हैं
मैं electronic engineering (E.E.) background से हूँ, और Rule 3 की वजह से career के शुरुआती दौर में कोई बड़ी समस्या नहीं हुई
लेकिन बाद में बड़े systems पर जाने के साथ n बढ़ा, और complexity वास्तव में महत्वपूर्ण हो गई
Rob Pike जिस दौर की ‘big iron’ की बात कर रहे थे, वह आज के embedded environment जैसा था
अगर दो algorithms की implementation difficulty लगभग समान हो, तो मैं बड़े input पर तेज़ वाले को चुनता हूँ
संबंधित लेख: Less Than Quadratic
अक्सर लोग बहुत simple O(n²) approach चुन लेते हैं और production में फटने का अनुभव करते हैं
मुझे लगता है Pike के नियम पुराने aphorisms से बेहतर हैं
“early optimization is the root of all evil” जैसे वाक्य context खो देने पर आसानी से गलत समझे जा सकते हैं
Pike का version ज़्यादा स्पष्ट है और उसका गलत इस्तेमाल करना कठिन है
एक पुरानी अभिव्यक्ति थी कि “Rule 5 का सार है: ‘stupid code should use smart objects’”,
लेकिन object-oriented युग में यह उल्टा complexity को छिपाने वाले गलत विश्वास में बदल गया
10 साल से अधिक समय तक एक ही codebase चलाते हुए मैंने Pike के नियमों को पूरी तरह आत्मसात कर लिया है
KISS/DRY principles का पालन करते हुए, trendy tech की बजाय proven tech बनाए रखना लंबे समय में अधिक स्थिर रहा
वास्तव में हमारी team के development principles document की सामग्री Pike के नियमों से लगभग मेल खाती है
1990 के शुरुआती C++ दौर में, doubly linked list की जगह simple array reallocation अपनाई तो
bugs गायब हो गए और performance भी बेहतर हो गई।
मैंने सीखा कि महंगे operations को कम बार करना एक अच्छी strategy है
“measure किए बिना tuning मत करो” वाले नियम की तुलना Jeff Dean की Latency Numbers Every Programmer Should Know से करें तो दिलचस्प है
Dean कहते हैं कि पहले से मौजूद knowledge के आधार पर performance का अनुमान लगाया जा सकता है
अंततः दोनों दृष्टिकोणों में सामंजस्य हो सकता है — design चरण में intuitively fast structure चुनो, और implementation के बाद measurement-based fine-tuning करो
Rule 1 और 2 केवल नई समस्याओं से निपटते समय ही पूर्ण रूप से लागू होते हैं
जब एक ही domain में बार-बार systems बनाते हैं, तो bottleneck points का पहले से अनुमान लगाया जा सकता है
अनुभवी developers के पास design शुरू होने से पहले ही performance का एक मोटा अंदाज़ा होता है