Gopher Academy
3.34K subscribers
920 photos
40 videos
280 files
2.02K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
🔻لیستی از مکانیزم های قفل برای جلوگیری از دسترسی همزمان دادها و ناسازگاری داده ها🔻

🎯1. Shared Lock (S Lock)
It allows multiple transactions to read a resource simultaneously but not modify it. Other transactions can also acquire a shared lock on the same resource.

🎯2. Exclusive Lock (X Lock)
It allows a transaction to both read and modify a resource. No other transaction can acquire any type of lock on the same resource while an exclusive lock is held.

🎯3. Update Lock (U Lock)
It is used to prevent a deadlock scenario when a transaction intends to update a resource.

🎯4. Schema Lock
It is used to protect the structure of database objects.

🎯5. Bulk Update Lock (BU Lock)
It is used during bulk insert operations to improve performance by reducing the number of locks required.

🎯6. Key-Range Lock
It is used in indexed data to prevent phantom reads (inserting new rows into a range that a transaction has already read).

🎯7. Row-Level Lock
It locks a specific row in a table, allowing other rows to be accessed concurrently.

🎯8. Page-Level Lock
It locks a specific page (a fixed-size block of data) in the database.

🎯9. Table-Level Lock
It locks an entire table. This is simple to implement but can reduce concurrency significantly.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍41
Massimo Dev

میدونستید #ایندکس ترکیبی یا Composite Index تو #دیتابیس چی هست؟ یه سوالیه که معمولا تو #مصاحبه های #استخدام #برنامه_نویسی می‌پرسن!

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

👈 مثال از ایندکس ترکیبی

فرض کن یه جدول به اسم employees داریم که این ستون‌ها رو داره:

- employee_id
- first_name
- last_name
- department
- hire_date

اگه بخوایم جستجوهایی که بر اساس department و hire_date هستن سریع‌تر بشن، میایم و یه ایندکس ترکیبی روی این دوتا ستون درست می‌کنیم:

CREATE INDEX idx_department_hire_date ON employees(department, hire_date);


👈 ترتیب ستون‌ها توی ایندکس ترکیبی:

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

🍒 مثال‌هایی از کوئری‌ها

1. کوئری‌ای که از هر دو ستون استفاده می‌کنه**:

SELECT * FROM employees WHERE department = 'Sales' AND hire_date = '2023-01-15';

این کوئری می‌تونه از ایندکس ترکیبی idx_department_hire_date کامل استفاده کنه.

2. کوئری‌ای که فقط از ستون اول استفاده می‌کنه:
 SELECT * FROM employees WHERE department = 'Sales';

این کوئری هم می‌تونه از ایندکس استفاده کنه چون با ستون department شروع شده.

3. کوئری‌ای که فقط از ستون دوم استفاده می‌کنه:

SELECT * FROM employees WHERE hire_date = '2023-01-15';

این کوئری نمی‌تونه به طور مؤثری از ایندکس ترکیبی idx_department_hire_date استفاده کنه، چون با ستون department شروع نمی‌شه. به این معنا نیست که تحت هیچ شرایطی از ایندکس استفاده نمی‌کنه، بلکه به این معناست که از بخش زیادی از ایندکس استفاده نمی‌شه و عملاً سود چندانی از ایندکس نمی‌بره.

4. کوئری‌ای که از هر دو ستون ولی به ترتیب برعکس استفاده می‌کنه:

SELECT * FROM employees WHERE hire_date = '2023-01-15' AND department = 'Sales';

این کوئری هم می‌تونه از ایندکس استفاده کنه چون از هر دو ستون استفاده کرده، ولی بهتره ستون‌ها رو به همون ترتیبی که تو ایندکس تعریف شدن استفاده کنیم.

👈👈👈 خلاصه

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

فهمیدن اینکه کوئری‌هات چجوری با ایندکس‌ها کار می‌کنن خیلی مهمه تا بتونی عملکرد دیتابیس رو بهتر کنی.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍7💯4🔥1🎉1🕊1💋1
👍3🏆3
Massimo Dev
📗 اصول مهم کد ریویو یا بررسی کد: YAGNI، KISS و DRY
من خودم موقع کد ریویوها این سه اصل رو خیلی با دقت رعایت می‌کنم.

