<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیرمحمّد مصدقی</title>
        <link>https://virgool.io/feed/@mosadeghi</link>
        <description>دانشجوی مهندسی کامپیوتر، برنامه‌نویس و چندتا چیز دیگه :)</description>
        <language>fa</language>
        <pubDate>2026-06-07 14:52:49</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/326131/avatar/o9vZud.jpeg?height=120&amp;width=120</url>
            <title>امیرمحمّد مصدقی</title>
            <link>https://virgool.io/@mosadeghi</link>
        </image>

                    <item>
                <title>چگونه تابع های بهتری بنویسیم و چرا؟</title>
                <link>https://virgool.io/@mosadeghi/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%AA%D8%A7%D8%A8%D8%B9-%D9%87%D8%A7%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%85-%D9%88-%DA%86%D8%B1%D8%A7-apuvnfup6ck8</link>
                <description>برای اکثر برنامه نویس های تازه کار ممکن است اهمیت تابع ها و استفاده ی درست از آن ها زیاد مشخص نباشد. حتی ممکن است در ابتدا تعریف کردن تابع ها کار بیهوده ای به نظر برسد و برنامه نویس ترجیح بدهد که تمام کدها را به صورت ترتیبی بنویسد. در این مطلب میخواهیم بررسی کنیم که چرا باید از تابع ها استفاده کنیم و چطور میتوانیم بیشترین بهره برداری را از ویژگی هایی که در اختیار ما قرار میدهند بکنیم.چرا باید از تابع ها استفاده کنیم؟تابع ها در واقع این امکان را به ما میدهند که قسمتی از کد را بسته بندی کنیم و به آن یک اسم دهیم. حالا هر وقت که نیاز به آن قسمت از کد بود میتوانیم اسمش را صدا بزنیم و کار موردنظر ما انجام می شود.زیاد مفهوم پیچیده ای نیست ولی همین ویژگی به ما این امکان را میدهد که تا حدودی راه حلمان را انتزاعی تر کنیم. همانطور که وقتی تلفنی پیتزا سفارش میدهیم میدانیم که باید پول را بدهیم و پیتزا را تحویل بگیریم و نه میدانیم پیتزا چطور آماده می شود و نه اهمیتی برایمان دارد در حال استفاده کردن از تابع ها هم لازم است بدانیم که تابع مورد استفاده چه آرگومان هایی دارد(چه اطلاعاتی نیاز دارد که بتواند کارش را انجام دهد.) و چه مقدار بازگشتی ای بر میگرداند و این که چطور این کار را میکند برای ما اهمیتی ندارد. اینطوری میتوانیم تمرکزمان را روی قسمتی که در حال کار کردن بر روی آن هستیم بگذاریم و اگر تابع مورد نظر آماده است که کار تمام است و در غیر این صورت بعدا به فکر پیاده سازی اش بیافتیم.اگر بخواهم مزایای استفاده کردن از تابع ها را نام ببرم موارد زیر را عنوان میکنم:1. متوجه شدن کد آسان تر است. چون به جای سینتکس های زبان بیشتر با فراخوانی تابع ها سر و کار داریم که اگر اسم آن ها به درستی انتخاب شود خواندن کد مثل خواندن یک متن انگلیسی آسان می شود.int main(){
        int number, base;
        cin &gt;&gt; number &gt;&gt; base;
        int result = decimalToBaseX(number, base);
        cout &lt;&lt; result;
}شما تنها با خواندن اسم تابع متوجه خواهید شد که این برنامه عددی را میگیرد و به مبنای دلخواه کاربر میبرد و نمایش میدهد. در حالی که اگر از تابع استفاده نمیکردیم احتمالا از چندین متغییر و یک حلقه در این بین استفاده میکردیم که شاید برای فهمیدن کاربردشان نیاز به کمی فکر کردن بود.2. تست کردن کد آسان تر است. تصور کنید مثال بالا شامل چندین مرحله دیگر هم بود، مثلا عددی باید به مبنای دلخواه میرفت، رقم هایش برعکس میشد و تصور میشد عدد حاصل ده دهی است(یعنی رقم هایش همان بود ولی مبنا عوض میشد، کار معمولی نیست ولی توی تمرین ها از این کارها میکنیم :))) ) و در نهایت عوامل اول عدد حاصل نمایش داده میشد. اگر بخواهیم این کد را بدون تابع بنویسیم، یک کد اسپاگتی خوشمزه(کدی که بسیار شلوغ و وابسته به هم است، یعنی رفتار هر قسمت آن ممکن است روی قسمت دیگر تاثیر بذارد) خواهیم داشت که تست کردنش عملا شکنجه است. ولی اگر بخواهیم همان کد را با تابع ها بنویسیم نتیجه می شود:int main(){
         int number, base;
         cin &gt;&gt; number &gt;&gt; base;
         int result = decimalToBaseX(number, base);
         int reversed = reverseNumber(result);
         int[] primeFactors = getPrimeFactors(reversed);
         printArrOfInts(primeFactors);
}نه تنها کد باز هم به راحتی فهمیده می شود بلکه چون هر قسمت از آن توسط تابعی که کارش را مستقل از تابع های دیگر انجام میدهد اجرا می شود میتوان هر کدام از آن تابع ها را به طور مستقل بررسی کرد و اگر اشکالی وجود داشت تصحیح کرد و چون تابع های دیگر تنها به نتیجه ی همدیگر وابسته هستند و اهمیتی به پیاده سازی داخلی هم نمیدهند هیچ اتفاقی برایشان نمی افتد.3. استفاده مجدد از کدها ممکن می شود. اگر تابع های شما کار مشخصی را به درستی انجام دهند و به اطلاعاتی جز آرگومان های خود برای درست کار کردن وابسته نباشند میتوان به راحتی آن ها را به پروژه های دیگر منتقل کرد و مورد استفاده قرار داد که این باعث میشود وقت زیادی برای شما ذخیره شود و حتی احتمال ایجاد باگ هم کمتر می شود چون تابع قبلا تست شده و از کارکردش مطمئن هستید. علاوه بر آن حتی در خود پروژه ی موردنظر هم در صورتی که تابع هایتان را هوشمندانه تعریف کرده باشید میتوانید از تکرار کردن خیلی از مراحل جلوگیری کنید و اصطلاحا اصل DRY را رعایت کنید.4. روند حل کردن سوال ها برای شما سریعتر و آسان تر می شود. مثال آخر را دوباره نگاه کنید، بدون تلاش خاصی ما بدنه اصلی برنامه را نوشتیم، حالا برنامه ی ما که ممکن بود پیچیده به نظر بیاید به قسمت های کوچکتری شکسته شده که نوشتن هرکدام از آن ها(تعریف کردن تابع های مرتبط) آسان تر و سریعتر خواهد بود. در واقع این با خود ایده ی اصلی برنامه نویسی که شکستن مسائل پیچیده به زیر مسائل ساده تر تا حدی که مسائل به راحتی قابل حل باشند کاملا هماهنگ است.5. این آخرین دلیلی است که اینجا مطرح میکنم و بعد میرویم سراغ نکاتی که به ما کمک میکند تابع های خوبی بنویسیم. البته که دلایل بیشتری برای استفاده از تابع ها وجود دارد ولی آخرین دلیل ما این است که گاهی تابع ها به ما این امکان را میدهند که روش های جدیدی برای حل مسئله مان به کار بگیریم که میتواند ساده تر و سر راست تر و حتی بعضی وقت ها تنها راه باشد. دارم در مورد روش های بازگشتی صحبت میکنم. توابع بازگشتی مبحث مهم و مفصلی است که مطلب خودش را نیاز دارد پس فعلا از آن رد میشویم ولی بد نیست در موردش جستوجو و مطالعه کنید.چطور تابع های تمیز و کاربردی بنویسیم؟هر تابع باید یک و فقط یک کار را به درستی انجام دهد، اگر تابعی چند کار انجام میدهد، به تابع های کوچکتر بشکنیدش.نام تابع باید کاری که تابع میکند را به وضوح توضیح دهد، بهتر است نام تابع حالت فعل داشته باشد مثلا برای تابعی که مشخص میکند عدد اول است یا خیر isPrime اسم مناسبی است و برای تابعی که عددی را از مبنای ده به مبنای موردنظر میبرد، converFromDecimalToBaseX اسم مناسبی است.اگر نمیتوانید برای تابعتان اسم مناسبی انتخاب کنید احتمالا تابعتان دارد چند کار مختلف را انجام میدهد. برید سراغ نکته اوّل.تا جایی که مجبور نشده اید و راه دیگری ندارید سعی کنید تابعتان فقط به آرگومان هایش وابسته باشد و به هیچ وجه از محیط یا گلوبال ها تاثیری نگیرد چون در غیر این صورت پیشبینی خروجی تابع سخت می شود و تست کردن آن را سخت میکند.تا جایی که مجبور نشده اید و راه دیگری ندارید تابع هایی بنویسید که ساید افکت نداشته باشند، یعنی روی محیط و گلوبال ها تاثیر نذارند و هر تاثیری که دارند را از طریق مقدار بازگشتی شان اعمال کنند، دلیل این نکته با نکته بالا یکی است. در کل، هر چه تابع از این نظر ایزوله تر باشد بهتر است.مورد چهارم در بخش قبلی را یکبار دیگر با دقت بخوانید، با استفاده از این تکنیک میتوانید سریع تر توسعه دهید، کدهای با کیفیت تری بنویسید و احتمال خطا را کمتر کنید.اینا مواردی بودند که دانستنشان از نظر من برای کسی که میخواهد واقعا برنامه نویس باشد از نان شب هم واجب تر است. در فرصت مناسب در مورد قواعد دیگر نوشتن کدهای خوب هم خواهم نوشت، علی الحساب کداتون رو درست ایندنت کنید، به ولله نصف مشکلاتتون رو حل میکنه همین یه مورد :)موفق باشید.</description>
                <category>امیرمحمّد مصدقی</category>
                <author>امیرمحمّد مصدقی</author>
                <pubDate>Wed, 04 Jan 2023 17:14:53 +0330</pubDate>
            </item>
                    <item>
                <title>نکته ای در مورد پاس دادن آرایه به متدها در جاوا</title>
                <link>https://virgool.io/CodeLovers/%D9%86%DA%A9%D8%AA%D9%87-%D8%A7%DB%8C-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D9%BE%D8%A7%D8%B3-%D8%AF%D8%A7%D8%AF%D9%86-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A8%D9%87-%D9%85%D8%AA%D8%AF%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-wwr4btw1i5qy</link>
                <description>در این مطلب در مورد یکی از ویژگی های زبان جاوا صحبت می کنیم که دانستنش می تواند از به وجود آمدن تعدادی از باگ ها که فهمیدن علتشان بسیار سخت است جلوگیری کند.در زبان جاوا داده ها به صورت کلی دو نوع هستند انواع اوّلیه (primitive datatypes) و انواع ارجاعی (reference datatypes)انواع داده ی اوّلیه موارد زیر هستند و هر نوع دیگری در گروه انواع ارجاعی قرار می‌گیرد.byteshortintlongcharbooleanfloatdoubleوقتی که یک متغییر اعلان می کنیم در واقع داریم برای قسمتی از حافظه اسم انتخاب می کنیم که از این به بعد می توانیم به آن قسمت با استفاده از آن اسم دسترسی داشته باشیم. تفاوت انواع اوّلیه و ارجاعی در این زمینه این است که برای انواع اوّلیه مقدار خود داده در آن قسمت از حافظه ذخیره می شود در حالی که برای انواع ارجاعی اینگونه نیست. اشیائی که از جنس انواع ارجاعی در قسمت دیگری از حافظه ذخیره می شوند و در متغییر مربوط به آن ها ارجاعی به آن اشیاء قرار داده می شود.این ها را که خودم می دانستم !حالا به نکته ای که قرار بود در موردش صحبت کنیم می رسیم ! سه نوع فرستادن متغییر به توابع در زبان های مختلف دیده می شود:ارسال با مقدار (pass by value)ارسال با نشانگر (pass by pointer)ارسال با ارجاع (pass by reference)روشی که زبان جاوا برای این کار استفاده می‌کند روش ارسال با مقدار است، یعنی وقتی ما اسم متغییری را به عنوان آرگومان به پارامتر متدی می‌دهیم مقدار آن متغییر کپی می‌شود و در اختیار متغییری که در قسمت پارامترهای آن متد تعریف شده قرار می گیرد.فرستادن مقادیر از انواع اوّلیه به متدها سرراست است و نکته ی خاصی ندارد، مقدار برای متد فرستاده می‌شود و هر تغییری روی آن ایجاد شود تاثیری روی متغییری که به متد پاس داده شده است ندارد ولی وقتی با انواع ارجاعی سر کار داریم شرایط کمی متفاوت است، به کد زیر توجّه کنید:public class MethodExample {
	public static void main(String[] args) {
		int[] arr1 = {1,4,2,5,3};
		printArr(arr1);
		
		int[] arr2 = sort(arr1);
		printArr(arr1);
		printArr(arr2);
	}
	
	public static int[] sort(int[] arr) {
		int n = arr.length;
		for (int i=0; i&lt;n-1; i++)
			for (int j=i+1; j&lt;n; j++)
				if (arr[i] &gt; arr[j]) {
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
		return arr;
	}
	
	public static void printArr(int[] arr) {
		for (int i: arr)
			System.out.printf(&amp;quot%d\t&amp;quot,i);
		System.out.print(&amp;quot\n&amp;quot);
	}
}متد sort که در خط 11 تعریف شده است کارش این است که یک آرایه از اعداد بگیرد و آن ها را به صورت صعودی مرتب کند و برگرداند.متد printArr که در خط 23 تعریف شده است کارش این است که یک آرایه از اعداد بگیرد و آن ها را در خروجی نمایش دهد.در متد main که entry point برنامه ی ما است ابتدا یک آرایه از اعداد صحیح ایجاد کرده و با استفاده از متد printArr در خروجی نمایش داده ایم، سپس این آرایه را به متد sort پاس داده ایم و مقداری که متد sort بر می گرداند را در متغییری به نام arr2 قرار داده ایم و سپس arr2 و arr1 را به ترتیب با استفاده از متد printArr خروجی داده ایم. با توجّه به این که جاوا از روش pass by value برای ارسال مقادیر به متدها استفاده می‌کند انتظار داریم نتیجه چنین چیزی باشد:result:
1	4	2	5	3	
1	4	2	5	3	
1	2	3	4	5ولی در واقع با نتیجه ی زیر روبرو می شویم:result:
1	4	2	5	3	
1	2	3	4	5	
1	2	3	4	5که این به این معنی است که آرایه ی اوّلیه ی ما دچار تغییر شده و این به نظر برخلاف چیزی است که بالاتر گفته بودیم ولی اینطور نیست !... تفاوت انواع اوّلیه و ارجاعی در این زمینه این است که برای انواع اوّلیه مقدار خود داده در آن قسمت از حافظه ذخیره می شود در حالی که برای انواع ارجاعی اینگونه نیست. اشیائی که از جنس انواع ارجاعی در قسمت دیگری از حافظه ذخیره می شوند و در متغییر مربوط به آن ها ارجاعی به آن اشیاء قرار داده می شود.روشی که زبان جاوا برای این کار استفاده می‌کند روش ارسال با مقدار است، یعنی وقتی ما اسم متغییری را به عنوان آرگومان به پارامتر متدی می‌دهیم مقدار آن متغییر کپی می‌شود و در اختیار متغییری که در قسمت پارامترهای آن متد تعریف شده قرار می گیرد.با دقت کردن به این دو نکته میتوان فهمید که قضیه از چه قرار است ! آرایه یک نوع ارجاعی است و در متغییری که اعلان کرده بودیم مقداری که قرار گرفته بود در واقع یک ارجاع به آن آرایه بود و نه خود آرایه و وقتی که این مقدار به متد داده شد در واقع ارجاع به آرایه در اختیار آن قرار گرفت و این یعنی متد sort هم به همان شئ دسترسی دارد که متد main ما دسترسی داشت و با تغییر دادن این آرایه در واقع روی آرایه ی اصلی هم تاثیر می گذارد.حالا که فهمیدیم چه اتفاقی می‌افتد چکار کنیم ؟حل کردن این مسئله کار سختی نیست، شما می توانید یک متد بنویسید که یک آرایه جدید درست کند و اعضای این آرایه را در آرایه ی جدید و در خانه های متناظر آن قرار دهد و آرایه ی جدید را برگرداند. البته راه دیگر و ساده تری هم وجود دارد ! استفاده کردن از متد clone روی آرایه:arr.clone()این متد یک کپی از آرایه ایجاد می کند و ارجاع به آن را بر می‌گرداند. به عنوان مثال اگر متد main کدی که بالاتر نوشته بودیم را اینطوری بازنویسی کنیم:public static void main(String[] args) {
		int[] arr1 = {1,4,2,5,3};
		printArr(arr1);
		
		int[] arr2 = sort(arr1);
		printArr(arr1);
		printArr(arr2);
	}با نتیجه ی زیر روبرو می شویم:result:
1	4	2	5	3	
1	4	2	5	3	
1	2	3	4	5که نتیجه ی مورد انتظار و دلخواه ماست.ولی هنوز داستان تمام نشده است !حالا که نکته ی بالا را می دانیم ممکن است فکر کنیم دیگر می‌توانیم با خیال راحت به کد زدن بپردازیم ولی همیشه اینطور نیست ! به مثال زیر توجّه کنید:public class TwoDArr {
	public static void main(String[] args) {
		int[][] arr1 = {{1,2,3},{4,5,6},{7,8,9}};
		
		System.out.println(&amp;quotarr1 before plusTwo method call:&amp;quot);
		print2DArr(arr1);

		int[][] arr2 = plusTwo(arr1.clone());
		System.out.println(&amp;quotarr2:&amp;quot);
		print2DArr(arr1);

		System.out.println(&amp;quotarr1 after plusTwo method call:&amp;quot);
		print2DArr(arr1);
	}
	
	public static void print2DArr(int[][] arr) {
		for (int[] row: arr) {
			for (int item: row)
				System.out.printf(&amp;quot%d\t&amp;quot, item);
			System.out.print(&amp;quot\n&amp;quot);
		}
	}
	
	public static int[][] plusTwo(int[][] arr){
		for (int i=0; i &lt; arr.length; i++)
			for (int j=0; j&lt; arr[i].length; j++)
				arr[i][j] += 2;
		return arr;
	}
}کار متد print2DArr این است که یک آرایه دو بعدی به عنوان پارامتر بگیرد و آن را خروجی دهد و کار متد plusTwo این است که تمام عناصر آرایه ی دو بعدی ای که می‌گیرد را به علاوه ی 2 کند و نتیجه را برگرداند. حالا که از متد clone استفاده کردیم انتظار داریم که arr1 ما در روند این برنامه تغییری نکند ولی با اجرا کردن این کد در کمال ناباوری با این نتیجه روبرو می‌شویم:arr1 before plusTwo method call:
1	2	3	
4	5	6	
7	8	9	
arr2:
3	4	5	
6	7	8	
9	10	11	
arr1 after plusTwo method call:
3	4	5	
6	7	8	
9	10	11	خدایا بسه دیگه خسته شدیملطفاً آرامش خود را حفظ کنید تا دلیل این اتفاق را توضیح بدهم و این مطلب را به پایان ببریم.اتفاقی که افتاد به خاطر ماهیت آرایه های دو بعدی است ! یک آرایه ی دو بعدی در واقع آرایه ای از آرایه هاست. اگر بخواهیم این جمله را جور دیگری بگوییم که علت این اتفاق را برای ما مشخص کند می‌توانیم بگوییم یک آرایه ی دو بعدی آرایه ای است که هر خانه از آن ارجاع به آرایه ای دیگر است. با کمی بررسی و تفکر می توان فهمید که وقتی آرایه ی دو بعدی را ‌clone می کنیم. اتفاقی که می افتد این است که آرایه ی دو بعدی  جدیدی ایجاد می شود و اعضای این آرایه (یعنی ارجاع های داخل خانه های این آرایه) در آرایه ی جدید کپی می شوند. در نتیجه هر چند که آرایه دو بعدی ما کلون شده است ولی سطرهای ما در واقع همان سطر های آرایه ی اصلی هستند و با تغییر دادن اعضای این آرایه ی دو بعدی آرایه ی اوّلیه هم تغییر می کند. این اتفاق برای آرایه های تک بعدی ای که انواع ارجاعی تغییر پذیر(mutable) دارند هم صادق است !حالا این مسئله را چطور حل کنیم ؟راه حل این مسئله این است که آرایه ی دو بعدی جدیدی بسازیم که تعداد سطرهایش با آرایه ی اوّلیه ی ما برابر است و بعد ارجاع به clone هر کدام از سطرهای آرایه ی اوّلیه را در خانه ی مرتبط با سطر مربوطه در آرایه ی جدید قرار دهیم. برای سایر انواع ارجاعی هم باید در روندی مشابه این روند هر کدام از اشیا را clone کنیم و ارجاع به clone آن ها را در آرایه ی جدید قرار بدهیم.ممنون که این مطلب را مطالعه کردید و امیدوارم برایتان مفید بوده باشد، خوشحال می شوم نظر شما را در مورد این مطلب بشنوم.جهت مطالعه ی مطالب بیشتر در مورد برنامه نویسی و موضوعات مرتبط و مشاهده ی محتواهای دیگری که در این موضوعات تولید می ‌کنم لطفا کانال تلگرام من را بررسی کنید:t.me/amirMosadeghi</description>
                <category>امیرمحمّد مصدقی</category>
                <author>امیرمحمّد مصدقی</author>
                <pubDate>Tue, 16 Mar 2021 18:09:50 +0330</pubDate>
            </item>
                    <item>
                <title>چطور در برنامه نویسی پیشرفت کنیم؟</title>
                <link>https://virgool.io/CodeLovers/%DA%86%D8%B7%D9%88%D8%B1-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA-%DA%A9%D9%86%DB%8C%D9%85-czcunqidlblt</link>
                <description>ده سال از اوّلین آشنایی من با برنامه نویسی میگذرد. هرچند تمام این ده سال مشغول برنامه نویسی نبودم و آن بین به دلیل رشته تحصیلی در دبیرستان و کنکور، فاصله زیادی افتاد ولی در این مدت چیزهای مختلفی را یاد گرفتم و تجربه کردم و روش های مختلفی برای یادگرفتن و پیشرفت کردن در برنامه نویسی را امتحان کردم. در حال حاضر دانشجوی کارشناسی مهندسی کامپیوتر در دانشگاه گیلان هستم و همزمان در دروس مرتبط با برنامه نویسی مثل درس مبانی کامیپوتر و برنامه نویسی و درس برنامه سازی پیشرفته به عنوان TA (دستیار آموزشی) با استادهای مختلف همکاری میکنم و البته اخیرا در حال برگزاری کلاس های آموزش برنامه نویسی خصوصی خودم هم هستم و از این طریق با افراد زیادی در ارتباطم که مشغول یادگیری برنامه نویسی هستند و به همین دلیل زیاد پیش می آید سوالی که در عنوان این مطلب مطرح شد از من پرسیده شود. در این مطلب سعی میکنم نکاتی که به نظرم برای پیشرفت کردن در برنامه نویسی نیاز هست را نام ببرم. امیدوارم که برایتان مفید باشد.زبان انگلیسی خود را تقویت کنید!هر کاری نیاز به ابزارهایی دارد که شاید بتوان تا حدودی بدون آن ابزار در آن کار پیشرفت کرد ولی از جایی به بعد این کار به شدت سخت و بعضی وقت ها غیرممکن می شود. زبان انگلیسی چه خوشمان بیاید و چه ازش متنفر باشیم زبان صنعت IT و در نتیجه برنامه نویسی است و یک برنامه نویس برای این که بتواند گلیم خود را از آب بیرون بکشد نیاز دارد تا با این زبان به خوبی آشنا باشد. اگر با این زبان آشنا هستید چه بهتر، اگر نه ماهی را هر وقت از آب بگیرید تازه است. با یادگرفتن زبان انگلیسی فرصت فعالیت در بازار کار بین المللی و استفاده کردن از منابع آموزشی به روز و کامل برای شما فراهم می شود علاوه بر آن خیلی از سازمان ها و شرکت ها به دنبال برنامه نویس هایی هستند که با زبان انگلیسی آشنا باشند.سرچ کردن و مطالعه کردن را یادبگیرید.ابزار دیگری که برای یک برنامه نویس به شدت ضروری است مهارت در سرچ کردن و مطالعه کردن است. شاید بتوان بدون آشنا بودن با زبان انگلیسی تا حدودی در برنامه نویسی پیش رفت ولی این کار بدون داشتن مهارت در جستوجو کردن و مطالعه کردن عملاً غیرممکن است. وقتی شما پا را از مطالعه کردن کتاب ها و تدریس استاد فراتر بگذارید و بخواهید شروع به تمرین کردن و نوشتن برنامه های مختلف کنید به مواردی بر میخورید که نمیدانید چطور انجام می شوند یا ممکن است هنگام نوشتن کد به ارور بربخورید یا حتی نیاز داشته باشید تنظیمات محیط توسعه خودتان را تغییر دهید یا یکی از ویژگی های آن را یاد بگیرید. اینجور مواقع اینکه بدانید باید دنبال چه چیزی بگردید و کجا به دنبال آن بگردید مهارتی است که میتواند شما را نجات دهد. بد نیست با سایت های مرتبط با زمینه ای که دارید در موردش تمرین و مطالعه میکنید آشنا شوید. بدیهی است که بهتر است با زبان انگلیسی آشنا باشید و جستوجوی خود را به این زبان انجام دهید تا نتایج کامل تر و بیشتری بگیرید.سایت های مفید:geeksforgeeks: منبع بسیار خوبی برای مطالعه در مورد زبان های برنامه نویسی، ساختمان های داده و الگوریتم ها و موارد مرتبط دیگرstaackoverflow: سایتی برای پرسش و پاسخ برنامه نویسی، تقریبا جواب هر سوالی که دارید در این سایت پیدا می شود ! اگر هم نبود میتوانید بپرسید تا برنامه نویس های با تجربه تر جواب دهند !سبک یادگیری خود و منابع مورد نیاز خود را پیدا کنید.انسان ها در زمینه های مختلف با هم متفاوت اند و یادگیری یکی از این زمینه هاست. پربازده ترین روش یادگیری برای هر شخص متفاوت است و باید سعی کنید روش یادگیری مناسب خود را پیدا کنید. یک نفر ترجیح می دهد کتاب بخواند و برای فرد دیگری این کار ملال آور است و ترجیح می دهد از ویدئوهای آموزشی استفاده کند یا شاید ترکیبی از این روش ها برای شما بهترین بازده را داشته باشد که با امتحان کردن حالت های مختلف باید تشخیص بدهید کدام حالت برای شما مفید تر است. برای یادگیری هر موضوعی منابع زیادی در اینترنت موجود است که می توانید با جستوجو مناسب ترین آنها برای خودتان را پیدا کنید.برخی از منابع مفید:youtube: بزرگترین منبع آموزش های ویدئویی رایگان در سراسر کره ی خاکی !هدف بلند مدت و اهداف کوتاه مدت داشته باشید.این مورد تاثیر باورنکردنی ای روی سرعت پیشرفت شما دارد ! چه در برنامه نویسی چه در کارهای دیگر داشتن هدف بلند مدت و اهداف کوتاه مدتی که در راستای آن هدف باشند بسیار با اهمیت است. اگر شما هدف مشخصی نداشته باشید ممکن است دائما از این شاخه به آن شاخه بپرید و این باعث می شود تمرکز و انرژی شما بین کارهای مختلف و متفرقه پخش شود و با وجود صرف کردن وقت زیاد نتوانید نتیجه ی قابل ملاحضه ای مشاهده کنید. تنظیم کردن اهداف کوتاه مدت هم به شما کمک میکنند بتوانید برنامه ریزی کنید و در بازه های مشخص پیشرفت و نقاط قوت و ضعف خود را ارزیابی کنید و روند خود را با توجه به آن تنظیم کنید و البته با دیدن نتیجه ی کار خود انگیزه ی بیشتری داشته باشید و آن را حفظ کنید.یادگیری و تمرین کردن را به صورت مستمر ادامه دهید.برنامه نویسی همزمان هم علم است و هم مهارت، برای پیشرفت در برنامه نویسی مانند هر مهارت دیگری علاوه بر تمام مواردی که ذکر شد به تمرین زیاد و پیوستگی بین این تمرین ها نیاز دارید، تاثیر یک ساعت تمرین برنامه نویسی در روز بیشتر از هفت ساعت تمرین برنامه نویسی در یک روز و تمرین نکردن در روزهای دیگر است. فراموش نکنید که تا وقتی شروع به تمرین کردن نکنید اشتباهی هم نمیکنید و تا وقتی اشتباه نکنید چیزی یاد نمیگیرید. برنامه نویسی هم مانند هر مهارت و توانایی دیگری برای تقویت شدن نیاز به تلاش دارد و ممکن است سختی های مخصوص خودش را داشته باشد ولی یکی از مهمترین نکاتی که برای پیشرفت کردن به آن نیاز دارید این است که بدانید مانند وزنه برداری که برای بلند کردن وزنه های سنگین تر نیاز به تلاش بیشتر دارد ولی در نهایت این تلاش به توانایی بیشتر منتهی می شود شما هم برای برنامه نویس بهتری شدن نیاز دارید روند تمرین خود را به صورت مستمر ادامه دهید و اجازه ندهید ارورها اشتباهات و ... کلافه تان کنند. خوب است با توجه به مواردی که یاد می گیرید برای خود تمرین ها و پروژه هایی در نظر بگیرید و انجام دهید تا مهارت خود را افزایش دهید. بهتر است این پروژه ها اندکی برایتان چالش داشته باشند تا در یادگیری بهتر به شما کمک کنند. برای پایان این بخش یک بار دیگر تاکید میکنم تا زمانی که دستتان به کیبورد نخورد و خودتان کد نزنید چیزی یاد نمیگیرید پس سعی کنید بین مطالعه کردن و تمرین کردن تعادل درستی برقرار کنید. نکات 2 تا 4 میتوانند به شما در بهتر انجام دادن این نکته کمک کنند.یادداشت برداری کنید.یادداشت کردن چه هنگام یادگیری و چه هنگام انجام دادن کارها میتواند به شما کمک کند به عملکرد خود آگاهی بهتری داشته باشید. با یادداشت کردن مطالبی که یاد گرفته اید میتوانید در مواقع لازم از یادداشت های خود برای مرور کردن مطالب مهم استفاده کنید و وقت زیادی را نجات دهید. یادداشت کردن کارهایی که انجام می دهید هم به شما کمک میکند بتوانید زمانی که برای هر کار صرف کرده اید و کارهایی که انجام داده اید را بررسی کنید و با بررسی نتایجی که در تمرین ها و نزدیک شدن به اهدافتان به دست آورده اید مشکلات احتمالی و نقاط قوت کارهای خود را پیدا کنید و بتوانید تعادل بهتری برقرار کنید و برنامه ریزی منطقی تری داشته باشید. یکی از موارد دیگری که میتواند یادداشت کردن به شما کمک کند یادداشت کردن نکات جانبی و متفرفه است. برنامه نویسی اقیانوس بزرگی شامل مطالب به هم مرتبط است. سخت است به سراغ مطلبی بروید و نیم ساعت بعد در حال خواندن مطالب غیرضروری ای که به نظر مرتبط می آمدند نباشید. شما می توانید با یادداشت کردن عنوان این مطالب و اولویت بندی کردن این موارد خیال خود را از این بابت که قرار نیست گمشان کنید راحت کنید و بعد با تمرکز بیشتر روی مورد اصلی ای که در حال یادگیری اش بودید تمرکز کنید.یادگرفتن ابزارهای برنامه نویسیقسمت زیادی از برنامه نویسی مهارت حل مسئله است ولی یک برنامه نویس خوب علاوه بر داشتن مهارت بالا در حل مسئله و آشنا بودن با زبان های برنامه نویسی نیاز دارد با ابزارهای دیگری نیز آشنا باشد. سعی کنید در این مورد سرچ کنید و از افراد با تجربه تری که در زمینه مورد نظر شما کار میکنند بپرسید تا راهنمایی تان کنند.برخی از ابزارهای مهم:gitgithubgnu/linuxمطالعه ی کتاب های کلاسیک را در برنامه خود قرار دهید.بعضی کتاب ها هستند که خواندن آن ها برای هر برنامه نویسی مفید است. از افراد با تجربه تر در این مورد بپرسید و سعی کنید هر از گاهی یکی از این کتاب ها را انتخاب و مطالعه کنید. این یکی از بهترین کارهایی هست که به عنوان یک برنامه نویس میتوانید برای خود انجام دهید.برخی از کتاب هایی که من خواندنشان را پیشنهاد میکنم:Clean CodeHead first Design Patternsچیزهایی که یادگرفته اید را آموزش دهیدیادگرفتن هیچوقت تمام نمی شود و این روند تا زمانی که در این زمینه مشغول به فعالیت باشید ادامه خواهد داشت. یکی از کارهایی که به شدت میتواند یادگیری شما را عمیق کند یاد دادن چیزهایی است که یاد گرفته اید. این یاد دادن میتواند به صورت جواب دادن سوال همکلاسی ها، نوشتن مطلب در مورد آن موضوع خاص، فعالیت کردن در فروم ها و انجمن هایی مثل stackoverflow، ضبط کردن ویدئو و حتی بعد از گذشتن از سطح قابل قبولی همکاری با استاد ها در آموزش و یا برگزاری کلاس باشد. به شخصه نتیجه مثبتی از این نکته دریافت کرده ام. برای این که چیزی را آموزش دهید باید به آن تسلط کافی داشته باشید و این باعث می شود مطالعه ای که برای آن موضوع میکنید عمیق و مفید باشد همچنین وقتی مطلبی را آموزش میدهید سعی میکنید به صورت قابل فهم و با زبان ساده توضیح دهید که این باعث می شود بیشتر به مطلب مورد نظر فکر کنید و این هم تاثیر بسیار مثبتی دارد و در نهایت آموزش روندی دو طرفه است و ممکن است آموزنده سوال هایی بپرسد یا نکاتی بگوید که خودتان به آن ها توجه نکرده بودید و باعث شود موارد جدید یاد بگیرید.با دیگران در ارتباط باشید، همکاری کنید و از آن ها یاد بگیرید.همیشه دیگران چیزهایی برای یاد دادن دارند و این مورد هم مانند مورد 9 میتواند به شدت برای یادگیری مفید باشد. هنگام همکاری با دیگران ممکن است با نکاتی برخورد کنید که به تنهایی با آن ها روبرو نمی شدید یا در مواردی روش های متفاوت و اختلاف نظر داشته باشید که در نهایت با مباحثه میتواند منجر به یادگیری بهتر شود. همچنین مهارت همکاری کردن و کار تیمی جزو مهارت های نرمی است که برای یک برنامه نویس میتواند بسیار مفید باشد.سلامت جسمی و روانی خود را حفظ کنید !به عنوان مورد آخر میخواهم به نکته بسیار مهمی اشاره کنم که معمولا به آن کم توجهی می شود. فراموش نکنید که به عنوان یک برنامه نویس احتمالا در معرض کم تحرکی، گاهی اوقات فشار ذهنی زیاد و موارد مضر دیگری هستیم که باید با رعایت نکاتی مانند تغذیه مناسب، ورزش کردن، حفظ ارتباط با دوستان و استراحت کردن و فعالیت های جانبی مختلف سعی کنیم با آثار بد این موارد مقابله کنیم و این به صورت غیر مستقیم میتواند به ما در راندمان بهتر و حفظ انگیزه برای ادامه مسیر کمک کند.اگر شما هم نکته ای دارید که اضافه کنید لطفا در بخش نظرات بنویسید. امیدوارم که این نکات برای شما مفید بوده باشند.اگه به برنامه نویسی و مطالب مرتبط علاقه مند هستید به کانال من توی تلگرام سر بزنید :)t.me/amirMosadeghi</description>
                <category>امیرمحمّد مصدقی</category>
                <author>امیرمحمّد مصدقی</author>
                <pubDate>Mon, 08 Mar 2021 18:11:15 +0330</pubDate>
            </item>
            </channel>
</rss>