Md Daily – Telegram
Md Daily
725 subscribers
239 photos
15 videos
21 files
283 links
راجب مقالات و مستندات فنی یا غیر فنی که میخونم و علایقم اینجا مینویسم :)


گروه کانال: https://news.1rj.ru/str/MdDailyGap

کورس ها: https://news.1rj.ru/str/MdDaily/395

وبلاگ: https://mddaily.ir
Download Telegram
درس هایی راجب برنامه نویسی از زبان Matt Butcher

یادتون باشه هر خط کدی که می‌نویسین باید بعدا ازش پشتیبانی کنین!

این حرف خیلی معنی داره که تو ادامه می‌گم:

- برنامه نویسی به عنوان صنعتگری
- چرخ رو از اول اختراع نکن
- هزینه پیچیدگی
- کاهش نیازهای آینده برای نگهداری
- چرا خود آیندتون (و دیگران) قدردان کد امروزن

برنامه نویسی به عنوان صنعتگری

«صنعتگری» به معنی تعهد به یه حرفه است، جایی که مهارت با گذشت زمان و از طریق تلاش سخت و تمرین مداوم به وجود میاد. نوشتن کد، با تمام دیباگ و تست کردن و بازنویسی‌هاش، یه کار کاملاً عملیه. ساختن نرم‌افزار خوب به مهارت، دانش و تمایل مداوم برای پیشرفت نیاز داره. وقتی کد می‌نویسین، وقت بذارین که کارتون رو خوب انجام بدین. درسته که «کمالگرایی دشمنه» و باید کد بزنین که کارتون راه بیفته. اما رعایت اصول درست کد نویسی، اسم‌گذاری درست متغیرها و فکر کردن به مشکلی که دارین حل می‌کنین، همه اینا باعث می‌شه که نگهداری از کدتون تو دراز مدت راحت‌تر بشه.

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

چرخ رو از اول اختراع نکن

یه کتابخونه یا ابزاری هست که کار رو راه می‌ندازه، ولی خب، ما میتونیم بهتر انجامش بدیم!
فکر می‌کنم هر مهندس نرم‌افزاری حداقل یه بار این کار رو کرده و همیشه یه جور توجیه هم هست:

کتابخونه‌های دیگه‌ای هم بودن، اما سنگین/پر از باگ/پیچیده/و …
یه راه جدید دارم که بقیه بهش فکر نکرده بودن.
انجام دادنش خودم بیشتر یاد می گیرم تا اینکه از کد بقیه استفاده کنم (حرفت درسته، اما با هزینه‌ای خیلی بیشتر از اون چیزی که فکرشو می‌کردی).

تو همه این موارد، دو تا چیز نادیده گرفته میشن:

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

پس وقتی که ابزار آماده هست، اما فکر می‌کنین شاید خودتون بهتر انجامش بدین، از خودتون بپرسین چقدر برای نگهداری از اون کد تو چند سال آینده اشتیاق دارین؟ آیا استثناهایی برای این قضیه وجود داره؟ بله! اما اونم بعد از اینکه واقعاً بررسی کردین که آیا راه‌حل‌های موجود به اندازه کافی برای انجام کار خوب هستن یا نه.

هر چی کدت پیچیده‌تر، دیباگش سخت‌تره

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

شاید مجبور بشین خط‌های بیشتری کد بنویسین (چون کارهای پیچیده رو به تابع‌های کوچیک‌تر تقسیم می‌کنین)، اما اگه نتیجه‌ش بشه کدی که دیباگ و نگهداریش راحت‌تره، ارزشش رو داره.

کاهش نیازهای آینده برای پشتیبانی
هر سیستم خوبی یه سری کنترل کیفیت داره. کد هم باید همین‌طور باشه. باید یه استراتژی برای تست نوشتن پیدا کنید،‌به هر حال، مهم نیست استراتژی شما چیه، اگه الان تست نکنین، بعداً باید دیباگ کنین.

خودت آیندت یادش نمیاد که خودت الانت به چی فکر میکرده
پس همه‌چی رو مستند کن! آدما یه جور پیش‌فرض عجیب دارن. فکر می‌کنیم که فردا همه چیزایی که امروز اتفاق افتاده رو یادمون می‌مونه. خود آینده‌ت جزئیات ریز اینکه چرا امروز این کد رو به این شکل نوشتی، یا چرا اون متغیر رو fhr اسم گذاشتی، یا چرا کامنت // FIXME later رو رو خط ۲۳۵ جا گذاشتی، یادش نمیاد.

بهترین راهی که می‌تونی با محدودیت‌های حافظه‌ت مقابله کنی اینه که کدت رو واضح بنویسی. این یعنی:

کامنت بذار.
اسم‌ها رو خوب انتخاب کن.
مستندات خوب بنویس.
کامیت‌مسیج‌های مفید بنویس.

خود آینده‌ت ازت ممنون می‌شه. یا حداقل از دستت عصبانی نمی‌شه.

نتیجه گیری: اگه بقیه نتونن اونو بفهمند، همیشه مشکل شما باقی می‌مونه
پس طوری مستندش کن که بقیه بتونن اونو بفهمند.
اگه کدتون راحت‌فهم نباشه، مثل یه کابوس برمی‌گرده سراغتون. چون بقیه نمی‌تونن اونو بفهمند. کدتون رو انقدر راحت‌فهم کنین که یه نفر دیگه بتونه اونو درست کنه بدون اینکه حتی نیاز باشه شما بفهمین!

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

🆔 @MdDaily
❤‍🔥2👍21🔥1👏1
#ام_دی_کورس

سوال مصاحبه System Design: طراحی کوتاه کننده URL

یه سوال مصاحبه طراحی سیستم داریم که توش باید یه ابزار کوتاه کننده URL مثل TinyURL یا Bitly رو از صفر طراحی کنیم. همه چی رو از الزامات طراحی و معماری و طراحی اجزا تا اینکه چطور میشه سیستم رو برای سرعت بالا و امنیت بیشتر ارتقا داد، بررسی می‌کنیم.
اول از همه باید مشخص کنیم که این سیستم چی‌کار باید بکنه و چی‌کار نباید بکنه.
از نظر کارکردی، دو تا وظیفه اصلی داره:
وقتی یه URL بلند بهش می‌دی، باید یه URL کوتاه بسازه.
وقتی یه URL کوتاه بهش می‌دی، باید کاربر رو به URL بلند ببره.
برای این سرویس دو تا چیزه خیلی مهمه: اینکه کارش رو خیلی سریع انجام بده (پاسخ‌های کوتاه) و اینکه همیشه در دسترس باشه (همیشه آنلاین). میشه گفت اولویت با این دوتاست.
سوالات شفاف سازی برای مصاحبه کننده
اینجا چند تا .....



ادامه در:
🔗 https://mddaily.web.app/blog/system-design-interview-question-design-url-shortener/

