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