ما هو أصعب شيء في تطوير البرمجيات؟

hardest-in-sofware

قال فيل كارلتون ذات مرة ، “هناك شيئان صعبان فقط في علوم الكمبيوتر: إبطال ذاكرة التخزين المؤقت وتسمية الأشياء.”

واحد مشكلة حقيقية. الآخر هو مشكلة تحديد الواقع.

تؤدي خوارزمية ذاكرة التخزين المؤقت التي تعمل بشكل سيء إلى تعريض سلامة النظام للخطر. يمكن أن تعرض الأسماء للخطر وجود النظام بالكامل.

ظاهريًا ، قد يبدو هذا قفزة كبيرة. ومع ذلك ، انظر بشكل أعمق في كيفية تعلمنا وبناء فهم مشترك للعالم ، ثم يبدو الأمر منطقيًا تمامًا.

تأتي معرفتنا من تجربة وتفسير الواقع من حولنا. مع البرمجيات ، نبني عوالم ، عوالم افتراضية. لا أعني العوالم الافتراضية بمعنى الأكوان الفوقية. أعني عوالم افتراضية في أذهاننا.

نحن نبني عوالم جديدة لأن الواقع مليء ، حسنًا ، بكل شيء. عند تقديم تجربة واقعية في عالم افتراضي ، تمر عملية البناء هذه بثلاث مراحل متميزة:

  1. انسخ التجربة أو النشاط على حالته.
  2. حدد وأزل الخطوات والمهام الدخيلة التي لا تساهم في التجربة.
  3. أضف ميزات مفيدة لا مثيل لها في العالم المادي.
خذ التسوق عبر الإنترنت كمثال.
تتضمن هذه التجربة عبر الإنترنت العديد من جوانب الواقع ، مثل تصفح العناصر والدفع مقابلها. المفاهيم الأخرى ، مثل القيادة إلى المتجر ، لا تضيف أي قيمة ولا يتم تضمينها في التجربة الافتراضية. ثم هناك مفاهيم مفيدة فقط – وممكنة – في العالم الافتراضي ، مثل تخزين رقم بطاقة ائتمان لعمليات الشراء المستقبلية.

عندما نبني تلك الحقائق الجديدة ، يجب علينا أولاً أن نخترع الأشياء ثم نسميها – إن التصور غير الواضح أو غير التقليدي أو غير الكافي للواقع يؤدي إلى أسماء مربكة.

تجعل الأسماء المربكة من الصعب مشاركة المعرفة الأساسية. بدون وجود عدد كافٍ من الأشخاص يتشاركون نفس الواقع ، تفشل الأنظمة دائمًا.

يصبح هذا الموضوع فلسفيًا قبل أن يصبح تقنيًا.

دلالات الواقع

قبل أن نفهم سبب صعوبة التسمية (والأهمية) ، يجب أن نفهم كيف “تترجم” أدمغتنا العالم من حولنا.

تمثل الأسماء ، أكثر من تسلسل الرموز والأصوات ، مفاهيم فيما يسميه علماء النفس المخطط.

يمكن أن تكون المخططات مجردة قليلاً لتطوير البرامج ، لذلك أفضل استخدام شكل معين من المخططات يسمى الشبكات الدلالية.

يحتوي أبسط أشكال الشبكات الدلالية على كيانات وعلاقات:

  • يمثل الكيان نوعًا مميزًا من القطع الأثرية ، سواء كانت فعلية أو مفاهيمية. إذا كنا نتحدث عن الأشجار ، فإن بعض الكيانات المعروفة ستكون “الجذع” و “الفروع” و “الأوراق” و “الفاكهة” و “الزهور” و “البذور”.
  • تصف العلاقة الارتباط بين كيانين. على سبيل المثال ، ورقة “تتصل” بفرع ، والفواكه “تنمو من” الأشجار.

