کدهالیک | codehalic
3.47K subscribers
319 photos
8 videos
66 files
359 links
دوره های آموزشیمون رو از داخل سایت ببینید

https://codehalic.ir
Download Telegram
شروع کارم در دیجی‌کالا با دو چالش بزرگ همراه بود:

1. هر تغییر در اپ (که با React Native ساخته شده بود) نیاز به آپدیت توسط کاربر داشت، اما خیلی‌ها آپدیت نمی‌کردند.
2. پروژه آن‌قدر بزرگ شده بود که باید به تیم‌های کوچک‌تر و مستقل تقسیم می‌شد تا سرعت توسعه بالا برود.

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

ایده ما استفاده از Module Federation برای موبایل بود. با کمک ابزاری به نام Re.Pack (که آن زمان خیلی جدید بود)، این ساختار را پیاده‌سازی کردیم و حتی در بهبودش مشارکت داشتیم.

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

نسخه 3.0.0 با مدل «اول اجرا، بعد آپدیت» منتشر شد، اما این روش مشکل داشت (مثلا معلوم نبود باگ‌ها چه زمانی کامل برطرف می‌شوند).

برای همین مدل را تغییر دادیم به:
«اول آپدیت، بعد اجرا» (شبیه وب)

نتیجه این تغییر شد نسخه 3.1.1:
یکی از پایدارترین نسخه‌ها از نظر آپدیت درون‌برنامه‌ای 🚀

(جزئیات فنی بیشتر را بعدا مفصل‌تر می‌نویسم)

از لینکدین حسین محمدی :

https://www.linkedin.com/feed/update/urn:li:activity:7451739953459548160

@codehalics | کدهالیک
5🔥1
کدهالیک | codehalic
شروع کارم در دیجی‌کالا با دو چالش بزرگ همراه بود: 1. هر تغییر در اپ (که با React Native ساخته شده بود) نیاز به آپدیت توسط کاربر داشت، اما خیلی‌ها آپدیت نمی‌کردند. 2. پروژه آن‌قدر بزرگ شده بود که باید به تیم‌های کوچک‌تر و مستقل تقسیم می‌شد تا سرعت توسعه بالا…
استفاده از یه پکیجِ کم‌ستاره مثل Re.Pack برای اپلیکیشنی که میلیون‌ها کاربر داره، یه ریسکِ سنگین مهندسیه که هر کسی زیر بارِش نمی‌ره. واقعاً حرکتِ پرجرأتی بوده! خیلیا شاید می‌گفتن «بیخیال بابا، وب‌ویو می‌زنیم بره»، ولی اینا ایستادن پایِ کیفیتِ نیتیو و رفتن دنبال یه راه‌حل مدرن که تازه اول راهشه. این یعنی تیم دیجی‌کالا عملاً خودشون شدن بخشی از توسعه‌دهنده‌های اون ابزار و هزینه باگ‌هاشو به جون خریدن تا سرعت توسعه رو ببرن بالا. این جور تجربه‌هاست که عیارِ یه تیم فنی رو مشخص می‌کنه. منتظر یه گزارشِ فنی و مشتی از جزئیات این داستان هستیم!

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

@codehalics | کدهالیک
👍11🔥1
مثل اینکه فیگما باز شده
روی ایرانسل و همراه اول و فیبر نوری بدون فیلتر باز میشه

@codehalics | کدهالیک
👍3
:))))))))

@codehalics | کدهالیک
🤣3👨‍💻1
معرفی ابزار OpenPencil: ویرایشگر طراحی متن‌باز و AI-Native

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

ویژگی‌های کلیدی:

پشتیبانی مستقیم از فایل‌های Figma: فایل‌های .fig را بدون نیاز به خروجی گرفتن (Export) مستقیما باز می‌کند.

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

پشتیبانی از پروتکل MCP: با بهره‌گیری از MCP Server، امکان اتصال به کلاینت‌هایی مانند Cursor، Claude Code و سایر ابزارهای سازگار فراهم شده است.

دسترسی چندپلتفرمی: علاوه بر نسخه وب (app.openpencil.dev)، نسخه دسکتاپ آن نیز برای سیستم‌عامل‌های مختلف در دسترس است.

وب‌سایت پروژه:
https://openpencil.dev/

مخزن گیت‌هاب و نسخه‌های دسکتاپ:
https://github.com/open-pencil/open-pencil/releases

