#django_roadmap #roadmap
امروز یک دوستی، گفت بهش یک roadmap برای شروع جنگو بدم با این بکگراند :
۱- پایتون رو تا سطح خوبی بلد هست
۲- ساختمان داده و الگوریتم رو میشناسه
۳- لینوکس، گیت و داکر رو هم بلده
یک بخش دیگه که باعث میشه این Roadmap رو بنویسم، همین موضوع هست که خیلی از بچهها بهم گفتند چطوری تونستی بعد از ۲ هفته یادگیری جنگو شروع به کار کنی ؟
اول باید بگم که من ۲ هفتهای فهمیدن جنگو رو مدیون زحماتی هستم که روی پایتون کشیدم، بر عکس خیلیها که شروع میکنند فریمورک یادگرفتن من فارغ از فریمورک توسعه وب رو یاد گرفتم و بعد اومدم سراغ جنگو (هرچند توی جنگو خیلی جا برای پیشرفت دارم و باید زحمتش رو بکشم هنوز)
برای همین هست که وقتی کسی بهم میگه roadmap بده میگم ۳-۶ ماه اول فقط پایتون، من به خیلیها گفتم کتاب
رو جلوت بذار و سرفصلهاش رو بخون، اگر مفهومی رو بلد نیستی یعنی هنوز آماده نیستی که بری سراغ فریمورک (حالا اینکه این موضوع برای نسل آینده برنامهنویسی توسعه میشه، خودش یک داستان هست. یعنی این نسخه رو نمیشه برای همه پیچید ولی قطعاً این بهترین راه هست)
تکنیکی که شخصاً باهاش فریمورک و ... رو یاد میگیرم، مختص خودم هست و اسمش رو منبع سوزی میذارم، چطوری هست ؟
۱- اول مطمئن میشم با اون فریمورک ارتباط برقرار میکنم و جوگیر شدن و ... درکار نیست
برای مثال روی همین جنگو :
اول رفتم سراغ این پلی لیست :
Youtube Playlist
دفعهی اول با سرعت 3x نگاهش کردم کامل که تقریباً ۱ روز جمعهام رو گرفت، بعد یک سری تحقیق کردم و مطمئن شدم ازین فریمورک خوشم اومده
دفعهی دوم همین پلی لیست رو با دقت بیشتر و روی سرعت 1.5x نگاه کردم.
توی این تکنیک برای قدم اول هیچ نیازی به کد زدن نیست، شما تکیه میدی و از دیدن فیلم لذت میبری، توی دفعهی دوم دیدن ویدئو منابع مهم رو روی یک مرورگر دیگه باز میکنید مثلاً: من متوجه شدم چیزهایی به اسم :
وجود داره و همینجا متوجه شدم نیاز من یادگیری با جزئیات
هست و نه
2- یادگیری از یک منبع مناسب، من کتابهای زیادی رو خوندم چون منبع جامع و مناسبی پیدا نکردم برای
ولی دیروز شروع کردم به خوندن یک کتابی که سرفصلهای جالبی داشت و ۳ فصل اول رو خوندم و تموم شد که بنظرم منبع خیلی خوبی اومد نسبت به کتابهای دیگری که خوندم :
Becoming an Enterprise Django Developer
By Michael Dinder (Packt pub)
دقت کنید من هنوز کل این کتاب رو نخوندم ولی تا اینجا خیلی خوب توضیح داده برای شروع.
توی این قدم معمولاً اینطوری عمل میکنم که وقتی ۱ فصل رو خوندم و تموم شد، چند ساعتی به کارهام میرسم و بعد بر میگردم سراغ کتاب اما قبل از شروع فصل جدید بدون اینکه به کتاب رجوع کنم سعی میکنم کل نیازمندی و چیزی که توی اون فصل یادگرفتم و نیاز هست برای فصل بعدی رو بر اساس یادگیریم پیادهسازی کنم.
وقفه بین کتاب و کد برای این هست که مطمئن بشم چیزی رو از حفظ نمیزنم و موضوع رو درک کردم تنها منبعی که میشه توی این بخش ازش استفاده کرد : گوگل + داکیومنت رسمی جنگو هست
۳- هرکتابی که انتخاب کنید، وقتی یک مفهوم رو توضیح میده برای موارد بیشتر و دقیقتر به منبع اصلی
وقتی یک فصل رو تموم میکنید، بعد از اینکه اون فصل رو کدهاش رو زدید و تموم شد
باید برگردید روی کتاب و همون فصل و منابعی که برای خوندن بیشتر بهتون معرفی کرده رو بخونید.
این قدم بسیار بسیار مهم هست، چون هم با اصطلاحات آشنا میشید، هم با اکو سیستم اون فریمورک و هم یاد میگیرید چطور باید از داکیومنت فریمورک استفاده کنید بدون اینکه وقت تلف کنید.
قدم ۴ - یادگیری هیچوقت متوقف نمیشه، نیاز شما هم هیچوقت یکسان و ثابت نیست، بر اساس نیاز منابع جدید پیدا میکنید، سورس کد باقی افراد رو میخونید که به سمت یک نویسنده یا مدرس بایاس نشید، توی این قدم هرجوری که حال میکنید ادامه بدید.
پس اگر از نحوه خوندن من و البته بخش اول که پیشنیاز هست بگذریم ۴ تا منبع معرفی میشه کرد :
1- YouTube PlayList
نسخه
2- Becoming an Enterprise Django Developer By Michael Dinder (Packt pub)
3- Django documentation
4- Django Rest Framework
و در نهایتاً نمیشه توسعه دهنده جنگو باشید و عضو بزرگترین کامیونیتی جنگو فارسی نباشید :
@DjangoEx
صاحب کانال رو میشناسم و به هدفش ایمان دارم، از روز اول هم دنبال کنندهاش هستم و خواهم بود.
امروز یک دوستی، گفت بهش یک roadmap برای شروع جنگو بدم با این بکگراند :
۱- پایتون رو تا سطح خوبی بلد هست
۲- ساختمان داده و الگوریتم رو میشناسه
۳- لینوکس، گیت و داکر رو هم بلده
یک بخش دیگه که باعث میشه این Roadmap رو بنویسم، همین موضوع هست که خیلی از بچهها بهم گفتند چطوری تونستی بعد از ۲ هفته یادگیری جنگو شروع به کار کنی ؟
اول باید بگم که من ۲ هفتهای فهمیدن جنگو رو مدیون زحماتی هستم که روی پایتون کشیدم، بر عکس خیلیها که شروع میکنند فریمورک یادگرفتن من فارغ از فریمورک توسعه وب رو یاد گرفتم و بعد اومدم سراغ جنگو (هرچند توی جنگو خیلی جا برای پیشرفت دارم و باید زحمتش رو بکشم هنوز)
برای همین هست که وقتی کسی بهم میگه roadmap بده میگم ۳-۶ ماه اول فقط پایتون، من به خیلیها گفتم کتاب
Fluent Python
رو جلوت بذار و سرفصلهاش رو بخون، اگر مفهومی رو بلد نیستی یعنی هنوز آماده نیستی که بری سراغ فریمورک (حالا اینکه این موضوع برای نسل آینده برنامهنویسی توسعه میشه، خودش یک داستان هست. یعنی این نسخه رو نمیشه برای همه پیچید ولی قطعاً این بهترین راه هست)
تکنیکی که شخصاً باهاش فریمورک و ... رو یاد میگیرم، مختص خودم هست و اسمش رو منبع سوزی میذارم، چطوری هست ؟
۱- اول مطمئن میشم با اون فریمورک ارتباط برقرار میکنم و جوگیر شدن و ... درکار نیست
برای مثال روی همین جنگو :
اول رفتم سراغ این پلی لیست :
Youtube Playlist
دفعهی اول با سرعت 3x نگاهش کردم کامل که تقریباً ۱ روز جمعهام رو گرفت، بعد یک سری تحقیق کردم و مطمئن شدم ازین فریمورک خوشم اومده
دفعهی دوم همین پلی لیست رو با دقت بیشتر و روی سرعت 1.5x نگاه کردم.
توی این تکنیک برای قدم اول هیچ نیازی به کد زدن نیست، شما تکیه میدی و از دیدن فیلم لذت میبری، توی دفعهی دوم دیدن ویدئو منابع مهم رو روی یک مرورگر دیگه باز میکنید مثلاً: من متوجه شدم چیزهایی به اسم :
Redis, Celery, Flower, django rest framework, ...
وجود داره و همینجا متوجه شدم نیاز من یادگیری با جزئیات
DRF
هست و نه
Django forms
یا template
نویسی پس این دو مورد رو خیلی کم روش وقت گذاشتم.2- یادگیری از یک منبع مناسب، من کتابهای زیادی رو خوندم چون منبع جامع و مناسبی پیدا نکردم برای
DRF
ولی دیروز شروع کردم به خوندن یک کتابی که سرفصلهای جالبی داشت و ۳ فصل اول رو خوندم و تموم شد که بنظرم منبع خیلی خوبی اومد نسبت به کتابهای دیگری که خوندم :
Becoming an Enterprise Django Developer
By Michael Dinder (Packt pub)
دقت کنید من هنوز کل این کتاب رو نخوندم ولی تا اینجا خیلی خوب توضیح داده برای شروع.
توی این قدم معمولاً اینطوری عمل میکنم که وقتی ۱ فصل رو خوندم و تموم شد، چند ساعتی به کارهام میرسم و بعد بر میگردم سراغ کتاب اما قبل از شروع فصل جدید بدون اینکه به کتاب رجوع کنم سعی میکنم کل نیازمندی و چیزی که توی اون فصل یادگرفتم و نیاز هست برای فصل بعدی رو بر اساس یادگیریم پیادهسازی کنم.
وقفه بین کتاب و کد برای این هست که مطمئن بشم چیزی رو از حفظ نمیزنم و موضوع رو درک کردم تنها منبعی که میشه توی این بخش ازش استفاده کرد : گوگل + داکیومنت رسمی جنگو هست
۳- هرکتابی که انتخاب کنید، وقتی یک مفهوم رو توضیح میده برای موارد بیشتر و دقیقتر به منبع اصلی
reference
میده، مثلاً کتاب بالاوقتی یک فصل رو تموم میکنید، بعد از اینکه اون فصل رو کدهاش رو زدید و تموم شد
باید برگردید روی کتاب و همون فصل و منابعی که برای خوندن بیشتر بهتون معرفی کرده رو بخونید.
این قدم بسیار بسیار مهم هست، چون هم با اصطلاحات آشنا میشید، هم با اکو سیستم اون فریمورک و هم یاد میگیرید چطور باید از داکیومنت فریمورک استفاده کنید بدون اینکه وقت تلف کنید.
قدم ۴ - یادگیری هیچوقت متوقف نمیشه، نیاز شما هم هیچوقت یکسان و ثابت نیست، بر اساس نیاز منابع جدید پیدا میکنید، سورس کد باقی افراد رو میخونید که به سمت یک نویسنده یا مدرس بایاس نشید، توی این قدم هرجوری که حال میکنید ادامه بدید.
پس اگر از نحوه خوندن من و البته بخش اول که پیشنیاز هست بگذریم ۴ تا منبع معرفی میشه کرد :
1- YouTube PlayList
نسخه
DRF
هم هست (اگر دوست داشتید توی همون کانال ببینید) 2- Becoming an Enterprise Django Developer By Michael Dinder (Packt pub)
3- Django documentation
4- Django Rest Framework
و در نهایتاً نمیشه توسعه دهنده جنگو باشید و عضو بزرگترین کامیونیتی جنگو فارسی نباشید :
@DjangoEx
صاحب کانال رو میشناسم و به هدفش ایمان دارم، از روز اول هم دنبال کنندهاش هستم و خواهم بود.
🧑💻PythonDev🧑💻 pinned «#django_roadmap #roadmap امروز یک دوستی، گفت بهش یک roadmap برای شروع جنگو بدم با این بکگراند : ۱- پایتون رو تا سطح خوبی بلد هست ۲- ساختمان داده و الگوریتم رو میشناسه ۳- لینوکس، گیت و داکر رو هم بلده یک بخش دیگه که باعث میشه این Roadmap رو بنویسم، همین…»
توی دورههای آموزشی و دانشگاه چیکار میکنند ؟!
چرا همه جوری صحبت میکنند که انگار همین یک دوره، همین یک کتاب یا ... برای کار و کل عمر کفایت میکنه ؟!
نکنید اینکارو، Junior های عزیز بعضی ازین برگذار کنندههای دوره که فقط به فکر سود شخصی هستند شما مراقب باشید سمت این افراد نرید.
نه بخاطر پول، حتی نه بخاطر وقت که دقیقاً تو دنیای الان برنامهنویسی مثل طلا میمونه
بلکه بخاطر اینکه خیلی از شما دوستان اشاره کردید به گرد ناامیدی شدن پستهای کانال براتون
پستهای کانال سطح بالاتری از تازهکار داره، حتی ممکنه یک سنیور رو ببینید که این مطالب رو بلد نیست (اشکالی هم نداره تا حدودی، چون بهش نیازی نداشته شاید)
اولین کاری که میکنید وقتی دوره تموم شد، اینه که برید مصاحبه
مصاحبهها حتی اگر فقط رد بشید، بهتون کلی اطلاعات مهم میده اینکه بازار کار چی میخواد و چه مواردی رو باید بلد باشید
اگر رد نشدید، که بسیار هم عالی شغل پیدا کردید و این شغل یعنی کلی چیز جدید یاد گرفتن (مخصوصاً برای تازهکار)
حتی بعد از اینکه شغل پیدا کردید، باید یاد بگیرید مصاحبه کنید
این حق شما هست که دنبال کار بهتر با مزایای بیشتر باشید حتی اگر ۱ ماه بعد کار بهتری رو پیدا کنید.
مصاحبه دادن و نترسیدن از رد شدن توی مصاحبه، اولین و مهمترین قدم برای پیشرفت و senior شدن هست
مهمتر اینکه :
همیشه بپرسید به چه دلیل رد شدید.
چرا همه جوری صحبت میکنند که انگار همین یک دوره، همین یک کتاب یا ... برای کار و کل عمر کفایت میکنه ؟!
نکنید اینکارو، Junior های عزیز بعضی ازین برگذار کنندههای دوره که فقط به فکر سود شخصی هستند شما مراقب باشید سمت این افراد نرید.
نه بخاطر پول، حتی نه بخاطر وقت که دقیقاً تو دنیای الان برنامهنویسی مثل طلا میمونه
بلکه بخاطر اینکه خیلی از شما دوستان اشاره کردید به گرد ناامیدی شدن پستهای کانال براتون
پستهای کانال سطح بالاتری از تازهکار داره، حتی ممکنه یک سنیور رو ببینید که این مطالب رو بلد نیست (اشکالی هم نداره تا حدودی، چون بهش نیازی نداشته شاید)
اولین کاری که میکنید وقتی دوره تموم شد، اینه که برید مصاحبه
مصاحبهها حتی اگر فقط رد بشید، بهتون کلی اطلاعات مهم میده اینکه بازار کار چی میخواد و چه مواردی رو باید بلد باشید
اگر رد نشدید، که بسیار هم عالی شغل پیدا کردید و این شغل یعنی کلی چیز جدید یاد گرفتن (مخصوصاً برای تازهکار)
حتی بعد از اینکه شغل پیدا کردید، باید یاد بگیرید مصاحبه کنید
این حق شما هست که دنبال کار بهتر با مزایای بیشتر باشید حتی اگر ۱ ماه بعد کار بهتری رو پیدا کنید.
مصاحبه دادن و نترسیدن از رد شدن توی مصاحبه، اولین و مهمترین قدم برای پیشرفت و senior شدن هست
مهمتر اینکه :
همیشه بپرسید به چه دلیل رد شدید.
تغییرات جالبی توی این ۲ روز داره اتفاق میوفته :
حدودا از ۱-۲ ماه قبل حالت
صحبتم این نیست ولی راهکارش :
Select:
دیگه این اتفاق براتون نمیوفته توی آندروید و iOS و ... هم این تنظیمات هست.
حالا صحبتم این نیست؛ من تنظیمات بالا رو روی یکی از سیستمها و چندتا از سرورها انجام نداده بودم؛ ۲ روز قبل به یکباره اتصالم به خیلی از سایتهایی که روزانه چک میکردم قطع شد.
بررسی کردم دیدم مشکل از DNS هست که خالی شده cache و بعدم دیگه این سایتهارو نمیگیره فکر کردم بخاطر تجهیزات و ابزارهایی هست که استفاده میکنم و تست میگیرم
امروز اومدم روی یکی از سرورها دسترسی بگیرم به سایت دیگری دیدم این اتفاق اونطرف هم افتاده؛ با سایتهایی که روی local خودم تست زده بودم چک کردم دیدم اونها هم همین مشکل رو دارند.
روی سرویس دهندههای دیگه اینکار رو کردم (سرورهای خودم) دیدم اونها هم همینطور شده
بنظرتون اوضاع داره بدتر هم میشه ؟
با این وضعیت باید با رفقا هماهنگ کنم از
چون روی یکی از سرورها گیتهاب رو هم ندارم.
پ.ن :
فکر کن یکی بیاد بگه push میزنم پروژهات رو
هر push میشه ۲۰۰۰ تومن ؛ هر pull پروژه خودت باشه ۱۰۰۰ تومن پروژه سنگین باشه ۵۰۰۰ تومن
هر pull request بین ۲۰۰۰ تا ۱۰.۰۰۰ تومن میوفته
و برای fetch and merge هم ۵۰۰۰ تا ۲۰.۰۰۰ تومن
اگر merge با conflict باشه ۵۰.۰۰۰ تومن میشه
لطفاً اگر این اتفاق برای شما هم افتاده اطلاع بدید.
حدودا از ۱-۲ ماه قبل حالت
safe search
برای همه ایرانی ها فعال شد؛ google, duckduckgo , ... و خب تنظیماتش هم قابل غیرفعال سازی نبود صحبتم این نیست ولی راهکارش :
sudo nmtui
Edit a connection
<select your network interface>
IPv4 Configuration section —> select show
DNS Server —-> select Add:
4.2.2.4
8.8.4.4
8.8.8.8
یکی ازینا یا هر ۳ رو انتخاب کنید Select:
Ignore automatically obtained DNS parameters
بعد OK, میزنید و BackActivate a connection
رو وارد میشید اون interface ایی که تنظیم کرده بودید رو یکبار غیر فعال و مجدد فعال میکنید دیگه این اتفاق براتون نمیوفته توی آندروید و iOS و ... هم این تنظیمات هست.
حالا صحبتم این نیست؛ من تنظیمات بالا رو روی یکی از سیستمها و چندتا از سرورها انجام نداده بودم؛ ۲ روز قبل به یکباره اتصالم به خیلی از سایتهایی که روزانه چک میکردم قطع شد.
بررسی کردم دیدم مشکل از DNS هست که خالی شده cache و بعدم دیگه این سایتهارو نمیگیره فکر کردم بخاطر تجهیزات و ابزارهایی هست که استفاده میکنم و تست میگیرم
امروز اومدم روی یکی از سرورها دسترسی بگیرم به سایت دیگری دیدم این اتفاق اونطرف هم افتاده؛ با سایتهایی که روی local خودم تست زده بودم چک کردم دیدم اونها هم همین مشکل رو دارند.
روی سرویس دهندههای دیگه اینکار رو کردم (سرورهای خودم) دیدم اونها هم همینطور شده
بنظرتون اوضاع داره بدتر هم میشه ؟
با این وضعیت باید با رفقا هماهنگ کنم از
starlink
ایی که دارند استفاده کنیم پروژههامون رو تحویل بدیم.چون روی یکی از سرورها گیتهاب رو هم ندارم.
پ.ن :
فکر کن یکی بیاد بگه push میزنم پروژهات رو
هر push میشه ۲۰۰۰ تومن ؛ هر pull پروژه خودت باشه ۱۰۰۰ تومن پروژه سنگین باشه ۵۰۰۰ تومن
هر pull request بین ۲۰۰۰ تا ۱۰.۰۰۰ تومن میوفته
و برای fetch and merge هم ۵۰۰۰ تا ۲۰.۰۰۰ تومن
اگر merge با conflict باشه ۵۰.۰۰۰ تومن میشه
لطفاً اگر این اتفاق برای شما هم افتاده اطلاع بدید.
اگر monitoring هم اضافه کنید
میبینید خیلی از سرویس دهندههای داخلی برای IP غیر ایران از ساعت ۱ شب به بعد از کار میوفته، اگر اطلاع بدید به پشتیبانی راه میاندازند مجدداً (و دوباره چند شب بعد, این اتفاق دائم در حال تکرار هست)
اگر نه حداقل چند روزی قطع خواهید بود.
توی عکس Downtime سرور ما برای کاربرهای خارجی از ۳ دقیقه شروع شد
تا رسید به ۳۰ دقیقه (ما هرشب اطلاع میدادیم)
ولی توی چندروز اخیر بالای چند ساعت هست که رکوردش توی عکس بالاس، برای از دست ندادن مشتری (استارتاپ همهی درآمدش از ارائه سرویس خوب به مشتری هست) مجبوریم بریم روی سرورهای خارجی و سرویس دهندههای cloud داخلی رو بیخیال بشیم؛
مخصوصاً اینکه همشون میگن مشکل از درخواستهای وزارت ارتباطات هست.
برای همین هم هرکاری کنیم هیچ خسارتی نمیتونیم بگیریم.
یک موضوع دیگه این هست که حالا که از مشتریهای خارجی به درآمدزایی رسیدیم (دلار خیلی باصرفه تر از ریال هست با اینکه مشتری داخلی بسیار داریم) اعضای اصلی تیم و شرکت و ... رو منتقل کنیم از ایران
طبق صحبتهای وکیل شرکت، متوجه شدم چندین کشور هم هستند که تسهیلات خوبی بهمون ارائه میکنند برای این انتقال
میبینید خیلی از سرویس دهندههای داخلی برای IP غیر ایران از ساعت ۱ شب به بعد از کار میوفته، اگر اطلاع بدید به پشتیبانی راه میاندازند مجدداً (و دوباره چند شب بعد, این اتفاق دائم در حال تکرار هست)
اگر نه حداقل چند روزی قطع خواهید بود.
توی عکس Downtime سرور ما برای کاربرهای خارجی از ۳ دقیقه شروع شد
تا رسید به ۳۰ دقیقه (ما هرشب اطلاع میدادیم)
ولی توی چندروز اخیر بالای چند ساعت هست که رکوردش توی عکس بالاس، برای از دست ندادن مشتری (استارتاپ همهی درآمدش از ارائه سرویس خوب به مشتری هست) مجبوریم بریم روی سرورهای خارجی و سرویس دهندههای cloud داخلی رو بیخیال بشیم؛
مخصوصاً اینکه همشون میگن مشکل از درخواستهای وزارت ارتباطات هست.
برای همین هم هرکاری کنیم هیچ خسارتی نمیتونیم بگیریم.
یک موضوع دیگه این هست که حالا که از مشتریهای خارجی به درآمدزایی رسیدیم (دلار خیلی باصرفه تر از ریال هست با اینکه مشتری داخلی بسیار داریم) اعضای اصلی تیم و شرکت و ... رو منتقل کنیم از ایران
طبق صحبتهای وکیل شرکت، متوجه شدم چندین کشور هم هستند که تسهیلات خوبی بهمون ارائه میکنند برای این انتقال
این سوالات احمقانهاس
که خب متأسفانه توی لینکدین و توییتر و اینستاگرام پر شده
و فقط وقتتون رو داره میگیره
بنظرم این موارد توهم زا هم هست، تازهکار فکر میکنه اینکه میتونه این سوالات رو جواب بده یعنی خیلی بلد هست.
ولی آیا واقعاً اهمیتی داره دونستن این موارد ! حتی اگر اینجوری کد بزنید.
تهش اینه ی print توی سورس کد میذارید و خروجیش رو میبینید.
عمرتون رو صرف سوالات احمقانه نکنید، این اکانتها رو هم معروف نکنید
شخصاً
Connection
رو روی لینکدین حذف میکنم وقتی میبینم کسی با این پستها یا لایک کردن این پستها باعث حواس پرتیم میشه.
دقیقاً این موارد حواشی برنامهنویسی هست
خیلی خیلی مراقب باشید.
که خب متأسفانه توی لینکدین و توییتر و اینستاگرام پر شده
و فقط وقتتون رو داره میگیره
بنظرم این موارد توهم زا هم هست، تازهکار فکر میکنه اینکه میتونه این سوالات رو جواب بده یعنی خیلی بلد هست.
ولی آیا واقعاً اهمیتی داره دونستن این موارد ! حتی اگر اینجوری کد بزنید.
تهش اینه ی print توی سورس کد میذارید و خروجیش رو میبینید.
عمرتون رو صرف سوالات احمقانه نکنید، این اکانتها رو هم معروف نکنید
شخصاً
Connection
رو روی لینکدین حذف میکنم وقتی میبینم کسی با این پستها یا لایک کردن این پستها باعث حواس پرتیم میشه.
دقیقاً این موارد حواشی برنامهنویسی هست
خیلی خیلی مراقب باشید.
photo_2023-09-23_23-01-54.jpg
41.3 KB
این کد ی مشکل اساسی داره (بزرگ و اساسی) مخصوصا توی پروژههای حرفهای
موضوع پیچیدهای نیست ولی چون زیاد دیدم ترجیح دادم بهش اشاره کنم تا کم کم دیگه نبینیم.
میتونید حدس بزنید چی هست ؟
توضیحات پست بعدی
پ.ن : typing توی پروژهها موضوع مهمی هست اما توی پایتون الزامی نیست
هیچوقت باگ محسوب نمیشه و فقط جزو شرایط
clean code
هست (به این مورد اشاره نکنید)
موضوع پیچیدهای نیست ولی چون زیاد دیدم ترجیح دادم بهش اشاره کنم تا کم کم دیگه نبینیم.
میتونید حدس بزنید چی هست ؟
توضیحات پست بعدی
پ.ن : typing توی پروژهها موضوع مهمی هست اما توی پایتون الزامی نیست
هیچوقت باگ محسوب نمیشه و فقط جزو شرایط
clean code
هست (به این مورد اشاره نکنید)
🧑💻PythonDev🧑💻
photo_2023-09-23_23-01-54.jpg
مشکل اصلی استفاده از
اصطلاحا به این روش میگن
منبع بسیاری از BUG های مخفی همین مورد هست.
قبل از اینکه راه حل رو بگم ی موضوع دیگه برای تازهکارها اشاره کنم (شوخی و روشی برای ایستگاه کردن
ی مدل دیگه
naked exception
از همینجا شاید متوجه شدید دیگه؛ 😂😂
نوع تعریفش اینطوری هست :
طرف به ارور میخورد بهش میگفتن ؛ naked ات رو بده تا بگم (خیلی وقتا کار به جاهای باریک میرسید مراقب باشید خلاصه 😅😅😅)
ازین ۲ مدل هیچوقت استفاده نکنید که یا BUG مخفی میخورید یا خدایی نکرده ایستگاه میشید.
راه حل کد بالا :
۲ تا
except Exception as ex:
که دوستان توی کامنت اشاره کردند.اصطلاحا به این روش میگن
Broader Approach
مسئله اینه که توی کد بالا من با ارور هیچکاری نمیکنم (اما توی این شرایط هم broader approach
اشتباه هست) ولی فرض کنید شما باید این موارد رو لاگ بندازید. در این شرایط exception handle
شما به درد نمیخوره احتمالا لاگ هم همینطور چون کسی اروری نمیبینه که بخواد لاگ فایل رو بخونه (حتی اگر توی لاگ جزئیات بیشتری هم نوشته شده باشه)منبع بسیاری از BUG های مخفی همین مورد هست.
قبل از اینکه راه حل رو بگم ی موضوع دیگه برای تازهکارها اشاره کنم (شوخی و روشی برای ایستگاه کردن
junior developer
ها بوده البته کمتر دیده میشه دیگه ولی ی زمان تو دانشگاها خیلی زیاد بود بخصوص خارج از ایران) شاید بخاطر اینکه دیگه این مدل کد استفاده نمیشهی مدل دیگه
exception
داریم که اصطلاحا بهش میگن :naked exception
از همینجا شاید متوجه شدید دیگه؛ 😂😂
نوع تعریفش اینطوری هست :
except:
قبلا که خیلی مد بود استفاده ازین مورد و هنوز کلمه nude
انقدر جاافتاده نبود برای ایستگاه کردن دانشجوهای سال پایینی استفاده میشد (بینالمللی)طرف به ارور میخورد بهش میگفتن ؛ naked ات رو بده تا بگم (خیلی وقتا کار به جاهای باریک میرسید مراقب باشید خلاصه 😅😅😅)
ازین ۲ مدل هیچوقت استفاده نکنید که یا BUG مخفی میخورید یا خدایی نکرده ایستگاه میشید.
راه حل کد بالا :
۲ تا
Exception
جدا بنویسید :except IndexError as ex:
و اگر قرار هست TypeError هم silent کنید در ادامهاش except TypeError as ex:
یا حتی ادغام هر ۲ : except (IndexError, TypeError) as ex:
اینو همهی سرمایهگذارهای پروژه و کد توی ایران حتما باید ببینند :
برای دولوپرهای عزیز هم قبل از اینکه جوگیر بشید و بگید میخوام شرکت بزنم این رو ببینید (این بررسی فقط از جنبههای توسعه نرمافزار هست باقیش هیج)
https://www.youtube.com/watch?v=Dl-BdxNRUqs
برای دولوپرهای عزیز هم قبل از اینکه جوگیر بشید و بگید میخوام شرکت بزنم این رو ببینید (این بررسی فقط از جنبههای توسعه نرمافزار هست باقیش هیج)
https://www.youtube.com/watch?v=Dl-BdxNRUqs
YouTube
What does larger scale software development look like?
📘 T3 Stack Tutorial: https://1017897100294.gumroad.com/l/jipjfm
🤖 SaaS I'm Building: https://www.icongeneratorai.com/
✂️ Background Cutter: https://www.backgroundcutter.com/
💬 Discord: https://discord.gg/4kGbBaa
🔔 Newsletter: https://newsletter.webdevcody.com/…
🤖 SaaS I'm Building: https://www.icongeneratorai.com/
✂️ Background Cutter: https://www.backgroundcutter.com/
💬 Discord: https://discord.gg/4kGbBaa
🔔 Newsletter: https://newsletter.webdevcody.com/…
کانفیگ
بخش عمدهای از تسکهای من مربوط میشه به
Deep learning, ML engineering
اما وجه دیگه کارم
از طرفی هم ۹۰٪ کدهایی که از بچههای بکند تحویل میگیرم ی
این کد رو قبلا برای
هر لاگ فایل تا ۱۰ مگ حجم میتونه اشغال کنه و بعد از اون فایل ذخیره میشه به اسم backup تا ۱۰ تا ورژن ازین بکاپها نگه میدارم فقط و روی نسخه ۱۱
البته این خیلی سادهاس ولی خب از اون کیلویی اضافه کردن
پیشنهاد میدم شما هم ازین کد بعنوان
logging
برای من همیشه اذیت کننده هست.بخش عمدهای از تسکهای من مربوط میشه به
Deep learning, ML engineering
اما وجه دیگه کارم
backend
هست و software engineer
برای همین خیلی کم پیش میاد نیاز داشته باشم ی لاگر با جزئیات بنویسم از طرفی هم ۹۰٪ کدهایی که از بچههای بکند تحویل میگیرم ی
logging
نوشته شده که حافظه زیادی قرار هست بگیره (بخصوص روی سرور تست دارم صحبت میکنم که حجم لاگ بالا میره)این کد رو قبلا برای
Django
نوشتم ؛ توضیح دادم تقریبا چند هفته بعد از شروع یادگیری یکی از بدترین پروژههای شرکت رو دست گذاشتم روش و شروع کردم به بازنویسی این لاگر رو برای اون نوشتم هر لاگ فایل تا ۱۰ مگ حجم میتونه اشغال کنه و بعد از اون فایل ذخیره میشه به اسم backup تا ۱۰ تا ورژن ازین بکاپها نگه میدارم فقط و روی نسخه ۱۱
log rotateمیخوره و قدیمیترین فایل حذف میشه
البته این خیلی سادهاس ولی خب از اون کیلویی اضافه کردن
logging
فایل قطعا بهترهپیشنهاد میدم شما هم ازین کد بعنوان
base
استفاده کنید و لاگ فایلهای تمیز داشته باشید چون دیر یا زود خودتون مجبور به خوندنشون هستید.
🧑💻PythonDev🧑💻
کانفیگ logging برای من همیشه اذیت کننده هست. بخش عمدهای از تسکهای من مربوط میشه به Deep learning, ML engineering اما وجه دیگه کارم backend هست و software engineer برای همین خیلی کم پیش میاد نیاز داشته باشم ی لاگر با جزئیات بنویسم از طرفی هم ۹۰٪ کدهایی…
logger.py
657 B
اینم فایل سورس (حتما بخونید و درک کنید اول)
چندتا توضیح بدم راجب کد بالا و مسائل دیگه :
۱- کد بالا ربطی به django نداره، هرچند توی یک خط من برای مسیر فایل از django استفاده کردم. Logging مربوط به core python هست.
۲- بیش از ۳۰ نفر سوالاتشون راجب همین موضوع بود، تماماً هم مشترک (دوستان گروه برای همین منظور ساخته شده و بخش کامنت) ازین به بعد این سوالات رو فقط توی گروه بپرسید.
۳- توی پیامها ویس ندید، مخصوصاً قبل از هماهنگ کردن ۹۹.۹٪ اصلا پیام رو باز نمیکنم اگر اینطور باش
۴- احوال پرسی و خبر پرسیدن رو نمیفهمم، بعد حالا اگر پرسیدید چرا منتظر جواب نمیمونید ؟
بجای خوب هستی و چه خبر، همون سلام کفایت میکنه و یا اگر عادت کردید برای غریبه از
امیدوارم سلامت باشید استفاده کنید بخدا قشنگتر هم هست
۵- قبل از سوال پرسیدن نیازی به تاریخچه نویسی نداره، کی بودید و چیکار کردید و چرا به من ربطی نداره واقعاً و اگر برای راهنمایی لازم باشه قطعاً خودم میپرسم از شما (بعضیها ۲۰ تا پیام میذارند آخر سوال از یکی از پستهای کانال میپرسند)
۶- نهایتاً، خواهش میکنم
خواهش میکنم
اصلی ترین رفتار برنامهنویسی رو رعایت کنید
پیامها رو مختصر بنویسید همهی موارد رو داخل یک پیام ارسال کنید بریده بریده پیام دادن اسپم حساب میشه
بدتر از بریده بریده پیام دادن ۷-۸ تا پیام فرستادن و در نهایت گفتن این هست که بگید، میتونم سوال بپرسم ؟!
بجای اسپم کردن، اصل سوال رو بپرسید لطفاً این خیلی خیلی مهم هست.
دوستانی که این موارد رو رعایت نمیکنند، حداقلش اینه که اجازه نمیدهند من وقت داشته باشم به باقی دوستان هم کمک کنم.
مرسی از همگی دوستانی که رعایت میکنند یا خواهند کرد 🌹
۱- کد بالا ربطی به django نداره، هرچند توی یک خط من برای مسیر فایل از django استفاده کردم. Logging مربوط به core python هست.
۲- بیش از ۳۰ نفر سوالاتشون راجب همین موضوع بود، تماماً هم مشترک (دوستان گروه برای همین منظور ساخته شده و بخش کامنت) ازین به بعد این سوالات رو فقط توی گروه بپرسید.
۳- توی پیامها ویس ندید، مخصوصاً قبل از هماهنگ کردن ۹۹.۹٪ اصلا پیام رو باز نمیکنم اگر اینطور باش
۴- احوال پرسی و خبر پرسیدن رو نمیفهمم، بعد حالا اگر پرسیدید چرا منتظر جواب نمیمونید ؟
بجای خوب هستی و چه خبر، همون سلام کفایت میکنه و یا اگر عادت کردید برای غریبه از
امیدوارم سلامت باشید استفاده کنید بخدا قشنگتر هم هست
۵- قبل از سوال پرسیدن نیازی به تاریخچه نویسی نداره، کی بودید و چیکار کردید و چرا به من ربطی نداره واقعاً و اگر برای راهنمایی لازم باشه قطعاً خودم میپرسم از شما (بعضیها ۲۰ تا پیام میذارند آخر سوال از یکی از پستهای کانال میپرسند)
۶- نهایتاً، خواهش میکنم
خواهش میکنم
اصلی ترین رفتار برنامهنویسی رو رعایت کنید
پیامها رو مختصر بنویسید همهی موارد رو داخل یک پیام ارسال کنید بریده بریده پیام دادن اسپم حساب میشه
بدتر از بریده بریده پیام دادن ۷-۸ تا پیام فرستادن و در نهایت گفتن این هست که بگید، میتونم سوال بپرسم ؟!
بجای اسپم کردن، اصل سوال رو بپرسید لطفاً این خیلی خیلی مهم هست.
دوستانی که این موارد رو رعایت نمیکنند، حداقلش اینه که اجازه نمیدهند من وقت داشته باشم به باقی دوستان هم کمک کنم.
مرسی از همگی دوستانی که رعایت میکنند یا خواهند کرد 🌹
ازین مدل کد توی سورس کد پکیجها زیاد دیدید همون استاندارد
ارور فریمورک هم واقعا نامشخص نبود و چیزی ازش دستمون رو نمیگرفت (زمانی که
توی سورس اگر کدهارو بخونید یک ساختاری شبیه عکس وجود داره که باعث میشه در نهایت ارور خاص فریمورک برگرده؛ البته با یک تغییر کوچیک توی خط 10 :
پاک کردن همین ۲ کلمه باعث شد توی ۵ دقیقه مشکل حل بشه.
دیدم نیروی خودم بلد نبود گفتم شاید بهتر باشه اینجا هم بذارم بدرد کسی بخوره.
EAFP
امروز یکی از نیروهای junior که باهاشون کار میکنم روی یکی از کدها به اروری میخورد و کار پیش نمیرفت.ارور فریمورک هم واقعا نامشخص نبود و چیزی ازش دستمون رو نمیگرفت (زمانی که
tensorflow 0.7
اومده بود قشنگ یادم هست ازین چالشها زیاد داشتیم)توی سورس اگر کدهارو بخونید یک ساختاری شبیه عکس وجود داره که باعث میشه در نهایت ارور خاص فریمورک برگرده؛ البته با یک تغییر کوچیک توی خط 10 :
raise CustomException('Finally we raise our custom error in framework.')
from None
همین from None
باعث میشه exception
های قبلی چاپ نشه.پاک کردن همین ۲ کلمه باعث شد توی ۵ دقیقه مشکل حل بشه.
دیدم نیروی خودم بلد نبود گفتم شاید بهتر باشه اینجا هم بذارم بدرد کسی بخوره.
🧑💻PythonDev🧑💻
ازین مدل کد توی سورس کد پکیجها زیاد دیدید همون استاندارد EAFP امروز یکی از نیروهای junior که باهاشون کار میکنم روی یکی از کدها به اروری میخورد و کار پیش نمیرفت. ارور فریمورک هم واقعا نامشخص نبود و چیزی ازش دستمون رو نمیگرفت (زمانی که tensorflow 0.7 اومده…
مثال بالا در صورت وجود
from None
حتما شما هم با
همین که دیگه لازم نیست یادتون بمونه فایل رو ببیند یا اینکه کد درست رو بزنید
بستن فایل باید توی بخش finally باشه و ...
یک کلاس داخل تعریف پروتوکل
پس توی این بین میشه کارهای زیادی انجام داد
کد بالا مربوط به یکی از پروژههای بزرگ هست که توضیح میدم بدها
ی hot-fix که زدم و از
توجه کنید خارج از with خروجی print مثل قبل چاپ میشه و دیگه توی فایلی نوشته نمیشه چون توی
with open
توی پایتون کار کردید فوقالعاده کمک کننده و مفید هست همین که دیگه لازم نیست یادتون بمونه فایل رو ببیند یا اینکه کد درست رو بزنید
بستن فایل باید توی بخش finally باشه و ...
try:همین شرایط برای connection به دیتابیس هم هست.
excpet:
finally:
with openاز یک راه حل تمیز و زیبا استفاده میکنه که بهش
Context Manager Protocol
گفته میشه یک کلاس داخل تعریف پروتوکل
context managerقرار میگیره اگر ۲ تا متد رو داشته باشه
__enter__, __exit__دقیقا وقتی وارد بلوک
__enter__
with .... :میشیه اجرا میشه و
pass
__exit__
وقتی از with
خارج میشه پس توی این بین میشه کارهای زیادی انجام داد
کد بالا مربوط به یکی از پروژههای بزرگ هست که توضیح میدم بدها
ی hot-fix که زدم و از
print
رو بجای logger
استفاده کردم توجه کنید خارج از with خروجی print مثل قبل چاپ میشه و دیگه توی فایلی نوشته نمیشه چون توی
__exit__
sys.stdout
به مقدار قبلی برمیگرده.فایل بعدی که باید داشته باشید
۱- دیلی شرکت نکردن بدون اطلاع قبلی؛ دستمزد اون روز رو حذف میکنه
۲- پروژه تحویل دادن بدون
اما توی تیم من حداقل ۳ نکته هم باید رعایت بشه :
۱- بجای یک فایل باید ۳ تا فایل برای
تصویر بالا برای فایل
requirements.txt
نبودش توی تیم ما خطای بزرگی هست :۱- دیلی شرکت نکردن بدون اطلاع قبلی؛ دستمزد اون روز رو حذف میکنه
۲- پروژه تحویل دادن بدون
requirements.txt
درست بین ۲ تا ۷ روز کسر از دستمزد داره (اهمیت رو ببینید)اما توی تیم من حداقل ۳ نکته هم باید رعایت بشه :
۱- بجای یک فایل باید ۳ تا فایل برای
requirements
داشته باشید base.txt- local.txt - product.txt
یک پوشه به این اسم میسازید و این ۳ فایل داخلش قرار میگیره تصویر بالا برای فایل
base.txt
هست؛ این فایل شامل پکیجهایی میشه که چه توی محیط توسعه چه توی پروداکشن باید وجود داشته باشه local.txt
برای محیط توسعه هست خط اول این فایل همیشه باید -r base.txt
باشه که بصورت اتومات پکیجهای داخل base
رو هم شامل بشه موقع نصب و باقی خطهای فایل شامل پکیجهایی میشه که فقط توی محیط توسعه لازم هست :black, isort, flake8, pre-commit, ...
و در نهایت prod.txt
مواردی که فقط روی پروداکشن لازم هست بازم خط اول باید-r base.txt
باشه حتما و قطعا چیزی که توی local
هست نباید اینجا باشه.
🧑💻PythonDev🧑💻
فایل بعدی که باید داشته باشید requirements.txt نبودش توی تیم ما خطای بزرگی هست : ۱- دیلی شرکت نکردن بدون اطلاع قبلی؛ دستمزد اون روز رو حذف میکنه ۲- پروژه تحویل دادن بدون requirements.txt درست بین ۲ تا ۷ روز کسر از دستمزد داره (اهمیت رو ببینید) اما توی…
۲- تمامی پکیجها باید ورژن داشته باشند اما استفاده از
استفاده میکنیم دلیلش هم این هست که آپدیتهای پچ رو بتونیم دانلود و نصب کنیم (چه امنیتی باشه چه رفع باگهای ساده) بدون اینکه نیازی به تغییر حتی ۱ خط کد باشه
۳- تا جایی که امکان داره موارد رو بصورت دستی بنویسید و از
این مواردی هست که توی تیم بنده رعایت میشه و تجربه بهم نشون داده کار خوبی هست (جاهای دیگه هم دیدم این مورد رو)
برخی از
بازم میگم ما ترجیح میدیم راجب انتخاب ابزار هیچ فشاری روی باقی تیم نداشته باشیم.
==
برای ورژن زدن پکیجها ریکامند نمیشه بجاش از ~=
استفاده میکنیم دلیلش هم این هست که آپدیتهای پچ رو بتونیم دانلود و نصب کنیم (چه امنیتی باشه چه رفع باگهای ساده) بدون اینکه نیازی به تغییر حتی ۱ خط کد باشه
۳- تا جایی که امکان داره موارد رو بصورت دستی بنویسید و از
pip freeze
دوری کنید؛ که فقط پکیجهای اصلی ذکر بشه و فایل تمیزتری برای بررسی وجود داشته باشه.این مواردی هست که توی تیم بنده رعایت میشه و تجربه بهم نشون داده کار خوبی هست (جاهای دیگه هم دیدم این مورد رو)
برخی از
toml , ...
استفاده میکنند که من برای پروژه تیمی تایید نمیکنم چون هرکسی ممکن ازین ابزارها استفاده نکنه ولی اگر کل تیم شما با اون فرمول پیش میره شما هم همون کار رو بکنید.بازم میگم ما ترجیح میدیم راجب انتخاب ابزار هیچ فشاری روی باقی تیم نداشته باشیم.
قبل از اینکه خروجی
همیشه و تحت همه شرایط؛ خروجی Profiling رو ذخیره کنید اونم ۲ بار :
۱- قبل از اینکه کدی رو تغییر بدید (همیشه هم به اسمی ذخیره کنید که یادتون بمونه + تاریخ)
۲- بعد از اینکه تغییرات رو اعمال کردید (اسم تغییرات + تاریخ یا
شاید شما ندونید برای چی ذخیره میکنیم ولی ی روزی نجاتتون میده.
برای گرفتن خروجی بالا توی ترمینال این دستور رو اجرا میکنیم با توجه به این نکته که اسکریپت مثال (توی عکس قبلی رو به اسم
cProfile
رو تفسیر کنم میخوام مهمترین نکته توی زندگیتون موقع استفاده از ابزارهای profiling
رو بگم.همیشه و تحت همه شرایط؛ خروجی Profiling رو ذخیره کنید اونم ۲ بار :
۱- قبل از اینکه کدی رو تغییر بدید (همیشه هم به اسمی ذخیره کنید که یادتون بمونه + تاریخ)
۲- بعد از اینکه تغییرات رو اعمال کردید (اسم تغییرات + تاریخ یا
git commit
)شاید شما ندونید برای چی ذخیره میکنیم ولی ی روزی نجاتتون میده.
برای گرفتن خروجی بالا توی ترمینال این دستور رو اجرا میکنیم با توجه به این نکته که اسکریپت مثال (توی عکس قبلی رو به اسم
example.py
ذخیره کردیم)python -m cProfile -s cumulative example.py
و درصورتی که بخوایم خروجی رو ذخیره کنیم که برای آنالیزش از snakeviz, pstats
استفاده بشه و مهمتر از همه داکیومنتش کرده باشیم میتونیم از دستور python -m cProfile -s cumulative -o compare_bubble_vs_builtin_sort_$(date +'%Y_%m_%dT%H_%M_%S').prof example.py
استفاده کنیم؛ حتما پسوند رو .prof
بذارید که راحت شناسایی بشه.
🧑💻PythonDev🧑💻
قبل از اینکه خروجی cProfile رو تفسیر کنم میخوام مهمترین نکته توی زندگیتون موقع استفاده از ابزارهای profiling رو بگم. همیشه و تحت همه شرایط؛ خروجی Profiling رو ذخیره کنید اونم ۲ بار : ۱- قبل از اینکه کدی رو تغییر بدید (همیشه هم به اسمی ذخیره کنید که یادتون…
توی دستور بالا :
تفسیر خروجیش هم خیلی سادهتر از اون چیزی هست که فکر میکنید فقط چندتا نکته داره :
وقتی دوتا عدد هست مثل خط اول خروجی توی عکس قبلی
عدد کوچیکتر تعداد فراخوانی غیر بازگشتی یا
مجموع زمان مورد نیاز از لحظه فراخونی اون خط یا تابع تا خروج از اون خط یا تابع + زمان مورد نیاز برای اجرای توایعی که داخل این تابع یا خط فراخوانی شدند + زمان اجرا بصورت
اسم اسکریپت : شماره خطی که اون کد اجرا شده (اسم تابع)
اسم تابع برای شرایطی مهم هست که داخل تابع اصلی توابع دیگری هم فراخوانی بشه
توی خروجی بالا مواردی مثل
همینجا بگم که تصویر قبلی خروجی کامل
-m:
برای استفاده از یک ماژول خاص استفاده میشه-s:
ترتیب نمایش هست که گفتیم بر اساس cumulative time
باشه همیشه هم همین رو استفاده خواهید کرد-o:
برای اینکه خروجی رو توی یک فایل بریزه و توی ترمینال نمایش نده (اول در تاریخ ثبت میکنیم بعد ی بار هم بدون این option
برای راحتی خودمون اجرا میکنیم)تفسیر خروجیش هم خیلی سادهتر از اون چیزی هست که فکر میکنید فقط چندتا نکته داره :
ncalls:
تعداد فراخوانی اون خط از کد (ستون آخر کمی جلوتر توضیح میدم دقیق)وقتی دوتا عدد هست مثل خط اول خروجی توی عکس قبلی
3/1
:عدد کوچیکتر تعداد فراخوانی غیر بازگشتی یا
primitive
هست و عدد بزرگتر تعداد کل فراخوانی به هر شکلی که بوده (بازگشتی و غیر بازگشتی و ...) یعنی بصورت کلی اون builtin method
توی مثال قبل ۳ بار فراخوانی شده.tottime:
مجموع زمان مورد نیاز جهت اجرای اون تایع؛ به غیر از زمان اجرای توابعی که داخل این تابع فراخوانی شدهاند.percall:
زمان اجرای مورد نیاز برای هربار اجرای اون خط یا اون تابع معمولا حدودی برابر هست با :tottime / ncalls
cumtime:
مهمترین ستون همینه و اون مرتب سازی که توی دستور انجام دادیم (منظورم s cumulative-
هست) بر اساس همین ستون بود.مجموع زمان مورد نیاز از لحظه فراخونی اون خط یا تابع تا خروج از اون خط یا تابع + زمان مورد نیاز برای اجرای توایعی که داخل این تابع یا خط فراخوانی شدند + زمان اجرا بصورت
recursive , ...
خلاصه همه چیز اینجاس و از همه ستونها هم دقیقتر هست filename:lineno(function)
اینم که بسیار واضح هست از سمت چپ به راست :اسم اسکریپت : شماره خطی که اون کد اجرا شده (اسم تابع)
اسم تابع برای شرایطی مهم هست که داخل تابع اصلی توابع دیگری هم فراخوانی بشه
توی خروجی بالا مواردی مثل
builtin.exec
(از توابع مورد علاقه من هست اصن ی وضعی) و برخی موارد دیگر برای import random
هست همینجا بگم که تصویر قبلی خروجی کامل
cProfile
نیست و بنده این خروجی رو بریدم تا خواناتر باشه