بينما تمثل الشبكة الدلالية العالم ، هناك تمثيلات مختلفة – وصالحة بشكل متساوٍ. تختلف بعض التمثيلات في العمق (رؤية العالم بمزيد من التفصيل) ويختلف البعض الآخر في المنظور (رؤية العالم من زوايا مختلفة).

لنبدأ بمثال لتعليم شخص ما أصول الفاكهة.

قد يكتفي الطفل الصغير الذي يسأل عن أصل الفاكهة بشبكة دلالية بسيطة من “الأشجار” و “الفروع” و “الزهور” و “الفواكه”.

لاحقًا في الحياة ، ربما كطالب أحياء ، سيكون هذا الطالب نفسه جاهزًا لفهم نموذج أكثر تعقيدًا. سيحتوي هذا النموذج على كيانات جديدة ، مثل “البذور” و “حبوب اللقاح” و “أنابيب حبوب اللقاح” و “المبايض” و “أكياس حبوب اللقاح”. سوف تتطلب هذه الكيانات الجديدة المزيد من علاقات الشبكة الدلالية ، وربط الكيانات الموجودة مسبقًا والكيانات الجديدة. على سبيل المثال ، حبوب اللقاح “تتواجد في” “كيس حبوب اللقاح” ، وكيس حبوب اللقاح “جزء من” الزهرة.

تختلف هاتان الشبكتان الدلالية في العمق.

من المؤكد أن عالم الدفاع عن النفس – وهو خبير في نحل العسل – يفحص الأشجار لديه العديد من هذه المفاهيم في شبكته الدلالية. ومع ذلك ، قد تتضمن الشبكة الدلالية كيانات أقل شيوعًا ، مثل “حواجز الغابة” و “مصدات الرياح” ، المتعلقة بسبل عيش النحل والجدوى العامة في النظام البيئي. لا تزال هذه الشبكة الدلالية تحتوي على معلومات إضافية حول الأشجار ، ولكن فقط عندما تكون هذه المعلومات مرتبطة بالنحل.

تقدم هذه الاختلافات تحديين أساسيين في التعامل مع الواقع ، وقد تبدأ في التعرف عليهما في تطوير البرمجيات:
  1. مستويات المهارة المختلفة تعني أعماق مختلفة للشبكات الدلالية. يمكن لبعض الأشخاص رؤية المزيد من الفروق الدقيقة في سيناريو العميل أكثر من غيرهم. هذا لا يعني أن الإدراك الإضافي سيكون له دائمًا تأثير مادي على الحل النهائي ، ولكنه موجود.
  2. تؤثر الأولويات المختلفة على كيفية تصنيف نفس المعلومات الحسية. قد يتعرف مطورو البرامج على الكيانات التي تدعم النظام بأكمله في شبكة مادية ومنطقية معقدة من الخوادم والوصلات ومحركات التقديم. بالنسبة إلى المستخدم ، ربما كل ما يراه هو “تطبيق” ، وهو كيان ثانوي في روتينه اليومي.نحن أكثر أو أقل دراية بالاختلافات في العمق. نحن لا نتكيف مع الاختلافات في المنظور.

عالم افتراضي حيث كل شيء جديد

في هذه المرحلة ، يمكنك معرفة أن الإجراء الأخير للتسمية ليس هو الجزء الصعب.

تحت اسم جيد يكمن تصور واضح للواقع وتشكيل شبكة دلالية. يجب أن تنبثق المفاهيم والعلاقات من الملاحظة قبل أن نتمكن من تسميتها.

في مرحلة ما من التاريخ المسجل ، لا بد أن شخصًا ما قد نظر إلى عصا طويلة على الأرض ووصفها بأنها شجرة – لكي أكون دقيقًا ؛ أطلقوا عليه اسم شيء آخر.

ولكن ماذا يحدث عندما لا يخضع واقع شخص ما لقواعد المكان والمادة والزمان؟

