samedi 30 mars 2013

A little vision about the future

I would like to take a pause from writing technical articles and share my vision about the future.

     Well I do have a vision and that vision comes from visiting small businesses, every time I visit a small coffee shop I say to myself this man could really use a software program that going to help him do his job better, the same happens when I visit a small grocery store, a carpenter, a lawyer, and a doctor. 

Then I started thinking if everyone have a little software of his own, we can start connecting those software and literally map the word. I’m not talking about 3D simulation that’s easy and virtual, I’m talking about real data and real objects, where every software becomes a node of exchanging data, a real world that could never be called virtual again. 

After having this nice world, I would like to move to the next and the most exciting step, which is including humans in the system, you see the GUI(Graphical user interfaces (those windows and buttons)) was a great breakthrough but GUI is not very natural, Most of the time you took some time to understand how the GUI of a given software works, and when you have millions of software it’s very bad to understand and use all those GUIs. So let’s eliminate all those graphics, and use no GUI at all. But the question how we are going to interact with those software?

Well by using the most natural way which is the brain. Human brains should be able to upload, download data, also it must be able to command software, imagine you can book your trip just by following this flow:

 You think I need a vacation
 Your brain search for available trips
Your brain download those trips into your memory
Your brain choose the best trip for you and book it

Am’ I talking science fiction? No I’m not, we are doing the same thing right now just we are using different techniques and we are obliged to use our eyes as an information encoder machine (this is all what GUI does it represent the information in understandable format for the eye so it can take the information and convert it to another format understandable by the brain), I’m simply talking about removing this middleware encoder and talk directly with a brain in interconnected system.

I guess you like to ask me now, is it possible to talk directly to the brain? I would like to happily answers you “yes”, I worked on a project that aims to help people command a wheel chair using a combination if eyes and brain, when I worked on the system it was very basic, we just determine the gaze of the person and calculate his concentration rate by amplifying his brain signals then based on the concentration rate we move the chair in the direction of the person’s gaze. But the most exciting part, is that the brain use electric signals just like computers, and internet. So all we have to do is understand brains protocols and code the data in a way the brain can understand it. After that you will never have to use your eyes and go through a complex GUI, so if you like to know all about the middle age history, is easy all you have to do is surfing to Wikipedia using your thoughts and download all the information that you want directly to your brain cells.

I hope that you enjoy reading the article, I know is complex vision but I have this believing that everything is possible and if you have a difficult goal just break it to small steps and finally and most importantly surround yourself with people that going to help you achieve your goal either they know it or not. 

dimanche 24 février 2013

Super developer: The Art of the Start

What to learn? What is the best profile of a developer? How to improve the developing skills? Those are the principal questions that every passionate developer asks.

I interviewed a lot of new fresh developers for recruitment or for training; I read many CVs and what I can say about all of them is that every single one of them is counting the number of framework he know.

“Well I know .Net, I know JEE, I know Symfony and I’m really good with python Django”

Mmm Ok! But can you tell me why we use interfaces in OOP, why we use getters and setters, what the difference between Static method and a non-static method and how the memory handles them what are the four principals of OOP. Do you know what a floating point is? what do you know about parallel programming and monitors?

Those are generally my questions, and sadly only few developers were able to answer them and the reason behind it is because they didn't answer correctly to the above questions. Because you see I don’t really care about how many framework you know, I don’t care how many .Net certificates you have because the real question is do you know how to code.

After all, frameworks are a collection of ready-to-use code, you just google them and you will find the suitable class to use, but if don’t know how to code you will never know what to look for and you still writing crap code even if you know all the available classes.

So what to learn? Personally I suggest starting by c language, have fun programming, look for complex problems (like the 8 queen problem, sorting..) and enjoy yourself solving them, feel the power of algorithms, feel the greatness of creation. No UI no buttons just you and the console displaying green text(nice effect). Why c language is important? Well first of all developers must master data structure and coding(can actually write a good if statement and loops) second c language is arguably a low level programming language so developers will deal with low level details like memory management(pointers) also some other stuff like floating points numbers (check this tutorial, fixing point numbers(check this article , processor cache and memory and many other low level issues that help developers understand computers and create a better optimize code in the future. Also I suggest writing a tcp/udp c based application to deal with low level sockets and network layers. So stop dragging and dropping UI, stop that android/windows phone application that you are doing and go develop some real shits.

After playing with c language go and learn some oriented object language ( I recommend java) and please instead of goggling every single library try to understand the basic of OOP learn what actually is a static method, why we have public, private and protected key words, learn why we are using getters and setters, try to feel the real power of encapsulation, write basic programs that show the value of OOP. After developing some of your own projects and after making all kind of mistakes start reading other people’s code, fall in love with design patterns and SOLID principals learn them and try the applies them every single time you write a peace of OOP code.

Now you have a nice understanding of OOP, you can change the air by learning concurrency and parallel programming. Study what a mutex is doing, what is a monitor… Implement some fun problems like the traffic problem. Concurrency is fun but hard so learn it. In the same time try to learn about compilation process, learn about state transition diagrams and grammars… And if you have time and effort try to understand operating systems and how they work by implementing one(of course with minimum functionality it can be just a console that displays info about hardware) have a look at SOS(simple operating system)

I know that was some hard concept and need a lot of time and efforts to master. But hey you the one who want to be the super developer so work for it.

My final thought will be a developer that really understand programming and have great ability to learn is much better than a developer that knows all the framework classes, know how to use them but write shitty code.