@codehalics | کدهالیک
🔥2
خب، تصمیمم رو گرفتم دوره‌ی منتورینگ Frontend Engineering رو برگزار می‌کنم.

ظرفیت این دوره فقط ۱۰ نفره و شرکت‌کننده‌های مستعد، رزومه‌شون به تیم PWA بلوبانک ریفر میشه.

شرایط شرکت:
• حداقل ۳ سال تجربه‌ی کاری تمام‌وقت
• تجربه‌ی کار با React

📩 رزومه‌هاتون رو به این ایمیل ارسال کنید:
p.faramarzian@bluteam.ir

در صورتی که به ایمیل سازمانی دسترسی نداشتید:
PooriaFaramarzian@gmail.com

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

منبع :
https://x.com/pooridev/status/2046186231902416990

@codehalics | کدهالیک
🔥5😁2
خب امروز می‌خوام یکی دیگه از سوالای مصاحبه‌ای که اگر به عنوان مصاحبه‌کننده باشم از بقیه می‌پرسم رو باهاتون مطرح کنم و نظر شما رو بپرسم.

سناریو: جلوگیری از فاجعه در درگاه پرداخت

فرض کنید یوزر روی دکمه «پرداخت نهایی» کلیک می‌کنه (پرداخت از کیف پول داخلی). به دلیل کندی اینترنت، Response سریع برنمی‌گرده؛ یوزر چندین بار پشت سر هم روی دکمه کلیک می‌کنه یا صفحه رو رفرش می‌کنه.

صورت مسئله:
۱. سمت Frontend، غیرفعال کردن دکمه (Disable Button) لایه اوله اما کافی نیست (چون با ابزارهایی مثل Postman یا رفرش صفحه قابل Bypass شدنه).
۲. سمت Backend، ما نباید تحت هیچ شرایطی اجازه بدیم بیش از یک‌بار از حساب کاربر کسر بشه، حتی اگر ۵ ریکوئست کاملاً یکسان در یک «میلی‌ثانیه» به سرور برسه (Race Condition).

سوال:
حرفه‌ای‌ترین و استانداردترین راهکار برای اینکه مطمئن بشیم یک عملیات حساس «دقیقاً و فقط یک‌بار» (Exactly-once) اعمال می‌شه چیه؟

نظراتتون رو بنویسید، شب درباره راهکار استانداردش (که توی شرکت‌های بزرگی مثل اسپاتیفای و اسنپ و ... استفاده می‌شه) گپ می‌زنیم.


"Do not hesitate to answer this question!"

@codehalics | کدهالیک
3
کدهالیک | codehalic
خب امروز می‌خوام یکی دیگه از سوالای مصاحبه‌ای که اگر به عنوان مصاحبه‌کننده باشم از بقیه می‌پرسم رو باهاتون مطرح کنم و نظر شما رو بپرسم. سناریو: جلوگیری از فاجعه در درگاه پرداخت فرض کنید یوزر روی دکمه «پرداخت نهایی» کلیک می‌کنه (پرداخت از کیف پول داخلی).…
خب مثل دفعه پیش می‌خوام ریفرتون بدم به یه مقاله عالی از دوست و همکار خوبم محمدجواد ابراهیمی. محمدجواد توی این مطلب خیلی ساده و تمیز مفاهیم اصلی رو باز کرده که خلاصه‌ش می‌شه این:

هر متدی که ما مینویسیم یا هر فانکشنی که مینویسیم باید چند خاصیت داشته باشه همیشه :
Side-effect Free:
یعنی متد ما نباید بره یه جای دیگه از برنامه رو ناخواسته تغییر بده (Shared State ایجاد نکنه).

Idempotent:
یعنی اگه یه تابع رو با ورودی یکسان، ۱۰۰ بار هم صدا بزنیم، نتیجه (خروجی و اثرش) همیشه همون بار اول باشه و سیستم رو به هم نریزه.

Pure Functions:
توابعی که هر دو ویژگی بالا رو دارن و فرشته نجات کد ما هستن!

توی بحث درگاه پرداخت و Race Condition که سوال کردم، اگر کد ما Idempotent نباشه، با هر بار کلیک یوزر، یه فاجعه مالی رخ میده!

