برمجة

التاريخ

كانت الأجهزة القابلة للبرمجة موجودة على الأقل منذ عام 1206 ميلادي عندما كانت أوتوماتيكي الجزاري قابلة للبرمجة عبر الأوتاد والكامينات للعب مختلف الإيقاعات وأنماط الطبل؛  ويمكن لجهاز jacquard loom سنة 1801 انتاج موجات مختلفة عن طريق تغير برمجته - سلسلة من بطاقات اللوح مع ثقوب مثقوبة فيها. 
ومع ذلك يرجع تاريخ أول برنامج كمبيوتر إلى عام 1843 عندما قامة عالمة الرياضيات أدا لوفليس بنشر خوارزمية لحساب سلسلة من أرقام برنولي يهدف إلى تنفيذها بواسطة تشارلز باباج عن طريق محرك تحليلي.  
في الثمانينات من القرن التاسع عشر اخترع هيرمان هوليريث مفهوم تخزين البيانات في شكل قابل للقراءة آليا.  في وقت لاحق سمحت لوحة التحكم ( لوحة التوصيل) التي تمت إضافتها إلى لوحة Type I Tabulator 1906 الخاصة به ببرمجة وظائف مختلفة وبحلول أواخر الأربعينيات من القرن الماضي تمت برمجة معدات تسجيل الوحدات مثل IBM 602 و IBM 604 بواسطة لوحات التحكم بطريقة مماثلة. كما كانت هي أول أجهزة الكمبيوتر الإلكترونية. وكذلك مع مفهوم أجهزة الكمبيوتر المخزنة في البرنامج التي أدخلت في عام 1949 تم تخزين كل من البرامج والبيانات ومعالجتها بنفس الطريقة في ذاكرة الكمبيوتر.  
كانت شفرة الآلة هي لغة البرامج المبكرة وهي مكتوبة في مجموعة التعليمات الخاصة بالجهاز المحدد وغالبًا ما تكون بترميز ثنائي. سرعان ما تم تطوير لغات التجميع والتي تتيح للمبرمج تحديد التعليمات بتنسيق نصي (على سبيل المثال ADD X TOTAL) مع اختصارات لكل رمز تشغيل وأسماء ذات معنى لتحديد العناوين. ومع ذلك نظرًا لأن لغة التجميع ليست أكثر من مجرد ترميز مختلف للغة الآلة فإن أي جهازين لهما مجموعات تعليمات مختلفة لهما أيضًا لغات تجميع مختلفة. 
جعلت اللغات الرفيعة المستوى عملية تطوير البرنامج أكثر بساطة وأكثر قابلية للفهم وأقل ارتباطًا بالأجهزة الأساسية. FORTRAN أول لغة عالية المستوى تستخدم على نطاق واسع لتنفيذ عملي خرجت في عام 1957  وتم تطوير العديد من اللغات بعدها - على وجه الخصوص COBOL يهدف إلى معالجة البيانات التجارية و ليسب لأبحاث الكمبيوتر. 
معظم البرامج كانت لا تزال تدخل باستخدام بطاقات مثقوبة أو شريط ورقي . بحلول أواخر الستينيات أصبحت أجهزة تخزين البيانات وأجهزة الكمبيوتر غير مكلفة بما يكفي بحيث يمكن إنشاء البرامج عن طريق الكتابة مباشرة على أجهزة الكمبيوتر. تم تطوير برامج تحرير النصوص التي تتيح إجراء تغييرات وتصحيحات بسهولة أكبر من البطاقات المثقوبة.

لغات البرمجة

