اریک اوانس در این کتاب میگوید: « قلب هر نرمافزار، توانایی آن در حل مشکلات مربوط به دامنه برای کاربران است؛ سایر ویژگیها، هرچقدر هم که اساسی و حیاتی باشند، از این هدف اصلی تبعیت میکنند.»
اصول اساسی در طراحی دامنهمحور:
در واقع، طراحی دامنهمحور برای توسعۀ نرمافزارهایی است که قرار است جایگیزین فرآیندها و سیستمهای دنیای واقعی شوند و رویکرد DDD بر اساس قواعد و اصول زیر طراحی شده است:
- تمرکز روی دامنۀ اصلی:
قبل از اینکه شروع به کدزدن کنید، با افرادی که در آن دامنه فعالیت میکنند صحبت کنید. آنها میتوانند برای تعریف تمام فرآیندها، روالها و واژگانی که در آن دامنه بهکار میروند، به شما کمک کنند. برای مثال اگر قرار است یک نرمافزار برای مدیریت موجودی یک فروشگاه خردهفروشی طراحی کنید، بهتر است با کسانی که موجودی فروشگاه را مدیریت میکنند صحبت کنید تا اینکه با مدیر منابع انسانی یا مدیرمالی فروشگاه وارد مصاحبه شوید.
- کاهش پیچیدگی با تکیه بر طرحها و مدلهای دامنه
زمانی که متوجه دامنۀ کسبوکار شدید، مدلی را ایجاد کنید که بازتابی از دامنۀ کسبوکار در دنیای واقعی باشد. برای مثال اگر خواستید برای همان فروشگاه خردهفروشی نرمافزاری طراحی کنید، مدل مدیریت موجودی شما باید شامل ویژگیهایی باشد که برای مدیران اجرایی مهم هستند؛ مثلاً باید شامل تجزیه و تحلیل میزان موجودیها، اسکن بارکدها و … باشد. منظور از مدل، یک نمودار، چارت یا پاراگراف است که نحوۀ سازماندهی فرآیندها و دستورالعملها را منطبق با نگاه یک متخصص آگاه در آن حوزه، نمایندگی میکند.
- صحبتکردن به یک زبان مشترک:
اریک اوانس در کتاب خود، از میزان اهمیت زبان فراگیر و مشترک صحبت میکند؛ او میگوید همۀ افراد درگیر در پروژه باید از یک زبان برای صحبت در مورد دامنه استفاده کنند. پس خیلی اهمیت دارد که شما به کلمات و عباراتی که کارشناسان دامنۀ شما از آنها استفاده میکنند گوش بدهید و همان اصطلاحات را در اسناد موردنیاز خود، در مدل و در خودِ کدها بهکار ببرید.
مزایای طراحی دامنهمحور
اصلیترین مزیت این رویکرد دامنهمحور در طراحی، این است که باعث میشود که همه از یک زبان مشترک استفاده کنند؛ زمانی که تیمهای توسعه از همان عبارتهایی استفاده کنند که کارشناسان هر دامنه از آن استفاده میکنند، نتیجه این خواهد شد که طراحی نرمافزار برای کاربر نهایی نتیجۀ مطلوبتری داشته باشد و کاربر نهایی بتواند با آن ارتباط برقرار کند؛ چرا که واژگانی که در یک نرمافزار بهکار میروند قرار است که فعالیتهای دنیای واقعی را نمایندگی کنند و این زبان مشترک باعث خواهد شد که ابهام استفاده از نرمافزار کمتر شود و کاربرها سریعتر متوجه شوند که چگونه میتوانند از نرمافزار بهبهترین شکل ممکن استفاده کنند.
مزایای دیگر استفاده از رویکرد DDD:
- همراستا شدن کسبوکار و توسعۀ نرمافزار:
از آنجایی که توسعهدهندگان نرمافزار از زبان یکسانی استفاده میکنند، میتوانند ارتباط بیشتری برقرار کنند و درک بهتری از ارتباط با تیم تجاری داشته باشند؛ این همراستاشدن، خطر سردرگمی و ایجاد سوءتفاهم بین تیم توسعه و کارشناسان و سایر ذینفعان را کاهش میدهد.
- محافظت از دانش موجود در دامنه:
اگر دانش موجود در دامنه مکتوب یا بهطریقی ثبت شود، با انتقال افراد و تیمها به پروژهای دیگر یا کسبوکاری دیگر، این دانش در دامنه موجود میماند و بستر را برای افراد جدیدی که به پروژه اضافه میشوند نیز فراهم خواهد بود.
- انعطاف بیشتر:
تعاریفی که مربوط به بستر فعالیت هستند و مرزهایی که بین مفاهیم و معانی گذاشته میشود، تعامل و ارتباط را سادهتر میکند و منجر به انعطاف بیشتر افراد و تیمها خواهد شد، چرا که تقریباً همگی درک یکسانی از حوزۀ کسبوکار دارند.
- ثبت و ضبط دقیقتر و آسانتر:
ارتباطات بهتر و اصطلاحاتی که رایج میشوند، باعث سادهترشدن ردیابی و ثبتوضبط اجرائیات خواهد شد.
- بالانس بیشتر برنامه:
گاهی اوقات بیش از حدی که نیاز است روی UI/UX تأکید میشود؛ البته که اینها مهم هستند، ولی اگر بعضی از الزامات و ضروریات دامنه نادیده گرفته شوند، میتواند مشکلات بسیار جدی و شدیدی را بهوجود بیاورد. اگر برنامۀ شما نتواند کاری را که کاربران میخواهند انجام دهد، هرچقدر هم که زیبا باشد فایدهای ندارد.
پرداختن به نیازهای دامنه و آن چیزی که کارشناسان دامنه توصیه میکنند، باعث ایجاد تعادل و بالانس بهتر نرمافزار با نیازها و انتظارات مشتریان خواهد شد.
- کدهای بهتر:
اتخاذ رویکرد DDD منجر به دستیابی به کدهای تمیزتر و قابلاعتمادتر میشود و میتواند بستری را برای الگوهای طراحی قابلتکرار ایجاد کند؛ این امر باعث میشود که بتوانید پروژههای آینده را روانتر و کارآمدتر پیادهسازی و اجرا کنید.
در نهایت اگر میخواهید نرمافزاری ایجاد کنید که بهخوبی با دامنۀ تجاری مورد نظرش مطابقت داشته باشد، درنظر گرفتن DDD بیفایده نخواهد بود؛ حتی اگر این رویکرد برای شما مناسب نباشد، باز هم ارزش یادگیری را دارد. چرا که میتواند به شما در بهبود ارتباط بین تیمهای توسعه و کارشاسان و ذینفعان کمک کند.
مطمئن باشید که ارتباط بهتر، منجر به بالاتررفتن توان حل مسئله خواهد شد و به شما کمک خواهد کرد که نرمافزار مفیدتری را طراحی کنید.
نگرش Agile
نگرش Agile راهی برای مدیریت پروژههای توسعۀ نرمافزاری، با تقسیم آن به چندین مرحله است و بیشتر مناسب پروژههاییست که تغییرات مداوم و متعددی در آنها ممکن است رخ دهد.
مانیفست Agile، بهترین مرجع برای فهم ارزشهای این رویکرد و نگرش برای مدیریت پروژه است.
در این مانیفست، بهوضوح اعلام شده است که هدف نهایی و ارزشهای مدنظر Agile چیست:
- افراد و تعاملات آنها، مهمتر از فرآیندها و ابزارها هستند.
- نرمافزاری که صحیح کار کند، مهمتر از مستندات جامع نرمافزاری است.
- مشارکت مشتری در انجام کار، مهمتر از مفاد قرارداد کاری است.
- پاسخگویی و انعطاف دربرابر تغییرات، مهمتر از پیروی از یک طرح ثابت است.
البته اینها هیچکدام به معنای بیاهمیت بودن موارد سمت چپ نیستند، ولی اولویت در این رویکرد، همیشه با موارد سمت راست است.
ممکن است گاهی اوقات بشنویم که اَجایل یک متدولوژی است، ولی در واقع اینطور نیست. Agile بیشتر از اینکه یک روش باشد، یک طرزفکر راجعبه چگونگی همکاری و گردشکار است که با مجموعهای از ارزشها، به ما کمک میکند تا دربارۀ چیزی که قرار است به آن دست پیدا کنیم و طریقۀ دستیابی، تصمیم بگیریم.
در عمل نیز متدولوژیهای توسعۀ نرمافزاری مبتنی بر نگرش Agile، باید بهدنبال ارائۀ قسمتهای کوچکی از یک نرمافزار کارآمد به مشتری، برای افزایش رضایت او باشند؛ متدولوژیهایی که تمرکز اصلی آنها بر بهبود مستمر است.
معمولاً توسعۀ نرمافزار Agile که به آن چابک هم میگویند، متشکل از تیمهای خودسازمانیافتۀ کوچک است که اعضای آن، توسعهدهندگان نرمافزار و نمایندگان کسبوکارها هستند و بهطور مداوم و مرتب، با یکدیگر تعامل دارند.
فریمورکها Frameworks و چارچوبهای مبتنی بر Agile برای توسعۀ نرمافزار مانند Scrum, Kanban یا XP باعث توسعۀ فرآیندها و روش های جدید شدهاند. مفاهیم شاخصی مانند DevOps و CI/CD.
متدولوژی Scrum
محبوبترین چارچوب مبتنی بر Agile، اسکرام است که رفتهرفته بهقدری محبوبیت و توسعه پیداکرده است که میتوان از آن بهعنوان متدولوژی Scrum ، یا رویکرد Scrum نیز نام برد.
اسکرام چارچوبی برای مدیریت کار است که برای تیمهای ۳ الی ۹ نفره طراحی شده است. تیمهایی که همکاری متقابل دارند و با استفاده از Scrum کار هر تیم به اقدامات کوچکتر ِقابلسنجش تبدیل میشود. اقداماتی که میتوانند در یک دورۀ زمانی ثابت که به آن Sprint میگویند انجام شوند.
تیمهای Scrum همیشه حداقل ۳ بخش دارند؛ ۱-اعضای تیمTeam Members ۲- اسکراممستر Scrum Master 3-مالک محصول Product Owner.
معمولاً اسکرام زمانی کارآمد و مفید فایده است که بتوان یک پروژۀ بزرگ را به اسپرینتهای ۲ الی ۴ هفتهای تقسیم کرد.
مدل اسکرام از طریق برگزاری جلسۀ بازنگری «retrospective»، بر لوپهای بازخورد متمرکز میشود و اگر قرار باشد در دو عبارت، مدل اسکرام را تعریف کنیم، آن دو عبارت « بررسی و سازگارسازی» هستند.
اسپرینتهای دوهفتهای
Sprint معمولاً یک بازۀ زمانی ۲ هفتهای است که باید در آن، وظایف مشخصی بر اساس آنچه برای تیمها اولویت دارد بهانجام برسد. این اولویت را، کاری که قرار است به کاربر نهایی برسد تعیین میکند.
خیلی اهمیت دارد که بدانیم هدف اصلی از تعریف اسپرینتهای دوهفتهای این است که بهصورت مداوم کار به مشتری نهایی ارائه شود و بازخورد گرفته شود که اگر نیاز به تغییر در برنامهریزی یا تغییر اولویت بود، بتوان برای آن برنامهریزی کرد.
برای برنامهریزی اسپرینتهای کاری، باید درنظر داشته باشیم که قرار است چگونه کارها و فعالیتها را سازماندهی کنیم که حتماً قابلیت انجامشدن در این زمان ۲هفتهای را داشته باشد و جلسۀ برنامهریزی اسپرینت هم دقیقا برای همین برگزار میشود که «هدف اسپرینت» و «بکلاگ اسپرینت» مشخص شوند.
- هدف اسپرینت Sprint Goal:
آن چیزی که میتواند در طول یک اسپرینت، تحویل داده شود.
- بکلاگ اسپرینت Sprint Backlog:
لیست وظایفی که باید به انجام برسند تا هدف اسپرینت محقق شود.
شاید تا اینجای کار ساده بهنظر برسد ولی درواقع، اینکه برای ۲ هفته برنامهریزی دقیقی داشته باشید کار سادهای نیست؛ چرا که در واقع کاری که شما برنامهریزی میکنید باید بتواند اهداف تعیینشده را برآورده کند.
برای برآوردهکردن اهداف باید بکلاگهای سالمی داشته باشید، بکلاگِ سالم باید ۳ ویژگی زیر را داشته باشد:
- اولویتبندی تمام آیتمهای کاری و قراردادن مهمترینها در بالای لیست.
- داستانهای مشتری بهصورت کامل دریافت و صورتبندی شده باشد که تیم توسعه بتواند اجرای آن را شروع کند.
- یک برآوردِ معقول و بهروز از زمانی که هر آیتم کاری قرار است طول بکشد داشته باشد.
و در نهایت اینکه به یاد داشته باشیم که باید از ایدهآلگرایی و طرح کلی فاصله بگیریم و فقط بر پیشرفت در هر اسپرینت و انجام کارها متمرکز شویم.
Unit/Integration Test
اینکه محصول نرمافزاری ما باکیفیت است یا نه را باید چگونه متوجه شویم؟ و رضایت مشتریان خود را چگونه حفظ کنیم؟ اینها سوالاتی هستند که تمام شرکتها در سراسر جهان از خودشان میپرسند؛ سوالاتی که با تغییر انتظار مشتریان از محصولات، خدمات و راهکارها، هر روز جواب آنها میتواند متفاوت باشد.
برای پاسخ دادن به این سوالها، شرکتهای نرمافزاری محصولات خود را از جهات مختلفی مورد آزمون و آزمایش قرار میدهند و دو تست رایج، تست واحد Unit Test و تست یکپارچگی Integration Test هستند.
تست واحد:
Unit Testing نوعی تست نرمافزاری است که در آن یک تکۀ کوچک از کدهای نوشتهشده، تست میشود تا ببینیم که آیا کد مطابق انتظار ما عمل میکند یا نه.
هدف نهایی این تست، این است که رفع اشکالهای نرمافزار هزینۀ کمتری برای سازمان یا تیم توسعهدهندۀ نرمافزار بههمراه داشته باشد و با انجام این تست، اشکالات، باگها و خطاها در سطح کد و در اوایل چرخۀ توسعه شناسایی میشوند و طبیعتاً زودتر اصلاح میشوند و تبعات کمتری ایجاد خواهند کرد.
تست یکپارچگی:
Integration Testing همانطور که از نام آن پیداست، برای بررسی یکپارچگی بین دو یا چند واحد نرمافزاری یا ماژول انجام میشود و وظیفۀ آن این است که ببیند آیا کدها مطابق انتظار ما عمل میکنند یا نه.
درمقایسه با تست واحد،برای انجام این تست با گستردگیها و پیچیدگیهای بیشتری مواجه خواهید بود.
تست یکپارچگی بعد از تست واحد صورت میگیرد که اگر مشکلی در یک واحد وجود دارد که منجر به عدم یکپارچگی میشود، قبلاً رفع شده باشد.
درواقع با این تست، مطمئن خواهیم شد که نرمافزارها و ماژولای مختلف بدون اینکه قرار باشد به عملکرد یکدیگر آسیبی وارد کنند، کار خواهند کرد.
شباهتهای Unit Test و Integration Test
- هردو ضروری و مفید هستند و نمیتوان یکی را مهمتر از دیگری دانست.
- هردو بخشی جداییناپذیر از فرآیند توسعه هستند و باید بهدقت و در زمان مناسب انجام شوند.
- این دو تست با هم همبستگی دارند و باید حتماً هردوی آنها انجام شوند.
تفاوتهای Unit Test و Integration Test
- تست یکپارچگی به تأیید ارتباط بین دو یا چند ماژول کمک میکند در حالی که تست واحد اینگونه نیست و فقط کدهای یک یونیت واحد را تست میکند.
- رفع ایرادهای یافت شده در تست واحد را میتوان بهسرعت انجام داد، ولی رفع ایرادات حاصل از انجام تست یکپارچگی، زمان بیشتری نیاز دارد.
- Unit Testیک White Box Testing است در حالی که Integration Testیک Black Box Testing است؛ این یعنی تست واحد فرآیندها و کدهای داخلی یک سیستم را بررسی میکند در حالی که تست یکپارچگی مربوط به سنجش فرآیندها و کدهای خارجی و ارتباطی است.
- برای تست واحد، دسترسی به کدها لازم است ولی برای تست یکپارچگی، نیازی به دسترسی به کدها وجود ندارد و این تست فقط مربوط به تعاملات و رابطهای بین ماژولها است.
CI/CD
Continuous Integration & Continuous Delivery/Deployment یک روش برای ارائۀ مداوم و مکرر اپلیکیشها به مشتریان است. روشی که از طریق یکپارچهسازی دائمی و تحویل و استقرار دائمی کار میکند.
Continuous Integration به معنای یکپارچهسازی مستمر است و یک فرآیند اتوماتیکسازی برای توسعهدهندگان نرمافزاری محسوب میشود.
معنای این یکپارچهسازی مستمر این است که تغییراتی که در کدهای یک اپلیکیشن بهوجود میآیند بهصورت مداوم و منظم تست میشوند و در یک مخزن مشترک با یکدیگر ادغام میشوند؛ از این طریق برنامههایی که در حال توسعه بهطور همزمان و در چند شعبه هستند، از خطر تضاد و تداخل فرآیندهای توسعهای تا حد زیادی دور خواهند ماند.
Continuous Delivery/Deployment یعنی تحویل مستمر/ استقرار مستمر؛ هردوی این عملیات، یعنی تحویل و استقرار، دارای مراحلی هستند که اگر بتوان آنها را از پیش برنامهریزی کرد و در هر مرحله، بهینهترین روش برای مراحل بعدی را با بهروزرسانی اطلاعات ممکن کنیم، میتوان رضایت بسیار بیشتر و کارآمدی بسیار بالاتری را موجب شویم.
تحویل مستمر معمولاً به این معناست که تغییراتی که در کدهای برنامهها بهوجود میآیند، بهطور خودکار تست خواهند شد و رفع باگ برای آنها صورت میگیرد و بعد از آن در یک مخزن بارگذاری میشوند. مخزنی مانند GitHub که تیمهای اجرایی بتوانند در یک محیط تولید پویا و زنده، توسعۀ مدنظر خود را انجام دهند.
این روش، میتواند تا حد خیلی زیادی مشکلات ارتباطی بین تیمهای توسعه و تیمهای کسبوکار را از بین ببرد و هدف اصلی Continuous Delivery/Deployment این است که حداقل تلاش برای استقرار و تحویل کدهای جدید صورت بگیرد.
OWASP
یک جامعۀ مجازی برای امنیت وباپلیکیشنها؛ The Open Web Application Security Project
جامعۀ آنلاینی که بهصورت رایگان میتوان مقالات، متدولوژیها، اسناد، ابزار و تکنولوژیهای مرتبط در زمینۀ امنیت برنامههای تحتوب را در آن پیدا کرد.
این جامعۀ آنلاین، پروژهای با نام ASVS دارد که مبنایی برای تستهای کنترل امنیت فنی برنامههای تحتوب فراهم میکند. این پروژه که مخفف Application Security Verification Standard است همچنین فهرستی از الزامات توسعۀ امن را نیز در اختیار توسعهدهندگان نرمافزارهای تحتوب قرار میدهد که فهرست بسیار مهم و معتبری در این زمینه محسوب میشود و استانداردی بر مبنای آن تعریف شده است که به استاندارد OWASP معروف است.
این استاندارد مبنایی را برای تستهای کنترل امنیتی فنی اپلیکیشنها و همچنین هرکونه کنترل امنیتی فنی در محیط است فراهم میکند و با رعایت آن میتوان در برابر آسیبهایی مانند XSS و SQL injection مقاوم ماند.
از این استاندارد میتوان برای ایجاد سطح مطلوبی از امنیت و ایمنی اپلیکیشنهای تحتوب استفاده کرد.
Digital Signature
امضای دیجیتال یک نوع خاص از امضاهای الکترونیکی ملقب به E-Signature است؛ در امضای دیجیتال، برای پشتیبانی از احراز هویت و یکپارچهسازی تراکنشها از رمزنگاری کلیدعمومی استفاده میشود که به این رمزنگاری Public-Key Cryptography گفته میشود.
هدف از استفادۀ امضای دیجیتال این است که افراد و سازمانها بتوانند شواهدی غیرقابل انکار ارائه کنند؛ شواهدی مبنی بر اینکه یک موجودیت دیجیتالِ خاص، از یک فرد مشخص صادر شده و تغییر نکرده است.
مکانیسم احراز هویت امضای دیجیتال بهگونهای است که میتوان از آن برای پشتیبانی از چندین کارکرد امنیتی دیگر نیز استفاده کرد. با این حال، تمرکز اصلی Digital Signature بر محافظت از یکپارچگی و تائید اصالت اسنادی مانند فرمها، نامهها یا قراردادها است.
مزایای استفاده از امضای دیجیتال:
- صرفهجویی در زمان
دیگر نیازی نیست که منتظر بازگشت مدیر از تعطیلات آخر هفته یا سفر کاریاش باشیم؛ با امضای دیجیتال، هرکسی میتواند بهصورت آنلاین و بدون نیاز به حضور فیزیکی، اسناد و نامههای مربوط به خود را ببیند و در صورت لزوم امضا کند. حتی تصور اینکه با امضای دیجیتال چه میزان میتوان به صرفهجویی در زمان انسانها و بهبود فرآیندهای کسبوکار کمک کرد برای درک مزایای این قابلیت کافی است.
- صرفهجویی در هزینهها
دیگر نیازی به کاغذ و جوهر و پرینت و اسکن و هزینههای ارسال فیزیکی نیست و این یعنی کاهش هزینهها به جدیترین شکل ممکن.
- کارآمدتر شدن فرآیندهای کاری
تأخیر کمتر در عملیات امضاء، کارایی بهتری را در گردش کار ایجاد میکند و مدیریت و ردیابی اسناد و مدارک با تلاش کمتر و سادگی بیشتری همراه خواهد بود و همۀ اینها یعنی کارآمدترشدن فرآیندهای کاری
- تجربۀ بهتر مراجعان و کاربران
چه در نقش دریافتکنندۀ خدمت و محصول و چه در نقش ارائهدهندۀ آن، با امضای دیجیتال تجربۀ بهتری خواهید داشت؛ برای مثال اگر فروشنده باشید دیگر نیازی نیست منتظر مراجعۀ خریدار برای امضا باشید و امضاء را میتوان هنگام تحویل کالا اخذ کرد.
- امنیت
هنگامی که صحبت از امضاء باشد، اولویت اصلی، اصالت و امنیت است. امضای دیجیتال با تأیید معتبر و قانونیبودن امضاها، جلوی بسیاری از روشهای جعل و خرابکاری را میگیرد و مطمئناً در آیندهای نزدیک از این قابلیت در فعالیتهای روزمره نیز بیشتر استفاده خواهد شد.
Encrypting PDF documents
رمزگذاری فایلهای PDF میتواند مانع دسترسی غیرمجاز به فایلها شود و برای کپی، بهروزرسانی و چاپ اسناد PDF نیز محدودیت ایجاد کند.
با رمزگذاری فایلهای PDF تا حد بسیار زیادی میتوان از آسیبرسیدن به اطلاعات ذخیره شده در این فایلها جلوگیری کرد.
- مزایای رمزگذاری فایلهای PDF
- ذخیرهسازی و تبادل سادهتر فایلها در فضاهای Cloud
- ابتکار عمل در اعمال تغییرات روی فایلهای رمزگذاری شده
- جلوگیری از دسترسی یا افشای فایلها
- مزیت رقابتی قابل توجه برای ارائهدهندگان خدمات
- مهیاکردن بستر امنیت از راه دور برای دفاتر و شعبات سازمانها
- تسهیل برونسپاری و ایمنسازی بستر ارتباطی با امکان صدور مجوز
Public Key Enabled
رمزنگاری کلید عمومی، روشی برای رمزگذاری یا امضای دادهها است. در این روش، محتوا بهگونهای رمزنگاری میشود که کلید عمومی(که برای همه قابل مشاهده است) فقط بهوسیلۀ کلید خصوصیِ مخصوصی بتواند باز شود و از این طریق اطمینان حاصل خواهد شد که داده یا موجودیتی که رمزنگاری شده است، بهصورتی امن به مقصد خواهد رسید.
برای PKE شدن نرم افزارها بایستی آنها مجهز به زیرساخت کلید عمومی Public Key Infrastructure شوند.
زیرساخت کلید عمومی (PKI) مجموعهای متشکل از سختافزار، نرمافزار، افراد، سیاستها و دستورالعملهای مورد نیاز برای مدیریت، توزیع، استفاده، ذخیره و ابطال گواهیهای دیجیتال میباشد.
در رمزنگاری، PKI مقدمهای است برای الصاق کلید عمومی به هویت کاربر، که با استفاده از یک مرکز صدور گواهی (CA) انجام میگیرد. هویت کاربر باید برای هر CA یکتا باشد. نسبت دادن کلید عمومی به هویت افراد مطابق با یک روند ثبت و صدور انجام میشود، که بر اساس سطح تضمین لازم ممکن است توسط یک نرمافزار در CA انجام شود یا با نظارت انسان باشد. مسئولیت تضمین درستی در PKI بر عهدهٔ مرکز ثبت نام (RA) است. مرکز ثبت نام، اطمینان میدهد که کلید عمومی به گونه ای به فرد مورد نظر الصاق شدهاست که عدم انکار را تضمین میکند.
مزایای PKE
- حفظ امنیت بسیار ساده میشود و فقط کافیست کلید خصوصیPrivate Key مخفی بماند.
- تعمیر و نگهداری کلیدها آسان است چرا که کلیدها در هنگام ارتباط نیز ثابت میمانند.
- تعداد کلیدهایی که باید مخفی نگه داشته شوند در مقایسه با سایر روشهای رمزگذاری و رمزنگاری بسیار کمتر است.
CQRS در معماری نرمافزار
این عبارت مخفف Command and Query Responsibility Segregation است و بهظاهر بسیار پیچیده بهنظر میرسد؛ اما واقعیت این است که فهم کلی و ابتدایی از آن، میتواند بسیار ساده باشد.
اول باید متوجه بشویم که Command و Query هرکدام چه معنایی دارند و بعد باید متوجه بشویم که جداکردن مسئولیتهای هرکدام، چه لزومی دارد و چرا این نیاز برای توسعهدهندگان نرمافزار بهوجود آمده است که باید آنها را از هم تفکیک کنیم؟ اگر تفکیک نکنیم چه مشکلی ممکن است پیش بیاید؟
دستور Command، عملیاتی است که وضعیت Application را تغییر میدهد.
کوئریQuery، عملیاتی است که وضعیت Application را میخواند.
پس تفاوت دستور و کوئری این است که یکی از آنها برای ایجاد کردن (Create) یا تغییردادن(Update) است و دیگری برای خواندن(Read).
برای بهبود عملکرد هر اپلیکیشن، مسیر سادهای وجود دارد که احتمالاً همۀ ما آن را شنیدهایم: بازخورد گرفتن از کاربران و اصلاح برنامه. اما اینکه دریافت این بازخورد، با چه الگویی(Pattern) انجام شود، خود مسئلهای حائز اهمیت است.
CQRS بهعنوان یک الگوی معماری نرمافزار، به ما میگوید لزومی ندارد که منطقِ خواندن و منطقِ تغییردادن برای برنامۀ ما یکسان باشد و هرکدام از آنها میتوانند بهصورت مجزا از یکدیگر صورت بگیرند. یعنی منطقی که Commandها را با آن مدیریت میکنیم میتواند متفاوت باشد از منطقی که Queryها را با آن مدیریت میکنیم.
CQRS در معماری نرمافزار چه زمانی به کار میآید؟
- زمانی که نیاز داشته باشیم که یکی از دو فرآیند خواندن یا تغییردادن را با مدل سادهتری پیادهسازی کنیم.
- زمانی که برای بهینهکردن عملکرد مدلهای خواندن یا تغییردادن، نیازمندیهای بسیار متفاوت و بعضاً متعارضی وجود داشته باشد.
- زمانی که با پیچیدگیهای زیادی مواجه هستیم و به مقیاسپذیری نیاز داریم که بتوانیم دو سرویس را بهطور مستقل مقیاسبندی کنیم و مشخصاً تفاوتهای زیادی بین خواندن و تغییردادن وجود داشته باشد.
معماری رویدادمحور Event-Driven Architecture
رویدادها، اتفاقاتی هستند که منجر به ایجاد تغییر در وضعیتِ یک موجودیت میشوند.
برای مثال، در سیستم مکاتبات، زمانی که نامهای ارسال میشود، وضعیت آن از «پیشنویس» به «ارسالشده» تغییر میکند و این یک Event است.
معمای رویدادمحور، رویکردی در طراحی است که تمرکز آن بر رویدادها باشد.
در دنیای دیجیتال، رویدادها توسط سیستمهای IT مدیریت میشوند و این سیستمها، رویدادها را بر اساس یک منطقِ از پیش تعیینشده، ثبت و پردازش میکنند و به آنها پاسخ میدهند.
در معماری رویدادمحور، رویدادها شامل ویژگیهای زیر هستند:
- آنها به ما میگویند که «اتفاقی افتاده است.»
- آنها غیرقابل تغییر هستند و نمیتوان آنها را تغییر داد یا حذف کرد.
- رویدادها را میتوانیم برای همیشه ذخیره کنیم و تا ابد به آنها دسترسی داشته باشیم.
- محدودیتی برای تعداد دفعاتی که قرار است رویدادها توسط سرویسها پردازش شوند و مورد استفاده قرار بگیرند وجود ندارد.
معماری رویدادمحور، اعلانهای رویداد یا همان Notificationها را مدیریت میکند. اعلانی که ممکن است یک تأیید ساده باشد یا حاوی دادههای بیشتری نیز باشد که سایر سیستمها از آن استفاده کنند.
این رویکرد در معماری نرمافزارها موجب میشود که برنامهها بتوانند با سرعت بیشتری به احتیاجات و درخواستهای کاربران پاسخ بدهند و همچنین باعث میشود که در سطوح مختلف بتوان با استاندارد مشخصی مراحل پردازش دادهها را مدیریت کرد.
از آنجایی که در این رویکرد، اعلان یا پیام است که بهعنوان رویداد در نظر گرفته میشود، به آن معماری «پیاممحور» Message-Driven Architecture نیز گفته میشود.
مزایای اتخاذ رویکرد پیاممحور در معماری نرمافزار:
- هماهنگی بسیار بالا بین میکروسرویسها
- امکان آگاهی سریع از خطاها و رفع سریع آنها
- کمترکردن دامنه و ضرورت تعامل تیمهای توسعۀ نرمافزار
- امکان مدیریت تولید نرمافزار با استانداردهای قابل سنجش
چارچوب Angular
انگولار، یک چارچوب Open-Source برای ساختن برنامههای تحتوب است. با استفاده از این Framework و با تمرکز بر سه شاخص سرعت توسعهدهنده، بهرهوری و مقیاسپذیری، تولید اپلیکیشنهای تحت وب وارد فاز جدیدی شده است.
این چارچوب در سال ۲۰۱۲ توسط گوگل معرفی شد که با واکنشهای بسیار خوبی مواجه شد و بعد از مدت کوتاهی توانست حضور خود را در عرصۀ فناوری اطلاعات و ارتباطات تثبیت کند.
در واقع Angular یک پلتفرم برای ساختن برنامههای تکصفحهای در لایۀ Client است که از HTML و TypeScript استفاده میکند. این چارچوب نرم افزاری برای Enterprise Application بسیار مناسب است.
فواید استفاده از تکنولوژی Angular
- محبوبیت و رایجبودن این Framework
- کدهای تمیز و قابل فهم
- قابلیت Multi-platform که اجازۀ تولید برنامه برای Mobile،Web و Desktop را میدهد.
- تنوع ابزارهای کمکی با توجه به میزان رواجی که این تکنولوژی دارد.
- امکان تسریع روند توسعه با توجه به ملایمبودن منحنی یادگیری
چارچوب React Native
RN یک چارچوب محبوب برنامهنویسی در بستر JavaScript است که با استفاده از آن میتوان با یک پایگاه کد، یک برنامه را برای پلتفرمهای مختلف موبایل ایجاد کرد.
یعنی اگر برنامۀ خود را با React Native بنویسید، این امکان را دارید که بدون تغییر کدها، در پلتفرمهایی مانند Android و iOS از آن برنامه استفاده کنید.
فواید استفاده از تکنولوژی React Native
- جامعۀ توسعهدهندگان فعال که از همان سال ۲۰۱۳ بستر را برای پدیدآمدن React Native مهیا کرده بود و همچنان محیط پویایی دارد.
- حداکثر امکان استفادۀ مجدد از کد و صرفهجویی در هزینهها.
- قابلیت Live Reload که به توسعهدهندگان امکان مشاهدۀ بلافاصلۀ نتایج تغییرات اعمالشده را میدهد.
- کارایی و سرعت بسیار قوی برای بسترهای موبایل
- معماری ماژولار و شهودیای که منجر به انعطاف بالاتر آن شده است.
زبان برنامهنویسی C#
سیشارپ یک زبان برنامهنویسی مدرن، شیءگرا و ایمن است و به توسعهدهندگان امکان ساخت انواع مختلفی از برنامههای کاربردی امن و قدرتمند را میدهد؛ برنامههایی که در بستر .NET اجرا میشوند.
C# از خانوادۀ زبانهای C محسوب میشود و برنامهنویسانی که سابقاً با زبانهای برنامهنویسی از قبیل C, C++, Java و JavaScript برنامهنویسی کرده باشند، بهسرعت با محیط C# هماهنگ میشوند.
فواید استفاده از زبان برنامهنویسی C#
- سرعت توسعۀ بالا با استفاده از قابلیتهای موجود در C#
- مقیاسپذیری بالا بهواسطۀ کدهای بهینهشده
- شیءگرا بودن این زبان که آن را بسیار انعطافپذیرتر و کمهزینهتر کرده است.
- امکان تسریع روند توسعه با توجه به ملایمبودن منحنی یادگیری
- جامعۀ توسعهدهندگان فعال و گسترده
تکنولوژی .Net
دات نِت، یک چارچوب نرمافزاری(Framework) محبوب است که برای اولین بار در سال ۲۰۰۲ توسط شرکت مایکروسافت توسعه یافت و به بازار ارائه شد.
بهزبان ساده، .Net یک ماشین مجازی برای کامپایلکردن و اجرای برنامههای نوشتهشده به زبانهای مختلف است. زبانهایی مانند C#، VB.Net و … .
فواید استفاده از چارچوب .Net
- Multiple-platform بودن که به شما اجازۀ نوشتن کدهایی را میدهد که درپلتفرمهای مختلف و وسیعی قابل اجرا هستند.
- ابزار Visual Studio که به شما اجازه میدهد که برنامۀ خود را در پلتفرمهای متعددی بارگذاری کنید.
- مانیتورینگ و تست کد خودکار.
- انعطاف و سهولت در نگهداری
- امکان مدیریت پیشرفتۀ رابط کاربری
- جامعۀ توسعهدهندگان فعال و گسترده
NHibernate
NHibernate یک راهکار بسیار کارآمد برای مدیریت اطلاعات در چارچوب .Net است. در واقع این راهکار، یک ORM محسوب میشود؛ یعنی تکنیکی برای سازگارکردن دادهها برای ثبت در پایگاه داده است.
این راهکار برای انتقال Objectها بین چارچوب.Net و پایگاه داده است و این تبادل اطلاعات را مدیریت میکند. این مدیریت از طریق ایجاد SQL براساس یک توصیف XML از موجودیتها و روابط شکل میگیرد.
اگر بهشکل ساده بخواهیم به این راهکار نگاه کنیم، میتوانیم بگوئیم که NHibernate یک سیستم برای مدیریت پایگاه داده است. بالاخص زمانی که قرار است پایگاه داده با .Net Framework مرتبط شود.
فواید استفاده از NHibernate
- موجودیتها در یک پایگاه دادۀ ارتباطی ذخیره میشودن و این امکان را دارند که برای تمام فعالیتهای Create،Read،Update و Delete استفاده شوند.
- تمام کار پایگاه داده توسط این راهکار مورد رسیدگی قرار میگیرد.
- شما را از عبارات SQLیا ایجاد کوئریهای ذخیرهشده بینیاز میکند.
این امکان را به شما میدهد که تمام منطقِ دسترسی به دادهها را در برنامه ایجاد کنید.