حتماً یه زمان ۵ دقیقه‌ای بذارید و اصل مقاله رو بخونید که برای هر برنامه نویسی از نون شب واجب‌تر

https://virgool.io/dotnetzoom/%D8%A7%D9%87%D9%85%DB%8C%D8%AA-side-effect-free-%D9%88-idemponency-%D8%AF%D8%B1-%DA%A9%D8%AF%D9%86%D9%88%DB%8C%D8%B3%DB%8C-gazelp35o4zw

@codehalics | کدهالیک
3
کدهالیک | codehalic
خب امروز می‌خوام یکی دیگه از سوالای مصاحبه‌ای که اگر به عنوان مصاحبه‌کننده باشم از بقیه می‌پرسم رو باهاتون مطرح کنم و نظر شما رو بپرسم. سناریو: جلوگیری از فاجعه در درگاه پرداخت فرض کنید یوزر روی دکمه «پرداخت نهایی» کلیک می‌کنه (پرداخت از کیف پول داخلی).…
توی رفرنس های خارجی هم بهترین مقاله ای که راجب این موضوع میتونم بهتون بگم که بخونین مقاله استرایپ راجع به idempotent بودن عه :

ایده Idempotency Key: فرانت‌اِند یه کلیدِ یونیک (مثل UUID) می‌فرسته. سرور اگه این کلید رو قبلاً دیده باشه، دیگه اصلاً وارد منطق پرداخت نمی‌شه و فقط جواب قبلی رو از ککش برمی‌گردونه. یعنی یوزر ۱۰۰ بار هم روی دکمه کلیک کنه، فقط «یک‌بار» پول کسر می‌شه.

داستان Retryها: استرایپ می‌گه وقتی اینترنت قطع می‌شه، نباید مثل رگبار ریکوئست زد به سرور! از تکنیک Exponential Backoff استفاده می‌کنن؛ یعنی هر بار که شکست خورد، فاصله ریکوئست بعدی رو بیشتر می‌کنن تا سرور زیر فشارِ «گله‌ایِ» ریکوئست‌ها (Thundering Herd) نپکه!

این مقاله هم خیلی جذاب راجب همین موضوع بحث میکنه

https://stripe.com/blog/idempotency

@codehalics | کدهالیک
🔥3
کدهالیک | codehalic
خب امروز می‌خوام یکی دیگه از سوالای مصاحبه‌ای که اگر به عنوان مصاحبه‌کننده باشم از بقیه می‌پرسم رو باهاتون مطرح کنم و نظر شما رو بپرسم. سناریو: جلوگیری از فاجعه در درگاه پرداخت فرض کنید یوزر روی دکمه «پرداخت نهایی» کلیک می‌کنه (پرداخت از کیف پول داخلی).…
و اما نظر شخصی خودم درباره این موضوع:
بچه‌ها، واقعیت اینه که Idempotency (تکرارپذیری) خیلی فراتر از یک بحث بک‌اِندی یا درگاه پرداخته؛ این یک «انتزاع» (Abstraction) هست که توی تمام لایه‌های مهندسی نرم‌افزار، از فرانت‌اِند گرفته تا زیرساخت، حضور داره.

۱. نگاه Idempotent در فرانت‌اِند
خیلی وقت‌ها ما ناخودآگاه کدهایی می‌زنیم که تکرارپذیر نیستن. مثلاً فرض کن یه دکمه داریم که قراره کاربر رو به مرحله بعد ببره:

حالت غلط (Non-Idempotent): setState(prev => prev + 1)
اینجا اگه کاربر به خاطر کندی سیستم یا از سر شیطنت ۱۰ بار روی دکمه کلیک کنه، استیت ما ۱۰ واحد می‌ره جلو! فاجعه‌ست، نه؟

حالت درست (Idempotent):
setState(2)
این یعنی کاربر اگه ۱۰۰ بار هم کلیک کنه، استیت همیشه روی عدد ۲ می‌مونه. خروجی پایداره.

یا مثلاً باز کردن یک مدال (Modal):

به جای اینکه بنویسیم setState(!state) که حالت Toggle داره و با هر کلیک یه جواب متفاوت می‌ده، باید بنویسیم setState(true). اینطوری همیشه خروجی همونه: مدال باز است.

