Python BackendHub – Telegram
Python BackendHub
7.5K subscribers
314 photos
46 videos
11 files
432 links
Learning python & Backend Engineering, with Mani!

Youtube: https://www.youtube.com/@GitOverHere
Github: https://github.com/ManiMozaffar
Linkedin: https://www.linkedin.com/in/manimozaffar

تبلیغات نداریم

Admin: @Mani_nikou
Download Telegram
Python BackendHub
اوایل که مصاحبه میرفتم همون اولین مصاحبه رد میشدم, اما الان تقریبا هروقت مصاحبه میگیرم میرسم به coding challenge یا technical interview تکنیک هایی که این مدت به کار بردم و جواب داده رو خواستم تو این پست بنویسم تا استفاده کنید: اولین چیزی که مطرح میشه اینه…
پارت دو
این پستو بیشتر کشش میدم چون بازخورد خوبی داشت, و بیشتر میشه راجبش حرف زد.

اولا پارت یک رو اصلاحی کنم, اولا این متن راجبه پاس شدن از مصاحبه اول به دومه, این یادداشت منه, تکلیف و سرلوحه نیست. پس خواهشا اشتباه نگیرین هدف من رو. اول اینکه بتونید یک پروداکتی رو لینک کنید به اون شرکت, روند جلو رفتنتون خیلی بهتر پیش میره. ولی اینکه در آینده ممکنه دردسر ساز شه یا نه رو نمیدونم چون تجربه ندارم که بخوام بهتون بگم, صرفا کار هایی هست که خودم کردم و نتیجه داده, مثلا هیچ علاقه ای به شیمی من ندارم(متنفرم) ولی 3 ترم متالورژی خوندم, یک مصاحبه ای بود راجب یک شرکت که یک سولوشن AI داشتن راجب کم کردن تاثیرات CO2, حالا من اومدم گفتم که تو اون 3 ترم متالورژی ام مثلا فلان قضیه رو پیگیر شدم و فلان کار رو کردم و .., در صورتی که اجبار پشتش بود نه علاقه, اما به دروغ گفتم از روی علاقه همچین کاری کردم, اگه حقیقت رو میگفتم بهتر بود که اصلا بهش اشاره نکنم چون خودش red flag بزرگیه که از کانسپتی که شرکت توش کار میکنه بخوام متنفر باشم. ولی نه اینکه من هیچی راجب شیمی و ... ندونم ولی بگم بلدم! پس امیدوارم منظورم رو از دروغ گفتن متوجه شده باشین.

چرا میخوای بیای ..., هدفت از relocate چیه؟
خیلی سوال چالشی هست, باید جوابی بدین که به همون هدف نتونید اون شهر رو ترک کنید. مثلا اگه از شهر کوچیک دارین میرین کرج و بگین دوست دارم تو شهر بزرگ زندگی کنم, خود HR با خودش میگه خب پس فردا این کرجو ول میکنه میره تهران.
یک سری خصوصیات فرهنگی, اجتماعی و جغرافیایی باید اسم ببرین که اون فرد قانع شه شما فردا اون شهر رو ترک نمیکنید. حواستون باشه به موضوعات شخصی و race اصلا نپردازین, شخصا فیدبک خوبی نگرفتم از این قضیه. حتی اگه حق باهاتون باشه یا حتی اگه کاملا دلیلتون منطقی باشه.

چرا دوست داری تو شرکت ما کار کنی؟
اینم سوال چالشی هست, که به نظرم دیدن ویدیویی که به اشتراک گذاشتم میتونه ذهنتون رو باز تر کنه. من خودم شخصا برای اینکه جواب کلیشه ای ندم همیشه تو پاسخ به این سوال گفتم که اره فلان stack پروژتون برای من جالبه و business logic پروژتون هم برام جالبه و بعدش با اشاره به چند تا از point هایی که اون شرکت برای کارمنداش ارزش قائل میشه پاسخ رو میبندم.

چطور لباس بپوشم؟
بنظرم مهمه که تو مصاحبه اول با HR حتی اگه آنلاین هست لباستون کاملا فرمال باشه و مرتب باشین, مثلا پیراهن بپوشین. با t-shirt اومدن سره مصاحبه اول میتونه پوینت منفی باشه براتون.

