أجهزة الكمبيوتر شبابيك إنترنت

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

ما الذي يجب أن يعرفه مبرمج 1C المبتدئ؟

في هذه المقالة سنلقي نظرة على النقاط الرئيسية التي يجب أن يعرفها مبرمج 1C المبتدئ. قد يكون هذا مفيدًا أيضًا لأولئك الذين يستخدمون 1C:Enterprise ويعتزمون القيام بذلك بأنفسهم، دون دعم خارجي.

لنبدأ بالتعريفات:

منصة 1C: المؤسسة –هذه هي بيئة البرامج الأساسية التي تعمل عليها حلول التطبيقات (التكوينات). المنصة هي الأساس الذي يعمل به المبرمجون ويبتكرون حلولاً جاهزة للمستخدمين النهائيين.

إعداداتهو برنامج (حل تطبيقي) تم تطويره على أساس منصة 1C:Enterprise ومصمم لأتمتة مهام الإدارة والمحاسبة في مجال معين من النشاط.

التكوينات الأساسية 1C

بالنسبة للمبرمج المبتدئ، من المهم معرفة تكوينات 1C الأساسية التي تعمل بها معظم الشركات.

تكوينات 1C النموذجية الأكثر شيوعًا قليلة - أقل من عشرة. يجب على متخصص البرمجة أن يفهم بوضوح الفرق بين التكوينات حتى يتمكن من فهم البيانات المخزنة في البرنامج وكيفية معالجتها.

على سبيل المثال، 1C: تم تصميم المحاسبة لأتمتة العمليات المحاسبية في المؤسسة وتسمح لك بالاحتفاظ بالسجلات وفقًا لمتطلبات الهيئات التنظيمية في الاتحاد الروسي.

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

لأتمتة محاسبة المستودعات والمشتريات والمحاسبة المالية وإعداد التقارير التشغيلية، يتم استخدام 1C: إدارة التجارة. غالبًا ما يتم تعديل منتج البرنامج هذا ليناسب احتياجات الشركة.

1C: البيع بالتجزئة - نسخة معدلة من 1C: إدارة التجارة وهي مخصصة لأتمتة متاجر البيع بالتجزئة بتفاصيل مختلفة. يعد تكوين 1C هذا عالميًا لأي متجر، وعلى أساسه طور مبرمجو 1C العديد من الاختلافات للمتاجر في مختلف الصناعات.

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

1C لغة البرمجة


تتمتع منصة 1C:Enterprise بلغة برمجة خاصة بها، طورتها شركة 1C، وتحدد وظائف حلول التطبيقات بشكل كامل. تحدد المنصة مجموعة من الكائنات الأساسية بخصائصها وأساليبها الخاصة - وهي الثوابت والمستندات والأدلة والسجلات وغيرها الكثير. يتم استخدام المجموعة الكاملة من هذه الكائنات لحل مشكلات أتمتة المحاسبة المختلفة.

لغة البرمجة 1C المدمجة خاصة بموضوع معين. يقول المبرمجون ذوو الخبرة أن لغة البرمجة 1C تبدو في البداية أبسط قليلاً من غيرها. تكمن الصعوبة في حقيقة أن المبرمج يحتاج إلى فهم مجال الموضوع الذي يقوم البرنامج بأتمتةه - المحاسبة والإنتاج والمحاسبة الإدارية وما إلى ذلك. ميزة أخرى للغة البرمجة 1C والتي تفاجئ المبتدئين هي الكود ثنائي اللغة. هذا يعني أنه يمكن كتابة الكود باللغة الروسية أو الإنجليزية.

أساسيات العمل مع قواعد بيانات 1C

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

على سبيل المثال، القاعدة المحاسبية وقاعدة الراتب. بعد إجراء جميع حسابات الدفع في قاعدة بيانات الرواتب، يجب نقل البيانات إلى قسم المحاسبة لدفع الضرائب.

يشارك مبرمجو 1C أيضًا في مزامنة وتبادل البيانات بين قواعد البيانات.

أساسيات لغات الاستعلام 1C

خطوة مهمة جدًا في تعلم برمجة 1C هي إتقان لغة الاستعلام.

الطلبات- هذه إحدى تقنيات 1C:Enterprise الرئيسية، إلى جانب لغة مدمجة تسمح لك بقراءة ومعالجة البيانات المخزنة في قاعدة البيانات.

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

أساسيات آليات التفاعل مع البرامج الأخرى

في 1C:Enterprise، من المهم تكوين تحميل البيانات من Microsoft Office، لأنه غالبًا ما يتعين عليك حفظ التقارير والبيانات الجدولية المتنوعة في ملفات Excel أو Word. أو العكس، لتحميل البيانات من Excel، تحتاج إلى إنشاء معالجة خاصة. تحتاج أولاً إلى إجراء جميع الإعدادات الفنية وقراءة البيانات من الملف وإنشاء أعمدة بأسماء مشابهة في 1C.

أساسيات العمليات المحاسبية أو التخزينية أو التجارية

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

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

تنظيم المهارات الأساسية وتعلم كيفية حل المشكلات المعقدة باستخدام

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

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

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

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

يجب على الأشخاص الذين يفكرون في الأمر أن يفهموا أن المعرفة الأساسية باللغة نفسها لن تكون كافية تمامًا. للحصول على وظيفة جيدة وأجر لائق، عليك أن تفهم OOP، والذي يُستخدم في كتابة أطر العمل الشائعة وأنظمة إدارة المحتوى (CMS). العمل مع هو المرحلة التالية لما يحتاج مبرمج PHP إلى معرفته.

