پروژهٔ نگار و مصائبش

Aug 10, 2012·

4 min read

نگار با پایتون نوشته شده‌، اما به احتمال زیاد کتابخانهٔ ویرایشش به چند زبان دیگر (نظیر PHP و javascript برگردانده خواهد شد). از این رو نگار روی [گیت‌هاب](github.com/shahinism/Negar "negar on github") منتشر می‌شود و شدیدا پذیرای ایده‌های نو و صد البته همکاری شما در توسعه‌اش است‌.

و از همه مهمتر این که نگار توسط یک تازه‌کار در حال توسعه است و می‌تواند کمک خوبی برای تازه‌کاران یا مشتاقان یادگیری برنامه نویسی باشد‌.

مصائب توسعه نگار

آن‌هایی که مرا از نزدیک می‌شناسند احتمالا می‌دانند که مدت‌هاست مشتاقم که برنامه‌نویس شوم ولی درصدی تنبلی و درصدی دیگر پیچیدگی امر برنامه‌نویسی مانع از رسیدن به این علاقه‌ام شده‌. بار‌ها به سمت زبان‌های C‎+‎+‎‌، C، PHP، Javascript و ... کشیده شده‌ام‌، سینتکس‌شان را یادگرفته‌ام‌، تعدادی مسائل و الگوریتم پایه‌ای را حل کرده‌ام ولی آخر سر نتوانسته‌ام که به خودم اجازهٔ برنامه‌نویس بودن بدهم D:

خوبی این تلاش‌های به بن‌بست رسیده برایم این بوده که بفهمم برنامه‌نویسی را توی کتاب‌ها یاد نمی‌دهند D: (البته منظورم سینتکس و این‌ها نیست‌ها!). یاد گرفتن واقعی از وقتی شروع می‌شود که شروع به نوشتن پروژه‌ای می‌کنید‌. ایدهٔ توسعهٔ نگار را مدت زیادی بود که در سر می‌پروراندم‌. خصوصا از وقتی که ایمان [ویراستیار](virastyar.ir "ویراستیار") را به عنوان جایگزینی برای [ویراستباز](virasbaz.persianlanguage.ir "ویراسباز") که من استفاده می‌کردم معرفی کرد و گفت که ای کاش یک نسخهٔ کلاینت هم برای این کار روی لینوکس بود‌. (درست که ویراستیار یک نسخهٔ کلاینت دارد‌، ولی آن با زبان جهنمی C#‎ نوشته شده که نصبش برای من هفت خوان می‌طلبد!)

این اشتیاق به قوت خودش باقی ماند تا این که کتاب یک بایت از پایتون را تمام کردم‌. کتاب خیلی خوبی بود‌‌ و خیلی از مسائل را به سادگی و روشنی توضیح می‌داد‌. این بود که ما هم جو این که هر کاری را می‌توانیم به راحتی با پایتون انجام دهیم گرفتمان و زدیم به کار نوشتن نگار‌!

اولین الگوریتم پیاده‌سازی شده افتضاح بود‌! بعضی ایده‌هایش هنوز هم به نظرم جالب می‌آید ولی حجم کار بی‌خودی زیادی را به هر تابع واگذار کرده بودم که در نهایت هم نتیجهٔ دلچسبی در خروجی ظاهر نمی‌شد‌. این بود که کمی ذلسرد شدم و ناامیدانه به دنبال ابزاری گشتم که برای همین هدف نوشته شده باشد و بتوانم با بررسی سورسش مفهوم طراحی و پیاده‌سازی یک برنامه را بهتر درک کنم‌. سورس ویراستیار جدای از گندگی بیش از اندازه‌اش برای من‌، به زبانی بود که اصلا نمی‌فهمیدمش‌! جستجو‌ها نتجه نداد تا وقتی که روی صفحهٔ گیت بهنام اسفهبد با پروژهٔ ویراستار آشنا شدم‌. نویسندهٔ پروژه عزیز (که فکر کنم توسعه دهندهٔ بالاترین هم باشد) کد کتابخانه را به روبی نوشته بود و یک نمونهٔ تحت وب که خروجی فوق‌العاده‌ای هم از ویرایش متن داشت با آن ساخته بود‌.

سادگی و کامنت شدن بیشتر توابع این کتابخانه را به شروع خوبی برای من تبدیل کرد‌. تصمیم گرفتم که آن را با پایتون دوباره نویسی کنم تا هم سواد خودم را (که بعد‌تر فهمیدم اصلا ندارم D:) محک بزنم و هم یه شروع برای پروژهٔ نگار ایجاد کنم‌.

کار از آن چیزی که به نظر می‌رسید سخت‌تر بود‌. تفاوت‌های زبان روبی و پایتون گاها در سینتکس خیلی کوچک بودند ولی در عملکرد زمین تا آسمان متفاوت بودند‌.

نکته‌ای که بیش از همه به نظرم جالب آمد طرز تفکر من نسبت به عبارات باقائده بود‌. قبلا در وبلاگ دوست خوبم علی با آن‌ها آشنا شده بودم‌. ولی زیاد دل به یاد گرفتن‌شان ندادم و فکر هم نمی‌کردم آن‌چنان دانستن‌شان به کارم بیاید‌. حقیقتش را بخواهید بیش از ۹۰ درصد ویراستار نگار بر پایهٔ همین regex‌ها بنا شده ;-)