انتظار حقوقت چقدره؟
خب خیلی مهمه عددی که میگین پرت و پلا نباشه, نه خیلی بالا باشه نه خیلی پایین اگه قصد دارین که استخدام شید. میتونید تحقیق کنید که تو اون پوزیشن چه حقوقی معقوله. اگه شرکت خارجی دارین اپلای میکنید که از glassdoor و payscale استفاده کنید. ولی سعی کنید به جای عدد, رنج بدید. خیلی بهتره. با یک HR صحبت میکردم میگفت ما خیلی رو ریجکت میکنیم چون دستمزد پایینی میگن و نشون میده که یا اعتماد به نفس ندارن یا روی تخصصشون مطمئن نیستن, که در هر 2 صورت گزینه خوبی برای ما نیستن.

یک نکته ای هم وجود داره اینه که این مصاحبه فقط بخاطر این نیست که شرکت با شما آشنا شه, بلکه بخاطر اینه که شمام با شرکت آشنا شین, پس گفتن رنج و اینکه ببینید این شرکت چه عددی از اون رنج رو انتخاب میکنه کمی شما رو با سیاست های اون شرکت آشنا میکنه, قبل از وارد شدن بهش!😅 و حتی این موضوع رو باید بنظرم علنی اعلام کنید که مثلا وقتی سوال میپرسین, یکم سوال ها رو بیشتر به business logic اون شرکت گره بزنید و قبل از پرسیدن هم بهش بگین که دلیل سوال پرسیدنم اینه که ببینم ایا شرکت و بیزنسش با شخصیت من و تایپم fit هست یا نه.


در آخر, body language خیلی مهمه تو مصاحبتون.
میتونید از بلاگ زیر بیشتر بخونید.
https://uk.indeed.com/career-advice/interviewing/body-language-in-interview

و البته آنالیز زبان بدن هم خیلی مهمه, یعنی به جای اینکه HR شما رو از زبان بدنتون قضاوت کنه, شما عملکرد خودتون رو از زبان بدن HR قضاوت کنید. مطالعه راجب زبان بدن کلا بنظرم تو زندگی شخصی و کاری و مصاحبه خیلی میتونه کمکتون کنه.

@ManiFoldsPython
👍12👎1
Python BackendHub
پارت دو این پستو بیشتر کشش میدم چون بازخورد خوبی داشت, و بیشتر میشه راجبش حرف زد. اولا پارت یک رو اصلاحی کنم, اولا این متن راجبه پاس شدن از مصاحبه اول به دومه, این یادداشت منه, تکلیف و سرلوحه نیست. پس خواهشا اشتباه نگیرین هدف من رو. اول اینکه بتونید یک پروداکتی…
نکات اضافه شده توسط بابی 🙏

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

چطور لباس بپوشم؟
راجع به اینم میخواستم بگم به نظرم تی شرت اوکیه من خیلی مصاحبه هام با تی شرت بوده و فیدبک منفی نگرفتم
5👍1👎1👏1
یک ریپو دارم برای رزومه نویسیه
https://github.com/ManiMozaffar/awesome-resumes

خیلی تکمیله, و نظر شخصی توش ننوشتم. بیشتر نکاتی بوده که از video و سمینار های مختلف و resumeworded جمع کردم.
تقریبا 70درصد رزومه هایی که میبینم ایراداتی دارن که تو این ریپو بهش اشاره شده.
مثال هم کامل زدم, اگه دوست داشتین contribute کنید و نکاتی که شاید از قلم افتاده اضافه کنید, یا اینکه اگه رزومتون خوبه به ریپو اضافه کنید که مثال خوبی شه.