🆔 @MdDaily
❤‍🔥5👍1🔥1
Md Daily
#ام_دی_کورس سوال مصاحبه System Design: طراحی کوتاه کننده URL یه سوال مصاحبه طراحی سیستم داریم که توش باید یه ابزار کوتاه کننده URL مثل TinyURL یا Bitly رو از صفر طراحی کنیم. همه چی رو از الزامات طراحی و معماری و طراحی اجزا تا اینکه چطور میشه سیستم رو برای…
توی این قسمت از ام دی کورس خیلی ساده و خلاصه به System Design یه کوتاه کننده لینک پرداخته شده و راجب مباحثی مثل معماری، انتخاب دیتابیس مناسب، لودبالانسر، کشینگ و... صحبت شده و مثل همیشه منابعی که استفاده کردمم آخر مقاله در دسترسن :)
❤‍🔥5👍1
هوش مصنوعی، یار یا جاسوس؟ نگاهی به Copilot+ PC و خطراتش برای حریم خصوصی

هوش مصنوعی تو این چند سال حسابی سر و صدا کرده و کلی چیزای جدید و باحال بهمون داده. اما یه چیز هست که تو این هیاهو گم شده: حریم خصوصی ما!

از زمانی که مایکروسافت برای ادغام ابزارهای مبتنی بر هوش مصنوعی تو محصولاتش با OpenAI همکاری کرد، به نوعی قدرت پیدا کرده و محبوب ترینشونم Copilot هست. این قضیه یه برگ برنده تو تبلیغات برای مایکروسافت شده و حالا یه خط جدید از کامپیوترها به اسم Copilot+ PC راه انداخته. شرکت‌هایی مثل دل، HP، لنوو و بقیه هم کلی لپ‌تاپ و کامپیوتر جدید دارن که قراره با پردازنده‌های سری اسنپدراگون X و یه NPU داخلی برای هوش مصنوعی عرضه بشن.

ابزار Recall که توی رویداد معرفی شد. وقتی روشنه، هر چند ثانیه یک بار از صفحه‌ اسکرین‌شات میگیره. بعد این اطلاعات رو ذخیره می‌کنه، یه جور تایم‌لاین قابل اسکرول میده که برگردی عقب و ببینی قبلا داشتی چیکار می‌کردی. مایکروسافت میگه تمام اسکرین‌شات‌های گرفته شده با Recall روی خود دستگاه ذخیره و رمزنگاری میشن. حتی اگه چند نفر از یه ویندوز استفاده کنن، باز هم نمی‌تونن به اسکرین‌شات‌های Recall بقیه دسترسی پیدا کنن، مگه اینکه از یه حساب کاربری مشترک استفاده کنن. Recall همچنین از سشن های وب‌گردی InPrivate تو مایکروسافت اج اسکرین‌شات نمیگیره. (فعلا معلوم نیست این قابلیت برای مرورگرهای دیگه هم همین‌طور باشه). این قابلیت همچنین هیچ‌کدوم از محتواهای محافظت‌شده با DRM رو ضبط نمی‌کنه، مثل محتواهای سرویس‌های استریم آنلاین. اما یه نکته‌ی منفی دیگه هم داره. Recall اطلاعات حساس مثل رمز عبور، شماره‌ی حساب‌های بانکی و غیره رو هم ضبط می‌کنه چون هیچ moderation محتوائی‌ای روش نیست. نتیجش چی میشه؟ داده های دردسترس بیشتر از شما برای malicious actors یا خرابکار ها :)

🔗 ویدیوی معرفی Copilot+ PCs

خوشبختانه میشه Recall رو از تنظیمات غیرفعال کرد، اما طبق سوالات متداول توی صفحه‌ی وب‌شون، به احتمال زیاد Recall وقتی برای اولین بار Copilot+ PC رو روشن می‌کنی به صورت پیش‌فرض فعاله.

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

🔗 تصویر منابع مورد نیاز برای ai مایکروسافت

با توجه به سابقه ی مایکروسافت توی نقض حریم شخصی حتی اگه تمام پردازش برای Recall به صورت محلی انجام بشه، من هیچ‌وقت نمی‌تونم اجازه بدم همچین ابزاری هر کاری که رو کامپیوترم می‌کنم رو کنترل کنه.

مایکروسافت لازمه که قابلیت هوش مصنوعی Recall رو متن‌باز کنه تا کاربرا بهش اعتماد کنن. اما اونا نمی‌تونن این کارو بکنن، درسته؟ مهم‌تر اینکه، وقتی پای غول‌های تکنولوژی وسط باشه، هیچ‌وقت نمی‌دونی کی شرایط استفاده یا سیاست‌های حفظ حریم خصوصیشون رو عوض می‌کنن. و وقتی این کارو بکنن، ازت انتظار می‌ره یا باهاش کنار بیای یا کلا از سرویس‌شون استفاده نکنی.

به هر حال، اگه کنجکاو شدین، Copilot+ PC چند تا قابلیت دیگه هم داره. یکیش زیرنویس زنده‌ی صدا و تصویر به انگلیسی از بیش از ۴۰ زبانه، یه قابلیت به اسم Cocreator که از نوشته یا شکل‌هایی که بهش میدید استفاده می‌کنه تا هرچیزی که مشخص کردید رو تفسیر کنه و نشونتون بده. یه قابلیت دیگه به اسم Auto Super Resolution که نرخ فریم (FPS) رو تو بازی‌ها بالا می‌بره، و یه قابلیت به اسم Windows Studio Effects برای تماس‌های تصویری.

خلاصه که هوش مصنوعی یه چیز خوبه و میتونه خیلی بهمون کمک کنه. ولی با توجه به انحصار های بوجود اومده چه قدر حریم شخصیمون در آینده به خطر میوفته. نظر شما چیه؟

🆔 @MdDaily
👍6
کوپایلت برای تلگرام ربات رسمی داده :)

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

🔗 آدرس ربات: @CopilotOfficialBot

🔗 آدرس معرفی تو سایت مایکروسافت:
https://www.microsoft.com/en-us/edge/copilot-for-social?form=MY02F9&ch=1


🆔 @MdDaily
😁5❤‍🔥1👍1🥰1
من معمولا از پلتفرم های دیگه مطلب توی کانال نمیذارم ولی این یکی خیلی خوب بود :)

متیو کریمی توی یک رشته پست توئیتری اومده بود چیزایی که ازش درآمد داشته رو رایگان به اشتراک گذاشته مثل دوره های آموزشیش.

لینک دوره‌ها:

جعبه ابزار بیزنس: https://eseminar.tv/wb13299

هزار و یک محتوا: https://eseminar.tv/wb10114

نکات کلیدی راه‌اندازی کسب‌وکار: https://eseminar.tv/wb14110

چاپ و بازاریابی و فروش کتاب: https://eseminar.tv/wb14193

موفقیت با طعم قهوه: https://eseminar.tv/wb15086

چگونه دوره آموزشی بسازیم: https://eseminar.tv/wb18476

راهکار افزایش فروش در ایران: https://eseminar.tv/wb29985

تسلط بر فریبکاری: https://eseminar.tv/wb114608

🎁 کد تخفیف: freeiranaccess2024

و آخر توئیتشون گفتند:

