توسعه با سویفت، از یادگیری تا اجرا
تابستان ۲۰۱۵ در شرکت یک برنامه آخر هفته برنامهنویسی در شرکت برگزار کردیم و قرار شد ایدههای شخصیمون رو با هزینه شرکت اجرا کنیم. یکی از ایدههایی که من و چندتا از همکارهام داشتیم این بود که برای پیدا کردن رستورانهایی که بوفه ناهار دارن اطراف شرکت یک اپ بنویسیم که پیدا کردن جا برای ناهار خوردن راحتتر بشه 😃.
من مسئولیت نوشتن اپ رو به عهده گرفتم و اون رو با استفاده از Ionic Framework پیاده سازی کردم و یکی از همکارهام هم دیتای اپ رو توی Firebase ذخیره کرد (با استفاده از یه crawler ساده). اپی که تولید شد توی اون دو روز ساده ولی کاربردی بود و کارش رو به درستی (تقریبا) انجام میداد.
{{ img developing-for-ios/cordova.jpg "Cordova AngularJS" "آنگولار" }}
با توجه به نظر خیلی منفیای که نسبت AngularJS و مشتقاتش دارم (Ionic با انگیولار کار میکنه) و فکر میکنم که هرگز نمیشه یک برنامه سالم رو با AngularJS توسعه داد، بعد از اون ماجرا تصمیم گرفتم اپ رو در زمان بیکاری با استفاده از React Native که اون روزها تازه داشت پا میگرفت دوباره پیاده سازی کنم. بعد از چند روز این کار رو کردم و نتیجه هم بد نبود. حداقل حس Native داشت و از انگیولار بهتر بود و ساختار بهتری داشت.
ولی مشکلی که وجود داشت این بود که React Native مشکلات زیادی داشت و من نمیتونستم همه اونهارو خودم حل کنم و توسعهدهندههاش هم وقت زیادی برای حل همه اون مشکلات نداشتن (البته حالا همه اون مشکلات حل شدن و RN گزینه خوبی برای توسعه اپ هست). بنابراین تصمیم گرفتم کلا قید ماجرا رو بزنم.
{{ img developing-for-ios/react-native.jpg "React Native" "react native" }}
از طرف دیگه مدتها بود دلم میخواست زبان برنامهنویسی جدید اپل (سویفت) رو یاد بگیرم و حداقل امتحانی هم که شده یه کاری باهاش بکنم. من تاحالا هر اپی که برای موبایل توسعه داده بودم web-based بود و همیشه با جاواسکریپت اینکار رو میکردم. برای همین تصمیم گرفتم که هر روز بعد از کار تلاش کنم که سویفت رو یاد بگیرم. چند تا کتاب و آموزش آنلاین رو مطالعه کردم و بعد از مدتی شروع کردم به پیاده سازی امتحانی همین اپ با سویفت.
چیزی که باعث شد سویفت رو برام جذاب کنه Syntax ساده و آشناش بود. من چون با زبانهای C-Family مثل Javascript, Java و PHP آشنایی داشتم از خیلی سال قبل، سینتکس سویفت برام خیلی طبیعی و آشنا بود و تونستم سریع باهاش کارم رو راه بندازم.
اپ رو با سویفت توسعه دادم بالاخره. البته با کلی سرچ و پرس و جو از دوستان و استفاده از پکیجهای اوپنسورس. نتیجه خیلی بهتر و روانتر از اون چیزی بود که انتظار داشتم. طبیعتا یک اپ native خیلی بهتر از مشابههای قبلیش با جاواسکریپت بود. کد رو توی گیتهاب ببینید.
{{ img developing-for-ios/swift.png "Swift" }}
در حین توسعه اپ چیزی دیگهای یادم اومد که به کل فراموشش کرده بودم و اون هم این بود که اپ برای کار کردن جدی نیاز به دادههای واقعی داره! و ۴-۵ تا رستوران اطراف شرکت برای اینکه اپ به صورت واقعی و کاربردی منتشر بشه کافی نیست. برای پیاده سازی دیتابیس اپ و ذخیره دادههای مورد نیاز از NodeJS که بهتر از هرچیز دیگهای میفهممش استفاده کردم. مرحله اول استخراج دادهها از منابع مورد نیاز بود و مرحله دوم ذخیرهشون توی دیتابیس و توسعه API مورد نیاز برنامه.
برای انجام مرحله اول محمد محبیفر عزیز زحمت کشید و وقتی من در حال توسعه خود اپ بودم بهم کمک کرد و ساختار اصلی Scraper رو توسعه داد و بعد با کمک هم چند تا اسکریپت نوشتیم که از این Scraper بتونه از منابع مختلف دادههای مورد نیاز رو استخراج کنه و تبدیلشون کنه به فرمتی که دیتابیسم انتظار داره. نکته جالب قضیه اینه که همه رستورانهایی که میخواستم توی اپ باشن نوع دادهشون باهم یکی نبود. بعضیهاشون API داشتن و بعضیهاشون منوهاشون به صورت PDF توی وبسایتشون منتشر میشد! اسکریپتی که نوشتیم همه این فرمتها رو میخوند و دادهها رو استخراج و تمیز میکرد. پروژه رو میتونید توی گیتهاب ببینید.
برای مرحله دوم هم یک API خیلی ساده با MongoDB توسعه دادم و قابلیت جستجو بر اساس لوکیشن رو بهش اضافه کردم. MongoDB به صورت پیشفرض از اطلاعات مکانی (Geo) پشتیبانی میکنه و میتونه بر اساس Lat و Long جستجو کنه. برای همین نیاز نبود خیلی تلاش کنم برای این بخش. کد این بخش رو هم اینجا میتونید ببینید. (البته توجه کنید که هنوز کدها نهایی نشدن و براشون تست نوشته نشده).
در نهایت اپ رو به API وصل کردم و بعد از تست و انجام توسعه و تمیزکاریهای نهایی، برای اپل ارسال کردم تا تایید کنه و خوشبختانه بعد از ۲ روز تایید شد. البته اپ فقط در فنلاند و سوئد در دسترسه و شاید در آینده اگر بتونم دادههای لازم در کشورهای دیگه رو جمعآوری کنم برای اون کشورها هم منتشرش کنم.
در کل این پروژه برای من بیشتر یه زمین بازی بود که بتونم توش چیزهایی که میخوام رو یاد بگیرم و شاید در نهایت نتیجه به درد کسی هم بخوره. چه کسایی که از اپ منتشر شده استفاده میکنن و چه کسایی که میخوان کد رو مطالعه کنن. با توجه به اینکه دانش Swift من به چند ماه هم نمیرسه به احتمال خیلی زیاد خیلی از کدهایی که نوشتم رو خیلی بهتر و تمیزتر میشه نوشت و من هم سعی میکنم کم کم اگر وقت داشتم اطلاعاتم رو بالاتر ببرم و اپ رو توسعه بدم و بهتر کنم.
در نهایت هم از فرزاد، شاهین، آرش و همکارهای اینجام که طبیعتا این متن رو نمیتونن بخونن تشکر میکنم که سوالهای خیلی زیاد من رو تحمل کردن و بهم کمک کردن پروژه رو به انتها برسونم.