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

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

به تازگی با یکی از دوستانم بحث های فنی مختلفی راجع به انواع روش برنامه نویسی انجام می دهیم که کمک شایانی در زمینه فکر به این موضوعات به من کرده است. ابتدا با روان شناسی برنامه نویسی به شکل رسمی هنگام خواندن کتاب Code Complete آشنا شدم. این کتاب فصلی در باره اثر شخصیت بر برنامه نویسی داشت که توجه من را به این موضوع جلب کرد و کتاب بسیار عالی Psychology of computer programming را نیز به عنوان مرجعی جذاب معرفی کرد. همچنین کتاب The mythical man month هم از کتاب های خیلی خوب در این زمینه است که البته من این کتاب آخر را نخوانده ام و در لیست خواندنی هایم قرار دارد.

روان شناسی برنامه نویسی تلاش می کند تا کمک کند برنامه ها با هزینه کمتر، به موقع و با خطای کمتر تولید شوند، کارا باشند و قابل نگهداری باشند و در مقابل تغییر مقاومت نشان ندهند. برنامه نویسی یک کار ذهنی است و در واقع کمتر شغلی پیدا می شود که از علوم کامپیوتر و مهندسی نرم افزار کمتر فیزیکی باشد. برنامه نویسی فرایندی است که شامل خواندن و نوشتن کد، تفکر ، حل مساله، ارتباط برقرار کردن با دیگران، یادگیری، فهم و درک و ... است. برای بهتر برنامه نوشتن می توانیم برنامه نویسی و فهمیدن برنامه را از نظر ذهنی و روانی بررسی کنیم. این کار از دهه هفتاد میلادی آغاز شده است و در واقع psychology of computer programming و کتاب های دیگر به خوبی آن را تشریح می کنند. کتاب مهم دیگری به نام peopleware هم هست که بسیار زیبا این مطلب را مورد بررسی قرار می دهد. در زیر به برخی موارد جذاب راجع به روان شناسی برنامه نویسی اشاره می کنم و امیدوارم دوستان علاقه مند کتاب های مربوطه را بخوانند و از آن ها لذت ببرند.

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

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

کد رسانه worm است: write once read many times هنگام نوشتن کد همیشه تصور کنید که کسی که آن را می خواند چه حسی خواهد داشت، آیا کد قابل فهم خواهد بود. کد بسیار بیش از آن چه نوشته می شود خوانده می شود، توسط نویسنده ای به جز نفر اصلی تغییر داده می شود. یک راه جالب این است که برنامه نویس بعدی یک بیمار روانی قاتل است که آدرس خانه شما را دارد. برنامه را طوری بنویسید که ناراحتش نکنید. خودتان فردا برای خودتان همان روانی مریض خواهید بود. بعد از یک ماه کد قدیمیتان را بخوانید تا ببینید طقریبا یک کد جدید محسوب می شود. ذهن سریع این چیز ها را فراموش می کند. ذهن ما در زمانی که درون یک مساله عمیق است همه جزیاتش را در حد توان در خود نگه می دارد اما این بخش از ذهن کند و کم حجم است و هر لحظه کارتان با مساله تمام شود پاک خواهد شد.

حواستان به خودتان باشد: شاید مهمترین حرفی که در این پست می زنم این باشد. به نظر من این عامل از مهمترین عامل های برنامه نویس بهتری شدن یا نشدن یک فرد است. ما باید به عنوان برنامه نویس سعی کنیم حواسمان باشد که داریم چه کاری را به چه گونه ای انجام می دهیم. مثلا چرا یک باگ را سریع فیکس کردیم و یا چرا نتوانستیم چیزی را سریع یاد بگیریم. فلان باگ را چه طور تولید کردم؟ اگر چه کار می کردم تولید نمی شد؟ باید چه کار می کردم که سریعتر بفهمم چه طور حلش کنم؟ این کار که به آن خود نگری یا Introspection گفته می شود از تکنیک های بسیار قوی برای برنامه نویس بهتری شدن است و توسط روان شناسان هم مورد استفاده قرار می گیرد. البته با introspection نمی توان آزمایش معتبر طراحی کرد ولی گاهی به ما سر نخ های بسیار مفیدی می دهد. بسیاری از روان شناسان موفق از این تکنیک سود زیادی برده اند زیرا ما بیش از آن که فکر می کنیم شبیه هم هستیم. با این کار برنامه نویسان دیگر و دلیل روش کد زدنشان، مدل برخوردشان با انتقاد و ... را نیز بهتر می فهمیم.

مساله آخر که بسیار مهم است صداقت است. یک برنامه نویس اگر صادق نباشد باید او را دور بیندازید. با او کار نکنید :) از بین ببریدش!! :)) دور از شوخی کار با کسی که صداقت ندارد. برای باگ هایش بهانه پیدا می کند. دلایل دروغین برای خوبی الگوریتمش پیدا می کند و الکی وانمود می کند چیزی را بلد است که بلد نیست، نظرات احمقانه می دهد و اگر نظراتش را قبول نکنید سعی می کند شخصیتتان را در تیم خراب کند کار بسیار سخت است. Intelectual honesty مساله بسیار بسیار مهمی است که در باره آن پستی مخصوص خواهم نوشت.

دوست دارم نظرات و تجربیات دیگران را در زمینه برخورد روان شناسانه با برنامه نویسی و نگاه به آن به عنوان یک علم انسانی را بدانم.