2010/03/26

Is SVN better than TFS?

These days I’m convincing some colleagues and managers to not use TFS and use SVN instead. I’m pretty sure that SVN fits better into our hardware and knowledge limitations. Additionally we are going to use TFS just for source controlling.

For me, SVN has many advantages over TFS even when pricing is not a matter:
  1. SVN can be installed on old machines; it requires just few mega bytes of hard disk. It also does not need additional resources like MS SQL.
  2. SVN has a very larger user community than TFS.
  3. SVN is common in open source world but TFS not.
  4. SVN can work disconnected, and supports patches.
  5. More companies use SVN than TFS (near me).




2010/03/17

‫دلایل برتری SVN بر SourceSafe

همه می‌دانند که دوران SourceSafe خیلی وقت است به سر آمده و به جای آن باید جایگزین بهتری مثل SVN یا git پیدا کرد. اما با وجود آن هنوز هم باید برای برای از رده خارج کردن SourceSafe از بعضی جاها، دلایل واضح و گویایی پیدا کرد. از آنجا که من هم در حال براندازی SourceSafe از اینجا و جایگزینی آن با SVN هستم تصمیم گرفتن بعضی مزایای این دو را نسبت به هم بسنجم. البته این متن یک مقایسه کلی بدون عمیق شدن زیاد به خصوص در SVN است. اما به هر حال می‌کنم همین مقایسه سرسری هم بتواند فاتحه SourceSafe را بخواند. من برای تهیه این مقایسه از کتابچه Subversion وحید نصیری استفاده کرده‌ام.



امکانات SVN که یا در SourceSafe وجود ندارند یا استفاده از آنها سخت و پردردسر است:

۱- منابع یادگیری و آموزشی در مورد SVN خیلی بیشتر از SourceSafe است.
۲- سرعت کار با SVN بیشتر است.
۳- مکانیزم patch در SVN در تیم‌های پراکنده خیلی به درد بخور است در حالی که SourceSafe اصلاً چنین امکانی ندارد.
۴- انشعابات و تگ‌گذاری در SVN خیلی راحت‌تر و رایج‌تر است.
۵- SVN دارای ابزاری به نام hooks است که در اتوماسیون پروسه تولید نرم‌افزار خیلی مفید و به درد بخور است.
۶- با SVN خیلی راحت‌تر می‌توان سرورهای کنترل سورس ایجاد کرده و به اینترنت متصل کرد.
۷- با SVN خیلی راحت‌تر می‌توان Continuous Integration را (با کمک ابزارهایی مثل CruiseControl) پیاده‌سازی کرد.
۸- بلد بودن SVN در بازار کار با ارزش‌تر از بلد بودن SourceSafe است.
۹- SVN بر خلاف SourceSafe علاوه بر ویندوز در سیستم عامل‌های دیگر هم قابل استفاده است.

۱۰- SVN قابلیت integrate شدن با خیلی ابزارهای دیگر مثل Apache را دارد ولی SourceSafe ندارد.

۱۱- SVN کدباز است و استفاده از آن هم مجانی و بدون دردسر crack است و هم اخلاقی.
۱۲- SVN با کمک TortoiseSVN با ویندوز integrate می‌شود در نتیجه کار با آن SVN در خارج از Visual Studio هم خیلی راحت است.




امکانات SourceSafe که یا در SVN وجود ندارند یا استفاده از آنها سخت و پردردسر است:

۱- به نظر می‌رسد (خودم هنوز امتحان نکرده‌ام) که integration ابزار SourceSafe با Visual Studio راحتی و امکانات بیشتری نسبت به برنامه‌های integration ابزار SVN (مثل ابزار کدباز AnkhSVN و ابزار تجاری VisualSVN) به دست بدهد.


نکات تکمیلی:
در ادامه موضوع این نوشته، به پیوندهای زیر هم نگاهی بیندازید:




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


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

من برای تهیه این فهرست از بخش جستجو و فهرست شرکت‌های سایت شورای عالی انفورماتیک استفاده کرده و شرکت‌هایی که دارای رتبه ۱ تا ۴ بوده‌اند را بررسی کرده و آنهایی که در معیارهای زیر می‌گنجیده‌اند را به فهرستم اضافه کرده‌ام:

معیارهای اصلی:
۱- دارای رتبه ۱ تا ۴ در رشته «تولید و پشتیبانی نرم‌افزارهای سفارش مشتری» از شورای عالی انفورماتیک باشند.
۲- سابقه منفی از آنها در ذهنم نباشد.
۳- وب‌سایت آنها کار کند و دارای بخشی به اسم همکاری، استخدام، پیوستن به ما و… باشد.
۴- حتی اگر آن شرکت دولتی بود استقلال و سابقه مشخصی داشته باشد.
۵- برنامه‌نویس دات‌نتی به دردشان بخورد.
۶- مستقر در تهران باشد.
۷- از رتبه، وب‌سایت، فهرست مشتریان، شهرت و… آنها بتوانم حدس بزنم درآمد دارند و در نتیجه می‌توانند حقوق مناسبی پرداخت کنند.
۸- اگر تعدادی از این معیارها را هم نداشت یک سابقه ذهنی خوب از آن شرکت داشته باشم.

معیارهای تکمیلی و رقابتی:
۱- بزرگ بودن تیم برنامه‌نویسی.
۲- معروف بودن شرکت.
۳- تک تخصصی بودن شرکت در زمینه تولید نرم‌افزار (هم زمان در حوزه سخت‌افزار، شبکه، نمایندگی فلان محصول و… هم فعال نباشد).
۴- پیمانکار Outsourcing شرکت‌های آمریکایی/اروپایی باشند.
۵- عدم وابستگی زیاد به یک وزارت‌خانه یا مرکز دولتی خاص.
۶- مبسوط بودن توضیحات استخدام در وب‌سایت شرکت.
۷- جدی گرفتن کار از طرف خود شرکت، اعضا و کارمندان آن.


و حال این هم فهرست شرکت‌های نرم‌افزاری مورد علاقه من که به نظر می‌رسد برای من جذابیت شغلی کافی داشته باشند (مرتب شده بر اساس رتبه و نام شرکت):
۱- رایورز (رتبه ۱)
۲- کاسپین (اقماری بانک پارسیان) (رتبه ۱)
۳- همکاران سیستم (رتبه ۱)
۴- پندار پژوه (رتبه ۲)
۵- اطلاع‌رسانی پیوند داده‌ها (رتبه ۳)
۶- فناوری موج خاور (رتبه ۳)
۷- چارگون (رتبه ۳)
۸- آلفا افزار (رتبه ۴)
۹- افرا نت (رتبه ۴)
۱۰- طب و رایانه (رتبه ۴)
۱۱- طرفه نگار (رتبه ۴)
۱۲- موسسه اطلاع‌رسانی مهندسی پزشکی پرشیا شبکه (رتبه ۴)


نکات تکمیلی:
۱- این فهرست ۱۲ تایی از بررسی همه ۲۶۳ شرکتی که دارای رتبه ۱ تا ۴ در رشته «تولید و پشتیبانی نرم‌افزارهای سفارش مشتری» بوده‌اند استخراج شده است.
۲- تقریباً هیچ کدام از این ۱۲ شرکت روی سیستم‌های مالی-اداری متمرکز نیستند یا اگر هستند از شرکت‌های خیلی بزرگ این کار هستند و این خیلی به علاقه من نزدیک است.


خواهش دوستانه:
اگر کسی اطلاعات، سابقه ذهنی یا هر چیز مفید دیگری از این ۱۲ شرکت دارد (یا می‌داند) که ممکن است به شناخت بهتر آنها کمک کند، لطفاً آن اطلاعات را در اینجا بگذارد تا هم این فهرست غنی‌تر شود و هم همه‌ی ما بتوانیم انتخاب شغلی بهتری داشته باشیم.




2010/03/15

Which OSS to contribute?

My first and only contribution in an open source software was OTRS. In there I translated, helped in localization, tested, answered to questions in mailing lists, and write some blog posts about it. My progress in OTRS was good but the problem was that OTRS was written in Perl in Linux platform but I was a C# developer in Windows platform. So I will never could contribute in its development. Additionally OTRS could not help me to increase my C# and .Net skills.

