چند روز پیش توجهام جلب رشته توئیتی شد که در آن افراد به دنبال دستیابی به تعریفی از برنامهنویس ارشد و یا سنیور بودند. این پست تلاش من است برای مرتبسازی ذهنم در خصوص این معنا.
برای من قاعده 10xEngineer مهمترین عامل در تعریف یک برنامهنویس و یا مهندس ارشد است. فرض کنید هر برنامهنویس به صورت متوسط X واحد ارزش تولید میکند. برنامهنویس ارشد در سازمان کسی است که ۱۰ برابر و یا بیشتر از این مقدار ارزش تولید کند. هر قابلیت و یا توانایی که در این راستا نباشد، هر چقدر هم که جذاب باشد فرد را به سمت ارشد بودن حرکت نمیدهد.
مهارت آیندهنگری و جهتدهی به مسیر پروژه
به نظرم این مهارت مهمترین رکن تعریف یک برنامهنویس ارشد است. بسیار پیش میآید که تیم باید در خصوص مسالهای تصمیم بگیرد که تاثیر طولانی مدتی در آینده و موفقیت تیم دارد. مثلا از چه تکنولوژیای استفاده شود؟ یک تکنولوژی جدید با قابلیتهای جذاب فراوان؟ و یا تکنولوژیای که دانش فنی عمیقی حول آن در تیم وجود دارد؟ تمرکز بر سرعت تولید کد و یا بر بالا نگهداشتن کیفیت کد؟ تمرکز بر پیادهسازی قابلیتهای جدید و یا بهینهسازی/بازنویسی (refactoring) قسمتهای قدیمی سیستم؟ انتخاب بین طراحیهای مختلف؟ و دهها سوال و تصمیم دیگر که نیاز به تصمیمگیری دارند و گاه داده کافی برای تصمیمگیری داده-محور هم موجود نیست.
مهارتهای برنامهنویسی
به هر حال برنامهنویس کارش تولید کد است. بسیاری از مواردی که در این پست به آنها اشاره میشود نیاز به توانایی و تجربه کدزدن و برنامهنویسی دارد. بدون وجود چنین تجربهای به سختی میتوان به آنها جامه عمل پوشاند. با رشد یک برنامهنویس در سازمان و افزایش مسئولیتهایش به تدریج زمان لازم برای کدزنی کمتر و کمتر پیش میآید. ولی همچنان نیاز به دانش عمیق در این حوزه باقی میماند. شناخت عمیق از زبان برنامهنویسی، کتابخانهها و متدهای تولید نرمافزار پیشنیاز بسیاری از موارد مطرح شده در این پست هستند. در کنار این کمتر کد زن، کد و طراحی سیستم افراد ارشد به سمت سهل ممتنع بودن میل میکند به نحوی که پیچیدهتری قسمتهای سیستم را میتوانند با سادهترین و روانترین روشها پیادهسازی کنند. این سادگی جایی برای سازمان، ارزش تولید میکند که سایر افراد تیم (با دانش محدود) امکان همکاری و ادامهدادن کار را پیدا میکنند.
دانش حوزه کاری
جدا از دانش در حوزه نرمافزار، امکان اثر بخشی بدون درک درست از ماهیت کسب و کار بسیار محدود میباشد. برای اثر بخشی و ارشد بودن نیاز به دستیابی به چنین درکی الزامی است. این درک و شناخت معمولا در تعامل با سایر تیمها و خصوصا در تعامل با مدیران محصول حاصل میشود. شناخت دقیق از محصول و حوزه کاری پیشنیاز هر گونه خلاقیت و ابداع در تیم میباشد. ابداع و خلاقیت بدون شناخت مانند ساختن دستگاه اژدهاکش خفن و بسیار نیرومندی است در سرزمینی که اژدهایی برای شکار ندارد. بارها دیدهام فردی بسیار قوی در حوزه نرمافزار (به اصطلاح خفن) که توانایی تعامل با مدیران محصول و سایر تیمها را نداشته و در نتیجه ناتوان از اثربخشی در سازمان بوده. چنین افرادی که متاسفانه کم هم نیستند، معمولا بسیار ناراضی بوده و به فرهنگ تیم و سازمان آسیب میزنند.
توانایی یادگیری بالا و نه همه چیز دانی
فضای تولید نرمافزار فضایی است پر هیاهو و پر تغییر. روزی نیست که برویم سر کار و شاهد ظهور یک تکنولوژی جدید و یا از دور خارج شدن یک تکنولوژی رایج نباشیم. روش مقابله با چنین فضایی طبیعتا یادگیری همه چیز نیست. نه وقت کافی برای آن وجود دارد و اگر هم وجود داشته باشد، آنوقت زمان کافی برای به کار بستن دانستههایمان نخواهیم داشت. از نشانههای ارشد شدن در چنین فضایی (با توجه به اصل 10xEngineer) دستیابی به تعادل در این خصوص است. همچنین به نظر من انسان میتواد یاد بگیرد که چگونه یاد بگیرد. اگر به این مهارت دست یافتید هر زمان لازم بود سریع میتوانید مهارت مورد نیازتان را یاد بگیرید و به کار ببندید.
مهارت در آموزش و آمادهسازی نیروهای جدید
حداقل دو جور میتوان در این قسمت تاثیر گذاشت.
یکم، افراد تازه وارد معمولا با انگیزه بالا ولی با دانش کم در خصوص محصول و کد-بیس تیم، به تیم وارد میشوند. هدایت این افراد به نحوی که در سریعترین زمان ممکن به بهروی بالا برسند، با انگیزه بمانند و بتوانند به صورت خودکفا برای تیم ارزش تولید کنند از تواناییهای مهم برای یک مهندس ارشد در تیم است.
دوم، مهندس ارشد تیم میتواند نقش بسیار مهمی در استخدام نیروهای جدید ایفا کند. مهندس ارشد با استفاده از دانش عمیق خود و درک صحیح از نیازهای تیم، باید بتواند تیم نیروی انسانی را در استخدام نیروی مناسب کمک کند.
توانایی در تمرکز و به نتیجه رساندن کار
این پست را با بیان اصل 10xEngineer شروع کردم. به کارگیری آنچه که در بالا گفتم نیاز به یک مهارت دیگر هم دارد، مهارت در تمرکز کردن و به سرانجام رساندن کار. یک نصیحت رایج که من بارها آن را دریافت کردهام و بارها آن را به دیگران کردهام این است که یک پروژه کوچک ولی لانچ شده بسیار مهمتر و مفیدتر از یک پروژه بسیار بزرگ ولی ناقص و بیسرانجام رها شدهاست.
چه چیزهایی به نظر من ربط چندانی به ارشد بودن ندارد
چیزهایی شبیه تعداد زبانهایی که بلد هستیم، سرعت تولد کد، سابقه حضور در تیم، سابقه کاری، سن و سال، جنسیت، تحصیلات و دها مورد دیگر. به عنوان مثال اجازه بدهید سرعت تولید کد را در نظر بگیریم. شما هر چقدر هم که سریع و خوب کد بزنید، نمیتوانید به اندازه کسی که با انتخاب تکنولوژی مناسب (مثلا با ۲ هفته مطالعه) سرعت تولید و کیفیت کد را برای ۱۰ نفر از هم تیمیهایش را برای ۳ سال آینده زیادتر کردهاست، رقابت کنید.
در پایان باید تاکید کنم تمام آنچه که در بالا نوشتم تجربه شخصی من میباشد و برگرفته از محیطهای کاری است که من در آنها رشد کردهام. امیدوارم من را از نقدهای خود بیبهره نگذارید.