پاسخ به نامه وارده: برنامه شغلی

یک نامه وارده داشتم از R.M که از من خواسته نظرم رو در مورد تکنولوژی‌هایی که یاد گرفتن آنها سودمنده و به درآمد بهتر منجر می‌شه بنویسم. سوال خیلی کلیه و من هم تصمیم گرفتم یک جواب کلی براش بنویسم!

سوال اینه:

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

من این سوال رو به چند بخش می‌شکنم و جوابم رو می‌نویسم:

  1. چطور برنامه‌نویس بهتری بشم؟
  2. چطور درآمدم رو بیشتر کنم؟
  3. چه حوزه‌ای آینده بهتری داره؟

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

تحلیل سوال

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

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

چه حوزه‌ای آینده بهتری داره؟

موارد زیر این روزها مطرح هستند و به گمانم همچنان گسترش پیدا می‌کنند:

  • دیتا ساینس
  • تشخیص گفتار
  • کریپتوکارنسی
  • سنسورها و اینترنت چیزها
  • واقعیت مجازی
  • ماشین‌های خودران
  • درون‌های هوشمند

حوزه‌های بالا به شدت وابسته به پیشرفت در حوزه‌های زیر هستند:

  • یادگیری ماشین
  • پردازش تصویر
  • بلاک‌چین

یادگیری ماشین

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

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

در این حوزه پایتون زبان بسیار محبوبی است و ابزارهای بسیار خوبی برای یادگیری ماشین و تحلیل داده‌ها و به تصویر کشیدن اونها بوجود اومده که بهش Python Data Science Stack گفته می‌شه. از مهمترین این برنامه‌ها:

  • numpy
  • jupyter
  • pandas
  • matplotlib
  • scikit-learn
  • tensorflow

پردازش تصویر

مهمترین حوزه‌ای که امروز از پردازش تصویر استفاده می‌کنه ماشین‌های خودکار و درون‌های هوشمند هستند. مطمئنا موارد دیگری هست که به ذهن شما می‌رسه ولی به ذهن من نرسیده. مهمه بدونیم که برای پردازش تصویر هم امروز به شدت از تکنیک‌های یادگیری ماشین استفاده می‌شه. مثلا برای تشخیص اشیاء. یعنی ترکیبی از تکنیک‌های سنتی پردازش تصویر و الگوریتم‌های یادگیری ماشین برای مسائل این حوزه استفاده می‌شه. یکی از مهمترین برنامه‌هایی که برای پردازش صرف تصاویر بکار می‌ره OpenCV است.

بلاک‌چین

سال ۲۰۱۷ رو سال انفجار یادگیری ماشین می‌گفتند، سال ۲۰۱۸ رو باید سال انفجار ایده‌های مبتنی بر بلاک‌چین دونست. بلاک‌چین برای اولین بار با بیت‌کوین متولد شد. در این روش به کمک تکنیک‌های رمزنگاری و برنامه‌نویسی نامتمرکز می‌شه برنامه‌هایی ساخت که نیاز به سرور مرکزی ندارند و غیرقابل توقف هستند. هدف بیت‌کوین گریز از کنترل دولت‌ها و بی‌نیازی از بانک‌ها بود. اما امروزه کاربردهای بلاک‌چین فراتر از این موضوعه و روزی نیست که یک شرکت خدمتی جدید رو روی بلاک‌چین ارائه نکنه.

برای فهم بهتر بلاک‌چین در مورد موضوعات زیر باید دونست:

  • Cryptography
  • Bitcoin
  • Ethereum

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

اینترنت چیزها

اینترنت چیزها دنیای رو به رشدی است. باید یاد گرفت چطور با تجهیزاتی با توان پردازشی کم کار کرد. امکان استفاده از برنامه‌ها و فریم‌ورک‌های سنگین وجود ندارد. گاها باید مستقیم برای سخت‌افزار برنامه نوشت. باید با سنسورهای مختلف کار کرد. به اصطلاح به آن برنامه‌نویسی توکار یا embedded هم می‌گویند. در ایجاد خانه‌های هوشمند و کارخانه‌های هوشمند به شدت به کار می‌رود. در اروپا حرکتی است بنام Industry 4.0 و Smart Homes که هر دو رابطه تنگاتنگی با همین موضوع دارند. شرکت‌های توزیع انرژی نیز به واسطه شبکه‌های گسترده‌شان هر کدام مشغول سرمایه‌گذاری روی روش‌هایی برای جمع‌آوری داده سنسورها و ایجاد راه‌حل‌های جدید هستند. دنیای بزرگی است که من سررشته زیادی در آن ندارم.

چطور درآمدم رو بیشتر کنم؟

من هیچوقت استعدادی تو پول درآوردن نداشتم بنابراین مشاور بدی در این زمینه هستم! ولی تلاشم رو می‌کنم.

برای درآمد در حوزه تکنلوژی دو راه به فکرم می‌رسه:

  1. تاسیس یک شرکت دانش بنیان
  2. کار در یک شرکت دانش بنیان

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

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

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

