এই পোস্টটি মূলত David-এর ওয়েবসাইটে প্রকাশিত হয়েছিল এবং অনুমতি নিয়ে এখানে পুনঃপ্রকাশ করা হচ্ছে
গত জানুয়ারিতে Exercism 12in23 নামের একটি নতুন কর্মসূচির ঘোষণা দেয়, যেখানে অংশগ্রহণকারীদের ২০২৩ সালে ১২টি নতুন প্রোগ্রামিং ভাষা চেষ্টা করার চ্যালেঞ্জ দেওয়া হয়। প্রতি মাসের একটি থিম থাকত (যেমন "অ্যানালিটিক্যাল এপ্রিল" বা "অবজেক্ট ওরিয়েন্টেড অক্টোবর") এবং সেই থিম অনুযায়ী নির্দিষ্ট কিছু ভাষা চেষ্টা করার কথা বলা হত। আমি নতুন জিনিস শিখতে ভালোবাসি আর একটু (প্রোগ্রামিং) ভাষার পোকা হয়ে গেছি, তাই ঠিক করলাম চেষ্টা করে দেখব। ১২টি ভাষা, ১২টি মাস!
বছরটা এখন প্রায় শেষ, আর এই প্রকল্পটি কত ভালোভাবে এগিয়েছে তা নিয়ে আমি দারুণ খুশি। আমি সফলভাবে ১২টি নতুন ভাষা চেষ্টা করেছি, Exercism কমিউনিটিতে চমৎকার কিছু মানুষের সঙ্গে দেখা হয়েছে, আর পথে বেশ কিছু দুর্দান্ত ওপেন সোর্স অবদানও রেখেছি! এই পোস্টে আমি সেগুলো এক এক করে দেখব এবং প্রতিটি থেকে কী পেলাম তা বলব।
ভাষা বাছাই
এই অভিজ্ঞতা থেকে সর্বোচ্চটা পাওয়ার জন্য বছরের শুরুতেই আমি কয়েকটি নিয়ম ঠিক করে নিয়েছিলাম:
- ভাষাগুলো হয় আমার কাছে সম্পূর্ণ নতুন হতে হবে, নয়তো অন্তত এতটা অপরিচিত হতে হবে যাতে মনে হয় আমি যথেষ্ট শিখছি।
- বাছাই করা ভাষাগুলো ভবিষ্যতে আরও শেখার জন্য (সম্ভাব্য) কাজে লাগার মতো হতে হবে। এই প্রকল্পটা শুধু মজার জন্য, তবে আমি (অন্তত আংশিক হলেও) কাজের জিনিস শেখাতেই সময় দিতে চাই।
- আমি যে ভাষাই ব্যবহার করি না কেন, তার জন্য সব লোকাল টুলিং আর VSCode প্লাগইন ইনস্টল করব। আমি চাইছিলাম ভাষাগুলোকে মোটামুটি সমান অবস্থানে রেখে তুলনা করতে, যতটা সম্ভব টাইপ হিন্টিং আর ইন্টেলিসেন্স সহ। কলেজে আমি আমার সব প্রোগ্রামিং হোমওয়ার্ক Sublime Text-এ করতাম, কোনো লিন্টিং বা অটো-কমপ্লিট ছাড়াই। আমার ভয় ছিল, এই সব টুল ব্যবহার করে প্রোগ্রামিং শিখলে আমি ওগুলোর উপর অতিরিক্ত নির্ভরশীল হয়ে পড়ব আর ভালো প্রোগ্রামার হতে পারব না। বরং উল্টোটা হয়েছে। আমার যন্ত্রের কাছে যত বেশি চিন্তা ছেড়ে দিতে পারি, তত বেশি হাতের সমস্যা নিয়ে ভাবতে পারি। জিনিস মুখস্থ রাখবেন না, কোথায় খুঁজে পাবেন সেটা মনে রাখুন।
চলুন শুরু করি!

