Peter Norwig: تعلم البرمجة في ... 10 سنوات

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

أين الجميع في عجلة من هذا القبيل؟


انتقل إلى أي متجر لبيع الكتب وسترى على الفور كتابًا عن كيفية تعلم Java في 24 ساعة ، بالإضافة إلى خيارات لا نهاية لها حول كيفية تعلم C و SQL و Ruby والخوارزميات وما إلى ذلك في غضون أيام أو ساعات قليلة. بحث أمازون المتقدم [ العنوان: علم ، نفسك ، ساعات ، منذ: 2000 ] يسرد 512 كتابًا. من بين العشرة الأوائل ، تسعة كتب عن البرمجة (واحد فقط عن المحاسبة). ستحصل على نفس النتائج عن طريق استبدال "علم نفسك" بكلمة "تعلم" و "ساعات" بعبارة "أيام".

هذا يؤدي إلى الاستنتاج: إما أن يكون الناس في عجلة من أمرهم لتعلم البرمجة ، أو بطريقة ما رائعة يسهل تعلم البرمجة أكثر من أي شيء آخر. Felleisen et al. ذكروا هذا في كتابهم كيف تصمم البرامج ، عندما كتبوا ، "البرمجة السيئة سهلة. " يمكن للأبله أن يتعلموا ذلك في 21 يومًا ، حتى لو كانوا مليئين بالحنين." كما تطرق موقع الويب الهزلي Abtruse Goose إلى هذا الموضوع ( هنا هو الرابط ).

دعنا نرى ما قد يعنيه عنوان كتاب " علم نفسك C ++ في 24 ساعة" :

  • علّم نفسك: خلال 24 ساعة لن يكون لديك الوقت لكتابة بعض البرامج المهمة واستخلاص استنتاجات من نجاحاتك وإخفاقاتك. لن يكون لديك الوقت للعمل مع مبرمج من ذوي الخبرة وفهم ما هي إيديولوجية C ++. باختصار ، في هذا الوقت القصير لن تتعلم الكثير. لذا فإن الكتاب يفكر فقط بمعرفة سطحية ، ولكن ليس بفهم عميق. كما قال ألكسندر بوب: " القليل من المعرفة شيء خطير ".
  • C ++: في غضون 24 ساعة ، تكون قادرًا تمامًا على تعلم شيء ما من بناء جملة C ++ (إذا كنت تعرف لغة برمجة أخرى بالفعل) ، لكنك لا تعرف كثيرًا كيفية استخدام هذه اللغة. باختصار ، إذا كنت ، كمبرمج أساسي ، على سبيل المثال ، ستتعلم كيفية كتابة برامج النمط الأساسي باستخدام بناء جملة C ++ ، ولكنك لن تفهم المهام التي تعتبر C ++ جيدة جدًا (أو سيئة). ماذا تقول؟ كما قال آلان بيرليس : " إذا لم تغير اللغة فهمك للبرمجة ، فإن تعلمها لا فائدة منه ". حسنًا ، باستثناء أنك تحتاج إلى تعلم القليل من C ++ لفهم كيفية استخدام نوع من المكتبة لمهمة معينة. لكن في هذه الحالة ، نحن لا نتحدث عن تدريس البرمجة باللغة. أنت تتعلم فقط لإكمال مهمة محددة.
  • في 24 ساعة: لسوء الحظ ، كما أظهر أدناه ، هذه المرة ليست كافية.

تعلم البرمجة في 10 سنوات


أظهرت الدراسات ( بلوم (1985) ، بريان وهارتر (1899) ، هايز (1989) ، سيمون وتشيس (1973) ) أن إتقان المهارات في مجال معين يستغرق حوالي عشر سنوات ، على سبيل المثال ، في لعب الشطرنج ، التأليف الموسيقي ، العمل مع التلغراف ، الرسم ، العزف على البيانو ، السباحة ، التنس ، الفسيولوجيا العصبية و الطوبولوجيا. يكمن السر في الممارسة المدروسة : ليس فقط التكرار الميكانيكي ، ولكن البحث عن مهام أعلى من مستواك الحالي ، وحلها ، وتحليل أفعالك أثناء حلها وبعد حلها ، وتصحيح الأخطاء التي ارتكبت. ومرة أخرى. ومرة أخرى. لا توجد طريقة أقصر: حتى موتسارت ، الذي أصبح في الرابعة من عمره طفلًا معجزة موسيقية ، استغرق 13 عامًا قبل أن يبدأ في إنشاء موسيقى عالمية المستوى. ظهر فريق البيتلز في عام 1964 على الساحة مع مجموعة من الضربات وأداء في عرض إد سوليفان. ولكن قبل ذلك كانوا يلعبون في أندية ليفربول وهامبورغ الصغيرة منذ عام 1957. وعلى الرغم من شهرتهم العالمية بين المعجبين ، إلا أن نجاحهم الأول بين النقاد الموسيقيين جاء مع إصدار الرقيب بيبر في عام 1967.

