لطفا شومن (Showman) نباشید

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

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

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

مشروعیت یافتن در بین همکاران راههای متفاوتی می تواند داشته باشد، از جمله مدیریت مناسب، توانایی رهبری مناسب، کمک و آموزش به همکاران و در نهایت ارائه راهکار و خروجی مناسب مشتری. بهتر است به جای خودنمایی، رضایت مشتری انگیزه ای برای مسیر باشد.

نتیجه

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


راهکارهایی برای مشتری، یا رزومه

تصمیمات اقتصادی تصمیمات احساسی

نیازمندی های غیر قابل اندازه گیری

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

یکی از اولین نکته هایی که در مورد نیازمندی باید رعایت شود قابل اندازه گیری بودن آن است. قابل اندازه گیری به این معنی که بتوان درصد پیشرفت تولید را برای نیازمندی مورد نظر تعیین کرد و از همه چیز مهمتر تعریف اتمام آن به صورت مشخص و قابل اندازه گیری باشد.

چند نمونه از نیازمندی هایی که به این صورت نیستند را در زیر می بینید:

  • نرم افزار باید سریع باشد
  • وبسایت باید زیبا باشد
  • نرم افزار باید خوش دست باشد
  • نرم افزار باید کاربران را مدیریت نمایید

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

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

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

یافتن پاسخ مناسب برای این سوالات به برنامه نویس این امکان را می دهد که تصمیمات فنی مورد نظر را اتخاد نماید. در مورد بالا شاید تیم برنامه نویسی تصمیم بگیرد مقدار زیادی از داده ها را در زمان شروع اجرای برنامه cache کند. در صورتی که موضوع سرعت اجرای اول نرم افزار برای مشتری موضوع خیلی مهمی باشد و زمانی پایینی (به صورت دقیق) درخواست کرده باشد، تیم برنامه نویسی باید با دقت بیشتری این کار را انجام دهد. باید منظور دقیق از سریع بودن نرم افزار مشخص شود.

حتی شاید با توجه به نیازمندی ارائه شده و امکانات موجود، نیازمندی ها غیر منطقی به نظر برسند و مورد قبول قرار نگیرند.

فاجعه اصلی

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

معمولا تحویل گرفتن نیازمندی ها به صورت غیر قابل اندازه گیری و مشخص مشکلات زیر را بوجود خواهد آورد:

  • تحویل بسیار مشکل کار و عدم رضایت همیشگی مشتری
  • عدم امکان طراحی و پیاده سازی نرم افزار مناسب نرم افزار و تکرار دوباره کارهای انجام شده به دلیل طراحی بد
  • بی انگیزگی تیم تولید به دلیل حاشیه ها و تنش های ایجاد شده در تحویل کارها
  • عدم امکان تهیه و ارائه گزارش پیشرفت پروژه

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

راهکارهایی برای مشتری، یا رزومه

مواقع زیادی راهکارهایی را می بینیم که دلایل منطقی برایشان پیدا نمی کنیم. تصمیمات و راهکارهایی که یک برنامه نویس ارائه می دهد به طور منطقی باید با توجه به شرایط پروژه امکانات فنی و مالی پروژه و فرهنگ سازمانی و نیازهای مشتری ارائه شده باشد.

بیشتر برنامه نویس ها در مرحله ای از زندگی کاری خود در موقعیتی قرار می گیرند که برای پروژه یا سازمان خود تصمیم گیری می کنند. تصمیم گیری در زمان شروع یک پروژه یکی از دشوارترین کارهایی است که یک برنامه نویس می تواند انجام دهد. در عین حال تصمیمات مناسب در این زمان می تواند در پیشرفت یک برنامه نویس کمک بسیاری کند.

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

متاسفانه در دنیای واقعی خیلی این اتفاق نمی افتد. تصمیمات برنامه نویس ها ممکن است بیشتر بر مبنای اثر آن موضوع خاص روی رزومه شخص گرفته شود. مثلا در انتخاب این که یک پروژه تحت وب single page باشد یا نه، قبل از این که به نیاز مشتری توجه شود ممکن است به سابقه کاری و فرصت کسب تجربه شخصی و اثر موضوع sinple page application روی روزمه شخص توجه شود.

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

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