🖤 فقط یه خواهشی دارم اگر استفاده کردین برای عمه مرحومم که به خاطر کرونا فوت کرد دعا کنید اگر به دعا و انرژٓی مثبتتون اعتقاد دارین.


</متیو کریمی>

🆔 @MdDaily
👍7👎1😁1🗿1
چند Best Practice در طراحی REST API

امروزه که همه چی به هم وصله، REST APIs با طراحی خوب، پایه و اساس برنامه‌های کاربردی کارآمد و قابل ارتقا هستن.

نوشتن دیزاین های REST API تمیز به چند دلیل خیلی مهمه:

استفاده راحت‌تر: یه API با طراحی خوب، کاربرپسند و سادست، و برای توسعه‌دهنده‌ها با هر سطحی قابل استفاده‌ست. اینجوری دیگه نیازی به صرف زمان زیاد برای یادگیری نیست.

نگهداری راحت‌تر: کد تمیز، نگهداری رو راحت‌تر می‌کنه. با این کار پیدا کردن و رفع اشکال، اضافه کردن قابلیت‌های جدید و ارتقای API ساده‌تر و هزینه‌های توسعه هم کم میشه.

کاهش زمان توسعه: با مشخصات API دقیق و مستندات شفاف، میشه خیلی سریع‌تر برنامه‌نویسی کرد چون دیگه نیازی به حدس و گمان و تست‌های مفصل نیست. اینجوری هم در زمان و هم در منابع صرفه‌جویی میشه.

مقیاس‌پذیری بیشتر: یه طراحی تمیز، با ارائه یه معماری ماژولار که به راحتی قابل گسترشه، امکان مقیاس‌پذیری راحت رو فراهم می‌کنه. اینجوری API می‌تونه با نیازهای برنامه شما رشد کنه و مشکلی پیش نیاد.

استفاده مجدد بیشتر: یه API با طراحی خوب رو میشه تو چند برنامه دیگه هم استفاده کرد، اینجوری دیگه نیازی به تکرار کار نیست و همه چی منظم‌تر میشه. اینجوری توسعه برنامه‌ها ساده‌تر میشه و در زمان و تلاش هم صرفه‌جویی میشه.

مستندات بهتر: طراحی‌های تمیز، مستندسازی رو هم ساده‌تر می‌کنن و نحوه کارکرد API و نحوه استفاده درست ازش رو به طور کامل برای برنامه‌نویس‌ها توضیح می‌دن. اینجوری همه چی شفاف میشه و استفاده از API هم راحت‌تر میشه.


رولز ها یا قوانین URI

ساختار یه URI به شکل زیره:
scheme :// authority / path [?query][#fragment]


مثال:
https://soccer.api.org/teams/dortmund/players?name=Rona#2


تو دنیای URI دو نوع منبع (resource) داریم:

منابع مجموعه (Collection resources): این نوع منبع، مجموعه‌ای از منابع دیگه رو در خودش داره. میشه اون رو به یه جدول تو دیتابیس تشبیه کرد. مثلا میشه یه منبع مجموعه به اسم users داشته باشیم که لیستی از تمام کاربرها رو در خودش داره.

منابع تکی (Singleton resources): ا
ین نوع منبع، فقط شامل یه منبع واحده. میشه اون رو به یه رکورد تو دیتابیس تشبیه کرد. مثلا میشه یه منبع تکی به اسم users/123 داشته باشیم که اطلاعات مربوط به یه کاربر خاص با شناسه ۱‍۲‍۳ رو نشون بده

نکات مهم طراحی Rest Api

۱. منابع Collection باید جمع (plural) باشن :

 soccer.api.org/teams/dortmond
soccer.api.org/team/dortmond


۲. منابع Singleton باید مفرد (singular) باشن و با شناسه یکتاشون (unique id) جایگزین بشن:

فرض کن میخوای اطلاعات یه بازیکن خاص رو نمایش بدی، بجای استفاده از players/Ronaldo بهتره از شناسه عددی یا کد اون بازیکن استفاده کنی، مثلا players/12345.
 soccer.api.org/teams/dortmond/players/58c1aaae-205a-11ef-aeea-a64c74618950

۳. اسلش ته آدرس رو حذف کنید:

 soccer.api.org/teams/dortmond/players
soccer.api.org/teams/dortmond/players/


۴. برای بهتر خونده شدن، از خط تیره (-) به جای زیرخط (_) استفاده کنید:
 api.blog.com/blogs/this-is-my-blog
api.blog.com/blogs/this_is_my_blog


۵. تو مسیرهای URI از حروف کوچک استفاده کنید:

 api.example.com/my-api/my-resource
api.example.com/My-Api/My-Resource


۶. تو URI ها از پسوند فایل استفاده نکنید:

 api.example.com/api/resource
api.example.com/api/resource.json



۷
. از اسم فانکشن های CRUD تو URI استفاده نکنید:

برای عملیات ایجاد، خواندن، بروزرسانی و حذف منابع، از اسم هایی مثل create, read, update, delete تو URI استفاده نکن. بجاش از Http Method های استاندارد استفاده کن.
DELETE api.example.com/api/resource
GET api.example.com/api.resource/delete


 GET /users
GET /getUsers

۸. بخش کوئری (query) تو URI فقط برای منابع Collection قابل استفاده است:

 GET /users?role=admin
GET /users/admin


۹. از بخش کوئری برای اسکرول (paging) کردن نتایج منابع مجموعه استفاده کنید:

 GET /users?pageSize=25&pageStartIndex=50


نسخه بندی API (Versioning)

نسخه بندی API برای موارد زیر اهمیت داره:

حفظ سازگاری قبلی (Maintaining backward compatibility)

تضمین یک API سازگار و با طراحی خوب: استفاده از نام‌گذاری‌های یکسان تو همه نسخه‌ها به یه تجربه کاربری خوب کمک میکنه. تغییر endpoint این تجربه رو بهم میریزه و نسخه بندی به جلوگیری از این موضوع کمک میکنه.

چند استراتزی برای نسخه بندی API:

URI Versioning (پیشنهادی):

 GET /api/v1/users
GET /api/v2/users



Header Versioning:

GET /api/users
Headers: { "X-API-Version": "1" }

GET /api/users
Headers: { "X-API-Version": "2" }



🆔 @MdDaily
👍6🔥31
توی گیت هاب CSS injection پیدا کردن :)

🔗 لینک توییت


برای تستش این پروفایل و ریپو های گیت هاب رو ببیند:

https://github.com/yacineMTB
https://github.com/vmfunc/vmfunc
https://github.com/RambIing

آپدیت: فعلا باگش فیکس شده ولی توی کامنت توییت اسکرین شات هاشون هست :)


🆔 @MdDaily
😁7
داشتم توی ریپو های اپن سورس گوگل میگشتم که رسیدم به پروژه Mesop با شعار به سرعت برنامه های وب جذاب با پایتون بسازید

باهاش میتونید با استفاده از پایتون و کمترین میزان کد نویسی وپ اب بسازید و برای اپ های internal و دمو خیلی باحاله.

ویژگی هاش:

