من می خواهم برنامه نویس شوم - قسمت دوم

سلام، در قسمت اول راجع به شغل برنامه نویسی توضیحاتی ارائه و نکاتی در شروع کار یادآوری شد. در ادامه لازم است با برخی اصطلاحات آشنا شویم تا بتوانیم مطالبی که در آینده بررسی و مطالعه میکنیم را به درستی درک کنیم.

در دوران دانشگاه دوستی داشتم که احساس خوبی نسبت به رشته ای که انتخاب کرده بود نداشت:
- محمد جان مشکل شما چیه؟
- من نمی فهمم این همه اصطلاحات برا چیه، اصلا اونقدر زیاده که نمی فهمم شما دارید راجع به چی حرف می زنید تو یه جمله ۲۰ کلمه ای ۱۰ تا اصطلاح استفاده می کنید. اصلا با اسم رشته هم مشکل دارم خودش اصطلاحه، آی تی!! خوب بگید فناوری اطلاعات!

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

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

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

با ساده ترین آن ها شروع می کنیم. (البته شاید کسانی که دانشجوی رشته آی تی یا کامپیوتر هستند براشون خیلی ساده باشه)

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

مشخصا نوشتن یک برنامه. اینجا کتاب درسی نیست که من تعریفی که یک استاد دانشگاه ارائه داده را بیاورم و از شما بپرسم، با یک مثال ساده شروع می کنیم.

فرض کنید شما یک برنامه نویس موبایل هستید و می خواهید یک برنامه بنویسید که بقیه آن را نصب (install) کنند. مراحل کار بدین صورت است که باید بدانید این برنامه دقیقا قرار است چه کاری انجام دهد (اصطلاحا تحلیل و نیاز سنجی کنید)، چه ظاهری داشته باشد (اصطلاحا طراحی ظاهر - User Interface یا UI) مثلا چه رنگ هایی در آن استفاده شود و دکمه ها چه رنگ و شکلی داشته باشند، مراحل کارها در آن (فرایند های آن) به چه ترتیبی است؟ (مثلا کارهایی که در هنگام ورود به نرم افزار باید انجام شود یا اینکه مثلا دکمه ها کجا باشند و چه نوشته هایی داشته باشند) که آن را اصطلاحا تجربه کاربری (User Experience یا UX) سپس آن را بنویسید (programming) و نهایتا مطمئن شوید درست کار میکند (تست کنید) و برنامه را در دسترس دیگران یا کارفرما قرار دهید (منتشر کنید یا deploy) و ممکن است بعد از مدتی ایرادی در آن پیدا کنید (Bug) و آن را برطرف کنید (Bug fix) و مجددا نسخه دیگری (release) را منتشر کنید که آن ایراد را نداشته باشد به این کار به روزرسانی (update) می گویند. برای تولید نرم افزار اصطلاح توسعه نرم افزار (Develop) را نیز به کار می برند که معمولا برای به مجموعه تحلیل، طراحی، برنامه نویسی و تست آن را توسعه نرم افزار می گویند البته بعضا نیز توسعه را نام دیگری برای برنامه نویسی می دانند و آن را شامل مراحل دیگری نمی دانند.

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

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

بله همه این ها برنامه هستند...

انواع برنامه

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

اپلیکیشن

به دلیل کاربردهای مختلف، برنامه ها نام های مختلفی می گیرند (نوعی دسته بندی)، مثلا اپلیکیشن را برنامه کاربردی هم می گویند. اصولا به برنامه ای این نام را نسبت می دهند که قرار باشد یک کاربر بطور مستقیم با آن کار کند، مانند اکثر برنامه های موبایل (نه همه آن ها) و برخی برنامه های ویندوزی (منظورم برنامه هایی است که برای ویندوز است).

سیستم عامل

باز یک مثال ساده: فرض کنید لباس شویی شما برنامه ای در خود دارد که به هر طریقی (مهم نیست) می تواند شیر آب سرد و گرم را باز و بسته کند و تسمه لباس شویی را بچرخاند و همچنین میتواند بفهمد شما چه دکمه ای را روی لباس شویی فشار داده اید. به شما می گویند ما چندین نوع لباس شویی داریم که با هم فرق دارند اما چیزی که بین همه آن ها مشترک است شیر آب سرد و گرم و تسمه است پس این برنامه در همه آن ها قرار است نصب شود، باید با فشار دادن یک دکمه لباس شویی شروع به کار کند. یکی از لباس شویی ها را به شما نشان می دهند که ۱۰ حالت شست و شو دارد (ده دکمه برای شست و شو) و از شما می خواهند برنامه ای بنویسید که با فشار دادن هر دکمه مقدار از پیش تعیین شده آب وارد و تسمه بچرخد.
کاربر به طور مستقیم با دکمه ها (input) و یک صفحه که دکمه ای که انتخاب کرده را نشان می دهد (output) با برنامه یا نرم افزاری که شما قرار است بنویسید در ارتباط است. اصطلاحا کاربر از طریق (input/output یا به اختصار IO یا I/O) با برنامه شما کار میکند (بخشی از سخت افزار) و این ارتباط را کدام برنامه ایجاد کرده؟ کدام برنامه ارتباط برنامه شما را با شیر آب سرد و گرم و تسمه ایجاد خواهد کرد؟

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

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

