ساختار داده ها و الگوریتم ها به زبان آدمیزاد !

بعد از خواندن این مقاله ، آدم قبل نخواهی بود !!
بعد از خواندن این مقاله ، آدم قبل نخواهی بود !!


مقدمه

حقیقتش نمیخام فاز خفن بودن رو بردارم بیام مثل بقیه مقالات و کتاب ها یه سری فرمول و مفاهیم انتزاعی رو بیان کنم! راستش رو بخواهید نه من مهندس جعفرنژاد قمی هستم نه شما حوصله خوندن چنین چیزهای رو دارید :D

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

قطعا بعد از خوندن این مقاله شما هم مثل من کلی باحالتر کدنویسی می کنید ...

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


شروع :

Big O notation - نماد اُ تُپل مُپل

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

پیش خودم گفتم واقعا تمام برنامه نویس ها اینا رو بلدن ؟؟ ای بابا اینا چقدر خفن هستن :| ولی یکم که جلوتر رفتم و بیشتر مطالعه کردم متوجه شدم نه اینقدرها هم ترسناک نیست ،تازه تپل مپل و جالب هم هست ...


تصویر ذهنی من بعد از مطالعات فراوان از این مفهوم سخت :)
تصویر ذهنی من بعد از مطالعات فراوان از این مفهوم سخت :)


بخوام ساده براتون توضیح بدم "نماد O بزرگ" یه روش هست توی ریاضیات محض که برای طراحی الگوریتم و پیشبینی رفتار الگوریتم ها استفاده میشه !

خُب چه دردی رو از یه برنامه نویس دوا میکنه ؟ 3 تا کار برای ما انجام میده :

اول : خوانایی بهتر الگوریتم

دوم : سرعت بیشتر برنامه

سوم : مصرف کم تر حافظه

حالا این تُپل چطوری این کارها رو میکنه ؟

یه پسر بچه تُپل لُپ گُلی به اسم Big O notation رو در نظر بگیرید ، حالا یه ظرف ماکارونی نارنجی رنگ (فانکشن ، متد ، الگوریتم ...! ) گذاشتین جلوش ، خب حالا شروع میکنه به خوردن کد های اضافی ما دیگه !

لظفا بگذارید برایتان مثالی بزنم :

فرض کنید میخواهی که جمع اعداد مثبت رو حساب کنیم ،خب مثلا جمع 5 عدد اول اعداد طبیعی رو به صورت زیر حساب میکنیم :

1+2+3+4+5 = 15   //  OK :|

خب این که آسونه ، حالا بخواهیم جمع 100 تا عدد طبیعی اول(ابتدا) رو حساب کنیم مسلما نیاز به یک فانکشن داریم ؛ فانکشن (تابع) رو میتونیم به صورت زیر بنویسیم :

function addNum(n) {
var total = 0;
for (var i = 0; i <= n; i++) { total += i; }
return total 
}
var number = addNum(100); 
// حالا اینجا  میتونیم مثلا با قرار دادن عدد 100 ، جمع 100 تا عدد طبیعی رو حساب کنید

خُب حالا از Big O استفاده میکنیم ، تُپلی به ما میگه که باید این کد ها رو به یک فرمول ساده قابل درک تر تبدیل کنید خب این کار به این صورت هست که ما خط به خط کد رو تحلیل میکنیم ببینیم چه بلای داره سر ورودی یا خروجی ما میاد (اعمال ریاضی) بعد با توجه به تحلیل اعمال ریاضی انجام شده روی ورودی ما میتونیم به یه فرمول برسیم :

function addNum(n) {
return  n * (n + 1) / 2  }
var number = addNum(100);

دیدید چه با حال شد :D

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

پس ، لطفا فقط خروجی کار براتون مهم نباشه !


Arrays vs Objects

حقیقتش رو بخواهید من زمانی که پایتون رو یاد گرفتم ، تفاوت خیلی چیزا رو تو زندگیم حس کردم :D

پایتون با داشتن 14 نوع از انواع مختلف داده (کی اولین بار گفته پایتون آسونه ؟ مگ دستم بهش نرسه ! ) یکی از گزینه های مناسب استفاده در علم داده هست ، ولی خُب حقیقتش رو بخواهید ما جاوا اسکریپت کارا خیلی در مورد این چیزا به مشکل نمیخوریم ، همه‌مون به صورت ذاتی ! تقریبا میفهمیم کجا آرایه استفاده کنیم کجا آبجکت (شی) ولی جالبه اگر بدونید در جاوااسکریپت :

{ } آبجکت (شی) : ما زمانی که بخواهیم حجم زیادی از اطلاعات رو داشته باشیم که به اون ها سریع دسترسی پیدا کنیم میایم از شی ها استفاده میکنیم ، دقیقا زمانی از شی ها استفاده میکنیم که خیلی دسته بندی اطلاعات برامون اهمیت نداشته باشه !

