‫اصطلاحات اولیه برنامه‌نویسی موبایل با Java ME

Java ME
Java Micro Edition ویرایش مخصوص جاوا برای استفاده در گوشی‌های موبایل و دیگر deviceهای مشابه است. بیش از دو میلیارد گوشی قابلیت اجرای برنامه‌های Java ME را دارند. J2ME نام قدیمی Java ME است.

Configuration/Profile/Optional API

Configuration مشخصات گوشی‌های مختلف است و مشخص می‌کند که قدرت یک گوشی در چه حدی است و چه کارهایی را می‌تواند انجام دهد. انواع Configuration شامل CLDC و CDC می‌شود.

Profile مشابه Configuration است و مشخص می‌کند که یک گوشی با یک Configuration خاص چه قدرت و امکاناتی دارد. معروف‌ترین Profile همان MIDP است.

در ادامه همین تقسیم بندی، یک Profile مشخص می‌تواند از یک سری APIهای خاص پشتیبانی بکند یا نکند. مثلاً ارسال MMS را پشتیبانی بکند یا نکند. به این تقسیم بندی Optional API‌ گفته می‌شود.

CLDC
Connected Limited Device Configuration
یک configuration خیلی ساده است که توسط اکثر گوشی‌های موبایل پشتیبانی می‌شود. به چیزی حدود 256 KB رم و رام نیاز دارد. امکانات جاوایی آن در حداقل قرار دارد.

CDC
Connected Device Configuration
یک مدل بالاتر از  CLDC است. میزان حافظه آن در محدوده مگابایت است نه کیلو بایت.

MIDP معروف‌ترین Profile است. اگر گفته شود که یک گوشی MIDP را پشتیبانی می‌کند یعنی این که امکانات سخت‌افزاری، قدرت CPU و میزان حافظه به مقدار خاصی است. این میزان برای MIDP 2.0 عبارت است از 256KB ROM، مقدار ۸ کیلو بایت فضای ذخیره‌سازی، 128 KB RAM، صفحه نمایش 96*54، صفحه کلید و شبکه دو طرفه.

MIDlet
اصطلاحاً به برنامه‌نویسی Java ME بر اساس MIDP گفته می‌شود. تقریباً منظور از برنامه‌نویسی موبایل با استفاده از Java ME یا J2ME همین برنامه‌نویسی به روش MIDlet است.

منبع: کتاب Beginning J2ME

‫اولین برنامه با Java ME

خوشحالم که به عنوان یک برنامه‌نویس دات‌نت اولین Hello World جاوایی‌ام (Java ME) را نوشتم. از Java ME برای برنامه‌نویسی با موبایل‌های سازگار با جاوا، یعنی اکثر گوشی‌های جهان، استفاده می‌شود. کدهای Java ME را می‌توان با کمک netBeans و Eclipse و pluginهای مربوطه نوشت یا این که از Java ME SDK استفاده کرد. نقطه شروع کار خیلی سخت نیست. کافی است از کلاس خاصی به اسم MIDlet ارث‌بری کرده و کار را شروع کرد. وقتی که کد نوشته شده به یک فایل jar کامپایل شد می‌توان آن را به گوشی موبایل منتقل کرده و اجرا نمود.

گفته می‌شود که برنامه‌های نوشته شده با Java ME و به طور کلی با جاوا کند هستند. حتی محیط برنامه‌نویسی جاوا هم کند است. اما اگر Cross Platform بودن بین گوشی‌ها و OSهای مختلف برایتان مهم است باید آن را تحمل کنید.

‫انتخاب platform برنامه‌نویسی موبایل

بازار برنامه‌نویسی موبایل در آمریکا و اروپا به شدت داغ است. این بازار در ایران هم به شدت رو رشد است. کافی است نگاهی به آگهی‌های کارویس بیندازید + + + +. این روزها به هر برنامه‌نویسی واجب است که اطلاعاتی راجع به برنامه‌نویسی موبایل داشته و یکی از platformهای موجود را برای شروع انتخاب کند. پلتفورم‌های موجود عبارتند از آندروید (گوگل – جاوا)، iOS (اپل – Objective C)، ویندوز فون (مایکروسافت – دات‌نت)، بادا (سامسونگ – C++‎)، جاوا (cross-platform – جاوا) و چند سیستم عامل متفرقه دیگر.

