از گم‌نامی‌ زبان کلوژر و نبود منابع کافی برای یادگیری تا آینده این زبان

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

3 Likes

زبان های کامل فانکشنال همیشه community کوچک تری از زبان های غیر فانکشنال دارند
انتظار نباید داشته باشید که به محبوبیت جاوا بشه
در مورد منابع هم کلوژر منبع کتاب یا talk کم نداره

2 Likes

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

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

1 Likes

بله اما به چند دلیل تاریخی همیشه OOP محبوب تر بوده نه به دلیل اینکه پردایم بهتریه

6 Likes

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

خیلی از برنامه نویسهای کلوژر، بکگراند کار با Lisp (یا eLisp) دارن. همین یعنی اینکه چندسال با زبانهای دیگه کار کردن بعد دیدن لیسپ چقدر باحاله و رفتن باهاش کار کردن بعد کلوژر به وجود اومده و دیدن که یه لیسپ تر‌و‌تمیز هست با معماری دقیق و حساب‌شده که مثل Common-Lisp هر چیزی توش وارد نشده.
توضیح:
توی صحبتی که با سمیر عزیز داشتم، پرسیدم که «چرا لیسپ اینقدر شلخته درست شده؟» (من قبل از لیسپ، با کلوژر آشنا شدم) و جواب داد «چون خیلی قدیمیه و هر پترن جدیدی که ساخته شده، اومدن توی CL پیادش کردن» (دلیلش میتونه این باشه که پیاده‌سازی چیزهایی که برای زبانهای دیگه خیلی سخته، توی لیسپ خیلی آسونه. چندتا برنامه نویس هم نشستن پیاده‌سازیش کردن. مثلا برنامه نویسی OOP در لیسپ خیلی پیشرفتست)

همه‌ی اینا رو توضیح دادم که بگم:
کمیت کامیونیتی کلوژر بالا نیست ولی کیفیت بالایی داره.
برنامه نویسهای کلوژر، کم پیدا میشن ولی وقتی یکیشون برای شما رزومه میفرسته، میبینید طرف حداقل ۱۰سال سابقه‌کار داره.
درحالی که زبانهایی مثل PHP، Python و js وقتی یه نفر میاد برای استخدام، سطح سوادش میتونه از منفی باشه تا خیلی بالا. (سواد منفی کسانی هستن که فکر میکنن بلدن ولی چیزی حالیشون نیست)

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

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

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

یه دلیلی وجود داره که به برنامه نویسهای لیسپ میگن «Lisp Hackers» و وقتی توی ایمکس، slime رو باز میکنیم پیغام میده «Let the hacking commence!»

همین مساله برای کلوژر هم هست. بعید میدونم تعداد برنامه نویسهاش با گذشت زمان کم بشه.
بعید میدونم هیچوقت کلوژر بتونه از نظر تعداد برنامه نویسها، با زبانهای معمول رقابت کنه. دلیلش ربطی به بد بدون کلوژر نداره، دلیلش شاید تنبل بودن اکثر انسانها باشه.

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


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

5 Likes

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

خب آیا درسته که یک تازه کار یا کسی که دو سه سال کار برنامه نویسی کرده (منظورم اینه که برنامه نویس خبره نباشه) با توجه به این که آموزش های سطح بالا وجود داره از ابتدا یک زبان مثل کلوژر را شروع کنه؟

آیا این مورد باعث نمیشه که یک برنامه نویس با کمبود منابع مواجه بشه چون کسی که برنامه نویس خبره هست کمتر به مشکل بر میخوره و قاعدتا کمتر هم سوال میپرسه و در نتیجه منابع کم میشه؟

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

قطعا همین طوره

1 Likes

بابت ویدئو ممنون
آیا این محبوبیت در آینده هم وجود داره مثلا ۱۰ سال دیگه؟

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

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

البته کنار هم گذاشتن چندتا لایبرری و درست کردن یه وبسایت معمولی با قابلیتهای CRUD توی کلوژر،‌ فرق چندانی با انجام همین کار توی پایتون نداره!

برای منابع آموزشی هم منابع سطح پایین خوبی وجود داره. کتابهایی مثل Clojure for Brave and True یا پادکست Functional Design in Clojure.
فقط مساله اینه که داکیومنتهای لایبرریها، یه کم سطح بالا هستن و برای منم سخته فهمیدنشون. مثلا re-frame به نظرم خیلی پیچیده توضیح داده و میتونست خیلی ساده‌تر داکیومنتش رو بنویسه.

واقعا به این مشکل بر نخوردم. یکی از خوبیهای کلوژر، پایداری و دقیق بودن مسیر توسعش هست. به طوری که یه لایبرری که ۱۰سال پیش براش نوشته شده به احتمال ۹۹درصد روی آخرین ورژن کلوژر هم درست کار میکنه و یه سوال stack-overflow که برای ۱۰سال پیشه به احتمال ۹۵درصد الآن هم دقیقا به همون روش میشه حلش کرد.
همچین چیزی رو واقعا توی زبانهای دیگه سراغ ندارم. مثلا چندوقت پیش با یه پروژه‌ی php کار میکردم که یه ورژن خاص از زبان رو باید نصب میکردم یا نمونه ی مسخره‌ترش Python2 vs Python3

اولا که زبانهای زیادی هستن که multi-paradigm هستن. دوما مساله اینه که اصلا لیسپ نه fp هست نه oop. درحقیقت اصلا لیسپ، زبان برنامه نویسی نیست. واقعا یک تئوریه که یهویی تبدیل به واقعیت شد!

لیسپ به عنوان یک تئوری ارائه شده توسط یک ریاضیدان به نام John McCarthy که گفته:
«اگه یه فانکشنی داشته باشیم که بتونه سورس‌کد ها رو بخونه و بعد ویرایش کنه (مثل یه تکست معمولی) و بعد بفرسته به فانکشنی که وظیفه‌ی اجرای فانکشنها رو داره (کامپایلر) میتونیم یه چیزی داشته باشیم خیلی کارآمدتر از Turing Machine.»

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

چندسال بعد شاگردش به نام Steve Russell گفت «چرا اینو نمیسازیمش؟»
و McCarthy گفت «داری تئوری و عمل رو با هم اشتباه میکنی! همچین چیزی غیر ممکنه!»
و Russell رفت اینو روی یه کامپیوتر ibm پیاده کرد و کامپایل کرد و دیباگ کرد. در نهایت نتیجه‌ی نهایی رو به McCarthy نشون داد.
این، یکی از بزرگترین برگ‌ریزونهای تاریخ تکنولوژیه :heart_eyes:
و تا همین الآن که ۶۲سال از این اتفاق میگذره، تابع eval در لیسپ، تقریبا همون شکل رو حفظ کرده و همون‌کار رو انجام میده.
دلیل سینتکس عجیب لیسپ هم همینه. چون لیسپ نیاز داشت که کدها رو به شکل دیتا بخونه، باید تمام کد‌ها رو به داخل لیست قرار میدادیم.
LISP = List Processor

این ویژگی، باعث میشه هرکسی بتونه کدی بنویسه که در زمان کامپایل، اجرا میشه.
دقیقا مثل اینه که کامپایلر لیسپ رو ویرایش کرده باشیم و قابلیتی که میخوایم رو بهش اضافه کرده باشیم.
پس خیلی راحت میتونیم یه لایبرری به پروژمون اضافه کنیم که قابلیتهای OOP به پروژه‌ی ما اضافه کنه. مثل این که اصلا از اولش همچین چیزی توی کامپایلر وجود داشته.
پس CLOS (یعنی Common Lisp Objecting System) که یکی از بهترین implementation های oop هست، واقعا یه لایبرریه که توی پروژه صدا میزنیم و خلاص! :sunglasses:


مطالعه‌ی بیشتر:

بخشی از صحبتهای John McCarthy درمورد لیسپ (تئوری):

Another way to show that Lisp was neater than Turing machines was to write a universal Lisp function and show that it is briefer and more comprehensible than the description of a universal Turing machine. This was the Lisp function eval…, which computes the value of a Lisp expression… Writing eval required inventing a notation representing Lisp functions as Lisp data, and such a notation was devised for the purposes of the paper with no thought that it would be used to express Lisp programs in practice.

توضیح McCarthy درمورد شکل‌گیری لیسپ (زبان برنامه نویسی):

Steve Russell said, look, why don’t I program this eval …, and I said to him, ho, ho, you’re confusing theory with practice, this eval is intended for reading, not for computing. But he went ahead and did it. That is, he compiled the eval in my paper into [IBM] 704 machine code, fixing bugs, and then advertised this as a Lisp interpreter, which it certainly was. So at that point Lisp had essentially the form that it has today…

و یه متن کوتاه که یه کم طول کشید کامل درکش کنم :slight_smile:

The whole language there all the time. There is no real distinction between read-time, compile-time, and runtime. You can compile or run code while reading, read or run code while compiling, and read or compile code at runtime.

Running code at read-time lets users reprogram Lisp’s syntax;
Running code at compile-time is the basis of macros;
Compiling at runtime is the basis of Lisp’s use as an extension language in programs like Emacs;
And reading at runtime enables programs to communicate using s-expressions, an idea recently reinvented as XML.

منبع متنهای انگلیسی:
http://www.paulgraham.com/icad.html

3 Likes

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

4 Likes

:joy: من این تاک رو از نزدیک دیدم

4 Likes

من گمان نمیکنم clojure یا هر زبان FP دیگه هیچ وقت به محبوبیت python , جاوا یا جاواسکریپت برسه
اما شما اگه این زبان هارو یاد بگیرید اگه حتی با این زبان ها تمام وقت کار نکنید شیوه فکر شما رو در کد imperative عوض میکنه

5 Likes

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

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

3 Likes

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

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

خیلی خیلی ممنون

1 Likes