چگونه می توان تبدیل به یک استاد برنامه نویسی شد؟

کامپیوترها و ماشین های محاسب، یکی از ابزارهای همه منظوره در دنیای امروز هستند به گونه ای که اکثر ابزار و ادواتی که از آنها بهره می بریم، نوعی خاص از یک کامپیوتر را به همراه دارند. برخی از این ابزارها بر برخی دیگر ترجیح داده شده و پاره ای، بسیار زودتر از حد انتظار به دست فراموشی سپرده میشوند. در دنیای پر سرعت امروز جایی برای درنگ نیست فلذا متدها و ابزارهایی که موجب خرید زمان شوند، محبوب تر و دیرپای تر خواهند بود. هر نوع از انواع کامپیوتر توسط برنامه یا برنامه هایی کنترل می شود و نتیجه ای را ارائه می دهد. این برنامه ها توسط نوابغی که استادان برنامه نویسی هستند ایجاد می گردند. اما چگونه می توان تبدیل به یک استاد برنامه نویسی شد؟ آیا می توان متدهای خاصی برای برنامه نویسی ارائه داد تا علاوه بر ارائه نتایج دلخواه، از سرعتی متناسب با سیر سرسام آور دستاوردهای نوین بهره مند بوده و تعداد ساعات شبانه روز را به چیزی بیش از عدد نا امید کنندهء 24 ارتقاء دهد؟ در این مقاله قصد داریم با یکی از متدهای بسیار کارآمد که خواسته فوق را تأمین می نماید مواجه شویم پس تا پایان این سیاهه ما را همراهی کنید.

در برنامه نویسی چند اصل مهم باید سرلوحه کار برنامه نویس باشد. مهمترین اصل در برنامه نویسی یافتن الگوریتم مناسب است! اینکه یک الگوریتم در نهایت منتهی به جواب شود (نتیجه گرایی) بسیار خوب است مع الوصف هرگز کافی نیست (نتیجه گراییِ مطلق). الگوریتم مناسب الگوریتمی است که به سرعت منتج به نتیجه گردد. در این میان دو دیدگاه کاملا متفاوت وجود دارد:

  • نگاه انسانی (الگوریتم از نگاه انسان)
  • نگاه ماشینی (الگوریتم از دیدگاه ماشین)

در دیدگاه نخست تجزیه و تحلیل مسائل از نگرش انسانی حکایت می کند و راه حل های ارائه شده به گونه ای است که حل دستی مسائل را توسط انسان سرعت بخشد. عکس این مسئله نیز مصداق دارد و چنانچه یک روال حل، به گونه ای تعریف شود که حل دستی توسط انسان را به تعویق انداخته یا کند سازد، این راه حل مردود شناخته می شود.

در دیدگاه ماشینی، همه چیز با توجه به منطق سیلیکونی مورد قضاوت واقع می شود و حل گام به گام مسئله در صورتیکه ماشین را قادر به یافتن جواب در کوتاه ترین زمان کند، ارجح خواهد بود.

سوالی که مطرح است اینکه چه تفاوتی بین منطق انسانی و منطق سیلیکونی وجود دارد؟ و آیا اساسا تفاوتی که مدعی آن هستیم فرای ادعای ایراد شده ماهیت و موجودیت خارجی نیز دارد یا خیر؟

سیستم های اطلاعات جغرافیایی به شما کمک می کند تا تحلیل های فراوانی را انجام دهید. با کمک نرم افزار ArcGIS می توانید از این اطلاعات بهره ببرید. همچنین مجموعه ما دوره آموزش ArcGIS را آماده کرده است تا به بهترین نحوه از این نرم افزار استفاده کنید.

Garry Kasparov | استاد برنامه نویسیسال 1990 میلادی در مقدمه نشریه NIC (تازه های شطرنج) سوالی بدین شرح مطرح شد که آیا یک مهندس نابغه برنامه نویس قادر است یک نرم افزار شطرنج باز طراحی کند که قادر باشد قهرمان جهان را شکست دهد؟ (در آن زمان گری کیموییچ کاسپاروف سلطان بلامنازع شطرنج بود) این ایده به سرعت به بوته آزمایش گذاشته شد لیکن نتایجی که سیلیکون در مقابل کربن (ریزپردازنده در قیاس با مغز انسانی) کسب می کرد فاجعه بار بود. کامپیوتر ها حتی شانسی برای تساوی هم نداشتند چه رسد به آنکه بر قهرمان جهان فائق آیند. با این وجود همین ماشین های شطرنج باز به سادگی قادر بودند بر اساتید فیده (فدراسیون جهانی شطرنج) غلبه کنند و این مسئله یافتن راهکار را برای برنامه نویسان دشوار می ساخت. چگونه یک ماشین که در طول هفت ساعت مسابقه استاندارد نه احساس خستگی می کند، نه کم خوابی شب قبل بر وی تأثیر گذار است و نه همچون انسان دچار فراموشی می شود و واریاسیون ها را جابجا بازی می کند مقابل قهرمان جهان به سادگی از پای در می آید؟

حتما بخوانید  تفاوت‌های آزمون‎‌های نقطه عطف و کندال

پاسخ این سوال به سرعت پیدا شد! در شطرنج مرسوم است که پس از پایان بازی دو طرف مسابقه بازی خود را تفسیر کنند و به هر آنچه که در حین مسابقه فکر می کرده اند اشاره کرده آن را برای آیندگان مکتوب نمایند. در مقایسه نتایج، تحلیل ماشین از تحلیلی که کاسپاروف ارائه می داد بسیار متفاوت بود. تحلیل کاسپاروف شامل چندین صفحه از مجموعه ای حرکات سلسله وار بود که هیچکدام به دیگری مربوط نبود. جملهء معروفی از کاسپاروف وجود دارد که در طول کارنامه چهل سالهء این اَبَر قهرمان بارها و بارها تکرار شده است: «تمام این واریانت ها را پشت میز دیدم!»

یک مغز انسانی قادر نیست تحلیلی اینجنین ارائه کند و نوادری که مبادرت به این امر کرده اند انگشت شمارند. این جمله کاسپاروف که در ژوئیه 1993 در اتاق تفسیر بیان شد، نقطه پایان زنجیرهء پیوسته پیروزی های انسان بر ماشین را رقم زد. الگوریتمی که باید ماشین را برای آن تربیت می کردند مشخص شده بود: «تحلیل موازی تمامی واریاسیون ها با الگوریتم های موازی». کاری که برای اکثر قریب به اتفاق انسانها غیر ممکن است!

اما تحلیل موازی با استفاده از الگوریتم هایی که این رویا را محقق سازد و ماشین را بر قهرمان جهان غالب کند کافی نبود! کاسپاروف یک پردازش ماتریسی انجام می داد و ماتریس های پیچیده را به سرعت حل می کرد ولی زمانیکه ماشین از الگوریتم موازی استفاده میکرد، دچار تنگی وقت می شد و قادر نبود در زمان قانونی بازی را به پایان رساند. (یکی از انواع باخت در شطرنج اتمام وقت یکی از طرفین است). در سال 1995 شرکت IBM با هزینه ای هنگفت وارد این پروژه شد و تیمی از استاد بزرگان شطرنج را گرد آورد تا تمام واریاسیون های استاندارد را به ماشین آموزش دهند. نتیجه کار خارج از حد تصور بود! یک اَبَر رایانه بنام Deep Blue که ابعادی به اندازه دانشگاه تهران را داشت با 256 قطعه Micro Processor که بطور موازی تمام واریانت ها را پردازش می کردند. هزینه برگزاری رویارویی توسط IBM پرداخت شد و در اکثبر 1996 کاسپاروف به ایالات متحده رفت تا با «آبی ژرف» مصاف دهد. طبق گفته کاسپاروف در این مسابقه «خدا بر انسان غلبه کرد»  ـ غلبه مغز بر ماشین دست ساز انسان ـ و پس از آنکه سومین برد برای کاسپاروف ثبت شد، تیم IBM از ادامه مسابقه انصراف داد.

