یکی از چیزهایی که در قرآن مجید به کَرات نسبت به آن هشدار داده شده و شدیداً مورد تقبیح قرار گرفته، کمفروشی است تا جایی که یک سورهٔ کامل به نام مُطَفِفِین به این مبحث اختصاص داده شده است. جالب است وقتی صحبت از کمفروشی به میان میآید، خیلی از افراد به فکر بَقالی، قصابی، لبنیات فروشی و سایر مشاغل مشابه میافتند که سر و کارشان با ترازو است و مثلاً اگر شما یک کیلو گوشت بخرید اما در عمل وزنی معادل با 980 گرم دریافت کرده باشید، فروشنده مرتکب فعل کمفروشی شده است. آنچه در این مقاله قصد داریم مورد بررسی قرار دهیم این است که آیا در دنیای توسعهٔ نرمافزار و برنامهنویسی نیز میتوان کمفروشی کرد یا خیر! که در این مقاله با ذکر مثالهایی از دنیای واقعی، این ادعا را اثبات خواهیم کرد.
نتیجهٔ یک تحقیق در خوابگاههای دانشجویی آمریکا
پیش از توضیح پیرامون قضیهٔ کم فروشی در صنعت توسعهٔ نرمافزار، توجه شما را به نتایج تحقیقی که در یکی از دانشگاههای ایالات متحده صورت گرفت جلب میکنیم. تعدادی محقق به خوابگاههای دانشجویی رفته و خوراکیهایی را در ظرفی قرار داده و داخل یخچال خوابگاه قرار دادند. پس از مدتی، مشاهده شد که دانشجویان بدون توجه به اینکه خوراکیهای مد نظر متعلق به چه کسی است، شروع به استفاده از آنها کردند و آب از آب هم تکان نخورد! سپس نوبت به فاز دوم این کار تحقیقاتی رسید و محققین چند دلار روی همان یخچال قرار داده و منتظر فیدبک دانشجویان نشستند. آنچه مشاهده شد این بود که باگذشت مدت زمانی نسبتاً طولانی هیچ کدام از دانشجویان دست به دلارها نزد، چه رسد به اینکه آنها را بردارد (این در حالی است که خوراکیها ظرف چند ساعت تمام شدند.)
نتیجهای که محققین از این آزمایش گرفتند این بود که ما انسانها در طول زمان یکسری Mindset (جهانبینی) نسبت به محیط پیرامون خود پیدا میکنیم و همین جهانبینی باعث برخی تصمیمگیریها در طول زندگیمان میشود. در حقیقت، در جامعهٔ کنونی برداشتن گوشی موبایل یک فرد دیگر، خالی کردن حساب بانکی، زدن جیب شخصی غریبه و امثالهم برچسبی معادل با دزدی میخورند اما این در حالی است که برداشتن کمی از خوراکی همخوابگاهی از داخل یخچال، استفاده از پاککن دوست بغل دستی بدون کسب اجازه، برداشتن یکی دو عدد نخودچی کشمش از روی میز دولوپر کناری و … اصلاً دزدی محسوب نمیشوند!
در واقع، تمامی این موارد نوعی تصاحب اموال سایرین محسوب میگردند ولی از آنجا که هیچکس به ما از دوران کودکی تا بزرگسالی گوشزد نکرده که این دست کارها (چه یک عدد حبه قند باشد و چه قاشق/چنگال همکارمان) نیز فعلی نادرست است و بالتبع ما هم اینگونه بزرگ شدهایم که در خوابگاه دانشگاه به راحتی از داخل یخچال خوراکی برمیداریم اما دست به اسکناسهای روی یخچال نمیزنیم!
کمفروشی در توسعهٔ نرمافزار چگونه نمود عینی پیدا میکند؟
با این توضیح، حال نوبت به اصل مطلب میرسد که بررسی مقولهٔ کمفروشی در صنعت توسعهٔ نرمافزار است و میخواهیم ببینیم که آیا در توسعهٔ یک نرمافزار هم میتوان کمفروشی کرد یا خیر. پاسخ کوتاه به چنین پرسشی آری است اما برای درک بهتر موضوع، در ادامه قصد داریم این قضیه را بیشتر بشکافیم.
در واقع، وقتی ما یک پروژهٔ نرمافزاری را به مشتری تحویل میدهیم، خواهیم توانست به معنای واقعی کلمه کمفروشی کنیم اما از آنجا که نگرش ما به نوعی کدنویسی شده که فقط و فقط «میزان نبودن دو کفهٔ ترازو» را معادل با کمفروشی در نظر میگیریم، خیلی اوقات ناخواسته در توسعهٔ نرمافزار دست به کمفروشی میزنیم.
به طور مثال، در زبان برنامهنویسی PHP استانداردی وجود دارد تحت عنوان PSR که این استاندارد منجر شده تا تمامی دولوپرهای این زبان برنامهنویسی با اصطلاحاً دستخط یکسانی کد بزنند تا در آینده کدهای یکدیگر را به مراتب راحتتر متوجه شوند. برای مثال، به قطعه کد زیر توجه کنید:
class MyClass
{
public $property = '';
public function setMethod()
{
}
public function getMethod()
{
}
}
همانطور که در کد فوق مشاهده میشود، نامگذاری کلاس، پراپرتی و متدها بر اساس استاندارد خاصی است و بزرگ و کوچک بودن حروف، روش نامگذاری، فواصل مابین بخشهای مختلف سورسکد و ... از قوانین خاصی تبعیت میکنند. حال فرض کنیم یک مشتری داریم و یکی از تعهداتی که به ایشان دادهایم این است که ما بر اساس استاندارد PSR کدنویسی میکنیم تا اگر در آینده دولوپری خواست سورسکد نرمافزار شما را مشاهده و ویرایش کند، کدها ساده و قابلفهم باشند. به طور مثال، بخشی از کدی که برای مشتری نوشتهایم را مد نظر قرار میدهیم:
class MyClass {
public $p= '';
public function setmethod(){
}
public function get()
{
} }
در کد فوق میبینیم که فاصلهگذاری و نامگذاریها اصلاً رعایت نشدهاند (در واقع، دولوپر بعدی هرگز بدون تلاش کافی قادر نخواهد بود تا مفهوم پراپرتی p$ را متوجه شود.) درست است که این کد به خوبی کار خواهد کرد و کسی هم از این قضیه بویی نخواهد برد، اما سؤال اینجا است که آیا ما به تعهدات خود پایبند بودهایم یا خیر؟ به همین سادگی میشود در کدنویسی هم دست به کمفروشی زد!
خیلی اوقات برای آنکه مشتری را مجاب کنیم که ما تمام مسائل امنیتی را در توسعهٔ نرمافزار مد نظر قرار میدهیم، در جلسات عقد قرارداد به مشتری میگوییم که اطلاعات حساس مشتریان (مثل رمزعبور) را نه تنها دو بار هَش میکنیم، بلکه اصطلاحاً از Salt هم برای امنیت بیشتر استفاده میکنیم؛ اما واقعیت امر این است که صرفاً به یک بار استفاده از الگوریتم Sha1 اکتفا میکنیم که این هم مصداق دیگری از کمفروشی است (توضیح مفاهیمی همچون Hash و Salt خارج از هدف این مقاله است؛ لذا به منظور جلوگیری از طولانی شدن مطلب، از توضیحات تکمیلی پیرامون این مفاهیم خودداری میکنیم.)
طراحی رابط کاربری هم جزو حوزههایی است که تا دلتان بخواهد میشود در آن کمفروشی کرد! برای اینکه قرارداد با مشتری بسته شود، در جلسهٔ عقد قرارداد دست به هر نوع وعده و وعیدی میزنیم که یکی از رایجترین آنها، ریسپانسیو بودن تمامی صفحات سایت در تمامی دیوایسها و مرورگرها (حتی IE) است اما زمانی که سایت تکمیل میشود، متوجه میشویم که بسیاری از جزئیات به دست فراموشی سپرده شدهاند.
در حوزهٔ بهینهسازی سایت برای موتورهای جستجو (SEO) هم خیلی باید مراقب بود. فرض کنیم که یک مشتری سئو داریم و یکی از مُفاد قرارداد این است که کلیهٔ اصول بهینهسازی از دید گوگل و سایر موتورهای جستجو همچون بینگ مد نظر قرار داده خواهند شد. جالب است بدانیم که موتور جستجویی همچون گوگل چیزی بیش از 200 مؤلفه را برای رنکینگ صفحات مد نظر قرار میدهد؛ حال چگونه ممکن است که یک سئوکار بتواند کلیهٔ این اصول را برای تکتک صفحات سایت مشتری آن هم با قیمتهای رقابتی که امروزه میبینیم، مد نظر قرار دهد!
در بهینهسازی، خیلی از بدیهیات هم گاهی اوقات نادیده انگاشته میشوند؛ مثلاً به مشتری میگوییم که به منظور بهبود رتبهٔ سایت، از Semantic HTML در طراحی رابط کاربری استفاده خواهد شد اما ردپایی از تگهای <header> یا <footer> به چشم نمیخورد چه رسد به تگ <section> و امثالهم!
سخن پایانی
گرچه دیدگاهی که خیلی از دولوپرها نسبت به کدنویسی دارند مشابه مثال خوراکی، یخچال و اسکناس است که در بالا به آن اشاره کردیم، اما ما گاهی اوقات نیاز به Unlearn کردن برخی از دیدگاههای خود داریم. به عبارت دیگر، باید چشمها را شسته و طور دیگری به مسائل پیرامون خود نگاه کنیم (برای آشنایی بیشتر با مفهوم Unlearn، به مقالهٔ مفهوم سواد در قرن ۲۱ام: برخورداری از مهارتهای Unlearn ،Learn و Relearn مراجعه نمایید.)
در گذشته برای نشان دادن نهایت دقت محاسبات الهی، گفته میشد که حتی یک دانه گندم هم مد نظر قرار داده خواهد شد که به نظر میرسد برای برنامهنویسان بایستی گوش زد کرد که حتی یک اِسپِیس هم مد نظر داده خواهد شد!
حال نوبت به نظرات شما میرسد. آیا اعتقاد دارید که عدم رعایت موارد طرح شده در بالا و بسیاری موارد دیگر که از قلم افتادهاند نوعی کمفروشی در صنعت توسعهٔ نرمافزار به حساب میآیند و به طور کلی با آنچه در این پست مطرح شد موافق هستید؟ نظرات، دیدگاهها و تجربیات خود را با سایر کاربران سکان آکادمی به اشتراک بگذارید.