🔶 1. YAGNI (You aren't gonna need it):
- این اصل داره میگه از اضافه کردن ویژگی‌ها یا کدی که الان لازم نیست خودداری کن. این کار باعث میشه کدت تمیز و ساده بمونه.
🔹 - مثال: اگه تو داری یه فرم ساده برای ورود اطلاعات می‌نویسی، لازم نیست از الان برای فیلتر کردن داده‌ها یا اضافه کردن قابلیت‌های پیچیده فکر کنی. اونها رو بعداً وقتی واقعاً نیاز بود اضافه کن.

🔶 2. KISS (Keep it simple & stupid):
- میگه سعی کن کدت ساده باشه. راه‌حل‌های پیچیده معمولاً میشه ساده‌ترشون کرد و این باعث میشه کد راحت‌تر خوانده و نگهداری بشه.
🔹 - مثال: به جای نوشتن یه تابع پیچیده برای محاسبه تخفیف، یه تابع ساده بنویس که فقط تخفیف رو بر اساس درصد حساب کنه. اگه بعداً نیاز به محاسبات پیچیده‌تر بود، اون موقع بهش اضافه کن.

🔶 3. DRY (Don't repeat yourself):
- میگه جایی که میشه، از کدهای موجود استفاده کن و از تکرار کد خودداری کن. این کار باعث میشه نگهداری کد راحت‌تر باشه و احتمال خطاها کمتر بشه.
🔹- مثال: اگه داری چند بار یه عملیات مشابه مثل محاسبه مالیات رو انجام میدی، اون رو تو یه تابع مجزا بنویس و هر بار از اون تابع استفاده کن.

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


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍7🔥3
Massimo Dev
🚀 تست‌نویسی در پروژه‌های بزرگ: بهترین روش‌ها و یه مثال واقعی 🚀

تو دنیای پرسرعت توسعه نرم‌افزار، تضمین کیفیت کد و اطمینان از عملکرد درست خیلی مهمه. روش تست‌نویسی قبل از کدنویسی (TDD) ثابت کرده که می‌تونه یه تغییر بزرگ ایجاد کنه، مخصوصاً تو پروژه‌های بزرگ. اینجا چندتا از بهترین روش‌ها برای اجرای TDD تو پروژه‌های بزرگ رو با یه مثال واقعی براتون می‌گم.

1. طراحی و معماری ماژولار
ما تو شرکت مون ابتدا سعی کردیم یه اپلیکیشن مونولیتیک رو به مایکروسرویس‌ها تقسیم کردیم. این کار نوشتن تست‌های مستقل برای هر سرویس رو آسون‌تر کرد و نگهداری و مقیاس‌پذیری رو بهتر کرد.

2. پایپلاین تست اتوماتیک
ما TDD رو با استفاده از Jenkins و GitHub Actions تو CI/CDمون ادغام کردیم. هر کامیت یه سری تست رو اجرا می‌کنه و بلافاصله بازخورد می‌ده و سلامت کد رو حفظ می‌کنه.

3. تست کاوریج (پوشش تست) و کیفیت
به جای دنبال کردن پوشش ۱۰۰٪، روی مسیرهای بحرانی تمرکز کردیم. مثلاً، تست احراز هویت کاربر به ما کمک کرد که مشکلات امنیتی رو زودتر پیدا و رفع کنیم

4. انواع و سطوح تست
- تست‌های واحد یا Unit Tests: اعتبارسنجی اجزای فردی.
- تست‌های یکپارچه‌سازی یا Integration Tests: اطمینان از عملکرد درست اجزا با هم.
- تست‌های End-to-End: تست کل ورک فلوهای اپلیکیشن.
تو پروژه، Unit Testing برای پردازش پرداخت‌ها با تست‌های End-to-End که تراکنش‌های واقعی کاربران رو شبیه‌سازی می‌کرد، اجرا شد تا عملکرد قوی‌ای داشته باشیم.

5. نگهداری تست‌ها
مرور و بازسازی منظم تست‌ها به ما کمک کرد تا مجموعه تست‌هامون رو مرتبط و کارآمد نگه داریم و بدهی فنی رو کاهش بدیم.

6. کد ریویو
بررسی دقیق کدها، شامل تست‌ها، فرهنگ ارتقاء کیفیت و مسئولیت مشترک بین اعضای تیم رو تقویت کرد.

7. ماکینگ و Stubbing
ما از ماک‌ها (Mocks) برای شبیه‌سازی درگاه‌های پرداخت خارجی استفاده کردیم تا تست‌هامون بدون وابستگی به سرویس‌های خارجی سریع و قابل اعتماد باشه.

8. تست‌های مقیاس‌پذیری و عملکرد یا Scalability & Performance Testing
قبل از نسخه‌های اصلی، بارگذاری سرویس‌هامون رو تست کردیم تا گلوگاه‌ها رو شناسایی کنیم و تو دوره‌های ترافیک بالا، عملکرد روان داشته باشیم.

9. مستندسازی و آموزش
مستندات جامع و جلسات آموزشی منظم در مورد بهترین روش‌های TDD تیم‌مون رو هماهنگ و مچ تر نگه داشت.

10. بازخورد و بهبود
جلسات رترو دو هفته‌ای یه فضایی رو برای بحث در مورد چالش‌ها و بهبودهای TDD فراهم کرد و رویکردمون رو به طور مداوم بهبود داد.

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


#توسعه_نرم‌افزار #TDD #تضمین_کیفیت #DevOps #مایکروسرویس‌ها #اجایل

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍3🔥1
Which technique can be used to inspect type information at runtime in Go?
Anonymous Quiz
19%
Dynamic typing
81%
Reflection
خلاصه کتاب قورباغه ات را قورت بده در یک دقیقه:

♦️قانون اول:
فکر نکن بخورش.
اگه دو تا قورباغه روی میز هست و تو قراره اونارو بخوری نگاه کردن بهشون و تعلل کردن هیچ چیزی رو حل نمیکنه همین الان قورباغرو قورت بده

کار سختی که باید انجام بدیو همین الان انجام بده.

♦️قانون دوم :
اول زشته رو بخور
اگه دو تا قورباغه روی یک میز هست اول اونی که زشت تره رو بخور، اول اون کاری که سخت تره رو انجام بده

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


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍10🔥2🍾2🕊1🏆1💋1
فرصت همکاری
دورکاری
Digital marketer


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍3
Massimo Dev
آشنایی با اصول SOLID#

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

📍1. اصلSingle Responsible Principle (SRP)
- مفهوم: هر کلاس باید فقط یک دلیل برای تغییر داشته باشه و یک مسولیت رو بپذیره!
- مثال: فکر کن یه دستگاه قهوه‌ساز داری که هم قهوه درست می‌کنه و هم رادیو داره. اگه رادیو خراب بشه، ممکنه نتونی قهوه درست کنی تا رادیو تعمیر بشه. بهتره دستگاه‌های جدا برای قهوه و موسیقی داشته باشی.

📍2. اصل باز/بسته (OCP) یا Open-Close Principle
- مفهوم: موجودیت‌های نرم‌افزاری باید برای گسترش باز و برای تغییر بسته باشن.
- مثال: فرض کن یک فروشگاه آنلاین داری که روش‌های مختلف پرداخت رو پشتیبانی می‌کنه. به جای اینکه هر بار که یک روش پرداخت جدید اضافه می‌کنی، کد اصلی فروشگاه رو تغییر بدی، می‌تونی یک ساختار ماژولار طراحی کنی که هر روش پرداخت به صورت یک ماژول جداگانه باشه. اینجوری، وقتی می‌خوای یک روش پرداخت جدید مثل پرداخت با بیت‌کوین اضافه کنی، فقط کافیه یک ماژول جدید برای اون روش پرداخت بسازی و به سیستم اضافه کنی، بدون اینکه کد اصلی فروشگاه تغییر کنه.

📍3. اصل جایگزینی لیسکوف (LSP) یا Liskov Substitution Principle
جایگزینی لیسکوف یا اصل جایگزین‌پذیری Liskov مفهومی در برنامه‌نویسی شیءگرا است که تضمین می‌کند هر شیء یا نمونه‌ای از یک کلاس می‌تواند به جای هر نمونه دیگری از آن کلاس قرار گیرد بدون اینکه عملکرد برنامه‌ی کامل را تحت تاثیر قرار دهد. به این معنی که اگر یک کلاس زیرکلاس (subclass) باشد، باید بتواند به جای کلاس اصلی (superclass) قرار گیرد و همه‌ی عملکردها به درستی کار کنند.

فرض کنید که شما یک کلاس اتومبیل (Car) دارید که دارای عملکردهایی مانند شروع کردن (start)، توقف کردن (stop) و حرکت کردن (move) است. حالا شما یک زیرکلاس به نام اتومبیل الکتریکی (ElectricCar) ایجاد می‌کنید که همه‌ی این عملکردها را به ارث می‌برد.

بر اساس اصل جایگزین‌پذیری لیسکوف، اگر برنامه شما برای کلاس اتومبیل نوشته شده باشد، باید بتوانید به جای هر اتومبیل، یک اتومبیل الکتریکی قرار دهید و برنامه همچنان به درستی کار کند، به این معنی که توابع start، stop و move به درستی اجرا شوند بدون نیاز به تغییر در کد برنامه.

📍4. اصل جداسازی اینترفیس‌ها (ISP) Interface Segregation Principle
- مفهوم: هیچ مشتری نباید مجبور باشه به متدهایی که استفاده نمی‌کنه وابسته باشه.
- مثال: فکر کن یه ابزار چندکاره داری با قابلیت‌های جدا برای کارهای مختلف (پیچ‌گوشتی، چاقو، درب‌بازکن). هر ابزار وظیفه خاصی داره بدون اینکه مجبور باشی امکانات اضافی رو حمل و استفاده کنی.

📍5. اصل وارونگی وابستگی (DIP) یا Dependency Inversion
- مفهوم: ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشن. هر دو باید به انتزاع وابسته باشن.

یک مثال ساده از اعمال اصل DIP می‌تواند در استفاده از وابستگی‌ها و تزریق وابستگی باشد. به عنوان مثال، فرض کنید شما یک برنامه‌ای دارید که برای ارسال ایمیل به کاربران خود نیاز به استفاده از یک سرویس ایمیل دارد. به جای اینکه مستقیماً به یک سرویس خاص مثل Gmail یا Outlook وابسته شوید، شما یک رابط یا اینترفیس برای سرویس ارسال ایمیل خود تعریف می‌کنید.

#برنامه_نویسی #دیزاین_پترن #کدنویسی


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍4🔥3💋1
✍️ Massimo Dev

توی مهندسی نرم‌افزار، "طراحی مبتنی بر دامنه" (DDD) یه روش طراحی هست که توسط Eric Evans معرفی شده. هدف این روش اینه که یه درک مشترک از حوزه‌ی کاری بین برنامه‌نویسا و استراتژیست ها ایجاد بشه

مفاهیم کلیدی

دامنه (Domain): همون قسمتی که کاربر از برنامه استفاده می‌کنه. مثلاً اگه برنامه ما یه فروشگاه آنلاین کتابه، دامنه‌اش همینه.

مدل دامنه (Domain Model): یه مدل انتزاعی که مفاهیم، قوانین و منطق دامنه کاری رو نشون می‌ده. این مدل باید طوری باشه که هم کارشناسان فنی و هم استراتژیست ها بتونن بفهمنش.

زبان مشترک (Ubiquitous Language): یه زبان مشترک که تیم ازش استفاده می‌کنه تا همه حرف‌ها و مفاهیم توی پروژه رو با اون بیان کنن. این زبان شکاف بین اصطلاحات فنی و تخصصی رو پر می‌کنه.

مرزهای محدود (Bounded Context): یه مرز که داخلش یه مدل خاص تعریف شده و کاربرد داره. این به مدیریت پیچیدگی کمک می‌کنه و حوزه رو به بخش‌های کوچیک‌تر و قابل مدیریت‌تر تقسیم می‌کنه.

موجودیت‌ها (Entities): Object هایی که هویت مشخص و ثابتی دارن و می‌تونن حالت‌های مختلفی داشته باشن.

اشیاء ارزشمند (Value Objects): آبجکت هایی که جنبه‌های خاصی از دامنه رو توصیف می‌کنن ولی هویت مشخصی ندارن.

مجموعه‌ها (Aggregates): یه کلاستر از آبجکت های دامنه هستن که می‌تونن به‌عنوان یه واحد در نظر گرفته بشن. نگران نباشید مثال میزنم بعدش که متوجه بشید.

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

سرویس‌ها (Services): عملیات یا فرایندهایی که به Life Cycle یه Entity یا Value Object ربطی ندارن.

مثال عملی: فروشگاه آنلاین کتاب

بیاین این مفاهیم رو با یه مثال از یه فروشگاه آنلاین کتاب توضیح بدیم.

Domain:
دامنه همون "فروشگاه آنلاین کتاب" هست که روی منطق کسب‌وکار خرید، فروش و مدیریت کتاب تمرکز داره.

Domain Model:
مدل دامنه شامل موجودیت‌هایی مثل کتاب، مشتری، سفارش و مفاهیمی مثل مدیریت موجودی و پردازش پرداخت می‌شه.

Ubiquitous Language:
- کتاب: همون محصولیه که داریم می‌فروشیم.
- مشتری: کسی که کتاب می‌خره.
- سفارش: خرید مشتری که شامل یه یا چندتا کتابه.
- موجودی: تعداد کتاب‌های موجود.
- پرداخت: تراکنش برای یه سفارش.

Bounded Context:
1. کانتکست فروش: شامل موجودیت‌ها و گرفتن سفارش و پردازش پرداخت.
2. کانتکست موجودی: شامل موجودیت‌ها و مدیریت موجودی کتاب‌ها.
3. کانتکست مشتری: شامل موجودیت‌ها و اطلاعات و پروفایل مشتری‌ها.

Entities and Value Objects

- Entities:
- کتاب (ISBN، Title، Author، Price)
- مشتری (ID, Name، Email)
- سفارش (ID، Book Items، total amount، order date )

- Value Objects:
- آدرس (خیابان، شهر، استان، کدپستی)
- پول (مبلغ، ارز)

Aggregates

- مجموعه سفارش: موجودیت Order یک Aggregate root است. شامل لیست کتاب‌ها به‌عنوان Value object و مبلغ کل به‌عنوان یه value object.
- مجموعه مشتری: موجودیت Customer یک Aggregate root است. شامل آدرس به‌عنوان یه Value object.

Repositories
- مخزن کتاب: مدیریت موجودیت‌های کتاب، پیدا کردن، ذخیره و حذف کتاب‌ها.
- مخزن سفارش: مدیریت موجودیت‌های سفارش، ثبت، پیگیری و بازیابی سفارش‌ها.

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


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍62🕊1🍾1
کی از قشنگ ترین مطالبی که خوندم، ۷ تکنیک ژاپنی برای مقابله با تنبلی و اهمال کاری بود که می گفت.....

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

۲) کایزن
هر روز روی پیشرفت های کوچک تمرکز کن، سعی کن هر روز ۱٪ فقط بهتر بشی، همین کافیه

۳) شوشین
ذهنت رو متمرکز و خالی نگه‌دار، هرچیزی رو نخون، هرآهنگی رو گوش نده، هر فیلمی رو نبین، روی ورودی های ذهنت حساس باش

