<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد ایرجی</title>
        <link>https://virgool.io/feed/@nix</link>
        <description>از برنامه‌نویسی و طراحی بازی می‌نویسم.</description>
        <language>fa</language>
        <pubDate>2026-06-14 08:18:13</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/13309/avatar/caUS2A.jpeg?height=120&amp;width=120</url>
            <title>محمد ایرجی</title>
            <link>https://virgool.io/@nix</link>
        </image>

                    <item>
                <title>نبردی در ستایش مرگ (تحلیل بازی Hades)</title>
                <link>https://virgool.io/@nix/%D9%86%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-%D8%B3%D8%AA%D8%A7%DB%8C%D8%B4-%D9%85%D8%B1%DA%AF-%28%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%A8%D8%A7%D8%B2%DB%8C-Hades%29-hakzsotd4ej4</link>
                <description>بازی Hades در سبک Rogue-like عرضه شد. سبکی که در اون با هر بار مردن بازیکن قوی‌تر می‌شه. اینجا هر چیزی که تو رو بکشه قوی‌ترت می‌کنه! تو این مقاله با تمرکز به روی سیستم نبرد بازی به تحلیل اون پرداختم. امیدوارم این اطلاعات براتون مفید باشه.تو این مقاله می‌خوام درباره‌ی طراحی بازی Hades صحبت کنم. بازی که توسط استودیوی Super Giant Games ساخته شده. بازی‌های شاهکاری مثل Bastion و Transistor رو ساخته و حالا با عرضه‌ی بازی Hades موفق به کسب بهترین بازی سال در رویداد (Game of the year (GOTY شده.این که Hades خیلی خفن و شاهکاره بحثی نیست اما اوج این قضیه برای من وقتی بود که طبق معمول سورس‌کد کامل بازی رو Decompile کردم. فایل‌های گرافیک رو استخراج کردم تا ببینم، بازی چه طور ساخته شده. بازی یه سری ویژگی‌های ساده‌تر از سایر نمونه‌های مشابه داشت اما تمام تمرکز روی جزییات بسیار زیادی بود که مربوط به ساده‌سازی گیم‌پلی (ترکیب جزییات و ساده‌سازی پارادوکسه؟ جلوتر دلیلش می‌گم) و نکات عجیبی مثل تاثیر الماس بنفش (Darkness) در damage بود که جایی مستند نشده و تو بازی بهش اشاره نمی‌شه! من از سیستم مبارزه شروع می‌کنم که مکانیک‌های اصلی توی اون وجود دارند.مفاهیم طراحی بازی من مفاهیم گیم‌پلی رو هم سعی می‌کنم اینجا به صورت حاشیه و خلاصه بنویسم. اگر باهاشون آشنایید می‌تونید برید سراغ تیتر بعدی یا همچنان بخونید تا ذهنیتم رو بهتر بتونم منتقل کنم.مکانیک‌هامکانیک اصلی (Main mechanic): هر عملی توی بازیه که با Input کاربر (زدن دکمه، حرکت موس و...) کاری توی بازی صورت بگیره. مثلاً توی ماریو از مکانیک‌های اصلی، حرکت، پرش و شلیک تیر رو می‌شه نام برد.مکانیک‌ جانبی (Side mechanic): اونایی هستند که در بازخورد مکانیک اصلی توسط بازی اجرا می‌شن که می‌تونن در مسیر پیشرفت یا ایجاد مانع در برابر بازیکن ظاهر بشن. مثل پرش در ماریو که مکانیک فرعی ضربه به جعبه (Coin box) و نمایش آیتم داخلش رو فعال می‌کنه و می‌تونه بهش قارچ بده که در ادامه پیشرفت بازی بهش کمک کنه. یا دشمنان که با در مقابل مکانیک اصلی حرکت قرار می‌گیرند و باید با مکانیک اصلی دیگه‌ای که پریدن باشه، اونا رو از میون برداشت.مکانیک کیفی (Enhancement mechanics): این نوع مکانیک جهت افزایش عمق به سایر مکانیک‌ها به کار می‌ره. منظور از عمق اینه که باعث با ایجاد حالتی متفاوت از مکانیک‌های اصلی بشه تنوع در تصمیم‌گیری و انتخاب ایجاد کرد. یا مکانیک‌هایی هستند که باعث بهبود بخشی از بازی می‌شن. (نمی‌دونم «کیفی» ترجمه‌ی فارسی درستی هست یا نه)سبک بازیسبک این بازی Rogue-like عه. در اصل Rogue یه بازی بوده که سال ۱۹۹۳ منتشر شده. مکانیک‌هایی رو عرضه می‌کنه که به سبک جدیدی در طراحی بازی منجر می‌شه. این سبک زیرشاخه‌ی نقش‌آفرینی (Roly-playing) حساب می‌شه. ویژگی این سبک اینه که وارد یه سری Dungeon می‌شید و باید یه سری دشمن رو از بین ببرید. آیتم‌ها و سلاح‌های مختلف به دست میارید که روی هم تاثیر می‌ذارن و با پیشرفت در بازی تنوع حرکات و قابلیت‌های کارکتر رو افزایش می‌دن. همچنین بازی هم در هر مرحله سختتر می‌شه. خب تا اینجا که همون نقش‌آفرینی بود. اما چیزی که این سبک رو منحصر به فرد می‌کنه اینه که اگر تو بازی بمیرید باید از اول شروع کنید و تمام دستاوردتون از بین می‌ره. خب این ویژگی (به خصوص برای عصر حاضر) خیلی مسخره ست؟ اینجا قابلیت Procedural content generation مطرح می‌شه. این طوری که با هر بار مرگ نقشه‌ی بازی و آیتم‌هایی که به دست میارید از سری قبلی متفاوت هستند و هر بار با یه استراتژی متفاوت می‌تونید بازی کنید. در نتیجه بارها می‌شه این بازی‌ها رو انجام داد و هر بار کلی تنوع و تجربه‌ی جدید به دست آورد. بازی Rogueتوی عصر حاضر بازی‌سازهای مستقل با اضافه کردن ویژگی‌هایی که باعث می‌شه در هر بار بازی یه سری آیتم به دست بیارید و کارکتر خودتون رو در بازی ارتقا بدید. این طوری دیگه از هر بار مردن احساس نامیدی نمی‌کنید و هر بار قوی‌تر بازی رو پیش می‌برید و حس بهتری دارید. بین علما و فضلا اختلافه که به این بازی‌ها باید Rogue-lite گفته بشه.حالا چرا این سبک دوباره جون گرفته و بازی‌سازان مستقل می‌رن سراغش خودش یه مقاله‌ی مجزاست. فقط در این حد بگم که چون منابع تولیدشون محدوده و این سبک ارزش بازی چند باره و استفاده‌ی چند باره از عناصر رو می‌ده. در نتیجه زمان بازی طولانی‌تر و زمان توسعه میاد پایین. هسته‌ی اصلی گیم‌پلی (Core gameplay)بازی Hades از موتور بازی توسط خود تیم توسعه داده شده و همون موتوری هست که باهاش Bastion و Transistor رو ساختند. بسیاری از مکانیک‌ها و ویژگی‌های بازی‌های قبلی رو استفاده کردند این تمرکز باعث شده همون ویژگی‌ها به صورت خیلی پخته‌تر در این بازی خودش رو نشون بده. البته محدودیت‌هایی هم داشتند. مثلاً با این موتور نمی‌شه یه بازی سه بعدی یا FPS درست کرد. (بله درسته، Hades یه بازی دو بعدیه! در مقاله‌ی فنی کامل توضیح می‌دم)دوربیناز نوع دوربین Isometric در بازی استفاده شده و با فاصله‌ی نسبتاً زیادی از کارکتر قرار داره. این قضیه باعث شده فضای بیشتری از محیط، دشمنان یا موانع رو ببینیم. همچنین باعث می‌شه تا سیستم حرکت بازی از نقاط مهم به حساب بیاد. به عنوان مثال تو بازی FPS خیلی سخته حواست به زیر پای کارکترت باشه تا یه وقت روی جادوی آتیشی که دشمن ظاهر کرده، نباشی. از این جهت زاویه دوربین برای بازی‌های اکشن نقش‌آفرینی رو بیشتر دوست دارم. البته دوربین سوم شخص با فاصله‌ی زیاد رو هم برای این سبک خیلی دوست دارم. چون می‌تونی کنترل دوربین رو داشته باشی. منتهی علاوه بر محدودیت فنی تیم‌سازنده، عدم استفاده از این نوع دوربین باعث شده تا تعداد چیزهایی که باید کنترل کنی کمتر باشه و تمرکز بیشتری روی خود مبارزه داشته باشی.دوربین در حالت ایزومتریک با ۴۵ درجه چرخش در حالت افقی و ۴۵ درجه چرخش در حالت عمودی در بالای محیط قرار می‌گیره.باعث می‌شه تصویری که می‌ده تمام خطوط افقی زاویه‌ی ۴۵ درجه پیدا کنند و قابلیت Tile شدن رو داشته باشه و بشه محیط بازی رو با استفاده از Tilemap تولید کرد.مکانیک‌های مبارزهحرکت: کارکترها در یک سطح دو بعدی حرکت می‌کنند (یعنی پرش یا دشمنی که پرواز کنه، نداریم) این قضیه تمرکز رو روی خود مبارزه بالاتر می‌بره و تمام توجه می‌تونه روی دشمنان باشه تا پلت‌فرم‌های غیر هم‌سطح. به نظرم در مقایسه با Dead cells که سکو و هم Dash داشت. این نوع حرکت ساده‌سازی شده کمک زیادی به حس خوب مانور در محیط می‌کنه. البته به احتمال زیاد بازی برای بستر موبایل هم عرضه می‌شه و این امر در کنترل باعث می‌شه تجربه‌ی لذت‌بخش بازی در پلتفرم‌های بیشتری برای مخاطبین قابل عرضه باشه. ضربه/شلیک: در Hades شش نوع اصلحه وجود داره که هر کدوم حداقل سه نوع مختلف ضربه یا شلیک تیر دارند. هر ضربه زمان‌بندی و فاصله‌ی متفاوتی تاثیر می‌ذاره. این موارد باعث می‌شه تا با استراتژی‌های مختلفی هر مرتبه از بازی رو پیش بریم. همین طور برای استفاده‌ی حرفه‌ای از هر سلاح و یادگیری اون وقت بیشتری رو صرف کنیم.جاخالی! (Dash): با این قابلیت از ضربه‌ی دشمنان و تله‌ها فرار می‌کنیم. نکته‌ی بسیار جالب این قابلیت برای من عبور از روی موانع میان مرحله مثل چاله‌ها یا ستون‌ها با اندازه‌ی یک واحد از Tilemap بود. احضار (Summon): همیشه این ویژگی وجود نداره و اگر پاور‌آپ اون رو حین بازی دریافت کنید این قابلیت در اون Run برای شما فعال می‌شه. چند نوع مختلف داره و حتی ممکنه در یک مرتبه‌ از بازی اصلاً آیتمش رو نگیرید. کریستال (Cast): در بازی به عنوان یه Enhancement mechanic استفاده شده که روی ضربه به صورت غیر مستقیم تاثیر می‌ذاره و برای تنوع Play style استفاده شده. اوایل بازی خیلی تاثیرش رو حس نکردم ولی وقت پاورآپ‌ها رو دریافت می‌کنی یا اون رو ارتقا می‌دیم به یکی از مهمترین قابلیت‌های بازی تبدیل می‌شه. در هر مرتبه از بازی می‌تونه جادوی کریستال تغییر کنه و کاملاً استراتژی جدیدی در مبارزه ایجاد کنه. عوامل محیطی مرحله- دشمنان که هر کدوم قابلیت متفاوتی دارند و با زمان‌بندی یا نحوه‌ی خاصی می‌شه بهینه اونا رو از بین برد.- تله‌ها که برای مکانیک اصلی حرکت چالش ایجاد می‌کنند ولی با Dash میشه ازشون فرار کرد.- دیوارها که محدوده‌ی حرکت رو مشخص می‌کنند.- چاله‌ها (Gaps) که حرکت رو محدود می‌کنند. اگر عرض این فاصله یک واحد Tilemap باشه امکان این هست تا از روی اون عبور کرد.- ستون‌ها که با ضربه زدن به اونا یا هل دادن دشمن به سمت اونا باعث صدمه زدن به دشمن می‌شن. استفاده از محیط برای صدمه به دشمن رو توی بازی‌هایی مثل دیابلو ۳ دیده بودم اما اینجا نقشش خیلی پررنگ‌تره و می‌شه با ترکیب پاورآپ‌ها از این ویژگی خیلی خوب استفاده کرد.- مین‌ها: در هر مرحله ممکنه یه سری مین روی زمین باشه که با ضربه زدن به اونا فعالشون کرد تا بعد از گذر زمان چند ثانیه منفجر بشن و صدمه‌ی خیلی زیادی به  اطرافیانشون وارد کنند. خود بازیکن هم مستثنی نیست.تسلیحاتهر کدوم از سلاح‌های بازی یک PlayStyle منحصر به فرد رو ایجاد می‌کنند. تمام تنوع در اونا با سه پارامتر ایجاد شده: - فاصله: مسافت بین بازیکن و دشمن که هر قدر بیشتر باشه از آسیب دیدن بیشتر در امانه.- محدوده‌ی ضربه: با هر ضربه مساحتی دشمنان تحت ضربه قرار می‌گیرند، در Fist weapon این محدوده خیلی کوچیکه و در شروع تقریباً یک هدف ضربه می‌خوره و در عوض میزان Damage per second اون بالاتره. - زمان: تقریباً تمام سلاح‌ها با هم برابر هستند و تفاوت اونا در ضربه به اندازه‌ی زمان پخش انیمیشن و Cooldown بین دو ضربه تقسیم شده. پس در نتیجه DPS نزدیک به همی دارند و تفاوت در استراتژی استفاده از اونا ست.- ويژگی منحصر به فرد: تنها سلاحی که به غیر از ضربه، دفاع هم می‌کنه و از صدمات جلوگیری می‌کنه سپر ه.چرا به نظرم تمام سلاح‌ها از نظر قدرت برابرند و نسبت به هم برتری قدرت ندارند؟ دلیلش اینه که هدف از تنوع دادن به اونا فقط قدرت انتخاب بین استراتژی‌های مختلف بین اونا بوده. بازی همیشه تلاش می‌کنه تا میزان استفاده از سلاح‌ها یکسان باشه. حتی وقتی یه مدت از یکی‌شون استفاده نمی‌کنید بازی پیشنهاد می‌کنه تا با استفاده از اون در طول یک Run چند درصد بیشتر از واحد پول (Currency) که برای ارتقا استفاده می‌شه بهره ببرید. همین طور بسیار در طراحی بازی ذکر شده تا بازیکن رو تنبیه نکنید! یعنی اگر کسی از فلان ویژگی بازی شما (مثل یکی از سلاح‌ها) خوشش نیومد نباید در عدم استفاده از اون متضرر بشه.بالانس مکانیک و ریاضیمیزان Damage / DPS قابلیت‌های هر سلاح در ستون‌های a1 تا a5 نوشته شدهنمودار چند ضلعی سلاح‌های بازیمن سعی نکردم تا فرمول دقیق هر قابلیت رو استخراج کنم. مثلاً میزان Cooldown بعضی از قابلیت‌ها در میزان DPS لحاظ نشده. وقتی دیدم اختلاف حدود ۱۰ درصد هست به چیزی که می‌خواستم خیلی نزدیک شدم. می‌خواستم نشون بدم همون طور که می‌بینیم سبک مختلف هر سلاح باعث ایجاد شکل‌های گوناگون شده و نشون می‌ده هر سلاح در یک بخش بهتر از سایرین عمل می‌کنه ولی در نهایت میزان کل صدمه‌ای که وارد می‌کنه در حالتی که هیچ پاورآپی اعمال نشده باشه با سایرین برابره. ترکیب مکانیک‌های مبارزه و عوامل محیطی Combat system رو شکل می‌دن. این مکانیک‌ها به تنهایی خیلی سورپرایز کننده نیستند. چیزی که اونا رو به بهترین مکانیک‌های بازی اکشن سال تبدیل کرده، ایجاد عمق و هم‌افزایی (Synergy) با کنار هم قرار گرفتن این مکانیک‌هاست. ریتم در مبارزهچیزی که همیشه برای من در بازی‌های اکشن جذاب بوده ایجاد ریتم داینامیک بوده. در Hades این قضیه به صورت شاهکاری پیاده‌سازی شده. منظورم از ریتم چیه؟من ریتم در مبارزه (Combat) رو این طور تعریف می‌کنم: نظم و سرعت دریافت ورودی از کاربر! یعنی چی؟ مثل یه نوازنده که ساز می‌زنه و نت‌ها رو در فواصل زمانی منظمی باید بزنه تا صدای گوشنوازی ایجاد بشه در بازی‌های اکشن هم استفاده از قابلیت‌های مختلف در زمان‌بندی این حس داینامیک ریتم رو ایجاد می‌کنه. مثلاً در World of warcraft به این قضیه Spell roation یا Rotation می‌گن.اما این که جلوی یه Dummy بایستیم و فقط دکمه بزنیم تا به بالاترین DPS برسیم یا تمام حریفان رو در سریعترین زمان ممکن بکشیم بازی همچنان ریتم داره اما ثابته! اینجاست که حرکت و هنر طراحی سیستم Hades خودش رو نشون می‌ده. ترکیب ریتم ضربه با ریتم حرکت باعث می‌شه با Tempoهای مختلفی در یک مبارزه یا در طول یک Run روبرو بشیم. ریتم در حرکتدر Hades ریتم حرکت با چند عامل ایجاد شده. عوامل محیطی مثل مین‌ها، تله‌ها و چاله‌ها. سایر المان‌ها شامل تراکم دشمنان و Charge کردن اونا به سمت بازیکن می‌شه. وقتی در مبارزه زیاد در یک نقطه باقی می‌مونیم با توجه محدوده‌ی Aggro، دشمنان به ما نزدیک می‌شن و احتمال صدمه خوردن بیشتر می‌شه. در بیشتر مبارزات هم بیش از یک نوع دشمن با سرعت‌های مختلف یا فاصله‌ی شلیک / ضربه وجود دارند. این تفاوت‌ها باعث می‌شه با Dash و حرکت سریع در محیط بازی تراکم رو کنترل کرد. از جای شلوغ سراغ دشمنانی که از فاصله تیر پرتاب می‌کنند رفت و مداوم در مرحله حرکت کرد. همین‌طور حرکت باعث می‌شه بتونیم اونا رو دنبال خودمون بکشیم (Aggro pulling) و با عبور سریع از روی تله‌ها به اونا صدمه بزنیم. دشمن‌ها هم سرعت حرکت‌های متفاوت دارند و نمی‌تونن از روی گپ‌ها عبور کنند و وقتی ما با Dash از روی اونا عبور می‌کنیم مجبور می‌شن مسیر طولانی رو حرکت کنند تا دوباره به بازیکن برسند یا از Aggro range شون خارج می‌شیم و سر جاشون ثابت می‌مونند.یکی از قشنگترین و داینامیک‌ترین مبارزات این بازی، غول دوم Hydra ست. در این مبارزه Hydra در یک نقطه ثابت با محدوده‌ی حرکت کوتاه حضور داره و وقتی سلامتیش به درصدهای مشخصی می‌رسه یه سپر ضدضربه (Invulrenable) احاطه‌ش می‌کنه و یه سری یار (مار بهتر نیست؟) کمکی (Adds) احضار می‌کنه که باید تمام اونا رو از بین برد تا سپر از بین بره. حالا هر کدوم از اونا هم محدودیت حرکت دارند. وقتی سراغ هر کدوم می‌ریم سر هیدرا و نزدیکترین مار دیگه هم به سمت ما میان و روی زمین آتیش ایجاد می‌کنند که نمیشه روی اونا ایستاد یا تیر پرتاب می‌کنند. این موقع باید از یک سمت میدان مبارزه به سمتی دیگه حرکت کرد تا زمان جادوهای روی زمین تموم بشه و یا تیرها از بین برن و چند بار این حرکت رو به صورت مداوم تکرار کرد تا نبرد به پایان برسه.از سویی بازی برای این که ریتم حرکت و ضربه رو حفظ کنه برای تمام سلاح‌ها قابلیت Dash-Strike گذاشته و با پاورآپ‌های متعددی هم قابل ارتقا ست. این ویژگی بسیار برای من دوست‌داشتنی بود چون به صورت همزمان هم می‌تونستم DPS رو خوب نگه دارم و هم به صورت فعال تراکم رو کنترل کنم. ایجاد Flow و عمق در مبارزهFlow channel diagramروانشناس مجارستانی Mihaly Csikszentmihalyi نظریه‌ای داره که می‌گه افراد برای غوطه‌وری و غرق شدن در کاری که مشغول به اون هستند باید در حالتی قرار بگیرند که میزان استرس اونا در حد متعادلی باقی بمونه به این حد فاصل Flow Channel گفته می‌شه. وقتی یک فعالیتی رو انجام می‌دیم به مرور زمان مهارت به دست میاریم و اون فعالیت رو با چالش کمتری انجام می‌دیم. اگر فعالیت خیلی سخت باشه باعث اضطراب می‌شه و یا اگر خیلی ساده باشه منجر به حوصله سر رفتن می‌شه و در هر دو حالت از اون کار دست می‌کشیم.توی طراحی بازی هم این قضیه به شدت اهمیت داره، اگر چالشی که بازی پیش روی بازیکن می‌ذاره با مهارت وی در تعادل نباشه باعث می‌شه از حالت Flow خارج بشه. زیبایی بازی‌های Rogue-like اینجا مشخص می‌شه. هر بار که یک Run رو شروع می‌کنیم، یک الگوی جدید برای یادگیری داریم و چالشی متفاوت برای ما طراحی می‌شه. این امر باعث خلق ارزش بازی چندباره (Replayability value) می‌شه.چه طوری این Flow در Hades شکل گرفته؟ با چندین المان گیم‌پلی که به مرور اونا رو یاد می‌گیریم و با هر بار بازی اندکی تغییر می‌کنند تا چالش متفاوتی رو تجربه کنیم و همچنان مهارت ما رو به چالش بگشند. این مهارت‌ها و المان‌ها کدوما هستند؟ انواع سلاح، پاور‌اپ‌ها، مسیر مراحل، رویداد‌ها که همگی با هم پیشرفت (Progression) رو می‌سازند. انواع سلاحهمون‌طور که در بخش قبلی گفتم چیزی که سلاح‌ها رو از هم متمایز می‌کنه زمان‌بندی در ضربه زدن، فاصله و محدوده‌ی ضربه ست. این عناصر باعث می‌شه تا یادگیری هر سلاح برای ما متفاوت از بقیه باشه. این یادگیری مربوط به حافظه‌ی ماهیچه‌ای (Muscle memory) می‌شه و بعد از چند ساعت بازی کردن زمان‌بندی ضربات هر سلاح رو ناخودآگاه بهتر یاد می‌گیریم و اینجاست که بازی برامون ساده می‌شه. پس تنوع سلاح و قابلیت‌های متفاوت اون زمان بیشتری برای Master شدن در بازی رو برای ما فراهم می‌کنه. اما بازی شش سلاح داره و بالاخره توی همگی مهارت لازم رو به دست میاریم.پاورآپ‌ یا Boonاگر فرض کنیم یکی از ویژگی‌های یک اسلحه در بازی و قدرتش یک نمودار نرمال باشه (شکل وسط) ما هر بار که یک پاور‌آپ دریافت می‌کنیم میزان عملکرد اختصاصی سلاح خودمون رو به یک سمت بیشتر متمایل می‌کنیم. مثلاً من سلاح Fist weapon رو انتخاب می‌کنم که در شروع برای تمرکز ضربه به روی یک هدف مناسبه و با انتخاب پاورآپ‌هایی که فاصله و محیط تحت تاثیر رو زیاد می‌کنه نمودار نرمال قابلیت‌هاش رو به سمت یک اسلحه‌ی مناسب AOE - Area Of Effect تغییر می‌دم. (تغییر Mode از Single target DPS به AOE DPS)این حالات در Hades توسط Boonها پیاده شده. علاوه بر این که پاور‌آپ هستند و مقدار ضربه یا هر ویژگی رو بالاتر می‌برند. به  عنوان Modifier هم ظاهر می‌شن. دسته‌بندی این‌ها در چندین بخش با توجه به تم بازی به خدایان یونان باستان توزیع شده. من اینجا نمی‌خوام وارد جزییات بشم و اگر تمایل داشتید می‌تونید از ویکی بازی شخصیت و نوع دسته‌بندی رو بخونید. این که این دسته‌بندی از کجا شکل می‌گیره به نظرم از المان‌های سیستم مبارزه میاد. این ویژگی‌ها در اکثر بازی‌های RPG مهم هستند (مثال‌ها از World of warcraft هستند):- Single target DPS: تمرکز صدمه (damage) به روی یک هدف. برای کشتن Boss یا نیروهایی که مقدار سلامتی زیادی دارند مناسبه. مثل Rogue یا Mage که می‌تونن این کار رو به خوبی انجام بدن. - Crowd Control / CC: این اصطلاح به معنی کنترل جمعیته. یعنی اگر قرار با سه نفر مبارزه کنیم یکی‌شون رو به نحوی از مبارزه برای مدت خارج کنیم. مثلاً Stunش کنیم. اما توی مبارزه‌ی تک به تک هم استفاده از قابلیت‌های CC برای کاهش دریافت صدمه از سمت دشمن به کار می‌ره. مثل تله‌های Hunter.-  Horde Control / AOE Damage: منظور از Horde کنترل تعداد زیادی از دشمنان هستند که اغلب سلامتی کمی دارند ولی چون تعدادشون زیاده می‌تونن بازیکن رو احاطه کنند و صدمه‌ی زیادی رو وارد کنند. (Zerg ها رو می‌شناسید؟)-  Survivability: هر قابلیتی که بتونه به حفظ سلامتی کمک کنه و می‌تونه شامل HP بیشتر، Shield یا قابلیتی که میزان صدمه‌ی دشمنان رو کاهش بده، باشه.- Sustainability / DOT / HOT: در نبردهایی که میزان حرکت زیاده و نمی‌شه روی یک هدف تمرکز کرد و بین اهداف مختلف باید سوییچ کرد از Debuffهایی میشه استفاده کرد که به صورت Damage Over Time یا DOT عمل می‌کنند. یا برای پر کردن میزان سلامتی به اونا Heal Over Time یا HOT می‌گیم.این المان‌هایی که گفتم توی خیلی از بازی‌های RPG استفاده می‌شن و شاید بشه موارد دیگه‌ای رو هم اضافه کرد. اما این دسته‌بندی باعث ایجاد کلاس‌ها در بازی می‌شه که وظیفه‌ی اختصاصی خودشون در یک بازی رو انجام بدن. در Hades خدایان بازی در اصل همون کلاس‌ها هستند که ما می‌تونیم انتخاب کنیم که در هر Run چه میزان از ویژگی‌های اون رو انتخاب کنیم! یعنی من انتخاب می‌کنم در یک Run، بیست درصد AOE داشته باشم، ده درصد برای Survivability و ضربه نخوردن پاورآپ انتخاب کن و باقی رو فقط صرف Single target DPS کنم.این Taxonomy گسترده امکان حالت‌های بسیار زیادی رو به بازیکن می‌ده و مهارت بازیکن انتخاب ویژگی‌هایی هستد که هم‌افزایی (Synergy) بیشتری برای استراتژی که انتخاب کرده، داشته باشند. هم افزایی (Synergy)مسیر و مراحلیکی دیگه از مسائلی که در بازی‌های Rogue-like جذابه اینه که تمام مراحل به صورت Procedural با یه الگوریتم تولید می‌شن و با هر بار بازی ما یک مرحله‌ی کاملاً جدید طرف هستیم. مزیتش اینه که حس تازه بودن بازی رو تغییر در الگو نگه می‌داره و چیزی به عنوان بهترین مسیر برای اتمام بازی در اختیار بازیکن قرار نمی‌ده که  مداوم از اون استفاده کنه و بعد از مدتی براش حوصله‌سر بر بشه (از Flow خارج بشه).نمونه‌ای از heatmap که برای بالانس بازی کانتراسترایک استفاده شدهمشکلش مراحل Procedural اینه که قابل پیش‌بینی و بالانس نیستند! مثلاً نمی‌تونید یه Heat map داشته تا متوجه بشید بازیکن در چه محلی بیشتر شکست خورده (مُرده) اگر تعداد دفعات این قضیه در مراحل ابتدایی بیشتر از مراحل پایانی باشه نشون می‌ده سختی بازی با توانایی بازیکن در تعادل نیست و می‌تونه باعث افزایش استرس و خروج از Flow بشه. کاری که در Hades برای حفظ این تعادل ایجاد شده، طراحی تمام مراحل به صورت دستیه و فقط هر مرحله به صورت تصادفی برای بازیکن باز می‌شه. حتی تمام Spawn pointهای دشمنان به صورت دستی تعیین شده. این قضیه پیاده‌سازی رو بسیار راحت کرده و بالانس رو میسر کرده! من حتی توی Dead cells چند مرتبه توی موقعیتی قرار گرفتم که سختی بیش از حد شکل می‌گرفت. چون توی اون حالت Hybrid وجود داره. یه بخش‌هایی طراحی شده ست و یه بخش‌هایی کاملاً الگوریتمی تولید شده. رویداد‌ها (Events)هر قدر هم که تنوع سلاح، دشمنان و مسیر در بازی داشته باشیم باز هم ممکنه دچار تکرار بشیم و در کل یک نوع چالش رو در پیش داریم که از بین بردن دشمنان در طول مسیر بازیه اما در Hades رویدادهایی طراحی شده که مثل Mode عمل می‌کنند و چالش جدیدی رو پیش روی بازیکن می‌گذارند. از این رویدادها می‌توان به Time trial اشاره کرد که طی زمان محدودی باید تعداد مشخصی از دشمنان رو از بین ببرید تا جایزه دریافت کنید. یا در مرحله‌ی Elysium با Thanatos یک دوئل انجام بدید! به طوری که از تعداد مشخصی از دشمنان رو با هم بگشید و هرکسی تعداد بیشتری رو از بین برد برنده‌ی دوئل به حساب میاد. پیشرفت (Progression)نکته‌ی جالب دیگه برای من عدم استفاده از شانس برای رویدادهای داستانی بازی و بازشدن قابلیت‌های جدید بود! این قضیه در خیلی از بازی‌های این سبک رایجه که تیکه‌های داستانی یا قابلیت‌ها با توجه به ضریب شانس آزاد می‌شن. در Hades تمام پیشرفت و باز شدن بخش‌های مهم داستانی بر اساس unlock کردن اسلحه‌ها و انجام ماموریت‌های بازی ست! و شانس به عنوان عامل دوم برای توزیع رویدادها بین Runها تاثیر می‌ذاره.این توجه به Core gameplay و این که همه چیز از اونجا نشات می‌گیره نشون از طراحی سیستمی درست داره. تمام تمرکز بازی به روی بخش Action و عمق اونه!تجربه‌ی کاربر (User Experience)تمام مواردی که صحبت کردیم  بلاک‌های ساختاری ساده‌ای هستند که با در کنار هم قرار گرفتن یک سیستم پیچیده رو شکل می‌دن، تیم سازنده در بسیاری از جاها تلاش کرده تا هر المان، مثل اسلحه میزان صدمه، مراحل در ساده‌ترین حالت ممکن باشند تا بازیکن بتونه اونا رو راحت یاد بگیره و به مرور و آروم آروم بخش‌های متنوع رو به مخاطب وقتی مطمئن شد که مکانیک‌ها رو خوب یاد گرفته معرفی کنه. علاوه بر تمام اینا هر مکانیک به خوبی پولیش شده تا برای ذهن کاربر ایجاد نویز نکنه. مثلاً وقتی با گیم‌پد بازی می‌کنید به صورت اتوماتیک حالت Auto-Aim فعال می‌شه و روی اون خیلی کار شده تا اولویت هدف رو بر اساس فاصله و میزان سلامتی انتخاب کنه. موارد بسیاری از UX در گیم‌پلی وجود داره، مثل فیدبک UI زمانی که سلامتی کم می‌شه یا Summon آماده می‌شه. تمام Buff و Debuffها در HP bar یا بالای سر دشمنان یک آیکون دارند و... و... و...اما چیزی که خیلی من رو سورپرایز کرد این مورد بود:اگر ضریب طلا داشته باشیم به اندازه‌ی میزان Darkness ای که در هر Run جمع کردیم به صدمه‌ای که می‌زنیم اضافه می‌شه! این هیچ جایی مستند نشده و حتماً برای بالانس بازی در نظر گرفته شده و دلیل این قضیه نیاز به بررسی بیشتری داره.می‌تونید تو فولدر اسکریپت‌های بازی فایل combat.lua خط ۳۷۶ این مورد رو ببینید:if modifierData.GoldMultiplier and CurrentRun.Money then
    damageAddition = damageAddition + ( CurrentRun.Money * modifierData.GoldMultiplier )
endنکته: Money همون Darkness استدر آخربازی Hades بی شک یکی از بهترین بازی‌های اکشنی هست که ساخته شده، کیفیت سیستم مبارزه، عمق خوبش و هارمونی مناسب بین سیستم‌های مختلف اون رو به یک بازی با ارزش تکرارپذیری زیاد تبدیل کرده و برای زمان بسیار طولانی می‌تونه سرگرم کننده و جذاب باقی بمونه.هدف من فقط بررسی کلی بخش‌های متفاوت بود و می‌شد هر بخش رو با جزییات بیشتری بررسی کرد. از جنبه‌های مختلفی می‌شه بازی رو بررسی کرد ولی من بیشتر تمرکز رو روی Core gameplay گذاشتم.خوشحال می‌شم اگر نظرتون درباره‌ی طراحی این بازی و نکات جالبی که به نظرتون میاد رو با من در میون بذارید. تجربه‌ی شما از بازی چه طور بوده؟</description>
                <category>محمد ایرجی</category>
                <author>محمد ایرجی</author>
                <pubDate>Sun, 03 Jan 2021 11:44:20 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه یک برنامه‌نویس باقی بمانیم؟</title>
                <link>https://virgool.io/@nix/%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%A8%D8%A7%D9%82%DB%8C-%D8%A8%D9%85%D8%A7%D9%86%DB%8C%D9%85-bnh8vnusuqpx</link>
                <description>در مقاله قبلی درباره شروع برنامه‌نویسی نوشتم تا به سوال‌هایی که ذهن افراد رو درگیر کرده و اونا رو از یادگیری باز می‌داره دور کنم. اما شرط لازم داشتن یک مهارت به رشد، حفظ و نگهداری از اون مهارت بر می‌گرده. وقتی داشتم برنامه‌نویسی یاد می‌گرفتم همیشه یکی از درگیری‌های ذهنی‌ام این بود که باید چه موضوعی رو یاد بگیرم؟ مرحله بعدی چیه؟ از سمت دیگه برنامه‌نویسی به زبانی که یاد می‌گیریم ربط نداره! بلکه برنامه‌نویسی نحوه فکر کردن و حل مسئله با ابزار برنامه‌نویسی و مهارت‌هایی هست که باید یاد بگیریم. در ادامه به معرفی مهارت‌هایی که هیچ ربطی به زبان برنامه‌نویسی نداره می‌پردازیم. در آخر هم اشاره‌ای به چیزهایی که بهتره یاد نگیریم، می‌کنیم!الگوریتمتعریف الگوریتم در ویکی‌پدیا این طوره:  مجموعه‌ای متناهی از دستورالعمل‌ها است، که به ترتیب خاصی اجرا می‌شوند و مسئله‌ای را حل می‌کنند. به عبارت دیگر یک الگوریتم، روشی گام به گام برای حل مسئله است. سوال رایجی اینه: آیا الگوریتم مفهوم ریاضیه؟  طبق تعریف نه اما از ریاضی به عنوان ابزار استفاده می‌کنه. الگوریتم، راه حل کردن یک مشکله؛ روش حل یک مسئله ست. این مسئله می‌تونه مرتب کردن اعداد باشه. می‌تونه پیدا کردن مسیر باشه یا حل کردن سودوکو. دونستن الگوریتم‌ها به ما کمک می‌کنه تا در زمان برخورد به مسئله راه حل از پیش آماده داشته باشیم. به بهینه‌ترین حالت ممکن عمل می‌کنه و لازم نیست تا دوباره چرخ رو اختراع کنیم. از سمت دیگه برای هر مسئله راه حل‌های مختلفی وجود داره که توی موقعیت‌های مخصوص به خود بهترین بازدهی رو دارند. مثلاً برای مسیریابی چندین الگوریتم مختلف وجود داره. اگر برای حل پازل هزارتو (Maze) سیستم مسیریابی می‌نویسید شاید بتونید فقط با Breadth-first search مسیر رو پیدا کنید یا اگر برنامه مسیریابی می‌نویسید شاید می‌بایست سری به A* بزنید. از طرفی دیگه مطالعه الگوریتم‌های موجود تمرینی برای ذهن ماست تا بتونیم نحوه فکر کردن برای حل مساله رو یاد بگیریم. شی‌گرایی (Object oriented programming)شی‌گرایی یک پارادایم، روش، نحوه فکر کردن به اجزای یک سیستم ست. در این روش همه چیز شی (Object) در نظر گرفته می‌شود که حاوی اطلاعات است. قصد ندارم اینجا مسئله رو توضیح بدم اما مهارت پیدا کردن در استفاده &quot;صحیح&quot; از شی‌گرایی مهارتی ست که به سال‌ها تجربه و مطالعه احتیاج داره! پاس کردن چند واحد در دانشگاه یا خوندن C# در چند روز یا نوشتن کد جاوا کافی نیست.  برنامه‌نویس‌هایی رو می‌شناسم که تا به حال عبارت SOLID رو نشنیدند یا هنگام نوشتن برنامه بهش پایبند نیستند. SOLID مختصر عبارات زیره: Single responsibility principleOpen/closed principleLiskov substitution principleInterface segregation principleDependency inversion principleاین اصول توسط  Michael Feathers  بیان شدند. تو کتاب Clean code از Robert C. Martin (یا سری ویدیوهایی که داره) درباره این اصول مفصل توضیح می‌ده. اما قبل از یادگیری این اصول باید بدونید تا حد ممکن باید از شی‌گرایی پرهیز کرد. صحبت درباره این موضوع خودش یه مقاله دیگه ست. یک نکته آزاردهنده‌ای که اغلب اوقات از اساتید دانشگاه! یا تازه فارق التحصیلان می‌شنوم اینه که C/C++ شی‌گرا نیستند! نمی‌تونم واژه مناسبی که عصبانیتم رو نشون بده پیدا کنم و فقط می‌گم: &quot;دوست عزیز، اشتباه می‌کنی&quot; (لبخند هیستریک) شما حتی توی C می‌تونید شی‌گرایی رو پیاده سازی کنید. این کار پیشنهاد نمی‌شه ولی   Axel Schreiner در کتاب Object-oriented Programming in ANSI-C به این امر پرداخته.الگوهای طراحی (Design patterns)الگوی طراحی در ابتدا جنبشی بود که توسط Christopher Wolfgang Alexander شکل گرفت. او یک معمار بود! کتابی در زمینه معماری ساختمان ارایه کرد به نام A Pattern Language: Towns, Buildings, Construction که در اون به الگوهای ریاضی یا متدی برای طراحی اجزای خونه از در و چارچوب و پله و غیره اشاره شده بود. هر زمانی که شما به عنوان یک معمار با مسئله‌ای مثل طراحی پلکان، چارچوب یا هر جزیی از خونه رو به رو می‌شدید الگویی معرفی شده بود که با پیروی از اون محصول بدون مشکل و استاندارد طراحی می‌کردید. کتاب و طرز فکر او روی برنامه‌نویسان هم تاثیرگذار بود. در اوایل دهه نود چهار برنامه‌نویس به نام‌های Erich Gamma, Richard Helm, Ralph Johnson و John Vlissides که به Gang of Four معروف شدند کتابی رو نوشتند که بزرگترین تاثیر رو در تاریخ برنامه‌نویسی رو داشت، Design Patterns: Elements of Reusable Object-Oriented Software توی این کتاب به الگوهایی برای مشکلاتی که در برنامه‌ها به صورت تکراری به وجود می‌آمد پرداختند. علاوه بر اون هر راه حل اسم مشخصی داشت. این کتاب علاوه بر حل مشکلات یا جلوگیری از مشکلات به دایره لغات بین برنامه‌نویس‌ها تبدیل شد. توی این کتاب 23 ؟ الگو معرفی شده بود که تا به امروز قابل استفاده هستند. بعدها سایر برنامه‌نویس‌ها مثل Martin Fowler هم به معرفی الگوهای طراحی پرداختند.بارها شده در جلسات مصاحبه از برنامه‌نویس درباره الگوهای طراحی می‌پرسم. اونا هم جواب می‌دن ما همین راه حل‌ها رو استفاده می‌کنیم حتی بدون این که کتابی در این زمینه خونده باشیم. دوست عزیز، مهارت شما قابل تقدیره. اما ندونستن اسم الگوها، زبان مشترک بین من و شما رو محدود می‌کنه. من با همکارم خیلی راحت صحبت می‌کنیم و با گفتن: &quot;فلانی، پاورآپ‌ها توی بازی رو با Visitor پیاده‌سازی کنیم&quot; خیلی ساده‌تر از جلسه نیم ساعته ست!چند رشته‌ای (Multi threading)سال‌های اخیر سرعت CPU ها خیلی افزایش نداشته اما در عوضCPU ها کارهای بیشتری رو به صورت موازی انجام می‌دن. هر عملی روی یک Thread یا رشته انجام می‌شه و نتیجه اون می‌تونه به Thread دیگه‌ای منتقل بشه. اما قضیه به این سادگی نیست. توی حالتی ممکنه دو رشته به نتیجه کار هم دیگه احتیاج داشته باشند تا کار خودشون رو به پایان برسونند. در انتها هیچ کدوم نمی‌تونن ادامه بدن و برنامه دچار Dead lock میشه. کار با خود رشته‌ها شاید خیلی پیچیده نباشه اما مدیریت اطلاعاتی که بین اونا منتقل می‌شه می‌تونه خیلی پیچیده باشه و به مهارت زیادی احتیاج داشته باشه.اکثر زبان‌های برنامه‌نویسی هم دسترسی به Thread رو میسر می‌کنند و می‌تونید از قابلیت‌هایی که بهتون می‌ده استفاده کنید.شبکه می‌تونید دنیای امروز بدون اینترنت رو تصور کنید؟ بزرگترین شبکه ساخته بشر. تقریباً تمام برنامه‌های کاربردی و شبکه‌های اجتماعی و غیره که استفاده می‌کنیم به نحوی با اینترنت در ارتباط هستند. داشتن دانش از لایه‌های زیرین شبکه به درک بهتر و بازدهی بهتر شما در برنامه‌نویسی سطوح بالاتر کمک می‌کنه. اگر خیلی به برنامه‌نویسی شبکه علاقه ندارید حداقل اطلاعات از مفاهیم شبکه مثل پروتکل‌های شبکه HTTP, SMTP, SNMP, ICMP و خیلی مثال دیگه می‌تونه به شما در رفع نیازهاتون کمک کنه یا در رفع مشکل راحتتر و بهتر عمل کنید.آشنایی با SQLعبارت SQL مخفف Structured Query Language ست به معنی زبان پرسش ساختاریافته! زبان استانداری هست که برای پایگاه‌های داده Relational استفاده می‌شه. اگر کار با یکی از این پایگاه‌های داده مثل MS SQL یا MySQL یا حتی  SQLite رو یاد بگیرید می‌تونید با کمی تغییر با بقیه پایگاه‌های داده هم کار کنید.  هیچ شکی نیست هر برنامه‌نویسی گذرش به پایگاه داده خواهد افتاد.برنامه‌نویسی مبتنی بر تست (Test driven programming)فکر کنید با هر بار تغییر برنامه یا اضافه کردن ویژگی به اون مجبور باشید تمام ویژگی‌های برنامه رو تست کنید تا مطمئن باشید قسمت جدید یا تغییر صورت گرفته در کار بقیه قسمت‌های برنامه تداخلی ایجاد نکرده. با بزرگ شدن برنامه و حالت‌هایی که در شرایط مختلف ایجاد می‌شه به قدری زیاد می‌شه که از عهده نیروی انسانی خارجه. در این حالت فریم‌ورک‌هایی به کار میان که با نوشتن تست در داخل نرم افزار و اجرای اونا از صحیح بودن تمام اجزا و سناریوها اطمینان حاصل می‌کنیم. از تغییر دادن برنامه ترسی نداریم چون با کوچیکترین اشتباهی یک تستی وجود داره که محل دقیق یا سناریویی که صحیح ایجاد نمی‌شه رو به ما نشون می‌ده. از سمتی زبان‌های داینامیک امروزی مثل جاوا اسکریپت که جنس متغیرها مستقیم مشخص نمی‌شه و سرعت توسعه رو بالاتر می‌بره اطمینان کردن بهشون سختتره. اما مکمل این راحتی نوشتن تست در این محیط‌هاست. در دنیای امروز به قدری نوشتن تست اهمیت پیدا کرده که متدولوژی توسعه نرم‌افزار بر اساس تست شکل گرفته. تا حدی که اول تابع‌های تست و سناریو‌هایی که باید انجام بشه نوشته می‌شن سپس برنامه اصلی نوشته می‌شه تا این تست‌ها رو بگذرونه!مستندسازیمستندسازی از نوشتن خود کد شروع می‌شه. از انتخاب اسم متغیرها و تابع‌ها و ... اما هر قدر هم تمیز کد بنویسید و با خوندن کد شما بشه کارایی رو فهمید باز هم به زبان معمول بین انسانی نمی‌رسه! به خصوص وقتی در حال توسعه یک فریم‌ورک یا کتابخونه برای بقیه برنامه‌نویس‌ها باشید. آشنایی با ابزار مستندسازی مثل DoxyGen، ادبیات فنی و نوشتن مستندات استفاده از نرم‌افزار یا کتابخونه خودش یک مهارته که تیم‌های بزرگ برای این بخش فرد مجزایی استخدام می‌کنند!تسلط به IDEمهم نیست با Emacs یا Vim کد می‌نویسید. Visual Studio یا Eclipse رو انتخاب می‌کنید. اما هر کدوم رو که انتخاب کردید سعی کنید تمام جزییات اون رو یاد بگیرید و به کار ببرید. هر پلاگینی که فکر می‌کنید براتون می‌تونه مفید باشه یا برنامه‌نویس‌های دیگه پیشنهاد میدن رو تست کنید. IDE شما، ابزار شماست که هر روز برای سال‌ها باهاش کار دارید. پس توی انتخاب و یادگیریش وسواس به خرج بدید.کنترل ورژنبرنامه‌هایی که نسخه‌های قبلی پروژه رو برای ما نگه می‌دارند رو برنامه‌های کنترل ورژن می‌گیم. مثل Git, SVN, Perforce یا غیره. و با اینا لازم نیست دیگه روی فلش فایل منتقل کنید! یا قبل از تغییر بزرگ در نرم افزار یه نسخه زیپ شده از پروژه نگه دارید! نمی‌دونم چه قدر از اهمیت این برنامه‌ها باید بگم اما می‌تونن ناجی کل پروژه و تیم شما باشند! حتی قبل از یادگیری زبان برنامه‌نویسی شروع به یادگیری یکی از مثال‌هایی که گفتم بشید، ضرر نمی‌کنید!ریاضیهمون طور که قبلاً صحبت کردیم دانش ریاضی الزامی نیست و برای کل دوران برنامه‌نویسی خودتون می‌تونید با حداقل اطلاعات ریاضی برنامه‌نویسی کنید. اما حقیقت اینه که برنامه‌نویسی به غیر از ریاضی چیزی نیست. ما همواره در حال نگارش تابع‌ها و قوانین ریاضی هستیم. هر قدر بهتر ریاضی بدونیم می‌تونیم بیشتر به عمق مسائل پی ببریم و راحتتر مباحث رو درک کنیم. کدوم بخش از ریاضی؟ چه میزان تسلط؟ این سوال بستگی به حوزه فعالیت شما مختلف خواهد بود. اما اطلاع داشتن در حد ریاضی عمومی دبیرستان به طور حتم بهتون کمک می‌کنه.آماردر دنیای امروز با حجم بالای اطلاعات و داده رو به رو هستیم یا بهتر بگم جوامع آماری گسترده. تا جایی که شرکت‌های متوسط و بزرگ برای درک بهتر اطلاعاتشون عنوان شغلی مشخصی برای این نیازمندی در نظر گرفته‌اند: Data scientist همه کار این شغل آمار نیست اما حجم زیادی از اون رو تشکیل می‌ده. همین طور تمام تصمیمات مربوط به یک پروژه مبتنی بر داده‌های پالایش شده باید گرفته بشه. از رابط کاربری تا پیدا کردن Trend بازار برای توسعه محصول جدید. پس دونستن آمار علاوه بر این که زبان مشترکی بین شما و بخش بازاریابی و فروش و سیاست‌گذاری محل کار شما می‌تونه باشه.چه چیزهایی یاد نگیریم؟ یا با تامل بیشتر یاد بگیریم؟فریمورک‌ها اگر تمام مواردی که صحبت کردیم موارد جامع بود و مستقل از زبان بود فریم‌ورک‌ها وابسته به زبان هستند و طول عمر دارند. با گذر از تاریخ مصرفشون دانش و تجربه شما در اون بخش هم دیگه به درد نمی‌خوره. همین چند سال پیش وقتی بخش نیازمندی‌های روزنامه رو باز می‌کردی برای استخدام برنامه‌نویس با انبوه آگهی استخدام برنامه‌نویس C# با تسلط بر JQuery, Entity Framework، WPF و امثالهم رو به رو بودیم. چند سال بعد با موج Angular.JS  و الان با React و خیلی چیزهای دیگه که من زیاد ازشون اطلاع ندارم. اما همه اینا تاریخ مصرف دارند و معلوم نیست که شش ماه آینده وجود داشته باشند یا خیر. پس به جای یاد گرفتن فریم ورک‌های مختلف بهتره مهارتمون تو بخش‌های دیگه برنامه‌نویسی رو ارتقا ببخشیم و تا می‌تونیم فریم‌ورک یاد نگیریم!حباب‌هایه زمان RFID خیلی تکنولوژی باحالی بود. هر کسی داشت یه RFID به همه چیز می‌چسبوند. کتاب‌ها نوشته و چاپ می‌شد. یه زمان دیگه اینترنت اشیا یک زمان دیگه VR/AR یه زمان دیگه کینکت...یا الان که این مقاله رو می‌نویسم Block Chain... بانکداری نوین بر اساس بلاکچِین، شهر الکترونیکی بلاک چینی، مسنجر بلاک چینی... همه چیز بلاک چینی می‌شه و به مدینه فاضله می‌رسیم. همه ماینر هستند. همه اینترنت آزاده و دولت‌ها برچیده می‌شن. مسخره ست؟ کسانی که تو تکنولوژی‌های جدید کار می‌کنند دو دسته هستند. یکی توسعه دهنده‌هایی که دارند واقعاً اون محصولات رو توسعه می‌دن یا دارن تکنولوژی جدید خلق می‌کنند. اینا خیلی کاردرست و با دانش هستند و تکنولوژی با وجود همچین افرادی پیش می‌ره. یک سری دیگه هم نونشون توی اینه که برن سراغ تکنولوژی که همه گیر نشده و با اطلاعات گاهاً ناقص و اشتباه خودشون رو طوری نشون بدن که دانشی دارند که بقیه از اونا آگاه نیستند. تو این شرایط این تکنولوژی‌ها حباب هستند و حتی اگر دانش بالای اون رشته رو داشته باشید باز هم ریسک عدم موفقیت اون رو دارید.اما وقتی یک تکنولوژی ته نشین می‌شه! گل آلودگی اون کمتر می‌شه و کاربرد حقیقی و اکوسیستمش شکل می‌گیره زمان مناسبتری برای عموم برای یادگیری و حرکت به سمت اونه. پس گول حباب‌ها رو نخورید.در آخرتکنولوژی خیلی سریع تغییر می‌کنه. فریم‌ورک‌ها خیلی سریع از تاریخ مصرفشون می‌گذره. در طی راه یادگیری برنامه‌نویسی به جاهایی برای یادگیری اتکا کنیم که وابسته به زبان خاص یا پلتفرم خاصی نباشه. کی فکرش رو می‌کرد با اومدن iOS یا Android غول سیستم‌های موبایل قبل از اونا Symbian کمتر از یکی دو سال فراموش بشه؟ اگر برنامه‌نویسی مستقل از زبان، فریم‌ورک یا پلتفرم باشیم و اصول رو بدونیم یادگیری یک محیط جدید برامون به شدت ساده می‌شه و ترک کردن اون کمترین ضرر رو برای ما به همراه خواهد داشت. شما چه موارد دیگه‌ای رو پیشنهاد می‌کنید که مستقل از زبان و مسائلی که بیان شد؛ به برنامه‌نویسی کمک کنه؟</description>
                <category>محمد ایرجی</category>
                <author>محمد ایرجی</author>
                <pubDate>Wed, 05 Jun 2019 22:27:48 +0430</pubDate>
            </item>
                    <item>
                <title>چه طور برنامه‌نویسی رو بدون شک شروع کنیم؟</title>
                <link>https://virgool.io/@nix/%DA%86%D9%87-%D8%B7%D9%88%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B1%D9%88-%D8%A8%D8%AF%D9%88%D9%86-%D8%B4%DA%A9-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D9%86%DB%8C%D9%85-ejuydg1mgpor</link>
                <description>در این نوشته قصد دارم تا درباره یادگیری برنامه‌نویسی توضیح بدم. این مطلب مناسب افرادی ست که قصد شروع به برنامه نویسی رو دارند یا تازه شروع کردند و قصد دارند تا مهارتشون رو بالا ببرند.من کی هستم؟من محمد ایرجی هستم. کار حرفه‌ای خودم رو در سال هشتاد و شش به عنوان طراح بازی(کسی که قوانین بازی رو طراحی می‌کنه) برای بازی آنلاین «آسمان‌دژ» شروع کردم. بعد از مدتی احساس کردم که طراحی بازی به تنهایی برام کافی نیست. نمی‌تونستم چیزهایی که می‌خوام رو بسازم یا در درک قابلیت پیاده‌سازی یک ایده  دچار تردید بودم. این شد که از محل کارم اومدم بیرون، نشستم پای کامپیوتر و تو گوگل تایپ کردم: &quot; How to start programming?&quot;. البته به همین راحتی نبود. به عنوان یه برنامه نویس خودآموز راه خیلی سختی رو گذروندم. بعد از مدتی دوباره رفتم دانشگاه اما اونجا هم چیز زیادی برای یادگیری وجود نداشت. پس بیشتر روی مطالعه فردی و استفاده از منابع روی اینترنت تمرکز کردم. بیش از هشت سال از روزی که شروع کردم می‌گذره و تا الان روی محصولات زیادی به عنوان برنامه‌نویس، مدیر فنی و مدیر محصول کار کردم. بعضی روزها هم در انیستیتو ملی بازی‌سازی برنامه‌نویسی تدریس می‌کنم. هدفم از نوشتن این مطلب هم به اشتراک گذاری تجربه‌های سخت هست تا راه برای بقیه ساده‌تر بشه.از کجا شروع کنیم؟اولین چالش کسی که شروع به برنامه‌نویسی می‌کنه انتخاب زبان برنامه‌نویسی هست. خیلی‌ها هم بر سر این می‌جنگند که فلان زبان برای شروع بهترین گزینه است. به نظرم بهترین زبان به انتخاب کسی هست که شروع می‌کنه! باید امتحان کنید تا ببینید کدوم محیط و کدوم روش بیان موضوع براتون قابل فهم‌تر هست. بهش مثل یاد گرفتن یک زبان خارجی نگاه کنید. مفهوم‌ها (مثل شادی و غم) به دور از زبان ثابت هستند و فقط نحوه بیانشون در زبان‌ها متفاوته. پس برای شروع خیلی نگران زبان نباشید. حتی اگر هیچ پیش‌زمینه‌ای در برنامه‌نویسی ندارید می‌تونید از زبان‌های تصویری (Visual programming) استفاده کنید. سایت code.org برنامه‌نویسی رو به صورت کاملاً بصری آموزش می‌ده شاید به نظر بیاد، بیشتر برای نوجوان‌ها و بچه‌ها مناسبه اما برای درک مطلب برای کسی که تازه شروع به برنامه‌نویسی کرده، می‌تونه مفید باشه.استفاده از Visual scripting برای آموزش برنامه‌نویسیبرای انتخاب زبان چند تا پیشنهاد دارم که شاید براتون مفید باشه. تفاوت عمده زبان‌ها به نحوه نوشتار (Syntax) آن‌ها بر می‌گرده. عمده زبان‌های رایج از لحاظ نوشتاری مثل زبان C هستند. یعنی اگر زبانی که مثل C هست رو یاد بگیرید راحت‌تر می‌تونید زبان‌های دیگه (مثل: C#, Java, C++, Go) رو بخونید و یاد بگیرید. بعضی برای شروع زبان Python رو پیشنهاد یا انتخاب می‌کنند. هر چند برای شروع زبان خوب و راحتیه اما نوشتارش با زبان‌های رایج متفاوته و یادگیری زبان‌های شبیه به C که محبوبتر و پرکاربردتر هستند رو در قدم‌های بعدی شاید سخت‌تر کنه اما باز انتخاب با خودتونه، در قدم اول یادگیری مفاهیم مهم هستند.در شروع هدفتون رو مشخص کنید. برای چی می‌خواهید برنامه‌نویسی یاد بگیرید؟ برای شغل آینده؟ برای درست کردن برنامه موبایل؟ برای تولید بازی؟ یا از کاری که کارمند‌هاتون یا بقیه اعضای تیم انجام می‌دن درک بهتری داشته باشید؟ یا بهش به عنوان یه ابزار برای انجام راحت‌تر کارهاتون فکر می‌کنید؟ یا حتی فراتر از این‌ها، به یادگیری روش فکر کردن برای به دست آوردن دید متفاوتی به زندگی جهت حل مسائل فکر می‌کنید؟ تمام این‌ها به انتخاب منابع یادگیری که قدم بعدی هست کمک شایانی می‌کنه.از چه منابعی شروع کنیم؟خوشبختانه در عصر دسترسی آزاد به اطلاعات و منابع آموزشی زندگی می‌کنیم. منابعی که هر سال زیادتر و با کیفیت بیشتری تولید می‌شن. همچنین بسیاری از مراکز آموزشی و افراد دوره‌های رایگان آموزشی برگزار می‌کنند و به صورت ویدیو روی اینترنت قرار می‌دن، کتاب‌ها و مقاله‌های زیادی هر سال نوشته می‌شه ولی این تعداد زیاد منابع هم گاهی سردرگم کننده ست. اما هر راهی رو انتخاب می‌کنید این نکته رو مد نظر داشته باشید که تمام این موارد تئوری هستند و همون طور که کسی با خوندن کتاب و فیلم آموزشی فوتبالیست نشده یا شنا یاد نگرفته یا به حجم عضلاتش اضافه نشده. پس تمام این راه‌ها به تلاش و تمرین خودتون بر می‌گرده. جدای از این که چه روشی برای مطالعه انتخاب می‌کنید &quot;باید هر روز تمرین کنید!&quot; بدون تمرین مداوم و پیوسته هیچ وقت توی هیچ کاری مهارت لازم رو به دست نمیارید. در ادامه چند تا از گزینه‌هایی که به نظرم می‌رسه به همراه معایب و مزایا شون رو مرور می‌کنیم:کلاس برنامه‌نویسیانتخاب یک دوره خوب برای شروع می‌تونه خیلی به یادگیری کمک کنه. اما پیشنهاد می‌کنم حتماً قبل از شروع یک دوره هدف‌تون رو مشخص کنید. درباره مسائلی که قراره توی اون دوره یاد بگیرید و خروجی که باید توقع داشته باشید تحقیق کنید حتی چند فصل آغازین یک کتاب مرتبط رو بخونید. در این حالت بهترین استفاده رو از کلاس خواهید برد. توجه داشته باشید مدرس تنها بخشی از مفاهیم رو در زمان محدود در هفته درس می‌ده و هر قدر آماده‌تر یه دوره رو شروع کنید بیشتر می‌تونید در رفع اشکال از مدرس کمک بگیرید.قبل از ثبت‌نام درباره مباحثی که تدریس می‌شه، خروجی که انتهای دوره بهش می‌رسید و زمان کلاس تحقیق کنید. اگر هم براتون مقدور هست از دانشجویان دوره‌های قبلی تحقیق کنید. الزاماً هر جای با امکاناتی یا هر مدرس با سابقه کاری موفق الزاماً مهارت آموزش بالایی نداره. توجه داشته باشید به صرف شرکت در کلاس برنامه‌نویسی یاد نمی‌گیرید و باید در هر جلسه تمرینات مربوطه رو انجام بدید. اگر وقت کافی برای کلاس و تمرین ندارید هزینه‌ای برای کلاس نکنید.فیلم‌های آموزشیفیلم‌های آموزشی یادگیری رو در دنیای امروز متحول کردند.  Julius Yego در المپیک ریو 2016 مدال طلا رو به دست آورد. وقتی خبرنگارها اسم مربیش رو برای مصاحبه می‌پرسند؛ جواب می‌ده: یوتیوب! روزها از یوتیوب فیلم آموزشی و تمرینی ورزشکارهای حرفه‌ای رشته‌اش رو می‌دیده و تمرین می‌کرده و تا قهرمانی المپیک پیش می‌ره! در زمینه برنامه‌نویسی، منابع بسیار بسیار بیشتر از هر رشته دیگه‌ای در دسترس عموم قرار داره. دانشگاه‌های بزرگ مثل  MIT دوره‌های رایگان آموزشی برگزار می‌کنند. خیلی از افراد مستقل ساعت‌ها آموزش ضبط می‌کنند و روی اینترنت قرار می‌دن که توی هیچ دانشگاهی تدریس نمی‌شه. من خودم اولین بار با دیدن ویدیوهای آموزشی که کارمند‌های گوگل منتشر کرده بودند خیلی تحت تاثیر قرار گرفتم. برجسته‌ترین برنامه‌نویس‌ها در عالی‌ترین سطح برنامه‌نویسی دنیا ویدیوی رایگان برای آموزش مبتدی‌ها تولید می‌کنند!چند سال پیش  Casey Muratori یه پروژه تولید بازی شروع کرد و از صفر و بدون هیچ کتابخونه یا ابزاری شروع به تولید بازی کرد و طی حدود 400 ساعت بازی رو کامل کرد و در طول کار تمام مراحل رو ضبط کرد و جزیی‌ترین کارهایی رو که انجام می‌ده رو مفصل توضیح می‌ده و از تمام مراحل فیلم گرفت و رایگان روی اینترنت گذاشت. هیچ برنامه‌نویس بازی (یا حتی رشته دیگه‌ای) نیست که از دیدن این سری از ویدیوها چیزی یاد نگیره. این سری ویدیوی آموزشی Handmade hero نام داره. همچنین وبسایت liveedu.tv ویدیوهای آموزشی زیادی داره که برنامه‌نویس‌ها از اول تا آخر یه محصول پیچیده رو تولید می‌کنند.  همچین منابع آموزشی توی هیچ دانشگاهی پیدا نمی‌شه. اما مواردی که تا الان گفتیم برای شروع خیلی خوب نیستند. شاید دیدن ویدیوهای Lynda یا Coursera برای شروع براتون مناسب باشند. باز هم هیچ ویدیوی خاصی رو پیشنهاد نمی‌کنم. بگردید منابعی که خودتون راحتتر یاد می‌گیرید رو امتحان کنید. منابع ویدیویی به زبان فارسی هم هستند هر چند کم، اما برای اونایی که مشکل زبان انگلیسی دارند می‌تونه نقطه شروع خوبی باشه.کتاببهترین منبع آموزشی برای یادگیری کتابه. توی هیچ سری از ویدیو یا دوره آموزشی نمی‌شه به اندازه کتاب مطلب رو منتقل کرد. پیشنهاد اولم برای کتابی که انتخاب می‌کنید اینه که به زبان انگلیسی باشه! من همه کتاب‌های برنامه‌نویسی به فارسی رو نخوندم اما همه اونایی که خوندم برام مفید نبودند. خیلی سعی شده بود مفاهیم اصلی برنامه‌نویسی به فارسی برگردانده بشه که خیلی کار اشتباهیه! چون مطالب فارسی به شدت روی اینترنت کم و محدود هستند و اگر به محتوای فارسی عادت کنید و اصطلاحات درست رو یاد نگیرید بعداً در رفع اشکال یا تحقیق برای یادگیری بیشتر به مشکل می‌خورید. باز هم اگر به مطالعه کتاب فارسی اصرار دارید کتابی رو انتخاب کنید که مفاهیم اصلی رو ترجمه نکرده باشه و عین کلمه رو ذکر کنه.پیشنهاد می‌کنم حتی اگر زبانتون خوب نیست یه دیکشنری کنار دستتون بذارید و کلمه به کلمه ترجمه کنید و یاد بگیرید! شاید یکی دو صفحه اول پیشرفتتون کند باشه اما بعد از دو، سه روز به واژگان تخصصی رشته‌تون آشنا می‌شنید و می‌تونید بهتر تو اینترنت دنبال راه حل مشکلات باشید و به منابع گسترده‌تری برای یادگیری دسترسی خواهید داشت.چه سنی برای برنامه‌نویسی مناسبه؟تصویری از پروژه Blocks که توسط گوگل برای آموزش برنامه‌نویسی به بچه‌ها طراحی شدهبرای برنامه‌نویسی هیچ محدودیت سنی وجود نداره! تکرار می‌کنم، هیچ محدودیتی! الان خیلی از اسباب‌بازی‌ها   برای کودکان تولید می‌شه که مناسب سنین قبل از دبستان هستند. دانشگاه MIT زبان برنامه‌نویسی Scratch رو برای آموزش به بچه‌ها توسعه داده. پس هیچ وقت برای یادگیری برنامه‌نویسی زود نیست.از سمت دیگه هم برای برنامه‌نویسی هیچ وقت دیر نیست. Kevin Systrom موسس اینستاگرام حدود بیست و چهار سالگی شروع به یادگیری برنامه‌نویسی کرد. اولین پروژه‌ای هم که درست کرد، همون نسخه اولیه اینستاگرام بود که بعد از دو سال فیسبوک شرکتش رو به قیمت یک میلیارد دلار خرید! برنامه‌نویس‌های زیادی هستند که بعد از سی، چهل یا حتی پنجاه‌ سالگی شروع به یادگیری کردند و مسیر کاری و زندگی‌شون رو تغییر دادند. این قضیه خیلی به روحیه و علاقه فردی داره. پس سن هیچ وقت نمی‌تونه بهانه‌ای برای ترس از یادگیری باشه.چه مدت طول می‌کشه تا برنامه‌نویس بشم؟یه شبی رو یادمه که خیلی از برنامه‌نویسی نامید شده بودم. یک سالی بود که برنامه‌‌نویسی رو شروع کرده بودم. نه اونقدر تجربه داشتم که بهم اعتماد به نفس بده و نه اون قدر بلد نبودم که بگم هیچ چیز بلد نیستم. آینده خیلی تیره و تار شده بود تا این که یه مقاله راهم رو روشن کرد. حتی دیدم به بعضی از مسایل تو زندگی رو عوض کرد: «در ده سال به خودتون برنامه‌نویسی یاد بدید»( Teach Yourself Programming in Ten Years) نویسنده تو این مقاله به عجله دنیای امروز برای زندگی صحبت می‌کنه به این که کتاب‌هایی می‌بینیم به عنوان: یادگیری زبان فلان در بیست و یک روز، یادگیری بهمان در چهارده روز و امثالهم اما واقعاً این مدت برای یادگیری کافی نیست. در ادامه به تحقیقی درباره یادگیری اشاره می‌کنه و می‌گه برای استاد شدن (Mastery) در هر چیزی، چه ورزش، چه هنر یا برنامه‌نویسی به ده سال زمان احتیاجه! و خیلی نکات مفید دیگه که  خوندنش رو توصیه می‌کنم (لینک ترجمه فارسی هم کنار مقاله موجوده). اما باید بگم این مقاله به این معنا  نیست که بعد از ده سال تازه می‌تونید شروع به کار کنید. اگر صحیح و هدفمند شروع کنید بعد از سه تا شش ماه می‌تونید به هدفی که تعیین کردید برسید و اولین برنامه، بازی یا وبسایتتون رو بسازید و بین شش ماه تا یک سال کسب تجربه می‌تونید به عنوان یه برنامه‌نویس استخدام یه شرکت بشید. به یاد داشته باشید یک راه ده ساله رو شروع کردید و برای استادی تو هر رشته‌ای باید صبر داشته باشید.آیا برای برنامه‌نویسی باید ریاضی بلد باشم؟هم آره و هم نه! خیلی بسته به راهی که انتخاب می‌کنید داره. من برنامه‌نویس‌هایی با ده الی پانزده سال سابقه کار می‌شناسم اما هیچ وقت به ریاضی برای انجام کارشون احتیاج پیدا نکردند. از سوی دیگه اگر سراغ تولید نرم‌افزارهای شبیه‌سازی برید یا بخواهید موتور پردازش گرافیکی (Graphic rendering engine) بنویسید به دانش ریاضی خوبی حداقل در حد جبر، محاسبات ماتریسی، وکتور و مثلثات و امثالهم نیاز دارید.اما (شاید) برای برنامه‌نویسی وب تا آخرین روز کاری به غیر از چهار عمل اصلی ریاضی به چیز دیگه‌ای احتیاج پیدا نکنید. در اصل برنامه‌نویسی بر مبنای ریاضی استواره اگر می‌خواهید برنامه‌نویس خیلی خاصی بشید و به حد عالی توی کارتون پیشرفت کنید تو زمینه‌ای که در اون فعالیت دارید با توجه به نیاز ریاضی یاد بگیرید. مطمئن باشید ریاضی که توی کار یاد می‌گیرید با نحوه‌ای که تو دبیرستان و دانشگاه یاد می‌گرفتید خیلی فرق می‌کنه. زیبایی ریاضی در برنامه‌نویسی اینه که می‌تونید به صورت گرافیکی نتیجه مفهوم ریاضی که استفاده می‌کنید رو ببینید! خودم تو دبیرستان اصلاً به ریاضی علاقه نداشتم اما بعد وقتی برای درست کردن بازی ازش استفاده کردم تازه خیلی از مباحث از آمار تا مثلثات رو یاد گرفتم و عاشق ریاضی شدم. ریاضی در حد دبیرستان کارتون رو تا حد خیلی زیادی راه می‌اندازه. اگر خیلی وقت هست از ریاضی فاصله گرفتید و یک کمی هم برنامه‌نویسی بلدید و دیدید توی کار به ریاضی احتیاج دارید نگران نباشید. یه سری به خان آکادمی بزنید.حقوق برنامه‌نویسی خوبه؟این موضوع خیلی مربوط به دانش، مهارت، تجربه و سرعت عمل برنامه‌نویس داره. اختلاف بازدهی دو برنامه نویس می‌تونه بیش از ده برابر باشه! سطح حقوق رو هم همین مهارت تعیین می‌کنه اما سقف حقوق برنامه‌نویسی به قدری بالا هست که از پردرآمدترین مشاغل حساب بشه. برای مشاهده حقوق برنامه‌نویس‌ها در ایران می‌تونید از سایت Iran salary استفاده کنید. برای بخش برنامه‌نویسی می‌تونید اینجا رو ببینید. در حال حاضر این بازه بین یک و نیم میلیون برای کسی که تازه شروع کرده تا دوازه میلیون در ماه برای برنامه‌نویس با سابقه است. البته خارج از ایران به مراتب دستمزد برنامه‌نویس‌ها بالاتره و تو آمریکا این عدد به صد و بیست هزار دلار (و بیشتر) در سال هم می‌رسه. با تکنولوژی امروزه و عصر ارتباطات کار کردن به صورت دورکاری (Remote) هم یه گزینه ست و می‌تونید به زندگی در ایران و کسب درآمد دلاری هم فکر کنید. پس اگر برای شروع با حقوق خیلی بالایی شروع نکردید نگران نباشید با یه کم تجربه و تلاش به رقم دلخواه‌تون می‌رسید.چه چیزهایی کمک می‌کنند؟دوست و مشاوردوست‌های برنامه‌نویس پیدا کنید.رفتن به باشگاه یا سفر با دوستان جذاب‌تر نیست؟ بیشتر به هم روحیه نمی‌دید؟ بیشتر به هم کمک نمی‌کنید تا پیشرفت کنید؟ توی برنامه‌نویسی هم همین‌طوره. مشکلاتی که بر می‌خورید شبیه به هم خواهید بود و می‌تونید به هم کمک کنید.از مشاور کمک بگیرید. منظورم از مشاور برنامه‌نویس با تجربه ست که بتونید ازش مشورت بگیرید. فرهنگ بین برنامه‌نویس‌ها فرهنگ کمک و یاد دادن هست. سایت Stack overflow محلی برای برنامه‌نویس‌هاست تا مشکلاتشون رو بپرسن . بعضی‌ها برای کمک به فرد دیگه چندین ساعت صرف نوشتن یک پاسخ می‌کنند. یا روی Github  هزاران پروژه رایگان قرار داده شده. پس مطمئن باشید که همیشه کسی پیدا می‌شه تا بتونید ازش مشورت بگیرید. اما باید راه سوال پرسیدن و مشورت گرفتن صحیح در بین جامعه رو بلد باشید. Eric Raymond یه مقاله تاریخی در مورد نحوه سوال پرسیدن به روش هوشمندانه (How to ask question the smart way)  داره که مطالعه این مقاله رو شدیداً پیشنهاد می‌کنم. سایت‌های آموزشی و رقابتیسایت‌هایی وجود دارند مثل codingame.com که برای تمرین فوق‌العاده خوب هستند! مسائل و سوالات دسته‌بندی شده دارند که با توجه به مهارتتون می‌تونید درجه سختی‌ رو انتخاب و اونا رو حل کنید. عمده مسائل حالت گرافیکی دارند و با کد باید اون مسئله رو حل کنید. مثلاً یکی چالش‌های ساده اینه که در تصویر یه سری دشمن به بازیکن که شما کنترلش رو با کد در دست داریدحمله می‌کنند. باید کدی بنویسید که نزدیکترین دشمن رو پیدا کنه و بهش شلیک کنید تا به بازیکن‌تون آسیب نرسه. این روش، تمرین کردن رو خیلی لذت بخش می‌کنه. همین‌طور یه سری بازی آنلاین داره که شما هوش مصنوعی می‌نویسید و با بقیه بازیکن‌ها به رقابت می‌پردازید.سایت codefights یه میدون نبرد برنامه‌نویسیه! هم برای کسانی که تازه شروع کردن چالش داره و هم برای حرفه‌ای‌ها. اینجا هم مقدار زیادی چالش و مدال وجود داره و کلی مسابقه!topcoder هم از قدیمی‌ترین سایت‌هایی هست که روی برنامه‌نویسی رقابتی تمرکز داره و برای اونایی که اهل رقابت خیلی جدی هستند توصیه می‌شه.زبان‌ جدید یاد بگیریدزبان‌های برنامه‌نویسی ابزار هستند هر زبان برای پاسخ دادن به یک سری مشکلات تولید شده. پس توجه داشته باشید با دونستن زبان‌های برنامه‌نویسی مختلف ابزار مختلفی برای موقعیت‌های خاص در اختیار دارید. شاید یه زبان یه کاری رو کمی کندتر از بقیه انجام بده و مناسب کارهایی که باید در لحظه انجام بشه، نباشه اما در عوض سرعت خوبی در نوشتن یه اسکریپت ساده داره تا از انجام یه کار تکراری و خسته کننده دوری کنید.از نزاع بین این که کدوم زبان سریعتره یا بهتره فاصله بگیرید. به زبان‌ها به چشم ابزار نگاه کنید. هر کدوم جای خودشون سریع هستند. هر کدوم جای خودشون کاربرد دارند.ورزشما در طی سال‌ها تکامل انسان، موجودی بودیم که در طبیعت به دنبال شکار یا تهیه غذا می‌دویده و یا روزها در مزرعه کار می‌کرده. برنامه‌نویسی به ساعت‌ها نشستن و تمرکز احتیاج داره. این نشستن طولانی می‌تونه منجر به مشکلات خیلی جدی مثل سندرم تونل کارپال، کمردرد، درد کتف و گردن و مشکلات دیگه‌ای بشه. پس توجه به سلامت فیزیکی و تقویت بدن برای توانایی نشستن در ساعت‌های طولانی خیلی به راهی که در پیش دارید کمک می‌کنه. کنجکاویهیچ چیز به اندازه کنجکاوی و توجه به جزییات نمی‌تونه کمکتون کنه! به همه مسائل حساس باشید. مثلاً فرق int main با void main در C/C++ چیه؟ چه طور یه فایل متنی چند گیگابایتی رو باز کنم و سریع تغییرش بدم؟ چه طور زیپ کردن یه فایل، حجم فایل متنی رو خیلی کاهش می‌ده ولی روی عکس اون‌قدر تاثیر نداره؟ دونستن تمام این موارد خیلی ازتون وقت نمی‌گیره یا حتی مسئله خیلی بزرگی هم نباشه اما با یادگیری چیزهای کوچیک تو مغز هرمون‌هایی ترشح می‌شه که باعث نشاط می‌شه! این نشاط بعد از مدتی اعتیاد میاره و مطمئن باشید هیچ وقت از این نوع اعتیاد پشیمون نمی‌شید!برای چند قدم دور بشیدنقاش‌ها وقتی دارند روی بوم کار می‌کنند خیلی از نزدیک به کار نگاه می‌کنند. هر از گاهی از تابلو دور می‌شن تا کل کار رو ببیند روند انجام کار رو بررسی کنند و اگر جایی رو درست اجرا نکردند رو تصحیح کنند. این دید به دست نمیاد مگر این که بعضی وقت‌ها از کارمون فاصله بگیریم جزییات رو کنار بگذاریم و به نقشه بزرگتر راهمون نگاه کنیم. بعضی وقت‌ها روی چیزهای ساده و بی اهمیت متمرکز می‌شیم و وقت می‌ذاریم که یادمون می‌ره چه چیزهای بزرگتری برای یادگیری وجود داره. یا اگر راه رو داریم اشتباه می‌ریم خیلی دیر می‌فهمیم. پس هر چند وقت صبر کنید. چند قدم از کار فاصله بگیرید و به ادامه مسیر یا اهمیت موضوعی که دارید کار می‌کنید فکر کنید. بعضی وقت‌ها بستن یه پروژه و شروع یه پروژه جدید به صرفه‌تر از پروژه‌ای هست که خیلی اشتباه پیش رفته.چیزهای جدید تجربه کنیداولین زبان برنامه‌نویسی رو یاد گرفتید؟ کار با پایگاه داده و برنامه‌نویسی شبکه یاد گرفتید؟ الان گوگل کار می‌کنید و از طرف شرکت‌های بزرگ پیشنهاد کار دارید؟ همین جا توقف نکنید! شما هنوز برای یاد گرفتن راه زیادی دارید. حتی بعد از اون ده سالی که برای استادی صحبت کردیم تازه در یک بخش برنامه‌نویسی ماهر هستید! پس هنوز برای تجربه‌های جدید فرصت دارید. به قول سایه:آبی که برآسود زمینش بخورد زود، زمینش بخورد زوددریا شود آن رود که پیوسته روان استاولین زبان برنامه‌نویسی رو یاد گرفتم. حالا چی؟خیلی افراد کمی هستند که تمام زیر و بم یک زبان رو بلد باشند! اگر تنها نحوه نوشتن کد برای یک زبان رو یاد گرفتید هنوز برنامه‌نویس نشدید. هنوز خیلی ابزارها و روش‌هایی هست که باید یاد بگیرید تا توی کار پیشرفت کنید. در مطلب بعدی به مهارت‌های عمومی که یه برنامه‌نویس نیاز داره اشاره می‌کنیم و هر کدوم رو توضیح می‌دیم.امیدوارم این مطلب براتون مفید بوده باشه، خوشحال می‌شم اگر نظری یا سوالی دارید مطرح کنید یا اگر برای مطلب بعدی پیشنهادی دارید با من در میون بذارید.</description>
                <category>محمد ایرجی</category>
                <author>محمد ایرجی</author>
                <pubDate>Fri, 16 Nov 2018 03:12:27 +0330</pubDate>
            </item>
            </channel>
</rss>