۹ ماهه مهندس نرم‌افزار شدم

نویسنده : سید ایوب کوکبی ۱ مرداد ۱۳۹۸
9 ماهه مهندس نرم‌افزار شدم

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

من هروقت داستان موفقیت بقیۀ برنامه‌نویس‌ها را می‌خوانم ابتدا به مهارت‌های اولیه‌اش نگاه می‌کنم. این کار را به این خاطر انجام می‌دهم که آدمی دقیقاً مثل خودم پیدا کنم؛ یعنی کسی که دقیقاً از نقطه‌ای که من شروع کردم شروع کرده باشد. متأسفانه هیچ وقت چنین فردی را نتوانستم پیدا نکردم. پس احتمالاً شما هم که داستانِ من را می‌خوانید شرایط متفاوتی دارید. با این حال همیشه در این داستان‌ها تجربیات و عبرت‌های آموزنده‌ای وجود دارد.

معرفی خودم

۹ سال قبل در دبیرستانم دورۀ آموزش VBA برداشتم. دو سال بعد در دانشگاه به عنوان یک مهندسِ تازه‌کار در مورد زبان‌های سی، پایتون، متلب و LabView چیزهایی یاد گرفتم. من از یک دانشگاه خوب با یک نمرۀ خوب و با مدرک مهندسی شیمی فارغ‌التحصیل شدم و البته هیچگاه در خارج از مدرسه و دانشگاه برنامه‌نویسی تمرین نکردم. تا اینکه پارسال تصمیم به این کار گرفتم. بعد از اتمام دانشگاه در پالایشگاهی به عنوان مهندس فرایند (Process Engineer) مشغول به کار شدم و تا پیدا کردن شغل جدیدم همانجا فعالیتم را ادامه دادم.

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

من آدمی بودم که عاشق حل مسائل فنی است و این را هم می‌دانستم که برای چنین کاری باید وارد دنیای تجارت و استارتاپ شوم. از طرفی همیشه گوشۀ چشمی به رشتۀ MBA (مدیریت ارشد کسب‌وکار) داشتم ولی هربار که به شهریه‌ها نگاه می‌کردم منصرف می‌شدم؛ چون واقعاً هزینه‌های سنگینی داشت.

در ۲۷ می ۲۰۱۷ در اثنای جستجوهایم به طور اتفاقی با رشتۀ مهندسی نرم‌افزار آشنا شدم. چه جالب! رشتۀ جذابی به نظر می‌رسید. همۀ فاکتورهایی که می‌خواستم را داشت. هم ظرفیت شغلی‌اش خوبی بود، هم حقوقش عالی بود و هم سرمایۀ اولیۀ زیادی نیاز نداشت. فقط یک عدد کامپیوتر لازم است و کلی وقت آزاد!

در هیچ یک از رشته‌های مهندسی از این خبرها نیست که ایده بدهید، بسازید، به مشتری نشان دهید و مدام پروژه را بهبود دهید تا به مرحلۀ درآمدزایی برسانید. در رشتۀ شیمی ساختِ یک محصولِ جدید مستلزم پولِ زیادی برای خرید تجهیزات است که برای هر کسی مقدور نیست و با کوچک‌ترین اشتباه دوباره باید مواد اولیۀ لازم را خریداری کنید؛ تجهیزات آزمایشگاهی هم که بماند.

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

شاید با خودتان بگویید که شرکت نکردن در کمپ‌های آموزشی معایبی چون ضعفِ در شبکه‌سازی و دریافت نکردن پیشنهادات شغلی به همراه دارد. بله حرف شما درست است ولی خوشبختانه من در منطقه‌ای سکونت داشتم که به راحتی می‌توانستم در جلسات و همایش‌های برنامه‌نویسی شرکت کنم؛ خلیج سانفرانسیسکو (Bay Area).

هدف‌گذاری

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

هدف من این بود:

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

برنامه‌ریزی