في الوقت الحاضر، سيكون كافيا للتعرف على عمل قاعدة البيانات الأكثر شيوعا - MySQL. من غير المرجح أيضًا أن يتمكن المتخصص الحقيقي من الاستغناء عن لغات برمجة HTML وCSS. على الرغم من أن PHP هي لغة خادم، إلا أنها ترتبط بشكل خاص بتجميع صفحات الويب المكتوبة بلغة HTML. ستحتاج أيضًا إلى معرفة بناء جملة JavaScript وفهم عمل الأطر الشائعة - JQuery أو ExtJS. في الوقت الحاضر، ليس من الصعب إتقان كل هذه الأدوات الحديثة بمساعدة العديد من المدونات والدورات التدريبية عبر الإنترنت.

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

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

شبكات الاتصالات المتنقلة المبنية على نظرية الانتظار ومعيار GSM؛ يتم تنفيذ البرامج النصية PHP على خوادم بعيدة وإرسال مخرجاتها عبر Ethernet عبر TCP/IP إلى أجهزة الكمبيوتر المزودة ببرامج تشغيل NDIS؛ المعالجات التي تعيد ترتيب مجموعات التعليمات وتنفذها بشكل تخميني للتعويض عن التباطؤ في سرعة الساعة الناجم عن القيود المفروضة على إلكترونيات أشباه الموصلات وسرعة الضوء؛ هياكل الطائرات والسيارات والأدوية وهياكل الحمض النووي المصممة بالكمبيوتر؛ ألعاب الكمبيوتر، حيث تتم كتابة مقالات بحجم ميغا بايت مليئة بتكاملات فريسنل من أجل توهج بسيط؛ الأفلام والكتب الإلكترونية؛ خوارزميات البرمجة اللغوية العصبية (NLP) وTreeNet التي تجلب لنا نتائج البحث من قواعد بيانات ضخمة - هذا ما يحيط بنا كل يوم بفضل المبرمجين، بفضل الأساليب الأصلية والمعرفة الأساسية، وذلك بفضل منهجية مدروسة ومحسنة لتطوير وإدارة تعقيد البرامج على مدى عقود.

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


  1. سي ++، قياسي، Comeau، 1TBS، Stroustrap/D&E/Josattis/Vanderwood، Dewhurst/Meyers/Sutter، RAII/copy-and-swap/exception-safety، قاعدة الخمسة، Alexandrescu/Abrahams-Gurtovoy، محو الكتابة، CRTP، NVI، SFINAE، بحث كونيج، جهاز داف، Boost، Sik-Lumsdain/Karlsson، TR على أداء C++، اختبار ستيبانوف، إعادة توجيه دلالات المشكلة/الحركة، المواصفات
  2. المجمعين، ميزات تنفيذ المعيار، قيود التنفيذ، الجوهرية، الاختلافات بين المكتبات القياسية (الحاويات، الراند)، ABI، تنفيذ الوظائف الافتراضية، الميراث الافتراضي، الاستثناءات، RTTI، التبديل، مؤشرات إلى الوظائف والأساليب؛ التحسينات، حذف النسخ (RVO، NRVO)، sizeof على منصات مختلفة، تعريفات المترجم والبيئة، __declspec، مفاتيح المحول البرمجي، تحسين القاعدة الفارغة، الارتباط الثابت والديناميكي، Mangling، التحويل البرمجي الموزع، الرأس المترجم مسبقًا، وحدة التحويل البرمجي الفردية، (صارم) التعرجات/التقييد، المضمنة/_forceinline، المتقلبة
  3. متعدد الخيوط، فلاسفة تناول الطعام، الجمود/القفل المباشر/حالة السباق/المجاعة، الذرية، تعليمات قفل المعالج، نموذج الذاكرة/الحاجز/الطلب، CAS أو LL/SC، الانتظار/القفل/خالية من العوائق، مشكلة ABA، كتابة حاويات خالية من القفل، الدوران -قفل، بيانات TLS/لكل خيط، قانون Amdahl، OpenMP، MPI، تقليل الخريطة، القسم الحرج/mutex/semaphore/متغير الحالة، WaitForSingleObject/WaitForMultipleObjec ts، الخيط الأخضر/coroutine، pthreads، المستقبل/المؤجل/الوعد، النموذج ممثلين
  4. لغة التجميع، Zubkov/Hyde/Drepper/Kaspersky/Fog/Abrash، x86، FPU/MMX/SSEn/AVX، بناء الجملة AT&T وIntel، masm32، وحدات الماكرو، المكدس، مديري الكومة/الكومة، اصطلاحات الاتصال، الرموز السداسية، تمثيل بيانات الآلة، IEEE754 ، endian الصغير/الكبير، SIMD، استثناءات الأجهزة، المقاطعات، الذاكرة الافتراضية، العكس، تعطيل المكدس والكومة، البرمجة الموجهة للعودة، كود القشرة الأبجدي الرقمي، خطأ L1/L2/RAM/الصفحة وتوقيتها، لغة تجميع ARM
  5. المعدات، هورويتز هيل / تيتز شينك / من الفيزياء إلى لغة C من بانشول ، إلكترونيات أشباه الموصلات/إلكترونيات الدوران/الضوئيات، الترانزستور، الزناد، تصميم الدوائر، الكود الصغير، تكنولوجيا المعالج، التوليف المنطقي، تحليل التوقيت الثابت، FPGA، Verilog/VHDL/SystemC، SISAL، Arduino، أجهزة الذاكرة (ROM → EEPROM، RAM، SSD، HDD، DVD)، RISC/CISC، تصنيف فلين (ID)، نهج برينستون وهارفارد، معماريات المعالج، معماريات x86، VID/PID
  6. معالجات، خطوط الأنابيب، خيوط المعالجة المتعددة، التنفيذ خارج الترتيب، التنفيذ التخميني، التنبؤ بالفرع الثابت/الديناميكي، الجلب المسبق، ذاكرة التخزين المؤقت المتعددة الارتباط، فقدان سطر ذاكرة التخزين المؤقت/ذاكرة التخزين المؤقت، دورات الساعة، حلقات الحماية، الذاكرة في الأنظمة متعددة المعالجات (SMP/NUMA) ، توقيت الذاكرة
  7. الرياضيات المنفصلة، K2، نظرية بوست، الدوائر، الآليات المحدودة (DKA و NDKA)، بندقية الكلاشينكوف، الآليات الخلوية
  8. قابلية الحساب، آلة تورينج، خوارزميات ماركوف العادية، آلة البريد، معادلات ماتياسيفيتش ديوفانتين، دوال تشيرش لامدا، دوال كلين العودية جزئيًا، البرمجة التوافقية شينفينكل، Brainfuck، تكافؤ مستنقعات تورينج، مشكلة الإيقاف والتطبيق الذاتي، قابلية عد مجموعة من الدوال الحسابية، آلة ذاكرة الوصول العشوائي، خوارزمية تارسكي، حلول SAT/SMT، نظرية الأنظمة الرسمية
  9. لغات البرمجة، القواعد، تسلسل تشومسكي الهرمي، نظرية Myhill-Nerowd، ضخ lemma وOgden's lemma، جبر كلين، NDKA → DKA، مشاكل غير قابلة للحسم خوارزميًا في اللغات الرسمية، Dragonbook، Friedl، regexps وتعقيدها، PCRE، BNF، Boost.Spirit + Karma + Qi/Ragel، LL، LR/SLR/LALR/GLR، PEG/packrat، ​​yacc/bison/flex/antlr، تحليل الكود الثابت، تجميع/إلغاء التجميع/التعتيم/deobfuscation، Clang/LLVM/XMLVM/Emscripten،GCXML،OpenC++، بناء الأجهزة الافتراضية، JiT/AoT/GC، DSL/DSEL
  10. الخوارزميات والتحسين التوافقي, Cormen/Skiena/Sedgwick/Knuth/Aho-Hopcroft-Ulman/Papadimitriou/Shriver-Goldberg/Prep Arata-Shamos/e-maxx.ru، هياكل البيانات، الخوارزميات، التعقيد، رمزية لانداو، نظرية أكرا-بازي، الزمان والمكان المقايضة، فئات التعقيد، مشاكل NP الكاملة، KMP، الرسوم البيانية والأشجار، التدفقات في الشبكات، مصفوفة كيرشوف، أشجار البحث (خاصة شجرة RB وشجرة B)، اكتشاف الانسداد، الكومة، جداول التجزئة والتجزئة المثالية، شبكات بيتري، خوارزمية الفلاحين الروسية، طريقة كاراتسوبا وضرب مصفوفة فينوغراد-ستراسين، الفرز، الخوارزميات الجشعة والماتريدات، البرمجة الديناميكية، البرمجة الخطية، خوارزميات التفاضلية، الخوارزميات العشوائية وخوارزميات البحث الضبابي، الأرقام العشوائية الزائفة، المنطق الضبابي
  11. الطرق العددية، الانقسام / طريقة نيوتن، الاستقراء الداخلي، الخطوط، طريقة غاوس / جاكوبي / سيدل، تحليل QR و LU، SVD، طريقة المربعات الصغرى، طرق رونج-كوتا، طريقة آدامز، صيغ نيوتن-كوتس، طريقة ريتز، بوبنوف-جاليركين طريقة الفرق المحدود/طريقة العنصر، FFT/STFT، التقارب والاستقرار
  12. التعلم الالي، راسل نورفيج / بيشوب، مناهج نمذجة الذكاء الاصطناعي، إعادة التدريب / التحقق من الصحة، الشبكات البايزية، الشبكات العصبية، شبكات كوهونن، آلة بولتزمان المقيدة، نزول التدرج / تسلق التل، التحسين العشوائي (طريقة مونت كارلو، طريقة التلدين، الخوارزميات الجينية، خوارزميات النمل)، SVM، تعزيز التدرج، التحليل العنقودي، طريقة المكون الرئيسي، LSH، التعلم المعزز، MDP، استرجاع المعلومات / استخراج البيانات / معالجة اللغة الطبيعية، رؤية الكمبيوتر، Szeliski، OpenCV، معالجة الصور، التعرف الضوئي على الحروف، مرشحات Sobel، سلسلة Haar ، إطار عمل فيولا جونز، SURF، مقدمة في الفسيولوجيا النفسية للرؤية، IPython/pandas/scikit-learn
  13. نظرية المعلومات، الضغط، هوفمان، RLE، BWT، LZ، رموز تصحيح الأخطاء، الضغط المفقود (الصور والصوت والفيديو)، إنتروبيا المعلومات، صيغة شانون، تعقيد كولموجوروف
  14. التشفير، شناير/ياشينكو، مبدأ كيرخوف، المتماثل (DES، AES)، غير المتماثل (RSA)، جودة PRNG، خوارزمية ديفي هيلمان، المنحنيات الإهليلجية، التجزئة (MD5، SHA، CRCn)، DHT، قوة التشفير، هجمات التشفير (Grandmaster) الهجوم)، WEP/WPA/WPA2 والهجمات عليها، التوقيع الرقمي والشهادات، PKI، HTTPS/SSL، إثبات المعرفة الصفرية، مخطط العتبة
  15. الرياضيات، كنوت-جراهام-باتاشنيك/زوريخ/وينبيرج، سبيفاك/دوميت-فوت، ماتان، لينال، كومبلان، فونكان، ديفجيم، نظرية الأعداد، difurs/intours/urchpa/حساب التفاضل والتكامل للتغيرات/التحكم الأمثل، توليد الوظائف، المتسلسلة، التوافقيات، النظرية / ماتستات / سلوب / نظرية الطابور، سلاسل ماركوف، التحويلات التكاملية (فورييه، لابلاس، المويجات)، NZQRCHOS، الحزم الرياضية (Mathematica، Maple)
  16. الفيزياء، قواعد كيرشوف، قانون جول لينز، المقاومة المعقدة، سرعة الضوء وتردده، معادلات ماكسويل، لاغرانجيان وهاملتونيان
  17. كيمياء، الكيمياء الكيميائية، كيمياء السيليكون :)
  18. الهندسة المعمارية وأسلوب التعليمات البرمجية، McConnell/Fowler/Leblanc/Gamma/Alexandre Rescu-Sutter/Butch، البرمجة الدفاعية، الأنماط، SOLID/GRASP/KISS DRY SPOT/YAGNI، UML، OOP (Smalltalk)، OOD/OOA، مقاييس الكود
  19. منهجيات التطوير، الشلال/RUP/Agile/Scrum/Kanban/XP، TDD/BDD، CASE
  20. اختبارات، اختبارات الوحدة، الوظيفية، التحميل، اختبار التكامل، اختبار واجهة المستخدم
  21. ادوات التطويرو IDE و IntelliSense ومصححات الأخطاء (VS/Olly/WinDbg/kdb/gdb) وأجهزة التتبع (strace/ltrace)، وتنسيق معلومات تصحيح DWARF، والمفككات ووحدات فك التجميع (IDA/HexRays/Reflector)، وأنظمة التحكم في الإصدار (SVN، GIT)، دمج/فرع/جذع، أنظمة تسمية الملفات والفروع، التكامل المستمر، النمل، تغطية الكود، التحليل الثابت (lint، cppcheck)، التحليل الديناميكي (valgrind، fuzzing)، التحقق من البرامج والتحقق من صحتها (Frama-C، RAISE (RSL)، Coq)، ملفات التعريف، متتبعات الأخطاء، توثيق التعليمات البرمجية، أنظمة البناء (CMake)، مديري الحزم (NuGet)
  22. إطار أعمال، Qt، moc والمعلومات الوصفية، مفهوم إشارة الفتحة، Summerfield-Blanchette/Schlee، PoCo، المكتبات الصناعية: GMP، i18n، lapack، fftw، pcre
  23. نظام التشغيل، Silberschatz/Richter/Solomon-Russinovich/R obachevsky/Vakhalia/Stevens/Love/Linux Kernel Internals، مدير الذاكرة، مدير الكومة وجهازه (LAL/LFH/slab)، مدير الجهاز، مدير العمليات، تبديل السياق، حقيقي ومحمي الوضع، والملفات التنفيذية (PE/ELF/Mach)، وكائنات kernel، وآليات تصحيح الأخطاء (strace/ptrace/dtrace/pydbg، Debug API) وminidumps، bash، مكدس الشبكة والخوادم عالية الأداء، netgraph، CR0، IPC، نظام النوافذ الفرعي، أمان النظام: ACE/ACL وحقوق الوصول، تقنيات المحاكاة الافتراضية، RTOS (QNX)، برمجة برامج التشغيل، IRQL، IRP، أنظمة الملفات، BigTable، برامج تشغيل NDIS/miniport/FS/برنامج تشغيل المرشح، Mm-، Io-، Ldr-functions، DKOM والجذور الخفية، GDT/IDT/SDT، نواة Windows/Linux/BSD، POSIX
  24. النماذج القائمة على المكونات، روجرسون/تافاريس، COM/OLE/ActiveX/COM+/DCOM RPC، ATL، الشقق، الألقاب، MIDL، XPCOM، CORBA، TAO، D-Bus
  25. شبكة، ستيفنز، نموذج OSI/نموذج الإنترنت، Ethernet، TCP/IP، نافذة TCP، خوارزمية Nagle، المقابس، المخازن المؤقتة للبروتوكول/Thrift/Avro/ASN.1، AMQP، ICMP، التوجيه/BGP/OSPF، ARP، هجوم Mitnik، Syn فيضان، HTTP/FTP، P2P/DHT، DHCP، SMB/NBNS، IRC/XMPP، POP3/SMTP/ESMTP/IMAP، DNS، WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth/GPS، ACE، Wireshark
  26. الرسومات وGPGPU، خوارزمية بريسنهام، نماذج الألوان، تتبع الشعاع مقابل الرسومات المضلعة، OpenGL/GLSL/Open Inventor، DirectX/DirectShow/DirectAudio/HLSL، اختبار الاستنسل/العمق/ألفا، خط أنابيب الرسومات في DirectX 11، التظليل، نماذج الإضاءة (Phong)، عرض النطاق الترددي، معدل التعبئة، OpenCL/CUDA/AMP، المناظر الطبيعية، المساكن، الظلال، التظليل المؤجل، التركيب والتصفية، الحواف، HDR، تعيين النغمات، الواقع الافتراضي/المعزز
  27. التنسيقات، XML/XSLT/XPath/XMLStarlet/DOM/SAX، RTF/ODF، JSON/BSON/bencode، YAML، JPEG/PNG/WebP، AVI/MPEG/RIFF/WAV/MP3/OGG/WebM، SVG، Unicode، الترميزات بايت واحد/UTF-8/UTF-16/UCS-2/UTF-32، مشاكل الطول ومقارنة سلاسل Unicode
  28. قاعدة البيانات، جروبر/التاريخ، ANSI SQL، T-SQL، ODBC، MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx، الإجراءات المخزنة، المشغلات، جبر Codd/A، البرنامج التعليمي D، النماذج العادية، تحسين الاستعلام وتنفيذه، هياكل البيانات الفهارس، المعاملات وACID، نظرية Brewer's CAP، NoSQL، تخزين القيمة الرئيسية، التجزئة، ORM (C++ ODB)، ERD، OLAP، الويب الدلالي، Triplestore، RDF/Turtle، SPARQL، OWL، علم الدلالات المتكامل، علم الدلالات، DBpedia
  29. برمجة التطبيقات، C#/F#، Shildt/Troelsen/Richter، الأدوية العامة، العائد، linq/plinq، الانعكاس، AST، WCF، WinForms/WPF/Silverlight، AOP، أطر عمل التسجيل، تجميع .NET، Scala، Horstmann/Odersky، مطابقة الأنماط، وحدات الماكرو / شبه الاقتباسات
  30. الاحصاء الكمية، خوارزمية شور، التشفير الكمي
  31. البرمجة الوظيفية، Haskell/Ocaml/Scheme/Alice أو Oz، SICP/TaPL/YAHT/هياكل البيانات الوظيفية البحتة/Harrison-Field، HOF (خريطة/أضعاف/مرشح)، نظام نوع Hindley-Milner، monads، typeclasses، ADT، الأنواع التابعة، كسول/نشيط، البرمجة المنطقية (Prolog أو Mercury)، البرمجة التنافسية (Erlang أو Oz)
  32. برمجة الويب ولغات البرمجة النصية، دورة شهادة Flanagan/Zend PHP5 + دليل الدراسة، Apache/nginx، CGI/FastCGI، PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine أو Propel/CodeIgniter أو Symphony أو Yii، Python/Django/Twisted، Ruby/RoR، ASP .NET MVC، JavaScript/jQuery/React/Google Closure/ExtJS/node.js، OOP في JavaScript، HTML5، CSS3/تخطيط الجدول والكتلة، RSS، Canvas/WebGL، Ajax/WebSockets، مشكلات الأمان (XSS، حقن SQL، CSRF)، التحميل العالي، مشكلة C10k، SWIG
  33. تصميم واجهة المستخدم الرسومية وعرض المعلوماتراسكين/تافتي، سهولة الاستخدام، أساسيات التصميم والطباعة، قانون فيتس، أساسيات التخطيط، LaTeX

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


