Python BackendHub – Telegram
Python BackendHub
7.51K 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
اگه از دوره دیدن خوشتون میاد, این 4 دوره مجموعا 100 ساعته. به هیچ وجه از دستش ندین, خیلی فوق العاده هست و سبک تدریس مدرسشو خیلی دوست دارم, پروژه تمرینی هم داره. نمیدونم پروژه های تمرینیش تو git.ir باشه یا نه ولی قاعدتا باید باشه.
بدون شک, بهترین مدرسی هست که دیدم. از نمرات دوره باید این موضوع بدیهی باشه!

لینک
@ManiFoldsPython
👍7👎1
خودم 5-6 ماه پیش دیدم, الان دوباره برگشتم سراغش 😁
از همین کورس,
یک بحثی تو پایتون هست به نام circular reference که خلاصه بخوام بگم میشه همچین سناریویی:
class MyClass:
def __init__(self, value):
self.value = value
self.next = None

def set_next(self, obj):
self.next = obj

obj1 = MyClass(1)
obj2 = MyClass(2)
obj1.set_next(obj2)
obj2.set_next(obj1)
حالا فکر کنید داندر متود del رو داره کلسمون. (دیستراکتر) که معمولا برای clean up میتونیم تعریف کنیم مثلا برای بستن کانکشن دیتابیس یا پاک کردن فایل یا..
خب اگه دو آبجکتی که دیستراکتر دارن داخل circular reference, برای پاک کردن حتی یکیشون از کجا gc میفهمه که اول باید کدوم دیستراکتر رو اجرا کنه؟ تو ورژن قبل تر از پایتون 3.4, میگفتن بیخیال پاکش نمیکنیم این uncollectable هست و هرچی از این reference ها بیشتر میشد باعث مموری لیک بیشتری میشد تا جایی که کار دستتون میداد این مموری لیک.

حالا برای اصلاحش تو ورژن 3.4 چیکار کردن؟ اومدن از الگوریتمی به اسم Deferred Finalization استفاده کردن که تو لینک زیر مفصل تر توضیح داده و میتونید بخونید, امیدوارم که کنجکاوتون کرده باشم 😁
لینک
👍6
Python BackendHub
از همین کورس, یک بحثی تو پایتون هست به نام circular reference که خلاصه بخوام بگم میشه همچین سناریویی: class MyClass: def __init__(self, value): self.value = value self.next = None def set_next(self, obj): self.next = obj obj1…
از من سوال پرسیدن که ایا این همون Generational GC نیست؟

تفاوت اصلی اینجاست که در Generational GC، تمرکز بیشتر روی مدیریت حافظه برای object با طول عمر کوتاه تره. برای همین به جای اینکه تمامی object ها (از جمله آن‌هایی که lifetime زیادی داشتن) مورد بررسی قرار بگیرن, اونایی که لایف تایم کوتاه تری داره بیشتر مورد بررسی قرار میگیرن تا مدیریت حافظه بهینه تر پیاده سازی شه. اتفاقا تو مموری لیک هم کاربرد داره و جلوگیری میکنه چندین جا ولی اینجا نه اصلا ربطی نداره.

ولی Deferred Finalization بیشتر یک تکنیکه که اجازه میده gc میاد ابجکت هایی که داندر متود دیلیت یا همون دیستراکتر رو دارن به صورت امن و سیف کالکت کنه که تا اونجایی که من فهمیدم میاد از نسخه 3.4 گاربیج کالکتور میاد ابجکت هارو دو دسته میکنه. اونایی که del دارن و اونایی که ندارن. اونایی که ندارن که هیچ تکلیفشون معلومه.

اونایی که دارن, میاد تلاش میکنه که کانکشن دو آبجکت رو از بین ببره. چطوری؟ از دو طرف چک میکنه که از کدوم طرف اون آبجکت در دسترس هست. از اون طرفی که تلاشش موفقیت امیز بود وارد میشه و reference cycle رو کلا از بین میبره.
وقتی دو تا ابجکت دیگه reachable نبودن حالا میاد gc جفتشونو جدا جدا کالت میکنه و حالا del رو اجرا میکنه.