یک روز برای رزومتون وقت بذارین, تاثیرش رو طی چند سال میبینید!
@ManiFoldsPython
❤‍🔥63👏1
چیزی که ما از ChatGPT میبینیم شروع یه صنعت به اسم AI هست که تازه اول راهه و شاید ده‌ها سال بعد به جایگاه واقعیش برسه
در واقع اگه ChatGPT نتونه جای شمارو بگیره احتمالا AI های بعدی بتونن
ولی چرا نیازی نیست نگرانش باشیم؟
صنایع معمولا از ۲ گروه آدم تشکیل شدن، گروه اول صرفا دنبال بازار کار هستن، یک روال خطی دارن و احتمالا تنها دلیلی که الان داخل این کار هستن اینه که بیکار نشن
در کنارش گروه دوم کسایی هستن که از سر علاقه وارد شدن و متخصص حرفه‌ای هستن که خب صنایع رو همین آدما معمولا رشد میدن
مثلا نویسنده‌ای که الان به ازای هر کلمه ۲۰ تومن میگیره تا محتوای کپی چرخ‌شده رو تحویلتون بده
در مقایسه با کسی که نویسنده حرفه‌ای هست و قدرت قلم گیرا داره
طبیعی هست که گروه اول AI جایگزینشون میشه، حالا اگه تصمیم داریم نگران تغییر شغل نباشید فقط کافی هست جزء گروه اول نباشید
در کنار این از تغییر شغل نباید ترسید، AI اگه یه شغل رو ازتون بگیره یه راه جدید براتون باز میکنه، همونطور که تکنولوژی‌های قبلی همین کارو کردن
نهایتا شاید یه روزی تو ۱۰۰ سال بعد AI هممونو بیکار کنه، که خب اشکالی نداره، میشنیم همگی استراحت میکنیم
@DevTwitter |<Soroush Ahamadi/>
👍7🆒6👎2👀2🌭1
Forwarded from Sadra Codes
🥚 ایسترگ‌ها (Easter egg) و سیکرت‌های جالب پایتون!

1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.

$ python -m hello
Hello World!

2️⃣ - برای چاپ کردن ذن پایتون، کافیه ماژول this رو ایمپورت کنید و یه لیست از استعاره‌های بامفهوم برنامه‌نویسی رو واستون چاپ می‌کنه.

$ python -c 'import this'

👈
ماژول ذن this.py در ریپازیتوری CPython

3️⃣ - اگه حوصلتون سر رفته و می‌خواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو xkcd میده که محفلیه پر از میم‌ها و جک‌های دنیای خودمون.

$ python -c 'import antigravity'

4️⃣
- اگه می‌خواید از فیچر‌هایی که قراره در آینده به پایتون اضافه شه استفاده کنید، می‌تونید از __future__ استفاده کنید. مثلا توی پایتون۲، پرینت یه تابع نبود ولی اگه ماژول زیر رو ایمپورت می‌کردید، مفسر پایتون۲ از این به بعد به دید یه فانکشن به print نگاه می‌کرد و باید از پرانتز جلوی پرینت استفاده می‌کردید.

#!/usr/bin/python2
from future import print_function

حالا نکته جالبش اینجاس که ما توی تقریبا تمام زبان هایی که بیسشون C هست، از {} بعنوان تعیین اسکوپ فانکشن، شروط، کلس‌ها و.. استفاده می‌کنیم که توی پایتون به این شکل نیست و block-indentation مهمه. حالا اگه سعی کنید braces رو از __future__ ایمپورت کنید میاد و اینجوری بهتون تیکه میندازه..

>>> from future import braces
SyntaxError: not a chance

5️⃣ - می‌دونستید میشه هش بی‌نهایت و Not-a-numbert رو توی پایتون نشون داد..؟! جالبه نه؟

>>> hash(float('inf'))
314159
>>> hash(float('nan'))
0

👈 اینجا جاییه که بعنوان دوتا ثابت در کدبیس CPython تعریف شدن

6️⃣ - میدونستید یه جایگزین جالب واسه آپریشن =! (نامساوی) توی پایتون هست؟!

>>> 1 != 0
True
>>> from future import barry_as_FLUFL
>>> 1 != 0
SyntaxtError: with Barry as BDFL, use '<>' instead of '!='
>>> 1 <> 0
True
>>> 2 <> 2
False

