عبداله کشتکار
عبداله کشتکار
خواندن ۶ دقیقه·۴ سال پیش

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

اگه نوشته ی قبلیم مطالعه کرده باشید میبیند که هفته‌ی قبل به یک نتیجه گیری و تصمیم مهمی رسیده بودم.

من برنامه نویس خوبی نیستم٬ باید مهارت‌هام و تسلطم بالاتر ببرم.

برای اینکه بفهمین چطور به اون نتیجه گیری رسیدم میتونین به نوشته‌ی قبلیم مراجعه کنید

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 شروع میکنم و هر مبحثی که یاد میگیرم توی سایتم مینویسم تا اینجوری هم تو مغز خودم سیو باشه و هم شاید کمکی برای بقیه و رفرنسی باشه.

فعلا سایته خالیه و کامل نیست٬ مرحله‌ی سئوش هستم و هروقت تموم شد اینجا معرفیش میکنم و شروع میکنم ترکوندن :)


ممنونم که تا اینجا خوندید٬ امیدوارم براتون مفید واقع بشه.

اگه نظری پیشنهادی دارین حتما بگین.

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

کلین کدپایتون
مهندس نرم‌افزار | عاشق پایتون و ری‌اکت | https://akeshtkar.com/
شاید از این پست‌ها خوشتان بیاید