+ذهن یه متخصص برخلاف باور همه خالی تر از ذهن یه انسان معمولیه
چون متمرکزه

۴) هارا هاچی بو
وقتی ۸۰ درصد احساس سیری کردی دست از غذا بکش، همونطور که روی ورودی های ذهن حساسی رو جسمت هم حساس باش، بدنی که هرچیزی بخوره خواه نا خواه تنبل میشه

۵) شنیرین یوکو
با طبیعت انس بگیر، ژاپنی ها طبیعت رو منبع الهام بخشی برای انگیزه و انرژی میدونن

۶) وابی سابی
به جای پیدا کردن زیبایی در کمال و کامل بودن، به دنبال زیبایی در نقص باش، یعنی دقیقا نقطه مقابل کمال‌گرایی

۷) گانبارو
صبور باش و استمرار داشته باش، هیچ اتفاقی یهویی رخ نمیده این رو برای خودت مرور کن


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍10🔥2🍾2🎃1
✍️ Massimo Dev
🔧 بهبود مهارت‌های گیت: نکات کلیدی که باید رعایت کنی


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

📍۱. پیام‌های کامیت واضح و مختصر
🔹هر کامیت باید یه تغییر مشخص و قابل فهم رو نشون بده.
🔹 با لحن امری بنویسید و پیام‌ها رو کوتاه و مفید نگه دارید.