بعد از هدف‌گذاری نیازمند برنامه‌ای برای رسیدن به آن هدف هستید. اینجاست که خواندن داستان‌های موفقیت بقیۀ افراد به شما کمک می‌کند. البته چون هیچ کدام از آن‌ها دقیقاً با شرایط شما یکسان نیست از هر یک نکته‌ای یاد می‌گیرید. من خودم برای برنامه‌ریزی از منابعی مثل ساب‌ردیت Learnprogramming، فروم freeCodeCamp و سایت مدیوم استفاده کردم.

در ۲۷ می ۲۰۱۷ وارد دنیای کدنویسی شدم. قرارداد کاری‌ام را در پالایشگاه طوری تنظیم کردم که بیشتر از ۴۰ ساعت در هفته کار نکنم تا بعد از کار فرصتی برای تمرین برنامه‌نویسی داشته باشم. از خوش‌شانسی‌تان تمام پیشرفت‌هایم را به خوبی مستند کردم.

بعد از کلی تحقیق برنامه‌ای که چیدم این بود:

  1. آشنایی اولیه با علوم کامپیوتر و مفاهیم ابتدایی آن؛
  2. دنبال کردن دوره‌های آموزشی freeCodeCamp تا زمانی که به یک برنامه‌نویس وبِ فول‌استک تبدیل شوم؛
  3. ریفکتور، کدنویسی تمیز، تست و تمرکز روی مفاهیم پیشرفته؛
  4. مشارکت در پروژه‌های متن‌باز؛
  5. آمادگی برای مصاحبۀ شغلی.

برای آشنایی با علوم کامپیوتر، مطابق راهنمای فنی گوگل، دورۀ Udacity CS101 را برداشتم.

پیش آمادگی- Udacity CS101, Harvard CS50

بعد از برنامه‌ریزی انرژی‌ام برای شروع چند برابر شد. بلافاصله پس از کار سراغ کامپیوتر می‌رفتم و تا موقعِ خواب تمرین می‌کردم. Udacity CS101 پیشرفت من را به صورت درصدی نشان می‌داد که انگیزۀ خوبی برای تمرینِ بیشتر بود. هر روز درصدِ پیشرفتم را ثبت می‌کردم طوری که در همان ۱۰ روز اول تا ۷۵ درصد دوره را تمام کردم؛ ۲۵ درصد باقی‌مانده کمی سخت بود و زمان بیشتری برد. ۲۰ روز طول کشید تا این دوره را تمام کردم.

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

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

من برنامه‌ریزی کرده بودم که برای علوم کامپیوتر فقط در یک دوره شرکت کنم ولی تعدد پیشنهادات و اهمیتی که دیگران برای آن قائل بودند باعث شد تا این دوره را هم بگذرانم. بسیاری از دانشجویان علوم کامپیوتر که در جایی به جز هاروارد درس خواندن بودند اذعان داشتند که دورۀ CS50 بیشتر از چیزی که در طی یک یا دو سال در دانشگاه یاد گرفته بودند به آن‌ها اطلاعات داده است. البته اکثر افراد در مورد سخت بودن این دوره نیز حرف‌هایی زده بودند. در پایان این ماه توانستم ۵ درسِ اول این دوره بعلاوۀ تکالیفش را تمام کنم.

ماه اول- ادامۀ هاروارد CS50، لینوکس، شرکت در اولین میتاپ، freeCodeCamp

دورۀ آموزشی CS50 را توانستم تا اواسط ماه دوم به اتمام برسانم. CS50 یکی از بهترین دوره‌های علوم کامپیوتر است که اکیداً توصیه‌اش می‌کنم. دیوید مالان مدرس ماهرِ این دوره به خوبی شما را با مباحث علوم کامپیوتر و نرم‌افزار آشنا می‌کند. آموزش با زبان سی شروع می‌شود، جلوتر با پایتون کد می‌نویسید و نهایتاً سراغ توسعۀ وب خواهید رفت. این دوره خیلی فشرده و حاوی سرفصل‌های کاملی است که به نظرم ارزش بررسی را دارد.

بخوانید  اشتباهاتی که به عنوان یک برنامه‌نویسِ مبتدی مرتکب شدم

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