تم انتقاد هذه النظرية بحق عدم وجود عرض منهجيوSUDDEN الأحياء من المواضيع التي تختلف في العمق والمحتوى. هذا ليس خطأ، هذه ميزة. إن العرض المنهجي للبرنامج حول أي نقطة تقريبًا سيشغل مساحة لا تقل عن جدول محتويات التلمود الممتلئ، لذا من الأفضل ذكر أسماء هذه التلمود فقط. فكيف العمل مع هذه القائمة؟ يجب أن تأخذ كتبًا جيدة حول هذا الموضوع وتقرأها حتى تصادف كل الكلمات المذكورة أثناء عملية القراءة. لم يكن بإمكان المؤلفين أن يتخيلوا في أعنف أحلامهم أن شخصًا ما سيقرر أن جهاز داف سيُعتبر من حيث العمق والحجم شيئًا مساويًا للمعيار المقدس المكون من ألف ونصف صفحة. ومع ذلك، فإن هذا المعيار يعمل تمامًا - يمكنك قراءة مائة كتاب عن C++ للمبتدئين، ولا تصادف أي ذكر لها أبدًا، ولكن إذا قرأت كتبًا ومقالات مفيدة حقًا (بالنسبة لموضوعات مثل C++، فإن مثل هذه الكتب موجودة ومدرجة) ، فإن كل الكلمات تجتمع بسرعة كبيرة. الهدف من البرنامج، نظرًا لحجمه، هو على وجه التحديد توفير فرصة لتقييم ما إذا كان قد تم قراءة عدد كافٍ من الكتب حول هذا الموضوع.

