2011/06/29

خلاقیت کور


یکی از مشکلاتی که همیشه به عنوان یک مهندس نرم‌افزار در شرکت‌های مختلف داشته‌ام مبارزه با خلاقیت کور، خلاقیت افسار گسیخته یا خلاقیت بی‌پایه بوده است. امروز بعد از بحثی که در رابطه با «رفتار بر اساس اصول در برابر خلاقیت‌گرایی» در شرکت داشتیم به ذهنم رسید که کمی بیشتر راجع به آن فکر کنم:

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


.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.

.
.

.
.

.
.

.
.

.
.


.
.


.
.


.
.


.
.


.
.


.
.


.
.





2011/06/27

تولید نرم‌افزار یا تحقیق و توسعه؟

خیلی وقت‌ها (نه بعضی وقت‌ها) حس می‌کنم کارم به عنوان یک مهندس نرم‌افزار به جای تولید نرم‌افزار (software development) تبدیل شده به تحقیق و توسعه (R and D). البته فکر می‌کنم این فقط مشکل من نباشد. فقط کافی است به بعضی شرکت‌ها سر زده و نگاهی به مانیتور افراد بیندازید. خیلی‌ها را پیدا می‌کنید که از صبح تا شب یا در حال PDF خوانی هستند یا همیشه در حال کار روی پروژه‌های تستی و آزمایشی هستند.

تحقیق و توسعه (R and D) لزوماً چیز بدی نیست. اما اولاً که برنامه‌نویس‌ها معمولاً برای درست برنامه‌نویسی آموزش دیده‌اند نه R and D و ثانیاً این که تاکید زیاد به R and D می‌تواند نشانه‌ای از آموزش غلط برنامه‌نویسان یا کم سوادی تصمیم‌گیرندگان شرکت باشد.




2011/06/26

‫فایده فضولی در Object Browser

چند روز است که می‌خواستم با استفاده از کتابخانه SharpZipLib یک فولدر و ساب فولدرهایش را zip کنم اما نمونه کدهای موجود نمی‌توانستند recursive عمل کنند و فقط فایل‌های موجود در فولدر را zip می‌کردند. از طرفی توسعه نمونه کدها هم نیاز به شناخت کامل‌تری از API کتابخانه داشت.


خوشبختانه کمی فضولی در اسمبلی ICSharpCode.SharpZipLib نجاتم داد. چون حین نگاه کردن به کلاس‌ها و name spaceهای آن متوجه کلاسی به اسم FastZip شدم. کار مد نظر من با FastZip با همین دو خط زیر انجام شد:
            FastZip fastZip = new FastZip();

            fastZip.CreateZip(zipFileName, sourceDirectory, true, "");




WcfFacility Hello World


WcfFacility is one facilities of Castle Windsor facilities that helps you ignoring adding service reference by Visual Studio. With WcfFacility you can ease server and client service management. Before starting this sample I searched for and found a good starting point here. Unfortunately this sample was usng .svc file. As I didn't want to use .svc file I wrote my own hello world sample with Wcf Facility:

Service code:



        public static void StartService()
        {
            var windsorContainer = new WindsorContainer()
                .AddFacility<WcfFacility>()
                .Register(Component.For<IDateService>()
                    .ImplementedBy<DateService>()
                    .DependsOn(new { number = 42 })
                    .AsWcfService(new DefaultServiceModel().AddEndpoints(
                            WcfEndpoint.BoundTo(new NetTcpBinding { PortSharingEnabled = true })
                                .At("net.tcp://localhost:8063/DateService")
                               ).PublishMetadata()
                ));
        }



Client Code:




        public static string InvokeWcfService()
        {
            var container = new WindsorContainer().AddFacility<WcfFacility>();

            container.Register(Component
                .For<IDateService>()
                .AsWcfClient(DefaultClientModel
                .On(WcfEndpoint.BoundTo(new NetTcpBinding())
                .At("net.tcp://localhost:8063/DateService")))
                .LifeStyle.Transient
                );

            var dateService = container.Resolve<IDateService>();
            string message = dateService.SaySomething("123");

            return message;
        }


Complete sample source code be downloaded here.




‫سه راه برای ارتباط با سرویس WCF


برای آن که از داخل یک برنامه بتوان از سرویس‌های WCF یک سرور استفاده کرد، یعنی wcf client ایجاد کرد، اقلاً سه راه وجود دارد:

