<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آرین ابراهیم‌پور</title>
        <link>https://virgool.io/feed/@avestura</link>
        <description>وب سایت شخصی: https://avestura.dev</description>
        <language>fa</language>
        <pubDate>2026-04-15 08:12:29</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/13391/avatar/f79EbL.png?height=120&amp;width=120</url>
            <title>آرین ابراهیم‌پور</title>
            <link>https://virgool.io/@avestura</link>
        </image>

                    <item>
                <title>چطوری یک مهندس منفی ده‌برابر بشیم؟</title>
                <link>https://virgool.io/@avestura/minus-10x-engineer-umdjp1viiqca</link>
                <description>تو جامعه فنی اصطلاحی وجود داره تحت عنوان «مهندس ده‌برابر» یا 10x Engineer. ریشه این اصطلاح به یک مقاله در سال ۱۹۶۸ برمی‌گرده که با تحلیل داده‌ها به این نتیجه رسید که نسبت یک مهندس خوب به یک مهندس بد در سازمان عدد ۱۰ هست، به این معنی که این «مهندسین خوب» ده برابر ارزشمند‌تر و پربارتر هستن.  این اصطلاح توی سال‌های ۲۰۱۶ و ۲۰۱۸ گسترده‌تر و به نوعی Meme (طنز اینترنتی) و دستمایه شوخی‌های مهندسین تبدیل شد.در مقابل مهندس ۱۰ برابر، مهندس منفی ۱۰ برابر هست که باعث افزایش هزینه‌ها میشه. توی این بلاگ پست که ترجمه‌ای از مطلب How to become a -10x Engineer هست میخوایم ببینیم که چطور میشه یک مهندس منفی ده‌برابر شد.مهندسین ده برابر ممکنه افسانه‌ای باشن، اما مهندسین منفی ده برابر قطعا وجود دارن.برای اینکه یک مهندس منفی ده برابر بشید کافیه تا هر هفته ۴۰۰ ساعت وقت تیم مهندسی رو تلف کنین. برای این کار از ترکیبی از استراتژی‌های زیر استفاده کنین:کار ده مهندس دیگه رو باطل کنین.نیازمندی‌های پروژه رو هر چه که بیشتر توسعه پیدا میکنه عوض کنین. برای اینکه شما رو سرزنش نکنن از همون اول نیازمندی‌ها رو مبهم تعریف کنین.۴۰۰ ساعت کار بیخود بسازین.از تیم‌تون بخواید تسک‌هایی رو انجام بدن که شبیه کار واقعیه. مثال‌های متنوعش شامل ارائه دادن، دیاگرام درست کردن، و مدیریت تیکت هاست. آداب و رسوم بی‌معنی درست کنین.۴۰۰ ساعت فرسودگی/عقب‌رفت بسازین.ناسپاس باشین. بقیه رو سرزنش کنین. باعث سردرگمی بشین. عصبانی بشین. دلیل اضافه‌کاری بقیه باشین.۱۰ مهندس رو توی یک مکالمه فنی گروگان بگیرین.اجازه بدین که مهندسین درباره ایده‌هاشون صحبت کنن. تشویق‌شون کنین که به جای عمل‌گرایی دنبال ظاهرسازی باشن. مطمئن بشین که هیچکس قدرت کافی برای تصمیم‌گیری نداره.۴۰۰ ساعت سربار ارتباطی بسازین.جلسات تقویم رو خراب میکنن. برای اینکه به شکل چراغ خاموش وقت بقیه رو هدر بدین، پیام‌ها و اسناد طولانی بنویسین و تا جایی که میشه به اشتراک بذاریدش. از همه نظرات استقبال کنین و با همشون تعامل داشته باشین.۱۰ هفته از حقوق کارمندان رو روی هزینه‌های ابری هدر بدید.نرم‌افزار‌های کند بنویسین. از ایندکس‌های دیتابیس اجتناب کنین. روی ماشین‌های که ۱۶ تا هسته دارن برنامه‌های تک-نخی (Single Threaded) بنویسین. سخت‌افزار عجیب و غریب با میزان RAM و GPU شیک انتخاب کنین. هر جور دلتون خواست داده‌ها رو روی رم/دیسک ذخیره کنین. هیچ چیزی رو فشرده‌سازی نکنین. هیچ اهمیتی به چیدمان داده‌ها ندین.ابزارهای بیخود بسازین.تصمیم بگیرین که راه‌حل‌هایی که همین الان وجود دارن مشکل شما رو دقیقا حل نمیکنن. اسکریپت‌هایی بنویسید که فقط یک نفر ازشون سر در میاره. اگه این اسکریپت کار مهمی انجام میده، مستندی براش ننویسین.۴۰۰ ساعت زمان بیلد/کامپایل به پروژه اضافه کنین.بیلدهای کند باعث هدر رفتن زمان و «سود روی سود اومدن» [به مرور زمان کندتر شدن] میشن. هرچی که زمان بیلد طولانی‌تر بشه، توسعه‌دهنده‌های بیشتری حواسشون رو با چیزای مختلف پرت میکنن. برای اینکه مطمئن بشید توسعه‌دهنده‌ها مدام بین کارهای مختلف سوییچ میکنن اطمینان حاصل کنین که بیلد شما حداقل ۲۰ ثانیه زمان میبره. میتونید برای گرفتن نتیجه مشابه تست‌های کند هم بنویسین.تست‌های بی‌معنی بنویسین.به یک سری از متغیرهای خاص وابستگی ایجاد کنین بدون اینکه کاری که پشتش اتفاق میفته رو تست کنین. انقدر صدا زده شدن توابع رو Mock کنید که دیگه هیچ کد واقعی‌ای اجرا نشه. تست‌هاتون رو زیرزیرکی تصادفی کنین جوری که بعضی اوقات بی هیچ دلیل pass و بعضی اوقات دیگه fail بشن.۴۰۰ ساعت از وقت مهندسی رو روی یک معماری بد تلف کنین.رشد سیستم‌تون در آینده رو حین طراحی سیستم در نظر نداشته باشین. و یا به جای اون کاری کنید که تیم شما روی تصمیمات معماری وسواس داشته باشن تا دیگه وقتی برای آزمایش نظریه‌هاشون باقی نمونه.۴۰۰ ساعت وقت روی دیپلوی‌کردن تلف کنین.تا میتونید محیط‌های مختلف ایجاد کنین. محیط پروداکشن و Staging باید تا حد ممکن با هم فرق داشته باشن. کدهای شکننده روی بیلدسیستم‌های شکننده راه‌اندازی کنین. پشت سر هم دیتابیس‌هاتون رو مایگریت کنین.۱۰ هفته حقوق رو به مشتریان ناراضی ببازین.متداوماً در تشخیص و حل خطاهای اضطراری مشتریان‌تون شکست بخورین. هیچ اهمیتی به مشکلات امنیتی ندین.مستندات بیخود بنویسین.کدها روی توی پیام‌های خصوصی توضیح بدین. مستنداتی بنویسید که هیچ‌کسی قرار نیست ازشون استفاده کنه.۱۰ مهندس رو در یک پروژه بیهوده آزمایشی زندانی کنین.مهندسین خوش‌فکر رو جذب کنین و استعداد و توانایی‌هاشون رو هدر بدین. پیچیدگی پروژه رو کمتر از حد واقعی، و کاربردی بودنش رو بیشتر از حد واقعی به مدیریت نشون بدین. انقدر به مدیریت بگید که «تقریباً دیگه تمومه» تا بالاخره بیخیالش بشن.وابستگی‌هایی به پروژه اضافه کنین که ۴۰۰ ساعت نگهداری نیاز دارن.مهندسین باید به طور جداگانه همه کتاب‌خونه‌ها رو یاد بگیرن.در تغییر استراتژی تاخیر داشته باشین.هیچ‌وقت به شکست اقرار نکنین. تیم‌تون رو غرق هزینه‌ها کنین. توافقات ۸۰/۲۰ ای که می‌تونن وضعیت‌تون رو بهبود بدن رو نادیده بگیرین.۱۰ مهندس صفر برابر استخدام کنین.هزینه فرصت میتونه کشنده باشه. وزنه‌های مرده ممکنه متداوماً به تیم شما ضرر نرسونن، اما روی صندلی کسایی میشینن که میتونستن واقعا کمک کنن.۵ مهندس منفی‌یک برابر استخدام کنین.به وزنه‌مرده‌ها بسنده نکنین. به طور فعال مهندسینی رو استخدام کنین که فاجعه ایجاد میکنن و در برابر یادگرفتن مقاومت نشون میدن.مانع اخراج شدن ۱۰ مهندس منفی‌یک برابر بشین.قایق‌هاتون رو تکون ندین. هیچ ردی از شکست باقی نذارین. ضامن مهندسین بد بشین.دلیل ۴۰۰ ساعت تریاژ باگ بشین.برنامه‌های غیرقابل دیباگ بنویسین. روی همه‌چیز لایه‌های انتزاعی بکشین. کدهای اسپاگتی بنویسین. همه چیز رو حساس به شرایط اولیه کنین. از توابع Pure پرهیز کنین. هر جور دلتون خواست به پروژه وابستگی اضافه کنین. هر جا که ممکن بود بگید «رو ماشین من کار میکنه».</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Thu, 15 Jun 2023 12:33:43 +0330</pubDate>
            </item>
                    <item>
                <title>پارسی سرایان گیلان با طعم هوش مصنوعی</title>
                <link>https://virgool.io/@avestura/%D9%BE%D8%A7%D8%B1%D8%B3%DB%8C-%D8%B3%D8%B1%D8%A7%DB%8C%D8%A7%D9%86-%DA%AF%DB%8C%D9%84%D8%A7%D9%86-%D8%A8%D8%A7-%D8%B7%D8%B9%D9%85-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-sffyoebq44f8</link>
                <description>من به چیزای مختلفی علاقه دارم، از جمله شعر، تاریخ، و زادگاهم استان گیلان. چند وقت قبل که تو یکی از کتاب‌فروشی‌های لاهیجان چرخ می‌زدم به این کتاب برخوردم: «پارسی‌سرایان گیلان از آغاز تا پایان قرن سیزدهم» اثر «دکتر هومن یوسف‌دهی». این کتاب نه فقط یک کتاب شعر از شاعران گیلان، بلکه نوعی کتاب تاریخی هم هست که داستان این شعرا رو (هر چند خیلی کوتاه) در کنار شعرهاشون روایت می‌کنه و بنابراین در تقاطع علایق من قرار میگیره.جالبی این کتاب اینجاست که سرچ کردن اکثر این شعرها توی اینترنت هیچ نتیجه‌ای نداشت و انگار که هنوز به دنیای دیجیتال وارد نشدن! هدفم از این پست هم اینه که این اشعار رو به دنیای اینترنت بکشونم، و هم یه آزمایش کوچیک بکنم: متن این شعرهارو بدم به هوش مصنوعی و ببینم که چه عکسی براشون تولید میکنه!? عکس‌های این پست توسط Stable Diffusion ورژن‌های 1.5 و 2.1 تولید شدن.میرزا تقی اصفهانی (وزیر لاهیجان در سال ۱۰۲۱ق)بویی از راح محبت تا در این میخانه است  *  رقص چرخ افتادگی‌های زمین مستانه استدر فضای تنگ دل راحت نمی‌گیرد قـــــــــــرار *  گویی آبادانـــی‌ای نزدیــک این ویرانـــــــه استگویی آبادانی‌ای نزدیک این ویرانه استملا محمد حاجی گیلانیکند خوش‌خوانیِ بلبل، پریشان حالِ زاغـــــــــان را  *  کمـــــال دیــــــــگری دلگیر دارد بی‌کمــــالان رابه صحرایی که هر گَردی به مژگانش کند شوخی  * هوا دام مــشــبــک می‌شـــــــود بال تذروان راکــفــن دزد از ســخــن دزد امـتــیـــاز فاحــــشی دارد  *  که آن پیراهن تن می‌برد، این جامه‌ جان رامِی شیراز، معشوق صفاهان، خوش بود حاجـــی *  به شرط آنکه یاد آری هوای ابرِ گــیـــــــــلان راکند خوش‌خوانیِ بلبل، پریشان حالِ زاغـــــــــان رالاف دانش گر زند پیوسته نادان دور نیست  *  خفته دایم خویش را بیدار می‌بیند به خوابپاس دل‌های خراب و چشمِ اشـــــک‌آلود دار  *  گــنـــــج در ویرانه‌ها می‌باشد و گــوهــر در آبپاس دل‌های خراب و چشمِ اشـــــک‌آلود دار  *  گــنـــــج در ویرانه‌ها می‌باشد و گــوهــر در آب  احسنی لاهیجیآن کاو ز یاری بخت صد پایه برتر از مـاست  *  گرید چنان که گویی خونین جگرتر از ماستکافـــی‌ست قوت دانـــا لـخــت جـگر و لـیکن  *  مــا بی‌جـگرتر از دل، دل بی‌جـگرتــر از ماستآن کاو ز یاری بخت صد پایه برتر از مـاست  *  گرید چنان که گویی خونین جگرتر از ماستخان‌احمد‌خان گیلانیمُردم از درد و طــبــیــب از حــــــال زارم بــی‌خـبـر  *  کار من جان کندن و آن مه ز کارم بی‌خبردر شب تاریک هجرانم ز جان‌کندن چه سود؟  *  ماه من از محـنـت شــــب‌های تارم بی‌خبر مُردم از درد و طــبــیــب از حــــــال زارم بــی‌خـبـر  *  کار من جان کندن و آن مه ز کارم بی‌خبرامینای رودسری لاهیجیخاکساری طور و ما موسی، عصا افتادگی  *  وحی ما خاموشی و معراج ما افتادگیحاصـــل آزادگــی از ســرو پـرسـیـدیم گـفت  *  ابــتـــدا گــــردن‌فــــرازی انتـهـا افتادگـــــیحاصـــل آزادگــی از ســرو پـرسـیـدیم گـفت  *  ابــتـــدا گــــردن‌فــــرازی انتـهـا افتادگـــــیجعفربیگ لاهیجیقدر نعمت می‌شناسم خدمت رز می‌کنم  *  خویش را در پیش می‌خواران معزّز می‌کنمراهــرو را بــــاک از پست و بلند راه نیست  *  آســـمان پــیــموده‌ام اکنون زمین گز می‌کنمراهــرو را بــــاک از پست و بلند راه نیست  *  آســـمان پــیــموده‌ام اکنون زمین گز می‌کنمدیگر پست‌های مرتبط من:آموزش Status Code های HTTP با اشعار فارسی </description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Thu, 08 Jun 2023 15:37:31 +0330</pubDate>
            </item>
                    <item>
                <title>به اجماع رسیدن (Consensus) در سیستم‌های توزیع شده</title>
                <link>https://virgool.io/@avestura/raft-distributed-consensus-algorithm-ke3ri6ww9qke</link>
                <description>لوگوی الگوریتم Raftیکی از چالش‌های صنعتی و آکادمیک در سیستم‌های توزیع شده «به اجماع رسیدن» و یا Consensus هست. زمانی که فقط یک Node درون شبکه‌مون داریم کلاینت و سرور به راحتی میتونن سر وضعیت فعلی سیستم به توافق برسن، اما وقتی بحث یک کلاستر توزیع شده میشه چطور؟یکی از الگوریتم‌های مهمی که برای اجماع توزیع‌شده استفاده میشه Raft ئه.توی این وب سایت فارسی نحوه کار الگوریتم Raft رو به صورت بصری و تعاملی آوردم که میتونین هر مرحله از کار Raft رو ببینید.? آدرس وب سایت: https://github.avestura.dev/thesecretlivesofdata-fa/raftپانوشت: این سایت ترجمه‌ای از پروژه The Secret Lives of Data هست.</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Sat, 03 Jun 2023 17:36:34 +0330</pubDate>
            </item>
                    <item>
                <title>مشارکت در پروژه‌های پیچیده</title>
                <link>https://virgool.io/@avestura/contributing-to-complex-projects-mubv6n1nq1pq</link>
                <description>این پست ترجمه‌ای از وبلاگ Mitchell Hashimoto تحت عنوان «Contributing to Complex Projects» است.به عنوان یک مشارکت‌کننده و نگهدارنده دائمی در پروژه‌های متن‌باز، متدواما از من سوال می‌شه که: از کجا شروع می‌کنی؟ رویکردت برای ایجاد یک تغییر معنادار در پروژه جدید چیه؟ چطور ممکنه که بشه جزئیات داخلی یک پروژه پیچیده رو متوجه شد؟این سوالات برای هر نوع پروژه نرم‌افزاری، چه متن‌باز باشن یا اختصاصی، و چه حرفه‌ای باشن یا برای تفریح صادق هستن. رویکرد من برای همه این حالات یکسانه. اگرچه، یک تفاوت اساسی در پروژه‌های حرفه‌ای اینه که شما به مهندسینی که مایلن تا به شما کمک کنن — اگه مجبور نباشن — دسترسی دارید، درحالی که در پروژه‌های متن‌باز بیشتر کار پای شماست.من الگویی تکراری برای نزدیک‌شدن به پروژه‌های پیچیده ایجاد کردم که در این پست مستندسازی شده. انتظار ندارم که این الگو برای همه جواب بده، اما امیدوارم برای سایر کسانی که اعتماد به نفس کافی برای مشارکت و تلاش برای یادگیری پروژه‌های پیچیده دارن کمک‌کننده باشه.من از عبارت «پروژه پیچیده» برای توصیف هر پروژه‎ نرم‌افزاری استفاده می‌کنم که فهم پیاده‌سازیش بدیهی نباشه. این تعریف یک تعریف شخصیه؛ ممکنه بعضی افراد پروژه‌هایی رو پیچیده بدونن که برای سایر افراد پیچیده نیست، و برعکس.گام اول: کاربر پروژه بشیداولین گام برای فهمیدن جزئیات داخلی هر پروژه‌ای اینه که کاربر اون پروژه بشید. حتما لزومی نداره که یک کاربر متخصص بشید، اما معیار شخصی من برای فراغت از این گام اینه که سعی کنید چیزی واقعی با این پروژه بسازید، حتی اگه کوچیک یا ساده باشه. به عنوان مثال، من قبل از مشارکت در زبان برنامه‌نویسی Zig، چندین کتاب‌خانه واقعی نوشتم.به عنوان یک کاربر، شما درک گسترده‌ای از قابلیت های پروژه کسب می‌کنید. تفاوت فاحشی بین خوندن مستندات مرجع یک پروژه و استفاده از اون در عمل وجود داره، و ساخت پروژه‌های کوچک گام مهمی برای رسیدن از درک تئوری به عملیه.علاوه بر این، شما شروع به یادگیری اصطلاحات پروژه که رنگ فرهنگی پروژه رو شکل می‌ده می‌کنید و کمک می‌کنه تا بفهیمد چرا پروژه اینطوری کار می‌کنه، چرا این قابلیت‌ها رو داره، و غیره. این موضوع مهمیه چرا که کمک می‌کنه تا یکدلی بین کسانی که روی پروژه کار میکنن شکل بگیره و همچنین به عنوان راهنمایی عمل می‌کنه که چه تغییراتی در پروژه منطقیه و چه تغییراتی منطقی نیست.من همچنین توصیه می‌کنم که در این نقطه وارد کامیونیتی و اجتماعات اون پروژه بشید. به IRC و یا دیسکورد اون پروژه ملحق بشید، در ملاقات‌های محلی شرکت کنید، سخنرانی‌هاشو ببینید، و غیره. تا یک مدت زمانی بیشتر گوش بدید تا اینکه صحبت کنید. هدف در این قسمت اینه که همدلی کسب کنید و بفهمید که پروژه چطور کار می‌کنه. بعضی اوقات تعجب می‌کنم از اینکه چقدر از تماشا کردن یادگرفتن‌های بقیه یاد‌میگیرم.گام دوم: پروژه رو بیلد کنیدیادبگیرید که چطور پروژه رو بیلد کنید و یک باینری (و یا معادلش) که کار می‌کنه تولید کنید. خودتونو با فهمیدن سیستمی که بیلد رو انجام میده، وابستگی‌های پروژه و ... درگیر نکنید. فقط برید سراغ راهنماها، وب سایت‌ها، و هر چیزی که به طور قابل اتکا و تکرارپذیری شما رو از سورس کد به یک باینری قابل اجرا در سیستم می‌رسونه.قبل از یادگرفتن نحوه بیلد کردن پروژه کدها رو نخونید. خیلی اوقات افرادی رو میبینم که تلاش می‌کنن سورس کد رو بفهمن، قبل از اینکه یادبگیرن چطور پروژه رو بیلد کنن. برای من، بخشی از فرایند یادگیری اینه که چیزای مختلف رو آزمایش کنم و خراب کنمشون، و خیلی سخته که شما بتونید چیزی رو آزمایش یا خراب کنید، بدون اینکه بتونید بیلدش کنید.نگران بیلد‌هایی که همه قابلیت‌ها رو به طور کامل دارن نباشین. پروژه‌های پیچیده عموما قابلیت‌هایی دارن که فقط در صورتی در دسترس قرار می‌گیرن که پیش‌نیاز‌های درست، سیستم‌های درست، تنظیمات درست و ... داشته باشید. در چنین حالتی نگران هیچ کدوم از این موارد نباشید. هدف اینه که یک باینری که به اندازه کافی روی سیستم شما خوب کار می‌کنه داشته باشید. هرچه که قدم‌های بیشتری برمی‌دارین، تجربه و اعتماد به نفس بیشتری برای شروع کار با بیلد‌های با قابلیت‌های بیشتر پیدا می‌کنین.در حین این مرحله، من همچنین پیشنهاد می‌کنم یاد بگیرید که چطور تست‌ها رو اجرا کنید و اون‌هارو به موفقیت برسونید. این باعث میشه راحت‌تر بتونید در گام‌های بعدی روی چیزای مختلف آزمایش کنید یا اون‌ها رو خراب کنید. پروژه‌های پیچیده معمولا تست سوئیت‌های پیچیده‌ای هم دارن، بنابراین در بعضی حالات ممکنه منظور اجرای فقط زیرمجموعه‌ای از تست‌ها باشه — هرچندتایی که برای آزمایش شما کافیه.گام سوم: مسیر‌های داغ داخلی را یاد بگیریدبرای یادگیری جزئیات داخلی، من دوست دارم رویکردی که «دنبال‌کردن رو به پایین، یادگیری رو به بالا» صداش میزنم رو استفاده کنم.⬇️ دنبال کردن رو به پایینمن با یک قابلیت یا مورد کاربردی شروع می‌کنم، و از بیرون شروع می‌کنم به دنبال‌کردن مسیر کد به سمت اون قابلیت. در حین این فرایند، از فایل‌ها، خطوط، و توابعی که رد میشم یادداشت برداری می‌کنم، اما هنوز تلاشی برای فهمیدن اینکه چی چطور کار می‌کنه نمیکنم. این فاز «دنبال‌کردن رو به پایینه».به عنوان مثال، زمانی که کامپایلر Zig رو یادمی‌گرفتم، از دنبال کردن دستور zig build-exe شروع کردم تا از روی یک سورس کد Zig یک خروجی قابل اجرا بسازم. این دنبال‌کردن من رو به سمت پیدا کردن سورس کد محیط دستوری Zig، زیردستور build-exe، و سپس به سمت زیرسیستم «کامپایل»، که در نهایت تجزیه‌گر کد، لکسر و ... رو صدا می‌زد هدایت کرد. از جزئیات پیاده‌سازی فقط چیزایی رو خوندم که بتونم مسیر رو دنبال کنم، نه بیشتر.از یادداشت‌های دنبال‌کردن کد، معمولا می‌تونید یه «تصویر بزرگ» از اینکه یه چیز چطور کار می‌کنه بسازید. براساس نام فایل‌ها، توابع و غیره معمولا می‌تونید زیرسیستم‌های اصلی پروژه رو شناسایی کنید. این کمک می‌کنه تا بعدا فرایند یادگیری رو به بخش‌هایی با اندازه‌های معقول‌تر بشکنید.سعی نکنید که همه چیز رو یاد بگیرید. یکی از اشتباهات رایجی که میبینم مردم مرتکبش میشن اینه که هفته‌ها و حتی ماه‌ها توی کد گم میشن و در نهایت هم دلسرد میشن چون می‌خوان که کل پروژه رو خط به خط بخونن. تمرکز کنید و قابلیت به قابلیت یاد بگیرید.نکته: وقتی قابلیتی رو انتخاب می‌کنید، یکی از قابلیت‌هایی باشه که به عنوان کاربر باهاش آشنا هستید. همچنین، اگه ممکنه، قابلیتی رو انتخاب کنید که از روی سطح پروژه آسون به نظر بیاد. به عنوان مثال، اولین برنامه Zig که سعی کردم دنبالش کنم تا کامپایلر رو یاد بگیرم برنامه‌ای بود که دو عدد رو جمع می‌زد و هیچ خروجی‌ای نداشت.⬆️ یادگیری رو به بالابعد از دنبال کردن یک قابلیت، الان وقتش رسیده که ببینید چطور چندین زیرسیستم مختلف کار می‌کنن. درحالیکه برای فاز دنبال‌کردن، از بیرونی‌ترین نقطه مثل محیط دستوری یا صدازدن رابط‌های برنامه‌نویسی شروع می‌کنم، برای فاز یادگیری، از دورنی‌ترین نقطه شروع می‌کنم.از درونی‌ترین نقطه شروع می‌کنم، چرا که معمولا بنیادی‌ترین و کمترین میزان انتزاع رو داره. همین‌طور که از لایه‌ها بالا میریم، به نظر ارتباط مستقیمی با افزایش سطوح انتزاع داره که باعث میشه اگه قطعات مختلف اجزا رو نمیفهمید، یادگیریتون سخت‌تر بشه.برای یادگیری یک زیرسیستم مشخص، من به طور بازگشتی «دنبال‌کردن رو به پایین، یادگیری رو به بالا» رو انجام می‌دم. اول با بررسی رابط‌های عمومی و بیرونی سطوح شروع می‌کنم، و بعد از اون یاد می‌گیرم که صدا زدن هر کدوم از این رابط‌ها چطور کار می‌کنه. این روشی هست که لایه‌های بالایی از زیرسیستم‌ها استفاده می‌کنند، بنابراین هم من رو راهنمایی می‌کنه که چطور یادبگیرم، و هم همون طور که به سمت بالا حرکت می‌کنم قضیه روشن‌تر میشه.آزمایش و خراب‌کردن چیز‌هادر حین فرایند «دنبال‌کردن رو به پایین، یادگیری رو به بالا»، آزمایش‌کردن و خراب‌کردن چیز‌ها رو برای یادگیری اینکه چطور چیزی کار می‌کنه مفید می‌دونم. به خاطر همین هم هست که یادگیری اینکه چطور پروژه رو بیلد کنیم رو قبل از تلاش برای خوندن جزئیات داخلی پروژه ضروری می‌بینم.لاگ‌های جدید اضافه کنید، بخش‌های کوچک با قابلیت‌های جدید پیاده‌سازی کنید، قابلیت‌های فعلی رو تغییر بدید و ... در نهایت پروژه رو مجددا بیلد کنید و ببینید که چه اتفاقی میفته. این همچنین راه خوبیه تا فهم خودتون رو از اینکه چیزی چطور کار می‌کنه محک بزنید.به عنوان مثال، زمانی که در مورد توکن‌ساز [۱] Zig یاد می‌گرفتم، توکن‌های جدیدی اضافه کردم و دیدم که توکن‌ها شناسایی میشن اما تجزیه‌گر به خطا می‌خوره. وقتی سراغ سیستم بعدی (تجزیه‌گر) رفتم، از توکن‌های جدیدم استفاده کردم تا کاری انجام بدن. و به همین منوال...تکمیل با رسانهدر این فاز، یادگیری کد رو با رسانه‌هایی مثل کتاب‌ها، ویدئو‌ها، بلاگ پست‌ها و ... تکمیل کنید. اگر محتوایی که جزئیات داخلی رو پوشش میده وجود داره، بخونیدش!اگرچه، نباید انتظار داشته باشید که این محتوا به تنهایی شما رو به سطح یک آدم خبره برسونه. مشابه گام اول و «یک کاربر پروژه شدن»، هیچ مکملی برای کثیف کردن دستاتون و بازی با سورس‌کدهای واقعی به هدف «یک نگهدارنده شدن» وجود نداره. این مثال دیگه‌ای از کاربردهای تئوری در مقابل عملیه.نکته: اگه منبعی برای یادگیری جزئیات داخلی وجود نداره، سعی کنید خودتون بنویسیدش! من از اونجایی که نتونستم هیچ منبع به‌روز مشابهی رو پیدا کنم، این کار رو در مورد Zig انجام دادم و در مورد جزئیات داخلی Zig نوشتم. نوشتن در مورد چیزی راه خوبی برای تقویت یادگیری شماست و همچنین به مشارکت کنندگان بعدی هم کمک می‌کنه.مرحله چهارم: کامیت‌های اخیر رو بخونید و مجددا پیاده‌سازی کنیدبه عنوان قدم آخر برای یادگیری جزئیات داخلی، من کامیت‌های اخیر مربوط به زیرسیستم‌هایی که مطالعه‌شون کردم رو می‌خونم و تست می‌کنم که آیا تغییری که انجام شده رو کاملا میفهمم یا نه. این برای من بخش «انجام تمرین‌های انتهای کتاب» از یادگیریمه.من یا کامیت‌های اخیر از پروژه و یا تاریخچه کامیت‌ها از یک فایل یا پوشه مخصوص که مربوط به زیرسیستمی که قبلا مطالعه کردم رو نگاه می‌کنم. بعد از اون یا راه‌حل رو مطالعه می‌کنم (تغییرات درون کامیت) و یا باگی که سعی داشته رفع کنه رو نگاه می‌کنم و سعی می‌کنم که خودم رفعش کنم و ببینم که آیا به راه حل مشابهی میرسم یا نه؟برای کار روی مشکل و حلش، مخزن رو دقیقا تا قبل از اون کامیتی که در حال مطالعش هستم دریافت می‌کنم. باگی که قرار برطرف کنه رو به وجود میارم (اگه مربوط به رفع باگ باشه)، و بعد سعی می‌کنم که راه حل رو خودم پیاده‌سازی کنم. درنهایت، کار خودم رو با کامیتی که توسط مشارکت‌کننده یا نگهدارنده انجام‌شده مقایسه می‌کنم.تنها راهنمایی‌ای که به خودم می‌کنم اندازه تغییرات مورد نیاز هست (نماد‌های +/- در کنار خطوط تغییرات در سورس کنترل). توصیه میکنم برای شروع از تغییراتی که به بیشتر از ۵۰ تا ۱۰۰ خط تغییر در خطوط کد نیاز دارن پرهیز کنید.گام پنجم: تغییر کوچکی ایجاد کنیدمن دوست دارم با تغییر کوچکی شروع کنم و به صورت تدریجی وظایف بزرگ و بزرگ‌تری رو انجام بدم. در این فاز، شما اجزا فنی پروژه رو میفهمید، و الان وقتش رسیده که اجزا انسانی رو یاد بگیرید. هدف در اینجا اینه که تغییر کوچکی بدید و فرایند‌های مشارکت و مرور کد رو یاد بگیرید.معمولا سخت‌ترین قسمت پیدا کردن یک تغییر کوچک برای انجام دادنه. هیچ گلوگه نقره‌ای[۲] اینجا وجود نداره. من بین ایشوهای[۳] ثبت‌شده می‌گردم تا چیزی پیدا کنم که بشه مشارکت کرد. من معمولا چند بار شروع اشتباهی دارم، و یا یک ایشو رو کلا بیخیال میشم و سعی میکنم ایشو دیگه‌ای رو رفع کنم. درنهایت یکی پیدا می‌کنم. این‌بار کمی طول می‌کشه تا مشکل رو پیدا کنم و یا حتی رفع مشکل می‌تونه به طور ناامید‌کننده‌ای طول بکشه، اما این هزینه‌ایه که باید پرداخت کرد. پروژه‌ها معمولا برچسب‌های «مخصوص مشارکت‌کننده‌ها» دارن تا مشارکت‌کننده‌های جدید رو راهنمایی کنن.امروزه بیشتر پروژه‌ها مستندات خوبی در مورد فرایند مشارکت کردن دارن، بنابراین وقتی تغییرات پیاده‌سازی شد، دقیقا مطابق فرایند پیش برید. اگه در مراحل ابتدایی به کامیونیتی ملحق شدید، فرصت خوبیه تا از کسی کمک بخواید تا فرایند مشارکت شمارو دومرتبه بررسی کنه.به عنوان مثال، اولین مشارکت من در Zig یک تغییر سه خطی بود که در فاصله دو عصر چیزی نزدیک به چهار تا پنج ساعت از وقتم رو گرفت (بدون احتساب زمان برای انجام قدم‌های قبلی). اگه امروز با این باگ مواجه می‌شدم در چند دقیقه برطرفش می‌کردم، اما زمان میبره تا به چنین سطح مهارتی برسید.موفقیتدر این نقطه، شما یک پروژه پیچیده رو یاد گرفتید و در اون مشارکت کردید.از پیچیدگی نترسید. من فکر می‌کنم تعداد زیادی از مهندسین از پروژه‌هایی مثل زبان‌های برنامه‌نویسی، مرورگرها، پایگاه‌های داده و ... که به طور کلیشه‌ای پیچیده هستند به شکل یک جادو و یا مقدر شده برای موجوداتی برتر نگاه می‌کنن. میخوام یادآوری کنم که همه پروژه‌ها توسط سایر انسان‌ها شروع شدن. اگه اونا میتونستن که انجامش بدن، من هم میتونم. پس تو هم میتونی.امیدوارم که با به اشتراک گذاشتن رویکرد من، بقیه هم پروژه‌های پیچیده رو بیشتر قابل مشارکت ببینن.ترجمه‌ای از پست «Contributing to Complex Projects» توسط «Mitchell Hashimoto»۱: Tokenizer۲: منظور نویسنده این است که راه‌حل جادویی برای رفع مشکل وجود ندارد۳: Issue</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Thu, 01 Jun 2023 14:24:06 +0330</pubDate>
            </item>
                    <item>
                <title>چالش‌های جهانِ پس از نرم‌افزار‌های متن‌باز</title>
                <link>https://virgool.io/@avestura/challenges-of-post-oss-world-oxc3iosordj1</link>
                <description>نرم‌افزار‌های آزاد پیروز شدند. پس از سال‌ها متقاعد کردن مردم به استفاده از نرم‌افزار‌های متن باز، مبارزه با دیکوتومی غلط بین نرم‌افزار‌های آزاد و صنعتی، نرم‌افزار‌های تجاری، و دفاع در برابر سوگیری‌های منفی، موقعیت نرم‌افزار‌های آزاد دیگر مورد مناقشه نیست — آن‌ها توسط اکثریت قریب به اتفاق شرکت‌ها در سرتاسر دنیا در حال استفاده هستند، انتخاب پیش‌فرض در حین انتخاب تکنولوژی‌ها هستند، به اینترنت، کامپیوتر‌های شخصی ما، تلفن‌های همراه، و بیشتر دستگاه‌هایی که روزانه از آن‌ها استفاده می‌کنیم قدرت می‌دهند، و توسط شرکت‌هایی بزرگ و محافظه‌کاری پذیرفته شدند که تا همین چندین سال قبل مخالف کلی این مفهوم بودند.اما آیا ما واقعا برای آن آماده بوده‌ایم؟ بیشتر تاریخچه اجتماع نرم‌افزار‌های آزاد به مبارزه برای بقا خلاصه می‌شود. و ما استراتژی‌ها، متدولوژی‌ها، و نگرش‌های روابط عمومی‌ای خلق کردیم که به ما برای این بقا کمک می‌کردند. اما زمانه تغییر کرده است و اکنون ما با مجموعه مشکلات کاملا متفاوتی مواجه‌ایم که باید رفع شوند.بنیاد‌های منسوخ‌شده۹۳٪ — درصد پکیج‌های npm که تنها یک نگهدارنده دارنددرک عمومی از سازوکاری که اکوسیستم نرم‌افزار‌های آزاد را حکمرانی می‌کند نسبتاً قدیمی است. همان‌طور که بالاتر نیز اشاره شد — دانش ما درباره بنیاد نرم‌افزارهای اجتماع-بنیان زمانی شکل گرفت که نرم‌افزار‌های آزاد توسط جریان‌های اصلی صنعت برنامه‌نویسی به چشم چیزهای بد و ناخوشایند دیده می‌شد. سازمان‌هایی مانند «بنیاد نرم‌افزار‌های آزاد» و گواهینامه‌هایی مانند GPL ریشه در دهه‌های ۸۰ و ۹۰ میلادی دارند. مقاله اعجاب‌آور «کلیسای جامع و بازار [۱]» که فهم ما را از نرم‌افزار‌های اجتماع-بنیان شکل داد در سال ۱۹۹۹ منتشر شد. در آن زمان اوضاع کاملا متفاوت بود — زمانی که بازار نرم‌افزار زیر سلطه شرکت‌هایی مانند IBM، Oracle و Microsoft بود که واضحاً بر علیه ایده‌های نرم‌افزار‌های آزاد بودند. و در آن زمان ما نیاز به روش‌های متفاوتی برای صحبت در مورد این نرم‌افزارها داشتیم. تمثیل «بازار» طراحی شد تا دل توسعه‌دهندگان را بدست بیاورد و به آن‌ها نشان دهد نباید از نرم‌افزار‌های متن‌باز بترسند. این روش بسیار بسیار خوب عمل کرد. اگرچه نباید در سال ۲۰۱۸ به عنوان روشی برای توضیح اینکه نرم‌افزار‌های آزاد چگونه کار می‌کنند به کار گرفته شود — ما اکنون با مجموعه جدیدتری از مسائل روبه‌رو هستیم.در حالی که بسیاری از ایده‌های «کلیسای جامع و بازار» به خوبی پیش رفتند، و هنوز هم برای هر نوعی از توسعه نرم‌افزار صدق می‌کنند، امروزه نرم‌افزار‌های آزاد درباره ساخت اجتماعات بزرگ، اعمال قانون «هرچه چشم‌ها بیشتر باشند حفره‌ها کم عمق‌ترند[۲]»، و یا در اصل پیروی از مدل بازار نیست. بلکه برعکس، با توجه به تمام موفقیت‌هایی که نرم‌افزار‌های آزاد کسب کرده‌اند، مدل بازار ناموفق بوده است — تنها ۳٪ از پروژه‌های محبوب متن‌باز از چنین مدل توسعه‌ای تبعیت می‌کنند. البته آن ۳٪ شامل برخی از پروژه‌های متن‌باز بسیار محبوب و تاثیرگذار — مانند Rails روی لینوکس — هستند، اما می‌توان چنین استدلال کرد که این پروژه‌ها از این مدل در نتیجه موفقیت خود استفاده می‌کنند، نه برعکس آن. در آخر، هیچ پروژه‌ای به شکل یک اجتماع شروع نمی‌شود، همواره شخص مسئولی وجود دارد، و اجتماعات دور یک پروژه تنها پس از موفق شدن آن به وجود می‌آیند.رشد بی‌حد و مرز۲۸ میلیون کاربر — تعداد کاربران ثبت‌نام شده در گیت‌هاب[۳]هیچ شخصی در دهه ۹۰ میلادی نمیتوانست مقیاس موفقیت نرم‌افزار‌های آزاد را پیش‌بینی کند. تعداد توسعه‌دهندگانی که در حال توسعه متن‌باز هستند، تعداد پروژه‌ها، و تعداد کاربرانی که در ۲۰ سال گذشته چندین برابر شده‌اند. مدل بازار زمانی خلق شد که درصد بزرگی از کسانی که از نرم‌افزار‌های آزاد استفاده می‌کردند، خودشان توسعه‌دهندگان نرم‌افزار‌های آزاد بودند. اما در حال حاضر وضعیت جهان کمی متفاوت است. بیایید کمی این اعداد را مقایسه کنیم:تعداد دانلود‌ها در دو هفته گذشته:۱۹۹۸ — ۱۸۰ هزار دانلود از مرورگر Netscape (محبوب‌ترین پروژه متن‌باز در آن زمان)۲۰۱۷ — ۲۱ میلیون دانلود از Loadash (یک کتاب‌خانه رندوم جاوا اسکریپت)تعداد کاربران ثبت شده:۲۰۰۱ — ۲۰۸ هزار در SourceForge۲۰۱۸ — ۲۸ میلیون در گیت‌هابتعداد پروژه‌های فعال:۲۰۰۸ — ۱۵۰ هزار در SourceForge۲۰۱۷ — ۲۹ میلیون در گیت‌هابهمان‌طور که میبینیم، نرم‌افزار‌های آزاد امروزه عظیم، جهانی و محبوب هستند. اما در اینجا دو مسئله مهم وجود دارد. اولین مورد تکه‌تکه شدن افزایشی اکوسیستم است — خلاف آنچه منفعت بزرگ مدل بازار ارائه می‌شد، نرم‌افزار آزاد امروزی درباره ساخت نقطه تمرکز‌های کانونی برای کامیونیتی نیست. ما به تعداد کافی «جفت چشم‌های ناظر[۴]» نداریم، در عوض همه ما به پروژه‌هایی اتکا کرده‌ایم که اکثرا دارای یک نگهدارنده و یک الی دو نفر مشارکت کننده هستند. دومین مساله این است که رشد تعداد کابران منجر به رشد متناسب تعداد مشارکت‌کنندگان نشده است. و چیزی که مهم‌تر است این است که رشد تعداد مشارکت‌کنندگان نیز به رشد متناسب تعداد نگهدارندگان پروژه‌ها نیافزوده است  — این موجب ایجاد فشار بیشتر و بیشتر روی بخش‌های کانونی جوامع ما می‌شود که مساله بزرگی است.تقلای نگهدارندگان«هر چه موفق‌تر باشید، بیشتر توسط اعلان‌های[۵] گیت‌هاب مجازات می‌شوید» — نگهدارنده متن‌باز بودن چه حسی دارد؟نگهدارندگان نقاط کانونی اجتماعات هر پروژه متن‌بازی هستند. آن‌ها نه‌تنها در اغلب مواقع توسعه‌دهندگان اصلی پشت پروژه هستند، بلکه مسئولیت‌های دیگری هم دارند — باید کاربران را شاد نگه دارند، باید به مشارکت‌کنندگان رسیدگی کنند و یک جریان کار خوب را که به آن‌ها قابلیت مشارکت می‌دهد ایجاد کنند، باید به کسانی که برای اولین بار است مشارکت می‌کنند راهنمایی بدهند، باید PR[۶] ها را بررسی کنند، به انتشارها رسیدگی کنند، و سو و جهت کلی پروژه را حفظ کنند.«وضعیت فعلی — هر وقت که اعلانات[۵] گیت‌هابمو باز می‌کنم، افسرده و مضطرب می‌شم. برنامه‌نویسی خیلی فانه!»با این حال، ما واقعا نگه‌دارنده‌های جدیدی دریافت نمی‌کنیم. تعداد کاربران بسیار سریع رشد می‌کند، تعداد توسعه‌دهندگان رشد می‌کند — و با اینکه این دو چیز بسیار عالی هستند، اما فشار زیادی را روی نگه‌دارندگان پروژه‌ها ایجاد می‌کنند. و تمثیل «بازار» نیز اینجا بخشی از مشکل است — ما انتظار داریم که همواره شخصی پیش قدم شود، انتظار داریم که مشارکت کنندگان بیشتر و بیشتر درگیر پروژه شوند. اما واقعیت متفاوت است — نصف مشارکت‌کنندگان تنها یک بار مشارکت می‌کنند، و چیزی نزدیک به ۲٪ از کامیت‌ها را تشکیل می‌دهند. و هر مشارکتی کار اضافه‌ای را بردوش نگه‌دارنده اضافه می‌کند: یک PR جدید برای بررسی، و کد اضافه‌تری برای نگهداری است. البته که هر مشارکتی ارزشمند است و از آن استقبال می‌شود، اما در حالت کلی اجتماعات نرم‌افزار آزاد دارای مشکل جدی «دومین مشارکت» است — ما کار و تاکید زیادی برای بهینه‌بودن اولین تجربه مشارکت می‌کنیم — اما متاسفانه این منجر به ایجاد اعضایی که به طور طولانی با پروژه همراه باشند نمی‌شود.پایداری$۱۴۳,۰۰۰,۰۰۰ — مقدار تخمین زده شده از ارزش نرم‌افزار متن‌باز در خرید یک بیلیون دلاری Instagramجنبش نرم‌افزار‌های آزاد زمانی شکل گرفت که بیشتر نرم‌افزارهای جریان اصلی[۷] انحصاری بودند، خیلی استفاده نمی‌شدند، و هیچ تجارتی برپایه آن‌ها شکل نگرفته بود. اما امروزه، نرم‌افزار‌های متن‌باز در همه‌جا دیده می‌شوند — به اینترنت، سیستم‌‌عامل‌ها، و محصولات و نرم‌افزار‌هایی که روزانه از آن استفاده می‌کنیم قدرت می‌دهند. تصور ساخت نرم‌افزار‌های جدید بدون استفاده کردن از هیچ نرم‌افزار متن‌بازی بسیار سخت است و نرم‌افزار‌های متن‌باز توسط بزرگ‌ترین و محافظه‌کار‌ترین شرکت‌های جهان در انتخاب تکنولوژی نیز استفاده می‌شوند. ۱۰۰٪ از ۵۰۰ شرکت برتر Fortune از npm استفاده می‌کنند.با این حال، حتی بعضی از محبوب‌ترین پروژه‌های متن‌باز نیز در حال تقلا برای دریافت هرگونه بودجه، و ساخت هرگونه معنایی از پایداری هستند. اما ما به ساخت تجارت با استفاده از آن ابزارها و کتاب‌خانه‌ها ادامه می‌دهیم. می‌توان امیدوار بود که در آینده به نرم‌افزار‌های متن‌باز به عنوان زیرساخت‌های دیجیتال فکر کنیم  — که در این حالت، دقیقا مانند زیرساخت‌های معمولی، نیاز به بودجه‌های مداوم برای عملکرد مناسب خود دارند.طوری که درباره نرم‌افزار‌های متن‌باز صحبت می‌کنیم«دقیقا همانند زیرساخت‌های فیزیکی، زیرساخت‌های دیجیتال نیز نیاز به تعمیر و نگهداری مداوم دارند.» - جاده‌ها و پل‌ها: کارهای دیده نشده پشت زیرساخت‌های دیجیتال مااحتمالا برای حل برخی از آن مشکلات نیازداریم تا روشی که با آن درباره نرم‌افزار‌های متن‌باز صحبت می‌کنیم را تغییر دهیم — برای متقاعد کردن مدیرانمان به جای اینکه بگوییم باید در متن‌باز مشارکت کنیم چون رفتار «خوبی» است، یا چون «روحیه» تیم را افزایش می‌دهد باید با اصطلاحات تجاری صحبت کنیم — ریسک و فرصت. مشارکت کردن در پروژه‌ها ریسک پروژه‌های ما را به عنوان یک تجارت کاهش می‌دهد — ریسک اینکه نگهدارنده پروژه از پروژه خسته شود و ما با یک پروژه بدون نگهدارنده مواجه شویم را کاهش می‌دهد، ریسک نیازمند شدن به سایر افراد را در صورتی که در پروژه با مشکلی مواجه شویم را کاهش می‌دهد. مشارکت در پروژه همچنین یک فرصت است — ما می‌توانیم پروژه را شکل دهیم، قابلیت‌های جدیدی به آن اضافه کنیم که ما را قادر می‌سازد تا راه حل تجاری بهتری داشته باشیم.و ارزش جالب دیگر مشارکت در نرم‌افزار‌های آزاد، اهمیت خالص آن در بازاریابی است — مخصوصا اگر محصول شما یک جامعه فنی را هدف قرار می‌دهد. ما اکنون در عصر جنبش روابط توسعه‌دهندگان با یکدیگر زندگی می‌کنیم، جایی که هر شرکتی که در حال ساخت پروژه‌های نرم‌افزاری برای توسعه‌دهندگان است منابع زیادی را برای تبلیغات صرف می‌کند. مشارکت در متن‌باز یکی از بهترین روش‌های تبلیغات است. و حتی اگر تجارت شما در حال ساخت ابزارهایی برای توسعه‌دهندگان نیست، جذب توسعه‌دهندگان با استعداد را برای شما راحت‌تر می‌کند.راه حل؟ راه حلی ندارممن نمی‌دانم چطور می‌توان مشکلات جهان فعلی نرم‌افزار‌های آزاد را رفع کرد. اما کاملا آشکار است که نرم‌افزار‌های آزاد نیاز به تکامل دارند — ما نیاز به تعاریف جدید، راه حل‌های جدید و رهبرانی جدید برای جنبشی داریم که همین الان هم جهان را تغییر داده‌اند. نرم‌افزار‌های آزاد امروزه با مجموعه مشکلاتی بسیار متفاوت‌تر از ۲۰ سال گذشته دست و پنجه نرم می‌کنند، بنابراین استفاده از تمثیل‌هایی که ۲۰ سال قبل به وجود آمده‌اند ممکن است مسیر رو به جلو نباشد. و من معتقدم که ما باید هرچه سریع‌تر آن راه‌حل ها را پیدا کنیم... و یا معلوم می‌شود که ما قصرهای باشکوه خود را روی شن ساخته ایم.این پست انطباقی از ارائه «چالش‌های پس از جهان متن‌باز» من است که در رویدادهای مختلفی ارائه کرده‌ام. اگر دوست دارید که در کنفرانس و شرکت شما درباره نرم‌افزار‌های متن‌باز صحبتی داشته باشم، میتوانید با خیال راحت از طریق این ایمیل با من در تماس باشید: krzysztof_cieslak@windowslive.comاین پست و ارائه آن هر دو به شدت تاثیر گرفته از کار نادیا اقبال هستند.منابعChallenges of post-OSS world by Krzysztof Cieślakپانوشت[۱]: The Cathedral and the Bazaar[۲]: قانون لینوس. به عبارتی دیگر: «هرچه آزمایش‌کننده‌های برنامه و برنامه‌نویس‌های تیم نرم‌افزاری بیشتر باشند، تقریباً هر مشکلی سریع شناخته خواهد شد و اصلاح آن برای یک نفر مشخص و روشن خواهد بود.»[۳]: این آمار مربوط به سال انتشار این پست یعنی سال ۲۰۱۸ است[۴]: منظور چشم‌های ناظر قانون لینوس است[۵]: Notifications[۶]: Pull Request, aka Merge Request[۷]: Mainstram Software</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Thu, 01 Jun 2023 13:57:52 +0330</pubDate>
            </item>
                    <item>
                <title>مروری کوتاه و تاریخی بر زبان‌های برنامه‌نویسی Functional</title>
                <link>https://virgool.io/@avestura/short-historical-review-functional-programming-lambda-calculus-and-turing-kwpyrzfk8g1o</link>
                <description>برای درک بهتر انواع زبان‌های برنامه‌نویسی بهتر است کمی در تاریخچه کامپیوتر به عقب برگردیم. زمانی که آلن تورینگ از خود پرسید «محاسبه کردن به چه معناست؟». در حقیقت پرسش این است که وقتی می‌گوییم چیزی را محاسبه کرده‌ایم، چه کاری انجام داده‌ایم؟نتیجه تحقیقات آلن تورینگ در پرینتسون آمریکا به خلق ماشین تورینگ انجامید. یک ماشین مکانیکی که با چند جز شامل: نوار‌های قابل نوشتن و پاک کردن، یک Head برای نشان دادن نوار فعلی و مقادیر 0 و 1 روی این نوار‌ها ارائه شد.آلن تورینگ و ماشین مکانیکی‌اش معروف به ماشین تورینگشما برای انجام محاسبات در ماشین تورینگ به آن «دستور» می‌دهید که نوارهایش را جا‌به‌جا کند و یا روی نوار‌ها چیزی بنویسد تا در نهایت مقادیر روی نوار‌ها نتیجه مورد نظرتان را تولید کند. از همین رو، ماشین تورینگ یک ماشین «دستوری» است. فرمان‌های شما می‌تواند به شکل «این را روی نوار فعلی بنویس؛ نوار را به چپ ببر؛ مقدار روی نوار را بخوان؛ ...» باشد. در ادامه تحقیقات معلوم شد که این ماشین، یک ماشین محاسباتی بسیار قدرتمند است که توانایی محاسبه همه الگوریتم‌های محاسباتی را داراست. به عبارت دیگر، این ماشین می‌تواند هر محاسبه‌ای که کامپیوتر شخصی شما قادر به حساب کردن آن است را محاسبه کند. از این رو به این ماشین، و همه مدل‌های محاسباتی که در این حد قدرت دارند، Turing-complete می‌گویند.نکته جالب ماجرا اینجاست که در همین زمان، آقای «آلونزو چرچ»، ریاضی‌دان و منطق‌دان دانشگاه پرینستون که از قضا استاد آلن تورینگ هم بود، روی مدل محاسباتی دیگری مبتنی بر منطق و ریاضیات با نام «محاسبات لامبدا» کار می‌کرد. اگرچه آلن تورینگ و آلونزو چرچ از تحقیقات یکدیگر در این زمینه اطلاعی نداشتند و به طور مستقل کارهای خود را پیش می‌بردند، ولی نتیجه کار آن‌ها در مقایسه با یکدیگر به نتایج جالبی رسید.آلونزو چرچ و محاسبات لامبدابا اینکه مدل نشانه‌گذاری ریاضیاتی چرچ بسیار ساده به نظر می‌رسید، ولی در عین حال نیز بسیار قدرت‌مند ظاهر شد و قابلیت «توصیف» محاسبات مختلف را دارا بود. این باعث شد که ذهن دانشمندان مختلف به این سوال معطوف شود که آیا مدل ریاضیاتی چرچ که با «ارزیابی عبارت‌های ریاضی» محاسبات را انجام ‌می‌دهد، قدرتی به اندازه ماشین مکانیکی تورینگ که با «اجرای دستورات» محاسبه می‌کند دارد؟ یا خیر؟خروجی این تحقیق بسیار جالب بود: ماشین تورینگ و محاسبات لامبدای چرچ اگرچه دو مسیر متفاوت در محاسبات را پیش گرفته بودند، اما کاملا قدرت یکسانی داشتند. به عبارتی، هیچ الگوریتم و محاسباتی وجود ندارد که بتوانید با ماشین تورینگ انجام بدهید، ولی با محاسبات لامبدا قادر به انجام آن نباشید. از این رو، مدل محاسباتی چرچ، Turing-complete و مدل محاسباتی تورینگ، Church-complete تلقی می‌شود.این دو رویکرد در محاسبات در نهایت به دو جریان از طراحی زبان‌های برنامه‌نویسی منجر شد. 1- زبان‌های برنامه‌نویسی «دستوری» که شما در هر لحظه به زبان دستور می‌دهید که چه کاری را انجام دهد، و 2- زبان‌های برنامه‌نویسی فانکشنال در گروه زبان‌های «توصیفی» که مبتنی بر محاسبات لامبدای چرچ توسعه یافت. به تعبیری، محاسبات لامبدا، مادر زبان‌های برنامه‌نویسی تابعی است.همان‌طور که پیشتر نیز اشاره شد، در زبان‌های تابعی شما به «ارزیابی عبارت‌های ریاضیاتی» و در زبان‌های دستوری به «اجرای دستورات» می‌پردازید. تقریبا تمامی زبان‌هایی که می‌شناسید مانند C، C++، Go، Rust، Python، JavaScript، Ruby و Java جز زبان‌های دستوری تلقی می‌شوند، اگرچه ممکن است در طول زمان برخی از قابلیت‌های زبان‌های فانکشنال و محاسبات لامبدا را اضافه کرده باشند. پارادایم برنامه‌نویسی «شی گرایی» نیز زیر مجموعه‌ای از مدل‌های محاسباتی دستوری است.در مقابل زبان‌هایی مانند Haskell، OCaml، F#، Clojure، Scala، Lisp و Elixir زبان‌های فانشکال و از دسته زبان‌های توصیفی هستند. این زبان‌ها نیز ممکن است در طول زمان برخی از جریان کارهای دستوری (مانند ST Monad ها در Haskell) را اضافه کرده باشند.برخی از تفاوت‌های این زبان‌ها در لیست زیر آمده است. برای ملموس‌تر بودن قضیه، این مقایسه را بین زبان‌های شی‌گرا و فانکشنال انجام می‌دهیم:در زبان‌های شی‌گرا شما به زبان می‌گویید «این کار را انجام بده، سپس این کار را انجام بده و در نهایت این کار را انجام بده». در زبان‌های فانشکال شما چیزی که می‌خواهید را توصیف می‌کنید.در زبان‌های شی‌گرا دیتا Mutable و قابل تغییر است، و متد‌های کلاس‌ها Impure هستند. به این معنی که این متد‌ها میتوانند Side-effect داشته باشند. به عنوان مثال شما در حین اجرای تابع Max که قرار است ماکسیمم دو عدد را حساب کند میتوانید به دیتابیس وصل شوید و یا یک موشک را لانچ کنید! در مقابل، در زبان‌های تابعی مقادیر متغیر‌ها و ساختمان‌های داده شما Immutable هستند، و ساید افکت‌ها بسته به زبان برنامه‌نویسی ممکن است وجود نداشته باشد، و یا کنترل شده باشد.زبان‌های شی‌گرا برای پیشمایش از حلقه‌ها، و زبان‌های تابعی از توابع بازگشتی استفاده می‌کنند. از آنجایی که کامپیوتر‌های ما در سطح پردازنده به طور دستوری کار می‌کنند، زبان‌های تابعی باید عملیاتی به نام TCO (Tail-call optimization) را انجام دهند تا هم پرفورمنسی به اندازه حلقه‌ها داشته باشند و هم جلوی پرشدن Stack را بگیرند.در زبان‌های شی‌گرا از دید برنامه‌نویس مقادیر و متغیرها با متد‌های موجود در کلاس‌ها فرق می‌کنند. در حالی که در زبان‌های فانکشنال توابع مانند متغیر‌ها به اصلاح First-class هستند و به یک شکل تعریف می‌شوند. هرجایی که بتوان متغیری تعریف کرد میتوان تابعی تعریف کرد، و هر جا که می‌توان مقدار را پاس داد، میتوان تابعی پاس داد.یافتن اضلاع یک مثلث در زبان برنامه‌نویسی Haskellاز دیگر ویژگی‌های زبان‌های فانکشنال اعمال جزئی (Partial Apply)، اثبات بودن برای نظریه تایپ‌ها (Type Theory)، و ترکیب توابع (Composition) است.اعمال جزئیبا استفاده از قابلیت اعمال جزئی می‌توانید بدون اینکه تمامی پارامتر‌های مورد نیاز یک تابع را به آن پاس بدهید، آن را صدا بزنید. در این صورت، خروجی شما تابعی جدیدی خواهد بود که تنها نیاز به پارامتر‌های پاس نشده برای تولید خروجی دارد.در تکه کد بالا که به زبان F# نوشته شده است، stringRepeat نام تابع، و پارامتر‌های n و str ورودی‌های تابع هستند. در خط چهارم، بدون اینکه پارامتر دوم به تابع پاس شود، خروجی در مقدار/تابع repeat3Times ذخیره شده است که خود تابعی است که با دریافت یک رشته، یک رشته دیگر را خروجی می‌دهد.بدون نوشتن هیچ تایپی، کامپایلر به طور خودکار تایپ همه پارامتر‌ها را از روی نحوه استفاده آن‌ها در بدنه تابع تشخیص داده است.اثبات قضایادر زبان‌های برنامه‌نویسی فانکشنال و Static-type، تایپ‌ها برای برنامه شما یک «قضیه» (Theorem) محسوب می‌شوند، و کد‌هایی که شما که در بدنه توابع می‌نویسید یک اثبات برای این قضایا تلقی می‌گردند. به دلیل نزدیکی ریاضیاتی این نظریه‌ها، تقریباً تمامی زبان‌های برنامه‌نویسی که برای اثبات قضایای ریاضی به کار می‌روند زبان‌های فانکشنال هستند. این امر باعث می‌شود که از بسیاری از خطاها در زمان کامپایل و پیش از اجرای برنامه جلوگیری شود.ترکیب توابعسنگ‌بنای زبان‌های فانکشنال ترکیب توابع است. شما برای نوشتن یک نرم‌افزار مقیاس بزرگ، صرفا کافی است توابع مختلفی تعریف کنید و سپس این توابع را با یکدیگر ترکیب (Compose) کنید.در تکه کد بالا، تابع getFirstChar با دریافت یک رشته، کاراکتر اول آن را خروجی می‌دهد. همچنین تابع isLetter نیز تابعی است که چک می‌کند آیا کاراکتر ورودی حرف هست یا خیر؟حال ما می‌توانیم با ترکیب این دو تابع، تابع جدیدی تعریف کنیم که چک کند آیا کاراکتر اول یک رشته حرف است یا نه.بیشتر بخوانیدبرای مطالعه بیشتر این لینک را ببینید: «چرا باید اف‌شارپ رو یاد بگیریم و چه مزایا و کاربردهایی داره»</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Sat, 29 Jan 2022 11:12:59 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Status Code های HTTP با اشعار فارسی</title>
                <link>https://virgool.io/@avestura/http-status-codes-with-classic-persian-poems-%D8%A7%D8%B4%D8%B9%D8%A7%D8%B1-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-c411gfavgc6k</link>
                <description>429 HTTP Errorویرایش هفتم آبان‌ماه سال ۱۴۰۱:برای مهسا امینی‌ها، نیکا شاکرمی‌ها، نوید افکاری‌ها، و همه کسانی که خون‌شان به ناحق بر زمین ریخته شد. برای همه مظلومین ایران از شیراز تا زاهدان، از خزر تا خلیج همیشگی فارس...توی این پست قصد دارم برای هر کدوم از Status Code های HTTP یه شعر فارسی مرتبط بنویسم. اگه فکر میکنید در ارتباط با اون Status Code شعر بهتری میشناسید، یا اینکه میخواید Status Code ای رو که من پوشش ندادم به لیست اضافه کنید کامنت بذارید اضافه کنم.100 Continueهمه یک به یک پیش من بازگویسر قصه بگشا همه راز گویخواجوی کرمانی101 Switching Protocolطرح نو ای در سخن انداختمطرح سخن نوع دگر ساختموحشی بافقی102 Processingگر شوم مشغول اشکال و جوابتشنگان را کی توانم داد آبمولانا200 OKسال خرم، فال نیکو، مال وافر، حال خوشاصل ثابت، نسل باقی، تخت عالی، بخت رامحافظ201 Createdمدرسه با چند مسجد ساختمخانقه هم چند طرح انداختمعطار202 Acceptedاگر من سر در آوردم به دامتپذیرفتم همه گونه پیامتفخر الدین اسعد گرگانی203 Non-Authoritative Informationبه خلعت فرستاده را شاد کردبه پاسخ بسی نیکوی یاد کرداسدی توسی204 No Contentدیر است که دلدار پیامی نفرستادننوشت سلامی و کلامی نفرستادحافظ205 Reset Contentچو بر حکم‌ مجدد می‌رود تعلیق این مطلبمگر تعلیقهٔ نو جان من زین بند برهاندقاآنی206 Partial Contentآخر ای مطرب نگویی قصه دلدار ماگر نگویی بیشتر آخر بگویی اندکیمولانا300 Multiple Choiceبرو یک بیک بارگیها ببینکدامت به آید یکی برگزینفردوسی301 Moved Permanentlyگرفته راه دارالملک در پیششهنشه کوچ کرد از منزل خویشنظامی302 Found / 303 See Other / 307 Temporary Redirectچو گفت این حرف آن مرد یگانهفرستادش همی سوی خزانهعطار304 Not Modifiedتو در کارم نکردی هیچ تقصیرولی حکم قضا را نیست تغییرملا مسیح400 Bad Requestگفت یوسف هین بیاور ارمغاناو ز شرم این تقاضا زد فغانمولانا401 Unauthorizedچون بیامد پیش گفتش کیستی؟از یمن زادی و یا ترکیستیمولانا402 Payment Requiredبخواهم ز تو باج گفت اندکیازین چار چیزت بخواهم یکیفردوسی403 Forbiddenتا نگردی آشنا زین پرده رمزی نشنویگوش نامحرم نباشد جای پیغام سروشحافظ404 Not Foundاز کشت‌زار چرخ و زمین کاین دو گاو راستیک جو نیافتم که به خرمن درآورمخاقانی405 Method Not Allowedخواجه غلط کرده‌ای در روش یار منصد چو تو هم گم شود در من و در کار منمولانا406 Not Acceptableبر این در دعای تو مقبول نیستبه خواری برو یا به زاری بایستسعدی408 Request Timeoutحسب حالی ننوشتی و شد ایامی چندمحرمی کو که فرستم به تو پیغامی چندحافظ409 Conflictمرا تا ضعف عادت شد، تو را زورنخواهد بود این پیوند، مقدورپروین اعتصامی410 Goneدیشب به تو افسانه‌ی دل گفتم و رفتموز خوی تو چون موی تو آشفتم و رفتمرهی معیری411 Length Requiredکه تا هر کس اندازهٔ خویش راببیند بداند کم و بیش رافردوسی413 Payload Too Largeبا چنین جثه ندانم که چه سانبه در مرگ برون خواهی رفتجامی414 URI Too Longزبان خامه را کوتاه سازم از سر نامهکه در عرض شکایاتم حکایت گشت طولانیوحشی418 I&#039;m a teapotعاقبت آن دزد زر جام ثمینش را نیافتپیر ما خندید و گفتش من خود آن جام می ام421 Misdirected Requestاینجا چه نیافتم کسی را دمساززان در که بیامدم برون رفتم بازمولانا425 Too Earlyبگفتا پسر جان چه زود آمدییقین چون شکاری نبود آمدیافسرالملوک429 Too Many Requests (rate limit)هیچ پرسش را نخواهم گفت زین ساعت جوابزان که از من خیره و بیهوده بس پرسیده اندپروین اعتصامی451 Unavailable For Legal Reasonsبدو گفت موبد که فرمان شاهبیامد نماند مرا رای و راهفردوسی500 Internal Server Errorگفت: دکّــان مرا ایّــام بــستدیگرم کــاری نمی‌آید ز دستپروین اعتصامی502 Bad Gatewayدر شهر بستند یک باره تنگز دروازه بردند بر باره جنگاسدی توسی503 Service Unavailableامیدم به بخشایش تست بسبه چیزی دگر نیستم دسترسفردوسی504 Gateway Timeoutما بدان مقصد عالی نتوانیم رسیدهم مگر پیش نهد لطف شما گامی چندحافظ507 Insufficient Storageمرا سعد علی نانی همی دادنگنجید آن سخا و فضل در توسنایی508 Loop Detectedتا به گیسوی تو دست ناسزایان کم رسدهر دلی از حلقه‌ای در ذکر یارب یارب استحافظ</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Sat, 11 Sep 2021 02:06:44 +0430</pubDate>
            </item>
                    <item>
                <title>چرا باید اف‌شارپ رو یاد بگیریم و چه مزایا و کاربرد هایی داره؟</title>
                <link>https://virgool.io/@avestura/learn-fsharp-for-fun-and-profit-ox5rxavm9tq3</link>
                <description>پیش گفتارتو این نوشته سعی شده افراد با سطح دانش برنامه نویسی متوسط هدف قرار داده بشن، بنابراین اگه بیشتر میدونید خیلی راحت میتونید بخش هایی که بلدید رو رد کنید، و اگه جایی براتون مبهم بود، خجالت نکشید و تو کامنتا سوال بپرسید، سعی میکنم جوابتون رو هر چه سریع تر بدم، و یا اگه گسستگی مطلب در جایی دیدید بگید که اطلاعات بیشتری اضافه کنم.اف‌شارپ چیه؟اگه برنامه نویس باشید و توی Stack Overflow و آمار های سالیانش چرخ زده باشین احتمال زیاد هر سال اف‌شارپ رو جز زبان هایی که بیشتر میزان حقوق رو دارن دیدید، ولی تا حالا براتون سوال پیش اومده که این زبان چیه؟Top Paying Technologies - Stack Overflow Annual Survey (2019)اف‌شارپ (به انگلیسی: #F یا FSharp) یه زبان برنامه نویسی متن باز و کراس‌پلتفرم (قابل اجرا روی لینوکس و مک و ویندوز) هست که توسط موسسه تحقیقاتی مایکروسافت (Microsoft Research) ایجاد شد. این زبان، یه زبان تابعی (یا همون Functional) روی پلتفرم دات‌نت مایکروسافته که از پارادایم شی گرایی هم پشتیبانی میکنه. (این که زبان Functional و یا شی گرایی چیه رو جلوتر توضیح میدم).من با اف‌شارپ چیکار میتونم انجام بدم؟به طور خلاصه، هر کاری! این زبان، یک زبان کاملا عام منظورست و برای هر کاری میتونید ازش استفاده کنید، همچنین برای هر کیس خاص هم کتاب خونه ها و موتور های خاصی توسعه داده شده که احساس کمبود نمیکنید.نمونه هایی از کاربرد های اف‌شارپ:بازی سازی: این زبان کاملا سازگار با موتور بازی سازی معروف Unity هست. موتور های دیگه ای مثل Godot و یا کتاب خونه های بازی سازی مثل مونوگیم (Mono Game) هم با اف‌شارپ تمیز کار میکنن. اف‌شارپ موتور بازی سازی اختصاصی خودش به اسم Nu رو هم داره که با خود اف‌شارپ نوشته شده. اشاره به موتور های دیگه ای مثل Xenko یا Wave هم خالی از لطف نیست.برنامه نویسی وب: اف‌شارپ برای وب فوق العادست. این زبان خیلی راحت میتونه از طریق پروژه Fable با اکوسیستم جاوا اسکریپت ارتباط برقرار کنه و خیلی راحت میتونید توابع جاوا اسکریپت رو صدا بزنید. با پروژه Elmish میتونید فرانت اند خودتون رو به اف‌شارپ (که خیلی خلاصه تر از HTML هست) بنویسید و یا یه برنامه React رو با اف‌شارپ درست کنید. همچنین در کنار همه این موارد اف‌شارپ به WebAssembly هم اومده و میتونید برنامه اف‌شارپ خودتون رو بدون نیاز به کامپایل به جاوا اسکریپت روی مرورگر اجرا کنید. این پروژه Bolero نام داره و برای همه این موارد هم نمونه و مستندات آموزشی به اندازه کافی پیدا میشه. در انتها، اگه فکر میکنید که ممکنه این موارد سردرگم تون کنه، پروژه ای هست به نام SAFE-Stack که براتون یه قالب آماده از یه پروژه اف‌شارپ رو میسازه که از برنامه نویسی سمت سرور و API تا کلاینت و طراحی رابط کاربری رو داخل خودش داره که باهاش شروع کنید به ساخت ایده هاتون. برای ساخت یه وب‌سایت، به چیزی جز اف‌شارپ و دانش معمولی از وب نیاز پیدا نمیکنید.توسعه برنامه های موبایل: با اف‌شارپ و زامارین (Xamarin) میتونید خیلی راحت برای گوشی های اندرویدی یا آیفون‌تون بازی یا برنامه درست کنید و بفروشیدشون. همچنین با استفاده از Xamarin Forms میتونید یه برنامه واحد بنویسید و خروجیش رو هم برای اندروید و هم iOS بگیرید.برنامه نویسی دسکتاپ: با اف‌شارپ میتونید برنامه های دسکتاپ بسازید. این زبان از WinForms و WPF و همچنین Avalonia که برای ساخت برنامه های کراس‌پلتفرم استفاده میشه به طور رایگان و بدون محدودیت استفاده کنید.هوش مصنوعی، یادگیری ماشین و علوم داده: اگر به کارکردن تو این حوزه ها علاقه دارید، اف‌شارپ میتونه خیلی تجربه خوبی براتون به ارمغان بیاره، چرا که خوراک اف‌شارپ داده‌ست، مخصوصا با قابلیت Type Provider که مخصوص اف‌شارپ هست (این رو هم جلوتر توضیح میدم). میتونید از ML.NET و Tensorflow توی اف‌شارپ استفاده کنید؛ فرقی نمیکنه که تخمین‌گر قیمت میسازید، میخواید کلاه برداری رو شناسایی کنید، چهره رو توی عکس تشخیص بدید، احساسات نویسنده رو توی کامنت ها و نوشته ها تشخیص بدید و خیلی چیزای دیگه... اف‌شارپ برای همه این موارد قابل استفادست. همچنین Apache Spark و FsLab که یه پکیج کامل برای کار با پروژه های علوم دادست مخصوص برنامه نویس های اف‌شارپ وجود داره.اینترنت اشیا: اف‌شارپ برای توسعه اینترنت اشیا هم در کنار شماست. خیلی راحت میتونید اف‌شارپ رو روی رزبری پای خودتون راه بندازید و روی دستگاه های مختلفی ازش استفاده کنید.محاسبات ابری: از اف‌شارپ به شکل بومی و رسمی توی Azure که یک ارائه دهنده خدمات ابری هست پشتیبانی میشه و برای بقیه هم ازونجایی که اف‌شارپ روی دات‌نت کار میکنه میتونید استفاده کنید مثل GCP  و AWS و ...و ...: همون طور که میبینید، اف‌شارپ برای هر کاری میتونه مورد استفاده قرار بگیره، و همچنین خیلی از موارد دیگه که میتونید تو صفحه پروژه های اف‌شارپ پیدا کنید.گفتی اف‌شارپ یه زبان Functional ئه. این یعنی چی؟پارادایم های برنامه نویسی روش هایی هستن که باهاشون میتونیم زبان های مختلف رو بر اساس ویژگی هایی که دارن دسته بندی کنیم.پارادایم Object Oriented، پارادایمی از نوع زبان های برنامه نویسی دستوریه (Imperative)، یعنی اینکه برنامه شما در هر لحظه به ماشین میگه که حالت برنامه (بخوانید متغیر ها و همه المان های برنامه) رو چطور تغییر بده و برای لحظه به لحظه اتفاقی که میفته یه دستور کار داره. در حالی که پارادایم Functional از گروه زبان های توصیفی (Declarative) هست، یعنی شما فقط به ماشین میگید که اون حالت نهایی که مد نظرتون هست چه ویژگی هایی داره، بدون اینکه خودتون محاسبش کنید.زبان های Functional از اونجایی که به منطق و ریاضیات نزدیک تر هستن، اعتبار سنجی برنامه راحت تره، یعنی شما زمان کامپایل میتونید باگ های بیشتری رو بگیرید. در واقع میشه گفت در این زبان ها به جای اجرای برنامه (Execute)، از واژه ارزیابی برنامه (Evaluate) استفاده میشه، چون که توابع مثل توابع ریاضی فقط قراره محاسبه بشن، بدون اینکه در حین این محاسبه اتفاق بی ربطی مثل تغییر یه داده در یه گوشه از برنامه صورت بگیره. مثلا شما حین محاسبه مجموع صورت حساب یک مشتری در رستوران موشک هوا نمیکنید! و صدا زدن یک تابع با پارامتر های یکسان، همواره مقدار یکسانی رو برمیگردونه و هیچ چیزی در بیرون تغییر پیدا نمیکنه. به بیان دیگه شما عوارض-جانبی (Side-effect) ندارید. برای همین در اف‌شارپ همه چیز به طور پیشفرض غیر قابل تغییر (Immutable) هست، و شما نمیتونید بگید یه چیزی مساوی با 2 هست و پایین تر برابر با 3 کنیدش. (مگراینکه از کلید واژه mutable استفاده کنید)اگه این موارد براتون گنگ و یا نامفهومه، شاید با خوندن ادامه متن و یا دیدن نمونه هایی از کد های تابعی برطرف بشه، در هر حالت سوالی بود میتونید بپرسید.زبان هایی که میشناسید مثل پایتون، سی، جاوا، سی‌شارپ، سی‌پلاس‌پلاس، پی‌اچ‌پی، جاوا اسکریپت، روبی و ... همه زبان های دستوری هستند که به مرور زمان بهشون ممکنه قابلیت های تابعی هم اضافه شده باشه.بخش برنامه نویسی تابعی خیلی مفصله و داستان زیاد داره و من ازونجایی که نمیخوام این پست رو آکادمیک کنم و وارد مفاهیمی مثل Monad ها و محاسبات لامبدا و ... بشم به همین موارد بسنده میکنم، همین قدر هم برای شروع با این زبان ها و کلی کارای خلاقانه کردن کافیه پس از چیزی نترسید.نمونه از از یک برنامه دستوری (Imperative) به زبان سی‌شارپ:var list = new List&lt;int&gt; { 1, 2, 3 , 4};
int result = 0;
for(int i = 0; i &lt; list.Count; i++){
   result += list[i];
}
Console.WriteLine($&amp;quotSum: {result}&amp;quot);همین برنامه با زبان اف‌شارپ:let result = List.sum [1; 2; 3; 4]
printfn &amp;quotSum: %A&amp;quot resultاف‌شارپ چه ویژگی هایی داره؟اف‎شارپ ویژگی های مختلفی داره که ممکنه برات جالب باشه.۱- سمی کالناف‎شارپ برای اتمام دستوراتش به سمی‌کالن (;) نیاز نداره۲- فاصله گذاریاف شارپ مثل پایتون برای بلوک بندی کد از Indentation و فاصله‌ها استفاده میکنه، ولی نگرانش نباشید چون تو اف‌شارپ این فاصله گذاری‌ها ارورخیز نیست!let x = &amp;quotHello&amp;quot
let number =
    if x.Length &gt; 10 then 20
    else 30۳- توابع مانند متغیر ها شهروند درجه یک زبان هستنتوی اف شارپ تعریف توابع هیچ فرقی با تعریف مقادیر نداره و همشون با کلید واژه let ایجاد میشن و هرجایی هم میتونید مقدار و تابع تعریف کنید.let myName = &amp;quotAryan&amp;quot
let myAge = 21

let addGreetingsToName name (age:int) =
    $&amp;quotHello {name}! You are {age} years old!&amp;quot

addGreetingsToName myName myAgeدر کد بالا addGreetingsToName یک تابع هست. همون طور که احتمالا متوجه شدید توی اف‌شارپ برای نوشتن پارامتر ها و یا دادن پارامتر تابع نیازی به نوشتن پرانتز و یا کاما ندارید و فقط با یک فاصله گذاشتن میتونید به پارامتر ها مقدار بدید (اگرچه میتونید به فرم سنتی پرانتز و کاما هم بنویسید). این نوع نحوه نوشتار یه مزیت خیلی بزرگ داره که تو بخش بعدی یعنی اعمال جزئی میبینیم.۴- اعمال جزئی یا Partial Applicationتو اف‌شارپ میتونید توابع رو Partially Apply کنید، یعنی به تابعی کم تر از مقداری که نیاز داره پارامتر بدید. نتیجه تولید شده تابع جدیدیه که فقط پارامتر های پاس داده نشده رو نیاز داره.let someFunction param1 param2 param3 =
    param1 + (2 * param2) - param3

let anotherFunction = someFunction 10 20

let result = anotherFunction 30 // calculates 10 + (2 * 20) - 30در این مثال تابعی تعریف شده به اسم someFunction و سه پارامتر میگیره به اسم param1 تا param3. توی خط بعد من یه تابع جدید ساختم که با دادن پارامتر های اول و دوم، فقط یه پارامتر باقی مونده رو میگیره و مقدار زیر رو حساب میکنه:10 + (2 * 20) + param3۵- تعریف نوع های جدید و رکورد ها تو اف‌شارپ کوتاه و آسونهtype Gender =
    | Male
    | Female
    | Other of string

type Person =
    { name : string 
      age : int
      father : Person option
      mother : Person option
      gender : Gender }در نمونه کد بالا ما دو نوع تعریف کردیم یکی برای جنسیت، و یکی دیگه برای شخص. شخص با پارامتر های نام، سن و جنس تعریف شده، و همچنین دو ویژگی اختیاری (option) به نام پدر و مادر۶- پایپ همه جا! (|&gt;)پایپ یا خط لوله ویژگی ای از اف‌شارپه که همه جا تو اف‌شارپ میبینیدش. پایپ هم یک اپراتور هست، مثل اپراتور های ریاضیات مثل جمع و ضرب با این تفاوت که پایپ یه مقدار رو به تابع جلوییش پاس میده و در واقع مثل یک خط تولید در کارخونه عمل میکنه:let car = Car(name = &amp;quotMy Car&amp;quot)

car
|&gt; paintBody green
|&gt; paintRoofs red
|&gt; testStrength
|&gt; driveدر این مثال ابتدا یک ماشین جدید ساختیم، و بعد با خط لوله پاسش دادیم به تابعی که بدنش رو سبز رنگ کنه، در مرحله بعد این ماشین با بدنه سبز رو به تابعی دادیم که سقفش رو قرمز میکنه، در مرحله بعدی سپردیمش به تیم تست قدرت ماشین، و در نهایت باهاش رانندگی کردیم.۷- استاتیک تایپ همراه با استنتاج نوع (Type Inference)زبان اف‌شارپ یه زبان Static Type هست، یعنی اینکه زمان کامپایل نوع و تایپ همه چیز معلومه. به همین خاطر خیلی از خطا های برنامتون از جهات منطقی هنگام مرحله کامپایل گرفته میشه. از طرفی کامپایلر اف‌شارپ باهوش هم هست و میتونه نوع پارامتر یا متغیر ها و تابع ها و غیره رو از روی کاربردش استنتاج کنه. به عنوان مثال اگه من در ادامه مثال بالا نمونه ای با دادن نام و جنسیت و ... تعریف کنم، خود کامپایلر میفهمه که من یک انسان رو تعریف کردم. در واقع شما مثل پایتون تایپ ها رو نمینویسید، ولی از اون طرف مزیت های استاتیک تایپینگ رو هم دارین.// infers as Person
let someGuy =
    { name = &amp;quotMohsen Mehdinia&amp;quot
      age  = 31
      gender = Male
      father = None
      mother = None }someGuy binding infered as Person typeدر این مثال دوم فرض کنید من میخوام تابعی بنویسم که لیستی از اسامی رو بگیره و به همه این اسامی خوش‌آمد بگه:let greet names =
    names |&gt; List.iter (fun name -&gt; printfn &amp;quotHello %s!&amp;quot name)در کد بالا اول از همه تابع greet با پارامتر names رو تعریف کردیم و در بدنه تابع مقدار names رو پایپ کردیم داخل تابع iter که مخصوص پیمایش روی لیست و انجام کار روی هر آیتم از لیسته. این تابع باید بدونه که به ازای هر آیتم از لیست باید چه کاری انجام بده پس به یک تابع دیگه نیاز داره.میتونیم این تابع رو یک جای دیگه تعریف کنیم، و یا همونجا جلوی iter با کلید واژه fun یک تابع جدید تعریف کنیم که پارامتر name رو میگیره و یه کاری باهاش انجام میده.حالا بازی اصلی شروع میشه! کامپایلر اینجا خودش استنتاج میکنه که پارامتر names از نوع لیستی از string هاست و همچنین تابع greet از نوع:string list -&gt; unitهست. این یعنی که این تابع لیستی رشته ها رو میگیره و یک unit برمیگردونه. unit یا واحد به این معنیه که تابع فقط یه کاری انجام داده و مقداری برنگردونده (در واقع میتونید به unit به همون شکل void در سایر زبان ها نگاه کنید). این فقط یه نمونه ساده بود و میتونید نمونه های خیلی پیچیده تری هم که کامپایلر قادر به تشخیص نوع هست رو هم در مثال ها ببینید.۸- ترکیب توابع یا Compositionترکیب توابع هم از مواردی هست که زیاد تو اف‌شارپ میبینید. به مثال زیر نگاه کنید:let countCharacter char (str:string) =
    str.ToCharArray()
     |&gt; Array.filter (fun c -&gt; c = char)
     |&gt; Array.length

let isMoreThanTen len = len &gt; 10اینجا دو تابع تعریف کردیم یکی به نام countChar که یک رشته و یک کاراکتر رو به عنوان پارامتر میگیره و میشمره که توی اون رشته چند بار کاراکتر مورد نظر ما دیده شده. همچنین تابعی وجود داره به اسم isMoreThanTen که یک عدد رو میگیره و میگه که اون عدد بیشتر از 10 هست یا نه. همون طور که حدس زدید هم تایپ این دو تابع به این شکله:countChar : char → string→ intisMoreThanTen : int → boolحالا فرض کنید ما میخوایم تابعی بنویسیم که به ما بگه آیا تعداد کاراکتر های حرف b داخل یک متن بیشتر از 10 هست یا نه. خیلی راحت میتونیم این دو تابع رو به این شکل و با استفاده از اپراتور (&gt;&gt;) ترکیب کنیم:let hasMoreThanTenB = countCharacter &#039;b&#039; &gt;&gt; isMoreThanTenو من حالا میتونم به این شکل فراخوانیش کنم:hasMoreThanTenB &amp;quotOh baba, what a boooablabo&amp;quotتایپ این تابع نهایی هم به این شکل هست:hasMoreThanTenB : string → bool۹- تطبیق الگو یا Pattern Matchingبا استفاده از این ویژگی زبان شما میتونید روی انواع و اقسام متغیر ها و توابع و زیر مجموعه هاشون الگویابی کنید و در صورت تطبیق الگو کار مورد نظرتون رو انجام بدید. (تطبیق الگو در زبان های برنامه نویسی یه جورایی مثل نوشتن RegEx روی رشته های زبان های طبیعی میمونه)type Suit = 
    | Diamond
    | Spades
    | Hearts
    | Clubs

type Rank =
    | Ace
    | King
    | Queen
    | Jack
    | NumberRank of int

type Card = Rank * Suit

let getScore card =
    match card with
    | (Ace, Spades) -&gt; 20
    | (King, Hearts) | (Queen, Hearts) -&gt; 15
    | (NumberRank x, Spades) -&gt; (x % 5) * 2
    | _ -&gt; 0در نمونه کد بالا ما اول سه تایپ یکی برای شکل کارت، یکی دیگه برای مقدار روی کارت، و یکی هم برای خود کارت که ترکیبی از شکل و مقدار کارت هست تعریف کردیم. (علامت * برای ترکیب شکل و مقدار کارت که تایپ جدیدی تولید کرده، همون ضرب دکارتی ریاضیات روی مجموعه مقادیر هست که مجموعه مقادیر جدید ایجاد میکنه و از فضا نیومده)حالا ما تابعی نیاز داریم که به ازای یک سری کارت خاص به کاربر امتیاز بدن، همون طور که میبینید این تابع به ازای آس پیک 20 امتیاز برمیگردونه، به ازای شاه یا بی‌بی دل 15 امتیاز، به ازای هر عددی از پیک ها، ابتدا اون عدد در پیمانه پنج حساب میشه و سپس ضرب در 2 شده و برگشت داده میشه، و در غیر این حالات امتیازی تعلق نمیگیره. میبینید که بدون نیاز به if های متوالی به شکل خیلی ساده همچین تابعی ممکن شد. زبان اف‌شارپ از الگو های خیلی زیاد و متنوعی پشتیبانی میکنه که میتونید از مستنداتش مطالعه کنید.۱۰- تهیه کننده نوع یا Type Providerتایپ پروایدر ها، قابلیت هایی از زبان اف‌شارپ هستن که براتون از یه فایل یا هر منبع دیگه ای تایپ تولید میکنن. به عنوان مثال شما بهش فایل csv یا json و ... به عنوان ورودی میدید و تایپ پروایدر براتون تجزیش میکنه و علاوه بر اینکه توی محیط توسعه تون براتون Auto Complete یا Intellisense میاره، تایپ چک هم میشه و اگه برنامه در رابطه با اون داده ها باگ داشته باشه، کامپایلر بهتون اطلاع میده.A JSON Type Provider sample in F#۱۱- پشتیبانی کامل از دات‌نت و همکاری بدون مشکل با سایر زبان های دات‌نت مثل سی‌شارپاف‌شارپ یکی از زبان های رسمی دات‌نته و میتونه از پروژه های سایر زبان های دات‌نت مثل پروژه هایی که با سی شارپ نوشته شدن استفاده کنه، و یا داخل یک Solution میتونید هم پروژه سی‌شارپ و هم اف‌شارپ داشته باشید و این پروژه ها بدون مشکل هم رو صدا بزنن.عملا هر مزیتی برای دات‌نت وجود داره، اف شارپ هم میتونه ازش استفاده کنه و گسترشش بده.۱۲- سایر...اف‌شارپ کلی قابلیت خفن دیگه داره مثل واحد های اندازه گیری ( Units of Messure) که میتونید به هر متغیر عددی واحد بدید (مثل کیلوگرم، کیلو وات، گیگا بایت و ... حتی واحد های سفارشی خودتون) و این واحد ها توسط کامپایلر تایپ چک میشن، همچنین تایپ های ناشناس، ماژول سیستم خوب، ارتباط بومی با سیستم، Computational Expressions یا عبارات محاسباتی که یکی از قدرت مند ترین ساختار های زبانی اف‌شارپه، بهینه سازی TailCall و خیلی چیز های دیگه... که توضیحشون خارج از این پست هست.مقایسه اف‌شارپ با سایر زبان هاپایتون: همون طور که دیدیم، اف‌شارپ مثل پایتون از Indentation استفاده میکنه و خیلی جاها نیازی به نوشتن تایپ ها نیست، لایبرری های خیلی خوبی برای هوش مصنوعی داره که میتونید مدل تون رو باهاش train کنید، در کنار اون استاتیک تایپ هست و اعتبار منطقی برنامه رو بالا میبره و در برنامه های بزرگ به باگ خیلی کمتری میخورید. جاوا اسکریپت: اف‌شارپ برای برنامه نویس های جاوا اسکریپت هم دوست خوبیه. چرا که با Fable عملا به لایبرری های گذشته تون دسترسی دارید و میتونید خیلی راحت برنامه نویسی Front-end انجام بدید.سی‌شارپ: اگه برنامه نویس دات‌نت هستید، قطعا اف‌شارپ رو یاد بگیرید. اولش ممکنه گیج کننده باشه، ولی بعدا دیگه حتی دوست ندارین به سی‌شارپ برگردین. دیفالت های اف‌شارپ خیلی کدتون رو کمتر میکنه و در عین حال چون با دات نت آشنایی دارین، خیلی خیلی کارتون برای یادگیری آسون تر میشه.هسکل (Haskell): هسکل به نوعی بابابزرگ زبان های تابعی شناخته میشه و اونقدر از نظر ساخت زبانی قوی و منطقی هست که نه تنها رو زبان های تابعی مثل اف‌شارپ، بلکه روی زبان های mainstream هم تاثیر زیادی داشته. اگرچه بعضی از ویژگی های هسکل توی اف‌شارپ نیست (قراره اضافه بشه)، ولی شما به کل اکوسیستم دات‌نت دسترسی پیدا میکنین. کم نبودن هسکلر هایی که بعد از کار با اف شارپ بهشون حس اینکه تو خونه خودشون هسکل هستن دست داده.وضعیت ابزارهای توسعه برای اف‌شارپ چجوریه؟اف‌شارپ برای توسعه رسما توسط مایکروسافت پشتیبانی میشه، و این یعنی اینکه شما میتونید خیلی راحت داخل ویژوال استودیو اف‌شارپ بنویسید. همچنین اگه طرفدار محصولات JetBrains هستید و قبلا با PyCharm یا IntelliJIdea یا PhpStorm و ... تجربه داشتید، میتونید از JetBrains Rider استفاده کنید که از اف‌شارپ پشتیبانی میکنه.ولی جدای همه اینا اگه نظر منو بخواید، من افزونه Ionide برای VSCode رو بهتون توصیه میکنم. این افزودن قابلیت های خارق العاده ای داره که حتی برای زبان های پر استفاده تر هم پیدا نمیشن مثل ابزار های یکپارچه شده با بلید سیستم و یا قابلیت Info Panel. سایتش هم اینجاست:http://ionide.ioاوف! میخوام اف‌شارپ یاد بگیرم.خیلی هم عالی! منابع خیلی زیادی برای شروع وجود داره.سایت «بنیاد اف‌شارپ»https://fsharp.orgسایت «اف‌شارپ برای سرگرمی و سود»https://fsharpforfunandprofit.comسایت اف‌شارپ در دات‌نتhttps://dotnet.microsoft.com/languages/fsharpبیشتر بخوانیدمروری کوتاه و تاریخی بر زبان‌های برنامه‌نویسی Functionalسوالی داشتم که تو متن جواب ندادی!این پایین بپرس ↓</description>
                <category>آرین ابراهیم‌پور</category>
                <author>آرین ابراهیم‌پور</author>
                <pubDate>Tue, 25 Jun 2019 20:01:22 +0430</pubDate>
            </item>
            </channel>
</rss>