شاید واستون جالب باشه ولی این قضیه بعد از اینکه Maintain پروژه پایتون توسط Guido به Barry داده شد، رواج پیدا کرد. واسش حتی PEP401 هم نوشتن که من (شخصا) موجودیتش رو درک نکردم ولی ارزش خوندن داره و نکات جالبی درباره تاریخچه پایتون میگه. :)

=> منبع اصلی این پست در Medium
👍5
Forwarded from Sadra Codes
Pythoinc Development (IMO)
👍6
Sadra Codes
Pythoinc Development (IMO)
چند تا دیگه هم بررسی میکنیم.
Waterfall

@ManiFoldsPython
👍5
FDD

خودم شخصا با این روش حال نمیکنم. خیلی تک بعدی میشه و بعدا یقتون رو میگیره. این نظرم شخصیمه البته, ممکنه اشتباه باشه.

@ManiFoldsPython
👍5🤮1
Python BackendHub
حالا برسیم به چالش پروژش که برای من بود و هنوزم هست :)) https://github.com/ultrafunkamsterdam/undetected-chromedriver این لایبری رو میبینید؟ جناب آقای ultrafunkamsterdam که اونرشیپشو دارن, بسیارم تو حوضه خودشون مهارت دارن ولی متاسفانه هرجا دستشون میرسیده…
این باگو یادتونه؟ امروز رفتم سراغش که دیباگش کنم. متوجه شدم که وقتی chrome devtool رو تو undetected روشن میکنید میاد یک listener میذاره رو self.driver. بعد وقتی درایور رو میبندین میاد listener رو که باز کرده میبنده. این لیستنر که خودش بهش میگه reactor از threading.Thread ارث بری میکنه. وقتی self.event.is_set داخل کلس false برگردونه خارج میشه از listener و دیگه درخواست نمیزنه.

اما این وسط یک مشکل داشت 😁
وقتی self.driver استفاده کرده ولی self.driver اومده quit شده و gc هم کالکتش کرده, تازه threading.Thread میره که listener رو ببنده. میبینه self.driver یک رفرنسی هست که به چیزی پوینت کرده که اصلا وجود نداره برای همین کالکتش نمیکنه و ارور میخوره! در نتیجه 2 تا پورتی که گرفته باز میمونه و ESTABLISHED باقی خواهد ماند. 2 تا 2تا جمع میشه تا 65 هزار تا پر میشه. و بعدش port های سیستم پر میشه.

پس وقتی از threading.Thread دارین استفاده میکنید حسابی حواستون به رفرنس هاتون باشه که برای خودتون circular reference درست نکنید. اگه درست کردین حتما باید resolve اش کنید. چطوری؟ صبر کنید تا به ترتیب آبجکت هاتون delete شن بعد ادامه بدین. تو این کیس من برای حل کردنش اول listener رو مطمئن شدم که خارج شده ازش, بعد loop ها رو بستم. بعدش خود آبجکت Thread هم اومدم del کردم. بعدش رفتم سراغ مرورگر و اونو بستم.

پایتون میتونه circular reference رو هندل کنه ولی تو این مورد پورت لیک میموند. دلیلش چیه؟ چون تو ویندوز شما نمیتونید کانکشن هایی که تو یک process ID هستن رو ببندید. ولی تو لینوکس میتونید. بنابراین اگه رو لینوکس از Undetected استفاده میکردین اصلا کانکشن لیک نداشتین.

@ManiFoldsPython
👍3
برای دیباگ مموری لیک GC هم میتونید از همچین کدی استفاده کنید

import gc
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)

مود های دیگه هم داره که میتونید از سورس کد ببینید. البته تو این کیس به درد من نمیخورد چون gc فکر میکرد کارشو انجام داده 😅
@ManiFoldsPython
موقع پرزنت کردن اسکیل ها یک مشکلی وجود داره, اینکه یک نفر چون ردیس رو ایمپورت کرده تو پروژه تست جنگوش و یک استفاده basic داشته ازش فکر میکنه درواقع redis بلده در صورتی که واقعا اینطور نیست.