شروع کردم به کدنویسی و خود را ملزم کردم تا ۱۰۰ روز این کار را ادامه دهم. بسیار مهم است که پیشرفت‌هایتان را مستند کنید. شاید پیشرفتی که هر روز می‌کنید به چشم نیاید ولی وقتی به پیشرفت‌های هفتگی یا ماهیانه نگاه می‌کنید قطعاً خواهید فهمید که خیلی با گذشته فرق کرده‌اید. این کار به شما انگیزه می‌دهد تا با قدرت بیشتری ادامه دهید.

در جریانِ این موضوع بود که صرفاً کدنویسی روی توانایی شبکه‌سازی و ارتباط با سایر افراد تأثیر نامطلوبی دارد. به همین خاطر تصمیم گرفتم با شجاعت و اعتماد به نفس در اولین میتاپ (meetup) یا گردهمایی شرکت کنم. تا آن زمان در این دورهمی‌ها شرکت نکرده بودم و به شدت نگران بودم که تا آنجا رانندگی کنم و آخرِ سر بدون هیچ دستاوردی به خانه برگردم.

البته خودم را قانع کردم که دلیلی برای نگرانی وجود ندارد. آنجا همه غریبه هستند، هیچ‌کسی همدیگر را نمی‌شناسد، یکدیگر را قضاوت نمی‌کنند و همه با هدف یادگیری آمده‌اند. خلاصه شرکت در این گردهمایی همانا و شرکت در ۵۰ میتاپ بعدی که طی ۹ ماه بعد در آن‌ها حضور یافتم همانا!

خوشحالم که در همان مراحل ابتدایی که هنوز احساس آمادگی نمی‌کردم به این جلسات رفتم. متأسفانه بیشتر افراد زمانی در این میتاپ‌ها شرکت می‌کنند که دنبال کار هستند و خیلی دیر شده است.

دلایل زیادی وجود دارد که زودتر در این جلسات شرکت کنید:

  1. توسعۀ روابط فردی زمان زیادی می‌برد. شروع زودهنگام یعنی پیدا کردن افرادی که بعداً می‌توانند ضامنِ شما برای شغل جدید باشند؛
  2. صحبت با غریبه‌ها فرصت و تمرینی برای شرکت در مصاحبه‌های شغلی است؛
  3. شرکت زودهنگام در این جلسات ممکن است منابع، ابزارها و فریم‌ورک‌هایی را پیش پایتان قرار دهد که آیندۀ شغلی و حتی مسیر یادگیری شما را متحول کند.

کمی در مورد آیندۀ شغلی‌ام فکر کردم و نهایتاً شاخۀ برنامه‌نویسی وب را انتخاب کردم؛ چون به نظر می‌رسید ظرفیت شغلی خوبی دارد و منابع آموزشیِ آن هم فراوان است. حالا باید گام بعدی حرکتم را مشخص می‌کردم؛ یعنی شروع یادگیری.

برخی افراد توصیه کردند به اپلیکیشن‌هایی که می‌خواهم در بستر وب توسعه دهم فکر کنم تا بر اساس آن مسیرم را انتخاب کنم. برخی‌ها نیز پروژۀ Odin و شرکت در دوره‌های freeCodeCamp را پیشنهاد می‌کردند. در دورهمی‌های هفتگی فردی بود که از روبی و پروژه‌های مبتنی بر این زبان صحبت می‌کرد. همین شخص باعث شد تا بالاخره تصمیمم را برای شرکت در دورۀ آموزشی توسعۀ وب در OdinProject بگیرم.

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

با جستجویی در اینترنت و سرچ کردن عباراتی مثل Ruby vs JavaScript Jobs متوجه شدم که درخواست‌های شغلی روبی در چند سال اخیر از رونق افتاده است. بنابراین تصمیم گرفتم در دورۀ آموزشی freeCodeCamp شرکت کنم. چیزی که در مورد این دوره آزارم می‌داد این بود که دوره‌های آموزشی‌شان با یک ایدۀ مشابه اجرا می‌شد. این موضوع برای آیندۀ شغلی من نگران‌کننده بود. با این حال بعد از شرکت در دوره متوجه شدم که اشتباه فکر می‌کردم و اکنون به شدت این سایت را پیشنهاد می‌کنم.

