1871 واژه
9 دقیقه
دشواری‌های توسعه نرم‌افزار ایرانی

در این پست درباره بعضی چالشها و دشواری‌های ساخت نرم‌افزار ایرانی غر میزنم که حین ایجاد این وبلاگ هم باهاشون درگیر بودم. این متن با اینکه شامل غر زدن هست؛ نکات جالبی درباره اشکالات تقویم و ساعت کشور ما داره و مطالعه اون خالی از لطف نخواهد بود.

راست چین بودن#

از زبان فارسی خوشم میاد؛ اما پشتیبانی از راست چین بودنش گاهی آزاردهنده میشه. در سالهای اخیر، صنعت نرم‌افزار پیشرفت زیادی کرده؛ اما هنوز هم مسئله قدیمی چینش راست و چپ متن به طور کامل حل نشده. شاید اکثر ما مشکل ارسال کردن شماره کارت داخل جمله فارسی رو تجربه کرده باشیم که اگه بین هر 4 رقم یه فاصله بذاریم شماره کارت برعکس ظاهر میشه و برای جلوگیری از این موضوع اعداد باید در سطر جدید نوشته بشن.

از اونجایی که علاوه بر جهت متن، مفهوم «بعدی» و «قبلی» هم با چینش راست به چپ تغییر میکنه؛ منوها و عناوین و… باید به سمت راست آورده بشن تا برای کاربر ایرانی مانوس جلوه کنن. حتی سایتهایی وجود دارن که کارشون “راست چین” کردن قالبهای آماده خارجی برای نرم افزارهای تحت وب یا اندروید و… هست و سورس راست چین و فارسی شده رو به فروش میرسونن.

البته فارسی تنها زبان راست به چپ در دنیا نیست. برای همین، پشتیبانی از زبان های rtl (راست به چپ یا right to left) یک موضوع تقریبا شناخته شده هست و بیشتر نرم افزارها اخیرا سعی میکنن که این پشتیبانی رو داشته باشن.

اما مشکلی که انگار فقط مختص ما ایرانیهاست، پشتیبانی از تقویم خاص کشورمونه.

گاهشماری شمسی#

در دنیا استفاده از یه تقویم دیگه به جای تقویم میلادی، خیلی نادرتره و تقریبا دربارش صحبت نمیشه. بسیاری از زبانهای برنامه نویسی و پروژه‌های نرم‌افزاری، فقط تقویم میلادی رو میشناسن و از “چندتقویمی بودن” پشتیبانی نمیکنن.

درسته که ما به گاهشماری شمسی و دقت اون به فصلها و سالها افتخار میکنیم؛ اما تقویم رسمی کشور ما مشکلات زیادی داره. مثل آسان نبودن محاسبه لحظه تحویل سال و نداشتن فرمول مشخص و قابل پیشبینی برای سالهای کبیسه شمسی. باور اشتباهی هم هست که میگه کبیسه‌ها هر چهار سال یکبار اتفاق میفتن و تمام. درصورتی که اینطور نیست. درسته که معمولا هر 4 سال یکبار هستن اما استثنائات زیادی توشون وجود داره؛ کبیسه گیری شمسی در طول تاریخ نامنظم و سلیقه‌ای بوده؛ می‌تونید دربارش تحقیق کنید. این اتفاق به قدری نامنظم بوده که نمیشه با فرمول اونو تعیین کرد و ما تقریبا مجبور هستیم کل تاریخچه سالهای کبیسه شمسی رو در کدهامون ذخیره کنیم تا بدونیم فلان سال شمسی آیا کبیسه بوده یا خیر.

درسته که فرمولهای زیادی برای “کبیسه گیری” توسط اشخاص مختلف طراحی شدن، اما مشکل اینه که در طول تاریخ، به یکی از این فرمولها وفادار نبودیم و مطابق سلیقه و فرمول موردعلاقه ریاضیدانهای هر دوره تاریخی، بعضی سالها کبیسه اعلام شدن یا نشدن. این یعنی هیچکدوم از فرمولها نمیتونن با اطمینان تعیین کنن که در فلان سال شمسی در گذشته، مردم اون زمان 366 روز تجربه کردن یا 365 روز. یا لااقل، من نتونستم چنین فرمولی رو پیدا کنم. درصورتی که فکر میکنید فرمول درستی برای حساب کردن کبیسه‌های گذشته دارید؛ کافیه به وبسایتهای نمایش دهنده تاریخ سر بزنید و چک کنید آیا فرمول شما با سابقه کبیسه‌های شمسی هماهنگ هست یا خیر. اگه دیدید فرمولتون درست هست لطفا به من هم خبر بدید!