জানুয়ারি (কোনো থিম ছাড়া)
জানুয়ারি শুরু হওয়ার সময় Exercism টিম তখনও মাসভিত্তিক থিম বাছাই করছিল, তাই সেই মাসের ভাষা বেছে নেওয়ার দায়িত্ব ছিল আমার নিজের। দিকনির্দেশনা না থাকায় আমি বছর শুরু করি Go দিয়ে। ২০২২ সালের মাঝামাঝি আমি ভাষাটিতে একটি ক্র্যাশ কোর্স করেছিলাম, কিন্তু এরপর আর বিশেষ ব্যবহার করিনি এবং মোটেই দক্ষ মনে হয়নি।
Go একটি মজার ভাষা। এর কঠোর কম্পাইলার মানে হলো আপনার প্রোগ্রাম অবশ্যই সঠিক হবে, আর সে যতক্ষণ না মনে করে আপনি নিরাপদ, ততক্ষণ আপনাকে এক ইঞ্চিও নড়তে দেবে না।1 এররের ব্যাপারে এর বিস্তারিত ধরন মানে আপনি কখনো অবাক হবেন না (if err != nil { return err } লিখতে হয় এত বার, সেটা আলাদা কথা)। কঠিন কাজ সহজ করতে এটি ভালো (যেমন চ্যানেলের মাধ্যমে প্যারালেলিজম), আবার সহজ কিছু কাজ কঠিনও করে ফেলে (স্ট্রিং নিয়ে কাজ করা)। এর স্ট্যান্ডার্ড লাইব্রেরি বেশ শক্তিশালী, মানে তৃতীয় পক্ষের মডিউল ছাড়াই বেশিরভাগ কাজ সেরে ফেলা যায়। ইকোসিস্টেমের অনেক কিছু (ফরম্যাটিং, ইনস্টল করা, বিল্ড করা ইত্যাদি) ফার্স্ট-পার্টি এবং go কমান্ডের ভেতরেই থাকে, যা আমার ভালো লাগে। ভাষাটির সমালোচকও আছে, তবে আমার মনে হয় সঠিকতা ও রক্ষণাবেক্ষণযোগ্যতার লক্ষ্যে এটি বেশ সফল।
এটা ব্যবহার করে আমি এতটা মজা পাইনি যে এটাই আমার প্রথম পছন্দ হয়ে যাবে, তবে পারফরম্যান্স-সংবেদনশীল প্রোগ্রামের জন্য, যেমন আমার শেল প্রম্পটে নেস্টেড পাথটি দেখানোর কাজে, এটি আমার টুলবেল্টের একটি দারুণ হাতিয়ার।
ফাংশনাল ফেব্রুয়ারি