🚦مثال:
fix: resolve user login issue

- Correct typo in login function
- Update error handling for failed login attempts


📍۲. نام‌گذاری برنچ‌ها باید با معنی باشد
🔹 اسم برنچ باید مشخص کنه که چه کاری توش انجام می‌شه معمولا با اسم تسکی که در اختیار داری یکسان میشه
🔹 از پیشوندهایی مثل feature/`، `bugfix/`، `chore/ و release/ برای شروع برنچ ها استفاده کنید که به شرح زیره:

📌 feature: اگه داری یه فیچر اضافه می‌کنی
📌 bugfix: اگه داری باگی رو روی محیط استیج فیکس می کنی
📌 chore: اگه داری کارهای دواپسی یا آپدیت پکیج ها که نه فیچر و نه باگ هستن، انجام میدی
📌 release: اگه میخوای ریلیزی بدی
📌 hotfix: اگه داری روی یه باگ روی مستر یا پروداکشن فیکس می‌کنی
📌 pref: اگه داری کارهایی برای ارتقا پرفورمنس انجام میدی
📌 docs: اگه داری داکیومنت یا مستنداتی به کد اضافه می‌کنی
📌 test: اگر داری تستی می‌نویسی یا تستی رو بهبود میدی
📌 refactor: اگر داری ساختار یه کد رو بدون تغییر لاجیکش عوض می‌کنی
📌 ci: اگر داری پروسه CI/CD رو تغییر یا بهبود میدی