۲. نگاه Idempotent در بک‌اِند و پیام‌رسانی
در لایه بک‌اِند هم داستان همینه. توی معماری‌های مبتنی بر ایونت (Event-Driven)، ممکنه یک پیام به هر دلیلی (مثل Retryهای مسیج‌بروکر) چند بار به دست مصرف‌کننده برسه.
سیستم نباید گیج بشه! باید همیشه یک Idempotency Key یا کلید یکتا همراه پیام باشه که حتی اگه ۳۰۰ بار هم پردازش شد، فقط بار اول «اثر» بذاره و دفعات بعدی صرفاً بگه: «انجام شده بود، خیالت راحت!»

ما به عنوان توسعه‌دهنده باید یاد بگیریم سیستم رو جوری طراحی کنیم که نسبت به «تکرار»، مقاوم (Resilient) باشه. فرقی نمی‌کنه کلیک کاربر باشه یا ریکوئستِ شبکه؛ سیستمِ بالغ، سیستمیه که Side-effect اضافه ایجاد نکنه.


@codehalics | کدهالیک
6
ما به دنبال یک نیرو فرانت‌اند دولوپر و یک نیرو بک‌اند دولوپر هستیم.

Backend: Php , Laravel
Frontend: React , Nextjs

تلگرام برام رزومه بفرستید: @a_kamandlou

منبع :https://x.com/a_kamandlou/status/2046247447811305602

@codehalics | کدهالیک
2
کدهالیک | codehalic
این روزها یه بار سنگین از تنهایی افتاده روی دوشمون؛ دقیقاً وسط فشاری که انگار از هر طرف داره گریبانمونو میگیره. مخصوصاً بعد از موج این تعدیل‌های اخیر و اوضاعی که همه‌مون درگیرش شدیم. از بیرون شاید همه‌چیز خیلی یه خطی به نظر بیاد. یکی میگه از فردا نیا و تموم.…
امروز دیجیکالا حدود ۲۰۰۰ نفر رو تعدیل کرده ( ۳۰ درصد از نیروهاش ) در توییت جدید آقای طباطبایی این عدد به طور رسمی 200 نفر اعلام شده است یعنی حدود 3 درصد از نیرو های دیجیکالا تعدیل شدن

شاتل حدود ۲۰۰ نفر رو تعدیل کرده ( خبر به طور غیررسمی اعلام شده بر اساس توییت های توییتر )

علی بابا و رقباش هم به احتمال زیاد با تداوم این اتفاقا و بسته موندن پرواز ها کلا فیل بشه ( به طور غیررسمی اعلام شده )

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

با ادامه دار شدنش هم خیلی از این بدتر قراره شاهد موج عظیم از تعدیل باشیم
اینا ترسوندن نیست اینا طبعات تصمیماتیه که راجع به اینترنت گرفته شده و بعید میدونم به قبل از ۹ اسفند اینترنت برگرده

ناامیدم همین اینا ناامیدیای خودمه تو دلتون خالی نمیکنم فقط دعا کنین اینبار که اینترنت وصل بشه من دوست ندارم کسی دیگ بیکار شه با این وضعیت همتون دوستای خوب منین آخه ناراحتیتونو نبینم هیچ وقت! :)

@codehalics | کدهالیک
😢8👍62🤬2
تا حالا شده توی خونه مبل رو جوری بذاری که جلوی پریز رو بگیره ولی بعد یه مدت به همون وضعیت عادت کنی؟ حالا اگه یکی بیاد مبل رو جابه‌جا کنه که خونه رو قشنگ کنه، شاکی می‌شی چون تمام نظم ذهنی تو به هم ریخته. این دقیقا خلاصه اتفاقیه که بهش می‌گن قانون هایروم.

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

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

یه مثال واقعی و عجیب از دنیای لینوکس:
یه بار مهندس‌های گوگل دیدن توی خروجی لیست فایل‌های لینوکس چندتا فاصله خالی (Space) بیخود وجود داره. اونا هم از روی دلسوزی این اسپیس‌ها رو حذف کردن که خروجی تمیز بشه. به محض منتشر شدن این تغییر، کلی از برنامه‌های دنیا از کار افتاد! چرا؟ چون برنامه‌نویس‌های دیگه کدشون رو جوری نوشته بودن که مثلا می‌گفت: برو کاراکتر شماره ۲۰ رو بردار. اونا از اون فاصله‌های بیخود به عنوان خط‌کش استفاده می‌کردن و با حذف اونا، کل محاسباتشون غلط شد.

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

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

