Thursday, July 1, 2010

Evolution of Coding

It all started so simple:
  • George Boole, and his Boolean Algebra.
  • Claude Elwood Shannon, and his Information Theory.
  • Alan Mathison Turing, and his Turing Machine.
  • Charles Babbage, and his Programmable Computer.
  • John von Neumann, and his Computer Architecture.
I tried to put this in the normal order of understanding for people, but actually I will use the order on which I normally encounter the problem.
  • Every computer problem is composed by 'only' three main parts: input, process, output.
  • The input part needs both a layout and an interface to look nice.
  • The main process must be structured, and it should support alternate logic to handle possible exceptions.
  • The output also needs a layout specifically designed for screens, papers and files.
  • Not all users will be allowed to use this program. So an authentication system is required. Also, it should allow many users, each one with possible different roles and levels.
  • In the input part, users commit many mistakes, so validation is needed for each data that program receives.
  • To ease distribution of the program, and to centralize the data store, a client/server structure is defined.
  • Many users in different remote location have different languages. So, programs now need to support different types of languages, like english, spanish, etc.
  • Good database software and modern platforms have been developed. So, it should be useful to make programs able to migrate to them. (db, os, platform, web, mobile, etc.)
  • It's hard to create a migrable program, so we should separate our development into three layers or tiers: back,middle,front (A.K.A M.V.C.)
  • There are several programming languages on which we can express many of these principles easier (C++, Java, etc.), so we should migrate our programs to them.
  • We are losing performance as our user base grows up. So, we should test concepts like replication.
  • Some foreign programs and systems also want to have access to our program. So, we should create Web Service or open ports for Socket programming.
  • It's probable that, with all these changes, we have left some doors open because of lack of sanitation. We must protect our programs against Session Hijacking, Cross-Site Scripting (XSS), and several types of Injections (SQL, HTML, CMD)
  • Many users access the same resource simultaneously, and that generates either deadlocks or data inconsistency. So, we should program taking into account concurrency and multiple threads of execution.
  • Our application is growing too much. So, we should apply concepts like distributed/cloud computing, to make our programs and database expandable by simply buying extra hardware.
  • OOP, EXCEPTIONS, CHANGE (files,interrupt)
Now, there's a question: What's next? How could we magically and instantly create or adapt a program to any change we still don't know? A possible simple change might touch EVERY AREA of our program! And a touch of that kind needs TIME to be checked in every area we have created. That's the problem known as Essential Complexity.

PS: IPO (Input-Proccess-Output) ... Hajime no 'IPO' ;-P

No comments:

Post a Comment