Consequently I decided to contribute in a C# open source project. As I thought learning a CMS could be fascinating, started to work on Cuyahoga. Cuyahoga is an open source ASP.NET MVC and C# project that utilizes NHibernate as its ORM. Installing and using Cuyahoga for a while learned me that Cuyahoga is an ASP.NET MVC project and will force me to learn ASP.NET MVC. Because I was going to deepen my C# skills and didn't want to hang with ASP.NET MVC and its deployment issues, I decided to find another OSS to contribute.

Many folks at StackOverflow believes that best open source project to contribute is a project that you use it in daily tasks. Some of OSS that I use regularly are Firefox, ScrewTurn Wiki, NHibernate, Ajax Control Toolkit and Pidgin. Among them just NHibernate and ScrewTurn Wiki are almost based only on C#. So I'm going to take a closer look at their contribution state and their community to find out which of them is better to me to contribute.




2010/03/13

‫انتخاب بین SVN و git

مدت‌هاست که به دنبال خلاصی از دست SourceSafe هستیم ولی چون رییس نمی‌خواهد، نمی‌شود که نمی‌شود. رییس آنقدر به SourceSafe علاقه دارد که من خودم هم بعضی وقت‌ها یادم می‌رود چرا می‌خواهم آن را کنار بگذارم. برای جایگزینی SourceSafe دو گزینه را نامزد کرده‌ام: SVN و git. ولی متاسفانه انتخاب بین این دو برایم آنقدر سخت شده که بی‌حساب.

git در این دو سه ساله محبوبیت خیلی خیلی زیادی پیدا کرده است و روز به روز در حال پیشی گرفتن از SVN بوده است. git امکانات خیلی خوبی برای تیم‌های decentralize دارد. به عنوان مثال وقتی که سرور خاموش است یا به اینترنت دسترسی ندارید باز هم می‌تواند از نسخه local خود به عنوان یک سورس کنترل استفاده کنید و بعداً که به سرور دسترسی پیدا کردید آن check-inهای local را به راحتی در سرور اصلی check-in کنید.

هم git و هم SVN محبوبیت خوبی در پروژه‌های کدباز دارند ولی حدس می‌زنم جا افتادن git در شرکت‌های ایرانی خیلی طول بکشد. چون با وجود add-inهایی که برای Visual Studio دارد (مثل Git Extension) باز هم مهمترین ابزار کار با آن git bash است که یک ابزار خط فرمانی است. از دیگر سو SVN در حال حاضر توسط تعدادی از برنامه‌نویسان ایرانی و قاعدتا شرکت‌های ایرانی مورد استفاده قرار می‌گیرد. add-inهای معروف‌تری مثل AnkhSVN دارد و رابط معروفی مثل TortoiseSVN دارد.

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

توجه: StackOverflow پر است از بحث‌های مقایسه git و SVN.

به روز رسانی: برای مقایسه این دو از دید یک برنامه‌نویس ایرانی، نگاهی هم به اینجا بیندازید.




2010/03/11

Searching for a specific open source software

Did you ever thought about how one can find an open source equivalent project for an upcoming new application? We just did. Company is going to create an entirely new application for an online reservation system using ASP.NET. This reservation systems is used to reserve time of a group of people (like lawyers) for another group of people (clients). But I'm going to suggest the boss to find a similar open source project and evolve it. By this, we can save some times of development hours, evolve an existing open source project and learn something new by contributing an open source project.

In order to convince the boss to use (and contribute in) an open source project rather than creating a new one, I'm forced to find a similar project. As I'm not very familiar with abbreviations, expressions and idioms of English, I asked a question in StackOverflow: How can I determine if there is an open source software for a specific purpose? Then StackOverflow folks directed me to search in sites like SourceForge, Google Code, CodePlex, CodeProject, Ohloh and even Google Search.

Using Google Search I realized that most off reservation software goes around hotel and airline reservation and also find phpScheduleIt that was not similar to our desired reservation system (a sample installation).

In SourceForge I searched for keyword "Reservation, Time Reservation and Person Reservation" and find 2 categories of reservation systems: 1. Hotel and restaurant reservations and 2. Equipment reservations. Which none of them fit into my requirements that deals with "Person and Time Reservation".