👈 پشتیبانی از Hot reload
👈 بدون نیاز به Javanoscript/CSS/HTML میتونید ui های کاستوم بسازید
👈 یادگیری آسون
👈 کامپوننت های آماده
👈 و ..

دموها:
🔗 https://google.github.io/mesop/demo/

وبسایت:
🔗 https://google.github.io/mesop/

گیت هاب:
🔗 https://github.com/google/mesop


🆔 @MdDaily
👍4🔥2
Md Daily
توی گیت هاب CSS injection پیدا کردن :) 🔗 لینک توییت برای تستش این پروفایل و ریپو های گیت هاب رو ببیند: https://github.com/yacineMTB https://github.com/vmfunc/vmfunc https://github.com/RambIing آپدیت: فعلا باگش فیکس شده ولی توی کامنت توییت اسکرین شات…
رایت آپ CSS injection گیت هاب هم منشتر شد

دقیقا چه اتفاقی افتاده بود؟

توی MathJax که گیت هاب ازش برای رندر عبارات ریاضی توی محتوای markdown استفاده میکرده یه گزارش باگ داده میشه که توی یکی از latex macros ها به اسم \unicode که اجازه میداده unicode کارکتر رندر بشه و این امکان را میداده که فونت و استایل کارکتر ها کاستوم بشن یه مشکلی وجود داشته.

درحالت نرمال انتظار میره که با همچین فرمتی استفاده بشه:
\unicode[myfont](x0000)


ولی این امکان وجود داشته که بین brackets ها هرچیزی وارد و رندر بشه و در نتیجه css injection به وجود بیاد :)

\unicode[myfont; color: red; position: fixed; top: 0](x0000)


خلاصش اینکه هرچیزی که بین brackets ها نوشته میشده مستقیم توی style گیت هاب هم رندر میشده و به به کاربرا اجازه میداده که استایل کل صفحه رو عوض کنند.

مشکل کد mathjax این بوده که نمیتونسته درست valid و sanitize کنه.


اگه دوس داشتید جزئیات بیشتری ازش بخونید. لینک رایت آپ:
🔗 https://kennethnym.com/blog/mathjax-css-injection/

🆔 @MdDaily
👍4🔥1👏1
چند عادت خوب برنامه نویسی

ما با الگوها و عادت‌هایی که هر روز انجام میدیم زندگی می‌کنیم که این عادات بر نتایج اهداف ما تأثیر میذارن. پس اگه قرار زندگیمون رو تغییر بدیم، اولین کاری که باید انجام بدیم تغییر عادت هاست.


1- پیش‌قدم (Proactive) بودن

دو نوع دایره‌ توی زندگی ما وجود داره یه دایره‌ی نگرانی (Concern) که شامل چیزاییه که خارج از کنترل ما هستن و یه دایره‌ی کوچیک‌تر هم دایره‌ی نفوذ (Influence) هست که چیزایی رو شامل میشه که می‌تونیم کنترلشون کنیم.

🖼 تصویر

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

2- از آخر به اول شروع کردن

اگه هدفی ندارید، پس تنها چیزی که می‌مونه امیدواریه، که اونم تو هیچ شرایطی استراتژی خوبی نیست. به عبارت دیگه، تو هر کاری، از جمله شروع یه پروژه، باید معیارهای واضحی از موفقیت و یه نقشه برای رسیدن بهشون رو مشخص کرد. باور کنید یا نه، من خودم تجربه کردم که ۳۰ دقیقه وقت گذاشتن برای برنامه‌ریزی دقیق، می‌تونه بیشتر از ۱۰ ساعت کدنویسی رو واستون صرفه‌جویی کنه. البته اینم آسون نیست، چون هر برنامه‌ای می‌تونه به هم بریزه. ولی بازم خیلی بهتر از اینه که اصلاً هیچ برنامه‌ریزی‌ای نداشته باشیم.

3- کارهای مهم رو اول انجام دادن

قبلا توی پست مدیریت زمان و راندمان (برای برنامه‌نویس‌ها) راجب برنامه ریزی و مدیریت زمان حرف زدم و ماتریس آیزنهاور رو معرفی کردم اما به صورت خلاصه اولویت بندی کنید و به همه کار ها برسید، به جای اینکه فقط به کارهای فوری برسید.

۴. طرز فکر برد-برد

یعنی اینکه باور داشته باشیم منابع و فرصت‌های کافی برای موفقیت همه وجود داره. ما با آدمای بخش های دیگه کار می‌کنیم. خیلی مهمه که بتونیم از اهداف شخصی شغلی بالاتر بریم و برای تیم، طرز فکر برد-برد داشته باشیم. نه اینکه فقط خودمون با باخت بقیه، برنده بشیم، یا اینکه تسلیم بقیه بشیم تا اونا برنده بشن، یا حتی اینکه بقیه رو بازنده کنیم چون خودمونم می‌بازیم. عادت کردن به اینکه همیشه به بردنِ چند طرف فکر کنیم، باعث می‌شه همیشه تلاش کنیم به بهترین نتیجه برسیم. این موضوع روی روابط‌مون با بقیه تو بلندمدت هم خیلی تأثیر می‌ذاره.

5- اول سعی کن بفهمی، بعد فهمیده بشی

برای اینکه بقیه ما رو درک کنن، اولین کاری که لازمه انجام بدیم اینه که اول بقیه رو درک کنیم. علاوه بر ارتباط زبانی، برنامه‌نویس‌های مؤثر، اهمیتِ «همدردی» رو تو کدزنی می‌فهمن. اونا اولویت‌شون اینه که کدشون رو واضح بنویسن تا بقیه، از جمله خودشون تو آینده، بتونن به راحتی درکش کنن و نگهش دارن.به جز مهندس‌های دیگه، برنامه‌نویس‌ها از طریق محصولاتشون با کاربر نهایی هم ارتباط برقرار می‌کنن. برنامه‌نویس‌های مؤثر اولویت‌شون تجربه کاربریه، به این شکل که خودشون رو جای کاربر نهایی می‌ذارن. اونا نیازهای کاربر رو پیش‌بینی می‌کنن، رابط‌های کاربری‌ای طراحی می‌کنن که اون نیازها رو برطرف می‌کنه، و پیام‌های خطایی می‌سازن که کاربر رو راهنمایی کنه، نه اینکه گیجش کنه.

6- تیز کردن اره (Sharpen the Saw)

