تولد یک سیستمعامل، بخش پنجم
زیبایی برنامهنویسی
درست نمیدانم چطور باید شیفتگیام به برنامهنویسی را بیان کنم، ولی به هرحال تلاشم را خواهم کرد. برای کسی که برنامهنویسی میکند، این کار جذابترین چیز در دنیاست. بازیای بسیار درگیر کنندهتر از شطرنج، بازیای که در آن شما قوانین را میسازید و بازیای که نتایج چیزهایی هستند که شما تعریفشان کردهاید.
البته هنوز هم برای افرادی که از بیرون به قضیه نگاه میکنند، برنامهنویسی حوصلهسربرترین فعالیت دنیاست.
بخشی از هیجان اولیه موجود در برنامهنویسی را میتوان به راحتی توضیح داد: این واقعیت که هر دستوری که به کامپیوتر بدهید، با دقت تمام آن را اجرا خواهد کرد. بدون کوچکترین اشتباهی. تا ابد. بدون هیچ شکایتی.
این ماجرا به خودی خود جذاب است.
اما اطاعت بیچونوچرا، هرچند جذاب است، مشخصه یک دوست خوب نیست. در حقیقت همین مساله باعث میشود که کامپیوتر خیلی زود حوصلهسربر شود. چیزی که باعث میشود مردم با این شدت جذب کامپیوتر شوند این است که برای حل یک مشکل، علاوه بر دادن دستور به کامپیوتر، لازم است کشف کنید که چگونه باید این دستور را بدهید.
من شخصا متقاعد شدهام که علوم کامپیوتر اشتراکات بسیاری با فیزیک دارد. هر دوی آنها در این مورد بحث میکنند که جهان در سطح بنیادینش چگونه کار میکند. مطمئنا تفاوت هم در این است که در فیزیک بحث بر سر کشف چگونگی کارکرد جهان است و در علوم کامپیوتر، بحث بر سر ساخت این جهان. در حوزه کامپیوتر، شما خالق جهان هستید. شما باید هر چیزی که پیش میآید را کنترل کنید. اگر این کار را خوب انجام دهید، خدای کامپیوتر خواهید بود. البته در مقیاسی کوچک.
و البته احتمالا با گفتن این حرف، نیمی از جمعیت جهان را ناراحت کردهام.
اما این واقعیت دارد. شما باید دنیای خود را بسازید و تنها چیزی که در این خلقت شما را محدود میکند، تواناییهای ماشین و این روزها بیشتر و بیشتر، تواناییهای خودتان است.
به یک خانه درختی فکر کنید. میتوانید روی یک درخت خانهای بسازید که کار کند، یک ورودی داشته باشد و مستحکم هم باشد ولی هر کسی فرق یک خانه مستحکم و یک خانه درختی زیبا که از شکل و خواص درخت استفادهای خلاقانه کرده را میداند. این کار، ترکیب هنر و مهندسی است. این همان دلیلی است که برنامهنویسی، فریبنده و فوقالعاده میشود. کارایی، گاهی بعد از جذاب بودن، زیبا بودن یا شوکه کننده بودن قرار میگیرد.
برنامهنویسی، تمرین خلاقیت است.
چیزی که اولین بار مرا به دنیای کامپیوتر کشاند، کشف این روند بود که کامپیوترها چگونه کار میکنند. یکی از لذتهای من وقتی بود که کشف کردم کامپیوتر مثل ریاضی است: جهان را باید خودتان و با قوانین خودتان بسازید. در فیزیک، شما با قوانین موجود درگیر هستید ولی در ریاضیات -مثل برنامهنویسی- تا وقتی که قوانینی که وضع کردهاید با یکدیگر سازگار باشند، میتوانید راه را ادامه دهید. لزومی ندارد ساختارهای ریاضی با هیچ منطق بیرونی سازگار باشند؛ ولی چیزی که هیچگاه نمیتوان از آن عدول کرد، سازگاری درونی قوانین با یکدیگر است. همان طور که هر ریاضیدانی به شما خواهد گفت، میتوانید ساختارهای ریاضیای بسازید که در آن، سه به علاوه سه برابر دو بشود. میتوانید هر کاری که دوست دارید انجام دهید. ولی باید توجه کنید که در حین اضافه شدن پیچیدگی ساختار، اجزای ساختار کماکان با یکدیگر و با جهانی که شما خلق کردهاید، سازگار باقی بمانند. اگر قرار است این دنیا زیبا باشد، نباید هیچ کاستیای در آن راه بیابد. این دقیقا شیوه کار در جهان برنامهنویسی هم هست.
یکی از دلایلی که مردم را تا به این حد شیفته کامپیوتر میکند، این است که آنها میتوانند با توسل به کامپیوتر دنیاهای جدیدی بسازند و در آنها دست به تجربه بزنند و بیاموزند که چه چیزهایی ممکن است. در ریاضی میشود به سراغ تمرینهای فکری رفت و درباره ممکنها سخن گفت؛ مثلا وقتی صحبت از هندسه میشود، اکثر مردم به هندسه اقلیدسی فکر میکنند. کامپیوتر به مردم کمک کرده است که بتوانند هندسههای مختلف را به نمایش بکشند؛ هندسههایی که به هیچ وجه اقلیدسی نیستند. با استفاده از کامپیوتر میتوانیم این دنیاهای جدید را مشاهده کنیم و ببینیم که چطور کار میکنند. مجموعه مندلبرت را به یاد دارید؟ تصاویر فراکتالی که بر اساس معادلات مندلبرت ایجاد شده بودند؟ اینها تصاویری بودند که بر اساس دنیایی کاملا ریاضی ساخته شده بودند که پیش از کامپیوترها به هیچ عنوان امکان ظهور نداشتند. مندلبرت این قواعد قراردادی را درباره جهان جدیدی نوشته که پیش از این وجود نداشت و با واقعیت بیرونی هم ارتباطی نداشت. کامپیوترها کمک کردند کشف کنیم که این قوانین، تصاویر زیبایی هم خلق میکنند. با کامپیوتر و برنامهنویسی، میتوان جهانهای جدیدی ساخت و گاهی این جهانها و الگوها، واقعا زیبا هستند.
البته در بیشتر مواقع، کار ما این نیست. ما معمولا فقط برنامههایی مینویسیم که قرار است مشکل خاصی را حل کنند. در این حالت، شما جهان جدیدی نمیسازید بلکه مشکلی در درون جهان کامپیوتر را حل میکنید. مشکل، از طریق اندیشیدن به آن حل میشود. فقط هم عده معدودی هستند که میتوانند ساعتها جلوی یک صفحه نورانی بنشینند و به یک مشکل فکر کنند. فقط خورهها و گیکهایی مثل من.
سیستمعامل پایه هر چیز دیگری است که در ماشین اتفاق میافتد و ساخت یک سیستمعامل، چالشی واقعی است. وقتی سیستمعاملی مینویسید، در حال ساختن جهانی هستید که تمام برنامههای دیگر در درون آن زندگی خواهند کرد. در حقیقت شما دارید قوانینی را مینویسید که بنا بر آنها برنامهها خواهند دانست درون این دنیا، چه چیزی مجاز و چه چیزی غیرمجاز است. البته هر برنامهای همین کار را انجام میدهد؛ ولی سیستمعامل، پایهایترین سطح این برنامهها است. مثل نوشتن قانون اساسی سرزمینی جدید. تمام برنامههای دیگر، قوانین معمولی این سرزمین خواهند بود.
بعضی وقتها قوانین چیزهای با معنایی نیستند و ما به دنبال معنا هستیم. ما دوست داریم بتوانیم به راهحل نگاه کنیم و احساس کنیم که جواب صحیح را با شیوه صحیح به دست آوردهایم.
شاگرد مثبت کلاس را به یاد دارید که در مدرسه همیشه جوابهای صحیح را داشت؟ او زودتر از هر کس دیگری مساله را حل میکرد و نکته این بود که تلاشی هم برای زودتر حل کردن به کار نمیبرد. او هیچوقت سعی نمیکرد یاد بگیرد که هر مساله را چطور باید حل کرد بلکه فقط به شیوه صحیح به مشکل نگاه میکرد. وقتی که راهحل او را میشنیدید، احساس میکردید راهحل او بامعناترین راهحل برای این مساله است.
در کامپیوترها هم مساله به همین صورت است. میتوانید با آزمایش کلیه جوابهای ممکن، جواب را پیدا کنید؛ ولی این راه احمقانه است. در عوض سعی کنید مساله را آن قدر خرد کنید که اصولا دیگر مسالهای باقی نماند و ناگهان احساس کنید که مساله خودبهخود حل شده است. به شیوه دیگری به مساله نگاه کنید و ناگهان به روشنی خواهید رسید: مشکل اصولا به این دلیل وجود داشت که شما از زاویه اشتباهی به مساله مینگریستید.
احتمالا بهترین مثال در این مورد نه در دنیای کامپیوتر که از دنیای ریاضی است. داستان مربوط میشود به ریاضیدان مشهور، کارل فردریش گاوس و معلمی که حوصله تدریس نداشت و از دانشآموزان خواست تا اعداد ۱ تا ۱۰۰ را با یکدیگر جمع کنند و جواب را بگویند. معلم انتظار داشت که این کار حدود یک روز از آنها وقت بگیرد. ولی ریاضیدان نابغه آینده، در عرض پنج دقیقه جواب صحیح را اعلام کرد: ۵۰۵۰. شیوه حل مساله به هیچ وجه جمع کردن یکییکی اعداد از یک تا صد نبود. این روش حوصلهسربر و احمقانه است. چیزی که گاوس کشف کرد این بود که جمع ۱ و ۱۰۰ میشود ۱۰۱. همینطور جمع ۲ و ۹۹ میشود ۱۰۱. به همین ترتیب ۳ و ۹۸ هم ۱۰۱ است و الی آخر. در نهایت ۵۰ و ۵۱ هم حاصل ۱۰۱ را ایجاد خواهند کرد و در عرض چند لحظه میتوان به این نتیجه رسید که ما ۵۰ بار نتیجه ۱۰۱ را داریم و جواب نهایی، ۵۰۵۰ است.
احتمال دارد که این داستان ساختگی باشد؛ ولی پیامش روشن است: ریاضیدان واقعی، مساله را از راه طولانی و حوصلهسربر حل نمیکند چون میتواند الگوی پنهان شده در پشت مشکل را ببیند و از این الگو برای حل زیباتر سوال استفاده کند. مساله در علوم کامپیوتر هم مشابه است. مطمئنا میشود برنامهای نوشت که با جمع زدن ۱ تا ۱۰۰، مساله بالا را حل کند. این برنامه برای کامپیوترهای امروزی یک چشم به هم زدن است اما برنامهنویس باهوش است و جواب را از اول میداند. این آدم، برنامهای مینویسد که به شیوهای جدید و زیبا به مساله حمله کند و در نهایت مشخص خواهد شد که راهحل او، راهحل بهتری است.
هنوز مشکل است توضیح بدهم که چه چیز جذابی در این وجود دارد که برای چند روز سر خود را به دیوار بکوبید و سعی کنید کشف کنید که یک مساله چطور باید به شیوهای زیبا حل شود. ولی وقتی راهحل زیبایتان را پیدا کنید، بهترین احساس جهان را خواهید داشت.