درست است که معماران یا برنامه نویس های ارشدی که با این موازین راهکار ارائه می کنند همیشه از نظر فنی قوی و به روز به نظر می رسند ولی در حالت کلی این افراد در بلند مدت مورد اعتماد نخواهند بود و بالاخره این موضوع روزی برایشان درگیری ایجاد خواهد کرد.

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

*ایده اصلی این مطلب از یکی از بخش های کتاب ۹۷Things Every Software Architect Should Know گرفته شده است.


تصمیمات اقتصادی تصمیمات احساسی

درسی از یک نرم افزار ۱۵ دقیقه ای

تصمیمات اقتصادی تصمیمات احساسی

همه ما در پروژه های مهندسی نرم افزاری بودیم و هستیم که هر روز هر فرد تصمیماتی می گیرد. این تصمیمات شاید در کوتاه مدت نتایج خود را نمایان نکنند. ولی بخشی از روند کلی یک پروژه را همین تصمیمات مشخص می کنند.

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

این سیر تکاملی به دلیل تفاوت اساسی مهندسی نرم افزار با سایر رشته های مهندسی بود. می توان به طور خلاصه چند تفاوت مهندسی نرم افزار با دیگر رشته های مهندسی را به این صورت مطرح کرد:

  1. عدم شناخت دقیق نیازمندی ها
  2. تغییرات همیشگی و عدم قطعیت در نیازمندی ها
  3. تغییرات ساختاری زیاد در فناوری ها

این پویایی همه جانبه در پروژه های نرم افزاری مانع از این خواهد شد که مهندسین آن، بدون سبک و سنگین (trade off) کردن شرایط و بررسی شرایط هر لحظه یک پروژه، از یک قاعده و روش کلی به صورت کورکورانه تبعیت کنند.

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

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

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

سبگ و سنگین کردن (trade off) در هر تصمیم روزمره هریک از نیروهای فنی و غیر فنی شاغل در یک پروژه نرم افزاری دخالت دارد.

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

  1. قابل بررسی و اندازه گیری از نظر نتایج نیستند. (چون دلایلی و اهداف ملموسی پشت آن ها نبوده است)
  2. فرد تصمیم گیرنده موضع شخصی در قبال آن تصمیم خواهد گرفت

این موارد بحث و تبادل نظر در مورد تصمیمات اتخاد شده را بسیار مشکل می کنند.

هزینه دیرکرد

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

این هزینه به صورت دقیق قابل اندازه گیری نیست و الزاما هزینه های مادی را شامل نمی شود. ولی همین که به صورت نسبی به این موضوع دقت شود تاثیر بسیار زیادی در تصمیم گیری ها خواهد داشت.

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

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

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

مقدمه ای بر کانبان – Kanban

Kanban یک روش مدیریتی کارا و موثر در مدیریت فرایند تولید نرم افزار است. این روش، یک روش اقتباس شده از روش مدیریت تولید شرکت Toyota است که در اواسط قرن بیستم توسط مهندسین این شرکت ابدا شده.

واژه  Kanban در زبان ژاپنی به معنای کارتهای بصری یا visual card است. در این روش تمامی فرایند تولید نرم افزار به صورت بصری در یک تخته بزرگ نمایش داده می شوند.

به طور کلی می توان فرایند تولید نرم افزار را به صورت یک pipeline دید. که از یک سر آن درخواست ها وارد می شوند. و از سر دیگر آن نرم افزار بهبود یافته خارج می شود.

تنگناها – Bottleneck

فرض کنید در شرکت نرم افزاری شما سه گروه وجود دارند. تحلیلگر ها، برنامه نویس ها و تستر ها.

ظرفیت هر یک از این گروه ها به صورت زیر است:

  • تحلیلگرها: ۱۰ آیتم در هفته
  • برنامه نویس ها: ۱۰ آیتم در هفته
  • تسترها: ۵ آیتم در هفته

همان طور که در شکل بالا مشاهده می کنید. در صورتی که برنامه نویس ها و تحلیلگرها با تمام ظرفیت خود مشغول به کار باشند بعد از دو هفته تعداد زیادی آیتم در صف تست خواهند بود. به این دلیل که گروه تسترها ظرفیت تست کافی برای آیتم های تولید شده ندارند. این انباشت کار در مرحله تست از چند زاویه مضر خواهد بود:

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

اگر شما زودتر متوجه انباشت کار در بخش تست می شدید ممکن بود تصمیمات مختلفی جهت بهبود فرایند تولید و ارائه محصول اتخاذ کنید. به طور مثال:

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