ماهِ دوم- YDKJS, freeCodeCamp Front End, React

به پیشنهاد دیگران شروع به خواندن سری کتاب‌های You Don’t Know JavaScript کردم؛ چون اغلب افراد این کتاب‌ها را مکملی برای freeCodeCamp می‌دانستند. البته کتاب خیلی فشرده و عمیق نوشته شده و برخی قسمت‌ها را مجبور بودم چند بار بخوانم تا بفهمم. در کل منبع بسیاری خوبی است برای یادگیری lexical scope, closures, promises و هر چیزی که به جاوا اسکریپت ربط دارد. این کتاب مباحثی را که تاکنون به خاطر سختی یا کاربردِ کم سراغشان نرفته‌اید به خوبی باز کرده است.

بخش فرانت‌اندِ freeCodeCamp را تمام کردم. چک لیست و تخمین زمان پایان به من کمک می‌کرد تا انگیزۀ بیشتری برای پایان رساندن سریع دوره داشته باشم. خیلی زیاد برای رفتن به بخش دیگر که آموزش React بود لحظه‌شماری می‌کردم. با این حال هنوز چیزی از استایل دادن به قالبِ سایت بلد نبودم. الان که به گذشته فکر می‌کنم بهتر بود روی ظاهر پروژه‌ها وقتِ بیشتری صرف می‌کردم. شاید این موضوع باعث می‌شد روی یادگیری عمیق‌تر CSS وقت بیشتری بگذارم.

مرحلۀ بعد یادگیری React بود و من خیلی ذوق کرده بودم. در مورد این فریم‌ورک تعریف‌ها زیاد بود و به همین خاطر علاقه داشتم سریع‌تر سراغش بروم. یادگیری React خیلی برایم سخت بود. آن زمان که تازه شروع کردم آموزش‌های زیادی در اینترنت وجود نداشت (ولی الان که نگاه می‌کنم تعداد آموزش‌های باکیفیت فراوان است).

مستندات این فریم‌ورک و پروژۀ Tic-Tac-Toe فیسبوک را دنبال کردم، اما راستش را بخواهید چیزِ زیادی متوجه نشدم. با خودم گفتم دلیل اینکه سخت یاد می‌گیرم یا در فهم بعضی قسمت‌ها دچار مشکل هستم این است که جاوا اسکریپت را خوب بلدن نیستم. بنابراین دوبارۀ برگشتم سراغ جاوا اسکریپت و این بار با عمق بیشتری این زبان را بررسی کردم.

ماه سوم- freeCodeCamp React, CodeClub و شروع یادگیری بکند

نهایتاً مجبور شدم به دورۀ آموزشی React در freeCodeCamp مراجعه کنم. کدها خیلی بدقواره و زشت بود ولی نسبت به قبل این کتابخانه را بهتر آموختم. در میتاپ هفتگی که همیشه شرکت می‌کردم اعضای گروه تصمیم گرفتند تا به جای روبی از جاوا اسکپریت به صورت Full Stack برای ساخت یک پروژه استفاده کنند. تصمیم بر این شد که سایتی برای میتاپ ساخته شود.

من با استفاده از React و Meetup API یک سری Card طراحی کردم که به کاربران اجازه می‌داد برای سه نشست بعدی گروه از طریق سایت ثبت‌نام کنند. کمی سخت بود که با اطلاعات اولیه‌ای که از دورۀ freeCodeCamp داشتم سراغ پیاده‌سازی این پروژه بروم؛ اما فرصت بسیار خوبی برای تمرین بود که به هیچ عنوان نمی‌خواستم از دست بدهم. خوشحال بودم که داشتم روی یک پروژۀ تیمی کار می‌کردم. کارِ تیمی باعث شد گیت و گیت‌هاب را هم تا حدود زیادی یاد بگیرم.