بر روی این سیستم عامل ها (محیط یا platform نیز می گویند) انواع نرم افزار ها و اپلیکیشن ها نصب می شوند و شما از آنها استفاده می کنید.

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

برنامه های دسکتاپی و کلاینت سروری

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

برنامه های تحت وب

مورد دیگه برنامه هایی هستند که با استفاده از مرورگر وب اونها رو باز می کنید، این برنامه ها دقیقا مانند کلاینت سروری عمل می کنند با این تفاوت که فقط برنامه سرور نوشته میشه (البته به نوعی - چون برنامه سرور هم که نوشته میشه در این حالت با کمک برنامه های دیگه ای کار خواهد کرد که بهشون اپلیکیشن سرور میگن) و کلاینت همون مرورگر وب هست و اصلا نوشته نمیشه (بروزر مانند فایرفاکس، کروم و ...) - در حقیقت اون چیزی هم که تو مرورگر میبینید در همون قسمت سرور نوشته میشه و به مرورگر شما ارسال میشه برای نمایش به کاربر و از قابلیت های اون استفاده می کنید که اصطلاحا این برنامه ها رو تحت وب میگوییم. تمامی وب سایت ها برنامه های تحت وب به حساب میان.

برنامه های embedded

نکته نهایی راجع به مثال برنامه لباسشویی: اینگونه نرم افزارها و سیستم ها که برای کاری خاص طراحی می شوند و ارتباط تنگاتنگی با سیستم عامل خاص خود دارند (معمولا هسته لینوکس - یا بدون سیستم عامل به این معنی که ارتباطات لازم با سخت افزار را هم به جهت خواص بودن، خود مدیریت می کند) را embedded system می نامند حال می خواهد لباس شویی باشد یا بسیار بزرگتر و پیچیده تر مانند یک فضاپیما.

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

زبان برنامه نویسی چیست؟

خوب بریم سراغ اینکه چطور خطوطی که ما تایپ می کنیم تبدیل به یک فایل میشه که قراره نصب شه (در خصوص برنامه های تحت وب در قسمت سوم توضیحات بیشتری ارائه میشود) و اصلا این خطوط چی هستند؟

زبان های مختلفی برای نوشتن نرم افزار ها وجود دارند. درسته که برای نوشتن برنامه ها از زبان انگلیسی استفاده میشه (استاندارد است) اما همین نوشته ها یک سری مجموعه دستور است که باید برای کامپیوتر ترجمه بشه (البته هرچیزی نمی توان نوشت و قوانین خاص خودش رو داره که باید یادگرفت - برنامه نویس اینها رو یادمیگیره و برای تولید نرم افزار بکار میگیره). کار ترجمه رو هم یکسری برنامه انجام میدن که هر کدوم یکسری مجموعه دستور برای خودشون تعریف کردن (همون قوانین که اشاره شد) و هرکدوم از این مترجم ها برای این ساخته شدن که برنامه های خاصی باهاشون نوشته بشه (در بخش سطوح زبان بیشتر متوجه خواهید شد).

به مجموعه ای از این قوانین یا دستور ها میگن زبان های برنامه نویسی. و به مترجمشون میگن مفسر یا کامپایلر اون زبان (فرق مفسر و کامپایلر رو اشاره خواهیم کرد). یعنی قبل نوشتن یک برنامه با توجه به اینکه این برنامه قراره کجا نصب شه و اجرا شه و چه قابلیت هایی داشته باشه باید یک زبان (شامل یک مجموعه دستور و قوانین) رو برای نوشتن انتخاب کنیم و دستورات اون زبان رو یادبگیریم و بعد از نوشتن برنامه اون رو به مفسر یا کامپایلر همان زبان بدیم تا خروجی را برای ما بسازه.

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

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

سطوح زبان