یا از طرف دیگر unicode ها که در عمل آن‌قدر بهشان عادت کرده بودم که نمی‌دیدمشان‌، خودشان را در این‌جا بیش از پیش به رخ می‌کشیدند‌.

کمک‌های Stackoverflow و Github

این که می‌گویند همیشه ابزار درست نتیجه را بهتر می‌کند (نقل از خودم) حقیقت محض است‌. در حین نوشتن نگار به مشکلاتی بر می‌خوردم که هیچ‌جوره با منطقم جور در نمی‌آمد‌. سرچ در گوگل هم خصوصا این که با فارسی در ارتباط بود و طبیعتا نمی‌شود دلی به نتایجش خوش کرد چندان فایده‌ای نداشت‌ (البته چند باری به جای فارسی دنبال Arabic‌ها گشتم که راهنمایی‌های خوبی برای یونیکد نوشتن در پایتون به دست آوردم). در چنین شرایطی بود که stackoverflow و کاربرانش به دادم رسیدند‌. دو سوالی که پرسیدم را آن‌چنان کامل و متناسب با شرایط مختلف جواب دادند که عمرا نمی‌شود در هیچ کتابی به این صراحت جوابی پیدا کرد D:

اما حل مشکلات به این راحتی‌ها هم نبود‌. بار‌ها پیش می‌آمد که شروع به ویرایش یک تابع می‌کردم و آن‌قدر تغییر می‌دادم که در نهایت نه ایده‌هایم برای حل مشکل کارساز بود و هم کل کد را خراب کرده بودم‌. این‌جا بود که Git کمک می‌کرد‌. فوق‌العاده است‌. فوق‌العاده‌. کدام ابزار دیگری را می‌شناسید که هم یک ورژن کنترل عالی باشد‌، هم به راحتی قابلیت مستندسازی پروژه را دو دستی تقدیمتان کند؟ (منظورم wiki و page است). در آینده بیشتر در مورد شگفتی‌های گیت و مخصوصا گیت‌هاب می‌نویسم‌!

نتیجه:

نتیجهٔ کار که دیگر معلوم است‌. اما در آخر باز هم اعلام می‌کنم که اگر علاقه به همکاری در یک پروژهٔ آزاد فارسی دارید تنها زحمتی که باید به خودتان بدهید‌، این است که پروژه را از گیت‌هاب فورک کنید ;-)