يواجه Theormin أيضًا قدرًا كبيرًا جدًا من الانتقادات من الأشخاص الذين يعتبرون أنفسهم مبرمجين، والذين يعتقدون ذلك من المستحيل معرفة كل هذا، تستغرق الدراسة وقتًا طويلاً جدًا، وفي بعض الممارسات الضيقة المجردة لا يتم استخدام معظمها. هؤلاء الناس، لسوء الحظ، ببساطة لا يفهمون الفرق بين سعة الاطلاع/الذاكرة والمعرفة. القيمة بالنسبة للمبرمج ليست حفظ التنسيق الدقيق لأي من حزم NBNS، ولكن إتقان الأساليب التي تم استخدامها أثناء التطوير، وبعبارة أخرى، ليست القدرة على إعادة الإنتاج، ولكن القدرة على إعادة الإنشاء أو التحديد، بما في ذلك في مجال آخر . إن قدرة الشخص على التحليل والتوليف (والتي لا تأتي من العدم، ولكن يتم تحقيقها من خلال العمل المعرفي النشط) هي التي تميزه عن Google، والتي، حتى في المستقبل البعيد، لن تتعلم حلها حتى div2 250 ... إن تطوير هذه القدرة بالتحديد يهدف إلى الحد الأدنى النظري، والذي سيتعين بالتأكيد استكماله في عملية العمل بالمعرفة الخاصة بالمجال، سواء كانت ميزات فيزياء اللعبة، أو تطوير المعاملات في Java، أو إنشاء دوائر دقيقة حقيقية.