برای اینکه این عادت رو بفهمیم، بیایم تصور کنیم دو تا کارگر هستن که دارن چوب خرد می‌کنن. کارگر اول یه جوون بوده که کل ۸ ساعت کاری رو بدون توقف به چوب خرد کردن ادامه داده. کارگر دوم یه آدم مسن‌تر بوده که هر ساعت به یه استراحت ۱۰ دقیقه‌ای نیاز داشته، تو این بینم وقت می‌ذاشته تا ارّه‌شو تیز کنه. اگه فکر می‌کنین که پیرمرد چوب بیشتری خرد می‌کنه، پس این عادت رو فهمیدین.به عنوان یه برنامه‌نویس، با خیلی از تکنولوژی‌های جدید روبرو می‌شی. برنامه‌نویس‌های مؤثر، اهمیتِ «یادگیری مداوم» رو درک می‌کنن. تیز کردن اره شامل اینه که برای به دست آوردن مهارت‌های جدید، به‌روز موندن تو روندهای صنعت و کاوش تو تکنولوژی‌های جدید، زمان سرمایه‌گذاری کنید. برنامه‌نویس‌های مؤثر باید با تمرین کردن، شرکت تو کنفرانس‌ها، شرکت تو انجمن‌های برنامه‌نویسی و غیره، برای توسعه‌ی حرفه‌ای‌شون وقت بذارن. این عادت می‌تونه به ما تو وفق پیدا کردن با پیشرفت‌های تکنولوژی کمک کنه.

منابع:
franklincovey
The 7 Habits of Highly Effective People
7 Habits that Programmers Must Have!


🆔 @MdDaily
👍6❤‍🔥4🔥1
مدتیه دارم روی یک اپلیکیشن کار میکنم که از زمان انتشار اولین نسخه ی mvp و گرفتن فیدبک ها تا الان تقریبا بیشتر 1 سال گذشته و حالا که داریم آماده میشیم برای اولین نسخه ی نهایی و انتشار عمومی، به نظرم خیلی فان میشه که تجربه ی این مدتم از شروع ایده که استارتش با ایده ی رادیو سید مهدی عزیز بود و چالش هایی که باهاش روبه رو بودیم تا مصاحبه هایی که با مدیران کسبوکار و استارتاپ های مختلف داشتم و حتی تکنولوژی هایی که استفاده شدن و سیستم دیزاین رو باهاتون به اشتراک بذارم و امیدوارم که کمک کننده باشه :)

پ ن ۱ :
به زودی یک پادکست هم ازش منتشر میکنیم

پ ن ۲:
پست های مربوطه با هشتگ #تجربه منتشر میشن

🆔 @MdDaily
🔥113❤‍🔥2👍2👎1
#تجربه

شروع یک ایده از نیاز

چیزی بسازید که صد نفر عاشق آن باشند نه اینکه یک میلیون نفر آن را تا حدودی دوست داشته باشند.
- Brian Chesky


تقریبا اواخر سال 2022 بود که سید مهدی عزیز ایده ی رادیو رو پیاده سازی کرد. چیزی که من راجب این کار خیلی دوس داشتم این بود که همه چیز در ساده ترین حالت ممکن بود. بجای ساخت یک محصول کامل ما پلتفرمی را داشتیم که کار اصلیش یعنی بخش موزیک رو انجام می داد. زیر ساخت این پروژه تشکیل شده بود از یه سرور که روش Icecast پیاده سازی شده بود و یک فرانت که از این سرور Icecast لیست ژانر ها را می گرفت. Icecast به این صورت عمل میکنه که شما مثلا چنتا پوشه به اسم های pop , rap , hipop دارید و با استفاده از LIQUIDSOAP که یک زبان برای استریم Audio و Video هست میتونید برنامه نویسیش کنید. یک نمونه کد LIQUIDSOAP:

# Create a playlist containing all the files in the folder
pop = playlist("/music/pop/playlist.m3u")

output.icecast(
%mp3,
host="icecast2",
port=8000,
mount="pop",
password="1234",
fallible=true,
url="http://127.0.0.1:15210/pop",
encoding = "UTF-8",
name="Pop",
genre="pop",
pop
)


در نهایت کاربر میتونست با وارد شدن به لینک http://127.0.0.1:15210/pop به استریم موزیک های ژانر pop گوش کنه. یه ایده ی فان و کاربردی بود.

شروع سال 2023:
به مهدی پیشنهاد دادم یک نسخه ی مستقل از رادیو رو در قالب اپ بسازم. خیلی خلاصه بخوام بگم یعنی بخش اپلیکیشن دیگه با اسم و زیر مجموعه رادیو فعالیت نکنه و با یک اسم جدید و یک اپلیکیشن مستقل با ویژگی ها و امکانات اضافه تر توسعه پیدا کنه ولی همچنان از زیر ساخت رادیو استفاده کنه.

یه متدی داریم به اسم Design thinking یا به اختصار DT . خیلی ساده بخوام بگم این متد تشکیل شده از 5 مرحلس.

👈 مرحله ی اول همدلی یا درک نیازهای انسان (Empathize): توی این مرحله باید فرضیه های پیش فرضو کنار گذاشت و واقعا دید چه مشکلی وجود داره و یه جورایی با جمع آوری داده ها بتونیم با بقیه همزاد پنداری کنیم.

👈 مرحله ی دوم تعریف مسئله (Define): توی این مرحله مشکل رو به شکلی واضح و روشن باید بیان کرد، جوری که همه بتونن درکش کنن.

👈 مرحله ی سوم ایده پردازی (Ideate): توی این مرحله افراد بدون قضاوت ایده هاشون رو میگن و تمرکز روی تعداد ایده هاست نه کیفیتشون.

👈 مرحله ی چهارم نمونه‌سازی اولیه (Prototype): توی این مرحله باید با ساخت نمونه های اولیه دید که ایده ها توی دنیای واقعی چطوری عمل میکنن

👈 مرحله ی پنجم تست (Test): در واقع نتیجه‌گیری از این مرحله به شما اجازه میده تا مراحل قبلی رو بررسی کنید که داده های بدست اومده درست بودند یا نه.

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

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

اگه دوس داشتید بیشتر راجب DT بدونید این مقاله رو بخونید:

🔗 The 5 Stages in the Design Thinking Process


این بود خلاصه ای از مرحله ی شروع ایده و ادامه دارد...

🆔 @MdDaily
🔥9👍3👏2
Md Daily
#تجربه شروع یک ایده از نیاز چیزی بسازید که صد نفر عاشق آن باشند نه اینکه یک میلیون نفر آن را تا حدودی دوست داشته باشند. - Brian Chesky تقریبا اواخر سال 2022 بود که سید مهدی عزیز ایده ی رادیو رو پیاده سازی کرد. چیزی که من راجب این کار خیلی دوس داشتم…
#تجربه

از فیدبک کاربران تا اولین MVP

مفهوم MVP یا Minimum Viable Product به معنای حداقل محصول قابل ارائه هست.

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

لینک های مفید:

https://amplitude.com/blog/what-is-a-minimum-viable-product-mvp

https://www.productplan.com/glossary/minimum-viable-product/



بعد از اینکه فیدبک کاربران رو گرفتیم متوجه شدیم که اینکه هربار لینک رادیو از سایت کپی کنند و توی مثلا VLC وارد کنند یا از پلیر وب گوش بدند، خیلی دسترسی پذیر نیست و دوست دارن که از روی نوتیفیکشن دستگاه هم بتونند موزیک ها را کنترل کنند و قطعی نداشته باشن.

خب کاری که من کردم این بود که چندین UI اپلیکیشن را برای کاربران هدف فرستادم، نظراتشون رو پرسیدم و در نهایت ما یک خروجی اولیه روی کاغذ داشتیم از اینکه کاربران چی دوست دارن.

