یک track کامل در Exercism دو نوع exercise دارد: Concept Exercise و Practice Exercise. این دو اساساً با هم متفاوتاند و بهخوبی مکمل یکدیگرند.
Concept Exerciseهای یک track، exerciseهایی هستند که برای آموزش مفهومهای تکتک طراحی شدهاند؛ همان مفهومهایی که پایهی یک زبان برنامهنویسی مشخص را میسازند. همین مفهومها یک syllabus را شکل میدهند.
این مستندات نکتهها و راهنماییهایی دارد دربارهی اینکه چطور یک syllabus را برای track خود با موفقیت طراحی کنید.
هدف نهایی یک syllabus این است که دانشجوها به جایی برسند که خواندن و نوشتن کد اصطلاحی در زبان مقصد برایشان راحت باشد.
هر Concept Exercise بهتنهایی بسیار متمرکز است. گامی کوچک و بسیار هدفمند است که دانشجو را به سمت درک جنبهای از زبان پیش میبرد. این exercise فقط بر مفهومهایی بنا میشود که پیشتر معرفی شدهاند.
دانشجو با حل کردن exercise، کمکم با آن مفهوم آشنا میشود. درک بیشتر از راه انجام دادن به دست میآید، نه از راه توضیح دادن. محتوای توضیحی آنجاست تا دانشجو را با ایدههایی آشنا کند که برای حل exercise به آنها نیاز دارد (و از همین رو نام فایل introduction.md انتخاب شده است).
میخواهیم دانشجوها بتوانند بلافاصله شروع به نوشتن کد کنند، بدون اینکه لازم باشد از همان ابتدا همهی جزئیات را بفهمند. برای رسیدن به این هدف، از کنار جزئیات سرسری میگذریم و خیلی از موارد را توضیح نمیدهیم. تا جایی که ممکن باشد، سادهسازی میکنیم و یک stub کد در اختیارشان میگذاریم. این کار بار شناختی شروع کردن را کم میکند و زمان و فضایی میدهد تا دانش تازه جا بیفتد. با این رویکرد نمیگوییم که دانشجو به دانستن این موارد نیازی ندارد؛ میگوییم که هنوز به دانستنشان نیاز ندارد.
اغلب exerciseهای نخستین باید در خود کد غیراصطلاحی داشته باشند. چون در آغاز، بیشتر زبان برای دانشجو هنوز ناشناخته است و بیشتر مفهومها هنوز معرفی نشدهاند. با اجازه دادن به کد غیراصطلاحی در نخستین exerciseها، دانشجوها میتوانند در قلمروی آشنا گامهای کوچک زیادی بردارند، نه چند گام بلند در قلمروی ناآشنا. نتیجه این است که سریعتر و با اصطکاک کمتری به سطح کد اصطلاحی میرسند.
exerciseها به شکل یک درخت سازمان مییابند که یک exercise مقدماتی در بالای آن، نقطهی شروع است. exerciseهای بعدی مفهومهایی را میآموزند که فهمیدنشان مستلزم درک مفهومهایی است که پیشتر آموزش داده شدهاند.
ممکن است ارزشمند باشد که ببینید trackهای زبانهای دیگر Concept Exerciseهایشان را چطور ساختهاند. نمونههایی از Concept Exerciseها از trackهای زبانهای دیگر را میتوانید اینجا پیدا کنید.
با این حال، اگر تصمیم گرفتید از exerciseهای دیگر به عنوان نقطهی شروع برای exercise خودتان استفاده کنید، حواستان باشد که exercise به دست آمده دربارهی همان مفهومی باشد که در زبان شما وجود دارد. مفهومها گاهی کمی با هم فرق دارند و گاهی کاملاً؛ و بعضی وقتها اصلاً در زبانهای دیگر وجود ندارند.
syllabus و در نتیجه درخت مفهوم باید همان مفهومهایی را بازتاب دهد که در این زبان مشخص وجود دارند.
مفهومها را فقط به این دلیل که trackهای دیگر دارند، وارد نکنید.
در بعضی موارد وسوسه میشوید مفهومی را اضافه کنید چون افراد اغلب ناچارند با به کار بردن مفهومهایی که واقعاً وجود دارند، دور آن بزنند. به جای این کار، همان مفهومی را معرفی کنید که زبان واقعاً به کار میبرد و به این فکر کنید که exerciseای اضافه کنید که توضیح دهد در آن نوع موقعیت چطور از آن استفاده کنیم.
برای مثال، در Go نوع enum وجود ندارد. در عوض، درخت مفهوم Go ثابتها را معرفی میکند و میآموزد چطور از ثابتها در همان موقعیتی استفاده کنیم که در زبانهای دیگر ممکن است از enum استفاده کنیم.
برای درخواست کمک تردید نکنید. بهتر است از همان ابتدا یا در حین کار روی exercise بپرسید، نه اینکه وسط code review دربارهاش بحث کنید.
در GitHub میتوانید تیم @exercism/learning-mode را منشن کنید. در انجمن Exercism یک issue در دستهی «Exercism Support» باز کنید.
تجربه به ما آموخته که کاربردیترین راه برای توسعهی syllabus این است که درخت مفهوم را به شکلی طبیعی و تدریجی رشد دهیم و از سادهترین مفهومها شروع کنیم. لازم نیست همهی جزئیات را از پیش طراحی کنیم؛ و در واقع، عموماً مفید است که خیلی جلوتر را در نظر نگیریم.
ما با حداقل مفهومهای لازم شروع میکنیم؛ همانهایی که برای نوشتن هر کدی در آن زبان بنیادیتریناند. همچنین تلاش میکنیم با مفهومهایی شروع کنیم که برای برنامهنویس معمولی آشناترند. آشنایی خوب است. آشنایی گیجکننده نیست.
یادتان باشد، هرچند نقطهی پایان نوشتن کد اصطلاحی است، پلههای میانیِ رسیدن به آن همیشه اصطلاحی نیستند. استفاده از آنچه آشناست، حتی اگر نمونهی خوبی از کد آن زبان نباشد، به دانشجو کمک میکند سریعتر به هدفِ کدی برسد که به آن زبان شبیهتر است.
به جای اینکه بخواهید از همان ابتدا کل درخت مفهوم را ترسیم کنید، فقط با اولین exercise شروع کنید. هدف اولین exercise این است که دانشجو با کمترین اصطکاک ممکن یادگیری را شروع کند. او اولین قدم را برای آشنایی با ظاهر کد در این زبان برمیدارد. ممکن است مقدار کمی کد بنویسد، یا شاید فقط چند مورد به یک stub اضافه کند تا exercise را کامل کند. دانشجوها برای دسترسی به این exercise از قبل «Hello, World!» را حل کردهاند. اما در «Hello, World!» فقط نوشته را تغییر میدهند. ممکن است تمام نحوهی نگارش آن زبان هنوز برایشان ناآشنا باشد. تلاش کنید روی یک پیروزی سریع و آشنا کردن دانشجو با حداقلِ ضروری نحوهی نگارش تمرکز کنید، تا با اطمینان جلو برود.
بیشتر دربارهی توسعهی اولین exercise بخوانید.
اولین exercise باید چند exercise را باز کند که مفهومهای بنیادی را معرفی میکنند. اینها مواردی مانند انواع اولیه یا نوعهای پایه و عملیات ساده روی آن نوعها را در بر میگیرند.
بیشتر دربارهی توسعهی exerciseهای بعدی بخوانید.
اینجا همان جایی است که ماجرا اغلب جالب میشود. موارد بسیار زیادی هست که در این نقطه میتوانید معرفی کنید. چطور تصمیم میگیرید سراغ کدام مفهومها بروید؟
تقریباً اهمیتی ندارد. تا وقتی از جایی شروع کنید که منطقی به نظر برسد، خوب پیش میرود.
بیشتر بخوانید که از نظر ما «منطقی» در زمینهی گسترش درخت مفهوم چه معنایی دارد.
یک Concept Exercise خوب بهشدت متمرکز است و در حالت ایدهآل فقط یک مفهوم را میآموزد. معمولاً فقط یک رویکرد مورد انتظار برای حل آن وجود دارد. این در تقابل با Practice Exerciseهاست که باز و آزادند و دعوت به کاوش میکنند.
یک Concept Exercise خوب معمولاً یک Practice Exercise بد است و برعکس. چون هدف Practice Exerciseها و Concept Exerciseها کاملاً متفاوت است، ما Practice Exerciseها را برنمیداریم و به Concept Exercise تبدیل نمیکنیم. همهی Concept Exerciseها را از صفر مینویسیم یا آنها را بر پایهی داستانهایی میسازیم که مشخصاً برای آموزش مفهومهای ساده نوشته شدهاند.
بعضی وقتها احساس میکنید بنبست پیش آمده است. مفهوم A نیازمند درک مفهوم B است و B نیازمند درک A.
در این حالت سادهسازی کنید. از بخشی از پیچیدگی یکی از آنها سرسری بگذرید تا بتوانید دانشجو را با دیگری آشنا کنید. کاملاً اشکالی ندارد بگویید که بعداً با عمق بیشتری به آن پرداخته میشود و دانشجو فعلاً فقط باید همین یک بخش را بفهمد.
مفهومها مرحلهبهمرحله و در گذر زمان عمیقتر فهمیده میشوند.
هر concept exercise همیشه یک داستان دارد.
اگر exerciseی را از track دیگری فورک میکنید، آن exercise از قبل داستان دارد. در آن صورت کارتان آماده است.
برای دیدن اینکه داستانهای موجودی برای استفاده یا exerciseهایی برای فورک کردن هست، فهرست داستانها را ببینید.
اگر مفهوم دارید اما داستان ندارید، پیشنهاد ما این است که یک نمونه کد کوچک و ساده بنویسید که از مفهومی استفاده کند که دارید معرفی میکنید. سپس با مهندسی معکوس، داستانی برای آن کد بسازید. داستان را خیلی خیلی ساده نگه دارید. لازم نیست داستان خوبی باشد. نیازی به پیرنگ قوی یا شخصیتپردازی ندارد. میتواند فقط چند خط باشد.
ایدههای داستانی را با تیم Exercism در میان بگذارید. ما تجربهی زیادی در ساختن داستانهای مناسب داریم.
وقتی داستان را داشتید، احتمالاً باید کد را کمی تغییر دهید تا با داستان جور شود.
کار روی syllabus دو فعالیت جدا اما درهمتنیده را در بر میگیرد:
دیدهایم که مشارکت دادن جامعهی گستردهتر در پیادهسازی exerciseها هم لذتبخش است و هم غنیکننده. اما خودِ طراحی syllabus با یک تیم کوچک از مشارکتکنندهها راحتتر پیش میرود، تیمی که همهشان درگیر ساختن درکی از کل syllabus با تمام پیچیدگیهایش هستند.
با این حال، توصیه میکنیم تیم طراحی syllabus ابتدا پنج یا شش مفهوم اول را پیادهسازی کند و بعد درها را به روی مشارکتهای جامعه باز کند. این کمک میکند مطمئن شویم اعضای تیم اصلی طراحان syllabus پیش از آنکه مجبور شوند pull requestهای افراد جامعهی گستردهتر را بازبینی کنند، خودشان فرایند را درک کردهاند.
همچنین ساختن issue برای این مفهومهای سطحبالاتر راحتتر است و کار کردن روی آنها برای اعضای جامعه سرگرمکنندهتر است، چون محدودیتهای کمتری برای نگرانی وجود دارد.
ما هنوز نفهمیدهایم که بهترین راه ساختن issue برای ساخت concept exerciseها چیست.
در بعضی trackها امتحان کردهایم که برای خود مفهوم و برای exercise، exerciseهای جداگانه بسازیم. در بعضی دیگر، issueهایی ساختهایم که یک چکلیست برای انجام دادن دارند. در کل فکر میکنیم این کار هنوز زیادی ترسناک است و دوست داریم راه بهتری پیدا کنیم.
لطفاً وقتی شروع به ساختن issueها کردید، دربارهی این فرایند با ما حرف بزنید؛ ما هم بهترین تلاشمان را میکنیم تا راه ادامه دادن را پیدا کنیم.
هر وقت راههای بهتری برای این کار یاد گرفتیم، مستندات را بهروزرسانی میکنیم.