حالا قسمت جذاب اینجاست, اگه تلاش کرد ولی نشد چی؟
اگه نشد یعنی اینکه این دوتا دیستراکتور این دو آبجکت باهم ارتباط داشتن. اون موقع مقصر خودتونید یعنی pattern design ای استفاده کردین که تو کار gc تداخل ایجاد میکنه و مموری لیک میشه چون وقتی gc نتونه این reference cycle رو از بین ببره اونوقت دیگه مموری لیک داریم و خدا اون روزو نیاره که بخواین memory leak رو دیباگ کنید 😅

برای همین میگن که خیلی دیستراکتور reliable نیست و وقتی ازش استفاده میکنید باید حداقل dependacy رو داشته باشه رو variable و ابجکت های دیگه.
👍1
حالا برسیم به چالش پروژش که برای من بود و هنوزم هست :))

https://github.com/ultrafunkamsterdam/undetected-chromedriver

این لایبری رو میبینید؟ جناب آقای ultrafunkamsterdam که اونرشیپشو دارن, بسیارم تو حوضه خودشون مهارت دارن ولی متاسفانه هرجا دستشون میرسیده اومدن از دیستراکتور استفاده کردن. نتیجش چی شده؟ سوکتایی که تو chrome devtool protocol باز میشن دیگه بسته نمیشن :)) چرا؟ چون دیستراکتور هیچوقت اجرا نمیشه و gc هیچوقت کالتکشون نمیکنه. چه اتفاقی میفته ؟ کانکشن لیک میشه و port exhaustion, تمام پورت های سیستم مشغول میشه و شما تا اسکریپت رو متوقف نکنی و دوباره راه نندازی کار نخواهد کرد.

من چیکار کردم؟ process id رو میفرستم سمت سرور خودم بعد با bash noscript چک میکنم که ایا این process id باید سوکتاش بسته میشده یا نه؟ اگه بسته میشده که force kill میکنم. اگه نه در حال رانه که کاری ندارم باهاش.

خلاصه کلام, تا وقتی memory management و gc رو خوب تو پایتون درک نکردین با __del__ ور نرید 😁

و سورس کد لایبری هایی که هم استفاده میکنید و contributor کمی داره حتما بخونید. یا حداقل متود هایی که ازش استفاده میکنید یا کلس هایی که استفاده میکنید. برای همین همیشه توصیه میکنم برای بحث data scraping با مرورگر اگه میخواین دیتکت نشین از playwright استفاده کنید مثل پروژه لینکدین من.
چون بخواین از سلنیوم استفاده کنید یا باید
1. کد کثیف این آقا رو تمیز کنید که خودش زمان زیادی میبره
2. یا باید چرخه رو دوباره درست کنید و یک لایبری شبیه لایبری ایشون درست کنید


(حالا این یک قسمت داستانه, بقیه قسمتای سمش رو باید برید تو سورس کد بخونید. هردفعه میاد یک کروم دانلود میکنه بعد آپش میکنه :)) خب مرد مومن همونو ذخیره کن رو هارد دیسک که برای بالا اومدن هر کروم چند دقیقه معطل نباشیم. چرا اینکارو کرده؟ خدا میدونه. البته executable path هم میگیره که دیگه دانلود نمیکنه ولی اونوقت کروم آپدیت شه کرومتون بالا نمیاد. اون موقع حالا باید bash اسکریپت بنویسید که جلوی آپدیت کروم رو بگیره که خود این موضوع در تضاده با هدف اصلی لایبری, که میشه دیتکت نشدن! )
تو کدوم مورد reference count بیشتره؟
a یا c یا e?
چرا؟

@ManiFoldsPython
Python BackendHub
تو کدوم مورد reference count بیشتره؟ a یا c یا e? چرا؟ @ManiFoldsPython
تو کامنتا به جواب نسبتا درست اشاره کردن
Integer caching (-5, 256) in python

اما یک ایرادی داره, به این کار میگن integer interning. تفاوتش با کشینگ چیه؟

