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

مسئله ای که در این پست میخوام بهش بپردازم نقش تئوری در برنامه نویسیه.
خیلی ها اعتقاد دارن باید برنامه نویسی رو تجربی یاد گرفت. ولی بنظر من برنامه نویسی اصولی و سطح بالا (یعنی اینکه فقط اون قضیهء برنامه های کلیشه ای دیتابیسی و اینترفیس گرافیکی نباشه) حداقل نصفش بر پایهء تئوری بنا شده و نیاز به یادگیری و احاطه بر تئوری های مربوطه داره. تئوری های برنامه نویسی هم گسترده هستن و بعضا حتی با ریاضیات پیشرفته هم ارتباط دارن.

از یک دیدگاه دیگه بخوایم نگاه کنیم اصولا کد خودش تئوریه! مگر کد همون الگوریتم همون کد همون جریان پردازش تئوریک و بیان منطق و روش کارکرد نیست که قراره مسئلهء مورد نظر رو حل بکنه و به ما نتایج مورد نظر رو بده؟ خب این چه فرقی با تئوری داره؟ منکه فرق خاصی نمیبینم. درواقع کدها، الگوریتم ها، برنامه، بیشتر تئوری هستن تا هرچیز دیگه! و کامپیوتر ماشینی است که این تئوریها رو در دنیای مجازی خودش برای ما اجرا میکنه و درستی اونا رو به محک میذاره.

برنامه ای که ما مینویسیم یک بیان تئوریک از راه حل مسائل و رسیدن به نتایج مورد نظر است. و کامپیوتر اون رو برامون اجرا میکنه. بنابراین بنظر من در برنامه نویسی اصولا بین تئوری پردازی و عمل فاصلهء زیادی نیست و این دوتا تقریبا با هم یکی هستن. اگر شما بتونید الگوریتمی بنویسید، تئوری های لازم و کامل رو برای حل مسئله ای، نوشتن برنامه ای، تهیه کنید، اصولا بخش اصلی و اعظمی از کار انجام شده و عمدتا کافیه اون رو به رایانه و ابزارهای مربوطه بدیم تا بشه بصورت عملی ازش استفاده کرد. برنامه نویسی یکی از حیطه هایی است که در اون رسیدن از تئوری به عمل به سریعترین و راحتترین شکل ممکن صورت میگیره، و این تاحدی بخاطر اینه که اصولا کامپیوتر خودش وسیلهء اجرای تئوری ها و راه حلهای انتزاعی در محیطی مجازی است. رایانه یک ماشین پردازش اطلاعات است. مثل مغز ما. و اطلاعات و تئوری ماهیتا از یک جنس هستند.

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