في فقرة منفصلة، ​​يستحق تسليط الضوء على السؤال من أولئك الذين يشككون في قدرتهم على إتقان النظرية، أو يعتقدون أن القدرة على استخدامها نادرا ما تكون مطلوبة وسوف تضعف. بشكل عام، الحد الأدنى النظري في معظم النقاط أدنى إلى حد ما من المناهج الدراسية لأقسام علوم الكمبيوتر في الجامعات العادية، لذلك من الممكن إتقانها في 5 سنوات، حتى أثناء دمجها مع العمل. على وجه التحديد، في تطوير اللعبة، يتم استخدام من 1/3 إلى 2/3 من النقاط المدرجة بنشاط (وفقًا لتقديرات مختلفة في المناقشات). يمكن ملء النشاط المفقود، على سبيل المثال، من خلال استشارة الآخرين في Stack Overflow.

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

”إنهم يطعموننا جيدًا هنا أيضًا“. تقابل هذه الحجة دحضها في المناقشة الثانية الأكثر نشاطًا للمقالة، metaclass:
كل ما يجب أن يعرفه المبرمج حتى لا يتم إلقاؤه بعد 40 عامًا في سلة المهملات حيث يوجد المشردون.
في الواقع، في سن 45 عامًا تقريبًا، يبدأ تدهور الدماغ في الظهور بشكل نشط، مما يؤدي إلى مشاكل كبيرة في الفهم والقدرة على تشغيل التعليمات البرمجية مع التعقيد الدوري الطبيعي. يعد فقدان القدرة على كتابة التعليمات البرمجية، بالإضافة إلى عدم القدرة بسبب نقص التدريب على التحليل/التركيب، طريقًا مضمونًا لتحقيق ذلك. يحتفظ بعض الأشخاص بالقدرة على العمل مع التعقيد الدوري الطبيعي في سن الشيخوخة، ولكن فقط بسبب الأداء الأعلى من الطبيعي في الشباب. يمكنك التحقق مما إذا كنت في خطر على TopCoder
من الفيزياء إلى البرمجة
لماذا تحتاج إلى معرفة كل أنواع الأشياء ذات المستوى المنخفض؟

