آشنایی با Clean Architecture : آشنایی با CQRS (قسمت هفتم)

قسمت اول : مقدمات
قسمت دوم : مبانی معماری
قسمت سوم : نگاهی به معماری سنتی سه لایه
قسمت چهارم : اجزای Clean Architecture
قسمت پنجم : پیاده سازی بر اساس سرویس ها
قسمت ششم : پیاده سازی بر اساس UseCase ها
قسمت هفتم : آشنایی با CQRS (شما در حال خواندن این مقاله هستید)


در این قسمت علاوه بر آشنایی با CQRS کتابخانه جالبی را خواهیم دید که به کمک آن نه تنها CQRS بلکه پیاده سازی بر اساس UseCase نیز برای شما ساده خواهد شد. قبل از هر چیز با پترن Mediator آشنا شویم.

فرض کنید چهار سرویس داریم که با هم در ارتباط هستند.

این پترن میگوید به جای اینکه این سرویس ها به این شکل به طور مستقیم به هم مرتبط باشند یک آبجکت میانی داشته باشیم به نام Mediator که سرویس ها فقط با آن در ارتباط هستند و فقط Mediator میتواند با سرویس ها به طور مستقیم در ارتباط باشد .

این مدل ارتباطی به کمک کتابخانه ی MediatR قابل پیاده سازی است. اساس کار Request/Response است و هر ریکوئست یک هندلر دارد که یک ریسپانس را ایجاد میکند.(عبارت ریکوئست و ریسپانس در این کتابخانه به لحاظ مفهومی استفاده شده است.)

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

اساس CQRS این است که کامندها و کوئری ها کاملا مسئولیت جدا دارند و پیاده سازی آنها نیز باید دارای این تفکیک باشد. MediatR و یا استفاده از UseCase ها ، مقدمه ای برای پیاده سازی CQRS هستند.

کنترلری را فرض کنید که endpoint های مختلف با متدهای مختلف دارد. میتوان این متدها را تفکیک کرد. آنچه اساسش فقط کوئریست و منجر به تغییر دیتابیس نمیشود با آنچه به اصطلاح command است فرق می‌کند. مثلا یک متد GET معمولا وظیفه کوئری گرفتن دارد و متدهای POST,PUT یا DELETE کامند محسوب میشوند چون تغییری روی دیتابیس اعمال میکنند.

در Mediator میتوانیم این تفکیک شدن را بر عهده همان آبجکت Mediator بگذاریم که هندلر مختص هر نوع ریکوئست را به آن نسبت دهد و استفاده کند.

ویژگی مثبت این روش این است که بخش کوئری و کامند کاملا نسبت به هم ایزوله هستند و میتوانیم از دیتابیس های مختلف برای این دو مسیر استفاده کنیم و نوشتن unit test راحت تر و بدون ساید افکت خواهد بود.

سه نوع CQRS داریم:

اولین نوع را Single-database میگوییم.
از یک دیتابیس ریلیشنال یا غیر ریلیشنال استفاده میشود.کامند ها از دامین برای تغییر state استفاده میکنند و نتیجه را از طریق لایه persistence در دیتابیس ذخیره میکنند که در دات نت معمولا از یک ORM مثل Nhibernate یا EF استفاده میشود.
کوئری ها به طور مستقیم توسط یک لایه سبک data access به دیتابیس وصل شده و به کمک مکانیزم هایی مثل linq یا اسکریپت های SQL یا حتا strored procedure دیتا را از دیتابیس دریافت میکنند.
این نوع CQRS که از یک دیتابیس استفاده میکند ساده ترین نوع است.

دومین نوع Two-database است که یکی برای نوشتن و دیگری یبرای خواندن است. دیتابیسی که برای نوشتن است برای همینکار بهینه شده. مثلا از یک دیتابیس non-relational استفاده می‌شود.
در سمت خواندن هم دیتابیس برای خواندن باید بهینه شود.
تغییرات روی دیتابیس نوشتنی، به دیتابیس خواندنی باید منتقل شود تا خواندن ما درست باشد.پس از یک پترن پایدارسازی دیتابیس باید استفاده شود. یعنی دو دیتابیس باید همیشه سینک باشند. شاید این روش پیچیده تر باشد اما پرفورمنس بالاتری دارد.