یک نمونه ای که بنده میتونم مثال بزنم از چنین حیطه هایی که برنامه نویسان عادی بارها بهش ورود میکردن و از نقش و اهمیت حیاتی تئوری درش اطلاعی نداشتن، و حتی متوجه ضعف و بی اعتباری برنامه ها و روشهایی که از خودشون ابداع میکردن نمیشدن، حیطهء علم رمزنگاری مدرن است. در علم رمزنگاری یک جملهء معروفی دارن که میگه Don’t roll your own crypto. این عبارت به معنای اینه که الگوریتم های رمزنگاری شخصی خودتون رو اختراع و استفاده نکنید! چون این یک ساده اندیشی و اشتباه متداول افراد بی اطلاع در این زمینه است که فکر میکنن درست کردن سیستمهای رمزنگاری بقدر کافی امن، بدون داشتن اطلاعات و دانش و احاطهء تخصصی در این زمینه، کاری هست که همینطور کورکورانه و بصورت تجربی و با آزمون و خطا و نهایتش پرسش و کمک و تایید و محک خوردن از جانب چند نفر افرادی غیرمتخصص دیگه بتونن انجام بدن. متخصصان و تجربه ها و نمونه های زیاد در طول تاریخ معاصر این رشته به این نتیجهء روشن رسیدن و نشون دادن که این تصور بیشتر اوقات بیشتر از اونچه که درست باشه غلطه و الگوریتم های شخصی در این زمینه اکثرا یا اشتباهات و ضعف های فاحش دارن و عملا امنیتی خیلی کمتر از اونچه که باید و افراد عادی تصور میکنن ایجاد میکنن و یا بهرحال امنیت اونها به هیچ روی با الگوریتم های استاندارد حرفه ای که توسط متخصصان این رشته طراحی شده و سالها محک خوردن برابری نمیکنه و دلیل خوبی برای این همه صرف وقت و انرژی بیهوده و کورکورانه وجود نداشته. نوشتن یک الگوریتم رمزنگاری جدید قوی توسط افراد غیرمتخصص اونقدری بعیده که مثل اینه که یک شخصی بدون داشتن هیچ تخصص و آگاهی و صلاحیت بخواد عمل جراحی قلب یا مغز انجام بده و انتظار موفقیت هم داشته باشه! البته شاید نه تا این حد وخیم، و این گفته تاحدی اغراق باشه، اما بهرحال در مثل مناقشه نیست و منظور کلی رو میرسونه که این کار به همین شکل و دلیل ناعاقلانه است. از طرف دیگر آیا کسی تونسته و میتونه صرفا بصورت تجربی و با آزمون و خطا، یک جراح مغز یا قلب دارای صلاحیت بشه؟ حتی اگر شدنی باشه، میخواید چند نفر رو سرش به کشتن بدید تا سرانجام این رشته رو یاد بگیرید؟! و آیا اول یاد گرفتن تئوری و بعد شروع به کار تجربی و عملی، روشی سریعتر و بهینه تر و حتی راحتتر نخواهد بود؟
حیطهء علم رمزنگاری برای خودش یک علم بسیار پیشرفته و ظریف است و انبوهی از تئوری های پیشرفته و ریاضیات و منطق در اون نقش اساسی دارن. یکی از حیطه هایی که باید یاد گرفت و درک کرد تا فهمید که واقعا چیه.
خب دیگه خیلی نمیخوام وارد جزییات این بحث رمزنگاری بشم، چون موضوع اصلی این پست نیست و فقط یک مثال واقعی بود.
باید بگم بهرحال تئوری در خیلی جاهای دیگر برنامه نویسی هم نقش مهمی داره. حالا در بعضی حیطه ها درصد حجمی و اهمیتش بیشتره و در بعضی دیگر کمتر. مثلا در علم رمزنگاری میتونم بگم ماهیتا طوری هست که حداقل 90% اون تئوریه، ولی در حیطه های دیگری از برنامه نویسی نقش تئوری معمولا اینقدر نیست. بنده فکر میکنم بطور متوسط در کل برنامه نویسی میتونیم نقش یادگیری تئوریک رو حداقل 50% بدونیم؛ البته به شرطی که تمام انواع برنامه ها رو با اهمیت و ضریب یکسان درنظر بگیریم و نه فقط اپلیکیشن های بازاری مثل برنامه های دیتابیسی. طبیعتا اگر یک بازار و سطح و حیطهء خاص مثل برنامه های دیتابیسی رو درنظر بگیریم، یا بگیم برنامه هایی که از نظر حجمی بخش عمدهء بازار در سطح برنامه نویسان عادی رو به خودشون اختصاص میدن، این درصد میتونه تغییر بکنه.

من اخیرا روی برنامه ای کار میکردم که با یکسری مسائل مربوط به یونیکد هم درگیر بود. باید بگم بخاطر اینکه قبلا دربارهء یونیکد و بطور مثال انکدینگ UTF-8 بقدر کافی مطالعه و تحقیق و یادگیری و احاطهء تئوریک داشتم و میدونستم زیرکار داستانش دقیقا به چه شکلیه، تونستم علت یک مشکل و مسئلهء غیرمنتظره رو که در برنامه پیش آمده بود نسبتا براحتی و سرعت تشخیص بدم و برطرف کنم. این مثالی از نقش یادگیری و استفاده از تئوری در برنامه نویسیه، ولی در برنامه ها و کارهای خاص و غیرکلیشه ای طبیعتا اینطور چیزها بیشتر پیش میان تا برنامه های معمولی و روتین بازاری. در برنامه های بازاری و روتین، اگر مشکل و پیچیدگی و نیاز تئوریک خاصی هم بوده خب قبلا توسط افرادی حل شده و راهکارش در دسترس بقیه گذاشته شده معمولا که خیلی وقتا اصلا این راهکار بصورت درونی در خود زبان یا کتابخانه ها و کدهای آماده یا زیرکار قرار داره و بصورت خودکار هندل میشه و ممکنه خود برنامه نویسان عادی هیچوقت حتی متوجه وجود چنین مسائلی هم نشن. کسانی اینطور مسائل رو حل میکنن که دانش و احاطهء تئوریک و مغز تحلیلی مورد نیازش رو دارن. کسانی که کم و بیش دانشمند هم هستن، نه فقط یک برنامه نویس عادی مثل بقیه. و این فرق هست که خیلی ها نمیدونن و نادیده میگیرن فکر میکنن مثلا چون برنامه نویسی روتین خوبی میکنن و در این زمینه موفق بودن همهء موارد دیگر هم کم و بیش شبیه همینه و با همین روش تجربی و آزمون و خطا میشه براحتی از عهدشون براومد و با همین سطح سواد و دانش و یادگیری و احاطهء تئوریک میشه هندل کرد. اما درواقع افرادی مثل ما هستن که اینطور کارهای زیربنایی و خاص رو میکنن. مشکلاتی که شاید جزیی و کم اهمیت بنظر برسن یا در سطح برنامه نویسی عادی نمود چندانی نداشته باشن، اما حل اونا نیاز به دانش و قدرت زیادی داره و هرکسی از عهدهء درک و حل اونا برنمیاد. یاد مثال اون طرفی میفتم که رفته بود کارخانه یک دستگاهی رو تعمیر کنه، یکی دوتا با چکش زد به یه جای خاصی یه قطعهء خاصی از دستگاه و دستگاه درست شد، بعد که خواست پول بگیره مبلغ زیادی طلب کرد، کارفرما بهش گفت بخاطر دوتا چکش زدن میخوای اینقدر پول بگیری؟! طرف گفت نه مهم و اصل اینه که دقیقا بدونی کجا رو چکش بزنی، وگرنه بخاطر خود چکش زدن که مبلغ ناچیزی میگیرم و بقیهء دستمزد بخاطر اون دانش و تجربه و مهارتی هست که دارم. حالا حکایت افرادی مثل ما که جزییاتی رو که دیگران توش میمونن میتونن حل کنن همینه که انجام خود کار و راه حل اون مشکل شاید چیز ناچیزی بنظر بیاد، اما با یک عالمه دانش و سالها زحمت و یادگیری تئوریک بوده پشتش که حالا این قدرت رو داریم که علت این موارد خاص و زیربنایی رو تشخیص بدیم و حل کنیم. اون لحظه انجام اون کار چیزی بنظر نمیاد، اما گاهی چند ده نفر برنامه نویس عادی رو بذاری هرچی هم تلاش کنن هرچقدر وقت و انرژی صرفش کنن دست آخر نمیتونن درست و حسابی علتش رو بفهمن و حل کنن؛ چرا؟ چون دانش و بینش و احاطهء تئوریک ندارن.
من میتونم از ویکیپدیا براتون لینک مقاله هایی رو بذارم که هرچی بخونید اصلا نفهمید یعنی چیه و چیه و به چه دردی میخوره، و نه تنها شما، بلکه در کل جامعهء برنامه نویسان و متخصصان فارسی زبان هم کسی نتونه بفهمه؛ حالا از هرکس میخواید برید بپرسید و تحقیق کنید. از اینطور مسائل زیاد هست. ولی چطور شده که بعضیا از وجود این مسائل هم انگار اطلاع ندارن و حتی احتمالش رو هم نمیدن و به خودشون اینقدر مطمئن هستن و چطور فکر میکنن این موارد اونقدرها هم مهم و لازم نیست؟! این نشون میده که سطح علمی چقدر پایینه و اصولا افراد این علم و تعریف مفاهیم در اون رو هم در حد دانش و تصورات شخصی خودشون میدونن، درحالیکه علوم رایانه و برنامه نویسی بسیار گسترده تر و پیچیده تر از این حرفهاست و اکثر افراد فقط در یک سطح و حیطه های به نسبت خیلی محدود، هرچند پرکاربرد و دارای بازار و درآمد خوب، در اون کار میکنن. اونی که فتوشاپ درست میکنه اتوکد درست میکنه لینوکس درست میکنه الگوریتم فشرده سازی، کدک صوتی و ویدئویی، و فرمت های پیشرفته تصویری، گیم انجین و خیلی چیزهای دیگه درست میکنه، اونها قطعا به دانش و احاطهء تئوریک بسیار بیشتری نیاز دارن. بنابراین فکر نکنید که شما حتی نزدیک به چنین حیطه ها و افرادی هستید و به این سادگی ها میتونید بهشون برسید و باهاشون مقایسه بشید. و کسانی هم که میان توی رشتهء برنامه نویسی باید بدونن که تفاوت میان این دنیاها زیاد هست و دورنما رو فقط نبینن فکر نکنن که دوتا برنامهء معمولی ساختن پس بقیهء راه هم به همون شکل و به همون راحتیه و میتونن بصورت طبیعی به تدریج به بقیهء قابلیت ها هم برسن! طرف فکر میکنه مثلا میشه به این راحتی فتوشاپ درست کرد، سیستم عامل واقعی موفق درست کرد، اتوکد، و غیره. درحالیکه اصلا چنین چیزی نیست. کارهای بزرگ و سخت و پیچیده ای است که با بازی های سطحی و صرف کار تجربی و آزمون و خطا، عملا دست نیافتنی است! خیلی دشوارتر از چیزیه که فکر میکنید و بصورت سطحی و از ظاهرش بنظر میرسه. نیاز به سواد و احاطهء تئوریک بالایی داره باید سالها مغزتون رو روی اینطور چیزها تغذیه کنید و پرورش بدید که با دوتا کد تجربی نوشتن و ور رفتن با چندتا محیط و نرم افزار برنامه نویسی خوش آب و رنگ جذاب و سرگرم کننده روی رایانه، بیشتر از چیزی که فکر میکنید تفاوت میکنه. پس اگر دنبال اون اهداف و کارهای خاص و بزرگ و دشوار هستید، بدونید که راهش این نیست و راه سخت و طولانی داره. ببینید آیا این اراده این انگیزه این جدیت این استعداد رو دارید که مثلا دوباره درسهای تئوریک دوران دبیرستان و دانشگاه خودتون، مثلا ریاضی و فیزیک، رو بشینید از اول مرور کنید یاد بگیرید تمرین حل کنید امتحان بدید، اگر جوابش بله است اونوقت میشه گفت توان و جدیت انجام اینطور کارها رو هم دارید. اینطور کارها کسانی رو میخواد که واقعا استعداد و همت علم واقعی رو داشته باشن و واقعیت های زندگی رو در تصورات و خواسته های سطحی و کودکانه خودشون محدود نبینن.
بعضیا در فرومها بارها به من ایراد گرفتن مثلا گفتن چرا تو اینقدر خارجی ها رو گنده میکنی و میگی دانش و توان ما با اونها قابل مقایسه نیست و این حرفها. درحالیکه بنده جز واقعیت هایی که عملا خودم رفتم دیدم درک کردم فهمیدم چیزی نگفتم. وقتی میبینم مثلا علم رمزنگاری اساسا در ایران ناشناخته است، و نه فقط این، بلکه خیلی از مسائل علمی و پیشرفتهء همین رشتهء خودمون، خب چی باید بگم؟! واقعیت چیه؟ واقعیت همینه. اینکه بقول یارو میگه آنکس که نداند و نداند که نداند!! نداند که تقریبا هیچی نداند!! نداند که اصلا تعریف علم ماهیت علم داستان و تاریخ علم چی هست روش علمی چیه چرا علم و فناوری اینقدر قدرت و دستاورد و موفقیت داشته، منطق و تفکر تحلیلی و منطقی درست رو نمیدونه چیه اصلا. باید بگم بیشتر افراد چنین حالتی دارن و اصلا از حقایق واقعی اطلاعی ندارن و در یک دنیای خیالی بر اساس تصورات سطحی و ناقص خودشون زندگی میکنن!
من نمیخوام شما رو ناامید کنم، بلکه میخوام آگاه کنم.
البته که آگاهی در این حالت میتونه دردناک باشه، ولی من خودم این تجربه رو داشتم که این بیدار شدن ها باوجود تمام دردی که آدم حس میکنه ولی هرگز خواب و توهم رو دوباره به اون بیداری و آگاهی ترجیح نمیده. نمیدونم شایدم فقط من اینطور بودم!
ما باید فکر کنیم که این بیداری و آگاهی از خواب و توهم خیلی بهتره. باید فکر کنیم که چرا تاحالا در خواب بودیم؟ بر ما چه گذشته است؟ در این مدت کجا بودیم؟ چرا دیگران بیدار شدند و این راه را رفتند، ولی ما هنوز اندر خم یک کوچه ایم؟

پاسخ دهید

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

*

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