نرم افزار اتوکد یک نرم افزار قدرتمند در زمینه مهندسی و طراحی است. شما مهندسین آب نیز می توانید از این نرم افزار استفاده کنید. با شرکت در دوره آموزش اتوکد می توانید از قابلیت های آن استفاده کنید.

تنها یک سال بعد IBM موفق به ارائه راهکاری شد که کاسپاروف بطور ذاتی از آن بهره می برد: «تحلیل ماتریسی؛ تبدیل ماتریس به وکتور و در نهایت تبدیل وکتور به اسکالر» این راه حل منتج به نتیجه شد و امروزه هیچ قهرمان جهانی قادر نیست بر ماشین های شطرنج بازی که از این قابلیت بهره می برند فائق آید.

حتما بخوانید  کارگاه آموزشی MATLAB

چگونه می توان تبدیل به یک استاد برنامه نویسی شد؟

در ریاضیات مسئله معروفی وجود دارد بدین صورت که روزی معلمی از دانش آموزانش خواست مجموع اعداد 1 تا 100 را محاسبه کنند. یکی از دانش آموزان در اندک زمانی مسئله را حل کرد و به جواب درست رسید. (نتیجه + سرعت اخذ نتیجه). در واقع کاری که این دانش آموز انجام داد یک پردازش ماتریسی بود. راه حل وی بدین صورت بود که دو ردیف از اعداد ایجاد نماید. ردیف نخست شامل اعداد 1 تا 100 و ردیف دوم که در زیر ردیف قبل چیدمان شده اند سری اعداد 100 تا 1. پس از جمع یکصد ستون عناصر ماتریس با هم، آنچه بدست می آید 100 عددِ 101 است (10100) و چون هر عدد دو بار شمارش شده است کافی است که نتیجه را بر دو تقسیم کنیم تا به جواب مسئله دست یابیم (5050).

این الگوریتم، نگاه انسانی به مسئله را بطور شفاف بیان می کند ولی جالب است بدانیم این الگوریتم از دید ماشین بدترین الگوریتم ممکن است و زمان زیادی صرف نتیجه آن خواهد شد. البته در مورد اعداد 1 تا 100 عدم کارآیی الگوریتم موصوف به خوبی دیده نخواهد شد فلذا رنج اعداد را وسیع تر کرده به عنوان مثال در نرم افزار متلب که گل سر سبد نرم افزارهای تحلیل ماتریسی است می توان چنین نوشت (الگوریتم اوّل):

چنانچه دیده می شود این الگوریتم طی هفت و چهل و چهار صدم ثانیه به جواب دست می یابد. حال می توان همین روال را به طریقهء دیگر نیز طی کرد و بجای تشکیل ماتریس، یک محاسبه از روی مجموع وکتور بدست داد بدین صورت که پس از لیست کردن اعداد، همین لیست را با قرینه آن جمع کنیم بگونه ای که تشکیل وکتور دهد نه ماریس (الگوریتم دوّم):

شاید چشم غیر مسلح (غیر کارشناس) متوجه تفاوت این الگوریتم با حالت قبل نگردد با این وجود چنانچه از خروجی نیز بر می آید سرعت اجرای برنامه بیش از 5 برابر افزایش یافته است!  روال سوّمی که برای حل این مسئله وجود دارد بدین سان است که فردی با خود بگوید ابتدا یک را با دو جمع میکنم، حاصل را به علاوهء 3 نموده با چهار جمع میکنم. به نتیجهء موجود پنج را اضافه کرده، در ادامه با شش جمع می بندم و … (الگوریم سوّم)

