مشکلات با شرکت آزاد لاین و سرویس اینترنت آزادنت…

11 02 2008

چند وقتیه منو اشکان برای اینکه بتونیم از نتایج کار هم استفاده وکمی هم تست کنیم، احتیاج پیدا کردیم که سیستم های خودمونو سرور کنیم و اجازه دسترسی از خارج از شبکه محلی رو به سیستم هامون بدیم.

همچنین سیستم عامل اشکان اوبونتو هستش و منم برای اینکه محیط کاری شبیه تر برای کار به هم داشته باشیم و اینکه مدت ها بود به فکر مهاجرت به لینوکس رو داشتم سیستم عامل اوبونتو رو نصب کردم و محیط کاری رو تنظیم کردم.تنها مشکلم اینترنت بود که در پایین به اون می پردازم.

اشکان از شرکت داتک ADSL داره و من از شرکت آزادنت ، جفتمون هم کاربرخانگی هستیم و از سرویس ۶۴ شرکت ها استفاده می کنیم.

اینترنت ADSL من برای وصل شدن از VPN استفاده می کنه ولی مثله اینکه به صورت وپیش فرض روی اوبونتو کلاینت VPN و جود نداره ، برای اینکه اینترنتم توی اوبونتو ردیف شه اشکان به من گفت با پشتیبانی تماس بگیرم و سرویس خودم را از VPN به PPPOE تغییر بدم و با کمک پشتیبان مودم خودم رو تنظیم کنم.منم همین کارو کردم و اونها به من گفتن که چیکار کنم ولی هر کاری کردیم این اینترنت ما وصل نشد با PPPOE برای همین همه تنظیمات رو به حالت اولیه برگردوندم تا فعلا همون VPN وصل باشه.

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

پس از وصل شدن اینترنت اقدام به راه اندازی سرور کردیم ولی فهمیدیم که کامپیوترها در شبکه آزانت پشت NAT هستش و دسترسی از خارج از شبکه به صورت عادی امکان پذیر نیست و ما باید از Port Forwading استفاده کنیم.

پس از کلی سروکله زدن با gnome-nettool و NetCat برای بررسی شبکه و باز کردن پرت و … فهمیدیم که ما تا یه Valid IP نداشته باشیم از Port Forwarding هم خبری نیست .

زنگ زدیم پشتیبانی آزادنت که آقا یه کمکی به ما بکنید ویه Valip IP به ما بدید و اونها هم بعد از اینکه ۴۰ دقیقه برای ما آهنگ گذاشتن (Call Waiting ) به ما گفتند که ما Valid IP نمیدیم من هم که شاخ در آورده بودم گفتم جزو تعریف ISP اینه که کاربر رو به اینترنت وصل کنه نه اینکه سرویس هایی از اینترنت رو برای کاربرانش فراهم کنه و به ما گفتند که ما تا حالا همچین تعریفی نشنیدیم.برای اینکه روی حرفی که زده بودم مطمءن تر باشم توی ویکیپدیا هم سریع یه سرچ کردم ودر این صفحه به این جمله رسیدم :

Some Internet service providers (ISPs) only provide their customers with “local” IP addresses. Thus, these customers must access services external to the ISP’s network through NAT. As a result, it may be argued that such companies do not properly provide “Internet” service.

مفهومش همون حرف منو اشکان میشه که یعنی ISP هایی که پشت NAT هستند در اصل جزو آمار ISP ها به حساب نمی آیند.

من و اشکان هم وقتی دیدیم کارمونو راه نمی اندازن پاشدیم رفتیم آزادنت درضمن بگم ، لحن صحبت پشتیبان با من اصلا خوب نبود و فکر می کرد من چیزی نمی فهمم و …

رفتیم شرکت آزادنت واونجا هم ما رو فرستادن بخش بازرگانی و اونجا هم به ما گفتن که ما DynamicValid IP نمیدیم و اگه می خواهید باید Static Valid IP بگیرید و هزینش ماهی ۱۰ هزارتومان هستش. بله ۱۰ هزار تومان برای یک IP …نظر شما چیه؟؟؟ به نظر شما هزینه ای که آزانت باید برای راه اندازی شرکت برای هر کاربر باید می پرداخته رو من باید بپردازم ؟

در صورتی که نیاز به Static Ip ندارم و فقط یه Dynamic IP می خواهم؟ بعدشم ماهی ۱۰ هزار تومن رو می رم باهاش یه VPS می گیرم کارامو باهاش می کنم تازه bandwidth اون هم ۱۰ گیگابایت در ماه برای دانلود + آپلود نیست.

بعدشم مارو معرفی کردن به بخش تکنیکیشون که مثلا ما رو قانع کنه و فکر می کردن ما چیزی از شبکه و کامپیوتر سر در نمی یاریم و مارو از این می ترسوندند که برای یک کاربر ما یه سرویس جدید راه نمیندازیم، به قول اشکان باید به تکنسینشون می گفتیم می خواهی ما براتون راه بندازیم اگه سخته…!

خلاصه فعلا بی خیال شدم و تو فکر اینم که با داتک کار کنم آخه داتک IP valid می ده.بعدشم من جزو اولین مشتری های آزادنت توی محل خودمون بودم و کلی تبلیغ برای آزانت کردم ، و کلی از مشترک ها آزادنت دوستان من هستند ….

یادم رفت بگم آزادنت ادعای ICP بودن دارد.

بامداد دشت بان





آشنایی با اکلیپس

4 02 2008

