باشگاه کدزنی یا Coding Dojo

چند هفته قبل شروع کردم به خوندن کتاب Refactoring از مارتین فاولر. بخش‌های ابتدایی کتاب که تموم شد و به کاتالوگ روش‌های بازسازی رسیدم، دیدم که خوندن این‌ها بدون به‌کار گرفتن و تمرین، فایده‌ای نداره. از طرف دیگه، مدت‌ها قبل در مورد Coding Dojo خونده بودم و به ذهنم رسید که شاید بتونم Kataهایی برای بازسازی کد پیدا کنم. همین باعث شد تا سر از کتاب The Coding Dojo Handbook در بیارم! در این نوشته، که ترجمه و تلخیصیه از پیش‌گفتار و فصل اول این کتاب، از اهمیت تمرین هدفمند برای بهبود مهارت‌های کدنویسی می‌گم و اینکه چه عناصری باشگاه کدزنی رو از بقیه دورهمی‌های کدنویسی متمایز می‌کنه. در ادامه چند روش برای برگزاری این دورهمی گفته میشه و در آخر،‌ روش‌هایی برای کش اومدن ؛)به روزرسانی فروردین ۹۹: با انتشار اولین کاتای ویدیویی،‌ فعالیت «باشگاه کد‌زنی» روی یوتیوب و آپارات شروع شد. میتونین تو کانالم عضو بشین و Notificationش رو فعال کنین تا از انتشار ویدئوهای بعدی باخبر بشین.این جوک رو شنیدین؟ جوانی گیتار به دست تو مترو بود؛ یکی از اعضای گروهی که اون شب در تالار کارنِگی اجرا داشت و داشت دیرش می‌شد. از مترو زد بیرون و پله‌ها دو تا یکی اومد بالا ولی به خیابون که رسید متوجه شد که گم شده. می‌دونست تالار نزدیکه اما نمی‌دونست دقیقا کدوم سمتیه. از پیرمردی که رد می‌شد پرسید: «ببخشید آقا؛ چطور می‌تونم به تالار کارنِگی برسم؟» و پیرمرد نگاهی به جوان و گیتارش انداخت و گفت: «با تمرین پسر، با تمرین!»باشگاه کدزنی چیه؟همه‌ی پیشه‌ورزها تمرین می‌کنن. نوازنده‌ها، ورزشکاران و حتی وکلا، تمرین می‌کنن. اما ما برنامه‌نویس‌ها چطور؟ بله، ما کد می‌نویسیم، خیلی کد می‌نویسیم؛ تو محل کارمون و توی خونه. چون ما عاشق کد نوشتن هستیم. اما همه‌ی تمرین‌ها یکی نیستن و بعضی‌شون بهتر از بقیه هستن. ورزشکاران حرفه‌ای، هم مبارزات رو تمرین می‌کنن، هم سرمشق‌ها رو. نوازنده‌ها، هم اجراهاشون رو تمرین می‌کنن، هم اتودها و گام‌نوازی رو. این شکل‌های دوم تمرین، برای تاکید (و در نتیجه بهبود) مهارت‌های خاص طراحی شدن؛ به خصوص مهارت‌هایی که سخت به دست میان و ساده از دست می‌رن.کل «باشگاه کدزنی»‌ (Coding Dojo) در مورد همینه: روشی خاص برای تمرین با تاکید بر روی مهارت‌هایی مشخص که برای برنامه‌نویس‌ها سخت به دست میاد و ساده از دست میره. مهارت‌هایی مثل همکاری، توسعه‌ی تست‌محور (TDD)، بازسازی کد، طراحی خوب و... . یادگرفتن این مهارت‌ها، سخت و زمان‌بره؛ اما اگر با گروهی هم‌عقیده در این سفر همراه بشین، خیلی لذت‌بخش میشه. در باشگاه کدزنی، توسعه‌دهنده‌های مشتاق، با نیت بهبود فردی دور هم جمع می‌شن و به تمرین‌های هدف‌مند برای ارتقاء توانمندی‌هاشون می‌پردازن.یادگیری مهارت‌های جدید، وقت می‌بره و همراه با اشتباه کردنه. در محیط کاری که تمرکز روی تولید کد عملیاتیه، خیلی سخت میشه روش‌های جدید رو آزمود یا دیگران رو ترغیب کرد که امتحان کنن. اما وقتی پا به باشگاه (Dojo) می‌گذارین، محیط هر روزه رو با همه‌ی پیچیدگی‌ها و مشکلاتش ترک می‌کنین و وارد محیطی امن می‌شین که می‌تونین امتحان کنین، اشتباه کنین، و از دیگران یاد بگیرین؛ مجالی برای تمرکز روی فرآیند تولید کد و بهبودش، به جای رسوندن کارها. به علاوه، «دوجو» ساختار رسمی به تمرین‌ها میده. ساختاری کامل با آداب و رسوم، نظم، قواعد و رویه‌هایی که یادگیری مؤثر رو ترویج و عدم تمرکز رو کمینه می‌کنن. Dojo محیطی امن برای یادگیری و تمرینه؛ و مهم‌تر از همه: خوش می‌گذره!باشگاه کدزنی؛ دیدار تعدادی برنامه‌نویس به صَرف کد، یادگیری و خوش‌گذرونی!عناصر اصلی باشگاه کدزنی چیه؟برگزاری مقدمه و مرور (retrospective)نوشتن توأم تست و کدنمایش مراحل کار (نه فقط نتیجه)تسهیل‌گر یا مجریهدف از برگزاری مقدمه (در آغاز) و حضور مجری (یا تسهیل‌گر) اینه که مطمئن بشین همه برای تجربه و یادگیری احساس راحتی و امنیت می‌کنن. برگزاری رتروسپکتیو (در پایان) برای اینه که به چیزهایی که یادگرفتین فکر کنین. نوشتن تست در کنار کد، به شما بازخورد می‌ده که آیا کدی که نوشتین، (هنوز هم) همونطور که انتظار داشتین کار می‌کنه؟ نمایش «چگونگی» نوشتن کد برای اینه که مطمئن بشین «سازوکار تولید کد خوب» رو یاد می‌گیرین، نه فقط اینکه «کد خوب چه شکلیه». این عناصر -مقدمه، مجری، تست، نمایش کار و مرور- باشگاه کدزنی رو از جلسات کدنویسی دیگه متمایز می‌کنه.روش‌های برگزاری باشگاه کدزنی؟مدل‌های مختلفی از دورهمی کدنویسی وجود داره:راندوریراندوری دو به دو«کاتا»ی آماده (ارائه‌ی «ببین چطور کد می‌زنم!»)و...راندوریهمه می‌تونن کد رو روی پرده ببینن و به نوبت توی نوشتن کد مشارکت می‌کنن. راندوری تقریباً آمادگی قبلی نیاز نداره.چطور شروع کنیم؟قبل از شروع، باید کامپیوترتون رو راه‌اندازی کنین، به پروژکتور وصلش کنین و یه تست خالی (ناموفق) داشته باشین. باید روشی برای گردش کیبورد بین آدم‌ها انتخاب کنین و تصمیم بگیرین که اول از همه کی شروع می‌کنه. وسط کار هم ممکنه برای توضیح و تحلیل یه مسئله به تخته‌سفید نیاز پیدا کنین.قواعد راندوری وقتی کلی برنامه‌نویس رو برای حل یه مسئله دور هم جمع می‌کنین، باید انتظار کلی نظر و ایده رو در مورد اینکه چی و چطور نوشته بشه، داشته باشین! به همین خاطر قواعدی گذاشته شده تا جلسه رو تو مسیر خودش نگه داره و به همه فرصت مشارکت بده.اگر کیبورد دست توئه، تو تصمیم می‌گیری چی بنویسیاگر کیبورد دستته ولی نمی‌دونی چی بنویسی، تقاضای کمک کناگر کسی تقاضای کمک کرد، با روی خوش و تمام توان بهش جواب بدیناگر کسی درخواست کمک نکرد، ولی فرصتی برای بهبود یا یادگیری دیدین، زمان مناسب رو برای تذکر انتخاب کنین. ممکنه لازم باشه صبر کنین تا دوباره همه‌ی تست‌ها پاس بشن (برای پیشنهاد بهبود طراحی) یا زمان مرور (Retrospective) فرا برسه.اگر تو برگزاری راندوری کم‌تجربه هستین، ممکنه به یه تسهیل‌گر نیاز داشته باشین که مطمئن بشه این قواعد اجرا می‌شن.راندوری کی مناسبه؟وقتی ۴-۱۰ نفر هستین؛ اگر بیشتر باشین بحث‌ها از دست‌تون در میره و آدما هم زمان کافی برای کد زدن ندارن)چه نوع مسئله‌ای برای راندوری مناسبه؟مسئله‌ای که خیلی سخت نباشه. اگر کاتای سختی رو انتخاب کرده باشین، ممکنه آدما از اینکه تا آخرش به جای خوبی نمی‌رسه ناامید بشن.چطور کیبورد رو بگردونیم؟محدودیت زمانی (Time Boxing)هر دو نفر یه زمان محدود (۵-۷ دقیقه) دارن. وقتی زمان تموم بشه، راننده بر می‌گرده بین حضار، کمک‌راننده به جای راننده می‌شینه و یکی از حضار جای کمک‌راننده رو می‌گیره.مزیت این روش اینه که تقریباً نوبت به همه میرسه. اما ایراد اصلی‌ش اینه که ممکنه وسط کار وقتت تموم بشه و برای نفر بعدی خیلی سخته که کار تو رو از نیمه ادامه بده.رفت و برگشتی (Ping Pong)راننده یه تست می‌نویسه و کیبورد (فرمون!) رو میده دست کمک‌راننده. راننده‌ی جدید (کمک‌راننده‌ی سابق!) کاری می‌کنه که تست پاس بشه. بعد از بازسازی کد -با همکاری هر دو نفر- راننده‌ی اول (کسی که تست رو نوشته بود) بر می‌گرده بین حضار، یکی از حضار به عنوان کمک‌راننده میاد. مثل گام اول، راننده‌ی جدید (همون کسی که نوبت قبل تست رو پاس کرده) یه تست می‌نویسه و مراحل تکرار می‌شه.خوبی این روش اینه که کارت نصفه نمی‌مونه. اما ایرادش اینه که ممکنه زوجی که پشت دستگاه هستن، خیلی طول بدن کار رو (به خصوص اگه خیلی به TDD آشنا نباشن) و نوبت به بقیه نرسه.گردش نوبت با محدودیت زمانیراندوری دو به دو (Randori In Pairs)اگر تعداد افراد بیش از ۱۰ نفره، این روش می‌تونه جایگزین خوبی برای راندوری باشه. افراد رو به گروه‌های دو یا سه نفره تقسیم می‌شن و هر تیم برای ۴۵-۹۰دقیقه روی یه کاتا کار می‌کنه. معمولاًَ خوبه یه تسهیل‌گر داشته باشین که پیش از این کاتا رو انجام داده باشه. برای «نمایش کار کردن» در این روش، میشه در انتها هر تیم بیاد مراحل کارش رو ارائه بده؛ یا یک یا چند تیم در جلسه‌ی دیگه‌ای «کاتای آماده» (Prepared Kata) برگزار کنن. کاتای آماده (Prepared Kata)وقتی یه استادکار رو حین کار نگاه می‌کنین، می‌تونین کلی چیز یاد بگیرین. وقتی که درس می‌دین هم کلی چیز می‌تونین یاد بگیرین. در کاتای آماده، کسی که پیش از این چندین بار این کاتا رو انجام داده، برای گروه بهترین راه‌حل‌ش رو ارائه میده. اون هم نه فقط کد نهایی رو، بلکه تمام مراحل کار رو؛ از یه فایل خالی تا اتمام کار و با پیروی از TDD. ارائه‌دهنده(ها) همونطور که کد رو پیش می‌برن، انتخاب‌ها و دلیل تصمیم‌گیری‌شون رو توضیح میدن تا همه متوجه بهشن چی داره می‌گذره.اگر تو یه کاتای شرکت کردین، اولویت اولتون باید این باشه که بفهمین چه اتفاقی داره میفته. و بعد به این فکر کنین که آیا راه بهتری برای انجام این کاتا هست؟ باید انقدری این دو تا کار رو خوب انجام بدین که وقتی جلسه رو ترک می‌کنین، بتونین همون کاتا رو خودتون انجام بدین، و بهتر انجام بدین!کاتای آماده ویدئوییاین امکان وجود داره که یه کاتای آماده رو اجرا کنین و از مراحل کارتون فیلم بگیرین (screencast) و اون رو در اختیار بقیه قرار بدین. یکی از جذابیت‌های باشگاه کدزنی اینه که یادگیری دو طرفه است؛ اما در مورد screencast، ارائه دهنده به طور مستقیم از بیننده‌ها یاد نمی‌گیره. اگر امکان جمع‌شدن افراد دور هم به صورت فیزیکی وجود نداره، دیدن ویدئو راه‌حل جایگزین می‌تونه باشه.کنجِ کد (Code Retreat)رویدادی یه روزه با تمرین‌های شدید برای برنامه‌نویس‌هاست؛ با همون انگیزه و هدف اصلی باشگاه کدزنی و با همون عناصر اصلی. تفاوت اصلی این رویداد با باشگاه کدزنی اینه که یه روزه است (به جای ۱-۲ساعت)، همیشه باید به صورت جفتی (pairs) کد بزنین و چندین بار یک کاتا رو انجام میدین (به طور سنتی کاتای «بازی زندگی»).کنجِ کد معمولاً صبح زود (۸:۳۰) شروع میشه و تا ۵-۶ بعد از ظهر ادامه داره. تو ۵ یا ۶ بخش ۱ساعته افراد به صورت جفتی کد می‌نویسن و آخر هر بخش، همه‌ی کدها دور ریخته میشه و تیم‌ها عوض می‌شن. ابتدای هر بخش، ۵دقیقه مقدمه و طرح چالشه و بعد ۴۵ دقیقه کدنویسی و در آخر مرور و استراحت. بعد بخش سوم، وقت ناهاره و آخر روز هم یک جمع‌بندی و مرور انجام می‌شه.به طور معمول، اهداف بخش‌ها به ترتیب به این صورته:یادگیری مسئله، بدون هیچ قاعده‌ایپیروی از TDD و کدنویسی تمیزتمرکز روی طراحی ساده و کد تمیز، ممکنه یه قید هم اضافه بشهکدنویسی همراه با یه قیدکدنویسی با یه قید دیگه یا تلاش برای پیاده‌سازی بهترین راه‌حلکش اومدن یا بازی با قیدهاوقتی یه کاتا رو خوب بشناسین، دیگه لازم نیست تمام توان ذهنی‌تون رو برای حل مسئله بگذارین. در این شرایط، می‌تونین روی جنبه‌های مختلفی از کدنویسی تمرکز کنین و بهبودشون بدین. ایده‌ی این بازی‌ها اینه که مجبورتون کنه روی مهارت خاصی تمرکز کنین. برای نمونه:۱۰ دقیقه فقط باید فهرست حالت‌های تست رو توی کاغذ بنویسین و اولویت‌بندی کنین (نمیشه کد زد)فقط باید از کیبورد استفاده کنیننمیشه از IDE استفاده کنین، فقط ویرایشگر ساده!هیچ تابعی نباید بیشتر از n خط باشه (مثلاً n=2 برای زبان‌های داینامیک مثل روبی یا پایتون و n=۴ برای جاوا و سی‌++)بدون if (یا هر نوع عبارت شرطی دیگه)بدون حلقه (for, while, foreach, ...)حرف زدن ممنوع! (با تست باید پرسید و با کد جواب داد)مهلت برای سبز شدن همه‌ی تست‌ها (مثلاً ۵دقیقه)و...این بازی‌ها رو می‌تونین توی روش‌های مختلف برگزاری باشگاه کدزنی استفاده کنین.حالا چی؟ توی سایت «باشگاه کدزنی» می‌تونین بیشتر در مورد این موضوع بخونین و فهرستی از کاتا رو ببینین. اگر تنبلی نکنم، توی نوشته‌های بعدی به ابزارهایی برای باشگاه کدزنی، چالش‌های برگزاری و... می‌پردازم.