در ادامه در مورد اهمیت مهارتهای فنی در موفقیت شغلی و اقتصادی می‌نویسم ولی پیش از آن باید اشاره کنم که یک پلن شغلی در کسب درآمد نقش مهمی داره.

پلن شغلی

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

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

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

از کارتون لذت ببرید

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

نرخ خودتون رو بدونید

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

یک رزومه یک صفحه‌ای داشته باشید

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

هدف شغلی داشته باشید

مسیری که ما طی می‌کنیم و تجربه روزمره ما مهمتر از رسیدن یا نرسیدن به یک هدفه. موکول کردن رضایت درون به رسیدن به یک «هدف» از نظر من کاریست نادرست و ضامن نارضایتی دائمی درون. ولی این باعث نمی‌شه که هدف نداشت، بویژه در زمینه شغلی. اگر دوست داریم تیم‌لیدر باشیم یا CTO باید برای رسیدن به اون جایگاه یک برنامه گام به گام داشته باشیم. در انگلیسی بهش Goals and Objectives گفته می‌شه. پیشنیاز رسیدن به هر هدفی محقق شدن آبجکتیوهای مختلف است. مثلا برای تیم‌لیدر شدن ممکنه نیاز به تقویت مهارت فنی و همینطور مهارت کلامی داشته باشیم. ممکنه به مطالعه روزانه یا گذراندن یک کلاس آموزشی خاص نیاز داشته باشیم. بنابراین هدف و آبجکتیوها رو باید تعریف کنیم و برنامه‌ای عملی برای تحقق اوها داشته باشیم.

مهارتهای غیرفنی رو تقویت کنید

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

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

از دوره‌های آموزشی غافل نشوید

بدونید که هیچ کدام از ما مادرزاد متخصص متولد نمی‌شیم. آموزش با مدرسه و دانشگاه تمام نمی‌شه. باید که برنامه‌ای برای آموزش دائمی داشته باشیم. اگر به گذراندن کلاسی نیاز هست باید «سرمایه‌گذاری»‌ کرد. وقت و پولی که صرف یادگرفتن مهارت‌های مهم مثل زبان انگلیسی می‌شه به سادگی جبران می‌شه. بنابراین در شرکت در برنامه‌های آموزش تکمیلی و از همه مهمتر خرید کتاب شک نکنید!

تقلا برای بهبود

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

چطور برنامه‌نویس بهتری بشوم؟

واو! از اینکه تا اینجا مطلب رو خوندی خیلی خوشحالم چون تازه رسیدیم به سوال مورد علاقه من!

جواب ناامید کننده: کار سختیه!

جواب امیدوار کننده: بقیه تونستند شما هم می‌تونید!

توضیح ضروری: من هم مشغول تمرینم!

برنامه‌نویس بهتر رو هر کسی می‌تونه به دلخواه خودش تعریف کنه، من هم اینجا به سنت چهاردیواری اختیاری به شیوه خودم تعریفش می‌کنم! :)

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

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

بدانیم دنبال چه هستیم و دنبال چه نیستیم

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

دانستن اینه چه چیزی «هستم» و چه چیزی «نیستم» مانند یک قطب‌نما در یک دریای طوفانی است. برای انتخاب مسیر به آن نیاز دارم. برای انتخاب تکنولوژی، شغل و مانند اینها همواره به آن مراجعه می‌کنم. اگر جوابی برای سوال نداشته باشیم دچار یک نوع بحران هویت فنی هستیم. مهم است که جواب این سوال را بدانیم و با جواب خودمان خوشنود باشیم. مهم نیست دیگران چه فکر می‌کنند.

پلن فنی

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

عادت کردن به مطالعه فراوان و دائمی

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

خودتون رو به یک آسیاب غول‌پیکر تبدیل کنید که همینطور اطلاعات و ایده‌ها رو می‌مکه داخل و پودرشون می‌کنه! :)

نوشتن پروژه‌های شخصی

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

راه‌اندازی یک وبسایت شخصی

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

تقویت مهارت‌های پایه

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

زبان برنامه‌نویسی

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

اگر از نوشتن if/else پرهیز کنید رستگار می‌شوید!

یک زبان فانکشنال یاد بگیرید

اگر با پرهیز از نوشتن if/else رستگار نشدین حتما با یادگرفتن یک زبان فانکشنال مثل Clojure رستگار می‌شوید! از پرانتزها هم نترسید! :)

سیستم عامل

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

تقویت مهارت‌های دیزاین

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

همه کاره‌ی هیچ‌کاره

همه‌کاره بودن اشکالی نداره، در حقیقت ما گروهی از برنامه‌نویس‌ها داریم که به جنرالیست معروف هستند. اما اگر جنرالیست هستیم حداقل باید در مهارت‌های پایه و دست کم یک زبان برنامه‌نویسی مهارت داشته باشیم. همه کاره هیچ‌کاره بودن یعنی اینکه فهمی سطحی از یک زبان داشته باشی بدون اینکه مکانیزم درونی آن را بشناسی و نقاط قوت و ضعف آن را بدانی و فقط به زور StackOverflow برنامه بنویسی! :)

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

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

حرف آخر

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