برنامه نویس وب شدن(فرانت اند)

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

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

فرانت اند و بک اند.

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

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

اول کار هم باید برنامه نویس فرانت اند شید!

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

چیزی که خیلی واضحه، همه چی تو وب با سه تکنولوژیه HTML, CSS و JavaScript کار میکنه. پس بریم سراغه تکنیک های مورد نیازشون:

  • یادگیری پایه ای HTML و CSS
  • یادگیری کانسپتی به نام Semantic HTML
  • یادگیری CSS Box Model
  • یادگیری CSS Preprecessors
  • یادگیری CSS Media Queries
  • یادگیری Bootstrap
  • یادگیری SASS و LESS
  • یادگیری پایه ای JavaScript
  • یادگیری کار با DOM, JSON و AJAX
  • یادگیری مهم ترین ویژگی های JS مانند: functional composition, prototypical inheritance, closures, event delegation, scope و higher-order functions
  • کار با promises و callbacks در جاوا اسکریپت
  • یادگیری درست کردن ساختار کدتون، چیزایی مثه webpack و gulp.js
  • یادگیری جدیدترین و بهترین فریمورک های فرانت اند مانند: React.js, Angular.js و Vue.js
  • یادگیری jQuery
  • یادگیری ویژگی های ES6

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

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

ببخشید اگه واضح نیستن!

مرسی بابت وقتی که گذاشتین ❤️

اگه کسی سوالی داشت و تو گوگل کردن به انگلیسی مشکل داشت، میتونه بهم ایمیل بزنه و من حتما جوابشو میدم. اینم آدرس ایمیلم : yripila@gmail.com

نوشته برنامه نویس وب شدن(فرانت اند) اولین بار در ویرگول پدیدار شد.

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

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

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

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

۱- هیچ کسی یک شبه برنامه نویس نشده

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

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

۲- کپی نکنید منطق را یاد بگیرید

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

۴- کد های مرتبی داشته باشید

پشت سر هم نوشتن و بی نظمی در برنامه نویسی چیزی جز اشتباهات متعدد و سردرگمی به همراه نداره. سعی کنید مرتب باشید و از space و tab برای خوانایی بهتر کد هاتون استفاده کنید. همچنین میتونید از قابلیت کامنت گذاری استفاده کنید که به شما در روند پیاده سازی برنامه خیلی کمک میکنه و باعث گیج شدن شما نمیشه.

۵- مسیر خود را درست انتخاب کنید

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

۶- سورس بخوانید!

سورس برنامه هایی که توسط دیگران نوشته شده که در اینترنت بسیارند رو تهیه کنید و مطالعه کنید این کار به شما کمک میکنه تا ساختار برنامه ها رو بهتر بشناسید و بفهمید مثلا متغیر در برنامه واقعی چه کاربردی داره!

۷- به حرف های کذب دیگران گوش ندهید

دلسرد کردن یه نفر از کاری که داره میکنه خیلی بده ، که ما ایرانیا استادیم!

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

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

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

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

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

۷ دلیل رشد نکردن برنامه نویسی در ایران

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

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

۱- مدارس

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

۲- منابع فارسی محدود و قدیمی!

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

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

۳- رعایت نکردن حقوق برنامه نویس

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

یه برنامه نویسی حرفه ای تو آمریکا حدود ۱۰۰,۰۰۰ دلار در سال حقوق میگره در صورتی که در ایران یک برنامه نویس معمولی ماهیانه نزدیک به ۳ میلیون تومن در ماه حقوق داره که نسبت به شب بیداری و دور بودن از خانواده اصلا ارزش نداره.

۴- کپی برداری در روز روشن!

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

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

دوستان زیادی دارم که این اتفاق براشون افتاده و واقعا ناراحت کنندس که نتیجه ماه ها و یا حتی سال ها تلاش به راحتی از بین بره!

۵- فری لنسری

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

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

پروژه های کوچک و صرف زمان های بسیار زیاد (مثلا ۲ سال!) و شکست های متعدد از معایب فری لنسریه که حتی ممکنه طرف برنامه نویسی رو ول کنه!

۶- ما اوپن سورس و آزاد نیستیم!

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

۷- تحریم

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

خوشحال میشم نظرتون رو در باره این مطلب بدونم 🙂

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

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

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

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

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

Narkoz درباره‌ی این فایل‌ها می‌گوید: “ما برنامه‌نویسی داشتیم که به تازگی شرکت ما را ترک کرده است. او از آن دسته افراد بود که برای هر کاری که بیش از ۹۰ ثانیه از زمانش را اشغال می‌کرد، اسکریپتی برای اتوماتیک کردن آن می‌نوشت.”

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

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

اسکریپت بعدی مربوط به زمانی است که برنامه‌نویس به محل کار نمی‌رفته است و از داخل خانه وارد حساب کاربری شرکتی خود می‌شده است. در این زمان پیامی با مضمون این که در خانه کار خواهد کرد برای مدیر او ارسال می‌شده است. اما جالب‌ترین اسکریپت اتوماتیک‌ ساز این برنامه‌نویس، مربوط به آماده کردن قهوه است. با اجرا شدن این اسکریپت، نرم‌افزار به مدت ۱۷ ثانیه صبر می‌کند و پس از آن ماشین قهوه‌ساز را هک کرده و سفارش یک قهوه می‌دهد. ماشین نیز پس از آماده کردن قهوه ۲۴ ثانیه صبر می‌کند و سپس قهوه را داخل ظرف می‌ریزد. مجموع این زمان‌ها با زمانی که طول می‌کشیده تا او از دفترش تا ماشین قهوه‌ساز برود برابر بوده است!

مصطفی حسینی

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

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

تا خوش خط نباشه برنامه ریزی نمیکنم !

