چرا خوبه که Golang رو یاد بگیریم؟

http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682

این نوشته ترجمه پست Keval Patel در این آدرس هست:
https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65
همچنین کامنت یکی از کاربران رو در آخر همین مقاله قرار دادم که به نظرم مفید واقع می‌شود.


در چند سال گذشته, زبان برنامه نویسی جدید ظهور کرده است: Go یا GoLang. هیچ چیز مثل یک زبون برنامه نویسی جدید یه دولوپر رو دیوونه نمیکنه, درسته؟ پس, من شروع کردم به یادگیری Go از ۴ یا ۵ ماه پیش و الان اینجام تا به شما بگم چرا خوبه که این زبان جدید رو یاد بگیریم.

من در این مقاله نمی‌خواهم به شما یاد بدم چطور یه “!!Hello, World” بنویسید. توی فضای اینترنت پر هست از این دست آموزش‌ها. من اینجام تا توضیح بدم چرا به زبون جدید Go نیاز داریم؟. بخاطر اینکه اگر هیچ مشکلی وجود نداشته باشه به راه حل‌ای هم نیاز نداریم, درسته؟


محدودیت های سخت افزاری:

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

اولین پردازنده Pentium 4 با سرعت 3.0GHz در سال ۲۰۰۴ توسط اینتل معرفی شد. امروز, Macbook Pro 2016 من سرعت پردازشی حدود 2.9GHz دارد. پس, در یک دهه اخیر, قدرت پردازش زیادی بدست نیامده است. شما میتونید مقایسه افزایش قدرت پردازش با زمان آنرا در نمودار زیر ببینید.

در نمودار بالا می‌بینید که عملکرد single-thread و فرکانس پردازنده در یک دهه ثابت مانده. اگر شما فکر می‌کنید که اضافه کردن ترانزیستورهای بیشتر راه حل هست, پس شما اشتباه میکردید.

پ.ن: ببینید طبق قانون مور که بالاتر گفتم, ابعاد ترانزیستورها هر ۲ سال نصف می‌شود, و زمانی که ابعاد ترانزیستور درحال کوچک شدن هست بعد از مدتی این موضوع محدودیت‌های فیزیکی برای سازنده پردازنده‌ها ایجاد میکند.

ویکیپدیا: این محدودیت فیزیکی دانشمندان را به این سمت سوق داده که شاخه‌های جدیدی از روش‌های محاسباتی را آزمایش کنند، تا در هنگام لزوم بتوانند جایگزین مناسبی برای رایانه‌های امروزی داشته باشند؛روش‌هایی همچون محاسبه کوانتومی، محاسبه زیستی و… . آنچه مسلم است، این است که در چنین رایانه‌هایی خبری از تراشه و CPU هایی به شکل‌های امروزی نخواهد بود.

پس راه حل‌هایی برای مشکل بالا ارائه شد:

  • تولید کنندگان شروع به افزودن هسته های بیشتر به پردازنده کردند.
    امروزه ما CPU های چهار هسته‌ای و هشت هسته‌ای در دسترس داریم.
  • ما همچنین hyper-threading را معرفی کردیم.
  • برای افزایش عملکرد ، حافظه کش بیشتری به پردازنده اضافه شده است.

اما راه حل‌های بالا محدودیت‌های خودشون رو هم دارند.
۱ – ما نمی‌توانیم حافظه کش را بیشتری به پردازنده اضافه کنیم تا عملکرد افزایش یابد چون با هم برای حافظه کش محدودیت‌های فیزیکی وجود دارد به این معنا که هرچه حافظه کش بزرگتر باشد ، سرعت آن کندتر می شود.

۲ – افزودن هسته بیشتر به پردازنده, هزینه بیشتری هم دارد. همچنین ، نمی‌توان تعداد آن را به طور نامحدود افزایش داد. این پردازنده های چند هسته ای می توانند چندین Thread را به طور همزمان اجرا کنند و این موضوع برای Concurrency به ما کمک میکند که بعداً در مورد آن بحث می کنیم.

بنابراین ، اگر نمی توانیم به پیشرفت های سخت افزاری متکی باشیم ، تنها راهی که می توان از آن استفاده کرد نرم افزار کارآمدتری برای افزایش عملکرد است. اما متأسفانه ، زبان‌های برنامه نویسی مدرن خیلی کارآمد نیستند.

گو, goroutine دارد:

همانطور که در بالا بحث کردیم, تولیدکنندگان سخت افزار برای افزایش کارایی هسته های بیشتری به پردازنده ها اضافه می کنند.همه دیتا سنترها بر روی آن پردازنده ها کار می کنند و ما باید در سال های آینده انتظار افزایش تعداد هسته‌ها را داشته باشیم. علاوه بر این ، برنامه های امروزی از چندین micro-service برای ارتباط با پایگاه داده ، queue ها و حافظه کش استفاده می کنند. بنابراین ، نرم افزاری که توسعه می دهیم و زبانهای برنامه نویسی که استفاده می‌کنیم باید به راحتی از Concurrency پشتیبانی کنند و با افزایش تعداد هسته ها مقیاس پذیر (scalable) باشند.

اما ، اکثر زبان های برنامه نویسی مدرن (مانند جاوا ، پایتون و غیره) از دهه (’90s)
زمان برنامه های single-thread میایند. اکثر این زبان های برنامه نویسی از multi-threading می کنند. اما مشکل واقعی با اجرای برنامه های Concurrent همراه است مثل threading-locking , race conditions و deadlocks. این موارد ایجاد برنامه multi-thread را در آن زبانها را دشوار می کند.

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

از سوی دیگر ، Go در سال 2009 هنگامی که پردازنده های چند هسته ای در دسترس بودند ، منتشر شد. به همین دلیل Go با در نظر گرفتن concurrency ساخته شده است. Go به جای thread دارای گوروتین (goroutine) است. آنها تقریباً 2 کیلوبایت حافظه از heap را مصرف می کنند. بنابراین ، می توانید میلیون ها گوروتین را در هر زمان استفاده کنید.

http://golangtutorials.blogspot.in/2011/06/goroutines.html :روتین چطور کار میکند؟ منبع

مزایای دیگر عبارتند از:

  • گوروتین ها دارای stack های قابل رشد هستند. این بدان معناست که آنها فقط در صورت نیاز از حافظه بیشتری استفاده خواهند کرد.
  • زمان راه‌اندازی (startup) گوروتین سریعتر از thread ها است.
  • گوروتین‌ها دارای ساختار built-in برای ایجاد ارتباط بین گوروتین‌های دیگر هست که با استفاده از channel ها امکان پذیر است.
  • گوروتین به شما این امکان را می دهد که هنگام به اشتراک گذاری ساختار داده ها ، مجبور نباشید از lock mutex استفاده کنید.
  • همچنین گوروتین‌های گو با thread های سیستم عامل ارتباط 1:1 ندارند. این یعنی یک گوروتین میتونه روی چندین thread اجرا بشه.

شما میتونید سخنرانی Rob Pike رو برای عمیق‌تر فهمیدن این موضوع نگاه کنید:
https://blog.golang.org/concurrency-is-not-parallelism

با تمام نکات بالا که Go را یک زبان بسیار قوی برای پشتیبانی از concurrency مثل java و C++/C میکنه در همین حال به زیبایی Erlang از آن استفاده می‌کند.

گو در هر دو زمینه راحتی و بهینگی Concurrency به خوبی عمل کرده است.


گو مستقیماً بر روی سخت افزار اجرا می شود.

یکی از مهمترین مزایای استفاده از C ، C ++ نسبت به سایر زبانهای سطح بالاتر مانند جاوا/پایتون ، عملکرد آنهاست. زیرا C/C ++ کامپایل می شوند و تفسیر نمی شوند.

پردازنده ها باینری را می فهمند. به طور کلی ، وقتی برنامه ای را با کامپایلر پروژه خود با استفاده از جاوا یا سایر زبان های مبتنی بر JVM می سازید ، کد خوانا برای انسان را به byte-code کامپایل می کند که توسط JVM یا سایر ماشین های مجازی که در بالای سیستم عامل اصلی اجرا می شوند. در حین اجرا ، VM آن byte-code هارا تفسیر کرده و آنها را به Binary تبدیل می کند که پردازنده ها می توانند آن را پردازش کنند.

مراحل اجرای برنامه تحت VM

در طرف دیگر ، C/C ++ روی ماشین های مجازی اجرا نمی شود و این یک مرحله از چرخه اجرا را حذف کرده و عملکرد را افزایش می دهد. این کد بطور مستقیم سورس کد را برای Binary کامپایل می کند.

مراحل کامپایل برنامه بدون VM

اما مدیریت حافظه در آن زبان ها دردسر بزرگی است. در حالی که اکثر زبان های برنامه نویسی با استفاده از الگوریتم Garbage Collector یا Reference Counting مقداردهی و حذف شی را مدیریت می کنند.

گو در هر دو زمینه به خوبی عمل کرده است. هم مانند زبان های سطح پایین مثل C++/C کامپایل می‌شود. که کارایی گو را به زبان‌های سطح پایین‌تر نزدیک می‌کنم. و همچنین از Garbage collection برای مدیریت حافظه استفاده می‌کند.


نگهداری (maintain) کد نوشته شده با Go آسان است.

بزارید یک چیزی به شما بگویم. Go مانند دیگر زبانها syntax برنامه نویسی دیوانه واری ندارد و دارای syntax بسیار مرتب و تمیز است.

پ.ن: این مورد مزیت و معایب خودش رو داره که در ادامه توضیح می‌دهم.

طراحان Go در گوگل هنگام ساخت این زبان به این نکته توجه داشتند. از آنجایی که google کد بیس بسیار بزرگی دارد و هزاران توسعه دهنده بر روی همان کد بیس کار می کردند ، درک کد برای توسعه دهندگان دیگر باید ساده باشد و یک بخش کد باید کمترین side effect (تداخل شاید بشه معنی کرد!) را روی بخش‌های دیگر داشته باشد. این باعث می شود کد به راحتی قابل نگهداری و اصلاح شود.

گو عمداً بسیاری از قابلیت های زبان های OOP مدرن را کنار می گذارد.

  • گو از class ها استفاده نمی‌کند. همه چیز به چندین package تقسیم می‌شود. گو struct داره بجای کلاس‌ها.
  • از ارث‌بری پشتیبانی نمی‌کند. این باعث می شود کد به راحتی قابل تغییر باشد. در زبانهای دیگر مانند جاوا/پایتون ، اگر کلاس ABC از کلاس XYZ ارث‌بردی کند و شما تغییراتی در کلاس XYZ ایجاد کنید ، ممکن است در کلاسهای دیگری که XYZ را به ارث برده اند side effect ایجاد کند. گو با حذف وراثت ، درک کد را نیز آسان می کند (زیرا هنگام نگاه کردن به یک کد ، هیچ super classای وجود ندارد که بتوان به آن نگاه کرد).
  • بدونِ constructors.
  • بدونِ annotations.
  • بدونِ generics.
  • بدونِ exceptions.

پ.ن: هر کدام از این بدونِ‌ها 🙂 دلایل خودشون رو دارند که در این مقاله نمی‌گنجه.

