هندسة البرمجيات
هندسة البرمجيات هي الجزء الشديد الصعوبة من علوم الكمبيوتر بالنسبة إلى عالِم الكمبيوتر.
في الساعة التاسعة وعشر دقائق مَساءً من يوم ٢٢ يوليو ١٩٦٢، تم تجهيز صاروخ «مارينر ١» الذي يبلُغ طوله ٣٣ مترًا والذي كان يقِف على منصة الإطلاق في كيب كانافيرال. وكان يُوجَد فوق الصاروخ إطار من المغنيسيوم سُداسي الشكل يحتوي على نظامٍ إلكتروني عالي التقنية لجمع وتحليل وحوسبة وتبادُل البيانات العلمية، ونظام تشغيل للحفاظ على جميع العمليات الحيوية على متن الصاروخ. وكان صاروخ «مارينر ١»، المُتجه إلى كوكب الزُّهَرة، هو الأول في سلسلة من ١٠ مسابير بين كوكبية تابعة إلى ناسا لإجراء عمليات استكشاف للمريخ وعُطارِد والزُّهَرة أثناء التحليق بالقرب منها. وكانت هذه أول مرة في التاريخ يتمُّ فيها التحليق بالقُرب من كوكب آخر. وتُعَد هذه اللحظة هي ثمرة جهود آلاف الأشخاص في عمليات التخطيط والحوسبة وتصميم المركبة الفضائية واختبارها ثم بنائها. كان «مارينر ١» يهدف أيضًا إلى إثبات تفوُّق الولايات المتحدة على الاتحاد السوفييتي في سباق الفضاء. وبعد عشر دقائق والعشرات من عمليات التحقُّق، أعطى نظام التحكُّم في الطيران الضوءَ الأخضر للعدِّ التنازلي للإطلاق النهائي.
بعد ثوانٍ من إطلاق الصاروخ نحو عالم جديد، بدأت معَدَّات المراقبة في الإشارة إلى وجود مشكلات. فنظام تتبُّع بيانات السرعة وإرسالها لم يعمل في الصاروخ بشكلٍ صحيح. وكان من المُفترَض أن أجهزة الكمبيوتر الخاصة بالتحكُّم الأرضي تتولَّى الأمر؛ وهو أمر طبيعي في العادة؛ لأن هذا هو الغرَض من النظم الاحتياطية. ولكن حدث خطأ ما أثناء تطوير نظام الكمبيوتر الذي استغرق وقتًا طويلًا، وأغفل شخصٌ ما علامة ترقيم صغيرة في البرنامج، مما جعل الكمبيوتر يبني قراراته على البيانات الأولية بدلًا من البيانات التي تمَّت معالجتها على مدار فترةٍ زمنية مُعينة. أدى هذا الخطأ إلى تعويض الصاروخ بشكلٍ مُفرط عن الاضطرابات الطفيفة في مساره، مما أدى إلى توجيهه على نحوٍ غير قابل للسيطرة نحو مناطق مأهولة وممرَّات شحن. بعد ٢٩٣ ثانية من الإطلاق، لم يكن أمام التحكُّم الأرضي خيار سوى إرسال أمر تدمير إلى المركبة. وسقطت أطنان من المعدِن والإلكترونيات العالية التقنية ووقود الصواريخ في المحيط الأطلنطي.
في خلال أسبوع واحد، صدرت التقارير الأولية حول أسباب الفشل المدوِّي الذي أُعلِن عنه على نطاق واسع، وكان معظمها يذكر ذلك الخطأ الصغير في برنامج الكمبيوتر. كان العنوان الرئيسي في صحيفة «نيويورك تايمز» يقول: «صاروخ الزُّهَرة يضيع بسبب شَرطة». أدخلت تلك اللحظة الفاصلة مفهوم خطأ البرمجة إلى الوعي العام. وفتحت عيون الكثير من الناس على العواقب الكارثية المحتملة لفشل البرمجيات. وبحلول نهاية الستينيات من القرن العشرين، كانت تقارير مشكلات البرمجة أمرًا شائعًا ومألوفًا. وأثرت أخطاء البرامج في الموثوقية، وقوَّضت الإنتاجية، وأدَّت أحيانًا إلى مخاطر كبيرة.
أدرك مطوِّرو البرمجيات أن التفكير الحوسبي في ذلك العصر لم يكن قادرًا على تقديم برامج موثوقٍ بها يمكن الاعتماد عليها. كان معظم التفكير الحوسبي يُركِّز على التفكير في نطاق الأفراد؛ أي الممارسات وأدوات التفكير الخاصة بأفراد المُبرمِجين. ولم يكن يركز على نطاق المجموعات؛ أي الممارسات وأدوات التفكير الخاصة بمجموعات المُبرمِجين الذين يطوِّرون نظم إنتاج كبيرة ذات عمر طويل وقواعد مُستخدِمين ضخمة. وسوف نستكشف في هذا الفصل التحوُّل المُهم في نطاق التفكير الحوسبي والصعوبات التي نجمت عنه.
(١) أزمات البرمجيات
كانت السنوات الأولى للكمبيوتر ذي البرنامج المُخزَّن انتصارًا لهندسة الكمبيوتر. وتَصدَّر تطوير الأجهزة العناوين الرئيسية، من «العقل الخارق الحاسوبي» إلى «آلة التفكير المُذهلة». عرضت الصحافة أجهزة العقل الخارق الحاسوبية التي تزن عشرات الأطنان والتي تعمل أسرعَ ألف مرةٍ من آلات الحوسبة السابقة، والأهم من ذلك، يُمكنها إجراء العمليات الحسابية أسرع آلاف المرَّات من أفضل علماء الرياضيات في العالم. في الماضي كان يُحتفَى بالرياضيات والمنطق باعتبارهما الميزة التي ميَّزت البشَر عن الحيوانات، والآن يمكن للآلات أن تفعل كليهما.
سرعان ما انتقل الحماس المُبكر لأجهزة الكمبيوتر من «تكوين الأعداد» — كما أطلق أحد روَّاد الحوسبة على الحوسبة العلمية — إلى معالجة البيانات في الرموز التي يُمكنها تمثيل أي معلومات على الإطلاق. وضربت المَجلات والصحف أمثلةً على أجهزة الكمبيوتر التي تؤدي مهامَّ كانت تُعَد في الماضي من اختصاص البشر وحدَهم: فبرمجَت مجموعةٌ منها الكمبيوترَ ليلعب الداما، وأخرى برمجَتْه ليلعب الشِّطْرَنج، وأخرى برمجته لإثبات المُبرهنات الموجودة في كتاب «مبادئ الرياضيات»، وأخرى لإنشاء فأرٍ آلي يجد طريقه عبر متاهة. وتضاعفت استخدامات أجهزة الكمبيوتر في مجالات التجارة والعلوم والتطبيقات الهندسية كل عام. وجاءت كل هذه التطوُّرات من البرمجيات. لقد بدأت ثورة الكمبيوتر بالأجهزة، لكنها سرعان ما أصبحت ثورة برمجيات.
ازداد حجم برامج الكمبيوتر وتعقيدها سريعًا. وبدأت السحب الداكنة تلُوح في الأفق في سماء تطوير البرامج. وأصبح المطوِّرون يُدركون بوضوح الصعوبات الكبيرة التي تُواجههم في إنشاء برامج عالية الجودة؛ أو بالأحرى برامج موثوق بها يمكن الاعتماد عليها وقابلة للاستخدام وآمنة. ولم تكن الأدوات الفكرية والإدارية المُطوَّرة حتى ذلك الوقت قويةً بما يكفي لإنشاء مثل هذه البرامج. ومن ثَمَّ بدأ المُطوِّرون يتحدثون عن «أزمة البرمجيات».
في اجتماعَين شهيرَين تحت رعاية منظمة حلف شمال الأطلسي (الناتو) في عامَي ١٩٦٨ و١٩٦٩، لجأ مطوِّرو البرمجيات إلى الهندسة بحثًا عن حلٍّ للمشكلات المُتكررة وأحيانًا الكارثية للبرمجيات. وأطلق على هذه الحركة اسم «هندسة البرمجيات». كان لدى الهندسة تاريخ طويل من إنتاج نظمٍ موثوق بها طوال الوقت. فقد كان من النادر سقوط الجسور أو تحطُّم الطائرات أو انهيار البنية التحتية على نطاقٍ واسع. ومن ثَمَّ، سرعان ما بدأ مهندسو البرامج في جلب أساليب الهندسة وتطويرها في تطوير البرمجيات وإدارتها.
ذكر رائد البرمجيات فريد بروكس في كتابه الكلاسيكي «خرافة شهر العمل» (١٩٧٥)، بُعدَين لتحويل البرامج إلى نظم إنتاج. الأول: هو تعميم برنامج حاسوبي واحد على نظامٍ من البرامج المتفاعلة. والثاني: هو إضافة الهياكل والمكوِّنات التي تضمن موثوقية البرامج. وكانت قاعدته العامة هي أن الحركة في أي بُعد من هذَين البُعدَين تُضاعِف الجهد المبذول ثلاثَ مرات. ويجب أن نتحرك في كِلا البُعدَين معًا لتحقيق نظُم إنتاج موثوق بها؛ وهو ما يفوق جهود إنشاء برنامجٍ واحدٍ بمقدار تسع مرات.
أصبح مطوِّرو البرمجيات، بعد أن صاروا على درايةٍ بالفجوة الواسعة بين البرمجة الأساسية ونظم الإنتاج، مُضطرِّين إلى إيجاد ممارساتٍ جديدة للتفكير الحوسبي لسدِّ هذه الفجوة. فطوَّروا مجموعة من الأشكال الجديدة من التفكير الحوسبي: ممارسات جديدة للتفكيك، والتعقيد، وهياكل المعلومات، والسببية، وسدِّ الفجوات الدلالية، وتجريد البيانات، وهياكل البيانات، والتضمين، وإخفاء المعلومات، والتَّكرار، وإدارة المشروعات، ودورة حياة البرمجيات. وأصبحت الجوانب النظرية من علوم الكمبيوتر، ولا سيما نظرية التعقيد وإثبات النظرية آليًّا، مُفيدةً في هذا المجال.
يمكن وصف التحول الذي تحدَّث عنه بروكس بأنه تحول من التفكير الحوسبي على نطاق الأفراد (تصميم وكتابة برامج فردية) إلى التفكير الحوسبي على نطاق المجموعات (تصميم نظم البرمجيات وإدارة مشروعات البرمجيات التي تنشئها بداية من التصميم ووصولًا إلى الإنتاج والصيانة).
(٢) العلم والهندسة في الحوسبة
وقد وجدنا ثلاثة فروق بين الهندسة والعلم مفيدة للغاية في فهم المساهمات التي يمكن أن يُقدِّمها كل منهما في مجال تطوير البرمجيات. الأول يتعلق بطبيعة عملهما. إذ يتولى المهندسون تصميم التقنيات التي تُحقق أغراضًا مفيدة وتطويرَها، بينما يبحث العلماء عن قوانين لتفسير الظواهر وتوقُّعها. ويعطي المهندسون الأولوية إلى التصميم، على عكس العلماء، ولذا تُعَد كلمة «التصميم» من بين أكثر الكلمات شيوعًا في الهندسة، بينما لا يشيع استخدامها في العلوم. والتصميم في الهندسة هو عملية إيجاد أدواتٍ عملية وآمنة وغير مُكلفة. ويركز العلماء على البحث عن الأنماط المُتكرِّرة والتحقُّق منها، بينما يركز المهندسون على الاستماع إلى العملاء واقتراح التقنيات القيِّمة لهم.
الفرق الرئيسي الثاني هو نظرة العلماء والمهندسين إلى المعرفة. يُعامل العلماء المعرفة على أنها بيانات ومعلومات منظمة في «دليل معرفي»، والذي يكون متاحًا للاستخدام بعد ذلك من قِبل أي شخص. الطريقة العلمية لإنشاء المعرفة هي عملية يجمع فيها المُراقبون النَّموذجيون النزهاء الأدلة التي تدعم المزاعم التي يمكن إضافتها إلى الدليل المعرفي، ويُقيِّمونها. أما المهندسون فهم يُعاملون المعرفة على أنها ممارسات ماهرة تمكِّنهم من تصميم الأدوات والتقنيات وإنشائها. والمهندسون ليسوا مُراقبين خارجيين؛ إنهم منغمسون في مجتمعات المُستخدِمين. وهم يُجسدون الممارسات لإنشاء التقنيات وصيانتها وإصلاحها؛ والاهتمام بالموثوقية والاعتمادية والسلامة في سياق الاستخدام؛ واتباع المعايير الهندسية وقواعد الأخلاقيات.
الفرق الرئيسي الثالث يتعلق بدور التجريديات والنماذج. فالعلم يُركِّز على النماذج، والهندسة تهتم بالآلات والأدوات. وهناك فرق جوهري بين وضع نماذج للآلات وإنشائها. التجريديات مفيدة؛ لأنها تبسط النظم المُعقدة. أما الآلات فهي مفيدة؛ لأنها تركز على التفاصيل العملية. إن واضع النظريات يمكن أن يَستخدِم مُصطلحَي الأجهزة والبرامج بالتبادل، ولكن المهندس لا يمكن أن يفعل ذلك على الإطلاق.
العبارة المألوفة «الشيطان يكمن في التفاصيل» هي شعار المهندس. إذ يجب على المهندس الاهتمام بكل التفاصيل لكي يعمل النظام الذي يُنشئه. أما العالِم، فهو يريد التخلُّص من التفاصيل حتى تبرُز الأنماط المتكررة.
تفسر هذه الفروق سبب صعوبة تصميم تعليم خاص بهندسة البرمجيات، يُمكنه بالفعل تخريج مطوري برمجياتٍ أكْفاء. توجد العديد من مجموعات هندسة البرمجيات في أقسام علوم الكمبيوتر التي تُبرز أهمية العلم على الهندسة. ويواجِه التفكير الحوسبي المشكلةَ نفسها في الموازنة بين المَجالَين: عندما يُهيمن أحد المنظورَين، يضيع التضافُر بينهما.
(٣) التفكير الحوسبي على نطاق الأفراد
عمل العديد من روَّاد الحوسبة على تسهيل عمل المبرمج وتقليل الأخطاء التي يقع فيها. وقاموا بذلك من خلال تطوير وتعديل منهجية البرمجة ولُغات البرمجة، وتصميم نظم تشغيل متطورة. وبدأت ابتكاراتهم بمبادئ هيكلية للوحدات النمطية في آلات الخمسينيات من القرن العشرين، مما جعل المُفكرين الحوسبيين يُفكرون بشكلٍ متزايد في الروتينات الفرعية، ووحدات الماكرو التي تختصِر أجزاء الكود المُستخدَمة بشكلٍ مُتكرر، والوحدات النمطية المحولة برمجيًّا بشكلٍ منفصل، وبرامج الربط التي تضع الوحدات النمطية المحولة برمجيًّا المُترجَمة في برامج كاملة، ومكتبات الوحدات النمطية الجاهزة القابلة للتنفيذ، ونظم التحكُّم في الإصدارات التي تتبع جميع الوحدات النمطية للبرامج التي يُنشئها فريق من المبرمِجين ويُعدلونها. ساعدت جميع هذه الأدوات في إدارة تعقيدات البرامج وتقليل أخطائها.
مع تزايُد معرفة مصمِّمي اللغات البرمجية بممارسات البرمجة، طوَّروا لغات برمجة عالية المستوى، مثل «فورتران» و«كوبول» حوالي عام ١٩٥٨. سمحت هذه اللُّغات للمُبرمِجين بصياغة عبارات الخوارزمية التي يتمُّ ترجمتُها تلقائيًّا بواسطة برنامج التحويل البرمجي إلى تعليمة آلة؛ مما خفَّف عن المُبرمِجين عبء البرمجة المباشرة لتعليمة الآلة. وعندما رأى مُصمِّمو اللغات أن المُبرمِجين غالبًا ما يبدءون بتصميم هياكل البيانات ثم مجموعة صغيرة من الروتينات الفرعية التي تقوم بعمليات على الهياكل، أعلنوا ممارسة «تجريد البيانات». ومع الوقت، تطوَّر تجريد البيانات إلى لُغات البرمجة الموجهة للكائنات. وأصبح تجريد البيانات سمةً رئيسية أخرى من سِمات التفكير الحوسبي؛ فهو يخفي الآليات الداخلية لمكوِّنات البرنامج، بينما يسمح باستخدام هذه المكوِّنات من خلال واجهات مُعرَّفة جيدًا. ويمكن للمبرمجين، بالاستعانة بتجريد البيانات، أن يركِّزوا بسهولة أكبر على ما تفعله المُكوِّنات بدلًا من التركيز على آلية عمل هذه المكونات.
ساهم مصمِّمو نُظم التشغيل بمجموعةٍ كبيرة من المبادئ المُهمة في التفكير الحوسبي خلال تلك الحقبة نفسها. تسمح نظم التشغيل لمُستخدِمين مُتعدِّدين بمشاركة جهاز واحد من خلال جدولة الموارد، وحل التعارُضات، وتخصيص الذاكرة بين برامج المُستخدمين، وإرسال مهام الحوسبة المُتعددة إلى المعالجات. وقدَّم مصمِّمو نظم التشغيل فكرة النظام باعتباره «مجتمعًا من العمليات المتعاونة»، حيث إن العملية هي برنامج مُستقل التنفيذ في ذاكرة خاصة لا يُمكن الوصول إليها بواسطة عمليات أخرى، وحيث تنتظِر كل عملية لأداء خدمةٍ مُحددة عند الطلب. ابتكر مُصممو نظم التشغيل الذاكرة الافتراضية لأتمتة عمليات نقل البيانات بين مستويات الذاكرة، ونُظم الملفات لتخزين بيانات المستخدِم وحمايتها، ونظم الرسائل بين العمليات لتبادُل البيانات والطلبات. واخترعوا النواة لتوفير مجموعةٍ من البرامج المِهنية والموثوق بها للغاية لجميع وظائف نظام التشغيل الأساسية. تعزل النواة العمليات وتمنع أن يمتدَّ تأثير الأخطاء التي تقع في أي عمليةٍ إلى عملية أخرى.
يرث التفكير الحوسبي في الوقت الحالي الكثير من المبادئ المُتعلقة بمنهجية البرمجة، بما في ذلك التجزئة إلى وحدات نمطية، والتجريد، وإخفاء المعلومات، والتكوين الهرمي، والتَّكرار وأنماط التصميم، وإدارة الكائنات الرقمية، والتصوُّر، والتحقُّق، وإصلاح الأخطاء. وتتطلَّب هذه الأدوات المفاهيمية مهارةً وخبرة كبيرة في التصميم. وقد ظهر التصميم كأحد مجالات التطوير الرئيسية في الحوسبة؛ وسنتحدَّث عنه بالتفصيل في الفصل السادس. تساعد مبادئ التفكير الحوسبي المُتعلقة باللُّغات والمنهجية ونظم التشغيل جميعًا في زيادة الإنتاجية والحدِّ من الأخطاء أو القضاء عليها كليًّا.
أصبح العديد من هذه الممارسات راسخًا جدًّا في التفكير الحوسبي لدرجة أنَّ مُستخدمي التفكير الحوسبي في حلِّ المشاكل اعتبروها من أساسياته. وقد أكملت هذه التطوُّرات الهندسية الجانب الرياضي للبرمجة، والذي ركَّز في تلك الأيام على هيكلة البرامج لتسهيل إثبات صحَّتها شكليًّا، كما ركَّز على ممارساتٍ معينة مثل استخدام التَّكرار.
(٤) أزمة تطوير البرمجيات
لماذا ظهرت أزمة البرمجيات مع كلِّ هذه التطوُّرات في التفكير الحوسبي؟ في حوسبة الخمسينيات من القرن العشرين، كانت الآلة هي المُنتَج. ولم تكن البرمجيات — مثل برامج التحكُّم في الآلات — شيئًا يُعبَّأ ويُباع. وركز معظم المُبرمِجين على برامج لاستخدامهم الشخصي أو لاستخدام مجموعات العمل القريبة جدًّا منهم، ولكنهم لم يهتمُّوا بإنشاء برامج للاستخدام خارج مؤسَّساتهم. ومن ثَمَّ، أدَّت أدوات التفكير الحوسبي الخاصة ﺑ «البرمجة على نطاق الأفراد» إلى دعم الاستخدام الشخصي جيدًا، ولكنها لم تدعم التطوير على نِطاق واسع للمُنتجات البرمجية المعقدة.
بدأت صناعة البرمجيات في التطوُّر من عددٍ قليل من مقاولي البرمجيات في الخمسينيات إلى مُطوِّري البرمجيات المؤسسية في الستينيات، ثم إلى البرمجيات الجاهزة للبيع في السبعينيات وما بعدها. وفي كل عَقدٍ من هذه العقود، نمت إيرادات صناعة البرمجيات عشرة أضعاف.
في ستينيات القرن العشرين، اكتشف مُطورو البرامج أن بيع البرمجيات ليس بالأمر السهل. إذ كان الكثير من مشروعات البرمجيات إما يتأخَّر تنفيذُه، أو يتجاوز الميزانية المُحددة له، أو يكون مليئًا بالثغرات البرمجية والأخطاء لدرجة عدم جدواه، أو لا يتمُّ تسليمُه على الإطلاق. كذلك كانت صيانة البرامج وتحسينها وإصلاح الأخطاء الموجودة فيها بعد التسليم أمرًا مُكلفًا وصعبًا، وفي بعض الأحيان غير مُجدٍ. واحتوت نظم البرمجيات في كثيرٍ من الأحيان على أخطاء برمجية كامنة جعلت تطبيقاتها غير آمِنة للبشر أو تسبَّبت في أعطالٍ باهظة الثمن مثل تدمير مركبة الفضاء «مارينر».
غالبًا ما تسبَّب مطورو البرامج الذين لدَيهم معرفة قليلة بمجال العمل المُستهدَف في فجواتٍ كبيرة بين احتياجات العملاء ووظائف نظم الكمبيوتر. ومن ثَمَّ، اكتشف مطورو البرامج أن مبادئ التصميم المعروفة لم تكن كافيةً لتوفير برامج موثوق بها وآمنة ويمكن الاعتماد عليها وسهلة الاستخدام. وأدرك المبرمجون المحترفون أن مهاراتهم في التفكير الحوسبي لم تصِل إلى المستوى المطلوب؛ إذ إن هناك اختلافًا نوعيًّا بين برنامج كَتبه مبرمج واحد ونظام يتطلَّب فريقًا من ٣٠٠ مبرمج.
حاولت شركات البرمجيات تقليل هذه المشكلات بطريقتَين. الأولى: هي توظيف مُبرمجين ذوي مهارات كبيرة، يُمكنهم إنتاج كَمياتٍ أكبر بكثير من التعليمات البرمجية يوميًّا، بأقل عدد من الأخطاء مقارنة بالمُبرمِجين المبتدئين. وارتفعت رواتب المبرمِجين المهَرة، وأصبح تطوير البرامج من أعلى المِهن أجرًا في الولايات المتحدة.
أما الطريقة الثانية: فهي التخلِّي عن مسئولية الأخطاء. تبنَّت شركات البرمجيات سياسة «عدم الضمان»؛ حيث يُرخَّص البرنامج للمُستخدِم فقط بعد موافقته على أن الشركة لن تتحمَّل المسئولية عن الأضرار الناجمة عن الأخطاء في التعليمات البرمجية. ساهمت هذه السياسة بشكلٍ كبير في إصابة الجمهور بخيبة أمَل في ثورة الكمبيوتر.
اعترف مُطوِّرو البرامج الرائدون أن أدوات البرمجة على نِطاق الأفراد لم تكن ببساطةٍ كافيةً للبرمجة على نطاق المجموعات. فقد وصلوا إلى مرحلةٍ أصبح فيها من الصعب إنشاء برامج موثوق بها بالأدوات المُتوفرة. وأعلن عددٌ من الشخصيات الرائدة في صناعة البرمجيات والأكاديميين ومُطوري البرامج عن أزمةٍ في مجال البرمجيات، ونظَّموا مؤتمرَين تحت رعاية منظمة حلف شمال الأطلسي (الناتو) في عامَي ١٩٦٨ و١٩٦٩ لحلِّ هذه الأزمة.
(٥) التفكير الحوسبي على نطاق المجموعات
ماذا يحدث عندما ننتقل من برامج فردية ذات مُستخدِمين فرديِّين إلى نُظم مكوَّنة من العديد من البرامج التي يستخدمها العديد من المُستخدمين؟ المهارات والقدرات المطلوبة لكتابة برنامج مكوَّن من ألف سطر من التعليمات البرمجية تختلف عن تلك اللازمة لإنشاء برنامج يتكوَّن من مليون سطر. والسبب الرئيسي وراء هذا الاختلاف هو أن نُظم البرمجيات الكبيرة يجِب إنشاؤها من قِبَل فرق عمل. وكان على مطوِّري البرامج تعلم كيفية تنظيم الفِرق وإدارتها للنجاح في تطوير البرامج.
كان فريد بروكس مدير فريق مؤلَّف من ٣٠٠ مبرمج أنشَئوا نظام التشغيل «آي بي إم ٣٦٠» في الستينيَّات من القرن العشرين. وأصبح نظامهم في النهاية مكوَّنًا من ١٠ ملايين سطر من التعليمات البرمجية. وقد وثَّق بروكس تجرِبته بالتفصيل في كتابه «خرافة شهر العمل» (١٩٧٥) وأعطى روتينًا قائمًا على التجرِبة العملية للتفكير الحوسبي لتصميم النظم الكبيرة وتنظيمها. إحدى ملاحظاته الشهيرة هي أن زيادة عدد الأشخاص لا يعني بالضرورة تقليل الوقت بالنسبة نفسها؛ فالفريق المكوَّن من ١٢ مبرمجًا لا يستطيع في شهرٍ واحد إكمال وظيفة استغرقت من مبرمج واحد ١٢ شهرًا لتنفيذها. ملاحظة أخرى هي أن هيكل البرنامج يتماثل في النهاية مع الهيكل التنظيمي للمؤسسة التي أنشأته. وخلص بروكس إلى أن إدارة الفريق كانت تحديًا أكبر من مشكلات التقنية التي يتعيَّن على الفريق حلُّها.
على الرغم من اتفاق الحضور في مؤتمرَي الناتو على وجود «مشكلة برمجيات» كبيرة وأن مبادئ الهندسة قد تساعد في حلِّ هذه المشكلة، فإنهم لم يتَّفقوا على نوع الهندسة الذي سيؤدي المهمة. اعتقد المهندسون التقليديون أن الحل هو التصميم القائم على تحمُّل الأخطاء، وفكر المنظومة، وإدارة المشروعات. أما علماء الكمبيوتر المُهتمون بالنظريات، فتطلَّعوا إلى البرهان الرياضي (التحقُّق الشكلي) لتحديد ما إذا كانت البرامج تفي بمواصفاتها دون أخطاء، وقدَّموا أساليب مثل البرمجة المُهيكلة وتحليل الخوارزميات لتسهيل فَهم البرامج والتحقُّق منها.
لم يؤثر أيٌّ من هذَين النهجَين بشكلٍ كبير على مشكلة البرمجيات. لم تنجح هندسة النظم التقليدية بسبب وجود فرقٍ كبير بين البرمجيات والنظم الكبيرة الملموسة، مثل الكباري والمباني والطائرات والسفن؛ فقد يؤدي خطأ في بت واحدٍ من التعليمات البرمجية إلى كارثة مُحقَّقة مثل تحطُّم صاروخ، في حين أن فقدان جزء صغير من المادة قد يؤدي إلى الحطِّ من قيمة نظام كبير ولكن لن يتسبَّب في تحطُّمه. لم ينجح البرهان الرياضي لأنه كان صعبًا للغاية بالنسبة إلى النظُم الكبيرة، ولم يقل شيئًا عن الجوانب البشرية مثل سهولة الاستخدام، كما لم يتعامل مع أعطال الأجهزة مثل تعطُّل مُكوِّن من مُكوِّنات الكمبيوتر أو الضوضاء التي تفسد الإشارات. كان رائدا البرمجيات برايان رانديل وفريد بروكس من بين الأكثر بصيرةً وبُعدًا للنظر في شرح سبب صعوبة نظم البرمجيات. قال رانديل إن المشكلة لم تكن البرمجة في حدِّ ذاتها، بل «التطوير المُتعدِّد الأشخاص لبرامج مُتعددة الإصدارات». وقال بروكس في كتابه الذي صدر عام ١٩٧٥ إن مسألة تحويل البرنامج إلى مُنتَج من خلال تحويله إلى نظامٍ يمكن لغير المُبرمِجين استخدامه بأمانٍ وبشكل موثوق به كانت أكثر تحديًا بكثيرٍ من كتابة البرنامج في المقام الأول.
(٦) مبادئ التصميم والأنماط والتلميحات
لقد أصبح هذا الإهدار موجودًا دائمًا ويُمثل نقصًا خطيرًا في حسِّ الجودة. ويمكن بسهولة إخفاء عدم كفاءة البرامج عن طريق الحصول على مُعالجات أسرع وإخفاء التصميم السيئ للبيانات باستخدام أجهزة تخزين أكبر. ولكن آثارها الجانبية هي انخفاض الجودة؛ بعبارةٍ أخرى: الموثوقية والمتانة وسهولة الاستخدام. إن التصميم الجيد والدقيق يستغرِق وقتًا طويلًا ومُكلفًا. ولكنَّه لا يزال أرخص من البرمجيات غير الموثوق بها وصعبة الاستخدام، عندما نضع في اعتبارنا تكلفة «الصيانة». وكما أن الوضع مُزعج، فإن لا مبالاة العملاء أيضًا مُزعجة. (فيرت ٢٠٠٨)
لُخِّصَت أهداف البرمجة على نِطاق المجموعات في خمسة أهداف: إمكانية الاعتماد عليها، والموثوقية، وقابلية الاستخدام، والسلامة، والأمن. ولتحقيق هذه الأهداف، يستخدِم مطوِّرو البرامج ثلاثة أنواع من مُمارسات التفكير الحوسبي: مبادئ التصميم، والأنماط، والتلميحات.
مبادئ التصميم هي وصفٌ للمهارات والاستراتيجيات التي يتبعها المُطوِّرون عند اتخاذ قرارات التصميم. تُوجههم المبادئ نحو تصميماتٍ تُلبي الأهداف الخمسة.
أنماط التصميم هي وصف للمواقف الشائعة التي مِن المُحتمَل أن يُواجهها المبرمج. وتقدِّم توجيهاتٍ حول كيفية هيكلة البرنامج أو عملية كتابته للحصول على أفضل النتائج.
تلميحات التصميم هي قواعد إرشادية أو نصائح، تكون مُفيدة للغاية لأصحاب المهارات المُتقدمة في تطوير النظم.
المبادئ
المبدأ | التوجيه |
---|---|
الاقتصاد في الآلية | إبقاء التصميم بسيطًا وصغيرًا. |
الإعدادات الافتراضية لضمان السلامة عند حدوث أعطال | رفض الوصول افتراضيًّا؛ وعدم منح إمكانية الوصول إلا بعد الحصول على إذن صريح. |
الوساطة الكاملة | فحص كل عمليات الوصول إلى كل الكائنات. |
التصميم المفتوح | عدم الاعتماد على جهل المُهاجِمين بالتصميم. |
فصل الصلاحيات | منح إمكانية الوصول بناءً على أكثر من معلومة واحدة |
أقل صلاحيات | إجبار كل عمليةٍ على العمل بأقل امتيازاتٍ ضرورية لمُهمتها. |
أقل آلية مشتركة | جعل المعلومات المُشتركة غير قابلة للوصول من قِبَل العمليات الفردية لتجنُّب تلفِها. |
التقبُّل النفسي | جعل إعدادات الحماية سهلة الاستخدام، على الأقل بالقدْر نفسه من سهولة عدم استخدامها. |
الأنماط
التلميحات
الصحة والملاءمة | السرعة | تحمل الأخطاء | |
---|---|---|---|
حالات الاستخدام | افصل سيناريوهات الحالات المعتادة عن الحالات الأكثر تطرفًا. | اهتمَّ بالسلامة أولًا. | اجعلِ التنفيذ عبر النظام بأكمله (من الطرف إلى الطرف). |
خفِّف الحمل. | |||
اجعلِ التنفيذ عبر النظام بأكمله (من الطرف إلى الطرف). | |||
الواجهة | احرِص على أن تكون الواجهة بسيطة. | اجعلِ الواجهة سريعة. | اجعلِ التنفيذ عبر النظام بأكمله (من الطرف إلى الطرف). |
ركِّز على شيءٍ واحد وأتقِن تنفيذه. | قسِّم الموارد. | أنشئ سجلًّا بالتحديثات. | |
ابتعِد عن التعميمات، وتعامل مع الاحتياجات الفردية. | استخدِم مبدأ التحليل الثابت وأجْرِ عمليات التحقق في وقت تجميع البرنامج لاكتشاف الأخطاء مبكرًا. | تأكَّد من تنفيذ كلِّ الإجراءات معًا أو عدم تنفيذها لضمان الاتساق. | |
اجعلِ الأولوية لدقَّة التصميم وصحَّته. | ترجِم التعليمات البرمجية ترجمةً ديناميكية للإسراع من التنفيذ. | ||
اجعلِ الميزات الفعالة واضحة أمام المستخدِمين، ولا تُبالِغ في التبسيط. | |||
استخدم وسائط الإجراءات لزيادة المرونة. | |||
اتركِ الأمر للعميل، ولا تفرِضْ أوضاعًا افتراضية. | |||
حافظ على استقرار الواجهة وتجنَّبِ التغييرات المتكررة. | |||
احتفِظ بأساسٍ ثابت لموثوقية الاستخدام والتطوير. | |||
التنفيذ | توقَّع إعادة التصميم أو إعادة هيكلته. | خزِّن نتائج العمليات المُهمة لتجنُّب تكرار عمليات الحوسبة. | تأكَّد من تنفيذ كلِّ الإجراءات معًا أو عدم تنفيذها لضمان الاتساق. |
أوجِز في التفاصيل. | استخدم التلميحات | استخدم التلميحات. | |
أَعِدِ استخدام الحلول الجيدة متى كانت ملاءمة | استخدِمِ الحلول البسيطة المباشرة لأنها أكثر فاعلية من الحلول المعقدة. | ||
قسِّمِ المشكلات المعقدة إلى أجزاء أبسط. | انقل المهام إلى الخلفية لضمان سرعة الاستجابة. | ||
استخدم مبدأ المعالجة على دفعات لتقليل العبء الإضافي وزيادة الكفاءة. |
(٧) مبادئ التصميم الخاصة بالبرمجيات
تُسجِّل أدبيات هندسة البرمجيات عددًا كبيرًا من مبادئ التصميم التي دُرِسَت على نطاقٍ واسع ووُجِد أنها تدعم التصميم الجيد بقوة. وقد شُفِّرت أفضل هذه المبادئ على هيئة هياكل تظهر في لُغات البرمجة وبرامج التطبيقات ونُظم التشغيل. وكثيرًا ما تُذْكَر هذه المبادئ في مناقشات التفكير الحوسبي وتكمُن جذورها في العديد من التقاليد الفكرية المُختلفة الموضحة في الفصول السابقة من هذا الكتاب. وتنقسِم إلى ثلاث فئاتٍ رئيسية:
-
التجميع الهرمي
-
الآلات الافتراضية
-
الوحدات التابعة – وحدات الخدمة
تهدف هذه الهياكل إلى المساعدة في الأنماط المُتكررة التي يُواجهها المُصمِّمون.
التجميع الهرمي
يعني التجميع الهرمي أن الكائنات (مكونات البرامج ومكونات الأجهزة المادية المُتعارَف عليها) تتكوَّن من مجموعاتٍ من الكائنات الأصغر مُتصلة من خلال واجهات معرَّفة جيدًا. ويُمكنك التفاعل مع الكائن على أنه وحدة واحدة من خلال واجهته وعدم الاهتمام بأجزائه الفردية. أما عندما تنظر إلى الداخل، فلن تحتاج إلى الاهتمام بما يحدُث في البيئة الخارجية. وبناء عليه، فهناك تسلسُل هرمي مكوَّن من تجمعات أصغر تُشكل تجمُّعات أكبر. وتكون التجمُّعات في كل مستوًى من التسلسُل الهرمي معزولةً عن التفاصيل في المستويات الأدنى والأعلى.
مفهوم «الكائن» هو شكل مُتقدم من أشكال التضمين نشأ من إحدى ممارسات البرمجة التي أُطلِقَ عليها «تجريد البيانات» في الستينيات من القرن العشرين، وتطوَّر حاليًّا إلى أكثر من مائة لغةٍ متطورة موجهة للكائنات. والكائن هو عبارة عن كِيان مجرد لا يمكن عرضه وتعديله إلا من خلال مجموعة مُحددة من العمليات. ويُخفَى هيكله الداخلي وحالته. على سبيل المثال: يظهر الملف للمُستخدِمين كحاوية لسلسلةٍ من وحدات البت، ولا يمكن التعامُل معه إلا من خلال عمليات الفتح والإغلاق والقراءة أو الكتابة، ويكون هيكله الداخلي المَخفي هو مجموعة من السجلَّات المبعثرة عبر قرص. ولا يهم المُستخدِمين هيكلُ الملفِّ في القرص، ومن ثم فهو مَخفي عنهم. أما «فئة» الكائنات، فهي مجموعة من الكائنات ذات الواجهة الواحدة، وتُنظَّم الفئات في تسلسُلٍ هرمي خاصٍّ بها. وغالبًا ما ينزعج المُبرمجون المُبتدئون من الكائنات؛ لأنهم لا يفهمون بعدُ الآلاتِ المُجردةَ وإخفاءَ المعلومات والمزامنة.
الآلات الافتراضية
الآلة الافتراضية هي مُحاكاة لجهاز كمبيوتر بواسطة جهاز كمبيوتر آخر. وقد كان جهاز الكمبيوتر المُتعدد الأغراض الذي ابتكره آلان تورينج هو أول مثالٍ على الآلة الافتراضية. واليوم يُستخدَم مصطلح «الآلة الافتراضية» بعدَّة طرق.
- أولًا: يعني مُحاكاة أي آلة حوسبة مجردة؛ أي إنها المنصَّة التي يمكن تنفيذ عمليات الحوسبة عليها.
- ثانيًا: الآلات الافتراضية هي مُحاكاة لأجهزة الكمبيوتر المادية. وتحتوي الآلة الافتراضية على روتينات فرعية تقوم بنفس وظيفة تعليمات الآلة على جهاز الكمبيوتر المادي. وقد ظهرت هذه الفكرة عمليًّا في أواخر الخمسينيَّات من القرن العشرين عندما بدأ جيل ثانٍ من أجهزة الكمبيوتر يحلُّ محلَّ الجيل الأول. وكان على أجهزة الكمبيوتر الجديدة تشغيل كلِّ البرامج المكتوبة للإصدارات السابقة من جهاز الكمبيوتر. ووَفقًا لذلك، قدمت الشركات المُصنِّعة «وضع محاكاة» يمكن للكمبيوتر الجديد فيه محاكاة تعليمات الكمبيوتر القديم الذي حلَّ محله. وقد تطوَّر وضع المحاكاة في شكل «في إم وير» و«هايبر في»، اللذَين يُحاكيان أجهزة الكمبيوتر بأكملها ويشغِّلان نظم التشغيل الخاصة بها. تحاكي آلات جافا الافتراضية لغة جافا على أي آلةٍ تِجارية عن طريق تنفيذ «تعليمات البايت» المكتوبة بلُغة جافا التي أنتجتها برامج تحويل لغة جافا؛ مما يسمح بقدْر كبير من قابلية تشغيل برامج جافا على أجهزة مُتعدِّدة.
- ثالثًا: الآلات الافتراضية هي محاكاة لآلة مُضيفة داخل أقسام ذاكرة منفصلة للآلة المُضيفة. وهذا هو المبدأ التنظيمي لنظام التشغيل «في إم ٣٧٠» وما بعدَه من نظم التشغيل المطروحة من شركة «آي بي إم». وتُعَد الآلة الافتراضية لشركة «آي بي إم» محاكاةً كاملة لجهاز الكمبيوتر الرئيسي المطروح من قِبل الشركة نفسها، ومطابقة تمامًا للجهاز الأصلي باستثناء أنها تحتوي على ذاكرة رئيسية أقل. ويسمح هذا النهج للآلة الافتراضية بالعمل تقريبًا بنفس سرعة الآلة الحقيقية، ومن ثَمَّ لا يُوجَد تأثير سلبي واضح على الأداء.
- رابعًا: الآلة الافتراضية هي بيئة قياسية لتنفيذ أي برنامج داخل نظام تشغيل. ابتُكرت هذه الفكرة في نظام تشغيل مالتيكس في معهد ماساتشوستس للتكنولوجيا (١٩٦٨) ونظام تشغيل «يونكس» في مختبرات بل (١٩٧٢). تضمَّن هذان النظامان العديد من «العمليات»، كلٌّ منها برنامج قيد التنفيذ على آلة افتراضية. وكانت الآلة الافتراضية ببساطة قالبًا قياسيًّا لتوفير المُدخَلات والمُخرجات لبرنامج قيد التشغيل، والاتصال بأي آلاتٍ فرعية قد تكون انبثقت عنها. وتُدمَج كل برامج المُستخدِمين في الآلة الافتراضية القياسية ليتمَّ تنفيذها.
برامج الوحدات التابعة ووحدات الخدمة
يُعتبر نموذج «الوحدة التابعة – وحدة الخدمة» طريقة بسيطة من الناحية المفاهيمية لتنظيم التفاعُلات بين البرامج في نظام حوسبة موزع (مُتصل عبر الشبكة). فبرنامج وحدة الخدمة هو برنامج مُخصص لتقديم خدمة مُعينة عند الطلب. أما برنامج الوحدة التابعة، فهو برنامج آخر يطلُب هذه الخدمة. عادةً (ولكن ليس دائمًا) تكون الوحدات التابعة ووحدات الخدمة على أجهزة مُضيفة مختلفة مُتَّصلة عبر شبكة. وتمرَّر الطلبات ونتائجها على شكل رسائل عبر الشبكة. على سبيل المثال: تُخزِّن وحدة خدمة ملفات الشبكة جميع مِلفات مستخدمي الشبكة، وترسل برامج الوحدات التابعة المثبَّتة على أجهزة المُستخدِمين طلباتٍ لقراءة الملفات ونسخها. كما تتفاعل وحدة خدمة التوثيق مع برنامج الوحدة التابعة الموجود على جهاز المُستخدِم الذي يرغب في تسجيل الدخول للتحقق من هوية المُستخدِم عند تسجيل دخوله. وتتفاعل وحدة خدمة الويب مع مُتصفحات الوحدات التابعة لإرسال صفحات الويب إليها.
على الرغم من أن فكرة «الوحدة التابعة – وحدة الخدمة» بسيطة، فإن تنفيذها غالبًا ما يكون بعيدًا كل البُعد عن البساطة. ويجِب على المُصمِّمين إتقان العديد من التفاصيل الدقيقة لتتمَّ عمليات الاتصال والتحكُّم في الأخطاء والمزامنة بشكلٍ صحيح.
(٨) لا تُوجَد حلول سهلة
في عام ١٩٨٧، كتب فريدريك بروكس مقاله المُعنوَن «لا توجد حلول سهلة» وذكر فيه تقييمه الشهير لمدى التقدُّم المُحرَز في هندسة البرمجيات منذ عام ١٩٦٨. وحملت النتائج التي توصَّل إليها دروسًا مهمةً تخصُّ التفكير الحوسبي. قال بروكس إن هناك عاملَين رئيسيَّين للتعقيد يؤثران في قُدرتنا على إنتاج برامج موثوق بها.
- العامل الأول: هو محدودية التكنولوجيا، ولكن يمكن التغلُّب على هذا العامل باستخدام التقنيات المُحسَّنة، مثل لُغات البرمجة العالية المستوى، وبيئات تطوير البرامج التفاعُلية، وتصوُّر التحكُّم وتدفُّق البيانات، والأجهزة الأسرع، ونظم التشغيل الأفضل.
- العامل الثاني: هو قدرتنا الذهنية على فهم جوهر المشكلات المعقدة. ويُعَد التعامُل مع التعقيد أمرًا أساسيًّا في تصميم البرمجيات وهيكلتها، ولن يتغيَّر أبدًا. قال بروكس إن مشكلة التصميم هي في الغالِب مشكلة مفاهيمية؛ وهي الفهم العقلي لوظائف النظام من أجل توفير وتنظيم تصميمٍ بسيط وممتاز.
لمواجهة ذلك، نحتاج إلى تطوير النُّظم الكبيرة على مراحل سهلة نسبيًّا، وإعادة استخدام البرامج الحاليَّة قدْر الإمكان، واستخدام المزيد من النماذج الأولية السريعة للحصول على تقارير مُبكرة قبل اتخاذ القرارات التقنية. وقال بروكس إن الأهم من ذلك هو أننا بحاجةٍ إلى «إعداد مُصمِّمين عظماء». وكان يرى أن التعامُل مع التعقيد مهارة أساسية تتطلَّب إتقانًا كبيرًا. ولهذا كتب بروكس مقاله الشهير الذي قال فيه «لا تُوجَد حلول سهلة» لمشكلة التعقيد في تطوير البرمجيات.
العامل الأساسي الذي يكمُن وراء إنشاء برمجيات موثوق بها هو قدرة عقولنا على فَهم جوهر المشكلات المُعقَّدة. ويُعَد التعامُل مع التعقيد أمرًا أساسيًّا في تصميم البرمجيات وهيكلتها، ولن يتغيَّر أبدًا.
كانت «مشكلة البرمجيات» التي أُثِيرت في مؤتمرَي الناتو تخصُّ في الغالب إنتاجية المُبرمِجين ووجود أخطاء في البرامج تتسبَّب في عدم موثوقيتها. ومنذ تلك الأيام، أضافت التطوُّرات الجديدة إلى تعقيدات تصميم البرمجيات. ومن هذه التعقيدات:
- البرامج الضارَّة وعمليات الاختراق: يبحث المُجرمون والمخترقون عمدًا عن ثغراتٍ في البرامج المُعقدة، ويستغلُّونها لسرقة البيانات أو إتلافها، أو للمُطالبة بفدية لإلغاء تشفير البيانات المُشفرة عمدًا.
- تحمُّل الأخطاء: حتى إذا ثبتت صحة البرنامج، فإن هذا الإثبات قائم على افتراض أن الأجهزة المادية تعمل دائمًا كما هو مُتوقَّع منها. وفي الوقت الحالي، الأجهزة نفسها مُعقدة للغاية لدرجة أن إثبات أنها تعمل بشكلٍ سليم يُمثل تحديًا كبيرًا في حدِّ ذاته. وقد اكتُشفت العديد من مشاكل الأجهزة في الشرائح التي يُفترَض أنها مُختبرة جيدًا. ليس ذلك فحسب، بل يمكن أن تتلف الأجهزة وتبدأ في التعطُّل بسبب تعطُّل مكوناتها أو بسبب أحداثٍ غير متوقَّعة في العالَم تؤدي بها إلى حالة من عدم الاستقرار. ولذا أصبح مهندسو الأجهزة مُهتمِّين بشكلٍ متزايد بالتصميمات التي تضمن تحمُّل الأخطاء؛ على سبيل المثال: النظام الذي يُغلِق نفسه بدلًا من تنفيذ عمليةٍ حرجة بشكل غير صحيح. ولا يمكن تنفيذ هذا النوع من تحمُّل الأخطاء في الأجهزة، والذي يتضمَّن دوائر إضافية يُراقب بعضها البعض، بأي هيكل برمجي. وإثبات صحة البرمجيات ليس كافيًا لضمان التشغيل الصحيح.
-
تأمين الأجهزة: تحدُث معظم الهجمات على نظم
الكمبيوتر على أدنى مستويات النواة
والشبكة، حيث يكون من الصعب للغاية
إجراء مراقبة ديناميكية فعالة. وفي
الستينيات من القرن العشرين، كان
هناك اهتمام كبير بتصميم الأجهزة
الذي من شأنه تسهيل حماية
المعلومات عن طريق الحد من انتشار
الأخطاء وإحباط المحاولات البرمجية
لتجاوز الأذونات. ومن ثَمَّ،
صُمِّمَت هياكل متقدِّمة للغاية
للتمكن من تضمين البرامج غير
الموثوق بها والحد من انتشار
الأخطاء بشكل كبير.
لسوء الحظ، فُقدت هذه التطوُّرات في خضمِّ «ثورة أجهزة الكمبيوتر ذات التعليمات المُخفَّضة» التي اندلعت في الثمانينيات من القرن العشرين. فمن أجل إنشاء وحدات معالجة مركزية أسرع، أزال مُصمِّمو الكمبيوتر مئات التعليمات من وحدات المعالجة المركزية؛ مما قلَّل حجمَها إلى شرائح بسيطة للغاية وسريعة جدًّا. وأطلقوا على الجيل الجديد من الشرائح أجهزة الكمبيوتر ذات التعليمات المُخفَّضة. وأدى تخفيض التعليمات إلى عدم إضافة مُلحقات لتضمين البرامج ومراقبتها.
يُطالب خبراء التأمين حاليًّا بزيادة مراقبة الأجهزة لمنع هجمات المُستوى الأدنى التي تُنفذها البرامج الضارَّة والمُتسلِّلون. وبالفعل، أصبح تأمين الأجهزة في غاية الأهمية في الوقت الحالي. ومِن العوامل المُثيرة للقلق أن العديد من الشركات يستعين بمصادر خارجية لإنتاج شرائح أجهزة الكمبيوتر الخاصة بها؛ مما يُتيح للغير إمكانية إضافة نقاطٍ خفية للوصول إلى الأجهزة، ويسمح للمُتسلِّلين بالوصول إلى النظام بسهولة.
- خوارزميات تعلُّم الآلة: يُعزى التطور الأخير المُبهر في مجال الذكاء الاصطناعي بشكلٍ أساسي إلى النمو السريع في تقنيات الشبكات العصبية. عند الانتهاء من عملية تدريب الشبكة العصبية، لا أحد يعرِف السبب في أن القِيَم المُرجَّحة للاتصالات الداخلية تكون على ما هي عليه أو كيفية إثبات صحَّة الشبكة بالنسبة إلى الإدخالات التي لم تتدرَّب عليها. وبالمِثل، لا توجَد عمليات مراقبة للأجهزة للكشف عن التعطُّل الوشيك للشبكة العصبية. وقد أُطلِق على ذلك اسم «مشكلة الهشاشة»: إلى أي مدًى يُمكننا الوثوق بالذكاء الاصطناعي في أن يُحسِن التصرُّف عند تعرُّضه لمدخلات خارج نِطاق البيانات التي تدرَّب عليها؟
- السلامة: يُستخدَم العديد من نظم البرامج في التطبيقات التي تُمثل فيها السلامة أهمية قصوى، حيث يمكن أن يؤدي خطأ في البرامج إلى خسارة فادحة في الأرواح أو المُمتلَكات.
- الإنتاج الضخم لبرامج التطبيقات المتنوِّعة: تختلف اليوم تطبيقات الهواتف المحمولة والألعاب وأدوات أجهزة سطح المكتب والنُّظم المُستنِدة إلى الشبكة كثيرًا عن برامج الستينيات والسبعينيات من القرن العشرين. فقد كان من النادر الاستعانة بمصادر خارجية موثوق بها لتطوير البرمجيات. ولم تكن هناك شبكات كبيرة من مطوِّري التطبيقات الذين يبيعون من خلال متاجر التطبيقات قبل أوائل الألفينيات، أما الآن فمتاجر «أبل» و«أندرويد» تعرِض ملايين التطبيقات.
يواجه التفكير الحوسبي باستمرار تحديات فيما يخصُّ تطوُّرَه وتعامُلَه مع هذه المشاكل المعاصرة.