🚦مثال:
feature/add-payment-gateway
bugfix/fix-cart-bug
chore/update-dependencies
release/v2.0.0
hotfix/urgent-login-fix
perf/optimize-database-queries
docs/add-api-documentation
test/add-unit-tests
refactor/clean-up-auth-module
ci/add-github-actions


📍۳. درخواست‌های ادغام (PR) کامل و دقیق
🔹 پول ریکوئست یا PRها باید واضح و قابل بررسی باشن.
🔹 توضیحات کامل بدید و مسائل مرتبط رو لینک کنید.

🚦مثال:
### Summary
Implement payment gateway integration.

### Changes
- Add payment processing service
- Create payment UI component
- Update checkout workflow

### Testing
- Manual testing on staging environment
- Unit tests for payment service

### Related Issues
- Resolves #123


📍۴. برچسب‌گذاری برای نسخه‌ها
🔹 از برچسب‌ها برای نشونه‌گذاری نقاط مهم تو تاریخچه پروژه استفاده کن.
🔹 از نسخه‌بندی معنایی استفاده کن.

🚦مثال:
git tag -a v2.0.0 -m "Release version 2.0.0"
git push origin v2.0.0


📍۵. تاریخچه کامیت تمیز
🔹 تاریخچه کامیت‌هاتون باید قابل خوندن و منطقی باشه.
🔹 کامیت‌ها رو ریبیس و اسکواش کنید تا از شلوغی جلوگیری کنید.

مثال:
# Rebase feature branch onto main
git rebase main

# Squash multiple commits into one
git rebase -i HEAD~3



👑 @gopher_academy | 💸 Donate | 💋 Boost
👍111🍾1🎃1
✍️ Massimo Dev

🔵⚪️ نسخه‌بندی API یا API Versioning میدونی چیه؟

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

✳️ بذار یه مثال ساده بزنم:

فرض کن یه API داری که اطلاعات آب و هوا رو می‌ده. اولین نسخه‌ی API (v1) یه اندپوینت داره به اسم
/weather
که اطلاعات ساده‌ای مثل دما و رطوبت رو برمی‌گردونه.

نسخه 1 (v1):
GET /v1/weather?city=London
Result:
{
"temperature": "15°C",
"humidity": "75%"
}


بعداً تصمیم می‌گیری اطلاعات بیشتری مثل سرعت باد و پیش‌بینی هوا رو اضافه کنی. برای اینکه کاربرهای قدیمی دچار مشکل نشن، یه نسخه جدید از API (v2) معرفی می‌کنی:

نسخه 2 (v2):
GET /v2/weather?city=London
Result:
{
"temperature": "15°C",
"humidity": "75%",
"wind_speed": "10 km/h",
"forecast": [
{"day": "Monday", "temperature": "16°C"},
{"day": "Tuesday", "temperature": "17°C"}
]
}


به این ترتیب، کاربرهایی که از نسخه قدیمی (v1) استفاده می‌کنن همچنان بدون تغییر به کارشون ادامه می‌دن و کاربرهای جدید می‌تونن از ویژگی‌های جدید نسخه 2 (v2) استفاده کنن.

✳️ بهترین روش‌ها برای نسخه‌بندی API

🔹نسخه‌بندی URL:
- شماره نسخه رو توی مسیر URL قرار بده، مثل
/v1/resource
و
/v2/resource
- مثال:
`GET /api/v1/weather`،
GET /api/v2/weather.

🔹نسخه‌بندی با هدرها:
- از هدرهای سفارشی برای مشخص کردن نسخه استفاده کن.
- مثال:
GET /api/weather
با
headers: {"API-Version": "v2"}

