TECH STASH pinned «مهم ترین جا برای پیدا کردن منابع تورنت و کلا pirate کردن اینجاست. در واقع بهشت دزدای دریاییه. https://www.reddit.com/r/Piracy/wiki/index/ یه بخش Megathread داره که داخلش میتونید هر جایی که قابل اعتماد هست برای دانلود رو گیر بیارید. یا حتی آموزش بلاک کردن…»
TECH STASH pinned «از دو تا سایت هم برای جستجوی Torrent استفاده میکنم. اولی: 1337x اگر اینجا چیزی رو پیدا نکردید یکم با کلمات جستجو بازی کنید. دومی: bitsearch اگر هم دیگه نشد. این جستجوی بهتری داره نسبت به قبلی. پی نوشت: لینک هارو حذف کردم ولی داخل کانال دیگه گذاشتم که میتونید…»
TECH STASH pinned «چند وقتی هست که با academic torrent آشنا شدم. اسمش و ظاهرش به نظر میاد که فقط دیتاست برای ریسرچ داره ولی کلی آموزش های AI و ML توش ریخته. حتی طراحی الگوریتم و ساختمان داده. پی نوشت: لینک هارو حذف کردم ولی داخل کانال دیگه گذاشتم که میتونید ازش استفاده کنید.»
TECH STASH
آموزش الگوریتم و ساختمان داده توسط Primeagen. البته که با Typenoscript هست ولی من میبینم چون Primeagen درس دادتش :) https://frontendmasters.com/courses/algorithms/
این آموزش رو تموم کردم. به نظرم یکی از بی نظیر ترین آموزش هایی بود راجب طراحی الگوریتم که تا حالا دیدم.
همش هم به لطف استادش بود ThePrimeagen و مباحثی که کاور شد خیلی بدرد استفاده صنعتی یا سوالات مصاحبه میخوره.
مباحثی که کاور میشه:
1. Search (Linear Search, Binary Search, Two Crystal Problem)
2. Sort (Bubble Sort, Quick Sort)
3. Basic DSA (Queue, Stack, LinkedList, ArrayList)
4. Recursion (Maze Solving Algorithm)
5. Trees (BFS, DFS)
6. Tree Manipulation (DF insert, DF delete)
7. Heap and Tries
8. Graphs (BFS Adjacency Matrix, DFS Adjacency List, Dijkstra's Shortest Path)
9. Maps, LRU cache
از اونجایی که الگوریتم و ساختمان داده چیزی نیست که به زبان برنامه نویسی مرتبط باشه میتونه خیالتون راحت باشه که هر زبانی هم بلد باشید این مطالب براتون صدق میکنه.
البته یه ایرادی هم که این دوره داشت این بود که همه الگوریتم ها به صورت کد پیاده نشدن و یه سریاشون فقط توضیح داده شدن از لحاظ کارکرد و مشق های ناگفته زیادی هست که باید بنویسید تا واقعا این دوره رو یادش بگیرید.
برای مثال Map پیاده سازی نشده (ولی خب سخت هم نبود و خودم انجامش دادم)
دوره ساده ای نیست. ولی وقتی که یادش بگیرید درکتون رو از نحوه کارکرد زبان های سطح بالا بیشتر میکنه (مثلا Map واسه lookup کردن ساخته شده و مثل دیکشنری تو پایتون یا object تو JavaScript میمونه)
(پارت دو هم داره که بزودی میبینم و نظراتم رو میزارم.)
همش هم به لطف استادش بود ThePrimeagen و مباحثی که کاور شد خیلی بدرد استفاده صنعتی یا سوالات مصاحبه میخوره.
مباحثی که کاور میشه:
1. Search (Linear Search, Binary Search, Two Crystal Problem)
2. Sort (Bubble Sort, Quick Sort)
3. Basic DSA (Queue, Stack, LinkedList, ArrayList)
4. Recursion (Maze Solving Algorithm)
5. Trees (BFS, DFS)
6. Tree Manipulation (DF insert, DF delete)
7. Heap and Tries
8. Graphs (BFS Adjacency Matrix, DFS Adjacency List, Dijkstra's Shortest Path)
9. Maps, LRU cache
از اونجایی که الگوریتم و ساختمان داده چیزی نیست که به زبان برنامه نویسی مرتبط باشه میتونه خیالتون راحت باشه که هر زبانی هم بلد باشید این مطالب براتون صدق میکنه.
البته یه ایرادی هم که این دوره داشت این بود که همه الگوریتم ها به صورت کد پیاده نشدن و یه سریاشون فقط توضیح داده شدن از لحاظ کارکرد و مشق های ناگفته زیادی هست که باید بنویسید تا واقعا این دوره رو یادش بگیرید.
برای مثال Map پیاده سازی نشده (ولی خب سخت هم نبود و خودم انجامش دادم)
دوره ساده ای نیست. ولی وقتی که یادش بگیرید درکتون رو از نحوه کارکرد زبان های سطح بالا بیشتر میکنه (مثلا Map واسه lookup کردن ساخته شده و مثل دیکشنری تو پایتون یا object تو JavaScript میمونه)
(پارت دو هم داره که بزودی میبینم و نظراتم رو میزارم.)
TECH STASH
واسه دوستانی که تو پایتون مشکل دارن یا دوست دارن چیزایه جدیدی راجبش یاد بگیرن این چنل های یوتیوب خیلی کمک کننده هست https://www.youtube.com/@BroCodez چنلی که باهاش شروع به یادگیری پایتون کردم. https://www.youtube.com/@coreyms آموزش های خیلی خیلی خوب و اصولی…
یک سری از دوستان خواستن که ریفرنسی که دقیقا یادگیری پایتونم رو باهاش شروع کردم به اشتراک بگذارم.
بنده از roadmap خاصی استفاده نکردم و مباحثی که کاربردی و جالب به نظر میومدن رو یاد گرفتم و جلو رفتم. منابع مرجع بیشتر این مباحث از این کانال ها بودن.
اما آموزش دقیقی که استفاده کردم برای یادگیری پایتون این بود.
Python tutorial for beginners 🐍
یک سری ویدیو های جدید هم جدیدا آپلود کرده که مباحث قبلی رو کامل تر کرده.
ولی خب بعد از اون میتونید با ریفرنس های بالا اطلاعاتتون رو تکمیل تر کنید.
چون خیلی چیزا هستن که نمیشه با یه آموزش مقدماتی یاد گرفت.
بنده از roadmap خاصی استفاده نکردم و مباحثی که کاربردی و جالب به نظر میومدن رو یاد گرفتم و جلو رفتم. منابع مرجع بیشتر این مباحث از این کانال ها بودن.
اما آموزش دقیقی که استفاده کردم برای یادگیری پایتون این بود.
Python tutorial for beginners 🐍
یک سری ویدیو های جدید هم جدیدا آپلود کرده که مباحث قبلی رو کامل تر کرده.
ولی خب بعد از اون میتونید با ریفرنس های بالا اطلاعاتتون رو تکمیل تر کنید.
چون خیلی چیزا هستن که نمیشه با یه آموزش مقدماتی یاد گرفت.
YouTube
Python tutorial for beginners 🐍
Learn to code using Python 🐍
فرمت YAML
فرمت معروفی که تمام DevOps کارا ازش استفاده میکنن تا کانفیگ بنویسن.
ابزار های زیادی ازش پشتیبانی میکنن. مثل docker-compose, ansible و ...
اونقدر محبوب هست که خوبه برنامه نویسا هم راجبش بدونن.
تو این ویدیو راجب این فرمت صحبت میشه و اینکه ساختارش چطوریه.
آره میدونم، خیلی گیج کننده هست و موندم چطور واسه این parser نوشتن :)
Yaml Tutorial | Learn YAML in 18 mins
فرمت معروفی که تمام DevOps کارا ازش استفاده میکنن تا کانفیگ بنویسن.
ابزار های زیادی ازش پشتیبانی میکنن. مثل docker-compose, ansible و ...
اونقدر محبوب هست که خوبه برنامه نویسا هم راجبش بدونن.
تو این ویدیو راجب این فرمت صحبت میشه و اینکه ساختارش چطوریه.
آره میدونم، خیلی گیج کننده هست و موندم چطور واسه این parser نوشتن :)
Yaml Tutorial | Learn YAML in 18 mins
YouTube
Yaml Tutorial | Learn YAML in 18 mins
YAML Tutorial for DevOps engineers | YAML Syntax explained with real examples
► Subscribe To Me On Youtube: https://bit.ly/2z5rvTV
In this complete YAML tutorial you will learn what YAML is, what it's used for and I demonstrate the basic YAML syntax with…
► Subscribe To Me On Youtube: https://bit.ly/2z5rvTV
In this complete YAML tutorial you will learn what YAML is, what it's used for and I demonstrate the basic YAML syntax with…
Forwarded from دستاوردهای یادگیری عمیق(InTec)
معنی اعداد خیلی مهم هست، اما ۹۹٪ جامعه هیچ درکی ازین موضوع ندارند
حتی ۹۹٪ جامعه دیتا هم درک نمیکنند.
امروز یک پروپوزال رو خوندم و یک قراردادی رو لغو کردم، هیچکس از اعضای تیم متوجه نشده بود و افرادی که ذوق این قرارداد رو داشتند مستقیم رفته بودند سراغ مدیرعامل.
(جزو وظایف من نیست که برای دیگران توضیح بدم چرا یک تصمیمی رو گرفتم، فقط باید به مدیر بالا سرم جواب بدم که ایشون هم هیچوقت نمیپرسند، بنا بر اعتماد)
اما وقتی دیدم اوضاع اینطوری هست، گفتم نکات آموزشی داخلش هست داخل کانال هم بذارم، البته با مثال که دیگه همگی درک کنید موضوع رو :
فرض کنید ۲ تا شرکت
توی یک سال ۹۹٪ یعنی حدوداً ۴ روز قطعی سیستم و ۹۹.۹٪ یعنی حدوداً ۹ ساعت قطعی سیستم و چون ممکنه قطعیها ۱۰ دقیقهای باشه حتی اگر توی ساعات مهم کاری شما پیش بیاد باعث از دست رفتن بیزینس میشه.
من مثال سرویس ابری زدم، چون این سرویسها تا ۳-۴ رقم اعشار گزارش میدهند، برای مثال خیلی سال قبل یادم هست دلیل انتخاب
خلاصه حواستون به همون حتی چند هزارم هم باشه، وقتی صحبت از اعداد بزرگ یا قرارداد بلند مدت میشه؛ ۰.۰۰۰۹ هم خیلی خیلی عدد با ارزشی خواهد بود.
حتی ۹۹٪ جامعه دیتا هم درک نمیکنند.
امروز یک پروپوزال رو خوندم و یک قراردادی رو لغو کردم، هیچکس از اعضای تیم متوجه نشده بود و افرادی که ذوق این قرارداد رو داشتند مستقیم رفته بودند سراغ مدیرعامل.
(جزو وظایف من نیست که برای دیگران توضیح بدم چرا یک تصمیمی رو گرفتم، فقط باید به مدیر بالا سرم جواب بدم که ایشون هم هیچوقت نمیپرسند، بنا بر اعتماد)
اما وقتی دیدم اوضاع اینطوری هست، گفتم نکات آموزشی داخلش هست داخل کانال هم بذارم، البته با مثال که دیگه همگی درک کنید موضوع رو :
فرض کنید ۲ تا شرکت
cloud provider دارید، شرکتی با قیمت بالاتر و گزارش ۹۹.۹٪ پایداری و شرکت دوم با قیمتی تا ۱۰٪ پایینتر و البته گزارش پایداری ۹۹٪ سالانه وقتی اعداد و ارقام بزرگ باشه؛ آدمها تفاوت ۰.۹٪ رو نمیبینند ولی تفاوت ۱۰٪ قیمت رو به خوبی میبینند.توی یک سال ۹۹٪ یعنی حدوداً ۴ روز قطعی سیستم و ۹۹.۹٪ یعنی حدوداً ۹ ساعت قطعی سیستم و چون ممکنه قطعیها ۱۰ دقیقهای باشه حتی اگر توی ساعات مهم کاری شما پیش بیاد باعث از دست رفتن بیزینس میشه.
من مثال سرویس ابری زدم، چون این سرویسها تا ۳-۴ رقم اعشار گزارش میدهند، برای مثال خیلی سال قبل یادم هست دلیل انتخاب
AWS توسط شرکت خودمون همین ۹۹.۹۹۹٪ نسبت به سرویس Google با ۹۹.۹٪ بود؛ و بعد از اون همه سرویسهای شرکت دیگه روی AWS فعال شد.خلاصه حواستون به همون حتی چند هزارم هم باشه، وقتی صحبت از اعداد بزرگ یا قرارداد بلند مدت میشه؛ ۰.۰۰۰۹ هم خیلی خیلی عدد با ارزشی خواهد بود.
Forwarded from Zoomit | زومیت
صفحه آبی مرگ ویندوز (BSOD) بانکها، خطوط هوایی و شبکههای تلویزیونی را در سراسر جهان دچار مشکل کرد
🔴 امروز هزاران دستگاه ویندوزی در سراسر جهان با مشکل صفحه آبی مرگ (BSOD) مواجه شدهاند که باعث از کار افتادن سرورها شده است. این مشکل که ناشی از یک بهروزرسانی معیوب از شرکت امنیت سایبری CrowdStrike است که موجب شده که کامپیوترها وارد حلقه بوت شوند و نتوانند به درستی ویندوز را اجرا کنند.
🔴 بانکها، خطوط هوایی و شبکههای تلویزیونی در استرالیا و اروپا از جمله شرکتهایی بوندند که تحت تأثیر این مشکل قرار گرفتهاند.
🔴 شبکه Sky News در بریتانیا و شرکت هواپیمایی Ryanair در اروپا از جمله کسبوکارهایی هستند که با این مشکل مواجه شدهاند.
🔴 مدیران IT یک شرکت در سایت Reddit گزارش دادهاند که بسیاری از کامپیوترها دچار مشکل شدهاند و برای حل مشکل، باید دستگاهها را به حالت امن (Safe Mode) بوت کرده و سپس پوشه CrowdStrike را حذف کنند!
🔴 کاربری در Reddit تایید کرده که این آپدیت باعث از کار افتادن تمام کامپیوترهای شرکت شده است.
🚀 🔴 @theZoomit
Please open Telegram to view this post
VIEW IN TELEGRAM
Zoomit | زومیت
صفحه آبی مرگ ویندوز (BSOD) بانکها، خطوط هوایی و شبکههای تلویزیونی را در سراسر جهان دچار مشکل کرد 🔴 امروز هزاران دستگاه ویندوزی در سراسر جهان با مشکل صفحه آبی مرگ (BSOD) مواجه شدهاند که باعث از کار افتادن سرورها شده است. این مشکل که ناشی از یک بهروزرسانی…
Just use linux, simple as that. :)
خب. آموزش بخش دوم آموزش Algorithm که Primeagen تدریس کرده بود (و پولی هم بود) رو چند وقتی هست که تموم کردم.
https://frontendmasters.com/courses/advanced-algorithms/
به اندازه بخش اول جذاب نبود. چون کاملا تئوری بود (رو تخته ای). ولی مبحث الگوریتم رو برای همیشه بست.
البته که از بخش Bloom Filter به شدت خوشم اومد و عین Hash Map کاربردی هست.
و همینطور m-WAY Tree ها که تو ساخت دیتابیس کاربرد دارن.
مباحثی که کاور شد به این صورته:
1. Binary Search Tree (مرور)
2. AVL / Red-Black Trees
3. m-WAY Tree and B-Tree
4. Graph (مرور)
5. Spanning Trees (Prim, Kruskal)
6. Dijkstra's algorithm oprimization with priority queue
7. Ford-Fulkerson: Max Flow, Min Cut
(دقیقا همین بحث سرگیجه زیادی برام ایجاد کرد، بعدا یه برشی روی این بحث میزنم)
8. Dynamic Programming (Factorials, Fibonacci, Max Subarray, Coin change problem)
9. Bonus Algorithm (Bloom Filter)
در کل فکر میکنم همون پارت اول کافی هست ولی اگر مثل من علاقه مند به این مباحث بودید میتونید این دوره رو ببینید.
تمامی بخش های این آموزش رو داخل کانال فرعی ام به اشتراک گذاشتم که میتونید ببینید. (نیاز نیست جوین بشید. چون پین هست همیشه)
بخش زیادی از الگوریتم های پارت اول رو به زبان پایتون پیاده کردم و قراره که یه repo گیت بزنم و kata-machine خودم رو داخلش قرار بدم تا شما هم استفاده کنید. و یا حتی تمرین کنید.
https://frontendmasters.com/courses/advanced-algorithms/
به اندازه بخش اول جذاب نبود. چون کاملا تئوری بود (رو تخته ای). ولی مبحث الگوریتم رو برای همیشه بست.
البته که از بخش Bloom Filter به شدت خوشم اومد و عین Hash Map کاربردی هست.
و همینطور m-WAY Tree ها که تو ساخت دیتابیس کاربرد دارن.
مباحثی که کاور شد به این صورته:
1. Binary Search Tree (مرور)
2. AVL / Red-Black Trees
3. m-WAY Tree and B-Tree
4. Graph (مرور)
5. Spanning Trees (Prim, Kruskal)
6. Dijkstra's algorithm oprimization with priority queue
7. Ford-Fulkerson: Max Flow, Min Cut
(دقیقا همین بحث سرگیجه زیادی برام ایجاد کرد، بعدا یه برشی روی این بحث میزنم)
8. Dynamic Programming (Factorials, Fibonacci, Max Subarray, Coin change problem)
9. Bonus Algorithm (Bloom Filter)
در کل فکر میکنم همون پارت اول کافی هست ولی اگر مثل من علاقه مند به این مباحث بودید میتونید این دوره رو ببینید.
تمامی بخش های این آموزش رو داخل کانال فرعی ام به اشتراک گذاشتم که میتونید ببینید. (نیاز نیست جوین بشید. چون پین هست همیشه)
بخش زیادی از الگوریتم های پارت اول رو به زبان پایتون پیاده کردم و قراره که یه repo گیت بزنم و kata-machine خودم رو داخلش قرار بدم تا شما هم استفاده کنید. و یا حتی تمرین کنید.
Frontendmasters
Advanced Algorithms: Trees, Graphs, and Dynamic Programming
Elevate your technical prowess in data structures and algorithms, focusing on trees, graph theory, and dynamic programming. Learn practical implementation and optimization techniques to solve complex algorithmic challenges efficiently.
کانالی که ساختم به منظور اشتراک آموزش ها و فایل های تورنتش.
(نیاز نیست عضو بشید، چون قراره پین باشه)
https://news.1rj.ru/str/+vLcBl3VB1UcwMWNk
پی نوشت: احتمال زیاد محتواش رو به این کانال انتقال بدم
(نیاز نیست عضو بشید، چون قراره پین باشه)
https://news.1rj.ru/str/+vLcBl3VB1UcwMWNk
پی نوشت: احتمال زیاد محتواش رو به این کانال انتقال بدم
TECH STASH pinned «کانالی که ساختم به منظور اشتراک آموزش ها و فایل های تورنتش. (نیاز نیست عضو بشید، چون قراره پین باشه) https://news.1rj.ru/str/+vLcBl3VB1UcwMWNk پی نوشت: احتمال زیاد محتواش رو به این کانال انتقال بدم»
TECH STASH
خب. آموزش بخش دوم آموزش Algorithm که Primeagen تدریس کرده بود (و پولی هم بود) رو چند وقتی هست که تموم کردم. https://frontendmasters.com/courses/advanced-algorithms/ به اندازه بخش اول جذاب نبود. چون کاملا تئوری بود (رو تخته ای). ولی مبحث الگوریتم رو برای…
آموزش بعدی که میبینم قطعا System Design هست.
Neetcode - System Design for Beginners
Neetcode - System Design Interview
Neetcode - System Design for Beginners
Neetcode - System Design Interview
چرا باید الگوریتم و ساختمان داده رو یاد بگیریم؟
شاید یکسری از شما با موضوع الگوریتم و ساختمان داده آشناییت داشته باشید اما اهمیتش رو داخل دانشگاه یا مراکز آموزشی دیگه بهتون نگفته باشن یا خوب جا نیفتاده باشه.
تو این پست میخوام راجب اهمیتش صحبت کنم که آیا بدردمون میخوره یا نه.
اول از تجربه شخصیم بگم.
طراحی الگوریتم تو زبان پایتون خیلی نیاز نیست.
خود پایتون بلوک های آماده برای ساخت برنامه هارو بهمون داده.
البته که مقداری دونستنش خیلی شما رو جلو میندازه.
مثلا برای نوشتن یک برنامه ای که از پردازش موازی برای پردازش مقدار عظیمی دیتا از یک فایل استفاده میکرد بنده از Queue استفاده کردم.
(البته که Queue امون باید Thread-safe باشه و خوشبختانه پایتون چنین دیتا استراکچر رو برامون آماده داره)
ممکنه زمانی نیاز به دیتا استراکچر یا الگوریتم خاصی داشته باشید که میخواید thread-safe باشه. اینجا دانش راجب این موضوعات کار رو براتون ساده میکنه.
جلوتر که میرید متوجه میشید که خود لیست پایتون یک پیاده سازی از ArrayList از CPython هست و همینطور دیکشنری هم یک HashMap محسوب میشه.
و همینطور جلوتر و جلوتر میرید میبینید که کل زیرساختی که روش دارید برنامه هاتون رو درست میکنید با الگوریتم و ساختمان داده کار میکنه.
خب چرا یاد نگیریم؟ هر برنامه نویس حرفه ای باید دانشی از لایه های پایین تر abstraction داشته باشه.
وارد زبان های دیگه میشی داستان ممکنه جالب تر هم بشه.
مثلا تو زبان C و زبان های دیگه که همه چیزو آماده براتون نگذاشتن خیلی خیلی کاربرد داره.
داخل C باید حتما آرایه های قابل بسط دادن رو خودتون پیاده سازی کنید.
دیکشنری نیست، باید خودتون HashMap رو بنویسید.
اونقدر بلوک های زبان C خام هستن که باید کل اکوسیستمتون رو بنویسید.
که از یه جهتی هیجان انگیز هست، چون که بیشتر تجربه کسب میکنید.
ولی خب وقتی وارد بحث درخت و گراف میشید میبینید که معمولا تو لایبرری ها و ابزار هایی که استفاده میکنید به کار میره.
درخت: درخت تصمیم، فایل سیستم، کامپایلر ها، تکمیل خودکار
گراف: شبکه های فضای مجازی، الگوریتم های مسیریابی و نقشه ها
شخصا چون لایبرری توسعه ندادم سر همین به کاربردی از اینا نخوردم.
ولی مطمئنم که یک جایی قطعا به کارم خواهد اومد.
ولی خب یک چیز مشخص هست. برترین شرکت های دنیا از سوالات الگوریتم و ساختمان داده برای ارزیابی مهارت های برنامه نویسی یک شخص استفاده میکنن.
اگر تو حوزه یادگیری ماشین و هوش مصنوعی کار میکنید که دونستنش واجب هست.
از دستش ندید.
.
شاید یکسری از شما با موضوع الگوریتم و ساختمان داده آشناییت داشته باشید اما اهمیتش رو داخل دانشگاه یا مراکز آموزشی دیگه بهتون نگفته باشن یا خوب جا نیفتاده باشه.
تو این پست میخوام راجب اهمیتش صحبت کنم که آیا بدردمون میخوره یا نه.
اول از تجربه شخصیم بگم.
طراحی الگوریتم تو زبان پایتون خیلی نیاز نیست.
خود پایتون بلوک های آماده برای ساخت برنامه هارو بهمون داده.
البته که مقداری دونستنش خیلی شما رو جلو میندازه.
مثلا برای نوشتن یک برنامه ای که از پردازش موازی برای پردازش مقدار عظیمی دیتا از یک فایل استفاده میکرد بنده از Queue استفاده کردم.
(البته که Queue امون باید Thread-safe باشه و خوشبختانه پایتون چنین دیتا استراکچر رو برامون آماده داره)
ممکنه زمانی نیاز به دیتا استراکچر یا الگوریتم خاصی داشته باشید که میخواید thread-safe باشه. اینجا دانش راجب این موضوعات کار رو براتون ساده میکنه.
جلوتر که میرید متوجه میشید که خود لیست پایتون یک پیاده سازی از ArrayList از CPython هست و همینطور دیکشنری هم یک HashMap محسوب میشه.
و همینطور جلوتر و جلوتر میرید میبینید که کل زیرساختی که روش دارید برنامه هاتون رو درست میکنید با الگوریتم و ساختمان داده کار میکنه.
خب چرا یاد نگیریم؟ هر برنامه نویس حرفه ای باید دانشی از لایه های پایین تر abstraction داشته باشه.
وارد زبان های دیگه میشی داستان ممکنه جالب تر هم بشه.
مثلا تو زبان C و زبان های دیگه که همه چیزو آماده براتون نگذاشتن خیلی خیلی کاربرد داره.
داخل C باید حتما آرایه های قابل بسط دادن رو خودتون پیاده سازی کنید.
دیکشنری نیست، باید خودتون HashMap رو بنویسید.
اونقدر بلوک های زبان C خام هستن که باید کل اکوسیستمتون رو بنویسید.
که از یه جهتی هیجان انگیز هست، چون که بیشتر تجربه کسب میکنید.
ولی خب وقتی وارد بحث درخت و گراف میشید میبینید که معمولا تو لایبرری ها و ابزار هایی که استفاده میکنید به کار میره.
درخت: درخت تصمیم، فایل سیستم، کامپایلر ها، تکمیل خودکار
گراف: شبکه های فضای مجازی، الگوریتم های مسیریابی و نقشه ها
شخصا چون لایبرری توسعه ندادم سر همین به کاربردی از اینا نخوردم.
ولی مطمئنم که یک جایی قطعا به کارم خواهد اومد.
ولی خب یک چیز مشخص هست. برترین شرکت های دنیا از سوالات الگوریتم و ساختمان داده برای ارزیابی مهارت های برنامه نویسی یک شخص استفاده میکنن.
اگر تو حوزه یادگیری ماشین و هوش مصنوعی کار میکنید که دونستنش واجب هست.
از دستش ندید.
.
TECH STASH
چرا باید الگوریتم و ساختمان داده رو یاد بگیریم؟ شاید یکسری از شما با موضوع الگوریتم و ساختمان داده آشناییت داشته باشید اما اهمیتش رو داخل دانشگاه یا مراکز آموزشی دیگه بهتون نگفته باشن یا خوب جا نیفتاده باشه. تو این پست میخوام راجب اهمیتش صحبت کنم که آیا…
در ادامه بحث قبلی گفتم مباحثی که خودم تو آموزش الگوریتمم خوندم رو با کاربرد بهتون بگم تا بهتر درک کنید که برای چی یاد میگیرید.
پارت اول:
Search (Linear Search, Binary Search, Two Crystal Problem)
کاملا مشخص هست. جستجو هایی که اتفاق میفته از الگوریتم های جستجویی که میبینید استفاده میکنه.
Sort (Bubble Sort, Quick Sort)
مرتب سازی خیلی مهم هست. چون بهمون اجازه استفاده از الگوریتم جستجو باینری رو میده. جدا از اون کاربرد های دیگه ای هم داره که واضح ان. برای مثال خود توابع sort زبان ما از یکی از این الگوریتم ها استفاده میکنن.
Basic DSA (Queue, Stack, LinkedList, ArrayList)
بلوک های ابتدایی که زبان ما رو میسازن. دونستن راجب اینا الزامی هست و بینشی که بهمون میده تو نوشتن برنامه های سرعت محور کاربرد داره.
داخل زبان پایتون از ArrayList استفاده میشه. دلیل بر این نیست که LinkedList بدرد نمیخوره.
و بله، لیست ها آرایه نیستن با اینکه ممکنه زیربنا از آرایه استفاده کنن، تفاوت این دو رو باید بدونید.
Recursion (Maze Solving Algorithm)
توابع بازگشتی پترنی هست که نه تنها تو الگوریتم بلکه تو برنامه های معمولی هم استفاده خودش رو داره. جدا از الگوریتم حل هزارتو، از جستجوی عمق اول DFS هم از این پترن استفاده میشه.
Trees (BFS, DFS)
درخت ها. ساختمان داده خیلی ساده که کار جستجو ما رو خیلی سریع میکنن. البته که تا حالا نیاز به پیاده سازی درخت نداشتم.
Tree Manipulation (DF insert, DF delete)
بخش دستکاری درخت که معمولا با عمق اول (Depth First) پیاده میشه.
Heap (Priority Queue) and Tries
پشته (صف اولویت) خیلی تو الگوریتم های اولویت بندی کاربرد داره. همینطور Trie تو تکمیل خودکار کیبورد های هوشمندمون یا حتی cache کردن پایانه های API و خیلی چیزایه دیگه کاربرد داره.
Graphs (BFS Adjacency Matrix, DFS Adjacency List, Dijkstra's Shortest Path)
مسائل پیچیده همیشه به گراف ها و درخت ها ختم میشن. بنابراین احساس نیاز به اینا پیدا نمیکنید (تا وقتی که پیدا میکنید و حیف که بلد نیستید). ولی خب تا الان خودم هم به مسئله ای از گراف برنخوردم.
جستجو های عمق اول و سطح اول همچنان تو گراف ها استفاده میشن (در واقع درخت ها نوعی گراف محسوب میشن).کوتاه ترین مسیر دکسترا هم خیلی تو مسیریابی کاربرد داره.
Maps, LRU cache
به شخصه این دو خیلی کاربرد داشتن برام. خود دیکشنری یک HashMap محسوب میشه! همینطور LRU cache هم تو پایتون برای cache کردن جواب های توابع بر حسب مقادیر که به تابع پاس میدیم استفاده میشه که سرعت برناممون رو میتونه خیلی افزایش بده.
پارت دوم:
از لحاظ کاربرد تو این پارت کمتر بهش برمیخورید.
AVL / Red-Black Trees
درخت های خود تنظیم باعث میشن که درختمون از هر سمت تناسب داشته باشه تا برای جستجوی سریع بهینه عمل کنه. (قطعا دوست ندارید که درختتون فقط یه شاخه دراز باشه، لیست پیوندی که نیست)
m-WAY Tree and B-Tree
درخت هایی که بیشتر از دو فرزند میتونن داشته باشن و مقادیر واقعی فقط تو برگ ها ذخیره میشن. این درختا تو ساخت دیتابیس و برای دسترسی خیلی سریع مقادیر استفاده میشن. جدا از اون B+Tree هم داریم که راجب اون هم بعدا صحبت میکنم.
Spanning Trees (Prim, Kruskal)
درخت پوشا. دنبال بهینه ترین درخت از یک گراف میگردیم که برای مسیریابی مناسب باشه.
Dijkstra's algorithm oprimization with priority queue
الگوریتم کوتاه ترین مسیر دکسترا با صف اولویت خیلی سریع تر هم میشه.
Ford-Fulkerson: Max Flow, Min Cut
مدیریت ترافیک؟ مدیریت منابع؟ یادگیری ماشین؟ زمانبندی؟
فعلا به این برنخوردم. سرگیجه هم داره مبحثش.
به قول Prime: الگوریتم اتوموبیل، شهروند بریتانیایی (به وجهه مدیریت ترافیک و روش حلش اشاره میکنه 😂)
Dynamic Programming (Factorials, Fibonacci, Max Subarray, Coin change problem)
الگوریتم های من در آوردی هستن که قطعا سریع ان. چون من در آوردی ان.
اوکی شوخی میکنم ولی خب این مبحث فقط یه مفهومه. و اگر بگیرید چی گفتم یعنی گرفتید چیه.
Bonus Algorithm (Bloom Filter)
تنها الگوریتمی از پارت دوم که منو هیجان زده کرد.
فرض کنید یک تریلیون رکورد دارید. (فرض محال)
میخواید ببینید که آیا مقداری داخل این رکورد وجود داره؟
از Bloom Filter استفاده میکنید تا احتمال وجودش رو بسنجید.
این الگوریتم دو تا خروجی داره. 1. وجود ندارد 2. احتمالا وجود دارد.
اگر بگه دیتا وجود نداره پس به قطع وجود نداره و وقتتون رو تلف نمیکنید.
اگر بگه احتمالا وجود دارد. میرید و جستجو میکنید. شاید بود و شاید هم نبود.
الان قطعا میدونید که چقدر کاربرد داره این. شاید های سریع، خیلی بدرد میخورن.
پارت اول:
Search (Linear Search, Binary Search, Two Crystal Problem)
کاملا مشخص هست. جستجو هایی که اتفاق میفته از الگوریتم های جستجویی که میبینید استفاده میکنه.
Sort (Bubble Sort, Quick Sort)
مرتب سازی خیلی مهم هست. چون بهمون اجازه استفاده از الگوریتم جستجو باینری رو میده. جدا از اون کاربرد های دیگه ای هم داره که واضح ان. برای مثال خود توابع sort زبان ما از یکی از این الگوریتم ها استفاده میکنن.
Basic DSA (Queue, Stack, LinkedList, ArrayList)
بلوک های ابتدایی که زبان ما رو میسازن. دونستن راجب اینا الزامی هست و بینشی که بهمون میده تو نوشتن برنامه های سرعت محور کاربرد داره.
داخل زبان پایتون از ArrayList استفاده میشه. دلیل بر این نیست که LinkedList بدرد نمیخوره.
و بله، لیست ها آرایه نیستن با اینکه ممکنه زیربنا از آرایه استفاده کنن، تفاوت این دو رو باید بدونید.
Recursion (Maze Solving Algorithm)
توابع بازگشتی پترنی هست که نه تنها تو الگوریتم بلکه تو برنامه های معمولی هم استفاده خودش رو داره. جدا از الگوریتم حل هزارتو، از جستجوی عمق اول DFS هم از این پترن استفاده میشه.
Trees (BFS, DFS)
درخت ها. ساختمان داده خیلی ساده که کار جستجو ما رو خیلی سریع میکنن. البته که تا حالا نیاز به پیاده سازی درخت نداشتم.
Tree Manipulation (DF insert, DF delete)
بخش دستکاری درخت که معمولا با عمق اول (Depth First) پیاده میشه.
Heap (Priority Queue) and Tries
پشته (صف اولویت) خیلی تو الگوریتم های اولویت بندی کاربرد داره. همینطور Trie تو تکمیل خودکار کیبورد های هوشمندمون یا حتی cache کردن پایانه های API و خیلی چیزایه دیگه کاربرد داره.
Graphs (BFS Adjacency Matrix, DFS Adjacency List, Dijkstra's Shortest Path)
مسائل پیچیده همیشه به گراف ها و درخت ها ختم میشن. بنابراین احساس نیاز به اینا پیدا نمیکنید (تا وقتی که پیدا میکنید و حیف که بلد نیستید). ولی خب تا الان خودم هم به مسئله ای از گراف برنخوردم.
جستجو های عمق اول و سطح اول همچنان تو گراف ها استفاده میشن (در واقع درخت ها نوعی گراف محسوب میشن).کوتاه ترین مسیر دکسترا هم خیلی تو مسیریابی کاربرد داره.
Maps, LRU cache
به شخصه این دو خیلی کاربرد داشتن برام. خود دیکشنری یک HashMap محسوب میشه! همینطور LRU cache هم تو پایتون برای cache کردن جواب های توابع بر حسب مقادیر که به تابع پاس میدیم استفاده میشه که سرعت برناممون رو میتونه خیلی افزایش بده.
پارت دوم:
از لحاظ کاربرد تو این پارت کمتر بهش برمیخورید.
AVL / Red-Black Trees
درخت های خود تنظیم باعث میشن که درختمون از هر سمت تناسب داشته باشه تا برای جستجوی سریع بهینه عمل کنه. (قطعا دوست ندارید که درختتون فقط یه شاخه دراز باشه، لیست پیوندی که نیست)
m-WAY Tree and B-Tree
درخت هایی که بیشتر از دو فرزند میتونن داشته باشن و مقادیر واقعی فقط تو برگ ها ذخیره میشن. این درختا تو ساخت دیتابیس و برای دسترسی خیلی سریع مقادیر استفاده میشن. جدا از اون B+Tree هم داریم که راجب اون هم بعدا صحبت میکنم.
Spanning Trees (Prim, Kruskal)
درخت پوشا. دنبال بهینه ترین درخت از یک گراف میگردیم که برای مسیریابی مناسب باشه.
Dijkstra's algorithm oprimization with priority queue
الگوریتم کوتاه ترین مسیر دکسترا با صف اولویت خیلی سریع تر هم میشه.
Ford-Fulkerson: Max Flow, Min Cut
مدیریت ترافیک؟ مدیریت منابع؟ یادگیری ماشین؟ زمانبندی؟
فعلا به این برنخوردم. سرگیجه هم داره مبحثش.
به قول Prime: الگوریتم اتوموبیل، شهروند بریتانیایی (به وجهه مدیریت ترافیک و روش حلش اشاره میکنه 😂)
Dynamic Programming (Factorials, Fibonacci, Max Subarray, Coin change problem)
الگوریتم های من در آوردی هستن که قطعا سریع ان. چون من در آوردی ان.
اوکی شوخی میکنم ولی خب این مبحث فقط یه مفهومه. و اگر بگیرید چی گفتم یعنی گرفتید چیه.
Bonus Algorithm (Bloom Filter)
تنها الگوریتمی از پارت دوم که منو هیجان زده کرد.
فرض کنید یک تریلیون رکورد دارید. (فرض محال)
میخواید ببینید که آیا مقداری داخل این رکورد وجود داره؟
از Bloom Filter استفاده میکنید تا احتمال وجودش رو بسنجید.
این الگوریتم دو تا خروجی داره. 1. وجود ندارد 2. احتمالا وجود دارد.
اگر بگه دیتا وجود نداره پس به قطع وجود نداره و وقتتون رو تلف نمیکنید.
اگر بگه احتمالا وجود دارد. میرید و جستجو میکنید. شاید بود و شاید هم نبود.
الان قطعا میدونید که چقدر کاربرد داره این. شاید های سریع، خیلی بدرد میخورن.
TECH STASH
در ادامه بحث قبلی گفتم مباحثی که خودم تو آموزش الگوریتمم خوندم رو با کاربرد بهتون بگم تا بهتر درک کنید که برای چی یاد میگیرید. پارت اول: Search (Linear Search, Binary Search, Two Crystal Problem) کاملا مشخص هست. جستجو هایی که اتفاق میفته از الگوریتم های…
روش Dynamic Programming با Divide and Conquer فرق داره.
تو هر دو درسته که مفهوم تقسیم مسئله به یک زیر مسئله مطرح هست.
اما روش برخورد با این تقسیم بندی فرق داره.
تو روش Dynamic Programming یک زیر مسئله با زیر مسئله های دیگه همپوشانی داره و اغلب وابسته هست.
هر زیر مسئله یک بار محاسبه میشه و جوابش ذخیره میشه.
جواب های ذخیره شده در پیدا کردن جواب های زیر مسئله های بعدی استفاده میشن.
تو روش Divide and Conquer زیر مسئله ها اغلب همون مسئله ولی کوچک تر شدش هستن.
کاملا مستقل از همدیگر هستن و از مفهوم توابع بازگشتی برای حلشون استفاده میشه (که قطعا Callstack ما رو میتونه درگیر کنه).
بعد از اینکه زیر مسئله ها حل میشن. زیر مسئله ها رو ترکیب میکنه تا به جواب برسه.
حالا دلیل اینکه گفتم روش های Dynamic Programming من در آوردی ان. به خاطر اینه که خیلی حل کردن مسئله به این روش سخت هست.
چون راه حل مبتکرانه هست، اغلب هم سریع هستن و هیچ الگوی مشابه ای بین این مسائل نیست.
راه حل جدید به این روش ارائه دادن که بماند...
تو هر دو درسته که مفهوم تقسیم مسئله به یک زیر مسئله مطرح هست.
اما روش برخورد با این تقسیم بندی فرق داره.
تو روش Dynamic Programming یک زیر مسئله با زیر مسئله های دیگه همپوشانی داره و اغلب وابسته هست.
هر زیر مسئله یک بار محاسبه میشه و جوابش ذخیره میشه.
جواب های ذخیره شده در پیدا کردن جواب های زیر مسئله های بعدی استفاده میشن.
تو روش Divide and Conquer زیر مسئله ها اغلب همون مسئله ولی کوچک تر شدش هستن.
کاملا مستقل از همدیگر هستن و از مفهوم توابع بازگشتی برای حلشون استفاده میشه (که قطعا Callstack ما رو میتونه درگیر کنه).
بعد از اینکه زیر مسئله ها حل میشن. زیر مسئله ها رو ترکیب میکنه تا به جواب برسه.
حالا دلیل اینکه گفتم روش های Dynamic Programming من در آوردی ان. به خاطر اینه که خیلی حل کردن مسئله به این روش سخت هست.
چون راه حل مبتکرانه هست، اغلب هم سریع هستن و هیچ الگوی مشابه ای بین این مسائل نیست.
راه حل جدید به این روش ارائه دادن که بماند...
وقتی که به مشکلی میخورید که دیباگر هم جواب نمیده.
یعنی اگر مشکل از رفتار برنامه هست یا حتی از رفتار لایبرری های زیرین.
این قانون رو یادتون باشه.
Minimal Reproducible Example
درسته که این قانون برای پرسش مسئله داخل stackoverflow ساخته شده. اما برای عیب یابی جواب میده.
چطور؟
وقتی که میخواید عیب یابی کنید اول باید بدونید که عیب از کجا هست.
هر چقدر کد بیشتر باشه پیدا کردن مشکل به مراتب سخت تره.
پس باید یک مثال کوچیک ولی قابل باز تولید بسازید که بتونید وجهه های مختلفش رو زیر ذره بین بگیرید و بررسی کنید که چرا کدتون چنین رفتاری نشون میده.
اینطوری احتمال پیدا کردن مشکل خیلی بیشتر میشه.
حالا مراحل کار:
مسئله رو اول کوچیک کنید. بخش هایی که نیاز نیستن رو حذف کنید تا به کوچک ترین مثال برسید که مشکلتون رو بازتولید کنه.
بعدش باید با ابزار هایی مثل دیباگر زوم بشید.
ولی از print debugging غافل نشید. تو مواقعی ممکنه گزینه خیلی خوبی باشه.
و اگر نتونستید دلیل رفتار کدتون رو تشخیص بدید یا درستش کنید اون موقع میتونید برید و تو stackoverflow این مثال رو مطرح کنید.
خیلی مشکلات از این تیپی کم هستن و معمولا با دیباگر میتونید رفعش کنید ولی اینو گفتم که اگر به اون عده کم خوردید بدونید از کجا شروع کنید.
یعنی اگر مشکل از رفتار برنامه هست یا حتی از رفتار لایبرری های زیرین.
این قانون رو یادتون باشه.
Minimal Reproducible Example
درسته که این قانون برای پرسش مسئله داخل stackoverflow ساخته شده. اما برای عیب یابی جواب میده.
چطور؟
وقتی که میخواید عیب یابی کنید اول باید بدونید که عیب از کجا هست.
هر چقدر کد بیشتر باشه پیدا کردن مشکل به مراتب سخت تره.
پس باید یک مثال کوچیک ولی قابل باز تولید بسازید که بتونید وجهه های مختلفش رو زیر ذره بین بگیرید و بررسی کنید که چرا کدتون چنین رفتاری نشون میده.
اینطوری احتمال پیدا کردن مشکل خیلی بیشتر میشه.
حالا مراحل کار:
مسئله رو اول کوچیک کنید. بخش هایی که نیاز نیستن رو حذف کنید تا به کوچک ترین مثال برسید که مشکلتون رو بازتولید کنه.
بعدش باید با ابزار هایی مثل دیباگر زوم بشید.
ولی از print debugging غافل نشید. تو مواقعی ممکنه گزینه خیلی خوبی باشه.
و اگر نتونستید دلیل رفتار کدتون رو تشخیص بدید یا درستش کنید اون موقع میتونید برید و تو stackoverflow این مثال رو مطرح کنید.
خیلی مشکلات از این تیپی کم هستن و معمولا با دیباگر میتونید رفعش کنید ولی اینو گفتم که اگر به اون عده کم خوردید بدونید از کجا شروع کنید.
Stack Overflow
How to create a Minimal, Reproducible Example - Help Center
Stack Overflow | The World’s Largest Online Community for Developers
TECH STASH
یکی از حرفه ای ترین ویدیو ها راجب debugging در پایتون اگر فکر میکنید با print ساده میشه دیباگ کرد این ویدیو رو ببینید و دوباره فکر کنید https://www.youtube.com/watch?v=R3smFr6W8jI اگر هم اصلا هیچی راجب debug کردن و کار با دیباگر نمیدونید این ویدیو رو ببینید…
یه خواهشی هم که از دوستان دارم.
لطفا به دیباگرتون کاملا مسلط باشید. فارغ از هر زبانی، نحوه کارشون یکیه.
اینجا دو تا ویدیو راجب پایتون هست. و داکیومنت VSCode.
ولی خب کلی منابع دیگه هم وجود داره.
لطفا به دیباگرتون کاملا مسلط باشید. فارغ از هر زبانی، نحوه کارشون یکیه.
اینجا دو تا ویدیو راجب پایتون هست. و داکیومنت VSCode.
ولی خب کلی منابع دیگه هم وجود داره.
TECH STASH
آموزش بعدی که میبینم قطعا System Design هست. Neetcode - System Design for Beginners Neetcode - System Design Interview
آموزش های
Neetcode - System Design for Beginners
Neetcode - System Design Interview
رو چند وقتی هست که تموم کردم. و باید بگم که از آموزش هایی بود، که دیدم رو از سیستم های توزیع شده عوض کرد.
تا حالا فکر کردید که یوتیوب، ایکس (توییتر سابق 😂)، دیسکورد و سرویس های عظیم دیگه چطوری به این همه کاربر در سراسر جهان سرویس دهی میکنن.
پشت اینا مهندسی های پیچیده وجود داره که نیاز نیست همش رو بدونید.
اما باید یه تصویر کامل از نحوه برخورد و دیزاین چنین سیستم هایی داشته باشید (اگر میخواید شرکت خفنی استخدام بشید یا پروژه های بزرگی رو انجام بدید)
به این میگن System Design. و یکی از بخش های خیلی مهم ساخت یک سیستم هست.
چون اگر در طراحی چنین سیستم ها اشتباه کنید جبرانش بسیار سخت و پرهزینه هست.
اما باگ ها و کدنویسی رو میشه درست کرد.
هر کدوم از این دوره ها 8 ساعت هستن.
بخش اول مبانی سیستم دیزاین هست و بخش دوم آموزش مصاحبه های سیستم دیزاین.
لینک تورنت تمام آموزش ها داخل کانال پین شده هست.
فقط سرچ کنید چون فایل یا لینک تورنته شامل آموزش های Algoexpert و همینطور ساحتمان داده و طراحی الگوریتم هست (که من آموزش دیگه ای رو برای اون موضوع دنبال کردم).
در ضمن یه ویدیو آخر System Design for Beginners داره به اسم MapReduce که نتونستم از اینترنت پیدا کنم.
Neetcode - System Design for Beginners
Neetcode - System Design Interview
رو چند وقتی هست که تموم کردم. و باید بگم که از آموزش هایی بود، که دیدم رو از سیستم های توزیع شده عوض کرد.
تا حالا فکر کردید که یوتیوب، ایکس (توییتر سابق 😂)، دیسکورد و سرویس های عظیم دیگه چطوری به این همه کاربر در سراسر جهان سرویس دهی میکنن.
پشت اینا مهندسی های پیچیده وجود داره که نیاز نیست همش رو بدونید.
اما باید یه تصویر کامل از نحوه برخورد و دیزاین چنین سیستم هایی داشته باشید (اگر میخواید شرکت خفنی استخدام بشید یا پروژه های بزرگی رو انجام بدید)
به این میگن System Design. و یکی از بخش های خیلی مهم ساخت یک سیستم هست.
چون اگر در طراحی چنین سیستم ها اشتباه کنید جبرانش بسیار سخت و پرهزینه هست.
اما باگ ها و کدنویسی رو میشه درست کرد.
هر کدوم از این دوره ها 8 ساعت هستن.
بخش اول مبانی سیستم دیزاین هست و بخش دوم آموزش مصاحبه های سیستم دیزاین.
لینک تورنت تمام آموزش ها داخل کانال پین شده هست.
فقط سرچ کنید چون فایل یا لینک تورنته شامل آموزش های Algoexpert و همینطور ساحتمان داده و طراحی الگوریتم هست (که من آموزش دیگه ای رو برای اون موضوع دنبال کردم).
در ضمن یه ویدیو آخر System Design for Beginners داره به اسم MapReduce که نتونستم از اینترنت پیدا کنم.
TECH STASH
آموزش های Neetcode - System Design for Beginners Neetcode - System Design Interview رو چند وقتی هست که تموم کردم. و باید بگم که از آموزش هایی بود، که دیدم رو از سیستم های توزیع شده عوض کرد. تا حالا فکر کردید که یوتیوب، ایکس (توییتر سابق 😂)، دیسکورد و سرویس…
مباحثی که تو بخش اول کاور میشه:
Neetcode - System Design for Beginners
1. معماری کامپیوتر (Computer Architecture)
ساختمان کامپیوتر نمونه کوچکی از سیستم های توزیع شده هست. و تو این بخش به بررسی سرعت هر کدوم از این قطعه ها میپردازیم.
2. معماری برنامه (Application Architecture):
اینجا پروسه از توسعه تا استفاده و کاربرد برنامه توضیح داده میشه.
هر برنامه بزرگی شامل بخش های مختلفی میتونه باشه از جمله Load Balancer, Database, Servers, Metrics, Message Queue, Logging و ...
3. نیاز های طراحی (Design Requirements):
این یکی از مهم ترین بخش های طراحی سیستم هست.
اینکه پایداری (Availability) سیستم ما چقدر هست.
چقدر تحمل خطا (Fault Tolerance) داره.
دیتابیس یا سرور های ما چقدر توان عملیاتی (Throughput) دارند.
و تاخیر (Latency) ما چقدر هست.
4. اصول اولیه شبکه (Networking Basics):
عمیق راجب شبکه بحث نمیشه ولی یک سری اصول هایی که برای طراحی سیستم باید بدونیم بحث میشه.
راجب IP و Header ها و پروتکل های TCP و UDP و پورت ها و ... صحبت میشه.
5. پروتکل های لایه انتقال (TCP and UDP):
اینجا هم راجب دو پروتکل معروف TCP و UDP به طور مختصر صحبت میشه.
6. دی ان اس (Domain Name System):
وقتی که میخوایم وارد سایت بشیم چه اتفاقی میفته که از URL میرسیم به یه سرور.
7. پروتکل های برنامه بخش اول:
راجب RPC و اینکه چی هست صحبت میشه.
راجب HTTP و اینکه درخواست های ما در این لایه به چه صورت هستن و کد های برگشتی که باید بدونیم صحبت میشه.
همینطور اشاره ای هم به WebSockets و SSL میشه.
کلا این بخش بیس و پایه برای کار با API ها هست.
8. پروتکل های برنامه بخش دوم:
خب بخش باحال از اینجا شروع میشه.
اینجا بیشتر راجب WebSockets و اینکه چرا به وجود اومد صحبت میشه.
باید بدونید که همین چت Twitch از این پروتکل در حال حاظر استفاده میکنه.
به پروتکل های دیگه هم مختصر اشاره میشه.
9. پارادایم API ها:
با سه نوع REST, GraphQL و gRPC آشنا میشید که هر کدومشون مزایا و معایب خودشون رو دارن و یاد میگیرید که کجا استفاده کنید.
10. طراحی API:
چطوری یک API رو طراحی میکنن و مثال هایی از Twitter زده میشه که API اش چطوری هست.
11. ذخیره موقت (Caching):
بخش مورد علاقه خودم. با انواع cache آشنا میشید مثل Redis یا حتی خود مرورگرتون.
الگوریتم های cache مثل write-back, write-around, write-through.
همینطور الگوریتم های اخراج مثل LRU, LFU.
12. سرویس های CDN:
یکی از کار هایی که میتونیم انجام بدیم تا بار رو از روی سرورامون برداریم اینه که از CDN استفاده کنیم.
اینطوری از هر نقطه جهان که باشیم به محتوا ها میتونیم سریع دسترسی پیدا کنیم.
همینطور با انواع مختلف CDN یعنی push و pull آشنا میشید.
13. پروکسی ها و Load Balancer:
با انوع پروکسی ها که شامل Forward و Reverse هستن آشنا میشید.
همینطور Load Balancer و انواع الگوریتم های بالانس لود رو یاد میگیرید.
14. هش های مداوم (Consistent Hashing):
یکی از مشکلات Load Balancing دقیقا همین هست که بهش برمیخورید و یاد میگیرید که این مفهوم چطوری تو مثال Load Balancing پیاده میشه.
فقط برای سرور نیست، بلکه برای cache و دیتابیس ها و حتی CDN ها استفاده میشه.
15. دیتابیس SQL:
هیچ آموزش سیستم دیزاین بدون SQL معنا نداره.
راجب نحوه کارکرد SQL یاد میگیرید و مزایا و معایبی که داره.
که از مهم ترین معایبش scale هست. یعنی برای دیتابیس های عظیم دست مارو میبنده.
همینطور راجب قاعده ACID که دقیقا مزایای SQL رو توضیح میده آشنا میشید.
16. دیتابیس NoSQL:
دیتابیس هایی که SQL نیستن. که انواع زیادی دارن.
از جمله
key-value store
document store
wide column
graph db
و مزایا و معایبش رو یاد میگیرید و تفاوتش رو با SQL بهتر متوجه میشید.
17. تکثیر یا تقسیم دیتابیس (Replication and Sharding):
اینجاست که سیستم دیزاین خیلی خودش رو نشون میده.
تو این بخش با این دو قاعده آشنا میشید. انواع تکثیر دیتابیس رو یاد میگیرید.
و همینطور تقسیم دیتابیس و چرا SQL برای اینکار مناسب نیست و NoSQL مناسبه.
بحث consistent hashing هم اینجا بدرد میخوره.
18. تئوری CAP:
اینکه دیتابیس ها وقتی توزیع میشن روی چند کامپیوتر چالش هایی برای ثبات دیتا و همگام سازی دیتابیس ها پیش میاد.
19. ذخیره اطلاعات باینری (Object Storage):
اطلاعات باینری نباید تو دیتابیس ذخیره بشن چون سرعت دسترسی رو کاهش میدن.
سر همین باید از Object Storage استفاده کنیم.
20. صف پیام (Message Queue):
وقتی که عملیاتی قرار نیست همون موقع انجام بشه و جواب به کاربر برگردونده بشه.
یعنی عملیات زمانبر هست و در پیش زمینه اجرا میشه نیاز به Message Queue داریم.
Neetcode - System Design for Beginners
1. معماری کامپیوتر (Computer Architecture)
ساختمان کامپیوتر نمونه کوچکی از سیستم های توزیع شده هست. و تو این بخش به بررسی سرعت هر کدوم از این قطعه ها میپردازیم.
2. معماری برنامه (Application Architecture):
اینجا پروسه از توسعه تا استفاده و کاربرد برنامه توضیح داده میشه.
هر برنامه بزرگی شامل بخش های مختلفی میتونه باشه از جمله Load Balancer, Database, Servers, Metrics, Message Queue, Logging و ...
3. نیاز های طراحی (Design Requirements):
این یکی از مهم ترین بخش های طراحی سیستم هست.
اینکه پایداری (Availability) سیستم ما چقدر هست.
چقدر تحمل خطا (Fault Tolerance) داره.
دیتابیس یا سرور های ما چقدر توان عملیاتی (Throughput) دارند.
و تاخیر (Latency) ما چقدر هست.
4. اصول اولیه شبکه (Networking Basics):
عمیق راجب شبکه بحث نمیشه ولی یک سری اصول هایی که برای طراحی سیستم باید بدونیم بحث میشه.
راجب IP و Header ها و پروتکل های TCP و UDP و پورت ها و ... صحبت میشه.
5. پروتکل های لایه انتقال (TCP and UDP):
اینجا هم راجب دو پروتکل معروف TCP و UDP به طور مختصر صحبت میشه.
6. دی ان اس (Domain Name System):
وقتی که میخوایم وارد سایت بشیم چه اتفاقی میفته که از URL میرسیم به یه سرور.
7. پروتکل های برنامه بخش اول:
راجب RPC و اینکه چی هست صحبت میشه.
راجب HTTP و اینکه درخواست های ما در این لایه به چه صورت هستن و کد های برگشتی که باید بدونیم صحبت میشه.
همینطور اشاره ای هم به WebSockets و SSL میشه.
کلا این بخش بیس و پایه برای کار با API ها هست.
8. پروتکل های برنامه بخش دوم:
خب بخش باحال از اینجا شروع میشه.
اینجا بیشتر راجب WebSockets و اینکه چرا به وجود اومد صحبت میشه.
باید بدونید که همین چت Twitch از این پروتکل در حال حاظر استفاده میکنه.
به پروتکل های دیگه هم مختصر اشاره میشه.
9. پارادایم API ها:
با سه نوع REST, GraphQL و gRPC آشنا میشید که هر کدومشون مزایا و معایب خودشون رو دارن و یاد میگیرید که کجا استفاده کنید.
10. طراحی API:
چطوری یک API رو طراحی میکنن و مثال هایی از Twitter زده میشه که API اش چطوری هست.
11. ذخیره موقت (Caching):
بخش مورد علاقه خودم. با انواع cache آشنا میشید مثل Redis یا حتی خود مرورگرتون.
الگوریتم های cache مثل write-back, write-around, write-through.
همینطور الگوریتم های اخراج مثل LRU, LFU.
12. سرویس های CDN:
یکی از کار هایی که میتونیم انجام بدیم تا بار رو از روی سرورامون برداریم اینه که از CDN استفاده کنیم.
اینطوری از هر نقطه جهان که باشیم به محتوا ها میتونیم سریع دسترسی پیدا کنیم.
همینطور با انواع مختلف CDN یعنی push و pull آشنا میشید.
13. پروکسی ها و Load Balancer:
با انوع پروکسی ها که شامل Forward و Reverse هستن آشنا میشید.
همینطور Load Balancer و انواع الگوریتم های بالانس لود رو یاد میگیرید.
14. هش های مداوم (Consistent Hashing):
یکی از مشکلات Load Balancing دقیقا همین هست که بهش برمیخورید و یاد میگیرید که این مفهوم چطوری تو مثال Load Balancing پیاده میشه.
فقط برای سرور نیست، بلکه برای cache و دیتابیس ها و حتی CDN ها استفاده میشه.
15. دیتابیس SQL:
هیچ آموزش سیستم دیزاین بدون SQL معنا نداره.
راجب نحوه کارکرد SQL یاد میگیرید و مزایا و معایبی که داره.
که از مهم ترین معایبش scale هست. یعنی برای دیتابیس های عظیم دست مارو میبنده.
همینطور راجب قاعده ACID که دقیقا مزایای SQL رو توضیح میده آشنا میشید.
16. دیتابیس NoSQL:
دیتابیس هایی که SQL نیستن. که انواع زیادی دارن.
از جمله
key-value store
document store
wide column
graph db
و مزایا و معایبش رو یاد میگیرید و تفاوتش رو با SQL بهتر متوجه میشید.
17. تکثیر یا تقسیم دیتابیس (Replication and Sharding):
اینجاست که سیستم دیزاین خیلی خودش رو نشون میده.
تو این بخش با این دو قاعده آشنا میشید. انواع تکثیر دیتابیس رو یاد میگیرید.
و همینطور تقسیم دیتابیس و چرا SQL برای اینکار مناسب نیست و NoSQL مناسبه.
بحث consistent hashing هم اینجا بدرد میخوره.
18. تئوری CAP:
اینکه دیتابیس ها وقتی توزیع میشن روی چند کامپیوتر چالش هایی برای ثبات دیتا و همگام سازی دیتابیس ها پیش میاد.
19. ذخیره اطلاعات باینری (Object Storage):
اطلاعات باینری نباید تو دیتابیس ذخیره بشن چون سرعت دسترسی رو کاهش میدن.
سر همین باید از Object Storage استفاده کنیم.
20. صف پیام (Message Queue):
وقتی که عملیاتی قرار نیست همون موقع انجام بشه و جواب به کاربر برگردونده بشه.
یعنی عملیات زمانبر هست و در پیش زمینه اجرا میشه نیاز به Message Queue داریم.