‫programmers.stackexchange.com جای جالبی است

بیشتر برنامه‌نویس‌ها StackOverflow.com را می‌شناسند، مزایایش را می‌دانند و از آن استفاده کرده‌اند. اما شاید خیلی‌ها ندانند سایت مشابه آن یعنی programmers.stackexchange.com هم چیز جالبی است و سوال و جواب‌های جالب و مفیدی در آن یافت می‌شود. به عنوان نمونه به سوالات زیر دقت کنید:

۱- آیا یاد گرفتن هم زمان دو زبان برنامه‌نویسی کار درستی است؟

۲- چه کار کنم تا کیفیت کد در تیم برنامه‌نویسی بالا برود؟

۳- آیا زیبا بودن ظاهری کد ارزشی دارد؟

۴- همکار (برنامه‌نویس) من از روش‌های بدی برای کد نویسی استفاده می‌کند. چه باید کرد؟

۵- آیا برون‌سپاری پروژه‌های نرم‌افزارهای به کشورهای خارجی، نوعی خیانت به کشور خودم و هم وطنانم محسوب می‌شود؟

۶- من در زمان مصاحبه گاف‌های بدی داشته‌ام ولی استخدام شده‌ام. آیا باید از مدیر جدیدم خجالت بکشم؟

۷- آیا استفاده از مونو در یک پروژه تجاری با توجه به خطر ادعای مایکروسافت به آن کار درستی است؟

۸- علاقه‌ام رو به برنامه‌نویسی از دست دادم. حالا چه کار کنم؟

۹- چطور مدیرم را متقاعد کنم که کیفیت در کد چیز با ارزشی است؟

۱۰- چرا گفته می‌شود که مرکوری از گیت راحت‌تر است؟

۱۱- من مجبور شده‌ام که کد نویسی را با کیفیت پایین انجام دهم. حال چه می‌شود کرد؟

۱۲- آیا TDD در مقابل بهره‌وری قرار می‌گیرد؟

جمع‌های برنامه‌نویسی

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

متاسفانه چنین جمع‌هایی در حوزه برنامه‌نویسی و توسعه‌ی نرم‌افزار کم هستند و اگر هم هستند در موضوعات خیلی پراکنده‌ای کار می‌کنند. معمولاً همکارات داخل شرکتی هم هر کدام روی یک بخش متفاوت کار می‌کنند و نمی‌توانند جمع‌هایی راجع به مثلاً C#‎، Software Design، ORM و… تشکیل دهند یا اگر هم بتوانند، افراد جمع بیش از دو سه نفر نخواهد بود.

یکی از راه‌های جایگزینی که جدیداً برای این مشکل پیدا کرده‌ام، حضور مستمر در StackOverflow است. کاربران این سایت می‌توانند تعدادی tag مثل nhibernate، tfsbuild یا log4net را به عنوان tagهای مورد علاقه اضافه کرده و سوال و جواب‌های آنها را به طور مداوم زیر نظر داشته باشند. به این ترتیب می‌توانند نظرات و تجارب آدم‌های مختلف را دیده و در پاسخگویی و نظر دهی شرکت کنند. علاوه بر این سایت StackOverflow جدیداً بخش جدیدی به عنوان chat به سایت خودش اضافه کرده که آن هم می‌تواند ذره‌ای از این خلأ تنهایی تکنولوژیک را کم کند.

Using NHibernate event model in Castle ActiveRecord

Castle ActiveRecord is a thin layer over NHibernate and provides easy and fast use of NHibernate. Regarding data save/retrieve in Castle ActiveRecord, there is some useful events like OnSave and OnUpdate that can be utilized to automate features like automatic data tracing or data auditing. Unfortunately there is situations that we need events that are not supported directly in Castle ActiveRecord. For example we need an event like AfterLoad or PostLoad in order to do some specific operations in our application. But Castle ActiveRecord didn’t provide us with such an event. Googling showed me that I can leverage NHibernate events to achieve this goal. But how can I catch firing of NHibernate’s events in Castle ActiveRecord? This was not an easy question to be googled. BTW asking in StackOverflow and some extra googling here and here showed me the way.

Listening to NHibernate events in Castle ActiveRecord was very easier than I thought. All you must do is creating a class that implements a special interface and add a special attribute in class file. That’s it. You are done! No need to modify web.config or add code when initializing Castle ActiveRecord. So here is my listener class:

using Castle.ActiveRecord.Attributes;
using NHibernate.Event;

[assembly: AddEventListener(typeof(MyNameSpace.MyPostLoadEventListener))]

namespace MyNameSpace
{
    public class MyPostLoadEventListener : IPostLoadEventListener
    {
        public void OnPostLoad(PostLoadEvent @event)
        {
            //do what ever you want with @event.
        }
    }
}