خواه نخستین روزی باشد که برنامهنویسی حرفهای را شروع کردهاید و خواه سالها در این صنعت حضور داشته باشید، بالاخره زمانی فرا میرسد که با مشکلات دشوار و به ظاهر حلنشدنی روبهرو میشوید اما اگر نیمنگاهی هم به نیمهٔ پُر لیوان داشته باشیم، باید گفت که این دست چالشها فقط مشکل نیستند بلکه به دورههای آموزشی میمانند که با پشتِ سر گذاشتن آنها دانش شما افزایش یافته و در حرفهٔ خود ماهرتر میشوید که در همین راستا در این مقاله قصد داریم تا راهحلی برای درک اکثر تَسکهای مرتبط با حوزهٔ توسعهٔ نرمافزار را در سه گام ارائه دهیم (البته انجام تمام این گامها ضروری نبوده و هدف از ارائهٔ آنها تنها ترسیم یک نقشهٔراه نظاممند است که بتواند در درک تَسکهای دشوار شما را یاری نماید.)
گام نخست: تجزیه و تحلیل تَسک مد نظر
در این مرحله صرفاً باید به دنبال درک این موضوع باشید که قرار است چه کاری انجام دهید و اینکه چهطور و با چه روشی میخواهید آن را انجام دهید فعلاً موضوع بحث نیست. همچنین ورود به مرحلهٔ اجرا بدون تشخیص جنبههای مختلف کار و بدون دانستن اینکه باید دقیقاً چه کاری انجام شود، عواقب ناخوشایندی برای شما به بار خواهد آورد و از همین روی قبل از هر چیز دست به کار شوید و تَسک مورد نظر را در یکی از عناوین «رفع باگ»، «افزودن فیچر جدید»، «تحقیق و پژوهش»، «بهبود پرفورمنس» و یا هر عنوان دیگری که فکر میکنید با ماهیت کار شما هماهنگ است دستهبندی کنید.
اینکه بدانید چه نوع کاری میخواهید انجام دهید بسیار حائز اهمیت است اما در شرایط مبهم اهمیت آن دوچندان میشود. به عنوان مثال، ممکن است کاری که از شما خواسته شده به این صورت باشد که «به دنبال راهی هستیم که پس از آپدیت سایت بتوانیم کَش را پاک کنیم.» مسلماً چند تفسیر مختلف در مورد این درخواست امکانپذیر است:
- بلافاصله پس از هر آپدیت باید مکانیسم پاک کردن کَش اجرا شود تا کاربران همواره آخرین آپدیت را مشاهده کنند.
- باید در مورد راههای مختلف ذخیرهٔ کَش مطالعه کنید سپس بهترین راه را برای پاک کردن کَش ذخیرهشدهٔ کاربران ارائه دهید.
- همین الان هم کَش کاربران باید پاکشده میبود و باید بفهمید چه چیزی مانع پاک شدن آنها شده است و مشکل را برطرف نمایید.
در این مرحله اگر نمیدانید کدام یک از تفاسیر ممکن باید انجام شود، حتماً سؤال بپرسید تا جنبهٔ مبهمی در مورد کار باقی نماند و پس از اینکه ماهیت کار برای شما روشن شد، تمام کارهایی که باید انجام دهید را در یک یا دو جمله خلاصه کنید و اگر دو جمله برای توصیف کاری که باید انجام دهید کافی نیست، تَسک مورد نظر را به دو یا چند تسک کوچکتر تقسیم نموده سپس در مورد هر تَسک این مرحله را اجرا کنید. برای درک بهتر این موضوع، در ادامه نمونهای از بیان خلاصهٔ نامناسب تَسک مطرحشده را بیان میکنیم:
هر وقت سایت را آپدیت کردیم عددی را به انتهای نام فایلها اضافه میکنیم تا مرورگر مجبور شود فایلهای جدید را دانلود کند. علاوه بر این باید به CDN هم پیامی ارسال کنیم تا فایلها را آپدیت کند. همچنین آپدیت اپلیکیشنهای آیاواس و اندروید را نیز باید به اپاستور ارسال کنیم. به علاوه باید …
حال اگر بخواهیم توصیف فوق را بهبود بخشیم، خواهیم داشت:
هر وقت سایت را آپدیت کردیم عددی را به انتهای نام فایلها اضافه میکنیم تا مجبور شود فایلهای جدید را دانلود کند.
همانطور که میبینیم، در مورد اول نیاز است تا تَسک مورد نظر به چندین تَسک کوچکتر تقسیم شود تا بتوان هر تَسک را در یک یا دو جمله خلاصه نمود.
زمانی که موفق شدید تَسکتان را در یک تا دو جمله خلاصه کنید، وقتِ آن است تا نگاهی دقیقتر به خود تَسک داشته باشید و جزئیات کاری که باید انجام شود را مشخص سازید. در این فاز دقت داشته باشید که باز هم جملات باید بسیار خلاصه باشند مضاف بر اینکه به خاطر داشته باشید که هنوز در مرحلهٔ تجزیه و تحلیل تَسک هستید و در این مرحله نمیخواهید راهنمای گامبهگام حل مسئله را تهیه کنید بلکه فقط در چند جمله کارهای مهمی که باید در ذیل این تَسک انجام شود را یادداشت نمایید. برای درک بهتر این موضوع، به خلاصهٔ دوجملهای تَسک دیگری که در زیر آمده است توجه کنید:
برای هر کاربر باید یک آگهی هدفمند در مورد یک محصول داخلی نمایش داده شود. طراحی آگهی مورد نظر باید با توجه به نیازهای فردی هر شخص و بر طبق تحلیل دادههای جمعآوریشده صورت گیرد.
برای اینکه بتوانید کارهای اصلی را تشخیص دهید، باید خیلی دقیق به الزامات کاری که باید انجام شود فکر کنید. به عنوان مثال، در مورد تَسک فوق میتوان به موارد زیر اشاره نمود:
- نمایش آگهیهای فعلی موقتاً باید متوقف شود تا با معیارهای کاربر هماهنگ گردد.
- تیم بازاریابی ما باید بر اساس اطلاعات جمعآوریشده از کاربران آگهیهایی را طراحی نماید.
- سیستم باید اطلاعاتی از کاربران که میتواند با موضوع آگهیهای ما مرتبط باشد را جمعآوری کند.
- باید سیستمی ایجاد شود که شناسهٔ کاربر را دریافت نموده و یک آگهی به آن کاربر اختصاص دهد.
مزیت تهیهٔ چنین فهرستی این است که به راحتی میتوانید آن را با دیگر اعضای تیم در میان بگذارید و آنها هم خیلی سریع و راحت میتوانند کلیت کار را متوجه شده و نظرات خود را مطرح نمایند. در این مثال ممکن است مدیرفنیِ تیم پس از بررسی این فهرست، مورد زیر را به آن اضافه کند:
- در صورتی که کاربری علاقهای به دیدن آگهی خاصی نداشته باشد، باید این امکان برای او فراهم باشد که این موضوع را به ما اطلاع دهد.
با زمانی که صرف فکر کردن دقیق بر روی ملزومات کار میکنید، در واقع زمانی که باید بعداً صرف کدنویسی شود را کاهش میدهید! حال ممکن است بگویید در دنیای واقعی، از ابتدا و قبل از اینکه دولوپر شروع به کدنویسی کند، الزامات پروژه مشخص نیستند که این انتقاد کاملاً بهجا و درست میباشد. حقیقت آن است که ما در دنیای کاملی زندگی نمیکنیم و دقیقاً به همین دلیل است که باید سعی کنیم تمام جنبههای مختلف کار را بررسی نموده و قبل از دست به کد شدن به الزامات احتمالی کار نیز فکر کنیم و آنها را در نظر بگیریم. اکنون که جزئیات کاری که باید انجام دهید را مشخص نمودید، باید مشکل را برای خود شرح داده و به این سؤالات پاسخ دهید:
- چرا کسی باید از محصولمان استفاده کند؟
- با انجام این تَسک چه مشکلی را در دنیای واقعی حل میشود؟
در مثال پاک کردن کش پاسخ این است که با انجام این تَسک کاربران همیشه آخرین آپدیت سایت را مشاهده میکنند و در مثال آگهی تبلیغاتی پاسخ این است که با انجام این کار کاربران مجبور نیستند آگهیهایی را ببینند که علاقه و نیازی به آن ندارند و در عوض آگهیهایی برای آنها نمایش داده میشود که ممکن است بتوانند به برآورده شدن نیازهایشان کمک کنند.
اگر پاسخهای واضحی برای این سؤالات ندارید، احتمالاً هدف کار خود را به خوبی درک نکردهاید که در این صورت بهتر است دوباره در مورد کاری که میخواهید انجام دهید فکر کنید و مطمئن شوید که میدانید از انجام این کار انتظار چه نتیجهای را دارید. اگر بدانید که کار شما قرار است چه مشکلی را حل کند، راهحلهای نادرست را راحتتر تشخیص میدهید و در حین کدنویسی نیز تصمیمات درستتری میگیرید.
گام دوم: تفسیر و ارزیابی الزامات تَسک مد نظر
در مرحلهٔ قبل فهمیدید که چه کاری میخواهید انجام دهید و انتظار چه نتیجهای را دارید اما در این مرحله باید نگاه خود را باز هم دقیقتر کنید به طوری که نیاز است تا جزئیات را ببینید و به این فکر کنید که کار مورد نظر را چگونه و به چه روشی میخواهید انجام دهید و اینکه چرا این روش را انتخاب نمودهاید.
برای شروع، تمام اصطلاحات مربوط به تَسکتان را فهرست کنید (اگر تازهکار هستید و یا به تازگی وارد تیم و یا شرکتی شدهاید، فهرست کردن اصطلاحات مرتبط با تَسک اهمیت بیشتری پیدا میکند زیرا در این موارد، اصطلاحات ناشناختهٔ بیشتری برای شما وجود خواهد داشت.) این اصطلاحات ممکن است اصطلاحات تجاری مانند نام محصولات، مشتریان و فرآیندها و یا اصطلاحات برنامهنویسی مانند نام ابزارها، اپلیکیشنها، ماژولها، سرویسها و لایبرریها باشند. اگر بخواهید کار خود را به خوبی انجام دهید، لازم است که تمام اصطلاحات مرتبط با آن کار را کامل و بدون هیچگونه ابهام درک کنید. به عنوان مثال، ممکن است بدانید به ایجاد راهی برای جمعآوری اطلاعات کاربران نیاز دارید اما آیا میدانید افزودن آن به DAO به چه معنا است؟ در صورتی که با اصطلاحات آشنایی نداشته باشید و مفهوم دقیق و درست آنها را ندانید، احتمال اینکه کارها را اشتباه انجام دهید بیشتر میشود.
پس از اینکه با اصطلاحات ضروری کار خود آشنا شدید، باید به دنبال فهمیدن این موضوع باشید که چهطور آن را انجام دهید و این موضوع تا حد زیادی به جایی که در آن مشغول کار هستید و همچنین ماهیت کار شما بستگی دارد به طوری که در بعضی از تیمها توضیحی در مورد چگونه انجام دادن الزامات داده نمیشود و فقط به شما میگویند که در نهایت انتظار چه نتیجهای از کار شما دارند و در بعضی از تیمها هم مرحله به مرحلهٔ کار برای شما تشریح میشود (نیاز به توضیح نیست که در اکثر تیمها شرایطی مابین این دو وضعیت حاکم است.) اگر در تیم شما توضیحی در مورد مراحل کار ارائه نمیشود، در این مرحله کار زیادی برای انجام دادن ندارید اما اگر مراحل کار برایتان توضیح داده شده است باید سعی کنید با مواردی آشنا شوید که انجام آنها به عهدهٔ شما است.
این مرحله بسیار واضح به نظر میرسد اما چیزی که باید به آن توجه ویژهای داشت رعایت ترتیب در انجام امور است و از آنجا شما در مرحلهٔ قبل برای درک تَسک مورد نظر زمان کافی صرف نموده و به جنبههای مختلف آن اندیشیدهاید، اکنون اهداف روشنی در ذهن خود دارید و ارزیابی مراحل کار برای شما آسانتر است.
با دیدی که تاکنون به دست آوردهاید میتوانید بر روی اهداف بزرگ و نهایی تَسکی که انجام میدهید تمرکز کنید و اینجا جایی است که دو مرحلهٔ «تجزیه و تحلیل» و «تفسیر و ارزیابی» با هم ادغام میشوند. در گام نخست بر روی چیستی و در گام دوم بر روی چگونگی انجام تَسک تمرکز داشتید اما اکنون با دید وسیعتری که پیدا کردهاید میتوانید همزمان چیستی و چگونگی را در نظر گرفته و جزئیات کار را ارزیابی نموده و بررسی کنید که آیا مشکل اولیه حل شده است یا خیر. در همین راستا از خود بپرسید: «آیا نتایجی که من به دست خواهم آورد همان نتایجی است که انتظار میرود و اساساً آیا با مراحلی که انجام خواهم داد مشکل مورد نظر حل میشود؟» اگر اطمینان دارید تمام جزئیاتی که در نظر گرفتهاید معقول و مناسب هستند و میتوانند مشکل را حل کنند، آمادهٔ شروع اجرای کار هستید و در غیر این صورت باید به مرحلهٔ سوم بروید.
گام سوم: تفکر انتقادی
در این مرحله باید بتوانید با اطمینان بگویید که هم مسأله و هم راهحل آن را به خوبی درک کردهاید و به طور کلی هدف این مرحله حصول اطمینان از درستی روش انتخابی است. در واقع، اگر میخواهید بهترین محصول را تولید کنید، باید در مورد هر چیزی که نادرست و نامعقول است فکر کنید. البته این بدان معنا نیست که فقط به خاطر اینکه حس میکنید چیزی نادرست است و یا به خاطر اینکه چیزی با سلیقهٔ شما سازگار نیست با آن مخالفت کنید. برای مخالفت با یک راهحل و یا بخشی از آن باید دلایل محکم داشته باشید و اگر میخواهید با چیزی مخالفت کنید حتماً قوانین زیر را در نظر داشته باشید:
بدانید چه زمانی باید مخالفت کنید و تا وقتی که چیزی را کاملاً متوجه نشدهاید با آن مخالفت نکنید؛ هرگز قبل از اینکه بفهمید مشکل چیست اظهار نظر نکنید و نگویید یک جای کار میلنگد! همچنین اگر نمیتوانید به طور واضح مشکل موجود و راهحلی که برای آن مشخص شده را تشریح کنید، نباید با آن مخالفت کنید. فقط هنگامی میتوانید با چیزی مخالفت کنید که بدانید کاملترین درک ممکن را نسبت به آن به دست آوردهاید و اگر اطلاعات جامع و کاملی ندارید، بهتر است قبل از هر گونه اظهار نظر به مراحل قبل بازگردید و اطلاعات مورد نیاز را به دست آورید.
در مورد موضوعات ذهنی و شخصی افراد ابراز مخالفت نکنید و به جای آن بر روی مسائل واقعی تمرکز کنید. به عنوان مثال، گزارهٔ «من این روش انجام کار را دوست ندارم.» یک اظهار نظر شخصی و سلیقهای بوده و قابلبحث نیست اما جملهٔ «این روش به علت تعداد زیاد عملیاتی که همزمان در حال اجرا هستند با مشکل مواجه خواهد شد.» یک مشکل بالاقوهٔ واقعی و قابلبحث است.
برای مخالفتهای خود دلایل محکم داشته باشید و برای توضیح دادن دلایل خود آماده باشید و اگر نتوانید توضیح دهید که چرا چیزی اشتباه است، چهطور میتوانید مطمئن باشید که واقعاً حق با شما است؟ در همین راستا توصیه میشود دلایل خود را یادداشت کنید و همچین توضیح دهید که برای رفع مشکل چه کاری میتوان انجام داد و اگر پیشنهادی برای حل مشکل ندارید، در همان ابتدای صحبت خود این موضوع را بیان کنید.
قبل از اینکه با کسی مخالفت کنید، مدت زمان مناسبی را برای گوش دادن و درک صحبتهای او صرف کنید و حتی اگر فکر میکنید همه چیز را به خوبی درک نمودهاید، بهتر است در ابتدا صراحتاً مخالفت خود را ابراز نکنید. به عنوان مثال میتوانید با این جمله شروع کنید و در آینده اگر ضرورتی وجود داشت میتوانید مخالفت خود را نیز ابراز کنید:
با نظر شما مخالف نیستم اما درست متوجه نمیشوم که …
به علاوه، باید بدانید چگونه مخالفت کنید و برای اینکه مطمئن شوید که مخالفت شما منطقی و عاقلانه است و نَه از روی احساسات و سلیقه، باید با استفاده از یکسری معیار خاص اعتبار نظر خود را ارزیابی نمایید. معمولاً مخالفتهای منطقی باید یکی از کارهای زیر را انجام دهید:
- نشان دهید که راهحل ارائهشده با اطلاعات ناقص و یا نادرست پشتیبانی میشود.
- نشان دهید که مسأله و یا راهحل آن غیرمنطقی است.
- نشان دهید که راهحل ارائهشده کامل نیست.
مثلاً ممکن است کسی که راهحلی را ارائه داده مطلع نباشد که سیستم موجود قابلیتهای مورد بحث را دارد و یا برعکس ممکن است سیستم قابلیت انجام کار خاصی را نداشته باشد اما تصور کسی که راهحل ارائه کرده این است که سیستم چنین قابلیتی را دارا است. گاهی نیز ممکن است خود مسأله غیرمنطقی باشد (یکی از رایجترین مسائل غیرمنطقی درخواست ایجاد فیچری است که اجرای آن فیچر دیگری از اپلیکیشن را با مشکل مواجه میکند!) گاهی نیز راهحلهایی ارائه میشوند که مشکل را به طور کامل حل نمیکنند که در تمام این موارد اگر دلایل محکم و کافی داشته باشید مخالفت شما منطقی و معقول خواهد بود.
جمعبندی
با مد نظر قرار دادن گامهای فوق میتوانید در مورد درست بودن راهحل و کافی بودن مراحل مورد نیاز جهت انجام یک تَسک اطمینان حاصل نمایید. در این مقاله مجموعهای از سه گام عملی را جهت درک تَسکهای برنامهنویسی ارائه نمودیم که نَه ٪۱۰۰ اما در اکثر مواقع میتواند راهگشا باشد. حال نوبت به نظرات شما میرسد تا نظرات، دیدگاهها و تجربیات خود را در ارتباط با نحوهٔ یافتن سولوشن در ارتباط با تَسکهای مختلف در صنعت توسعهٔ نرمافزار را با سایر کاربران سکان آکادمی به اشتراک بگذارید.