سومین الگوریتم طی زمانی در حدود هجده صدم ثانیه و بیش از چهل برابر سریع تر از الگوریتم اول و هفت برابر سریع تر از دومین الگوریتم به پاسخ صحیح مسئله دست میابد. دلیل این  رخداد آنست که الگوریتم نخست، دیدگاه کاملا ماتریسی داشت. الگوریتم دوّم دیدگاه ماتریسی را به دیدگاه وکتور تبدیل کرده و سومین الگوریتم یک تبدیل از وکتور به اسکالر را به انجام رسانده است. به دلیل آنکه سومین الگوریتم در یک حلقه تکرار محاسبات اسکالر را انجام می دهد، تحلیل صورت گرفته نیز گام به گام منتج به نتیجه شده است (تحلیل اسکالر ـ الگوریتم کند شده).

این روال از دیدگاه انسانی کاملا مردود است چراکه جواب را بسیار دیر کشف مقدار می کند. در نتیجه می بینیم که در نگرش انسانی نیز، همواره راه حل هایی انتخاب می شوند که به سرعت نتیجهء کار را عیان سازند. چنانچه احتمالا شما نیز اذعان خواهید داشت این الگوریتم بسیار نامتبوع است. نکته بسیار بسیار جالب اینکه این الگوریتم یکی از بهترین انواع الگوریتم از دیدگاه ماشین است. کافی است نگاهی گذرا به نتیجه کار انداخته و حاصل نهایی را با هم بررسی کنیم (الگوریتم چهارم):

حتما بخوانید  ایجاد بردارهای ستونی در متلب

و اما جنانچه به وضوح مشهود است، بهترین الگوریتم ممکن برای حل این مسئله چهارمین الگوریتم است که تمام محاسباتِ آن، در قالب اسکالر صورت پذیرفته است. بدین صورت که رنج اعداد (اختلاف بیشینه از کمینه) مقدار یابی شده و تعداد اعداد میان این دو حد نیز کشف مقدار گردد. توجه داریم که بیشینه اعداد یک مقدار اسکالر است کما اینکه مقدار کمینه نیز از همین مزیت برخوردار است. در ادامه کافی است اختلاف اعداد بیشینه و کمینه را در طول بازه (اسکالر) ضرب و بر عدد دو (اسکالر) تقسیم کنیم (الگوریتم شتابان). سرعت اخذ نتیجه در این حالت چنانکه دیده می شود، بیش از هشت هزار برابر است!!

آنچه در این مقاله دیدیم حل یک مسئله بسیار بسیار ساده با چهار راه حل گوناگون و الگوریتم متفاوت بود. از دیدگاه افرادی که متخصص نبوده و از علم برنامه نویسی بی بهره اند، این برنامه ها شاید هیچ تفاوتی با یکدیگر نداشه باشند؛ مع الوصف می بینیم که تغییری جزئی در روال حل مسئله، الگوریتمی را بدست داد که هزاران برابر سریع تر منتج به نتیجه گردید. ممکن است هر یک از ما اپلیکیشن هایی بر روی تلفن های هوشمند خود نصب کنیم که کار واحدی را انجام دهند ولی یکی را سنگین و کند و دیگری را سبک و پر سرعت بیابیم. علت چیست؟ استفاده از الگوریتم بهتر در دستیابی به جواب!

توصیه شده تا در برنامه نویسی همواره دید ماتریسی داشته و مسائل را بصورت ماتریسی از ورودی هایی که باید پردازش شوند در نظر بگیریم. پس از تشکیل ماتریس مقادیر در گام اول از تحلیل نوبت به آن می رسد که اجزاء لازم جهت حل مسئله به صورت وکتورهای مجزا تفکیک شده و یک تقسیم بندی در دستجات وکتوری منظم ایجاد کنیم. در ادامهء راه وکتورهای دسته بندی شده را جهت محاسبه نهایی به صورت اعداد اسکالر در آورده و یک محاسبه اسکالر از یک ماتریس پیچیده استخراج کنیم. بسیاری از مواقع دید انسانی مانع از تحلیل درست خواهد بود (مثال مجموع اعداد 1 تا n) با این وجود در محاسبات نرم افزاری متد یاد شده همواره مناسب ترین راه حل جهت تسریع روند محاسبات است. در شرایطی دیگر انجام پردازش های پارالل مناسب است و چنانچه یک پردازش فارغ از نتیجه پردازشی دیگر به انجام می رسد می توان از محاسبات موازی (مثلا حلقه parfor به جای for) استفاده نمود.

