مهندس نرم افزار باید به شکل T  باشد!

مهندس نرم افزار باید به شکل T باشد!

برخلاف چیزی که خیلی ها فکر می کنند، در سال 1401 مهندس نرم افزار یا Software Engineer بودن کار خیلی سختی شده است. مثلا اگر بخواهید یک Full-stack Developer قابل قبول باشید، نیاز است هم به Front-end و Back-end تسلط نسبی داشته باشید، هم راه ها و ابزارهایی را بشناسید که با استفاده از آنها کدهایی که نوشته اید را روی سرور Production منتقل کنید و مطمئن شوید همه چیز همانطور که می خواهید به دست کاربر نهایی برسد. یعنی لازم است بخشی از مهارت های یک کارشناس DevOps را داشته باشید. همچنین لازم است اطلاعات زیادی درباره ی ترفندهای مختلف داشته باشید که بهره وری شما را بالاتر می برد.

به طور خلاصه، شما باید خیلی چیزها را بدانید.

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

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

پس چگونه با این اختلاف کنار بیاییم؟!

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

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

مهندس نرم افزار به شکل T یعنی چی؟

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

در شکل بالا دو مسیر توضیح داده شده را مشاهده می کنید. مسیر افقی، مسیر Generalist شدن است و مسیر عمودی راه رسیدن به Specialist شدن را نشان میدهد.

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

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

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

فرض کنید سینا تصمیم گرفته است برنامه نویس Back-End وب باشد، و برای این موضوع هم با فریمورک Laravel به خوبی کار می کند و می داند برای این که یک Middleware تعریف کند چه کارهایی را باید انجام بدهد و حتی به خوبی می داند Middleware چه کاری انجام می دهد. تا اینجای کار در خط افقی برنامه نویسی وب قدم می زند و پیشرفت هم می کند. حالا فرض کنید به سینا گفته می شود که یکی از Middleware ها به خوبی کار نمی کند. او نیاز دارد برای حل این موضوع بداند Middleware چگونه کار می کند و در زبان پایه ی فریمورک که PHP است، این ویژگی فریمورک چطور کار می کند و برای حل مشکلات اساسی تر هم نیاز دارد بداند PHP با موتور Zend چه ارتباطی دارد و بعضی از مواقع ممکن است برای حل مشکلاتی  نیاز داشته باشد بداند Zend Engine چه تعاملی با Daemon های لینوکس نصب شده برروی سرور دارد. و اینقدر لازم است به صورت عمودی، سینا زمین کارش را بکند و پایین برود که به نفت برسد!!!

در مثال بالا من یکی از پر استفاده ترین و بیزینسی ترین Technology Stack ها را مثال زدم. حالا فرض کنید قرار باشد کارهای خفن تری انجام دهد.

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

یکی از راههای طولانی کردن پایه ی T در حوزه ی تخصص تان، این است که نسبت به هر X ای (منظورم هر تکنیک، ابزار، قابلیت و ... است) که در کارتان می بینید، یک سوال از خودتان بپرسید و برای حل آن تمام تلاشتان را بکنید:

X چطور کار می کند؟

حالا شما به جای X می توانید چیزهای مختلفی قرار بدهید. مثلا در مثال بالا می توانیم این سوالات را از خودمان بپرسیم:

  • Middleware چطور کار می کند؟
  • PHP چطور روی سرور کار می کند؟
  • Zend Engine چطور کار می کند؟
  • Apache چطور کار می کند؟ (مثلا به این نتیجه رسیدم که apache درحال مدیریت کردن سرور است)
  • Apache برروی لینوکس چطور کار میکند؟
  • لینوکس چطور کار می کند؟
  • ...

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

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

در آخر چند پیشنهاد برای بلند کردن پایه ی T می خواهم بهت بدهم:

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

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

1- وبلاگ بخوانید:

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

2- پادکست گوش بدهید:

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

3- برای خودتان پروژه های آزمایشی تعریف کنید:

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

4- کدهای حرفه ای بخوانید:

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

5- در چالش ها و مسابقه های برنامه نویسی شرکت کنید:

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

6- خودتان را در مباحث پایه ای (Fundamental) تقویت کنید:

بعضی از افراد فکر می کنند می توانند از مباحث Fundamental فرار کنند. ولی برای حرفه ای شدن داشتن دانش پایه ای برروی مباحثی مثلا Data Structure، Algorithms و ... بسیار مهم است

.

در ادامه پیشنهاد می کنم مقاله ی "چگونه به تنهایی شروع به یادگیری برنامه نویسی کنیم؟" را بخوانید.

امیدوارم روی پایه ی محترم T تان هم وقت صرف کنید و هرروز حرفه ای تر از دیروز بشوید.