سومین نوع CQRS حالت event-sourcing است. که دراین حالت ما state فعلی entityها را در یک دیتابیس نرمالایز شده ذخیره نمی‌کنیم. ما فقط تغییرات entity ها در طول زمان را ذخیره میکنیم. تاریخچه ای از تغییرات را خواهیم داشت که به آن event store میگوییم. میتوانیم با مکانیزمی current state هر entity را در اختیار داشته باشیم.
این روش به ما کمک بزرگی میکند تا وضعیت یک object را در گذشته به راحتی پیدا کنیم و از آن میتوان به عنوان یک Logger نیز استفاده نمود چون جزء به جزء تغییراتِ state سیستم، در آن ثبت شده است. از آنجاییکه دیتا بصورت سریالایز شده ذخیره میشود، بارگزاری آن نیز با سرعت بالایی انجام خواهد شد.
این حالت پیچیده ترین نوع CQRS است، ولی بهینه ترین است.

فواید این روش چیست؟
– در معماری domain-centeric استفاده از CQRS باعث میشود کد های ما سازماندهی درستی داشته باشند و بخش خواندن و نوشتن جدا شود.
– بهینه سازی سمت کوئری یا کامند به طور جداگانه با توجه به نوع CQRS که انتخاب کردیم قابل انجام است.
– هر چقدر سیستم پیچیده تر باشد، این مزایا با ارزش‌تر خواهند بود.

معایب چیست؟
– بوجود آمدن این جداسازی بین کوئری و کامند باعث پیچیدگی نرم افزار میشود.
– اگر از حالت دو دیتابیسی استفاده کنیم پیجیدگی درسمت دیتابیس بیشتر میشود.
– اگر از حالت سوم استفاده کنیم هزینه و نگهداری بیشتری میطلبد.

در ادامه ساده ترین حالت CQRS را بررسی میکنیم.

ما معماری خود را به دو مسیر Queries و Commands تقسیم میکنیم. به این دو مسیر Query Stack و Command Stack میگوییم.
این جداسازی در لایه اپلیکیشن با همان Core صورت میگیرد.
توجه کنید که آنچه در کوئری باید بهینه سازی شود برای خواندن دیتا است و آنچه در بخش کامندز باید بهینه سازی شود برای نوشتن دیتاست. پس زیست متدهای این دو مسیر کاملا با هم متفاوت است.

کامندها رفتاری را در دامین مدل اجرا میکنند که از مسیر لایه persistence میگذرد در نهایت به نوشتن دیتا در دیتابیس منجر میشود.
کوئری ها دیتاهای مناسب را از دیتابیس دریافت میکنند و با فرمتی مناسب در اختیار لایه پرزنتر قرار میدهند.

در ادامه یک اکشن Post و یک اکشن Get را با این روش پیاده سازی میکنیم.

پکیج های MediatR و MediaR.Extensions.Microsoft.DependencyInjection را دانلود میکنیم.

خط زیر را اضافه میکنیم که به طور خودکار هندلر های ما اسکن و رجیستر شود.

میخواهیم یک endpoint برای گرفتن لیست تمام پست ها بنویسیم. طبیعتا مسیر Query را باید طی کنیم.

https://gist.github.com/b0dbec79955d2d9b0fd5adc1f0a95256

چیزی که نوشتیم نمونه ساختن از یک کلاس است که میتواند پراپرتی های آن پارامترهای ورودی اکشن باشد که فعلا برای سادگی، بی‌خیال شده ایم.
در لایه Core سه فولدر به نام Queries و Commands و Handlers درست میکنیم.
در فولدر Queries کلاس فوق را میسازیم که از IRequest مربوط به MediatR ارث بری کند و تایپ خروجی هم مشخص میکنیم.

https://gist.github.com/38f9f127358c0b2cc992fdc7b88c5b3b

حالا اینترفیس MediatR را به کنترلر اینجکت میکنیم.

آبجکت این اینترفیس متدهای send و publish دارد. ما از متد Send استفاده میکنیم که بر اساس روش Request/Response است که در ابتدای نوشته توضیح داده شد.

و در نهایت خواهیم داشت :

https://gist.github.com/aad98158cd1721091626c8e000e45bea

همه endpoint های ما چیزی شبیه همین خواهند بود.
حالا هندلر مربوط به این کوئری را مینویسیم.
در فولدر handlers فایل GetAllPostHandler را میسازیم.
به شکل زیر از IRequesHandler پیاده سازی می‌کنیم و ورودی/خروجی این کوئری را به شکل آرگومان به اینترفیس میدهیم.

https://gist.github.com/910592cde065fefe928f74583206b52e

حالا چیزهایی که این هندلر نیاز دارد را اینجکت میکنیم.

نکته مثبت این روش و روش UseCase ها که در مقاله قبل به آن پرداختیم این است که هر هندلر فقط اینجکت های مربوط به خودش را در خود دارد.

