از میرعماد تا Uncle Bob

شاید این سوال براتون به وجود بیاد که برنامه نویسی چه ارتباطی با میرعماد داره؟ میر عماد حسنی یکی مشهور ترین خوشنویس های ایران هست که در واقع به بزرگترین خوشنویس خط نستعلیق معروفه. میرعماد در واقع هنر خوشنویسی رو به اوج رسوند. توی این مقاله قصد دارم principle هایی که خوشنویس ها برای بهتر شدن کارشون استفاده میکنن رو با principle هایی که برنامه نویس ها استفاده میکنن مقایسه ای کنم.ابزارهای خوشنویسقلم نیمرکبورقزیردستیابزارهای برنامه نویسزبان برنامه نویسیمحیط مجتمع (IDE)مهم نیست شما خودتون رو خوشنویس یا برنامه نویس میدونین، داشتن ابزارها به تنهایی، شما رو اینکاره نمیکنه! برای خوشنویس شدن باید ابزارهاتون بهترین نوع باشه یعنی هرچه کیفیت قلمی که استفاده میکنید بهتر باشه خطی که مینویسید بهتر خواهد بود طبیعتا کیفیت خط به مهارت خوش نویس هم بستگی داره. هرآنچه باید بگم قبلا در قالب شعر عنوان شده:پنج چيز است كه تا جمع نگردد باهمهست خطاط شدن نزد خرد امر محالدقت طبع و وقوفي ز خط و خوبی دستطاقت محنت و اسباب كتابت به كمالگر از اين پنج، يكي راست قصوري حاصلندهد فايده گر سعي نمايي صد سال...این شعر دقیقا میتونه کلید برنامه نویس شدن هم باشه :)خوشنویس ها چه Workflow ای دارن؟!خوشنویس ها قبل از نوشتن خط نهایی که با با قلم نی نوشته میشه،‌ روی کاغذ با خودکار یا مداد ترکیب چیزی که میخوان خلق کنن رو مینویسن و تا وقتی که ترکیبی که میخوان نهایی نشده کار رو با قلم نی شروع نمیکنن.ترکیب های بالا ایراد دارن!جالبه، نه تنها دارن Test مینوسن :) اونم TDD :)واژه‌ی Testing اطمینان از درست کار کردن یه چیزی هست. در واقع برای Test یه قطعه کد،‌ کد دیگه ی نوشته میشه که مطمئن بشیم عملکرد کدمون درست هستقطعه کد زیر در واقع Test یه کد هست:/** @test */public function it_should_return_result_of_commands() { $this->scheduler->exec('cd') ->everyMinute(); $command = 'echo http://t.me/cleancasts'; $this->scheduler->exec($command) ->everyMinute(); $this->scheduler->start(); $this->assertEquals( 'http://t.me/cleancasts', $this->getProcessResult($this->scheduler->result()[$command]) ); }کد بالا ادعا میکنه اگر هر دقیقه دستور $ echo http://t.me/cleancastsاجرا بشه کلاس Scheduler به خروجی دستور دسترسی داره. اگر تست pass بشه که کد کلاس مورد نظر داره درست کار میکنه.واژه‌ی TDDیا Test Driven Development در واقع برعکس پروسه قبلی هست. یعنی اول قطعه کدی که همون Test هست نوشته میشه، این قطعه کد فرض رو بر وجود کدهای برنامه میذاره و نهایتا ادعا میکنه که کدبرنامه باید عملکردی که مدنظر هست رو داشته باشه. چه اتفاقی میوفته؟! تست رو اجرا میکنیم و fail میشه،‌اینجاست که باید حداقل کدی که کمک میکنه تست pass بشه رو بنویسیم و کار رو با یه Testدیگه پیش ببریم و ... با این کار نهایتا کد برنامه Coverage بالایی خواهد داشت یعنی کدها درصد بالایی تست دارن (توی TDD قبل از اینکه کدی نوشته بشه دیزاین و معماری کد رو هم لحاظ میکنیم در نتیجه کد کیفیت بالاتری داره).مشق نظری خوشنویس هاخوشنویس های برای بهترشدن دستخطشون تمرینی دارن که خط اساتید این حوزه رو به صورت چشمی روزانه نگاه کنن این کار باعث میشه شکل کلمات توی ذهن بهتر نقش ببنده و موقع نوشتن بهتر بتونن کلمات رو بنویسن. در کنار این کار یه تمرین دیگه دارن که کنار استادشون میشینن و خط نوشتن استادشون رو نگاه میکنن این کار معادل Pair Programming هست. مشق نظری برنامه نویس هم همون نگاه کردن به source code افراد مشهور هست.اصول طراحیجالبه بدونید خوشنویس ها توی هر برگه فقط یه نوع خط مینویسن (شکسته، نستعلیق، کتابت و ...) خطی که مینویسن Open Close هم هست یعنی وقتی کلمه ای رو نوشتن دیگه نقاشیش نمیکنن و بخوان با ظاهر چیزی که نوشتن بازی کنن،‌کارو ادامه میدن و نهایتا اگر لازم بشه کلمه ای رو Decorate می کنن. یه تفاوتی که توی خوشنویس با برنامه نویسی هست اینه که: اینور ما Interface ها رو وضع میکنیم، ولی توی خوشنویسی طی قرن ها آدمهای شاخصی مثل میرعماد Contract هایی رو وضع کردن که برای هر خطی شرایط مخصوص خودش رو داره و خوشنویس باید اونها رو Implement کنه (interface segregation کاملا رعایت شده). نکته کجاست؟نکته همینجاست! هنر نوعی تقلیده.شاید فکر کنید آدمهای هنرمند، هنرمند به دنیا میان، شاید این جمله درست باشه ولی همه ی ما فرصت اینو داریم که توی یه کاری رشد کنیم. برنامه نویسی هنر اجرا شدن یه کد نیست،‌ هنر نوشتن و اجرا شدن یه کده. یعنی کدی که مینویسیم علاوه بر انجام کاری که برای اون نوشته شده قابلیت نگهداری و توسعه رو داشته باشه. شاید بتونم بگم : تفاوت کد خوب و کد بد توی جزئیات کوچیه.نمیخوام مطلب بیشتر از این طولانی بشه به عنوان سخن آخر اشاره ای میکنم به جمله ی Des Traynor:There's a big different between making a sample product and making a product sample.مهم نیست میرعماد قائده ای رو معرفی کرده یا Uncle Bob هرچیزی که کمک کنه محصولی با پیچیدگی های کمتر خلق کنیم قطعا چیز خوبیه. قوائد میتونن رعایت بشن یا نه، نکته ایه که تصمیمش با شماست :) اینکه کجا از چه قائده ای هم استفاده کنید به عهده‌ی شماست. به نظرم شناخت قوائد مهم تر از رعایت کردن قوائد بدون چرایی اونهاست.http://t.me/cleancastshttp://twitter.com/cleancasts