قبل از به پایان رسیدن این ماه دورۀ بکند freeCodeCamp را هم شروع کردم.

ماه چهارم- اتمام دورۀ بکند و ساخت Yeggle

تقریباً تمام پروژه‌هایی که مربوط به API میشد را در سایت freeCodeCamp به پایان رساندم. کم کم شروع کردم به ساخت اپلیکیشنی که به صورت رندوم URL تعدادی از تصاویر سایت imgur را در دیتابیس ذخیره می‌کرد و با توجه به درخواست کاربر تعدادی از این تصاویر را در فرانت اند به کاربر نشان میداد. خیلی از برنامه‌نویس‌ها معتقد بودند که کار روی پروژۀ شخصی چیزهای بیشتری به آدم یاد می‌دهد. چیزی که ساختم کدهای به هم‌ریخته‌ای داشت ولی هر چه بود درست کار می‌کرد.

بخوانید  تجربۀ سال‌ها برنامه‌نویسی

freeCodeCamp پروژه‌هایی که توانایی آن‌ها را داشتم اعلام می‌کرد. بر همین اساس ایده‌هایی برای خودم تعریف می‌کردم و موقع رفتن به خانه روی پیاده‌سازی آن ایده‌ها کار می‌کردم. به این ترتیب همیشه لیستی از ایده‌ها داشتم که در اسرع وقت می‌توانستم پیاده‌سازی‌شان کنم.

یکی از این ایده‌ها که توانستم به عنوان نمونه در رزومه‌ام قرار دهم ساخت برنامه‌ای برای پیدا کردن رستوران بود. من همیشه برای پیدا کردن رستوران‌های جدید ابتدا از طریق Yelp نقد و بررسی‌ها را می‌خواندم و سپس از روی نقشه هتل را جستجو می‌کردم. چه می‌شد برنامه‌ای بود که این دو کار را همزمان و در کنار هم انجام می‌داد. همین نیازِ ساده باعث شد Yeggle را بسازم.

برای ساخت برنامه از Node/Express/React در کنار Google Maps API و Yelp API استفاده کردم. بعد از پایان پروژه به خودم افتخار کردم که ایده‌ای که در ذهن داشتم را بالاخره توانستم پیاده‌سازی کنم. نتیجۀ کارم را در ردیت به اشتراک گذاشتم که البته مورد استقبال قرار نگرفت. کمی ضد حال بود ولی سعی کردم با این چیزها کم نیاورم و به مسیرم ادامه دهم.

ماه پنجم – StockIT

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

این بازی به ذهنم انداخت تا روی ساختِ یک بازی مشابه کار کنم؛ البته با این تفاوت که اینجا بازیکن باید با الگوریتم یادگیری ماشینی رقابت می‌کرد. این شد که بازی StockIT را ساختم.

برای پیاده‌سازی این پروژه تعدادی ویدیوی آموزشی در Scikit Learn و Pandas تماشا کردم. این دوره‌ها حاوی مباحث مختلفی در باب تکنیک‌های یادگیری ماشینی بود هدفم این بود که از تکنیک‌های پیشرفتۀ یادگیری ماشینی استفاده کنم؛ ولی متوجه شدم چنین کاری به دیتاستِ حجیم و وقت زیادی نیاز دارد که در زمان‌بندی من نمی‌گنجید.

به جای این کار از یک مدل خطی سادۀ رگرسیون استفاده کردم. فکر می‌کردم سخت‌ترین بخش همین قسمت باشد ولی اینطور نبود. استفاده از کتابخانه‌های D3 و Jive برای نمایش بصری داده‌ها روی نمودار در React سخت‌ترین قسمت بود. هر دو کتابخانه نیازمند کنترل DOM بودند. کتابخانه‌های دیگری نیز وجود داشت که هر دوی این کارها را انجام می‌داد ولی به نظرم برای این پروژۀ ساده خیلی اضافه و سنگین می‌آمدند. خلاصه از D3 برای تولید SVG و React برای هندل کردن عناصر DOM استفاده کردم که نتیجۀ کار رضایت‌بخش بود.

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

