নুথ এটা ভুল করছে

নুথ এটা ভুল করছে

3 অক্টোবর, 2014

লিটারেট প্রোগ্রামিং: নুথ এটা ভুল করছে

সাক্ষর প্রোগ্রামিং এটি সমর্থন করে: অন্যদের পড়ার জন্য আপনার কোড অর্ডার করুন, কম্পাইলারের জন্য নয়। আপনার কোডটি সুন্দরভাবে টাইপ করুন যাতে কেউ এটিকে উপন্যাসের মতো পড়তে বিছানায় কুঁকড়ে যেতে পারে। কোডের সাথে সিঙ্কে ডকুমেন্টেশন রাখুন। কি এই দৃষ্টি সম্পর্কে পছন্দ না? আমার কাছে এটির সাথে দুটি গরুর মাংস রয়েছে: শেষগুলি একটি নিষ্ক্রিয় প্রতিনিধিত্বের উপর ফোকাস করে অপর্যাপ্ত উচ্চাভিলাষী; এবং গদ্যের মানের মূল্যে টাইপসেটিংকে অতিরিক্ত জোর দিয়ে উপায়গুলি অপর্যাপ্তভাবে পালিশ করা হয়েছিল। বিশদ বিবরণ, বিপরীত ক্রমে:


প্রতিষ্ঠানের উপরে টাইপসেটিং ক্যানোনাইজ করা

যখন আমি সাক্ষর প্রোগ্রামিংয়ের উত্তরাধিকারের দিকে তাকাই, তথাকথিত আধা-বা অর্ধ-সাক্ষর প্রোগ্রামিং করার সিস্টেমগুলি আধিপত্য বিস্তার করে। এগুলি এমন সিস্টেম যা লেখককে ইচ্ছাকৃতভাবে কোড অর্ডার করার অনুমতি না দিয়ে সুন্দরভাবে টাইপসেট ডকুমেন্টেশন তৈরি করার উপর ফোকাস করে। আমি মনে করি এটি ঠিক পিছনের দিকে; উপস্থাপনাকে সাজানোর জন্য লেখকের প্রচেষ্টার কারণে এবং শুধুমাত্র দ্বিতীয়ত টাইপসেটিং উন্নতির কারণে কোডবেসগুলি পড়া সহজ। একটি সুনির্দিষ্ট উদাহরণ হিসাবে, সেখানে প্রায় প্রতিটি শিক্ষিত প্রোগ্রাম এইরকম ক্রাফ্ট দিয়ে শুরু হয়:1

// Some #includes

বা:

-- Don't mind these imports.

আমি ভাবতাম মানুষ শুধু নুথের দৃষ্টিভঙ্গি বোঝে না। কিন্তু তারপর আমি গিয়ে তার সাক্ষরতার অনুষ্ঠানগুলো দেখতাম। বুম, # অন্তর্ভুক্ত:




প্যাসকেল প্রোগ্রামের উদাহরণ নুথের আসল কাগজ মোটেই কোনো আমদানি ছিল না। কিন্তু যখন বৃহত্তর কোডবেস সংগঠিত করার কথা আসে, তখন আমরা চিন্তাহীনভাবে আমদানিকে শীর্ষে রেখেছি। প্রথম দিন থেকেই।

প্রদর্শনী 2:




“আপনি যদি আকর্ষণীয় জিনিস দেখতে অধৈর্য হন তবে এগিয়ে যান।”
ঠিক আছে, যদি আমাদের কাছে থাকত, আপনি জানেন, আকর্ষণীয় জিনিসগুলি সামনে রাখার জন্য একটি সরঞ্জাম।

প্রদর্শনী 3:




এই টুকরা শুরু. ভূমিকার একটি বাক্য রয়েছে এবং তারপরে এটি:

শীর্ষবিন্দু ডিগ্রী রেকর্ড করতে আমরা একটি ইউটিলিটি ক্ষেত্র ব্যবহার করি।

# deg uI সংজ্ঞায়িত করুন

এটি বিমূর্ততার বিভিন্ন স্তর জুড়ে একটি খাড়া লাফ। আক্ষরিকভাবে দেখানো কোডের প্রথম লাইনটি সম্ভবত একটি struct-এর জন্য একটি ক্ষেত্র অ্যাক্সেস করার জন্য একটি ম্যাক্রো যার সংজ্ঞা — যার খুব টাইপ নাম – আমরা এখনও দেখিনি। (স্ট্রাক্টের পরিবর্তনশীল নামটিও হার্ড-কোডেড; তবে আমি আরও নিট-পিক করা বন্ধ করব।)

