सुबह: कोड, कॉफी और कंपाइलर
\n\nसिस्टम प्रोग्रामिंग की दुनिया में Rust का एक खास स्थान है। यह C++ की स्पीड को मेमोरी सुरक्षा के साथ जोड़ता है, जिसकी गारंटी कंपाइलर टाइप लेवल पर देता है। लेकिन असल में Rust में लिखने वाले डेवलपर का कार्य दिवस कैसा दिखता है? 'बोरिंग सिस्टम प्रोग्रामर' के स्टीरियोटाइप को भूल जाइए — आज हम एक Rust इंजीनियर के वास्तविक दिन को समझेंगे। बिना किसी दिखावे के, असली कोड स्निपेट्स और लाइव समस्याओं के साथ।
\n\nकल्पना कीजिए: सुबह के 9:00 बजे। आप लैपटॉप खोलते हैं, टर्मिनल चलाते हैं और CI से एक संदेश देखते हैं: 'Build failed'। आप आह भरते हैं, cargo check चलाते हैं और borrow checker की दुनिया में डूब जाते हैं। Rust डेवलपर के दिन में आपका स्वागत है।
सामान्य सुबह: कोड-रिव्यू और टिकट्स
\nसबसे पहले — पुल-रिक्वेस्ट की जांच। Rust टीमों में कोड-रिव्यू विशेष रूप से महत्वपूर्ण है, क्योंकि कंपाइलर कई गलतियाँ पकड़ लेता है, लेकिन लॉजिक और आर्किटेक्चर की जाँच लोग करते हैं। आप एक सहकर्मी के PR को देखते हैं जो कॉन्फ़िगरेशन प्रोसेसिंग के लिए एक नया मॉड्यूल जोड़ रहा है।
\n\n// config.rs — कॉन्फ़िगरेशन पार्सिंग\nuse serde::Deserialize;\nuse std::path::Path;\n\n#[derive(Debug, Deserialize)]\nstruct AppConfig {\n host: String,\n port: u16,\n max_connections: u32,\n db_url: String,\n}\n\nfn load_config(path: impl AsRef<Path>) -> Result<AppConfig, ConfigError> {\n let content = std::fs::read_to_string(path.as_ref())?;\n let config: AppConfig = toml::from_str(&content)?;\n Ok(config)\n}\n\nआप देखते हैं: खाली स्ट्रिंग की कोई जाँच नहीं है। आप एक टिप्पणी जोड़ते हैं: 'अगर host खाली हो तो क्या होगा? शायद validator के ज़रिए वैलिडेशन जोड़ें?' 15 मिनट बाद सहकर्मी जवाब देता है: 'सहमत, #[validate] जोड़ दिया।' दिन उत्पादक रूप से शुरू होता है।
मुख्य भाग: कोड में गहराई
\n\n10:00 — एसिंक्रोनसी और tokio के साथ काम
\nअब आप अपने टास्क पर स्विच करते हैं: एक HTTP सर्वर को फिर से लिखना है जो वेबहुक को प्रोसेस करता है। पुराना कोड ब्लॉकिंग थ्रेड्स पर लिखा गया था और यह धीमा है। आपका टूल — tokio और async/await। Rust हाई-लोड सिस्टम के लिए एकदम सही है, और आप यह जानते हैं।
\n\nआप नया हैंडलर लिखते हैं:
\n\nuse axum::{\n routing::post,\n Router,\n Json,\n};\nuse serde_json::Value;\n\nasync fn handle_webhook(Json(payload): Json<Value>) -> String {\n // वैलिडेशन, प्रोसेसिंग, DB में लिखना\n println!("वेबहुक प्राप्त हुआ: {:?}", payload);\n tokio::time::sleep(std::time::Duration::from_millis(100)).await;\n "OK".to_string()\n}\n\n#[tokio::main]\nasync fn main() {\n let app = Router::new()\n .route("/webhook", post(handle_webhook));\n\n axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())\n .serve(app.into_make_service())\n .await\n .unwrap();\n}\n\nआप cargo run चलाते हैं — कोई एरर नहीं। Rust ने फिर से अपनी विश्वसनीयता साबित की। लेकिन यह तो बस शुरुआत है।
11:30 — borrow checker के साथ जंग
\nअचानक एक बग रिपोर्ट आती है: 'यूज़र्स की लिस्ट प्रोसेस करते समय पैनिक'। आप कोड खोलते हैं और समस्या देखते हैं: &mut पॉइंटर का कई जगहों पर उपयोग हो रहा है। Rust आपको अपने पैर में गोली मारने नहीं देगा, लेकिन कभी-कभी यह ओनरशिप के लिए आपसे लड़ता है।
यह रहा समस्याग्रस्त हिस्सा:
\n\nfn process_users(users: &mut Vec<User>) {\n let admin = users.iter_mut().find(|u| u.role == Role::Admin).unwrap();\n admin.do_task(); // mutable बॉरोइंग\n // और यहाँ हम फिर से users का उपयोग करना चाहते हैं\n let count = users.len(); // गलती! users पहले से बॉरो हो चुका है\n}\n\nआप लॉजिक को अलग करके इसे ठीक करते हैं:
\n\nfn process_users(users: &mut Vec<User>) {\n // पहले इंडेक्स ढूंढें, फिर काम करें\n if let Some(admin_idx) = users.iter().position(|u| u.role == Role::Admin) {\n let admin = &mut users[admin_idx];\n admin.do_task();\n }\n // अब सुरक्षित रूप से उपयोग कर सकते हैं