۱- اضافه کردن service reference با کمک ویژوال استودیو: در این روش خود شما فقط url سرویس مورد نظر را به ویژوال استودیو می‌دهید. ویژوال استودیو هم کلاس‌ها و interfaceهای لازم را برای تولید proxy مورد نظر تولید می‌کند. بدی این روش این است که باید مقدار زیادی کد را نگه دارید بدون آن که خودتان آن را تولید کرده باشید. علاوه بر این کد تولیدی وابستگی زیادی به سرویس دارد، با کمترین تغییر در سرویس WCF شما هم باید service reference را update کرده و مجدداً برنامه را کامپایل کنید. ایراد آخر هم این است که موقع برنامه‌نویسی کلاینت باید سرور هم در حال اجرا و در دسترس باشد در غیر این صورت نمی‌توانید عملیات add reference را انجام دهید.

۲-اضافه کردن service reference با کمک ویژوال استودیو و instance گیری با کمک ابزارهای DI و IoC مثل Castle Windsor: این روش هم مشابه روش قبلی است با این تفاوت که روال instance گیری را به Castle Windsor می‌سپارید و خودتان درگیر نمی‌شوید.

۳- استفاده از WCF Facility برای ایجاد پراکسی‌های WCF بدون اجبار به Add Reference کردن یا تهیه کلاس‌های کلاینتی. در این روش به طور runtime و با کمترین دردسری می‌توان برای هر نوع سرویس WCFی پراکسی تعریف کرده و مورد استفاده قرار داد. WCF Facility یکی از امکانات جانبی Castle Windsor است. از WCF Facility حتی برای سرور WCF هم می‌توان استفاده کرد.


منبع:
http://blog.hatchan.nl/2010/07/wcf-facility-for-castle-windsor-client.html




2011/06/24

‫بهبودهایی در «کارویس»


سیستم کارویس، کار برای برنامه‌‌نویس، را کمی بهبود دادم:


۱- در صفحه «فهرست مشاغل» امکان جستجو بر اساس تگ را هم اضافه کردم.

۲- صفحه‌ی تگ‌ها بر اساس تکرار تگ‌ها سورت گردید.

۳- صفحه تگ‌ها دارای لینک به صفحه فهرست مشاغل است. تا بتوان آگهی‌های مرتبط با هر تگ را مثل این لینک دید.

۴- به ازای تک تک تگ‌ها فید اضافه شد. به این معنی که کاربران می‌توان مشترک فیدی شوند که مثلاً  آگهی‌های آن دارای تگ wcf است.









2011/06/17

‫‫‫استفاده از الگوی mvp


حتماً تا به حال اسم mvp را چندین و چند بار شنیده و مطالبی را هم راجع به آن خوانده‌اید. mvp یک الگوی طراحی شبیه mvc است که بیشتر برای winform استفاده می‌شود. از جمله مزایای mvp عبارت‌اند از:

۱- Seperation of Concerns (جدا سازی بخش‌های مختلف): یعنی هر بخشی باید کار خودش را انجام دهد.
۲- loose coupling: کاهش وابستگی بین بخش‌های مختلف برنامه
۳- قابلیت‌های نگهداری و خوانایی بالا
۴- افزایش قابلیت unit test و تست پذیری
۵- کمک به جدا سازی کار طراح UI و برنامه‌نویس Code behind

پیاده‌سازی mvp هم مثل خیلی از design patternهای دیگر بر خلاف ظاهرش بسیار ساده است. mvp روش چندان عجیبی نیست به طوری که حتی ممکن است روش پیاده‌سازی UIی که خود شما تا حالا استفاده می‌کرده‌اید به طور ناخودآگاه شباهت زیادی به mvp داشته باشد. در روش mvp به ازای هر فرم سه کلاس برای model، view و presenter وجود دارد. البته برای view و model اینترفیس هم وجود دارد. view توسط فرم ویندوزی پیاده‌سازی می‌شود، model به منطق برنامه یا مثلاً دیتابیس وصل است، presenter هم رابط این دو تا است.

بهترین راه یادگیری mvp استفاده از مثال است. برای یادگیری بیشتر به منابع زیر مراجعه کنید:

http://www.dotnettips.info/2009/08/mvp.html
http://www.codeproject.com/KB/architecture/WinForms_MVP.aspx
http://codebetter.com/jeremymiller/2007/07/26/the-build-your-own-cab-series-table-of-contents/




‫‫‫Inversion of Control چیست؟


تا حالا شده که به خاطر دیدن نمونه کد یا یک روش نامانوس از خیر خواندن یا استفاده از سورس کدی گذشته باشید؟ حتی اگر مطمئن باشید آن چیز نامفهوم می‌تواند ابزار مناسبی برایتان باشد؟ یکی از نمونه کدهایی که همیشه مرا از کار روی بعضی سورس کدها فراری داده IoC.Resolve("serverform")‎ است.

همان طور که می‌توان از ظاهر این خط کد حدس زد، موضوع مربوط می‌شود به Inversion of Control با استفاده از Castle Windsor. مفهوم IoC ارتباط تنگانگی با Dependency Injection (همان DI) دارد. این دو مفهوم به طور خلاصه design patternهایی هستند که با کاهش وابستگی بین اجزا مختلف نرم‌افزار و اتوماتیک کردن روال instance گیری‌های طولانی از کلاس‌ها و interfaceهای مختلف به تولید نرم‌افزارهایی که تست و نگهداری راحت‌تری دارند کمک می‌کند.

به عنوان مثال فرض کنید کلاسی به اسم HtmlTitleRetriever دارید که constructor آن به دو اینترفیس IFileDownloader و ITitleScraper نیاز دارد. روش instance گرفتن از کلاس HtmlTitleRetriever بدون استفاده از IoC به شکل زیر است:

IFileDownloader downloader = new HttpFileDownloader();
ITitleScraper scraper = new StringParsingTitleScraper();
HtmlTitleRetriever retriever = new HtmlTitleRetriever(downloader, scraper);

حال با استفاده از IoC و مشخص کردن بعضی تنظیمات در app.config می‌توان از روش زیر برای instance گیری استفاده کرد:

HtmlTitleRetriever retriever = container.Resolve<HtmlTitleRetriever>();

این روش هم کد نویسی را خلاصه‌تر و راحت‌تر می‌کند و هم امکان توسعه و تغییر برنامه را در آینده می‌دهد بدون آن که نیاز به build و دستکاری مجدد باشد.


پ.ن.: این نوشته در واقع خلاصه‌ای از مطلب «Inversion of Control and Dependency Injection with Castle Windsor Container - Part I» می‌باشد.




2011/06/11

استخدام برنامه‌نویس دات‌نت و تحلیل‌گر


شرکت یکی از دوستان «برنامه‌نویس ‎.Net مسلط به WPF، WCF و WF» و «تحلیل‌گر و توسعه دهنده بانک اطلاعاتی Sql Server 2008» استخدام می‌کند. علاقه‌مندان به ترتیب به این لینک و این لینک مراجعه کنند.




2011/06/07

کارویس، کار برای برنامه‌نویس

مدت کوتاهی است که سرویس کوچکی را برای جمع‌آوری آگهی‌های استخدام برنامه‌نویس ایجاد کرده‌ام. فعلاً تنها منبع سایت، نیازمندی‌های همشهری است، آن هم نه همه آنها بلکه آنها که به نحوی برایم جلب توجه کرده‌اند. از آخر فروردین به این طرف سعی کرده‌ام آن را به روز نگه دارم با این امید که شاید به درد بقیه هم بخورد.

آدرس سایت http://karvis.afsharm.com است. برای آن یک خوراک (Feed/RSS) هم ایجاد کرده‌ام. صفحه‌ای هم برای مشاهده فراوانی تگ‌ها وجود دارد. منتظر نظرات دوستان هستم.




2011/06/02

‫دسترسی به app.config در نصب Wcf Windows Service

اگر بخواهید سرویس WCF را به عنوان سرویس ویندوز اجرا کنید می‌توانید از این راهنما استفاده کنید. بخشی از این کار نصب سرویس در ویندوز است. اگر در این installer که باید در برنامه شما باشد، نیاز به اطلاعات app.config داشته باشید باید دقت کنید که دسترسی به app.config در حین نصب امکان‌پذیر نیست. پس باید از روش‌های دیگری مثل این استفاده کنید.




2011/06/01

‫معرفی Git Extensions

در طول مدتی که با git کار کرده‌ام فقط از command line استفاده کردم چون فکر می‌کنم command line به قلب git نزدیک‌تر است. اما هر چقدر هم به command line عادت داشته باشیم باز هم بعضی وقت‌ها نیاز به یک ابزار visual هست. یکی از قشنگ‌ترین ابزارهای گرافیکی تحت ویندوزی که به نظر من وجود دارد، Git Extensions است.

عکس ۱ - صفحه اول Git Extension


عکس ۲ - history کل مخزن


عکس ۳ - مشاهده فایل‌های تغییر کرده و تغییرات هر کدام از آنها در  هر کدام از commitها.


عکس ۴- مشاهده درخت پروژه


عکس ۵ - مشاهده history یک تک فایل


عکس ۶ - مشاهده تغییرات انجام شده در یک commit دلخواه