Rust डेवलपर का एक दिन: सुबह की कॉफी से शाम के cargo तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

सुबह: कोड, कॉफी और कंपाइलर

\n\n

सिस्टम प्रोग्रामिंग की दुनिया में Rust का एक खास स्थान है। यह C++ की स्पीड को मेमोरी सुरक्षा के साथ जोड़ता है, जिसकी गारंटी कंपाइलर टाइप लेवल पर देता है। लेकिन असल में Rust में लिखने वाले डेवलपर का कार्य दिवस कैसा दिखता है? 'बोरिंग सिस्टम प्रोग्रामर' के स्टीरियोटाइप को भूल जाइए — आज हम एक Rust इंजीनियर के वास्तविक दिन को समझेंगे। बिना किसी दिखावे के, असली कोड स्निपेट्स और लाइव समस्याओं के साथ।

\n\n

कल्पना कीजिए: सुबह के 9:00 बजे। आप लैपटॉप खोलते हैं, टर्मिनल चलाते हैं और CI से एक संदेश देखते हैं: 'Build failed'। आप आह भरते हैं, cargo check चलाते हैं और borrow checker की दुनिया में डूब जाते हैं। Rust डेवलपर के दिन में आपका स्वागत है।

\n\n

सामान्य सुबह: कोड-रिव्यू और टिकट्स

\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\n

मुख्य भाग: कोड में गहराई

\n\n

10:00 — एसिंक्रोनसी और tokio के साथ काम

\n

अब आप अपने टास्क पर स्विच करते हैं: एक HTTP सर्वर को फिर से लिखना है जो वेबहुक को प्रोसेस करता है। पुराना कोड ब्लॉकिंग थ्रेड्स पर लिखा गया था और यह धीमा है। आपका टूल — tokio और async/await। Rust हाई-लोड सिस्टम के लिए एकदम सही है, और आप यह जानते हैं।

\n\n

आप नया हैंडलर लिखते हैं:

\n\n
use 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 ने फिर से अपनी विश्वसनीयता साबित की। लेकिन यह तो बस शुरुआत है।

\n\n

11:30 — borrow checker के साथ जंग

\n

अचानक एक बग रिपोर्ट आती है: 'यूज़र्स की लिस्ट प्रोसेस करते समय पैनिक'। आप कोड खोलते हैं और समस्या देखते हैं: &mut पॉइंटर का कई जगहों पर उपयोग हो रहा है। Rust आपको अपने पैर में गोली मारने नहीं देगा, लेकिन कभी-कभी यह ओनरशिप के लिए आपसे लड़ता है।

\n\n

यह रहा समस्याग्रस्त हिस्सा:

\n\n
fn 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\n
fn 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    // अब सुरक्षित रूप से उपयोग कर सकते हैं                

ब्लॉग

पुस्तक अनुशंसाएँ