🔹نسخه‌بندی با پارامترهای کوئری:
- شماره نسخه رو به عنوان پارامتر کوئری قرار بده.
- مثال:
GET /api/weather?version=2

🔹استراتژی پایان‌دهی به نسخه‌های قدیمی:
- به کاربرها بگو که نسخه قدیمی چه زمانی غیرفعال می‌شه و راهنمایی برای مهاجرت به نسخه‌های جدید بده.
- یه بازه زمانی مشخص و راهنمای مهاجرت ارائه کن.

🔹مستندسازی:
- برای هر نسخه از API مستندات واضح و دقیقی فراهم کن.
- مثال‌ها، موارد استفاده و راهنماهای مهاجرت رو توضیح بده.

🔹سازگاری با نسخه‌های قبلی:
- تا حد ممکن نسخه‌های جدید رو سازگار با نسخه‌های قبلی نگه دار تا کاربرها دچار مشکل نشن.
- از نسخه‌بندی معنایی (مثل major.minor.patch) استفاده کن تا سطح تغییرات رو نشون بدی مثلا نسخه ،29.5.0 شده 29.5.1

🔹سیاست نسخه‌بندی:
- یه سیاست نسخه‌بندی تعریف کن که مشخص کنه کی و چطور نسخه‌های جدید منتشر می‌شن.
- واضح بگو که چه زمانی تغییرات بزرگ نیاز به یه نسخه جدید دارن.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍10💋2🔥1
هر چند وقت یک بار بد نیست ۵ قانون مهم دنیا را برای درک بهتر موفقیت برای خود مرور کنید:

1. قانون مورفی (Murphy’s Law)

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

2. قانون کیدلین (Kidlin’s Law)

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

3. قانون گیلبرت (Gilbert’s Law)

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

4. قانون والسون (Walson’s Law)

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

5. قانون فالکلند (Falkland’s Law)

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


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍112💯1🍾1💋1💅1
سیستم دیزاین تلگرام🤔👾

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥13👍3💋1💊1
یه ریپازیتوری باحال توی گیتهاب پیدا کردم که یکی از بچه های ایرانی آماده کرده.

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

حتما چک کنید:

https://github.com/coditori/highly-skilled-job-offers

DevTwitter | <Reza/>


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍5🔥2💋1🎃1
هروقت خواستید تصمیم مهمی را در زندگیتان بگیرید و یا عکس العملی بروز دهید از این تکنیک استفاده کنید.
تکنیک 10-10-10-10:

برای استفاده از این تکنیک 4 سوال ساده را باید از خود بپرسید:

اول: پیامد این تصمیمِ من بعد از 10 دقیقه چیست؟
دوم: پیامد این تصمیم بعد از 10 روز چیست؟
سوم: پیامد این تصمیم بعد از 10 ماه چیست؟
چهارم: پیامد این تصمیم بعد از 10 سال چیست؟

گاهی باید زمان تصمیم گیری در اخرین لحظات خودمان را کنترل کنیم...


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍12🎃5💅2
🥶معنای مساوی در ریاضی چیست؟
🤯 پرسشی ظاهرا ساده که پاسخ‌های پیچیده دارد

💜 https://www.zoomit.ir/fundamental-science/422703-what-is-the-meaning-of-equality-in-math/


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍3🍓2🔥1🎃1
✍️ یه سری خطای های رایج در گیت و راه حل های آن

🆘 1. 𝐄𝐫𝐫𝐨𝐫: "𝐟𝐚𝐭𝐚𝐥: 𝐧𝐨𝐭 𝐚 𝐠𝐢𝐭 𝐫𝐞𝐩𝐨𝐬𝐢𝐭𝐨𝐫𝐲"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Check that you are in the correct directory with a Git repository, or initialize a new repository using 𝐠𝐢𝐭 𝐢𝐧𝐢𝐭.

🆘 2. 𝐄𝐫𝐫𝐨𝐫: "𝐘𝐨𝐮𝐫 𝐛𝐫𝐚𝐧𝐜𝐡 𝐢𝐬 𝐚𝐡𝐞𝐚𝐝/𝐛𝐞𝐡𝐢𝐧𝐝 '𝐨𝐫𝐢𝐠𝐢𝐧/𝐦𝐚𝐬𝐭𝐞𝐫' 𝐛𝐲 𝐗 𝐜𝐨𝐦𝐦𝐢𝐭𝐬"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Use 𝐠𝐢𝐭 𝐩𝐮𝐥𝐥 to update your local branch with the remote branch or 𝐠𝐢𝐭 𝐩𝐮𝐬𝐡 to push your changes to the remote branch.

🆘 3. 𝐄𝐫𝐫𝐨𝐫: "𝐌𝐞𝐫𝐠𝐞 𝐜𝐨𝐧𝐟𝐥𝐢𝐜𝐭"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Resolve conflicts manually in the conflicting files, then use 𝐠𝐢𝐭 𝐚𝐝𝐝 to stage the changes, and commit them.