প্রদর্শনী 4: আগের উদাহরণে একটু জুম আউট করুন:




আবার, শীর্ষে #অন্তর্ভুক্ত আছে কিন্তু আমি সেটা বলবো না। চলুন দেখি এই #অন্তর্ভুক্ত কি আছে। “গ্রাফবেস ডেটা স্ট্রাকচার” প্রোগ্রামটির সাথে কিছুটা প্রাসঙ্গিক বলে মনে হচ্ছে। অবশ্যই বিবরণ ইনলাইন এবং প্রোগ্রাম ব্যবহার করা হবে মূল তথ্য কাঠামো বর্ণনা করা উচিত. এর অমর কথায় ফ্রেড ব্রুকস:

আমাকে আপনার ফ্লোচার্ট (কোড) দেখান এবং আপনার টেবিলগুলি (ডেটা প্রকার) লুকিয়ে রাখুন, এবং আমি রহস্যজনক হতে থাকব। আমাকে আপনার টেবিল দেখান, এবং আমি সাধারণত আপনার ফ্লোচার্ট প্রয়োজন হবে না; তারা সুস্পষ্ট হবে।”

অবশ্যই প্রদর্শনের জন্য অর্ডার অপ্টিমাইজ করার জন্য একটি সিস্টেম দ্বারা বাধা দেওয়া উচিত নয়
একটি ভিন্ন ফাইলে কোড.

সামগ্রিকভাবে, মানুষ সাক্ষর প্রোগ্রামিংয়ের প্রতিশ্রুতিকে উপলব্ধি করতে ব্যর্থ হয়েছে কারণ নুথের মূল কাগজে ছোট প্রোগ্রাম বাদ দিয়ে প্রাথমিক উদাহরণগুলি তেমন ভাল নয়। প্রোগ্রাম বিমূর্ত স্তর জুড়ে লাফ. সমস্যাগুলি উদ্দেশ্যপ্রণোদিত। টপ-ডাউন চিন্তার একটি বিস্তৃত মানসিকতা আছে, থেকে শুরু করে প্রধানযে পড়া সহজ বা না. ক্রম পরিবর্তন করার ক্ষমতা কম-ব্যবহৃত হয়, সম্ভবত প্রাথমিক শিক্ষার সরঞ্জামগুলি ডিবাগিংকে আরও কঠিন করে তুলেছিল, কিন্তু বেশিরভাগই আমি মনে করি সমস্ত জোর দেওয়ার কারণে —
ঠিক শুরু থেকে — ঠিক কিভাবে ঠান্ডা ঠান্ডা টাইপসেটিং ছিল।2

এই সব নুথের কাছে কঠোর মনে হতে পারে, কিন্তু আমি মনে করি নুথ এটি নিতে পারে। সে, ভাল, নুথ, এবং আমি কেউ নই। তিনি স্ট্রাকচার্ড প্রোগ্রামিং-এর উত্তরসূরী হিসাবে সাক্ষর প্রোগ্রামিং নিয়ে এসেছিলেন, যার অর্থ হল তিনি এমন একটি সময়ে অর্ডারিং বিবেচনার প্রবর্তন করছিলেন যখন বেশিরভাগ লোকেরা এখনও ব্যবহার করছিলেন গথ অবশ্যই একটি বিষয় হিসাবে। প্রোগ্রামার বা শিক্ষাবিদদের জন্য কোন টাইপসেটিং ছিল না, কোন ইন্টারনেট ছিল না, কোন হাইপারলিংক ছিল না। না, এই প্রারম্ভিক উদাহরণগুলি যা আছে তার জন্য ভাল। কারণ তাদের বিকাশ হয়নি আমরা প্রোগ্রামার সময়ের সাথে সাথে তাদের বিকাশ করতে ব্যর্থ হয়েছে। নিছক ব্যাখ্যা করার জন্য আমরা তাদের পবিত্র গরু হিসাবে বিবেচনা করতে খুব দ্রুত হয়েছি (আমাদের ব্যাখ্যাগুলি মূল ধারণার সাথে যে সহিংসতা করে তা লক্ষ্য না করে)। আমি অনুমান করি যে কেউ আসলে অন্য কারও সাক্ষরতার প্রোগ্রামগুলি বিস্তারিতভাবে পড়েনি। আর তাই কেউ সত্যিকার অর্থে আরও ভালো করতে অনুপ্রাণিত হয়নি। আমরা সাক্ষর প্রোগ্রামিং ব্যবহার করছি, যেমন আমাদের অধিকাংশই ব্যবহার করে TAOCPএকটি সংকেত যন্ত্র হিসেবে দেখানোর জন্য যে আমরা কি শান্ত। (আপনি যদি অন্য কারো সাক্ষর প্রোগ্রামগুলি পড়ে সময় ব্যয় করেন তবে আমি আপনার অভিজ্ঞতার কথা শুনতে চাই!)