CodePlex offered very little results. In CodePlex I found NerdDinner that was very irrelevant to my case. Then I found OpenReservation that was near my purpose but seems to be staled.

In CodeProject there was just some Hotel and Reservation projects but nothing more.

Ohloh was like SourceForge.

Finally searching in Google Code lead me to results like medical, hotel, classroom, restaurant, taxi and Airline reservation. So none of then were useful for me.

At the end of searching I realized there is nothing available for me, but I learned that SourceForge is the greatest and best place to search for open source project. And it seems that it's always better to search for a project in open source sites before starting a new one even like my case, no previously started project is found.




2010/03/09

Problems with shared remote servers

When you write a new ASP.NET website, one possible situation is to deploy it on a shared remote server. In such a typical server there are many websites installed on a same machine. All of them use shared memory and shared CPU. Doing a simple operation of the site that may take 10 mili seconds in a regular machine may take several seconds in a shared machine.

In addition to this slowness there may be some CPU and/or memory quota that causes some lengthy operations to fail. In order to override such problems, it is necessary to take attention to KISS principle. When a program is wrote as simple as possible then there would be lesser need to memory and CPU.




Over parametrized coding

Some people are used to avoid hard coding in every case they encounter. This extra avoid of hard coding leads to over parametrization. Everything is parametrized in constant classes and config files. Coders and method implementers should imagine every situation that a parameter can take. They must write extra if's and over weighted switches just because of a parameter that in real world will never change in several years and will never change in many many installations.

Over parametrized coding is against KISS principle. It encourages to write complicated codes while they could be simpler codes.




2010/03/08

رتبه‌بندی شرکت‌های انفورماتیک

«رتبه‌بندی شرکت‌های انفورماتیک» که نام کامل آن «آیین‌نامه رتبه‌بندی و احراز صلاحیت شرکت‌های انفورماتیکی» است، آیین‌نامه‌ای است که شورای عالی انفورماتیک کشور (زیرمجموعه معاونت برنامه‌ریزی و نظارت راهبردی) بر اساس آن امتیازی ۱ تا ۷ به شرکت‌های کامپیوتری می‌دهد. شرکت‌های کامپیوتری اعم از سخت‌افزاری، نرم‌افزاری، شبکه‌ای و… برای عقد قرارداد با شرکت‌ها و سازمان‌های دولتی ملزم به ارائه رتبه شرکت خود در شورا هستند. به عبارتی دیگر مراکز دولتی اجازه ندارند با شرکت‌هایی که رتبه ندارند قرارداد ببندند. رتبه ۱ به منزله بالاترین و رتبه ۷ به معنی پایین‌تر رتبه است. رتبه یک شرکت مشخص می‌کند آن شرکت در طول یک سال مجموعاً تا چه مبلغی می‌تواند قرارداد ببندد.

مبنای محاسبه رتبه‌ها تعداد و سطح تحصیلات نیروی انسانی، حقوق پرداختی، بیمه و مالیات پرداختی و براخی عوامل دیگر است. بر اساس آیین‌نامه جدید که از سال ۱۳۸۴ ابلاغ شده است هر شرکت می‌تواند در هر یک از ۱۳ رشته مشخص شده تقاضای محاسبه رتبه داشته باشد. این ۱۳ رشته عبارت هستند از:
۱- ارائه و پشتیبانی سخت‌افزاری Main Frame
۲- تولید و ارائه رایانه‌های غیر Main Frame
۳- تولید و ارائه دستگاه‌های جانبی
۴- تولید و ارائه قطعات و ملزومات
۵- تولید و پشتیبانی نرم‌افزارهای سفارش مشتری
۶- ارائه و پشتیبانی بسته‌های نرم‌افزاری و CD اطلاعاتی تولید داخل
۷- ارائه و پشتیبانی نرم‌افزارهای خارجی (SE) سیستم و ابزارها
۸- خدمات شبکه‌های اطلاع‌رسانی Providers
۹- شبکه داده‌ها‌
۱۰- مشاوره و نظارت بر اجرای طرح‌های انفورماتیکی
۱۱- خدمات پشتیبانی
۱۲- آموزش و پژوهش
۱۳- سیستم‌های ویژه

هر یک از این رشته‌ها هم به تعدادی زیررشته تقسیم می‌شوند. مثلاً رشته «تولید و پشتیبانی نرم‌افزارهای سفارش مشتری» به ۱۸ زیررشته زیر تقسیم می‌شود:
۱- آموزشی، ۲- اداری، مالی و صنعتی، ۳- بهداشتی و درمانی، ۴- بانکداری، ۵- بیمه، ۶- حمل و نقل، ۷- طراحی و مهندسی، ۸- فرهنگی، مذهبی، ۹- حقوقی و قضائی، ۱۰- امنیتی و نظامی، ۱۱- اطلاعات جغرافیایی، ۱۲- هتل‌داری و بیمارستانی، ۱۳- نشرافزار (خدمات نشر)، ۱۴- هنری تبلیغاتی، ۱۵- کتابداری، ۱۶- گردشگری، ۱۷- اطلاعات عمومی، ۱۸- سایر



پیوندها:




2010/03/07

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


«مجله برنامه‌نویس» مجله‌ای الکترونیکی و رایگان است که توسط اعضا و دست اندرکاران «سایت برنامه‌نویس» که زمانی (حدود سال ۱۳۸۱) تنها مرجع معتبر برنامه‌نویسان ایرانی به حساب می‌آمد منتشر می‌شود. اولین شماره این مجله در اسفند ۱۳۸۷ منتشر شد و تاکنون (اسفند ۱۳۸۸) دو شماره دیگر نیز از آن منتشر شده است. مدت‌ها بود که می‌خواستم این سه شماره را بخوانم ولی تا حالا فرصتی پیش نیامده بود. امروز که آنها را خواندم فهمیدم که کیفیت مطالب آن خیلی بیشتر از آنی بود که تصور می‌کردم و آرزو کردم که ای کاش آن قدر وقت می‌داشتم که بتوانم در انتشار این مجله همکاری داشته باشم. اما حالا که چنین وقتی در اختیار ندارم ترجیح دادم برداشت خودم از کیفیت مجله (پیشنهادات و انتقادات) را در اینجا بگذارم شاید که به درد کسی بخورد:

۱- جالب‌ترین بخش مجله، بخش معرفی کتاب است که در هر سه شماره کتاب‌های جالبی را معرفی کرده است. به نظر من بعد از این بخش، بخش «بیوگرافی» قرار دارد.
۲- ای کاش مجله برنامه‌نویس یک سایت یا وبلاگ می‌داشت و انتشار نسخه‌های جدید خود را از طریق ایمیل یا RSS به اطلاع دیگران می‌رساند. متاسفانه در حال حاضر آن را حتی نمی‌توان با خیال راحت از خود سایت برنامه‌نویس دانلود کرد چون گوگل آن را به عنوان سایت خطرناک تشخیص می‌دهد و فایرفاکس هم هشدارهای شدیدی به هنگام ورود به سایت می‌دهد.
۳- این که در طول ۱۲ ماه فقط ۳ شماره از مجله منتشر شده است خیلی هم بد نیست. مهم نیست که این حرکت ادامه دار باشد.
۴- پیشنهاد می‌کنم مطالب بیشتری در معرفی سایت‌هایی مثل StackOverflow.com نوشته شود.
۵- به نظرم می‌رسد نوشتن مطالبی در باب موضوعات خاص داخل ایران مثل نرخ دستمزد، شرایط قرارداد، نصب در سرورهای ایرانی، مسائل فارسی‌سازی و محلی‌سازی و… مخاطبان خوب و منحصر به فردی داشته باشد.
۶- ترویج تفکراتی از این دست هم به نظرم خوب می‌آید: ما نباید خودمان را از بقیه دنیا جدا کنیم و مدام سایت‌ها و انجمن‌های مخصوص به خود درست کنیم. بلکه باید با یاد گرفتن کامل زبان انگلیسی و آداب و رسوم بین‌المللی و شناخت مجامع جهانی برنامه‌نویسان و توسعه‌دهندگان سعی کنیم فاصله موجود بین خود و برنامه‌نویسان مطرح دنیا را کمتر کنیم.


لینک‌های دانلود از irpcn: ، شماره یک، شماره دو، شماره سه




My first experience with LINQ to NHibernate

Weeks ago we decided to upgrade to NHibernate 2.1.2
to be beneficiary of LINQ-to-NHibernate and other new features of last version of NHibernate. After introducing LINQ technology in .NET 3.0 many people were thinking the lack of a LINQ provider for NHibernate until when Ayende Rahien introduced the existence of LINQ-to-NHibernate.

My colleague Masoud and I started to replace a group of old NHibernate queries with LINQ-to-NHibernate queries. We progressed the task quickly and finished the entire task in few days. But very soon realized that writing LINQ-to-NHibernate queries is not as easy as we thought. Our queries were based on my knowledge of LINQ-to-Objects but many features working in LINQ-to-Objects was not working in LINQ-to-NHibernate. For example short circuit evaluation was not working. We tried to solve problems specially with help of StackOverflow. And here is some of encountered problems and their solution:


1. (TargetInvocationException): Exception has been thrown by the target of an invocation., (NullReferenceException): Object reference not set to an instance of an object., Occurs when a compare in LINQ throws an exception, this exception is wrapped in a TargetInvocationException exception and rethrowed. Like: l.Sender.Role.Contains(senderRoleSearch.Trim()) when senderRoleSearch == null

 2. Working with Enums is a bit strange. If you have a mapping like this:


then you will encounter some odd errors like:l.LetterType == LetterType.Internal results in "(QueryException): Type mismatch in NHibernate.Criterion.SimpleExpression: LetterType expected type System.Int32, actual type Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities.LetterType,. In this case you should remove type="int" from the mapping. solution. For more information go here.


 3. When you have such a query:
var q=from l in session.Linq<Letter>

where crit == null ? true : l.Subject.Contains(crit.Trim())

select l;
You will probably encounter with "null object reference" because LINQ has not short-circuit evaluation. For more info go here and here.

4. Dynamic query:
While using nulls and nullables is not possible due to case 3 (above), You can use dynamic queries like this:
var q = from l in session.Linq()
                        select l;

                if (serialNumberSearch != null)
                    q = q.Where(l => l.SerialNumber == serialNumberSearch.Trim());

5. Can not call methods: We were not able to find a solution.

 6. Subqueries does not work. Here is a our work-around.




قیمت نرم‌افزار حقوق و دستمزد در ۱۵ سال پیش




2010/03/06

شرکت ایده‌آل من

شرکت ایده‌آل من به عنوان یک توسعه دهنده نرم‌افزار (برنامه نویس)، دارنده مدرک مهندسی نرم‌افزار از دانشگاه علم و صنعت، دارای چهار سال و نیم سابقه کار بیمه‌ای و چند سال کار غیر بیمه‌ای و پاره وقت و نیز به عنوان کسی که تمام هم و غمش تولید نرم‌افزار بوده عبارت است از:


۱- شرکتی که کارم در آنجا فقط (عمدتاً) توسعه نرم‌افزار باشد. یعنی مجبور نباشم در جلسات دموی نرم‌افزار شرکت کنم و کاری به کار پشتیبانی نداشته باشم.

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

۳- از من توقع نداشته باشد مثل یک حسابدار، یک بانکدار، یک کارشناس بیمه یا هر شغل غیر مرتبط دیگری به فرایند‌های کاری آن شغل تسط داشته باشم. من یک توسعه دهنده نرم‌افزار هستم و هیچ علاقه‌ای به فهم مسائل مالیاتی، نرخ بهره و استهلاک دارایی‌های ثابت ندارم. دقت کنید که معمولا بخش Business Rules یک نرم‌افزار درصد کوچکی از کل فرایند تولید نرم‌افزار را تشکیل می‌دهد و اگر تیمی یا شرکتی عمده وقتش را در تولید این بخش بگذراند یعنی آنها در حال تولید یک نرم‌افزار ناقص هستند.

۴- نرم‌افزار را به روش استاندارد تولید کرده و تیم توسعه نرم‌افزار را به روش استاندارد هدایت کند. این استانداردها من در آوردی، اختراعی یا ابداعی نیستند. استفاده از نرم افزارهای Issue Tracking، Source Control Management و روش‌های مدیریت پروژه Agile یا RUP بخشی از استاندارد بودن کار است که می‌توان درباره آنها به تفصیل صحبت کرد.

۵- من تنها برنامه‌نویس آنجا نباشم و تعداد برنامه‌نویس‌ها (توسعه دهنده‌ها) آنقدر باشد که حضور تمام وقت یک مدیر پروژه کاملا در آنجا اجباری باشد.

۶- تکنولوژی (و اینترنت) دوست باشد. مثلا حالا که نسخه‌های Visual Studio 2010 را مثل نقل و نبات می‌توان هر جایی پیدا کرد مجبور نباشم برای ارتقا Visual Studio 2005 به Visual Studio 2010 التماس کنم و خودم را ضامن قرار دهم.

۷- کارش (کار من) بیشتر به سمت back-end باشد تا front-end

۸- در آن شرکت به روز بودن، انگلیسی دانستن و آشنایی با جامعه بین‌المللی برنامه‌نویسان یک امتیاز خیلی مهم محسوب شود.

۹- حقوق و مزایای آن و شرایط قرارداد آن قابل رقابت باشد.

۱۰- در تست جوئل اقلا نمره ۶ (از ۱۲) را داشته باشد.

۱۱- دیگر الزامات یک شرکت تجاری معمولی را در حد متعارف داشته باشد.


توضیحات تکمیلی:
-- خیلی از شرکت‌های تولید کننده نرم‌افزار اقلا در همان یکی دو سال اوایل تاسیس بیشتر این شرایط را دارا می‌باشند.
-- معیاری به اسم «رتبه بندی شورای عالی انفورماتیک» وجود دارد که برای سنجش ایده‌آل بودن شرکت‌های متوسط و بالاتر به طور نسبی بد نیست و می‌شود چیزهایی از آن فهمید.
-- اگر شرکتی را منطبق با این معیارها سراغ دارید که ضمنا در حوزه دات‌نت و سی‌شارپ فعالیت می‌کند و نیاز به نیرو هم دارد لطفاً به من هم اطلاع دهید. چون در آستانه عوض کردن شرکت هستم.




In praise of Source Control Software

We are a small semi-distributed development team. Our team use MS Visual Source Safe 2005 on an internal server at company. One of colleagues sends her patches via email to me and I'm forced to check-in her changes. This manual operation is very tedious and time waster. Everyone knows that there is better source control softwares that if configured properly, she could compile her patches in a pack and I will check-in them in a very easier manner even if we have not an connected server.

In an ideal situation I wish ourselves:
1. Adoption the need for a better source control software like SVN or git by BOSS.
2. Knowledge of using desired source control software among colleagues.
3. A connected-to-internet server for hosting source control software





2010/03/03

Dealing with subqueries in LINQ-to-NHibernate

Some days ago I was in a situation that needed to use sub queries in LINQ-to-NHibernate. But as LINQ-to-NHibernate does not support sub queries (because of Criteria does not support it) I asked help from StackOverflow. The best response was that it's better to use HQL and forget about LINQ-to-NHibernate in the case of subqueries. Unfortunately that wasn't a good solution for me, because we were hoping using LINQ-to-NHibernate, we will get rid of weakly typed HQL queries.


In order to find a work around, my colleague Masoud Ramezani suggested to use 2 LINQ queries to get results. One LINQ-to-NHibernate query for no sub query related section of the query and a second LINQ-to-Object query for sections that contain sub queries. Following 2 snippets shows complete query and divided query that act as a work around to sub query problem.


<br />internal List<Letter> SearchLetter(DateTime? fromDate, DateTime? toDate, string receiverOrganizationSearch, SendingInformationDAO sendingInformationDAO)<br />{<br />List<Letter> list = null;<br />var q = from l in session.Linq<Letter>()<br />    where<br />    l.Sec.ID == currentSec.ID &&<br />    (l.Date >= fromDate && l.Date <= toDate)  &&<br />    Yas1(sendingInformationDAO.RetrieveReceivers(l), receiverOrganizationSearch)<br />    select l;<br />return q.ToList<Letter>();<br />}<br />




second code:


<br />internal List<Letter> SearchLetter(DateTime? fromDate, DateTime? toDate, string receiverOrganizationSearch, SendingInformationDAO sendingInformationDAO)<br />{<br />  List<Letter> list = null;<br />  var q = from l in session.Linq<Letter>()<br />    where<br />    l.Sec.ID == currentSec.ID &&<br />    (l.Date >= fromDate && l.Date <= toDate)<br />    select l;<br /><br />  List<Letter> first = q.ToList<Letter>();<br /><br />  var q2 = from l in first<br />           select l;<br /><br />  if (receiverOrganizationSearch != null)<br />    q2 = q2.Where(l => Yas1(sendingInformationDAO.RetrieveReceivers(l), receiverOrganizationSearch));<br /><br />  return q2.ToList<Letter>();<br />}<br />




Yas1 method:
<br />private bool Yas1(EntityCollection<SendingInformation> collection, string org_name)<br />{<br />if (collection == null)<br />    return false;<br /><br />    org_name = org_name.Trim();<br /><br />    foreach (SendingInformation item in collection)<br />    if (item != null && item.To != null && item.To.Organization != null &&<br />                    item.To.Organization.Name != null && item.To.Organization.Name.Contains(org_name))<br />    return true;<br /><br />    return false;<br />}<br />


Please consider this approach works only if you use dynamic queries. If someone puts Yas1 directly in LINQ-to-Object query, that will not work as expected.



UPDATE (11/15/2010) :


LINQ-to-NHibernate does support sub-queries in where clause. For more info go to this and this link. There is also limitations.




2010/03/01

‫معرفی LINQ

چند روز پیش مطلبی در همین جا نوشتم به عنوان «داستان بی‌سوادی ما». در آنجا از دست خودم شاکی بودم که چرا به اندازه کافی به روز نیستم و بعضی چیزها را به موقع یاد نمی‌گیرم. تعدادی از دوستان هم با بنده همدردی کرده و گفته بودند آنها هم از همین مشکل رنج می‌برند. حال می‌خواهم در ادامه همان داستان عرض کنم تا دیر نشده به یادگیری کامل LINQ و به کارگیری آن بپردازند. LINQ یک ابزار خیلی خوب برای نوشتن کوئری‌های استخراج اطلاعات از SQL، NHibernate، XML، Object و غیره است که دارای مزایای زیادی است از جمله:

۱- همه چیز Strongly Typed است در نتیجه بسیاری از خطاها در همان زمان کامپایل کشف می‌شوند نه در زمان اجرا. مثلا فرض کنید یک کوئری SQL را به صورت استرینگ در داخل کد سی‌شارپ به کار برده‌اید. اگر این کوئری ایرادی داشته باشد تا زمان اجرا (Runtime) مشخص نخواهد شد. چون کامپایلر سی‌شارپ محتوای داخل استرینگ‌ها را مورد بررسی قرار نمی‌دهد.
۲- با کمک LINQ می‌توان کار با SQL، XML و غیره را در هم آمیخته و مقدار زیادی در نوشتن کد صرفه جویی کرد. مثلا می‌شود یک کوئری LINQ برای استخراج اطلاعات از SQL Server نوشته و در دل همان کوئری یک XML هم ساخت.
۳- کدهای LINQ خواناتر و «قابل نگهداری‌تر» از کدهای SQL، HQL، NHibernate Criteria و غیره می‌باشد.
۴- با یادگیری فقط یک زبان/فناوری به اسم LINQ می‌توان از یادگیری چندین زبان/فناوری/API از جمله XML DOM، SQL، NHibernate Criteria و… خلاص شد.
۵-


پ.ن.۱: برای یادگیری LINQ توصیه می‌کنم از کتاب Manning LINQ in Action استفاده کنید.
پ.ن.۲: برای آشنایی اولیه با LINQ و زیبایی‌های آن از وبلاگ وحید نصیری استفاده فرمایید.
پ.ن.۳: LINQ از نسخه ۳٫۵ به دات‌نت فریمورک اضافه شده است.
پ.ن.۴: مدتی است که LINQ to NHibernate نیز عرضه شده و مورد استفاده دوستان می‌باشد.