🆘 4. 𝐄𝐫𝐫𝐨𝐫: "𝐂𝐨𝐦𝐦𝐢𝐭 𝐧𝐨𝐭 𝐢𝐧 𝐬𝐲𝐧𝐜 𝐰𝐢𝐭𝐡 𝐭𝐡𝐞 𝐫𝐞𝐦𝐨𝐭𝐞 𝐛𝐫𝐚𝐧𝐜𝐡"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Use  𝐠𝐢𝐭 𝐩𝐮𝐥𝐥 to get the latest changes from the remote branch and then commit your changes.

🆘 5. 𝐄𝐫𝐫𝐨𝐫: "𝐏𝐞𝐫𝐦𝐢𝐬𝐬𝐢𝐨𝐧 𝐝𝐞𝐧𝐢𝐞𝐝 (𝐩𝐮𝐛𝐥𝐢𝐜𝐤𝐞𝐲)"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Ensure your SSH key is added to your SSH agent and associated with your Git account.

🆘 6. 𝐄𝐫𝐫𝐨𝐫: "𝐟𝐚𝐭𝐚𝐥: 𝐫𝐞𝐦𝐨𝐭𝐞 𝐨𝐫𝐢𝐠𝐢𝐧 𝐚𝐥𝐫𝐞𝐚𝐝𝐲 𝐞𝐱𝐢𝐬𝐭𝐬"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Update the remote's URL using 𝐠𝐢𝐭 𝐫𝐞𝐦𝐨𝐭𝐞 𝐬𝐞𝐭-𝐮𝐫𝐥 𝐨𝐫𝐢𝐠𝐢𝐧 <𝐧𝐞𝐰_𝐮𝐫𝐥>.

🆘 7. 𝐄𝐫𝐫𝐨𝐫: "𝐞𝐫𝐫𝐨𝐫: 𝐩𝐚𝐭𝐡𝐬𝐩𝐞𝐜 '𝐟𝐢𝐥𝐞' 𝐝𝐢𝐝 𝐧𝐨𝐭 𝐦𝐚𝐭𝐜𝐡 𝐚𝐧𝐲 𝐟𝐢𝐥𝐞(𝐬) 𝐤𝐧𝐨𝐰𝐧 𝐭𝐨 𝐠𝐢𝐭"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Check the spelling and case of the file name and ensure it's part of the repository.

🆘 8. 𝐄𝐫𝐫𝐨𝐫: "𝐂𝐨𝐦𝐦𝐢𝐭 𝐦𝐞𝐬𝐬𝐚𝐠𝐞 𝐦𝐢𝐬𝐬𝐢𝐧𝐠"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Provide a commit message using  𝐠𝐢𝐭 𝐜𝐨𝐦𝐦𝐢𝐭 -𝐦 "Your message here".

🆘 9. 𝐄𝐫𝐫𝐨𝐫: "𝐰𝐚𝐫𝐧𝐢𝐧𝐠: 𝐋𝐅 𝐰𝐢𝐥𝐥 𝐛𝐞 𝐫𝐞𝐩𝐥𝐚𝐜𝐞𝐝 𝐛𝐲 𝐂𝐑𝐋𝐅"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Configure line endings using .𝐠𝐢𝐭𝐚𝐭𝐭𝐫𝐢𝐛𝐮𝐭𝐞𝐬 or global Git configuration.

🆘 10. 𝐄𝐫𝐫𝐨𝐫: "𝐞𝐫𝐫𝐨𝐫: 𝐘𝐨𝐮𝐫 𝐥𝐨𝐜𝐚𝐥 𝐜𝐡𝐚𝐧𝐠𝐞𝐬 𝐭𝐨 𝐭𝐡𝐞 𝐟𝐨𝐥𝐥𝐨𝐰𝐢𝐧𝐠 𝐟𝐢𝐥𝐞𝐬 𝐰𝐨𝐮𝐥𝐝 𝐛𝐞 𝐨𝐯𝐞𝐫𝐰𝐫𝐢𝐭𝐭𝐞𝐧 𝐛𝐲 𝐦𝐞𝐫𝐠𝐞"
  - 𝐒𝐨𝐥𝐮𝐭𝐢𝐨𝐧: Stash your local changes with 𝐠𝐢𝐭 𝐬𝐭𝐚𝐬𝐡, then perform the merge, and finally apply your changes back with 𝐠𝐢𝐭 𝐬𝐭𝐚𝐬𝐡 𝐚𝐩𝐩𝐥𝐲.


👑 @gopher_academy | 💸 Donate | 💋 Boost
🏆3👍1
• با قانون 8+8+8 به زندگیت نظم بده:

1- 8 ساعت سخت کار کن.
2- 8 ساعت خواب آروم و راحت داشته باش.
3- 8 ساعت هر کاری که دوست داری بکن.
ما قدر زمانی که داریم رو نمیدونیم، براش برنامه ریزی نمی‌کنیم برای همینه که هیچوقت تایم برای کارامون نداریم، یا تایم خوابمون درست نیست یا کسلیم، یا کل روز ول میچرخیم و نمیدونیم چیکار کنیم. این قانون به زندگیت نظم میده و تایمتو تنظیم می‌کنه.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍175🔥2🏆1💋1🎃1💊1
✍️یه سری کامندهای عمومی و ضروری که هر برنامه نویسی در کار با لینوکس باید بلد باشه