قام مالكولم جلادويل بترويج هذه الفكرة في كتابه ، على الرغم من أنه يتحدث هناك عن 10000 ساعة وليس 10 سنوات. أعرب المصور الشهير هنري كارتييه بريسون (1908-2004) عن هذه الفكرة على النحو التالي: " أول 10000 صورة ستكون أسوأ صورك " (لم يشك في أنه باستخدام كاميرا رقمية يتمكن بعض الأشخاص من تحقيق هذا الرقم في غضون أسبوع). التجربة الحقيقية تأتي مع الحياة: كتب صامويل جونسون (1709-1784): " لا يمكن اكتساب الخبرة في أي مجال إلا من خلال العمل مدى الحياة. لا يوجد سعر أقل "؛ واشتكى تشوسر (1340-1400): " القليل جدًا للعيش ، الكثير للتعلم ". يشتهر أبقراط (400 قبل الميلاد) ببيانه " الحياة قصيرة ، العلم واسع " ، والذي يبدو تمامًا مثل هذا: "Ars longa ، vita brevis ، Occa praeceps ، Experum periculosum ، iudicium difficile" ، وفي الترجمة الروسية "Life باختصار ، العلم واسع ، حالة الاهتزازات ، التجربة خادعة ، الحكم صعب. " بالطبع ، لا يوجد رقم واحد يمكن أن يكون الجواب الدقيق: لا يوجد سبب لافتراض أن جميع المهارات (البرمجة ، لعب الشطرنج ، لعبة الداما ، الآلات الموسيقية) تتطلب نفس الوقت بالضبط لإتقانهم ، وكذلك ما يتطلبه الأشخاص المختلفون في نفس الوقت بالضبط. كما قال البروفيسور K. Anders Ericsson : " في معظم المناطق ، من المدهش ببساطة مقدار الوقت الذي يستغرقه حتى الأكثر موهبة لإتقان. يساعدك الرقم "10.000 ساعة" على فهم أننا نتحدث عن عدة سنوات من العمل الشاق من 10-20 ساعة في الأسبوع لتحقيق أعلى مستوى حتى بالنسبة لأكثر المواهب الموهوبة بشكل طبيعي منذ الولادة "

لذلك تريد أن تصبح مبرمجًا