تجدر الإشارة هنا إلى التذكير بمعنى كلمة لغة وهي طريقة الاتصال والتفاهم بين الأشخاص أو لنقل في حالة الحاسوب الطريقة التي يفهم بها الحاسوب طلب الإنسان. لذلك نجد في حياتنا مجموعة مصطلحات وكلمات يختلف استخدامها حسب الحاجة. لغات البرمجة المختلفة تتمتع بهذه الخاصية أيضا. فهناك الكثير من اللغات البرمجية الموجودة وهذه اللغات تختلف من ناحية عملها وهدفها ولكن في النهاية كل هذه اللغات تترجم إلى لغة الآلة 0 و1.
لذلك يجب على المبرمج أن يكون ملما ببعض لغات البرمجة وأن يعرف ما هي اللغة المناسبة لتطبيق هذا البرنامج.
لغة البرمجة الوحيدة التي يفهمها الحاسوب ويستطيع أن يتعامل معها هي لغة الآلة -machine language-. في البداية عمل المبرمجون على تحليل شيفرة الحاسوب –machine code- والتعامل معها بشكلها الجامد وغير المفهوم وهو (0،1). ولكن هذه العملية معقدة جدا ويصعب التعامل معها لعدم فهمها الواضح للبشر ولغموضها لذلك تم ابتكار لغات راقية تعمل كوسيط بين لغة الإنسان ولغة الآلة وهي لغة التجميع اسمبلي Assembly ثم تطورت للغات عالية المستوى مثل لغة السي ولغة البيسيك. ثم يتم تشغيل البرامج المكتوبة بهذه اللغات عن طريق أحد البرامج المتخصصة مثل المترجم والمصرف. هذه البرامج تعمل على ترجمة أسطر لغة البرمجة إلى لغة الحاسوب مما يسهل على الحاسوب تنفيذ هذه الأوامر وإخراج نتائج التنفيذ الواضحة.

التعقيد الخوارزمي

يهتم المجال الأكاديمي والممارسة الهندسية لبرمجة الكمبيوتر إلى حد كبير باكتشاف وتنفيذ الخوارزميات الأكثر كفاءة لفئة معينة من المشكلات.
لهذا الغرض يتم تصنيف الخوارزميات في أوامر باستخدام ما يسمى  Big O notation والذي يعبر عن استخدام الموارد مثل وقت التنفيذ أو استهلاك الذاكرة من حيث حجم المدخلات. المبرمجين الخبراء على دراية بمجموعة متنوعة من الخوارزميات الراسخة والتعقيدات الخاصة بكل منها ويستخدمون هذه المعرفة لاختيار الخوارزميات الأكثر ملاءمة للظروف.

خوارزميات الشطرنج كمثال

كانت "برمجة كمبيوتر للعب الشطرنج" في سنة 1950 عبارة عن ورقة تحمل خوارزمية "minimax" والتي هي جزء من تاريخ الخوارزميات المعقدة.
دورة "IBM Deep Blue" (شطرنج الحواسيب) هي جزء من البرنامج التعليمي لشعبة علوم الحاسوب بجامعة ستانفورد.

المنهجيات

الخطوة الأولى في معظم عمليات تطوير البرمجيات الرسمية هي تحليل المتطلبات يليه اختبار لتحديد نمذجة القيمة والتنفيذ وإزالة الأعطال (تصحيح الأخطا(Debugging)). هناك الكثير من الأساليب المختلفة لكل مهمة من هذه المهام. أحد الأساليب الشائعة لتحليل المتطلبات هو استخدام تحليل الحالة. يستخدم العديد من المبرمجين أشكالًا لتطوير برامج Agile حيث يتم دمج المراحل المختلفة لتطوير البرامج الرسمية معًا في دورات قصيرة تستغرق عدة أسابيع بدلاً من سنوات. هناك العديد من الطرق لعملية تطوير البرمجيات. 
تتضمن تقنيات النمذجة الشائعة التحاليل والتصاميم الخاصة  بالتوجيه الكائناتي ( OOAD ) أو الهندسة القائمة على النماذج ( MDA ). 
لغة النمذجة الموحدة ( UML ) هي ترميز يستخدم لكل من OOAD و MDA.

قياس استخدام اللغة