اصول اولیه Kanban

۱) تجسم یا بصری سازی کارها – Visualize the work 

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

۲) محدود کردن کار در فرآیند – Limit the work in process 

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

۳) تمرکز بر جریان – Focus on flow 

با محدود کردن کارها در فرایند (ٌWIP) و اعمال سیاست های تیم محور می توان کنترل مناسبی روی اجرای منظم و مداوم مراحل فرایند و نرمی آن داشت. این کنترل کمک خواهد کرد که تصمیمات مورد نیاز جهت کارایی بهتر فرایند زودتر و تاثیرگذارتر گرفته شوند.

۴) پیشرفت مداوم – Continuous Improvement 

یکی از فرهنگ هایی که با پیاده سازی Kanban در سازمان بوجود می آید، پیشرفت مداوم است. گروه ها می توانند با بررسی جریان کارها، ایرادات و مشکلات خود را یافته و برای رفع آنها تصمیمات مناسب اتخاذ کنند.

 نکته مهم: در Kanban قواعد و مقررات زیادی وجود ندارد و شما می توانید با استفاده از فرایند فعلی سازمان شروع به استفاده از این مدل مدیریتی کنید. به طور مثال نمونه ای از تخته های Kanban که به صورت الکترونیکی است را در زیر مشاهده می کنید:

برای مشاهده کامل تخته Kanban به اینجا  مراجعه کنید.

در این تخته ستون های زیر وجود دارند:

  • Todo: لیست همه کارهای قابل انجام و تمامی سفارشات در این ستون می آیند.
  • Analysis: این اولین مرحله از فرایند است و لیست همه کارهای در حال تحلیل در این ستون آورده می شوند. عدد یک در کنار نام این ستون نشان دهنده محدودیت کارهای ناتمام در این مرحله است. به عنوان مثال در این فرایند گروه تحلیل تنها می تواند یک آیتم در حال تحلیل داشته باشد. و فقط در صورتی می تواند کار جدید از ستون Todo بردارد که تحلیل آیتم فعلی به پایان رسیده باشد. از این جهت Kanban را یک Pull system یا سیستم مدیریت کششی می نامند. یعنی گروه ها هستند که کارها را جهت انجام بر می دارند.
  • Analysis Done: همه آیتم های تحلیل شده به این ستون منتقل می شوند.
  • Development: وفتی گروه برنامه نویسی جایی برای کار جدید داشت (یعنی کمتر از ۱۰ عدد کار موازی در حال انجام بود) می تواند از لیست Analysis done آیتمی را برای برنامه نویسی انتخاب نماید.
  • Development Done: وقتی گروه برنامه نویسی کار آیتمی را به اتمام رسید می تواند آن را به این ستون منتقل نماید.
  • Test: تیم تست نیز کارهای در حال انجام خود را در این ستون وارد می کنند. قراعد مراحل قبلی در این مرحله نیز صادق است.
  • Test Done
  • Publish
  • Publish Done: این مرحله نماینده اتمام آیتم مورد درخواست است. الان وقت این است که پول دریافت شود!!!

در این تخته نمونه از مفاهیمی مانند Queuing (تمامی ستون هایی که با کلمه Done به پایان می رسند) نیز استفاده شده که در محدوده این مطلب نیستند.  همچنین موضوعات مربوط به اولویت بندی در فرصت مناسبتری بررسی خواهد شد.

نکته مهم در مورد Kanban

زمانی که تصمیم به استفاده از روش Kanban گرفته می شود. نیازی نیست تمام فرایندهای فعلی موجود در سازمان دور ریخته شود. در واقع Kanban از فلسفه ژاپنی Kaizen استفاده میکند. که به معنای بهبود مداوم است. به این صورت که فرایندهای مورد استفاده در سازمان به صورت انقلابی کنار گذاشته نشود. و به مرور به نقطه بهبود و کارایی مناسب برسد و همیشه در حال بهبود باشد.

برای مطالعه بیشتر در این زمینه می توانید از منابغ زیر استفاده نمایید.

Kanban: Successful Evolutionary Change for Your Technology Business

Personal Kanban: Mapping Work | Navigating Life

چگونه یک سوال فوق العاده بپرسیم

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