دیروز در ارتباط با همین موضوع بحث داغی داشتیم با چند تا از دوستان. هدف این بود که با یک سری از پیش فرض‌ها یک platform مناسب برای برنامه‌نویسی موبایل انتخاب شود. پیش‌فرض‌های مورد نظر عبارتند از:

* ما برنامه‌نویس دات‌نت هستیم.
* ما چند برنامه‌نویس هستیم که عمری در کار توسعه برنامه‌های داده محور مثل برنامه‌های دیتابیسی بوده‌ایم و قاعدتاً مهارت‌ها و ایده‌هایمان هم در همین حول و حوش چرخ خواهند زد.
* ما ایرانی هستیم و محدودیت‌های زیادی در رابطه با موضوع تحریم داریم.
* هدف اولیه بازار داخل است ولی بازار خارج و storeهای مختلف applicationها به هیچ وجه منتفی نیستند.
* مهم است که برنامه‌های ما در بیشتر گوشی‌ها اجرا شود. باید سعی کنیم محدودیت platform و محدودیت سخت‌افزار را به نوعی دور بزنیم.

خلاصه‌ای از بحث:
iOS و Windows Phone محدودیت‌های زیادی برای ما ایرانی‌ها دارند. اما جاوا و اندروید کمتر. جواب قطعی به cross platform بودن جاوا است. اما مشکل کندی آن و عدم دسترسی مستقیم به سخت‌افزار گوشی هست. نرم‌افزارهای معتبر به ازای هر platform یک بار بازنویسی می‌شوند. مثلاً یک بار برای اندروید، یک بار برای iOS و یک بار برای Windows Phone. بادا کمترین ساپورت، کوچکترین جامعه developer و کمترین طرفدار را در ایران دارد اما گوشی‌های به نسبت ارزان قیمت‌تری دارد. گوشی‌های Windows Phone و iOS گوشی‌های گرانقیمتی هستند. گوشی‌های اندروید بیشترین آمار را در ایران دارد. البته تقریباً همه گوشی‌های موجود جاوا را پشتیبانی می‌کنند. قیمت گوشی‌های اندروید در حال حاضر (اواخر آبان ۱۳۹۰) از حدود ۲۰۰ هزار تومان شروع می‌شود. بازار کلی دنیا هم درباره انتخاب platform خیلی شک دارد. رقابت خیلی داغ است و ممکن است در چند سال آینده شاهد تغییرات زیادی باشیم.

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

‫ALT.NET و MSDN Way‫

از زمانی که با NHibernate آشنا شدم متوجه یک جبهه جالب در دنیای دات‌نت شدم. جبهه کسانی که علاقه زیادی به port کردن پروژه‌های معروف جاوا به دات‌نت، استفاده از design patternهای شی‌گرایی و دنیای Open Source داشتند. نمونه بارز این جبهه خود NHibernate است. پروژه‌ای کاملاً open source برای تزریق OOP به کدهای دسترسی به دیتابیس بر اساس پروژه جاوایی Hibernate.

چند وقت پیش حین خواندن کتاب Foundation of Programming متوجه شدم که اسم این جبهه ALT.NET است. علایق این جبهه علاوه بر موارد بالا شامل unit test و CI و دیگر موارد مشابه هم می‌شود. طرفداران ALT.NET در عین حالی که روی سکوی دات‌نت متمرکز هستند از مایکروسافت و روش‌های مایکروسافتی گریزان هستند. آنها سعی می‌کنند برای هر تکنولوژی و ابزار مایکروسافتی، یک جایگزین open source ارائه دهند.

در مقابل ALT.NET روش MSDN Way قرار دارد. در روش MSDN Way عمده تمرکز افراد بر استفاده از APIهای تکنولوژی‌های مختلف دات‌نت است. کدهای برنامه‌نویسان MSDN Way شباهت زیادی به نمونه‌های معرفی شده توسط مایکروسافت در MSDN دارد. اصلاً اسم MSDN از همین جا آمده. یکی از نشانه‌های گروه MSDN استفاده از DataSet به جای ORMهاست.

برای کسب اطلاعات بیشتر به فصل اول کتاب Foundation of Programming مراجعه نمایید.

شما خودتان را بیشتر از پیروان ALT.NET می‌دانید یا MSDN Way؟

‫‫C#‎ برای توسعه برنامه‌های dynamic

به غیر از ما، خیلی‌های دیگر هم به فکر توسعه برنامه‌های dynamic با C#‎ و ‎.Net هستند. به عنوان نمونه به تلاش مایکروسافت در نسخه‌های ۳ و بعد از ۳ دات‌نت دقت کنید (LINQ و بقیه) یا به کتاب‌هایی مثل Pro Dynamic .NET 4.0 Applications: Data-Driven Programming for the .NET Framework نگاهی بیندازید.

آیا واقعاً این احتمال وجود ندارد که ما در حال استفاده از یک زبان و محیط اشتباه برای رسید به مقصودمان هستیم؟ زبان‌هایی مثل سی‌شارپ و جاوا استاتیک هستند، در حالی که ما هر روز در حال ساخت برنامه‌های dynamic مثل فرم‌ساز، گزارش‌ساز و… هستیم. من خودم به شخصه هیچ وقت به طور جدی به جز زبان‌های خانواده سی و پاسکال از هیچ زبان دیگری استفاده نکرده‌ام. ولی با این حال کم کم دارم به درست بودن استفاده از سی‌شارپ برای تولید نرم‌افزارهای dynamic شک می‌کنم. کم کم زمان آن رسیده که نگاهی به زبان‌های دینامیک مثل Ruby بیندازیم.

اشتباهات دوران دانشگاه

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

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

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

۳- «دو دوره کردن» پروژه فارغ التحصیلی و کارآموزی
«دو دره کردن» اصطلاحی بد معنی است و بیشتر به معنی دزدیدن یا دور زدن و پیچوندن شدید به کار می‌رود. اما متاسفانه من هم مثل تعداد قابل توجهی از بقیه دوستان، پروژه و کارآموزی را با آب بندی و خالی بندی گذارندم. اگر می‌توانستم یک موضوع خوب برای پروژه پیدا کنم و حسابی روی آن وقت بگذارم و اگر یک شرکت خوب برای کارآموزی پیدا کرده و برای آن هم وقت می‌گذاشتم الان وضعیت خیلی بهتری در بازار کار می‌داشتم. متاسفانه پیچوندن در همه دروس و در همه زمینه‌ها در علم و صنعت حسابی باب بود.

۴- انتخاب C#‎ به جای جاوا.
آن اوایل دانشگاه همه ما با هم دلفی کار بودیم اما کمی بعد سر و کله دات‌نت و جاوا پیدا شد و خیلی‌ها از جمله خود من دلفی را فراموش و به سمت یکی از این دو سکو رفتیم. آن زمان خیلی با بحث Open Source و… آشنا نبودم و فکر می‌کردم چون جاوا کد باز است ممکن است خیلی رشد نکند. ولی چون مایکروسافت یک شرکت تجاری خیلی بزرگ است حتماً دات‌نت‎ موفق‌تر خواهد بود. البته گذر زمان نشان داد هر چند که دات‌نت‎ چندان شکست نخورد اما آنهایی که به سمت جاوا رفتند موفق‌تر بودند خصوصاً آنها که در ایران بودند. به عنوان مدرک می‌توانید تعداد پروژه‌های موفق در جاوا را مقایسه کنید با پروژه‌های موفق C#‎. به عنوان مثال Hibernate را. اگر نمونه کدها یا سواد آدم‌های جاوا کار را مقایسه کنید با نمونه کدهای C#‎ یا آدم‌های C#‎ کار متوجه می‌شوید که به طور نسبی جاوا کارها با سوادتر و کدهایی که می‌نویسند دقیق‌تر و اصولی‌تر است. در بازار کار هم برنامه‌نویس‌های جاوا محبوبیت بیشتری داشته و حتی میانگین حقوقی بالاتری هم دارند. به طور کلی به نظر می‌رسد در ایران شرکت‌های جاوایی تیم‌های قوی‌تر و برنامه‌نویس‌های بهتری داشته باشند تا شرکت‌های دات‌نتی.

۵- عدم استفاده مفید از سربازی
هر چند که سربازی را باید رفت چون همه می‌روند اما بنده به خاطری کوتاهی‌هایی که در بعضی زمینه‌ها و شبکه اجتماعی (در اینجا آشنا و پارتی) در طول دوران تحصیل کرده بودم نتوانستم امریه پیدا کنم. حتی نتوانستم در شهر یا نیروی دلخواه به سربازی بروم. در نتیجه دو سال از وقت با ارزشم را در تبریز و کوه‌های لرستان سپری کردم. طی این مدت تنها ارتباطم با کامپیوتر مجموعه Microsoft Office و خواندن یک کتاب ASP بود.

۶- عدم اصرار بر کار شرکتی در حین تحصیل
هر چند که حین تحصیل و خصوصاً اواخر آن چندتایی کار پروژه‌ای به تورم خورد. اما اگر همان کارها را به صورت شرکتی انجام می‌دادم هم موفق‌تر عمل می‌کردم، هم با بازار کار رسمی آشنایی بیشتری پیدا می‌کردم و هم می‌توانستم شبکه اجتماعی‌ام را بیشتر گسترش دهم. این موضوع را بعداً وقتی که با تعداد زیادی از دانشجویان شاغل به صورت پاره وقت مواجه شدم بیشتر درک کردم.

۷- دیگر موارد متفرقه مثل عدم کار روی پروژه‌های کد باز معروف، عدم حضور جدی و موثر در المپیادها، مسابقات و همایش‌های دانشجویی، دوست‌یابی نادرست و…

پروژه‌های جاوایی در دات‌نت

تعدادی زیادی از پروژه‌های کد باز معروف ‭.Net‬ از روی پروژه‌های موفق Java ساخته شده‌اند. یکی از قشنگ‌ترین چیزهایی که در این تقلید رعایت شده، یکسان بودن API هر دو است. یعنی مثلاً اگر پروژه‌ی جاوایی JavaProjABC وجود داشته باشد که شامل سه کلاس C1 و C2 و C3 بوده و کلاس C2 شامل متودی به اسم m1 باشد که دو پارامتر string دریافت می‌کند، پروژه‌ی دات‌نتی آن که احتمالاً NProjABC یا ProjABC.Net نام دارد هم دقیقاً همین کلاس‌ها و همین متودها را دارد. علاوه بر این رفتار کلاس‌ها و متودها هم یکی است. مثلاً اگر متود m1 در پروژه‌ی جاوایی دو پارامتر دریافتی را در یک فایل متنی نوشته و زیر آن یک خط می‌کشد، متود m1 پروژه‌ی دات‌نتی هم دقیقاً همین کار را می‌کند.

خوبی این موضوع این است که کدهای نوشته شده برای استفاده از یک پروژه‌ی جاوایی یا دات‌نتی اصطلاحاً قابل حمل بوده و به راحتی قابل تبدیل به platform دیگر است. خوبی دیگر آن، یکی بودن شکل و شمایل configuration است. مثلاً کدهای مورد نیاز برای configuration پروژه‌ی جاوایی log4j بسیار شبیه به configuration نسخه‌ی دات‌نتی یعنی log4net است. خوبی دیگری هم هست که خیلی هم قابل استفاده است. وقتی که کار کردن با یکی را بلد باشید کار کردن با آن یکی را هم خود به خود یاد گرفته‌اید و اگر مثالی یا کتابی روی یکی از پروژه‌ها موجود باشد، در آن پروژه‌ی دیگر هم می‌توان از آن استفاده کرد.

این مورد آخر جدیداً خیلی برای من به درد بخور بود. یکی از APIهای پر استفاده‌ی جستجو در NHibernate عبارت است از ICriteria. من به مشکلی در استفاده از آن برخورده بودم که نمی‌دانستم چطور باید آن را حل کنم. در مورد NHibernate و ICriteria جستجو کردم و چیز خاصی پیدا نکردم. اما خوشبختانه چون NHibernate پورت پروژه‌ی معروف جاوایی Hibernate به دات‌نت است توانستم از روی یک سوال و جواب Hibernate جاوایی به جوابم برسم.

امتحان ورود کارشناسی ارشد

روز جمعه ۲۹ مرداد ۸۹ امتحان ورودی کارشناسی ارشد ناپیوسته مهندسی فن‌آوری اطلاعات دانشکده آموزش‌های الکترونیک دانشگاه شیراز در محل موسسه آیین زندگی حوالی آریاشهر برگزار شد. امتحان گرایش طراحی و تولید نرم‌افزار شامل سوالاتی از دروس زبان، ریاضی، برنامه‌سازی و مهندسی نرم‌افزار بود. صرف نظر از ایردات معمول امتحان، می‌توان ایراداتی را هم به سولات دو درس برنامه‌سازی پیشرفته و مهندسی نرم‌افزار وارد کرد.

۱- زبان برنامه‌نویسی مورد استفاده جاوا بود و آن‌هایی که مثل من به جای جاوا، سی‌شارپ بلد بودند خیلی متضرر شدند. البته این موضوع از قبل هم اعلام شده بود ولی اعلام قبلی آن فرق آنچنانی در اصل موضوع ایجاد نمی‌کرد.

۲- سوال ۳۳ کاملاً اشتباه بود. کد داده شده وارد حلقه بی‌نهایت می‌شد و البته هیچ کدام از خروجی‌های داده شده در گزینه‌های داده شده را تولید نمی‌کرد. به اصل سوال و گزینه‌های آن دقت کنید:

Public class test {
Public static void main(String[] args)
{
for (int j=1; j<=5; j++) {
for (int k=1; j<=j; k++)
System.out.print('*');
System.out.println();
}
}
}

گزینه اول
*****
****
***
**
*
گزینه دوم
*****
****
***
**
*
گزینه سوم
*
**
***
****
*****
گزینه چهارم
*
**
***
****
*****

البته اگر شرط حلقه دوم را با k<=j عوض کنیم مشکل حل شده و گزینه چهار صحیح خواهد بود.

۳- یک سوال سه بار تکرار شده بود! سوالات ۵۰ و ۵۴ کاملاً یکی بودند و سوال ۵۶ هم همان سوال ۵۰ و ۵۴ بود که فقط کمی متن آن عوض شده و جای دو تا از گزینه‌ها عوض شده بود. سوال عبارت بود از «کدام یک از موارد زیر در طراحی مورد بررسی قرار نمی‌گیرد.»

۴- در بعض از سوال‌ها از معادل‌های فارسی نامأنوسی استفاده بود که جواب دادن به سوالات را بی‌دلیل سخت می‌کرد. از جمله «واسط» به جای interface در سوال ۵۶، «تغییر دهنده» به معنی کلمات public و private که در ابتدای تعریف متودها و دیگر اعضای کلاس‌ها می‌آید.

۵- اشتباهات تایپی و گرامری هم که نایاب نبودند. مثلاً به گنگی سوال ۵۷ دقت کنید: «همبستگی (cohesion) یک نمایان کیفی است از میزان درجه این که یک ماژول …» گزینه اول: بتواند به صورت فشرده‌تر نوشته شود. گزینه دوم…

من البته هیچ وقت به جاوا برنامه ننوشته‌ام ولی حدس می‌زنم اگر یک برنامه‌نویس جاوا در این امتحان شرکت می‌کرد سوتی‌های دیگری هم را پیدا می‌کرد.