تو کشینگ شما reference میسازین به آبجکتی که ساختین تا دوباره آبجکت ساخته نشه
ولی تو interning شما از reference ای استفاده نمیکنید, بلکه مستقیم از همون memory address و آبجکت استفاده میکنید. یعنی این وسط دیگه reference ای ساخته نمیشه که طبیعتا سریعتر هم هست! که خب تو پایتون اومدن این رنجی که دوستمون گفتن رو intern کردن چون خیلی استفاده میشد و جای اینکه هربار بخواد اون آبجکت ساخته شه و کالکت شه گفتن دیگه یکبار ساخته شه برای همیشه.

حالا به چه کار شما میاد اصلا این اطلاعات؟ فکر کنید تو پروژه ای دارین کار میکنید که مثلا NPL هست. دیتا زیادی دارین و استرینگ هست. خب تو حالت عادی بخواین هربار برای هر کلمه که استفاده میشه و صدا میشه شما یک memory address بهش اختصاص بدین اونوقت مموریتون پر میشه از string های تکراری. یعنی چی؟
مثلا
a = 'Hello World'
b = 'Hello World'
این دو تا ذاتا استرینگ هستن, ولی وقتی equal test رو انجام میدین متوجه میشین که پایتون اومده a رو یکجایی ذخیره کرده و b رو یکجای دیگه. وقتی از is استفاده میکنید درواقع پایتون میاد چک میکنه که
a is b
> False

ولی
a = 2
b = 2
a is b
> True

a = 257
b = 257
a is b
> False

توجه کنید که interning جدا از مموری کمتری که میگیره پرفومنس هم تا 30 برابر تو test ای که خودم نوشتم سریعتر میکرد (نسبت به __eq__ ). حالا تو NPL چطور از interning استفاده میکنن؟

import sys
a = sys.intern("Hello World")
b = sys.intern("Hello World")
a is b
> True

c = "Hello World"
a is c
> False

میتونه برای data mining هم خیلی مفید باشه و crawler هایی بنویسید که حجم زیادی رو از دیتا scrap میکنن و تو مموری نگه میدارن بدون اینکه مموری خیلی سریع پر شه تا اون پروسه write/read ریزالت هم به صورت منظم تر و efficient تر انجام شه.


حالا بازم بگین چرا بشینم 130 ساعت دوره ببینم 😁
@ManiFoldsPython
👍4
یکی از فیلم هایی هست که من تو bookmark ام سیو دارم و هر هفته میبنیم!

https://www.youtube.com/watch?v=u_ktRTWMX3M

حتما ببینید. دیدنش رو به هرکسی توصیه میکنم. بهترین speech ای هست که عمرم شنیدم.

میگه من وقتی شمارش رو شروع میکردم که موقع ست زدن, بدنم درد میگرفت. بنظرم اینکه بگید من روزی میشینم یک ساعت دو ساعت میبینم یا 10 ساعت فرقی نمیکنه, اینکه خودتون رو به یک عدد محدود میکنید جالب نیست. تا جایی ادامه بدین که دردتون بگیره, اون موقع شروع کنید به شمردن :) حالا میخواد 1 ساعت باشه یا 10 ساعت.
@ManiFoldsPython
👍7
Forwarded from SorousH
تقریبا یه حرف رو دارن میزنن. چون این اعداد بیشترین استفاده رو دارن، توی startup عه interpreter پایتون میاد یه array از این اعداد رو همون اول میسازه و از اون به بعد به جای اینکه مثلا یه ۵ جدید بسازه میاد رفرنس به اون ۵ رو که قبلا ساخته شده برمیرگرده. این کارو میکنه تا درگیر از بین بردن آبجکت و دوباره ساختنش نشه. (همه این حرفایی که میزنم برای محیط REPL هست چون توی ماژول یکم چیزای دیگه هم داریم). حالا intern کردن string ها به همون دو منظوری که خودتون توضیح دادید هست. اینجوریه که یه تیبل هست از استرینگ هایی که intern میکنیم داره. هر string ای که پاس میدیم اول نگاه میکنه ببینه اونتو هست یا نه اگه بود رفرنس برمیگردونه.
البته پایتون یه سری استرینگ ها رو اتوماتیک خودش intern میکنه بدون اینکه بهش بگیم ولی خب implementation details هست. مثلا کافیه اسپیس بین hello world رو حذف کنید و دوباره تست کنید میبینید که intern شدن. (اسامی شبیه identifier ها intern میشن، قدیم شرط طول کاراکتر هم داشت ۲۰ تا بود الانو نمیدونم)

