Аналитика Telegram-канала
Подписчики
635
Охват за 24 ч
102
ER за 24 ч
16,06%
Публикаций
222
Динамика подписчиков
7 дней
30 дней
6 месяцев
Больше
23 окт26 окт29 окт
Показаны последние 7 дней
Больше истории →
Охваты публикаций
20.1022.1022.1023.1025.1025.10
28
Средний охват
91
Лучший результат
Показаны 6 публикаций — последние в канале
Больше статистики →
Упоминания
33
Упоминаний
14
Из них репостов
9
Каналов
111
Упоминаний
88
Из них репостов
23
Каналов
Последние посты
3 из 222 2 из 222خب این بحثی که مهدی توی گروه شروع کرد، بهم بهانه داد که پست دوم رو بنویسم :)
الگوهای طراحی (Design Patterns)
توی پست قبلی یک ریپازیتوری گیتهاب درباره دیزاینپترنها معرفی کردم. انتخاب زبان برنامهنویسی مستقیماً به الگوی طراحی ما ربط داره؛ فعلاً همین رو در نظر داشته باشید تا در پستهای بعدی تخصصیتر بازش کنم و توضیح بدم.
ابزار ما چیه؟ (نوشتن Spec)
قبل از کدنویسی باید با جواب دادن به چند سوال، Spec پروژه رو بنویسیم (کاری که از قدیم اولین قدم توسعه اصولی بوده و امروزه توی کار با AI هم زیاد میشنوید؛ چه توی Notion بنویسیدش چه هر ابزار دیگهای):
۱. ابزار ما چیه ؟ پسورد منیجر CLI
۲. قرار چیکار کنه ؟ در سریعترین زمان پسورد ها رو ذخیره و بازیابی کنه.
۳. چطوری این کار رو انجام میده ؟ نام نرم افزار یا یوزرنیم کاربر رو میگیره و پسورد مناسب رو تولید میکنه یا از کاربر میگیره و ذخیره می کنه.
۴. آیا GUI داره ؟ اگه CLI اصولی نوشته بشه، در هر بستری (حتی به عنوان هسته یک GUI) قابل استفادست.
۵. چه ویژگی هایی داره ؟ باید ویژگیهای یک CLI استاندارد رو داشته باشه.
۶. قابلیت های مورد انتظارمون چیه ؟ دستوری برای ذخیره، واکشی و امنیت مناسب داشته باشه و بدون کوچکترین لگ توی شل اجرا بشه.
خصوصیات یک نرمافزار CLI خوب چیه؟
سرعت بالا: باید زیر ۳ تا ۱۰ میلیثانیه جواب بده این بیشتر از هر چیزی برای کاربرنهایی به چشم میاد.
ساختار درختی: دستورات باید یکپارچه باشن؛ مثلاً اگه pass print داریم، دستور بعدی نباید passctl get key باشه، بلکه باید pass get key باشه.
تفکیک اجزا (استاندارد POSIX و Unix): طبق پازیکس برای api ها و یونیکس برای فایل ها، هر بخش فقط باید یک کار رو درست انجام بده و همهچیز فایلمحور مدیریت بشه. یعنی اگر با زدن pass get، وارد کلاسی بشه که به ۲۳ فایل دیگه وصل میشه، هم اجرای ۳ تا ۱۰ میلیثانیه غیرممکن میشه و هم برای خوندن یک دیتابیس کوچیک، به اندازه یک نرمافزار بزرگ رم اشغال میکنیم! از سمتی درصورت وجود مشکل یا باگ باید کل این ساخت دار رو برسی بکنیم، در صورتی که در معماری درست، pass get فقط فایل get رو اجرا میکنه، دیتابیس رو با کلیدش میخونه و خروجی میده.
خب حالا میریم سر خونه اول! پس زبان مناسب چیه؟
حالا که فهمیدیم ابزاری که نیاز داریم چیه، قراره چیکار کنه و دیزاینِ سیستم پیادهسازیش چیه (توی این نرمافزارهای ترمینالی معمولاً از Command Pattern استفاده میکنیم)، وقت انتخاب زبانه.
که این با چند تا سوال راحت جواب داده میشه:
کدوم زبان رم کمی مصرف میکنه یا خودش همیشه توی رم حضور داره؟
کدوم زبان کمتر از ۱۰ میلیثانیه به ما جواب میده؟
و در نهایت کدوم زبان در اجرای اولیه حجم زیادی برای فایلهاش لازم نداره و اجازه میده هر دستور رو به یه فایل اجرایی یا اسکریپتِ کاملاً مستقل تبدیل کنیم؟
این ۳ مورد توی گزینه های ما هستن که این شرایط رو دارن:
۱. C
۲. Rust
۳. Python
زبان C: همون زبونیه که قدیم و حتی همین الان بیشتر ابزارهای استاندارد شل رو با همین فلسفه باهاش نوشتن (مثل ساختار اصلی Git). دلیلش هم مشخصه؛ فوقالعاده کمحجمه، در کمتر از ۳ میلیثانیه از روی دیسک اجرا میشه و اجازه میده به جای لود کردن کدهای اضافه، چندین مینیباینریِ مجزا که از طریق یک باینری واحد فراخوانی میشن داشته باشید.
زبان Rust: دقیقاً همون سرعت و معماریِ مینیباینریهای C رو میده، اما با این تفاوت که از نظر ردپای حافظه (Memory Safety) بسیار ایمنتر شده (که برای ابزاری مثل پسورد منیجر حیاتیه)، کتابخونههاش هر روز در حال رشده و کدنویسی و مدیریت این مینیباینریها توی اون از C سادهتره (حداقل برای من).
زبان Python: توی لینوکسها مدرن پایتون خودش همیشه با سیستمعامل بالا میاد و از قبل توی رم هست (و فقط در صورتی دوباره فراخوانی میشه که دستور رو بهجای Shell Integration مستقیم با python ران کنی). پس اجرای یه دستور با پایتون، اجرای یه باینری از روی دیسک نیست؛ اینجا NO fork/exec اتفاق میفته! یعنی هر فایلِ دستور به صورت مستقیم با یک شل تعاملی اجرا میشه؛ درست انگار یه فایل رو توی برنامهت ایمپورت کردی یا یه فانکشن داخلی رو صدا زدی که در کمتر از چند میکروثانیه (طبق بنچمارک من ۰.۰۷ میلیثانیه) دستور شما جواب میده.
⚜️ نکته طلایی : وقتی میخواید با C یا Rust ابزار شل بنویسید، بهترین روش برای تفکیک وظایف اینه که قید یک برنامه غولپیکر و یکپارچه رو بزنید و سراغ ساخت مینیباینریها (Mini-binaries) برید؛ یعنی برنامههای کوچیک و مستقلی که هر کدوم فقط و فقط یک کار رو به بهترین شکل انجام میدن. توی این معماری، دستور اصلی شما (مثلاً pass) فقط یه هدایتگر سبکه که مینیباینریِ مربوط به همون دستور (مثل pass-get یا pass-insert) رو صدا میزنه
@LinAcademy
ещё
5
0
25 окт, 18:36
https://youtube.com/shorts/KvJH95VF-DA
ещё
1
0
25 окт, 13:06
بچه ها این Repo از گیت هاب برای توسعه نرم افزار بشدت مهم، دوستان ازم درخواست کردن که آموزش بذارم درمورد معماری نرم افزار
شروع درک معماری نرم افزار درک مهم بودن دیزاین پترن هاست
لینک زیر رو مطالعه کنید.
https://github.com/3lf/design-patterns-for-humans
@LinAcademy
ещё
9
1
23 окт, 23:42
Продолжить анализ этого канала
- История роста подписчиков
- Просмотры и охваты публикаций
- Кто упоминает канал и кого упоминает он
- Похожие каналы и подбор для рекламы
Открыть аналитику
Демо до 14 дней