PDT
درود فراوان بر یکان یکاندوستانتوی این مقاله به اکلیپس و کاربرد اون برای ملت PHP کار میپردازیم.
IDE چیست؟
تفاوتی نمیکند که PHP کار باشید یا Java باز، ++C یا Payton یا VB. بدون یک IDE کار شما از ریشه لنگ است. IDE سرنام واژگان Integrated Development Environment است که معنایش میشود : «محیط توسعه یکپارچه».درآن روزهای آغازین تاریخ برنامه نویسی، کار نوشتن، کامپایل کردن، اسمبل کردن، لینک کردن و اشکال زدایی برنامه ها جدا گانه وبا ایزارهای سوا از هم انجام میشد. برنامه نویس بتید کد منبع برنامه با یک نرم افزار ویراستار که میتوانست فایل اسکی محض بسازد مینوشت و سپس آنرا به خورد کامپایلر میداد. کامپالیر یک فایل اسمبلی به او تحویل میداد و او سپس این فایل را به خرد اسمبلر میداد تا یک فایل آبجکت دریافت کند تا در پایان این فایل آبجکت را با کمک لینکر، به یک فایل اجرایی تبدیل کند. فرایندی که توضیح دادم ویژه سیستم عامل ویندوز نیست و همه سیستمهای دیگر کم و بیش چنین فرایندی دارند. فرایند تغییری نکرده و هنوز از فایلهای منبع تا فایل اجرایی همه این مراحل یکی یک پیموده میشوندو در واقع کار سخت تر هم شده.‌
اما یک برنامه نویس ++ C ویندوز هیچیک از این ابزارها را نمیبیند و آنها را نمیشناسد. کلید این خوشبختی در همان نرم‌افزارغول پیکر و همه کاره‌ای است که آنرا با نام«ویژوال سی»‌میشناسیم. البته حالا دیگر فقط محدود به سی نیست و نامش «ویژوال استادیو» است. آیای چیزی شبیه ویژوال استادیو (یا حتی بهتر از آن) برای لینوکس یا به صورت رایگان هست؟ پاسخ مثبت است و در حقیقت میخواهیم با یکی از شاهکارهای
برنامه نویسی اوپن‌سورس آشنا شویم: «اکلیپس»
Eclipse چیست؟
به ساده ترین زبان ممکن، اکلیپس معادل رایگان و اوپن‌سورس ویژوال استادیو است. اکلیپس تمام ویژگیهای یک IDE ی حرفه ای را دارد و افزون برآن چیزهای دیگری هم دارد که در بسیاری از محصولات دیگر یافت نمیشود. اکلیپس کاملا با جاوا نوشته شده و بنابراین به سیستم‌عامل وابستگی ندا رد. اکلیپس را همه برنامه نویسان اوپن سورس از سراسر دنیا باهم مینویسند. نکته جالب این است که اکلیپس یک نرم‌افزار نیست بلکه به چندین پرژه و زیر پروژه تقسیم شده که هر کدام محیط مناسب برای یک دسته ویژه از برنامه نویسان (و حتی غیر برنامه نویسان) را در نظر دارند.
برای نمونه در پروژه PDT محصول کار یک محیط توسه برای PHP است و در پروژهJDT به جاوا توجه شده است. برای طراحان و معماران نرم‌افزار پرژهEMF و برای توسعه دهندگان وب پروژه WTP مشغول به کارند. پروژه‌های بسیار دیگری هم هستند که من نمیدانم برای چه کسانی خوب هستند!
وب و PHP
اگر برنامه نویس PHP هستید دست شما در گزینش محیط برنامه‌نوسی باز است. از محیطهای جمع و جور و کار راه بنداز گرفته تا ZDE محصول شرکت Zend (همانی که خود PHP را مینویسد). من با بسیاری از آنها کارکرده‌ام و بهترینشان ZDE و PDT هستند. PDT یکی ازپروژه‌های اکلیپس است که هدفش فراهم آوردن ابزارهای کار برنامه نویسان PHP در محیط اکلیپس است. جالب است بدانید که پروژه PDT را هم شرکتZend رهبری میکند و دیگر حرفی برای گزینش اکلیپس باقی نمیماند. برای آنانی که کار HTML و CSS و … میکنند هم پروژه ‌دیگری هست به نام WTP و پروژه فرزند آن به نام WST که مانند FrontPage عمل میکند (و البته خیلی بیشتر از آن).
گیج شدم!
دقیقا من هم برای نخستین بار که همه اینها را دیدم گیج شدم که بلاخره کدام پرژه را باید دانلود کنم؟ اگر برنامه نویس PHP هستید پروژه PHP Development Tools برای شماست. برای یافتن آن به این ترتیب عمل کنید:
به سایت اکلیپس بروید (http://www.eclipse.org/)از منوی بالا گزینه Projects را انتخاب کنی
ددر صفحه دروازه پروژه ‌ها (که در آن هستید)، روی پیوند Show me all the projects کلیک کنید
به سمت پایین صفحه بیایید و در زیر عنوان Tools Project بر روی پیوند PHP DevelopmentTools کلیک کنید
حالا در صفحه اصلی پروژه PDT هستید. روی پیوند Download (بالا سمت راست) کلیک کنید
زیر عنوان Latest Builds روی پیوندی که روبروی Release Build قرار دارد کلیک کنید
زیر قسمت PDT All-in-one نسخه مناسب برای خودتان را دانلود کنید




آموزش سی‌پلاس‌پلاس در سه سووووووووووت

22 01 2008

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

روم به دیوار، پدر نداری بسوزه آقا! قال سیدنا الکریم والعالم بالتکنولوجیا المفتوح المنبع «لینوس تروالدز» (عج) :لا یوجد فی دنیا و آلاخره شیئا مضرا للکاتب البرنامج الکامبیوتر بالتکنولوجیا لمفتوح المنبع الا الفقر. آقای سخاوتمندمان و آنکس که دانا به فنآوری اوپن سورس است، لینوس تروالدز، می‌فرمایید: در دنیا و آخرت چیزی یدتر از فقر برای برنامه نویس کامپیوتری اوپن‌سورس نیست. خلاصه …

گذشت و از اونا هم خیری نشد و از ما هم برای اونا خبری نشد که یهو تلفووونم زنگ زد! ورداشتم گفتم کیسته؟ گوفت «استیو بالمر» هسته؛ این ویندووز ویستااا سر جاش درست نمی‌ایستااا. بیا تا یه نگاه بشش بنداز. نه خداییش داشتم این مقاله جریان داه و اینا رو ماست‌مال می‌کردم که یهو موبایلم زنگ زد. ورداشتم و یک خانم خوش صدا و بد اخلاق گفت:

- آقای نظری؟ (صدای خش خش کارد روی سنگ چاقو تیز‌کن در پس‌زمینه)

بابا اینجا ایرانه! سوییس که نیست. ساعت هفت، هشت شب یه دختره به گوشی شما زنگ بزنه، شما هم دستتون تو ظریف کاری باشه، خوف ورتون نمیداره؟ نمگین چی از جون من می‌خواد آخه این موقع شب؟!اما من خودمو نباختم که! خودمو خیس کردم! به‌خودم گفتم داش اشکان؛ توکه یه عمر با ذلت . خفت و حقارت تو کارتن زندگی کردی، حداقل حالا که اجلت رسیده عین آدم بمیر… توکلت علی الله:

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

-بله حتما با کمال میل! به ایشون درس میدم شما هم تشریف بیارین مستمع آزاد که راندمان کلاس بره بالا، دوستاتونم بیارین که در حق کسی ستم نشه. دخترای همسایه رو هم دعوت کنیین چون بوش میپیچه تو در و همساده درست نیست!
-حالا من چند تا از سووالهاشو میخونم براتون .. ( اینکه گفت یک سووال! چرا شد چند تا؟)
- بله بفرمایید خواهش میکنم! (یا قمر مصنوعی ادرکنی!)
- یک لیست از اعداد صحیح مد نظر است، برای نگهداری این لیست یک کلاس طراحی کنید (این که سووال نیست جانم بفدایت!). عملگر بعلاوه را برای لیست سربارگذاری کنید طوری که اگر یک طرف آن یک عدد صحیح بود، آن عدد را در لیست ضرب کند و اگر دو طرف ان لیست بودند آنها را با استفاده از الگوریتم چی‌چي‌تون ندر هم ضرب کن. با استفاده از ارث‌بری برای لیست فلان و بهمان بسازید. (نفس …) چشماش هم عسلی باش (نفس…)، چایی اش هم شیرین باشه، هواش هم نم داشته باشه، لباسشم بنفش مایل به سبز یشمی خال خال پشمی باشه و… (صدا در پس زمینه گم میشه و من در افکار خودم غوطه ور میشم….)
گذاشتم تا طرف همینجور یه بیست دقیقه نیم ساعتی از همه ور این زبون بسته (سی‌پلاس‌پلاس) گفت (البته یه چند باری هم نقس گرفت! یعنی همه این مدت رو حرف نمیزد خداییش)
- ببخشید، من مشکلی ندارم با این «یک سووالات ساده»ای که شما مطرح فرمودین، اما به نظر شما همه اینا رو تو دو سه روز میشه یاد داد؟ اونم به یک دختر؟ (انا مظلوم … قولو من خلفی الجمیعون … انا محروم…)





این «جریان داده» که میگن، جریانش چیه؟

22 01 2008

توی این نوشتار در پاسخ به یکی از خوانندگان نمودار جریان داده رو توضیح میدم (البته اونقدری که خودم فهمیدم!!!).

پیش از آنکه فناوری شیءگرا (Object Oriented) بر فرایندهای تحلیل و طراحی مسلط شود، طراحان و تحلیل‌گران سیستم از روشی به نام «تحلیل و طراحی ساخت‌یافته» (Structured Analysis and Design یا SAD) استفاده می‌کردند و برای کار خود ابزارهایی در اختیار داشنتد که یکی از آنها نمودار جریان داده است. نمودار جریان داده (Data Flow Diagram یا DFD) تلاش می‌کند تا جریان گذر داده‌ها در سیستم را به صورت یک نمودار تصویری نمایش دهد. منظور از جریان گذر داده (Data Flow) مسیری است که یک داده ورودی طی می‌کند تا به یک داده خروجی تبدیل شود. به عبارتی می‌توان گفت که پردازشهایی را که بر روی داده انجام میشود و مسیری که داده از یک پروسه به پروسه دیگر طی می‌کند را نمایش می‌دهد. نمودار جریان داده برای سیستمهایی که پردازشهای سنگین و پیچیده دارند مفید است و به طراح کمک می‌کند تا بدون در نظر گرفتن جزئیات پیاده سازی هریک از زیرفرایند‌ها (یا همان ایستگاههای میانی)، فرایند بزرگتر را به اجزای سازنده و مسیر بین آنها تجزیه کند. وی سپس می‌تواند هر یک از این «فرایند های میانی» را به صورت یک مسئله طراحی جدید حل کند. میزان جزیئات بیان شده در نمودار جریان داده را با «سطح» (Level) آن نمایش می‌دهند. نمودار سطح صفر تشکیل شده از یک (یا چند) منبع داده ورودی، یک (یا چند) مسیر داده خروجی و تنهایک تابع (یا همان فرایند) که آن را دایره و مسیر های ورودی و خروجی را با خط نمایش میدهند. نمودار سطح یک این تابع را به اجزای درونیش تفکیک می‌کند و مسیر داخلی داده را نمایش می‌دهد (که یک مرحله به حل مسئله اصلی نزدیک تر است) و فرایند همینگونه ادامه دارد تا انجایی که تابعهای ترسیم شده براحتی قابل نوشتن باشند.

دو نمودار دیگر با نمودار جریان داده پیوستگی نزدیک دارند که عبارت‌اند از «نمودار زمینه سیستم» (System Context Diagram یا SCD) و «نمودار جریان سیستم» (System Flow Diagram یا SFD). نمودار زمینه سیستم مرزبندی سیستم با محیط یبرون و منابع ورودی و خروجی داده‌ها را نمایش میدهد و بنابر این گونه‌ای از نمودار جریان داده است که مسیرهای ورودی و خروجی داده را نسبت به کل سیستم (و نه یک فرایند خاص در سیستم) نمایش می‌دهد. نمودار جریان سیستم نحوه کارکرد سیستم را نمایش می‌دهد و بیشتر به «جریان کنترل» و «دنباله» رفتاری سیستم مربوط می‌شود تا به جریانی که داده‌ها در سیستم می‌پیمایند.

تفاوت عمده نمودار جریان داده با فلوچارت این است که نمودار جریان داده کل مسئله را از زاویه دید دیگری می‌نگرد. هدف از رسم فلوچارت نمایش گرافیکی یک «الگوریتم» است که نسبت به یک تابع در نمودار جریان داده ها حوزه کارکردی کوچکتری دارد و هدف جزئی‌تری را دنبال می‌کند. نمودار جریان داده‌ها (بر خلاف فلوچارت) بر روی «فرایند‌» هایی که «جریان های داده‌ها» می‌پیمایند تمرکز دارد در حالی که فلوچارت بدنبال ارائه دنباله‌ای از قدمهای ساده است که در پایان نتیجه‌ای را بدست میدهند. البته توجه کنید که کل قضیه «نسبی» است و اگر جریان داده‌ها را به اندازه کافی خرد کنیم در پایان به الگوریتم‌ها میرسیم و اگر کل سیستم را یک «ابر الگوریتم» در نظر بیاوریم (که براستی همینگونه هم هست) آنگاه الگوریتم به جریان داده‌ها بدل میشود. از نتایج مهم این تفاوت در دیدگاه‌ها آن است که جریان داده‌ها به «شرایطی» که باعث چند شاخه شدن مسیر خروجی توابع میشوند توجهی ندارد و تنها این مسیرها را (بدون ذکر علت) نمایش می‌دهد در حالی که مراحل شرطی و شاخه‌بندی مسیر اجرا توسط شرط‌هایکی از پایه‌های جدا نشدنی فلوچارت است.

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





سیستم به زبان (خیلی) ساده

13 01 2008

درود بسیار بر یکایک دوستان
توی این مقاله دست و پا زدم تا مفهوم سیستم رو با یه زبون ساده بیان کنم.

سیستم
برای فراگیری مهندسی نرم‌افزار لازم است با مفاهیمی که شالوده کار ما را میسازند آشنا شویم. یکی از این مفاهیم «سیستم» و دیگری «مدل» است. فراگیری UML و RUP و … تا زمانی که به این مفاهیم مسلط نباشم ما را یاری نمیکند. کسی که درک مبهمی از سیستم و مدل دارد نمیتواند آنگونه که سزاوار است از زبان مدلسازی UML استفاده کند یا فرایندهای نرم‌افزاری را بکار ببندد. از سوی دیگر سر و کله زدن با اینگونه نکات «فلسفی» در کار نرم‌افزار، دهن ما را هوشیارتر می‌کند و باعث میشود تا کار خود را هوشمندانه انجام دهیم.

سیستم دقیقا چست؟ خوشبختانه پاسخش بسیار ساده است: سیستم(System) مجوعه ای از اجزاء (Components) است که با هم در ارتباطند (Relation) و هدف مشخصی را دنبال می‌کنند (Objective). هر ترکیبی از چیزها (یا همان موجودیت ها - Entities) که برای رسیدن به یک هدف همکاری (Colaboration) کنند، یک سیستم میسازند. این اجزاء می‌توانند هر چیزی باشند. از انسان‌ها گرفته تا قطعاتی چون پیچ‌ و مهره. هدف سیستم میتواند از اجرای یک نمایشنامه تا تولید نیروی محرکه در اتوموبیل تغییر کند. سیستم می‌تواند فیزیکی (اجزای قابل لمس) یا منطقی (اجزای منطقی) یا ترکیبی از هر دو باشد.برخی سیستم ها ساده (Simple) و برخی نیز پیچیده (Complex) هستند. برخی کوچک (Small) (اجزاء اندک) و برخی بزرگ (Large) (اجزاء بسیار) هستند. سیستم ساده سیستمی است که درک آن ساده و ارتباط اجزایش زیاد پیچیده نباشد. سیستمهای ساده معولا کوچک‌ اند و اهداف ساده ای را دنبال می‌کنند. نقطه مقابل آنها سیستمهای یچیده هستند که چندین هدف را دنبال می‌کنند و اغلب اجزای بسیار با روابط دشوار دارند.

زیر سیستم
گاهی جزئی از سیستم خودش از اجزایی کوچک تر ساخته شده که از دید سیستم بزرگتر کار واحدی را انجام می‌دهند. برخی اوقات هم ساده‌تر (و درست تر) است که یک زیر مجموعه از اجزاء را از بقیه سیستم جدا کنیم و به آنها به چشم یک سیستم کوچکتر در دل سستم بزرگتر نگاه کنیم. یک چنین زیر مجوعه‌ای از سیستم را یک «زیر‌سیستم» (Sub-system) می‌گویند. یک زیر سیستم خودش یک سیستم کامل است ومیتواند مستقل از سیستم بزرگتر بررسی شود. از دید سیستم بزرگتر، زیر سیستم یک جزء است که کار خاصی را در ارتباط با بقیه سیستم انجام می‌دهد. برای نمونه اگر خودرو را یک سیستم در نظر بگیریم، موتور یک جزء آن است که نیروی محرکه تولید می‌کند و در ارتباط با اجزای دیگر همچون دلکو، کویل، میل‌لنگ، بدنه و … هدفی واحد را دنبال می‌کند و آن حرکت دادن کل خودرو است. از سوی دیگر موتور قطعه‌ای بسیار پیچیده است و می‌تواند مستقل از خودرو بررسی شود بنابراین موتور (نسیبت به خودرو) یک زیرسیستم هم هست زیرا تمام ویژگیهای یک سیستم را دارد و خودش جزئی از یک سیستم بزرگتر است. در واقع اتوموبیل را می‌توان از دیدگاه‌های گوناگون به تعداد بسیاری زیرسیتم تجزیه کرد. آیا موتور و صندلی راننده با هم یک زیر سیستم میسازند؟ به نظر نمیاد که ارتباطی با هم داشته باشند یا از ترکیب آنها هدف خاصی که در خدمت سیستم بزرگتر باشد (یا کار ما را در بررسی سیستم ساده‌تر کند) حاصل شود، بنابراین آنها تنها یک مجموعه میسازند نه یک زیرسیستم. برخی اوقات تعدادی از اجزاء بقدری به هم‌پیوسته و تنگاتنگ کار می‌کنند که به طور طبیعی آنها را زیرسیستم در نظر میگیریم؛ همچون سیستم گردش‌ خون در بدن انسان یا سیستم انتقال قدرت در اتوموبیل. چنین زیر سیستمهایی هدفی آشکار را دنبال می‌کنند و ارتباط اجزای آنها با هم چنان است که اگر کل مجموعه را یک واحد منطقی (زیر سیستم) در نظر بگیریم، کار درستی کرده‌ایم.‌ دلایل بسیار دیگری هست که زیرمجموعه‌ای خاص از اجزاء یک سیستم را یک زیرسیستم در نظر بگیریم. یک جزء می‌تواند همزمان در چندین زیرسیستم باشد و یا اینکه در هیچکدام نباشد؛ بستگی به این دارد که آیا این تقسیم‌بندی به ما کمکی می‌کند یا خیر.

سیستم‌های نرم‌افزاری
آیا متوان نرم‌افزار را سیستم دانست؟ بیایید آنرا بررسی کنیم! یک نرم‌افزار هر چقدر هم که ساده باشد (در حد یک برنامه Hello World) هنوز از اجزاء ساده‌تری ساخته شده (تابع هاُ، بلوک‌هاُ و …). این اجزاء با هم ارتباط ویژه‌ای دارند (منطق برنامه) که در مجموع کاری را انجام می‌دهند (خروجی). در واقع نرم‌افزار چیزی نیست جز ترکیبی منطقی از اجزای نرم‌افزاری کوچکتر؛ بنابراین نرم‌افزار حقیقتا یک سیستم است. برخی محصولات نرم‌افزاری سیستمهای بسیار پیچیده‌ای هستند که خود از چندین زیر سیستم دیگر (که خودشان پیچیدگی بسیار دارند) ساخته شده‌اند. برای نمونه نرم‌افزار اتوکد محصول شرکت اتودسک یا سیستم عامل ویندوز محصول مایکروسافت را در نظر بگیرید. یک بررسی ساده نشان می‌دهد که هر یک از این محصولات براستی یک سیستم پیچیده است. یک چنین سیستمی را که اجزایش نرم‌افزاری هستند یک «سیستم نرم‌افزاری» (Software System) می‌خوانند. سیستم نرم‌افزاری همه ویژگی‌های سیستم های دیگر را دارد با این تفاوت که اجزایش نرم‌افزاری هستند و جسم فیزیکی ندارند؛ به همین خاطر نرم‌افزار در واقع یک سیستم «منطقی» است. در مقابل آن سیستمهای سخت‌افزاری هستند که اجزایش فیزیکی هستند و یک سیستم «الکترونیکی - مکانیکی» را می‌سازند. آنگاه که یک سیستم نرم‌افزاری یک سیستم سخت‌افزاری را تحت کنترل دارد، مجموعه آنها را «سیستم کامپیوتری» مینامند. شناخت و درک ماهیت سیستمی نرم‌افزار و زیر سیستمهای سازنده آنها و منطق ارتباط آنها با یکدیگر بخش اساسی و جدانشدنی مهندسی نرم‌افزار است. در حقیقت مهندسی نرم‌افزار با مهندسی سیستم آغاز میشود و هدف از آن بررسی نرم‌افزار از دید سیستمی است.

برای اینکه مقاله کامل شده باشد، برخی مفاهیم و مهارتهای سیستمی را در ارتباط با نرم‌افزار مرور می‌کنیم:

تحلیل سیستم (System analysis) یا همان تحلیل (Analysis): هدف از تحلیل نرم‌افزار (سیستم) شناخت و درک سیستم و اجزای آن و روابط بین آنهاست. «تحلیل گر سیستم» (System Analyst) می‌کوشد تا سیستم را بشناسد؛ به معنی که اهدافش را درک کند و مشخصاتش را تشخیص دهد، زیر سیستمهای مهم را بیابد و دید درستی از منطق سیستم (ارتباط اجزا و زیر سیستمها با یکدیگر) بدست بیاورد. برای این منظور او برخی اوقات سیستم را می‌شکند و اجزایش را میشکافد (تجزیه و تحلیل - Analysis) وبرخی اوقات اجزا را ترکیب می‌کند و زیر سیستم میسازد (ترکیب - Synthesis). هر کاری که به شناخت بهتر سیستم بیانجامد به نوعی تحلیل شمرده می‌شود. واژگانی همچون «تحلیل‌گر سیستم»، «تحلیل‌گر نرم‌افزار» و «تحلیل‌گر» همه همان معنی را دارند. برخی اوقات اصولا هنوز سیستمی ساخته نشده است که بخواهد تحلیل شود و در واقع هدف این است که سیستمی نو ساخته شود. در این صورت کار تحلیل گر بسیار مهم و تا اندازه‌ای متفاوت است. او باید سیستم آینده را بشناسد و در حقیقت او خواهد گفت که این سیستم چه خواهد بود. نتیجه کار تحلیل، مشخصات و ویژگی‌های سیستمی است که باید ساخته شود (System Specifications) . اهداف سیستم و محدودیتهای آن به همراه قالب ورودی و خروجی سیستم ار بخشهای مهم مشخصات سیستم هستند. تحلیلگر به جزپیات کار طراحی و ساخت سیستم کاری ندارد. او میگوید که «چه چیزی» قرار است ساخته و این «چه» همان «مشخصات سیستم» است.

طراحی سیستم (System Design) یا همان طراحی (Design): طراح سیستم (System Designer) می‌کوشد تا سیستمی را طراحی کند که «مشخصات» خواسته شده را داشته باشد. طراح باید درک درستی از اهداف و ویژگی‌های سیستم داشته باشد تا بتواند کار خود را آغاز کند بنابراین تحلیل پیش از طراحی آغاز می‌شود. طراح می‌گوید که سیستم چه اجزایی داشته باشد و این اجزا چگونه با هم کار کنند (منطق سیستم) تا سیستم بتواند به هدف خود برسد. طراح زیر سیستمهای لازم برای برپایی سیستم را شناسایی کرده و انها را به هم متصل میکند و به این ترتیب نقشه سیستم نهایی را می‌سازد. نتیجه فرایند طراحی، نقشه سیستمی است که قرار است ساخته شود؛ این نقشه را «طرح سیستم» میگویند. توجه کنید که طراح، سیستم را نمیسازد بلکه نقشه سیستم را می‌کشد. افرادی دیگر با در دست داشتن این نقشه، شروع به ساخت سیستم می‌کنند. طراح می‌گوید که «چطور» سیستم را بسازیم تا مشخصات خواسته شده را دارا باشد. این «چطور» همان نقشه یا طرح سیستم است.

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





مهندسی نرم افزار به زبان (واقعا) ساده

11 01 2008

درود بسیار بر همه دوستان

تو این مقاله تلاش کردم تا به یک زبان ساده، یک سری مفاهیم اولیه در مورد مهندسی نرم افزار رو کنار هم بذارم و برای فهم بهتر، اون رو با چند دانش دیگه ای که اکثرا با مهندسی نرم افزار اشتباه میگیرن مقایسه کردم. اگر میخواید به این حیطه وارد بشید یا اینکه وقتی میگید (یا میگن) «مهندسی نرم افزار» واقعا بفهمید چی دارین میگن (یا میگن)، این مقاله بدرد تون نمیخوره! برین کتاب دکتر «پرسمن» رو بخونید. شوخی کردم. این مقاله میتونه نقطه آغاز خوبی باشه.

مهندسی نرم افزار

شاید بهتر باشد ک نخست بپرسیم اصولا «مهندسی» چیست؟ مهندسی عبارت است ازاعمال روشهایی برای تضمین و کنترل کیفیت محصول با بیشترین بازده. هدف از مهندسی، ساخت محصولی هر چه بهتر (کییفیت) در محدوده منابع مشخص شده است (بازدهی و کارایی). محصول آن چیزی است که مشتری آن را درخواست نموده (میتواند اتوموبیل یا یک شاتل فضا پیما باشد) و مهندس می کوشد تا در بازه زمانی مشخص شده و با استفاده از منابعی که در دسترس اوست (پول، افراد، ابزارها، دانشهای دیگر و…) بهترین محصول را بسازد. آیا میتوان خیلی کلی گفت که مهندسی دانش ساختن چیزهایی است که به دردخور هستند؟ بله! و البته ساختن آنها با بهترین کیفیت و کمترین منابع.

برای نمونه مهندسین ایران خودرو در تلاش هستند تا بهترین خودرو ها را در کوتاه ترین زمان ممکن و با توجه به منابعی که به آنها داده شده بسازند (البته در «تلاش» هستند! هنوز به جایی نرسیده اند و احتملا هرگز هم نخواهند رسید). در گوشه ای دیگر از دنیا، مهندسین هوا فضا در«ناسا» می کوشند تا بهترین فضا پیماها را پیش از ممهندسین روسی و با توجه به بودجه ای که به ناسا داده میشود بسازند (که البته «میسازند» و احتملا تا پایان دنیا هم خواهند ساخت). میبینید که مهندسی بسیار مهم است و هیچ دانشی بدون مهندسی به دست مردم نمیرسد.

مهندسی نرم افزار عبارت است از اعمال روشهای مهندسی بر فرایند ساخت نرم افزار برای آنکه نرم افزاری با کیفیت، در زمان موجود و با هزینه مشخص شده ساخته شود. مهندس نرم افزار کسی است که این روشها را در پروژه به کار میبندد و در ننیجه کیفیت و کارایی دلخواه را بدست می آورد. همین جا نخستین ویژگی مهندسی نرم افزار دانسته میشود و آن «کابردی» بودن آن است. با خواندن کتابهای مهندسی نرم افزار کسی مهندس نرم افزار نمی شود، اما آنگاه که روشهای مهندسی نرم افزار را در پروژه به کار انداخت، وارد حیطه مهندسی شده است. اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید» و هنوز نفهمیده اید که محصول باید به درد کسی بخورد، خواه با دکترا یا بی دکترا . آنچه گفتم بر خلاف صورت فکاهی اش نکته ای بسیار ژرف درباره ماهیت مهندسی نرم افزار در خود دارد و شاهدی است بر اینکه دوصورت عمل نکردن به اصول و روشهای مهندسی نرم افزار، چه پیش خوآهد امدد. فراموش نکنید که به مهندسی نرم افزار باید عمل شود، نه اینکه تنها «دانسته» شود. برای این ساخته شده که به آن عمل شود. هر آنچه به گونه ای فرایند ساخت نرم افزار را کمک کند میتواند جای خود را در این شاخه از مهندسی بیابد. از روانشناسی افراد درگیر (حتی مشتری ها و کد نویسان) گرفته تا روشهای مدیریت پروژه و مستند سازی و صد البته مباحث تخصصی کامیپوتری و نرم افزاری هم که شالوده انرا میسازند و جای خود را دارن.د از جمله برنامه نویسی (اگوریتم، ساختمان داده، آنالیز و طراحی)، طراحی رابط کابر، تست و نگهداری نرم افزار و دانش کامپیوتر (Computer science). همه اینها آنگاه که به ساخت نرم افزار با کیفیت منجر میشوند، مهندسی نرم افزار را میسازند.

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

برنامه نویسی : هودف آن تنها تولید کد خوب و کارا برای نرم افزار های کاربردی است (Application coding) و بر روی مهارتهای فردی کدنویسی تاکید دارد. تمرکز ان بر روی فرد است. در مقابل مهندسی نرم افزار بر روی کل پروژه تمرکز دارد و تاکید آن بر روی تیم برنامه نویسی و ارتباط آنها با یکدیگر و با دیگر تیمهای درگیر در پروژه است. نرم افزار هایی که در این حیطه جای دارند بدست یکنفر ساخته نمیشوند. برنامه نوسی در زمینه تجارت سخنی برای گفتن ندارد اما هدف از مهندسی نرم افزار آن است که نرم افزار را در بازار جای دهد. تفاوت عمده آنها در «حوزه» کاری است. برنامه نوسی حوزه فردی و مهندسی نرم افزار حوزه پروژه ای دارد.

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

دوست داشتم که مهندسی فرایند و معماری نرم افزار را هم وارد کنم اما بدبختانه با سادگی مقاله مغایرت دارد ساعت هم شش صبح است (نمیکشه).

تا اینجا ماهیت مهندسی نرم افزار را موشکافی کردیم و پافشاریمان بر آن بود که تا به آن عمل نشود، سودی ندارد. از روشهای ساخت نرم افزار با کیفیت چیزی نگفتیم. نگفتیم بلاخره «چطور» میشود که نرم افزار خوب را ساخت. اینها جزئیات و دستاوردهای مهندسی نرم افزار هستند. عمل کردن به آنها (آنچه مهندسی نرم افزار برای ارائه دارد) کیفیت نرم افزار را تضمین میکند. همین«روش»ها هستند که در مجموع مهندسی نرم افزار را میسازند. پس میشود گفت که مهندسی نرم افزار، عمل کردن به روشهای مهندسی نرم افزار است. روشهای مهندسی نرم افزار میگویند که چه کار کنیم تا نرم افزار با کیفیت ساخته شود.





تکنولوژی کامیت (Comet)

8 01 2008

کامیت یک تکنولوژی تحت وب است که در آن وب سرور ، اطلاعات را به صورت نا متقارن به سمت کلاینت ( معمولاّ مرورگر وب ) می فرستد بدون آنکه کلاینت صریحاً درخواستی کرده باشد.کامیت به شما این امکان را می دهد که بر اساس رخداد ها عمل کنید ، به صورت زنده با مرورگر تراکنش داشته باشید که در حالت های دیگر ( سایر معماری ها ) امکان پذیر نیست.
واژه کامیت از سال 2006 مطرح شد ولی از سال ها قبل تحت نام های Server push, HTTP push, HTTP Streaming, Pushlets, Reverse Ajax و…. به کار می رفته است.اپلیکیشن های کامیت ارتباط های طولانی مدت HTTP بین وب سرور و کلاینت دارند (Long-Lived) که به سرور اجازه میدهد با وقفه به درخواست ها پاسخ دهد ، و هر موقع اطلاعات جدیدی بوجود آمد آن ها را به سمت کلاینت Push کنند.این متغایر با تعریفی که از ابتدا در مورد وب شده است می باشد که در آن مرورگر صفحه ی کامل وبی را در قبال فرستادن درخواست می گیرد.همچنین با مدلی که از آژاکس نیز ارائه شده است هم متغایر است که در آن مرور گر با درخواست خود قطعه ای از اطلاعات را برای بروز رسانی صفحه ی کنونی به کار می برد.اثری که کامیت می گذارد بسیار شبیه اپلیکیشن هایی است که به طور سنتی از آژاکس به همراه Polling برای چک کردن وجود اطاعات جدید و بروز رسانی صفحه استفاده میکنند.
ولی عملکرد بسیار بهینه شده و تاخیر و Server load بسیار کم شده است.اپلیکیشن های وب همیشه به خاطر وجود محدودیت های دسترسی به منابع محلی و شبکه ای و همچنین محدودیت هایی که برنامه های درون مرورگری نسبت به اپلیکیشن های دسکتاپ کم توانا تر و کم انعطاف پذیر تر بودند،با پیشرفت مرورگر ها بسیاری از این محدودیت ها برداشته شد و همین باعث بوجود آمدن اپلیکیش های توانای اینترنت شد.(Rich Internet Applications ) و اپلیکیشن های وب به اپلیکیشن های دسکتاپ شبیه تر و شبیه تر شدند.
یکی از این مشکلات آن بود که هر قطعه ای از اطلاعات که از سمت سرور به سمت کاربر می رفت باید از طرف کاربر صراحتاّ درخواست می شد. که این مشکل با بوجود آمدن کامیت برداشته شد.کامیت به سرور اجازه می داد به صورت زنده به رخ داد ها پاسخ دهد مانند به روز شدن منابع اطلاعات یا تغییر در آن ( شما شاهد تغییر آنی آن خواهید بود ) یا فرستادن پیغامی از طرف کاربر.کامیت بهترین راه حل برای حل این محدودیت می باشد.
فرض کنید شما نشستید و آخرین تغییرات قیمت طلا را مشاهده می کنید برای اینکه قیمت جدید را ببینید احتیاجی نیست از جاوا ، فلش یا … استفاده کنید. شما با کامیت فقط احتیاج به یک مرورگر دارید.به محض تغییر در سرور در مرورگر شما اطلاعات بروز می شوند بدون اینکه از شما درخواستی برای بروز شدن فرستاده شده باشد.
مثال هایی از کامیت

این مثال ها مربوط به Light Streamer نام فریم ورکی تجاری برای Comet و Ajax می باشد.
توجه داشته باشید که در آن واحد فقط یک اپلیکیشن را باز کنید و چند تا با هم باز نکنید.
برای سرعت بیشتر از مرورگر فایر فاکس استفاده کنید.1- نمودار زنده :
http://app.lightstreamer.com/ChartDemo/

2- لیست زنده قیمت های بازار بورس :
http://app.lightstreamer.com/StockLi…x.html?fade=ON

Rss خوان زنده :
http://app.lightstreamer.com/RSSDemo

مونیتوریگ زنده سرور ( برای پهنای باند ، رم ، CPU …)
http://app.lightstreamer.com/MonitorConsole/

اندازه گیری از راه دور مسابقات فرمول 1 :
http://app.lightstreamer.com/WebTelemetryDemo/

*نکته : طرز تلفظ درست Comet ،کامیت می باشد و نه کامت ، در تالار های گفتگوی فارسی دیدم که به اشتباه از کامت استفاده می کنند.





چگونه میتوان پیوسته نرم افزار خوب ساخت؟

7 01 2008

امروز داشتم (دوباره) فصل اول کتاب “Head First: Object Oriented Analysis And Design” رو میخوندم که با خودم گفتم بد نیست مطالبش رو خالصه کنم چون هم به خودم کمک میکنه اونها رو طبقه بندی کنم هم اینه پاسخ بسیاری از پرسشهای دوستان برنامه نویس هم هست. لحن رسمی مقاله برای اینه که بامداد گیر داده سایت باید کلاس خودشو حفظ کنه :-)