مهارت در پرسیدن سوالات حرفه ای همچنین می تواند تاثیر فوق العاده ای در رشد یک برنامه نویس داشته باشد. احتمالا برای شما پیش آمده که سوالی پرسیده باشید و در اولین پاسخ به شما گفته شده باشد: آفرین چه سوال خوبی! همین آفرین ها می تواند راه شما را باز کند.

هچنین با گسترش استفاده از وبسایت های پرسش و پاسخ آنلاین مهارت در پرسیدن سوالات خوب و به جا، بیشتر و بیشتر در رسیدن به هدف کمک خواهد کرد و حتی سوالات خوب می توانند در وجه شغلی یک برنامه نویس تاثیر بسیار مثبتی نیز داشته باشند. به این صورت که مثلا در سایت stackoverflow.com سوالات نیز امتیاز دهی می شوند و در امتیازات یک کاربر تاثیر زیادی دارند.

با این مقدمه، برای پرسیدن یک سوال فوق العاده در محل کار چه مواردی نیاز است؟

سعی کنید سوال نپرسید!

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

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

عنوان سوال را دقیق انتخاب کنید

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

  • زبان برنامه نویسی یا زیرساخت مورد نظر (زمانی که در یک تیم یکنواخت کار می کنید می توانید فرض کنید طرف مقابل اطلاع از زیرساخت و زبان شما دارد)
  • متن exception یا خطای منطقی ای که به آن برخوردید به طور خلاصه. مثلا: خطای cannot enumerate all types of … را می گیرم.
  • موضوعات مربوط به شرایط خاصی که دارید، مثلا اگر پایگاه داده شما متفاوت با بقیه تیم است و حدس میزنید که خطا از این مورد است حتما ذکر کنید که پایگاه داده من متفاوت است

محدوده سوال تا حد امکان کوچک باشد

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

 برای مطالعه بیشتر در این موضوع می توانید به پست دیگری از من مراجعه کنید.

پروژه تستی ایجاد کنید

در صورتی که امکان این کار وجود داشت بهتر است یک پروژه تستی قابل اجرا که موضوع سوال در آن ایجاد شده باشد درست کنید. این به روند رسیدن شما به پاسخ بسیار کمک خواهد شد. به این صورت که بجای مراجعه پاسخ گو(ها) به میز شما. شما پروژه را برای مخاطبین ارسال می کنید. در ایجاد این پروژه به موضوعات زیر دقت کنید:

  • تا حد امکان داده های مورد نیاز به صورت static داخل برنامه وجود داشته باشد
  • رابط کاربری پیچیده ای نداشته باشد
  • تمام نیازمندی های نرم افزاری تا حد امکان در کنار پروژه وجود داشته باشد
  • کد ساده داشته باشد و سریع سر اصل مشکل رفته باشد

همچنین می توان گفت پروژه تستی را می توانید به عنوان یک unit test بزرگ ببینید.

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

این مطلب  در مورد پرسیدن سوالات شفاهی نوشته شده است. برخی از قوانین و اصول وبسایت هایی مانند stackoverflow با مواردی که مطرح شده متفاوت است.


 مهارت های غیر فنی یک برنامه نویس

خوب باگ بزنیم (Useful bug reports)

مهارت های غیر فنی یک برنامه نویس

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

تا به حال افرادی را دیده اید که علارغم دانش فنی پایین تر از شما، موقعیت و پست بالاتری دارند؟ البته ممکن است خیلی از این افراد ارتباط هایی داشته باشند که شما ندارید! ولی در اصل قضیه به این اندازه سیاه نیست.

در حالت کلی موقعیت و درآمد بیشتر در برنامه نویسی الزاما از دانش فنی ناشی نمی شود. تقریبا در همه رشته های مهندسی علاوه بر دانش فنی که لازمه کار است، نیاز است فرد مهارت هایی داشته باشد. نمونه ای از این مهارت ها به صورت زیر می باشند:

۱) شرکت در جلسات و مدیریت آنها

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

۲) برقراری ارتباط

به دلیل زندگی در یک جامعه انسانی، هر فردی نیاز دارد که ارتباطات موثری با افراد پیرامون خود برقرار کند. در شغل برنامه نویسی از آن جایی که هدف اصلی معمولا رفع مشکل یک فرد یا سازمان است. و اصولا کار تیمی بالای را میطلبد، نیاز به برقراری ارتباطات موثر بیشتر احساس می شود. درست است که geek بودن در برنامه نویس ها صفت خوبی به نظر می رسد. ولی geek منزوی در دنیای امروز راه به جایی نخواهد برد!

