Python Hints
8.62K subscribers
170 photos
11 videos
9 files
141 links
Python tips and tricks
The Good, Bad and the Ugly

توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)

Admin: @Abbasi_ai
Download Telegram
Python Hints
#تجربه ساختمان داده و الگوریتم؛ بیشترین سوالی که همیشه از من می‌شه؛ چقدر باید Data structure, Algorithm بلد باشم و یا چندتا leetcode باید حل کنم ؟ اول سوال دوم رو جواب میدم؛ تعداد leetcode هیچ ربطی به سواد الگوریتم شما نداره و ۲ نوع آدم leetcode زیادی…
راجب این موضوع و leetcode :

یک سری مشکلات رو با leetcode و یا data structure, algo این چندروز مطرح کردید که منطقی هم بود (منم دنبال راهکار بودم)

۱- وقتی تگ‌های سوال + سطحش رو می‌بینم می‌فهمم چطوری باید حلش کرد ولی اگر اون‌ها نباشه تو بعضی سوالات کامل می‌مونم.

۲- خیلی از سوالات leetcode مفهومی هست؛ دقیقا هم نمی‌دونم بدرد کارم میخوره در آینده یا نه و همین بی‌انگیزه‌ام می‌کنه (به این دسته دوستان گفتم که منم همین مشکل رو دارم با leetcode)

۳- سطح بندی leetcode که باعث میشه خیلی‌ها جلوی خودتون رو بگیرید

مورد آخر رو اول بگم؛ تکنیک پست قبلی خیلی مهم هست از هر سطح و موضوع باید یک تعداد مشخصی سوال رو انتخاب کنید برای حل کردن؛ اینکه تو ذهنتون به این فکر می‌کنید :
نکنه فلان سوال که سطح ساده/متوسط هم داره یک نکته جدید داشته باشه نسبت به این یکی

یک اشتباه بزرگ هست.
به خودت سخت نگیر؛ مطمئن شو مفاهیم رو یاد گرفتی.

اما برای مورد دوم و اول؛ چندروزی بود که داشتم جستجو می‌کردم و نهایتا یک سایت رو پیدا کردم :

MyLink

فرقش چیه ؟ سوالاش کاربردی تر هست؛ می‌تونید جوابهای دیگران رو ببیند. براش الگوریتم و زمان و ... مهم نیست و مهم حل کرده مسئله هست که همین چون ذهن رو آزاد می‌کنه باعث میشه بیشتر خوش بگذره (البته خیلی هم کد داغون نمی‌تونید بزنید چون تهش تست اجرا نشده؛ زمان تموم میشه)
وقتی مسئله رو حل کردید؛ براساس رای دیگران می‌تونید جوابهای رو ببیند:
best practice, clever, ...

دسته بندی‌هایی هست که وجود داره.

راجب سطح سوالات:
موقع ثبت‌نام سطح فعلی و توانایی و زبانی که می‌خوای تمرین کنی رو ازت می‌پرسه؛ بعد براساس اون فیلدهایی که پر کردی سوالات رو بهت نشون میده.
مثلا دسته بندی :
Fundamental, Rank-Up, Practice and Repeat
وجود داره براش.

خلاصه لزوما ساختمان داده و الگوریتم نیست بلکه تمرین بهتر شدن توی زبان برنامه‌نویسی هست که انتخاب کردید و درنهایت سوالاش خیلی بدرد مصاحبه میخوره (چندتاییش رو برداشتم)
👍256
#نکته_مصاحبه

قبلاً راجب توجه به یک سری نکات تو مصاحبه صحبت کردم؛ یکی از دوستان مصاحبه داشت و کدی که برای مرحله اول زده بود رو نشونم داد.

بهش گفتم امید زیادی به قبولی نداشته باشه!

با اینکه بنظر خودش عالی جلو رفته بود.

چرا ؟

شرکت‌های زیادی هستند که توی مرحله اول مصاحبه از شما سوالات بنظر ساده می‌پرسند؛ شخصاً بعضی وقتا این کار رو می‌کنم بخصوص وقتی تعداد رزومه‌ها بسیار زیاد هست.