قبل از اینکه کار را شروع کنیم چنتا قانون گذاشتیم:

1- همه چیز را در فرایند توسعه ساده نگه داریم
2- دچار چرخه ی توسعه ی بی پایان نشیم
3- تو هر مرحله فیدبک بگیریم

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

برای رفع این مشکل من اومدم توی Todoist ( اینجا Todoist رو مثال زدم چون مدت زمان زیادی هست ازش استفاده میکنم ولی شما از هر ابزار project management ای مثل ClickUp که باهاش راحت هستید میتونید استفاده کنید ) توی پروژه 5 تا بخش تعریف کردم:

👉 Next Version:

تسک ایده ها و اینکه در نسخه های آینده چیکار کنیم توی این بخش قرار گرفتن. بعد از انتشار هر نسخه نهایی بخشی از تسک های این بخش بر اساس اولویت و نیاز کاربر انتخاب و به Up next منتقل میشن

👉 Up next:

تسک های نسخه ی فعلی

👉 In progress:

تسک های درحال انجام

👉 In review:

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

👉 Done:

تسک های انجام شده

و با این تقسیم بندی ساده موفق شدیم که گرفتار چرخه ی بی پایان توسعه نشیم و در نهایت اولین MVP ما ساخته شد.

به نظرم یکی از جالب ترین تجربه ها از اهمیت MVP مربوط به محصول DropBox هست که درو هوستون در سال 2008 یه ویدیو ساخت که نشون می‌داد دراپ‌باکس چیکار می‌کنه. این ویدیو خیلی ساده بود، فقط نشون می‌داد که چطور میشه فایل‌ها رو بین کامپیوترها همگام‌سازی کرد. ولی همین ویدیو ساده کلی سروصدا کرد!

خیلی‌ها با دیدن این ویدیو و عاشق دراپ‌باکس شدن. تعداد آدم‌هایی که می‌خواستن از دراپ‌باکس استفاده کنن و توی لیست انتظار ثبت نام کرده بودن از ۵۰۰۰ نفر به ۷۵۰۰۰ نفر رسید! این نشون می‌داد که مردم عاشق ایده‌ی دراپ‌باکس بودن.

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

لینک مقاله How DropBox Started As A Minimal Viable Product:

🔗 https://techcrunch.com/2011/10/19/dropbox-minimal-viable-product/

🔗 https://www.linkedin.com/pulse/how-did-dropbox-do-tech-behind-mvp-triumph-indpro-ab/

🆔 @MdDaily
❤‍🔥4🔥21👏1
👍5❤‍🔥11
Md Daily
Photo
#تجربه

دستان پشت پرده: زیر ساخت ما چطوری کار میکنه؟

برای نوشتن و توضیح سیستم دیزاین زیرساخت خیلی فکر کردم که چطوری توضیح بدم، پس تصمیم گرفتم بکشمش و طبق تصویر قدم به قدم بریم جلو :)

توی بخش کلاینت و اپلیکیشن، از Flutter استفاده شده. وقتی کاربر از اپلیکیشن استفاده میکنه خب یه سری از کار های روتین اتفاق میوفته مثل گرفتن لیست پلی لیستا یا نحوه ی نمایش آیتم ها در صفحه ی خانه که توی این بخش کلاینت به بکند رکوئست میزنه و بعد بکند اپلیکیشن هم که با استفاده از Golang و فریمورک Gofiber با معماری Clean Architecture نوشته شده، اول سعی میکنه ریسپانس را از کش (Redis) بده و اگه کش رو پیدا نکرد با استفاده از ORM که برای این پروژه از Gorm استفاده شده از دیتابیس MySql میگیره و به اپلیکیشن جواب میده.

🔗 Go Fiber Clean Architecture

اما زمانی فرایند ها جالب میشن که کاربر میخواد ژانری رو پخش کنه. تو مرحله ی اول کلاینت به بکند خودش درخواست میزنه که مثلا من میخوام ژانر pop را پخش کنم. بکند اپلیکیشن به بکند Stream که اونم هم با استفاده از Golang و Gofiber نوشته شده درخواست میزنه. بهش میگه کاربر میخواد ژانر pop رو پخش کنه میشه بهم متا دیتا هاش رو بدی؟

نمونه اندپوینت:
api/v1/{genre}/meta


سعی شده در نوشتن api ها best practice هایی که توی این پست هم راجبشون نوشتم رعایت بشه.

بعد بکند استریم میگه بذار اول از ice cast بپرسم ببینم چیا درحال پخش هستند ولی قبل از اینکه بره به آیس کست درخواست بزنه میره کشش رو چک میکنه چون که درخواست های تکراری زیاد هستند و تا زمان عوض شدن موزیک داده های قبلی توی ردیس کش باقی موندن. بکند استریم یه جیسون از اطلاعاتی مثل: اسم موزیک درحال پخش، آلبوم، نام خواننده و حتی کاور موزیک اماده میکنه و میده به بکند اپلیکیشن.
اطلاعتی مثل آلبوم و نام خواننده از icecast قابل دریافت هستند ولی کاور موزیک و متادیتا های خاص را باید حتما بره از روی فایل بخونه.

حالا بکند اپلیکیشن داده ها را برمیگردونه سمت اپ و اپلیکیشن توی پلیر خودش نشون میده. اما اینجا یه اتفاق بامزه میوفته، برای کاهش IO و افزایش پرفورمنس تو حجم تعداد کاربر بالا پلیر رادیویی که برای اپلیکیشن نوشته شده وقتی وصل شد به ادرس استریم موزیک مثلا:

http://127.0.0.1:15210/pop

و متا دیتا های اولیه رو هم گرفت، دیگه به بکند درخواست نمیزنه، بلکه اطلاعات موزد نیاز رو از خود موزیک درحال پخش میگیره و برای گرفتن کاور موزیک هم یک scraping کوچیک نوشتیم که میره از iTunes استخراج میکنه و برای بخش لیریکس هم از سرویس genius استفاده شده. حالا اگه به هر دلیلی سرویس genius قطع شد یا نت ملی شد یا iTunes فیلتر شد، اپ به مشکل نمیخوره و اتوماتیک دوباره برای گرفتن اطلاعات به بکند وصل میشه.

به طور کلی برای بهبود سرعت پاسخگویی:

1- از ردیس براش کشینگ استفاده کردیم
2- بکند ها به صورت concurrency پیاده سازی شدن و روی چند ترد اجرا میشن.
3- خود اپلیکیشن هم سیستم کشینگ داخلی داره و از دیتابیس Isar استفاده میکنه

پی نوشت:
موقع ساخت MVP و اینکه تست کنیم ببینیم میشه یا نه کل این ساختار در ساده ترین شکل ممکن پیاده سازی شد، ما یک بکند پایتون داشتیم که متا دیتا ها را بر میگردوند و از دیتابیس و سیستم کشینگ هم خبری نبود، اپلیکیشن مستقیم وصل میشد به Icecast و پلی لیست ها را نشون میداد. بکند اولیمون که با پایتون بود توی دو روز نوشته شده بود و بعد از اینکه تست هامون رو گرفتیم و سیستم دیزاینمون تکمیل شد زیر ساخت جدید که توی تصویر مشخصه توی حدودا 3 هفته آماده شد و خیلی بهبود پیدا کرد.