اگه زدین تسلط دارین رو ردیس, پس باید بدونید real time data رو تو ردیس چطور هندل میکنن. باید بدونید race condition چطور هندل میشه. باید بدونید pipe line و watch چیه. باید بدونید lua noscripting چیه و به چه دردی میخوره. باید بدونید چطور بک آپ و snapshot میگیرن ازش. باید بدونید ردیس پاب چطور کار میکنه؟ باید بدونید وقتی رمش پر میشه چه بلایی سرش میاد. باید بدونید LRU policy تو ردیس چیه؟

مثلا لیست اسکیل های یک نفرو میبینی کلی اسکیل زده. خب این شاید اشکالی نداشته باشه, شایدم داشته باشه, ولی حداقل موقع پزرنت اسکیلتون سعی کنید چیزایی که واقعا بلدین و واقعا تخصصتونه رو بگین بلدین, و با بقیه آشنایی دارین. این کلمه تسلط و آشنایی رو خیلیا اشتباه میگیرن. خب تو رزومه معقول نیست جلوی skill بنویسید که این اسکیل رو شما مسلط هستین, یا familiar هستین. اگه چیزایی که familiar هم نیستین رو ننویسید احتمال ریجکت رزومتون خیلی بالا میره. مثلا نوشتن یک docker compose چیزیه که باید همه بلد باشن, ولی انتظار ندارن ازتون که مثلا یک microservice با docker و k8s و doker swarm بالا بیارین که fault-tolerant باشه.

و خیلی سعی کنید کلمه یا تکنولوژی که ازش صحبت میکنید رو حداقل درک کنید که درست باشه. مثلا اینکه sql بلد باشین با اینکه postgresql بلد باشین خیلی فرق داره. وقتی میگین من postgresql آشنایی دارم, یعنی میدونم materialize view چیه. میدونم Full-text search چیه. میدونم date trunc query چیه و به چه دردی میخوره. میدونم postgresql درواقع دیتا تایپ های مختلفی داره مثل json یا Array یا HStore. میدونم تو بحث ایندکس, تفاوتش با sqlite مثلا اینه که partial و functional index داره.

ببینید, نمیگم اینا رو بلد باشین. ولی وقتی میگین با postgresql آشنایی دارین یعنی اینا رو حداقل میدونید. شاید استفاده نکردین یا سراغشون نرفتین, ولی از وجودشون خبر دارین. اگه از وجود اینا خبر ندارین و صرفا یک sql query بلدین اون موقع تو اسکیلتون باید بنویسید sql نه postgresql.

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

@ManiFoldsPython
👍12
Python BackendHub
این باگو یادتونه؟ امروز رفتم سراغش که دیباگش کنم. متوجه شدم که وقتی chrome devtool رو تو undetected روشن میکنید میاد یک listener میذاره رو self.driver. بعد وقتی درایور رو میبندین میاد listener رو که باز کرده میبنده. این لیستنر که خودش بهش میگه reactor از …
اینو هرچی بیشتر دیباگ میکنم I’m دارک تر میشه:)) امروز با یکی از دوستان داشتیم دیباگش میکردیم که متوجه شدیم وقتی از asyncio.get_event_loop تو ویندوز استفاده میکنید یک پورت باز میکنه و این اصلا ربطی به undetected نداشت.

حالا اینکه چرا پورت باز میشه نمیدونم ولی این تو windows_event.py هست تو پایتون, و تو ویندوز اتفاق میفته.
نکته جالب اینجاست که gc وقتی آبجکتی رو کالکت میکنه که احساس میکنه نیاز به کالکت شدن داره, و برای port exhaustion تعریف نشده. پس حتی متود __del__ که خودشون نوشتن هیچوقت صدا زده نمیشه, به جز زمانی که اسکریپت متوقف میشه.

خلاصه اگه از asyncio.get_event_loop رو ویندوز استفاده میکنید حواستون به این نکته باشه که حتما باید close بخوره وگرنه هم مموری لیک خواهید داشت و هم port exhaustion.