ازین دوستمون پرسیده شده بود که؛ یک نوع خاص از آرایه رو پیاده‌سازی کنه برای سادگی من همون آرایه مرتب درنظر می‌گیرم.

شاید سوال بشه؛ چرا باید سوال به این سادگی بپرسند توی مصاحبه ؟ هزاران هزار پیاده‌سازی از آرایه توی اینترنت هست و برای خیلی‌ها پیاده‌سازیش شاید ۲۰ دیقه هم نکشه (اگر تایپ کردنش کند هم باشه)

مسئله همینجا هست؛ چون پیاده‌سازی زیادی داره و همه هم خوندند خیلی‌ها یک کدی رو حفظ می‌کنند و همین حفظ کردن باعث می‌شه توی مصاحبه فقط تایپش کنند که مشکل اصلی به وجود میاد (استرس بالا باعث میشه امن‌ترین کار رو بکنید، واکشی از ذهن بدون فکر کردن بهش)

توی مثال آرایه مرتب فرض کنید به شما بگم، روی سیستم ۸ بیتی قراره آرایه شما استفاده بشه!

بعد کمی جلوتر بگم که قابلیت سرچ رو براش پیاده‌سازی کنید؛ اگر درساتو خوب خونده باشی و کدها رو خوب حفظ کرده باشی؛ می‌دونی چون آرایه مرتب هست توی جستجو می‌تونی از binary search استفاده کنی.

یک بخشی داریم توی جستجوی باینتری که باید وسط آرایه رو پیدا کنید، ۹۹٪ می‌نویسند (توی دوره‌های آموزش و کتاب‌های معروف ببینید) :

(Low + High) // 2

که خب وسط دوتا عدد رو پیدا می‌کنه خیلی هم عالی! ولی اگر توی مثالی که من زدم اینو بنویسید از مصاحبه حذف می‌شید و میرم سراغ نفر بعدی (وقتی تعداد رزومه‌ها زیاده ازین تکنیک استفاده می‌کنم شخصاً؛ تا برای مرحله دوم و سوم مصاحبه بجای ۵۰۰ نفر با ۱۵ نفر مصاحبه کنم)

حالا چرا با این مدل میانگین گیری حذف می‌شید ؟ overflow
فرضیه مسئله من این بود کد روی سیستم ۸ بیتی اجرا بشه؛ ۸ تا بیت یعنی اعداد ۰ تا ۲۵۵ (چون ایندکس رو داریم صحبت می‌کنیم و منفی نداره) اگر مقدار high , low توی یکی از حالات جمعش بیشتر از ۲۵۵ بشه؛ کل محاسبات شما اشتباه میشه و آرایه شما بعد از اولین دیلیت هم دیگه ولید نخواهد بود.