شاید براتون جالب باشه ما با مِتُد ()Object.entries میتونیم هر عضو آبجکت رو به آرایه به صورت [key, value] تبدیل کنیم :|

[ ] آرایه : شاید جالب باشه بدونید یک از معانی ترجمه کلمه Array به زبان فارسی میشه منظم کردن ! خب از همین معنی شما کاملا متوجه شدید که زمانی دست بندی (جستجو) مد نظرمون هست باید از این نوع تایپ استفاده کنیم ، آرایه ها حدود 30 تا متد دارند که واقعا خیلی جذاب هستن ، نیازی نیست همه رو یادبگیرید ولی سعی کنید اون متد های اصلی رو حتما خوب درک کنید !

آرایه ها از نظر پرفرمنس پایین تر از شی ها هستند !

معمولا ما تو برنامه هامون همیشه سعی میکنیم از ترکیب این دو استفاده کنیم تا هم بتونیم بهترین پرفرمنس رو داشته باشیم هم دستمون باز باشه کلی متد برای استفاده داشته باشیم !

 [    {key:value} ,  {key:value} ,  {key:value} ,  {key:value}    ]


problem solving مهارت حل مسئله

خُب رسیدیم به موضع مورد جذاب و مورد علاقه ی من ! بنده با این موضوع توی دانشگاه آشنا شدم (بالاخره دانشگاه که همش مضر نیست :D) ، البته از اونجایی که به مباحث روانشناسی علاقه داشتم خارج از دانشگاه هم دنبال این موضوع رفتم ...

حقیقتش رو بخواهید این مهمترین مهارت یک برنامه نویس هست ، اصلا اگر رئیس فرهنگستان زبان و ادب فارسی شخصا از من بپرسه یه اسم جایگزین برای شغل "برنامه نویسی" پیشنهاد بده من قطعا بهش میگم غلامعلی جان بزار "مشکل باز کن" :D (امیدوارم جناب حداد عادل مقاله بنده رو نخونن !)

شما رو اصلا استخدام میکنن و بهتون پول میدن که مشکلات رو حل کنید ! حالا مشکل چیه ؟ مشکل هر چیزی میتونه باشه! به مثال زیر توجه کنید (لطفا در مثال زیر مناقشه نکنید ) :

عنوان پروژه : فروشگاه اینترنتی صنایع دستی

بودجه پروژه : 500 هزار تومان

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

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

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

البته این داستان تخیلی یه مثال کلی بود که ممکنه تو هر نقطه ای از زندگی ما رخ بده نه فقط لا به لای کدها !

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

مراحل حل مسئله :

۱. فهم مسئله : دراین مرحله می‌باید درک کاملی از مسئله در ذهن خواننده به وجود آورید. این یعنی باید بفهمیم مسئله چه معلوماتی بما داده‌است وچه مواردی را از ما خواسته‌است. ( باگ دقیقا چیه ؟ )
۲. انتخاب روش در این مرحله با استفاده از درکی که از مسئله در ذهن ما وجود دارد یکی از روش‌های حل مسئله مناسب با این مسئله را انتخاب می‌کنیم (میتونیم توی اینترنت سرچ کنیم یا از یه برنامه نویس دیگه کمک بگیریم)
۳. اجرای روش: حال که روش مناسب را انتخاب کردیم ان را اجرا می‌کنیم (کد های جدید رو جایگزین کد های قبلی می کنیم )
۴. بازگشت به عقب:جواب‌های بدست آمده را با صورت مسئله مقایسه کرده و یکبار دیگر مراحل بالا را مرور می‌کنیم تا مطمئن شویم قسمتی از مسئله را اشتباه نرفته یا جا نینداخته باشیم (از رفع باگ مطمئن میشیم بعد دلایل ایجاد باگ و نحوه ی دیباگ رو تو ذهن میسپاریم یا یاداشت میکنیم )

بعد از مطالعه این چهار مرحله ، فکر کنم الان دقیقا فهمیدید که چرا هرچی برنامه نویس ها حرفه ای تر میشن ، کمتر باگ درست میکنن :D

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

Algorithms and flowcharts الگوریتم و فلوچارت

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


راستی اگر سه گانه ی معروف "شروع یادگیری برنامه نویسی" رو نخوندی همین الان شروع کن!

هشدار : مقاله زیر به شدت اعتیاد آور است !


{ لینک مقاله شروع یادگیری برنامه نویسی }


https://vrgl.ir/TOPrC


قطعا نظرات شما مایه‌ی مفاخرت و مباهات اینجانب می باشد ?