بحث پیرامون آینده زبان ها و فناوری های مربوط توسعه نرم افزار

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

برنامه نویسی همچنان در مسیر کارایی (راندمان) پیش میره.
این توسعه دهنده‌ها هستن که با کنار هم گذاشتن چند کامپوننت از پیش نوشته شده، یه محصول برای کاربر نهایی تولید میکنن و به سمت سادگی میرن.
تفاوت هست بین programmer و developer.

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

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

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


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

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

بله. الآن سایتهایی هستن که شما با درگ-دراپ میتونید برای خودتون یه وبسایت بسازید. کاملا هم استاتیک نیست، یه سری قابلیت داینامیک ساده هم داره.
آیا ازشون استفاده میکنید؟
آیا به خاطر وجود frontpage، کسب و کار developerها تعطیل شده؟


به نظر من

نزدیکترین شانس ما برای هوش مصنوعی واقعی MetaProgramming هست. که در مرحله‌ی سوم (با توجه به توضیحاتی که بالا دادم) قرار داره. جو اطرافش (مربوط به سالهای 1970-1990) فروکش کرده و به جایگاه واقعی خودش رسیده.
در حالی که شبکه‌های عصبی در فاز دوم هست. جو زیادی اطرافش هست و انتظارات مردم به شدت بالاست. (مثل بیت‌کوین ۲۰هزاردلاری)

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

3 پسندیده

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

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

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


از زمان کتاب i.robot بودن کسانی که از تکنولوژی‌های جدید میترسیدن و فیلم ترسناک میساختن.
و همچنین بودن کسانی که نمیترسیدن و این تکنولوژ‌ها رو پیش بردن.

1 پسندیده

این قسمت رو گل گفتی ، آدمهایی مثل بیل گیتس و استیو جابز و … مرد تجارتن تا مهندس و داستانهای زیادی در موردشون هست ، قهرمان های واقعی دنیای تکنولوژی و علم امثال تسلا و لینوس تورالدزن
اما بسوزد پدر سرمایه داری که پولدارها همیشه آقای دکتر و مهندس بودن

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

3 پسندیده

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

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

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

3 پسندیده

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

5 پسندیده

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

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

دقیقا برعکس قضیه‌ی لایبرریها. لایبرریهای قدیمی اصولا بهترن :grinning:

2 پسندیده

الکسیر بی نظیره فقط تو io یکم مشکل دارم ، تو برای کارهای io در کلوژور چیکار میکنی ؟ مثلا این امکان وجود داره که متغیر mutable هم داشته باشی ؟

برای io لایبرری داره خودش clojure.java.io همونطور که از اسمش پیداست، از جاوا استفاده میکنه (البته تا حالا باهاش کار نکردم)

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

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

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

عکسهای پزشکی (ماموگرافی، CaT scan و MRI) خیلی بزرگ و سنگین هستن و کامپیوترهای پزشکی نسبتا ضعیف.
و میگفت که immutable کار کرده. تغییراتی که توی نور و کنتراست و وضوح عکس انجام میشد در حقیقت immutable بود و از روی یه دیتای ثابت توی هر لحظه modify میشد و نمایش داده میشد. (اینطور نبود که دیتا سر جای خودش تغییر کنه) سرعت (frame rate) خیلی بالایی هم داشت. (در مقایسه با نرم‌افزار قدیمی که با زبانهای دیگه نوشته بودن)
اگه اشتباه نکنم، دوتا نرم‌افزار بود. یکی با clojure و یکی با clojurescript (تحت وب)

کلوژر یه لایبرری داخلی داره به نام core.async کارهای خفنی ازش دیدم. گرچه هنوز پروژه‌ی بزرگی با کلوژر ننوشتم.


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

1 پسندیده

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

int id ; 
public void setId(int id){
this.id = id;
}
public void getData(){
this.setId(34);
}
public int getId(){
return this.id;
}

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

یعنی زبانهای فانکشنال تو بعضی موارد بهینه تر هستند در io ؟ :thinking:

خوب اصلا قضیه از زمین تا آسمون فرق میکنه.
این روش توی زبانهای functional اصلا عملی نیست. توی هر زبونی باید به روش خودش و با mind set خودش مشکل رو حل کرد.

اگه درست فهمیده باشم این قضیه‌ی encapsolation هست. که کلاس یه getter و یه setter داره و همه‌ی تغییراتی که قراره توی مقدارهای private خودش انجام بشه رو از طریق این دوتا تابع هندل میکنه و اینطوری به بقیه اجازه‌ی دسترسی به مقدارها رو (نه برای خوندن و نه برای نوشتن) نمیده.

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

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

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

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

1 پسندیده

دقیقا چیزی که رو بیانش برام سخت بود راحتتر کردی . این دیتا پاس کاری میشه اما میشه به صورت گلوبال ذخیرش کرد تا داخل یه فانکشن دیگه صدا کرد ؟ مثلا همون کد بالا که نوشتم رو در نظر بگیر ، با یک متد میتونی id رو ست کنی و بعد از یک متد دیگه میتونی به مقدار جدید id که گلوبال هست دسترسی داشته باشی بدون اینکه لازم باشه id بین اینها پاسکاری باشه . در حقیقت اون id یک state هست که میتونی از هرجای کلاس بهش دسترسی داشته باشی و استفاده کنی اما در زبانهای فانکشنال چون گلوبال نداری mutable نداری کار خیلی سختر میشه و همینه که بعضی از کارهای پردازشی رو تو فانکشنال مصیبت میکنه .
مثلا چندتا حلقه تو در تو رو در نظر بگیر که مثلا اگر حلقه سوم به عدد خاصی برسه باید حلقه اول برگرده از اول شروع کنه و … نوشتن این جور چیزها تو زبونهای فانشکنال واقعا سخته و من هنوز نتونستم راه حلی پیدا کنم.
یه کتابی بود که برنامه نویسی فانکشنال رو با اسکالا یاد میداد و توش موارد خیلی جالبی نوشته شده بود و اگر وقت داشته باشی لینکشو میفرستم حتما مطالعه کن ، چیزی که جالب بود برام این بود که در داخل همون کتابم نوشته شده بود که زبانهای فانکشنال گزینه مناسبی برای کارهای io نیستند

اصلا هیچ تابعی نباید به چیزی خارج از خودش کار داشته باشه. نه باید بخونه و نه باید بنویسه.
این میشه side effect و اصلا pure function نیست.
توابع باید فقط چیزی رو بخونن و بنویسن که بهشون ارسال شده (از طریق آرگومان‌ها)

کار خیلی راحتتر میشه.
تا حالا نشده توی یه پروژه به این فکر کنید که «چرا این الآن مقدارش فلانه؟» یا «این اصلا از کجا اومده؟» یا «چرا یکی وسط راه مقدار اینو تغییر داده؟»
وقتی شما oop کار میکنید، برای پایدار کردن سیستم مجبورید سختیهای زیادی از جمله SOLID رو به جون بخرید. کاریش هم نمیشه کرد. بدون اینا کارهای large scale تبدیل به سردرد میشه.

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

اینجا الآن یه الگوریتمی رو توضیح دادید که توی (بیشتر) زبانهای C-based اوکی هست. ولی نه توی clojure (و احتمالا نه توی بقیه‌ی لیسپ‌ها)

یه نگاهی به multi-arrity functions در کلوژر بندازید. (متاسفانه هنوز توی این انجمن درموردشون تاپیک نزدیم)

در عمل که نمیشه همه توابع pure باشند و بالاخره چندتاشون side effect دارند .

حالا من یک تعریف دیگه خونده بودم که اگر اشتباه نکنم نویسنده میگفت تابعی pure هست که به ازای هر مقداری که میدی نتیجه معلوم و مشخصی بدست بیاد (مثلا io چون گاهی اوقات نتیجه مشخصی نداره یا رفتارهای غیر قابل پیش بینی داره برای همین ساید افکت …)

در مورد خطایابی و … کار راحتتر میشه اما در بقیه موارد در مورد الکسیر حداقل برای من راحت نبود و چون گلوبال و mutable نبود مجبور بودم همه چی رو در مموری ذخیره کنم یا فایل .
مثلا به محض استارت برنامه ،شروع میکرد که id دستگاهها رو بگیره و بعد از طریق این id با هر دستگاه ارتباط برقرار کنه و داده های سنسورش رو بگیره . خب تو بودی این id ها رو کجا ذخیره میکردی ؟باید یک جایی باشن که از همه جا بهشون دسترسی داشته باشی یا هم اینکه هربار 5 ثانیه وایستی تا آی دی یک دستگاه رو بگیره بعد از طریق id دیتا رو بگیره ! نه متغیر گلوبال داری نه mutable ! هربارم برنامه از کار می افته آی دی ها عوض میشن .خودشم گرفتن داده به ترتیب نبود که پاس بدی بره . وقتی هم داده ها رو میگرفتی به این راحتی نبود که به چندتا تابع پاس بدی ! گاهی وقتها باید از بایت 500 میپردی به بایت مثلا 200 و … ، اینها رو بخوایی تو یه زبون فانکشنال بکنی نه تنها مصیبته از نظر من بلکه مصرف مموری میره بالا و برای iot فکر نکنم گزینه خوبی باشه
برای همین دیگه هیچ وقت در مورد io به زبانهای فانکشنال فکر نمیکنم مگر در موارد خاص .

تو کلوژور بخوایی همین روند رو انجام بدی چجور انجام میشه ؟ مثلا تک تک بایتها رو بخونی و مثلا اگر بایت شماره 23 ، 0xFF بود دو بایت برگردی به عقب و دوباره از اونجا یه حلقه دیگه شروع کنی ؟ هرچقدر حساب کتاب میکنم این کارها تو زبانهای فانشکنال کار و دردسر بیشتری داره و گاهی اوقات mutable جواب همه چیز هست .

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

زمانی که لازم باشه. نه برای اصل کار.

درسته.
اینکه «اگر io داشته باشه pute نیست» به خاطر اینه که ریسورس ما ممکنه تغییر کنه. صرفا به همین خاطر. وگرنه اینکه io داشته باشیم باعث نمیشه دیگه پروژمون pure function نباشه.

اصولا معماری سیستم رو طوری میچینن که io وسط کار انجام نشه. یه جور abstraction ایجاد میکنن که هسته‌ی پروژه هیچ ساید افکتی نداشته باشه و کدهایی که خروجی به کاربر میده یا ورودی میگیره در جای دیگه‌ای باشه.

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

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

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

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

:sweat_smile:این کارو من قبلا کردم خودشم نه یک بار بلکه بیشتر از صد بار ، کلی مقاله و کتاب در مورد توابع بازگشتی و … نمونه کد خوندم ، پاک کردم دوباره نوشتم و هی ادامه دادم اما بازم راحت نبود

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

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