30 September 2013

OpenGyan - Update

Last Saturday (28-Sep-2013) we @ OpenGyan were in Bangalore at KSIT. This is our first workshop in Bangalore. This time we were conducting our workshop on Networking. Originally we planned to conducted Networking and Network Programming. We were not able to touch Network programming due to time. Hopefully we conduct network programming soon.

It was wonderful experience and we should say that the students were brilliant. There were lot of intelligent questions and the students attended the workshop with full enthusiasm. After seeing their enthusiasm, i felt that i should go back to college and learn once again. The hospitality and the interactions with the students and professors we really enriching and rewarding.

Kudos to everyone who made this event and we really looking forward for our workshop in KSIT again. Here are few snaps.

21 September 2013

OpenGyan - Becoming a Better Programmer

[Alert: Longer post, targeted for students community. Comments are welcome from seasoned software engineers]

Recently we had a couple of OpenGyan's workshops and i happen to scribble my ideas to the students. I hope i will be able to dedicate more time in writing posts like this. Hope this helps the students' community. Though software engineering is a very complex area (is it really that complex?), we are going to focus on the things that are very important for software development of any sort - may it be a lab exercise or a project. The readers are suggested to reflect upon the exercises given at the end of each article for better understanding.

I was reading and reflecting on the short article written by Badhri on Programming languages. Though it was short, it gave a general overview about the programming language. Any programming language is a tool to achieve your imagination. For example, if you are writing a simple program (similar to the ones that is given to you in lab), you do not need to think much. But in reality it isn't the case. To be a programmer, knowing a programming language is secondary because knowing the syntax of the programming language won't make you a good programmer. If knowing programming language is sufficient, then compiler would do the job. Software development is much more than knowing a programming language or few.

Any software is a solution to a given problem. And programming language is just a tool to solve the problem. The solution to the problem is more important than the tool (the programming language). In order to develop a better software one needs to follow certain basic principles in a specific order. The rest of the article discusses the basic principles of software development in a much simplified way.

First, one needs to understand what needs to be done. Because you cannot go on writing program simply for everything. You need to understand that you are writing a program for someone to use it. Remember that you will not always write program to improve your knowledge. So understanding the requirements - what needs to be done plays a crucial part. Understanding the requirements is the first step and if you do not understand the requirements, remember you do not have the second step.

As a second step to writing a program, you need to know how to solve the given problem without employing much of your knowledge on programming languages. For example, if you are writing a game, you need to understand and know how the game is played, how many players are involved, what are their roles etc. In this phase, you will least bother about whether you will use linked list or array. But you will solve the problem at an abstract level. This is called high level design. After high level design, you will decompose the high level design into modules and design each modules. For example, if you are writing a program to validate Palindrome, you need to have input module, processing module and output module. This ability to decompose the problems in sub-problems and solving them with sufficient data structures and algorithms is called low level design. While you are solving the problem, you should also keep in mind about the future problems that may crop up. Your design has to be flexible enough to accommodate future problems (which is quite challenging).

The third skill that is required is to convert the design into product and this is where the programming language comes in. Without the above two steps, the third skill is not worth and in fact not needed. Once you have understood the problem and solved it at a conceptual level, then implementation becomes pretty easier. You do not need to beat around the bush. During the implementation phase, you will implement the entire software module by module and finally integrate the modules to make it bigger whole. Apart from implementing the design, the coding is also about producing maintainable code. When you develop software, you are writing the software which is expected to live more than your lifetime. The program (aka code) can be written with a lot of grace and the code that is well written will live beyond ages (example Unix). The developer needs to understand about other developers who are working with him/her and the people who will be working in future. So programming is not merely following syntax but much more than that. As this point of time, we have discussed about three important qualities of a developer.

The final thing that you need to do as developer is to test your software. The primary focus of testing is to uncover hidden defects. As a developer, you are the best person to know about your code and it makes sense for others to bank on your certificate. So, it is the developers' responsibility to test the software and fix the defects. This is called as unit testing as the developer who develops it ensures that all the code that is written works as expected.

You need to evaluate how much percentage does a programming language play here. May be 40%. But please do not get me wrong. For writing a software, you need a language however for solving problems you need skills like understanding requirements, designing and most importantly testing it. Without these skills, you will not be able to excel as developer. Now would you understand why you have "Algorithm", "Flow Chart", "Hand Calculation" and "Output" section in your lab observation.

When you follow the above software development practices right from the beginning, you become a natural programmer/developer to solve any complex problems. You may want to evaluate your current way of writing programs. First solve the problem and then start writing the program. Though the exercise is short/simple, i am sure there is a lot to learn in terms of processes.

Take any simple program (Palindrome, Fibonacci series) and apply all the concepts you understood from this article (Duration: 3 Hours, Complexity: Medium)
  1. Clearly understand the requirement/problem. For example, what is palindrome or Fibonacci series
  2. Solve the problem by decomposing into modules
  3. Write the software
  4. Finally test

