Authentication
این که مفهمیم کدوم یوزره
Authorization
بعد این که فهمیدیم کدوم یوزره ، ببینیم چه دسترسی هایی داره
JWT (JSON Web Token)
یه Token Format هست و عموما stateless هست و سمت سرور هیچ چی ذخیره نمیشه و تنها از طریق secret-key اعتبار سنجی میشه و نقطه ضعف هایی داره ، مثلا logout نداریم ، یکی دیگه از نقطه ضعفاش اینه که برخلاف oauth2 اینه که رفرش توکن نداره ، حالا در نظر بگیرید اگه طول expiration کوتاه باشه ، رفرش توکن خودمون باید داشته باشیم و پیچیدست و اگه طول رو بالا ببریم در این صورت logout نداریم و باید خودمون یه روشی ابداع کنیم و فرمت به این صورت هست : header.payload.signature نکته خیلی مهم : اینه که jwt رمز نگاری نشده بلکه به base64 دیکد شده و اصلا نباید اطلاعات مهمی توی پیلودش ریخت
Session
توکنی که سمت سرور ذخیره میشه و با هر بار درخواست چک می شه ، بدیش اینه که هر بار باید از تو استوریج چک بشه و یه درخواست به استوریج بزنیم
خوبیش اینه که تنها یه توکنه و برخلاف jwt توی پیلودش دسترسی ها نیست و تقریبا سایزش ثابته
JWT vs Session
سشن استیت فول هست ، یعنی توی سرور ذخیره میشه و هزینش بیشتره ولی فیچر هایی داره که بالا مقایسه کردیم اما jwt سبک تره و نیاز به استوریج توکن نیست
Session vs Cookie
سشن توی سرور ذخیره میشه و میتونه اطلاعات بیشتری داشته باشه اما کوکی توی بروزر هست و اطلاعات کمتری مثلا فقط توکن رو ذخیره میکنه
RBAC (Role-Based Access Control)
یه مدل پریشن دادن به یوزر هست و میشه رول تعریف کرد و رول ها رو به چندین یوزر اساین کرد
ACL (Access Control List)
لیستی که هر یوزر یا پراسس میتونه دسترسی داشته باشه
ABAC (Attribute-Based Access Control)
Authorization based on attributes of user, resource, and environment (e.g., time, department).
یه سیستم احراز هویت بر اساس اتربیوت های یوزر مثلا
OAuth2
یک فریمورک هست که که اجازه میده یک یوزر از طریق یه اپ دیگه لاگین کنه و از یه اپ دیگه اکسس ، رفرش توکن میگیره مثلا وقتی می خوام لاگین کنیم بجای ریجستر خود سایت از اکانت گوگل یا گیتهاب لاگین می کنیم و اونجا هم لاگین میکنیم
Access Token vs Refresh Token
اکسس توکن عمرش کوتاهه و برای احراز هویته اما رفرش عمرش طولانی هست اما کاربرش برای دریافت جدید اکسس توکنه
SSO (Single Sign-On)
سیستمی که به کاربر اجازه میده یه بار لاگین کنه و در چندین سرویس دیگه دسترسی داشته باشه مثل دولت من
VoIp
تلفن اینترنی پروتوکلی برای انتقال صوت
UDS Unix domain socket
راهی برای انتقال داده بین سرویس هایی که در یک هاست وجود دارند ، توجه شود که یک پروتوکول نیست زیرا از شبکه کسی نمی توان به آن دسترسی پیدا کند
CMS Content management system
سیستم مدیریت محتوا یک نرم افزار کامپیوتری است که برای مدیریت ایجاد و اصلاح محتوای دیجیتال استفاده می شود. مثل ورد پرس
Erp . enterprise Resource Planning
به نرم افزار هایی که میشه بیزینس هایی که بخش های مختلفی دارن رو مدل سازی کرد و مدیریت کرد ، مانند انبار داری ، حسابداری ، ورود وخروج و حقوق دستمزد
upstream :
به معنی بالا دست میشه و زمانی به کار می ره که یک سرویس داره به سرویسی دیگه خدمات می ده و در صورتی که به مشکل بخوره سرویس داون استریم هم متوقف میشه
third pary :
همون شخص ثالثه و به سرویس یا سامانه ای می گن که هیچ وابستگی به اکوسیستم ما نداره و نسبت به سرویس ما و بیزینس ما ایزوله هست
supervisor :
یک ابزار برای مدیریت برنامه ها ، مثلا اگر کد پایتونی باید مدام اجرا شود و بعد از ارور یا اگزیت ، ران شود. می توان از این استفاده کرد. خیلی شبیه به docker-compose است یعنی هم میتوان گفت restart: always هم می توان نحوه ی ران شدن رو مشخص کرد ، تفاوتشونم توی اینه که اون با کانتینر ها سر و کار داره ولی سوپروایزر میتونه با چند پراسس یا برنامه اجرایی توی سیستم عامل کار کنه
type memory
- Stack
توسط cpu مدیریت میشه مانند استک پاپ و پوش داریم ، سرعتش از هیپ ریشتره چون دنبال حافظه خالی نیستیم، همیشه بالا خالیه ، اندازش ثابته بیشتر برای توابع و متغییر های محلی استفاده میشه ، چون مانند توابع ریکرسیو ، یا تابع خروجی رو ریترن می کنه و کارش تموم میشه و نیازی به متغییر هاش نیست و از حافظه پاپ می شه ، یا یه تابع دیگه رو صدا می کنه و تابع جدید در استک پوش میشه
توجه شود هر گوروتین استک خودش را دارد و با ۲ KB شروع میشود اگر حجم استک بیشتری بخواد ، runtime این بخش رو مدیریت کرده و به گوروتین اختصاص میده ، الگوریتمش به این روشه که دو برابر می ده ، محتوای قبلی رو کپی می کنه تو استک جدید ، همچنین GC وظیفه ی حذف استک را دارد همچنین گاهی runtime می تونه حجم استک رو Stack Shrinking کن تا اپتیمایز کنه
اگر این حجم بیش از حد بزرگ شه استک اور فلو میشه و پنیک میزنه
- Heap
توسط برنامه نویس مدیریت میشود و مربوط به runtime است .
بعد از اتمام توابع پاک نمی شود و خود برنامه نویس باید داده را پاک کند ، و در صورت پر شدن ، گاربج کالکتور پاکش میکنه.
اندازش داینامیکه. بعد از درخواست برنامه نویس برای تخصیص حافظه ، سیستم عامل دنبال اولین جای خالی میگرده آدرس اولین خونه رو به برنامه میده، داده های رشته ای یکجا نیستند و سیستم عامل بلاک های جدا برای ذخیره آنها استفاده میکند ،
Polling
این که توی بازه زمانی درخواست به ریپازیتوری بزنیم و زیاد جالب نیست
Webhook
به ریپازیتوری می گه این آدرس منه ، خبری شد به من بگو ، همچنین وب هوک یک تابع callback است که در http پیدا سازی شده
پس ریپازیتوری یا میزبانمون باید قابلیت وب هوک رو داشته باشه
memory leak
یعنی توی رم یه سری داده هستن که نه مثل استک خود به خود پاک میشه ، نه گاربج کالکتور می تونه اون رو شناسایی کنه و پاکش کنه ، با گذر زمان رم رو پر میکنه و برنامه میخوابه
مثلن اگه یه مپ داشته باشیم و کلید هاشو هر چند وقت یه بار پاک نکنیم ، یا یه کانکشن باز رو کلوز نکنیم ، هر چیز اوپن رو کلوز نکنیم
open api
به api هایی که در اختیار عموم قرار داده می شه و کاملن مشخص می شه نحوه ی استفاده از آن ، مثلن api های گوگل یا توییتر یا … . همچنین با استفاده از داکیومنت های OpenAPI Specification می توان استاندارد ها را رعایت کرد .
language-agnostic
بعضی از پکیج ها یا لایبری ها را که از گیت هاب می گیریم ، مهم نیست که از چه زبانی نوشته شده ، برای استفاده یه ساز و کار برای خودش داره ، مثلن با اینکه داکر رو با گو نوشتن ولی نیازی نیست دانش زبان گو داشته باشی
figma
یه ابزار برای طراحی ui/ux هست
plantuml
می توان به جای طراحی گرافیکی دیاگرام ها ، با کد های ساده ، دیاگرام های ساده تولید کرد ، خوبیش اینه تنها کافیه کد رو تغییر داد و اون رو اکسپورت کرد
Placeholder
به متغییر یا داده موقتی میگویند که در پوینتر یا مکانی ثبت می شود تا داده ی واقعی در آینده در آنجا بنشیند
DSN (Data Source Name)
همون استرینگ کانکشن است و برای اتصال به یه چیزی استفاده می شه
user:password@tcp(localhost:3306)/mydatabase
postgres://username:password@host:port/database
sematic check
گاهی اوقات در طول توسعه برنامه نیاز است که کدی را به صورت دستی بررسی و بازبینی کرد تا از صحت عملکرد آن اطمینان حاصل کرد. این فرایند را “سمانتیک چک” (Semantic Check) مینامند. در حقیقت سینتکست چک (Syntax Check) به بررسی درستی نحوی کد میپردازد، در حالی که سمانتیک چک به بررسی معنایی و منطق کد میپردازد.
backbone
در مهندسی نرمافزار به بخش اصلی یا دامین گفته میشود
tech talk
صحبت های فنی که برای اشتراک دانش یا آموزش یا بحث درباره موضوعات تخصصی برگزار میشود.
round robin
یه الگوریتم برای توزیع بار بین چند سرویس هست که به صورت دوره ای به هر سرویس درخواست ها رو ارسال میکنه.
Pay As You Go
به صورت کلی ۲ نوع پرداخت اینترنتی داریم ، در این مدل ما همان چیزی رو که می خواییم پرداخت می کنیم و هزینه ها بر اساس میزان استفاده محاسبه می شود. در مقابل، مدل اشتراکی وجود دارد ، در این مدل یا کیف پول داریم یا اشتراک ماهانه پرداخت می کنیم
offload
این اصطلاح به این معنیه که باری رو از یک سیستم یا یک بخش بر روی سیستم یا بخش دیگر بیندازیم
مثلن توی حوزه ی دیتابیس می شه با استفاده از کش یا پیاده سازی شارد یا رپلیکا ، دیتابیس رو آفلود کرد
مثلن توی گوشی های همراه برای آفلود کردن میشه یه سری از پردازش ها رو ریموت روی یه سری سرور یا ریموت انجام داد
pre-alpha - phase 0
در این مرحله کار هنوز شروع نشده و مسعولیت دولوپر بیشتر آنالیز و بررسی است و موارد زیر باید مشخص شود
endpoints(dto) - states - entities(domain) -
data streaming
زمانی که با یه مقدار - variable - خیلی بزرگ کار می کنیم ، یا یک فایل خیلی بزرگ می خواهیم داده از توش برداریم به جای اینکه کل مقدار رو توی مموردی بریزیم ، اون رو به بخش های کوچیک تقسیم می کنیم و بخشی از اون رو توی مموری لود می کنیم ، به این میگن دیتا استریمینگ .
اگر بخوایم عکس این عمل کنیم اصطلاحن می گن : Loading Entire Data
Tight Coupling
در معماری کامپوننت ها یا ماژول ها خیلی به هم وابسته اند و dependent به هم شده اند و در صورتی که بخواهیم تغییری داشته باشیم چندین اجزا هم نیاز به تغییر دارند در اینجا واستگی به انتزاع Abstracted نیست و نیاز مستقیم است
Loose Coupling
در این حالت کمتر به هم وابسته اند و تغییر کمتر نیاز به تغییر کامپوننت ها داره
می توان با استفاده از انتزاعات و وابستگی به اینترفیس ها این را پیاده کرد
Decoupling
به کارهایی که از وابستگی و پیچیدگی نیاز برنامه بکاهیم می گن ، در حقیق یه فعل و یه عملیات هست
توی اسکوپ سرویس و اینترنال یه کد استفاده از اینترفیس هاست
توی اسکوپ معماری و ارتباط بین سرویس ها Event-Driven خوبه استفاده شه تا وابسته به مسیج و ایونت باشن ، مثل در این حالت پابلیشر پیامشو میزاره توی بروکر بدون این که بدون کی می خواد بخونه و کانسومر می خوونه بدون اینکه بدونه کی گذاشته
توی اسکوپ سیستم دیزاین و معماری سیستم بهتره از میکروسرویس استفاده بشه
Side Effects
زمانی که ما داده رو خارج از پارامتر های فانکشن بدست میاریم ، مثلن از os.Getenv و یا context.Context در این حالت می گن side effect و باید dependency injection رو استفاده کنیم و وابستگی ها رو تا جای امکان از طریق ورودی های فانکشن بر طرف کنیم
file_system :
زمانی که بخواهیم برای ذخیره سازی به جای ذخیره بر روی cloud یا مکانی یگر، بر روی لوکال یا سیستم عامل ذخیره کنیم ، ازاین اصطلاح استفاده می کنیم
-
ذخیره مستندات پرووایدر : یکی از تجربیات من در مانی این بود که چند سال پیش یکی امضای دیجیتال زده بوده و باید داکیونتش رو مطالعه می کردیم ، ولی این پروایدر ، نسخه ی جدید داده بوده و قبلی دیگه پیدا نمی شد
-
apark - distributed computing system
یه ابزار برای پردازش و محاسبه real time است ، همچنین می توان ورودی استریم بکنه و پارالر پردازش کنه و خروجی بده
مثلن در هوش مصنوعی ، ساجسشن ها و تحلیل های لحظه ای در سایت ها استفاده میشه ، محاسبه ی قیمت کرایه ماشین در اسنپ
Linters in ide
کد ها رو پردازش و آنلیز می کنه و جاهایی که احتمال ارور یا وارنینگ داشته باشه ، شاید مموری لیک داشته باشه رو میگه ، اگر متغییری رو استفاده نکنیم و …
Tuning
بررسی در ساختار ها ، الگوریتم ها و کانفیگ ها در بهبود بخشیدن سرعت و کارایی سرویس ها ، برای مثال تیون کردن کوییری های دیتابیس و یا الگوریتم ها در مدل ماشین لرنینگ
ذخیرهسازی رویداد (Event Sourcing)
ذخیرهسازی رویداد (Event Sourcing) روشی است که در آن بهجای ذخیرهسازی وضعیت نهایی یک موجودیت، تمام رویدادهای (تغییرات) اتفاق افتاده برای آن موجودیت ذخیره میشود. این رویدادها باعث تغییر وضعیت سیستم میشوند و میتوانند تاریخچهی تغییرات را به طور کامل نگه دارند.
مثلن به جای ذخیره مبلغ کیف پول یک کاربر ، تمام تراکنش هایی که انجام شده رو ذخیره می کنیم
SaaS Software as a Service
برنامه ای که توی اینترنت روی یه سرور اجرا میشه ، مثلن فتوشاپه آنلاین ، با این که پردازش داره ولی روی اینترنت اجرا میشه ، خوبیا اینه که تنها نیاز به اینترنت داریم و روی هر چی مثل لپ تاپ و تبلت و کافی نت اجرا میشه ، بیزینس قابل کرک نیست ، نیازی به فورس آپدیت نیست ، شاید بشه چند یوزر استفاده کرد ، مثال ها :
Gmail, Outlook.com , Slack, Microsoft Teams , Trello, Asana
Post Mortem
معمولا بعد از این که سرویس ترکید یا یه مشکلی پیش اومد ، تاریخش ، دلیلش و نحوه ی ترابل شوت کردنش رو مستند می کنیم ، به این مستندات پست مورتم می گن
tl;dr - too long; didn’t
زمانی که طرف خلاصه یه چیزی میگه
code-first
گاهی اوقات یه بخشی از پروژه خارج از سرویس ما هست مانند دستورات دیتابیس که زبون گولنگ یا پایتون باید زبان sql بزنیم ، مثلن ORM یا cache ، در این حالت تصمیم میگیریم لاجیک و کار رو از کد خودمون خارج نکنیم و از طریق کد خودمون توی پروژه هایی که داریم این کار رو انجام بدیم ، به عبارت دیگه اول کد میزنیم ، سپس اسکیمای دیتابیس رو ایجاد میکنیم
دیگه دولوپر تنها باید روی کد های خودشان کار کند و کد های خارج از پروژه رو نگاه نکند ، نیازی نیست چندین ابزار مدیریت ، مستند و … شود
در برابر این راه Database-First هست که ابتدا توی دیتابیس اسکیما رو ایجاد می کنیم و بعد با استفاده از اون اسکیما ، کد های خودمون رو ایجاد می کنیم یکی دیگش Model-first است که اول کلاس ها ، انتیتی ها رو در بیزینس در نظر میگیریم و بعد کد و اسکیما رو میسازیم
boilerplate
به کدی می گیم که نیاز های عمومی یه سرویس جدید رو داره و برای لاجیک های اصلی یه مثال کوچیک داره .
حال به جای این که هر پروژه جدید رو شروع کنیم ، این بخش کد رو کپی می کنیم و در ادامه مدل ها و لاجیک رو می نویسیم
software as a service - saaS
بدون این که دانش برنامه نویسی داشته باشید می تونید اون سرویس رو بخرید مثل سایت shopify که می شه فروشگاه آنلاین داشت
edge case
در برنامه نویسی در خواست هایی هستند که شاید به ندرت رخ دهند و کمتر برای جلو گیری از آنها زمان میزاریم چون در موارد استسناع رخ میدهند ، مثلا زمانی که در خواست ورودی خیلی عجیب باشد یا در پردازش های خیلی سنگین ، اتفاقات نادری رخ دهد ، باید یه برنامه جوری تست نویسی شه که این ها هم تست شه
HA - High Availability
variable naming formats
-
Snake Case
provider_id -
Camel Case
providerId -
Pascal Case
ProviderId -
Kebab Case
provider-id
PREAPARED_STATEMENT
این روش برای پرفورمنس و حمله SQL injection attacks محافظت می کند ، اما خیلی از کتابخانه ها و orm ها پشتیبانی نمی کنند ، مثلن نمی توان dynamic array استفاده کرد همچنین از فانکشن های خوب sqlx دیگه نمی شه استفاده کرد
Golang integer type
می تونیم به چند روش، عدد درون تایپ اینت بریزیم ، توجه شود تمامی مقادیر ۱۵ هستند ،
-
۱۵___ دسیمال
-
اوکتال یا مبنای ۸ ___ 0o17 یا 017
-
هگز یا مبنای ۱۶ ___ 0xF یا 0XF
-
باینری یا مبنای ۲ ___0b1111
-
1.23e2 == 123.0
-
rune== int32
برای استفاده از utf8 هست و تمامی حروف زبان های جهان و کاراکتر ها در این هست