Programming Languages I Am Learning – Focusing On

Programming Languages I Am Learning – Focusing On And The Reasons Behind Choice

  1. C/C++
    • Systems (Linux, Android, Chrome) Programming 
    • Efficiency. Memory manipulation. Complete control over the environment. 
  2. Go 
    • Systems, Concurrent and Networked Programming 
    • Static Typing
    • Faster compilation 
  3. Java 
    • Managed Code
    • Android Application Development
    • Open Source Libraries and Frameworks
  4. Scala 
    • A blend of all the features you ever saw in different languages! 
    • Tries to answer “So, if we want to let programmers implement this feature as language library rather than language syntax, what features do we need to introduce in the language?” 
      • Features: 
        • Actors Library 
        • Operators as Functions 
        • Flexible syntax (Prefix, Infix, Postfix mixing) 
      • Makes Scala DSL friendly and “scalable”.
      • Makes the core language small (rest of the features are implemented in the library). Lisp Philosophy. 
    • What happens when you try to fuse OOP and Functional Programming on JVM? 
    • Static Typing and Terse syntax
    • Concurrent and Distributed Programming
  5. Clojure 
    • Lisp on JVM
    • Metaprogramming (Programmable Language) 
    • Functional Programming
    • Concurrent Programming
  6. Python 
    • Rapid Development
    • Open Source Libraries and Frameworks
  7. Ruby
    • Object Oriented, Dynamic, Scripting Language
    • Metaprogramming Facilities
    • Ruby on Rails
  8. JavaScript 
    • Web Front-end (with HTML5 & CSS)
    • Object-based Programming 
    • Node.JS
    • Statistical, Numerical Computing 
  9. Haskell
    • Purely Functional Programming
  10. Erlang
    • Fault-tolerant Real-time Parallel Distributed Computing
    • Modifiable without downtime