Happy Weekend

15 September 2013

Learning and Rules of Brain

For quite sometime, i have taken up reading quite seriously. All the credits should go to OpenGyan. In order to prepare the content and aid me in delivery of workshops, i tend to read books (most of them are bibles and it needs at least few years to completely understand the content and solve the exercises in the books). For example, when i started to design workshop on Linux, it was mostly my experience along with gathering of information from "man" pages. I later found that a lot of coherency can be brought to the presentation, workshops and its contents if i follow a standard text book. It has couple of advantages. We tend to know ahead of time what can be covered in a days time and helps me in structuring my workshops. The second, sweet and big take away is that i tend to read a lot of material which in turn makes me to know little more. Because of this approach, my learning is incremental and i tend to know how the students will struggle if just dump everything in single shot. So, my effort would be to explain them what is required to understand a topic, do some experiments and give them few case studies. Finally get their feedback to fine tune the content. 

In this process i understood the importance of revision and its short-term and long term-benefits which is outlined in one of the interesting books that i read a while ago - Brain Rules. In order to fix the issues in the content and my understanding, i need to reread the text books and correct my understanding. When i read it again, i tend to get a feeling that my real learning starts today as i would learn something little deeper and the information seems to be wired strongly. This kind of makes me to take the classes at a relative ease (for the ones that i revise and i continue to struggle until i find the resonance ;-)).

There is a scientific way to know how brain works and the efficiency of the brain can be increased (btw, it works for only who has it and who uses it but it can't do any magic if you dont have it or use it, wow what a pun ;-)). Brain Rules makes sense now and if you are interested in developing your brain, check out thisthis and the video below.

Learn the rules of brain, and you won't regret it.

Have a good Sunday or a great week ahead if you are reading this on Monday :-)

09 September 2013

Good Read - Write Great Code

I am currently reading the book "Write Great Code, Volume -1, Understanding the machine", by Randall Hyde and i should admit that the book has to be read by all software engineers who are into the business of writing code. It is the foundation that is often neglected. A Java programmer works at a very high layer and might feel that he/she doesn't need to know all these lower levels. But then, i feel that it is very essential for coders to understand the environment where the code runs.

The book has twelve chapters. The book starts with numeric representation to all way up to input/output. The book talks about CPU architectures, memory architecture and organization, instruction set architecture, boolean logic, memory access, binary arithmetic and floating point. I would say that all coders should read this book at least once and they have come back if they have forgotten it :-)

If you are the coder, you must know and i feel it is a good investment to buy this book.

Maybe, i will be sharing my knowledge once i complete reading the book. OpenGyan is making me to know/read more.

08 September 2013

State of Fresh Graduates

Recently we had discussion with one of the processors in an engineering college and it all sums up the state of new graduates recruitment. From my view, it shows that the industry is involved in batch processing and it appears to me that either they do not have confidence on technical skills of students or they do not bother to know whether the students possess any technical skills (may be they are confident that they can train them up).

Even if they can train them up, i don't think a simple and general discussion on life and that too only for few minutes wouldn't reveal anything about the candidate. I have met also students from different background and i can see remarkable problem solving skills and great commitment from first generation learners. Usually the first generation learners, know the importance of education and so are their parents. The first generation students know the importance of opportunity. But then, due to their social/economic background, they usually fall to the bottom in terms of communication skill. We had a discussion with Director, Loyola-ICAM College of Engineering and Technology. During the discussion he shared a real story of son of a painter. It was heart touching.

Considering the amount of first generation learners, social/economic parity, i feel that it is high that the corporates of India (particularly the IT) see an opportunity and fine tune their recruitment process. It is always the hard skills/technical skills that will bring you the edge. Communication is always overrated. We know how Japanese and Chinese do their work. And we do have BPOs in Tier-2 and Tier-3 cities and towns.

At OpenGyan, we work towards filling the gaps by interacting with the students as early as when they are in second year. And we are keen to impart experiential knowledge. Together, let us grow by knowledge sharing.

Have a nice sunday

03 September 2013

OpenGyan - An Update

It was new beginning. Last week, we at OpenGyan launched a new workshop on "Attending Interviews and Resume Writing". I would say it is highly successful and many thanks to Director, Staff and Students of LICET who made it successful.

We conducted close to a dozen of mock interviews and we feel that it helped the students to greater extent to conquer the fear. There was an introspection session soon after each mock interview so that the students learn their mistakes. During the second half of the day we focussed on resume writing. Both morning and evening sessions were received very well. To add to our happiness, we have been requested to conduct two more workshops (this weekend and next weekend). :-)

We are glad that the students find our workshop very useful.

Here are few moments captured through camera and more in Facebook.

We are looking forward for more sessions :-)