خب حالا اصلا چرا انقدر به کبیسه‌های شمسی گیر دادم؟ چون تبدیل تاریخهای میلادی به تاریخهای شمسی به شدت تحت تاثیر سالهای کبیسه هردوی این تقویمها هست. تقویم میلادی و شمسی هر دو 365 روزه هستن و بنابراین باهمدیگه همپوشانی دارن. اما این سالهای کبیسه هستن که همپوشانی نسبی این دو تقویم رو دستخوش تغییر میکنن و برخی سالها یکی از تقویمها از دیگری جلوتر میفته. بعضی وقتها مثلا تقویم شمسی در طی چندسال، دوبار کبیسه میگیره و 2 روز از تقویم میلادی فاصله پیدا میکنه؛ و چندسال طول میکشه تا تقویم میلادی هم دو بار کبیسه بگیره و این فاصله رو جبران کنه. پس برای تبدیل دقیق بین میلادی و شمسی، نیاز هست کبیسه‌های دقیق هر دو تقویم رو بدونیم.

گاهشماری قمری#

حالا بیاید درنظر بگیریم که خیلی از مناسبتها و تعطیلی‌های تقویم شمسی ما، در اصل با تقویم قمری تنظیم میشن. این یعنی تقویم شمسی به تنهایی کافی نیست؛ و نیاز به پشتیبانی از یه تقویم غیر متداول دیگه هم داریم جهت اینکه نرم‌افزار ما برای کاربر ایرانی قابل استفاده بشه.

اکثر نرم افزارهای ایرانی، درصورتی که آنلاین نباشن و با کدهای خودشون رها بشن؛ نهایتا در چهار الی پنج سال آینده به تدریج تاریخ یا مناسبتها رو اشتباه نشون خواهند داد و یا نسبت به ده الی بیست سال گذشته اشتباه خواهند کرد. اما علت این مشکل چیه؟ یعنی مهندسان نرم‌افزار ایرانی نمیتونن یه تقویم آفلاین بسازن؟ نه. اینطور نیست که ما بلد نباشیم؛ بلکه این کار غیرممکنه.

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

به علت بستگی داشتن تقویم قمری ایران به نظر و سلیقه «ستاد استهلال»، پشتیبانی ما از تقویم رسمی نمیتونه آفلاین باشه و همیشه باید آماده تغییر دادن تقویم بنابر تصمیمات رسمی باشیم. تقویم ما، قراردادی و متغیر هست و برپایه محاسبات و فرمولهای از پیش تعیین شده نیست. اگه به فرمولها و محاسبات آفلاین تکیه کنیم؛ ممکنه روزی که براساس محاسبات ما باید تعطیل میبوده، به علت کم و زیاد شدن روزهای یک ماه قمری بنا به اعلام ستاد استهلال، از حالت تعطیلی خارج بشه یا برعکس. این یعنی داشتن تقویم دقیق آفلاین و بدون اتصال به اینترنت، یک رویا خواهد بود.

اینکه ما نتونسته باشیم یک گاهشماری قابل پیشبینی بسازیم که با محاسبات آفلاین در نرم افزارهامون استفاده بشه بنظر من غیرقابل قبول هست و نیازه که در این مورد چاره اندیشی بشه. ما تقویم شمسی رو داریم که یکی از دقیق‌ترین تقویمهای دنیاست، و در عین حال تقویم و مناسبات رسمی کشور ما، غیرقابل پیشبینی و بدون فرمول و قاعده هستن.

ساعت بهاری و پاییزی#

گفتم که تقویم رسمی کشور ما قابل پیشبینی نیست. متاسفانه ساعت کشور ما هم دچار همین مشکل شده. منظورم قضیه معروف “ساعت جدید یا قدیم” هست. هنوز هم گوشی‌های موبایل زیادی در ایران وجود دارن که شش ماه از سال با ساعت رسمی ما هماهنگ نیستن؛ چون مطابق قوانین قدیمی جلو و عقب کشیده شدن ساعت کار میکنن و آپدیت نشدن.

این آزاردهندست که اگه ما بخوایم حساب کنیم از یک تاریخ و ساعت مشخص که جایی نوشته شده، دقیقا چقدر گذشته، یا به یک تاریخ و ساعت خاص که جایی ذخیره شده چقدر مونده؛ باید بدونیم که آیا در بهار یا پاییز فلان سال ساعتها تغییر کردند یا خیر و چه زمانی این قانون لغو شد و یا دوباره از سر گرفته شد. و البته باز هم ممکن هست در آینده این قوانین دستخوش تغییر بشن و نتیجه محاسبات ما بی‌اعتبار بشه. این مسئله در تنظیم یادآورها، محاسبه دقیق مدت اشتراک، محاسبه سن، فاصله زمانی تاریخها و… مشکل ساز هست و اگه بخوایم واقعا دقیق باشیم باید این موارد رو درنظر بگیریم که یک قدم اضافی و غیرضروریه که برنامه نویس ایرانی باید بهش توجه کنه.

در کل، این ایده که بشر تصمیم گرفته ساعت رو تغییر بده واقعا برای من عجیب هست. چون ساعت، قرار بوده که دقیق و قابل اعتماد باشه و وقتی جایی یک تاریخ و ساعت نوشته شده، ما بتونیم حساب کنیم که چقدر از اون زمان گذشته یا چقدر به اون زمان باقی مونده. تغییر دادن ساعت و جلو و عقب کشیدن اون و “قراردادی کردن زمان” ایده خوبی نیست.

به جای اینکه اعلام کنیم از فردا مثلا ادارات کارشون رو از ساعت 8 شروع میکنن، اعلام کردیم که از این به بعد ساعت 8 درواقع ساعت 7 هست! و بدتر اینکه همین کار رو هم به شکل منظم انجام ندادیم و چندبار قطع و وصلی داشته.

حتی وقتی این کار به شکل منظم انجام میشد هم مشکلات زیادی وجود داشتن. مثلا در لحظه ای که جلو و عقب کشیدن ساعت انجام میشد؛ ما شاهد تکرار شدن یک ساعت یا وجود نداشتن یک ساعت در یک روز میشدیم. مثلا ساعت 11 تا 12 رو دوبار زندگی میکردیم و روزمون 25 ساعته بود یا ساعت 12 تا 1 اصلا وجود نداشت و شاهد یک روز 23 ساعته بودیم. یادآورها، هشدارها و… در این شرایط نمیدونستن که باید چیکار کنن. حتی در برخی پیامرسانها، وضعیت عجیبی در صفحه چت ایجاد میشد که پیام “بعدی” ساعتش قبل از پیام قبلی بود. مثلا پیامی در ساعت 11:59 ارسال شده بود و طرف مقابل ساعت 11:02 بهش جواب داده بود! حتی به همین علت تراکنشهای بانکی رو هم در اون لحظه تا مدتی مسدود میکردن و امکان انجام کارت به کارت و… وجود نداشت. فرض کنیم وقتی شخص میگفت که من ساعت 11 براتون واریز کردم؛ معلوم نبود که منظور کدوم ساعت 11 هست و این یعنی کارکرد ساعت و تقویم در اون لحظه به کل مختل میشد.

خوشبختانه اخیرا این قانون تغییر ساعت لغو شده. اما هنوز مجبور هستیم که آثار منفی این قانون درباره تاریخها و ساعتهای مربوط به گذشته رو مدیریت کنیم. (یادمون باشه که هنوز هم دستگاه‌های زیادی در ایران، شش ماه از سال ساعت رو اشتباه نشون میدن) امیدوارم که هیچوقت دوباره شروع به جلو و عقب کشیدن ساعت نکنیم!

قانون نسبیت زمان#

یک چیز آزاردهنده دیگه که اینجا باید دربارش غر بزنم اینه که در محاسبات زمان، پدیده نسبیت هم دخیل هست. مسئله اینه که یک “ساعت جهانی” وجود نداره و زمان بسته به موقعیت و سرعت ما دستخوش تغییر میشه. اینکه جهان هستی تصمیم گرفته ساعت رو جلو و عقب بکشه و ادابازی دربیاره آزاردهنده نیست؟ طبق نظریه جناب اینشتین، درک ما از زمان روی سطح زمین با درک فضانورد ایستگاه بین المللی یا ماهواره‌های GPS در فضا کمی متفاوته. جمع کنید بابا. یه ساعت دقیق خواستیم فقط :/

کدهای متن باز#

در دنیای امروز خیلی از برنامه نویسها کدهایی رو به صورت OpenSource منتشر میکنن و به‌صورت آزاد و رایگان در دسترس همه قرار میدن. هیچ منتی هم روش نمیذارن؛ یعنی حتی ازت نمیخوان که موقع استفاده از زحمات اونا، اسمشونو ذکر کنی. در حدی بهت آزادی میدن که میتونی کدهای اونارو که رایگان در اختیارت گذاشتن، توی یه پروژه تجاری به کار بگیری و به بقیه بفروشی. من هم برخی از کدهای خودم رو به همین شکل منتشر کردم که میتونید توی گیتهابم یه سری از اونارو مشاهده کنید. اتفاقا یکی از این کدهای من، برای پشتیبانی از تقویم جلالی در زبان جاواست که به‌صورت رایگان در اختیار همه قرار گرفته.

در زیر میتونید کد من رو مشاهده کنید:

AminSarabi
/
Persian-Date-Java
Waiting for api.github.com...
00K
0K
0K
Waiting...

مسائلی که در بالا گفته شدن باعث میشن ما به راحتی نتونیم از کدهای آماده خارجی برای پروژه‌های ایرانی استفاده کنیم. نمیگم غیرممکن هست یا سخته؛ اما آسون هم نیست و یه مرحله اضافی و تکراری در کار ماست.

تو این وبلاگ سعی دارم از چینش راست به چپ و تاریخ شمسی کاملا پشتیبانی کنم. و اکثر وقت آزاد امروزم صرف همین کار شد. درسته که خیلی از برنامه نویسان ایرانی - شامل خود من- کدهای آماده مختلفی برای حل این مسائل در زبانهای مختلف نوشتن و آماده کردن؛ اما هنوز نیاز هست که این راه‌حلها در پروژه‌های جدید سوار بشن؛ مثلا باید اتصال اینترنتی منظم برای دریافت تاریخ رسمی قمری انجام بشه و …

این بود غر زدن من درباره چالشهای پشتیبانی از کاربر ایرانی در حوزه نرم‌افزار و لزوم تلاش جمعی ما جهت حل و فصل این مسائل (به جز نظریه نسبیت که انگار کاریش نمیشه کرد)