اینجا سعی دارد با کمک دیگران به شما کمک کند که چگونه مسیر شغلی خود را انتخاب کنید. این متن در حالت ایدهآل به شما خواهد گفت برای چه کاری، بایستی چه مهارتهایی را بدست بیاورید و برای هریک از این مهارتها چه منابعی در دسترس شماست. قاعدتا در اینجا منابعی که بصورت آزاد در دسترس هستند در اولویت هستند.
چنانچه شما در حال تحصیل در رشته کامپیوتر هستید یا قصد دارید وارد آن شوید این سخن را جدی بگیرید. تمامی درس هایی که در چارت درسی وجود دارند برای شما مفید است (منظورم همه نیست، برخی از دروس عمومی را قلم بگیرید). دروس تخصصی، ریاضیات ، فیزیک و ... . نگویید که اینها به چه درد من می خورند! به درد میخورند. حتی اگر فایده ای نداشته باشند به شما قدرت تحلیل مساله را میدهند. پس به هیچ درسی نه نگویید، اسمبلی، سیستم عامل، ذخیره بازیابی، ساختمان داده، ریاضی و بقیه را جدی بگیرید. کار عملی در آنها انجام بدهید؛ فقط به خواندن اکتفا نکنید. از قول جادی : اگرمیخوایم کارها انجام بشن نباید از کارهای غیرپرفکت ترسید.
نوشتن یک لیست کامل از تمام حوزههایی که شما میتوانید در آنها فعالیت کنید کار بسیار دشواری است. در اینجا حوزههایی که از نظر نویسنده و نویسندگان احتمالی این متن، شما میتوانید در آنها فعالیت کنید در زیر آمده است:
- تحلیل و طراحی نرمافزار
- توسعهدهنده نرمافزار
- مهندسی کیفیت نرمافزار
- شبکه و زیرساخت
- پایگاه دادهها
- تولید سختافزار
- حوزههای میانرشتهای
در این بخش، نیازمندیها و انتخابهایی که شما در این مسیر دارید آورده میشود. نیازهای عمومی در این بخش و در هریک از بخشها نیازهای اختصاصی آن بخش آورده میشود.
مهارتهای عمومی:
- آشنایی خوب با مطالعه به زبان انگلیسی: به علت انگلیسی زبان بودن اکثر منابع این حوزه؛ شما برای مطالعه، افزایش اطلاعات و بهروز نگه داشتن دانش خود نیاز دارید تا آشنایی خوبی با مطالعه مطالب به زبان انگلیسی داشته باشید.
- آشنایی خوب با ساختمانداده و طراحی الگوریتم: شما بایستی ساختمان دادههای مختلف و الگوریتمهای مختلف را شناخته و بتوانید در صورت نیاز با یک تحقیق کوچک از اینترنت، ساختمانداده مناسب را انتخاب و به صورت موردی پیادهسازی کنید. همچنین بایستی بتوانید الگوریتمهای مختلف را در عمل شناسایی کرده و با توجه به ویژگیهای کلی آنها از آنها استفاده کنید.
- آشنایی با سیستم عامل: بایستی بتوانید درک کنید که سیستم عامل چیست و چگونه کار میکند. با مفاهیم پروسه و ترد آشنا باشید
- تایپ با سرعت مناسب: چون تایپ کردن عملا بخش مهمی از برنامهنویسی است پس سعی کنید ۱۰ انگشتی تایپ کنید.
- آشنایی با نرمافزارهای کنترل نسخه: به عنوان یک توسعهدهنده نرمافزار چه به صورت انفرادی کار کنید چه در تیمهای نرمافزاری، به یک نرمافزار کنترل نسخه مانند git نیاز دارید تا در جریان کدنویسی، تغییرات روی کد را مدیریت و تاریخچه آن را حفظ کنید.
مهارتها:
- آشنایی با الگوهای طراحی
- آشنایی با موارد مرتبط با همزمانی
- آشنایی با یکی از زبانهای java, c#, php, python, nodeJS
- آشنایی به sql و نحوه انجام کارها در پایگاه داده
- آشنایی با انواع تکنولوژیهای وب سرویسها
- آشنایی با چارچوبهای سمت سرور
مهارتها
- آشنایی با C/C++
- تسلط با موارد مرتبط با همزمانی
- آشنایی با پروتکلهای ارتباط m2m
- تسلط بر HTML و CSS
- تسلط بر Javascript و نسخههای جدید (es6, es2017)
- آشنایی با ابزارهای خودکارساز مانند گالپ و گرانت (Gulp, Grunt)
- آشنایی با ابزارهای تبدیل نسخههای جدید جاوااسکریپت به نسخه قابل اجرا در مرورگرهای قدیمی (Babel, Bublé)
- آشنایی با باندلرها (Webpack, Rollup)
- آشنایی با فریمورکهای ساخت اپلیکیشن وب (React, Vue, Angular, Ember)
- آشنایی با فریمورکهای طراحی (Bootstrap, Foundation, Semantic UI)
همونطور که میدونید توسعه اپلیکیشنهای موبایل در ایران عمدتا بر روی دو پلتفرم Android و iOS تمرکز داره. من هم سعی میکنم هردوی این موارد رو جداگانه بررسی کنم. قبل از اینکه شروع کنیم به یادگیری هر کدام از این پلتفرم ها قسمتی از تجربه شخصی خودم را برای تون میگم: شما لازم نیست یک طراح حرفه ای باشید؛ اصلا لازم نیست طراح باشید. اما یک وسواس خیلی خاصی در پیاده سازی المان های تصویری باید داشته باشید. باید به جزییات تصویری و پیاده سازی های آن فکر کنید. این مهارت را حتما در خود تقویت کنید.
- تسلط بر زبان JAVA/Kotlin
- آشنایی با XML و ساختار آن
- آشنایی با AndroidStudio ( نحوه برنامهنویسی در محیط توسعه، پیکربندی و استفاده از شبیهساز اندروید، خروجی گرفتن APK و غیره )
- آشنایی با Gradle و نحوه پیکرندی و استفاده از آن ( مثلا اضافه کردن Library یا Flavorsها )
- تسلط با SDK اندروید ( مواردی مثل: اکتیویتیها و چرخه زندگی اونها، لایوت و ویووها، ورودیهای کاربر، ار با کالکش ویووها، آشنایی با سنسورها و غیره )
- آشنایی با تست نویسی ( UnitTest و integrationTest )
- آشنایی با متریال دیزاین ( آشنایی بر مفاهیم کلی و اولیه، AppCompat، اکشن بار، دکمهها و انمیشینها)
- آشنایی با Database و نحوه ذخیرهسازی اطلاعات
- آشنایی به وبAPI و نحوه دریافت اطلاعات از اینترنت ( آشنایی با ساختار JSON، آشنایی با APIهای REST/SOAP یا Socket )
- آشنایی با مفاهیم پیشرفته ( نظیر: RxJAVA، DependencyInjection و کار با Dagger )
- آشنایی با دیزاین پترنها ( برای مثال الگوهای Singelton, Iterator, Adapter و غیره )
- آشنایی با الگوهای ساختاری ( نظیر MVC، MVP یا MVVM و غیره )
- خروجی گرفتن و sign کردن اپ و ارسال آن به مارکت ( مانند GooglePlay یا CafeBazaar )
- آشنایی با Firebase ( یا حداقل آشنایی با سرویسهای PushNotification )
- آشنایی با زبان Swift ( آشنایی با مفاهمی مثل مقادیر Optional، عبارات if..Statement، کلاسها و ارثبری، مدیریت خطا، و البته آشنایی با Objective-C )
- آشنایی با محیط توسعه XCode (نظیر کدنویسی، راه اندازی و استفاده از شبیهساز )
- آشنایی با CocoaTouch و تعامل با APIهای اپل
- آشنایی با SotryBoard, XIB و Segue جهت طراحی رابط کاربری
- آشنایی با استانداردهای اپل برای طراحی رابط کاربری
- آشنایی با AutoLayout
- آشنایی با کالکشن ویووها
- آشنایی با تست نویسی ( UnitTest , IntegrationTest و XCTest)
- آشنایی با CoreData و دیگر روشهای ذخیره اطلاعات
- آشنایی با دیگر Coreها ( نظیر CoreAnimation, CoreAudio, CoreGraphic, CoreLocation, MapKit, QuartzCore و غیره )
- آشنایی به وبAPI و نحوه دریافت اطلاعات از اینترنت ( آشنایی با ساختار JSON، آشنایی با APIهای REST/SOAP یا Socket )
- آشنایی با دیزاین پترنها ( برای مثال الگوهای Singelton, Iterator, Adapter, Delegation و غیره )
- آشنایی با الگوهای ساخترای ( نظیر MVC، MVP , MVVM یا VIPER و غیره )
- آشنایی با APN برای ارسال نوتیفیکیشن
- آشنایی با مفاهیم پیشرفته ( نظیر: RxSwift و DependencyInjection )
- خروجی گرفتن از XCode برای نسخههای جیلبرک (بدون ساین کردن )
- ارسال اپلیکیشن به اپلاستور برای انتشار
علاوه بر مواردی که در بالا برای هرکدام از پلتفرمها گفته شد، در مورادی ممکن از نیاز باشد تا با استفاده از فریمورک یا ابزارهای موجود بصورت هیبردی مشغول به توسعه اپلیکیشن موبایل شوید. برای این موارد بنظر میرسد که علاوه بر موارد بالا، موارد زیر نیز مورد نیاز باشد:
- آشنایی به یکی از فرمورک یا ابزارهای توسعه هیبریدی ( ReactNative, Xamarin و غیره )
- تسلط بر زبان JavaScript برای کار با React
- آشنایی با Redux برای کار با React
- آشنایی با ES6 و JSX برای کار با React
- آشنایی با Router برای کار با React
- تسلط بر زبان C# برای کار با Xamarin
- آشنایی با ابزارهای تست برای هردو پلفترم
- آشنایی با flutter
بدیهیست فردی که تمامی امکانات بالا را داشته باشد بهترین گزینه برای استخدام است و صد البته داشتن همه این مهارتها کار آسانی نیست، با این حال سعی کردم تمامی مباحثی که گمان میکردم نیاز باشد را پوشش دهم.
در اینجا باید اشاره شود که توسعه با ابزار react native یک اپ واقعی برای شما میسازد. در حقیقت خروجی آن هیبریدی نیست. برای این منظور به وبسایت ری اکت نیو مراجعه کنید. react native
مهارتها -آشنایی با مفاهیم پایه ریاضی ، محورها ، مختصات ،ضرب دکارتی ، فرمول های دکارتی ، شیدر -آشنایی با مفاهیم فیزیک ، شتاب ، سرعت ، جاذبه -آشنایی با مفاهیم بهینهسازی نرمافزار ،سرعت اجرا ، مسیریابی و ... -آشنایی با موتور های بازی سازی (udk,unity,fps,crisis,game maker)
مهارتها
- آشنایی کامل با مباحث ریاضی مانند جبر خطی, ماتریس, بردارها و...
- آشنایی با حداقل یک موتور بازیسازی مانند Unity3D, Unreal Engine
- آشنایی با حداقل یکی از زبانهای برنامهنویسی C, C++, C#
- آشنایی با برنامه نویسی multithreaded
- یادگیری مفاهیم پایهی بلاکچین
- تجربه کردن معاملهی ارز دیجیتال و قراردادهوشمند برای درک بهتر
- یادگیری نسبی و آشنایی با مفاهیم و الگوریتمهای ریاضی و کامپیوتری رمزنگاری
- یادگیری مکانیزم توافق
- زبان برنامه نویسی Solidity برای توسعهی قراردادهای هوشمند
- مفهوم ماینینگ و نقش ماینر و فرایند اثبات کار POW
- مفهوم فرایند اثبات سهم POS
- تسلط نسبی بر یکی از زبانهای برنامه نویسی مانند C/C++/Java/Go/Python/Js جهت پیاده سازی بلاکچین
- آشنایی با مفاهیم امنیت در بلاکچین
- آشنایی با مدیریت منابع
- تسلط بر مباحث مقیاس پذیری و کارایی (Performance)
- آشنایی با مفهوم جداسازی (Isolation)
- خلاقیت و قدرت تحلیل بالا برای آینده نگری در توسعه
- آشنایی و مطالعهی تکنیک های روز در حوزه بلاکچین از طریق مطالعهی وایت پیپرهای کوینها و نرم افزارهای بلاکچینی
مهارتها -منطق فازی -پردازش تصویر -یادگیری ماشین
مباحث زیر با توجه به سرفصل های امتحان LPIC 1 مطرح شده اند
مهارت ها
- آشنایی با معماری سیستم (شناسایی و تنظیم سخت افزار ، مراحل Boot سیستم و ....)
- آشنایی با چگونگی نصب یک لینوکس workstation و مدیریت بسته ها (rpm و yum در سیستم های RPM-based و apt و aptitude در سیستم های Debian-based)
- توانایی کار با خط فرمان و دستورات مهم GNU و Unix
- آشنایی با Filesystem های لینوکس (ext4 , ext3 ,...) و سلسه مراتب استاندارد Filesystem های لینوکس (Standard Filesystem hierarchy)
- شناخت و مدیریت دسترسی ها
- آشنایی با Shell Scripting و Data Management
- انجام وظایف مدیریتی مثل مدیریت کاربرها و گروه ها ، کار با Cron برای automate کردن وظایف ، Localisation و Internationalisation
- آشنایی با مفهوم سرویس و سرویس های مهم سیستم
- آشنایی مقدماتی با Network و حل مشکلات معمولی شبکه
- مدیریت امنیت سیستم