سعی کردم PR بزنم به پایتون, اول فکر کردم مشکل از asyncio هست ولی ظاهرا مشکل از gc هست و gc خیلی پیچیده تر و ادونس تر از سطح منه که بخوام PR بزنم و این مشکلو برطرف کنم. بنابراین issue میزنم 😁
@ManiFoldsPython
👍7
Python BackendHub
اینو هرچی بیشتر دیباگ میکنم I’m دارک تر میشه:)) امروز با یکی از دوستان داشتیم دیباگش میکردیم که متوجه شدیم وقتی از asyncio.get_event_loop تو ویندوز استفاده میکنید یک پورت باز میکنه و این اصلا ربطی به undetected نداشت. حالا اینکه چرا پورت باز میشه نمیدونم…
کد نمونه برای تست:
import asyncio
import psutil
import os
import gc


def check_connections():
"""Check count of ESTABLISHED connections."""
return len([
conn for conn in psutil.net_connections()
if conn.status == 'ESTABLISHED' and conn.pid == os.getpid()
])


loop = asyncio.get_event_loop()
print(check_connections()) #2
loop = None # or del loop
gc.collect()
print(check_connections()) #2

@ManiFoldsPython
👍3
در github که میچرخی ... کدهای ملت اینطوری است که مثلا پایتون‌ها معمولا در چند فایل محدود چند تا کتابخونه معروف صدا و یک کار قابل توجه این وسط با کدهای تجمیع شده انجام میشه ..
کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی!
صد جور فایل اینترفیس، مدل و انتیتی و ...
‏و نهایتاً می‌بینی چند هزار خط کد است که واقعا کار مهمی انجام نمیده و اصل کار هم شاید قابل توجه نباشه...
جاوایی‌ها و سی شارپی‌ها زیادی درگیر دیزاین پترن هستند تا کاری که کد باید انجام بده ..

@DevTwitter | <Alireza Shirazi/>
👎8👍2
DevTwitter | توییت برنامه نویسی
در github که میچرخی ... کدهای ملت اینطوری است که مثلا پایتون‌ها معمولا در چند فایل محدود چند تا کتابخونه معروف صدا و یک کار قابل توجه این وسط با کدهای تجمیع شده انجام میشه .. کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی! صد جور فایل اینترفیس، مدل…
مزخرف ترین طرز فکر. قطاری کد بنویسید بریزین تو چند فایل. که دیگه بعدا کسی جز خودتون نتونه اونو maintain کنه 🤦‍♂️

اینجا که به حجم کد اشاره نشده, ولی حتی کد اگه 200 خط هم باشه نباید بدون logic و architecture باشه. چون بالاخره ممکنه درآینده بیشتر برگردین و روش کار کنید. خشت اول رو که کج بذارین ساختمون کج بالا میره, اون موقع وقتی میرسین طبقه 5-10 مجبور میشین ساختمونو خراب کنید و ریفکتور کنید.

لزومی نداره حالا از یک دیزاین پترن خاص و مشخصی استفاده کنید ولی همینکه منطقی باشه و کسی که میبینتش سریع درکش کنه کافیه. هیچ کتابخونه خوبی پیدا نمیکنید که اینطوری نباشه. یک سری قواعد باید همه جا رعایت شه حتی برای کد های کم مثل SOLID و ...
@ManiFoldsPython
👍4
مشابه میخواین برین سراغ همین رفیق من undetected chromedriver 😂
یک ریپویی که 5 هزار ستاره خورده
739 تا فورک
ولی کلا 8 تا contributer داره
. کسیم سر از کدش در نمیاره. سعی میکنن خیلی به کد دست نزنن چون legacy بزرگی پشتشه 😅
اولین کامیت کد هم 250 خط بود همشو ریخته بود تو یک فایل!

همشم بخاطر همینه که معماری درستی نداشت. شاید یکی بتونه کداشو کلین کنه چون بالاخره خط به خط جلومیری کدو کلین میکنی ولی کلین کردن architecture یک پروژه واقعا پروسه سخت و طاقت فرسایی هست و البته باعث از بین رفتن backward compatibility هم میشه. یک مثال دیگه میزنم از یک پروژه بسیار بزرگ تر تا اینکه این قضیه خشت اولی که کج گذاشته میشه رو جدی تر بگیرین.
@ManiFoldsPython
👍2