لقد جربت أشياء كثيرة في حياتي وحاولت تعلم أمور عديدة، نجحت في بعضها وفشلت في البعض الآخر، وهذا أمر طبيعي في رحلة أي إنسان. من الممكن أن تتعلم لغات كثيرة، ولكن في النهاية كلها لغات بشرية. حسناً، لماذا لا أتعلم لغة الآلات، لغة الكمبيوتر، وأتمكن من التواصل مع هذا الشيء؟ أتواصل معه بلغة الواحد والصفر.
ما هو الكود؟
الكود هو كل شيء. أي جهاز إلكتروني من حولك يعمل بالكود، بدون أي مبالغة. هو موجود في كل شيء، هو أهم شيء، وهو الشيء ذاته. لتبسيط الموضوع، الكود هو عملية صنع برمجيات أو برنامج. لكن بالتأكيد، نحن لسنا مهتمين بكل هذه التفاصيل. أنت كمستخدم عادي، تريد أبسط شيء ممكن أمامك، تضغط على زر فتفرح وتحصل على جوائز. أنت ببساطة قمت بإدخال (Input) فحصلت على إخراج (Output)؛ أعطيت أمراً فجاءتك نتيجة. في المنتصف، هناك ما يسمى بـ “الصندوق الأسود”. في هذا المقال، سوف نعرف كل ما يمكنك معرفته في بدايات دخولك إلى عالم الكود.
لقد وضعت لنفسي تحدياً بأن أقوم بعمل برنامج كامل على Xcode، والأهم من ذلك أننا سوف نفهم. انظر إلى الهاتف المحمول الذي معك، كل شيء عليه يعمل بالكود. انظر إلى كل أغنياء العالم، لقد صنعوا ثرواتهم باستخدام الكود. هذه الكاميرا، وتلك، وهذه أيضاً. آلة الدخان هذه التي أضغط عليها فتجعل المشهد رائعاً ومذهلاً، تعمل بالكود. الإضاءة التي تعمل الآن هي كود. البرامج التي أستخدمها على الكمبيوتر، البرنامج الذي أمنتج به هذا المحتوى، كلها تعمل بالكود.
أبجدية الكمبيوتر
لنتحدث عن الأبجدية العربية: أ، ب، ت، ث، ج، ح، خ… جميل جداً. لنتحدث عن الأبجدية الإنجليزية: A, B, C, D, E, F, G. لنتحدث الآن عن الأبجدية الكمبيوترية.
الكمبيوتر أو الحاسب الآلي هو أداة اخترعناها نحن البشر، ولأننا من اخترعناها، وضعنا بداخلها وسيلة نستطيع التحدث معها بها. ألم تفكر من قبل، لماذا اسمه “الحاسب الآلي”؟ هناك سبب لتسميته بهذا الاسم، وسنعرفه في نهاية المقال، لذا ابقَ معنا.
لنرجع الآن إلى موضوع الأبجديات الذي نتحدث عنه. لكي نتحدث مع الكمبيوتر، ما هي أبجديته؟ ما هي اللغة التي نستطيع التحدث بها مع الكمبيوتر؟ إنها “الواحد والصفر”. الواحد والصفر هما الطريقة التي يمكنك التحدث بها مع الكمبيوتر. وأنا أعرف أن هذا كلام غير منطقي. كيف ستتحدث بواحد وصفر؟ ما هذه الأبجدية التي تتكون فقط من واحد وصفر؟ 11010110
كيف يكون هذا منطقياً؟
حسناً، الموضوع ليس منطقياً، وأنا أتفق معك في ذلك. لكن دعنا نفكر في الأمر بشكل مختلف. هل الأبجدية بحد ذاتها تعتبر شيئاً منطقياً عندما ترى كل هذه الحروف أمامك؟ لا، لكن عندما تأخذ بعضاً من هذه الحروف وتصلها مع بعضها، تخرج منها كلمة. الأبجدية الإنجليزية نفس الموضوع. وباستخدام الأبجدية الكمبيوترية، يمكنك أن تُخرج منها جملاً كهذه:
01001011 01100001 01101001 01100110 01100001
هذه مجرد وحايد وأصفار مكتوبة بجانب بعضها بترتيبات مختلفة، وكل ترتيب له معناه الخاص.
أنا أستطيع أن أقول للكمبيوتر الخاص بي مثلاً “أغلق”. هذا أمر بسيط، إما أبيض أو أسود. أنا كمستهلك، كل ما أعرفه هو أنني أضغط على زر معين فيحدث شيء ما. الشيء الذي يحدث داخل “الصندوق الأسود” ويجعل هذا الأمر يتم، هو الكود. في الصندوق الأسود، يوجد الشيء الذي يفسر لي لماذا عندما أقول للكمبيوتر “أغلق”، فإنه يغلق.
تجربتي في بناء تطبيق
لم أكن أرغب في خوض هذه الرحلة من الجانب النظري فقط، كان لا بد أن أنزل وأجرب الموضوع بنفسي. وفعلاً جربت، وكانت الخطة هي عمل تطبيق قائمة مهام (To-Do List)، وهو أبسط شيء يمكن لأي شخص يبدأ في البرمجة أن يعمله. البرنامج الذي سأستخدمه هو Xcode على نظام ماك.
في البداية، عندما تقوم بأي شيء له علاقة بالكود، يكون الموضوع مخيفاً بشكل غير طبيعي. لكن بمجرد أن تفهم فكرة أن هذه لغة كاملة بحد ذاتها، فتعلمها واترك ما تعرفه جانباً، تبدأ في فهم الموضوع بجدية. لأن منطق عالمنا والأشياء التي نتعلمها فيه منذ صغرنا يُكسر هنا. ولكن هذه هي الكلمات التي نستخدمها وهذه هي اللغة التي أتحدث بها الآن والتطبيق يفهمني. ستحفظ هذه الأشياء القليلة، وستفهم الطريقة التي يمكنك التحدث بها معه، وعموماً فيما بعد، سيقوم البرنامج بالإكمال التلقائي (auto-fill) وسيسير الموضوع بسلاسة. لكن هذا لا يمنع أن الموضوع صعب، صعب إلى أبعد الحدود.
نعم، هذا التحدي استغرق مني أسبوعاً في تنفيذه، لكن الحقيقة هي أنه مضى لي أكثر من سنة وأنا أحاول كتابة هذا المقال، وكلما بدأت فيه أفقد الأمل لأن البرمجة صعبة.
أنا أنظم حياتي كل شهر، فأعرف ما أريد أن أفعله في هذا الشهر. أنظم حياتي في الأسبوع، فأكون عارفاً ما أريد أن أفعله في هذا الأسبوع. لكن يمكن القول إنني على المستوى اليومي لست منظماً تماماً. لذا، قررت عمل تطبيق قائمة مهام كما أريد.
الكود الخاص بتطبيق قائمة المهام بسيط للغاية، ولكن حرفياً، مهما فعلت، كان دائماً يفشل (failed). أصلح المشكلة التي تظهر أمامي، فأجد أن شيئاً آخر قد حدث به خطأ. وكمية الأخطاء التي تظهر لي لا أستطيع وصفها. لكن بمجرد أن تفهم كيف يعمل الموضوع، تشعر وكأنك اكتشفت سر الحياة.
الشيء الذي تعلمه البرمجة للشخص هو أنه بمجرد أن تبدأ العمل على شيء ما، لا يمكنك أن تتوقف أو تتشتت. يجب أن تكون مركزاً فيه بنسبة 100%. ورغماً عني، كان لا بد أن أدخل في هذه الحالة من التركيز لكي أنهي الكود الذي أحاول كتابته.
وهذا ما وصلت إليه في النهاية: أبسط تطبيق في عالم البرمجة، أكتب فيه الأشياء التي من المفترض أن أفعلها في يومي، وعندما أنتهي منها، أضغط عليها فتُشطب. هل كان هذا يستحق الوقت الذي ضيعته؟ نعم، 100%، نعم بالتأكيد بدون أي شك.
الكود ليس معقداً كما يبدو
دعوني أفهمكم، ولو شيئاً بسيطاً، عن فكرة التعقيد الموجودة داخل عالم البرمجة، وهذه تعتبر معلومة في منتهى الأهمية. دعوني أقدم لكم مثالاً له علاقة بعالم صناعة المحتوى، لعل هذا يكون أسهل للفهم.
الآن، لو أن هناك شخصاً لا يعرف أي شيء عن كيفية صناعة المحتوى المرئي، يمكن بكل بساطة أن ينبهر بأشياء ليس لها أي أهمية. يمكنني أن أقول إن من أصعب المراحل في صناعة أي قطعة محتوى هي المونتاج.
مثال على المصطلحات المعقدة:
- الخطوة رقم واحد: آخذ المادة وأقوم بنسخها (copy).
- بعد ذلك، يجب أن أنشئ مكتبة (library) جديدة.
- من بعد المكتبة، أفتح حدثاً (event)، وهذا بالطبع يأخذ وقتاً.
- بعد الحدث، آخذ المادة وأطرحها على الخط الزمني (timeline).
- وكل هذا وأنا لم أبدأ بعد في عمل المسودة الأولى (first draft).
- يجب في البداية أن آخذ الصوت وأقوم بمعالجته على برنامج Adobe Audition.
- وبعد أن أخرج من Adobe Audition، سأبدأ العمل على المسودة الأولى.
- لكن قبل أي شيء، يجب أن أرى إذا كنت سأقوم بتصحيح الألوان (grading) قبل أو بعد.
كل الكلام الذي قلته للتو هو عبارة عن “سلطة كلمات” (word salad) لا أكثر ولا أقل. لم يتم فعل أي شيء حقيقي في الكلام الذي قلته. ما قلته هو ببساطة أنك على الكمبيوتر ستقوم بالضغط كليك يمين ثم تختار “إنشاء مجلد جديد” (Create New Folder). هذه هي درجة صعوبة الشيء الذي قلته للتو، خاصة لشخص يصنع المحتوى منذ فترة.
نفس الشيء في البرمجة. لو أن شخصاً لا يعرف أي شيء في عالم البرمجة، من السهل أن ينبهر بأي شيء لأنه لا يفهم ما هو موجود داخل “الصندوق الأسود”. لكن بقليل من المعلومات البسيطة مثل التي طرحناها في هذا المقال، يمكنك أن تعرف بكل سهولة هل هذا الشيء تطلب شغلاً كثيراً فعلاً أم أنه يعتبر شيئاً بسيطاً.
فكر فيها. فكر في أي شيء تستخدمه، سواء كان تطبيقاً على هاتفك أو برنامجاً تستخدمه على الكمبيوتر. كم أمراً أنت تعطيه لكي تأخذ الشيء الذي تريده؟ كلما كثرت الأوامر، أو بالأمر الواحد الذي تضعه تظهر لك اختيارات متعددة، كلما كان التعقيد أكثر. هذا هو الموضوع بكل بساطة.
مستقبل البرمجة مع الذكاء الاصطناعي
الأمر يشبه العمليات الحسابية بالواحد والصفر. أريد أن أحقق شيئاً واحداً، فأضغط على زر واحد. إذاً هي عملية حسابية واحدة. إذا ضغطت على الزر، يخرج لي صوت. ثلاثة أسطر من الكود لا أكثر ولا أقل لتحقيق هذا الشيء. فكلما زادت التعقيدات، وكلما باختيار واحد تقوم به يكون لديك اختيارات أخرى متعددة، كلما زاد تعقيد الكود، وزادت الحسابات المطلوبة من البرنامج. فيجب عليه أن يقوم بهذه الحسابات بشكل أسرع، بل وأن يقوم بها بشكل “آلي”. الحاسب الآلي. قلت لكم سنعود إليها.
وهذا هو أهم شيء في البرمجة أو الشيء الذي نخرج به من البرمجة أساساً: الأتمتة (Automation). يمكن للأتمتة أن تجعل المهام المملة التي تتكرر كثيراً تتم بشكل تلقائي. فمعرفتك بالقليل من البرمجة يمكن أن تفتح عقلك لكيفية تطوير أشياء أخرى كثيرة بشكل تلقائي.
هل تريدون أن تعرفوا ما هو الشيء المخيف الآن؟ أن البرمجة نوعاً ما أصبحت أسهل من أي وقت مضى. لو دخلنا الآن على ChatGPT، حتى النسخة المجانية، وكتبت له ببساطة:
“اكتب لي كوداً لتطبيق لعبة شطرنج.”
هذا ما حدث. ChatGPT كتب لي كوداً لتطبيق لعبة شطرنج في أقل من دقيقة. التطبيق الذي قضيت وقتاً طويلاً في هذا المقال أبذل فيه جهداً كبيراً وأشاهد دروساً تعليمية وأحاول أن أفهم كيف أكتب على Xcode باستخدام Swift وهذه القصة كلها.
حسناً، لنجرب شيئاً آخر.
أمر لـ ChatGPT:
write code for a to-do list app on xcode using swiftui
import SwiftUI
struct ContentView: View {
@State private var tasks: [String] = []
@State private var newTask: String = ""
var body: some View {
NavigationView {
VStack {
HStack {
TextField("Enter new task", text: $newTask)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button(action: addTask) {
Text("Add")
}
}
.padding()
List {
ForEach(tasks, id: \.self) { task in
Text(task)
}
.onDelete(perform: deleteTask)
}
}
.navigationTitle("To-Do List")
}
}
func addTask() {
if !newTask.isEmpty {
tasks.append(newTask)
newTask = ""
}
}
func deleteTask(at offsets: IndexSet) {
tasks.remove(atOffsets: offsets)
}
}
الكود الذي كُتب للتو، هذا الكود الكامل، هو قريب جداً من الكود الأساسي الذي بذلت جهداً كبيراً لأتمكن من عمله، وحتى أفهم كيفية عمله، والذي كان مليئاً بالأخطاء، وفي النهاية شبه لم أستطع عمل التطبيق كاملاً كما أردت. هو عمله في أقل من دقيقة.
الآن، الناس داخل عالم البرمجة والذين يعملون في البرمجة—وهناك نقطة مهمة هنا لم نغطها بشكل كافٍ في هذا المقال، وهي أن البرمجة (Programming) والكتابة البرمجية (Coding) ليسا نفس الشيء 100%، لكن ليس هذا موضوعنا—هم لا يرون أن هذا خطر كبير، بل على العكس، هو شيء يساعدهم، لأنهم يستطيعون كتابة الأمر (prompt) المعين لـ ChatGPT، فيعطيهم الكود، فيقومون هم بالتعديل عليه وضبطه. لكن بالنسبة للناس من الخارج، سيشعرون بأن هذا الآن شيء خطر. “أنا لا أريد أن أدخل في وظائف لها علاقة بالكود بعد الآن”. هذه الوظيفة التي كانت في وقت من الأوقات مربحة أو يمكن أن يأتي منها مال، لم أعد أرغب في الدخول فيها.
لكن أظن أننا عندما نقترب مثلاً من عالم مثل صناعة الأفلام أو التصميم، سنجد أن استخدام الذكاء الاصطناعي هناك بدأنا نتعاون معه شيئاً فشيئاً لنخرج بشيء رائع. لكن الشيء الذي يظل حقيقة هو أنني الآن لو لدي مشروع جديد وأريد عمل تطبيق له علاقة بتوصيل الطعام، سأدخل على ChatGPT وأكتب:
“اكتب لي كوداً لتطبيق توصيل طعام.”
الخاتمة
هذا كان عالم البرمجة أيها الأصدقاء. هذا هو الصندوق الأسود الموجود في كل شيء نستخدمه في حياتنا.