مسئله در "کل" پیچیده است، ولی در "جزء" شیرین

مقدمه:داستان از جایی شروع شد که به عنوان یک برنامه نویس بعد از زمستان های بسیار که یخ حوض شکسته و عمر خویش را صرف یادگیری کرده بودم تصمیمی جان فرسا گرفتم (البته جان فرسا برای من و در آن سطح). بله تصمیم چیزی نبود جز قبول یک پروژه فروشگاه اینترنتی... در این مقاله سعی بر نوشتن در مورد چاله ها، سراشیبی ها و قله های این مسیر است. باشد که مفید واقع شود... یادگیری کافی استدر حقیقت یادگیری در برنامه نویسی و هر آنچه به کامپیوتر مربوط می‌شه، هیچوقت متوقف نخواهد شد و شخصی که یادگیری در این حوزه را متوقف کنه، ناخواسته از این چرخه حذف خواهد شد و به گورستان کامپیوترها می‌پیوندد ولی از جایی به بعد یادگیری به تنهایی کافی نیست و باید داشته هات رو به کار ببندی!!بله ترس های زیادی در این مورد وجود داره و مقابله با این ترس ها کار راحتی نیست. ترس هایی که می‌تونه شب و روز انسان رو سیاه کنه. انسان رو به سمت بی خوابی های شبانه ببره. جویدن ناخنِ از سر استرس رو به جان آدمی بندازه. ترس هایی از این دست؛ "نکنه دانشم به اندازه کافی نباشه!!"، "نکنه از پسش برنیام!! "نکنه مشتری چیزی رو بخواد که من بلدش نباشم!!".هدف از گفتن این ترس ها اینه که خواننده بدونه انسان ها در ترس های خود تنها نیست و این ترس هایی مشترک بین تمام برنامه نویس هاست. ترس هایی که بعضا به جا هستن و هرکدوم راه حل خودشون رو دارن."کافی نبودن دانش" ترسی بچگانه و بزرگترین ترس یک برنامه نویسه. تنها زمانی این ترس منطقیه که دوستان و بزرگواران اینترت رو ملی کنن و یا اینترنت بر اثر اتفاقی از بین بره... بله بله، ما برنامه نویس ها اینترنت رو داریم!! "How TO ..." جای اون سه نقطه‌ی انتهایی هرچیزی که میخوای رو بنویس تا اینترنت جوابش رو بهت بده!! پس ما حتی در طول تکمیل پروژه میتونیم چیزهای جدید یادبگیریم و این موضوعی مشترک بین تمام برنامه نویس هاست.موضوع دیگه ای که وجود داره اینه که هرشخصی مشتری ای در حد و اندازه های خودش پیدا میکنه!! یعنی شما به عنوان یک برنامه نویس تازه کار قرار نیست کارفرمایی از شرکت ناسا داشته باشد. کارفرمای شما بی شک در حد و اندازه های خود شما خواهد بود پس نگران چالش هایی که کارفرما شمارو باهاش مواجه می‌کنه نباشید چون کارفرمای شما در ابتدا اونقدرهاهم که فکر میکنید حرفه ای و پر توقع نیست. بزرگ ترین چالش بعد از قبول پروژهشاید بزرگترین چالش بعد از قبولی یک پروژه، نقطه شروع یک پروژه باشه. پروژه ای به این بزرگی، اونم تک نفره، از کجا شروعش کنم؟! آدم اگه بخواد یک سایت کامل رو کد نویسی کنه خیلی سخته ولی اگه بخواد یک فرم لاگین رو طراحی و بعد یک قسمت برای فروش محصولات طراحی کنه و داخل اون قسمتی برای نظرات بزاره و ...کار به مراتب ساده تر خواهد شد، پس پروژه رو جزء جزء ببینید و بعد دست به کد نویسی ببرید.برگ های این درخت نقاط خوبی برای شروع پروژه هستند.شما می‌تونید از طراحی قالب شروع کنید، که در این صورت باید قالب را به سه قسمت Header، Content و Footer تقسیم کنید و هر قسمت را به صورت مجزا کد نویسی کنید. یا حتی از طراحی دیتابیس خودتون شروعش کنید. نکته: برای طراحی دیتابیسِ خود باید توجه کنید که به اندازه کافی با کارفرما در مورد نیازهاش صحبت کرده باشید و یا به اصطلاح سنگ هایتان را واکنده باشید. زیرا اگر اشتباه متوجه خواسته های مشتری شده باشید و در اواسط پروژه بخواهید پایگاه داده خود را تغییر دهید، احتمالا در دردسر بزرگی افتاده اید. پس در این مرحله صبر و شکیبایی جزو بهترین و درست ترین کارهاست.نکته: اگه دیتابیس خود را محکم و جامع بسازید، اضاف کردن هر ویژگی ای برای وبسایتتون سهل تر از چیزیه که فکرشو میکنید. وبسایت هایی امثال دیجی کالا؛ ویژگی های جست و جو، مرتب سازی، مقایسه کالا و غیرشون را مدیون همین دیتابیس کامل خود هستند...نکته: از دیتابیس خود نمودار ER داشته باشید که بدونید حرف حسابتون چیه و قراره جدول ها و روابطتون چی باشه!! حتی این نمودار در تغییرات بعدی به شما کمک شایان، بهرام، پرهام و بهنازی خواهد کرد!!!حماقتی به نام "PHP خام"قانونی وجود داره که میگه: " اگه دیدی کاری خیلی سخته ولی بقیه انجامش دادن، شک نکن داری راهشو اشتباه میری." شما برای باز کردن یک پیچ، ابزارهای مختلفی دارید. شما میتونید اون پیچ رو با چاقو باز کنید!! میتونید با بیچ گوشتی باز کنید و یا میتونید با دریل شارژی اونو باز کنید!! ساخت یک سایت هم به همین منواله. شما میتونید یک سایت رو با php خام کد نویسی کنید یا میتونید از یکی از فریم ورک های موجود استفاده کنید. پس اگه با وبسایتی مواجه شدید که داره فیل هوا میکنه ولی وبسایت شما لاگین هم به زور انجام میده، بدانید و آگاه باشید که وبسایت های بزرگ رو هیچگاه با php خام کد نویسی نمیکنن!! شاید اگه برنامه نویس کهنه کار و یا حتی برنامه نویس دم به کهنه کاری باشید تعجب کنید که در قرن 21، اولین پروژه وبسایتم رو با php خام ایجاد کردم!! php به تنهایی خیلی کودن است!! هیچ چیز نمیداند و برای جزء به جزء آن باید کد نویسی کنید. به عنوان مثال اگه بخواهید برای صفحه لاگین خود یک اعتبار سنجی داده بنویسد باید خودتان به برنامه بگویید که فلان کاراکتر رو نپذیرد، اندازه اش از فلان عدد بیشتر و یا کمتر نباشد، نوعش ایمیل باشد و ... که برای هر کدام از آن ها حداقل ساعت ها وقت نیاز است و در آخر مطمئن باشید که جایی از کار را اشتباه کرده اید!!! ولی در فریم ورکی مثل لاراول با چند خط کد و در کمتر از یک دقیقه میتوان تمام این کارها را به نحوه احسنت انجام داد.با این اوصاف یکبارهم که شده با php خام یک پروژه نسبتا بزرگ انجام بدید تا در صورت آشنایی با فریم ورک های موجود، بدانید که با چه نعمتی مواجه شدید.هک شدن مال همسایسبرای یک برنامه نویس تازه کار و یا برنامه نویسی که درحال اجرای اولین پروژش هست، زیادهم بد نیست اگه sql injection داشته باشه!! حقیقت اینه که تمام ما باید اشتباهاتی انجام بدیم، از اشتباهاتمون درس بگیریم و بهتر و بهتر بشیم.اولین وبسایت من sql injection داشت به صورتی که لازم به اجرای کوئری پیچیده ای برای هک شدن نداشت و فقط لازم بود یک یوزرنیم وارد کنید و بعد داخل پسوردش بنویسید OR '1'= '1'همین کافی بود که کل username و password های هش نشده رو جلوی شما بزاره!!من بعد از انجام این اشتباه بود که به دنبال راه حل گشتم و قبل از اون هیچ اطلاعی از امنیت وبسایت نداشتم.راه حل مقابله با این حملات، استفاده از کلاس های PDO در PHP بود. یعنی شما برای برقراری ارتباط با دیتابیستون به جای استفاده از دستورات قدیمی مثل mysqli_query باید از توابع کتابخانه PDO استفاده کنید.کد نویسی تمیزقرار نیست کد شما فقط و فقط کار کنه!!بلکه قراره کد شما، هم زمان که کار میکنه، تمیز و قابل انعطاف هم باشه!! کدها از نظر من به دو دسته تقسیم می‌شن. یکی شبیه به ساختمونی که هر تیکش رو با چسب بهم بچسبونید، چیزی شبیه به عکس زیر!!در اینجور مواقع به اصطلاح مشکلات رو وصله کاری کردن برای اجرای سریع کد در لحظه و ایجاد خطر در آینده!!! خطری که میگه: منو سریع کد نویسی کردی ولی از من توقع تغییر نداشته باش!!کتاب کد نویسی تمیز از عمو باب را در این مورد مطالعه فرماییدو یا کدی خواهید ساخت که تمیز و مرتب است و هر قسمت به درستی کار خودشونو انجام میدن.یک قانون وجود داره (البته داخل ذهن من) که میگه: کد تمیزی که در مدت 5 روز مینویسی، بهتر از کد وصله شده ای هست که در مدت 10 دقیقه می‌نوسی.کدها قرار نیست تا آخر عمرشون به همین منوال پشت ویترین باشن و شما از پشت ویترین به کدتون نگاه کنید!! کدها بالاخره روزی تغییر می‌کنند و شما مجبورید این موضوع رو بپذیرید. شما باید در طول زمان، ویژگی هایی به وبسایتتون اضاف کنید و یا ویژگی هایی رو از وبسایتتون حذف کنید و اگه کدتون مرتب و تمیز نباشه، عمرا قادر به انجام چنین کاری باشید!! چیزی که من با اون مواجه شدم. هر قسمت از کد شما مخصوص انجام کار خاصیه. قرار نیست Header شما هم زمان که سربرگ وبسایت شمارو نمایش میده، مسئول قسمتی از Footer شماهم باشه و این دو باید کاملا از هم دیگه مجزا باشن. اگه قرار باشه قسمتی از Header مربوط به قسمتی از Footer باشه، زمانی که لازم باشه Header رو تغییر بدید Footer وبسایت هم قلقلک میشه و باید Footer رو هم تغییر دهید و این به مراتب هزینه بر است. کد نویسی کثیف حتی میتونه باعث نابودی کامل پروژه بشه!! شما فرض کنید که قراره صفحه لاگین سایت خودتون رو تغییر بدید و برای تغییر قسمت لاگین مجبور به تغییر session ها باشید و برای تغییر session ها مجبور به تغییر ساختار دیتابیس خود باشید و به همین منوال در دوری باطل گیر خواهید افتاد که در این صورت باید با کد خود خداحفظی کنید!!کد خود را مانند بخش های مختلف یک کارخونه تصور کنید. به عنوان مثال اگر قرار باشه یک کارخونه تولید کیک با طعم پرتغال به جای تولید کیک با طعم پرتغال، دست به تولید کیک توت فرنگی بزنه؛ قرار نیست کارخونه تخریب شود و دوباره کارخونه ای مخصوص کیک توت فرنگی ساخته بشه بلکه قراره قسمتی که مربوط به طعم کیک هاست تغییری جزئی کنه. و یا اگر شیر آب خونه شما چکه کنه، قرار نیست برق کشی خونه رو بررسی کنید تا مشکل چکه کردن شیر آب رو پیدا کنید و مستقیما متوجه می‌شید که مشکل از شیر آبه.توصیه پایانی:اگه برنامه نویس باشید، در طول کارهاتون با افرادی مواجه می‌شید که مدام در حال تعریف از خود و شق القمرهای خود هستن. اگه تونستید چیزی از اون افراد یادبگیرید که هیچ!! ولی اگه بودن اون افراد تنها باعث تخریب اعتماد به نفس شما می‌شه، اونارو به راحتی نادیده بگیرید و زندگی و حرفه‌ی خودتون رو نجات بدید. این دسته از افراد، پر تکرار ترین انسان ها در این حرفه هستن!! دست از مقایسه خودتون با دیگران بکشید و بدونید شما در مسیر خودتونید و بقیه در مسیر خودشون. پیروز موفق باشیدجمع نمرات 20