چند نکته در یادگیری Design Pattern ها

17 02 2009

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

  • آهسته برانید!! نکات زیادی برای یادگیری-ذهنی کوچک برای بخاطر سپردن:
    مطالب را فقط نخوانید، صبر کنید، اندیشه کنید، یادبگیرید. زمانی که سوالی برایتان مطرح می شود، سعی در گریز از آن سوال نکنید، فزض کنید کسی واقعا از شما این سوال را پرسیده است. اگر جواب سوال در انباشته معلوماتتان باشد به آنها رجوع کرده و جواب مناسب را همراه با دلیل ذکر کنید اگر خیر عجله ای در رسیدن به جواب نداشته باشید، سوال را در دفترچه یادداشتی یادداشت کرده تا در آینده با اندوختن دانش در زمینه طراحی بتوانید جوابی برای آن پیدا کنید. این بهترین راه یادگیری در اینگونه از مسائل می باشد که شما به مغزتان فشار آورده تا آنرا به خاطر بسپارید.
Boost Brain

Boosted Brain

  • تمرین کرده یادداشت برداری کنید:
    هیچوقت سعی در کپی برداری از مثالهای آماده این که در منابع و سایتهای مرتبط آورده شده اند نکنید، در اینصورت شما توانایی فکر کردن و یافتن راه حل مسائل را از مغزتان خواهید گرفت. مدادی در دست گرفته و مسائل مرتبط را خود انجام دهید. از انجام عملی که خود قصد یادگیری آنرا دارید، توسط دیگران خودداری نمایید.
  • قبل از خواب مواردی را که یادگرفته اید را مرور کنید:
    بخش اصلی آموزش و یادگیری زمانی شروع خواهد شد که شما منبع یا کتاب را کنار گذاشته اید. مغز شما نیاز دارد تا زمانی را برای انجام پردازش های گوناگون بر روی آموخته ها به خود اختصاص دهد. اگر در بین این مدتی که مغز شما مشغول می باشد، سعی در یادگیری مطلبی جدید نماییدف چیزهایی را که آموخته اید را نیز فراموش خواهید کرد. در نتیجه زمانی را پس از یادگیری اختصاص دهید تا مغز موارد آموخته شده را بازبینی کرده و کاملا ثبت نماید. بهترین زمان قبل از خواب است.
  • آموخته های خود را با صدای بلند تکرار کنید- یا با صدای بلند با خودتان در مورد موارد آموخته شده بحث کنید:
    بحث دیگری که باعث تقویت حافظه در یادگیری مسائل پیچیده ای همانند Design Pattern، صحبت کردن با خود یا اموزش آن مطلب به شخص مجازی یا حقیقی است. سعی نکنید آموخته های خود را برای خود نگه داشته و انباشته کنید زیرا در شرایطی که استفاده نشوند از یاد خواهند رفت، مغز خود را به اشتراک بگذارید و آموخته ها را به نفع خود آموزش دهید.
  • به نیاز های مغز گوش کرده و جوابی مناسب به آن بدهید:
    نکته ی مهمی که در طراحی باید به آن توجه کرد این است که اطلاعات خام مغز شما در مورد چیزی که می خواهید به خاطر آورید کاملا بارگذاری شده است یا خیر؟ اگر جواب منفی است لحظه ای درنگ نکرده به گذشته برگشته موضوع را مجددا بررسی، ابهامات را مرتفع و از یادگیری مجدد ان کاملا مطمئن شوید. در غیر اینصورت نکته ی کوری در این بین خواهد ماند که در آینده باعث بروز مشکل خواهد شد.
  • مسئله را کاملا حس کنید:
    قبل از اینکه تمرینی انجام دهید یا بخواهید Solution ی برای حل یک مسئله اراده دهید مطمئن شوید که کاملا با موضوع آشنا شده و آنرا درک کرده اید، سپس راه حل مناسب را انتخاب کرده و با توجه به موارد آموخته شده حرکت نمایید. هیچوقت سعی در ارائه نظر و پیشنهادی در مورد مسائلی که نسبت به آنها دانشی کسب ننموده اید نکنید چرا که ممکن است این استدلال امروزی شما آموخته های شما را در آینده مرتبط با این بحث تحت تاثیر قرار داده و نتیجه ای نامطلوبی حاصل گردد.
  • مطلب آموخته شده را عملی نمایید:
    سعی کنید چیزی را که می آموزید در یک پروژه و طراحی جدید به کار برید و یا در پروژه های قبلی با رعایت مراحل اعمال نمایید اینکار باعث خواهد شد که شما تجربه ی لازمه را در اعمال مطالب آموخته شده در پروژه های واقعی بدست بیاورید.

مطالب مرتبط:
آشنایی با Design Pattern

توصیه می کنم:
CodeBetter
Head First Design Pattern

منابع :





مدیر غیرفنی = شکست پروژه

16 02 2009

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

Noob Manager

Bad Manager

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

Come on, We don't have much time

Come on, We don't have much time

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





FeedDeamon نرم افزار مدیریت فید ها (رایگان)

16 02 2009

