Expanding My Horizons
The more I learn the more I realize there is so much more out there that I have yet to experience. With regard to programming, I’ve gotten to a point where I am no longer limited to any one language. I do feel, however, that I have yet to experience the huge variety of languages out there. When it comes to software engineering, object oriented programming is pervasive. This approach, has so far, dominated my experiences as a programmer.
Yet there are many more approaches. Here is a fairly comprehensive list of the various paradigms out there:
- Declarative programming – describes actions (e.g. HTML describe a page but not how to actually display it)
- Imperative programming – explicit statements that change a program state
- Functional programming – uses evaluation of mathematical functions and avoids state and mutable data
- Object-Oriented programming – uses classes and instances, inheritance, encapsulation and polymorphism
- Prototype-based programming – object-oriented programming that avoids classes and implements inheritance via the cloning of instances
- Parallel computing – simultaneous execution with the necessary communication and synchronization between processes/threads
- Actor model – concurrent computation with “actors” that makes local decisions in response to the environment (capable of selfish or competitive behavior)
- Pipeline programming – no nested function calls, but a simple flow structures with easy to visualize/understand data flow through the program
- Constraint programming – relations between variables are expressed as constraints (or constraint networks), directing allowable solutions (uses constraint satisfaction or simplex algorithm)
- Rule-based programming – a network of rules of thumb that comprise a knowledge base and can be used for expert systems and problem deduction & resolution
- Logic programming – uses logical facts to create a model that can prove consistency, deduce further truths or answer questions about the model (e.g. Dogs are animals! Dogs are red! Are some animals red?)
- Reflective programming – special case of metaprogramming (modification of programs as data by another program or ability to do part of the work in runtime instead of compile time) in which the program modifies or extends itself
Each one of these paradigms has its own list of languages associated with it. Some of them you’ve heard of, some of them are more obscure. Some languages transcend multiple paradigms (C++, PHP, Oz) while others are pure forms of its associated paradigm (Java).
My Goal
I’m primarily a Java and PHP programmer. This means that I’ve really only experienced two paradigms: Object-Oriented and Imperative (I’ve dabbled in functional using LISP, but not enough). My goal is to either learn a language, or a new approach with a language that I already know, that falls under every one of the categories above.
To get started, I think I’m going to take a shot a parallel programming, either in join java or Oz. This is most likely going to be an ongoing project for quite a while as school is devouring all of my time (honestly I shouldn’t even be writing this right now).