غول بی شاخ و دمی بنام برنامه نویسی! (2)

پیرو مقالهء قبلی با همین عنوان، گفتم یه چند مثال واقعی دیگه از ظرایف برنامه نویسی رو که دوباره به ذهنم رسید براتون بذارم تا بفهمید در این وادی فرق برنامه نویسی با برنامه نویسی و برنامه با برنامه چیه.

بنظر بنده و تاجاییکه دیدم، خیلی از سایتها و خیلی از برنامه ها بیشتر شبیه این ساختمان هایی هستن که بساز بفروش ها میسازن و ظاهر و نماش و سردرش رو قشنگ کار میکنن و هزینهء قابل توجهی هم برای اینها میکنن، اما اونوقت بقیهء مسائل و باطن کار در خیلی موارد از این نما و ظاهر کم کیفیت تر و ناقص تره و کم گذاشته شده و از هزینه هاش زده شده.
طبیعتا در دید و بررسی اول و به چشم آدمهای ظاهربین یا ناوارد، این ساختمان ها قشنگ و بی نقص بنظر میان، ولی با بررسی دقیقتر و کاملتر توسط افراد وارد به کار هست که به زودی مشخص میشه چه ضعف ها و نقایصی دارن!
البته این گفتار رو بصورت کلی عرض کردم و منظور خاصی به شخص یا برنامه های خاصی ندارم و در ادامهء این پست هم صرفا یکسری نکاتی رو که بنظرم نکات جالبی میان اما کمتر کسی متوجه اونا میشه یا اونا رو اعمال میکنه میخوام بیان کنم از دید خودم تا بخصوص افراد مبتدی و کسانی که در حال یادگیری و شکل دادن دید خودشون دربارهء برنامه نویسی هستن یک مقدار بیشتری با بخشی از ظریف و اصول برنامه نویسی حرفه ای آشنا بشن. مسلما حیطه ها و پارامترهای دنیای گسترده و پیچیدهء برنامه نویسی فقط همین موارد نیستن و خیلی مباحث دیگر هم هست که توسط دیگران تاحالا بقدر کافی اکثرا بیان و تبلیغ شدن مثل همون استانداردها و سازماندهی کد و چیزهایی مثل شیء گرایی و الگوهای طراحی که معرف همگان هست، ولی مواردی که بنده بیان میکنم همونطور که قبلا اشاره کردم یکسری موارد پایه ای تر و درونی تر خود منطق و الگوریتم ها و عملکرد اصلی برنامه هستن که فکر میکنم به نسبت کمتر بهشون پرداخته شده و کمتر شناخته شده هستن، و این باعث شده برنامه نویسان اکثرا دچار عدم تعادل در یادگیری و کدنویسی باشن و برنامه ها تا حدی سطحی و توخالی بشن. اصولا یک چیزی که شاید زیاد شنیده و خودتون هم بهش پی برده باشید اینه که برنامه های برنامه نویسان ما بیشتر از نوع برنامه های دیتابیسی است و بیشتر کار و مهارتشون در اینطور برنامه ها و همچنین رابط گرافیکی است. چرا؟ بنظر بنده این بخاطر همون مسئلهء پایین بودن کلی سطح علمی است و سطحی یاد گرفتن و سطحی فرض کردن دنیای برنامه نویسی. چون اصولا برنامه های دیتابیسی و بحث رابط گرافیکی چیزهایی هستن که نیاز به عمق و سطح و جامعیت علمی زیادی ندارن و به همین دلیل هم هست که دقیقا برای همین چیزها برنامه های ویژوال هم وجود دارن چون کامپیوتر هم میتونه بخش قابل توجهی از کار رو در اینطور برنامه ها بجای انسان انجام بده، و این باعث ایجاد یک توهم نسبت به برنامه نویسی و برنامه نویس بودن میشه چون هرکسی با کمی یادگیری و سواد سطحی هم میتونه با کمک این ابزارها در این زمینه کارهایی بکنه.
البته ببخشید که بنده این مسائل رو به این شکل صریح بیان میکنم که شاید بنظر بعضیا توهین و خودبزرگ بینی باشه! در فرومهای اینترنتی هم بنده بارها سر اینطور حرفها و نظرات خودم با دیگران مشکل و درگیری پیدا کردم که عجیب نیست. ولی من فکر میکنم بیان بدون تعارف واقعیت ها یا نظرات، هرچند اشتباه باشه یا مقداری آغشتگی به مسائل شخصی خاصی مثل غرور و غیره هم داشته باشه، بهرحال از اینکه تعارف و پرده پوشی باشه در کل مفیدتر و سازنده تر است چون در این جریان حداقل به یکسری ضعف ها و واقعیت های گرچه تلخ پی برده میشه که این آگاهی قدم اول در راه پیشرفت و قدرتمند شدن واقعی است.
خب دیگه یکسر بریم سر بیان یکسری مسائل فنی!
موقع ثبت نام همه میدونن و به ذهنشون میرسه که مثلا روی انتخاب پسورد معیارهای خاصی بذارن. البته من خودم طرفدار گذاشتن معیارهای خیلی دقیق و سختگیرانه روی پسورد نیستم، چون سختگیری زیاد در این زمینه فایده نداره و چیزی نیست که بشه به کاربر به این راحتی تحمیلش کرد که اگر تحمیل کنیم راههای دور زدنش هم زیاده که جلوگیری از اونا مشکله و میتونه خودش به ضعف ها و اشتباهات بزرگتری منجر بشه. انتخاب پسورد مناسب معمولا باید با آگاهی و رضایت خود کاربر باشه؛ ولی یکسری محدودیت هایی دیگه همه میذارن که بنظر درست میاد. مثلا میگن حداقل طول پسورد 6 کاراکتر باشه. همونطور که گفتم همه بلدن در بخش ثبت نام چنین چیزی بذارن، که بنوعی بخش درونی تری از همون سردر و نما که بهش اشاره کردم هم هست، ولی چه درصدی از برنامه نویسان میان و این معیارها رو در بخش تغییر پسورد هم چک میکنن؟ نکته اینه و ظرافتش اینه! موضوع اینه که اگر محدودیتی هست، معیاری هست، باید همه جا باشه. پس موقع تغییر پسورد هم باید این معیارها اعمال بشن، وگرنه این خودش یک روش برای دور زدن این معیارها هم میشه. ضمنا نکتهء دیگه اینکه نگاه کنید ببینید آیا شما این معیارها رو در هر بخش و صفحه جداگانه تعریف و Hardcode کردید یا اینکه نه و مثلا در همه جا از یک فایل کانفیگ مرکزی مشترک اون رو میخونید. نیازی به توضیح نیست که کدوم روش چرا اصولی تره!
یک مورد مشابه این هم باز مورد ایمیل است. مثلا موقع ثبت نام اگر شما با ارسال یک کد/لینک خاص به ایمیل، صحت و مالکیت ایمیل مورد نظر رو چک میکنید، پس آیا نباید در بخش تغییر ایمیل هم همین کارها رو دوباره تکرار کنید؟ البته تغییر ایمیل مقداری با موقع ثبت نام تفاوت میکنه و اهمیتش کمتره، اما بهرحال حداقل بعضی جاها هم این چک کردن دوباره لازم بنظر میاد، بنابراین باید امکانش در برنامه های کلی گذاشته بشه. مثلا بنده در پروژهء سیستم رجیستر و لاگین خودم این امکان رو گذاشتم که تعیین کنیم برای تغییر ایمیل هم این Verify کردن انجام بشه، انجام نشه، یا از کانفیگ مربوط به بخش ثبت نام در این باب پیروی بشه که هر رویه ای اونجا داشت برای تغییر ایمیل هم از همون رویه تبعیت بشه. پس مشاهده میکنیم که یک سیستم اصولی باید چقدر دقیق و در عین حال قابل کانفیگ باشه و برای نظرات و سناریوهای مختلف انعطاف لازم رو داشته باشه.
اصولا یکی از نکات قابل توجه سیستم رجیستر و لاگین بنده، گزینه های کانفیگ زیادی هست که داره. متغییرهای کانفیگ زیادی داره که هرکدام حالت های متنوعی دارن که تقریبا هر نوع سناریو و نظر ممکن رو ولو در مسائل نسبتا جزیی پوشش میدن. البته گاهی یک دلیل دیگر این مسئله اینه که یکسری مسائل رو نمیشه جز با تجربه در طول زمان در دنیای واقعی و با کاربرد واقعی فهمید و از قبل دونست که چه رفتار و کانفیگی برای اونها مناسبه، و بخاطر همین بنده اونا رو قابل پیکربندی و فعال و غیرفعال کردن گذاشتم تا در آینده اگر لازم شد بشه اونا رو به هر شکل لازم تنظیم کرد.
یکی دیگر از مسائلی که بنظرم در دنیای واقعی نیاز هست اینه که حتی خیلی از کانفیگ های ادمین هم باید از کاربران معمولی جدا باشه! مثلا شاید شما برای کاربران عادی بخواید سیستم قفل اکانت رو فعال کنید اما برای اکانت ادمین نخواید این کار رو بکنید و بجاش بر یک پسورد قوی یا روشهای امنیتی دیگر اتکا کنید، پس باید کانفیگ های اکانت ادمین در این زمینه از کانفیگ های کاربران عادی جدا باشه. حتی اگر بشه برای هر کاربر بصورت جداگانه هم بعضی مسائل قابل کانفیگ باشه، لزوما بد نیست که شاید خوب یا حتی لازم هم باشه. مثلا در همین مورد سیستمهای قفل اکانت و IP، بنده این امکان رو در برنامم گذاشتم که هر کاربر بتونه خودش این سیستمها رو برای اکانت خودش فعال یا غیرفعال کنه، ولی البته اینکه این اختیار رو به کاربران بدیم و تا چه حدی، خودش توسط متغییر کانفیگ دیگری قابل تعیین است، پس میشه اگر این گزینه در عمل منجر به مشکلات پیشبینی نشده ای شد اون رو غیرفعال کرد.
پس مشاهده میکنید که یک برنامهء عمومی و منعطف میتونه چقدر تنظیمات داشته باشه که اینها طبیعتا منجر به افزایش حجم و پیچیدگی کد هم میشن که چیز مطلوبی نیست ولی بهرحال چاره ای هم نیست و برای داشتن یک برنامهء بی نقص و منعطف و قوی نیاز به این هزینه ها است. اینه که میگم برنامه با برنامه میتونه تفاوت از زمین تا آسمان داشته باشه، ولی معمولا از سردر و ظاهر برنامه و بررسی های سطحی و عجولانه نمیشه اینطور مسائل رو براحتی تشخیص داد. من ترجیح میدم برنامم از درون پر و قوی باشه تا اینکه فقط ظاهرش قشنگ باشه و پیشرفته بنظر بیاد. شما چطور؟
یکی از مثال های دیگه اینه که در زیرسیستم هایی که ایمیل ارسال میکنن، تعداد ایمیل های ارسالی رو باید طوری محدود کرد یا قابل کانفیگ گذاشت، چون اگر اینطور نباشه از اینطور سیستمها میشه سوء استفاده ها و شیطنت هایی کرد. مثلا یک تستی که بنده انجام دادم و حتی روی سیستم ویبالتین هم کار کرد این بود که در سیستم ثبت نام که ایمیل Verify ارسال میکنه محدودیتی وجود نداشت و به این شکل بنده میتونستم مثلا با دادن ایمیل یک شخص دیگری و نوشتن یک صفحهء HTML ساده و با کمی جاوااسکریپت ساده و این حرفها کاری کنم که بصورت خودکار همینطور زرت و زرت ایمیل های Verify به ایمیل طرف ارسال بشه و به این شکل بقول معروف Email bomb کنم (البته اگر بشه اسمش رو Email bomb گذاشت). پس این میتونه قابل سوء استفاده و مایهء آزار دیگران باشه و از طرف دیگر میتونه به Black list شدن سرور و سایت شما هم منجر بشه (قبلا دیدم که یاهو کلا ایمیل های ارسالی از یک سرور رو بخاطر ارسال اسپم از اون سرور بلاک کرده).
حالا این کارها، دونستن و توجه به این جزییات و تمهید کردن برای اونها، وظیفهء چه کسانی است؟ آیا وظیفهء کسی بجز برنامه نویسان است؟
مسلم است که با این همه امکان کانفیگ، روند عملکرد و کدنویسی برنامه پیچیده تر میشه. و برنامتون پر میشه از if و and و or! چون در هر عملیاتی باید چک بشه فلان و فلان متغییر کانفیگ الان چیه، و بر اساسش عمل درستی انجام بشه پارامترهای درستی تعیین بشن و همچنین ترکیب متغییرهای کانفیگ با هم باز خودشون میتونن ترکیبات بیشتری رو ایجاد کنن، مثلا اگر متغییر کانفیگ فلان فلان مقدار رو داشت اونوقت متغییر کانفیگ فلان فلان مقدار رو داشت چی میشه و غیره. ولی کار برنامه نویس همینه که به همهء جزییات در آن واحد حواسش باشه و بتونه همهء این حالات رو پیشبینی و هندل کنه (البته خطاهای انسانی تاحد معقولی همیشه امکانپذیر هستن). اینه که برنامه نویسی ذهن قوی و دقت بالایی نیاز داره. همینطوری کشکی نیست. من توی خیلی محیطهای کاری که هستم میبینم افراد اصلا مقدار تمرکز و دقتی رو که کار ما داره درک نمیکنن و مثلا همش میخوان با آدم حرف بزنن شوخی کنن وقتش رو بگیرن و نمیفهمن که از جهاتی مثل اینه که وسط جراحی قلب و مغز با یک جراح در اتاق عمل حرف های متفرقه و غیرجدی بزنن! خب شغل دیگران که اینطوری نیست از کد و برنامه نویسی و کامپیوتر سردرنمیارن. البته بنظر من درواقع بقیهء زندگی هم تاحد زیادی ماهیتا همینطوره و اینو آدم با برنامه نویس شدن میتونه خیلی بهتر بفهمه و به عمل دربیاره. آدمهای دیگه اکثرا در شغل و زندگی شخصی خودشون هم اشتباه و بی دقتی زیاد دارن بخاطر همینکه این واقعیت رو که اصولا سراسر زندگی همینقدر جدی و دقیق است درک نکردن.
خب دیگه سرتون رو درد آوردم! زیاد نوشتم. ولی وبلاگ خودمه به کسی مربوط نیست!! دوست نداری نخون کسی مجبورت نکرده!!!
من میتونم از این جزییات و موارد زیاد بگم براتون، ولی فکر کنم حداقل تا الان همین حد دیگه کافیه.
امیدوارم یک برنامه نویس درست و حسابی و علمی و دقیق و عمیق بشید، نه برنامه نویسانی که با اکثریت آدمهای معمولی تفاوت خاصی ندارن. امیدوارم عمق و گستره و پیچیدگی و دشواری این رشته رو درک کنید و جدی بگیرید، نه اینکه با بچه بازی و تفریح اشتباه بگیرید. البته این رشته لذت بخش هم هست، و عمیق ترین لذت رو هم آدم وقتی بدست میاره که احاطهء گسترده و عمیق هم بدست آورده باشه و چیزهایی رو بتونه حل کنه و کارهایی رو انجام بده که هرکسی نمیتونه. اون لذتی که با طراحی دوتا برنامهء کلیشه ای دیتابیسی و با کمک ابزارهای طراحی ویژوال هرکسی میتونه انجام بده، عاید میشه، برای امثال من لذت سطحی و ناچیزیه! من از کارهایی لذت میبرم که عمق و اصالت واقعی دارن و دارای سطح علمی بالایی هستن، نیاز به سواد زیادی دارن، نیاز به قدرت ذهن های برتر دارن. کارهایی که علم خوره از عهدش برمیاد! یک علم خوره میتونه اندازهء 10 نفر کارایی داشته باشه کارهایی رو بکنه که 10 نفر برنامه نویس معمولی هم با هم جمع بشن نمیتونن انجام بدن.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>