ماه ششم- ()jobSort و Job Hunt

بعد از StockIT سراغ انجام پروژۀ بعدی‌ام رفتم. تصمیم گرفتم سایتی برای نمایش آگهی استخدام درست کنم که گروه کوچکی از مشاغل در حوزۀ فناوری اطلاعات و برنامه‌نویسی را نمایش دهد. این آگهی‌ها از سایت‌هایی مثل Hacker News, Stack Overflow و گیت‌هاب جمع‌آوری می‌شد. می‌خواستم پروژه را طوری پیاده‌سازی کنم که کاربر بر اساس تکنولوژی‌های انتخاب شده مشاغل را مرتب کند.

مثلاً فرض کنید دنبال شغلی هستید که کارفرما به شخصی با مهارت JavaScript, React و/یا Python نیاز دارد. شما می‌خواهید مشاغلی را پیدا کنید که جاوا اسکریپت و React نیاز دارند ولی پایتون برایتان اهمیتی ندارد. به این ترتیب برنامه بر همین اساس نتایج را مرتب‌سازی کرده و بر حسب اولویت نشان می‌دهد.

برای انجام این پروژه به موانع زیادی برخورد کردم. بارها مجبور شدم دوره‌های آموزشی را تغییر دهم ولی نهایتاً چیزی که ساختم رضایت‌بخش بود. آخرین مهارت‌های من React/Node/Express/MySQL بود. بعد از اتمام ساخت پروژه آن را در ساب‌ردیتِ cscareerquestions قرار دادم و تا قبل از حذف شدن پست به ۶۵۰ بازدید رسید (طبق قوانین این ساب‌ردیت امکان قرار دادن پروژه‌های شخصی در آن وجود نداشت). محصول نهایی را می‌توانید در این لینک ببینید. مشکلات و ریفکتورهای اعمال شده هم در اینجا توضیح داده‌ام.

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

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

ماه هفتم – کاریابی و آشنایی با تستِ برنامه

در این ماه دستی به پروژه‌هایم کشیدم و برای چند جا رزومه ارسال کردم. کنارش می‌خواستم مبحث Testing و Redux را هم یاد بگیرم.

برای پروژۀ CodeClub.Social از flexbox استفاده کردم تا ریسپانسیو شود. همچنین UX سایتِ ()JobSort را برای موبایل بهینه‌سازی کردم. بعلاوه با کمک mocha/chai/enzyme به کدهای این پروژه تست هم اضافه کردم. یادگیری تست بسیار سخت بود و پوشش دادن ۱۰۰% کد کار آسانی نبود.

در پایانِ این ماه برای ۶۳ موقعیت شغلی رزومه اپلای کردم. این موضوع به من کمک می‌کرد تا ارزیابی منصفانه‌ای از عملکردم تا آن روز داشته باشم. همچنین با این کار متوجه می‌شدم که آیا رزومه/نمونه‌کارهایم به اندازۀ کافی خوب هستند یا نه. برای شروع در سه سایت Hacker News, Who is Hiring و Indeed رزومه ارسال کردم.

برای سایت هکر نیوز از پروژۀ خودم یعنی ()jobSort برای مرتب‌سازی و یافتن موقعیت‌های شغلی استفاده کردم. در سایت Indeed سعی کردم در شرکت‌های غیر نرم‌افزاری هم رزومه ارسال کنم تا ببینم آیا شانس گرفتن مصاحبه و تماس تلفنی را پیدا می‌کنم یا نه.

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

در همین ماه ۵ تماس تلفنی دریافت کردم؛ دو تا از شرکت‌های غیرنرم‌افزاری و سه تا از شرکت‌های نرم‌افزاری:

  • DevOps و تستر برای شرکت dotcom؛
  • تعدادی شرکت در حوزۀ آنالیز مواد غذایی؛
  • و یک استارتاپ بزرگ و موفق که به تازگی توسط شرکت بزرگی خریداری شده بود.

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

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

