مهندسی نرمافزار بیش از «برنامهنویس بودن» است و اگرچه گرایشی تخصصی به نام «گرایش نرمافزار» در رشته کامپیوتر در ایران وجود دارد، تعداد کمی از دانشگاهها این نکته را برای دانشآموختگان جا میاندازند. یک کارشناس موفق در رشته نرمافزار، مجموعهای از مهارتهای فنی و انسانی را با هم دارد. او چه در برنامهنویسی نرمافزارهای دسکتاپ (مثل نرمافزارهای مالی)، چه در دنیای وب یا موبایل و چه در سایر رشتهها مانند بازیهای کامپیوتر، باید خصوصیات زیر را حتما داشته باشد تا بتوان او را شایسته عنوان «کارشناس نرمافزار» دانست.
فرصت تحصیل در دانشگاه زمان خیلی خوبی است که هر دانشجو وضعیت خود را نسبت به این موارد بسنجد و برای رفع کمبودها تصمیم بگیرد. همچنین اگر نوع سیستم آموزشی دانشگاه باعث سوءتفاهم در فهم بعضی از این موارد شده باشد (مثلا خبر داشتن از فناوری کاربردی، نه موضوع پژوهشی روز) کارجو میتواند بهسرعت روش خود را اصلاح کند و شانس موفقیت خود را بالا ببرد. در ادامه این موارد را مرور میکنیم.
1. روی یک شاخه تخصصی متمرکز است و مهارت دارد
وقتی رزومه بعضی از افراد را نگاه میکنید، چنین به نظر میرسد که در حوزه وسیعی از فنون و گرایشهای تخصصی مهارت و تجربه دارند، اما در بازار کار بهویژه کارهای حرفهای و با درآمد بالاتر، معمولا این حالت «آچار فرانسه» همه کاره و هیچ کاره تلقی میشود. این یعنی فرد موردنظر روی هیچ زمینه تخصصی تمرکز نکرده و مهارت او در سطح بالا و قابلاتکا نیست. البته ممکن است، بعضی افراد که یک دهه یا بیشتر
در بازار آی تی کار کردهاند و دانش و تجربه بالایی دارند، واقعا در بیش از یک گرایش مهارت داشته باشند ولی حتی در این حالت هم بعید است تعداد گرایشهای تخصصی بیشتر از دو یا سه گرایش باشد. این افراد معمولا دو یا سه رزومه تخصصی دارند و همه هنر و مهارت خود را در یک رزومه واحد نمیریزند.
در اینجا لازم است مشخص کنیم منظورمان از گرایش تخصصی در
مهندسی نرمافزار چیست؟ موارد زیر نمونههایی از گرایشهای تخصصی اصلی در مهندسی نرمافزار هستند. مثالهایی از گرایشهای فرعی هر شاخه اصلی داخل پرانتز ذکر شده است. حتی وجود بیش از دو یا سه گرایش فرعی در یک رزومه هم عجیب است تا چه برسد به چند گرایش اصلی متفاوت.
• برنامهنویسی وب Back-end (جاوا، PHP، ASP.NET، API مخصوص یک CMS مانند دروپال یا وردپرس، کلاود آمازون و مایکروسافت و غیره).
• برنامهنویسی وب Front-end ) HTML5، جاوا اسکریپت، CSS، jQuery، REST، AngularJS، ReactJS و NodeJS)
• برنامهنویسی موبایل (Android، iOS، Cordova، Ionic و ...)
• برنامهنویسی دیتابیس (MySQL، MS SQL، Oracle و ...)
• برنامهنویسی دیتابیس از نوع NoSQL ،MongoDB )Cassandra و ...)
• برنامهنویسی بازیهای کامپیوتری (دو بعدی، سهبعدی، موبایل، دسکتاپ، پلیاستیشن، اکس باکس و غیره)
• برنامهنویسی سیستمهای مدیریت مالی یا بانکی
• برنامهنویسی سیستمهای مدیریت سازمانی( ERP، MIS، SCM، CRM BPM و غیره).
2. از فناوری کاربردی روز در شاخه تخصصی خود باخبر است
در محافل دانشگاه «بهروز بودن» یعنی اطلاع از جدیدترین پژوهشها برتری محسوب میشود؛ درحالیکه در
بازار کار بسیاری از این فناوریها هنوز صنعتی نشدهاند و دانستنشان چندان مزیت محسوب نمیشود و برتری اطلاع از جدیدترین «فناوریهای کاربردی» است. مثلا در دنیای برنامهنویسی ASP.NET فناوری جدید و کاربردی MVC و Core نام دارد و کسانی که این فناوریها را هنوز یاد نگرفتهاند، از جدیدترینها عقب افتادهاند. فناوریهای وب معمولا هر دو تا پنج سال بهکلی دگرگون میشوند. فناوریهای موبایل هر شش ماه تا دو سال تغییر میکنند. بنابراین کار برنامهنویسان موبایل برای بهروز نگهداشتن خویش خیلی دشوارتر از برنامهنویسان وب است و به همین ترتیب، از نظر سرعت تغییر و تحول، کار برنامهنویسان وب از برنامهنویسان دسکتاپ و دیگر فرمهای تولید نرمافزار دشوارتر است. بههرحال، آنچه مهم است باور این موضوع است که بهروز بودن یک ضرورت محسوب میشود.
مطلب پیشنهادی
برنامهنویسان از شنیدن چه جملاتی بیزار هستند؟
3. روش آموختن و مطالعه خود را شناسایی کرده است
بعدازاینکه توجیه شدیم که باید بهطور مرتب دانشمان را بهروز کنیم، پرسش این است که چگونه؟ در این مرحله بسیاری از افراد کمتجربه دچار سرگیجه و بلاتکلیفی هستند. دنیای بازار کار و صنعت آیتی برخلاف دانشگاه و خانواده به جوانان نمیگوید چطور یاد بگیرند و از کجا شروع کنند. افرادی که در تمام طول عمرشان بهغیراز روشهای اجباری، هیچ روش دیگری برای آموختن مطالب جدید بلد نیستند، در این مرحله دچار مشکل میشوند. برنامهنویسان و مهندسان حرفهای نهتنها اهل مطالعه هستند، بلکه میدانند با توجه به روحیات و خلقوخویشان با چه نوع فرآیند یادگیری راحتترند. در اینجا یک فهرست کوچک و مختصر از انواع روشهای آموختن را آوردهایم. (بحث مفصلتر در این زمینه را در شمارههای آتی ماهنامه شبکه بخوانید.)
• آموختن از طریق شرکت در دوره (کلاس) آموزشی
• آموختن از طریق کارآموزی (کار رایگان یا حقوق ناچیز)
• آموختن از طریق خودآموزی با کتاب
• آموختن از طریق خودآموزی با دوره آموزشی ویدیویی
• آموختن از طریق شرکت در سمینار آموزشی
• آموختن از طریق کارکردن روی مثالهای قابل دانلود از روی اینترنت
• آموختن از طریق معلم خصوصی
4. کدنویسی بهینه با دیتابیس را بلد است
به تجربه ثابتشده، بیشتر برنامهنویسان کمتجربه و غیرحرفهای در کدنویسی برای کار با دیتابیس ناشیگری میکنند. کدهای آنها بسیار ابتدایی و سادهانگارانه است و برای کار با حجم بزرگی از دیتاها آماده نیست. آنها حتی نمیدانند برنامههایشان چنین مشکلی دارند و نمیدانند چطور باید کدهای بهتر و بهینهتری بنویسند. برعکس، برنامهنویسان حرفهای همیشه از همان خط اول برنامه، طوری برنامهریزی میکنند که نرمافزارشان بتواند بهراحتی با حجم بزرگی از دادههای دیتابیس کار کند، بدون اینکه کند شود یا هنگ کند. آنان حتی ابزارهایی دارند که میتوانند به کمک آنها دیتابیس یک نرمافزار نمونه را با انبوهی از دادههای آزمایشی و تستی پر کنند تا سیستم را زیر فشار بگذارند و عملکرد نرمافزار را زیر فشار بررسی کنند. مثلا برنامهنویسان حرفهای وب، همیشه طوری کار میکنند که در صورت استقبال کاربران وبسایت زیر فشار بازدیدکنندگان نخوابد یا هنگ نکند. تکنیکهای پیشرفته و جدیدی نیز (مثل مقیاسپذیری و استفاده از کلاود) به بازار آمدهاند که به وبسایتها امکان میدهند قدرت خود را چند برابر کنند.
5.خود راهانداز است
برنامهنویسان و به تبع آن، مهندسان نرمافزار افرادی خود راهانداز هستند. خودراهاندازی یکی از ویژگیهای پنهان و مهم این کارشناسان است که اغلب اوقات دستکم گرفته میشود. خودراهاندازی نوعی از خوداتکایی است که فرد هنگام روبهرو شدن با یک چالش جدید، خودش راهحل را کشف میکند و همان راهحل را دنبال میکند.
مثلا این سناریو را در نظر بگیرید. یک برنامهنویس وب که به کار کردن روی محیط ویندوز عادت دارد ناچار میشود برای انجام یک پروژه بهخصوص سراغ سیستمعامل لینوکس برود (مثلا فرض کنید که او باید مجموعه نرمافزارهای موسوم به LAMP را نصب کند) اما نه لینوکس بلد است نه با بقیه نرمافزارهایی که باید نصب کند (از قبیل PHP و MySQL) آشنایی دارد. اما بههرحال نخستین مشکل او نصب ویندوز است. او ابتدا باید بداند چه نوع و چه نسخهای از لینوکس را باید دقیقا نصب کند. سپس تحقیق کند برای نصب آن نسخه بهخصوص چه مراحلی را باید انجام دهد.
به احتمال زیاد این کارشناس باید جستوجوهایی را روی اینترنت انجام دهد و مقالههایی بخواند یا چند ویدیو روی یوتیوب یا هر سایت ویدیویی دیگر نگاه کند تا روش کار را یاد بگیرد. سپس باید تصمیم بگیرد که چطور میتواند هم سیستمعامل خود را حفظ کند و هم کنار آن یک لینوکس نصب کند. اما ممکن است حین تحقیق روی این موضوع کشف کند که یک روش برای انجام این کار استفاده از
Virtual Machine است. حالا باید تحقیق کند چه نوع
Virtual Machine هایی را میتواند استفاده کند و نحوه نصب آنها چگونه است. احتمالا باید دو سه مطلب هم درباره نصب آن نسخه بهخصوص از لینوکس روی آن ماشین مجازی بهخصوص بخواند. بعدازاینکه پاسخ همه این سوالات را پیدا کرد، تازه باید دست بهکار شود و نرمافزارهای مورد نظر را دانلود کند. بعضی از این نرمافزارها ممکن است رایگان نباشند، پس باید برای خرید آنها اقدام کند. بعد از کنار هم گذاشتن همه قطعات پازل، حالا باید سیستمعامل لینوکس موردنظر را نصب و راهاندازی کند. بهاحتمال، حین کار با مشکلات و سوالهایی روبهرو میشود که جوابش را نمیداند و اینها را باید با تحقیق بیشتر روی اینترنت بیابد. شاید حتی لازم باشد کتابی بخرد و چیزهایی را از کتاب یاد بگیرد.
حالا تصور کنید دارید با یک دوربین مخفی این فرد را تماشا میکنید. چطور او را قضاوت میکنید؟ او ابتدا که شروع به کار کرد حتی نمیدانست با چه موانع و سوالاتی ممکن است روبهرو شود، اما برای عبور از این موانع یک استراتژی دارد. هرجا که چیزی را بلد نیست، میداند چطور میتواند سوال کند و جوابش را بگیرد. در تمام طول این مسیر او خودانگیخته و خودراهنما است.
6. با مدیریت پروژه آشنا است
یک مهندس نرمافزار باهوش، با اصول و مراحل مدیریت پروژه آشناست، حتی اگر خودش نقش عمدهای در مدیریت یک پروژه نداشته باشد. اهمیت و ارزش این آگاهی به دو دلیل است. نخست اینکه بسیاری از اوقات برنامهنویس نیاز دارد به همتیمیهای خود در زنجیره و خط تولید نرمافزار (وبسایت یا اپلیکیشن) کمک کند و این مستلزم رفتوبرگشتهای متعدد یک قسمت یا نرمافزار به نفر قبلی یا بعدی در زنجیره تولید است. مثلا یک قسمت از وبسایت در حال ساخت، ممکن است چند بار بین برنامهنویس Frontend و Backend دستبهدست شود تا به نتیجه برسد. دستکم یکی از این دو باید نسبت به چنین احتمالی آگاه باشند و هنگامیکه تخمینی از مدتزمان لازم برای انجام آن قسمت از کار به مدیر خود ارائه میدهند، زمان لازم را برای این رفتوبرگشتها در نظر بگیرند. در حقیقت، یکی از نخستین تجربههای یک برنامهنویس در زندگی شغلیاش اهمیت «توانایی در تخمین زدن» مدتزمان انجام یک کار است. تخمین منابع موردنیاز برای انجام یک پروژه بخشی از فرآیند مدیریت پروژه است. آشنایی برنامهنویس با هر یک از دیگر اجزای فرآیند مدیریت پروژه به او کمک میکند تا برنامهنویس موفقتری باشد.
گذشته از این، این روزها بهتدریج روش کلاسیک «مدل آبشاری» در مدیریت پروژه منسوخ میشود و جای خود را به شیوه مدرن و جاافتادهتر Agile میدهد. برنامهنویسان حرفهای گاهی مجبور میشوند در دورههای آموزشی اجایل (و اسکرام) آموزش ببینند و شیوههای مدرن همکاری و برنامهنویسی تیمی را بیاموزند. موفقیت در این زمینه نیز مستلزم داشتن حداقلی از بینش مدیریتی در فرآیند پروژه مهندسی نرمافزار است.
مطلب پیشنهادی
دو مفهوم در ظاهر یکسان، اما در باطن متفاوت
7. مدیریت سورس کد بلد است
سرانجام، یک برنامهنویس یا مهندس موفق نرمافزار به مدیریت سورس کد یک پروژه نرمافزاری مسلط است. مدیریت سورس کد برای یک پروژه جدی اهمیت حیاتی دارد. همه برنامهنویسان در طول کارشان ممکن است مرتکب اشتباه شوند. بدون مدیریت صحیح سورس کد امکان بازگرداندن پروژه از مسیر اشتباهی که رفته بسیار دشوار خواهد بود. مدیریت سورس کد بهویژه در پروژههای تیمی بسیار حیاتی است. هیچ عضوی از تیم نمیخواهد و نباید کار یک برنامهنویس دیگر را خراب کند یا سهوا آسیب بزند. همچنین استفاده از فرآیند مدیریت سورس کد کمک میکند یک تاریخچه دقیق از جزییترین کارهایی که روی نرمافزار در حال تولید انجامشده ثبت شود. بعد ممکن است بسیاری از جزییات فراموش شوند اما سیستم مدیریت سورس کد بهخوبی همه تغییرات جزیی را ثبت کرده و میتوان هم در فرآیند مدیریت پروژه و هم در تصحیح اشتباهها یا حتی اندازهگیری مدتزمان واقعی که صرف انجام یک کار جزیی شده، به آن استناد کرد.
امروزه، حتی بعضی برنامهنویسان منفرد (اما زرنگ) هم از سیستم مدیریت سورس کد استفاده میکنند تا بتوانند هم خرابکاریهای احتمالی و اشتباههایشان را مهار و تصحیح کنند و هم بهجای به خاطر سپردن جزییات کارهایی که روی نرمافزار درحالتوسعه انجام دادهاند، به تاریخچه کارهایشان در سیستم مدیریت سورس کد استناد کنند.
یک مزیت دیگر تکیه بر این روش (حتی در کارهای انفرادی) این است، هر زمان که لازم باشد میتوان یک پروژه نرمافزاری را با کمترین دردسر به فرد دیگری واگذار کرد. اگر سیستم مدیریت سورس با فرآیند مستندسازی پروژه ترکیب شود، بهترین نتایج حاصل خواهد شد. این نیز یک مهارت دیگر در زمینه مدیریت پروژه نرمافزاری است.
اینها مهارتهایی طلایی است که کیفیت کار یک برنامهنویس خبره را از یک مهندس تازهکار یا ناشی متمایز میکند. شما نیز میتوانید در زمره مهندسان باهوش و خبره باشید و کار باکیفیت بالا از خود به یادگار بگذارید.
نظر شما چیست؟