ولی موضوعی که در کل هست اینه که پایتون فقط با رفرنس کار میکنه. اگه sys.intern یا چمیدونم اون اعدادی که cache شدن و اینا رفرنسشون نیاد ، در سطح پایتون نمیشه باهاشون کار کرد متغیری هم که شما میسازید درواقع خودش یه رفرنس هست. متغیر ها یه اسم یا symbol هستن که اشاره میکنن به یه آبجکت توی مموری
یکی از حق ترین حرفایی که شنیدم

django allows you to write acceptable code with no studying of architecture principles. It does not allow you to write good code, but it protects you from writing very bad code. In fastapi you have ability to go both ways

@ManiFoldsPython
👍9
یک مشکلی که تو رزومه نویسی خیلی میبینم اینه که شما بولت پوینت مینویسید باید 2 نکته رو در نظر بگیرین:
1. حتما باید achievement تو رزومتون مشخص باشه. اینکه چیکار کردین فقط مهم نیست, اینکه چرا و چطور اونکارو انجام دادین هم خیلی مهمه.

2. اولین کسی که رزومتون رو میخونه HR هست, استفاده از کلمه های قلبمه سلمبه باعث نمیشه ایشون رزومتون رو بفرسته برای تیم بک اند یا IT. باید متقاعدشون کنید که این کلمات قلمبه سلمبه به چه دردی میخورده برای کسی که technical نیست.

حالا از رزومه خودم مثال میزنم:
•Constructed a systematized transaction system with PostgreSQL replication, indexing and materialized views, for efficiency and high volumes.


خب HR وقتی اینو میخونه متوجه میشه برای efficiency and high volumes و scale بیشتر این کارا رو انجام دادم با استفاده از PostgreSQL. (مثلا فرض میگیریم PostgreSQL تو متن آگهی بوده)
به چه دردی میخورده؟ یک سیستم تراکنش بوده


و تیم IT حالا میخونه که شما چطور اینکارو انجام دادین. replication, indexing and materialized views


حالا من خیلی ترویجه که میبینم:
Used replication, indexing and materialized views


خب این خیلی بده! نه HR میفهمه چی گفتین نه تیم بک اند میفهمه چرا اینکارو کردین.

@ManiFoldsPython
👍7
Forwarded from Python Hints
من فهمیدم، دلیل علاقه شدید بچه‌ها تو ایران به این سوالات رو میگم.

توی چندماه گذشته که خیلی درگیر مارکت ایران شدم، متوجه شدم ما توی ایران از هر ۱۰۰۰ برنامه‌نویس ۹۹۹ تا فیلسوف داریم، یعنی خودمون اینطوری تربیت کردیم

وقتی سنیور‌ها به این نوع سوال رو میارن،
وقتی سوالات مصاحبه به این سمت میره، یا موارد انتزاعی پرسیده می‌شه
وقتی اساتید دانشگاهی و آموزشگاهی بجای تسک دادن و نمره دادن بر اساس تسک‌ها، سوالات این چنینی می‌پرسند

وقتی من نوعی که ادعای تجربه و سنیور بودن دارم سکوت می‌کنم چون دوست یا آشنا یا کسی که طرفدارشم ازین مدل سوالات توی پیجش می‌ذاره که خدا می‌دونه فقط برای جذب فالوئر هست نه چیزی یاد دادن

خلاصه خودمون مقصریم همه‌ی این رفتارها
باعث میشه نیروهای نسل بعدی (جونیور و ...) بجای رفتار برنامه‌نویسی، مثل فیلسوف عمل کنه

توی همکاری‌های مختلف با شرکت‌های خارجی، همیشه توی برنامه‌نویس ها یک موضوع مشترک می‌بینم که همیشه برام عادی بوده ولی توی همکاری با ایرانی‌ها متوجه شدم این موضوع خودش یکی از رفتارهای حرفه‌ای هست (ازین به بعد توی مصاحبه‌هام حتماً این رفتار رو امتیاز بالا بهش میدم)