ইন্টারেক্টিভ প্রতিক্রিয়ার উপর প্যাসিভ রিডিং ক্যানোনাইজ করা

আমি পরোক্ষভাবে টাইপসেটিংকে ক্ষতিকারক করছি, তবে এটিকে লক্ষ্য করার সময় এসেছে। একটি কোডবেসের জন্য একটি সুন্দর টাইপসেট নথি তৈরি করার সাথে একটি মৌলিক সমস্যা রয়েছে: এটি মৃত। এটি এই গ্রহের কোনও প্রকৃত প্রোগ্রামিং পরিবেশ (সম্পাদক বা IDE) এর ভিতরে রেন্ডার করতে পারে না এবং তাই আমরা কোডবেসে কাজ করার সময় এটিতে পরিবর্তন করতে পারি না। প্রত্যেকে একটি প্রোগ্রাম সম্পর্কে একবারে একটি পিডিএফ পড়ে, যখন তারা প্রথম এটির মুখোমুখি হয়। এর পরে, এটিকে পুনরায় রেন্ডার করা একটি বেদনাদায়ক, এবং রেন্ডার করা নথির প্রমাণ-রিডিং, এটি সম্পর্কে ভুলে যান। যে সর্বনাশ ডকুমেন্টেশন তৈরি করেছে একটি পরের চিন্তা, চিরকালের জন্য বাসি পতনের ঝুঁকিতে, বা অন্তত খারাপভাবে রেন্ডারিং।

আপনি এটির সাথে কাজ করতে পারবেন না, আপনি কী ঘটছে তা দেখতে এটিতে পরিবর্তন করার চেষ্টা করতে পারবেন না এবং আপনি অবশ্যই এটি ইন্টারেক্টিভভাবে চালাতে পারবেন না। আপনি যা করতে পারেন, আক্ষরিক অর্থে, বিছানায় এটি দিয়ে কার্ল করা হয়। এবং সাথে সাথে ঘুমিয়ে পড়ুন। মানে, কে কীবোর্ড ছাড়া বিছানায় কোড পড়ে?!

বিকল্প কি? অন্যদের আক্রমণ করার জন্য আমার নিজের একটি লক্ষ্য উপস্থাপন করার চেতনায়, আমি আপনাকে কিছু সাক্ষর কোডের দিকে নির্দেশ করব যা আমি গত বছর একজন সাধারণ দোভাষীর জন্য লিখেছিলাম। এটি দেখতে কেমন তার একটি নমুনা:

 // Programs are run in two stages:
 //  a) _read_ the text of the program into a tree of cells
 //  b) _evaluate_ the tree of cells to yield a result
 cell* run(istream& in) {
   cell* result = nil;
   do {
       // TEMP and 'update' help recycle cells after we're done with
       // them.
       // Gotta pay attention to this all the time; see the 'memory'
       // layer.
       TEMP(form, read(in));
       update(result, eval(form));
   } while (!eof(in));
   return result;
 }
 
 cell* run(string s) {
   stringstream in(s);
   return run(in);
 }
 
 :(scenarios run)
 :(scenario examples)
 # function call; later we'll support a more natural syntax for
 # arithmetic
 (+ 1 1)
 => 2
 
 # assignment
 (<- x 3)
 x
 => 3
 
 # list; deliberately looks just like a function call
 '(1 2 3)
 => (1 2 3)
 
 # the function (fn) doesn't have to be named
 ((fn (a b)  # parameters (params)
     (+ a b))  # body
    3 4)  # arguments (args) that are bound to params inside this call
 => 7