وأخيرا من أين جاءت هذه النظرية:
منهج علوم الكمبيوتر ACM

هذه المقالة ليست برنامجًا تعليميًا للبرمجة. وليس منشورًا حول "أي لغة برمجة تختار". إذا كنت تريد أن تفهم مدى اهتمامك بالتعرف على عالم البرمجة، فالسؤال الأهم هو: ما هي البرمجة؟ كيف تبدو البرمجة من الداخل؟ هل أنا والبرمجة متوافقان؟

مبدأ "المنطق وليس الرياضيات"

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

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

مبدأ "اصطياد النجم الساقط"

يمكن النظر إلى البرمجة على أنها تشغيل العديد من "العمليات" - كما لو كانت تجبر الكمبيوتر على "القيام بالعمل نيابةً عنك" - وإدارة تلك العمليات. في البرمجة، غالبًا ما تنتج العملية نتيجة. يمكن أن تكون النتيجة ملفًا، ولكن يمكن أيضًا أن تكون شيئًا أبسط، مثل سلسلة أو رقم.

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

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

مبدأ "القاموس".

هناك العديد من "الأنواع" في البرمجة. فكر في الأنواع باعتبارها اللبنات الأساسية للغة البرمجة. النوع الأول عبارة عن سلسلة أو مجموعة من الأحرف داخل علامات الاقتباس. كل من "تفاحة" و"برتقالية" عبارة عن سلاسل. يمكن، على سبيل المثال، دمجها وجعلها "برتقالية تفاحية". الأرقام هي نوع مختلف. يمكن إضافة الأرقام وطرحها وضربها (من بين عمليات أخرى). ثم هناك "المصفوفات" - مجموعة من الكائنات بترتيب معين. ["First"، "goes"، "before"، "secure"]، على سبيل المثال، عبارة عن مصفوفة تحتوي على العنصر الأول "First" والعنصر الأخير " Second".

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

ولكن لماذا يهم هذا؟ اتضح أن مثل هذا الهيكل غالبًا ما يكون ضروريًا لتخزين البيانات. على سبيل المثال، يمكنك تجميع معلومات حول شخص ما بهذه الطريقة:

