Update: 2026-07-14 19:10:36

This commit is contained in:
Hamza-Ayed
2026-07-14 19:10:36 +03:00
parent 48382f5d4a
commit ab77ed529a
7 changed files with 153 additions and 25 deletions
Vendored
BIN
View File
Binary file not shown.
@@ -0,0 +1,114 @@
# 💰 دراسة كلفة إعادة بناء منصة Siro — شركة برمجيات في مصر (2026)
**السؤال:** لو طُلب من شركة برمجيات مصرية بناء هذا المشروع بالكامل، بنفس الجودة ونفس
الميزات، مع استخدام الذكاء الاصطناعي ووكلائه في التطوير — كم المدة وكم التكلفة؟
**المنهجية:** النطاق مُقاس من الكود الفعلي (لا من وصف عام)، الجهد بالشهر-رجل
(Person-Month)، معامل خصم للذكاء الاصطناعي مطبق بشكل انتقائي حسب طبيعة كل مكوّن،
والأسعار بأسعار سوق القاهرة 2026.
---
## 1. النطاق المُقاس فعلياً
| المكوّن | الحجم المقاس | ملاحظات |
|---|---|---|
| تطبيق الراكب (Flutter) | ~97,000 سطر | خرائط مخصصة، سوكيت، WebRTC، SOS، خرائط أوفلاين، 13 لغة، Live Activities |
| تطبيق السائق (Flutter) | ~111,500 سطر | الأكبر: مكافحة احتيال، CarPlay/Android Auto، تدرّج، خارطة تنبؤية |
| تطبيق الإدارة (Flutter) | ~43,000 سطر | جيلان من اللوحات + مساعد توثيق AI |
| تطبيق خدمة العملاء (Flutter) | ~34,000 سطر | |
| الباك اند PHP | ~47,500 سطر / 504 ملفات | أمان مركزي، محرك رحلات، تسعير ديناميكي، مواصلاتي |
| خدمة المدفوعات/المحفظة | ~12,500 سطر | 6+ بوابات دفع بثلاث دول |
| خوادم الموقع والسوكيت | ~5,000 سطر | خادمان WebSocket + Redis Geo |
| بوتات التسعير والسوشيال | ~3,500 سطر + بوت أندرويد | Accessibility bot + محرك انحدار Node |
| **الإجمالي** | **~350,000 سطر كود يدوي** | بدون مكتبات أو كود مولّد |
## 2. تقدير الجهد (شهر-رجل)
الافتراض المعياري: مطوّر متمكّن ينتج 3,000–4,500 سطر كود إنتاجي شهرياً في Flutter
(واجهات كثيفة)، و2,500–3,500 في باك اند به منطق مالي وأمني.
| البند | جهد تقليدي (PM) | خصم AI | جهد بعد AI (PM) |
|---|---|---|---|
| التطبيقات الأربعة | 68–75 | −45% (واجهات وCRUD تتسارع كثيراً) | 37–41 |
| الباك اند + المدفوعات | 20–24 | −30% (منطق مالي يحتاج مراجعة بشرية) | 14–17 |
| خوادم السوكيت + Redis Geo | 5–6 | −25% (ضبط أداء حقيقي على أجهزة) | 4–5 |
| بوتات التسعير والسوشيال | 6–8 | −20% (هندسة عكسية وتجريب ميداني) | 5–6 |
| مواصلاتي (لوحة ويب + تكامل) | 7–9 | −40% | 4–5 |
| **مجموع التطوير** | **106–122** | | **64–74** |
| QA على أجهزة حقيقية بثلاث دول (+15%) | | | 10–11 |
| إدارة مشروع + DevOps + تصميم (+15%) | | | 10–11 |
| **الإجمالي النهائي** | **~135–155 PM تقليدي** | **متوسط −38%** | **≈ 84–96 PM** |
> **لماذا الخصم ليس 70%؟** وكلاء الذكاء الاصطناعي يتفوقون في كتابة الكود الجديد، لكن
> 40–50% من جهد هذا المشروع تحديداً ليس كتابة كود: تكامل بوابات دفع حقيقية (PayMob،
> MTN، Syriatel — بيئات اختبار بطيئة وبيروقراطية)، اختبار GPS وسوكيتات على أجهزة فعلية
> في الشارع، ضبط الأداء، ومراجعة بشرية إلزامية لأي كود مالي/أمني. هذه لا يسرّعها AI إلا قليلاً.
## 3. الفريق والمدة
**الفريق الأمثل (8 أشخاص):** 3 Flutter، 2 باك اند PHP/Node، 1 Full-stack (لوحات الويب
والبوتات)، 1 QA، 1 قائد تقني/PM — جميعهم يعملون بأدوات AI-agents.
**المدة الواقعية: 11–13 شهراً** حتى تكافؤ كامل بالميزات على 3 دول.
- الشهور 1–3: الأساس (مصادقة، خرائط، حجز أساسي، بنية دفع)
- الشهور 4–7: دورة الرحلة الكاملة + المحفظة + تطبيق السائق المتقدم
- الشهور 8–10: الإدارة، خدمة العملاء، بوتات التسعير، مواصلاتي
- الشهور 11–13: تعدد الدول واللغات، تقوية أمنية، اختبار ميداني، إطلاق
أي وعد بأقل من 8 أشهر لنفس النطاق والجودة = قصّ نطاق مُقنَّع أو دين تقني مؤجل.
## 4. التكلفة (سوق القاهرة 2026)
الكلفة الشهرية الشاملة للعميل (رواتب + أعباء + هامش الشركة) للمطوّر الواحد في شركة
برمجيات مصرية متوسطة-جيدة: **$2,000–3,000 شهرياً** (متوسط مرجّح $2,500).
| السيناريو | الحساب | التكلفة |
|---|---|---|
| **فريق مخصص (Dedicated Team) — الأدق** | 90 PM × $2,500 | **≈ $225,000** |
| النطاق المتفائل | 84 PM × $2,000 | $168,000 |
| النطاق المتحفظ | 96 PM × $3,000 | $288,000 |
| **سعر مقطوعية (Fixed-Price) من شركة** | + هامش مخاطرة 25–35% | **$280,000–380,000** |
| فريق مستقلّين (Freelancers) بقيادة جيدة | خصم ~35%، مخاطرة أعلى | $110,000–150,000 |
| شركة من الصف الأول (حي المعادي/الذكية) | ضعف السعر تقريباً | $400,000–550,000 |
**تكاليف غير بشرية تُضاف لأي سيناريو (~$18,000–28,000):**
سيرفرات وبيئات تطوير واختبار (~$500–900/شهر)، أجهزة اختبار حقيقية (15–20 جهاز)،
رسوم متاجر التطبيقات، رسائل OTP الاختبارية، استهلاك APIs الذكاء الاصطناعي للتطوير
(~$800–1,500/شهر لفريق بحجمنا)، تراخيص وأدوات.
### ✅ الرقم المرجعي النهائي
> **بناء مكافئ كامل لمنصة Siro في مصر (2026) بفريق يستخدم وكلاء الذكاء الاصطناعي:**
> **$240,000–320,000 خلال 11–13 شهراً** (فريق مخصص 8 أشخاص)
> — وبعقد مقطوعية من شركة محترمة: توقّع عرضاً بين **$280,000–380,000**.
> بالجنيه المصري (~50 ج/دولار): **12–19 مليون جنيه**.
## 5. الكلفة التشغيلية بعد التسليم (شهرياً)
| البند | شهرياً |
|---|---|
| بنية تحتية (سيرفرات، Redis، سوكيتات، نسخ احتياطي) لثلاث دول | $1,500–3,500 |
| رسائل OTP وواتساب API | حسب الحجم ($300–1,500) |
| استهلاك AI (توثيق سائقين، شكاوى، بوتات) | $400–1,200 |
| فريق صيانة وتطوير مستمر (2 مطوّر + نصف QA) | $6,000–9,000 |
| **الإجمالي التشغيلي** | **≈ $8,000–15,000/شهر** |
## 6. ما لا يشتريه هذا المبلغ إطلاقاً — وهنا الحجة الاستثمارية
الـ $300 ألف تشتري **الكود المكافئ**، لكنها لا تشتري:
1. **معادلات تسعير المنافسين الفعلية** — تحتاج أشهراً من السحب الحي من السوق بعد الإطلاق.
2. **القيم المضبوطة تشغيلياً** (12 ساعة قيادة، 90 ثانية للمفاوض، سقوف التسوية) — نتاج
حوادث حقيقية، الشركة الجديدة ستدفع ثمن تعلّمها من جديد.
3. **العلاقات والتراخيص**: اتفاقيات MTN وSyriatel وCliq وPayMob، ترخيص النقل السوري،
حلول التوزيع تحت العقوبات — سنة إضافية على الأقل من العمل غير البرمجي.
4. **القاعدة الفعلية**: 1,447 سائقاً و2,891 راكباً — أصل شبكي يحتاج ميزانية تسويق منفصلة
بالكامل (عادة تفوق كلفة التطوير نفسها في هذا القطاع).
**الخلاصة الاستثمارية:** كلفة إعادة البناء (~$300K) + سنة زمن ضائع + كلفة اكتساب
المستخدمين + المعرفة التشغيلية غير القابلة للشراء — هذا ما يجعل التقييم الضمني الموثق
(~$909K) منطقياً وليس مبالغاً فيه، بل يجعل «الشراء/الاستثمار» أرخص من «البناء» لأي طرف جاد.
---
*أُعدّت 2026-07-14 بقياس مباشر لحجم الكود الفعلي (~350 ألف سطر) وبأسعار سوق القاهرة الجارية.*
+1
View File
@@ -66,6 +66,7 @@
## 06_investors — وثائق المستثمرين ودراسات الجدوى
| الملف | المحتوى |
|---|---|
| [rebuild_cost_estimate_egypt_2026.md](06_investors/rebuild_cost_estimate_egypt_2026.md) | ⭐ دراسة كلفة إعادة البناء في مصر (فريق + AI، 2026) |
| [SIRO_INVESTOR_REPORT_AR.md](06_investors/SIRO_INVESTOR_REPORT_AR.md) | تقرير المستثمر الرئيسي |
| [تقرير_المستثمر_الشامل_Siro.md](06_investors/تقرير_المستثمر_الشامل_Siro.md) | التقرير الشامل للمستثمر |
| [Siro_Investors_Report_AR.md](06_investors/Siro_Investors_Report_AR.md) | تقرير مستثمرين (نسخة سابقة) |
@@ -558,23 +558,29 @@ class LoginController extends GetxController {
// Check if location services are enabled
serviceEnabled = await location.serviceEnabled();
if (!serviceEnabled) {
if (Platform.isAndroid) {
serviceEnabled = await location.requestService();
}
if (!serviceEnabled) {
// Location services are still not enabled, handle the error
// Location services are still not enabled, show a message
mySnackbarError('Please enable location services in your device settings to continue.'.tr);
return;
}
}
// Check if the app has permission to access location
permissionGranted = await location.hasPermission();
if (permissionGranted == loc.PermissionStatus.deniedForever) {
mySnackbarError('Please go to app settings and grant location permission.'.tr);
return;
}
if (permissionGranted == loc.PermissionStatus.denied) {
permissionGranted = await location.requestPermission();
if (permissionGranted != loc.PermissionStatus.granted) {
if (permissionGranted != loc.PermissionStatus.granted && permissionGranted != loc.PermissionStatus.grantedLimited) {
// Location permission is still not granted, handle the error
permissionGranted = await location.requestPermission();
if (permissionGranted != loc.PermissionStatus.granted) {
mySnackbarError('Location permission is required to use the app. Please grant permission.'.tr);
return;
}
}
@@ -583,14 +589,16 @@ class LoginController extends GetxController {
if (Platform.isAndroid || Platform.isIOS) {
await SiroGeofencingService.initAndStart();
}
}
if (permissionGranted.toString() == 'PermissionStatus.granted' ||
permissionGranted == loc.PermissionStatus.granted) {
permissionGranted == loc.PermissionStatus.granted ||
permissionGranted == loc.PermissionStatus.grantedLimited) {
box.write(BoxName.locationPermission, 'true');
}
update();
}
// ─────────────────────────────────────────────────────────────
// sendPassengerLocation: تسجيل موقع فتح التطبيق للراكب
// ─────────────────────────────────────────────────────────────
+1 -1
View File
@@ -2,7 +2,7 @@ name: siro_rider
description: "A new Flutter project."
publish_to: "none" # Remove this line if you wish to publish to pub.dev
version: 1.0.5+5
version: 1.0.6+6
environment:
sdk: ">=3.0.5 <4.0.0"
+13 -8
View File
@@ -9,7 +9,7 @@
--amber:#9A6B12; --amber-soft:#F6EDDA;
--red:#B3362B; --red-soft:#F7E5E2;
--good:#2E7D4F; --good-soft:#E4F1E8;
--sans:"SF Arabic","Segoe UI",system-ui,-apple-system,"Noto Sans Arabic",Tahoma,sans-serif;
--sans:-apple-system, BlinkMacSystemFont, "SF Pro Arabic", "Helvetica Neue", Arial, sans-serif;
--mono:ui-monospace,"SF Mono",Consolas,monospace;
}
@media (prefers-color-scheme: dark){
@@ -87,7 +87,9 @@
/* ===== Sticky TOC ===== */
.tocbar{
position:sticky; top:0; z-index:10; background:var(--bg);
position:sticky; top:0; z-index:10;
background:color-mix(in srgb, var(--bg) 75%, transparent);
backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
border-bottom:1px solid var(--line); padding:10px 0;
}
.tocbar .row{ display:flex; gap:8px; overflow-x:auto; scrollbar-width:none; padding:2px; }
@@ -95,10 +97,10 @@
.tocbar a{
flex:none; text-decoration:none; font-size:.8rem; font-weight:700; color:var(--muted);
border:1px solid var(--line); background:var(--surface); border-radius:99px; padding:5px 13px;
white-space:nowrap;
white-space:nowrap; transition: all 0.2s ease;
}
.tocbar a b{ color:var(--brand); font-weight:800; margin-inline-end:4px; font-variant-numeric:tabular-nums; }
.tocbar a:hover{ border-color:var(--brand); color:var(--ink); }
.tocbar a:hover{ border-color:var(--brand); color:var(--ink); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.05); }
/* ===== Sections ===== */
section{ padding:46px 0 8px; }
@@ -117,9 +119,10 @@
.subhead::after{ content:""; flex:1; height:1px; background:var(--line); }
/* compact feature rows */
.rows{ border:1px solid var(--line); border-radius:14px; background:var(--surface); overflow:hidden; }
.row-item{ padding:13px 18px; border-top:1px solid var(--line); }
.rows{ border:1px solid var(--line); border-radius:14px; background:var(--surface); overflow:hidden; box-shadow: 0 2px 10px rgba(0,0,0,0.02); }
.row-item{ padding:13px 18px; border-top:1px solid var(--line); transition: all 0.2s ease; cursor: default; }
.row-item:first-child{ border-top:none; }
.row-item:hover{ background:var(--surface2); padding-inline-start:22px; }
.row-item h4{ font-size:.95rem; font-weight:800; display:inline; }
.row-item p{ display:inline; color:var(--muted); font-size:.9rem; }
.row-item h4::after{ content:" — "; color:var(--faint); font-weight:400; }
@@ -153,7 +156,8 @@
/* ===== two-col mini grid ===== */
.duo{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media (max-width:640px){ .duo{ grid-template-columns:1fr; } }
.panel{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; }
.panel{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; transition: all 0.2s ease; cursor: default; }
.panel:hover{ transform: translateY(-2px); box-shadow: 0 6px 16px rgba(0,0,0,0.04); border-color: color-mix(in srgb, var(--brand) 30%, var(--line)); }
.panel h4{ font-size:.95rem; font-weight:800; margin-bottom:6px; }
.panel p, .panel li{ color:var(--muted); font-size:.88rem; }
.panel ul{ margin:6px 0 0; padding-inline-start:18px; display:flex; flex-direction:column; gap:5px; }
@@ -163,7 +167,8 @@
/* ===== tutorial modules ===== */
.mods{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media (max-width:640px){ .mods{ grid-template-columns:1fr; } }
.mod{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; position:relative; }
.mod{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; position:relative; transition: all 0.2s ease; cursor: default; }
.mod:hover{ transform: translateY(-2px); box-shadow: 0 6px 16px rgba(0,0,0,0.04); border-color: color-mix(in srgb, var(--brand) 30%, var(--line)); }
.mod .shots{ position:absolute; top:14px; inset-inline-end:16px; font-size:.7rem; font-weight:800;
color:var(--brand-ink); background:var(--brand-soft); border-radius:99px; padding:2px 10px; font-variant-numeric:tabular-nums; }
.mod h4{ font-size:.95rem; font-weight:800; padding-inline-end:70px; }