ফেব্রুয়ারি মাসে সোজা গভীর জলে ডুব দেওয়া হলো ফাংশনাল ভাষা নিয়ে, যেগুলো সাধারণ ইমপেরেটিভ প্রোগ্রামিং ভাষার একটি গণিত-ঘেঁষা শাখা। ফাংশনাল ভাষা তাদের "শুদ্ধ" ফাংশনের জন্য পরিচিত (যেগুলোর সাইড এফেক্ট নেই)। আমি বেছ নিলাম Elixir, মূলত কারণ আমার বন্ধু Caleb Advent of Code-এ এটি ব্যবহার করেছেন আর এর প্রশংসায় পঞ্চমুখ।
Elixir নিয়ে আমার সময় বেশ ভালো কেটেছে। এটি Ruby দ্বারা অনুপ্রাণিত (যুক্তিসঙ্গতই; এর নির্মাতা José Valim Rails-এর একজন মূল কন্ট্রিবিউটর ছিলেন)। মেথড চেইনিংয়ের মতো ফাংশনাল ধারণা প্রকাশ করা আমার কাছে সহজ লেগেছে। যেসব সিনট্যাকটিক শুগার এটা সহজ করে তুলেছিল, যেমন পাইপ অপারেটর (|>), সেগুলো আমার দারুণ লাগেছে:
foo(bar(baz(new_function(other_function()))))
# becomes
other_function() |> new_function() |> baz() |> bar() |> foo()
এটাই ছিল প্রথমবার ম্যাক্রো নিয়ে কাজ করা, অর্থাৎ এমন কোড যা কোড লেখে। Elixir প্রোগ্রামকে এমন একটি AST-এ প্রকাশ করা যায় যা নিজেই বৈধ Elixir কোড, তাই অন্য বৈধ কোড তৈরি করার কোড লেখা সহজ। Elixir এই দারুণ ধারণাটিকে সহজ করে তুলেছে। এছাড়া ফাংশনগুলো কীভাবে তাদের আর্গুমেন্টের আকারের সঙ্গে প্যাটার্ন-ম্যাচ করতে পারে সেটাও আমার ভালো লেগেছে, ফলে ফাংশন কল সঠিক ইমপ্লিমেন্টেশনে পাঠানো যায়:
defmodule TuplePrinter do
def print({a}) do
IO.puts("single")
IO.puts(a)
end
def print({a, b}) do
IO.puts("double")
IO.puts(a)
IO.puts(b)
end
end
TuplePrinter.print({1})
TuplePrinter.print({2, 2})
# single
# 1
# double
# 2
# 2
এটা এমন এক ফিচার যা হয় দারুণ, নয়তো আপনার কোডকে পুরো জগাখিচুড়ি বানিয়ে ফেলে। যা-ই হোক, ধারণাটা দারুণ ছিল!
Elixir আরও উপকৃত হয় Erlang-এর BEAM virtual machine-এর ভেতরে চলার কারণে, যা তাকে যোগাযোগের জন্য একটি বড় ইকোসিস্টেম দেয়। কনকারেন্সিতে এটি দুর্দান্ত এবং জনপ্রিয় Phoenix web framework-এর মূল ভিত্তি।
Elixir ব্যবহার করার তাৎক্ষণিক কোনো প্রয়োজন আমার নেই, তবে এটি নিয়ে কাজ করতে আমার দারুণ মজা লেগেছে এবং নিশ্চিতভাবে আবার হাত দেওয়ার ব্যাপারে আমি আগ্রহী। তার উপর, পরিচিত সমস্যাগুলো অপরিচিত উপায়ে (অর্থাৎ রিকার্সিভভাবে) সমাধান করা একটি মজার চ্যালেঞ্জ ছিল।
মেকানিক্যাল মার্চ
মার্চ মাসের কেন্দ্রে ছিল "সিস্টেম" ভাষা, যেগুলো মেশিন কোডে কম্পাইল হয়।
অপশনগুলোর মধ্যে Go-ই ছিল একমাত্র ভাষা যেটিতে আমার আগ্রহ ছিল।2 এখন, সূক্ষ্মদর্শী পাঠক খেয়াল করবেন যে আমি তো আগেই এক মাস Go করেছি, তাই এটা আবার করলে আমার ১২টির হিসেবে ধরবে না। আসলে জানুয়ারিতে যখন এটি বেছেছিলাম, তখন তারা থিম করার ঘোষণা দেয়নি, তাই আমি বুঝতেই পারিনি যে নিজেকে কোণঠাসা করে ফেলছি।
যদি জানতাম Bun আসছে, তাহলে সম্ভবত Zig চেষ্টা করতাম, কিন্তু দুর্ভাগ্যবশত আমি (তখনও) ভবিষ্যৎ দেখতে পারতাম না। তাই আরও ভালো কোনো বিকল্প না থাকায় আমি আরেক মাস Go নিয়ে এগোলাম, এই বুঝে যে বছরের পরে কোনো এক সময়ে আমাকে এক মাসেই দুটি ভাষা করতে হবে।
অ্যানালিটিক্যাল এপ্রিল
এপ্রিল মাস ছিল ডেটা সায়েন্সে জনপ্রিয় ভাষাগুলোকে নিয়ে। Python-এর সঙ্গে আমি এত বেশি পরিচিত ছিলাম আর কলেজে স্ট্যাটসের ক্লাসে R করেছিলাম (যা আমার ভালো লাগেনি), তাই এবার Julia!
এতে আমার সময় ভালো কেটেছে, তবে মূলত কারণ এটি Python-এর সঙ্গে খুব মিলে যায়। এটা একটু অস্বস্তিকর ছিল, কানাডায় আমেরিকান হয়ে যাওয়ার মতো। সবকিছু খুব চেনা লাগে, অথচ ধরা-ছোঁয়ার বাইরে একটু একটু মিলিয়ে যায়। হঠাৎ কেউ আপনাকে একটি দুই ডলারের কয়েন এগিয়ে দেয় (বা এমন একটি ফাংশন, যা ম্যাট্রিক্স গণনার জন্য সত্যিই খুব মানানসই) আর তখন বুঝতে পারেন আপনি আর কানসাসে নেই।
আমার সবচেয়ে বেশি চোখে পড়েছে Julia-র টাইপ সিস্টেম। এটি Python-এর টাইপ সিস্টেমের মতো (ঐচ্ছিকভাবে) অ্যানোটেট করা যায়, তবে আর্গুমেন্ট তার ঘোষিত টাইপের সঙ্গে মেলে কি না তা নিশ্চিত করতে রানটাইম চেক থাকে। আমার মনে হয় টুলের সঙ্গে যুক্ত হওয়া আর আপনার পথে বাধা না হয়ে দাঁড়ানো, এই দুইয়ের মধ্যে Python-এর সিস্টেমই সঠিক ভারসাম্য রাখে, তবে স্বীকার করি যে ভুল টাইপের ফাংশনের জন্য Julia-র রানটাইম এররও কাজের ছিল।
শেষ বিচারে Julia চমৎকার, তবে ভবিষ্যতে এটা আমার লাগবে বলে আমি মনে করি না।
মাইন্ডশিফটিং মে
মে মাসে "নতুন কিছু চেষ্টা করুন" নীতিটা আরও জোরদার করা হলো এমন ভাষা দেখিয়ে যারা খুব অদ্ভুত ব্যাপার করে। সুযোগ নিয়ে আমি চেষ্টা করলাম বহুল জনপ্রিয় Rust। বলতেই হয়, কেন এত হইচই সেটা এখন বুঝি।
কুখ্যাত borrow checker-এ অভ্যস্ত হতে অবশ্যই সময় লাগে, তবে এটা আমাকে আমার প্রোগ্রাম নিয়ে আরও সতর্কভাবে ভাবতে শেখায়, যা আমার ভালো লাগেছে। কম্পাইলার নিশ্চিতভাবেই কঠোর, কিন্তু এরর মেসেজগুলো সমস্যা ঠিক করতে যতটা সাহায্য করেছে তা প্রত্যাশার চেয়েও বেশি। বলব না যে প্রথম সপ্তাহে আমি বিশেষ ফলদায়ক ছিলাম, তবে অন্তত শেখার বাঁকের চূড়াটা দেখতে পাচ্ছি বলে মনে হয়।
Rust-এর প্যাকেজ ম্যানেজার cargo-ও বিশেষভাবে উল্লেখযোগ্য। আমি কোনো তৃতীয় পক্ষের প্যাকেজ ইনস্টল করিনি, তবু এর বিল্ড, টেস্টিং আর ফরম্যাটিংয়ের সুবিধা দারুণ ছিল। একই কথা এর VSCode এক্সটেনশনের ক্ষেত্রেও, যেখানে Rust-এর মতো স্ট্যাটিক্যালি টাইপড ভাষার কাছ থেকে আমি যে সুবিধাগুলো আশা করি সেগুলো সবই ছিল। ভালো ডেভেলপার অভিজ্ঞতা সত্যিই সব পার্থক্য গড়ে দেয়।
ইমপ্লিমেন্টেশনের স্তরে দুটো খুব আলাদা হলেও, আমি যেসব কাজে এগুলো ব্যবহার করব (প্রোগ্রাম খুব দ্রুত চালানো) সেই বিবেচনায় Rust-কে Go-র মতোই লাগল। আমি নিয়মিত ব্যবহার করি এমন ভাষার অনেক টুল এখন পারফরম্যান্সের কারণে Rust-এর দিকে ঝুঁকছে, তাই ভবিষ্যতে এটি আরও দেখব বলে আশা করি (যদিও নিজে Rust লিখছি না)।
সামার অফ এস-এক্সপ্রেশনস (জুন)
জুন ছিল এস-এক্সপ্রেশন-এর মাস, যা লিস্প-এ একটি সাধারণ সিনট্যাকটিক রূপ। আমি বেছ নিলাম Clojure, একটি ফাংশনাল ভাষা যা JVM-এ চলে।
অনেক বছর আগে আমি অল্প কিছু Clojure লিখেছিলাম। তখন সবে পড়াশোনা শেষ করেছি এবং আমার প্রথম চাকরিতে ব্যবসার জন্য অত্যন্ত গুরুত্বপূর্ণ একটি দৈনিক স্ক্রিপ্টের একমাত্র রক্ষণাবেক্ষণকারী হয়ে গিয়েছিলাম। বলাই বাহুল্য, সময়টা কঠিন ছিল। আমি কৌতূহলী ছিলাম, এখন বয়সে ও জ্ঞানে পরিণত হয়ে দেখব এটি আরও সহজবোধ্য লাগে কি না।
আনন্দের সঙ্গে বলছি, লেগেছিল! ফেব্রুয়ারির ফাংশনাল অভিজ্ঞতা আমাকে রিকার্সিভভাবে ভাবতে শিখিয়েছিল, আর খুঁটিনাটিতে নামলে সিনট্যাক্সও তত খারাপ নয়। বড় কোনো প্রকল্পে ব্যবহার করলে এর JVM ইন্টারঅপারেবিলিটিও কাজে লাগত।
বিকল্প থাকলে Clojure কোনো কাজে ব্যবহার করব, এমনটা আমি দেখি না, তবে অভিজ্ঞতাটা মোটেই অপ্রীতিকর ছিল না।
সাইড কোয়েস্ট: Universal Test Runner!
বছরের পর বছর ধরে আমি একটি ছোট bash ফাংশন ব্যবহার করে আসছি আমার বর্তমান ডিরেক্টরির ইউনিট টেস্ট চালানোর জন্য। যখন এই নতুন ভাষাগুলোতে কাজ করছিলাম, তখন সুবিধার জন্য নিজের অজান্তেই এতে লাইন যোগ করছিলাম; ভাষা-নির্দিষ্ট টেস্ট কমান্ড বারবার আবার শেখার চেয়ে t চালানোর কথা মনে রাখা অনেক সহজ ছিল।
দরকারি লজিক আমার bash-এ স্বাচ্ছন্দ্যের সীমা ছাড়িয়ে যেতে শুরু করলে জুন মাসে কিছু সময় নিয়ে প্রকল্পটিকে আলাদা একটা জিনিসে পরিণত করলাম: Universal Test Runner।
আমি এটি Exercism ফোরামে শেয়ার করলাম এবং ভালো সাড়া পেলাম। সবাই এতটাই পছন্দ করল যে আমরা ঠিক করলাম একই ধরনের সুবিধা Exercism CLI-তেই যুক্ত করব (যেটি Go-তে লেখা, এবং ভাগ্যক্রমে আমি সবে সেই বিষয়টাই ঝালিয়ে নিয়েছিলাম)। ফলে বছরের দ্বিতীয়ার্ধে সেই মাসের ভাষার টেস্ট স্যুট চালাতে পারতাম exercism test দিয়ে (এই কমান্ডটি Universal Test Runner-এ নেটিভভাবেই সমর্থিত)।
প্রক্রিয়াটি সম্পর্কে আরও জানতে চাইলে, এটি চালু হওয়ার সময় আমি বিস্তারিতভাবে লিখেছিলাম এখানে।
যাই হোক, এগিয়ে যাই!
জুরাসিক জুলাই
জুলাই মাসে দেখানো হলো পুরনো ভাষা। ব্যবহারিক দিক থেকে এই মাসে বাছাই করার সুযোগ বেশ কম ছিল। আমি শুরু করলাম সম্ভ্রান্ত COBOL দিয়ে, কারণ শুনেছিলাম এটি এখনও অনেক গুরুত্বপূর্ণ অবকাঠামো চালায়। কিন্তু আগস্টের গোড়ায় আমার বিয়ে ঘাড়ে নেমে আসায়, আমার কাছে এতটা আলাদা ভাষা বসে শেখার সময়-শক্তি ছিল না। তাই তার বদলে আমি Visual Basic বেছে নিলাম, একেবারে খারাপ না দেখানো অপশন হিসেবে।
এখানে বলার মতো বেশি কিছু নেই। ভাষাটি একটু বাগাড়ম্বরপূর্ণ মনে হলো, তবে ব্যবহার করা যথেষ্ট সহজ। আমার বুঝতে, এটি আসলে Windows-এ UI ডেভেলপমেন্টের জন্য তৈরি, তাই ছোট ছোট অনুশীলনী করলে পুরোটা সম্পর্কে ভালো ধারণা পাওয়া কঠিন।
অ্যাপি অগাস্ট
অগাস্ট মাস ভরে ছিল অ্যাপ বানানোর ভাষায়। অবাক হওয়ার কিছু নেই যে এই মাসে পছন্দ অনেক ছিল। আমি নিলাম Swift। Apple পণ্য অনেক ব্যবহার করি বলেই তাদের নিজস্ব তৈরি ভাষাটি আমার কাছে বেশ প্রাসঙ্গিক। এটি আমার কাছে একেবারে নতুন ছিল না। ২০১৬ সালে আমি শুধু Swift-এ লেখা মাত্র একটি iOS অ্যাপ প্রকাশ করেছিলাম। কিন্তু এরপর ভাষাটি আর ছুঁইনি, আর এটি অনেক এগিয়েছে, তাই আমার মনে হলো এটা হিসেবের মধ্যে ধরাই যায়।
এটি নিয়ে কাজ করা কত সহজ, তা দেখে আমি ভালোভাবেই অবাক হয়েছি। এখানকার অন্য অনেক ভাষার বিপরীতে Swift বেশ নতুন। এটি প্রথম প্রকাশ পায় ২০১৪ সালে এবং আধুনিক ভাষা ডিজাইনের শিক্ষা থেকে স্পষ্টভাবে উপকৃত হয়েছে। এতে আছে ফার্স্ট-পার্টি প্যাকেজ ম্যানেজার, অপশনাল চেইনিং, ফার্স্ট-ক্লাস ফাংশন আর যুক্তিসঙ্গত স্ট্রিং ইন্টারপোলেশন। Xcode ব্যবহার না করেও এটা পড়তে ও লিখতে আরামদায়ক লেগেছে।
এসব সত্ত্বেও, Swift মূলত Apple প্ল্যাটফর্মের অ্যাপের প্রেক্ষাপটে কাজে লাগে, যা আমি এখন লিখি না। অনুশীলনীগুলোর জন্য এটি ভালো কাজ করেছে, তবে শিগগিরই এতে ফিরে আসব বলে আমি মনে করি না। তবে এটা আমার দারুণ লাগে যে আমি এটি আমার iPad-এ লিখতে পারি!
স্লিমলাইন সেপ্টেম্বর
সেপ্টেম্বর মাসে খোঁজা হলো খুব সংক্ষিপ্ত বা ছোট ভাষা। আমি নিলাম jq, যা বছরের পর বছর ধরে ব্যবহার করছি আর ভালোবাসি।
তবে আমি সবসময় এটাকে শুধু JSON নিয়ে কাজ করার একটি টুল হিসেবেই ভাবতাম, সাধারণ উদ্দেশ্যে ব্যবহারযোগ্য প্রোগ্রামিং ভাষা হিসেবে নয়। দেখে ভালোই অবাক হলাম যে এতে সব স্বাভাবিক উপকরণই আছে (ফাংশন, ভ্যারিয়েবল, লুপ ইত্যাদি), তাই বেশ জটিল কিছু প্রোগ্রামও লিখতে পারলাম:
# input: { "series": "1", "sliceLength": 1 }
. as {series: $series, sliceLength: $sliceLength} |
if
$series == "" then
"series cannot be empty" | halt_error
elif $sliceLength > ($series | length) then
"slice length cannot be greater than series length" | halt_error
elif $sliceLength == 0 then
"slice length cannot be zero" | halt_error
elif $sliceLength < 0 then
"slice length cannot be negative" | halt_error
else
.
end
| [range(0; $series | length)]
| map($series[. : . + $sliceLength])
| map(select(. | length == $sliceLength))
সহজ ডেটা রূপান্তরের জন্য যেসব jq ফিচার আমার কখনো দরকার হয়নি, সেগুলো চেষ্টা করা মজার ছিল। এখানে টুলিং কিছুটা কম ছিল (এডিটর ইন্টিগ্রেশন নেই ইত্যাদি), তবু jq-র কার্যকারিতার বিস্তার সম্পর্কে গভীর ধারণা পাওয়া মূল্যবান ছিল।
সম্পাদনা: Mastodon-এ DJ Adams আমার নজরে এনেছেন jq-lsp প্রকল্পটি এবং তার সংশ্লিষ্ট VSCode প্লাগইনটি। এবার আমি সুযোগটা হাতছাড়া করেছি, তবে ভবিষ্যতে এটি দেখব।
অবজেক্ট ওরিয়েন্টেড অক্টোবর
অক্টোবর মাসে গভীরে যাওয়া হলো অবজেক্ট-ওরিয়েন্টেড ভাষায়। OO ডিজাইনের প্রতি আমার মনটা নরম, কারণ এগুলো মাথায় যেভাবে প্রোগ্রাম কল্পনা করি তার সঙ্গে বেশ মিলে যায়। আমি নিলাম Ruby, যা শুনতে অদ্ভুত পছন্দ মনে হতে পারে।
আমি কাজ করি Stripe-এ, যা বিশ্বের বৃহত্তম Ruby কোডবেসের বাড়ি। তাহলে নিশ্চয়ই এটা "অপরিচিত" ভাষার হিসেবে ধরবে না? এসব সত্যি হলেও, আমাদের Ruby মনোলিথ "স্ট্যান্ডার্ড" Ruby থেকে অনেক দূরে মনে হয়: সবকিছু Sorbet দিয়ে টাইপচেক করা হয়, অনেক কোড জেনারেশন হয়, আর সবকিছু একসঙ্গে কাজ করাতে ও স্কেল করাতে আমরা অনেক জাদু করি। Stripe-এর ভেতরে আর বাইরে Ruby শেষ বিচারে একই ভাষা হলেও, এত ভিন্ন স্কেলে কাজ করা সম্পূর্ণ ভিন্ন অভিজ্ঞতা দেয়; আমি জানতে চেয়েছিলাম বাইরের জীবন কেমন (যেসব বছরে আমি Ruby ভারীভাবে ব্যবহার করতাম)।
মূলত, ভালোই ছিল! Ruby নিজে দুর্দান্ত এবং "প্রোগ্রামারের সুখ"-কে主要 লক্ষ্য হিসেবে ধরে, যা আমার মন ছুঁয়ে গেছে। আগে কখনো ব্যবহার করিনি এমন stdlib ফাংশনের নাম কতবার যে আন্দাজ করতে পারি, সেটা ভালো লাগে। ফাংশনাল কোড বানানো কত সহজ আর সিনট্যাক্স কত আরামদায়ক ও ভাবপ্রকাশক, সেটাও ভালো লাগে।
তবু বলি, ডেভেলপার টুলিংয়ে Python-এর চেয়ে এটি কতটা পিছিয়ে, তা দেখে অবাক হয়েছি। হয়তো আমি বেশি সুবিধা পেয়ে অভ্যস্ত হয়ে গেছি, কিন্তু এডিটরের ভেতরেই টাইপ হিন্ট পাওয়া আর অত্যন্ত দ্রুত লিন্টিং ও ফরম্যাটিং পাওয়া আমার কাছে যত গুরুত্বপূর্ণ, সেটা আমি নিজেও জানতাম না। Ruby তার শীর্ষ সময়ে যত জনপ্রিয় ছিল, সেই তুলনায় এই দিকে এটি কতটা পিছিয়ে লাগল, তা ভাবিয়ে তুলেছে।3 ফাংশন কলে ঐচ্ছিক বন্ধনীর ব্যাপারটাও আমি কখনো ঠিকভাবে মানিয়ে নিতে পারিনি, যার কারণে ফাংশনকে আর্গুমেন্ট হিসেবে পাঠানো কম সহজ হয়ে যায়।
Ruby এখনো দারুণ একটি ভাষা এবং কাজে এটি ব্যবহার চালিয়ে যাব, তবে আপাতত Python যা করে না, এমন কিছু এটি আমার জন্য করে না।
নিবলি নভেম্বর
নভেম্বর ছিল এখন পর্যন্ত সবচেয়ে কঠিন মাস: অ্যাসেম্বলি ভাষা। হাতে এগুলো লেখা আর সাধারণ ব্যাপার নয়, তবু এগুলো সম্পর্কে জানা কাজের ও মজার। আমি বেছ নিলাম WebAssembly, আধুনিক ও ভবিষ্যতের ওয়েবে এর গুরুত্বের কারণে। এটি সাধারণত কম্পাইল টার্গেট হিসেবে ব্যবহৃত হয় (হাতে লেখার জিনিস নয়), তবু বাইরের পাগলগুলোর জন্য টুলিং আছে।
এই মাসের জন্য আমি অপ্রত্যাশিতভাবে ভালোভাবে প্রস্তুত ছিলাম। সিনট্যাক্স Clojure-এর মতো লাগল আর ভাষার গঠন Zachtronic-এর TIS-100-এর মতো। প্রতিটি অপারেশনের জন্য একেবারে শূন্য থেকে শুরু করতে হওয়াটা অদ্ভুতভাবে আমার ভালো লেগেছিল; পুরনো দিনের মতো লাগল। সত্যিই এভাবে কিছু করতে হলে আমি ঘৃণা করতাম, তবু মাঝে মাঝে এটা মজার কৌতূহল। উদারভাবে কমেন্ট দিয়ে আমি প্রায় পড়ার যোগ্য কিছু লিখতে পারলাম:
(module
(func (export "eggCount") (param $number i32) (result i32)
(local $res i32) ;; result
(local $remainder i32) ;; loop counter
(loop $loop
;; $res =
(local.set $res
;; $res +
(i32.add
(local.get $res)
;; $number % 2
(i32.rem_u
(local.get $number)
(i32.const 2)
)
)
)
;; $number //= 2
;; (keep on stack)
(local.tee $number
(i32.div_u
(local.get $number)
(i32.const 2)
)
)
;; this will keep looping until remainder is 0
br_if $loop
)
local.get $res
)
)
সবচেয়ে বড় বাধা ছিল ডকুমেন্টেশন আর রিসোর্সের অভাব। কোন গ্লোবাল ফাংশনগুলো পাওয়া যায়, সেটা বোঝাও কঠিন ছিল। তবে যেহেতু আমি আসলে এটি ব্যবহার করতে যাচ্ছি না, একবার শুরু করার পর এসব আর বেশি বিরক্ত করেনি।
ডিসেম্বর মাসে বছর শেষ হলো এমন ভাষা দিয়ে যেগুলো অন্য কোনো শ্রেণিতে পড়েনি। মার্চে এক মাসেই দুটি ভাষা করতে হয়েছিল বলে এই মাসে আমাকে দুটি ভাষা শেষ করতে হবে।
আমি শুরু করলাম Wren দিয়ে। এর নির্মাতা Bob Nystrom, যিনি অন্যান্যদের মধ্যে Crafting Interpreters বইয়ের জন্য বিখ্যাত। খুঁটিনাটিতে এর মনোযোগ, ছোট আকার আর টপ-ডাউন ডিজাইন আমাকে মুগ্ধ করেছে; সবকিছুই যেন খুব ভালোভাবে ভাবা। যত্নের এই মাত্রাটা ভ্যারিয়েবল স্কোপিং আর প্রাইভেসি নিয়মের খুঁটিনাটিতেও স্পষ্ট। এর কম্পাইলার ছোট এবং প্রচুর কমেন্ট দেওয়া, তাই ভাষার ইমপ্লিমেন্টেশন নিয়ে আগ্রহ থাকলে এটি শেখার দারুণ উপকরণ।
Wren একটু অমসৃণ আর মনে হয় বেশিরভাগ ক্ষেত্রেই পরিত্যক্ত, তবে খেলনা ভাষার জন্য এটা ঠিক আছে আমার মনে হয়। উৎপাদনের উপযোগিতা আশা করে কেউ এতে আসে না। উৎপাদন-বহির্ভূত ভাষার জন্য দুনিয়ায় নিশ্চয়ই জায়গা আছে।
আরও: Lua
এই মাসে আমার দ্বিতীয় পছন্দ ছিল Lua। Wren-এর বিপরীতে এটি অবিশ্বাস্যভাবে ব্যবহারিক। সহজে এমবেড করা যায় বলে এটি নানা জায়গায় দেখা যায়, যেমন Redis স্ক্রিপ্টিং আর Factorio মড-এ। অবজেক্ট মডেলটা বুঝতে একটু সময় লেগেছে, তবে দ্রুতই কাজ শুরু করতে পারব বলে মনে হচ্ছে। সব কাজের একক গঠন হিসেবে টেবিল আমার দ্রুত পছন্দ হয়ে গেল। টুলিং ভালো ছিল: প্যাকেজ ম্যানেজার সঙ্গে সঙ্গেই কাজ করেছে আর VSCode এক্সটেনশন কমেন্ট-ভিত্তিক টাইপ অ্যানোটেশন কোনো ঝামেলা ছাড়াই সমর্থন করেছে।
Lua-র জন্য তাৎক্ষণিক কোনো প্রয়োজন আমার নেই, তবে এর ব্যাপক ব্যবহারের কারণে এটি আরেকটি দারুণ হাতিয়ার, যা পাশে রাখা ভালো।
শেষ কথা

