Saturday, July 21, 2007

When Math is Misused - Revenge



It's revenge time. You should have read the last post on the same topic. I've got the chance to write a paper and I just wanted to see how it feels like to write such complicated mathematical stuff. The paper was about a min-heap and stuff, pretty simple and can be written in a few paragraphs. Take a look at the pictures.
The amazing thing is that after the 2 days I spent writing in 2 pages, I realized that well-formalizing the issue allowed for much much more potential that was initially possible. Initially we just move the load from a loaded machine to the lightest node in the system, but after well-formalizing the problem it is now possible to prove the degree to which this algorithm is really effective and efficient or not. It also showed me a point I didn't look to before, that if a machine get lightly loaded, it can take the load from other machines, without the need of the other machines to ask it to, and thus making real load-balancing.
I really was amazed not only because of the new potentials, but also that writing mathematic proofs and well-formalization is very much like programming, the logic of the proof follows like lines of code follows for the goal of the program/proof. I can say that I enjoyed writing that paper, well, like I do enjoy writing complex C++ code (and I do enjoy that more than games) (maybe it is cause I used the paper to learn Latex, I dunno).

Saturday, July 14, 2007

The bigger view, redefining the impossible

Many people of which I have dealt with, even if not saying it, are profoundly convinced that some of the applications which they use, maybe on daily basis, cannot be made by them. How many of the readers right now convinced that they can make, say, a web server, a SQL server, an OS, or a C++ compiler ? How many are convinced they can make a web browser!

I know some readers might think I encourage reinventing the wheel, they should know that this is not true. I mean that if a person knows and believes that he can make a wheel, he can then trust his own ability and imagination to start thinking beyond that and make a whole car, and maybe a space shuttle even. I am convinced that people who cannot trust their ability to make such -system- software are tied and will be forever dependent on other companies to make that software for them.

Under such circumstances it becomes natural why people limit their mind to predefined software categories, which have standard development procedures (i.e. web sites, database applications, etc..). In order to innovate you do not only need a vision, but also you need to trust your ability to achieve that vision. Often people disregard good ideas only because -deep inside- they know they can't do it. To hide that from themselves and from others, they tend to belittle the idea or call it foolish or inapplicable etc.

Thinking outside the box is also one feature of innovation. But to be able to do you need to know what's inside the box, and you also must have the liberated(1) thinking to do so. Because we are not surrounded by a lot of liberated minds, innovative minds might be afraid to go outside the box because they will be made fun of and belittled by those unliberalized minds.

(1): by "liberated" I mean those people who trust their selves and their thinking and are not tied by limited thinking of the surrounding environment.

I want to implant a certain concept in the minds of those people of IT in our country. Which is, nothing is impossible, and nothing is so hard that it can't be done. For example, you might think application X is hard to make. This is only built on the fact that you don't know yet how to make or how to approach it. But actually once you know the drill, it is almost like any other application you did (remember your first program, and your last program, and compare if you would have thought that this last one was possible when you did your first).

For example, from what I discovered, that the drill to approach an OS kernel is to make a simple Hardware abstraction layer (HAL) and to base other stuff (memory management, etc.) above it (like a simulation), and to approach the HAL you need to start by reading the Intel System Developer guide -for Intel systems-. The remaining is just regular work, read and apply, no thinking. (notice I said the drill to 'approach' not to 'make').

Also I found the way to start in an RDBMS is to start by making the Table class, and one-by-one add functionality to it (select, project, save, getSchema etc.). Once you've found a start point, the remaining, as I said, is just regular work, like any other program.

I know some people which was saying to me that making an OS and RDBMS is just reinventing the wheel and a waste of time. Well, I just wanted to know the drill, and know how they are done, so I can liberate my thinking and achieve the freedom of thinking and not to be limited by stuff I don't know. How are we going to innovate in such fields without that ?

I am not saying that the reader should go and -reinvent the wheel?- and make his/her own RDBMS or OS, but I am saying that if this what it would take to liberate your mind, then do it. Or take whatever necessary to liberate your mind. If just reading about them is enough for you, then be it. About myself, I had to do them myself, I just don't believe all I read, and I didn't think that the authors are better than me in a way that makes them able to do it while I can't.