من الصعب جدًا تحديد أكثر لغات البرمجة الحديثة شيوعًا. تتضمن طرق قياس شعبية لغة البرمجة ما يلي: حساب عدد إعلانات الوظائف التي تذكر اللغة  عدد الكتب المباعة والدورات التعليمية التي تدرس اللغة (هذا يبالغ في تقدير أهمية اللغات الأحدث) وتقديرات عدد الخطوط الحالية من الشفرة المكتوبة باللغة (هذا يقلل من عدد مستخدمي لغات العمل مثل COBOL). 
تحظى بعض اللغات بشعبية كبيرة لأنواع معينة من التطبيقات بينما تستخدم بعض اللغات بانتظام لكتابة العديد من أنواع التطبيقات المختلفة. على سبيل المثال لا يزال COBOL قويًا في مراكز بيانات الشركات  غالبًا على أجهزة الكمبيوتر الكبيرة و Fortran في التطبيقات الهندسية ولغات البرمجة النصية في تطوير الويب و C في البرامج المدمجة. تستخدم العديد من التطبيقات مزيجًا من عدة لغات في بنائها واستخدامها. يتم تصميم اللغات الجديدة عمومًا حول لغة سابقة مع إضافة وظيفة جديدة (على سبيل المثال يضيف C ++ اتجاه الكائناتي (OPP) إلى C ويضيف Java إدارة الذاكرة والرمز الثانوي إلى C ++ ونتيجة لذلك يفقد الكفاءة والقدرة على التلاعب بالبيانات على مستوى منخفض )

التنقيح

يتعد عملية تصحيح الأخطاء مهمة مهمة للغاية في عملية تطوير البرامج حيث أن وجود عيوب في أحد البرامج قد يكون له عواقب وخيمة على مستخدميه. تكون بعض اللغات أكثر عرضة لبعض أنواع الأخطاء لأن مواصفاتها لا تتطلب من المترجمين(compilers) أن يقوموا بالتحقق على قدر اللغات الأخرى. يمكن أن يساعد استخدام أداة تحليل الشفرة الثابتة في اكتشاف بعض المشكلات المحتملة. عادةً ما تكون الخطوة الأولى في تصحيح الأخطاء هي محاولة إعادة إنشاء المشكلة. قد تكون هذه مهمة غير تافهة على سبيل المثال مع العمليات المتوازية أو بعض الأخطاء البرمجية غير المعتادة. أيضًا يمكن أن تجعل بيئة المستخدم ومحفوظات الاستخدام من الصعب إعادة إنتاج المشكلة.
بعد إعادة إنتاج الخلل قد يحتاج الأمر إلى تبسيط إدخال البرنامج لتسهيل تصحيحه. على سبيل المثال يمكن أن يؤدي وجود خطأ في برنامج التحويل البرمجي إلى تعطله عند تحليل بعض ملفات المصدر الكبيرة. ومع ذلك بعد تبسيط حالة الاختبار يمكن أن تكون الأسطر القليلة فقط من الملف المصدر الأصلي كافية لإعادة إنتاج نفس التعطل. يمكن إجراء هذا التبسيط يدويًا باستخدام نهج الفجوة والقهر. سيحاول المبرمج إزالة بعض أجزاء حالة الاختبار الأصلية والتحقق من استمرار المشكلة. عند تصحيح المشكلة في واجهة المستخدم الرسومية يمكن للمبرمج محاولة تخطي بعض تفاعلات المستخدم من وصف المشكلة الأصلي ومعرفة ما إذا كانت الإجراءات المتبقية كافية لظهور الأخطاء. 
غالبًا ما يتم تصحيح الأخطاء باستخدام بيئة تطوير متكاملة مثل إكليبس و Visual Studio و إكس كود  و Kdevelop و NetBeans و Code :: Blocks. يتم استخدام مصححات الأخطاء المستقلة مثل GDB أيضًا وغالبًا ما توفر هذه الأجهزة بيئة بصرية أقل وعادة ما تستخدم سطر أوامر. تسمح بعض برامج تحرير النصوص مثل Emacs باستدعاء GDB من خلالهم لتوفير بيئة بصرية.