برو کدتو بزن!

قبل از این‌که من به‌عنوان منتور وارد کارگاه نظریۀ کدگذاری بشم، فکر می‌کردم این کارگاه مرتبط با کدزنی و برنامه‌نویسیه و اصلاً به‌خاطر همین منتور این کارگاه شدم!

درسته قبل‌تر توی دبیرستان چند مسئله تو این فضا دیده بودم، ولی نمی‌دونستم این مسئله‌ها زیرشاخه‌ای از علم به نام کدگذاری یا coding می‌شن. سه‌تا مفهوم شبیه به هم وجود داره که شاید شما هم قاطی‌شون کنین: کدگذاری، کدنویسی و رمزنگاری! یه کم حس ابوالفضل عرب‌نیا و فریبرز پورعرب رو دارم (حتی فکر می‌کنم الان هم این دو نفر رو با هم قاطی‌شون کردم. :)) )

کدگذاری نام همین کارگاهی بود که در مدرسۀ تابستانۀ رستا هم داشتیم. این شاخه از علم کلاً حول داده و انتقال داده می‌چرخه. فرض کنین دو کیلو داده داریم (البته که همه‌مون می‌دونیم واحد شمارش داده، کیلو نیست. فرض کردیم! :)) ) می‌خوایم این دو کیلو رو از طریق اینترنت برای دوستمون بفرستیم. فرض کنین انتقال هر گرم داده یک مگابایت از حجم اینترنتمون رو مصرف می‌کنه. آیا شما حاضرین برای انتقال دو کیلو داده، دو گیگابایت از حجم اینترنتتون رو مصرف کنین؟ خب، برای کم کردن حجم مصرفی اینترنتمون چی کار می‌شه کرد؟

احتمالاً تا حالا با فایل‌هایی با پسوند .zip یا .tar روبه‌رو شده‌این. این فایل‌ها از روش‌هایی استفاده می‌کنن تا بدون ازدست‌رفتن سر سوزنی از دو کیلو اطلاعاتمون، اون‌ها توی یه حجم کوچیک‌تری جا بشن تا راحت‌تر بتونیم از جایی به جای دیگه‌ای منتقلشون کنیم؛ دقیقاً مثل وقتی‌ که می‌خواین به سفر برین، می‌آین و تموم لباس‌هاتون رو خیلی منظم و مرتب تا می‌کنین و توی چمدون قرار می‌دین تا همه‌شون توی چمدون جا بگیرن و حمل‌ونقل اون‌ها حین سفر راحت‌تر باشه. اما اگه توی خونه باشین، باید همین لباس‌ها رو هر دفعه از همون حالتی که دفعۀ قبل درآوردین، بپوشین و استفاده کنین!

چمدان برای فشرده‌سازی البساتات (بر وزن اطلاعات!)
چمدان برای فشرده‌سازی البساتات (بر وزن اطلاعات!)


ساده‌ترین مثال در دنیای واقعی، اینه که من ۱۰۲۴ تا سیگنال با شماره‌های ۰ تا ۱۰۲۳ دارم که هر کدوم می‌تونن روشن یا خاموش باشن. همچنین می‌دونم که در هر لحظه فقط و فقط یکی از اون‌ها می‌تونه روشن باشه. می‌خوام وضعیت این ۱۰۲۴ سیگنال رو برای دوستم بفرستم. واضحه که فرستادن همۀ ۱۰۲۴ سیگنال کار عاقلانه‌ای نیست و به جای اون، می‌آم شمارۀ سیگنال روشن رو به مبنای دو می‌برم تا بشه فقط با ۱۰ سیگنال جدید، شمارۀ اونو نمایش داد.

حالا به جای ۱۰۲۴ سیگنال، فقط این ۱۰ تا سیگنال رو برای دوستم می‌فرستم.

ممکنه در حین فرستادن این ۱۰ تا سیگنال برای دوستم، دشمنم (یا بهتر بگم، دشمنام که عبارتن از باد و بارون و رعدوبرق و امواج دستگاه کناری که روی این سیگنال‌ها اثر می‌ذارن) تو مسیر کمین کرده باشن و این ۱۰ سیگنال رو دست‌کاری کنن، مثلاً بتونن تنها یکی از ۱۰ تا سیگنالِ ارسالیِ من رو به‌دلخواه از صفر به یک یا برعکس تغییر بدن. این دست‌کاری کردن دشمنان و تلاش برای جلوگیری از اشتباه در انتقال مفهوم، موضوع دیگه‌ای از علم کدگذاریه...


من برای این‌که نقشۀ توطئه‌آمیز دشمنامون رو نقش ‌بر آب کنم، قطعاً بیکار نمی‌شینم و می‌آم مثلاً به جای ۱۰ سیگنال، ۳۰ سیگنال برای دوستم می‌فرستم. هنوز ۳۰ خیلی از ۱۰۲۴ کم‌تره و هنوز دارم در مصرف سیگنال صرفه‌جویی می‌کنم! این ۳۰ سیگنال، ۳ مرتبه تکرارشدۀ ۱۰ سیگنال اولیه‌م هستن. اگر دشمنام فقط بتونن یکی از سیگنال‌های من رو عوض کنن، من با فرستادن این ۳۰ سیگنال، می‌تونم با لهجۀ اصفهانی به دوستم که اون طرف خط نشسته بگم:

اکبر دادا، دقت کن جون دوتای! از بین هر سه‌تا سیگنالی که متناظر هم هستن، بیبین کودوماشون حداقل دو بار تکرار شده‌س. اون سیگنال پرتکراره همونی‌س که مدی نظری من بوده‌س...

و این طوریه که می‌تونیم با فرستادن ۳۰ سیگنال، توطئه‌ی دشمنان رو دفع کنیم :))


پس دیدیم که علم کدگذاری هم در کوچیک و نُقلی‌تر کردن داده‌ها نقش داره و هم موقع انتقالشون به کمکمون می‌آد تا مبادا دشمنان داده‌ها در شرایط حساس کنونی، باعث اشتباه در انتقال اون‌ها بشن.

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

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

خب، این از کدگذاری. اگه بخوام در حد دو - سه خط دربارۀ کدنویسی و رمزنگاری هم بگم، قصه از این ‌قرار می‌شه: احتمالاً کدنویسی یا همون programming رو جاهای مختلفی دیدین که باهاش برنامه‌ها یا بازی‌ها یا سایت‌های مختلف درست می‌کنن، برای همینه که اسم دیگه‌ش برنامه‌نویسیه. اصلاً کلمۀ program رو اگه به فارسی ترجمه کنیم، می‌شه «برنامه». علم رمزنگاری هم که از اسمش مشخصه، مرتبط با امنیت داده‌هامونه؛ این‌که دشمنا نتونن به داده‌های ما دسترسی پیدا کنن و از محتوای اون‌ها آگاه بشن.
به تفاوت بین رمزنگاری و کدگذاری دقت کنین (;