چطوری میخوام برنامه نویس بهتری بشم

اگه نوشته ی قبلیم مطالعه کرده باشید میبیند که هفته‌ی قبل به یک نتیجه گیری و تصمیم مهمی رسیده بودم.من برنامه نویس خوبی نیستم٬ باید مهارت‌هام و تسلطم بالاتر ببرم.برای اینکه بفهمین چطور به اون نتیجه گیری رسیدم میتونین به نوشته‌ی قبلیم مراجعه کنید https://virgool.io/@abdollahkeshtkar/%D8%AA%D8%B5%D9%85%DB%8C%D9%85-%DA%AF%D8%B1%D9%81%D8%AA%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D8%A8%D8%B4%D9%85-apfewogkggtp در اینجا میخوام بهتون بگم که چطوری میخوام برنامه نویس بهتری بشم٬ شاید کسی بتونه استفاده کنه.چطور میخوام برنامه نویس بهتری شم؟ایراد اولی: تمیزی کد و معماری نرم افزاراگه استاد دانشگاهی باشین یا معلمی یا بالاخره کسی باشین که همیشه کد های بقیه رو میخونه میبینین که خیلی از تازه وارد ها و برنامه نویسا حتی ارشد کد‌هاشون خیلی کثیف و داغونه٬ نام گذاری متغیر هاشون بطور x, y, zه٬ کد هاشون هیچ معماری خاصی نداشت٬ تکرار کد و کلی ایراد دیگه٬ خودمم اینطوری بودم هنوزم هستم:))بیایید بهتون بگم چرا این خیلی بدهآذر ۹۸ یک پروژه‌ی ساخته شده با جنگو تحویل گرفتم٬ قرار بود باگ‌ها و فیچر‌هایی که کلاینت میگفت رو رفع کنم٬ خب این برای من مشکلی نبود بالاخره یه سال دو سال جنگو کار کرده بودم و رو پایتون تسلط خوبی دارم.تا اینکه پروژه رو تحویل گرفتم و خب٬ برگ‌هام کلهم اجمعین ریختن زمین:)))خوانایی کد = ۰, بهینگی کد = ۰, DRYبودن کد = ۰, و کلا پروژه نگهداری ازش کار هفت خان رستم بوده٬ خلاصه منم بدنم مور مور شد و گفتم Challenge Accepted.نشستم اول خط به خط کد ها رو خوندم٬ کد ها به این صورت بود که بین خط ها یه دونه فاصله هم نبود٬ بجونم قسم :)پس دو روز اولی نشستم کل کد ها رو مرتب و تمیز کردم٬ جاهایی که نیاز بود اسم متغیر ها هم درست کردم و خوانایی کد رو بردم بالا که حداقل بتونم با یه نگاه حدس بزنم چکار میکنه بالاخره یه دونه Comment هم نداشت.اینم بگم پروژه توسط بچه های صنعتی اصفهان نوشته شده٬ قابل توجه دانشجو ها اینکه دانشگاه این مباحث یادنمیده و بهتره خودمون دنبالش بریم.از این پروژه چی یاد گرفتم؟با صرف نظر از مباحث فنی که یادگرفتم٬ فهمیدم اگه براساس معماری خاصی یا کلا بدون معماری برنامه‌ام بنویسم٬ نگهداری ازش کار فوق العاده سختی میشه و فهمیدم که مباحث Clean Code خیلی مهمتر اون چیزی بود که فکر میکردم.راه حل این مشکل؟تصمیم گرفتم دو کتاب بخونم٬ کتاب باحال Clean Code اقای Robert Cecil Martin و Clean Architecture از همین آقا.خودم تازه Clean Code رو شروع کردم و دو فصل اولش که خوندم واقعا به نتایج خیلی بهتری رسیدم.یکی از باحالترین قسمت‌هاش که برای منم خیلی جالب بود٬ نام گذاری متغیر ها بود٬ دوتا تیکه کد میزاشت همه چی کد یکی بود فقط اولی اسم متغیر ها یه جوری بود دومی اسم متغیر مناسب بود. با نگاه کردن به کد دومی بدون هیچ کامنتی راحت میشد فهمید که چکاره اس این کد.کتاب دومی هم هروقت این کتاب رو تموم کردم شروعش می‌کنمایراد دومی: زبان مادری برنامه نویسینکته: زبان اولم پایتونه پس فعلا میخوام رو بهتر کردن پایتونم حرف بزنم.همه با بحث‌های زبانی آشنایی داریم٬ خودمم کلی وارد Languages war شدم :))ولی اینجا بحثم این نیست که کدوم زبان بهتره کدوم بدتره٬ میخوام راجب تسلط رو زبان بنویسم٬ بنظرم هر برنامه نویسی باید یک زبانی داشته باشه که سر و تهش بفهمه.همه میدونیم که هر زبان ویژگی ها و روش های خاص خودش برای پیاده کردن داره٬ تو پایتون هم به این روش و ویژگی ها میگیم پایتونیک یه نمونه هم list comprehensionهاست.خیلی‌ها وقتی یک زبانی یادمیگیرن تا یه محدوده ای یادش میگیرن مثلا درحد شی گرایی یا آدم هایی که از بقیه زبان‌ها مثل Java به پایتون مهاجرت میکنن از تکنیک های پایتونیک خبری نداری و خلاصه درگیر این مباحث نمیشن چون میدونیم دیگه همه ی زبان ها ویژگی های مشترک دارن پس منی که فردا رفتم dart یاد بگیرم فقط چیزهایی که توی پایتون و بقیه زبان ها یادگرفتم اونجا یاد میگیرم و از تکنیک های خودش غافل میشم.چرا این بده؟یه مثال ساده: فرض کنید لیست اعداد دارید و میخواهید میانگین اون لیست رو حساب کنیداحتمالا اینجوری بنویسیدmy_cool_list = [10, 4, 16, 20] avg = sum(my_cool_list) / len(my_cool_list) print(avg) # or my_cool_list = [10, 4, 16, 20] sum_of_values = 0 for number in my_cool_list: sum_of_values += number avg = sum_of_values / len(my_cool_list) print(avg)طبق مواردی که خیلی زیاد دیدم (بین دانشجو ها) بیشتر به صورت زیر مینویسندرحالی که پایتون تابع mean از کتابخونه statistics برای محاسبه میانگین داره.from statistics import mean my_cool_list = [10, 4, 16, 20] print(mean(my_cool_list))البته این مثال خیلی ساده ایه و میشد مثال های پیچیده تری نوشت ولی میخواستم منظورم برسونم.چطور میخواهم این مشکل رو حل کنم؟جدیدا هروقت میخواهیم یه ابزاری یادبگیریم یا زبان جدیدی یادبگیریم میریم طرف udemy یا اگه انگلیسی خوب نیستیم میریم فرادرس. بنظرم برای شروع این روش‌های خوبی هستن ولی به مرور این روش ها مشکل ساز میشن٬ درجریانیم که فیلم های آموزشی مثل کتاب جزئیات ندارن.پس من تصمیم گرفتم بین دوتا کتاب Fluent Python و Python Cookbook یکی رو بردارم که درنهایت بخاطر مواردی که قبلا گفتم (اینکه موارد پایه داره یادم میره) بنظرم باید از صفر زبانو مرور کنم و پایه ام و هم چنین سطح فعلیم بالاتر ببرم.ایراد سومی: ساختمان داده و طراحی الگوریتم‌هاساختمان داده و طراحی الگوریتم‌ها دوتا اسمین که ۹۰درصد دانشجو های رشته‌ی کامپیوتر ازشون متنفرن ولی بخواهیم نخواهیم کل برنامه نویسی براساس این دوتا مبحث هست.چرا ما باید روش های نوشتن الگوریتم یادبگیریم؟بیایید با مثال جالب شروع کنیمتیکه کد زیر رو ببینیدdef fib(x: int) -> int: if x <= 2: return 1 else: return fib(x - 1) + fib(x - 2) این تابع فیبوناچی مقدار ورودی رو با استفاده از روش بازگشتی حل میکنه٬ کده سالمه و مشکلی نداره.حالا به تیکه کد زیر نگاه کنیدcalculated_values = {} def fib(x: int) -> int: if x <= 2: return 1 else: if x not in calculated_values: calculated_values[x] = fib(x - 1) + fib(x - 2) return calculated_values[x]در اینجا ما مقدار هایی که حساب کردیم ذخیره میکنیم تا نیاز نشه دوباره حساب کنیممیدونین فرقشون چیه؟ به مقایسه‌ی زیر نگاهی بندازین(به ترتیب تایمی که طول کشید برای محاسبه n برای روش اول و دوم به ثانیه)محاسبه فیبوناچی عدد ۲۰م: 0.006s - 0.0000031sمحاسبه فیبوناچی عدد ۳۰م: 0.2s - 0.0000033sمحاسبه فیبوناچی عدد ۴۰م: 25s - 0.0001sمحاسبه فیبوناچی عدد ۵۰م: *فک نکنم هیچوقت تموم شه* - 0.00017sهمانطور که میبیند روش دوم با اختلاف خیلی زیاد سریعتره٬ این است قدرت الگوریتم و روش خوب:)چطور مهارت های الگوریتم نویسیمون بالاتر ببریم؟در اینجا بنظرم بهترین روش برای ارتقا مهارت‌های الگوریتم نویسیمون خوندن و مطالعه کردن راجب الگوریتم ها می‌باشد٬ و بنظرم چیزی نیست که بخواهیم با تجربه کردن بیشتر توش پیشرفت داشته باشیم٬ با مطالعه خیلی پیشرفت بهتری میشه داشتکتابی که مد نظرمه برای این بحث کتاب The Algorithm Design Manual از آقای Steven Skiena هست.من قراره چطور مطالعه کنم و این ایرادهایی که دارم رفع کنم؟فکر کنم خیلی رو این مورد تاکید کردم که حافظه ام ماهیه پس نیازه روشم متفاوت باشه٬ فکر کنم خیلی هامون میدونیم که هرچی خودمون درگیر یه بحثی کنیم بیشتر یادمیگیریم و بیشترین سطح یادگیری٬ یاد دادنه.اره تدریس و یاد دادن بهترین روش برای یادگیریه.برنامه ام چیه؟خیلی وقته که دلم میخواست یک سایتی داشته باشم که توش مباحثی که یادمیگیرم ویا مشکلاتی که حل میکنم داخلش بنویسم بخاطر همین تصمیم گرفتم سایت جدید بسازم و ساختم.همزمان سه تا کتاب Clean Code, Fluent Python و The Algorithms Design Manual شروع میکنم و هر مبحثی که یاد میگیرم توی سایتم مینویسم تا اینجوری هم تو مغز خودم سیو باشه و هم شاید کمکی برای بقیه و رفرنسی باشه.فعلا سایته خالیه و کامل نیست٬ مرحله‌ی سئوش هستم و هروقت تموم شد اینجا معرفیش میکنم و شروع میکنم ترکوندن :)ممنونم که تا اینجا خوندید٬ امیدوارم براتون مفید واقع بشه.اگه نظری پیشنهادی دارین حتما بگین.نوکرتون عبداله کشتکار - برنامه نویسی که فکر میکنه برنامه نویسی بلده