📂 𝟭. 𝗙𝗶𝗹𝗲 𝗮𝗻𝗱 𝗗𝗶𝗿𝗲𝗰𝘁𝗼𝗿𝘆 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁 🗂
- 𝚕𝚜: List files and directories in the current location
- 𝚙𝚠𝚍: Display the current working directory path
- 𝚌𝚍: Navigate between directories
- 𝚖𝚔𝚍𝚒𝚛: Create new directories
- 𝚛𝚖𝚍𝚒𝚛: Remove empty directories
- 𝚝𝚘𝚞𝚌𝚑: Create new files
- 𝚌𝚙: Duplicate files or directories
- 𝚖𝚟: Move or rename files and directories
- 𝚛𝚖: Delete files or directories

🔧 𝟮. 𝗣𝗿𝗼𝗰𝗲𝘀𝘀 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁
- 𝚙𝚜: View running processes
- 𝚝𝚘𝚙: Monitor active processes in real-time
- 𝚑𝚝𝚘𝚙: Interact with processes using a user-friendly interface
- 𝚔𝚒𝚕𝚕: Stop a specific process
- 𝚔𝚒𝚕𝚕𝚊𝚕𝚕: Terminate all occurrences of a process
- 𝚙𝚜𝚝𝚛𝚎𝚎: Visualize processes in a hierarchical tree structure 🌲

👥 𝟯. 𝗨𝘀𝗲𝗿 𝗮𝗻𝗱 𝗚𝗿𝗼𝘂𝗽 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁
- 𝚙𝚊𝚜𝚜𝚠𝚍: Update user passwords
- 𝚞𝚜𝚎𝚛𝚊𝚍𝚍: Create new users
- 𝚞𝚜𝚎𝚛𝚍𝚎𝚕: Remove users
- 𝚐𝚛𝚘𝚞𝚙𝚜: List groups a user belongs to
- 𝚞𝚜𝚎𝚛𝚖𝚘𝚍: Modify user account details
- 𝚒𝚍: Show user and group information
- 𝚐𝚛𝚘𝚞𝚙𝚊𝚍𝚍: Create new groups
- 𝚐𝚛𝚘𝚞𝚙𝚍𝚎𝚕: Remove groups

💾 𝟰. 𝗦𝘆𝘀𝘁𝗲𝗺 𝗜𝗻𝗳𝗼𝗿𝗺𝗮𝘁𝗶𝗼𝗻 🖥
- 𝚞𝚗𝚊𝚖𝚎: Display system details
- 𝚍𝚏: Check disk space usage
- 𝚍𝚞: Estimate file and directory sizes
- 𝚏𝚛𝚎𝚎: Show available memory
- 𝚕𝚜𝚌𝚙𝚞: Provide CPU architecture information
- 𝚕𝚜𝚑𝚠: List hardware components
- 𝚕𝚜𝚋𝚕𝚔: Display block devices

🌐 𝟱. 𝗡𝗲𝘁𝘄𝗼𝗿𝗸 𝗖𝗼𝗻𝗳𝗶𝗴𝘂𝗿𝗮𝘁𝗶𝗼𝗻 𝗮𝗻𝗱 𝗠𝗼𝗻𝗶𝘁𝗼𝗿𝗶𝗻𝗴 🕸
- 𝚒𝚏𝚌𝚘𝚗𝚏𝚒𝚐: Manage network interfaces
- 𝚒𝚙: Control routing, devices, and tunnels
- 𝚙𝚒𝚗𝚐: Verify network connectivity
- 𝚗𝚎𝚝𝚜𝚝𝚊𝚝: Analyze network statistics
- 𝚜𝚜: Investigate socket connections
- 𝚝𝚛𝚊𝚌𝚎𝚛𝚘𝚞𝚝𝚎: Track packet routes and delays
- 𝚜𝚜𝚑: Establish secure remote connections
- 𝚗𝚌: Swiss army knife for TCP/IP networking

📦 𝟲. 𝗣𝗮𝗰𝗸𝗮𝗴𝗲 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁 📥
- 𝚊𝚙𝚝-𝚐𝚎𝚝, 𝚊𝚙𝚝: Manage packages on Debian-based systems
- 𝚢𝚞𝚖, 𝚍𝚗𝚏: Handle packages on RPM-based systems
- 𝚛𝚙𝚖: Manage RPM packages
- 𝚍𝚙𝚔𝚐: Manage Debian packages
- 𝚜𝚗𝚊𝚙: Work with the universal Linux package system
- 𝚣𝚢𝚙𝚙𝚎𝚛: Manage packages on openSUSE

📜 𝟳. 𝗙𝗶𝗹𝗲 𝗩𝗶𝗲𝘄𝗶𝗻𝗴 𝗮𝗻𝗱 𝗘𝗱𝗶𝘁𝗶𝗻𝗴 📝
- 𝚌𝚊𝚝: Display file contents
- 𝚕𝚎𝚜𝚜: View files with navigation controls
- 𝚖𝚘𝚛𝚎: Another file viewing tool
- 𝚟𝚒𝚖: Use the powerful Vim text editor
- 𝚐𝚎𝚍𝚒𝚝: Edit files using the GNOME text editor
- 𝚗𝚊𝚗𝚘: Edit files with the user-friendly Nano editor



👑 @gopher_academy | 💸 Donate | 💋 Boost
👍8🍾2🔥1🏆1💋1🎃1