("الاسم_الأول" => "جوناثان"، "الاسم_الأخير" => "ريتشاردز"، "الجنسية" => "بريطاني")

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

مبدأ "الماتريوشكا".

البرمجة مليئة بالكائنات الموجودة داخل الكائنات داخل كائنات أخرى. عند البرمجة، غالبًا ما تجد نفسك تحاول هيكلة البيانات، وغالبًا ما تحتوي تلك الهياكل على هياكل أخرى بداخلها.

لنضيف خاصية "الأشقاء" إلى المثال السابق:

("الاسم الأول" => "جوناثان"، "الاسم_الأخير" => "ريتشاردز"، "الجنسية" => "بريطاني"، "إخوة" => ( "إخوة" =>، "أخوات" => ["فيونا"، "مريم"] ))

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

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

مبدأ "الكلب والقط والأسماك".

(أو مبدأ السبب والنتيجة)

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

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

ما يهم حقًا بالنسبة للمبرمج هو أن يكون قادرًا على عزل أسباب التغيير. ستواجه مثل هذه المواقف طالما أنك تقوم بالبرمجة. في مثل هذه المواقف، قد نرغب في أن نسأل أنفسنا: هل يمكننا محاكاة دخول الكلب دون خروج القطة (قد يوضح هذا الكثير)؛ هل يمكننا محاكاة خروج قطة دون دخول كلب؟ هل يمكننا تكرار البيئة بالكامل (الساعة 6:17 مساءً على سبيل المثال) لمعرفة ما إذا كانت تؤثر على غناء الأسماك، بغض النظر عن الكلاب والقطط؟ وما إلى ذلك وهلم جرا. ومن المهم استخدام منهجية لتحديد أسباب التغيير. ستساعدك هذه القدرة مرارًا وتكرارًا طالما أنك تقوم بالبرمجة.

التجريدات، أو مبدأ "البيتزا".

هذا هو واحد من أصعب المبادئ. تخيل مطعم بيتزا. يقوم الطاهي كل يوم بإعداد البيتزا بطبقة مختلفة. يتم تحضير كل بيتزا بترتيب معين: أولا تقوم بتحضير العجينة، ثم تتركها، ثم تضعها في المقلاة، وتضيف صلصة الطماطم، والطبقة، والجبن، وأخيرا خبزها.

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

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

دعونا نحول عملية صنع البيتزا إلى كود. أولا دعونا نبدأ في القيام بذلك بشكل خاطئ. لنقم بعمل طريقة make_a_napoletana_pizza (تحضير بيتزا نابوليتانا):

اصنع_بيتزا_نابوليتانا

ستتكون من 5 خطوات (تحضير القاعدة، إضافة صلصة الطماطم، إضافة الأنشوجة، إضافة الجبن، الخبز):

Make_the_base add_the_tomato_sauce add_anchovy add_cheese Bake

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

هذا ما يعنيه. لنتخيل أن طريقة make_a_pizza الخاصة بنا يتم استدعاؤها باستخدام الوسيطة "toppings". ستبدو الطريقة كالتالي:

Make_a_pizza (الطبقة)

وسوف تعمل مثل هذا:

Make_the_base add_the_tomato_sauce add_toppings(الطبقة) add_cheese Bake

في السطر 3 نأخذ الطبقة المحددة سابقًا ونضيفها إلى البيتزا.

الآن بعد أن حددنا طريقة عامة لصنع البيتزا، يمكننا ببساطة أن نطلق عليها ونحدد المكونات التي نريدها. كل شيء يحدث تلقائيا. بمعنى آخر، نسمي make_pizza(salami)، وعندما يتم تشغيل الطريقة، سيصبح السلامي طبقة وستتم إضافته إلى البيتزا عندما تصل الطريقة إلى السطر الثالث. بمجرد تغيير الطبقة، يمكنك إنشاء 2 بيتزا مختلفة باستخدام طريقة واحدة. إنه أمر اقتصادي كما هو الحال عندما تكتب النادلة ببساطة "1 × سلامي، 1 × نباتي" في نموذج الطلب ويعرف الطباخ كل ما يحتاجه. في البرمجة يسمى هذا "التجريد".

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

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

البرمجة شيء مثل محو الأمية

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

تشبه هذه العوامل الحروف الأبجدية، وتشبه وظائف الإدخال/الإخراج القراءة () والكتابة () الكلمات الأولى، "أمي" و"أبي"، التي يبدأ بها الطفل في فهم العالم.

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

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

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

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

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

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

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

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

حسنًا، إذا كانت البرمجة "مثل معرفة القراءة والكتابة"، فما الذي تحتاج إلى معرفته أيضًا وتكون قادرًا على فعله لتصبح "كاتبًا"؟

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

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

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

أساسيات البرمجة

لقد كنت محظوظًا جدًا لأنه بمجرد أن أصبحت مهتمًا بالبرمجة، قرأت كتابًا رائعًا بعنوان "Perfect Code". لقد أذهلني أنه لم يكن كتابًا عن بعض لغات البرمجة أو التكنولوجيا، مثل أي شيء آخر صادفته من قبل، ولكنه كتاب عن البرمجة نفسها في حد ذاتها. ربما يكون هذا هو الكتاب الأول الذي حاول سد الفجوات التي خلفتها قراءة كتب الخوارزمية والأدلة الفنية والوثائق.

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