اگر به دنبال نرم افزاری جهت مدیریت و خواندن Feed هایتان هستید، مطمئنا FeedDeamon شما را مایوس نخواهد کرد.feeddemon_logoیکی از ویژگیهای این نرم افزار که شما را در پیدا کردن مطالب مورد علاقه بین هزاران Feed یاری خواهد کرد Watch ها می باشند که به راحتی با تعریف Keyword مرتبط با موضوع مورد نظر خواهید توانست آنها را از بین Feed ها پیدا کرده فیلتر کنید و در دسته های گوناگون طبقه بندی نمایید.





آشنایی با Design Pattern

16 02 2009

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

Design Strategy

Design Strategy

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

کتاب مرتبط

کتاب مرتبط

این امر مستلزم این است که شما کاملا مشکل را درک کرده و با مباحث OOP آشنایی کامل داشته باشید تا بتوانید  نوع الگوی خاص را در راستای مرتفع کردن مشکل انتخاب نمایید. استفاده از الگو به  معنای این نیست که الگو به شما بگوید که دقیقا چه کار کنید، فیلدی که انتخاب می کنید چه نوع باشد، کلاس چه فیلد و چه متد هایی داشته باشد، نقش الگو تنها و تنها راهنمایی و ارائه ی دیدگاهی مفید و کلی در حل مشکل، مرتبط با موقعیت شما در فاز طراحی است.

بیش از 250 الگو در سراسر جهان وجود دارد که 23 الگوی GOF بیش از همه مشهور و محبوب طراحان بوده و مورد استفاده قرار می گیرند. هر طراح یا برنامه نویس حداقل باید با چندی از این الگوها آشنایی داشته باشد تا در شرایط گوناگون بتواند از آنها بهره بگیرد ( طراحان و برنامه نویسان زیادی با چندین سال تجربه هنوز آشنایی با این مباحث ندارند ). ذهن خلاق در بررسی مشکل، تطبیق آن با الگوهای موجود در ذهن، پیاده سازی درست و اصولی، عدم اعمال سلایق شخصی، تیمی مجرب در زمینه object oriented programming از موارد اجتناب ناپذیر برای مسطح کردن مسیری در موفق بودن استفاده الگو می باشد.

اطلاعات بیشتر ( مراجع ):

http://www.fluffycat.com/Java-Design-Patterns
http://www.dofactory.com/Default.aspx

لیستی از مشهورترین الگوهایی:

GoF Creational Patterns :

  • Abstract Factory: Sets of methods to make various objects.
  • Builder: Make and return one object various ways.
  • Factory Method: Methods to make and return components of one object various ways.
  • Prototype: Make new objects by cloning the objects which you set as prototypes.
  • Singleton: A class distributes the only instance of itself.

GoF Structural Patterns:

  • Adapter: A class extends another class, takes in an object, and makes the taken object behave like the extended class.
  • Bridge: An abstraction and implementation are in different class hierarchies.
  • Composite: Assemble groups of objects with the same signature.
  • Decorator: One class takes in another class, both of which extend the same abstract class, and adds functionality.
  • Facade: One class has a method that performs a complex process calling several other classes.
  • Flyweight: The reusable and variable parts of a class are broken into two classes to save resources.
  • Proxy: One class controls the creation of and access to objects in another class.

GoF Behavorial Patterns:

  • Chain Of Responsibility: A method called in one class can move up a hierarchy to find an object that can properly execute the method.
  • Command: An object encapsulates everything needed to execute a method in another object.
  • Interpreter: Define a macro language and syntax, parsing input into objects which perform the correct opertaions.
  • Iterator: One object can traverse the elements of another object.
  • Mediator: An object distributes communication between two or more objects.
  • Memento: One object stores another objects state.
  • Observer: An object notifies other object(s) if it changes.
  • State: An object appears to change its` class when the class it passes calls through to switches itself for a related class.
  • Strategy: An object controls which of a family of methods is called. Each method is in its` own class that extends a common base class.
  • Template: An abstract class defines various methods, and has one non-overridden method which calls the various methods.
  • Visitor: One or more related classes have the same method, which calls a method specific for themselves in another class.




کتاب های مرتبط جهت شرکت در آزمون MCPD

25 12 2008

سلام، چند وقت پیش پستی به عنوان Microsoft Certification ارسال کردم و گفتم که در آینده لینک دانلود اونها رو میزارم .این کتاب ها برای Net Framework  2.0 هستن اگر تونستم 3.5 رو هم پیدا کنم آپلودشون می کنم تا دوستان بتونن ازش استفاده کنن. شرمنده به دلیل کمبود وقت دیگه نتونستم دسته بندیشون کنم. از سری کتاب های این آزمون چند جلدش ( البته در این پست )ناقص هست، اونها رو هم دانلود کردم ولی متاسفانه در دسترس نیستن ( یعنی شرکتن 🙂 ) . سری ناقص کتاب ها رو هم در پست های آتی لینک دانلودشونو میزارم براتون .

با آرزوی موفقیت دوستان در آزمون.

لینک های دانلود کتاب ها:

MCPD-70-536 Desgn and Developing Windows-Base Application Using Microsoft .Net Famework
MCTS – 70-528 – Microsoft .NET Framework 2.0 Web-Based Client Development
MCTS 70-526 Microsoft .NET Framework 2.0 Windows-Based Client
MCTS-536 Microsoft .NET Framework 2.0—Application Development Foundation eBook
MCTS-70-529 Microsoft Net Framework Distributed Application Development
CLR Via C# 2Nd Edition

لیست کتاب های آپلود نشده که در آینده ی نزدیک آپلود خواهند شد:

Debugging Microsoft .NET 2.0 Applications
Programming Microsoft Visual C# 2005: The Language
Programming Microsoft ADO.NET 2.0 Core Reference





پروژه Bluetooth تجاری شد

24 12 2008

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





کار با Process ها در API

24 12 2008

سلام، شاید براتون پیش اومده باشه که ویروسی Task Manager شما رو غیر فعال کرده باشه و حتی اجازه دسترسی به Registry ویندوز رو هم ازتون گرفته باشه که نتونین از طریق Registry اونو مجدد فعال کنید. ایده ی این نمونه برنامه هم از این نشعت می گیره که، چند روز پیش ویروسی سیستمم رو آلوده کرد و همانطور که بالا بهش اشاره کردم Task Manager مو هم غیر فعال . مجبور شدم از نرم افزار Process Explorer استفاده کنم تا Process ویروس رو KILL کنم. نهایتا تصمیم گرفتم تا خودم برنامه ای مانند این نرم افزار یا حداقل Task Manager ویندوز بنویسم تا در مواقع ضروری بتونم ازش استفاده کنم ( چون اعتقاد دارم هر برنامه نویس باید خودش نیاز های نرم افزاریشو رفع کنه ).

نمونه در �ال اجرا

نمونه در حال اجرا

بریم سر اصل مطلب و به توضیح نحوه کار نرم افزار بپردازیم، روند کار بدین صورته که ابتدا باید ProcessID تمامی process های در حال اجرا بر روی سیستم رو با استفاده از تابع EnumProcesses بدست بیاریم این تابع یک آرایه از نوع DWORD رو گرفته و پس از اجرا ID ی پروسس های در حال اجرا رو درون آرایه قرار میده.

//------/ Buffer
DWORD dwProcessIDs[1024];
//------/ Enumerate all system processes
EnumProcesses(dwProcessIDs, sizeof(dwProcessIDs), &dwNeeded);

خوب پس از استخراج id  ی هر process، باید Handle پروسس رو با استفاده از id اون بدست بیاریم این کار رو با استفاده از تابع OpenProcess انجام میدیم، وظیفه این تابع برگرداندن Handle یک process با استفاده از id اونه.

//-----/ Open process by process id and get the process handle
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, dwProcessIDs[i]);

در ادامه برای اینکه بتونیم نام process مورد نظرمون رو بدست بیاریم به دو تابع دیگه نیاز داریم که یکی برای بدست آوردن Module Handle و دیگری برای گرفتن نام پروسس مورد نظر هستش، که این توابع به ترتیب عبارتند از EnumProcessModules که با گرفتن Process Handle ، میتونه Module Handle رو بر گردونه و دیگری با گرفتن Module Handle نام پروسس رو برمی گردونه.

//-----/ Enumerate each process module
//-----/ then we able to retrieve module name Like EXPLORER.EXE
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &dwCbNeeded);
//-----/ Get module name by process handle and module handle
GetModuleBaseName(hProcess, hModule, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));

خوب در ادامه برای اینکه بتونیم اطلاعاتی در مورد میزان استفاده process از حافظه رو بدست بیاریم باید از تابع GetProcessMemoryInfo این تابع با استفاده از Process Handle ی که در دست داریم یک Struct رو با نام PROCESS_MEMORY_COUNTERS پر می کنه که حاوی اطلاعات مختلفی در رابطه با میزان استفاده process از حافظه است.

//-----/ Process memory information
PROCESS_MEMORY_COUNTERS pmc;
//-----/ Get process memory usage information
//-----/ We need just memory usage by getting PeakWorkingSetSize field of struct
//-----/ ATTENTION : All size fields in the structure calculate as Byte
GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));

از اونجایی که ما فقط می خواهیم Memory Usage رو در لیستمون نشون بدیم فقط از فیلد PeakWorkingSetSize این struct استفاده می کنیم.

در پست های بعدی در دارستای تکمیل این نرم افزار نحوه بدست آوردن آدرس یک ماژول و تعداد Handle ها ، Kill و Terminate کردن یک پروسس رو براتون توضیح میدم. پس منتظر پست های بعدی باشید. طبق معمول توضیحات کاملتر همراه با سورس نرم افزار هستش که می تونه بیشتر در یادگیری مطلب کمکتون کنه.

نکته : همراه سورس برنامه دو فایل در پوشه lib وجود داره در صورت کامپایل اون دو فایل رو با استفاده از Drag & Drop به پروژه تون اضافه کنید

برای دانلود سورس کامل برنامه اینجا را کلیک کنید.