Current Preference

    If you need complete control over the environment, go down to C++. Otherwise, use Scala, Java. 

    Projects For Programmers

    A list of Projects For Programmers.

    Anyone out there looking for challenges?

    • Area: Software Engineering
      • Programming Language
        • Design a new Programming Language. Write an Interpreter for the language. 
          • Interpreter for your own Lisp.
        • Personal Note: While I was in College, I used to dream of inventing – not just an “YAPL” – “Yet Another Programming Language” but a great programming language that would take the Software World by storm! This project would be a great practice for that yet-to-be-named programming Language!
      • Software Engineering Tools
        • Write a “mini” Dependency Injection Framework. 
        • Write a Code Generation Tool that generates project structure, classes, fields, methods, creates Database from XML / YAML. 
          • Examples: 
            • Ruby on Rails 
            • Spring Roo
      • Area: Theoretical Computer Science
        • Solve TopCoder [1] and Google Codejam [2] Problems. 
      • Area: Intelligence and Data
        • Implement Natural Language Parsing.
          • Use your Dependency Injection Framework to inject different Algorithms.
            • Top down Parsing 
            • Chart Parsing
        • Implement Minimax Algorithm with Alpha-Beta pruning on a simple game.
          • Use your Dependency Injection Framework to inject different games into the Algorithm (so that you can inject any game you wish). 
        • Prototype a Web Search Engine on a small number of Wikipedia pages.
        • Analyze Political Survey Data with 
          • Hadoop, Mahout
          • Spark, MLib
        • Prototype Web-based Email with anti-spamming feature.
          • Implementation of Machine Learning (Bayes)
        • Area: Systems
          • Mobile Development
            • Mini Android Apps
              • Develop a “Who wants to be a Millionaire” App.
          • Virtualization
            • Design a Virtual Machine. 
          • Database
            • Design and implement a prototype RDBMS Server (RDBMS lite).
            • Design and implement a prototype NoSQL Server
              • Graph Database Server.
          • Write a Mini Web Browser.
            • Use Google’s JavaScript V8 Engine.
            • Networking & Distributed Computing
              • Design and Implement a new Application Layer Protocol.
                • Protocol that supports Internet Of Things, Cloud, Mobile.
                • New Full-duplex protocol on top of HTTP 
                  • Current:
                    • WebSocket 
                    • Comet
                • Prototype your own Mapreduce framework.
                • Prototype an HTTP Server.
                  • Use Node.JS
                  • Prototype an E-Mail Server. 
                • Write a Django CMS on Google App Engine (datastore).
                • Write a Distributed Application with Java Spring Framework.
                  • Write a PC^2 equivalent Software for Programming Contests.
                  • Write Personal News / Blog Reader and Bookmark Manager for personal use.
                  • Design Ebook App.
                    • Interactive HTML5 EBook with advanced Mobile Interactions.


              References

              Programming Languages I Am Learning / Working With

              1. C/C++
                • Systems (Linux, Android, Chrome) Programming 
                • Efficiency. Memory manipulation. Complete control over the environment. 
              2. Go 
                • Systems, Concurrent and Networked Programming 
                • Static Typing
                • Faster compilation 
              3. Java 
                • Managed Code
                • Android Application Development
                • Open Source Libraries and Frameworks
              4. Scala 
                • A blend of all the features you ever saw in different languages! 
                • Tries to answer “So, if we want to let programmers implement this feature as language library rather than language syntax, what features do we need to introduce in the language?” 
                  • Features:
                    • Actors Library 
                    • Operators as Functions 
                    • Flexible syntax (Prefix, Infix, Postfix mixing) 
                  • Makes Scala DSL friendly and “scalable”.
                  • Makes the core language small (rest of the features are implemented in the library). Lisp Philosophy. 
                • What happens when you try to fuse OOP and Functional Programming on JVM? 
                • Static Typing and Terse syntax
                • Concurrent and Distributed Programming
              5. Clojure 
                • Lisp on JVM
                • Metaprogramming (Programmable Language) 
                • Functional Programming
                • Concurrent Programming
              6. Python 
                • Rapid Development
                • Open Source Libraries and Frameworks
              7. JavaScript 
                • Web Front-end (with HTML5 & CSS)
                • Object-based Programming 
                • Node.JS
                • Statistical, Numerical Computing 
              8. Haskell
                • Purely Functional Programming
              9. Erlang
                • Fault-tolerant Real-time Parallel Distributed Computing
                • Modifiable without downtime

              Current Preference

                If you need complete control over the environment, go down to C++. Otherwise, use Scala, Java, Clojure. 

                প্রোগ্রামিং এ হাতেখড়ি

                কম্পিউটারের সবচেয়ে মজার ব্যাপার কি জানো?

                আরে নাহ, গেইমিং না। গান শোনাও না। আর কিছু? ইন্টারনেট ব্রাউজিং? বলতে পারো। তবে এর চেয়েও মজার ব্যাপার কম্পিউটারকে প্রোগ্রামিং করা।

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

                এগুলো কয়েকটা উদাহরণ। কম্পিউটারকে দিয়ে প্রায় যে কোন কিছু করিয়ে নেওয়া যায়। আর কি করিয়ে নেওয়া যায় তা শুধুমাত্র আমাদের প্রোগ্রামিং ক্ষমতা দিয়ে সীমাবদ্ধ। আরও কিছু ব্যাপার আছে অবশ্য। যেমন, অনেক কাজ করিয়ে নিতে কম্পিউটারের সাথে যন্ত্র সংযোগ দিতে হয়। আবার কিছু কাজ প্রোগ্রামিং দিয়ে করিয়ে নিতে এত বেশি সময় লাগে (আমরা বলি Computational Complexity বেশি) যে একদম সঠিক সমাধান না বের করে বিকল্প পথ খুঁজতে হয়।

                প্রোগ্রামিং এর মূল আকর্ষণ – “তৎক্ষণাৎ ফিডব্যাক” (Instant Feedback)। মানে তুমি একটা প্রোগ্রাম লিখে সাথে সাথে রান করে তোমার প্রোগ্রামের কাজ দেখতে পাবে। একটা ইলেক্ট্রনিক সার্কিট বানিয়ে কাজ দেখতে সময় লাগে। কিন্তু প্রোগ্রামিং এ ব্যাপারটা তৎক্ষণাৎ – তুমি কম্পিউটারে বসে প্রোগ্রাম লিখবে আর সাথে সাথে রান করিয়ে কাজের ফলাফল দেখবে!

                তা, সবকিছু যখন এই প্রোগ্রামিং দিয়ে করিয়ে নেয়া যায়, প্রোগ্রামিং করে কিভাবে?

                দারুণ প্রশ্ন!

                তুমি যদি কাউকে দিয়ে একটা কাজ করিয়ে নিতে চাও, কিভাবে করাও? তাকে কাজের নির্দেশ দিয়ে দাও আর সে নির্দেশ মত কাজ করে। তাই না? প্রোগ্রামিং এও ব্যাপারটা একইরকম। তুমি কম্পিউটারকে দিয়ে একটা কাজ করিয়ে নিতে চাও। কাজেই প্রোগ্রামিং করার সময় কম্পিউটারকে নির্দেশ দিবে আর কম্পিউটার তোমার নির্দেশ মত কাজটা করবে।

                একটা সুনির্দিষ্ট কাজ করার জন্য নির্দেশমালার সমষ্টি হল এক একটা প্রোগ্রাম।

                এখানে একটা সমস্যা আছে – কম্পিউটার তো তোমার-আমার ভাষা বোঝে না। বুঝলে কি যে মজা হত! আমরা বাংলা বা ইংরেজিতে চটপট সব বলে দিতাম আর কম্পিউটার ঝটপট সব করে ফেলত!

                তাহলে?

                কম্পিউটার আমাদের ভাষা না বুঝলেও ‘সুনির্দিষ্ট কিছু নিয়ম কানুন মেনে চলে’ এমন ভাষা বোঝে। সেই ভাষাগুলো একেবারে বাংলা-ইংরেজির মত না হলেও, কাছাকাছি। কম্পিউটারকে প্রোগ্রামিং করতে সেই সব সুনির্দিষ্ট নিয়ম কানুন মেনে চলা ভাষায় (কম্পিউটার বিজ্ঞানীরা ভাষাগুলোকে বলেন Context Free Language) নির্দেশ দিতে হয়।

                বাস্তব উদাহরণে আসি।

                একটা সাধারণ ক্যালকুলেটরকে আমরা কিভাবে ব্যবহার করি? আমরা ইনপুট হিসেবে কিছু ডেটা (এখানে সংখ্যা) আর ডেটার উপর কোন অপারেটার (যেমন যোগ, গুণ ইত্যাদি) প্রয়োগ করা হবে তা নির্ধারণ করে দেই। ক্যালকুলেটর ডেটার উপর অপারেটার প্রয়োগ করে ফলাফল আউটপুট হিসেবে দেখায়।

                এখন আমরা নিজেরাই যদি অপারেটার বানিয়ে দিতে পারতাম তাহলে অনেক মজা হত না? আমরা একটা অপারেটার বানাতাম কয়েকটা সংখ্যা ইনপুট হিসেবে দিলে তাদের গড় বের করার জন্য। আরেকটা বানাতাম নির্দিষ্ট সংখ্যক মৌলিক সংখ্যা আউটপুট হিসেবে দেখানোর জন্য। আরও কত কত আইডিয়া বের করতাম!

                প্রোগ্রামিং এর দৃষ্টিকোণ থেকে দেখলে প্রোগ্রামাররা নির্দেশ দিয়ে অপারেটারগুলো বানায়। অন্যদিকে, ব্যবহারকারী ডেটা আর ডেটার উপর কোন অপারেটার প্রয়োগ করা হবে তা ইনপুট হিসেবে দেয়। আর ফলাফল আউটপুট হিসেবে দেখে।

                 

                যেমন মাইক্রোসফট আমাদের জন্য মাইক্রোসফট ওয়ার্ড সফটওয়্যারটা বানিয়েছে। আমরা কিছু অক্ষর ইনপুট দেই। আবার কিছু অপারেটার (যেমন অক্ষর বোল্ড বা ইটালিক করা) নির্দিষ্ট করে দেই। ওয়ার্ড আমাদেরকে ফলাফল স্ক্রীনে দেখায়।

                আমরা বুঝলাম, প্রোগ্রামিং করা বলতে বোঝায় কম্পিউটার বোঝে এমন ভাষায় কম্পিউটারকে কিছু করতে নির্দেশ দেওয়া।

                এখন প্রশ্ন হল, এ নির্দেশগুলো কিরকম?

                আমরা নিজেরাই একটু ভাবি।

                ধরা যাক, আমরা কয়েকটি সংখ্যার গড় বের করতে চাইছি। এর জন্য নির্দেশমালা কেমন হতে পারে?

                উপরের ফ্লো চার্টের মতই কম্পিউটারকে তার নিজস্ব ভাষায় নির্দেশ দিতে হয়।

                প্রতিটা নির্দেশই কি বলে দিতে হয়?

                হুম।

                তাহলে ছোটখাট কাজ করতেও তো অনেক বড় প্রোগ্রাম লিখতে হবে – এমনটা ভাবছ?

                প্রোগ্রামিং সহজ এবং ছোট করার জন্য কম্পিউটার বিজ্ঞানীরা সমাধান বের করেছেন এবং এই বিষয়ে এখনও কাজ চলছে। মূল আইডিয়াটা হল অ্যাবস্ট্রাকশান (Abstraction) তৈরি করা।

                ধর, তুমি কাউকে ঢাকা থেকে চিটাগং যাওয়ার নির্দেশ দিচ্ছ। এখন তাকে যদি প্রতিটা ধাপ বলে দিতে হয়, তাহলে তো লক্ষ লক্ষ নির্দেশ লাগবে।

                প্রথমে ডান পা টা ফেলবে। তারপর বাম পা টা। এভাবে ১০ ধাপ। তারপর ডানদিকে। …… তারপর ডান পা উপরে তুলে বাসে উঠবে। ………

                এই লক্ষ লক্ষ নির্দেশ দেওয়ার কাজটা সহজ করার উপায় কি?

                সহজ করার উপায় হচ্ছে – পুরো ব্যাপারটাকে ছোট ছোট কাজে ভাগ করে ফেলা। তারপর ছোট ছোট কাজগুলো প্রত্যেকটার ডিটেইলস লেখা আর নাম দিয়ে দেওয়া।

                এরপর কাজের নাম বলে দিলেই হল – সে কাজটা করে দিতে পারবে।

                উদাহরণে ফিরে আসি।

                ওই যে একটা লোককে ঢাকা থেকে চিটাগং যাওয়ার নির্দেশ দিচ্ছিলে না, এবার অ্যাবস্ট্রাকশান ব্যবহার করে তুমি তাকে শুধু কাজের নাম বলে দিবে।

                প্রথমে একটা রিকশা নিয়ে বাসস্টান্ডে। (লক্ষ লক্ষ নির্দেশ দিয়ে এই অ্যাবস্ট্রাকশানটা তুমি তৈরি করেছ বা কেউ তোমাকে তৈরি করে দিয়েছে। )

                বাস নিয়ে চিটাগং। (এটাও একটা অ্যাবস্ট্রাকশান। একইভাবে তৈরি করা। )

                চিটাগং পৌঁছে রিকশা নিয়ে বাড়িতে। (এটা আরেকটা অ্যাবস্ট্রাকশান। এটাও লক্ষ নির্দেশের সমষ্টি।)

                এবার অনেক সহজ হয়ে গেছে না?

                ছোট কাজগুলো আলাদা আলাদা ভাবে ভাগ করে নাম দিয়ে দেওয়াই অ্যাবস্ট্রাকশান (Abstraction) তৈরি করা। অ্যাবস্ট্রাকশান তৈরি করে নিতে পারলে শুধু কাজের নাম জানলেই হবে, ভেতরের ডিটেইলস জানা লাগবে না।

                কাজের পাশাপাশি আরও অনেক ব্যাপার অ্যাবস্ট্রাকট করা যায়। কম্পিউটার কিভাবে ডেটা গুছিয়ে রাখবে তারও অ্যাবস্ট্রাকশান আছে।

                আমাদের সংখ্যার গড় বের করার প্রোগ্রামেও একইভাবে অ্যাবস্ট্রাকশান ব্যবহার করা যায়। কেউ যদি এমন একটা অ্যাবস্ট্রাকশান তৈরি করে দেয় যা কয়েকটি সংখ্যা নিয়ে তাদের গড় বের করে দেবে এবং তার নাম দেয় “গড়”, তবে তুমি তোমার প্রোগ্রামে “গড়” অ্যাবস্ট্রাকশানটির কাছে কিছু সংখ্যা পাঠিয়ে দেবে আর “গড়” অ্যাবস্ট্রাকশানটি সংখ্যাগুলোর গড় বের করে তোমাকে দেবে। এভাবে তোমার কাজ সহজ হয়ে গেল।

                এভাবে অ্যাবস্ট্রাকশান ব্যবহার করে প্রোগ্রামিং সহজ এবং ছোট করা যায়।

                মজার না?

                এবার আমরা আমাদের ধারণাগুলো কম্পিউটারে কিভাবে প্রয়োগ করা যায় তা দেখবো।

                কয়েকটি সংখ্যার গড় বের করার নির্দেশগুলো আমরা লিখেছিলাম।

                এই নির্দেশগুলোকে কম্পিউটারে প্রোগ্রাম হিসেবে কিভাবে লিখে?

                একটা ব্যাপার আমরা ইতিমধ্যেই জেনেছি – প্রোগ্রাম লেখার জন্য কম্পিউটারের ভাষা আছে। একটা দুইটা না – অনেক। একটু ভাল প্রোগ্রামার হয়ে উঠলে তুমি নিজেও একটা ভাষা বানিয়ে নিতে পারবে। তারপর সেই ভাষায় কম্পিউটারকে নির্দেশ দিতে পারবে।

                ব্যাপারটা কিভাবে সম্ভব – ভাবছ?

                ক্যালকুলেটারে যেভাবে যোগবিয়োগ করা যায়, সেভাবে কম্পিউটারের ইলেকট্রনিক্স অনেক কিছু করতে পারে। আমরা করি কি নির্দিষ্ট কিছু নিয়ম কানুন মেনে চলে এমন একটা ভাষায় আমাদের প্রোগ্রাম লিখি। তারপর যে ভাষায় প্রোগ্রাম লিখেছি সেই ভাষার কম্পাইলার বা ইন্টারপ্রেটার আমাদের প্রোগ্রামটাকে কম্পিউটারের ইলেক্ট্রনিকস যন্ত্রাংশ বোঝে এমন ভাষায় রুপান্তর করে। আর কম্পিউটারের ইলেকট্রনিক্স নির্দেশগুলো পালন করে।

                 

                তুমি নিজে একটা ভাষা বানিয়ে সেই ভাষায় কম্পিউটারকে নির্দেশ দিতে চাইলে তোমার সৃষ্টি ভাষাটার জন্য একটা কম্পাইলার বা ইন্টারপ্রেটার বানাতে হবে।

                ব্যাপারটা অনেকটা বাস্তব “ইন্টারপ্রেটার” এর মতই। ধর, তুমি চায়নায় গিয়েছ। তুমি ওদের ভাষা “ম্যান্ডারিন” পারো না। একজন ইন্টারপ্রেটার জোগাড় করতে পারলে, সে তোমার বাংলাকে ম্যান্ডারিনে রূপান্তর করে দেবে।

                বোঝা যাচ্ছে, এবার আমাদের কম্পিউটারের ভাষাগুলো কেমন তা বুঝতে হবে।

                অনেকগুলো নির্দেশ নিয়েই তো আমাদের প্রোগ্রাম।

                এক একটা প্রোগ্রামিং ভাষা বলে দেয় –

                ১. এক একটা নির্দেশ কিভাবে লিখতে হয়।

                ২. নির্দেশগুলো কিভাবে সাজিয়ে রাখতে হয় যাতে একটার পর একটা নির্দেশ পালিত হয়।

                ৩. অ্যাবস্ট্রাকশান কিভাবে তৈরি করতে হয়।

                প্রথমে দেখি, এক একটা নির্দেশ কিভাবে লিখতে হয়

                এক একটা নির্দেশকে ধরি এক একটা বাক্য।

                ধরি, একরকম বাক্য গঠিত হয় Noun Phrase এর পর Verb Phrase বসিয়ে।

                বাপারটাকে আমরা লিখি এভাবে-

                বাক্য -> Noun Phrase + Verb Phrase

                Noun Phrase গঠিত হয় Noun দিয়ে।

                Noun Phrase -> Noun

                Noun হতে পারে তাহসিন, আলিফ, রাইসা এসব।

                Noun -> তাহসিন অথবা আলিফ অথবা রাইসা

                একইভাবে আমরা সংক্ষেপে লিখি –

                Verb Phrase -> Adjective + Verb Phrase অথবা Verb

                Adjective -> দশপা অথবা সামনে

                Verb -> এগুবে

                এই ভাষা ব্যবহার করে আমরা লিখতে পারিঃ

                তাহসিন দশপা সামনে এগুবে।

                কিভাবে?

                বাক্য -> Noun Phrase + Verb Phrase ->

                Noun + Adjective + Verb Phrase ->

                Noun + Adjective + Adjective + Verb Phrase ->

                Noun + Adjective + Adjective + Verb ->

                তাহসিন দশপা সামনে এগুবে।

                একটা প্রোগ্রামিং ভাষায় সম্ভাব্য সবরকম বাক্য কিভাবে লেখা যায় তা নির্ধারিত থাকে। আর প্রত্যেক রকম বাক্য কিভাবে কম্পিউটার ইলেকট্রনিক্স বোঝে এমন ভাষায় রূপান্তরিত করা যায় তার উপায় থাকে কম্পাইলার বা ইন্টারপ্রেটারে।

                কম্পাইলার বা ইন্টারপ্রেটার করে কি

                • বাক্যটা কি ধরণের তা বোঝার চেষ্টা করে। এই ধাপটাকে বলে Parsing
                • চেনার পর, এই ধরণের বাক্যকে কিভাবে কম্পিউটার ইলেকট্রনিক্স বোঝে এমন ভাষায় রূপান্তরিত করা যায় তার যে নিয়ম আছে, সেই নিয়ম অনুসারে বাক্যটাকে অনুবাদ করে।  

                তারপর কম্পিউটার ইলেকট্রনিক্স নিজেই বোঝে বাক্যটা দিয়ে প্রোগ্রামার কি বোঝাতে চেয়েছিল।
                ওই যে বলেছিলাম, ব্যাপারটা অনেকটা বাস্তব “ইন্টারপ্রেটার” এর মতই।

                কাজেই আমরা দেখলাম, এক একটা নির্দেশ কিভাবে লিখতে হয়।

                এবার দেখবো, নির্দেশগুলো কিভাবে সাজিয়ে রাখতে হয় যাতে একটার পর একটা নির্দেশ পালিত হয়

                নির্দেশ সাজানোর অনেক উপায় আছে। ভিন্ন ভিন্ন ধাঁচের প্রোগ্রামিং ভাষায় ব্যাপারটা ভিন্ন ভিন্ন।

                আমাদের দেখবো Structured Programming এ কিভাবে নির্দেশগুলো সাজিয়ে রাখে।

                নির্দেশ সাজানোর একটা উপায় বোঝা যাচ্ছে – কাজের কোন ধাপের পর কোন ধাপ পালন করতে হবে তা একটার পর একটা লিখব। এভাবে আমরা একটার পর একটা নির্দেশ লিখব।

                প্রথমে ক কাজটা করবে,

                তারপর করবে খ কাজটা,

                এভাবে।

                মাঝে মাঝে অবস্থার উপর নির্ভর করে তাকে সিদ্ধান্ত নিতে হবে। এমন ক্ষেত্রে নির্দেশ দিতে হবে, কখন কি করতে হবে।

                যদি ক ঘটে

                       তবে খ করতে হবে,

                আর যদি গ ঘটে

                তবে ঘ করতে হবে,

                এভাবে।

                আবার কখনও একই কাজ বেশ কয়েকবার করতে হবে। এমন ক্ষেত্রে নির্দেশ দিতে হবে কোন কাজগুলো বারবার করতে হবে।

                যতক্ষণ ক হচ্ছে

                ততক্ষণ খ করতে থাকো।

                Structured Programming মডেলে এই তিনরকম নির্দেশ এর সমাবেশ এর মাধ্যমে কম্পিউটারকে দিয়ে বিভিন্ন কাজ করিয়ে নেওয়া হয়।

                ১. একটার পর একটা ধারাবাহিক নির্দেশগুলোকে Structured Programming এর ভাষায় বলে Sequential instructions.

                ২. অবস্থার সাপেক্ষে সিদ্ধান্ত নেওয়া ব্যাপারটাকে Structured Programming এ বলে Branching

                ৩. একই কাজ বারবার করাকে বলে লুপিং (Looping)

                প্রোগ্রামিং ভাষায় আর যে ব্যাপারটা থাকে তা হল বিভিন্ন রকম অ্যাবস্ট্রাকশান কিভাবে তৈরি করা যায়। অ্যাবস্ট্রাকশান অনেক রকম হতে পারে। কাজ অ্যাবস্ট্রাকট (Functional Abstraction) করা যায়। ডেটাও অ্যাবস্ট্রাকট (Data Abstraction) করা যায়। আবার ওই যে লুপিং দেখলাম – লুপ একরকম কন্ট্রোল অ্যাবস্ট্রাকশান (Control Abstraction)

                মোটামুটিভাবে, এগুলোই হল প্রোগ্রামিং এর মূল ব্যাপার।

                কি? এখনও বসে? দেরি না করে নিজে প্রোগ্রাম লেখা শুরু কর। নিজের একটা গেইম বানাতে ইচ্ছে করে না বুঝি!

                দেখতে পারো

                The Story of Object Oriented Programming

                Encapsulation, Inheritance and Polymorphism: How they came to be.

                Encapsulation 

                There was the local state – global state problem: functions could either access local variables or global variables. So we encapsulated set of “states” and “functions that are limited by access only to those states” into “classes” – blueprints for making objects.

                Inheritance 

                We had encapsulation. But for code reuse, we needed a way to modify classes by extension but not by code modification. So we invented inheritance. Later for solving diamond problem that arose in multiple inheritance we invented interface.

                Polymorphism 

                Now, we have a type hierarchy. Need arose for method call modification without code modification. So we invented polymorphism – a generic way to handle methods belonging to a common type hierarchy.

                Design Patterns
                When we applied encapsulation, inheritance and polymorphism to the development of flexible, reusable and maintainable software, common problems arose and solutions were found. Software Developers encapsulated these solutions into different “Design Patterns” – patterns for experience reuse.    


                Other ways to view OOP

                • Message Passing – Objects containing states are sent messages (methods with arguments)
                • Abstract Data Type – Theoretical Model
                • Data Structures – Data (States), Operations on Data (Methods)