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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

پنج اشتباه رایج در مورد برنامه نویس ارشد

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

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

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

ارشد نباشی حتما دانش پایینی داری

باز هم با توجه به مورد قبل و مطلب قبلی در این زمینه نمی توان از ارشد نبودن فرد چنان برداشتی کرد. خیلی از برنامه نویس های خوب را می شناسم که از چنین امتیازی استقبال نمی کنند. نکته دیگر اینکه در کجا؟! در یک شرکت دسته سوم و چهارم برنامه نویس ارشد بودن هم چنان لطفی ندارد. و این که فردی در شرکتی مثل مایکروسافت software engineer 3 باشد چندان شکست محسوب نمی شود. زیر این آسمان آبی همه چیز نسبی است.

ارشد خود خوانده!

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

ارشد یعنی مدیر

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

یک برنامه نویس ارشد همیشه و همه جا ارشد است

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


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

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

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

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

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

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

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

  • Programmer
  • Senior programmer
  • Software developer
  • Senior software developer
  • Software architect
  • Software development engineer
  • Senior software development engineer

موارد دیگری نیز وجود دارد که از نظر آماری تعداد کمتری از آنها مشاهده کرده ام.

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

در حالت کلی یک برنامه نویس ارشد:

برنامه نویس خیلی خوبی است

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

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

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

بیان قوی ای دارد

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

آموزگار  و الگوی خوبی است

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

مذاکره کننده خوبی است

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

اخلاق حرفه ای دارد

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

تصمیم گیرنده خوبی است

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

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


مطالب مرتبط:

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

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

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

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

تصویری از اعماق فضا

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

فضاپیمای Voyager 2 این تصویر را در سال ۱۹۷۹ ثبت کرده است. نزدیک به ۳۷ سال پیش. چند لحظه به تصویر خیره ماندم. مشتری ۶۲۸,۷۳۰,۰۰۰ کیلومتر با زمین فاصله دارد. این تصویر را فضاپیمای Voyager 2 از قمر مشتری به نام IO ثبت کرده. تصور این که ساخته دست بشر تصویری از ۶۰۰ میلیون کیلومتر آن طرف تر ارسال کرده است هنوز نفسم را در سینه حبس می کند. مانند آن زمانی که تمام فکر و ذکرم سیارات منظومه شمسی بود!

سعی کنید تخیل خود را به کار وا دارید. خود را جای Voyager بگذارید. اگر آنجا بودید و با چشم خود شاهد این صحنه بودید، چه دنیایی را نظاره می کردید؟

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

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

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

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

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

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

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

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

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

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

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

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

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

۵) آموزش

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

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

سلام docs.com

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

چند روز پیش با docs.com آشنا شدم. وبسایتی از طرف مایکروسافت که در مجموعه office online وجود دارد. دقیقا برای همین کار!

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

در این سرویس امکان embed کردن اسناد افیس و فایل های sway*  در دیگر وبسایت ها نیز وجود دارد. همچنین این قابلیت در سرویس وجود دارد که در کنار آپلود فایل ها از دستگاه شخصی از فایلهای موجود در onedrive مایکروسافت جهت اشتراک استفاده کنید. در کنار تمام امکاناتی که این سرویس در اختیار کاربران می گذارد امکان ایجاد صفحه اختصاصی شخصی نیز خیلی جذاب است.

هنگام اشتراک یک فایل می توانید سطوح دسترسی متفاوتی را برای آن در نظر بگیرید. همچنین امکان انتخاب یک License  نیز وجود دارد.

*Sway سرویس وب ایجاد نوع خاصی از presentation از طرف مایکروسافت است.

 

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

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

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

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

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

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

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

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

۳) یادگیری

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

۴) کسب تجربه

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

۵) پیشرفت

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

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

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

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

blog.castsoftware.com
technical-debt

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

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

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

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

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

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

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

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

مطالب مرتبط:

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

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

استارتاپ

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

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

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

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

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

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

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

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

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

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

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

به خواندن ادامه دهید

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

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

نرم افزار 15 دقیقه ای

به او گفتم کار سختی نیست. امتحان میکنم. بعد از آن در حدود ۱۵ دقیقه (زمان کار را با toggl.com ثبت کردم) توانستم برنامه ساده ای بنویسم که در درایو خاصی فایل های صوتی تکراری را پیدا کرده و در یک فایل متنی گزارشی به کاربر ارائه دهد.

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

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

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

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

این درسی بود که من گرفتم از نیاز ساده یک دوست.