میخوام درباره یک تجربه از خودم صحبت کنم به اسم وسواس های عجیب غریب ! مثلا چی ؟ یادمه خیلی وقت پیشا که میخواستم برای تابستونم برنامه ریزی کنم مثلا میرفتم یک خودکار خفن zebra میگرفتم، یک دفترچه باحال و البته یک سری کاغذ آچار و این چیزا. برای چه کاری ؟ برای این که فقط بخوام توش بنویسم ۵ تا هدف مهم تابستون من مثلا تو سال ۱۳۹۰ چیه ! و این شروع بدبختی من بود ….


قیافه من قبل از شروع کارا !

چرا این موضوع باعث پسرفت من تو خیلی زمینه ها شده و چطور این موضوع رو رفع کردم ؟

خب خیلی ساده است. بزارین با مثال براتون بگم:

  • همونطور که چند سطر بالاتر گفته بودم من برای برنامه ریزی های فردی خودم خیلی وقت پیش ها این وسواس ها رو داشتم که مثلا خطم خوب باشه، همه چیز صاف و یکسان نوشته بشه، یادمه حتی بعضی مواقع کلی کاغذ پاره میکردم چون که مثلا حس میکردم این چیزی که نوشتم دل نشین نشده ! و کلی تلاش میکردم تا در نهایت مثلا یک نوشته روی کاغذ رو نهایی بکنم و بعد دیگه دیر شده بود و من کلی وقت گذاشته بودم تا فقط همون اهدافی که باید از کلی وقت پیش دنبالشون میرفتم رو، بتونم بیارم رو کاغذ ! درکش شاید سخت باشه ولی همچین چیزی رو خیلی تجربه کردم قبلا و خیلی وسواس و رفتار عجیبی بود …
  • اوایل که برنامه نویسی رو شروع کرده بودم برای یادگیری یک موضوع خاص میرفتم کلی Course آموزشی دانلود میکردم!، دسته بندی میکردم. برام مهم بود مثلا کلی دسته بندی و فایل داشته باشم که انگار یک آرشیو خیلی بزرگ و جذاب دارم، و ذوق میکردم. ولی هدف اصلی این بود که مثلا من برای کارم که git نیاز داشتم سریع یک کورس git میدیدم تا یاد بگیرمش و تو پروژه شخصیم یا محل کارم ازش استفاده کنم. ولی کل وقتم هدر میشد چون میرفتم ۶۰۰ تا فایل آموزشی دیگه هم دانلود میکردم تا آرشیوم کامل بشه و خوشحال بشم ! مثلا دسته بندی میکردم سیستم عامل، شبکه، امنیت، فرانت اند، بک اند و باز هر کدوم از اینا کلی زیرشاخه داشت و الی آخر !
  • من حتی تو سیستم عامل لپ تاپم هم این مشکلو از قبل داشتم و هنوزم رگه هایی ازش هست. مثلا اگر دسکتاپم شلوغ میشد یا مدتی بود که سیستم عاملو عوض نمیکردم فکر میکردم که این سیستم عامل دیگه کثیف شده و تنها راه نجاتش از نو نصب کردن یک سیستم عامل جدیده و البته fresh ! خنده داره نه ؟! :)))
  • یادمه اگر میخواستم غذا درست کنم و مثلا سبزی رو به جای این که فلان قدر ریز کنم، اشتباها یکم بزرگتر ریز میکردم یا مثلا تو سالاد کاهو ها بزرگ ریز میشدن یا گوجه ها صاف تیکه تیکه نمیشدن یا …، اون غذا دیگه به دلم نمی نشست، انگار که یک جای کار تو کل کار میلنگید و تا آخرش همه چیز دل نشین نبود :))
  • یادمه اگر مثلا جزوه تو دبیرستان میخواستم بنویسم، اگر اون متنش مثلا به اخر صفحه میرسید و چند تا کلمه هم بیشتر داشت و مجبور میشدم برم صفحه جدید و فقط یک ذره از صفحه جدید رو به اون چارتا کلمه اختصاص بدم، اعصابم خرد میشد که چرا fix نشده !

از این مثال ها و تجربه ها زیاده ولی خب من تقریبا ۸۰ درصد این اخلاقیات اشتباهمو کنار گذاشتم. الان دیگه میتونم راحت با همه این موضوعات کنار بیام و سخت نگیرم. الان میدونم که ارزش هر کار به اینه که واقعا انجام بشه و به پایان برسه، مثلا امروز برنامه ریزی های تابستونی شرکتمونو تو یک برگه کاهی و خیلی بد خط‌! نوشتم چون مهم بود که سریع بتونیم کلیات کار رو جمع کنیم و کم کم وارد فاز عملیاتی بشیم !‌ (مثلا اگر من امیرحسین قدیم بودم الان تا ۲ هفته فقط درگیر نوشتن همین ۳۰ ۴۰ خط میشدم و احتمالا از اصل ماجرا کلن پرت میشدم !)

قیافه من بعد از کلی برنامه ریزی و کلی کار انجام نشده !

خلاصه این که اگر شما هم مثل من این مشکل رو دارید، تنها راهش اینه که اون بخش از وجودتون که هی میگه: این که کامل نیست، این که خوشگل نشده هنوز، این که کثیفه اونجاش و … رو خفه اش کنید و بکشیدش ! هیچ راه مسالمت آمیز دیگه ای وجود نداره که از شرش خلاص بشید. باید وارد کار بشین و نزارین هی مسائل حاشیه ای، شما رو از متن دور کنه. این با تمرین و یکم سختی حل میشه 🙂

نظر شما چیه ؟ شما هم همچین چیزی رو تجربه کردین ؟ راهکار های شما چی بوده برای رفع مشکلتون ؟

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

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

۵- کاتلین از ابتدا : بررسی عمیق‌تر توابع

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

  • top-level functions
  • lambda expressions or function literals
  • anonymous functions
  • local or nested functions
  • infix functions
  • member functions

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

۱- ا Top-Level Functions

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

به احتمال قوی، اگه توی جاوا کد زده باشید، حتما می‌دونید که متدهای utilityی استاتیک رو معمولا داخل کلاس‌های helper تعریف می‌کنن. در حقیقت این کلاس‌ها کار خاصی انجام نمیدن – داخلشون دستور یا instanceای از متدهای دیگه وجود نداره، وظیفشون فقط نگهداری متدهای استاتیک هست.یک مثال معمول، همین کلاس Collections داخل پکیج java.util و بقیه‌ی متدهای استاتیکش هست.

توی کاتلین، توابع top-level میتونن به عنوان جایگزینی برای متدهای utility استاتیکی که توی جاوا داخل کلاس‌های helper ازشون استفاده می‌کردیم، قرار بگیرن. حال به کد پایین که داخلش یک تابع top-level تعریف شده یه نگاهی بندازید.

https://gist.github.com/sajjadyousefnia/adff2c989426ca7220d6284a3241c27e

توی کد بالایی، ما یک پکیجی به اسم com.chikekotlin.projectx.utils رو داخل فایلی به نام UserUtils.kt تعریف کردیم، و داخل همون فایل یک تابع top-level به اسم ()checkUserStatus رو هم تعریف کردیم. این یک مثال خیلی ساده هست که یک رشته رو return میکنه.

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

https://gist.github.com/d6bea917cb83e85a8a5535c86bb63cbb.git

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

تطابق پذیری با جاوا

جاوای فعلی توانایی پشتیبانی از توابع top-level رو نداره، در حقیقت کامپایلر کاتلین یک کلاس جاوایی می‌سازه و هر تابع top-level تبدیل به متدهای استاتیک میشه. توی قسمت قبلی، UserUtilsKt کلاس جاوایی تولید شده با متد استاتیک checkUserStatus بود.

https://gist.github.com/sajjadyousefnia/d8b596b9d7ec41d6c32c10ed86c15b83

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

https://gist.github.com/sajjadyousefnia/0c5d465f8b0d30d0b06a0c5fa5708b71

دقت کنید که ما می‌تونیم اسم کلاس جاوایی، که داخل کاتلین تولید و استفاده میشه رو با استفاده از انوتیشن Jvname@ تغییر بدیم، لطفا به کد پایینی دقت کنید.

https://gist.github.com/sajjadyousefnia/16ba227319cc8fa500a6a6777209d688

توی کد بالایی، ما انوتیشن JvmName@ رو اضافه کردیم و کلاسی به اسم UserUtils رو داخل اون فایل به وسیله‌ی همون انوتیشن تعیین کردیم. دقت کنید که این انوتیشن ابتدای فایل کاتلینی و قبل از تعریف پکیج نوشته میشه.

توی جاوا مشابه کد پایینی می‌تونیم فراخوانیش کنیم:

https://gist.github.com/sajjadyousefnia/817656aed11b55a552670561e42fa21f

2- عبارات لامبدایی ( Lambda Expressions )

ویژگی Lambda Expressions (یا function Literals ) اینه که با یک Entity خاص ( مثلا یک کلاس، آبجکت یا یک اینترفیس خاص) محدود نمیشن. در ضمن میتونن به عنوان آرگومان به توابع دیگه فرستاده بشن، که در این صورت بهشون توابع higher-order میگیم ( در قسمت بعدی در موردش بیشتر بحث می‌کنیم). یک Lambda Expression صرفا به صورت یک بلوکی از کد هست، و باعث میشه که شلوغی توی کدهامون به حداقل برسه.

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

برای حل مشکل پشتیبانی نکردن جاوای ۶ و ۷ از لامبدا موقع interoperate کردن یا تطبیق دادن بین این دو زبان، کاتلین به صورت ناملموس و پشت پرده، یک کلاس anonymous جاوایی رو ایجاد میکنه. ولی دقت کنید که ساخت یک lambda expression کاملا متفاوت با جاوا هست.

پایین چند تا از ویژگی‌های یک lambda expression توی کاتلین رو گفتم:

  • حتما بایستی با استفاده از {} محصور بشه.
  • از کلمه‌ی کلیدی fun استفاده نمیکنه.
  • از access modifier ها ( یعنی private و public و protected ) در اون استفاده نمیشه، دلیلش اینه که به هیچ کلاس، آبجت و یا اینترفیسی تعلق نداره.
  • تابع لامبدایی اسم نداره یا به قولی anonymous یا همون ناشناس هست.
  • جنس return داخلش مشخص نشده، چون جنس به وسیله‌ی کامپایلر تفسیر میشه.
  • پارامترها به وسیله‌ی پرانتز محصور شدن.

ساخت lambda exprssion

حالا وقتشه که یک نگاهی به چند نمونه از lambda expression بندازیم. توی کد پایینی ما یک lambda expression بدون پارامتر ساختیم و اونو به متغییر assign ،mesage کردیم ( یا همون برابر قرار دادن ). بعدش این lambda expression رو با فراخوانی ()message اجرا کردیم.

https://gist.github.com/sajjadyousefnia/b5387dd8bb51fc5806d41a18f35fdf44

حالا، ببیینیم که اگه پارامترها را داخل lambda expression بگذاریم چجوری میشه.

https://gist.github.com/sajjadyousefnia/43838b3dab849f4d5a4ed15599d415f7

توی کد بالایی، ما یک lambda expression رو با استفاده از پارامتر استرینگی myString ساختیم . همونطور که میبینید، جلوی جایی که باید جنس پارامتر قرار داده بشه، یک فلش هست، که لیست پارامترها رو از بدنه‌ی لامبدا جدا میکنه. برای خلاصه‌تر شدن، می‌تونیم جنس پارامتر رو به طور کامل نادیده بگیریم و اونو ننویسیم.

https://gist.github.com/sajjadyousefnia/37656e51419a83c9dfa3dca4a1092ca3

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

https://gist.github.com/sajjadyousefnia/33c184e511ce43a872dbcb4a3e23365c

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

https://gist.github.com/sajjadyousefnia/903c8d9a44a9657e8c64b35daf95d16b

فرستادن لامبداها به توابع

ما می‌تونیم lambda expression ها رو به عنوان پارامتر به توابع بفرستیم، که به این توابع میگن : higher-order functions ( یعنی توابع دارای اولویت بالاتر ) چون که اونا خودشون یک تابع هستن که متعلق به یک تابع دیگه هستن: برای مثال ()last توی تابع collection

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

https://gist.github.com/sajjadyousefnia/0db3e8fa266d7d5b45649fb22d361411

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

https://gist.github.com/sajjadyousefnia/12db1e5f44ff0d1ae5679d54fb642b95

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

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

https://gist.github.com/sajjadyousefnia/93078a6a30896183a35e138a49f06e57

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

آرگومان it

ما می‌تونیم lambda expression رو از طریق جایگزینی آرگومان it – که به طور خودکار تولید میشه و یک آرگومان default هم هست – ، به جای آرگومان lambda expression ساده‌تر کنیم.

https://gist.github.com/sajjadyousefnia/49d43d1f246c733abca147743dcc4f4d

به این دلیل از آرگومان it استفاده شده که متد last میتونه یک lambda expression یا یک anonymous function رو که تنها با یک آرگومان بپذیره، ( که به طور خلاصه‌وار بررسیش میکنیم ) و کامپایلر میتونه جنسش رو خودش تشخیص بده.

ه Return محلی در Lambda Expressionها

بیایید با یک مثال شروع کنیم، توی کد پایینی، ما یک lambda expression رو به ()foreach که بعد از کالکشن intList اومده، فرستادیم. این تابع کل عناصر کالکشن رو مرور میکنه و لامبدا رو روی هر عنصری که داخل لیست هستش، اجرا میکنه. در صورتی که یک عنصری رو پیدا کنه که بر ۲ بخش پذیر باشه، حلقه رو متوقف میکنه و دستور return کردن از لامبدا رو اجرا میکنه.

https://gist.github.com/sajjadyousefnia/73ec60f8811fe96631dfde4c1afe6f90

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

https://gist.github.com/sajjadyousefnia/e3b720a32c75b54669a12c07b2238af5

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

https://gist.github.com/sajjadyousefnia/2cd4063c8b1e484d5f96e276b1ef2f06

توی کد بالایی که یک مقداری تغییر کرده، تگ foreach@ رو داخل لامبدا و درست بعد از return قرار دادیم. با این کار ما به کامپایلر دستور میدیم که به جای این که ()surroundingFunction خارج بشه، از لامبدا خارج بشه. بعدش آخرین دستور متد ()surroundingFunction اجرا خواهد شد.

در ضمن دقت کنید که ما خودمون میتونیم لیبل رو تعریف کنیم.

https://gist.github.com/sajjadyousefnia/14b4c1c234d18a181bc14724b4115dab

توی کد بالایی، یک لیبل کاستوم شده به نام myLabel و بعدش به return معرفیش کردیم. لیبل @foreach که توسط کامپایلر تولیدشده، دیگه معتبر نیست چون بجاش از @myLabel استفاده کردیم.

۳- ه Member Functions

احتمالا بیشتر افراد با این موضوع آشنایی دارن، این نوع از تابع داخل یک کلاس، اینترفیس یا object تعریف میشه. با استفاده از member functions می‌تونیم برنامه رو بیشتر ماژول‌بندی کنیم. حالا بیایم یه نگاهی به نحوه‌ی ساخت یک member function بندازیم.

https://gist.github.com/sajjadyousefnia/9fb92ba7424057adddf12837c6845264

توی قطعه کد بالا یک کلاس Circle رو می‌بینیم که یک member function به نام ()calculateArea داره. این تابع یک پارامتری به اسم radius رو برای محاسبه‌ی محیط دایره می‌گیره.

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

https://gist.github.com/sajjadyousefnia/1944223c7e6efd32bf66860805357f3d

4- ( توابع ناشناس ) Anonymous Functions

استفاده از Anonymous function یک روشی هست که میشه در اون بلوکی از کد تعریف کرد که قابل فرستادن به تابعی دیگه باشه. هیچ نوع identifier برای اون استفاده نمیشه. و چند تا از ویژگی‌هاشو پایین می‌تونید ببینید :

  • هیچ اسمی نداره.
  • با کلمه‌ی کلیدی fun ساخته میشه.
  • ه body هم داره.
https://gist.github.com/sajjadyousefnia/e1c6f849163fde29159ff33eb7994f28

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

https://gist.github.com/sajjadyousefnia/0392700aeee703e06cff1b203d8e66bc

توی قطعه کد بالا، به جای لامبدا از anonymous funcion استفاده کردیم، چون میخوایم return قابل دیدن باشه و بشه دستکاریش کرد.

اواخر قسمت لامبدا، ما از لیبل استفاده کردیم تا مشخص کنیم که میخوایم از درون چه تابعی return انجام بشه. با استفاده از anonymous function به جای lambda، این مشکلمون حل میشه، و اینجوری میتونیم مشکل تابع foreach رو به روش ساده‌ای حل کنیم. عبارت return باعث میشه که ما از داخل anonymous function خارج بشیم و نه از اون متدی که اون رو محصور کرده، ایندفعه از ()surroundingFunction استفاده می‌کنیم.

https://gist.github.com/sajjadyousefnia/badefc68e3f25c7f395177ee863ab4ea

5- توابع local (محلی) یا nested ( تودرتو)

اگه بخوایم برنامه رو نسبت به قبل بیشتر ماژول‌بندی کنیم، بایستی از قابلیت جدید local function – که اسم دیگش nested function هست – استفاده کنیم. اصولا local function تابعیه که داخل یک تابع دیگه تعریف شده.

https://gist.github.com/sajjadyousefnia/a534fbaa93b9e48b399e61a894a50de5

همونطور که در بالا مشاهده می‌کنید، ما از دوتا single-line function استفاده کردیم، یعنی : calCircumference() و calArea() که هر دوشون داخل یک متد دیگه و به صورت تودرتو قرار دارن. یک نکته‌ای که وجود داره اینه که توی کد بالا nested functionهایی که تعریف شدن، داخل یک متد دیگه قرار دارن و اونا رو فقط میشه از طریق اون متد بیرونی‌شون فراخوانی کرد و اون متدهای تعریف شده قابلیت اینو ندارن که از بیرون فراخوانی بشن. بازم یه بار دیگه می‌تونیم با استفاده از nested functionها کدمون رو تروتمیزتر و کوتاه‌تر کنیم.

در صورتی که بیایم توی local function هامون نوع return رو اعلام نکنیم، کدمون، کوتاه‌تر میشه. این کار به این دلیل شدنیه که local function – که در بطن یک متد قرار داره – میتونه این نکته رو متوجه بشه که به قولی جنس داده‌ای رو که این متد return میکنه رو به عنوان چه نوع متغییری مورد استفاده قرار میده. به مثال پایینی توجه کنید:

https://gist.github.com/sajjadyousefnia/76840e1f99d455e825078b17e1e1f9b9

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

۶- ه Infix Functions

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

ساخت یک infix member function

حالا یه نگاهی به نحوه‌ی ساخت یک تابع infix در یک کلاس میندازیم. توی کد پایینی، ما یک کلاس Student رو به همراه یک یک instance field ایجاد کردیم. با گذاشتن کلمه‌ی کلیدی infix قبل fun، اون متد رو تبدیل به یک infix function کردیم. همونطور که در پایین می‌بینید یک infix function به اسم addKotlinScore رو ساختیم، که ان متد یک متغییر به اسم score رو دریافت میکنه و سپس اون رو به instance field مون، – یعنی kotlinScore – اضافه میکنه.

https://gist.github.com/sajjadyousefnia/5e0a3bce14c3ac862862b42091ee0389

فراخوانی یک infix function

حالا بیایم ببینیم چجوری میشه اون infix functionای رو که ساختیم، فراخوانی کرد. توی کاتلین برای فراخوانی یک infix function، لازم نیست که از dot یا همون نقطه استفاده کنیم و نیازی هم به استفاده از براکت یا پرانتز نداریم.

https://gist.github.com/sajjadyousefnia/884e0ee74bd1dabad18f24675b962782

توی کد بالایی ما infix functionمون رو فراخوانی کردیم، اینجا آبجکت هدفمون student و عدد ۹۵٫۰۰ – که جنسش double هست – به تابع فرستاده میشه.

با استفاده از infix function می‌تونیم به طور هوشمندانه‌ای کدمون رو کوتاه‌تر و زیباتر کنیم. موقع نوشتن unit test برای کاتلین، این موضوع خیلی ملموس‌تر میشه.

https://gist.github.com/sajjadyousefnia/25fc8b1b535eedb3576037fc42761729

استفاده از to به عنوان infix function

توی کاتلین می‌تونیم به جای استفاده از کانستراکتور Pair، با استفاده از to به عنوان infix function ، ساختار instanceای که از pair می‌سازیم رو خلاصه‌تر کنیم. ( در حقیقت، to یک instance از Pair ایجاد میکنه ). دقت کنید که تابع to یک extension function هست. ( که بعدا در موردش بیشتر صحبت می‌کنیم)

https://gist.github.com/sajjadyousefnia/700b6d9fcb6e94e905c56f74d4977842

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

https://gist.github.com/sajjadyousefnia/c41d772dc1255143c477f2bde2e0bee4

همونطور که در بالا مشاهده می‌کنید، با استفاده از to – که یک infix function هست – کدمون نسبت به موقعی که از کانستراکتور Pair برای ایجاد یک instance از Pair استفاده می‌کنیم، کوتاه‌تر میشه. دقت کنید که وقتی از to استفاده کردیم، ۲۳۴ آبجکت هدف هست و “Nigeria” پارامتری هست که به تابع فرستاده میشه. علاوه‌بر این میتونیم از روش کاملا مشابه زیر هم استفاده کنیم :

https://gist.github.com/sajjadyousefnia/9b4395c3c359d2b859bf14a23354be78

اگه یادتون باشه، توی پستی که در مورد ranges و collections نوشته بودم، یک map collection رو با استفاده از دو تا متغییر درست کردیم. حالا بیایم ببینیم که ساختن map با to چه فرقی با ساختنش با Pair داره.

https://gist.github.com/sajjadyousefnia/93055909cb130f67032bb058c1a6ed5b

توی کد بالایی، ما با استفاده از to یک لیست که از جنس Pair هستن و با کاما هم از هم جدا شدن، رو ساختیم و به تابع mapOf فرستادیم. همین کار رو میشه با استفاده از Pair هم انجام داد.

https://gist.github.com/sajjadyousefnia/25ff5286fdd87d4d2f078c40e812adb9

همونطور که می‌بینید، استفاده از to به جای Pair باعث میشه که کدمون چشم‌نوازتر بشه.

نتیجه گیری

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

  • top-level functions
  • lambda expressions or function literals
  • member functions
  • anonymous functions
  • local or nested functions
  • infix functions

لطفا اگه نظری دارید یا مشکلی وجود داره بفرمایید.

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

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

آشنایی با Worker ها (۳)

تا اینجا با وب ورکر ها آشنا شدیم اگر باهاشون آشنایی ندارین میتونین این ۲ پست رو بخونین:

https://virgool.io/@arainjast/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-worker-%D9%87%D8%A7-%DB%B1-y5ahwihwowgr
https://virgool.io/@arainjast/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-worker-%D9%87%D8%A7-%DB%B2-rswz61tyxuxj

نوع دیگری از ورکر ها Service Worker ها هستن که در ادامه باهاشون بیشتر آشنا میشیم.

آشنایی با Service Worker ها

سرویس ورکر ها میتونن کارهایی رو در پشت صحنه انجام بدن. چرا میگم پشت صحنه چون سرویس ورکر ها در Thread دیگه ای غیر از Thread اصلی که که فایل های Html و JS هستن اجرا میشن یعنی بر خلاف فایل های JS ئی که جداگانه برای هر page لود میشوند و Attach میشن به فایل HTML و همگی در یک Thread اجرا میشوند سرویس ورکرها فایل های جاوا اسکریپتین که به صورت جدا گانه جدا از HTML و در Thread ئی دیگر فعال هستند. و تمام پیج ها وصفحات در یک دامنه رو مدیریت میکنن. و حتی هنگامی که پیج بسته میشود هم فعال هستند و در تمام مدت به Event (رویداد) های خاصی Listen (گوش) میکنند.

چه رویداد های خاصی؟

سرویس ورکر ها فقط به یک سری رویدادهای خاص گوش میکنند که این موارد هستند:

۱- رویداد Fetch

هنگامی که Browser یا شما (در فایل جاوااسکریپت در یک پیج) یک HTTP Request ارسال میکنید Browser ابتدا چک میکنه که سرویس ورکری register شده یا نه اگر نشده باشه که درخواست رو به network میفرسته ولی اگر رجیستر شده باشه رویداد Fetch رو به سرویس ورکر میفرسته و سرویس ورکر تصمیم میگیره با این رویداد چیکار کنه. یه نکته ای که هست اینه که اگر شما درخواستتون رو از طریق خود Fetch بفرستین این درخواست به سرویس ورکر میره ولی اگر شما درخواستتون رو از طریق XMLHttpRequest یا (XHR) بفرستین رویداد Fetch به سرویس ورکر ارسال نمیشه. اگر با Fetch آشنایی ندارین هم میتونین این پست رو ببینین.

https://virgool.io/@arainjast/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-fetch-api-%D8%A8%D8%A7-%D8%B3%D8%A7%D8%AE%D8%AA-%DB%8C%D9%87-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D9%88%D9%86%D9%87-%D8%B3%D8%A7%D8%AF%D9%87-http-wv8hmp6rnx2a

۲- رویداد Push Notification

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

۳- رویداد Notification Interaction

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

۴- رویداد Background Sync

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

۵- رویداد های Service Worker Lifecycle

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

چرخه حیات Service Worker ها

سرویس ورکر حالات مختلفی داره برای این که بتونیم به درستی با اونها کار کنیم باید این حالات رو بدونیم. در قدم اول سرویس ورکر نیاز داره که register بشه . برای register شدن پس از باز کردن یک صفحه و load شدن فایلهای js در انها سرویس ورکر register میشه و پس از register شدن به گام اول چرخه حیاتش یعنی install میره و رویداد install رو داریم یکی از مواردی که میشه توی این رویداد انجام داد کش کردن asset ها مثل html,css,js هست. پس از install شدن سرویس ورکر میخواد به حالت activate بره ولی این حالت الزاما پس از اتمام نصب سرویس ورکر نیست بلکه بستگی داره که سرویس ورکری که register شده نسخه قبلی ئی داشته که ما نسخه جدید رو رجیستر کردیم یا یک سرویس ورکر جدید ئه. سرویس ورکر وقتی فعال میشه که نسخه قبلی در حال اجرا نباشه. برای این منظور اگر سرویس ورکر قبلی در حال اجرا باشه و متوقف کردنش باید تبش بسته بشه و دوباره صفحه لود بشه تا نسخه جدید جایگزین نسخه قبلی شده و سرویس ورکر به حالت activate بره پس از رفتن به حالت activate رویدادش اجرا میشه و پس از ان سرویس ورکر کنترل پیج های در scope خودش رو در اختیار میگیره. دقت داشته باشیم که برای install شدن و active شدن یک سرویس ورکر نیاز هست که یا یک سرویس ورکر جدید رجیستر بشه یا سرویس ورکر قبلی تغییر کنه در اینصورت این ۲ رویداد رخ میده در غیر این صورت در صورتی که فایل سرویس ورکر تغییری نداشته باشه پس از رفرش مرورگر سرویس ورکری register نمیشه.

چون سرویس ورکر در پشت صحنه حضور داره پس از این که رویداد جدیدی براش ارسال نشه به حالت idle میره و پس از مدت زمانی نیز terminate میشه که این بدین معنی نیست که سرویس ورکر حذف میشه بلکه با رسیدن رویداد جدید دوباره فعال میشه.

ساپورت مرورگر ها

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

ثبت یک سرویس ورکر با یک مثال

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

ثبت سرویس ورکر بدین شکله :

//app.js
  if('serviceWorker' in navigator){
  navigator.serviceWorker
    .register('/sw.js')
    .then(()=>{
        console.log('Service Worker is registered.');
    })
  }
  

تو خط اول چک میکنیم که مرورگرمون سرویس ورکر رو ساپورت میکنه یا نه

بعد توی خط ۴ فایل sw.js که سرویس ورکرمون هست رو ثبت میکنیم که نتیجش یه promise هست که میتونیم چک کنیم که register شد سرویس ورکرمون یا نه.

* رجیستر یک پارامتر دوم اختیاری داره که میتونین scope سرویس ورکرتون رو مشخص کنین به طور مثال سرویس ورکر زیر فقط مختص scope با اون آدرس هست :

  navigator.serviceWorker
  .register('/sw-info.js', {scope:'/info'} ) 

حال نوبته سرویس ورکرمونه :

self.addEventListener('install',(event)=>{
  console.log('[service worker] installed ',event)
 })
  self.addEventListener('activate',(event)=>{
     self.clients().claim()   
     console.log('[service worker] activated ',event)
  })
   self.addEventListener('fetch',(event)=>{
      console.log('[service worker] fetch event: ',event) 
      event.respondWith(fetch(event.request)) 
   })

خب ۳ تا addEventListener برای رویداد های install,activate,fetch نوشتیم که فقط وقتی event رو لاگ میکنن.
رویداد fetch انتظار داره که پاسخی بهش بدیم بنابر این با کمک متد respondWith و رکوئستی که از طریق event داریم پاسخ رو بدون هیچ دستکاری میدهیم .
* در حالت عادی سرویس ورکر پس از اکتیو شدن کنترل صفحات را از پس از رفرش صفحه در اختیار میگیرد ولی با خط ۵ ام ما بهش میگیم که کنترل رو از همین لحظه در اختیار بگیره.

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

self.addEventListener('install',(event)=>{
    console.log('[service worker] installed',event)
    event.waitUntil(
        caches.open('static')
        .then(function(cache){
            cache.addAll([
                '/',
                '/index.html',
                '/src/css/style.css'
             ])
         })
      )
})

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

خط ۳ event.waitUntil میگه که تا وقتی این دستورات تموم شده به event بعدی نرو.

خط ۴ از api ئی که Cache Storage در اختیارمون گذاشته استفاده میکنیم و با open میتونیم آبجکتی با نامی که میدهیم (در اینجا static ) در cache ایجاد کنیم. که یک promise به ما میدهد که در صورتی که موفقیت امیز باشه میتونیم از cache که به ما میده استفاده کنیم.

خط ۶ با کمک متد addAll و پاس دادن یک آرایه که آدرس فایل هایی که میخوایم کش بشن هست درخواست کششون رو میدهیم.

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

self.addEventListener('fetch',(event)=>{
    event.respondWith(
        caches.match(event.request)
        .then(response=>{
            return response ? response : fetch(event.request)
            })
    )
 })

در اینجا چک میکنیم که رکوئست آیا کش شده قبلا یا خیر (خط ۳) و اگر کش شده بود رسپانس کش شده رو برمیگردونیم وگرنه رکوئست رو fetch میکنیم.

جمع بندی

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

نوشته آشنایی با Worker ها (۳) اولین بار در ویرگول پدیدار شد.

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

شروع مینی پروژه با آنگولار !

بعد از کلنجار های خیلی زیاد، با خودم کنار اومدم و تصمیم گرفتم برم سمت یادگیری آنگولار و ببینم این فریم ورک فرانت اند چیه که انقدر طرفدار پیدا کرده و طرفدارانش در حال افزایشه، خلاصه که اولش به سایت رسمی آنگولار مراجعه کردم و داکیومنت اعظم رو دیدم !!! خب اول به صفحه GETTING STARTED رفتم و خب پیش نیاز های کار با آنگولار رو که شامل node.js و npm و سپس Angular-cli نصب کردم و …

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

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

تصمیم گرفتم برم سراغ منابع متنی یا ویدیویی فارسی ! (امان از تنبلی)

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

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

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

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

اگه علاقه مند به آنگولار هستید میتونید این مینی پروژه رو در گیت هابم ببینید. ( البته هنوز کامل نیست! )

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

خوشحال میشم اگه تجربه ای در یادگیری (کار) با آنگولار داشتین به اشتراک بزارین.

نوشته شروع مینی پروژه با آنگولار ! اولین بار در ویرگول پدیدار شد.

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

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

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

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

بهتره اول نوار خاطرات رو بذارم بذارم پخش بشه…

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

ترس از آزمون و خطا و کنجکاوی نکردن

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

اما اثر مهم‌تر این قضیه به جز در بازار کار توی دانشگاهه.

  • کنجکاوی کمتر یعنی اطلاعات عمومی کمتر. اطلاعات عمومی‌ کمتر یعنی تصور ضعیف‌تر از مباحثی که در کلاس تدریس میشه و نتیجتا درک ضعیف‌تر.
  • اصلا نفس رشته‌ی ما حول «حل مسائل» و «تفکر خلاق» میچرخه که بدون آزمون و خطا معنا نداره!
  • امتحان نکردن تکنولوژی‌های موجود باعث میشه وقتی یه استادی ازتون پروژه عملی میخواد مجبور بشین در مدت زمانی مقدار زیادی مطالب جدید که توی دانشگاه به شما تدریس نشده رو بخونین و احتمال موفقیت زیادی هم ندارین.

سماجت نکردن در به انجام رساندن یک کار

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

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

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

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

یادگیری برنامه‌نویسی مثل خوندن رمان

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

خب ببخشید وقتی منطق برنامه‌نویسی رو یاد نگیری چه جور مهندس کامپیوتری هستی؟ وقتی نمی‌تونی یه الگوریتم بنویسی به چه دردی میخوری؟ مگه رمانه نشستی داری میخونی! لابد میخوای پاس هم بشی درس رو.

این جور وقتا میخوام به خدا بگم «خداوندا منو از رو کره‌ی زمین بردار یا به یه موجود دیگه تبدیل کن»

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

برنامه‌نویسی همه‌اش فکر کردنه. یه درصد خیلی کمی ازش مربوط به دستور زبان و این چیزاست. حالا تو برو کل سورس کد مربوط به آپولو ۱۱ رو حفظ کن.

جالبه حتی نامگذاری‌ها رو از استادشون تقلید می‌کنن و وقتی اسم رو عوض می‌کنی نیم ساعت باید توضیح بدی که چرا مثلا به جای i نوشتی arrayIndex.

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

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

جا داره به یه نسخه‌ی پیشرفته‌تر این اشتباه هم اشاره کنم:

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

خودآموز نبودن و وابستگی به عامل خارجی پیگیر

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

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

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

یکسره فقط مشورت گرفتن (روش حریصانه)

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

  • «جاوا بهتره یا سی‌شارپ؟»
  • «برم سمت موبایل یا برم وب؟»
  • «بازی‌سازی درآمدش خوبه؟»
  • «لینوکس بهتره یا ویندوز؟»
  • «جنگو خوبه یا لاراول؟»

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

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

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

روحیه‌ی غیرمشارکتی غیرتعاملی

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

بعضیا هستن که کلا اهل کار گروهی نیستن به دلایل مختلف. مثلا:

  • هیچی نشده به بقیه اعتماد ندارن
  • بقیه رو اضافه بار میدونن
  • دلشون نمیخواد کسی تو موفقیتشون سهیم باشه
  • نمیخوان به غیر از خودشون کس دیگه‌ای هم اون کار رو یاد بگیره و موفق بشه

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

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

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

این مورد معمولا مخصوص بچه‌هاییه که میخوان تاپ کلاس و تاپ دانشگاه باشن. مثلا میخوان جاوا یاد بگیرن میرن خفن‌ترین منبع رو میخرن کتابش رو و برنامه‌ریزی می‌کنن از اول اول تا آخر آخرش رو طی یک ترم بخونن. نتیجه‌اش اینه که هیچوقت این کارو نمی‌کنن چون وسط راه خسته میشن و می‌بینن این همه کتاب خوندن ولی هنوز هیچ خروجی نداشتن و در این مدت «هزینه بالا» و «بهره‌وری صفر» بوده. تازه برنامه‌شون این بوده که اول «جاوا» رو قورت بدن بعد برن «اوراکل» رو یاد بگیرن و یه کتاب خیلی قول هم برای اون خریدن. بعد میخوان تازه برن اول یه کتاب بگیرن ۶۰۰ صفحه راجع به «HTML» و بعد یه کتاب کلفت دیگه راجع به «HTML5+CSS3» و ایشالا دو سال دیگه میخوان یه کتاب مرجع بگیرن و سیر تا پیاز «جاوااسکریپت» رو مطالعه کنن. حالا بگذریم که بعضیا فکر می‌کنن جاوا همون جاوااسکریپته

در هر حال این روش غلطه! بهترین روش برای یادگیری به نظر من اینه که یه پروژه‌ی ساده برای خودتون تعریف کنین و بعد نیت کنین هر جور که میشه با مثلا همون «جاوا» یا هر زبان و پلتفورم دیگه پیاده‌اش کنین و در این مسیر فقط و فقط بر حسب نیاز به کتاب‌ها و مقاله‌ها و فیلم‌های آموزشی و غیره و غیره مراجعه کنین. به هر حال دوست خوبمون stackoverflow هم هست. ولی اصلا به فکر این که تمام مفاهیم و امکانات موجود در یک زبان رو اول تمام و کمال یادبگیرین و بعد طراحی وب رو کامل یاد بگیرین و بعد تازه شروع کنین به خلاقیت یه تصمیم کاملا اشتباهه.

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

اهمیت ندادن به دروس دانشگاهی به طور متوازن

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

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

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

ترس از کمک گرفتن حتی از اینترنت

خب وقتی میدونی تو یه چیزی مشکل داری همون موقع از استادت بپرس!

خجالت می‌کشی؟ خب از هم‌کلاسیت بپرس!

اونم بلد نیست؟ از سال‌بالاییت بپرس!

گوگل کن!

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

کلی سایت آموزشی برای هر چیزی تو اینترنت به طور رایگان هست

یه عالمه فیلم آموزشی هست

البته خب بیشترش انگلیسیه! گاهی هم هندی 😀

خلاصه که استادم خوب درست نداد یا غایب بودم یا خیلی بهونه‌های دیگه این روزا به هیچ وجه توجیه محسوب نمیشه!

این شاخه اون شاخه کردن و رعایت نکردن تقدم تاخر

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

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

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

رفع تکلیفی کار کردن

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

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

اینم در حد تیتر کافیه

مخلص کلام؛ ضعف در زبان انگلیسی و همچنین تنبلی

یکی از بزرگترین مشکلات بچه‌ها همیشه ضعف در زبان انگلیسی بوده!

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

و اما تنبلی نکنید؛

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

در انتها داستانک زیر رو بهتون تقدیم می‌کنم:

http://vrgl.ir/HpUA1

و همینطور این از دوست خوبم محمدرضا

http://ideatalayi.com/main/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%db%8c%d8%a7-%d8%aa%d8%a7%d8%b1%db%8c%d8%ae%d8%9f-%d9%85%d8%b3%d8%a7%d9%84%d9%87-%d8%a7%db%8c%d9%86-%d8%a7%d8%b3%d8%aa/

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

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

برنامه نویسی یا تاریخ؟ مساله این است!

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

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

هیتلر در سال ۱۹۳۹ به بهانه به قتل رسیدن کارمندان رادیوی آلمان در لهستان، به این کشور لشکرکشی کرد و به این ترتیب جنگ دوم جهانی آغاز شد.

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


شاید پیش خودتون بگید «ربطش به کامپیوتر چیه؟» اول این مطلب رو بخونید :

https://virgool.io/@ashkantaravati/tablet-engineers-pbonw8mwvgq7

اشکان خوب توضیح داده! «مهندس تبلتی ها». اما من میخوام کمی از این بُعد فراتر برم. افرادی که قصد دارم در موردشون صحبت کنم «تبلتی» نیستن که اتفاقا «شاگرد زرنگ» هم هستن. ولی به چه قیمت؟ به چه طریق؟

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

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

آیا تاریخ وار خوندن دروس تخصصی، کار درستی‌ست؟


کلاس شبکه (و ایضا سیستم عامل)

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

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

کلاس ریزپردازنده

کلاس ریزپردازنده اوضاعش فرق داشت! چند جلسه اول استاد صرفا ما رو با AVR آشنا کرد (و اطمینان داد مباحث تئوری مثل تاریخچه و یا حتی معماری AVR در امتحان نمیان) از جلسه چهارم استاد سوالات امتحانی رو در قالب سرفصل ها تدریس می‌کرد. مثلا «مداری طراحی کنید که چهار LED را در زمانی مشخص روشن و سپس خاموش کند»، بعد مدار رو در پرتئوس می‌کشید و کدش رو در کدویژن می‌نوشت و اجرا می‌کرد.

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

کلاس معماری

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

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


و الان وقتشه که به این سوال پاسخ بدیم …

آیا تاریخ وار خواندن دروس تخصصی کار درستی‌ست؟

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

این مطلب حس می‌کنم زیادی طولانی شد، شما به بزرگواری خودتون ببخشید ولی لازم دونستم که بنویسمش 🙂

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

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