একটি পূর্ববর্তী পোস্ট বিন্যাস বর্ণনা করে, কিন্তু আমাদের এই উদাহরণের জন্য আরও বিশদ বিবরণের প্রয়োজন হবে না। শুধু মনে রাখবেন এটি একটি সাধারণ প্লেইনটেক্সট যা আপনার টেক্সট এডিটরে খুলবে। ন্যূনতম গদ্য আছে, কারণ শুধু উপস্থাপনের ক্রম এত ভারী উত্তোলন করে। মন্তব্যগুলি কোডের মতো: আপনি যত কম লিখবেন, তত কম খারাপ হবে। আমি এর খরচ দিচ্ছি’//‘ মন্তব্যগুলি বর্ণনা করতে কারণ আমি এটি ঠিক করতে পারিনি, কারণ এটি পরিষ্কার করা এতটা গুরুত্বপূর্ণ নয়। আপনি এই নমুনায় এটি দেখতে পাচ্ছেন না, তবে প্রোগ্রামটি বৃহত্তরভাবে স্বয়ংসম্পূর্ণ স্তরগুলিতে বৈশিষ্ট্যগুলি সংগঠিত করে, পরবর্তী বৈশিষ্ট্যগুলি আগেরগুলির জন্য কোডে হুক করে৷ এখানে একটি পরীক্ষা জোতা. (এর সাথে, আমি নির্দেশ করা প্রতিরোধ করতে পারি না, নীচে অন্তর্ভুক্ত রয়েছে।) এখানে একটি আবর্জনা সংগ্রহকারী। এখানে
আমি ডাইনামিক স্কোপের সাথে বাইন্ডিংয়ের একটি ফ্ল্যাট নেমস্পেস প্রতিস্থাপন করি। প্রতিটি ক্ষেত্রে, কোডটি অবাধে এটি অনুশীলন করার জন্য পরীক্ষার সাথে মিশ্রিত করা হয় (যেমন দৃশ্যকল্প
উপরে), পরীক্ষা যা কমান্ডলাইন থেকে চালানো যেতে পারে।

 $ build_and_test_until 029  # exercises the core interpreter
 $ build_and_test_until 030  # exercises dynamic scope
 ...

স্তরগুলির একটি উপসেট দিয়ে প্রোগ্রামটি তৈরি করার পরে, আপনি এটিতে খোঁচা দিতে এবং কী-যদি পরীক্ষা চালাতে পারেন। কার্তিক এই লাইনটা এভাবে লিখলেন কেন? একটি পরিবর্তন করুন, পরীক্ষা চালান. ওহ, তাই। আপনি এক্সিকিউশনের মাধ্যমে ট্রেস করতে লগিং যোগ করতে পারেন এবং আপনি একটি ডিবাগার ব্যবহার করতে পারেন, কারণ আপনি আপনার ওয়ার্কস্টেশনে একজন যুক্তিসঙ্গত প্রোগ্রামারের মতো বসে আছেন, বিছানায় কুঁকড়ে নেই।

অবশেষে আমি এমন একটি বিশ্বে থাকতে চাই যেখানে লাইভ, পরিবর্তনযোগ্য, ইন্টারেক্টিভ কোড দেখার জন্য আমাদের সিস্টেমগুলি আমাদের প্রকাশনা সিস্টেমগুলির মতোই টাইপসেটিংয়ে পারদর্শী। কিন্তু সেই দিন পর্যন্ত, আমি সহজ মার্কডাউন-এর মতো প্লেইন-টেক্সট ডকুমেন্টেশন বেছে নেব যেটির কাঠামোর উপর লেখক পরিশ্রম করেছেন। প্রতি একক সময়.

পাদটীকা

1. লিটারেট হাসকেল এবং কফিস্ক্রিপ্ট কিছুটা হলেও ভাষায় খুব নমনীয় ক্রম করার অনুমতি দেয়, যা এই সমস্যাটিকে প্রশমিত করে। কিন্তু তারপর আমরা তাদের লেখক আছে আমাদের বলছে যে তাদের সরঞ্জামগুলি যে কোনও ভাষার সাথে ব্যবহার করা যেতে পারে, অন্য ভাষার আরও ভাল সরঞ্জামের প্রয়োজন হতে পারে এই সত্যটিকে অবজ্ঞা করে উপেক্ষা করে। সবাই বিক্রির ব্যবস্থা করছে, কেউই অধিকার দিচ্ছে না নীতি.

2. একটু টাইপসেটিং ছিটিয়ে যাদুকরীভাবে উন্নত করা আমাদের নোংরা ছোট কাগজপত্র বা অ্যাসাইনমেন্টগুলি দেখার জন্য আমরা সকলেই সামান্য এন্ডোরফিন রাশ পেয়েছি। এবং আমরা ভাল-টাইপসেট নথি নিতে ঝোঁক আরো গুরুতরভাবে. এই ঘটনার ফ্লিপ পাশ: যদি এটি সম্পন্ন দেখায় আপনি এটি সম্পর্কে অনেক প্রতিক্রিয়া পাবেন না.

মন্তব্য

মন্তব্য কৃতজ্ঞতার সাথে প্রশংসা করা হয়েছে. অনুগ্রহ করে আপনার পছন্দের যেকোনো পদ্ধতিতে সেগুলি আমাকে পাঠান এবং আমি সেগুলি এখানে অন্তর্ভুক্ত করব৷

Source link