صورت مسئله چیست؟
همه دوست دارند نرم‌افزاری که میسازند «خوب» باشد، اما نرم‌افزار خوب چیست؟ و مهمترایکنه چگونه میتوان «پیوسته نرم افزار خوب ساخت؟». پاسخ پرشس نخست در یک سری ویژگیهایی است که یک نرم‌افزار خو ب باید داشته باشد و فرایندی که عمل کردن به آن ما را به ساخت چنین نرم‌افزاری میرساند، پاسخ پرشس دوم.

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

در مقاله‌ای دیگر ویژگیهای نرم‌افزار خوب (انعطاف پذیری، کارایی، سادگی نگهداری، توانایی گسرش و …) را تعریف خواهیم کرد و راههای رسیدن به آنها را نیز بررسی میکنیم.





شرح پروژه

6 01 2008

شرح پروژه

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

* خدمات ویشتیبانی آن لاین برای ISP ها و دیکر مشتریان بالقوه (سروسی چت با مشتری)
* خدمات رسم نمودار و نمایش داده ها به صورت real time برای کابردهایی همچون فارکس
*خدمات اخبار های لحظه ای برای خبرگذاری ها به صورت زنده و بدون احتیاج به Refresh  کردن و نصب نرم افزار مثل فلش و جاوا