دوره استادی متلب انجمن تخصصی مهندسی علوم آب میتواند اصول و نکات کلیدی جهت برنامه نویسی را به علاقمندان انتقال دهد به گونه ای که قادر به ایجاد برنامه هایی با run time کوتاه و دقت بالا بوده و کلیه پردازش های مهندسی علوم آب از جمله پرازش های هیدرولیک، هیدرولوژیک، هیدروژئولوژیک، تغییر اقلیم، فیزیک خاک، پردازش تصاویر ماهواره و … که همگی ذات و ماهیت ماتریسی دارند را بصورت کارآمد و حرفه ای تدوین نمایید. برنامه هایی که برای همیشه با سرعت بالا در آسمان متلب به پرواز درآیند

آرش ازکیا
اگر دورتر ها را دیدم، بر دوش بزرگان ایستاده بودم!
نظر خود را بنویسید:
ثبت دیدگاه
دیدگاه های کاربران
زهرا علیزاده
12:48 - 1399/06/24
پاسخ دهید

درود بر استاد گرانقدر، جناب آقای مهندس ازکیا
قلم شیوا و نگارش های جذاب همیشگی جنابعالی، لذت یادگیری برنامه نویسی رو دوچندان کرد. جدا از محتوای علمی پربار مقالات، شخصا همیشه از قلم استاد لذت برده و سعی میکنم در حد توان و درک خود، از آن بهره مند شوم.
پایدار و برقرار باشید.

    الهه گودرزی
    15:06 - 1399/06/24
    پاسخ دهید

    با سلام و ادب ..
    سرکار خانم دکتر علیزاده عزیز از جملات زیبا، صمیمانه و نظر منصفانه شما سپاسگزاریم. قطعا رضایتمندی شما عزیزان، ادامه‌ی مسیر را برای این مجموعه پرتلاش، هموارتر خواهد کرد.
    همچنین، مراتب تقدیر و قدرانی خود را نیز از استاد بزرگوارم، جناب آقای مهندس ازکیا، که با قلم شیوا و بیان رسا در تسهیل انتقال مفاهیم به مخاطبین ارجمند میکوشند، ارائه میدارم.
    با آرزوی موفقیت روزافزون برای شما

    آرش ازکیا
    15:23 - 1399/06/24
    پاسخ دهید

    خواستم تا دین ز شه پنهان کنم
    آنکه دین اوست ظاهر آن کنم
    شاه بویی برد از اسرار من
    متهم شد پیش شه گفتار من

    عرض سلام و ادب و احترام حضور شریف سرکار خانم دکتر علیزاده گرانقدر
    حقیر بر خود واجب می داند تا از چند وجه و جنبه گوناگون از حضرت دوست سپاسگزار باشد و مراتب امتنان و احترام خویش را نیز به عرض مبارک برساند. نخست آنکه با وجود مشغله های بسیار، وقت ذی قیمت خویش را صرف مطالعه سیاههء بندهء بی مقدار می فرمایید و همواره لطف و عنایت خواهرانه خویش را ابراز و حقیر را در ادامه راه، راسخ تر و مصمم می نمایید. وجه دیگر آنکه طی افتخار تقدیم خدمت سه چهار ساله ای که نصیب فرموده اید، نیک می دانم که آن حضرت، خود در امر برنامه نویسی سرمشق و استاد هستند و با این وصف آنچنان که بر همگان مشهود است از سیاههء چاکر تجلیل کرده، مباهات جان نثار را صد چندان افزون می فرمایند. سوم آنکه پیوسته و مکرر بندهء کمترین را که خادمی بی مقدار می باشد «استاد» خطاب فرموده و از این منزل وزن و قیمت اعطا می فرمایید.
    از حضور گرم و صمیمانه حضرتعالی مشعوف و سپاسگزار بوده، سلامتی و شادکامی را برایتان آرزومندم. مویّد باشید. انشاء الله!

لطفا صبر کنید