All I want to reach in this article, is that don't think in terms of what's there, but think in terms what you can do. For example, don't think "This program doesn't do X :( I'll have to wait for the next release", but think "This program doesn't do X, so I'll make my own X!" or "I want a program that does X, there isn't ? I'll make my own :)" or better yet, "I wish I don't find a program that does X so I can do it!". And if you find such a program, you might take a look at the source to know how it was done.

One by one, you will reach a phase where you don't know the word 'impossible'. For example, imagine a program that you can ask to explain quantum physics for you, and the program scans the internet for it, and -built on your background, which he knows, cuz he chats with you a lot- he builds a tutorial with the style he knows that you prefer, and start explaining in a conversation with you, in which you can interrupt and ask, all in voice, not text. The program also can detect your face and knows when you look like you don't understand. I'll ask you: is that possible ?

Monday, July 2, 2007

Database applications, a message ...

Finally, a short period of rest before continuing working in the graduation project. So many blog posts I wanted to send and I didn't because I was tired.

Note that this is not in anyway disregarding the importance of database or website development. They are very important fields in our life.

Most of you know that my interest is theoretical scientific research. So I am not so much in favor of 'pure' applications that doesn't add new technologies or ideas; just uses them to tailor a predefined template of programs. This post is going to 'attack' and try to refine that sort of applications, and it's most common example: 'Mere' database applications (well, both desktop and web).

My idea is that having such repetition in the implementation of one -mostly the same every time- idea, and the variation is only in using or fine graining, makes the concept needs rethinking. So that instead of making a separate application that just uses a database, for each use of databases, you can broaden the concept so that there is only one database application that suits every possible use.

First, let's include some examples, digg.com, flickr.com, and every forum that exists. If we exclude creative search techniques (Google for example.), and appealing GUI (flicker; web 2.0 in general), and the concept of user-oriented content (forums. Digg - like the radio show, 'what the listeners ask for'), what do we have left ? Database, adding data, retrieving data and information, calculating statistics, and everything you find in a database book.

The core of many projects and websites is data processing, converting data from one form to another, and saving and retrieving data. I don't think I've found a data mining website before (can anyone mention an example of one, please ?). The rest of the program is just eye candy and mostly --except in rare cases-- non-reusable non-extendable --in a scientific way I mean, not in a sales way-- ideas (the general purpose of the website).

It's like talking about pen and paper. Every new website, or database application, just uses pen and paper and it just tells you this paper is for writing questions, and this paper is for writing posts. Paper is paper, and excluding fundamentally new ways of writing, and fundamentally new paper, the task is user-performable. So why not give the user the power to use the paper the way he wants to, and let us concentrate on the rest: fundamentally new stuff; inventing.

The idea in a very similar problem is: separate the paper mills engineers and the newspapers writers. They are totally separate jobs. Thus in our field, separate the 'computer scientists' (or computer professionals in general, including CS and IS) from the website authors.

Not only database applications or websites I am talking about. I am also talking about GIS. Geographical information systems, used to be an information system thing (IS) and is considered an advanced field. My thinking is that once that field gets ripe and the only variations left is to change uses and purposes, just leave it to other peoples (GIS geologists, or traffic authority or whatever they will call themselves) and concentrate (I mean IS people) on making the next technology, for example: Voice Information System, Space Information System, or ... there are many stuff left to be done, don't stick to the easy and clear one just because the other new fields seems fuzzy or not very well-defined, that's where history-remembered scientists starts this way by exploring what no one did before.

And by the way, I want to call the term 'computer professional' to be obsolete a meaning-less. I don't know if I am the only one to say that, but anyway. We computer scientists, information system guys, information technology guys, and whoever mission is to create new technologies in their field, should let a technology go after it is ripe to people who are only dedicated to it. Websites, should no longer be called as 'our' field. There is website-professionals who need not know binary or internal working of a computer, they might also need not know programming at all. Thus computer-professional should be replaced with a 'field'-professional. Because they will be very diverse and have absolutely nothing in common, except that they use computer hardware, RAM and hard disks.

Not all database applications and not all websites are like that, after all, the content judges. For example, a website to do calculations on a set of people stored in a database to classify them on a certain complex criteria that you need to make your own algorithm (not just be sorting and branching) that can't be made using a simple SQL query, that no so-called website-professional can do. That can be acceptable for us to do. But otherwise, either repetitive memorized website-development, or content writing, is not acceptable for us to do as it is not our field, nor our profession, nor what we were prepared to do, we were prepared for something much higher, much complex, and much greater.

If you (CS, IS, or IT guy) are still convinced that the new idea for your website justifies making a website, then you didn't get the idea of this article. Save such ideas to website-professionals. Your job is much creative than that.

A little example, if you are making a program that uses a database, and uses communication between computers, you can do it using SQL/DLinQ and Sockets/WCF, but you can also devise your own way like making a new spontaneous way of accessing your data, and a new spontaneous way for calling your program on the other machines. The new ways, need not be so general, they only need to serve your specific needs in that program (i.e. single protocol, single language communication; single language data access; the language you use). Only try to make them as reusable as possible. Do whatever you need so you can concentrate on the creative parts of your application not the 'exhaustive' parts.

Reusability concept is more than I imagined, it isn't just making 'code' reusable so you don't need to write the same functionality twice, but also the whole process, so you don't need to drag and drop the same components twice!

I hope the idea have reached you. Thanks for reading so far.