كيف يبدو يوم العمل النموذجي لمطور Swift في عام 2025
\n\nعندما بدأت تعلم Swift لأول مرة، كنت أعتقد أن مطوري iOS هم سحرة يكتبون كودًا مثاليًا من الصباح حتى المساء مع فنجان لاتيه في مساحة عمل أنيقة. الواقع، كما تتوقع، كان أكثر واقعية ولكنه ليس أقل إثارة للاهتمام.
\n\nفي هذه المقالة، سأصحبك خلال يوم العمل النموذجي لمطور Swift - من قهوة الصباح إلى النشر المسائي في App Store. سترى ليس فقط الجدول الزمني، ولكن أيضًا أجزاء حقيقية من الكود نواجهها كل يوم. هيا بنا!
\n\n09:00 - الصباح: الاجتماع اليومي القصير والتخطيط
\n\nيبدأ اليوم باجتماع قصير عبر Zoom أو Slack. نحن فريق من 5 مطوري iOS، ومطوري خلفية، ومدير منتج. يتحدث كل شخص لمدة 1-2 دقيقة: ما تم إنجازه أمس، وما هو مخطط له اليوم، وما هي العوائق.
\n\nإجابتي النموذجية تبدو هكذا:
\n\n- \n
- أمس: أنهيت إعادة هيكلة وحدة تسجيل الدخول باستخدام Combine. \n
- اليوم: سأدمج شاشة الملف الشخصي الجديدة مع SwiftUI، وأحتاج إلى عمل أنيميشن للانتقال. \n
- عائق: أنتظر من المصمم النماذج النهائية للوضع الداكن. \n
بعد الاجتماع القصير - 15 دقيقة لمراجعة الرسائل في Jira وGitHub. أطلع على طلبات السحب (PRs) التي تتطلب مراجعتي، وأقرأ التعليقات على طلبات السحب الخاصة بي.
\n\n09:45 - العمل العميق الأول: وظيفة جديدة
\n\nالصباح هو أفضل وقت للمهام المعقدة. اليوم أكتب وحدة الإشعارات الفورية مع الروابط العميقة. إليك كيف يبدو الهيكل النموذجي لفئة المعالج:
\n\nimport UIKit\nimport UserNotifications\n\nfinal class PushNotificationHandler: NSObject, UNUserNotificationCenterDelegate {\n \n func userNotificationCenter(\n _ center: UNUserNotificationCenter,\n didReceive response: UNNotificationResponse,\n withCompletionHandler completionHandler: @escaping () -> Void\n ) {\n let userInfo = response.notification.request.content.userInfo\n \n guard let deepLink = DeepLinkParser.parse(userInfo) else {\n completionHandler()\n return\n }\n \n Task { @MainActor in\n Coordinator.shared.handle(deepLink)\n }\n \n completionHandler()\n }\n \n func userNotificationCenter(\n _ center: UNUserNotificationCenter,\n willPresent notification: UNNotification,\n withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void\n ) {\n completionHandler([.banner, .sound, .badge])\n }\n}\n\nلاحظ استخدام Task { @MainActor in } - هذه هي الطريقة الحديثة لفرض التنفيذ على الخيط الرئيسي بدلاً من الطريقة القديمة DispatchQueue.main.async. مطور iOS يستخدم الآن بنشاط Concurrency من Swift 5.5+.
11:00 - مراجعة الكود: نظرة من الخارج
\n\nيصل إشعار من زميل: "من فضلك ألق نظرة على طلب السحب". أفتح GitHub، وأرى تغييرات في نموذج البيانات. إليك مثال على ما أعلق عليه غالبًا:
\n\n// ❌ سيء: فتح إجباري\nlet user = users.first!\n\n// ✅ جيد: استخراج آمن\nguard let user = users.first else {\n assertionFailure("قائمة users لا يجب أن تكون فارغة في هذه المرحلة")\n return\n}\n\nفي مراجعة الكود، نناقش ليس فقط الصحة، ولكن أيضًا البنية المعمارية. اليوم استخدم الزميل SwiftUI مع @ObservableObject، ولكن وفقًا لدليل الأسلوب الخاص بنا، ننتقل إلى @Observable (iOS 17+). أقدم ملاحظة لطيفة:
// نوصي بإعادة الكتابة باستخدام @Observable\n@Observable\nfinal class ProfileViewModel {\n var name: String = ""\n var age: Int = 0\n}\n\n12:30 - الغداء وتغيير السياق
\n\nالغداء مقدس. أخرج إلى الخارج أو أطبخ بنفسي. أحاول ألا أنظر إلى الشاشة - عيناي تستريحان. أثناء الغداء، غالبًا ما أقرأ التليجرام