خیلی از افراد در سایت‌ها و فروم‌ها می‌گفتند که بسیاری از کارفرماها انتظار زیادی از یک جونیور دولوپر در شروع کار ندارند؛ همینکه از انگیزه و هیجان کافی برخوردار باشید کافی است. ولی چیزی که من در واقعیت از این سه تماس تلفنی فهمیدم زمین تا آسمان فرق داشت. اولاً هیچ کسی دنبال جونیور دولوپر نیست و دوماً همۀ آن‌ها انتظار دارند که از همان روزِ اول کاری بتوانید کارها را خودتان به‌تنهایی و درست انجام دهید.

از این تماس‌ها چند چیز مهم یاد گرفتم:

  • آنقدر خوب باشم که از همان روز اول بتوانم ارزشی به شرکت اضافه کنم؛
  • آنقدر اعتماد به نفس داشته باشم که بتوانم کارفرما را متقاعد کنم که من می‌توانم ارزشی به شرکت شما اضافه کنم.

ماه هشتم – شیفت شبانه، Redux, Open Source و مصاحبه

این ماه کمی کار در پالایشگاه زیاد شد. ۶ روز هفته را باید شیفت شب از ساعت ۵ بعد از ظهر تا ۵ صبح کار می‌کردم؛ یعنی ۱۲ ساعت کارِ مداوم! می‌دانستم که این ماه کار زیادی نمی‌توانم انجام دهم؛ از طرفی بیکار هم نمی‌توانستم بنشینم. به همین خاطر تصمیم گرفتم سایت ()jobSort را ریفکتور کردم تا از Redux استفاده کند و البته به اندازه‌ای که فکر می‌کردم سخت نبود. در مورد این فریم‌ورک خیلی جاها در پادکست‌ها و بلاگ‌ها صحبت می‌شد و منتظر فرصتی بودم که در پروژه از آن استفاده کنم.

جریان داده‌ها (flow of data) در Redux بسیار جالب است. برایم عجیب است چطور بعضی‌ها از این کتابخانه ایراد می‌گیرند. فکر نمی‌کنم در جایگاهی باشم که بخواهم در این باره قضاوت کنم ولی به شخصه عاشقِ الگوی reducer اش هستم.

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

شروع کردم به خواندن مستندات و تحلیل کدبیس پروژه. تمام issueها و Pull Request ها را بررسی کردم. خواندن مستندات ریَکت تمرین خوبی بود و به درستی از پسِ این کار برآمدم. ولی خیلی زود متوجه شدم که این پروژه issue های خوبی ندارد و خیلی سریع برداشته می‌شوند.

در یکی از میتاپ‌ها دوستی به اسمِ آنتونی ان جی به من توصیه کرد در پروژۀ دیگری به اسم Downshift مشارکت کنم. این پروژه یک کتابخانۀ autocomplete از کنت سی دادس بود که وضعیت بهتری داشت. تعداد collaboratorهایش کمتر بود، کدهای آسان‌تری داشت، maintainer خوبی داشت و کدهای تمیز و شسته‌رفته‌تری داشت و از همه مهم‌تر دارای issueهایی بود که قبلاً در پروژۀ ()jobSort تجربه کرده بودم.

در نیمه‌های همین ماه ایمیلی از یکی از همان شرکت‌هایی که ماهِ گذشته رزومه اپلای کرده بودم برایم آمد. آن‌ها دو تماس تصویری از طریق تلفن با من برقرار کردند و جالب اینکه دنبال تکنولوژی‌هایی بودند که من آن‌ها را یاد گرفته بودم: React, Redux و D3. طی این تماس درمورد پروژۀ خودم با آن‌ها صحبت کردم و اینکه اساساً چرا تصمیم به انجام این کارها گرفتم. سپس از من درخواست یک مصاحبۀ حضوری را کردند. این اولین مصاحبۀ حضوری من بود.