کدوم رفتار :
Fail Fast
محیط تست و develop رو برای همین گذاشتند برای اینکه وقتی یک ایده میاد سریع کد بزنید و توی ۲ روز اثبات کنید که خوب هست یا نه

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

اینجوری می‌شه که چون بین فلاسفه اختلاف میوفته تستی که باید ۲ روزه انجام می‌شد و مطمئن می‌شدیم موضوع کار می‌کنه یا نه

۱ ماه طول می‌کشه تا یک گروه از فلاسفه گروه دوم رو متقاعد کنه که کار می‌کنه یا نه
اگر متقاعد کننده‌ها گروه کار نمی‌کنه باشند که اصلاً تستی گرفته نمی‌شه
اگر متقاعد کننده‌ها گروه کار می‌کنه باشند، بعد از ۱ ماه کدی که باید تو ۲ روز بررسی می‌شد تازه میره برای بررسی


توسعه استارتاپ و ایده برنامه‌نویسی تو ایران با این وضعیت صبر عیوب می‌خواد و عمر نوح.

برای همه‌ی 1.4k عضو کانال می‌نویسم:

ماها برنامه‌نویس هستیم نه فلاسفه، ما می‌تونیم ایده رو کد بزنیم و fail بشیم (محیط تست و توسعه برای همین هست) ما فیلسوف نیستیم که راجب مفاهیم انتزاعی فقط صحبت کنیم و چیزی جز همین بحث کردن در دست نداشته باشیم
بذارید fail fast رو برای ایران بومی سازی کنم :

Fail Fast, As Soon As Possible


@PyHints
👍6
این دید رو اخیرا پیدا کردم که هرچی یک کورسی گرونتر باشه بیشتر به نفع شماست تا به ضرر شما! و هرچی دسترسی بهش محدود تر باشه سریعتر و بهتر یاد میگیرین!

من کورس زیادی تو یودمی خریدم ولی چون واقعا مفتن خیلی مشتاق نمیشم همشو سریع ببینم و تمرین کنم.
همین موضوع هم راجب کورس های ماش هم بود.
از وقتی که اشتراک acloud رو گرفتم خیلی productive تر شدم.
چون هم اشتراکه ماهانست, پس pay as you go نیست و هرچی بیشتر ببینم بیشتر به نفعمه. هرچی بیشتر تمرین کنم از لحاظ مالی هم جلوتر میفتم.

درسته شاید 50 دلار ماهانه هزینه زیادی براتون باشه ولی اون passion ای که براتون درست میکنه که باعث شه بیشتر تمرین کنید ارزششو داره و چه بسا پروموشنی بگیرید که خیلی بیشتر از این 50 دلار ها براتون ایجاد سرمایه کنه 👌

پی نوشت: منظورم کلیه نه دوره فارسی یا شخص خاصی.

@ManiFoldsPython
👍8🤯1
Python BackendHub
این دید رو اخیرا پیدا کردم که هرچی یک کورسی گرونتر باشه بیشتر به نفع شماست تا به ضرر شما! و هرچی دسترسی بهش محدود تر باشه سریعتر و بهتر یاد میگیرین! من کورس زیادی تو یودمی خریدم ولی چون واقعا مفتن خیلی مشتاق نمیشم همشو سریع ببینم و تمرین کنم. همین موضوع هم…
یک صحنه ای تو فیلم batman The Dark Knight Rises بود
که بروس وین داشت از زندان فرار میکرد.
دفعه اول با طناب safety رفت جلو و افتاد.
دفعه دوم بدون طناب safety رفت و تونست بالا بره. (داستان بچه ای رو میشنوه که دقیقا همینطوری فرار کرده بود)

این دقیقا مصداق comfort zone هست. شما وقتی از یودمی یا جایی course ای میخرین که تاریخ انقضا نداره, یک کامفورت زون برای خودتون درست کردین و هیچوقت سراغش نمیرین.

ولی تاریخ انقضا رو اون کورس بخوره اونوقت شما باید از کامفورت زونتون خارج شید و سریعتر بالا برین.

خلاصه برای خودتون کامفورت زون یا safety zone درست نکنید😁 اون طناب ممکنه باعث شه نمیرین ولی جلوی پیشرفتتون رو قطعا میگیره.

