<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های رضا پویا</title>
        <link>https://virgool.io/feed/@rpouya</link>
        <description>من یک توسعه دهنده .Net  هستم ، تلاش دارم کارهای درست رو درست انجام بدهم.</description>
        <language>fa</language>
        <pubDate>2026-06-07 15:30:19</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/69456/avatar/qXpKkq.jpeg?height=120&amp;width=120</url>
            <title>رضا پویا</title>
            <link>https://virgool.io/@rpouya</link>
        </image>

                    <item>
                <title>مفهوم Covariance و Contravariance در سی شارپ</title>
                <link>https://virgool.io/@rpouya/%D9%85%D9%81%D9%87%D9%88%D9%85-covariance-%D9%88-contravariance-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-qpurqrteqd5t</link>
                <description>مفهوم covariance و contra-variance درون سی شارپ، مفاهیمی هستند که اجازه می دهند ما بین انواع مختلف تبدیل رفرنس ضمنی (implicit reference conversion) انجام دهیم. این انواع شامل آرایه‎‌، انواعی delegate، و نوع آرگومان های جنریک هستند.این مفاهیم باعث می شوند که بتوانیم sub-type را به type و برعکس، تبدیل کنیم. کد زیر را در نظر بگیرید.تعریف اولیه کلاسقبل از اینکه وارد اصل موضوع شویم، بیائید مفاهیم پایه شی گرایی را مرور کنیم.ارث بری : Apple و Orange هر دو از Fruit ارث بری می کنند.زیرنوع sub-typing: اصل sub-typing اجازه می دهد رفرنس Apple یا Orange را به رفرنس Fruit را اختصاص داد. این کار دو پیامد در پی دارد :- پارامتر  ورودی: اگر متدی پارامتر ورودی از نوع Fruit داشته باشد، جایی که این متد را فراخوانی می کند، می تواند یک نمونه از Fruit یا Apple یا Orange را به عنوان آرگومان ورودی به آن ارسال کند.-  خروجی متد:  اگر متدی خروجی از نوع Fruit داشته باشد، می تواند یک شی از نوع Fruit یا Apple یا Orange را به عنوان خروجی تحویل دهد. اگر این متد Virtual باشد و درون کلاس فرزند Override شده باشد، متد Override شده می تواند یک خروجی از نوع رفرنس Fruitبدهد. از سی شارپ 9 به بعد، متدهای override شده می توانند به صورت امن، رفرنسی از نوع Apple یا Orange را برگرداند. به این ویژگی سی شارپ، covariant return type می گویند.بنابراین کدها ی زیر معتبر هستند:حالت اولیهو نحوه استفاده از این متدها:03همانطور که می بینید، مفهوم های covariance و contra-variance تبدیل رفرنس ضمنی را برای تبدیل انواع پارامتر، delegate و array را با استفاده از روابط sub-typing انجام می دهد. در این جا باید به مفهوم ضمنی (implicit) بودن تبدیل، که اساس covariance و contra-variance است توجه کنید.نکته :مفهوم covariance برای خروجی متد (out) استمفهوم contra-variance برای ورودی متد (in) است. می توانید n درون contra-variance را معادل in در نظر بگیرید.تا پیش از .Net Framework 4  نمی توانستیم از مفاهیم covariance  و contra-variance درون انواع جنریک استفاده کنیم ولی از نسخه ی 4  به بعد ( از سال 2010 به بعد ) می توانیم با استفاده از کلمات کلیدی Out و in از این مفاهیم درون انواع جنریک نیز استفاده کنیم.مفهوم covariance درون جنریک‌ها (استفاده از کلمه کلیدی outدرون تعریف جنریک)مفهوم  covariance به انواع پارامتر جنریک که به عنوان نوع خروجی متد استفاده می شوند، اعمال می گردد.علاوه بر این استفاده از کلمه کلیدی out در تعریف پارامتر جنریکش به این معناست که از نوع جنریک T فقط به عنوان خروجی متد درون نوع جنریک می توان استفاده کرد.04در اینجا متد Get() معتبر است ولی متد Cut(T item) خطا دارد  و متن خطا این است.Invalid variance: The type parameter &#x27;T&#x27; must be contravariantly valid on &#x27;IDish&lt;T &gt;.Cut (T)&#x27;. &#x27;T&#x27; is covariant.بنابراین امکان اینکه یک پارامتر   covariant را به عنوان ورودی متد نوع جنریک تعریف کنیم، وجود ندارد.حالا کلاسی را تعریف می کنیم که این اینترفیس را پیاده سازی می کند:05تاثیر کلمه ی out زمانی که بخواهیم از این نوع جنریک استفاده کنیم مشخص می شود. برای مثال اگر پیاده سازی زیر را داشته باشیم که از این این اینترفیس استفاده کند:06می بینید که می توانیم به راحتی متغیر orangeDish را به متد Process که ورودی از نوعی IDish&lt;Fruit&gt; می گیرد، بفرستیم. دلیل این موضوع این است که ما در تعریف اینترفیس IDish از کلمه کلیدی out استفاده کردیم و این کلمه کلیدی مفهوم covariance را برای نوع جنریک IDish فعال کرده است؛ در غیر این صورت ما فقط می توانستیم نوعی از نوع IDish&lt;Fruit&gt; را به متد مورد نظر ارسال کنیم.نکته : فقط interface ها و delegate ها می توانند به عنوان variant تعریف کرد ( یعنی از کلمات کلیدی in و out فقط در جنریک های از نوع  interface و delegate می توان استفاده کرد). بنابراین کد زیر نامعتبر است.07و متن خطا این است :Invalid variance modifier. Only interface and delegate type parameters can be specified as variant.مفهوم contra-variance درون جنریک ها (استفاده از کلمه کلیدی in درون تعریف جنریک)می توانیم رابطه ی contra-variance را با استفاده از کلمه کلیدی in  درون Generic ها تعریف کنیم.  به کد زیر نگاه کنید:08در اینجا متد Add () معتبر است چون ورودی از نوع پارامتر T  دارد که درون تعریف اینترفیس با استفاده از کلمه کلیدی in به عنوان Contravariance تعریف شده است. ولی متد Return نا معتبر است چون خروجی آن از نوع T هست ولی ما با استفاده از کلمه کلیدی in ، نوع T  را فقط به ورودی متدها محدود کرده ایم. متن خطایی که کامپایلر برای این مشکل تولید می کند به شرح زیر است:Invalid variance: The type parameter &#x27;T&#x27; must be covariantly valid on &#x27;IBasket&lt;T&gt;.Return(T)&#x27;. &#x27;T&#x27; is contravariant.بنابراین امکان اینکه یک پارامتر   contra-variant را به عنوان خروجی متد نوع جنریک تعریف کنیم، وجود ندارد.حالا کلاسی را تعریف می کنیم که این اینترفیس را پیاده سازی می کند:09تاثیر کلمه ی in زمانی که بخواهیم از این نوع جنریک استفاده کنیم مشخص می شود. برای مثال اگر پیاده سازی زیر را داشته باشیم که از این این اینترفیس استفاده کند:در اینجا می بینید که می توانیم متغیر basket که از نوع IBasket&lt;Fruit&gt; است را به درون متد Process(IBasket&lt;Orange&gt; basket) ارسال کنیم. دلیل این موضوع این است که ما در تعریف اینترفیس IBasket از کلمه کلیدی in استفاده کردیم و این کلمه کلیدی مفهوم covariance را برای نوع جنریک IBasket فعال کرده است؛ در غیر این صورت ما فقط می توانستیم نوعی از نوع IBasket&lt;Orange&gt; را به متد مورد نظر ارسال کنیم.بسیاری از کلاس های پایه سی شارپ از این مفهوم استفاده می کنند، برای مثال کلاس پایه IEnumerable&lt;T&gt; از این مفهوم استفاده می کند. نوع پارامتر T از IEnumerable&lt;out T&gt; به دلیل استفاده از کلمه کلیدی out یک covarianceاست. این به این معناست که می توانیم رفرنس IEnumerable&lt;Derived&gt; را به رفرنس یک IEnumerable&lt;Base&gt; اختصاص دهیم.ما در اینجا می توانیم IEnumerable&lt;Orange&gt; را به IEnumerable&lt;Fruit&gt; اختصاص دهیم که معتبر است. دلیل معتبر بودن این تخصیص این است که به وسیله IEnumerable&lt;T&gt; ، المان های نوع T  همیشه به بیرون می روند (out) و هرگز به درون آن تخصیص داده نمی شوند (in). در اینجا ما فقط نتیجه را بر می گردانیم (Out) و چیزی را به عنوان پارامتر ورودی در نظر نمی گیریم. بنابراین برای این مثال هیچ ریسکی برای اختصاص دادن رفرنس Orange به Apple وجود ندارد و اینگونه است که covariance پشتیبانی می شود.در مورد Contra-variance مثال دیگر از انواع پایه سی شارپ که از این مفهوم پشتیبانی می کند، اینترفیس IComparer&lt;T&gt;است که تعریف اصلی آن در واقع به این صورت IComparer&lt;in T&gt;  است. بیائید یک پیاده سازی از این اینترفیس بسازیم.حالا یک مثال از استفاده از این کلاس را  می نویسم:می بینید که به راحتی می توانیم رفرنس fruitComparer را به orangeComparer نسبت دهیم و دلیل این کار استفاده از کلمه کلیدی in در تعریف IComparer&lt;in T&gt; است که آن را تبدیل به یک Contravariant کرده است که به ما اجازه می دهد نوع والد را به متدهایی که ورودی از  نوع فرزند می گیرند، ارسال کنیم.به صورت کلی این سه نکته را در نظر داشته باشید: یک پارامتر جنریک نوع covariant که با کلمه کلیدی out مشخص شده را می توان به عنوان خروجی متد در نظر گرفت.یک پارامتر جنریک نوع contra-variant که با کلمه کلیدی in مشخص شده را می توان به عنوان ورودی متد در نظر گرفت. انواع مختلف covariant و contra-variant را می توان همزمان تعریف کرد و آنها مستقل از یک دیگر عمل خواهند کرد. یک اینترفیس جنریک یا یک delegate جنریک می تواند همزمان هر دوی اینها را داشته باشد.بر اساس نکته سوم، کد زیر معتبر است:مفهوم Covariance و Contra-variance درون delegate هامفهوم covariance  و contra-variance درون سی شارپ انعطاف لازم را برای تطبیق نوع Delegate با امضای متدها ارائه می دهد.مفهوم Covariance اجازه می دهد که یک نوع خروجی یک متد از sub-type هایی باشد که درون delegate تعریف شده است.مفهوم Contra-variance اجازه می دهد که ورودی نوع پارامتر یک متد از نوع پایه تعریف شده درون delegate باشد.در اینجا مثالی از covariance را درون delegate می بینید:باید توجه داشته باشید که دو delegate جنریک درونی سی شارپ ، یعنی &lt;..&gt;Func و &lt;..&gt;Action اینگونه تعریف شده اند.تابع  ()&lt;Func&lt;T , TResult تا ()&lt; Func&lt;T1 ,…, T16, TResult خروجی از نوع covariance و ورودی های از نوع contra-variance دارند. دلیل این امر به استفاده از کلمات کلیدی in و outدرون تعریف آن ها بر می گردد. به همین صورت ()&lt;Action&lt;T  تا ()&lt; Action&lt;T1,..,T16 ورودی هایی از نوع contra-variance دارند.به دلیل رفتار contra-variance ما می توانیم یک رفرنس نمونه ای از ()&lt; Action&lt;Fruit را به رفرنسی از ()&lt;Action&lt;Orange اختصاص دهیم. این تخصیص رفرنس عمل می کند چون نوع پارامتر می تواند از هر نوعی از Fruit باشد، یعنی در این مثال پارامتر ورودی می تواند از نوع پایه Fruit و تمام sub-type های آن باشد، به همین دلیل در این مثال، انوع Fruit، Orange و Apple معتبر هستند.مفهوم  covariance درون آرایهسی شارپ از covariance درون آرایه ها پشتیبانی می کند. بنابراین درون سی شارپ، آرایه ای از Orange در واقع می تواند آرایه ای از نوع Fruit باشد. ولی مشکل اینجاست که این نوع تبدیل رفرنسی به صورت ذاتی type-safe نیست و می تواند در هنگام اجرا باعث ایجاد Exception شود.البته می توانیم با استفاده از IEnumerable&lt;T&gt; تکه کد بالا را type-safe کنیم.دلیل type-safe بودن کد بالا این است که IEnumerable&lt;out T&gt; به صورت فقط-خواندنی (read-only) تعریف شده است و هیچ پارامتر ورودی که با کلمه کلیدی in مشخص شده باشد، ندارد. بنابراین ریسکی برای آپدیت هیچ کدام از المان ها وجود ندارد.مفهوم contra-variance درون آرایهسی شارپ از contra-variance درون آرایه ها پشتیبانی نمی کند.  بنابراین کد زیر کامپایل نمی شود و خطا می دهد.می توانید به صورت صریح تبدیل(cast) انجام دهید ولی باز هم در هنگام اجرا، با خطای  InvalidCastException مواجهه می شوید.بنابراین نمی توان به صورت عملی از contra-variance درون آرایه سی شارپ استفاده کرد. علاوه بر این سعی کنید تا جای ممکن از covariance درون آرایه ها استفاده نکنید زیرا ممکن است استفاده از IEnumerable&lt;T&gt; را فراموش کنید و در زمان اجرا با خطاهای عجیب روبه رو شوید.نتیجه گیری نهایی:در اینجا ما با مفاهیم covariance و  contra-variance  آشنا شدیم و دیدیم که این مفاهیم چگونه در generic ، delegate  و array ها درون سی شارپ پیاده سازی می شوند.  استفاده از این ها درون آرایه ها باید ممنوع شود چون باعث خطاهای مهلک زمان اجرا می شود. با این حال پیاده سازی این مفاهیم درون Generic و delegate به صورت تمیز و type-safe انجام شده، بنابراین می توانید با خیال راحت از آنها استفاده کنید. با این مفاهیم دیگر نیازی به استفاده از متدهای درونی مثل Cast&lt;T&gt;() نداریم. احتمالا تا حالا در کدهایتان بدون اینکه متوجه شده باشید از این مفاهیم استفاده کرده اید.منابع:https://blog.ndepend.com/covariance-and-contravariance-in-csharp-explained/https://programming.tosinso.com/fa/articles/43506در اینجا کدها را می بینید:https://github.com/RezaPouya/MasteringCsharp/tree/main/CovarianceAndContravariance</description>
                <category>رضا پویا</category>
                <author>رضا پویا</author>
                <pubDate>Sat, 09 Jul 2022 15:49:44 +0430</pubDate>
            </item>
                    <item>
                <title>پشته و  انباره (The Stack and The Heap)</title>
                <link>https://virgool.io/@rpouya/%D9%BE%D8%B4%D8%AA%D9%87-%D9%88-%D8%A7%D9%86%D8%A8%D8%A7%D8%B1%D9%87-the-stack-and-the-heap-woi3ue5pkunn</link>
                <description>سلامیکی از مفاهیم پایه ای که که از توسعه دهندگان Net. انتظار می رود که آن را درک کنند مفهوم پشته (Stack) و انباره (Heap) است. این مفاهیم تقریبا یکی از موارد ثابت مصاحبه‌های تخصصی مربوط به #C هستند. در اینجا سعی کردم به صورت ساده‌ این مورد رو توضیح بدهم. قبل از شروع بحث باید این نکته رو بگویم که به صورت عملیاتی تشخیص اینکه کدام بخش از متغیرها درون پشته و کدام بخش درون انباره قرار می‌گیرند، سخت است؛ دلیل این سخت بودن این است که سازندگان فریمورک Net. به صورت عمدی می خواستند که جزئیات پیاده سازی مدیریت حافظه را از چشم توسعه‌دهندگان مخفی کنند تا توسعه‌دهندگان جدید برای کار با #C نیاز به یادگیری مفاهیم حافظه نداشته باشند و با سپردن وظیفه مدیریت حافظه به فریمورک، وقت خود را صرف توسعه کدهای مربوط به منطق تجاری کنند.پشته و انباره مکان هایی هستند که متغیرها و ثابت ها درون آنها قرار می گیرند. هر کدام از این موارد از لحاظ معنایی و عملی، طول حیات بسیار متفاوتی دارند.از پشته( Stack ) برای تخصیص حافظه به صورت ایستا (Static)، و از انباره (Heap)  برای تخصیص به صورت پویا (Dynamic) استفاده می‌گردد. هر دوی اینها در عمل درون RAM کامپیوتر قرار دارند.ساختار حافظه برنامه Net.پشته ( Stack ) :پشته بلوکی از حافظه است که متغیرهای محلی و پارامتر ها درون آن قرار می گیرند. پشته به صورت منطقی با ورود و خروج به متدها/توابع، بزرگ و کوچک می گردد. همانطور که می دانید پشته ها از ساختار « LIFO » استفاده می کنند.LIFO کوتاه‌شدهٔ عبارت Last In First Out « آخرین ورودی از همه زودتر خارج می‌شود » است. این سیاست اساس کار پشته‌ها را تشکیل می‌دهد و به مفهوم آن است که آخرین دادهٔ ذخیره شده در پشته، نخستین داده‌ای است که بازیابی می‌شود. متغیرهایی که درون پشته تخصیص داده شده‌اند به صورت مستقیم درون حافظه ذخیره می‌گردند، و دسترسی به آن بسیار سریع است، و کامپایلر در هنگام کامپایل برنامه حافظه مورد نیاز متغیرهای پشته را محاسبه می کند و این حافظه را در هنگام اجرا برنامه، به عنوان حافظه ایستا به آن تخصیص می دهد.وقتی یک متد یا تابع، متد یا تابع دیگری را فرا می خواند و متد دوم هم متد یا متد دیگری را فرا می خواند و به همین صورت یک زنجیره از فراخوانی ها شکل می گیرد، اجرا شدن تمامی این متدها تا اجرای آخرین متد و بازگشت مقدار آخرین متد، متوقف می شود. همانطور که گفتیم، پشته به صورت LIFO هست، جدیدترین بلوک گرفته شده اولین بلوکی هست که آزاد می شود، این موضوع باعث می شود که نگه داشتن وضعیت پشته آسان بود. آزاد کردن یک بلوک از پشته به آسانی جابه‌جا کردن یک نشانگر ( Pointer ) است.شکل شماتیک حافظه پشته و انباره  ، پشته از بلوک های در کنار هم تشکیل شده ولی انباره از فریم های جدا از یکدیگرانباره ( heap ) :انباره بلوکی از حافظه است که « اشیاء/ objects » درون آن قرار می گیرند. هر زمان یک شی ساخته می شود، بلوکی از حافظه درون heap به آن تخصیص داده می گردد و یک reference به آن شی، برگشت داده می شود. در زمان اجرا به متغیرهای درون انباره، حافظه تخصیص داده می شود و دسترسی به آنها کمی کندتر است ولی از آن سو اندازه انباره معمولا بیشتر است و حداکثر حافظه آن برابر حافظه مجازی در دسترس برنامه است. المان‌های انباره هیچ وابستگی به یکدیگر ندارند و می توان به صورت مستقیم به آنها دسترسی داشت. می توانید هر زمانی خواستید یک بلوک از حافظه را تخصیص دهید و آن را آزاد کنید؛ همین موضوع باعث می شود که رهگیری وضعیت انباره و اینکه کدام بلوک های حافظه آزاد هستند و کدام یکی تخصیص داده شده اند، سخت تر باشد.فریمورک Net. یک Runtime و یک Garbage Collector دارد که به صورت دوره ای اشیایی که درون heap هستند را - در صورتی که هیچ ارجاع زنده از آنها موجود نباشد - حذف می کند تا برنامه با کمبود حافظه مواجهه نگردد. یک شی به محض اینکه دیگر توسط شی زنده ای ارجاع داده نشود، آماده ی آزاد سازی توسط garbage collector خواهد شد.نمونه های value-types ( و ارجاع به اشیاء ) در همان جایی که اعلان شده اند، قرار می گیرند. اگر یک نمونه به عنوان یک فیلد درون یک کلاس یا به عنوان یک آرایه تعریف شده باشند، نمونه درون heap قرار خواهد گرفت.علاوه بر این، heap  فیلدهای ایستا ( Static Field ) را نگه می دارد. بر خلاف اشیاء که در heap به آنها فضا تخصیص داده شده ( که می توانند garbage collect گردند ) این ها تا زمانی که Application Domain پابرجاست، درون حافظه باقی می مانند.در اینجا عملیات لازم بین حافظه ها و نحوه کار کردن پشته و انباره را می بینید، علاوه بر این مثالی از Boxing و UnBoxing را هم می بینید.محیط های چند نخی Multi Threaded در وضعیتی که برنامه شما به صورت چند نخی ( Multi Thread )  اجرا شود، هر نخ « پشته » اختصاصی خود را دارد ولی « انباره » بین تمامی Thread ها به صورت مشترک است .پشته مختص به Thread است ولی Heap مختص به خود Application است. پشته برای مدیریت استثناء‌ها و اجرای Thread ها مهم و حیاتی است.خب، امیدوارم که توضیحات مناسبی داده باشم. اگر خطایی و اشتباهی وجود داشت ممنون می شم من رو از این موضوع مطلع کنیم.منابعC# 9.0 in a Nutshell By Joseph Albaharihttp://net-informations.com/faq/net/stack-heap.htm</description>
                <category>رضا پویا</category>
                <author>رضا پویا</author>
                <pubDate>Wed, 22 Jun 2022 20:53:04 +0430</pubDate>
            </item>
                    <item>
                <title>10 گام فرآیند یادگیری، روشی پیشنهادی برای برنامه نویس‌ها</title>
                <link>https://virgool.io/Solidity/10-%DA%AF%D8%A7%D9%85-%D9%81%D8%B1%D8%A2%DB%8C%D9%86%D8%AF-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-ykb7jdkbxwr5</link>
                <description>سلام ، به عنوان برنامه نویس و توسعه دهنده ، ما با چالشی روبه رو هستیم که کمتر کسی در سایر حوزه ها با اون دست و پنچه نرم می کنه. این چالش یا موهبت؛ پیشرفت هر روزه تکنولوژی‌ها، روش‌های برنامه نویسی و فریمورک‌ها و کتابخانه‌های موجود هست. بعضی از برنامه نویس‌ها  سرعت بالایی در یادگیری و به کاربندی  مطالبی که می خونند یا می بینیند ( یا می شنوند ) دارند، ولی بعضی دیگر مجبورند وقت و زمان زیاد برای یادگیری بگذارند، و از اینکه وقت کم دارند یا نسبت به همکارهاشون به نظر دیرتر یک مطلب رو یاد می گیرند یا خوب یاد نمی‌گیرند، ناراحت هستند. این موضوع حتی ممکنه باعث بشه پیشرفت کاریشون و در نهایت درآمدشون نسبت به سایر همکارهاشون کمتر باشه که اصلا خوش آیند نیست. آقای جان سانمز در کتاب فوق العاده خودش « مهارت نرم - راهنمای زندگی توسعه دهندگان نرم افزار » بر اساس تجربه ای که داشتن یک روش یادگیری مطالب را برای برنامه نویسان پیشنهاد دادن که اسم آن را « 10 گام فرآیند یادگیری» گذاشتند . ایده اصلی اینه که شما برای یادگیری موثر نیاز به یک ساختار دارید، بعضی‌ها به صورت خودآگاه یا ناخودآگاه این ساختارهای یادگیری رو آموزش دیده اند و پیروی می کنند؛ افراد دیگری هم باید یک ساختار مشخص رو یاد بگیرند تا بتوانند به صورت موثر اقدام به یادگیری کنند . به صورت خلاصه ، آقای سانمز اعتقاد دارند که ما برای یادگیری تکنولوژی ، باید 3 چیز را بدانیم : چگونه شروع کنیم - چه چیزهای پایه‌ای نیاز داریم تا برای شروع آنچه می خواهیم یادبگیریم اقدام کنیم ؟ گستره و عمق موضوع یادگیری - گستره و عمق آنچه می خواهیم یاد بگیریم چقدر است ؟ ما برای شروع نیازی به دانستن تمامی جزئیات نداریم ولی اگر دید کلی نسبت به آنچه می توانیم یادبگیری داشته باشیم، می توانیم بعدا جزئیات بیشتری یاد بگیریم. اصول پایه - فراتر از آنچه برای شروع نیاز داریم، باید کاربردهای معمول و اطلاعات معمول برای کاربرد عملی تکنولوژی که یاد می گیریم را بدانیم. 20 درصدی که می توانیم برای پوشش دادن 80 درصد کاربرد این تکنولوژی یاد بگیرم چه هستند؟ 10 گام فرآیند یادگیری  تصویر کلی را درک کنید. محدوده یادگیری را مشخص کنید.  موفقیت را تعریف کنید.  منابع یادگیری را بیابید. یک نقشه راه برای یادگیری خود بسازید.  منابع یادگیری را فیلتر کنید. به اندازه ای که شروع کنید ، یادبگیرید. تمرین و امتحان کنید.  به اندازه ای انجام کار سودمندی ، یاد بگیرید. به دیگری بیاموزید. فرآیند 10 گام یادگیری ( منبع کتاب Soft Skill ) # گام های 1 تا 6 :  فقط یکبار انجام می شوند. 6 گام اول، تحقیقات و اطلاعاتی هست که باید قبل از شروع یادگیری به دست بیاورید تا بدانید واقعا چه چیزی می خواهید یاد بگیرید و کاربرد آن چه هست و یک نقشه راه برای یادگیری بسازید. مثلا اگر به فکر یاد گیری تست نویسی هستید ، دید کلی در مورد تست نویسی، تکنیک های تست نویسی و کاربرد هر تکنیک را فرا بگیرید.  این 6 گام فقط یکبار انجام می شوند. گام اول - تصویر کلی را درک کنید.در ابتدا شما باید یک دید کلی و یک تصویر کلی در مورد تکنولوژی که می خواهید یاد بگیرید، ابعاد و جنبه ها و کاربردش داشته باشید. این کار به وسیله ی جستجو در اینترنت، صحبت با کسی که با تکنولوژی آشناست، دیدن یک ویدئو آموزشی، خواندن مقدمه کتاب و یا هر روش دیگری انجام می شود. گام دوم - محدوده یادگیری را مشخص کنید. احتمالا از گام اول فهمیدید چیزی که می خواهید یاد بگیرید گستره وسیعی دارد. پس آنچه می خواهید یاد بگیرید را محدود کنید. مثلا اگر می خواهید تکنولوژی Containerize کردن برنامه را یادبگیرید ، در وهله اول یادگیری خود را به درک ساختار  Image و container و نوشتن فایل داکر برای برنامه خود محدود کنید و درگیر یادگیری Docker compose و Swarm و ... نشوید. گام سوم - موفقیت را تعریف کنید.  برای خود یک نقطه موفقیت تعریف کنید که رسیدن به آن در دسترس باشد . مثلا در مثال قبلی ، ساخت یک فایل داکر و اجرای برنامه به صورت یک کانتینر یک « موفقیت » در دسترس است. گام چهارم - منابع یادگیری را بیابید. هر چقدر منابع یادگیری درباره این تکنولوژی را که می توانید پیدا کنید را فراهم کنید، نگران تعداد زیاد منابع یادگیری نباشید.گام پنجم - یک نقشه راه برای یادگیری خود بسازید.باید تکنولوژی که می خواهید یاد بگیرید را به ماژول‌ها و بخش های کوچکی تقسیم کنید و بر اساس یک نقشه شروع به یادگیری کنید. تقسیم بندی باعث می شود که در هر مرحله بتوانید روی یک جنبه تکنولوژی تمرکز کنید و یادگیری بهتری داشته باشید. یک راه خوب برای آماده کردن نقشه یادگیری خود، این است که ببینیند که دیگران به چه صورتی این موضوع را یاد می دهند. مثلا بخش بندی یک کتاب چگونه است یا یک دوره آموزشی چطور یک مطلب را به بخش های مختلف تقسیم کرده است. گام ششم - منابع یادگیری را فیلتر کنید.حالا که می دانید که « چه می خواهم یاد بگیریم و چگونه می خواهم یاد بگیرم » وقت آن است که منابع یادگیری خود را فیلتر کنید و یک منبع را برای یادگیری انتخاب کنید. انتخاب یک منبع خوب مناسب را می توانید با مشورت دیگران یا میزان لایک هایی که یک دوره آموزشی خورده است یا نظرات کاربران یا بررسی سطحی آن مطلب انجام دهید. # گام های 7 تا 10 - این گام ها را تکرار کنید.شما باید 4 گام بعدی را برای هر ماژولی که در نقشه ی یادگیری خود مشخص کردید، تکرار کنید. این مراحل واقعا بر خود یادگیری تکنولوژی تمرکز دارند و بر اساس فرمول جان سانمز  « بیاموز ، انجام بده ، بیاموز ، یاد بده »  یا به اختصار « بابی » یادگیری را به سر انجام می رسانید. Learn, Do, Learn, Teach ( LDTD ) گام هفتم - به اندازه ای که شروع کنید ، یادبگیرید.هدف این قدم این است که در ابتدا فقط به اندازه ای بیاموزید که در مرحله بعد بتوانید آن را امتحان کنید، نیازی نیست بسیار عمیق شوید. گام هشتم -  تمرین و امتحان کنید. حالا وقت آن است که هرچه در گام قبلی یاد گرفته اید را به کاربرید و امتحان کنید. هیچ قانونی وجود ندارد، هر کاری که دلتان می خواهد انجام دهید. نگران خروجی نباشید، فقط آنچه را یاد گرفته اید کاوش کنید و اگر پرسشی برایتان پیش آمد آن را یادداشت کنید، نیازی به پیدا کردن پاسخ در این مرحله ندارید. در گام بعدی موقعیت های پیدا کردن جواب را دارید. گام نهم -  به اندازه ای انجام کار سودمندی ، یاد بگیرید.حالا وقت پاسخ دادن به  پرسش هایی است که در گام قبلی برایتان پیش آمده  است. به تمام منابعی که دارید بروید و در مورد این ماژولی که دارید یاد می‎‌ گیرید، به صورت عمیق ، اطلاعات کسب کنید و آن را یاد بگیرید. در اینجا باید  تا جایی که فکر می کنید کافی است، در مورد این ماژول یاد بگیرید. حالا که دارید پاسخ پرسش‌هایتان را می یابید و درک عمیق تری از موضوع به دست می آورید. از برگشت به عقب و « تمرین و امتحان کردن » نترسید . هر چقدر زمان لازم دارید برای یادگیری به وسیله تمرین، دیدن ویدئو، خواندن آموزش، صحبت با فرد دیگر و ... بگذارید.  گام دهم -  به دیگری بیاموزید. اگر می خواهید به صورت عمیق تر و تخصصی یک مطلب را یاد بگیرید  باید آنچه را تا کنون یاد گرفته اید به دیگری بیاموزید. راه دیگری وجود ندارد . این کار را می توانید با ساخت آموزش ها، نوشتن پستی در بلاگ شخصی تان ، آموزش مستقیم به همکاران و دوستان، تدریس، آماده کردن پادکست، پاسخ دادن به پرسش ها و ... انجام دهید . امیدوارم این نوشتار برای شما سودمند بوده باشد.اگر این مطلب برای شما سودمند بود، خواهشمندم که این مطلب را با دیگران به اشتراک بگذارید.منابع : کتابJohn Z. Sonmez. Soft Skills. برداشتی آزاد از :https://sidanmor.com/how-do-i-learn-new-thinks-c27e3f4f24a0 </description>
                <category>رضا پویا</category>
                <author>رضا پویا</author>
                <pubDate>Thu, 16 Jun 2022 12:12:46 +0430</pubDate>
            </item>
            </channel>
</rss>