https://gist.github.com/7e8ebcfde9f7a601388527f0c12b4aa2

میتوانستیم از AutoMapper استفاده کنیم که تعداد خطوط کمتر شود.
تفاوتی که این روش با روش UseCase ها دارد این است که کنترلر ما به شکل صریح هیچ ارتباط با هندلر ها ندارد.
حالا میخواهیم یک آیتم به جدول post اضافه کنیم. به روش قبل متد اکشنی با نام add2 درست میکنیم. طبیعتا باید مسیر Command را طی کنیم.

https://gist.github.com/f6ff3bc04f07ce49d930e832f8cfa695

برای سادگی از ولیدیشن ورودی متد صرف نظر میکنیم و همان مدلی که قرار است به mediatR بفرستیم را از ورودی میگیریم. (بهتر است تایپ ورودی اکشن به شکل ویومدل باشد و با آرگومان ورودی هندلر تفاوت داشته باشد).

پیاده سازی این بخش در یک هندلر جدا به شکل زیر است که مسئول ثبت اطلاعات یا همان command است.

https://gist.github.com/7e46946a543bdb626333a010f14b6030

دقت کنید که در این روش مثل حالت UseCase ظرفِ پرزنتر نداریم و میتوانیم برای ساختاردهی به خروجی های apiها، از متدهایی در BaseController استفاده کنیم؛ این روش را در مقاله پیاده سازی به کمک سرویس ها بررسی کردیم و به جای Return OK یا Return BadRequest از متد کاستوم خودمان استفاده کردیم که در اینجا نیز کاربرد دارد.

با پیاده سازی دو متد Get و Post حالت کامند و کوئری را بررسی کردیم. داستان CQRS همیشه به این سادگی نیست و هدف از این مقاله و مقاله های قبلی فقط قدم گذاشتن در دنیای Clean Architecture بوده است.

برای دیدن پروژه مربوط به این مقاله از طریق Github مخزن مرتبط را ببینید.

نوشته آشنایی با Clean Architecture : آشنایی با CQRS (قسمت هفتم) اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

معرفی زبان برنامه‌نویسی Haskell

برای یک مسابقه برنامه‌نویسی یک سوال ساده طرح کردم که به راحتی قابل حل باشه ولی یک شرط مهم برا حل گذاشتم، برای حل تنها مجاز به استفاده از زبان Haskell هستید. اما چرا هسکل مهمه و چرا همچین تصمیمی گرفتم؟ در ادامه متوجه می‌شوید.

این روزها هرکس بخواهد برنامه‌نویسی را شروع کند، بین زبان‌های پایتون و سی و یا جاوا‌اسکریپت یا نهایتا جاوا و سی‌پلاس‌پلاس انتخاب می‌کند و برنامه‌نویسی رویه‌ای (procedural) و در ادامه شی‌گرا (Object Oriented) را یاد می‌گیرد و احتمالا در ادامه هم در همین بخش ادامه می‌دهد و فریم‌ورک‌های جدید و …

اما برنامه‌نویسی فانکشنال (functional programming یا FP) مورد غفلت واقع شده اما برنامه‌نویسی فانکشنال چی هست؟ به طور خلاصه یک پارادایم برنامه‌نویسی در مقابل برنامه‌نویسی رویه‌ای و شی‌گراست.

با توجه به قدمت برنامه‌نویسی رویه‌ای‌، زبان‌های‌ برنامه‌نویسی رویه‌ای زبان‌های پرقدمتی مثل FORTRAN و BASIC و C و COBOL هستند. این دسته از زبان‌ها متکی به صدا زدن procedure (روتین یا فانشکن) هستند که هر روتین مجموعه‌ای از دستورات است. در واقع کدها در قالب routine ها نوشته می‌شوند.

از بزرگان برنامه‌نویسی شی‌گرا می‌شود به جاوا و سی‌پلاس‌پلاس، سی‌شارپ و جاوا‌اسکریپت و .. اشاره کرد که مفاهیم برنامه‌نویسی شی‌گرا مثل ابجکت‌، کلاس‌، پنهان‌سازی(encapsulation)، وراثت(inheritance) و چندریختی(polymorphism) را پشتیبانی می‌کنند. در این پارادایم، کدها در غالب متد‌هایی برای اشیا نوشته می‌شوند و قابل فراخوانی روی هر شی (یا در مواردی روی کلاس) هستند.