@ManiFoldsPython
👍18👌2
اگه دنبال ipv4 هستین ارزون ترین جایی که ازش میتونید بخرین اینجاست.
https://www.ipxo.com

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

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

1. آشنایی با گیت
2. تست نویسی
3. آشنایی با github action برای نوشتن فایل work flow yaml
4. درک عمیق تر از پایتون (خوندن کتابی مثل fluent python یا python cook book)
تسلط به پترن دیزاین ها
5. آشنایی با paradigms های مختلف برنامه نویسی
6. الگوریتم
7. تسلط روی SQL
8. آشنایی با MySQL یا PostgreSQL.
9. آشنایی با داکر و داکر کامپوز
10. آشنایی با مفاهیم Event driven architecture, SOA, microservice و Monolithic
11. تسلط رو یک فریم ورک microservice friendly مثل FastAPI یا Flask
12. آشنایی با یک فریم ورک Monolithic مثل جنگو میتونه مزیت خوبی باشه.
13. آشنایی با یک سرویس کلاد (AWS/Azure/GCP) در حد نیاز بک اند. معمولا certificate های مشخصی دارن که میتونید راجبشون تحقیق کنید و تو اون مسیری که مربوط به بک اند دولوپر میشه برین.
14. آشنایی با دیتابیس های کلاد مثل amazon rds
15. آشنایی با serverless و نمونش داخل کلاد مثل AWS Lambda
16. آشنایی با k8s در حد نوشتن فایل yaml سرویستون
17. آشنایی با یک ابزار IAC مثل terraform
(از بین ترافورم یا k8s و داکر, معمولا رو یکیش تمرکز میکنن شرکتا. و تو اغلب آگهی ها هم دیدم وزن بیشتر سمت داکر و k8s بوده تا ترافورم)


@ManiFoldsPython
👍11👏21
آقا بیشتر بحث اینکه بیای ایده پروژه پیدا کنی و بزنی و استفاده کنی، سخته
مثلا یه دیزاین پترن رو تا تو یه پروژه استفاده نکنی، اون قدر درکش نمیکنی.
واس این نظری داری؟

یک سری مهارت هستن که اگه hands on نداشته باشین اشکالی نداره یعنی خیلی تسلط دیپ و عمیق نمیخوان. ولی یک سری مهارت هستند که باید hands on داشته باشین. و این پروژه تمرینی هم که میزنید بنظر من خیلی مهمه. میخوام راجب این بیشتر حرف بزنم

99 درصد مواقع (و اشتباهی که خودمم اوایل میکردم) این بود که کورس میدیدم یا کتاب پروژه محور میخوندم بعد همون کد یا پروژه ای که طرف میزنه رو منم پشتش میزدم.
اصلا اینکارو نکنید

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

1. خوندن سرویسی که شرکت ها میدن و پیاده سازی MVP مشابهش. مثلا یک سایتی میاد پروکسی میفروشه, خب شما بیاین یک سرویس بنویسید که پروکسی بفروشه و وقتی کاربر پروکسی سفارش میده on demand سریع اون پروکسی رو بسازه و با یوزرنیم و پسوورد کاستومایز شده بهش بده.
2. دیدن فیلم مصاحبه ها. خیلی وقتا شرکت هاتو مصاحبه میگن چیکار میکنن و چه هدفی دارن. اگه نمیتونید مصاحبه بگیرین, پس حداقل فیلماشو تماشا کنید و سعی کنید اون چالش هایی که اونا بهش اشاره میکنن یا راه حل هایی که اونا گفتن انجام دادن رو پیاده سازی کنید.

مثلا یک شرکت دیدم database لارجی داشت و تعداد یوزراش کم بود. دیتا هر یوزر مربوط به خودش بود یعنی خیلی وابسته نبودن دیتا ها. به جای index کردن اومده بود برای بهتر شدن پرفومنس برای هرکاربری تو دیتابیس یک یوزر میساخت و موقع query زدن فقط داکیومنت های اون کاربر رو بهش نشون میداد از کل دیتابیسش. حتی قابلیت export هم گذاشته بود که کاربر میتونست SQL export بگیره و عینه همون تیبل رو تو اپلیکشن خودش بسازه.

@ManiFoldsPython
🔥7👍2