diff --git a/docs/software-engineering-quick/_category_.json b/docs/software-engineering-quick/_category_.json new file mode 100644 index 00000000..9feab7c4 --- /dev/null +++ b/docs/software-engineering-quick/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "مهندسی نرم‌افزار-بتا", + "position": 4, + "link": { + "type": "generated-index", + "slug": "software-engineering" + } +} diff --git a/docs/software-engineering-quick/images/phase01-google.gif b/docs/software-engineering-quick/images/phase01-google.gif new file mode 100644 index 00000000..1023ffe9 Binary files /dev/null and b/docs/software-engineering-quick/images/phase01-google.gif differ diff --git a/docs/software-engineering-quick/images/phase01-search.jpeg b/docs/software-engineering-quick/images/phase01-search.jpeg new file mode 100644 index 00000000..7ea6ce72 Binary files /dev/null and b/docs/software-engineering-quick/images/phase01-search.jpeg differ diff --git a/docs/software-engineering-quick/images/phase02-cleanCode.jpg b/docs/software-engineering-quick/images/phase02-cleanCode.jpg new file mode 100644 index 00000000..345b7825 Binary files /dev/null and b/docs/software-engineering-quick/images/phase02-cleanCode.jpg differ diff --git a/docs/software-engineering-quick/images/phase02-codeReview.png b/docs/software-engineering-quick/images/phase02-codeReview.png new file mode 100644 index 00000000..1e4126d7 Binary files /dev/null and b/docs/software-engineering-quick/images/phase02-codeReview.png differ diff --git a/docs/software-engineering-quick/images/phase03-advanceJava.png b/docs/software-engineering-quick/images/phase03-advanceJava.png new file mode 100644 index 00000000..29f8a480 Binary files /dev/null and b/docs/software-engineering-quick/images/phase03-advanceJava.png differ diff --git a/docs/software-engineering-quick/images/phase03-conventions.jpg b/docs/software-engineering-quick/images/phase03-conventions.jpg new file mode 100644 index 00000000..b8ec0dc7 Binary files /dev/null and b/docs/software-engineering-quick/images/phase03-conventions.jpg differ diff --git a/docs/software-engineering-quick/images/phase03-stream.jpg b/docs/software-engineering-quick/images/phase03-stream.jpg new file mode 100644 index 00000000..9301515e Binary files /dev/null and b/docs/software-engineering-quick/images/phase03-stream.jpg differ diff --git a/docs/software-engineering-quick/images/phase04-Top-Reasons-To-Unit-Test.png b/docs/software-engineering-quick/images/phase04-Top-Reasons-To-Unit-Test.png new file mode 100644 index 00000000..0072e9d3 Binary files /dev/null and b/docs/software-engineering-quick/images/phase04-Top-Reasons-To-Unit-Test.png differ diff --git a/docs/software-engineering-quick/images/phase04-level-of-testing.png b/docs/software-engineering-quick/images/phase04-level-of-testing.png new file mode 100644 index 00000000..f4e33445 Binary files /dev/null and b/docs/software-engineering-quick/images/phase04-level-of-testing.png differ diff --git a/docs/software-engineering-quick/images/phase05-badges.png b/docs/software-engineering-quick/images/phase05-badges.png new file mode 100644 index 00000000..be44dccf Binary files /dev/null and b/docs/software-engineering-quick/images/phase05-badges.png differ diff --git a/docs/software-engineering-quick/images/phase05-ci-cd.jpg b/docs/software-engineering-quick/images/phase05-ci-cd.jpg new file mode 100644 index 00000000..e6c9ebae Binary files /dev/null and b/docs/software-engineering-quick/images/phase05-ci-cd.jpg differ diff --git a/docs/software-engineering-quick/phase01-simple-project.md b/docs/software-engineering-quick/phase01-simple-project.md new file mode 100644 index 00000000..21bc8eee --- /dev/null +++ b/docs/software-engineering-quick/phase01-simple-project.md @@ -0,0 +1,104 @@ +--- +title: Full-Text Search +description: '' +deadline: '2 days' +--- + +![](./images/phase01-search.jpeg) + +## مقدمه +احتمالا برایتان پیش آمده است که بخواهید بین تعداد زیادی محتوای متنی، یک عبارت یا یک واژه خاص را پیدا کنید. یا به طور دقیق‌تر، همه فایل‌هایی که شامل آن عبارت می‌شوند را بیابید. +به این نوع جست‌وجو، full-text search یا همان جستجوی متنی گفته می‌شود. اگر کمی دقت کنیم، هر بار که وارد گوگل می‌شویم و عبارتی را جست‌وجو می‌کنیم، در واقع داریم در بین تمام وبسایت‌های موجود، یک جست‌وجوی متنی انجام می‌دهیم و انتظار داریم، سایت‌هایی که شامل عبارت مورد نظر ما هستند به ما برگردانده شود. + +* آیا تا به حال فکر کرده‌اید که گوگل چطور این کار را انجام می‌دهد؟ +* یا به طور دقیق‌تر، چطور تا این حد سریع، این کار را انجام می‌دهد؟ + +در این فاز، نه تنها پاسخ این سوالات را میابیم، بلکه سرویس جست‌وجوی خودمان را نیز پیاده‌سازی می‌کنیم؛ با این تفاوت که به جای سایت‌ها به سراغ کتاب‌ها می‌رویم و این جست‌وجو را در بین انبوهی از کتاب‌ها انجام می‌دهیم. + + +## آشنایی با مفاهیم اولیه جستجوی متنی +قبل از ادامه مطالعه مطالب، به دو سوال زیر فکر کنید و به آن‌ها پاسخ دهید: + + به روز‌های اول تشکیل شرکت گوگل فکر کنید، فرض کنید متن‌های چند صد هزار صفحه‌ی وب را جمع آوری کرده‌اید و می‌خواهید بین آن صفحات جستجو کنید. چه راه حلی برای اجرای کوئری چند کلمه‌ای کاربران بین هزاران صفحه متن، که از قبل آماده شده است به ذهنتان می‌رسد؟ + +* مرتبه زمانی روش پیشنهادی شما چقدر است؟! آیا می‌توان این کار را در مرتبه یک یا همان O1 انجام داد؟ +* نکته: لطفا حتما پیش از ادامه مطالعه مطالب، روی سوالات بالا به خوبی فکر کنید و پاسخ خود را بنویسید. + +یکی از داده‌ساختار‌های مورد استفاده به این منظور، Inverted Index می‌باشد. برای آشنایی با این داده ساختار [Inverted Index - GeeksforGeeks](https://www.geeksforgeeks.org/inverted-index/) +را مطالعه کنید؛  سپس برای فهم بهتر +ویدئوی [The Inverted Index](https://www.dideo.ir/v/yt/bnP6TsqyF30/18-3-the-inverted-index-stanford-nlp-professor-dan-jurafsky-%26-chris-manning-youtube) +را مشاهده نمایید. + +## موتور جستجو + +با توجه به دانشی که درباره جست‌وجوی متنی و داده‌ساختار inverted index بدست آوردیم، می‌خواهیم یک موتور جست‌وجو برای کتاب‌ها بسازیم تا با گرفتن تعدادی سند متنی (شامل خلاصه کتاب‌ها)، امکان جست‌وجوی سریع روی آن‌ها را فراهم کند. + +پیش از ادامه اما لازم است با مفهوم برنامه‌نویسی دونفره یا [Pair Programming](https://martinfowler.com/articles/on-pair-programming.html) آشنا شویم. از آنجا که باید تمام پروژه‌های فاز‌های آموزشی را به صورت pair و در قالب تیم‌های دو‌نفره انجام دهیم خوب است پیش از ادامه کار، درباره این سبک برنامه‌نویسی مطالعه کنیم. + +### تعریف پروژه +برنامه‌ای به زبان Java بنویسید که سند متنی (Document) را بخواند و از روی آن‌ها یک Inverted Index بسازد؛ سپس در Console از کاربر یک کلمه به عنوان ورودی بگیرد و نام یا شماره Documentهایی که شامل آن کلمه هستند را چاپ کند.  + +:::note +در این پروژه، از [خلاصه‌‌ کتاب‌های مهندسی نرم‌افزار](../../static/datasets/SoftwareBooksDataset.zip) به عنوان document استفاده خواهیم کرد. توجه کنید که می‌توانید از نام فایل‌ها به عنوان نام کتاب استفاده کنید.  (فایل‌های مربوط به این کتاب‌ها را می‌توانید از [اینجا](../../static/datasets/SoftwareBooksDataset.zip) دانلود کنید) +::: + +:::info +در طراحی پروژه، به تفاوت دو واژه `software` و `Software` توجه کنید!به طور مثال، می‌توانید همه کلمات را uppercase کنیم تا برنامه، به بزرگی و کوچکی حروف حساس نباشد. به این کار به اصطلاح، [normalization](https://en.wikipedia.org/wiki/Text_normalization) می‌گویند. +::: + +چه روش‌های دیگری برای بالا بردن دقت جستجو به ذهنتان می‌رسد؟ (پاسخ را در ایشو بنویسید) + + +در ادامه برنامه خود را تست کنید و درستی خروجی را بررسی کنید. در اینجا نمونه‌ای از ورودی و خروجی مورد انتظار برنامه آورده شده است: + +
+  مثال + +ورودی + +``` +query +``` + +خروجی + +``` +Result1, Result2, Result3, ... +``` + +برای بررسی صحت خروجی خود می‌توانید وجود کوئری را در فایل‌های خروجی بررسی کنید. +
+ +## موتور جستجوی پلاس! + +هرچند موتور جستجوی ما کامل است، اما یک محدودیت بزرگ دارد! آن هم اینکه فقط یک عبارت ورودی می‌گیرد و نتایج شامل همان عبارت را برمی‌گرداند. +سعی کنید موتور جستجویتان را به نحوی توسعه دهید که از سه نوع ورودی پشتیبانی کند: + +1. کلماتی که حتما باید در نتیجه وجود داشته باشند. (این کلمات پیشوندی ندارند) +1. کلماتی که حداقل یکی از آن‌ها باید در نتیجه وجود داشته باشند. (این کلمات با پیشوند `+` مشخص می‌شوند) +1. کلماتی که نباید در نتیجه وجود داشته باشند. (این کلمات با پیشوند `-` مشخص می‌شوند) + +_ورودی نوع اول مانند And، نوع دوم مانند Or و نوع سوم مانند Not می‌باش د._ + +
+  مثال + +``` +get help +illness +disease -cough +``` + +با استفاده از Query بالا می‌توانیم کتاب‌هایی را پیدا کنیم که حتماً شامل عبارات `get` و `help` و همچنین حداقل یکی از عبارات `illness` و `disease` باشند و شامل عبارت `cough` نباشند. +
+ +## جمع‌بندی و مطالعه بیشتر + +![](./images/phase01-google.gif) + +در این فاز به طراحی و پیاده‌سازی یک موتور جست‌وجوی ساده‌شده پرداختیم و با چگونگی عملکرد موتور‌های جست‌و‌جو آشنا شدیم. در ادامه و در فاز‌های بعد، با یادگیری مفاهیم کد‌نویسی تمیز و اصول مهندسی نرم‌افزار، دوباره به سراغ آن می‌آییم و علاوه بر تمیز‌سازی آن، امکانات دیگری را نیز به این پروژه اضافه خواهیم کرد تا نکات جالب‌ دیگری را نیز درباره جست‌وجوی متنی بیاموزیم. + +برای آشنایی بیشتر با نحوۀ کار موتور‌های جستجو دیدن ویدیو [How Google searches one document among Billions of documents quickly](https://www.dideo.ir/v/yt/CeGtqouT8eA/how-google-searches-one-document-among-billions-of-documents-quickly%3F) +توصیه می‌شود. + + + diff --git a/docs/software-engineering-quick/phase02-clean-code.md b/docs/software-engineering-quick/phase02-clean-code.md new file mode 100644 index 00000000..71c4fcf3 --- /dev/null +++ b/docs/software-engineering-quick/phase02-clean-code.md @@ -0,0 +1,109 @@ +--- +title: Clean Code +description: '' +--- + + +![](./images/phase02-cleanCode.jpg) + +## مقدمه + +آیا تا به حال فکر کرده‌اید که چند درصد وقت خود را مشغول **نوشتن**، و چند درصد آن را مشغول **خواندن** کد هستید؟ شاید تا به حال در توسعه پروژه‌های کوچک چند‌هزارخطی، اغلب وقت شما به نوشتن کد صرف شده باشد، اما واقعیت آن است که در پروژه‌های صنعتی و بزرگ، بیشتر وقت شما صرف خواندن و مطالعه کد خواهد شد! همین موضوع نشان می‌دهد که خوانایی و تمیز بودن کد از اهمیت بالایی برخوردار است. + +در این فاز قرار است با مفاهیم و تکنیک‌های افزایش کیفیت کد آشنا شویم و پروژه فاز قبل را به یک کد بسیار با کیفیت تبدیل کنیم. در نهایت نیز کد خود را با سایر کارآموزان به اشتراک می‌گذاریم و کد آن‌ها را Review خواهیم کرد. + +:::caution ‌ +قبل از شروع اما یک برنچ جدید برای این منظور ایجاد کنید تا تمیز‌سازی را در آن انجام دهیم. +::: + +## هنر کد تمیز! + +در ابتدا در مورد دو سوال زیر فکر کنید و با هم‌تیمی خود بحث کنید و پاسخ خود را در ایشو بنویسید: + +1. چرا تمیز بودن کد و داشتن معماری خوب مهم است؟ چرا باید وقت و انرژی زیادی صرف طراحی و نوشتن کد تمیز شود؟ +1. چرا این موضوع در ابعاد صنعتی اهمیت بسیار بیشتری پیدا می‌کند؟ + +:::note ‌ +تلاش کنید **فقط با فکر خودتان و بحث با هم‌تیمی** به جواب سوالات بالا برسید تا ذهن شما برای مراحل بعد آماده شود. +::: + +:::caution ‌ +لطفا قبل از فکر کردن به این سوالات به سراغ مراحل بعدی و خواندن مقالات نروید! +::: + +حال برای فهم دلایل اهمیت کد تمیز در صنعت، [The Importance of Clean Code](https://www.arcanys.com/blog/the-importance-of-clean-code) +را در جواب سوال اول و [Why software maintainability is crucial - TechHQ](https://techhq.com/2019/06/why-software-maintainability-is-crucial/) +را در جواب سوال دوم مطالعه کنید. + +:::note ‌ + احتمالا تا به حال نام کتاب clean code را شنیده‌اید. خوب است برای فهم پاسخ سوال بالا، فصل اول این کتاب را در نیز مطالعه کنید. نویسنده این کتاب یعنی Robert C.Martin که به uncle bob مشهور است، دوره‌ای نیز با همین عنوان دارد که در قالب ویدیو، فصول مختلف این کتاب را توضیح می‌دهد. لذا به جای مطالعه کتاب، می‌توانید از [این ویدیو](https://dl.git.ir/cdn3/1393/02/Clean.Coders.01.Clean.Code_git.ir.rar) نیز استفاده کنید. + +همچنین توجه شود که ما در طول مسیر کاری خود به عنوان مهندس نرم‌افزار، حتما به قسمت‌های دیگر این کتاب نیز مراجعه خواهیم کرد و مسیر رشد شما از این کتاب خواهد گذشت، اما در این بخش تنها به مطالعه همین فصل از کتاب بسنده می‌کنیم. +در انتهای همین فاز نیز لینکی حاوی خلاصه‌ای از فصول کتاب قرار داده شده است. +::: + +## اصول S.O.L.I.D + +تا به حال، به بررسی مواردی پرداختیم که صرفا به کوچک و بزرگی توابع و کلاس‌ها، عدم استفاده از کد تکراری و مسائل سطحی در تمیزی کد اشاره می‌کردند. اما یکی از مهم‌ترین نکات در کدنویسی تمیز، داشتن یک معماری تمیز است! + +تصور کنید بخواهید پروژه‌تان را بزرگ‌ و بزرگ‌تر کنید و قابلیت‌های متعدد دیگری را به آن اضافه کنید. امروز ممکن است بخواهید خروجی برنامه را در کنسول، و روز دیگر ممکن است بخواهید آن را در وبسایت مشاهده کنید. نکته بسیار مهم آنکه نیاز‌مندی‌های پروژه‌ها و قابلیت‌هایی که دارند، در طول زمان دچار تغییر می‌شوند و باید دوباره به کد اصلی مراجعه کنیم و امکانات آن را بیشتر و بهتر کنیم. اما اگر معماری ما تمیز نباشد، این کار بسیار پرهزینه خواهد بود، به طوریکه شاید هزینه از اول نوشتن و ساختن آن پروژه کمتر باشد. + +اصول پنج‌گانه SOLID یکی از **مهم‌ترین** مجموعه اصول مهندسی نرم‌افزار است که به ما در طراحی و معماری صحیح‌تر یک سیستم کمک می‌کند. به گونه‌ای که ایجاد تغییر و افزودن امکانات بیشتر به پروژه، سریع‌تر و راحت‌تر انجام شود. این اصول عبارت‌اند از: + +1. **S**ingle Responsibility +1. **O**pen for Extension/Closed for Modification +1. **L**iskov Substitution +1. **I**nterface Segregation +1. **D**ependency Inversion + +برای آشنایی با اصول SOLID لینک‌های زیر را مطالعه کنید: + +- [SOLID Principles in Java Application Development](https://www.jrebel.com/blog/solid-principles-in-java) +- [S.O.L.I.D principles in Java](https://medium.com/@karthikcsridhar/s-o-l-i-d-principles-in-java-1aaff453d7ea) + +:::tip‌ +برای مطالعه بیشتر می‌توانید[A Solid Guide to SOLID Principles](https://www.baeldung.com/solid-principles) +را مطالعه کنید. همچنین توصیه می‌شود در صورت نیاز، هر یک از اصل‌ها را به طور مجزا مطالعه نموده تا مفهوم آن را به طور عمیقی درک کنید. +::: + +## جستجوی کثیف! + +هم‌اکنون که مفاهیم مختلف مربوط به کد تمیز را یاد گرفته‌اید، احتمالا ایده‌های زیادی برای بهبود سرویس جستجویی که در فاز قبل پیاده کرده‌اید به ذهنتان رسیده است. +اینکه چطور از اصول solid استفاده کنیم، +چه code smell هایی در کدمان وجود دارد، +و اینکه چطور می‌توان معماری برنامه را به گونه‌ای طراحی کرد تا توسعه قابلیت‌ روی آن ساده‌تر شود. + +به عنوان پروژه این بخش می‌خواهیم به سراغ پروژه جستجوی فاز قبل رفته و آن را تمیز کنیم. اما این بار با این فرض که می‌خواهیم، موتور جستجوی خودمان را در قالب یک کتابخانه به دنیا معرفی کنیم، یا به طور ساده‌تر، در گیت‌هاب به عنوان یک ابزار آن را ارائه کنیم. + +در این صورت لازم است کتابخانه ما انعطاف مناسبی را در اختیار برنامه‌نویسانی که از آن استفاده می‌کند قرار بدهد، تا در صورت نیاز، آن فرد بتواند استفاده‌های خاص‌منظوره خودش را نیز با کتابخانه ما برطرف کند. با این نگاه، لازم است نکات زیر را مد نظر قرار دهید و ببینید چگونه می‌توانید آن‌ها را برطرف کنید. + +* با مفهوم normalization در فاز قبل آشنا شدیم. تصور کنید بسته به نیاز، یک فرد بخواهد از روش خاصی برای این کار استفاده کند؛ مثلا بخواهد همه نقطه‌ها و علائم نگارشی را حذف کند. + +* به عنوان یک گام مهم در ساخت inverted index، از مفهوم tokenizer استفاده کردیم تا کلمات را بر حسب `space` از هم جدا کنیم. اما اگر فردی بخواهد بر اساس معیار‌های خودش (مثلا بر حسب `،` (ویرگول) این کار را بکند) چطور؟ + +:::note +امکاناتی که در این فاز و فاز‌های بعد ذکر می‌شوند، مسیر جالبی را طی خواهند کرد تا در نهایت شما را به یک نسخه ساده‌شده از یکی از بزرگترین پروژه‌های متن‌باز دنیا در زمینه جستجو برسانند! شما هم می‌توانید مشابه ساده‌شده این سرویس را پیاده‌سازی کرده و آن را با امکاناتی که خودتان طراحی کرده‌اید در دسترس برنامه‌نویسان جهان قرار دهید! +::: + +## Code Review + +![](./images/phase02-codeReview.png) + +بخش مهمی از یادگیری اصول کد‌نویسی تمیز، هنگام بررسی کد‌های دیگران و یافتن نقاط قوت و ضعف آن‌ها ایجاد می‌شود. همچنین با این کار، شما روش‌های مختلف حل مسئله را توسط افراد دیگر خواهید داد و می‌توانید از آن‌ها ایده بگیرید. + + در این قسمت، ابتدا یک Pull Request ایجاد کنید و از یک تیم دیگر بخواهید Pull Request شما که در مرحله‌ی قبل ساخته‌اید را Review کنند و بر اساس لیست Code Smellها به شما بازخورد بدهند (روی Pull Request کامنت بگذارند)، در این مرحله حتما از تیم‌های دیگر هم سراغ شما می‌آیند و می‌خواهند کدشان را Review کنید، قبل از Review کد دیگران، راهنماهای زیر را مطالعه کنید و Review خود را بر اساس این راهنماها انجام دهید: + +- [What to look for in a code review](https://google.github.io/eng-practices/review/reviewer/looking-for.html) +- [Effective Code Reviews: Code Review Checklist](https://github.com/nyu-cds/effective-code-reviews/blob/master/_episodes/03-checklist.md) + +:::note ‌ +با توجه به این که در این فاز صحبتی در مورد انواع تست به خصوص Unit Test نکردیم قسمت‌هایی از لینک‌های بالا که در مورد تست است را نادیده بگیرید. +::: + +:::tip‌ +معماری، طراحی و تمیزی پروژه شما در این فاز در نهاست توسط منتور شما به طور دقیق مورد بررسی قرار خواهد گرفت و کامنت‌هایی روی آن ارائه خواهد شد. بخش مهمی از محتوای آموزشی شما نیز در طول این code review ها که توسط منتورتان انجام می‌شود به شما ارائه خواهد شد. لذا در مطالعه این کامنت‌ها دقت کافی را بخرج دهید. +::: +## مطالعه بیشتر: + +در این فاز تلاش کردیم تا با اصلی‌ترین اصول کد‌نویسی تمیز آشنا شویم، اما طبیعی است، جزییات و نکات بسیار زیادی در این زمینه وجود دارد، به طوریکه کتاب معروف [clean code](https://dl.ebooksworld.ir/books/Clean.Code.A.Handbook.of.Agile.Software.Craftsmanship.by.Robert.C.Martin-Pearson-9780132350884-EBooksWorld.ir.rar)، به همین منظور نوشته شده است. پیشنهاد می‌شود برای یادگیری بیشتر، خلاصه کتاب [clean code](https://github.com/JuanCrg90/Clean-Code-Notes) را مطالعه کنید. + diff --git a/docs/software-engineering-quick/phase03-advanceJava.md b/docs/software-engineering-quick/phase03-advanceJava.md new file mode 100644 index 00000000..6120a70e --- /dev/null +++ b/docs/software-engineering-quick/phase03-advanceJava.md @@ -0,0 +1,129 @@ +--- +title: A deeper look +description: 'getting familiar with advance topics in software engineering and also Java language' +--- + +![](./images/phase03-advanceJava.png) + +## مقدمه + +در این فاز می‌خواهیم به سراغ مفاهیم عمیق‌تر در مهندسی نرم‌افزار و همچنین مباحث پیشرفته در زبان جاوا برویم. + +## نام‌گذاری‌ها در Java + +یکی از گام‌های مهم یادگیری هر زبان برنامه‌نویسی یادگیری اصول نام‌گذاری آن می‌باشد. شاید نام‌گذاری در وهله اول مورد مهمی به نظر نرسد اما این موضوع از جهتی اهمیت دارد که نباید کد شما نسبت به کدهای جامعه برنامه نویسان آن زبان تافته جدا بافته باشد. برای آشنایی با این قواعد صفحات زیر را مطالعه کنید: + +* [Oreillly](https://www.oreilly.com/library/view/java-8-pocket/9781491901083/ch01.html) +* [GeeksForGeeks](https://www.geeksforgeeks.org/java-naming-conventions/) + +![](./images/phase03-stream.jpg) + +## Stream + +فرض کنید می‌خواهیم در لیست زیر، نام افرادی که نامشان با a (بدون حساسیت به بزرگ‌ یا کوچک بودن حروف) شروع می‌شود را به صورت مرتب شده در خروجی چاپ کنیم: + +```java +List myList = Arrays.asList( "Ashkboos aval", “arash kamangir”, “Ashkboos panjom”, “ario Barzan”, “Leily”, "Majnoon", "bahram Goooor", "Amene"); +``` + +احتمالا برای این کار از حلقه استفاده می‌کنیم. روی هر المان حرکت می‌کنیم، آن را به صورت lowercase یا uppercase در می‌آوریم، شروع‌شدنش با a (یا A) را چک می‌کنیم و اگر شرط برقرار بود آن را در لیست دیگری که تعریف کرده‌ایم قرار می‌دهیم. در نهایت هم sort اش می‌کنیم: (تقریبا سودوکد این فرایند به صورت زیر می‌شود) + +```java + List result = new ArrayList<>(); + + for (String name : myList) + if (name.toUpperCase().startsWith("A")) + result.add(name); + + result.sort(null); + + for (String name : result) + System.out.println(name); +``` + +### خبر خوب! + +از جاوای ۸ به بعد، امکانی با عنوان Stream API به این زبان اضافه شده است تا کار با مجموعه‌ها (collection) ها را سریع‌تر و ساده‌تر کند. استریم‌ها به ما این امکان را می‌دهند که بتوانیم روی مجموعه‌ای از داده‌ها عملیات‌های مختلفی از جمله filter، جمع، میانگین‌گیری، تبدیل کردن به یک شیء دیگر و … را انجام دهیم. + +برای استفاده از آن‌ها کافیست ابتدا مجموعه‌ای که داریم را به شی از نوع Stream تبدیل کنیم. با این کار می‌توانیم از عملگر‌های میانی (intermediate) و در نهایت از عملگر‌های پایانی (terminal) برای تحویل داده استفاده کنیم. +برای یادگیری نحوه ساختن Stream از مجموعه دادگان، [این لینک](https://www.geeksforgeeks.org/10-ways-to-create-a-stream-in-java/) را مطالعه کنید. + +همچنین برای آشنایی بیشتر با Stream ها و عملگر‌های آن، مطالعه [این لینک](https://stackify.com/streams-guide-java-8/) توصیه می‌شود. +حال برای درک تفاوت و چگونگی استفاده از استریم، مسئله‌ای که در ابتدا بیان کردیم را با استفاده از استریم‌ بازنویسی کنید و پاسخ را در ایشوی خود بنویسید. + +:::tip +یکی از الگوهای جالب در مهندسی نرم‌افزار که معمولا در طراحی API ها به کار می‌روند، [Fluent API](https://java-design-patterns.com/patterns/fluentinterface/#explanation) است. در ادامه مسیر مهندسی نرم‌افزار (حتی در همین فاز) یکی از کاربردهای این الگو‌ را خواهید دید و همچنین در صورت تمایل می‌توانید از آن در طراحی موتور جستجویتان ایده بگیرید. +::: + +## Lambda + +اگر چرخی در دنیای برنامه‌نویسی زده باشید احتمالا نام توابع lambda به گوشتان خورده است. در واقع نام دیگر آنها توابع ناشناس است. توابعی که نام ندارند و معمولا برای کار‌های خاص و بسیار کوتاه‌مدت استفاده می‌شوند. در [اینجا](https://www.w3schools.com/java/java_lambda.asp) می‌توانید با این توابع آشنا شوید. + +:::info +در این باره می‌توانید نگاهی به تاریخچه توابع لامبدا که از ریاضیات نشأت گرفته است بیندازید. قسمت motivation از [این مقاله](https://en.wikipedia.org/wiki/Lambda_calculus#Motivation) را مطالعه کنید. + +::: + + +## Method Reference + +یکی از عملگرهای جالب برای فراخوانی توابع در زبان جاوا عملگر دو نقطه :: است که می‌تواند سبب کوتاه‌ شدن و افزایش خوانایی کد بشود. در [اینجا](https://www.baeldung.com/java-method-references) می‌توانید با این عملگر آشنا شوید و نحوه استفاده از آن را بیاموزید. + +برای مثال، در تکه کد زیر می‌توانید نمونه‌ کاربرد لامبدا و همچنین عملگر :: را ببینید: + +```java +myList.stream().map(String::toUpperCase).map(String::trim).filter(s -> s.startsWith("A")) +.sorted().forEach(System.out::println); +``` + +## Maven + +توسعه‌دهندگان برای اشتراک گذاشتن و دریافت کدهای به اشتراک گذاشته شده از ابزارهایی تحت عنوان Package Manager استفاده می‌‌کنند. یکی از معروف‌ترین و بهترین این ابزار‌ها Maven است که اولین بار در پروژه توربین جاکارتا برای ساده سازی فرایندهای ساخت استفاده شد. واژه Maven به معنای «جمع‌کننده دانش» است. موارد زیر، از اهداف تولید این ابزار است: + +* یک روش استاندارد برای ساخت پروژه ها +* یک تعریف مشخص از اجزای تشکیل دهنده‌ی پروژه +* یک روش آسان برای انتشار اطلاعات پروژه +* یک راه برای به اشتراک گذاشتن JAR ها در چندین پروژه + +در کل می‌توان گفت که Maven باعث شده که کار روزمره توسعه دهندگان جاوا آسان‌تر شود و به توسعه پروژه‌های مبتنی بر جاوا کمک زیادی کرده است. + +این ابزار، مکانیزم‌هایی برای ایجاد، نگهداری و استفاده از کدها ارائه می‌دهد که برای هر کدام از این مکانیزم‌ها ابزارهایی نیز فراهم کرده است. هنگام استفاده از Maven +توسعه‌دهنده نگران دریافت و اشتراک کدها نمی‌باشد چرا که خود Maven +این عملیات‌ها را مدیریت می‌کند. در نتیجه می‌توان گفت که کار روزمره توسعه‌دهندگان جاوا را آسان‌تر کرده و تولید پروژه‌های بزرگتر را تسریع بخشیده است. + +برای شروع به کار میتوانید به [Maven in 5 Minutes](https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html) مراجعه کنید. +سپس مستند [Maven Getting Started Guide](https://maven.apache.org/guides/getting-started/index.html) را بخوانید و به لیست دستورات زیر تسلط پیدا کنید: +(لازم است توضیح کوتاهی درباره عملکرد هر یک در ایشو بدهید.) + +* validate +* compile +* test +* package +* install +* deploy + +## لومبوک +لومبوک یک کتابخانه جاوا است که به طور خودکار به ویرایشگر شما متصل می شود و ابزارهایی را ایجاد می کند که شما را از کدهای تکراری و خسته کننده نجات می‌دهد. + +شما با استفاده از این کتابخانه سرعت کدنویسی خود را چندبرابر می‌کنید بدون آنکه کیفیت کد شما پایین بیاید . در ضمن لومبوک به شما کمک می‌کند که با حذف Boilerplate Code خوانایی کد خود را بالاتر ببرید. + +برای آشنایی بیشتر با لمبوک می‌توانید به [این لینک](https://javacup.ir/introduction-to-lombok/) مراجعه نمایید + +:::caution +توجه کنید که کتابخانه lombok بسیار گسترده است و امکانات بسیار متعددی دارد. به طور کلی اما موارد زیر را لازم است حتما بیاموزیم. (به طور سطحی و بدور از پیچیدگی‌ها و قابلیت‌های جزیی‌ای که دارند) + +* @Setter +* @Getter +* @Builder +* @RequiredArgsConstructor and other constructor-related ones +* @ToString +::: + +:::tip +یکی از انواع الگو‌های طراحی که در ساخت اشیا کاربرد دارد، الگوی Builder است. در این باره می‌توانید [اینجا](https://refactoring.guru/design-patterns/builder) مطالعه کنید. + +خوب است شیوه [پیاده‌سازی این الگو در زبان جاوا](https://www.baeldung.com/java-builder-pattern) , و استفاده از کتابخانه لومبوک را مطالعه کنید. +::: + +## مطالعه بیشتر: +فصل دوم و سوم از کتاب clean code را مطالعه کنید. همچنین می‌توانید از ویدیو‌های uncle bob به جای مطالعه متن کتاب‌ها استفاده کنید. diff --git a/docs/software-engineering-quick/phase04-software-testing.md b/docs/software-engineering-quick/phase04-software-testing.md new file mode 100644 index 00000000..5bcde738 --- /dev/null +++ b/docs/software-engineering-quick/phase04-software-testing.md @@ -0,0 +1,76 @@ +--- +title: Unit Test +description: 'a brief look into software testing ...' +--- + +## مقدمه +در این فاز با Unit Test +و مفهوم Code Coverage +آشنا می‌شوید. همچنین برای کدی که در فازهای قبلی نوشته‌اید، تست می‌نویسید و کیفیت کد خود را بیش از پیش افزایش می‌دهید. + +خوب است اما نیم‌نگاهی به مسئله تست به طور کلی داشته باشیم. در تصویر زیر می‌توانید سطوج مختلف تست را مشاهده کنید: + +![](./images/phase04-level-of-testing.png) + +## مفهوم Unit Test و اهمیت آن + +برای آگاهی از اهمیت نوشتن Unit Test +در فرایند توسعه نرم‌افزار، لینک‌های زیر را مطالعه کنید: + +- [Unit Testing - Important role in Software Development](https://medium.com/nonstopio/unit-testing-important-role-in-software-development-1f52f7c810f8) +- [Why Is Unit Testing Important in Software Development?](https://performancelabus.com/unit-testing-importance/) +- [The importance of Unit Testing](https://fortegrp.com/the-importance-of-unit-testing/) +- [Time difference between developing with unit tests vs no tests](https://softwareengineering.stackexchange.com/questions/322256/time-difference-between-developing-with-unit-tests-vs-no-tests) + + +![](./images/phase04-Top-Reasons-To-Unit-Test.png) + +## مفهوم Code Coverage در Unit Testing و اهمیت آن + +پس از مطالعه و درک مفهوم Unit Testing +و اهمیت آن در توسعۀ‌ نرم‌افزار، برای درک مفهوم Code Coverage +و اهمیت آن لینک‌های زیر را مطالعه کنید: + +- [Code Coverage - Wikipedia](https://en.wikipedia.org/wiki/Code_coverage) +- [5 Reasons You Should Care about Code Coverage](https://eldarion.com/blog/2017/07/13/5-reasons-you-should-care-about-code-coverage/) +- [The Importance of Code Coverage](https://blog.cloudboost.io/the-importance-of-code-coverage-9b4d513f39b4) + +## نوشتن Unit Test در java با استفاده از jUnit + +برای شروع کار با jUnit پیشنهاد می‌شود [Getting Started with jUnit Code](https://riptutorial.com/junit) را مطالعه کنید. همچنین می‌توانید نحوۀ مشاهدۀ Code Coverage +را در intelliJ Idea از طریق [این لینک](https://www.jetbrains.com/help/idea/running-test-with-coverage.html) ببینید. + + +## تاثیر اصول SOLID بر Unit Testing + +برای آگاهی از تاثیر رعایت اصول SOLID +بر تست‌نویسی [SOLID, Object Oriented Design and Unit Testing](https://huestones.co.uk/2015/06/solid-object-oriented-design-and-unit-testing/) +را مطالعه کنید. + + +## آشنایی با مبانی TDD + +برای درک مفهوم TDD +و مراحل آن لینک‌های زیر را مطالعه کنید: + +- [Testing Software: What is TDD?](https://medium.com/javascript-scene/testing-software-what-is-tdd-459b2145405c) +- [Test Driven Development (TDD): The Advantages and Disadvantages](https://medium.com/@stevenpcurtis.sc/test-driven-development-tdd-the-advantages-and-disadvantages-5347899ead90) + +## آشنایی بیشتر با اصول SOLID و تاثیر آن بر TDD + +در این مرحله، فکر کنید که هر یک از اصول SOLID، +چگونه می‌تواند بر ساده‌تر شدن روند TDD +تاثیر بگذارد. با هم‌تیمی خود در این مورد بحث کنید. + +در ادامه برای درک این موضوع لینک‌های زیر را مطالعه کنید: + +- [SOLID design principles make test-driven development (TDD) faster and easier](https://medium.com/ibm-garage/solid-design-principles-makes-test-driven-development-faster-and-easier-35c9eec22ff1) +- [Does test-driven development force me to follow SOLID?](https://softwareengineering.stackexchange.com/a/111868) + +## در جستجوی تست! + +حال می‌خواهیم پروژه‌های که پیشتر ساخته‌ایم را یک قدم به محصول واقعی نزدیک‌تر کنیم و برای آن یونیت‌تست بنویسیم. با استفاده از دانشی که در این فاز بدست آورده‌اید سعی کنید برای هسته اصلی این سرویس جست‌وجو (فقط هسته اصلی!) یونیت‌تست بنویسید و coverage آن بخش از پروژه را به ۱۰۰٪ نزدیک کنید. + +همچنین در این فاز می‌خواهیم یک ویژگی جدید و جالب را به پروژه‌مان اضافه کنیم. تصور کنید لیست بلندی از کاربران پیام‌رسان را در اختیار دارید که هر کدام دارای نام و نام خانوادگی مشخصی به صورت یکتا هستند. حال به عنوان یک کاربر می‌خواهیم لیستی از افرادی که نام و یا نام خانوادگیشان با عبارت `` آغاز می‌شود را پیدا کنیم. مشابه زمانی که به دنبال یک کالای خاص در فروشگاه اینترنتی می‌گردیم ... +حال از شما می‌خواهیم این قابلیت را برای برنامه خود با رویکرد TDD پیاده‌سازی کنید. به نظرتان چگونه می‌توان از چنین قابلیتی پشتیبانی کرد. + diff --git a/docs/software-engineering-quick/phase05-ci-cd.md b/docs/software-engineering-quick/phase05-ci-cd.md new file mode 100644 index 00000000..c46f4fe5 --- /dev/null +++ b/docs/software-engineering-quick/phase05-ci-cd.md @@ -0,0 +1,47 @@ +--- +title: CI/CD +description: 'Just push it!' +--- + +![cicd](./images/phase05-ci-cd.jpg) + +## مقدمه + +در این فاز با مفهوم CI/CD +و اهمیت استفاده از آن آشنا می‌شوید و سپس پروژهٔ خود را به CI/CD +مجهز می‌کنید. + +## CI/CD چیست و چرا اهمیت دارد + +برای درک مفهوم CI/CD +و اهمیت آن لینک‌های زیر را مطالعه کنید. + +- [What is CI/CD?(redhat)](https://www.redhat.com/en/topics/devops/what-is-ci-cd) +- [The Journey to CI/CD](https://medium.com/driven-by-code/the-journey-to-ci-cd-b1872927c36b) + +## GitHub Actions + +یکی از ابزارهای CI/CD معروف، GitHub Actions است که به کمک آن، می‌توانیم یک Pipeline شامل عملیات build، اجرای unit testها، انتشار package و دیگر عملیاتی که در دستهٔ CI/CD می‌گنجد را به Repository خود اضافه کنیم. +برای آشنایی و ساخت یک نمونه pipeline، [این مستند](https://docs.github.com/en/actions/quickstart) را مطالعه کنید. + +حال که با مفهوم کلی CI/CD و همچنین github actions آشنا شدید، می‌خواهیم یک pipeline برای ریپازیتوری موتور جست‌وجو بسازیم. برای این کار، در زبان جاوا، [این مستند](https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven) را مطالعه کنید. + +## badges + +![badges](./images/phase05-badges.png) + +احتمالا تا به حال در گیت‌هاب با ریپو‌هایی مواجه شده‌اید که دارای اطلاعات جالبی در ابتدای فایل readme خود بوده‌اند. به این باکس‌های کوچک، به اصطلاح badge گفته می‌شود. +شما نیز با کمک [این لینک](https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge)، به پروژه خود یک badge اضافه کنید. + +## اختیاری +همچنین می‌توانید به پروژه خود، code coverage badge اضافه کنید تا اطلاعات مربوط به کاورج تست‌های پروژه را نیز در readme خود نمایش دهید. + +## عاقلان را یک اشارت بس بود … + +سرنخ زیر را بگیرید و اگر مایل بودید، آن را به pipeline خود اضافه کنید: + +:::tip +SonarQube +::: + +همچنین بعد‌ها برای deploy پروژه خود نیز می‌توانید از امکانات github actions استفاده کنید. مثلا در فاز پروژه می‌توانید این کار را انجام دهید و هر بار، خروجی پروژه را مشاهده کنید.