Friday, October 23, 2009

THE STORY SO FAR…..



Every journey is made significant with the evolution it brings in people, state, products, technology, etc… Everyday something is changing and I would like to believe that it is for the changing for the better. The beauty of this journey is seen in its true form when we decide to trace it from where we started to where we are now – in retrospect.

As I begin to write my first post in this blogging arena, I had quite a few ideas on the subject. First thoughts were to write something technical and it all ranged from tutorials to reviews and many more. But it did not strike a chord with me, and hence this post in which I tend to unwind the story of my journey so far in this industry.

The journey started long back…. But something worthwhile happened only during my 8th semester in Engineering. We had opted for “Introduction to Microsoft .Net” as one of our optional subjects and also had to do a project in the final semester, hence we decided to do it in C#.Net. That is the beginning of our journey. During the course of our project work we had learnt quite a few things about the Microsoft.Net Platform and were programming using mostly, Input/Output classes and Windows Forms. The 6 months of the semester just went past us even before we realized it, but something inside us stayed, and that was the happiness of completing the project of our choice and our chosen platform.

I guess we were too naïve at that point to really say as to why did we choose to do the project in .Net. We could have easily blurted out some of the points like managed code, JIT compilation, automatic memory management… it would have been fine, but did we really understand every aspect of those words that we would have said then? . Not really… we had not experienced the complete grip of each of those terms and how they helped change the life of so many programmers. At that point honestly it was way beyond our imagination to think of all these, because our mind was so much pre occupied with other subjects too. To understand something in more clear terms one needs a certain amount of application of thought and investment of time on that concept.

After a few years in this industry, I at least can think of a question like “How does a programmer think or how should he think?” Trust me; this is the question enough to crack your head on... Most of the inventions and discoveries in this world has been born out of need or to overcome some shortcoming, to provide solutions to problems. As software Engineers we are supposed to think of solving problems like our predecessors did. Technology should evolve and otherwise it becomes outdated. On a philosophical note, we as individuals should also evolve for our growth and for our own contentment.

Tracing the journey of technology we can see that the technology in the hardware market has moved from using vacuum tubes for circuitry and magnetic drums for memory to Dual core- microprocessors for computational ability to using Random access memory and concept of Portable memory.
With the advent of PDA devices which makes our lives faster and easier in every manner, we can see an evolution that the mankind must be proud of having achieved and is still in the process of making more achievements in areas like Artificial Intelligence and nanotechnology.

In the software arena we have seen generations of languages which helped us in making effective use of the computer’s computational and data processing ability.
From First Generation Language like Assembly level languages – giving the instructions to the machine in its code. To higher level languages like C which made programmers readability easier and introduced programming constructs for performing basic operations. Towards the 4th Generation of programming languages which are comparable to Domain specific languages like (DSL) concentrating more on the development of the business software in a less error prone manner. Examples are like FoxPro, PL-SQL, Oracle forms etc... I was introduced to C as a language during my Engineering Days and Assembly level 8086 instructions as part of the lab course, PL-SQL, C# as part of my industry experience.

In the same arena also, we have seen that different programming paradigms have been formulated and languages has adopter one or more of these. Programming paradigms can be simply termed as “Style of programming”. This is one area which we just pushed into in our Engineering when all of a sudden they started teaching us Object oriented Programming for a semester or so. But this was also something that was drilled into us when we joined the company and in our campus trainings. Truly I could relate so many terms in that only after using it on our own in my projects. I understand the different paradigms only now.

Different styles of programming are very much related to the languages that uses them.
Assembly languages supported macro level processing and pre processing style
COBOL, FORTRAN, ALGOL supported procedural programming style
We also know that C supports imperative and structured programming paradigms and
C++ supports procedural, object oriented, generic programming paradigms and
Java supports object oriented, imperative, and structured.
C sharp ( C#) and Python supports multi paradigms like object oriented, imperative, functional, event driven and structured.

In similar lines other paradigms like declarative programming which just describes “what to do” and not “how to do it”, so we don’t have any algorithms defined as part of this programming style. It has many other sub paradigms like functional programming, logic programming, Constraint programming and Domain specific languages. And there are many more programming paradigms, but these are the major ones.

For each of High level languages there were compilers, compilers converted the high level language code block to machine understandable format. Then some languages used interpreters which did the conversion one line at a time. They also do a syntactic check and report compilation errors. We had introductory subjects on these topics during our computer science course.

Before the advent of Java or .Net , the programmers faced the challenges of managing the memory allocation and resource utilization in their application and sometimes a huge amount of time would be invested to write manageable code. Then the concept of a virtual machine ( in case of Java – runtime environment) and CLR ( Common language runtime –in case of .Net Languages) came into picture, where the Runtime engine supports Memory management, Garbage collection, Thread management, Exception handling, Security. Also they supported Just in time compilation which takes the Byte code or Intermediate language code and converts into machine understandable instructions during execution. As I said, I was introduced in this domain only in our final year as an optional subject.

So after programming style, programmers faced some recurring problems and came up with design patterns. Design patterns are the pieces of proven paradigms of solving the problem and speeds up the development process. It is also co-related with architectural concepts. It offers a more robust and flexible solution if applied and used wisely. When programmers had to collaborate and create a product, they saw that there were many activities and often correlated and there was a need for systematic approach for the development process. Software Engineering describes everything of what is needed in order to produce software. I studied this again during my final semester in Engineering. And it was emphasized to us more during our campus training where we were made to play different roles and create a product (Actually a drawing :P).

A quick look on Software engineering would be like this:
Requirements: Act as mother of invention of the software.
Design: Is the blueprint given to developers to build the software on
Development: Uses Programming language to code, follows a programming paradigm, implements design patterns for solving recurrent problems, Follows algorithms to code solutions.
Testing: Validating and verifying the product.
Maintenance: Stabilizing and evolving the product according to the Customers needs.

The story of evolution does not end here though…..evolution cannot come to an end… As time passes by and with man’s gift for reasons and intelligence, the society, nation, technology, languages, paragdigms, patterns, software engineering will continue to evolve and we promise to be a part of this journey.

References: Wikipedia.org


**********************

Thursday, October 22, 2009

Lets start the journey....

I am fascinated by evolving changes in our daily lives… whether it is changes that we see in the nature, in our growing up years, in our daily professional or personal lives or technology. The changes are the ones that keeps our life going ahead… and makes it an interesting story that unwinds. In this mundaneness of life it is always a pleasure reminisce the experiences or moments from where you derived the learning’s. I will be tracing my journey to gather such moments and have some pearls of cognition.

Lets start.....