PORTFOLIOBACH
لا أدوات جاهزة. لا قوالب.
100% مهندَس.
Chapter I: The Origin
لماذا أعدت اختراع العجلة.
مشكلة «الصندوق الأسود»
بالطبع كان بإمكاني استخدام WordPress أو Wix. ذلك يستغرق ساعتين ويبدو جيداً.
لكن في الدراسة نتعلم الخوارزميات وهياكل البيانات وكيف تفكر الحواسيب. استخدام أداة جاهزة يبدو كالغش. إنها «صندوق أسود» — أضع المحتوى وتخرج موقعاً كاملاً، لكن دون أدنى فهم للآلية.
الهدف: أردت امتلاك الكود. أردت الضغط على Inspect Element في المتصفح وفهم كل class لأنني كتبتها بنفسي.
# Option A: The Easy Way (Rejected)
# Option B: The Engineering Way
[STATUS] Bloatware removed.
[READY] Starting development...
Bundle Size Comparison
Bloatware مقابل الحِرفية
القوالب الجاهزة كثيراً ما تحمّل ميغابايتات من مكتبات JavaScript (jQuery وBootstrap ومكوّنات لا تُعد) لمجرد عرض بعض النصوص. هذا هدر صريح.
نهجي: حددت لنفسي تحدياً: Zero Dependencies. لا Bootstrap، لا React، لا Tailwind. فقط HTML5 وCSS3 وVanilla JS الأصيل.
بهذا تعلمت كيف يعمل CSS Grid فعلاً، بدلاً من مجرد كتابة col-md-6. النتيجة؟ موقع يُحمَّل في ميلي ثوانٍ (Lighthouse 100).
النظرية تلتقي بالتطبيق
في الجامعة ندرس Java والبرمجة كائنية التوجه. كثير من الطلاب يسألون: «هل أحتاج هذا لتطوير المواقع؟»
المحفظة هي «مختبري». أردت التحقق من إمكانية تطبيق مفاهيم كـنمط MVC (Model-View-Controller) على موقع بسيط. هنا يمكنني كسر الأشياء وإصلاحها دون أن يشتكي أي عميل. هذه هي الطريقة الوحيدة لبناء فهم حقيقي وعميق.
Chapter II: The Architecture
من HTML ثابت إلى محرك ديناميكي.
ثابت مقابل ديناميكي
في البداية (v1.0)، كانت المحفظة تتكون من ملفات HTML منفردة. المشكلة: تغيير رابط في القائمة كان يتطلب التعديل في خمسة ملفات مختلفة. كان ذلك عُرضةً للأخطاء ولا يبدو «ذكياً».
الحل (v2.2): طبّقت مبدأ «لا تكرر نفسك» (DRY). بدلاً من ترميز المحتوى مباشرة في HTML، نقلته إلى هياكل بيانات منفصلة.
- سابقاً: نسخ ولصق لكتل الكود.
- اليوم: مصدر بيانات مركزي واحد (Single Source of Truth).
Struktur-Vergleich
about.html
contact.html
+ data.json
«محرك العرض»
أردت فهم آلية عمل الـ frameworks الحديثة (كـ React) في جوهرها. فبنيت نسخة مبسطة منها بنفسي.
النظام مبني على مبدأ فصل المسؤوليات (Separation of Concerns):
- Data Layer:
projects-data.jsيحتفظ بجميع المعلومات (النصوص، مسارات الصور) ككائنات JSON. - Logic Layer:
project-renderer.jsيأخذ هذه البيانات ويبني HTML مباشرة في المتصفح. - View Layer: ملف
index.htmlلم يعد سوى هيكل فارغ (حاوٍ).
هذا يتيح لي إضافة مشروع جديد بمجرد إضافة عنصر للمصفوفة — دون كتابة سطر HTML واحد.
مقتطف من طبقة المنطق
Chapter III: Invisible Tech
ميزات تشعر بها لكن لا تراها.
Custom i18n Engine
بدلاً من تحميل 500KB لمكتبة كـi18next، كتبت محركي الخاص.
- Attribute Mapping: المحتوى مفصول عن HTML (
data-i18n). - Persistence: اللغة تُحفَظ عبر
localStorageبعد إعادة التحميل. - Fade-Transition: انتقال مبني على Promise يضمن أنيميشن سلساً بدلاً من وميض مزعج.
localStorage..."
},
"meta_c3_li_2":
"Persistence..."
}
};
Logic Pipeline Visualization
Smart DOM Injection
يعمل project-renderer.js كـ mini-framework («Vanilla React»). يقرر وقت التشغيل ما سيُعرض.
من أبرز الميزات Path Normalization. بما أن المحرك يعمل على الصفحة الرئيسية (Root) وفي الأرشيف (Subfolder)، يُصلح مسارات الصور النسبية تلقائياً قبل حقنها في DOM. لا صور مكسورة أياً كان السياق.
Performance First
المحفظة يجب أن تكون سريعة. بتجنب الـ frameworks واستخدام تسريع الأجهزة (GPU) نحقق أعلى الدرجات.
كفاءة الموارد
أحداث التمرير تُطلَق مئات المرات في الثانية. هذا يستنزف بطارية الأجهزة المحمولة. حلّي: Intersection Observer API.
visible in Viewport
⬆️ عرض حي: هذا الصندوق لم يُفعَّل إلا حين رأيته للتو. قبل ذلك كان يستهلك 0% من طاقة المعالج.
Modern CSS & GPU
CSS أكثر من مجرد ألوان. أستخدم Custom Properties للثيمينغ العام. علاوة على ذلك، أجبر تشغيل الأنيميشن على كارت الشاشة (GPU) عبر transform: translate3d بدلاً من المعالج.
تسريع الأجهزة
transform: translate3d(0,0,0);
will-change: transform;
}
Chapter IV: DevOps & Workflow
الكود لا يكون جيداً إلا بقدر جودة العملية خلفه.
Git History (Main)
Clean Commits
المحفظة تنمو بشكل عضوي. للسيطرة على الفوضى، أتبع استراتيجية Git صارمة.
- Semantic Commits: كل commit يبدأ بـ
feat:أوfix:أوchore:. هذا يجعل السجل قابلاً للقراءة. - Branching: الميزات الجديدة (كهذه الصفحة) تُطوَّر في branches معزولة قبل دمجها في
main. - Safety: لا ينتقل أي كود للبناء النهائي دون اختبار (خادم حي محلي).
Domain Driven Design
في البداية كانت جميع الصور في مجلد واحد. الفوضى كانت محتومة.
خلال إعادة الهيكلة (v2.2)، رتّبت البنية. الأصول مجمّعة الآن منطقياً حسب نطاقها. هذا يجعل المشروع قابلاً للصيانة والتوسع لأي إضافات مستقبلية.
بنية الملفات بعد إعادة الهيكلة
Chapter V: Infrastructure
الطريق إلى هويتي الرقمية (yusefbach.de).
من الهواية إلى الاحترافية
في البداية كان الموقع تحت yusef03.github.io. للحصول على حضور احترافي، كان لا بد من نطاق من المستوى الأعلى (TLD).
التحدي: GitHub Pages مُضيف ثابت. يجب بناء الجسر بين مزود النطاق وGitHub يدوياً. أستخدم A-Records متكررة (4 IPs لموازنة الحِمل) لضمان الاستمرارية.
ضبط DNS لصفحات GitHub
«مشكلة الثبات»
فخ كلاسيكي مع GitHub Pages كلّفني أعصابي.
git push جديد، الإعداد كان يختفي والموقع يتوقف.السبب: GitHub يُعيد كتابة الإعدادات اليدوية عند النشر.
CNAME (بدون امتداد) في المجلد الجذر.المحتوى:
yusefbach.deبهذا أصبح النطاق «محدداً بالكود». مهما نشرت، GitHub يعرف الآن: «هذا ملكي».
Chapter VI: The AI Brain
RAG Chat-Twin بدون أي dependencies.
Python Serverless
Google Gemini 1.5 Flash API تعمل كـ microservice معزول على Vercel (FastAPI).
System Context Injection
قاعدة بيانات markdown («yusef_brain.md») توجّه النموذج اللغوي بصرامة نحو شخصيتي كمطور وبياناتي المهنية.
Vanilla Bot UI
الواجهة الأمامية تتواصل بشكل غير متزامن عبر pipeline fetch خاص. واجهة Glassmorphism مبنية بالكامل بدون React أو حزم خارجية.
Context Safety
ترويسات CORS وتوجيهات النموذج الصارمة تمنع الإساءة (Prompt Injection).
RAG_PIPELINE.flow
(Glassmorphism)
(Context JSON)
Chapter VII: Future Roadmap
الكود لا يكتمل أبداً. الرحلة مستمرة.
Ready for
Production
هذه المحفظة دليل على أنني مستعد لتحويل النظرية إلى قيمة حقيقية.