هذا هو اللغز البرمجي ، التركيز على “لينة” (افتراضية) مقابل “صلبة” (ملموسة). لا يقوم مطورو البرمجيات ببساطة بتعيين أسماء إلى كيانات في عالمهم. في كثير من الأحيان ، هم يخلقون تلك العوالم.

 

على هذا النحو ، يواجه مطورو البرامج قرارات التسمية بشكل متكرر أكثر من الأشخاص في المهن الأخرى.

لاستخدام بعض الأمثلة عن كيفية مواجهة المهن الأخرى لتحدي تسمية شيء جديد ، يجب أن ننظر في عدد المرات التي يصادفون فيها أشياء جديدة.

يحتاج الفيزيائيون إلى تشريح أسس الكون باستخدام أدوات تتعمق في أعماق الجسيمات دون الذرية. ينظر علماء الفلك بعيدًا وواسعًا باستخدام موارد محدودة ، على أمل اكتشاف كائن يحتاج إلى اسم جديد. يجب على رواد الأعمال إنشاء شركات ومنتجات جديدة قبل أن يتمكنوا من تسميتها.

الموضوع واضح: الكثير من العمل ، وفترات الاكتشاف الطويلة ، والقيود الواقعية ، وربما يحصل الجزء العلوي من مجالهم على عدد قليل من فرص التسمية كل عام (أو عقد).

مطوري البرامج؟ يحصلون على هذه الفرصة عشرات ، وربما مئات المرات في اليوم.

تأتي الفرص من التعامل مع وسيط يمكن أن يمثل الأفكار والمفاهيم في البرنامج. يجب أن تكون هذه التمثيلات بشكل صارم ولا لبس فيه مرجعية من قبل البرامج الأخرى.

 

نقل المعرفة من النظرية إلى التطبيق

بمجرد تسمية كل شيء جديد ، حان الوقت لتقديم هذه العوالم الجديدة لبقية فريق التطوير.

نظرًا لأن معظم مطوري البرامج يفتقرون إلى خلفية رسمية في التعليم ، فإنهم غالبًا ما يعتمدون على مزيج من خبراتهم في التعلم من الآخرين وتدريبهم.

في حين أن التدريب الرسمي في التدريس قد يكون احتمالًا بعيدًا ، يمكننا على الأقل استعراض بعض جوانب نظرية التعلم.

 

التحليل الأعمق لنظرية التعلم يستحق نشره الخاص. ومع ذلك ، حتى القراءة السريعة لمفهوم مثل “نقل التعلم” تُظهر إمكانية شرح وتحسين الأساليب التقليدية لمشاركة تصميمات البرامج.

وتجدر الإشارة إلى أن هذه الأساليب التقليدية يجب أن تظل أساس أي نقل للمعرفة:

  • وثائق التصميم
  • مخططات المكونات
  • قاموس المصطلحات
  • مخططات التفاعل

 

توقف مؤقتًا لتلاحظ أن جلسات السبورة مكملة لوثائق التصميم ، وليست بديلاً.

لكي نكون واضحين ، فإن الجلسة الحية هي أداة معرفية رائعة. تتفاعل قطة “الطلاب” مع “المعلم” لاستكشاف المفاهيم وزيادة شبكاتها الدلالية تدريجيًا.

من ناحية أخرى ، يعتمد تقديم التدريب إلى حد كبير على خبرة المدرب. يؤدي التسليم الشخصي إلى نتائج غير متسقة عبر الجلسات. كما أن التسليم الفردي يتسم بالضعف ويهمش الزملاء خارج حدود الشبكات الاجتماعية ، والمناطق الجغرافية ، والمناطق الزمنية.

 

الاستعارات: انتبه للشبكات الدلالية “الجاهزة”.

يشكل الأشخاص المختلفون شبكات دلالية بطرق مختلفة. في تطوير البرامج ، ينطبق هذا بشكل خاص على المواقف التي تتعامل فيها مع مفاهيم مجردة تناسب فئات متعددة محتملة.

 