تا حالا بهش برخوردین ؟ دوست دارم نظرتونو بدونم راجبش !

#lawsofsoftwareengineering

@codehalics | کدهالیک
8👏4🤣1
کدهالیک | codehalic
تا حالا شده توی خونه مبل رو جوری بذاری که جلوی پریز رو بگیره ولی بعد یه مدت به همون وضعیت عادت کنی؟ حالا اگه یکی بیاد مبل رو جابه‌جا کنه که خونه رو قشنگ کنه، شاکی می‌شی چون تمام نظم ذهنی تو به هم ریخته. این دقیقا خلاصه اتفاقیه که بهش می‌گن قانون هایروم. این…
خودم توی شرکت قبلی دقیقاً با این داستان برخورد کردم. داشتیم سیستم سرچ رو بازطراحی می‌کردیم و من اصلاً حواسم به این نبود که یه سری از کاربرها عادت کردن «شناسه ملی» شرکت رو بزنن و اینتر کنن تا مستقیم برن توی پروفایل اون شرکت. این قابلیت اصلاً توی تسک من تعریف نشده بود، ولی چون کاربرها به این «میان‌بر» عادت کرده بودن، نبودنش رو به چشم یه باگ می‌دیدن. وقتی این قابلیت رو دوباره اضافه کردیم، تازه فهمیدیم چقدر توی زمان کاربرها صرفه‌جویی می‌شه و چقدر خوشحال‌تر شدن.

این قانون دقیقاً همینه: توی بازطراحی یا همون Migration سیستم‌ها، نباید فقط به فیچرهای رسمی نگاه کرد.

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

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

#lawsofsoftwareengineering

@codehalics | کدهالیک
🤯4👏3
ما به دنبال دو نیرو SRE و Devops هستیم.

خوشحال میشم رزومه اتون رو تلگرام برام بفرستید: @ImanAbr7777

@codehalics | کدهالیک
🙏1
اگر خودتون یا دوستانتون جویای کار در پوزیشن های شغلی زیر هستید به ایشون پیام بدید

@N_aprr


-Senior Frontend Developer
-Senior FullStack Developer ( PHP - Vue - React )
-Staff Enginner
-Technical Product Manager (TPM)
-Senior Scrum Master
-Accountant

اینم از طریق جابینجاشون :
https://jobinja.ir/companies/bugloos/jobs/

@codehalics | کدهالیک
این پست درباره «سگارو» عه؛ کسی که هیچ‌کدوم از ما زحماتش برای اینترنت آزاد رو فراموش نمی‌کنیم.
متأسفانه به نظر می‌رسه این روزها تو شرایط سختی قرار گرفته. از اونجایی که خودش هم مشکلی با انتشار شماره کارتش نداره و پذیرای دونیت هست، خواستم این موضوع رو با شما در میون بگذارم.
می‌دونم که این روزها همه‌مون تو فشار و تنگنا هستیم، اما اگر مایل بودید، هر مبلغی – هرچند کوچیک – می‌تونه کمکی باشه تا شاید گره‌ای از کارش باز بشه.
من از طرف بچه‌های «کدهالیک» مبلغی رو برای حمایت ازش واریز کردم.
امیدوارم که خیلی زود حال همه‌مون بهتر بشه :)

لینک اصلی توییت :‌
https://x.com/pari_D_warrior/status/2046599257952505912?s=20

@codehalics | کدهالیک
7
دو تا پروژه خیلی خوب برای دور زدن فیلترینگ معرفی شده که خیلی محدود بعضی سایت هارو باز میکنه

https://github.com/masterking32/MasterHttpRelayVPN
یکی این پروژه هست که یوتیوب رو مث بنز براتون میاره بالا

و یکی هم این پروژه هست
https://github.com/patterniha/MITM-DomainFronting
که بعضی سرویس های گوگل رو براتون زنده میکنه ( مثل میت و کلندر و ...)

این دو تا پروژه داخل ReadMe اش کاملا توضیح داده که چطوری کانفیگ میشه و چطور میتونید ازش استفاده کنید



@codehalics | کدهالیک
9
کاری که قطعی ۵۵ روزه اینترنت با اکوسیستم استارتاپی کشور کرد :)))

@codehalics | کدهالیک
🤣8👍1🗿1