به هیچ عنوان آمادگی لازم برای مصاحبه نداشتم و با تصورِ اینکه آن موقعیت شغلی را از دست خواهم داد به مصاحبه رفتم. حتی با اینکه چند ساعتی را از هم خوابم زدم ولی باز هم به آن آمادگی لازم که مد نظرم بود نرسیدم. خوشبختانه بخش فنی قرار بود به صورت برنامه‌نویسی دو نفره یعنی Pair Programming انجام شود. چالش ساده‌ای بود ولی استرس داشتم.

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

چون دیگر مطمئن بودم فاتحۀ مصاحبه را خواندم برای بقیۀ مصاحبه ریلکس بودم. نهایتاً مصاحبه تمام شد و با بالاگرفتنِ سر آنجا را ترک کردم. تجربۀ بسیار بدی بود ولی درس‌های خوبی از آن گرفتم و البته بهترین قسمت ماجرا اولین پیشنهاد شغلی بود.

ماه نهم – پیشنهاد شغلی

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

چند پیشنهاد

در پایان چند پیشنهاد می‌کنم به افرادی که دنبال تغییر شغل هستند:

  1. چیزهایی پیدا کنید که به شما انگیزه می‌دهد و از آن‌ها برای پیشرفت بهتر استفاده کنید. برای من تیک خوردن چک لیست‌ها، مستند کردن پیشرفت‌ها و تعامل با کامیونیتی‌های مختلف برنامه‌نویسی انگیزه‌بخش بود. وقتی انگیزه‌ برای ادامه نداشته باشید کارتان هیچ‌وقت به پایان نمی‌رسد؛
  2. هدف‌گذاری کنید. به اعتقاد من شما باید اهداف ماهانه و حتی روزانه برای کارهای خود تعریف کنید. اهداف ماهانه برای اینکه بفهمید در مسیر درستی حرکت می‌کنید و اهداف روزانه برای اینکه پیشرفت‌های روزانۀ خود را مشاهده کنید. استراتژی خودم این بود که هر شب قبل از خواب هدف فردا را تعیین می‌کردم. با این کار روز بعد با برنامه از خواب بلند می‌شوید و کارهای غیرضروری انجام نمی‌دهید. این روش به شما کمک می‌کند تا دستاوردهای هر روز را لمس کنید؛
  3. پیش از احساس آمادگی، در میتاپ‌ها شرکت کنید. رفتن به میتاپی که هیچ تخصصی در آن ندارید شاید ترسناک باشد؛ ولی به شما قول می‌دهم که در این گردهمایی‌ها کسی به دنبال تمسخر شما نیست. همه دوست دارند به همدیگر کمک کنند. شاید افرادی دوست نداشته باشند با شما صحبت کنند که تعدادشان بسیار اندک است و در کلیت حضور در این جمع‌ها تأثیری ندارد. فایدۀ دیگر میتاپ علاقۀ اعضا به اشتراک ایده‌ها و پیشنهادات است (شبیه همین کاری که من دارم انجام می‌دهم)؛
  4. پیش از احساس آمادگی، در پروژه‌های متن‌باز مشارکت کنید. در شروع کدنویسی شاید گیت‌هاب را محیطی وحشتناک قلمداد کنید که هیچ وقت سراغ آن نخواهید رفت. اما این سایت محل بسیاری خوبی برای افراد مبتدی و پیدا کردن کدهای نمونه و حتی در معرض بررسی قرار دادن کدهای خودتان است؛
  5. پیش از احساس آمادگی، برای شرکت‌ها رزومه اپلای کنید. یک قاعدۀ کلی وجود دارد که هیچ‌وقت برای اپلای کردن رزومه احساس آمادگی نخواهید کرد. پس همین الان با همین چیزهایی که بلدید شروع کنید. البته دیوانه نشوید و یکباره برای ۳۰۰ شرکت درخواست ارسال نکنید. بهترین راه برای اینکه بفهمید برای بازار هدف نیاز به یادگرفتن چه چیزهایی دارید همین اپلای کردن رزومه و تستِ بازار هدف است.

حالا برگردید سروقت کدنویسی‌تان!

منبع: مدیوم

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *