یکی از بحث‌هایی که در بین خیلی از اطرافیان خودم - مخصوصا در محیط دانشگاه و بین بچه‌های رشته علوم کامپیوتر به دلیل حجم زیاد دروس ریاضی - شاهدش بودم و هستم، ارتباط ریاضیات با علوم کامپیوتر و به خصوص برنامه نویسیه. به طور کلی نظرات افراد در ارتباط با این سوال رو می‌تونیم یه طیف در نظر بگیریم که یک قطب اون باور به "فاقد ارتباط" بودن دو حوزه با هم داره و قطب مقابل دو حوزه رو دارای "ارتباط کامل" می‌دونن.

من شخصا معتقدم که برای رسیدن به جواب درست در مورد این سوال باید چند زمینه مختلف رو مورد بررسی قرار بدیم و سپس به پاسخی جامع درباره این موضوع برسیم.

قبل از شروع بحث این قرار رو با هم داشته باشیم که منظور من از دانش ریاضیات مباحاث پیشرفته در ریاضیات است و منظور به هیچ وجه ریاضیات مقدماتی و مباحثی مانند آشنایی با اعداد، اعمال مقدماتی بر روی اعداد و مبانی منطق نیست، چرا که بدون شک حتی در غالب برنامه‌های ساده‌ای که می‌نویسیم نیاز داریم تا از این موارد استفاده کنیم.

۱علوم کامپیوتر و ریاضیات

به طور قطع نمی‌توان منکر این واقعیت شد که علوم کامپیوتر از دل ریاضیات بیرون آمده. در اغلب دانشگاه‌ها گروه علوم کامپیوتر و گروه ریاضیات در یک دانشکده واقع شده‌اند و فارغ التحصیلان رشته علوم کامپیوتر مخصوصا در حوزه‌های نظری واحدهای زیاد و سنگین ریاضیات رو پاس می‌کنن.

اما در کنار همه این‌ها باید این رو در نظر داشته باشیم که رشته علوم کامپیوتر نه در ارتباط با کامیپوتره و نه در ارتباط با برنامه نویسی! شاید اشاره به این جمله Edsger W. Dijkstra خالی از لطف نباشه که:

علم رایانه به همان اندازه در مورد رایانه است که نجوم در مورد تلسکوپ. Edsger W. Dijkstra

پس باید در نظر داشته باشیم که آشنا شدن دانشجویان این رشته با برنامه نویسی در طول دوران تحصیلشان به معنی ارتباط این رشته و برنامه نویسی نیست. بلکه باید بدانیم که علوم کامپیوتر پیرامون حوزه‌های بزرگتری به مطالعه می‌پردازد: رمزنگاری، پیچیدگی محاسباتی، محاسبه پذیری، الگوریتم‌ها، پردازش کوانتومنی ، کامپایلرها و … تنها نمونه‌های از ده‌ها حوزه‌ای هستند که علوم کامپیوتر در ارتباط و درباره آنهاست.

از طرفی برای ورود به صنعت و کار کردن به عنوان یک برنامه نویس، لزومی به داشتن دانش علوم کامپیوتر نیست و شاید آشنایی با برنامه نویسی رو بتونیم اصلی‌ترین پیش نیاز این امر بدونیم.

پس به طور خلاصه می‌تونیم نتیجه گیری کنیم که برای موفق شدن در علوم کامپیوتر نیاز به داشتن دانش ریاضی وجود دارد، اما دانش ریاضیات برای تبدیل شدن به یک برنامه نویس موفق مورد نیاز نیست.

۲ریاضیات و عمق نگاه به مسائل

معمولا دانشجویان متعصب و مغرور رشته‌های علوم کامپیوتر و مهندسی نرم افزار، که آشنایی خوبی با برنامه نویسی دارند و قصد دارند تا در آینده و بعد از پایان تحصیلاتشون وارد بازار کار بشن، خیال می‌کنند که بازار کار، محلی است مملو از فارغ التخصیلان این رشته که با درک عمیقی که از مسائل مختلف این حوزه دارند، مشغول به فعالیت در اون هستند.

اما متاسفانه واقعیت چیزی جز این نیست که در بین برنامه نویسان موفق و مشغول در بازار کار خیلی‌ها نه تنها تحصیلات آکادمیک ندارند، بلکه خیلی‌ها در رشته‌های دانشگاهی دیگری فارغ التحصیل شده‌اند.

ولی به هیچ وجه نباید غافل از این مساله بشیم که تحصیلات افراد تاثیر مستقیم و قابل ملاحظه‌ای در میزان درک و آگاهی اون‌ها از این حوزه داره.

برای مثال خیلی از برنامه نویسانی که فارغ التحصیل رشته‌های کامپیوتری نیستند، به هنگام طراحی الگوریتم‌هایشان درکی از میزان پیچیدگی الگوریتمی که طراحی کرده اند ندارند و حتی اگر یه الگوریتم از مرتبه (O(n^2 هم طراحی کرده باشند که فقط روی جنس یا اندازه خاصی از داده‌ها در زمان قابل قبولی اجرا می‌شود، از کار خودشان راضی هستند، حال آنکه افرادی که از رشته‌های کامپیوتری فارغ التحصیل شده‌اند همواره این دغدغه را دارند که الگوریتم‌های طراحی شده توسط آنها از مرتبه (O(nlogn باشد تا بتوانند فارغ از داده ورودی همواره به الگوریتمشان اعتماد کنند.

مساله مطرح شده را می‌توان با استفاده از روش‌های ریاضی مختلفی مدلسازی کرد و بعد از آن با بررسی مدل حاصله می‌توان اقدام به بهبود الگوریتم طراحی شده کرد.

پس شاید یادگیری ریاضیات برای اینکه در کنار یک برنامه نویس موفق بودن، درست بیاندیشیم هم بد نباشد.

۳ریاضیات و نحوه نگرش به مسائل

بدون شک یادگیری علوم ریاضی تاثیر به سزایی در قدرت درک ما از مسائل مختلف و نحوه نگرش ما به اونها و طراحی راه حل برای مسائل دارد. توانایی نگاه انتزاعی به مسائل یکی از مهارت‌هایی است که با فراگیری ریاضیات حاصل می‌شود.

Daniela Wellisz یک برنامه نویس با پیش زمینه تحصیلات ریاضی است که در Gogaruco 2012 سخنرانیی با عنوان چرا یک اثبات ریاضی شبیه به یک Unit Test است؟ داشت - مشاهده کنید -.

پس شاید بتوان از ریاضیات به عنوان ابزاری برای داشتن درک بهتر از مسائل یاد کرد.

۴زبان‌های برنامه نویسی مبتنی بر ریاضیات

زبان‌های برنامه نویسی مانند Fortran و Haskell زبان‌هایی هستند که مبتنی بر ریاضیات هستند و برای کار با این زبان‌های برنامه نویسی نیاز به دانش ریاضیات داریم.

اما این دست از زبان‌ها تنها تعداد کمی از کل زبان‌های برنامه نویسی هستند و برای کار با سایر زبان‌های برنامه نویسی آشنایی با دانش ریاضی نقش پررنگی بازی نمی‌کند.

آیا همه موارد را در نظر گرفته‌ایم؟

خیر!

با در نظر گرفتن تمام مسائل بالا شاید حالا بهتر باشد تا نگاهی به داخل بازار کار داشته باشیم و به بررسی این مساله بپردازیم که: "آیا ممکن است یک برنامه نویس در طول دوران کاری خود به دانش ریاضی احتیاج پیدا کند؟"

به نظر من برای پاسخ به این سوال، می‌تونیم صورت مساله رو به این سوال تغییر بدیم: "در چه حوزه‌هایی ممکن است یک برنامه نویس نیاز به دانش ریاضی داشته باشد؟"

گرافیک و بازی‌های کامپیوتری: هر دوی این حوزه‌ها، مخصوصا در مورد گرافیک و بازی‌های کامپیوتری سه بعدی، نیاز به دانش ریاضی دارند، حوزه‌هایی مثل جبر خطی و مثلثات نمونه‌ای از حوزه‌های ریاضی مورد نیاز برای فعالیت در این زمنیه هستند، هرچند که در حال حاضر موتورهای گرافیکی و بازی سازی و یا کتابخانه‌های زیادی برای خیلی از برنامه نویسان این امکان را به وجود آورده‌اند تا بدون داشتن دانش ریاضی، تنها با استفاده از چند دستور، محصول نهایی خود را آماده کنند.

اما اگر بخواهیم تنها تولید کننده محصول نهایی نباشیم و خودمان تولید کننده موتورها و یا کتابخانه‌های گرافیکی و بازی سازی باشیم، نیاز داریم تا با دانش ریاضی آشنا باشیم.

فیزیک: وقتی صحبت از فیزیک می‌کنیم، منظور هم فیزیک دنیای دو بعدی و هم فیزیک دنیای سه بعدی است، مورد کاربرد فیزیک دو بعدی می‌تونه در بازی‌هایی مثل Cut the Rope و Angry Birds باشه تا موارد کاربرد فیزیک سه بعدی در بازی‌های کامپیوتری سه بعدی به طور مثال سری بازی‌های FIFA.

قطعا در این حوزه برنامه نویسان نه تنها باید با دانش ریاضی آشنا باشند بلکه باید با فیزیک مقدماتی و کلاسیک هم آشنا باشند، مثلا به پرتاب یک توپ و برخورد آن و شبیه سازی حرکت آن فکر کنید.

باز هم مانند قسمت قبل، موتورها و کتابخانه‌های زیادی انجام این کار را برای برنامه نویسان ساده و بدون دغدغه کرده‌اند، اما سوال اینجاست اگر قرار بر این بود که ما موتور و یا کتابخانه خودمان یا مورد نیاز پروژه خودمان را که سابق بر این ایجاد نشده است تولید کنیم چه؟

نرم افزارهای شبیه سازی و کنترلی: نرم افزارهای شبیه سازی به طور قطع دسته دیگری از نرم افزارهایی هستند که بنا به مورد کاربری آنها، احتمال نیاز آنها به دو حوزه پیشین بسیار بالاست.

نرم افزارهای کنترلی، مانند نرم افزارهای کنترل پرتاب و هدایت موشک‌ها هم دسته دیگری از نرم افزارهایی هستند که برنامه نویسان آنها برای تولیدشان نیاز به دانش ریاضی و فیزیک دازند.

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

سایر موارد: رمزنگاری و یا بهینه سازیِ ساز و کارِ انتقال و یا ذخیره سازی داده‌ها در انواع حافظه‌ها را هم می‌توان به عنوان سایر مورادی که ممکن است یک برنامه نویس در مواجهه با آنها نیاز به دانش ریاضی داشته باشد، یاد کرد.

در پایان کاملا محتمل است که مواردی رو از قلم انداخته باشم، ولی فکر کنم موارد مورد بحث از پر رنگ‌ترین و اصلی‌ترین مواردی بودند که برای فعالیت در اونها نیاز به دانش ریاضی داریم.

نتیجه گیری

با در نظر گرفتن موارد مطرح شده، حالا شاید بتوان به این سوال پاسخ داد که آیا علوم کامپیوتر و برنامه نویسی با ریاضیات ارتباط دارند یا خیر؟

بدون شک نمی‌توانیم ارتباط پیچیده و زیاد علوم کامپیوتر با دانش ریاضی را کتمان کنیم و قطعا برای موفقیت در این حوزه نیاز به دانش ریاضی خوب و قوی داریم.

اما شاید پاسخ در ارتباط با برنامه نویسی، کاملا نسبی باشد و بسته به اینکه یک برنامه نویس قصد فعالیت در چه حوزه‌ای را دارد بتوان به این پرسش پاسخ متفاوتی داد، به این شکل که دسته اول را برنامه نویسانی در نظر می‌گیریم که قصد فعالیت در حوزه‌های یاد شده، مانند: گرافیک کامپیوتری، بازی سازی، شبیه سازها و … را دارند، این دسته به دانش ریاضی نیاز دارند، حال آنکه دسته دوم برنامه نویسان فعال در سایر حوزه‌ها هستند و این دسته تنها با آشنایی و تسلط بر زبان برنامه نویسی مورد استفاده و ریاضیات مقدماتی می‌توانند موفق باشند و دستمزد زیادی هم بگیرند.

اگر در دسته اول هستیم، با چه حوزه‌های از ریاضیات باید آشنا شد؟

نمی‌تونم انکار کنم که تمام این پست رو نوشتم تا به اینجا برسم. برای ساخت بازی‌های کامپیوتری نیاز به آشنایی با جبر خطی و ماتریس‌ها، Quaternionها [۱]، ریاضیات گسسته، آمار و احتمالات داریم. اما باز هم لازم می‌دونم تا ذکر کنم که امروزه، موتورها و کتابخانه‌های زیادی، حتی به صورت رایگان و open-source موجود هستند و غالب این موضوعات رو به صورت جامع و با استفاده از الگوریتم‌های کاملا کارآمد و بهینه پوشش می‌دن.

در هر حال من معتقدم که حتی در صورت استفاده از موتورها و کتابخانه‌های آماده، برای داشتن درک درست و عمیق از مسائلی که با اونها درگیریم یا در صورتی که مثل من علاقه‌مند بودید تا روزی خودتون برنامه نویس یک موتور یا کتابخانه باشید، لازمه تا با ریاضیات آشنا بشیم؛ به همین دلیل قصد دارم تا در سری پست‌هایی که از این به بعد تحت عنوان "برنامه نویسی، مقدمات ریاضی و فیزیک" منتشر می‌کنم، مباحثی در حوزه‌های یاد شده رو در کد پیاده سازی کنم و مطالب مذکور رو توضیح و آموزش بدم.

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

و در پایان منتظر نظراتتون هستم.

پا نویس:

[۱]: چهارگان‌ها