زبان های برنامه نویسی سه سطح مختلف دارند و انچه شما بیشتر به عنوان زبان برنامه نویسی می شنوید مثلا php زبان های سطح بالا هستند که توسط انسان قابل فهم هستند اما سخت افزار مسلما مانند ما نمی داند جمله شرطی چیست؟ (اگر این اتفاق افتاد این کار را بکن) زبان های سطح پایین زبان هایی هستند که مستقیما با سخت افزار کار میکنند و سطح میانی بین این دو است و توسط انسان قابل درک تر است نه به اندازه زبان سطح بالا. مثلا سیستم عامل را با زبان های سطح پایین می نویسیند و برنامه هایی مانند مفسر یا کامپایلر یک زبان سطح بالا را با زبان سطح میانی یا سطح پایین.

نکته: برنامه شما برای محیط خاصی نوشته خواهد شد. بله شما نمی توانید نرم افزارهایی که برای سیستم عامل ویندوز نوشته شده به همان شکل در لینوکس استفاده کنید و بالعکس. البته برنامه هایی هم وجود دارند که در محیط های مختلف قابل اجرا هستند اما فقط در صورتی که برای اجرای آن نیاز به برنامه دیگری باشد که برای آن محیط نوشته شده اند (اصطلاحا ماشین مجازی یا virtual machine یا vm) مثلا زبان جاوا دارای ماشین مجازی به نام JVM است که برای اجرای برنامه شما که با جاوا نوشته شده حتما JVM مختص آن سیستم عامل که قرار است برنامه شما در آن اجرا شود نصب شود که به واسطه آن برنامه شما اجرا شود. اما شما نگران اجرای برنامه خود در سیستم عامل دیگری نیستید. تنها کافیست روی آن JVM مختص آن نصب شود و نیاز به بازنویسی کل برنامه برای آن سیستم عامل نیست.

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

تفاوت مفسر و کامپایلر

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

علاوه بر دستورات شما معمولا برنامه ها حاوی عکس ها و ... برای نمایش ظاهر (ماتریال های دیگری) نیز هستند که مثلا در نرم افزارهایی که برای ویندوز توسعه داده شده می بینید خروجی اجرایی شما مجددا همراه این فایل ها به یک فایل فشرده تبدیل شده و شما آن را اصطلاحا نصب می کنید (از حالت فشرده خارج شده و محلی برای قرار گیری فایل اجرایی نهایی شما بهمراه دیگر فایل های لازم برای نمایش و ... تعیین می گردد + تنظیماتی که برای اجرا به سیستم عامل اعلام می گردد) و از آن پس ان را اجرا می کنید فایل اجرایی همان دستورات شما را در خود دارد بعلاوه تمام آنچه لازم است با سیستم عامل ارتباط برقرار کند که در هنگام کامپایل/تفسیر در فایل مورد نظر قرار می گیرد. اینکه یک برنامه چطور ترجمه یا کامپایل می شود مبحث پیچیده ایست که پیش نیاز زیادی دارد و در دانشگاه ها با نام اصول طراحی کامپایلر تدریس می شود (بله آن هم خود یک برنامه است که برنامه شما را ترجمه می کند. توسعه چنین برنامه ای کار بسیار سخت تری است و نیاز به مطالعه و علم زیاد و ما این بحث را اینجا رها میکنیم)

بیشتر بدانید

اکنون شما اطلاعات خوب و جامعی راجع به انواع نرم افزار دارید. چرا بیشتر راجع به همه اینها مطالعه نکنید؟!
دست شما کاملا باز است تا بیشتر بدونید و از دونستن لذت ببرید. (اگه قبلا از دوستتون که اپل داشته می پرسیدید ویندوزش چیه دیگه این کار رو نکنید، سیستم عامل ... ;)
نظر شما راجع به یک مقاله کلا راجع به اینکه کامپیوتر چطور کار میکنه چیه؟ چطور این تکنولوژی به اینجا رسیده؟ اگه براتون مهمه (مقاله نحوه تعامل سخت افزار و نرم افزار را مطالعه کنید) و اگه نه ادامه بدین.

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

برای آن ها که دوست دارند برنامه های تحت دسکتاپ توسعه دهند شاید از الان بتونن با آموزش یه زبان مثل پایتون یا هر زبان دیگه ای شروع کنن ولی ما حرف های بیشتری برای گفتن داریم.

https://virgool.io/CodeLovers/%D9%85%D9%86-%D9%85%DB%8C-%D8%AE%D9%88%D8%A7%D9%87%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%B4%D9%88%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-i45ylczatumf