مقدمه
در چند سال گذشته به خوبی متوجه این موضوع شدهام که من یکی از خوششانسترین افراد بوده و هستم که به وسیله آدمهای با سواد و رفقای خوب تونستم کار خوب بدست بیارم. کار خوب یعنی اینکه پرورش پیدا کنی. همکار خوب یعنی پیشرفت کنی و پروژه خوب که از کوکایین هم بهتر عمل میکنه. این باعث شد تا یاد بگیرم چه چیزی، کی، کجا و چطوری باید استفاده بشه، این هم یعنی تجربه خوب. حالا به جایی رسیدم که وطیفه خودم میدونم این تجربه رو با بقیه به اشتراک بذارم و به درخواست یکی از دوستان این مطلب رو مینویسم با این هدف که چه چیزی یاد بگیریم تا بتونیم شغل مناسب و مورد علاقه مون رو پیدا کنیم.
نکته: این مطالب رو به عنوان تعریف از خود نمینویسم چرا که در اون حد نیستم لذا هر جا اشتباهی هست به پای دانش کم بگذارید و در کامنتها به من کمک بکنید.
نکته: در این مطلب به موضوعاتی مثل Clean Code و DesignPattern و ... اشاره نکردهام. در مطلبی جدا به این موارد اشاره خواهم کرد.
تو زندگیتون اگر هدف نداشته باشید به هیچ جا نمیرسید، پس همیشه برای خودتون مشخص کنید که میخواهید به چی برسید لذا پیشنهاد میکنم قبل از هرچیزی یه جست و جو در خصوص موارد زیر و هم چنین محدودیتها و چالشهای هر کدوم انجام بدید.
-برنامه نویس وب
-برنامه نویس موبایل
-برنامه نویس سیستم های embedded
-برنامه نویس سیستم های واسط و سوییچها و سیستمهای بنیادی و مرکزی (هر نرم افزاری که در سه دسته بالا نیستند و وظیفه سنگین پردازش های اصلی و ارتباط بین سیستم های دیگه روبرقرار میکنن، مثل سوییچ بانک)
با این چهار دسته سعی کردم تمام شغلهای موجود در بازار رو پوشش بدم. دو دسته اول پر طرفدارترین و دو دسته بعدی پولسازترین هستن. پس از الان بدونید دنبال چی میگردید. من جزو دسته اول و چهارم هستم. من full-stack محسوب نمیشم چون فقط بخش هایی که لازم دارم رو برداشتم و دانش پیاده سازی خیلی از بخشهای Front End رو ندارم.
بزرگترین چیزی که من رو تو چند سال گذشته عقب انداخته بود نداشتن یک فرد کاربلد در کنارم بود که میتونست هر لحظه بهترین مشاورهها رو به من بده. اینکه چی رو یاد بگیرم، چه جوری انجامش بدم و کجا استفادهاش کنم بهتره. برای همین این خلا رو سعی کردم با شبکههای اجتماعی، اینترنت و دیدن ویدئوهای مختلف پر کنم. اما در نهایت هیچ چیزی جای یک فرد با تجربه رو نمیگیره. غربیها در هر شرکت برای هر فردی یک Team Lead دارند که این وظیفه رو به عهده داره.
خدا رو شکر الان شما راحت می تونید با زدن یک توییت به راحتی جواب اولیه رو دریافت کنید. هم چنین یادتان باشد که شما به عنوان یک تازه کار یا نیروی کمی با تجربه چیزی رو اختراع نخواهید کرد و تمام مشکلات معمولی قبل از شما حل شدهاند، پس خوب جست و جو کنید. عضویت در گروه های خبری و یا پیگیری اخبار مربوط به JUG ها و هم چنین Java Champion ها به شدت می تواند به شما کمک کند. این افراد معمولا در هفته حداقل یک کنفرانس و یا پست وبلاگ منتشر میکنند که به شدت کمک کننده است.
چه تازه کار باشید چه نباشید تنها مرجع شما برای اینکه چه چیزی امروز به عنوان نیاز محسوب میشود تنها از آگهیهای مشاغل دریافت خواهد شد. به شخصه هفتگی یک ساعت مشاغل سایت های مختلف را دنبال میکنم و اگر تکنولوژی مهمی باشد که در آن سر رشته نداشته باشم حداقل چند جست و جوی ساده برای سر در آوردن از آن انجام خواهد داد. در حال حاضر برنامه نویسهای جاوا باید یک یا دو زبان دیگه برنامهنویسی رو حداقل در حد تجربه با کد کار کرده باشند و قابل قبول نیست که بخوان از این مسولیت شانه خالی کنند.
پیدا کردن یک دوره آموزشی جاوا اصلا کار سختی نیست. کلاس، ویدئو، کتاب (که خیلی توصیه نمیکنم) هیچ فرقی نمی کنند مهم این است که شما به راحتی و در سریعترین زمان ممکن یاد بگیرید مفاهیم اولیه چه هستند و چگونه باید استفاده شوند. در کلاسهایی که برگزار میکردم همیشه چند نفری بودند که به دنبال ریز دستورات و نحوه کار آنها هستند. این غلطترین شیوه آموزش میباشد. یادبگیرید که صبور باشید. اینکه یک دستور برای شما دقیق روشن نیست مهم نیست، مهم کلیت کار است که بدانید مثلا برای ایجاد یک کلاس چه مراحلی طی می شود. حال اینکه از کلاس دقیقا چه استفادهای میشود برای مرحله بعدی است. نمیشود همه چیز را یکجا فراگرفت. صبور باشید.
بیشتر از خواندن و دیدن و شنیدن، در کار ما انجام دادن اهمیت دارد. هر کدی که می بینید یکبار برای خودتان بنویسید. سعی کنید تغییرات کوچک را در آن اعمال کنید و تفاوتها را ببینید. برخی مواقع با تغییر یک خط کد کل برنامه از کار می افتد و این یک تجربه بزرگ برای شما خواهد بود. اما یادتان باشد که با این کار وقت تلف نکنید.
همه شما اول از همه باید بدانید که JavaSE اولین چیزی است که باید فرابگیرید. تمام آن چیزی که برای ادامه کار لازم دارید همین است. بعد از آن تحقیق کنید که بقیه بخش های مرتبط به آن چیست به عنوان مثال JavaEE یا همان JEE که به تازگی تغییرات بسیاری در آن رخ داده است.
افرادی که میخواهند برنامه نویسی موبایل (آن هم فقط بر روی سیستم عامل اندروید را یاد بگیرند)تنها لازم دارند JavaSE را بلد باشند. باقی مطالب در دورههای آموزشی اندروید به شما آموزش داده خواهد شد.
همانطور که گفتم اول باید JavaSE را یادبگیرید. اما تمام JavaSE به چه کاری خواهد آمد ؟ تنها موارد زیر را درک کنید، منظورم از درک این هست که بتوانید وقتی کد دیگران را میخوانید آن را ترجمه کنید و خروجی آن را در ذهن ایجاد کنید. اکثر شاگردهای من بعد از پایان دوره همچنان فرق بین Class و Instance را نمیدانند. در واقع آنها درک درستی از این دو پیدا نکردهاند. پس مفاهیم شیگرایی (Object Oriented) را نیز نمیتوانند به درستی پیاده سازی کنند. وقتی هم که نتوانند، خب برنامه نویس جاوا نیستند !
پس به ترتیب یاد بگیرید:
تا اینجا، کار با خیلی از موارد را فراگرفتهاید، حداقل ۲ ماه زمان لازم دارید تا موارد قبلی را خوب بخوانید. غرق نشوید. مسیر را آهسته و پیوسته ادامه دهید. یک دریای وسیع با عمق کم بسیار بهتر از یک چاه با عمق ۱۰۰ متر است.
اصل کار جاوا تولید نرمافزار با مقیاس بزرگ است. یعنی چه؟ این بدان معناست که اگر قرار است نرم افزار تولیدی شما دارای تعداد بسیاری کاربر باشد، حجم زیادی از داده را مدیریت کند، بار بسیار زیادی در پردازش تولید کند، در سطح چند کامپیوتر (سرور) توزیع شود، در فضای ابری کار کند و دلایلی از این دست (یکی از آنها میتواند کفایت کند)، شما میتوانید از جاوا استفاده کنید. در غیر اینصورت پروژه یا زبان اشتباهی را انتخاب کردهاید.
استاندارهای JEE برای همین تولید شدهاند. یادمان باشد که این استانداردها برای این هستند که هر برنامهنویسی به شکلی کد تولید کند که دیگران نیز از آن سر در بیاورد. از اینها :
زمانی بود که ما مجبور بودیم تمام عملیاتهای طاقت فرسا را تنظیم و بعد مدیریت کنیم. اما Spring Boot تمامی این دردسرها را پایان داده است. این پلتفرم اجازه میدهد تا شما تنها به کدهای مورد نیاز نرم افزار بپردازید و مسایلی مانند ارتباط با دیتابیس، مدیریت حافظه و ... را بهتر در اختیار خود گرفته (اجازه نمیدهد ما خرابکاری کنیم). در نتیجه امروز پروژههای بسیاری بر روی این پلتفرم ایجاد میشوند و از همه مهمتر اینکه ساختارهای Cloud که آینده را میسازند نیز از این فضا برای پیشبرد پروژهها کمک میگیرند. من Spring Boot را با آموزش 4 ساعتهای که در سایت TreeHouse بود و از P30download دانلود کردم، یاد گرفتم و هر بار که نیاز به موضوع جدیدتر داشته باشم به مثالهای خود Spring Boot مراجعه میکنم. بعد از این مرحله شما با Spring MVC, Spring IOC, Spring Security, Spring Data تقریبا آشنایی اولیه را خواهید داشت.من تمام پروژههای جدید را با این ساختار تولید میکنم.
و البته هزاران ابزار و کتابخانه دیگر که شما می توانید یاد بگیرید و من اگر بنویسم این مطلب انتها نخواهد داشت.
اما مهم تر از همه این است که شما معماریها را نیز بشناسید.تفاوتهای ساختاری و نحوه قرارگیری هر ماژول در کنار هم را بدانید. integration Point های یک مجموعه را بشناسید. نحوه مستند سازی را بیاموزید و هم چنین یاد بگیرید که چگونه از کد دیگران استفاده کنید.
خیلی از موضوعات بود که اینجا حتی اشاره نکردهام، این موضوعات چیزهایی هستند که شما تنها با کار و تجربه به آن خواهید رسید. شاید خیلیها با من موافق نباشند و عقیده داشته باشند که باید کتابها را از سر تا ته بخوانیم. الگوریتمها را حفظ کنیم و بدون اینترنت کد بزنیم. من اینطوری کار نکردهام و بلد هم نیستم. خندهدار شاید باشد، اما اینها تمام چیزی است که لازم دارید تا بتوانید نرمافزارهای ساده و اولیه را تولید کنید. در حین کار متوجه خواهید شد که بسیاری از موارد را لازم دارید، کار با فایل، استفاده از کتابخانههایی که دیگران نوشتهاند، خواندن stackOverflow و شاید ده ها مطلب دیگر که حتی یک خط در مورد آن ننوشتم.
من چند قانون را همیشه رعایت میکنم.
1- ساده فکر میکنم.
2- قبل از حل مشکل اول به سراغ دومی نمیروم.
3-- اول ورژن سادهای که قابلیت برطرف کردن نیاز مشتری را دارد ارایه میدهم بعد آن را بهبود میدهم. یکجا هیچ سیستمی را نمیتوان عرضه کرد.
4- دنبال راههایی که قبلا جواب دادهاند میروم و هر وقت در آنها حرفهای شدم راه خودم را میسازم.
5- برای یاد گرفتن یک موضوع سادهترین کدی که من را به نتیجه دلخواهم می رساند به صورت مستقل امتحان میکنم و بعد در نرم افزار از آن به صورت یک ماژول استفاده میکنم.
6- وقتی چیزی کار نمیکند، مسیر را عوض میکنم و یا آن را باز بینی میکنم.
7- در نهایت، هرگز شاخ نمی شوم و فکر نمیکنم که من ته دنیا هستم. فقط یکبار به این فکر کنید کسی که سیستم عامل لینوکس را تهیه کرده حتی یک درصد از ابزهای شما را نداشته و یا اینکه چیزی که بقیه تولید کردهاند گاها شما در استفاده از آن مشکل دارید و نمیدانید چه قابلیتهایی دارد.
هر کدام از بندهایی که نوشتم حداقل چند روزی (اگر تیز باشید) شما را درگیر خواهد کرد. در ابتدای کار سعی کنید شکیبا باشید. هیچ کس با یک ماه و دو ماه نمی تواند این مطالب را یاد بگیرد. من یکسال طول کشید تا توانستم خودم یک نرم افزار را از صفر بنویسم و تازه کلی از کدهای آن کپی شده از پروژههای دیگران بود.
این مطلب ممکن است به روز شود.