Hari's CornerHumour, comics, tech, law, software, reviews, essays, articles and HOWTOs intermingled with random philosophy now and then
Software and Technology by
Posted on Mon, May 21, 2007 at 08:35 IST (last updated: Wed, Jul 16, 2008 @ 20:40 IST)
- Solving a particular problem using a specific method. This is the most basic level of software development that I can think of. This can probably be thought of as algorithmic programming in its purest form. Both the problem and the solution are well defined and the challenge is to translate the solution in a computer-readable form.
- Solving a particular problem by choosing from different methods. This is the next level of programming where you have a well-defined problem and different methods of solving them. Your main worry here is to choose the best method under a variety of constraints.
- Devising new methods to solve a well-defined problem. This could be thought of as creative programming - where a problem is well-defined, but the solution may not be as straightforward.
- Using an existing paradigm to generate methods of solving undefined problems. This is meta-programming at one level. Where problems are not yet well-defined, but you devise solutions based on an existing concept (like Object-Oriented Programming) which would cover expansion of scope. This could probably be best thought of as "anticipatory programming" - where you attempt to make code re-usable and extendable. This is the stage of advanced programming which requires more planning than coding.
- Creating a new paradigm which will generate methods of solving undefined problems. Now this is what we're talking about in the book I mentioned. It creates new paradigms of programming which will generate ways of solving future problems without writing new code. In short, it is generic programming at its height. Even grasping the basic idea is hard enough. I call it "meta meta-programming" because both the problem and the solution are undefined and requires the highest degree of skill and imagination to visualize.
- Theoritical complexity - as illustrated above, you can see how a theoritical complexity increases when you start thinking about concepts and programming paradigms. Theoritical complexity is the difficulty you encounter when you think about the software design and how best to match a design with a particular problem.
- Practical complexity - this is when the actual problem to be solved is inherently difficult. It can be anything from writing a full-fledged 3d game requiring intricate knowledge of vector physics and 3d geometry to writing an entire Operating System. Practical complexity often forces programmers to avoid theoritical complexity and choose solutions which are not necessarily suitable.