اما زبان‌های فانکنشال مثل Haskell و #F و Erlang و elixir و Clojure روش فکری متفاوتی دارند! در این زبان‌ها کد‌ها در قالب فانکشن‌ها نوشته می‌شوند (مثل برنامه‌نویسی رویه‌ای؟) اما فانکشن‌ها شهروندان درجه‌اول در زبان هستند یعنی کار کردن با آن‌ها به راحتی کار کردن با متغیرهاست و امکان pass شدن و ترکیب شدن و .. را دارند.

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

ریشه و پایه‌ی زبان‌های فانکشنال، ‌lambda calculus است که ایده‌ی نوشتن function و حل مساله به روش بازگشتی را پایه گذاشت.

اما مفاهیمی که در زبان‌های فانکشنال با آن‌ها سرو کار داریم چه چیز‌هایی هستند؟

۱- فانکشن‌های مرتبه بالا‌(higher order function)‌ فانکشنی که یک یا چند فانکنش به عنوان ورودی بگیرد و فانکشن به عنوان خروجی بدهد، مثل انتگرال!

۲- فانکشن‌های خالص(pure function): تابع pure تابعیست که خروجی‌اش دقیقا از روی ورودی‌هایش ساخته می‌شود (مثل همه‌ی توابع ریاضی)، یعنی این تابع با بیرون از تابع و بقیه‌ی دنیا (به جز از طریق ورودی‌ها) هیچ ارتباطی ندارد و هیچ اثری هم روی بیرون از تابع (بقیه دنیا) نمی‌گذارد به جز محاسبه‌ی خروجی! به طور عملی‌تر هیچ متفیر گلوبالی وجود ندارد، کار با IO و تعامل با کاربر و هرگونه side-effectی وجود ندارد.

۳- توابع بازگشتی (recursive functions): توابعی که برای حل یک مساله، از حل زیر مساله‌هایی با ابعاد کوچک‌تر کمک می‌گیرند (مشابه استدلال استقرایی که f(n) را فرض می‌کنیم و برای f(n+1) اثبات می‌کنیم) برای حل مساله با اندازه k از همان تابع برای ورودی با اندازه k-1 (یا به هر صورتی کوچک‌‌تر از k) کمک می‌گیرند و با استفاده از آن، مساله را برای ورودی با اندازه k حل می‌کنند. البته یک شرط پایه (مثل پایه استقرا) نیز وجود دارد که برای اندازه k=1 است که جواب بدیهی دارد.

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

اما برگردیم به هسکل:

هسکل یک زبان فانکشنال است (جزو مطرح‌ترین زبان‌های فانکشنال است) ولی نه یک زبان فانکشنال معمولی، یک زبان purely functional است.

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

هسکل یک زبان تنبل (lazy) است. pure function ها به زبان امکان تنبلی (laziness) رو می‌دهند، تنبلی یعنی اینکه تا زمانی که واقعا به چیزی نیاز نداریم، برایش زمان و انرژی نگذاریم!

توی زبان برنامه‌نویسی به این معنیست که تا زمانی که به یک داده واقعا نیاز نیست، محاسبه نشود، این امر چطوری امکان‌پذیره؟ مقدار ها از توابع ساخته می‌شوند و توابع زبان هم همگی pure هستند پس تفاوتی ندارد که همان موقع که فراخوانی می‌شوند اجرا شوند و خروجی را آماده کنند یا هرموقع به خروجی‌شان واقعا نیاز بود!

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

اما همه‌ی این تفاوت‌ها و تغییر در پارادایم به چه علتی؟

در زبان‌های فانشکنال به جای how to do به what to do پرداخته می‌شود یعنی برنامه‌ای که نوشته‌ می‌شود به جزییات اتفاقات سطح پایین کاری ندارد و صرفا تصریح می‌کند از برنامه چه انتظاری داریم! فرض کنید یک لیست از اعداد زوج می‌خواهیم، در زبان‌های رویه‌ای باید یک حلقه بزنیم و دقیقا بدانیم تا کجا به اعداد زوج احتیاج داریم و برای هر عدد،‌ در صورتی که زوج بود باید به آرایه یا list اضافه‌اش می‌کردیم اما در زبان فانکشنال کافیست بگوییم یک لیست اعداد طبیعی رو فیلتر کن، چه فیلتری؟ فیلتری که زوج‌ها رو برگرداند.

یا فرض کنید میخواهیم بررسی کنیم که یک عدد، اول هست یا نه، کافیه یه لیست از اعداد ۲ تا n-1 بسازیم و به هسکل بگوییم که بر هیچ کدام بخش‌پذیر نباشد، با یک خط کد امکان پذیر است!

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

یک خصوصیت خوب دیگر این زبان‌ها قدرتشان در همزمانی (concurrency) است که به خاطر ذات immutable بودن داده‌ها و مستقل بودن هر تابع از دیگر قسمت‌های برنامه میسر شده است.

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

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

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

همچنین در این لینک می‌توانید توضیحات دیگری را بخوانید.

آموزش‌های شروع به کار خوب هسکل هم موارد زیر است:

https://learnxinyminutes.com/docs/haskell/

https://jeoygin.gitbooks.io/learn-y-in-x-minutes/content/haskell.html

https://wiki.haskell.org/Learn_Haskell_in_10_minutes
https://www.tutorialspoint.com/haskell/index.htm

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

نوشته معرفی زبان برنامه‌نویسی Haskell اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

الگو‌های ری اکت – ۲

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

تو این مقاله قصد دارم الگوهای ری اکت رو با بیان ساده شرح بدم . این مقاله برداشت آزادی از سایت الگوهای ری اکت است.

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

قسمت اول این نوشته:

https://virgool.io/@novonimo/الگوهای-ری-اکت-قسمت-۱-hk9v5jbfalqa

سرفصل های این قسمت:

Children types , Array as children , Function as children , Render prop, Children pass-through

الگوهای ری اکت

استفاده از Children types

ری اکت پراپس ویژه ای به اسم children داره. این پراپس میتونه انواع نوع داده رو رندر کنه.

اینجا نوع رشته رو داره رندر میکنه:

نوع رشته

و در اینجا از نوع لیست استفاده کردیم:

نوع لیست

Array as children

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

استفاده از لیست برای رندر کردن آیتم ها

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

استفاده از لیست برای رندر کردن آبتم ها


استفاده از Function as children

متاسفانه کامپوننت های ری اکت از توابع به عنوان children پیشتیبانی نمی‌کنند. اما با استفاده از render prop می‌تونیم کامپوننت هایی رو بنویسیم که از تابع به عنوان children استفاده می‌کنند.

استفاده از Render prop

برای مثال فرض کنید یک تابع به اسم Width داریم:

تابع width

این تابع یک children به عنوان تابع رو ورودی میگیره و اون رو مثل کالبک صدا میزنه ( البته با آرگومان ۵۰۰)

حالا اینجا میخواهیم ازش استفاده کنیم:

استفاده از تابع width

که این خروجی رو داره:

خروجی تابع width

با این ویژگی میتونیم رندر شرطی هم بنویسیم:

رندر شرطی به عنوان children


همچنین مطالعه کنید:

http://vrgl.ir/cpSJu

استفاده از Children pass-through

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

کامپننت عبور دهنده context

خوب اولین چیزی که به ذهنمون میرسه استفاده از یک div هست و یا حتی از <> که به fragment مشهور هست. و یا اینکه خود children رو بدون قرار دادن div اضافی return کنیم:

راه های رندر کردن children

خوب پس راه درستش چیه ؟‌ ری اکت برای اینکار روش مخصوصی داره. استفاده از only به این شکل:

راه درست رندر کردن children توسط یک کامپوننت context


سایر مقاله های من در ویرگول:

https://virgool.io/@novonimo/معرفی-۱%DB%B0-فریمورک-برتر-nodejs-در-سال-۲%DB%B0۱۹-du9adlrxeyvx
https://virgool.io/iran-react-community/ری-اکت-رو-قورت-بده-۱-u8t5ysweyxyj
https://virgool.io/@novonimo/آموزش-مقدماتی-دارت-dart-قسمت-۱-vrd1jjuoble1

Follow me on social media
Telegram
Facebook
Twitter
Linkedin
Virgool

نوشته الگو‌های ری اکت – ۲ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

بیایم خاله خرسه نباشیم

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

مدتیه که توی گروه های دوستانی عضوم که تازه میخوان برنامه نویسی یاد بگیرن و سوالاتی دارن در سطح خودشون. خیلی خوبه اما دوتا مسئله این وسط هست. یکی خواهش برای نوشتن کد براشون و دوم نوشتن کد و تحویل دادن به دوستان!

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

شک نکن فرداشم وقتی دو نفر تحویلش گرفتن تو روت وای میسته که چیکار کردی مگه؟ هیچی بلد نبودی!

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

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

بیایم خیانت نکنیم به خودمون و آینده ی مملکتمون و بچه هامون.راهنمایی کنیم اما دوستی خاله خرسه نکنیم. مهربون باشیم و کمک کنیم. همین. بذاریم ذهنشون جستجو کنه. خلاق باشه. ورز بیاد و قوی بشه.

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

یادمون نره :

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

بیایم از خودمون شروع کنیم !

نوشته بیایم خاله خرسه نباشیم اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

لطفا مزایا و معایب پلتفرم Node.Js رو بگید اگه کار کردین ؟

سلام

خسته نباشید

لطفا مزایا و معایب پلتفرم Node.Js رو بگید اگه کار کردین …

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

نوشته لطفا مزایا و معایب پلتفرم Node.Js رو بگید اگه کار کردین ؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

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

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

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

۱.بروی IDE ها کار کنید

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

۲.کد نویسی تمیز را تمرین کنید

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

۳.بروی پروژه های Open-source مشارکت کنید

در نظر بگیرید پروژه باگ دار شخصی را از github گرفته و بروی آن کار کرده و خطا های آن را حل کنید یا پروژه های خود را که Bug دارند در Github قرار داده و به دیگران بگویید با شما مشارکت کنند تا بتوانید آن مشکل ها را حل کنید.

۴.الگوهای طراحی (Design Patterns) جاوا را یاد گیرید

Design Patterns یکسری الگوی خاص طراحی هستند که در زمان کار با پروژه و آپدیت پروژه فعلی مورد استفاده قرار می گیرند مثلا زمانی که ۳ نوع Design Patterns مثل Factory , Decorator و Facade را شنیدید بدونید درباره چی در حال بحث هستید.(دوره آموزش جامع برنامه نویسی جاوا).

۵.کد نویسی تمیز را تمرین کنید

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

۶.یاد بگیرید چه گونه از کاتلین استفاده کنید

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

۷.کدهای دیگران را بخوانید

اغلب برنامه نویسان حوصله خواندن کدهای دیگران را ندارند و سعی می کنند همان چیز را با استفاده از دانش خود پیاده سازی کنند ولی این کار خیلی بیهوده است ولی با این کار شما توسعه دهنده نمی شود توسعه دهنده باید حوصله تمام نشدنی ای داشته باشد. شاید بپرسید چه کدهایی را مطالعه کنیم از کتاب خانه یا پروژه های Open Source شروع کنید روزی حداقل ۳۰ دقیقه کدهای دیگران را خوانده و آنها را تجزیه و تحلیل کنید.

۸.بهترین سیستم را تهیه کنید

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

https://codefriend.ir/2019/12/13/نکات-مهم-برای-تبدیل-شدن-به-برنامه-نویس-ا/

نوشته نکات مهم برای تبدیل شدن به برنامه نویس اندروید اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

چگونه برنامه نویسی اندروید یاد گرفتم؟

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

خوب یادمه که فک کردم چطوری یاد بگیرم تا اینکه یه ایده ای به ذهنم رسید. با کارآفرینی دانشگاه روابط خوبی داشتم و یبار یکی از مسئولینش گفت فلانی نمیخوای توی تابستون دوره ای ارائه بدی؟ منم گفتم چرا نمی خوام، دوره تدریس 3D Max (یه نرم افزار طراحی سه بعدی) و تدریس اندروید رو ارائه می دم!

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

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

گفتم ایول این از جلسه اول. خلاصه فردا رفتیم و با اعتماد به نفس کامل شروع کردم تدریس و اون بخش هایی رو که یاد گرفته بودم رو یاد دادم! =)) خلاصه اون جلسه به خوبی و خوشی تموم شد و گفتم جلسه بعد بخش های اولیه رو توضیح میدیم.

عصر روز قبل جلسه دوم من داشتم توی سایت اینترنت دانشگاه با لپتاپم کار می کردم (در حقیقت ول می چرخیدم برا خودم) که یهو یادم افتاد باید برم یه جایی (یادم نیست الان). خلاصه رفتمو وقتی برگشتم دیدم بععلهه سایت دانشگاه بستس و همه رفتن و لپتاپم موند اونتو!! گفتم یا خدا من فردا ۸ صبح کلاس اندروید دارم و همه مطالب اموزشیم اونتوعه. به معنای واقعی به چُخ رفته بودم…

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

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

اینطوری بود که من تو ۲ ماه اندروید رو یاد گرفتم و یاد دادم و یادمه اولین اپی رو هم که تو کافه بازار گذاشتم دو ماه بعد از اولین جلسه کلاسم بود.

خلاصه اینکه “اگه می خواین چیزی رو بدست بیارین و واسه انجامش منتظر مقدمات هستین، بیخیال مقدمات بشین و خودتونو بندازین تو دلش” و تو عمل انجام شده قرار بگیرین، اینطوری به خودتون اعتماد می کنین و سعی می کنین از مخمصه خلاص بشین.

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

نوشته چگونه برنامه نویسی اندروید یاد گرفتم؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آیا رشته کامپیوتر بخوانم ؟

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

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

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

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

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

معایب از نظر من :

دیگه همه از تو نا امید می شوند . همه با چشم یک بچه ضعیف بهت نگاه می کنند . و بد تر از همه باید برای همه اثبات کنی که رشته خوبی را انتخاب کردی (البته اگه برات مهم باشه). همه ازت میترسن .

محاسن از نظر من :

همه یه روز بهت نیاز پیدا خواهند کرد (حتی دشمنات )

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

همه این مطالب فقط نظر من برای یک دانش آموز 15 ساله می باشد نه به خودتان بگیرید و قضاوت کنید >>>

نوشته آیا رشته کامپیوتر بخوانم ؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

انواع داده در پایتون

در دنیای برنامه نویسی انواع داده از مسائل پایه ای و بسیار مهم است و تقریبا تمام زبان‌های برنامه نویسی به نوعی از data type استفاده می‌کنند. متغیرها می‌توانند انواع مختلفی از داده را ذخیره کنند و این انواع مختلف می‌توانند کارهای مختلفی انجام دهند. زبان پایتون نیز از دیگر زبان‌های برنامه نویسی جدا نیست و به صورت پیش فرض از نوع داده‌های زیر پشتیبانی می‌کند:

  • انواع متنی: تنها یک نوع str (یعنی رشته)
  • انواع عددی: int (عدد صحیح) و float (عدد اعشاری) و complex (بعدا در مورد آن صحبت می‌کنیم)
  • انواع توالی: list و tuple و range
  • انواع mapping: تنها یک نوع dict
  • انواع دسته: set و frozenset
  • انواع Boolean: تنها مقدار bool
  • انواع باینری (دودویی): bytes و bytearray و memoryview

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

برای پیدا کردن نوع داده‌ی یک متغیر می‌توانیم از تابع ()type استفاده کنیم:

x = 5
print(type(x))

مقدار خروجی بدین شکل خواهد بود:

در زبان پایتون هنگامی که به متغیری مقدار بدهید، data type آن به صورت خودکار تنظیم می شود. به طور مثال:

x = "Hello World"

#display x:
print(x)

#display the data type of x:
print(type(x))

خروجی این کد عبارت <'class 'str> خواهد بود.

مثال دیگر:

x = 20

#display x:
print(x)

#display the data type of x:
print(type(x))

خروجی این کد نیز <'class 'int> خواهد بود.

ما می‌توانیم این کار را با تمامی انواع داده انجام دهیم:

x = 20.5
x = 1j
x = ["apple", "banana", "cherry"]
x = ("apple", "banana", "cherry")
x = range(6)
x = {"name" : "John", "age" : 36}
x = {"apple", "banana", "cherry"}
x = frozenset({"apple", "banana", "cherry"})
x = True
x = b"Hello"
x = bytearray(5)
x = memoryview(bytes(5))

با این حال اگر نیاز به تعیین نوع داده به صورت دستی داشته باشید، زبان پایتون توابعی با نام data type‌ها را برای شما آماده کرده است. به طور مثال:

x = str("Hello World")
x = int(20)
x = float(20.5)
x = complex(1j)
x = list(("apple", "banana", "cherry"))
x = tuple(("apple", "banana", "cherry"))
x = range(6)
x = dict(name="John", age=36)
x = set(("apple", "banana", "cherry"))
x = frozenset(("apple", "banana", "cherry"))
x = bool(5)
x = bytes(5)
x = bytearray(5)
x = memoryview(bytes(5))