اعضای تیم، فرایند نرم افزاری و لیسانس کد
در حال حاضر دو برنامه نویس در تیم هستند. اشکان خانزاده نظری در نقش معمار، تحلیل گر، طراح و توسعه دهنده سیستم در کنار بامداد دشتبان در نقش طراح، توسعه دهنده و متخصص رابط گرافیکی کاربر به کار مشغول هستند. پرژه فعلا هیچ فرایند نرم افزاری خاصی را دنبال نمیکند اما در صورت نیاز فرایند OpenUP استفاده خواهد شد. برای مدیریت کد و ارتباط بین اعضا هنوز هیچ قردادی وجود ندارد اما در صورت نیاز از سیستسم Subversion استفاده خواهد شد. هر دوی برنامه نویسان از پلاتفرم Eclipse برای کد نویسی استفاده میکنند. تیم به در نظر دارد تا بزودی کل پرژه را با لیسانس کد باز در اختیار عموم قرار دهد.

ساختار منطقی پروژه
با توجه به ماهیت پروژه کاملا بدیهی است که معماری کلاینت - سرور بهترین گزینه خواهد بود؛ در نتیجه کار ساخت و گسترش پروژه به دو بخش *کلاینت* و *سرور* تقسیم میشود.

زیر ساخت نرم افزاری و فن آوری های مورد استفاده
چون یکی از مهمترین هدف های پروژه به کارگیری و پیاده سازی مفاهیم نو در برنامه نویسی وب همچون کامیت و آژاکس است و با توجه به تسلط برنامه نویسان پروژه به زبان PHP، لذا نرم افزار سرور به زبان PHP و نرم افزار کلاینت با استفاده از HTML و JS نوشته میشوند. ارتباط بین کلاینتها و سرور از راه آژاکس و کامیت خواهد بود. سرور و کلاینت از پروتوکل HTTP و بسته بندی XML برای تبادل داده با یکدیگر استفاده میکنند. در طرف سرور از کتابخانه phpsocketdaemon برای ساخت سرور و متعلقات آن استفده شدو در سمت کلاینت نیز از کتابخانه Prototype و script.aculo.us برای ساخت چارچوب کلاینت و رابط کاربری آن استفاده خواهد شد.

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





در ستایش نخستین پست

6 01 2008
این نخستین پست را من میزنم
این زر بی بست را من میزنم
گر بگوید خلق، چیست این پست تو؟
همچو خر من یک دو صد عر میزنم
رباعی از مولاتون عمر خیام نیاورونی