إليكم وصفة نجاحي في البرمجة:

  • اهتم بالبرمجة ، وابتكار شيء ما من أجل المتعة فقط. يجب أن يكون من المثير للاهتمام بالنسبة لك أنه لن يكون من المؤسف أن تقضي السنوات العشر القادمة / 10000 ساعة على ذلك.
  • البرنامج . أفضل تدريب هو الممارسة . من الناحية الفنية ، "لا يتم تحقيق المستوى الأقصى من الأداء للفرد في مجال معين تلقائيًا من خلال الخبرة ، بل على العكس ، يمكن زيادة مستوى الإنتاجية حتى في الأفراد الأكثر خبرة بسبب الرغبة الواعية في التحسين" ( ص 366 ) و "للحصول على تدريب أكثر فعالية ، يتطلب الأمر جيدًا المهمة بمستوى التعقيد المناسب لفرد معين ، وتقييم مفهومة لتنفيذه وإمكانية تنفيذه المتكرر وتصحيح الأخطاء إيبوك ”(ص 20-21) كتاب الإدراك في الممارسة: العقل والرياضيات والثقافة في الحياة اليومية هو قراءة مفيدة للغاية حول هذا الفكر.
  • تحدث إلى المبرمجين الآخرين ؛ قراءة البرامج الأخرى. هذا أكثر أهمية من أي كتاب أو دورة تدريبية.
  • إذا كنت ترغب في ذلك ، خصص أربع سنوات للدراسة في الجامعة (أو في كلية الدراسات العليا). سيتيح لك هذا الوصول إلى العمل الذي يتطلب ألقابًا وعناوين مثبتة. ولكن إذا كنت لا تحب الدراسة ، يمكنك (بحماس معين) الحصول على نفس المعرفة بنفسك أو في العمل. على أي حال ، فإن التعلم من الكتب وحدها لا يكفي. يكتب إريك ريمون ، مؤلف قاموس The New Hacker: "إن تعليم علوم الكمبيوتر لن يجعل أي شخص خبيرًا في البرمجة ، تمامًا مثل دراسة الفرش والأصباغ الملونة لا يمكن أن يجعل أي شخص فنانًا رئيسيًا " . أفضل مبرمج اضطررت لتوظيفه لم يكن وراءه سوى دورة مدرسية شاملة ، وأنشأ برامج ممتازة ، وأدار قائمة البريد الخاصة بمعجبيه ، وكسب ما يكفي من المال لشراء خيارات النادي الليلي الخاص به.
  • العمل في مشاريع مع المبرمجين الآخرين. كن أفضل مبرمج في مشروع واحد ؛ يكون الأسوأ في الآخرين. عندما تكون الأفضل ، تختبر قدرتك على قيادة مشروع وإلهام الآخرين برؤيتك. عندما تكون الأسوأ ، تتعلم من الأساتذة ما يفعلونه وما لا يحبون القيام به (هذا ما يطلبون منك القيام به).
  • العمل في المشاريع بعد المبرمجين الآخرين. حاول معرفة برنامج كتبه شخص آخر. ألق نظرة فاحصة على ما هو مطلوب لفهم الرمز وإصلاحه عندما لا يكون هناك مبرمجون قريبون كتبوه. فكر في كيفية تصميم برامجك بحيث يسهل دعمها لمن سيعملون معها بعدك.
  • تعلم ما لا يقل عن ستة لغات برمجة . اختر لغة واحدة للتعلم تعتمد على التجريدات الصفية (مثل Java أو C ++) ، لغة تدعم التجريدات الوظيفية (مثل Lisp أو ML أو Haskell) ، واحدة - تدعم التجريد النحوي (مثل Lisp) ، لغة تعريفية واحدة (مثل ، Prolog أو C ++ - قوالب) ، وواحد - التأكيد على التزامن (على سبيل المثال ، Clojure أو Go).
  • لا تنس أنه في عبارة "علوم الكمبيوتر" هي كلمة الكمبيوتر . تذكر الوقت الذي يستغرقه جهاز الكمبيوتر الخاص بك لتنفيذ تعليمات واحدة ، لقراءة كلمة آلة من الذاكرة (مع وجود ذاكرة تخزين مؤقت أو عدم وجودها) ، لقراءة سلسلة من الكلمات الآلية من قرص ، للبحث عن سجل على قرص ( الإجابات هنا )
  • شارك في توحيد لغة البرمجة. يمكن أن يكون عمولة ANSI C ++ ، أو اجتماعًا في فريقك حيث تحدد عدد المساحات التي تتركها للمسافة البادئة في الرمز - 2 أو 4. على أي حال ، ستكتشف ما يحب الآخرون في اللغة ، ومدى شعورهم العميق وربما أيضًا ستكتشف ما جاء منها.
  • اعرف متى يحين وقت مغادرة لجنة توحيد اللغة في أسرع وقت ممكن.

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

حدد فريد بروكس في مقاله " الرصاصة الفضية غير موجودة " ثلاث خطوات في العثور على المبرمجين الرائعين:

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

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

لذا ، تفضل ، قم بشراء كتاب على Java / Ruby / JavaScript / PHP ؛ ربما ستحصل على بعض الفائدة منه. ولكن لن تتمكن من تغيير حياتك ولن تصبح خبيرًا في البرمجة في غضون 24 ساعة أو خلال 21 يومًا. ماذا عن قضاء 24 شهرًا من العمل الشاق باستمرار في إتقان الموضوع؟ الآن نحن نجري بالفعل محادثة جادة ...