اگر روی هر کدام از مثال‌های بالا از تابع ((print(type(x استفاده کنیم حتما نتیجه همان نوع داده‌ای خواهد بود برایش تعیین کرده ایم.

اعداد در پایتون

در زبان پایتون سه نوع عدد وجود داریم:

  • int
  • float
  • complex

با int شروع می‌کنیم؛ int مخفف integer و به معنای عدد صحیح است، یعنی عدد مثبت یا منفی و بدون اعشار تا بی‌نهایت. چند مثال را در کد زیر می‌بینید:

x = 1
y = 35656222554887711
z = -3255522

print(type(x))
print(type(y))
print(type(z))

خروجی این کد به صورت زیر خواهد بود:



نوع دوم اعداد float است که با نام floating point number هم شناخته می‌شوند و در فارسی معادل اعداد اعشاری هستند؛ بنابراین اعداد منفی یا مثبت با اعشار و تا بی‌نهایت. چند مثال را در کد زیر مشاهده می‌کنید:

x = 1.10
y = 1.0
z = -35.59

print(type(x))
print(type(y))
print(type(z))

خروجی این کد به شکل زیر خواهد بود:



نکته: اعداد float می‌توانند نماد e را نیز قبول کنند (به معنای «به توان 10»):

x = 35e3
y = 12E4
z = -87.7e100

print(type(x))
print(type(y))
print(type(z))

خروجی این کد ها به شکل زیر است:



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

“عدد مختلط یا عدد هم‌تافت عددی به شکل a + bi است که a و b اعداد حقیقی‌اند و i یکهٔ موهومی با خصوصیت i2 = -1 است. عدد a قسمت حقیقی و عدد b قسمت موهومی نامیده و نوشته می‌شود. اعداد حقیقی را می‌توان به عنوان اعداد مختلط با قسمت موهومی صفر در نظر گرفت، یعنی عدد حقیقی a معادل است با عدد مختلط a+0i.” منبع: ویکی پدیا

در زبان پایتون حرف j به عنوان قسمت فرضی عدد در نظر گرفته می‌شود. چند مثال را مشاهده کنید:

x = 3+5j
y = 5j
z = -5j

print(type(x))
print(type(y))
print(type(z))

خروجی:



تبدیل نوع (type conversion)

شما می‌توانید اعداد را با استفاده از توابع ()int و ()float و ()complex به نوع داده‌ی مورد نظر خود تبدیل کنید:

#convert integer to float
x = float(1)
#convert float to integer
y = int(2.8)
#convert integer to complex
z = complex(x)

print(x)
print(y)
print(z)

خروجی:

1.0
2
(1+0j)

هشدار: شما نمی‌توانید اعداد complex را به نوع عددی دیگری تبدیل کنید.

تولید عدد تصادفی

زبان پایتون تابعی به نام ()random برای تولید اعداد تصادفی ندارد اما module ای به نام random دارد که می‌ از آن برای تولید اعداد تصادفی استفاده کنیم. ابتدا باید این module را import کرده و سپس از آن استفاده کنیم. در کد زیر می‌خواهیم یک عدد تصادفی بین 1 و 9 تولید کنیم:

import random

print(random.randrange(1,10))

خروجی این عدد در هر بار یک مقدار تصادفی بین 1 و 9 خواهد بود. در جلسات پایانی این دوره در مورد این module توضیحات بیشتری خواهیم داد.

منبع: https://bit.ly/2YRj3kl

برای مطالعه پست‌های بیشتر ما را در وبلاگ کارادمی و یا در ویرگول دنبال کنید.

نوشته انواع داده در پایتون اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

توییتر در تدارک یک «استانداردِ بازِ نامتمرکز» برای شبکه‌های اجتماعی است

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

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

برای درک بهتر ماجرا، می تونین به همون مفهوم ایمیل رجوع کنین. ما در ایمیل یک پروتکل عمومی داریم که همه قبولش دارن (مثلا SMTP) و هر کس می تونه با استفاده از هر سرور یا کلاینتی، ایمیل خودش رو بسازه. حالا اگر من از jadi@jadi.net یه ایمیل بزنم به jadijadi@gmail.com، سرور من متوجه می شه که این روی سرور gmail.com است، به اونجا وصل می شه و با همون پروتکل استاندارد به gmail.com می گه که یه ایمیل برای یوزر jadijadi داره و تحویلش می ده. این مساله کاملا مستقل از اینه که من از چه برنامه ای برای سرور یا کلاینت ایمیلم استفاده می کنم و این سرورها هر کدوم چند تا یوزر دارن و بقیه موارد.

در نمونه مشابه، اگر یک پروتکل استاندارد باز برای شبکه های اجتماعی موجود باشه، کافیه من یک سرور منطبق با اون رو راه اندازی کنم و بتونم توش پست بنویسم و هر کسی که توی هر شبکه دیگه ای منو فالو می کنه، آپدیت من رو خواهد دید و می تونه بهش ریپلای بزنه و … در واقع این مفهوم «من تو توییتر هستم و تو توی فیسبوک پس نمی تونیم با هم گپ بزنیم» بر طرف می شه، درست همونطور که الان اگر من توی یاهو باشم و شما تو جیمیل، می تونیم به هم ایمیل بزنیم. در اون دنیا، کافیه شما توی یکی از این شبکه ها باشین (مثلا jadi@twitter.com) و هر کس از هر شبکه دیگه می تونه اکانت شما رو دنبال کنه و نوشته های شما رو توی کلاینت خودش ببینه و به شما جواب بده.

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

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

نوشته توییتر در تدارک یک «استانداردِ بازِ نامتمرکز» برای شبکه‌های اجتماعی است اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی