یکی از دوستان در این تاپیک در انجمنها پرسیده است:
سلام من یه سوال داشتم ممنون میشم کسی پاسخ جامعی بهم بده!
فرق فریم ورک های تحت وب با فریم ورک هایی مثل دات نت چی هست؟ برای پی اچ پی کدوم فریم ورک بهتره؟ با یادگیری فریم ورک دیگه احتیاج نیست که توابع و جزییات خود پی اچ پی رو یاد گرفت؟
دیدم سؤال خوبی هست و خیلیها از من سؤال میکنند که فریمورک به چه معنیست؟ بنابراین یک توضیح نسبتاً مختصر میدهم:
فرض کنید شما قرار است یک سایت طراحی کنید که در آن، افراد ثبت نام میکنند و مثلاً شارژ تلفن همراه میخرند و بر اساس خرید، تخفیف میگیرند و در قرعهکشی شرکت میکنند و امثالهم. یا مثلاً ثبت نام میکنند و در مسابقه پیشبینی فوتبال جام جهانی شرکت میکنند و امتیاز و جایزه میگیرند. سؤال این است: آیا فرضاً اعتبارسنجی ایمیل، جزء اصلی این پروژه به حساب میآید؟ (اعتبار سنجی ایمیل یعنی مثلاً اگر کاربری gsddf را به عنوان ایمیل وارد کرد، ما هشدار بدهیم که این چیزی که شما وارد کردید، ایمیل نیست! ایمیل ساختاری شبیه به z@y.z دارد.) یا اعتبار سنجی نام کاربری (که فقط حاوی حروف الفبای انگلیسی و عدد و چند کاراکتر دیگر مثل - و _ باشد).
طبیعتاً کار اصلی شما متمرکز شدن روی طراحی سیستم فروش شارژ یا پیشبینی است و این عاقلانه نیست که ساعتها وقت خود را صرف نوشتن کد اعتبارسنجی ایمیل و نام کاربری کنید.
یا مثلاً در برنامهنویسی ویندوز، فرض کنید میخواهید یک فرم طراحی کنید و چند دکمه روی آن بگذارید که هر دکمه کار خاصی انجام میدهند.
در حالت عادی (بدون استفاده از فریمورکها) میدانید چند ساعت زمان لازم دارید که فقط مفهوم یک دکمه یا فرم را به ویندوز بفهمانید؟ (ویندوز چه میفهمد دکمه چیست؟ فرم چیست؟ فقط میتواند کدها را اجرا کند. حالا شما ممکن است با کدها به او بفهمانید که دکمه یعنی یک باکس که یک هاله رنگی درون آن است و اگر موس روی آن قرار گرفت کمی نارنجی شود و خلاصه کلی کدنویسی دیگر که شاید روزها وقت شما را بگیرد)
راه حل صرفهجویی در زمان: فریمورک!
مثلاً مایکروسافت میگوید: ای برنامهنویس! شما نمیخواهد درگیر نوشتن کد دکمه و فرم شوی، ما یک بار نوشتهایم و آنرا در یک بسته قرار دادهایم (که در اصطلاح به آن Framework یا چارچوب میگوییم) شما فقط کمی وقت بگذار و یاد بگیر که چطور با آن فریمورک کار کنی. در این صورت، هر وقت یک فرم خواستی، فقط کافیست کتابخانهای که در آن فریمورک هست را فراخونی کنی و بنویسی: Form frm = new Form() همین! ما یک فرم با تمام جزئیاتش برای تو میسازیم!
مثلاً مایکروسافت در مجموعه .NET Framework خود، هزاران امکان را تعبیه کرده و فقط با چند خط کد میشود از آنها استفاده کرد. مثلاً در پارسخوان، خواندن متون انگلیسی در دات نت فریمورک تعبیه شده بود، بنابراین ما دیگر ننشستیم آنرا دوباره بنویسیم، بلکه خواندن متن انگلیسی را با چند خط کد به مایکروسافت محول کردیم و وقتمان را صرف خواندن متن فارسی کردیم که در آن پکیج نبود...
فریمورک در برنامهنویسی تحت وب به چه معنی است؟
همانطور که در برنامهنویسی ویندوز، فریمورک داریم، در برنامهنویسی تحت وب هم دهها فریمورک داریم. مثلاً برای زبان جاوااسکریپت (JavaScript) فریمورکی داریم به نام jQuery که هزاران کار را به راحتی برای شما انجام میدهد. با چند خط کد، بهترین اسلایدشوها روی عکسهای شما اعمال میشود. انواع و اقسام پنجرههای pop-up و prototype به راحتی به کاربر نمایش داده میشود و بسیاری کارهای دیگر که شاید باور نکنید، تماماً با چند خط کد در پروژه شما تعبیه میشود.
یا مثلاً یک فریمورک برای زبان CSS میتواند bootstrap باشد که ما در پروژه نمرا از آن استفاده کردیم. اگر بدانید چقدر راحت و زیبا میتوان انواع جلوهها را روی عناصر صفحه ایجاد کرد! یا مثلاً فقط با یک خط کد، سایت شما برای تبلت و موبایل آماده میشود!!!
برای PHP چه فریمورکهایی داریم؟
برای زبان PHP هم فریمورکهای مختلفی توسط خورههای این زبان طراحی شده است. لیستی از این فریمورکها را میتوانید در سایت زیر مشاهده کنید:
http://phpframeworks.com
یکی از آنها که طرفداران بیشتری دارد و انصافاً مستندات بهتری هم دارد، CakePHP است.
مثلاً فرض کنید میخواهید یک فرم را به طور کامل Validate کنید (اعتبارسنجی). نام کاربری و ایمیل و تاریخ تولد و کد پستی و غیره... لازم نیست درگیر قواعد و قوانین و پیغامها شوید! میتوانید در این صفحه ببینید که چقدر ساده میشود یک فرم را اعتبارسنجی کرد. (توجه: ممکن است در نگاه اول کمی پیچیده به نظر برسد اما اگر کدنویسی کرده باشید در پنج دقیقه میتوانید یاد بگیرید که چطور باید از آن استفاده کنید)
آیا WordPress و Joomla و امثالهم هم یک فریمورک به حساب میآیند؟ فرق فریمورک و پلتفرم چیست؟
در کل، کلمه فریمورک را میتوان به هر قطعه کد نسبتاً بزرگی که از انجام کارهای تکراری جلوگیری کند نسبت داد. پس با این حساب، بله، وردپرس و جوملا هم میتواند یک فریمورک به حساب آید. اما دقت کنید که ما یک کلمه دیگر در دنیای برنامهنویسی داریم و آن کلمه Platform (بستر) است.
فرق فریمورک و پلتفرم را شاید بتوان اینطور گفت که فریمورک است که به شما کمک میکند تا کارتان را توسعه دهید اما معمولاً این شما هستید که به پلتفرم کمک میکنید تا توسعه پیدا کند!
یعنی مثلاً وردپرس به تنهایی بخشی از کارهای شما را انجام میدهد و بخشی از کارهایتان باقی میماند که شما با توسعه وردپرس، آن امکانات را به آن اضافه میکنید و نهایتاً پروژه شما آماده است، این یعنی شما بر روی بستر وردپرس کارتان را انجام میدهید. اما در فریمورک، چیزی آماده نیست. شما از صفر کار را شروع میکنید و با استفاده از فریمورک کارتان را انجام و توسعه میدهید.
توضیح این دو کلمه کمی سخت است و باید اعتراف کرد که بسیار شبیه به هم هستند و خیلی از اوقات، به جای هم به کار میروند و هیچ مشکلی هم نیست.
برخی اصطلاحات دیگر در این زمینه:
- اسکرپیت به چه معناست؟
یک کلمه دیگر هم در این زمینه مطرح است: اسکریپت (Script)
این کلمه، دامنه کوچکتری دارد. یعنی به وسعت فریمورک نیست. ما به قطعه کد کوچکی که یک کار تکراری را از روی دوش شما بردارد، اسکریپت میگوییم. مثلاً ممکن است در یک پروژه، برای اعتبارسنجی ایمیل، کار شما با همین قطعه کد ساده در این آموزش راه بیفتد: آموزش اعتبارسنجی ایمیل و URL در PHP با تابع filter_var
یا برای داشتن یک گالری عکس، نیازی به استفاده از کتابخانه حجیم jQuery نداشته باشید و با این اسکریپت کارتان راه بیفتد: قطعه کد جاوااسکریپت برای نمایش رندوم چند عکس در صفحه
- کامپوننت چیست؟
کلمه دیگری هم در این زمینه وجود دارد: Component یا مؤلفه.
کامپوننت را چیزی تصور کنید بین اسکریپت و فریمورک. یعنی نه به کوچکی اسکریپت است و نه به وسعت فریمورک. کامپوننت معمولاً روی یک بستر نصب میشود و یک سری کارهای تکراری مرتبط با هم را انجام میدهد. مثلاً یک کامپوننت گیر میآورید برای وردپرس که مدیریت گالری عکس را به آن اضافه میکند.
- پلاگاین چیست؟
کلمه دیگری که ممکن است در این زمینه بشنوید، Plug-in یا افزونه (یا Extension) است. پلاگاین هم همان مفهوم کامپوننت را دارد. یعنی روی یک بستر نصب میشود و یک کار تکراری را انجام میدهد.
فقط یک فرق کوچک میتوان بین کامپوننت و پلاگاین بیان کرد: شما میتوانید از کامپوننت استفاده کنید تا یک کار را انجام دهید اما پلاگاین آن کاری که شما میخواستید انجام دهید را انجام داده!! یعنی حتی نیازی به صرف زمان برای هماهنگ کردن و استفاده از پلاگاین نیست! (یعنی آن استفادهای که شما میخواستید از کامپوننت کنید و چیزی را تولید کنید، پلاگاین آن استفاده را کرده و آن چیز را تولید کرده!) یک پلاگاین ممکن است خودش از چند کامپوننت استفاده کرده باشد...
توجه: هیچ وقت درگیر کلمات نشوید. فراموش نکنید که اینها همه از زبان انسانها بیان شده و انسانها ممکن است برای یک چیز مشابه کلمات مختلفی به کار ببرند و نهایتاً همه منظورشان یکی باشد! پس در این مورد بحث نکنید که تعریف کامپوننت را درست نگفتید یا فلان کلمه فلان تعریف را دارد! اینها وحی منزل نیست. ممکن است یکی bootstrap را فریمورک بداند و همان لحظه یکی دیگر، آنرا script و یا حتی هیچ کدام از این کلمات!! مهم این است که همه اینها قرار است باری را از روی دوش شما بردارند، همین!
استفاده از فریمورک، آری یا خیر؟
نظرهای مختلفی در این زمینه وجود دارد. خیلیها میگویند: استفاده نکردن از فریمورک یعنی اختراع مجدد چرخ! پس عقل حکم میکند که شما از فریمورک استفاده کنید و چرخ را از اول اختراع نکنید.
اما برخی افراد (مثل من) میگویند: شما اگر چرخ را از اول اختراع کنید دستتان بازتر است تا بخواهید از چرخهای آماده استفاده کنید! (من معتقدم دلیل عقب ماندگی ما در رشته کامپیوتر این است که همیشه از چرخهای آماده استفاده کردهایم! هیچ وقت نرفتهایم مثلاً CPU را از صفر دوباره اختراع کنیم تا فردا بتوانیم یک CPU با ویژگیهای دلخواهمان تولید کنیم) مثلاً در پروژههای بزرگی مثل کارهای Adobe، آنها هیچ وقت نمیآیند از فریمورک استفاده کنند! معمولاً تمام کدهای خود را از صفر و خودشان مینویسند به همین دلیل هم هست که میتوانند به راحتی کدها را هر تغییری که خواستند بدهند. (مثلاً برای تمام سیستم عاملها و بسترهای سختافزاری مختلف آماده کنند)
در برنامهنویسی، معتاد شدن به یک فریمورک، زمانی که برای انجام کار مورد نظر شما چیزی تعبیه نکرده است، کار را سخت میکند! مثلاً فریمورک bootstrap برای سایتهای RTL (راست به چپ) تقریباً تدابیر درستی نیاندیشیده و این کار شما را گاهی اوقات آنقدر سخت میکند که نهایتاً به این نتیجه میرسید که اگر خودم از اول مینشستم کد مینوشتم سریعتر میشد تا بخواهم مشکلات این فریمورک را رفع کنم تا با شرایطم جور در بیاید.
استفاده از فریمورک معایب دیگری نیز دارد:
- اگر یک باگ ساده در فریمورک مورد استفاده شما کشف شود، چون آن فریمورک در اختیار همه است، سایت شما به راحتی در خطر میافتد. مثلاً سایتهایی که با وردپرس بالا میآیند، اگر یک باگ ساده کشف شود، میبینید یک دفعه صدها سایت وردپرسی هک شدند!
- شما گاهی مجبورید دانلود حجم زیادی داده به کاربر تحمیل کنید در حالی که میخواهید یک کار ساده انجام دهید که بدون فریمورک در چند خط انجام میشد! مثلاً bootstrap حدود ۱۰۰ کیلوبایت است! در حالی که شاید ما فقط از ۱۰ کیلوبایت آن استفاده کردهایم. (شاید بگویید خوب در بین کدها بگرد و اضافات را پاک کن! خوب، اگر میخواستم وقتم را صرف پیدا کردن و پاک کردن کدهای اضافه کنم که از اول کد مینوشتم که سنگینتر بودم!)
- خطر تکراری شدن پروژه شما وجود دارد. شاید یکی از بزرگترین عیبها همین باشد! مثلاً تمام سایتهایی که از فریمورک bootstrap یا jQuery استفاده میکنند، ظاهر تقریباً یکسانی دارند و این ممکن است کلاس کاری پروژه شما را به خطر بیندازد. (مشتری شما فکر میکند شما زمان زیادی صرف نکردهاید یا دزدی کردهاید!)
- دست شما باز نیست! معمولاً محدودیتهایی در کدهای فریمورکها وجود دارد که باعث میشود شما نتوانید آنطور که میخواهید روی پروژهتان مانور بدهید.
- استفاده از فریمورک، عیبیابی و رفع عیب پروژه را بسیار سخت میکند. اگر فرضاً یک خطا در یک قطعه از کدهای فریمورک ببینید، تا بخواهید بفهمید دلیل آن چه بوده، کلی زمان میبرد! اما اگر خودتان آن کد را نوشته باشید، دقیقاً میروید بالای سر همان فایل و همان خطی که باعث شده آن خطا رخ دهد!
با همه این معایب، اما شکی نیست که در برخی موارد نمیتوان بدون Framework زندگی کرد! به خصوص زمانی که کلمه Rapid در پروژه مطرح شود. (یعنی بخواهید کار را سریع و کم هزینه تحویل دهید)
در کل، من خودم به این نتیجه رسیدهام که انسان خودش برای پروژههای خودش یک فریمورک بسازد موفقتر است تا بخواهد از فریمورکهای دیگران استفاده کند (مگر اینکه هزینهها اجازه ندهد). (تنوع فریمورکها هم به خاطر همین است! همه به مرور به این نتیجه رسیدهاند که خودمان برای خودمان فریمورک داشته باشیم دستمان بازتر است و وقتی آنرا در اختیار عموم قرار دادهاند، تعداد آنها بالا رفته است. وگرنه کسی شک ندارد که جوملا و وردپرس میتوانستند یک پروژه باشند! چرا یک پروژه نشدند؟ چون هر کدام احساس میکنند فریمورک خودشان را بسازند راحتترند!!!)
در کل در استفاده از فریمورکها این آیه و حدیث یادتان باشد:
کُلوا و اشرَبوا و لا تُسرِفوا (بخورید و بیاشامید ولی اسراف نکنید) (آیه)
خیرُ الأمورِ أوسَطُها (بهترین کار در امور، میانهروی در آنهاست) (حدیث)
کدام فریمورک را انتخاب کنم؟
- مهمترین دلیل انتخاب فریمورک، مستندات آن فریمورک است. در سایت رسمی هر کدام از آنها که وارد شوید بخشی میبینید به نام Docs یا Documentations یا Help یا Support و امثالهم... آنجا را بررسی کنید و ببینید آیا با مستندات کنار میآیید یا خیر؟ به راحتی و با یک نگاه میشود فهمید که این فریمورک آیندهدار است یا خیر! روی آن سرمایهگذاری شده است یا خیر؟
- در سایت رسمی، برخی نمونه سایتها هم که با آن فریمورک کار شده باشد قرار داده شدهاند، آنرا هم بررسی کنید و ببینید آیا قوی کار شده یا خیر؟
- در کل بهترینها در جستجوهای گوگلی در رتبه بالاتری قرار میگیرند. مثلاً به نتیجه این جستجو (PHP Framework) دقت کنید.
سخن پایانی:
وقتی برای مصاحبه برای استخدام در یک شرکت مرتبط با برنامهنویسی میروید، یکی از سؤالاتی که از شما میپرسند این است که:
با چه فریمورکها و پلتفرمهایی کار کردهاید؟
سعی کنید تجربه کار با چند تا از برترینها را در کارنامه خود داشته باشید.
این روزها WordPress آنقدر قوی شده است که میتوان به عنوان فریمورک و بستر بسیاری از کارها از آن استفاده کرد. شاید این پیشنهاد خوبی باشد که آنرا بستر کارهای خود قرار دهید و در کنارش از فریمورکهای دیگر برای توسعه استفاده کنید.
دوستان دیگری که در این زمینه تجربه دارند، میتوانند در بخش نظرات، نظر خود را بیان کنند تا صدها نفر دیگر که به مرور با جستجو وارد این صفحه میشوند، آنرا مطالعه کنند.
موفق باشید،
حمید رضا نیرومند