ليس من المستغرب أن المصممين والمطورين يفضلون بين الحين والآخر استخدام الاستعارات لنمذجة أو وصف أنظمتهم. يتمثل التفكير في أن الاستعارات يمكن أن تسرع نقل المعرفة من خلال البناء على شبكات دلالية مماثلة سبق للناس تعلمها من قبل.

مثال على استعارة بسيطة هو استخدام رمز “سلة المهملات” لحذف الملفات من جهاز الكمبيوتر. مثال على استعارة أكثر تفصيلاً هو اختيار مفهوم “قوائم الانتظار” في أنظمة المراسلة.

هناك (على الأقل) مشكلتان في إعادة استخدام الاستعارات.

مشكلة الاستعارة رقم 1: معروفة من قبل من؟

المشكلة الأولى هي أن المفهوم المألوف ليس بالضرورة عالميًا.

مسألة الاستعارة رقم 2: العمق والمنظور.

إذا قلت شيئًا ما “يعمل مثل الإنترنت” ، فقد يعرف الفنيون أكثر أو أقل عن الإنترنت.

في الوقت نفسه ، قد يرى بعض مستخدمي الإنترنت المحترفين الذين ليس لديهم خلفية بنية تحتية سحابية أنها سلسلة من الأنابيب.

 

التجريد. إنها تجريدات (تقريبًا) على طول الطريق.

فكر في التجريدات على أنها تجميع الشبكات الدلالية بأكملها في عدد أقل من الكيانات في شبكة دلالية جديدة.

يتيح التجريد التواصل على مستوى أعلى ، سواء بين البشر أو بين البشر والآلات.

في حين أن التجريدات ليست فريدة من نوعها بالنسبة للبرامج ، إلا أن صناعة البرمجيات فريدة من نوعها في مدى سرعة تكديس التجريدات فوق التجريدات. يخلق هذا التراص طبقات غامضة من الشبكات الدلالية التي تتطلب منحنيات تعلم شديدة الانحدار.

الخلاصة هنا هي أن الأبسط لا يعني البساطة. بعض التقنيات معقدة بطبيعتها لأنها تحل مشاكل معقدة.

ولأننا بحاجة إلى التفكير والتواصل بكفاءة حول حل تلك المشكلات ، فإننا نستمر في وضع التجريد الطبقي فوق التجريدات حتى تشعر التفسيرات إلى حد كبير مثل الحكاية الشهيرة “السلاحف على طول الطريق”.

من الوجود في كل مكان إلى الفريد

تنمو الشبكات الدلالية من حيث العدد والحجم كلما تعلمنا. كما أنها تميل إلى النمو مثل الأشجار ، مع إرفاق مفاهيم جديدة بالمفاهيم الموجودة. يمكننا إعادة تنظيم أجزاء من الأشجار الدلالية في أدمغتنا ، لكن “إعادة الكتابة” الكاملة ليست سهلة أو شائعة.

قد تتقارب الشبكات الدلالية لشخصين بشكل أقرب في نواتها ، خاصةً عندما يشترك هؤلاء الأفراد في الكثير من السياقات.

مع ارتفاع مستويات التجريد ، يتضاءل هذا السياق المشترك ، وتصبح تلك الشبكات الدلالية مختلفة بشكل متزايد عند الحواف. عندما تصبح هذه الشبكات مختلفة بما فيه الكفاية ، لا يتبادل هؤلاء الأفراد وجهات نظر متشابهة.

كتمرين إحماء في تطوير البرامج ، دعنا نلقي نظرة على النطاق الضيق لتسمية المتغيرات داخل دالة. الشبكات الدلالية داخل وظيفة ما محدودة للغاية من حيث الغرض ، حيث يحاول المبرمجون ملاءمة الأسماء في حلقة تحكم محلية أو جزء من خوارزمية.