نکات بالا گو را بسیار متفاوت از زبان‌های برنامه نویسی دیگر می کند و باعث می شود برنامه نویسی در گو هم متفاوت از زبان‌های دیگر باشد. ممکن است برخی از نکات بالا را دوست نداشته باشید. اما ، اینطور نیست که شما نتوانید برنامه خود را بدون ویژگی های بالا بنویسید. تنها کاری که باید انجام دهید این است که 2-3 خط بیشتر بنویسید. اما در جنبه مثبت ، کدِ شما را تمیزتر می کند و وضوح بیشتری به کد شما می بخشد.

جایگاه زبان‌ها بر اساس کد خوانا در برابر کد بهینه

در نمودار بالا نمایش داده می شود که گو تقریباً به اندازه C/C ++ کارآمد است ، در حالی که syntax کد را مانند Ruby ، Python و سایر زبانها ساده نگه می‌دارد. این یک موقعیت برد-برد هم برای انسان‌ها و هم برای پردازنده‌ها است !!!

گو توسط Google پشتیبانی می‌شود.

  • من می دانم که این یک مزیت فنی نیست. اما ، گو توسط Google طراحی و پشتیبانی می شود. گوگل دارای یکی از بزرگترین زیرساخت های ابری در جهان است و به طور گسترده ای مقیاس بندی شده است. گو توسط گوگل برای حل مشکلات پشتیبانی از مقیاس پذیری و اثربخشی طراحی شده است. اینها همان مشکلاتی است که هنگام ایجاد سرورهای با آنها روبرو خواهینم شد.
  • گو همچنین توسط شرکت‌های بزرگ دیگر استفاده می‌شود که در لینک زیر می‌تونید اسامی برنامه‌ها شرکت‌ها و کاربرد استفاده ‌گو در آن را مطالعه کنید. (https://github.com/golang/go/wiki/GoUsers)

خلاصه:

گو عملکرد بسیار بالایی مثل زبان‌های C++/C, مدیریت Concurrency مثل جاوا و سیتنکس باحالی مثل پایتون و پرل داره. اگر برنامه ای برای یادگیری Go ندارید ، باز هم می گویم محدودیت سخت افزاری به ما ، توسعه دهندگان نرم افزار فشار می آورد تا کد فوق العاده کارآمدی (efficient) بنویسند. توسعه دهنده باید سخت افزار را بشناسد و برنامه خود را مطابق آن بهینه سازی کند. نرم افزار بهینه سازی شده می تواند بر روی سخت افزار ارزان تر و کندتر (مانند دستگاه های IOT) اجرا شود و در کل تأثیر بهتری بر تجربه کاربر نهایی بگذارد.

کامت یکی از کاربران که می‌تونه مفید باشه:

Rex Kerr:

گو جنبه های منفی زیادی نیز دارد که بیشتر آنها را به عنوان موارد مثبت ذکر کرده اید. این بدان معنا نیست که گو ارزش یادگیری ندارد (زبان سختی که نیست! چرا که نه!) ، اما این بدان معناست که پروژه های زیادی وجود دارد که نمی خواهید از گو برای آن استفاده کنید.

۱- گو مستقیماً بر روی سخت افزار اجرا می شود بدون اینکه نیاز باشه به سخت افزار کاری داشته باشید ، به طور متوسط ​​سریعتر از جاوا نیست (به benchmarkهای مختلف و Computer Languages Benchmark Game مراجعه کنید). اگر واقعاً می خواهید هر گونه عملکردی را روی سخت افزار خود انجام دهید ، باید از C ، C ++ ، Rust یا برخی از زبان های دیگر که کنترل مناسب را به شما می دهد ، استفاده کنید.

۲- قابلیت های abstraction گو عملاً وجود ندارد. شما می توانید از این زبان برای * انجام * کارها استفاده کنید اما نه برای ایجاد structureهای پیشرفته تر. نکته مثبت – فهم آسان آن است! نکته منفی – ساخت پروژه هایی با structure پیچیده برای همیشه دور از دسترس هستند ، زیرا ایجاد آنها بسیار دشوار است و کامپایلر به شما کمک نمی کند. در مقابل ، زبان هایی مانند C++ ، Scala ، Haskell و غیره مکانیسم های abstraction بسیار قدرتمندی را ارائه می دهند تا به کامپایلر شما بفهماند راه حل انتراعی شما برای مشکل پیچیده چیست تا کامپایلر به شما کمک کند.

۳- گو فقط دارای گوروتین برای همزمانی است. اگر مشکل شما با آن مدل Concurrency به خوبی حل شد ، عالی است! اگر نه ، خوب ، این تنها مدل شماست. سایر زبانها معمولاً ترکیبی از چنین مواردی را ارائه می دهند. گو گوروتین ها را به خوبی انجام می دهد ، بنابراین اغلب می توانید از آنها در مکانهایی استفاده کنید که فکر می کنید به چیز دیگری احتیاج دارید (به عنوان مثال در یک atomic reference).

بنابراین گو عملکردی در سطح جاوا (نه در سطح ++C) با یک رویکرد عالی برای Concurrency ، و زبانی جمع و جور ، مرتب و غیرقابل انعطاف را برای شما فراهم می کند. خوب!

پروژه های زیادی وجود دارد که دقیقاً گو همان چیزی است که شما می خواهید.

نوشته چرا خوبه که Golang رو یاد بگیریم؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

کد تمیز و شیئ گرایی

این مطلب در ادامه سری برداشت‌ها و خلاصه ی کتاب Clean Code، با نگاه به فصل ششم کتاب نوشته شده.

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

این بخش به طور مشخص برنامه نویسی شیئ گرا رو مورد هدف قرار داده و نکته هاش برای کسایی که با زبان های برنامه نویسی شیئ گرا (مثل #C و جاوا و …) کار می‌کنند بیشتر کاربردیه.

قانون اول تعریف ‌‌‌‌Object ها:
هیچ متغیری را به صورت ‌public تعریف نکن مگر این که دلیل محکمی برای اون وجود داشته باشه.

مفهوم Abstraction

یکی از اولین اصطلاحاتی که موقع شروع برنامه نویسی با زبان های شیئ گرا با اون آشنا می‌شید ‌Abstraction نام داره. به طور خلاصه به این مفهومه که ‌Object ای که تعریف می‌شه باید اطلاعات و عملکرد ها رو تا حد ممکن به شکل ساده سازی شده و خلاصه ارائه (expose) کنه. برای درک این مفهوم مثال های بعدی رو ببینید:

هدف کلاس Point به طور مشخص در بر گرفتن اطلاعات یک نقطه در دستگاه مختصات است. در مثال اول در قالب یک کلاس تعریف شده که به طور مشخص به ما اجازه تغییر جداگانه مقادیر x و y را میده و تمام ساختار درونی خودش رو ‌‌expose می‌کنه.‍

مثال دوم اما با تغیر یک ‌interface نحوه کار و تغییر اطلاعات رو به شکل مشخصی ساختارمند می‌کنه. به طور مشخص ما رو مجبور می‌کنه که مقادیر ‌x و y رو یکجا و با هم تغییر بدیم و همینطور در صورت مقدار دهی قطبی هم شعاع و زاویه باید همزمان ست بشن.

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

مفهوم Abstraction به پنهان کردن ساختار داخلی خلاصه نمیشه و ما رو تشویق می‌کنه که موقع تعریف کردن متد های عمومی یک کلاس هم اون ها رو به شکل ساده شده تعریف کنیم. مثال های بعدی رو ببینید:

در دو نمونه interface تعریف شده برای وسیله نقلیه (Vehicle)، مورد اول ما می‌تونیم به طور مشخص میزان سوخت موجود در باک و ظرفیت کلی باک رو جداگانه دریافت کنیم و با اون ها هر کاری لازم داریم انجام بدیم اما توی مثال دوم با در نظر گرفتن Abstraction این دو متد حذف شدند و یک متد جایگزین شده که درصد سوخت باقیمانده نسبت به ظرفیت سوخت وسیله نقلیه رو برمیگردونه و ما دسترسی به اطلاعات درونی ‌‌Object نداریم.

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

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

تفاوت بین ‌Object و Data Structure

هر دو مفهموم Object و Data Structure توی زبان های شیئ گرا توسط کلاس ها تعریف می‌شن و ظاهرشون کاملا شبیه همه. توی این بخش راجع به تفاوت شون وکاربرد هاشون صحبت می‌کنیم و هدفمون اینه که وقتی کد یک کلاس رو می‌خونیم بدونیم با کدوم شون مواجه ایم و همینطور موقع نوشتن کد بهتر انتخاب کنیم که از Object استفاده کنیم یا Data Structure.

به طور خلاصه Object ها کلاس هایی هستند که یک شیئ با عملکرد های مختلف مربوط به اون رو در بر می‌گیرند و Data Structure ها کلاس هایی اند که فقط محل قرارگیری یک سری اطلاعات و مقادیر هستند و برای نگه داشتن اون ها استفاده می‌شن و دارای منطق یا عملکرد خاصی نیستند.

به عنوان مثال ببینیم که با استفاده از Object ها یا Data Structure ها چطوری میشه یک سری شکل و محاسبه مساحت اون ها رو مدل کرد:

توی کد بالا همون طور که می‌بینین شکل های مختلف (دایره، مربع و مستطیل) در قالب ‌Data Structure ها تعریف شدند که فقط در بر گیرنده اطلاعات لازم برای تعریف اون هاست و برای محاسبه مساحت اون ها کلاسی به اسم Geometry تعریف شده که دارای یک متد برای محاسبه مساحت همه شکل هاست و همونطور که می‌بینین متد area از ویژگی های شیئ گرایی استفاده ای نکرده و کاملا به شکل procedural نوشته شده.

اما روش دیگه پیاده کردن همین کد در قالب ‌‌Object های OOP (برنامه نویسی شیئ گرا) به چه شکلی می‌شه؟

توی این روش یک interface به نام shape تعریف شده که تمام شکل ها اون رو پیاده سازی می‌کنن و طبق اون هر کلاس یک متد به اسم area داره که مقدار مساحت اون شکل رو برمیگردونه. تفاوت های کلاس Rectangle توی دو تا مثال رو نگاه کنید تا تفاوت Object و Data Structure رو به طور واضح متوجه شید:

  • در اولی (Data Structure) متغیر ها عمومی هستند و در دومی (Object) متغیر ها خصوصی
  • در Data Structure متدی وجود نداره ( مگر setter و getter) ولی Object ها دارای متد های مربوط به اون Object هستند

هیچ کدوم از این دو روش درست یا غلط نیست و هدف از دیدن شون درک تفاوت هاست تا موقع استفاده بتونید تصمیم بگیرید که کدوم مناسب تر هست.

برای درک منظور تصور کنید که میخوایم تابعی به اسم perimeter اضافه کنیم تا محاسبه محیط رو انجام بده. اگر به روش اول پیاده سازی انجام شده باشه کافیه که این متد داخل کلاس Geometry پیاده بشه و نیازی به تغییر در هیچ کدوم کلاس های Circle و Rectangle و … نیست. در حالی که اگر به روش دوم پیاده کرده باشیم، باید متد perimeter داخل هرکدوم از کلاس ها جداگانه تعریف بشه و به این ترتیب پیاده سازی طولانی تر و حجم تغییرات بیشتر می‌شه.

در نقطه مقابل تصور کنید که شکل جدیدی مثلا مثلث رو میخوایم به نرم افزار اضافه کنیم. اگر نرم افزار به روش اول Data Structure پیاده سازی شده باشه، لازمه که علاوه بر تعریف کلاس جدید برای مثلث، در کلاس Geometry هم محاسبات رو تغییر بدیم تا محاسبه مربوط به مثلث رو هم به درستی انجام بده اما اگر به روش دوم پیاده سازی انجام شده باشه، فقط کافیه کلاس جدیدی رو برای مثلث تعریف کنیم که خودش در بر گیرنده محاسبه محیط و مساحت خودش هم هست و نیازی به تغییر در جای دیگه نداریم.

پس به طور خلاصه اگر در آینده امکان اضافه شدن عملکرد های جدید بیشتر باشه استفاده از Data Structure l انتخاب بهتریه و اگر احتمال اضافه شدن نوع های جدید به سیستم وجود داشته باشه (مانند مثال مثلث) بهتره که از روش Object استفاده کنیم.

به طور خلاصه، قرار نیست همه چیز، همیشه در قالب Object تعریف بشه و گاهی وقت ها بهتره که از Data Structure ها استفاده کنیم و procedure هایی داشته باشیم که روی اون ها کار می‌کنند.

قانون Demeter

قاعده دیمیتر (Law of Demeter) برای جلوگیری از ایجاد ارتباط های پیچیده و عمیق بین ‌Object هاست.

به طور دقیق این قانون می‌گوید که متد f از کلاس C فقط می‌تواند متد هایی از این ‌ Object ها را استفاده کند:

  • متد های کلاس C
  • متد های Object ای که داخل خودش ساخته شده
  • متد های Object ای که جزو ورودی هایش هست
  • متد های Object ای که به عنوان instance variable داخل کلاس C وجود دارد

برای ساده شدن موضوع از یک مثال استفاده می‌کنم:

منظور از همه چیزهایی که گفتیم چیه؟

کلاس User رو ببینید، به طور مشخص این کلاس می‌تونه به متد های کلاس Account دسترسی داشته باشه، همینطور به متد های داخلی خودش و البته داخل متد discountedPrice، می‌تونه به متد های کلاس
Coupon هم دسترسی داشته باشه. اما قانون Demeter توی این مثال کجا نقض شده؟

توی خط شماره ۷ جایی که از متد getPrice که مربوط به کلاس Plan هست استفاده شده. این کلاس در دسترس کلاس User نیست و توسط کلاس Account برگردونده شده و نباید دسترسی به داخلش پیدا کنیم.

به طور ساده قانون Demeter می‌گه هر کلاسی فقط باید با دوستان خودش صحبت کنه و نباید با غریبه ها حرف بزنه. و همینطور می‌گه که دوستان دوستان شما غریبه هستند.

حالا وقتی به چنین عملکردی نیاز داریم چیکار کنیم؟

راه حل گذشتن از این طور مشکل ها یادآوری یک نکته در مورد پیاده سازی ‌Class هاست:

یک Object باید عملکرد های مورد نیاز رو ارائه کنه نه مقادیر رو! یعنی چی؟ یعنی اینجا کلاس Account باید به جای برگردوندن ساده مقدار plan و واگذار کردن بقیه چیزها به کلاس User، مسئولیت محاسبه تخفیف رو به عهده بگیره. در این صورت کد به شکل زیر در میاد و مشکل قانون Demeter به طور کلی حل می‌شه.

این ها بخشی از نکاتی بود که رابرت سی مارتین برای پیاده سازی Object ها در کتاب Clean Code بهش اشاره کرده. مثل تمام پست های این سری، پیشنهاد می‌کنم که اگر این مفاهیم براتون جذاب هست کتاب رو به طور کامل مطالعه کنید.

نوشته کد تمیز و شیئ گرایی اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

برنامه نویسی سایت رو از کجا شروع کنم ؟

یکی از بزرگترین دغدغه های کسانی که تازه میخوان وارد حوزه وبسایت بشن اینه که نمیدونن از کجا باید شروع کنن ، امروز میخوایم تو این مقاله با هم به بررسی این موضوع بپردازیم که نقطه شروع کجاست ؟

قبل از اینکه بریم و شروع کنیم میخوام یک نکته به شدت مهم و حیاطی رو بگم بهتون ، میشه گفت این نکته راز موفقیت شما تو هر کاریه !

اون نکته چیزی نیست جز علاقه .

علاقه باعث میشه شما توی کارتون پیشرفت کنید ، براش بجنگید و تلاش کنید ، چند شب نخوابید ، کارتون بشه تفریحتون و تفریحتون بشه کارتون و …

ممکنه براتون سوال پیش بیاد که از کجا باید بفهمیم به چی علاقه داریم ، به زودی در رابطه با این موضوع یه مقاله مینویسم برای اون هایی که این سوال براشون پیش میاد .

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

اگر به برنامه نویسی علاقه دارید ، بریم ببینیم که بقیه مسیر چیه ؟

طراح یا برنامه نویس ، مسئله این است !

توی حوزه وب سایت ها ما دو تا دسته داریم : طراح های سایت و برنامه نویس های سایت که هر کدوم از این ها کاملا از هم جدا هستند ، البته منظورم از جدا بودن نوع کاری که انجام میدن هست وگرنه کاملا باید با هم در تعامل باشن .

طراح سایت کیست؟

به طور کلی ، شخصی که طرح گرافیکی و شمای کلی یک وب سایت را طراحی میکند طراح وب سایت است .

اگر بخوایم یک مقداری دقیق تر توضیح بدیم ، طراح وب سایت به مفاهیم UI , UX , CX , WireFrame و … ، ابزار هایی مانند photoshop , adobe XD, figma و … تسلط کامل داره ، سعی میکنه با توجه به نوع وب سایت مشخصه هایی رو در طراحی وب سایت به کار ببره تا وب سایت رو جذاب و کاربر پسند بکنه و باعث بشه کاربر تجربه خوبی از کار با اون وب سایت داشته باشه .

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

قبل از اینکه بریم سراغ برنامه نویسی سایت یه نکته ای وجود داره که باید بگم

توی این قسمت ما دو نوع ادم داریم :

  • یا به برنامه نویسی و کد نویسی علاقه دارن
  • یا به برنامه نویسی و کد نویسی علاقه ندارن

اگر شما جزو افرادی هستید که به برنامه نویسی علاقه ندارید میتونید از قالب های اماده و پنل های مدیریت محتوا مثل wordpress , jomla و … استفاده کنید که دیگه نیازی نداره زیاد کد نویسی کنید و خیلی راحت و توی کم ترین زمان سایتتون بالا میاد .

ولی اگر به برنامه نویسی علاقه دارید بقیه مقاله رو حتما مطالعه کنید .

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

برنامه نویسی سایت به طول کلی به دو دسته زیر تقسیم میشه :

  • · برنامه نویس front-end
  • · برنامه نویس back-end

اول از همه به برنامه نویس front-end بپردازیم

برنامه نویس front-end کیست ؟

به کسی که طرح گرافیکی طراح سایت را به یک وب سایت واقعی و کد تبدیل کند برنامه نویس front-end یا برنامه نویس سمت کاربر گفته میشه ، نکته اینجاست که وقتی برنامه نویسی Front-end تموم شد فقط ظاهر یا قالب سایت تکمیل شده و هیچ اطلاعاتی ثبت و خونده نمیشه .

برای مثال یک وب سایت فروشگاهی مثل دیجی کالا رو تصور کنید ، فرض کنید ما داریم این وب سایت رو از اول درست میکنیم ، وقتی بخش Front-end وب سایت تموم میشه ، کسی نمیتون خرید خودش رو یا نظر خودش رو به ثبت برسونه یا کسی نمیتونه با پشتیبانی ارتباط برقرار کنه ، ادمین های سایت نمیتونن محصول به سایت اضافه کنن و هر چیز دیگه ای ، برای این کار ها نیاز هست که وب سایت ما با استفاده از یک زبان back-end به پایگاه داده وصل بشه .

برنامه نویس back-end کیست ؟

به کسی که قالب وب سایت رو با استفاده از یک زبان برنامه نویسی مثل PHP , Node.js , python و … به پایگاه داده وصل میکنه برنامه نویس back-end یا برنامه نویس سمت سرور میگن .

امیدوارم تا اینجای کار کلیت حوزه وب سایت ها رو متوجه شده باشید .

حالا بریم یه مقداری عمیق تر بشیم

برای front-end کار شدن به چه چیز هایی احتیاج هست ؟

برای اینکه front-end کار بشید به ترتیب باید به یادگیری موارد زیر بپردازید :

  • HTML & CSS
  • Responsive Web design

· یک فریم ورک فرانت اند مثل bootstrap یا material design

  • javascript
  • Jquery
  • CSS Preprocessor

· یک فریم ورک مربوط به جاوااسکریپت مثل react.js یا vue.js

اگر شما به طور کامل به موارد بالا مسلط بشید میشه گفت که یک فرانت اند کار حرفه ای و کار کشته هستید .

البته بهتر هست که به این نکته اشاره کنم که بهتره در کنار فرانت اند به طراحی وب سایت هم مسلط باشید .

برای back-end کار شدن به چه چیز هایی احتیاج هست ؟

اول از همه باید یک زبان برنامه نویسی رو انتخاب بکنید .

زبان های برنامه نویسی خیلی زیادی هستند که میشه انتخابشون کرد ، لیست زیر محبوب ترین زبان های برنامه نویسی وب سایت توی دنیا هست :

  • Javascript
  • Python
  • PHP
  • C#
  • Ruby
  • Java

البته زبان های دیگه ای هم هستن مثل Go , Scala , C++ , Perl و خیلی چیز های دیگه ، ولی خب لیست بالا محبوب ترین هاست .

وقتی که به یکی از زبان های بالا مسلط شدید باید یک دیتا بیس یا پایگاه داده انتخاب کنید .

به طور کلی دیتابیس ها به دو دسته زیر تقسیم میشن :

  • SQL
  • NoSQL

این دو یک سری تفاوت های اساسی دارن که توی یه مقاله جدا بهشون میپردازیم .

بعد از اینکه به صورت کامل کار با دیتا بیس رو یاد گرفتید باید برید سراغ چیز های دیگه مثل امنیت و جلوگیری از هک وب سایت ، امنیت داده ها ، فریم ورک های مرتبط با زبان برنامه نویسیتون و خیلی چیز های دیگه .

توصیه من به شما این هستش که بعد از اینکه توی یکی از زمینه های فرانت اند یا بک اند مهارت پیدا کردید حتما سعی کنید یه دستی توی اون یکی هم ببرید .

اگر نمیدونید به شخصی که هم برنامه نویس front-end و هم برنامه نویس back-end هست fullstack میگن .

امیدوارم که این مطلب به دردتون خورده باشه اگر به یک road map دقیق و حرفه ای نیاز دارید میتونید این مقاله رو بخونید

نوشته برنامه نویسی سایت رو از کجا شروع کنم ؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

برنامه نویسی:threadای که اگر run شد، کارت تمام است

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

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

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

در کنار این مسئله یادمان باشد که لزومی ندارد همه‌چیز را به طور کامل یاد بگیریم. تنها اگر دید کلی از آن داشته باشیم، در هنگام حل مسئله کمک شایانی به ما می‌کند. پس هیچ‌وقت خودمان را محدود نکنیم یا به زبان عامیانه‌تر به همه‌چیز سلام کنیم.

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

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

“The best place to hide a dead body is page two of google.”

این جمله مصداق شرح حال بسیاری از افرادی است که با کمی جست‌وجو خسته شده و به بررسی موارد بیشتری نمی‌پردازند.

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

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

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

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

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

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

نوشته برنامه نویسی:threadای که اگر run شد، کارت تمام است اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

چگونه برنامه نویس شویم!

روز ۲۵۶ام هر سال مطابق با ۱۳ سپتامبر (۲۲ شهریور) به عنوان روز برنامه‌نویسان نام گرفته‌است. من هم این پست رو به دعوت شرکت داتین نوشتم تا تجربیات خودم رو در ۲۰ سال اخیر که در این حوزه فعال بوده‌ام بنویسم. اینکه چطور وارد این حوزه شدم، چطور پیش رفتم و چه نقاطی در زندگی کاریم بعنوان نقاط عطف زندگیم بود و منجر به رشد و توسعه خودم شد.

آغاز برنامه نویسی: دبیرستان و کیو بیسیک

حدود سالهای ۷۵ بود که در دبیرستان QBasic وارد زندگی ما شد و من با یک کامپیوتر ۲۸۶ شروع کردم به کدنویسی و بر خلاف بقیه بچه های مدرسه که معمولا از این درس فراری بودند، من عاشق برنامه نویسی شدم. بجز تمرینات ساده ای که معلممون بعنوان تمرین به ما میداد، من سعی میکردم برنامه های جذاب تری بنویسم و حداقل خودم از اجرای اونها لذت ببرم.

دموهای گرافیکی که با زبان سی یا بیسیک میساختیم

اولین برنامه هایی که نوشتم یک ماشین حساب و یکسری دموی گرافیکی بود که تصاویر گرافیکی خاصی را (با کدهایی که توی لوپ میذاشتیم) روی صفحه می کشید و اون سالها برای همه جذاب بود.

ورود به دنیای ویژوال

دنیای ویژوال همیشه برای من جذاب بود و من هم کم‌کم با زبان Visual Basic آشنا شدم و این زبان شد یار همیشگی من. پس از نوشتن چندین برنامه کوچولو توی این محیط، شروع کردم به نوشتن اولین برنامه جدی‌ام که یک برنامه آموزش زبان برای بچه ها بود.

برنامه آموزش زبان Hello baby

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

دیگه کم کم ویندوز ۹۸ وارد بازار شده بود و جا افتاده بود و دیگه مشخص بود که سیستم عامل های بعدی همگی روی محیط ویژوال سرمایه گذاری خواهند کرد.

ورود به دنیای برنامه نویسی وب

اوقات فراغت من معمولا اینجوری میگذشت که از ۱۰ صبح تا ۱۲ شب پای کامپیوتر بودم و در حال تست کردن کدهای مختلفی که توی کتابهای برنامه نویسی میخوندم. حدود سال ۲۰۰۰ بود که به برنامه نویسی صفحات وب علاقمند شدم و کار با HTML رو یاد گرفتم. سعی کردم کار با هاست و دامنه رو یاد بگیرم تا بتونم صفحات خودمو روی اینترنت منتشر کنم. و اولین سایتم رو با HTML و کمی CSS منتشر کردم. اون زمان داشتن یک صفحه contactUS خیلی چیز شاخی توی سایت محسوب میشد و مشکل این بود که این صفحات، نیازمند کدنویسی داینامیک سمت سرور بود.

من که مدتی روی زبان VB کار کرده بودم، برنامه نویسی ASP classic رو در یک موسسه شروع کردم و حالا می تونستم خودم صفحات داینامیک ساده ای رو بسازم. کم کم شروع کردم با دیتابیسها کار کردن. یادم میاد که برای وصل شدن به دیتابیس Access سه تا کتاب مختلف خریدم تا اینکه نمونه کد یکی از اونها کار کرد و من تونستم اطلاعاتم را از صفحه وب بگیرم و توی دیتابیس کار کنم. اینجا حدود سال ۸۱ بود و یه حس خداگونه ای به من دست داده بود… حالا میتونستم برنامه های داینامیک تحت وب بنویسم!

ارایه خدمات طراحی و ابزارهای وبلاگی

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

کار تیمی در پرشین بلاگ

از سال ۸۴ که همکاریم رو با پرشین بلاگ شروع کردم، ده‌ها سایت مختلف رو اونجا طراحی و برنامه نویسی کردم و این همکاری تا سال ۹۱ طول کشید. توی اون دوران کم کم سر و کله تکنولوژیهای دات نت مایکروسافت پیدا شد و من هم به VB.net و ASP.net رو آوردم. استفاده از استک جدید کمک میکرد که بتونم با بقیه بچه های تیم برنامه نویسی (که تجربه های خیلی بیشتری از من داشتند) همراه بشم.

در حوزه برنامه نویسی، آپدیت کردن شما وظیفه خودتونه. این باید طرز فکر شما باشه

آپدیت کردن شما وظیفه خودتونه و در این راه میتونید از همکارانتون هم کمک بگیرید. اما ۹۰٪ کار رو تلاش خودتون شکل میده. اگر بخواهید فقط هرچی که شرکت ازتون میخواد رو انجام بدید و چیزی فراتر از اون یاد نگیرید، پس از یکی دوسال کاملا outdated میشید و از قافله عقب می مونید.

سرویس وبلاگ دهی پرشین بلاگ

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

این دوران بیشترین زمانی بود که من روی یادگیری تکنولوژی های گوناگون وقت میگذاشتم و هر روز یک شگفتی بود. هر تکنیک جدید راه رو به دنیای جدیدی از امکانات توسعه وب باز میکرد.

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

سختی های یادگیری برنامه نویسی

در دهه هشتاد، یادگیری برنامه نویسی کار سختی بود. چون منابع خیلی کم بود و StackOverflow هم نبود که به دادمون برسه. تنها منبع ما کتابهای برنامه نویسی بود که به ندرت گیر می‌اومدند. اما امروزه وجود اینترنت و کامیونیتی های گوناگون برای برنامه نویسان، کمک خیلی زیادی به رشد و یادگیری سریع ما میکنه. اگه الان با اینهمه امکانات هنوز روی یادگیری خودتون سرمایه گذاری نمیکنید، واقعا باید بگم که دارید به خودتون خیانت میکنید و شمای پنج سال بعد، از شمای امروزتون خیلی شاکی خواهد بود.

تمرکز روی طراحی محصول و فرانت-اند

از حدود سال ۹۳ بود که دیگه تمرکزم را روی طراحی فرانت و مدیریت پروژه ها گذاشته بودم و بخش بک-اند رو با تیمی متشکل از چند دوست خارج از شرکت پیش می بردم. دنیای تکنولوژی های وب در حال گسترش بود و نمیشد روی همه ابعادش متمرکز باقی ماند.

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

سخن پایانی

شاید یک مهندس عمران بتونه با مدرکی که گرفته تا ۲۰ سال خونه بسازه و کار کنه. اما برنامه نویسی اینجوری نیست و حتی تکنولوژی های ۵ سال پیش هم دیگه به درد نمی خورند. شما بعنوان برنامه‌نویس، شغل پر چالشی را انتخاب کرده اید و بقول معروف در لبه تکنولوژی قدم میزنید. باید همواره در حال یادگیری باشید تا از دنیای تکنولوژی که با سرعت وحشتناکی داره پیشرفت میکنه عقب نمونید.

روزتون هم مبارک 🙂

نوشته چگونه برنامه نویس شویم! اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

بازی یا ورزش فکری! مربی حل مسائل…

به مناسبت روز برنامه‌نویس، به دعوت داتین قصد دارم موردی که برای خودم پیش اومد بود در مورد ساختار ذهنی برنامه نویس ها و تغییر اون ساختار توسط بازی های فکری تعریف کنم.


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

خیلی وقتا انقدر درگیرش میشم که حس میکنم مغزم وارد یه چالش بزرگ شده و عین وقتی که ورزش میکنم و ماهیچه میسازم مغزم داره ورزش میکنه و تقویت میشه.

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

مشکلی که ممکن یک برنامه نویس دچارش بشه تک بعد شدن یا قرار گرفتن زندگیش توی یه چرخه ی ثابته، به خاطر همین عمدتا میبینیم که راه حل ها، جواب ها و هر چیزی که منجر به حل یک موضوع میشه در قالب یه چهار چوب شکل میگیره (البته این به خود خود بد نیست) که توی برنامه نویسی ممکن تبدیل بشه به یک مشکل بزرگ چون یه وقتایی موضوعات کوچیک هستن ولی راه حل ما براش یه راه بزرگ و Over Qualify میشه (مثلا انتخاب یه معماری بزرگ برای یه نرم افزاری که هیچوقت تعداد یوزرش به اون اندازه زیاد نمیشه) یا خیلی وقتا موضوع و مشکل اونقدر بزرگ هست که ذهن ما برای اون محیط تربیت نشده در نتیجه جواب یا راه حل ما مناسب اون مسئله نیست. همیشه راه حل کار کردن با یک شرکت بزرگ و قرار گرفتن در محیط نیست.

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

چرا بردگیم این تغییرات رو ایجاد کرد؟

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

۱- گیمیفیکیشن و ریسک

همین که شما یه سری مسائل یا ماموریت رو در قالب بازی دارید انجام میدید و از دنیای واقعی رها میشید جرات بیشتری برای ریسک دارید این خودش به مغز ما کمک میکنه Out of the box فکر کنه و چیزی (غیر از قوانین بازی) محدودش نکنه. شما ترسی از بابت از دست دادن منابع یا پول یا هر چیز دیگه ای ندارید چون واقعا وجود ندارن.

۲- هیچوقت نشده یه فضانورد بشی!

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

اما بازی رومیزی به شما اجازه میدن همه اینا باشید.

۳- عطش برنده شدن و پیروز شدن در رقابت

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

۴- خروج از انزوا دیدن طرز فکر دیگران

خیلی وقتا ما تو شغلمون ذهنمون نسبت به یه سری مسائل Bios میشه و از بین بردن اون ساختاری که تو ذهنمون شکل گرفته گاهی سخت میشه. اما اکثر بازی ها اینجوریه که دنبال یه هدفی خاص هستیم و ممکن دیدن استراتژی رقیبمون مارو به وجد بیاره و این خودش باعث هم افزایی میشه در نتیجه مغز ما از اون انزوای تلقینی که ذهنمون ایجاد کرده دور میشیم حتی تو یه سری بازی ها ما باید با همکاری هم بازی رو به سرانجام برسونیم که بهشون میگن بازی های Co. Operative مثل بازی های Pandemic یا Crew و…

۵- اجزای قابل لمس

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

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

اگه شما هم علاقمند شدید که این ورزش فکری رو شروع کنید یا حداقل یک بار امتحانش کنید چندین بازی بهتون معرفی میکنم که بهشون میگن Gateway که برای شروع مناسب هستن.

  • بازی Century – Spice Road (مناسب برای ۲ تا ۵ نفر)
  • بازی آزول یا همون Azul نسخه اولش (مناسب برای ۲ تا ۴ نفر)
  • بازی کودتا+ (مناسب برای ۳ تا ۱۰ نفر)
  • بازی جیپور یا جایپور (مناسب برای ۲ نفر)
  • بازی کاپوچین (مناسب برای ۲ تا ۴ نفر)

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

  • کافه برد
  • کافه بازی بازا
  • کافه گلگسی
  • فکر کرده

سوالی اگر در مورد بردگیم ها یا بازی های فکری داشتید من یه پیج اینستاگرامی دارم که اونجا میتونید معرفی بازی ها رو ببینید یا اگر سوالی براتون پیش اومد بپرسید یکی از پست های همین صفحه رو این زیر میذارم که به پیج دسترسی پیدا کنید

https://www.instagram.com/p/COAo0FOnar9

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

نوشته بازی یا ورزش فکری! مربی حل مسائل… اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

برنامه‌نویسی تابعی در جاوااسکریپت

Functional Programming

این روزها به وفور برنامه‌نویس‌های جاوااسکریپت از برنامه‌نویسی تابعی یا Functional Programming استفاده می‌کنند، حتی شاید شما هم جزو اون دسته از برنامه‌نویس‌ها باشید اما آیا تا به حال شده از خودتون بپرسید که چی باعث می‌شه که از برنامه‌نویسی فانکشنال استفاده کنم؟ تاحالا براتون سوال پیش اومده اصلا مزایای این نوع برنامه‌نویسی چیه؟ چه قابلیت‌هایی داره که شاید هنوز ازش خبر ندارم؟ آیا اصلا به درد من میخوره؟

اگه هنوز جواب سوالات بالا رو پیدا نکردی، من تو این مقاله تا حد امکان سعی کردم پاسخ این سوالات رو بدم.

برنامه‌نویسی تابعی یا Functional Programming چیست؟

قبل از این که برنامه‌نویسی تابعی به این صورت مورد توجه قرار بگیره، برنامه‌نویس‌ها از برنامه‌نویسی شی‌گرا یا Object Oriented Programming استفاده می‌کردند. اون‌ها برای حساب کتاب‌های ساده و یکسری کامپوننت‌های معمولی از توابع استفاده می‌کردند اما رفته رفته با گذر زمان برنامه‌نویسی تابعی جای تازه‌ای رو در برنامه‌هایی که توسعه داده می‌شد پیدا کردند. در واقع در جاوااسکریپت از زمانی که فریم‌ورک‌ها و لایبرری‌ها معرفی شدند، برنامه‌نویسی تابعی بیشتر مورد توجه قرار گرفت و توسط توسعه‌دهنده‌ها بیشتر از قبل استفاده می‌شد. برنامه‌نویسی تابعی یه‌جورایی باید ممنون این فریم‌ورک‌ها و لایبرری‌ها مثل انگیولار، ویو و از همه بیشتر ری‌اکت باشه که با قابلیت‌های جدیدش بقیه رو تشویق به استفاده از برنامه‌نویسی فانکشنال میکنه.

اما خود برنامه‌نویسی فانکشنال چیه؟

برنامه‌نویسی تابعی در واقع یک نوع الگوی برنامه‌نویسی هست که در اون شما بیشتر پروژه‌اتون رو با استفاده از توابع برنامه‌نویسی توسعه میدید؛ این توابع یکسری آرگومان ورودی دریافت میکنن و خروجی‌هایی رو بر اساس این ورودی‌ها برمی‌گردونند.

توجه کنید که برنامه‌نویسی تابعی یک الگو از چندین الگویی است که جاوااسکریپت دارد؛ این که شما از توابع در ساختار کد خود استفاده کنید به این معنی نیست که شما از برنامه‌نویسی فانکشنال استفاده کرده‌اید.


قابلیت‌های فانکشنال پروگرمینگ چیست؟

First-Class Function

از خوبی‌های برنامه‌نویسی تابعی یکی همین First-Class Function بودن اون هست، بدین معنی که شما همیشه می‌تونید بدون هیچ محدودیتی از توابع دیگه داخل توابع دیگه استفاده کنید؛ می‌تونید یک تابع رو به عنوان آرگومان ورودی به تابع دیگه‌ای بدید، از یک تابع اون رو برگردونید و حتی اون رو به یک متغییر نسبت بدید!

این قابلیت به معرفی Higher-Order Functions (HoFs) کمک میکنه.

در واقع HoFsها توابعی هستند که یک تابع دیگه رو به عنوان ورودی دریافت میکنند؛ البته میتونن که در کنار این تابع، آرگومان‌های دیگه‌ای رو هم دریافت کنند. در آخر خروجی به عنوان یک تابع دیگه return میشه.

به این مثال توجه کنید:

const add = (x, y) => x + y

const log = fn => (...args) => {
    return fn(...args)
}

const logAdd = log(add)

در خط دوم تابع log به عنوان ورودی تابعی رو دریافت میکنه که در خط آخر می‌بینید اون تابع add هستش و برای جمع دو عدد تعریف شده و به متغیر logAdd نسبت داده شده. در اینجا ابتدا تابع log به عنوان وارث اجرا میشه و با ریترن کردن فرزند خودش تابع add رو اجرا میکنه.

برای کسانی که برنامه‌نویسی React انجام میدن، این نوع توابع از اهمیت بالایی برخوردار هستند؛ درک این نوع توابع به درک Higher-Order Components در ری‌اکت بسیار کمک خواهد کرد.


Purity (به معنی خالص)

بحث مهم دیگه‌ای که در برنامه‌نویسی تابعی مطرح هست، توابع pure هستند.

اما اول بیاید بررسی کنیم که به چه توابعی توابع pure گفته میشه؟

به تابعی pure گفته میشود که آن تابع هیچ تاثیری بر روی عوامل خارجی که داخل خود تابع تعریف نشده‌اند نگذراد.

برای مثال تابعی که در زیر تعریف می‌کنیم یک تابع pure است:

const add = (x, y) => x + y

این تابع میتونه چندین بار اجرا بشه و در هر بار اجرا خروجی که به ما خواهد داد، جمع دو عددی هست که ما به اون تابع می‌دیم؛ دلیلش هم اینه که ما هیچ متغییری رو خارج از تابع تعریف نکردیم که بر روی تابع تاثیر بگذاره.

اما به تابعی که این زیر تعریف می‌کنم توجه کنید:

let x = 0
 const add = y => (x = x + y)

بیاید برنامه‌رو امتحان کنیم، به صورت زیر تابع رو فراخوانی کنید (کنسول مرورگر رو باز کنید و همینجا امتحان کنید)، خواهید دید که خروجی اول همون خروجی نیست که تو فراخوانی دوم می‌گیرید:

add(1) // returned 1
add(1) // returned 2

ما توابع یکسان با ورودی یکسان رو فراخوانی کردیم اما خروجی یکسان نیست. دلیل هم متغیر x=0 هست که ما به صورت global تعریف کردیم.

Immutability

ما فهمیدیم که چطور توابعی تعریف کنیم که pure باشند اما اگر بخوایم روی متغیر‌هایی که تعریف شده از قبل به صورت global تغییر ایجاد کنیم باید چه کاری انجام بدیم؟
در برنامه‌نویسی تابعی به جای تغییر دادن یک متغیر به صورت لوکال در دل تابع، یک متغیر جدید ساخته میشه و متغیر اصلی (درصورتی که در اصل متغیر تغیری ایجاد نشه) با تغییر در تابع ریترن میشه. این روش کار با داده‌ها، immutability نام دارد.

به مثال توجه کنید:

const add3 = arr => arr.push(3)
const myArr = [1,2]
add3(myArr); // [1,2,3]
add3(myArr); // [1,2,3,3]

در این مثال مفهموم Immutability رعایت نشده؛ چرا که در خروجی مشخص هست که مقدار متغیر global ما تغییر کرده و در فراخوانی دوم، خروجی مقداری نابرابر با خروجی در فراخوانی اول هست با این که همان تابع دوبار فراخوانی شده.

با تغییر دادن push در کد بالا و جایگزین کردن با concat، متغیر اصلی تغییری نمیکنه و خروجی ما در هر فراخوانی متغیر جدید هست:

const add3 = arr => arr.concat(3)
const myArr = [1, 2]
const result1 = add3(myArr) // [1, 2, 3] 
const result2 = add3(myArr) // [1, 2, 3]

حالا با هربار فراخوانی تابع، میشه متوجه شد که مقدار متغیر myArr، تغییری نمیکنه.

Currying

یک تکنیک متداول و پرکاربرد دیگه در برنامه‌نویسی تابعی، currying است.

درواقع Currying تبدیل کردن یک تابع با چند متغیر ورودی به تابعی با یک متغیر ورودی و return کردن تابعی دیگر است.

به صورت ریاضی تابع f(x,y)=x+y رو در نظر بگیرید.

برای currying کردن این تابع به صورت زیر عمل می‌کنیم:

f(g(x)) = x + g(x)
g(x) = y

حالا اگه x=3 و y=2 باشه، جواب f(x,y) با f(g(x)) برابر هستش اما فرق اینجاست که ما در تابع اول دو پارامتر x,y رو به تابع دادیم اما در تابع دوم فقط پارامتر x رو دادیم و به ما تابع g(3) رو برگردوند که g(3)=2 بود.
حالا با با جایگذاری می‌بینیم که f(g(3) = x + g(3) میشه f(2)=3+2=5.
همون تابع f(x,y) فقط اینبار با یک متغیر.

برگردیم به برنامه‌نویسی؛ با تابع add که بالاتر تعریف کردیم کار می‌کنیم.

تابع add دارای دو متغیر ورودی بود:

const add = (x, y) => x + y

میتونیم تابع add رو به صورت زیر تعریف کنیم:

const add = x => y => x + y

حالا از روش بالا میتونیم به صورت زیر استفاده کنیم و می‌بینید که چقدر کاربردی و بدرد بخوره این نوع تعریف تابع:

const add1 = add(1) 
add1(2); // 3 
add1(3); // 4

Composition

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

به مثال توجه کنید:

const add = (x, y) => x + y 
const square = x => x * x

ما در اینجا دو تابع مختلف رو داریم که میتونن باهم ترکیب بشن و یک تابع با قابلیت جمع دو عدد و سپس به توان ۲ رسوندن عدد حاصل از تابع جمع رو داشته باشیم:

const addAndSquare = (x, y) => square(add(x, y))

این کاربرد ساده‌ای از الگوی Composition بود که قطعا در پروژه‌های بزرگ با قابلیت‌های جالب‌تر اون آشنا خواهید شد.


مزایای برنامه‌نویسی تابعی یا Functional Programming

سرراست، مختصر و مفید

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

تعاریف Pure و Immutable بودن در برنامه‌نویسی تابعی

از مهم‌ترین چیزهایی که در برنامه‌نویسی تابعی مورد توجه قرار میگیره Immutable و Pure بودن هست. این قابلیت به دیباگ کردن کد‌ها به قدر قابل توجهی کمک میکنه. فرض کنید در پروژه‌ای قرار به تغییر یک متغیر باشد، اگر توابع شما Pure نباشن باز هم تغییر دادن این متغیر کار ساده‌ایه؟ عملا غیر قابل تغییر میشه.
همین موضوع باعث میشه که تو از دیباگ کردن هم به مشکلات زیادی بر بخوریم و عملا نگهداری کد بسیار سخت میشه.


نتیجه‌گیری

تقریبا برنامه‌نویسی تابعی داره تبدیل به یک استاندارد برای کدهای جاوااسکریپت و نگهداری از اون‌ها میشه.

تقریبا بیشتر لایبرری‌ها و فریم‌ورک‌ها به سمت برنامه‌نویسی فانکشنال در حرکت هستن و بسیاری‌شون مثل ری‌اکت قدم‌ها بزرگی مثل React Hooks برداشتن و توسعه دهنده‌های این اکوسیستم رو تشویق به استفاده از برنامه‌نویسی فانکشنال میکنند.


از این که تا انتهای این مقاله رو مطالعه کردید ممنونم.

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

نوشته برنامه‌نویسی تابعی در جاوااسکریپت اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

برنامه نویسی، چرا و چگونه؟

سلام!‌ فکر نمی کردم حالا حالا ها دوباره بنویسم،‌ ولی نوشتن دفعه قبلیم بهم مزه کرد و امروز هم یه اتفاقی افتاد که دلم خواست دوباره بنویسم،‌ پس برگشتم. 🙂

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

به نظرم مهم ترین و اولین سوالی که یه معلم باید به شاگرداش جواب بده اینه که “چرا اینو یاد می گیریم؟”. یادمه خودم تو دبیرستان خیلی وقتا اینو از معلم هام می پرسیدم و اون درس هایی که معلمشون لزوم و کاربرد درس رو قشنگ توضیح می داد مشتاق تر بودم و با جدیت بیشتری دنبالشون می کردم و بهتر هم یاد می گرفتمشون تا درس هایی که معلمشون می گفت “چون باید یاد بگیریم”.

برای اون کلاسی که قرار بود تشکیل بشه به “چرا برنامه نویسی؟” و این که چجوری مختصر و مفید به شاگردام توضیح بدمش فکر می کردم و امروز هم موقعیتی پیش اومد که داشتم توضیح می دادم “چگونه برنامه نویسی رو یاد بگیریم؟”،‌ و حالا می خوام این جا به هر دو سوال جواب بدم. و لازمه همین اول یاداوری کنم که من خودم یه آدم خیلی تازه واردم که وسواس خوبی هم رو مراحل یادگیری خودش داره،‌ سعیم رو می کنم که خوب توضیح بدم،‌ ولی اگه اشتباهی کردم به بزرگی خودتون من رو ببخشید و لطفا درستش رو هم بهم بگید. 🙂

چرا؟

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

ما با برنامه نویسی کردن می تونیم با این مهمونای جدید سیاره مون که خودمون هم خلقشون کردیم در ارتباط باشیم و بهشون دستور بدیم و ازشون استفاده کنیم.

می تونیم بهشون دستور بدیم برامون صفحه سایت بسازن،‌ می تونیم بهشون دستور بدیم کد های ژنتیکی ریسزچی که داریم انجام می دیم رو آنالیز کنن،‌ می تونیم بهشون دستور بدیم اطلاعات فروش شرکتمون رو برامون بررسی کنن، می تونیم بهشون دستور بدیم مسیر ماهواره ای که می خوایم بفرستیم تو فضا رو برامون شبیه سازی کنن و … و ما برای همه اینا احتیاج داریم که یه جوری با این ماشین های دوست داشتنی حرف بزنیم.

چگونه؟

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

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

خیلی ها چون تفکر کامپیوتری رو یاد نگرفتن،‌ از برنامه نویسی می ترسن،‌ یا فکر می کنن برنامه نویسی فقط مال باهوش هاست در حالی که اینطور نیست!‌ شما تفکر کامپیوتری رو که تو ذهنتون ایجاد کنید یاد گرفتن زبان های برنامه نویسی خیلی راحت تر از یاد گرفتن زبان های انگلیسی و فرانسوی و … می شه. اون تفکر کامپیوتری هم یه چیز کاملا اکتسابی و تمرین محوره که باید وقت بذارید تا یادش بگیرید. استعداد هم تنها کمکی که می تونه بهتون بکنه می تونه سرعت رشدتون رو بیشتر کنه. اصل علاقه و پشتکاره.

حالا تو چهار تا قدم و چند تا نکته بهتون توضیح می دم که چجوری برنامه نویسی رو یاد بگیرید.

قدم اول:

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

توصیه من به شما یه کورس آکادمیک محوره،‌ و حتما هم همراه استاد و کلاسش تمریناشون رو حل کنید. تمرین حل کردن و دست به کد شدن خیلی مهمه.

Introduction to computer science and programming in python

CS50: Introduction to computer science

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

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

نکته: از کثیف شدن دستاتون تو کدنویسی تمرینی نترسید! از اینترنت کمک بگیرید ولی هیچ وقت دنبال لقمه جویده شده نباشید. به مرور زمان دستتون تمیز می شه …

نکته مهم:

leetcode.com

الان وقتشه که با لیت‌کد آشناتون کنم. لیت‌کد یه بانک بزرگ و کامل مسئله ست که کمکتون می کنه تفکر کامپیوتری و مهارت حل مسئله تون رو تقویت کنید. لیت‌کد دوست خوبیه که از این جا (بعد قدم اول و قبل قدم دوم) تا استارتاپ دوستاتون و bay area همراهیتون می کنه. سعی به صورت موازی با بقیه قدم هاتون ای لیت‌کد هم استفاده کنید.

قدم دوم:

یه توصیه کوچک دارم برای قبل از برداشتن قدم دومتون؛ یکم هابی پروجکت بزنید،‌ اون لذتی که بعد ران کردنش بهتون دست می ده و نتیجه کارتون رو می بینید هم خستگی قدم اول رو از بین می بره هم برای قدم دوم بهتون انگیزه می ده.

اینجا قراره هم دستتون رو تو کد زدن ورزیده کنید، هم مغزتون رو برای حل مسئله هوشمند کنید.

چطوری؟

با یاد گرفتن مفاهیم “ساختمان داده و الگوریتم”

خودتون تو یوتیوب و گوگل سرچ کنید و ببینید با چه کورس و استایلی حال می کنید و با همون مفاهیم ساختمان داده و الگوریتم رو یاد بگیرید. اینجا تاکید و توصیه خاصی ندارم، فقط اگه براتون سواله این قدم رو خودم با کورس mit گذروندم.

قدم سوم:

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

اینجا بهتون توصیه می کنم که از حوزه های مختلف، هر کدوم یکی دو تا هابی پروجکت بزنید، دو تا دیتاساینس بزنید، دو تا بکند بزنید و … و خیلی هم تو این مرحله به خودتون زحمت ندید! یوتیوب رو باز کنید و پروژه های اماده رو همراه با یوتیوبره بزنید، اینجا هدف یاد گرفتن نیست، هدف اینه که لذت مهارتی که یاد گرفتید رو بچشید و طعم های مختلفش رو مزه مزه کنید تا دریابید که بیشتر به کدوم تمایل دارید.

تو این مرحله خود من کارای

https://youtube.com/c/KGMIT

رو خیلی دوست داشتم. کیوت و جالب توضیح می ده و کد می زنه.

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

قدم چهارم:

اینجا می تونید وارد بازار کار و کاراموزی و … بشید و میوه درختی که پرورشش دادید رو بخورید. 🙂


موفق باشید

نوشته برنامه نویسی، چرا و چگونه؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

کامیپوتر با صفر و یک کار می‌کند، چطور همه‌ی چیزهای زیبا با صفر و یک ساخته می‌شوند؟

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

تصویر نمایشی است! فاز هکری نداریم!

چیزی که اینجا می‌نویسم، درواقع ریشه در درس‌های مدار منطقی، معماری کامپیوتر، ریزپردازنده و اسمبلی، مبانی کامپیوتر، شبکه و شاید کمی بیشتر است اما سعی می‌کنم تا حد امکان ساده توضیح دهم. اگر جایی بی‌دقتی علمی دارد یا می‌شود بهتر توضیح داد حتما بگویید.

دنیای دیجیتال بین همه مقادیر دنیای آنالوگ فقط تعدادی مقدار گسسته را برگزید، در واقع دو مقدار در دنیای کامپیوتر‌های امروزی که این دو مقدار گسسته ۰ و ۱ هستند، اینکه ۰ و ۱ هرکدام معادل چه ولتاژی در آنالوگ هستند چندان مهم نیست مثلا منفی ۵ و مثبت ۵ یا ۰ و ۵. در این مرحله ولتاژ abstract شده و فقط با ۰ یا ۱ بودنش کار داریم. چرا مقدارهای بیشتری مثلا ۳ و ۴ گرفته نشد؟ اتفاقا تلاش‌هایی شد: (درمورد ternary computer بخوانید) اما پیاده‌سازی قطعات آن‌ها سخت‌تر بود، کلیت ایده هم تفاوتی ندارد، مثلا همچنان می‌توان پرسید با ۴ مقدار چطور می‌توان همه چیز را پیاده سازی کرد.

یادگیری باینری بی‌مصرف است.

اگر موضوعی که در این مطلب سعی دارم پوشش دهم را سرچ کنید، اکثر مطالب به شما باینری (مبنای ۲) یاد می‌دهند، یعنی می‌گویند که ۱۱۰۰۱ در واقع نمایش عدد ۲۵ در مبنای دو است، یا اینکه چطور با روش تقسیم‌های متوالی یک عدد را به نمایش مبنای دو ببریم؟ این هم علم مفیدی است و برنامه‌نویس‌ها گاهی مجبور می‌شوند خودشان یک عدد را به مبنای دو ببرند یا نمایش باینری یک عدد را بخوانند و متوجه شوند مربوط به چه عددی است.

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

از همان مثال‌هایی که جواب سوالمان را نمی‌دهد.

بیت و بایت هم بی‌مصرف هستند.

شاید بسیاری از آموزش‌های کامپیوتر هم به شما بگویند که در کامپیوتر هر کدام از صفر و یک‌ها یک «بیت» (bit) است، یعنی یک بیت می‌تواند «یک» باشد یا «صفر». حالا هر ۸بیت را در یک دسته می‌گذاریم و اسمش را «بایت» (Byte) می‌گذاریم. خب این چه کمکی می‌کند؟ متاسفانه باز هم هیچ. البته دانستن این موضوع هم یکی از اجزای مهم برای فهم ادامه مطلب است برای همین اینجا آوردم تا اگر به گوشتان نخورده آشنا شوید.

حالا که بحث بیت شد یک سوال حاشیه‌ای هم جواب دهم: کامپیوتر من ۶۴ بیتی است یعنی کلا ۶۴ تا بیت دارد؟ یعنی فقط ۶۴ تا صفر و یک؟ جواب این است که نه، کامپیوتر شما بیشتر از این حرف‌ها صفر و یک دارد، این یکی از شاخص های اندازه‌گیری است که خیلی هم مهم نیست.

داده‌ها و دستورها را بشناسیم.

فرض کنیم که کامپیوتری درکار نیست و فقط خودمانیم. حالا می‌خواهیم یک مساله ریاضی حل کنیم، این مساله ریاضی دبستان یک‌سری عدد به ما می‌دهد و یک‌سری دستور که روی این اعداد پیاده‌کنیم، به عدد‌ها بگویم داده (value) و به دستورها (مثلا ضرب کن یا تقسیم کن یا جمع کن) بگوییم دستور (instruction).

برای کامپیوتر هم که ماشین محاسبات است هردوی این‌ها معنی‌دار است، یک‌سری دستور دارد که باید انجام دهد و یک‌سری داده دارد که عملیات روی این‌ها انجام می‌شود، حتی اگر ماشین حساب را یک کامپیوتر در نظر بگیریم (که تقریب بدی هم نیست)، یک‌سری داده دارد (اعداد) و یک‌سری دستور (مثلا عملیات‌های ریاضی) که آن‌ها را می‌فهمد و روی داده‌ها اعمال می‌کند.

کامپیوتر: تشکیل شده‌ از پردازنده، مموری و حافظه جانبی.

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

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

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

بازی با اعداد

بیایید کمی دانش ریاضیات گسسته را به مفاهیم بیتی و بایتی هم اضافه کنیم،.

اگر هر بیت دو حالت داشته باشد، یعنی یک بیت می‌تواند ۲ حالت مختلف را نشان دهد.

حالا دو بیت کنار هم چند عدد را می‌توانند نشان دهند؟ بیایید حالت‌ها بنویسیم: ۰۰و ۰۱و ۱۰ و ۱۱، یعنی ۴ حالت.

برای ۳ بیت چی؟ برای ۳ بیت نتیجه دوبرابر جواب ۲ بیت است یعنی ۸ حالت. (۲ به توان ۳)

یک بایت (یا همان ۸بیت) که یک اندازه محبوب برای برنامه‌نویس‌هاست می‌تواند دو به توان ۸ (۲۵۶) حالت مختلف را برای ما بسازد.

در ۴ بایت (یا ۳۲ بیت) چند حالت مختلف می‌توانیم داشته باشیم؟ ۲ به توان ۳۲ حالت. (4294967296)

نشان دادن چیزهای مختلف با صفر و یک

بالاخره مقدمه تمام شد! در این قسمت می‌خواهیم به ۰ و ۱ ها کم‌کم معنی بدهیم.

حالت‌های مختلف چه معنی‌ای می‌دهند؟

وقتی می‌گویم یک بایت می‌تواند ۲۵۶ حالت مختلف را نشان دهد تقریبا مشخص است، یعنی ۲۵۶ شکل مختلف دارد که هر کدام می‌تواند یک معنی مختلف داشته باشد، اما این معنی‌ها چه چیزایی هستند؟ آیا کامپیوتر خودش این ۲۵۶ حالت مختلف را می‌فهمد؟

نه کامپیوتر خودش ۲۵۶ حالت را نمی‌فهمد، خود این حالت‌ها هم به خودی خود هیچ معنایی ندارند، مثلا 00011001 یکی از آن ۲۵۶ حالت است اما به خودی خود هیچ معنایی ندارد، حتی یک برنامه‌نویس خبره هم از این به تنهایی هیچ برداشتی نمی‌کند. شاید بگویید که نه ما کمی مبنای دو یاد گرفتیم، این عدد همان ۲۵ است که بالا دیدیم، اما بگذارید مخالفت کنم.

چرا 00011001 همان ۲۵ نیست؟

اگر در دنیای ریاضی صحبت می‌کردیم، 00011001 در واقع ۱۱۰۰۱ بود، چون نگفتم در مبنای ۲ است، هر عددی که فقط از ۰ و ۱ تشکیل شده که لزوما در مبنای دو نیست! در ریاضی برای اینکه مشخص کنیم 11001 باید چطوری خوانده شود از یک نگارش خاص استفاده می کنیم، مثلا پایین سمت راست عدد مبنایش را می‌نویسیم.

یک نمونه از نمایش ریاضی برای عددها

چرا در ریاضی این کار را می‌کنیم؟ برای اینکه مشخص باشد این دنباله‌ای از اعداد که پشت سر هم نوشته‌ایم چطور تفسیر می‌شود، در کامپیوتر هم نیاز به چنین چیزی است اما فعلا آن را نداریم، بنابراین سرخود 00011001 را به ۲۵ تفسیر نمی‌کنیم بلکه باید ببینیم چطور تفسیر می‌شود؟ بدون روش تفسیر فقط یک دنباله از ۰ و ۱ ها داریم.

درست است که یکی از روش‌های تفسیر مهم همین مبنای دو است و هر رشته‌ای از ۰ و ۱ ها را می‌توانیم مبنای دو در نظر بگیریم اما آیا واقعا این کار صحیح است؟

مثلا دنباله زیر را در نظر بگیرید:

یکسری ۰ و ۱ با معنی نامعلوم!

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

فرق عدد با نمایش چیست؟

عدد یک چیز انتزاعی است، مثلا عدد ۱ است، همه ما وقتی به یک فکر می‌کنیم یک چیز واحد در ذهنمان می‌آید، همچنین عدد دو یا عدد پی، حتی با اینکه عدد پی به شکل دقیق محاسبه نشده ولی به یک عدد واحد فکر می‌کنیم.

اما نمایش (representation)، شکلی است که عدد را روی کاغذ می‌نویسیم مثلا «۰» یا «۱» یا «۲۵» (برای آخری فرض کنیم مبنا ده است) نمایش هستند.

یک عدد می‌تواند چند نمایش داشته باشد مثلا ۲۵ را می‌توانیم با باینری هم نمایش دهیم که می‌شود 11001. همچنین یک رشته از ارقام هم می‌تواند نشان‌دهنده‌ی چند عدد مختلف باشد مثلا ۱۰ بسته به اینکه در چه مبنایی بخوانیمش عدد متفاوتی می‌شود!

اگر این میم رو متوجه نشدید اشکال نداره! میگه برای کسی که مبنای چهار می‌فهمه، نمایش چهار به شکل “10” میشه اما برای کسی که مبنای ده می‌فهمه، نمایش ده به شکل “10” می‌شه.

پس برای اینکه یک عدد را نمایش دهیم باید یک نمایش را انتخاب کنیم، مثلا مبنای ۲ یا ده‌دهی نمایش‌هایی هستند که بلدیم، از طرف دیگر برای اینکه رشته از ارقام را تفسیر کنیم (عددش را بفهمیم) نیاز داریم که بدانیم از چه نمایشی استفاده می‌کند.

نمایش‌های اعداد مخصوص کامپیوتر

همه‌ی نمایش‌های ممکن، در ریاضی نیستند، ریاضیدان‌ها بر حسب نیاز خود که روی کاغذ می‌نوشتند یک نمایش برای هر مبانی درست کردند، اما اینکه روی کاغذ می‌نوشتند آزادی‌ای‌ به آن‌ها می‌داد که برنامه‌نویس‌ها روی کامپیوتر نداریم، بیاید به اعداد غیر از طبیعی نگاه کنیم، مثلا عدد منفی ۲۵، ریاضی‌دان‌ها در مبنای ۲ آن را به شکل 11001- نشان می‌دهند اما در کامپیوتر که فقط ۰ و ۱ داریم، منها رو باید چکار کنیم؟! یا مثلا برای اعداد اعشاری مثلا 12.5 را به شکل 1100.1 نشان می‌دهند اما بازهم در کامپیوتر فقط ۰ و ۱ داریم و نقطه‌ی اعشاری هم نداریم.

برای حل این مشکل، یعنی نشان دادن اعداد اعشاری یا علامت‌دار در کامپیوتر نمایش‌های متفاوتی بر پایه‌ی همین ۰ و ۱ درست کرده‌اند، توضیح همه ان‌ها اینجا جا نمی‌شود اما مثلا می‌توانید فرض کنید که جدا از خود عدد یک بیت داریم که نشان می‌دهد عدد مثبت است یا منفی. مثلا 011001 می‌شود عدد ۲۵+ و 111001 می‌شود ۲۵−. البته به این سادگی نیست مثلا این روش دو تا صفر دارد (مثبت صفر یا منفی صفر) به این روش اشکال‌دار «علامت و مقدار» (sign and magnitude) می‌گویند.

برای مطالعه بیشتر در این مورد می‌توانید اسلاید‌های number representation از این لینک را بخوانید.

چطور یک نمایش‌ برای کامپیوتر معنا پیدا می‌کند؟

فرض کنیم تنها چیزی که می‌خواهیم نشان بدهیم اعداد مثبت و منفی هستند و از همین نمایش اشکال‌دار «علامت و مقدار» که پاراگراف بالا معرفی شد استفاده کنیم، آیا با این قراردادی که ما کردیم کامپیوتر می‌فهمد که 011001 یک عدد مثبت است و به معنی مثبت ۲۵ است؟

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

اما اگر قرار است کامپیوتر چیزی را نفهمد پس چطوری محاسبه انجام می‌دهد؟ چطور به او بگوییم یک عدد را با دیگری جمع کن؟ حالا این دو عدد با نمایش «علامت و مقدار» در حافظه وجود دارند یا هر نمایش دیگری.

بگذارید من یک سوال دیگر بپرسم، اصلا چطور به کامپیوتر بگوییم یک کار را بکن؟ حالا اصلا هرکاری!

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

بنابراین برای اینکه کامپیوتر بتواند یک عدد «علامت و مقدار» را بعلاوه یک کند، باید برای اینکار طراحی شده باشد و یک دستور برای اینکار داشته باشد، اما متاسفانه پردازنده‌ها برای این نمایش طراحی نشده‌اند و چنین دستوری ندارند به جایش دستوری دارند که عددی که در سیستم نمایش «مکمل ۲» نمایش داده شده را بلاوه یک کنند چون سیستم مکمل دو سیستم رایجی است که اعداد علامت‌دار را با آن در کامپیوتر نشان می‌دهند.

کامپیوتر از کجا می‌داند که عدد ما قرار است چند بایت باشد؟

وقتی به کامپیوتر می‌گوییم عددم را با یک جمع کن (اسم دستور inc است) از کجا می‌داند این عدد تا کجا است؟ مثلا ۲۵ در باینری علامت و مقدار می‌شود ۶ رقم اما ۲۵۰۰ می‌شود ۱۵ رقم، کامپیوتر از کجا می‌داند که چند رقم باید ادامه دهد تا آخر عدد را پیدا کند؟

در نوجوانی فکر می‌کردم که بعد از عدد حتما یک الگوی خاصی قرار می‌دهند مثلا 11111111 که کامپیوتر از روی آن می‌فهمد که دیگر عدد تمام شده و نباید جلوتر را بخواند (هرچند این شیوه هم واقعا جاهایی استفاده می‌شود!)

اما برای اعداد روش خیلی ساده‌تر است، عدد در کامپیوتر طول مشخصی دارد، ۴ بایت یا همان ۳۲ بیت! اگر عددمان کوچکتر بود چیکار کنیم؟ پشتش صفر می‌گذاریم.

اگر عدد بدون علامت باشد با این روش نهایتا همان ۲ به توان ۳۲ منهای یک که در قسمت بازی با اعداد گفتیم را می‌تواند نگه دارد اما اگر عدد علامت دار باشد یک بیت برای علامت می رود پس بزرگ‌ترین عدد نصف این عدد است. (۲ به توان ۳۱)

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

(البته ۴ بایت برای پردازنده‌های arm آن هم ۳۲ بیت دقیق است، برای سری x86 اعداد مختلفی هست ولی معمولا از بین اعداد ۱ یا ۲ یا ۴ یا ۸ بایت خارج نیست)

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

خب تا اینجا دیدیم که برای اعداد علامت‌دار باید خود پردازنده یک دستور مخصوص این کار داشته باشد، اما آیا پردازنده برای همه چیز دستور دارد؟ مثلا برای عدد اعشاری یا تصویر هم یک instruction خاص داریم؟ نه.

البته برای عدد اعشاری اکثر پردازنده‌ها استاندارد ممیز شناور IEEE 754 را پشتیبانی می‌کنند اما این فقط یک حالت است، هرجور دیگری که بخواهیم قرارداد کنید پردازنده کمکی به شما نمی‌کند، به جز عدد هم که پردازنده کلا کمکی نمیکند، اما برای نمایش تصویر چه کار باید بکنیم؟

برای کاربردهای دیگر باید برنامه خودمان را طوری بنویسیم (یعنی instructionها را طوری دنبال هم قرار دهیم) که کاری که می‌خواهیم بکنیم را با دستورات دیگر انجام دهد، در این باره در قسمت‌های بعد بیشتر می‌خوانیم.

نمایش کارکترها با ASCII

اَسکی یا ASCII یکی از ساده‌ترین مشکلاتی است که حل می‌شود و مثال خوبی برای شروع است، فرض کنید به جز عدد می‌خواهیم یک چیز دیگر هم نمایش دهیم: کارکترهای انگلیسی.

26 تا حرف انگلیسی داریم که با کوچک و بزرگش می‌شود 52 تا، با کارکترهای خاص مثل علامت تعجب و درصد و ویرگول و .. نهایتا به ۱۰۰ تا نمی‌رسد، پس می‌توانیم همه حروف انگلیسی را با یک بایت نمایش دهیم. یادمان هست که بایت ۸ بیت بود و می‌توانست ۲۵۶ حالت مختلف داشته باشد.

حالا باید یک mapping یک به یک از هریک کارکترها به یک نمایش بیتی داشته باشیم، یعنی در واقع قرارداد می‌کنیم که هر کدام از کارکترها یک عدد بین ۰ تا ۲۵۵ باشند. این قرارداد را در جدول اسکی می‌توانید ببینید:

جدول اسکی محبوب

به جدول نگاه کنیم، ستون DEC یک عدد ده‌دهی را نشان می‌دهد، ستون chr یکی از کارکترهایی که در قرارداد هستند آمده، البته ستون سمت راست شاید خیلی آشنا به نظر نرسد چون کارکترهای خاص برای نیاز داخلی کامپیوتر هستند اما ستون دوم و سوم و چهارم کارکترهای آشنای خودمان هستند. قسمت Hex هم معادل مبنای ۱۶ (Hexadecimal) از عدد ده‌دهی است و نکته خاصی ندارد!

(فرض کنیم) این استاندارد کاملا جدید است، کامپیوترها در زمان ساخت هیچ چیزی در مورد اسکی نمی‌دانند اما با کمک برنامه‌هایی که می‌نویسیم می‌توانیم با اینها کار کنیم، مثلا یک عدد ۶۵ را نگه می‌داریم و آن را یکی اضافه می‌کنیم، در واقع کارکترمان از A تبدیل به B شد! اینکه چطوری این عدد را روی مانیتور نمایش می‌دهیم بماند برای یک قسمت دیگر!

برای کارکترهای فارسی و ایموجی‌های دوست داشتنی هم از یک قرارداد مفصل تر استفاده می‌شود به اسم Unicode.

خوبی قرارداد ASCII این بود که همیشه در یک بایت جا می‌شد، اما Unicode اینطوری نیست، در واقع Unicode یک جدول بسیار بزرگ از کارکترهای همه زبان‌ها و همه‌ی ایموجی‌ها دارد (character set)

اما همچنین یکسری نمایش (representation) مختلف هم وجود دارد، مثلا UTF-8 یا UTF-16 یا UTF-32 که تلاش می‌کنند این کارکترها را به ترتیب در یک بایت، دو بایت و چهار بایت جا دهند. (character encoding)

اینکه UTF-8 تلاش می‌کند هزاران کارکتر را با یک بایت نشان دهد هم جالب است، دقت کنید که تلاش می‌کند و لزوما موفق نمی‌شود! همگی در حداکثر حالت به ۴ بایت می‌رسند اما در جاهایی که بشود (مثلا اوایل لیست Unicode) از تعداد بایت‌های کم‌تری استفاده می‌کنند.

توجه: این قسمت یه مقدار نادقیقه، استانداردهای بسیار بیشتری هم داریم که دلایل تاریخی دارند اما ایده کلی همین است که خواندید.

در قسمت‌های بعدی در مورد چیزهای زیر می‌خوانیم:

۲− خود پردازنده چطور با ۰ و ۱ محاسبات را انجام می‌دهد؟ (دستورات زبان ماشین و پیاده سازی منطقی‌شان)

۳- رنگ، تصویر و ویدیو و کارت گرافیک چطور پردازش می‌شوند و نمایش داده می‌شوند.

۴- اطلاعات چطور منتقل می‌شوند. (گذری بر peripheral و لایه‌های شبکه)

۵- برنامه نویسی چطوری انجام می‌شود: کامپایلر و مفسر

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

گردآوری توسط ایده طلایی

:::::Unspecified identity هویت نامشخص:::::

SUPER AI

خب عنوانی ک دیدین اسم پروژه منه دلیلش اینه ک تهش معلوم نیس چی میخاد بشه برای همین تعداد بی نهایت احتمال وجود البته ک بنظر من همه چی تو طبق قانون خاصی پیروی میکنه برای همین هیچ چیز تو دنیا بی نهایت نیس و محدودیت هم داره چون وقتی از محدوده ی چیزی خارج بشی هرج ومرج ب وجود میاد.

چیزی ک تو ذهنمه ی چیز مبهمه برای همین ترجیح میدم مرحله مرحله برم جلو تا مسیرمون یکم واضح تر شه

UI-project Unspecified identity project اسم هستش ک فعلا براش انتخاب کردم

خب این چیزی ک من میخام بسازمش یجور پلتفورم به حساب و اینکه چقد اختیار و آزادی داره

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

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

بازم فک کردم دیدم هیچ نظری ندارم همینطوری میرم جلو ببینم چی پیش میاد

خب دیگه شروع کنیم ببینیم باید چ کنیم

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

چیزایی ک واسه ساخت ی برنامه نیازه ی الگوریتم خوب و زبانای برنامه نویسیِ ,

برنامه نویسی یا programming

من خیلی دنبال برنامه نویسی بودم ولی وقتی وارد دنیای پروگرمینگ میشی با ی دریای زبان مواجه میشی ک سردرگمت میکنه

و خیلی هام غرق شدن تو این دریا چون زبان اشتباهی رو انتخاب کردن اگه شمام میخاین برنامه نویسی کار کنین بهتره ببنین کارِتون چیه ک ب چ زبانی احتیاج دارین ن اینکه خودتون با چ زبانی حال میکنین(هر چند خودم با C و C++ اصلا حال نمی کنم و سعی میکنم سمتش نرم ولی شاید مجبور بشم)

خب زبان های ک شاید باهاش کار کنیم مثل:

python

R

javascripts

JAVAl

lisp

C++😑😑😑

scala

RUST

فک کنم اینا بود وگر ن زیادن حالا شاید با متلبم کار کردیم

و همینظور فریم ورک های لازم:

TENSORFLOW

TORCH

SCI-KIT LEARN

MLPACK

Theano

هر چند ما بیشتر از پایتون یا R استفاده میکنیم واسه پزدازش داده و از زبان های دیگه واسه مدیریت حافظه یا کنترل رشته های عصبی و یا قابل حمل کردن فایل برنامه سرو کار داریم چون نیاز داریم بخش هایی از برنامه رو سبک سازی کنیم ک راحتتر ب شبکه وصل شه

برای همین شاید نیاز داشته باشیم از میکرو کرنل یا میکرو پروگرم هم استفاده کنیم

و همینطور الگوریتم هایی ک لازم داریم:

الگوریتم های یادگیری ماشین به 3 دسته تقسیم بندی میشوند:

  1. یادگیری نظارتی: برای مواردی که نوعی ویژگی خاص از یک مجموعه داده معلوم است ولی دیگر موارد در دسترس نیست یا باید پیش بینی شود.
  2. یادگیری غیر نظارتی: برای مواردی که کشف روابط ضمنی در یک وضعیت نامشخص مورد نیاز است.
  3. یادگیری تقویتی: بین دو حالت قبلی است. بطوریکه برخی حالات قابل پیش بینی از یک رویداد موجود است اما دقیق نیستند. که این نوع یادگیری کمی پیچیده تر از بقیه است.

یادگیری نظارتی

درخت تصمیم گیری

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

درخت تصمیم گیری

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

روش نایو بیز

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

فرمول نایو بیز

برخی نمونه های استفاده از نایو بیز در هوش مصنوعی میتواند موارد زیر باشد:

  • گزینش یک ایمیل به عنوان اسپم یا غیر اسپم
  • دسته بندی خبرها درباره تکنولوژی، سیاسی یا ورزشی
  • چک کردن بخشی از متن درباره اینکه آن متن دارای احساسات منفی یا مثبت است

کمینهٔ مربعات معمولی

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

کمینه مربعات معمولی

رگرسیون لجستیک (منطقی)

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

رگرسیون لجستیک

ماشین بردار پشتیبانی

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

ماشین بردار پشتیبانی

از طریق SVM میتوان مسائل بزرگ و پیچیده ای از قبیل شناسایی تمایز انسان و بات ها در سایت ها، نمایش تبلیغات مورد علاقه کاربر، شناسایی جنسیت افراد در عکس ها و… را حل کرد.

روش ENSEMBLE

این روش نوعی الگوریتم یادگیری است که مجموعه از دسته بندی ها را ترکیب کرده تا مدل قوی تری برای پیش بینی بسازد. اصلی ترین روش Ensemble، روش میانگین بیزی است اما الگوریتم های جدید شامل سیستم تصحیح خطا bagging و boosting می باشد.

الگوریتم Ensemble

یادگیری غیر نظارتی

الگوریتم خوشه بندی

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

  • گروه بندی بر اساس چگالی
  • گروه بندی براساس اتصال
  • گروه بندی بر اساس مرکز جرم
  • کاهش ابعاد
  • شبکه عصبی

الگوریتم خوشه بندی

تحلیل مولفه های اصلی

تحلیل مولفه های اصلی یا Principal Component Analysis یک روش آماری است که داده های موجود را به روی دستگاه مختصات می برد بطوریکه داده ها از بزرگترین واریانس تا کوچکترین به ترتیب روی محورهای X و Y و الی آخر قرار میگرند. این کار میتواند چند بعدی بودن داده ها را مشخص کند و بتوان میزان تجمع داده ها روی یک محور خاص را فهمید.

تحلیل مولفه های اصلی

تجزیه مقادیر منفرد

تجزیه مقادیر منفرد یا Singular Value Decomposition در جبر خطی، تجزیه مقادیر منفرد روشی برای فاکتورگیری از ماتریس های پیچیده است. در یک ماتریس m * n ماتریس تجزیه M است و U و V  ماتریس واحد و Σ ماتریس قطری است.

تجزیه مقادیر منفرد

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

تحلیل مولفه های مستقل

تحلیل مولفه های مستقل یا Independent Component Analysis روشی آماری برای آشکار کردن مولفه های پنهان که وابسته به مجموعه از مقادیر تصادفی، اندازه گیری ها یا سیگنال ها می باشد بطوریکه مولفه های حاصل، غیرگوسی و مستقل باشند. الگوریتم ICA وابسته به PCA است و عکس های دیجیتال و ابزارهای اندازه گیری روان سنجی از این الگوریتم استفاده میکنند.

خب خوشحال میشم نظراتونو کامنت کنین

نوشته :::::Unspecified identity هویت نامشخص::::: اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی