زندگی، فلسفه، تکنولوژی صنعت <- اندیشه ها، احساسات

۲ مطلب در اسفند ۱۳۹۶ ثبت شده است

یه سری کتاب

امروز کلی تستای عجیب دارم که برای همش هی باید build  رو iOS بگیرم که با یه MacBook سه چهار ساله و یونیتی کلی وقته. تصمیم گرفتم این وسط یه کار خوبی که از آقای فصیحی یاد گرفتم رو شروع کنم. یه سری از کتابایی که چند وقت گذشته خوندم رو اسمشو می نویسم و کمی توضیح می دم. ایشون این کارو زیاد می کرد قبلنا. چون خوبه بقیه پستاشونم ببینید لینک به پست خاصی نمی دم.
در چند وقت گذشته کتاب فنی زیاد نخوندم. به آمازون و اینا هم چون این سیستم بلاگ ، پلاگین نداره لینک نمی تونم بدم.
بینوایان: من کلا ادبیات کلاسیک زیاد نخوندم. یعنی کلا تو زندگیم کتاب خیلی نخوندم :( و زیر 100 تا خوندم. از حدود 22-23 سالگی شروع کردم بفکر کنم. این کتاب سومین کتابی بود که از ادبیات کلاسیک می خوندم و باید بگم خیلی از فیلم و کارتونو هر چیز دیگه ای که ازش دیدین بهتره. فرق بزرگش اینه که هم داستان کامل خیلی طولانیتره و از اون مهمتر، پر مطالب جدی در باره مسایلی مثل قانون، اخلاق، فلسفه، جنگ، میزان درستی قانون و محدودیت هاش، مذهب، معنویات و .... داره. یعنی شبیه تولستوی گه گاه داستان اصلی رها شده و به این مسایل مربوط پرداخته شده. تنها نکته منفی کتاب این بود که گاهی مسایل کناری که توصیف می کرد اصلا جالب نبود برام و حوصلم سر می رفتش. مثلا یه تعداد خوبی صفحه به توضیح شکل داخل معبد راهبه ها توضیح می داد که حوصلم سر رفت. یا مثلا جای دیگه ای راجع به شبکه فاضلاب پاریس و باز سازی هاش و ... توضیح می ده. احتمالا همینا برای یک فرانسوی و یا کسی در تاریخ نزدیکتر به سال نوشته شدن جذابتر بوده. بعد از این کتاب یه کوچیک از کوژپشت نتردام رو خوندم که فعلا ولش کردم تا بعد. راستی من ترجمه انگلیسی موجود روی kindle رو خوندم. این که نسخه بهتری هست یا نه و این که فارسی کدومش بهتره رو نمی دونم. 

Diffusion of innovations نوشته Everett M Rogers این کتاب راجع به این هست که یک اختراع چه طور بین مردم گسترش پیدا می کنه و هر ایده نویی رو هم اختراع فرض کرده. مثلا به جز هواپیما و فکس به ایده نوی کنترل خانواده و جمعیت در یک روستا و یا روش جدید شستن دست و میوه و ... هم اختراع/نو آوری می گه. این کتاب عالی بود و بهترین نکته این بود که به شکل آکادمیک با بررسی انواع دیدگاه و تاریخچه هر چیزی و انواع روش تحقیق یه دید کلی بسیار خوب به آدم می داد. من این کتاب رو هم زمان با The tipping point خوندم و اون به نظرم مزخرف اومد در برابر این. تنها نکته کتاب که می تونه منفی باشه اینه که چون آکادمیک هست گاهی قلمش خیلی خشک می شه و خوب یه کم هم طولانی هست. یه چیز خیلی جذاب دیگه توش هست که به طبعات منفی اختراع ها می پردازه. مثلا یه داستان داره که توش تعریف می کنه ، کشیشا و خیر خواها تو استرالیا یه سری تبر فولادی داده بودند به یه سری از این قبایل اون جا که به جای آسایش باعث شد برای گرفتن تبر هم حتی دختراشونو بفروشند، کلی تنبل بشند و به جای تولید بیشتر، بیشتر بخوابند و ... ما معمولا نگاهمون به نو آوری صرفا مثبته که هم دلایلش رو بررسی می کنه و هم بحث مناسب انجام می ده.

The tipping point نوشته Malcolm Gladwell این کتاب از دیدگاه اپیدمی به نشر ایده ها و وقایع و کلا مفاهیم اجتماعی می پردازه. از بررسی انتشار یک مد تا بررسی از بین رفتن خلاف در New York تو کتاب داستان هست. بعضی از داستانا با کتاب قبل یکیه و با این که قلم گلدول بسیار شیرینه و کلا کتاب pop هستش و عمقش کمتره، خوندنش خیلی راحت و ملوه. هر چند کتاب دیدگاهش خیلی یه طرفس و در ضمن به نظر من نویسنده که به شکل رادیکالی لیبراله، زیادی آسمون ریسمون به هم می بافه که ثابت کنه برخی نظرای دیگه اش راجع به ارزش های بشر و نوع برخی برخورد ها درسته. کلا کتاب قبل و ترجیح می دم و این کتاب به نظرم حتی می تونه گول زننده هم باشه. کتاب جالبه و ایده کلیش و نگاه کلیش لنز جالبی هست برای نگاه و بررسی به وقایع یا حتی استفاده برای فروش و ... اما باید به نظرم این موضوع در نظر گرفته بشه که میزان مطالب علمی کتاب بسیار کمه (در مقایسه با کتاب قبل) و دیدگاه جامعی نداره. 

Philosphical investigations نوشته Ludvig Wittgenstein این کتاب یه کم سخت و پیچیده هست و گاهی برای من لازم بود هر صفحه رو دو بار بخونم. البته ظاهرا بهتر بود کتاب اول ایشون رو اول می خوندم. کتاب اولش متاثر از تفکرات راسل و کلا دورانش سعی در این داشته که ساختار منطقی کاملی برای تعریف همه چیز پیدا کنه و طبعا ابزارش منطق و یافتن یه سری گزاره هایی بوده که می بایست پایه همه چیز های دیگه قرار می گرفتند. این کتاب بیش از سی سال بعد اون نوشته شده و در باره غیر ممکن بودن اون کار هست. کتاب کلا در باره این هست که زبان ما چه قدر به تجره ما وابسته هست و هر کلمه چه قدر به تعریفی که ما ازش می کنیم و موقعیتی (context)ی که در اون استفاده می شه چه قدر تغییرش می ده و ... بخش اول کتاب پر از بازی های زبانی و مثال از انواع بازی و تعامل و ... هست که سعی می کنه انواع مشکلات مربوط رو نشون بده و ثابت بکنه. یه 20 صفحه از کتاب موند و هنوز تمومش نکردم چون وقت نشده و از این کتابا هم نیست برداری دو صفحشو بخونی بذاری بعدا و ... حیف می شه. اگه تو جو خوندن کتابای فلسفه و منطق این طوری جدی هستید توصیه می کنم و اگه نیستید هم خوندنش و یا نگاه بهش رو توصیه می کنم. چون هر مطلبش شبیه به کتاب "چنین گفت زرتشت" نیچه یک مطلب کوتاه هست و بریده بریده، هم خوندنش راحت می شه و هم چون ساختار کلی نداره (کتاب کلا بر علیه ساختاره) ، فهمش کمی سخت. 

برادران کارامازوف نوشته داستایوسکی من ترجمه بدش رو از gutemberg گرفتم و خوندمو وسطش فهمیدم. کلا این کتاب و crime and punishment رو دلم می خواست بخونم چون از اثرات معروف کلاسیک بودند و چون تولستوی اثر خوبی به عنوان یه روس روم گذاشته بود. اول بگم که اصلا در حد تولستوی نیست و می خوره تو ذوقتون اگه دنبال همچون شاهکارایی باشید. کلا کتاب خوبیه و داستان جالبی داره ولی قلم خیلی جذابی و قوی نداره و ظاهرا همه هم تو منتقدا موافقند با این. وسط خوندنش تو The Ney Yorker به یه مطلب از مصاحبه با مترجم های مختلف این کتاب برخوردم که بسیار جالب بود. چیز جالبی که تو ادبیات کلاسیک و یا حد اقل این دو تا کتاب این پست بود اینه که راجع به خیلی چیزا که تو جامعه امروز بحث نمی شه بحث می کنند. مثلا در باره وطن پرستی، برتر دیدن نژاد و یا مثلا نقش و جای معنویات تو زندگی، تاریخ دین و خوبیا و بدیاش و ... ما اصلا بحث نمی کنیم. تو غرب هم در باره بعضیش بحث نمی شه تا جایی که ما از بیرون می بینیم و در باره بعضی می شه. اون قدر بعضی بحثا سخته که مثلا وقتی تو theory of fun می خواست راجع به این که چه کارایی رو مردا و چه کارایی رو زنا معمولا بهتر انجام می دن، با این که پشت حرفش و دلیلش تحقیق دانشگاهی بود، قشنگ اول کلی گارد ها رو نرم کرد و گفت که من sexist نیستم و ... بعد حرفشو زد. در باره بعضیای دیگه شون هم مثل تو کشورایی مثل ما بحث نمی شه. گذشته از اون کتاب راجع به انواع تفکری بود که ذهن آدم ها و به طور خاص جوانان روس تو اون دوره رو دوره کرده و چیزایی که تو زندگی پیش میاد و نوع برخورد آدمای مختلف با فکرای مختلف باهاشون و این کتاب هم مقداری راجع به قانون و مجازات و این که چه قدر می تونه گاهی خلاف هدف اصلیش عمل کنه بود. 


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

۰۹ اسفند ۹۶ ، ۱۹:۲۵ ۰ نظر موافقین ۰ مخالفین ۰
اشکان سعیدی مزده

کد ناهمگام (Asynchronous) چیست و چرا مهم است؟

با تشکر از حجت جعفری برای ترجمه کله asynchronous

از آن جایی که به عقیده من دانستن مطالب پایه ای و احتمالا خواندن/مطالعه برنامه ها و روش های طراحی دیگران قویترین ابزارهای پیشرفت ما برنامه نویس ها هستند، امروز می خواهم در باره کد ناهمگام و اهمیت آن صحبت کنم. کد ناهمگام امروزه دیگر یک مفهوم خاص برای جاهای خاص نیست و در بسیاری از پلتفرم های برنامه نویسی رخنه کرده است (اگر معادل فارسی خوب و قابل فهم غیر عجیب برای platform می دانید، لطفا در کامنت ها به من بگویید. اخطار کسی که سکو را پیشنهاد دهد در طبقه دوازدهم جهنم در کنار javascript و visual basic با نسخه ابتدایی DOS همنشین و ... خواهد شد). تقریبا همه توابع در API های Universal Windows Platform در Windows 10 ناهمگام هستند و مشهور است که در Facebook تمام API های داخلی مورد استفاده برنامه نویس ها ناهمگام هستند.
اما کد ناهمگام چیست؟ برنامه ای که در آن شما پس از درخواستی برای انجام یک کار، منتظر تمام شدن آن نمانید و به کار خود تا جای ممکن ادامه دهید و پس از باز گشتن پاسخ ، پردازش درخواست خود را ادامه دهید، شما در حال استفاده از کد ناهمگام هستید. معمولا درخواست های کند مثل خواندن و نوشتن دستگاه های ورودی I/O چون دیسک و یا خواندن/نوشتن در شبکه و هر عمل کند دیگری که احتمالا به این سیستم های ورودی و خروجی مربوط است و/یا شامل پردازش های طولانی می شوند به شکل ناهمگام پیاده سازی می شوند.
در زبان های مختلف برای اجرای کد ناهمگام یا تعریف آن مکانیزم های مختلفی وجود دارد. مثلا در سی شارپ async await تقریبا راحتترین روش برای فهم کد ناهمگام و تعریف و اجرای آن است که به وسیله بسیاری زبان های دیگر نیز در سال های اخیر پیاده سازی شده است. در برخی زبان ها به شما یک آبجکت به نام future برگردانده می شود که شما می توانید با استفاده از آن چک کنید که آیا عملیات ناهمگام تمام شده است یا خیر و یا برنامه را تا تمام شدن آن بلاک کنید. بلاک کردن برنامه بدین معنا خواهد بود که thread جاری برنامه دیگر هیچ کدی را اجرا نمی کند تا عملیات ناهمگام مربوطه به پایان برسد. از این لحظه به بعد برنامه شما به شکل همگام منتظر پاسخ آن عملیات خواهد ماند. اگر دقیقا پس از فراخوانی کد ناهمگام منتظر جواب آن برنامه را بلاک کنید آن گاه گویی کد همگام اجرا کرده اید.
معمولا کد ناهمگام به دو روش push و Pull قابل پیاده سازی است. در روش pull برنامه اصلی باید در بازه های زمانی چک کند و ببیند که آیا عملیات گرفتن داده از شبکه یا نوشتن روی دیسک و ... تمام شده است یا خیر. این روش به صرفه نیست و دیگر طقریبا مورد استفاده قرار نمی گیرد. در روش push طرف دیگر عملیات ناهمگام (مثلا دیسک) به شما سیگنالی ارسال می کند و یا وقفه ای تولید می کند که نشان می دهد عملیات تمام شده و شما می توانید نتیجه را گرفته و کار مربوط به آن عملیات را ادامه دهید. توضیحات کامل چگونگی اتفاق افتادن push بین سخت افزار و driver و سیستم عامل بخشی از مطلب فعلی نیست و به آن نمی پردازم. در سیستم های ناهمگام نرم افزاری هم شما معمولا از سمت دیگر عملیات ناهمگام به سمت فراخوان اطلاع می دهید که جواب حاضر است. مثلا اگر یک سیستم جست و جوی داده نوشته باشید که درخواست جست و جو دریافت می کند و پس از تمام شدن به شکل ناهمگام پاسخ را پس می دهد، برای پیاده سازی آن باید یا یک تابع (function pointer / delegate / ...) بگیرید که پس از تمام شدن عملیات آن را فراخوانی کنید و یا یک رفرنس به یک future را به فراخوان برگردانید که پس از تمام شدن کارتان نتیجه را در آن قرار خواهید داد. خیلی از سیستم ها در engine های مدرن بازی سازی بدین شکل کار می کنند. در بسیاری سیستم ها درخواست های بررسی به physics engine ارسال شده و physics engine پس از یافتن جواب آن را در صفی قرار می دهد و یا به گونه ای دیگر به درخواست کننده برمی گرداند. به خصوص در معماری بازی های تحت شبکه و MMO این کار بسیار معمول است.
اما فایده این همه پیچیدگی اضافه در کد و استفاده از سیستم های ناهمگام چیست؟ فایده اصلی این است که پردازنده و برنامه شما منتظر و معطل باقی نمی ماند تا عملیاتی نسبتا کند تمام شود وی شما می توانید به کار خود ادامه دهید یا درخواست هایی به که عملیات فعلی ربطی ندارند را پاسخ دهید. بدین شکل سیستم های کامپیوتری بسیار بهینه می شوند و قدرت پاسخ گویی بسیار بالاتری هم پیدا می کنند. فرض کنید یک برنامه وب سرور پس از گرفتن هر درخواست کل برنامه را تا خواندن صفحه مورد نظر از دیسک متوقف می کرد. در این صورت هر وب سرور احتمالا در ثانیه زیر 100 درخواست را پاسخ می داد. البته خیلی از وب سرور های قدیمیتر از روش های مثل ایجاد thread برای هر کاربر استفاده می کنند و داخل thread تا دلتان بخواهد توابع همگام اجرا می کنند ولی در وب سرور های مدرن و تمام سیستم های تحت اینترنت و حتی در تمام API های جدید Windows از کد غیر ترتیبی استفاده می شود. تعداد کاربران امروزی سیستم ها و با کامپیوتر های فعلی بدون استفاده از برنامه های ناهمگام و برنامه های توضیع شده قابل پاسخ گویی نیستند. ما باید سعی کنیم تا جای ممکن کد های مختلف را روی هسته های مختلف پردازنده به پیش ببریم و هرگز منتظر عملیاتی نمانیم مگر مجبور باشیم و نتوانیم تا رسیدن پاسخ به کار دیگری ادامه دهیم.
سیستم بسیار جالبی برای نوشتن کد کاملا ناهمگام و موازی به یونیتی هم اضافه شده است که به C# job system معروف است و در نسخه های سال 2018 کم کم به برنامه اضافه خواهد شد. البته این سیستم ها به جز امکان اجرای ناهمگام بسیاری درخواست ها ، امکانات مهم دیگری مثل امکان اجرای کد gameplay روی چندین هسته و thread به شکل موازی و استفاده از حافظه unmanaged را هم به شما می دهد که از دلایل مهم اثر بسیار بالای آن روی performance برنامه هستند.
معایب سیستم های ناهمگام پیچیدگی بیشتر و نامناسب بودن بسیاری از ابزارهای برنامه نویسی ما برای کار با آن ها هستند. مثلا در .NET تا همین نسخه 2.1 تمام stack trace های مربوط به کد async بسیار ناخوانا بودند. به طور کلی به بهترین ابزار ها هم ، آنالیز کد های ناهمگام بسیار سختتر است زیرا شما نمی دانید در هر لحظه چه کد های دیگری دارند چه کاری انجام می دهند. اگر برنامه خطی باشد بیشتر این مشکلات وجود ندارند.
امیدوارم این پست به شما کمک کند که قدرت واقعی و مشکلات کد ناهمگام را بهتر درک کنید و بتوانید برای استفاده از آن در بنامه های مختلف تصمیمات درست بگیرید.

۰۱ اسفند ۹۶ ، ۱۴:۰۱ ۲ نظر موافقین ۰ مخالفین ۰
اشکان سعیدی مزده