الأدب


  • بلوم ، بنيامين (محرر.) تنمية المواهب لدى الشباب ، Ballantine ، 1985.
  • بروكس ، فريد ، لا سيلفر بوليتس ، IEEE Computer ، المجلد. 20 ، لا. 4 ، 1987 ، ص. 10-19.
  • Bryan، WL & Harter، N. "دراسات عن لغة التلغراف: اكتساب التسلسل الهرمي للعادات. مراجعة علم النفس ، 1899 ، 8 ، 345-375
  • Hayes، John R.، Complete Problem Solver Lawrence Erlbaum، 1989.
  • Chase، William G. & Simon، Herbert A. "تصور في الشطرنج" علم النفس المعرفي ، 1973 ، 4 ، 55-81.
  • لاف ، جان ، الإدراك في الممارسة: العقل والرياضيات والثقافة في الحياة اليومية ، مطبعة جامعة كامبريدج ، 1988.

الإجابات


الوقت المقدر لإجراء عمليات مختلفة في جهاز كمبيوتر نموذجي:
تنفيذ تعليمات نموذجية1 / 1،000،000،000 ثانية = 1 نانو ثانية
قراءة من ذاكرة التخزين المؤقت L10.5 نانو ثانية
خطأ في توقع الانتقال5 نانوسك
قراءة من ذاكرة التخزين المؤقت L27 nanosec
القبض / الإفراج عن كائن المزامنة25 نانوسك
القراءة من الذاكرة الرئيسية100 نانوسك
إرسال 2K عبر شبكة 1Gbps20000 نانوسك
قراءة 1 ميجا بايت بالتتابع من الذاكرة250،000 نانوسك
قراءة من القرص مع البحث (البحث)8،000،000 نانوسك
قراءة 1 ميجا بايت بالتتابع من القرص20000000 نانوسك
إرسال حزمة بيانات من الولايات المتحدة الأمريكية إلى أوروبا والعودة150 مللي ثانية = 150،000،000 نانو ثانية


التطبيق: اختيار اللغة


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

  • اتصل بأصدقائك . عندما يسألوني ، "أي نظام تشغيل يجب أن أختار - Windows أو UNIX أو Mac؟" ، أجيب: "استخدم النظام الذي يستخدمه أصدقاؤك". ما تتعلمه من أصدقائك سيغطي أكثر من أي اختلافات داخلية بين أنظمة التشغيل أو لغات البرمجة. ضع في اعتبارك أيضًا أصدقاء المستقبل: مجتمع المبرمجين ، الذي ستصبح جزءًا منه إذا واصلت تدريبك. هل تمتلك اللغة التي تختارها مجتمعًا كبيرًا متنامًا أم أنها صغيرة وتتلاشى تدريجيًا؟ هل هناك العديد من الكتب والمواقع والمنتديات حيث يمكنك الحصول على إجابات؟ هل تحب الناس التسكع في هذه المنتديات؟
  • ابدأ بسيطًا . تم تصميم لغات البرمجة C ++ و Java للعمل الاحترافي لفرق كبيرة من المبرمجين ذوي الخبرة الذين هم أكثر اهتمامًا بكفاءة تنفيذ التعليمات البرمجية الخاصة بهم. ونتيجة لذلك ، فإن لغات البرمجة هذه لديها هياكل معقدة لحل مثل هذه المشاكل. من المهم بالنسبة لك أن تتعلم كيفية البرمجة. لا تحتاج إلى تعقيد إضافي. أنت بحاجة إلى لغة تم إنشاؤها خصيصًا لتكون سهلة التعلم والتذكر.
  • العب. كيف تريد أن تتعلم العزف على البيانو: بالطريقة التفاعلية المعتادة ، عندما تسمع كل نغمة بمجرد الضغط على مفتاح ، أو في "وضع الدفعة" - عندما تسمع اللحن بأكمله فقط بعد الضغط على جميع نغمات الأغنية على المفاتيح؟ بالطبع ، الطريقة التفاعلية أسهل بكثير ، مثل البرمجة. حدد لغة لها وضع تشغيل تفاعلي وتشغيلها.

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

ملحق: الكتب والموارد الأخرى


يتم سؤالي عن الكتب ومواقع الويب الأفضل للتعلم. سأكرر مرة أخرى: "قراءة الكتب وحدها ليست كافية" ، لكنني أوصي بما يلي:

Source: https://habr.com/ru/post/ar416167/


All Articles