۳) قابلیت تحلیل انتظار مشتریان

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

۴) کار تیمی فوق العاده

برنامه نویسی و تولید نرم افزار به شدت کار تیمی ای است. شما نمی توانید به صورت انفرادی پیشرفت کنید. پیشرفت شما در گرو مهارت شما در انجام تیمی کارهاست.

۵) آموزش

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

موارد فوق چند مورد از مهارت هایی بود که می توان برای یک برنامه نویس در نظر گرفت. موارد پیشنهادی دیگری را در نظر دارید؟

چرا برنامه نویس ها چند شغله هستند؟

این موضوع را که بیشتر برنامه نویس ها چند شغله هستند نمی توان انکار کرد. در واقع این موضوع که اکثر ایرانی ها چند شغله هستند را نمی شود انکار کرد. حتی اگر کسی بتواند با شگردهای خلاقانه این موضوع را پنهان کند.

شاید بعضی مواردی که در این مطلب مطالعه خواهید کرد در مورد مشاغل غیر از برنامه نویسی نیز صحت داشته باشد.

چرا برنامه نویس ها چند شغله می شوند؟

۱) عدم امنیت شغلی

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

۲) پرداختی نامناسب

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

۳) یادگیری

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

۴) کسب تجربه

وقتی شما با مشکل فنی یا غیر فنی ای بارها و بارها بر می خورید طبیعتا مهارت حل مسائل مرتبط در شما ایجاد خواهد شد. این موضوع با دانش فنی فرق اساسی دارد.

۵) پیشرفت

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

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

موارد ذکر شده از نظر اهمیت مرتب شده بودند. به طوری که موارد بالاتر از نظر بنده اهمیت بیشتری داشته اند.

پرکاری و بدهی فنی

blog.castsoftware.com
technical-debt

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

بدهی فنی نمونه ها و مصادیق فراوانی دارد. در زیر چند مورد از انها را مشاهده می کنید.

  • کلاسهای (class) بسیار بزرگ با مسئولیت های فراوان. (بیشتر سیستم توسط چند کلاس بزرگ مدیریت می شوند)
  • یک stored procedure برای بسیاری از کارها.
  • Copy paste کردن کد! (فاجعه)
  • عدم استفاده مجدد مناسب از کلاسها
  • عدم refactor کردن کدها جهدت استفاده مجدد و نوشتن تکه کدهای جدید برای حل مسائل جدید
  • عدم بروزرسانی سیستم های مشتریان و نیاز به نگهداری سیستم های قدیمی در مشتریان خاص

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

آخرین نفر مسئول است

مسئله مهمتر و خطرناکتر در مورد بدهی فنی این است که پرداخت بدهی ها الزما به عهده کسی نخواهد بود که آنها را به بار آورده است. ممکن است نفرات قبلی تیم خرابکاری هایی کرده باشند که شما به عنوان آخرین کسی که روی پروژه کار کرده اید مجبور به پاسخگویی در قبال آنها باشید. هیچ چیز دردناکتر از این نخواهد بود که جوابگوی اشتباهاتی باشید که در ایجاد آنها نقشی نداشته اید!

پرکار هستید؟ پس دقت کنید

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

مطالب مرتبط:

آیا سابقه کاری در درآمد برنامه نویسی نقش مهمی دارد؟

هفت تله فکری در راه اندازی یک استارتاپ

استارتاپ

همه در حال جنب و جوش اند. رشد روز افزون استارتاپ ها غیر قابل انکار است. جوی که در جامعه ایجاد شده بسیار هیجان انگیز است. احتمالا شما هم دوست دارید استارتاپی داشته باشید.

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

یکی از دقیق ترین تعاریف یک استارتاپ این است:

استارتاپ یک سازمان موقت است که با هدف یافتن یک مدل کسب و کار تکرارپذیر و مقیاس پذیر بوجود آمده است. (از خوشفکری)

البته ناگفته نماند بعضی از موارد پیش رو با توجه کردن به مفهوم و تعریف اصلی یک استارتاپ به خودی خود حل شوند.

۱) پولدار می شوم

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

۲) رئیس خواهم شد

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

۳) با استفاده از ارتباطات فعلی خودم موفق خواهم شد

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

ادامه خواندن هفت تله فکری در راه اندازی یک استارتاپ