((high - low) // 2) + low
یکی از راهکارهاش هست.

ولی یک سری نکات ریز این چنینی و موارد دیگه که قبلتر صحبت کردیم (نحوه نوشتن repr, iter, ...) بسیار مهم می‌شه!

همیشه به دوستان خودم میگم؛ وقتی دیدی سوال مصاحبه اول خیلی ساده هست حتماً بیشتر بترس ! چرا ؟
چون احتمال و درصد حذف بسیار بسیار بالاس؛ و ممکنه اولین اشتباه، آخرین اشتباه باشه.

شخصاً وقتی سوالات مصاحبه خیلی سخت می‌شه، خیلی استرس کمتری دارم
👍6621
Python Hints
راجب این موضوع و leetcode : یک سری مشکلات رو با leetcode و یا data structure, algo این چندروز مطرح کردید که منطقی هم بود (منم دنبال راهکار بودم) ۱- وقتی تگ‌های سوال + سطحش رو می‌بینم می‌فهمم چطوری باید حلش کرد ولی اگر اون‌ها نباشه تو بعضی سوالات کامل می‌مونم.…
تقریبا روزی ۱‍ دونه دارم حل می‌کنم و لذت بخش هست.

من به ساده‌ترین روشی که به جواب برسه دارم حل می‌کنم مسئله رو و مسئله ها تا اینجا ساده بوده برام اما ...

بهترین بخشش برای من این هست که بعد از حل هر مسئله می‌تونم راه حل‌های باقی آدم‌ها رو هم ببینم و مقایسه کنم.
خیلی ساده با مثال کاربردی چیزایی که یادم رفته بود دوباره برام یادآوری میشه مثلا توی یکی از چالش‌های قبلی یکی اومده بو برای تمیزی کد از
from itertools import groupby

استفاده کرده بود؛ با اینکه میشناختم این متد رو ولی چون خیلی وقت بود بکارم نیومده بود کامل فراموش کرده بودم اما حالا با مثال بهم یادآوری شده و یادداشت هم کردم که بعد از چندبار مرور به ذهنم برگرده.

خود سوالات و حل کردنشون بجای خودش؛ بخش راه‌حل‌های clever, best practice که بعد از حل بهمون نشون میده واقعا عالیه؛ کاملا در تلاشم که حداقل روزی ۱ مورد رو حل کنم.
👍43❤‍🔥66👏2
#تجربه #مصاحبه

بعد از خیلی سال دوباره یک مصاحبه خیلی مهم دارم با یک شرکت بزرگ. برای همین چند روزی هست که روزی ۱-۲ ساعت دارم تمرین انجام میدم (خیلی وقت بود ازینکارا نکرده بودم ولی حالا که وقت دادن قبل مصاحبه بد نیست تمرین کنم)

سوالاتی که توی مصاحبه‌های خوبم تجربه کردم و بنظرم سوالات ارزشمندی بوده رو دارم تمرین می‌کنم و البته بحث‌هایی که بعدش اومده.

بله من سوالات و بحث‌های مهم رو می‌نویسیم و نگه میدارم؛ شما هم باید اینکار رو بکنید. (قبلاً توضیح دادم)

امروز رسیدم به اولین سوالم؛ با یکی از شرکت‌های FAANG خیلی سال پیش بود و سوال مرحله اول (دقیقاً چهره مصاحبه کننده و استرس خودم و ... همرو یادم هست.)
گفتم سوال رو اینجا هم بذارم :


سیستمی رو پیاده سازی کن که بعنوان ورودی یک استرینگ از محاسبات ریاضی بصورت infix دریافت کنه؛ بتونه خروجی رو بصورت postfix, یا prefix (هرکدوم راحت‌تری) تحویل بده یا اگر object اون کلاس صدا زده شده؛ با استفاده از postfix/prefix پیاده‌سازی شده محاسبات رو انجام بده و خروجی رو تحویل.

من اینو یادمه که با postfix حل کردم چون راحت‌تر بود (stack) :
اما چندتا چیز رو بررسی می‌کرد:
۱- چون صحبت از object شد باید. OOP می‌بود
۲- حتماً باید __call__ رو براش پیاده‌سازی می‌کردم که callable باشه (این یعنی داندر متود‌ها رو می‌شناسم)
۳- سراغ پیاده‌سازی ساده‌تر رفتم (تصمیم گیری و شناخت مسأله، البته توضیح هم دادم چرا بنظرم ساده‌تر هست و ...)
۴- استفاده از stack که بعد خود stack رو پیاده‌سازی کردم (آشنایی با DS, حتی بحث هم کردم بین LinkedList, Array چرا و کدوم رو انتخاب می‌کنم برای ساخت stack)

و موارد دیگه‌ای که بعدش اومد و بحث شد؛ امروز دارم اینو تمرین می‌کنم با تست‌ کیس‌های سخت‌تر. یاد اون مصاحبه افتادم و چون سوال خوبی بود برای تمرین گفتم اینجا هم بذارم.


پ.ن؛ اگر خواستید پیاده‌سازی کنید این حالات رو تست کنید (تو مصاحبه از مصاحبه کننده باید پرسیده بشه)

۱- سیستم ورودی invalid داشته باشه؛ خروجی برای هر دو حالت None هست
۲- سیستم infix برای اولویت دادن به محاسبات از () ممکنه استفاده کنه
۳- سیستم فقط از ۴ عمل اصلی + پرانتز پشتیبانی خواهد کرد
۴- ورودی‌های عددی ممکنه float/int باشه
۵- ممکنه بین کاراکترها space باشه یا نباشه
"17+3.5" or "17 + 3.5"
هر دو درست هست.
👍4317❤‍🔥10
#کتاب
#Book

تابستون شده و کلی دانشجو/دانش‌آموز پر انرژی پیام دادند برای یادگیری لینوکس کتاب معرفی کن.

و خب چی بهتر از کتاب مقدس ؟ 😁

The Linux Bible

اضافه کنم تا نیومدید بمبارونم کنید:
کلمه Bible توی کتابای فنی به منظور مقدس و ... نیست و بیشتر منظور این هست که کتاب طبق ادعا نویسنده و انتشارات کاملاً جامع و کامل هست ۰ تا ۱۰۰.

من اولین بار نسخه‌های قدیمی‌تر این کتاب رو ۱۳-۱۴ سال پیش خوندم؛ و بعد با کتاب‌های RedHat آشنا شدم.

هنوزم بنظرم یکی از بهترین‌هاس.


برای دوستانی که با کتابهای Sander van Vugt لینوکس رو شروع کردند (قبلتر پیشنهاد دادم بهشون برای آزمون ردهت) نیازی به خوندن این کتاب نیست ولی چون اون مباحث چندین کتاب میشه طبق آزمون و این کتاب جامع هست برای همین به دانشجوهایی که آزمون و سرور ادمین شدن هدف فعلی نیست؛ این کتاب رو پیشنهاد میدم.
👍3810❤‍🔥2
با socketify تازه آشنا شدم؛
دیروز دیدم (توی میت) همکارم داشت روش کار می‌کرد.

شخصاً به کارم نمیاد فعلا اما، بنچمارک‌های جالبی ازش دیدم!

GitHub
👍22🔥1
#کتاب
#Book

توی گروه صحبت شد؛ یک کتاب برای تست نویسی توی پایتون!

هرچی فکر کردم کتابی بهتر از
Python Testing with pytest, 2nd ed.

توی ذهنم نیومد.

چون دیدم توی لیست کتابها برای تست نویسی کتاب معرفی نکردم گفتم اینجا هم بذارم!
48👍14
اگر Async کد می‌زنید توی پایتون
بهترین خبری که راجب python3.14 می‌تونم بهتون بدم این بخش از تغییرات هست :

What is new in python3.14

خیلی اتفاقی داشتم دنبال یک تکنیک برای درک باگ کدم می‌گشتم که یک پست روی Medium دیدم (پست خوب توضیح نداده بود) برای همین سرچ کردم و دیدم python3.14 این ویژگی رو داره

uv python install 3.14

بنظرم این خیلی اتفاق قشنگی هست.
20👍11
نمی‌دونم چرا ولی خیلی‌ها پیام دادید کتاب برای fastapi هم معرفی کنم!

برای خودمم نیاز بود یک کتاب خوب تو زمینه FastApi پیدا کنم برای معرفی؛ برای review مطالب یکی از دوستان هم اینکار رو زودتر شروع کرده بودم (۲ هفته قبل).

تا اینجا ۳ تا کتاب رو خوندم که بنظرم هیچکدوم با ارزش نبود.
امیدم به ۲ تا کتاب آخر هست؛ (البته اینها کتابایی هست که آپدیت شده ۲۰۲۵-۲۰۲۴)

فعلاً پیشنهادم همون داکیومنت خود FastApi هست و چیز بهتری براش ندیدم و ندارم!


فکر می‌کنم این موج رفتن سراغ FastApi بخاطر LLM, Agent ها باشه.
حواستون باشه Fastapi به خودی خود مشکلات Sync, Async شمارو حل نمی‌کنه
پروفایلینگ فراموش نشه 👌
38👍13
خروجی این ۳ تا کتاب؛
آشنایی من با یک پروژه بود :

GitHub Page

کاری که می‌کنه اینه؛ بهش Swagger رو می‌دید یا هر داکیومنتی که با استاندارد OpenAPI هست و بصورت خودکار با حالات مختلف تستش می‌کنه !

اگر وارد پروژه‌ای شدید که تست نویسی نداره؛ یا اینکه برای قدم آخر و اطمینان بیشتر می‌خواید تست نهایی هم داشته باشید
بنظرم چیز خوبی هست👌

یادتون نره Property Testing آخرین گزینه هست؛ حتماً خودتون باید تست نویسی داشته باشید (خواستم اسمش رو بدونید اگر تو مصاحبه‌ای پرسیدند ازتون)
👍239🔥5
Python Hints
خروجی این ۳ تا کتاب؛ آشنایی من با یک پروژه بود : GitHub Page کاری که می‌کنه اینه؛ بهش Swagger رو می‌دید یا هر داکیومنتی که با استاندارد OpenAPI هست و بصورت خودکار با حالات مختلف تستش می‌کنه ! اگر وارد پروژه‌ای شدید که تست نویسی نداره؛ یا اینکه برای قدم…
#موقت

اگر ۳ تا کتاب لازم باشه (۸۰۰ صفحه) تا فقط ۱ نکته جهت بهبود پروژه‌هام یاد بگیرم

کاملاً خوشحال خواهم بود!
خلاصه که راضی شدم 👌

حیف توی کتاب راجبش توضیح نداده بود و فقط ابزار رو اسم برده بود (اگر کسی گیت‌هابش رو چک نکنه نمی‌دونه پروژه‌اش چیکار می‌کنه)
👍232
هرکسی گوه غزه رو خورد اینو بزنید تو صورتش!

بعد از این‌ همه جنگ و بزرگ‌نمایی، فقط ۲۰٪ کودکان غزه سو تغذیه دارند
ولی از طرفی در ایران
۵۴٪ بچه‌های سیستان و بلوچستان سو تغذیه دارند

اون حرومزاده‌هایی که غزه از دهنشون نمیوفته یک کامنت هم برای بچه‌های سیستان و بلوچستان ندارند!

آره عزیز؛ حتی توی این همدردی هم به فکر وام دولتی و پشتیبانی حکومتی هستید.

لینک خبر رکنا


رکنا اقتصادی: یک استاد اقتصاد با بیان اینکه در سیستان و بلوچستان 54 درصد از کودکان، دچار سوء تغذیه و کوتاه قامتی هستند و 25 درصد هم دچار کم وزنی ناشی از اختلال در تغذیه هستند، گفت: در استان خوزستان، 58 درصد ازخانوارها دچار تغذیه ناامن هستند. این رقم در سیستان و بلوچستان 70 درصد و در استان کرمان 74 درصد است.
👍196👏148❤‍🔥5
#Quick
سوال مصاحبه یکی از دوستان بوده.

توی مصاحبه خیلی از زبان‌های برنامه‌نویسی مختلف یکی از سوالاتی که پرسیده می‌شه مربوط به نحوه ارسال آرگومان به توابع هست اکثرا هم شما به یکی از دو حالت:

Pass by Value
Pass by Reference

اشاره می‌کنید؛ اما توی پایتون اینطوری نیست توی پایتون ما
Pass By Object Reference (Pass by Assignment)
رو داریم. اول برگردیم به این تعریف که:
همه چیز در پایتون نهایتا object هست.


وقتی یک آرگومان رو به تابع میدید؛ رفرنس اون آبجکت رو براش می‌فرستید و نه یک کپی از اون رو ولی این رفرنس رو بصورت pass by value می‌فرستید! گیج گننده شد؟ برای همین میگیم پایتون نه Pass By Reference هست نه Pass By Value

یک صندوق رو فرض کنید که توش وسایل شما قرار داره (این حکم object رو داره) حالا فرض کنید برای اینکه جاش رو یادتون نره آدرسش رو روی یک کاغذ نوشتید و توی جیبتون می‌ذارید (این میشه reference شما)
یکی از دوستانتون می‌خواد صندوق رو ببینه؛ شما فقط کافیه آدرس رو بهش بدید که برای اینکار شما آدرس رو روی یک کاغذ جدید می‌نویسید و اون رو بهش میدید (این میشه Pass reference by Value)

و این میشه مدل پایتون؛ اگر رفیق شما بره اونجا و از داخل صندوق چیزی برداره یا تغییراتی روی صندوق انجام بده؛ شما هم اون تغییرات رو خواهید دید. اگرم که صندوق رو ببینه و کارش که تموم شد کاغذ آدرس صندوق رو بندازه دور اونوقت صندوق هنوز سرجاش خواهد بود و شما صاحبش هستید.

اگر بره از صندوق یدونه بسازه؛ صندوق شما تغییری نمی‌کنه فقط یکی دیگه مشابهش وجود داره (که ممکنه چیزایی که داخلش هست فرق کنه)

مثال بالا میشه برای Object هایی که قابل تغییر هستند مثل list
اما اگر Object قابل تغییر نبود چی ؟ مثل Int
اونوقت رفیق شما هر تغییری که بخواد بده اول باید ی دونه از روی چیزی که مال شما هست برای خودش بسازه بعد تغییرش بده.


def demonstrate_passing_behavior(my_list, my_int):
print("\n--- INSIDE FUNCTION ---")
print(f"List ID: {id(my_list)}, Int ID: {id(my_int)}")

my_list.append(4)
print(f"List after append: {my_list}, ID(append): {id(my_list)}")

print("Copy of the original list")
my_list = list(my_list)
print(f"List copy and reassignment: {my_list}, ID(copy): {id(my_list)}")

print("Modifying integer...")
my_int = my_int + 10
print(f"Int after modification: {my_int}, ID(modified) : {id(my_int)}")


original_list = [1, 2, 3]
original_int = 5

print(f"Original list: {original_list}, ID: {id(original_list)}")
print(f"Original int: {original_int}, ID: {id(original_int)}")

demonstrate_passing_behavior(original_list, original_int)

print("\n--- AFTER FUNCTION CALL ---")
print(f"Original list: {original_list}, ID: {id(original_list)}")
print(f"Original int: {original_int}, ID: {id(original_int)}")
👍5323
#تجربه

بیش از ۹۸٪ پروژه‌های اپلیکیشن‌هایی که کار کردم دیتابیس رو اشتباه انتخاب کرده بودند!

اصلا طبیعیت دیتاها و کار با دیتابیس و ... اشون SQL نیست
اما ۱۰۰٪ تأکید دارند که از SQL استفاده بشه و اکثراً بعد از مدتی کوئری‌های پیچیده کل سیستمشون رو می‌گیره !


مشکل کجاس ؟
- عدم شناخت کافی از دیتابیس‌های دیگه:
Mongo, Janus, Casandra, Scylla, ....
این بیشترین موردی هست که دیدم.

- عدم توانایی طراحی درست سیستم؛ معماری سیستم خیلی مهم هست.

- عدم بررسی و آنالیز نیازمندی‌های سیستم؛ اینکه درگیر دنبال بهترین‌ها بودن نشید چیز خوبیه ولی اینکه سر چیزای ابتدایی هم تحقیق نمی‌کنید و می‌ندازید گردن اینکه من نمی‌خوام کمالگرا باشم یک موضوع متفاوت هست.

- ترس، ترس از تست کردن چیزای جدید.
طرف می‌گه من ۱۰ ساله دارم SQL کار می‌کنم (خب به درک!!)، نهایت همرو خودم Query می‌نویسم! به فکر نفرات بعدی روی پروژه هم باش
احمقانه تصمیم نگیر


راجب mongodb بخونید، خیلی از شما چیزی که بهش نیاز دارید mongodb هست
Transaction
رو هم داره؛ تا ۱۰۰ لول ارتباط تو در تو هم نگه میداره (که عمرا و عملاً بهش نمی‌رسید)
به راحتی می‌تونید replication و read-only داشته باشید

دیزاین collection (مثل table بهش فکر کنید) می‌تونی ثانیه‌ای عوض بشه اگر بخواید.
فرض کنید توی sql بتونید، هروقت خواستید بدون دردسر و migration, ... ستون اضافه کنید.

به کمک پکیج motor خیلی راحت؛ async رو هم در اختیار خواهید داشت

Janus
هم گزینه خوبی هست برای اون‌هایی که به دیتابیس Graph نیاز دارند.
۶ سال قبل بعنوان جایگزین رایگان Neo4j ازش استفاده کردم روی حجم داده بسیار بسیار بالا و خیلی رضایت بخش بود.


خلاصه که زرتی نرید با SQL شروع کنید.
👍8016👏5❤‍🔥2
متا دیگه دنبال coder نمی‌گرده
حتی اینکه چندتا leetcode هم حل کردید و حفظ کردید توی متا مهم نیست.

ازین پس، توی مصاحبه‌های شرکت META اجازه استفاده از هوش مصنوعی رو هم دارید.

۱ سال و نیم قبل گفتم، شرکت‌ها قطعاً و حتماً به این سمت خواهند رفت 👌

تعریف جونیور هم بیشتر عوض خواهد شد !

پی‌نوشت:
Coder != Software Engineer
برای دوستان تازه‌ وارد
👍10513🔥1
طبق تجربه خودم؛

بیشترین دلیل fail شدن استارتاپ‌‌هایی که دیدم ایده بد یا وجود رقیب و .... نیست!

فقط یک چیز هست؛ انجام کارهای تکراری به تعداد دفعات تغییر توی کدها

دلیلش؛ عدم تست نویسی!

از هر ۱۰ مورد، ۹ مورد دلیلش جز این نبوده.

پ.ن:
راجب این مورد، قطعاً روی استارتاپ یکی از دوستان صحبت خواهم کرد (صحبتی که باهم داشتیم، راجب اینکه حتی وقتی پول زیادی هم پشتوانه‌اش بود بازم نهایتاً استارتاپ fail شد)
48👍17🔥2
#مصاحبه

چندوقت پیش برای یک شرکتی داشتم مصاحبه انجام میدادم؛ یک توسعه دهنده پایتون می‌خواستند با دانش بالا از concurrency, parallelism کلی هم روزمه دریافت کرده بودند.

قرار بود من فقط ۲ روز براشون وقت بذارم و مصاحبه کنم ولی انقدر تعداد روزمه‌ها زیاد بود که ۱ هفته کار می‌برد؛ مصاحبه رو ۲ مرحله‌ای کردیم توی مرحله اول سوال جوابای کلی پایتون بود که نیروهای خود شرکت انجام میدادند و درنهایت هم ۱ تسک بهشون داده میشد که توی همون مصاحبه انجام بدند؛ تسک این بود (چون خودم تسک رو داده بودم میگم):

یک کد ۸ رقمی با الگوریتم sha256 هش شده؛ و تونستیم هش خروجی رو بدست بیاریم. کدی بنویسید که عدد رو برامون پیدا کنه.
توی سوال و جواب بهشون گفته می‌شد که عدد می‌تونه مثلا 5 هم باشه ولی به اینصورت:
"00000005"


تقریبا همه شرکت‌ کننده‌ها حل کردند مسئله رو؛ به هیچکس هیچ راهنمایی داده نمی‌شد و از هیچکدوم از افراد هم چیزی اضافه بر متن بالا خواسته نمی‌شد.

حدود ۱۲ نفر موندند که به مصاحبه مرحله دوم دعوت شدند؛ اما یکنفر بود که کلا آدم اعتراض کردن هست (پست‌هاش توی لینکدین توی چند وقت اخیر چیزایی که منم تگ شدم)
نمی‌دونست سوال مصاحبه با من بوده و ادعا کرده توی لینکدین که بهترین راه حل رو ارائه داده ولی رد شده (انگاز کسی باهاش جنگ داره) ازش خواستم پستش رو پاک کنه وگرنه براش خیلی بد میشه ...

اما این قضیه و دیدن اینکه خیلی از بچه‌های حتی سنیور عکسی که از راهکار گذاشته رو لایک کردند باعث شد بیام و بگم چرا کدی که اون آدم گذاشته بود اصلا بدرد نمیخورد:
بله کد parallel اجاره میشه ولی

همه‌ی کدهای parallel به یک اندازه خوب نیستند و یا حتی درست هم نیستند.

ادامه پست بعدی ...
32👍3🔥1
Python Hints
#مصاحبه چندوقت پیش برای یک شرکتی داشتم مصاحبه انجام میدادم؛ یک توسعه دهنده پایتون می‌خواستند با دانش بالا از concurrency, parallelism کلی هم روزمه دریافت کرده بودند. قرار بود من فقط ۲ روز براشون وقت بذارم و مصاحبه کنم ولی انقدر تعداد روزمه‌ها زیاد بود که…
اول کد آقای اعتراض (این سورس کد رو خودم زدم ولی با تکنیکی که ایشون بعنوان راهکار نهایی ثبت و ایمیل کردند.)

کد پارالل هست و اجرا هم میشه؛ هش اول رو توی ۲۲ ثانیه پیدا می‌کنه و عدد 5 رو به درستی بر میگردونه. (این هش‌ها توی تست به مصاحبه شونده‌ها داده نشده بود و من الان ایجادشون کردم اعدادش هم به عمد هست)

چرا 5 ؟
برای اینکه توی رنج اعدادی که ایجاد میشه اوایل اولین لیست chunk قرار میگیره پس سریع محاسبه میشه.

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

چرا 69269268 ؟
مشگل دوم باگ برنامه‌نویس هست؛ من هم میخواستم خروجی رو برای یک عدد رندوم ببینم و هم میخواستم توی chunk های اول نباشه ولی برای این عدد بهم -1 برگردوند.
یک مقدار دقت کنید پیداش می‌کنید (البته من بخاطر این اشتباه ردش نکردم)

ادامه پست بعدی ...
👍201🔥1
اینم براساس راهکار کسی که استخدام شد؛ استفاده از
multiprocessing.Value

برای اینکه بتونه بین پراسس‌ها وضعیت رو بررسی کنه؛ به محض اینکه یکی از پراسس‌ها اعلام کنه به جواب رسیده
found.value

باقی پراسس‌ها قطع می‌شند و پردازش تکمیل میشه.

با این روش؛ جواب هش اول توی 7ms بدست میاد.

اما این کد هم می‌تونه بهتر بشه؛ برای hash دوم با عدد 69269268 تقریبا ۲ برابر روش قبلی زمان نیاز داره!
بطور کلی برای اعدادی که توی ۲۵٪ انتهای chunk خودشون قرار میگیرند!

راهکار بهتر رو کسی توی مصاحبه ننوشته بود برای همین کدهای هیچکدوم از مصاحبه شونده هارو با اون مقابسه نکردم؛ ولی تمرین خوبی هست اگر بهش فکر کنید!

=================
سوال شده:
۱- لینکدین من روی پست اول توی پین شده‌ها هست

۲- فونتی که استفاده می‌کنم operator mono هست

۳- ادیتور و تم و ... هم مربوط به تنظیمات neovim هست که گذاشتم البته از برنچ javascript استفاده کنید این تغییرات اونجاس (فونت رو باید روی ترمینال فعال کنید)

۴- توی مصاحبه اول، دسترسی به ai وجود نداشت؛ مصاحبه دوم بلامانع بود استفاده از ai

۵- سوال اصلی مصاحبه نبود؛ برای حذف روزمه‌های اضافه بود
👍227