🆔 @MdDaily
👍10❤‍🔥21🔥1
چطوری توی SQL کوئری های پیچیده را ساده کنیم؟

یه قابلیت تو SQL هست که می‌تونه کوئری‌هاتون رو خیلی ساده‌تر کنه و سرعتشون رو هم بالا ببره.

فرض کنید یه کوئری داریم که تعداد کتاب‌های فروخته شده توسط هر نویسنده رو نشون میده:

SELECT
a.author_name,
COUNT(ol.line_id) AS book_count
FROM order_line ol
INNER JOIN book b ON ol.book_id = b.book_id
INNER JOIN book_author ba ON b.book_id = ba.book_id
INNER JOIN author a ON ba.author_id = a.author_id
GROUP BY a.author_name
HAVING COUNT(ol.line_id) > 1;


خب این کوئری بدون مشکل اجرا میشه و نویسنده هایی که بیشتر از یک کتاب فروختند رو نشون میده. حالا اگه قرار باشه ببینیم کدوم نویسنده ها بیشتر از 5 تا کتاب فروختن چی؟

SELECT
a.author_name,
COUNT(ol.line_id) AS book_count
FROM order_line ol
INNER JOIN book b ON ol.book_id = b.book_id
INNER JOIN book_author ba ON b.book_id = ba.book_id
INNER JOIN author a ON ba.author_id = a.author_id
GROUP BY a.author_name
HAVING COUNT(ol.line_id) > 5;


تقریبا با یه تفاوت کوچیک تو قسمت آخر مثله کوئری قبلیه. توی این کوئری پیچیدگی وجود داره و دیتابیس توی هر بار اجرا باید عملیات های مختلفی انجام میده.

یکی از راه حل ها استفاده از یک temporary table یا به اختصار temp table هست. این جدول یه جور حافظه موقتیه که میتونید توش یه سری اطلاعات رو ذخیره کنید، ولی فقط تا زمانی که سشن توی پایگاه داده بازه وجود داره و بعدش پاک میشه.

فرض کنید یه سری اطلاعات پیچیده دارید که باید چند بار باهاشون کار کنید. با استفاده از یه جدول موقتی میتونید این اطلاعات رو یه بار توی جدول بریزید و بعد هر بار که بهشون نیاز دارید به جای اینکه دوباره محاسبات رو انجام بدید، از همین جدول موقتی استفاده کنید.

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

میخوایم یه جدول موقتی تو Postgres بسازیم تا تعداد کتاب‌های فروخته شده توسط هر نویسنده مثال رو توش ذخیره کنیم. دستورات ساخت جدول تو هر پایگاه داده یه کمی با هم فرق دارن، ولی مفهوم کلی یکیه.

تو Postgres، دستور ساخت یه جدول موقتی تقریبا شبیه به دستور ساخت یه جدول عادیه، کافیه بعد از کلمه Create و قبل از کلمه Table کلمه Temporary رو اضافه کنید:

CREATE TEMPORARY TABLE author_books_sold (
author_name VARCHAR(400),
book_count INT
);


بعد از اجرای این SQL وقتشه که داده هامون رو بریزیم تو این جدول موقت:

INSERT INTO author_books_sold (author_name, book_count)
SELECT
a.author_name,
COUNT(ol.line_id) AS book_count
FROM order_line ol
INNER JOIN book b ON ol.book_id = b.book_id
INNER JOIN book_author ba ON b.book_id = ba.book_id
INNER JOIN author a ON ba.author_id = a.author_id
GROUP BY a.author_name;


حالا از این به بعد با یه دستور SELECT ساده میشه به نویسنده هایی که بیشتر از n تا کتاب دارند دسترسی پیدا کرد چون محاسبه نویسنده‌ها و کتاب‌های فروخته شده قبلا انجام شده، و داده تو جدول موقت ذخیره شده:

SELECT author_name, book_count
FROM author_books_sold
WHERE book_count > 1;


SELECT author_name, book_count
FROM author_books_sold
WHERE book_count > 5;


استفاده از جداول موقت یه تکنیک خیلی مفیده.

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

🔗 Simplify Complex SQL With This Feature


🆔 @MdDaily
❤‍🔥5👍3🔥2
کامیت خوب یا بد : چند Best Practice برای Git

تو دنیای برنامه‌نویسی، یه چیزی هست که همه توسعه‌دهنده‌ها بهش نیاز دارن: یه سیستم برای ردیابی تغییرات کدشون! یکی از بهترین این سیستم‌ها، Git هست. با Git می‌تونی تغییرات کدت رو دنبال کنی، به نسخه‌های قبلی برگردی و با بقیه اعضای تیمت راحت‌تر کار کنی.

توی این پست بررسی می کنیم که یه کامیت خوب چه ویژگی‌هایی داره و یه کامیت بد چه مشکلاتی ایجاد می‌کنه. با این کار، تاریخچه تغییرات کدت مرتب و قابل فهم میشه.

کامیت یعنی چی؟

در Git، یک کامیت به وضعیت کد شما در یک نقطه زمانی خاص اشاره داره. هر کامیت یه اطلاعاتی داره مثل اینکه چه کسی این تغییر رو ایجاد کرده، چه زمانی این کار رو انجام داده و چه تغییراتی اعمال شده. با کامیت‌ها می‌تونی به راحتی به نسخه‌های قبلی کدت برگردی و تغییرات رو بررسی کنی.

ویژگی‌های یک کامیت خوب

اتمی و متمرکز:

یک کامیت باید اتمی باشه - یعنی فقط یک تغییر منطقی رو شامل بشه. چند تغییر مستقل رو تو یک کامیت ترکیب نکن.
مثال:

# Good commit
git commit -m "Add user authentication"
# Bad commit
git commit -m "Add user authentication and update UI styles"


پیام کامیت توصیفی:

پیام کامیت باید به وضوح توضیح بده که کامیت چه کاری انجام می‌ده و چرا این تغییر ایجاد شده. این پیام باید اطلاعات کافی رو در اختیار دیگران (و خود آینده‌ات) بذاره تا بتونن بدون خوندن کد، تغییر رو درک کنن.
مثال:

# Good commit message
git commit -m "Fix Correct null pointer exception in user login"
# Bad commit message
git commit -m "Fix bug"


رعایت استانداردهای کامیت:

میتونی از استانداردهای کامیت استفاده کنی تا تاریخچه گیتت تمیز، منظم و قابل خوندن تر باشه. معمولا این استانداردها شامل نوع تغییر (مثلا ویژگی جدید، رفع باگ، تغییر ساختار، مستندسازی) یا همون (feat, fix, chore, refactor, docs)، خلاصه کوتاه و گاهی توضیح طولانی یا اشاره به مشکلات مرتبط می‌شه.
مثال:

# Good commit message following conventional guidelines
git commit -m "feat(auth): add JWT-based authentication"
git commit -m "fix(login): resolve race condition in login flow"


میتونید از ایموجی هم استفاده کنید که لیست ایموجی هاش توی این gist و یا سایت gitmoji.dev پیدا میشن :)


تست شده و تأیید شده:

مطمئن شو که تغییرات توی کامیتت تست شده و درست کار می‌کنه. کد خراب یا تست نشده می‌تونه روند کار رو مختل کنه و بقیه رو اذیت کنه.

محدوده مناسب:

کامیت‌هات رو درست محدوده بندی کن. مثلاً اگه داری روی یه قابلیت خاص کار می‌کنی یا یه باگ رو درست می‌کنی، مطمئن شو که همه تغییرات مربوط به اون کار تو یه کامیت قرار گرفتن. از تغییرات ناقصی که ممکنه کد رو تو وضعیت ناپایداری بذاره، خودداری کن.
مثال:
# Good commit with proper scope
git commit -m "refactor(auth): split auth logic into separate module"
# Bad commit with mixed scope
git commit -m "refactor and minor fixes"



ویژگی‌های یک کامیت بد

بزرگ و بدون تمرکز:


کامیت با تغییرات خیلی زیاد، یه کامیت بده. فهمیدن اینکه کامیت چه کاری انجام می‌ده رو سخت می‌کنه. کامیت‌های بزرگ و بدون تمرکز، بررسی و دیباگ کردن رو چالش برانگیز می‌کنن.
مثال:

# Bad commit
git commit -m "Update project"


پیام‌های مبهم یا گمراه‌کننده:


پیام‌های کامیت که مبهم یا گمراه‌کننده هستن، اطلاعات مفیدی درباره تغییرات ارائه نمی‌دن. این کمبود جزئیات می‌تونه باعث سردرگمی بشه و ردیابی تاریخچه تغییرات رو سخت کنه.
مثال:

# Bad commit message
git commit -m "Stuff"


تغییرات بی‌ربط:

ترکیب تغییرات بی‌ربط توی یه کامیت، جداسازی تغییرات خاص رو سخت می‌کنه و ممکنه باعث ایجاد باگ و پیچیده شدن روند بررسی بشه.
مثال:

# Bad commit
git commit -m "Update readme and fix login issue"


کد ناقص یا تست نشده:

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

در نهایت بین کامیت کردن خیلی زیاد و خیلی کم تعادل برقرار کن. هر کامیت باید یه تغییر معنی‌دار رو نشون بده. هیچ وقت تغییرات بی‌ربط رو تو یه کامیت قرار نده و پیام‌های کامیتت باید توضیح بدن که کامیت چه کاری انجام می‌ده و چرا این تغییر رو ایجاد کردی.

〰️〰️〰️

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

🆔 @MdDaily
❤‍🔥7👍311
🕸 شبکه‌سازی: یه کار فان

شبکه‌سازی خیلی مهمه اگه می‌خوای تو کارت پیشرفت کنی.
می‌گن مهم‌ترین چیزی که از رفتن به دانشگاه‌های خوب گیرت میاد، درس نیست بلکه دوستاییه که پیدا می‌کنی. و راستش رو بخوای، حق باهاشونه‌

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

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

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

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


یه توصیه واقعی برای شبکه‌سازی

پس چطور آدم باید «خوب شبکه‌سازی کنه»؟

کنجکاو باش!

کنجکاوی یه نیروی فوق‌العاده‌ایه که باعث میشه آدم رشد کنه.
درباره بقیه کنجکاو باش. آدم‌ها خیلی باحالن، هر کدوم یه دنیایین! کلی چیز هست که بشه از آدم‌ها یاد گرفت، کلی آدم هست که بشه باهاشون آشنا شد.
وقتی به بقیه اهمیت می‌دی، انگار که دانایی و تجربه‌های اونا رو به خودت اضافه می‌کنی. دیدگاه‌های مختلف آدم رو قوی‌تر می‌کنه.
این یعنی داری یه شبکه از دوست و آشنا درست می‌کنی، داری با آدمای بیشتری آشنا می‌شی.
یه نکته جالب اینه که همیشه کشورهایی که با بقیه ارتباط کمتری دارن، رشد اقتصادی‌شون هم کمتره. این نشون می‌ده که ارتباط با آدمای دیگه چقدر مهمه.

برای فرصتا دستت رو باز بذار

خب حالا که تورمونو انداختیم تو آب، یه عالمه ماهی توش گیر میاد. دیگه فقط کافیه دست به ماهی ببریم و درشون بیاریم.
آسون که میگم، بعضی ماهی‌ها یه جوری سُر می‌خورن که نمی‌شه راحت گرفتشون. بعضی وقتا فرصت‌ها یه ریسک کوچولو هم با خودشون می‌آرن. هر موقعیتی یه شکل خودشه و نمی‌شه یه قانون کلی براش گفت، ولی به نظرم اگه آدم یه کم جسورتر باشه، خیلی بیشتر می‌تونه به دست بیاره.

مهربون باش

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

بخشنده باش

من بی نهایت سپاس گذار افرادی هستم که به من کمک کردن تا به اینجا برسم

اما چرخ روزگار می چرخه. همانطور که بقیه به من کمک کردن، من هم به دیگران کمک کردم. کمک به بقیه باعث بهتر شدن شغل من شد.
من بخشی از وقت آزادم را داوطلبانه صرف راهنمایی افرادی می کنم چون احساس می کنم روزی این تور ممکن است ماهی بگیره.
زندگی یک بازی با حاصل جمع صفر نیست. وقتی به کسی کمک می کنید به خودتون هم کمک کردید.

خب، اگه درون‌گرا باشی چی؟

یه حرف آخر به اونایی که زیاد اهل بیرون رفتن و ارتباط گرفتن نیستن. اینجور آدما که با بقیه حرف زدن انرژی‌شونو می‌گیره، منم همینم. با یکی حرف بزنم انگار یه ماراتن دویدم!
ولی خب، ورزش کردنم همینطوره. با این حال، آدم با تمرین می‌تونه ماراتن هم بدوه.

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


خلاصه کلام:
شبکه‌سازی یعنی فقط قهوه خوردن توی یه جمع تکنولوژی و گرفتن چنتا شماره نیست.
بیشتر از هر چیزی یعنی ارتباط با آدمای دیگه.
این کارو برای کارت نمی‌کنی، برای اینکه آدمایی که دوست دارن با هم ارتباط بگیرن.
پس برو بیرون و با بقیه آشنا شو و دنبال کارای مشترک بگرد. کی می‌دونه، شاید یه همکاری خوب شروع بشه :)


🆔 @MdDaily
❤‍🔥17👍6😁1
سلام سلام!
به خاطر یه سری ددلاین ها و شرایطی که بوجود اومد حدودا یک ماهی نتونستم تو کانال فعالیتی داشته باشم و ممنونم از همگی که تا اینجا همراه من بودید 🫶🏻

بریم که فعالیت رو با انرژی شروع کنیم :)
12👍3🔥2👎1