وليس من قبيل الصدفة أنها فازت في استطلاع الرأي "إذا كان بإمكانك العودة بالزمن عندما كنت لا تزال مطورًا مبتدئًا، ما هو الكتاب الذي تنصح نفسك بقراءته؟"

ثم ظهرت كتب جيدة أخرى عن البرمجة:

والعديد من الأشياء الأخرى الجديرة بالاهتمام، لكنها بشكل عام تغطي مناطق معينة أعمق.

في الواقع، تتكون كيمياء البرمجة بأكملها من أشياء نعمل معها طوال الوقت ويجب أن نفهمها:

  • أساسيات تكنولوجيا الكمبيوتر: أساسيات الجبر البولياني وأنظمة الأعداد الثنائية والستة عشر صفًا.
  • بنية الكمبيوتر: المعالج، ذاكرة الوصول العشوائي، المكدس، القرص الصلب، بطاقة الرسومات، الناقل، الأجهزة الطرفية (مثل لوحة المفاتيح والماوس).
  • مجمع المعالج وC - تحتاج أيضًا إلى معرفتهم قليلاً على الأقل.
  • المعرفة الأساسية في الواقع: بناء الجملة، وكيفية الإعلان عن متغير، والدالة، وكيفية كتابة عبارة if الشرطية، وأسبقية عامل التشغيل، وكيفية تنظيم حلقة، وكيفية تلقي المدخلات من المستخدم وكيفية إخراجها. البرمجة المنظمة - كيفية الكتابة بدون الانتقال إلى، باستخدام الحلقات والتكرار. إنه أمر سهل حقًا، حيث يتم تعلم خمسة عشر عاملًا بسرعة. تقريبًا جميع لغات البرمجة المستخدمة اليوم موروثة من لغة C (C++، Java، C#، PHP، JavaScript)، لذلك ليست هناك حاجة لإعادة تعلمها. لذلك، بالمناسبة، ليس من المهم بشكل خاص أي من هذه اللغات التي تبدأ التعلم بها.
  • الخوارزمية: البحث الخطي بالقوة الغاشمة، البحث الثنائي، فرز الفقاعات، الفرز السريع، إلخ. تقدير مدى تعقيد الخوارزميات.
  • هياكل البيانات: السلاسل، وقائمة الانتظار، والمكدس، والقائمة المرتبطة منفردة ومزدوجة، والمصفوفات، وما إلى ذلك.
  • التحليل والتجريد وتصميم البرامج: البرمجة الشيئية، SOLID، أنماط التصميم، مخططات UML.
  • أساسيات البرمجة الوظيفية: كيفية الكتابة دون تعيينات وحلقات مدمرة، والعمل مع المجموعات بأسلوب وظيفي.
  • معرفة النظام الأساسي والمكتبات والتقنيات: Java Core، والعمل مع الملفات، والعمل مع الشبكة، والعمل مع المصفوفات والسلاسل والمجموعات، والعمل مع الذاكرة وجمع البيانات المهملة. هناك كتب سميكة حول كل هذا من مبدعي التكنولوجيا أنفسهم (على سبيل المثال، "جافا الفعالة").
  • معايير وبروتوكولات الشبكة: TCP، UDP، HTTP، HTML، XML، JSON، MIME، RFC.
  • القدرة على كتابة تعليمات برمجية نظيفة: كيفية تسمية المتغيرات والفئات بشكل صحيح، وكيفية تنسيق التعليمات البرمجية، وكيفية كتابة التعليقات بشكل صحيح (بتعبير أدق، كيف لا تكتبها :-)). الفهم يأتي بعد قراءة كتاب Clean Code.
  • القدرة على العمل مع التعليمات البرمجية: إعادة البناء (كتاب فاولر)، ومفاتيح التشغيل السريع IDE لإعادة البناء، والقدرة على قراءة التعليمات البرمجية القديمة والحفاظ عليها.
  • الممارسات الهندسية: اختبارات الوحدة، البرمجة المتطرفة (XP)، التكامل المستمر، أنظمة التحكم في الإصدار (Git، SVN).
  • إدارة المشروع وتنظيم العمليات: Waterfall، Agile، SCRUM، Kanban، متتبعات الأخطاء، تقدير الوقت لمهمة ما.
  • المهارات الناعمة: القدرة على التواصل مع العميل والانسجام ضمن فريق، والتغلب على نقص الحافز، واختيار الأولويات.
  • قواعد البيانات: SQL، وقواعد البيانات العلائقية والموجهة نحو المستندات والرسوم البيانية، وACID، ونظرية CAP، وتحسين الاستعلامات.
  • أنظمة التشغيل: لينكس، تثبيت وتكوين البرامج عليه، سطر الأوامر.
  • القياس والأحمال العالية والمراقبة والتسجيل والتسامح مع الأخطاء.
  • التشفير والحماية من الهجمات.
  • سهولة الاستخدام وجمع المتطلبات.
  • معرفة اللغة الإنجليزية، والقدرة على كتابة الوثائق بشكل واضح وموجز.
  • القدرة على صياغة الأسئلة بشكل صحيح والعثور على إجابات لها بشكل مستقل.
  • القدرة على التعلم وتحسين نفسك باستمرار.
  • القدرة على تعليم الآخرين والشرح بوضوح وحتى التحدث أمام الجمهور في المؤتمرات...
  • وفي نفس الوقت لا تصاب بالجنون.

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