تتطلب عناصر التحكم في الحلقة تسمية متغيرات الفهرس أو العناصر التي تم تعدادها. قرارات التسمية هذه مشتقة إلى حد كبير وغير منطقية. على سبيل المثال ، عندما يتعلق الأمر بمتغيرات الفهرس ، غالبًا ما يتبع القرار الافتراضي النمط التاريخي للأسماء المكونة من حرف واحد مثل “i” و “j” و “k”.

تجاوز عناصر التحكم في الحلقة السابقة ، ونحن نتعامل مع كيانات تسمية ذات غرض دلالي أعلى. في هذه المرحلة ، ربما نحاول جعل الأسماء مناسبة للغرض من الوظيفة التي تحتوي على المتغيرات.

مع تقدم تمارين التسمية في التسلسل الهرمي للمفاهيم ، نبدأ في محاذاة الأسماء مع مفاهيم النظام. على سبيل المثال ، إذا كان النظام يحتوي على مكون يمثل عربة التسوق ، فمن المحتمل أن يكون لدينا ملف أو فئة نظام مسماة بطريقة تشبه عربات التسوق.

الشيء المهم هنا هو أن الأشخاص المختلفين ينشئون شبكات دلالية مختلفة لنفس الواقع. عندما يكون هذا الواقع ضيقًا جدًا (مثل “حلقة من خلال هذه المصفوفة” ، تكون الشبكات الدلالية محدودة بنفس القدر وتميل إلى التوافق بشكل مثالي.

مع اتساع النطاقات تدريجيًا (تدفقات التحكم ، أو نمذجة خوارزمية كبرامج ، أو تحديد نظام ،) تتآكل المحاذاة في علاقتها المباشرة بهذا النطاق.

عندما نفكر في التوافق مع النماذج العقلية لكيفية رؤية العميل للنظام ، لا يمكن أن تبدأ محاذاة الكلمات في تغطية الفجوة. ما يشكل مركز عالمنا وخبرتنا قد يكون ببساطة “التطبيق رقم 3 من البائع رقم 6” للعميل.

بالعودة إلى مثال عربة التسوق ، هل سيتخذ مبرمجان مختلفان نفس القرارات حول تمثيل وظائف عربة التسوق كملفات شفرة المصدر؟ على الاغلب لا.

والأهم من ذلك ، هل سيوافقون على قرار شخص آخر ويعدلون نماذجهم العقلية؟ ربما.

الاتفاق يعني “محاذاة” الشبكات الدلالية عبر مختلف الأشخاص في الفريق ، وهناك بعض التقنيات الجيدة لذلك. تم ذكر بعض الطرق الرسمية سابقًا (وثائق التصميم ، قاموس المصطلحات ، المخططات المكونة ، المخططات التسلسلية.)

أود أن أضيف برامج التعليم المتبادل بشكل متكرر وحتى البرمجة الزوجية كأنشطة يمكن أن تكمل التوثيق الرسمي. يعد التحليل التفصيلي لطرق زيادة “الاتفاق الدلالي” عبر فريق التطوير موضوعًا آخر لنشر مخصص – تتراكم على قائمة الموضوعات المستقبلية.

يأخذنا موضوع الشبكات الدلالية المختلفة إلى القسم التالي.

 

إعادة كتابة الواقع من خلال الكود

تعد إعادة عمل شخص ما ممارسة شائعة بشكل فريد في صناعة البرمجيات.

إعادة العمل ، للوهلة الأولى ، نشاط مضيعة للهدر. ظاهريًا ، وربما من منظور مدير المشروع ، إذا كانت كتلة من التعليمات البرمجية تؤدي وظيفتها ، فيجب على المطورين تركها بمفردها. إذا كانت كتلة التعليمات البرمجية تحتاج إلى حد أدنى من التعديل لإضافة ميزة جديدة ، فمن المنطقي زيادة هذا المكون مع دلتا وترك الباقي دون تغيير. حق؟

الانفصال هنا هو أن مديري المشاريع يفكرون في بناء الأشياء. غريزيًا أو عن طريق التدريب ، يتوقع مديرو المشاريع أنه عندما تقوم ببناء شيء ما في العالم الحقيقي ، فإنه يتم.

ومع ذلك ، مرة أخرى ، لا يقوم مطورو البرمجيات ببناء أشياء في العالم الحقيقي ؛ إنهم يفسرون الواقع لإنشاء عالم افتراضي.

وبغض النظر عن الأسباب المشروعة لإعادة هيكلة الكود ، قد يظل مطور البرامج “يرث” قواعد الكود من مطور آخر يشعر بالحاجة إلى إعادة كتابة أجزاء مهمة من قاعدة الكود هذه.

لماذا هذا؟

باختصار: البنائية.

في بضع كلمات أخرى ، لا تعد الشفرة الموجودة مسبقًا في النظام أداة ثابتة. إنه تفسير للواقع. في عالم افتراضي ، اجعل ذلك حقيقة متغيرة. في ظل هذه الظروف ، يكاد يكون من المستحيل الوصول إلى فهم مشترك ومستقر للواقع عبر الفريق.

لا تعد إعادة كتابة التعليمات البرمجية تمرينًا لا طائل من ورائه في إعادة بناء ما هو موجود بالفعل في مستودع التعليمات البرمجية. إنه تمرين في خلق توازن بين ما يعرفه المطور والتمثيل الكتابي لتلك المعرفة. تمكن هذه المحاذاة المطور من العمل مع قاعدة التعليمات البرمجية بشكل أكثر إنتاجية. قاعدة التعليمات البرمجية المعاد كتابتها هي نتيجة ثانوية لنشاط التعلم.

 

لاحظ أنني أعالج سيناريو صريحًا حيث يتم نقل قاعدة التعليمات البرمجية من مطور إلى آخر. تعد ملكية الرمز ، سواء كانت تتبع نموذجًا فرديًا أو مشتركًا ، موضوعًا للنشر في المستقبل.

لم أستطع إنهاء هذا القسم بدون الارتباط بتمرين تسمية. بعد الانتهاء من نشاط إعادة كتابة الكود وتشكيل شبكات دلالية جديدة لتمثيل تفسيرهم للعالم ، فإن احتمالات اختيار هذا المطور للأسماء القديمة للمفاهيم الجديدة منخفضة نسبيًا.

قد تلعب الأنا دورًا – تسمية الأشياء أقرب إلى ترك علامة صغيرة في العالم – ولكن هناك سببًا عمليًا واحدًا على الأقل لذلك: المفهوم الجديد بالاسم القديم لا بد أن يربك الأشخاص الذين هم على دراية بالمفهوم القديم – انظر هذه الجلسة الممتازة حول موضوع نشر التنشيط كمرجع.

الحقائق الجديدة تولد أسماء جديدة.

 

 

الخلاصة

تسمية (شيء) هي تتويج لعملية معقدة لخلق عوالم مجردة.

بعض أجزاء تلك العوالم هي تمثيلات مباشرة للعالم المادي ، في حين أن أجزاء أخرى جديدة تمامًا.

تتضمن عملية التسمية مهامًا ضيقة (كتابة حلقة تحكم قصيرة) وتمارين معرفية واسعة (إنشاء تجريدات جديدة).

إن الافتقار إلى المراجع التاريخية – تطوير البرمجيات هو نظام جديد نسبيًا مقارنة بالمجالات المهنية الأخرى – يتطلب النشر المتكرر للاستعارات غير الكاملة لشرح النماذج الجديدة.

تطلب التقدم التكنولوجي غير المسبوق طبقات تجريد متزايدة باستمرار لتقسيم القدرة المذهلة للأنظمة الحديثة إلى طبقات.

العديد من هذه التحديات هي جوهرية في سن مبكرة من مهنتنا ، ولكن هناك مفاهيم مختلفة يمكننا استعارة من مجالات أخرى لمساعدتنا في شرح هذه المشاكل والتوفيق بينها وحلها.

 

 

 

 

 

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

أربعة × أربعة =