এই ভাষা-ভ্রমণ আমি প্রত্যাশার চেয়ে বেশি উপভোগ করেছি। নতুন কিছু ব্যবহারিক দক্ষতা শেখার পাশাপাশি আমার দিগন্ত নিশ্চিতভাবেই অনেক প্রশস্ত হয়েছে।
এরপর কী, সেটা বলতে গেলে আমার মনে হয় অনেক বেশি Rust শেখা। ডেভেলপার টুলিংয়ের জগতে এর গুরুত্ব এখন স্পষ্ট, আর আমি যেসব জিনিসের উপর নির্ভর করি সেগুলো পড়তে ও তাতে অবদান রাখতে পারার ব্যাপারে নিশ্চিত হতে চাই।
মনের মধ্যে কোনো নির্দিষ্ট লক্ষ্য নেই, তবে পুরো Rust বই পড়া আছে, এক বছর আগে খরচে নেওয়া একটি Rust for JS devs কোর্স আছে, আর পুরো একটি Exercism ট্র্যাক শেষ করা আছে। অন্তত একটি ওপেন সোর্স প্রকল্পে (সম্ভবত Just, আমার নতুন প্রিয় প্রোগ্রাম) অবদান রাখতে চাই, তবে বছরের যাত্রা কোথায় নিয়ে যায় সেটা দেখতে হবে।
ততদিনের জন্য শুভ ছুটি, আর আপনার ২০২৩-এর বাকি সময়টা ভালো কাটুক!