Month: May 2014

[Relax] How to become a ‘Superb programmer’?

Some small lines for a funny summer. After reading this, let me know you opinion, and also sorry about my bad English 🙂

 

These days i read a really childish question, but somehow it’s interesting :”How to become a superb programmer?”. Many newbies who have just started to learn about information technology/programming always have a doubt and ask some question like this, and they wish to become to a billionaire and big man likes Bill Gates, or so. But hey, in my opinion, Bill Gates is not a professional and experienced programmer, he just be called as a succeeded business man. If we talk about some excellent programmers, the name of Linus Torvalds or Dennis Ritchie, should be mentioned.

Back to our main topic about the question:”How to become a superb programmer?”. At the beginning and til now, i still think that this question is really crazy and the misunderstood of the guy who asked this about programmer (as i mentioned above). But then i re-think about it and:”Aw, not bad. There should be some interesting thing to discuss about”. so i decided to write this note, not to show you the way to become a guy like Bill Gates – when he never count his money by each bill, he just count by each bag, but to show you determine your road to learn to become a professional – even you will become famous or not, just keep reading. Another point that i have to notice, is, in this note, i will not discuss about programming languages, because each language has its own advantages and disadvantages, and non of them is perfect, so i only show you and give advices, according to my experiences, and my knowledges, also my point of view (although i’m a student who is learning about banking and financial, not about information technology). So, are you ready? Let’s get started.

My chosen way:
Programming -> Debugging -> System programming -> Hacking and security

I will describe each part, separately below:

1. Programming
You can be a superb programmer without knowing programming, do you?Haha, it’s not. So you have to know and become fluent, in at least 1 language. Then you should start to write the code, from small applications to big projects. at first just to fit you needs, and then to help others. For e,g, some applications to hook girls, to scare your friends, then come to some bigger and more realistic, like accounting and management softwares, or some graphic emulator/manipulator program (if you could make some, like photoshop, autocad or premier, it’s great). And along side with the language you fluent the most, spend time to learn and research about other languages, as much as possible, but beware and take care, because you can get complicated. By keeping on programming, you will have good knowledges about programming languages and also about algorithms, coding styles and way to build an application.

2. Debugging
Debugging is a part of programming, but i still divided it into a standalone section, because it’s very important to us. Many students (especially rookies) think that “debug is just debug, and the main purpose is help us to run program without error after F9/F5 key pressed”. but personally i think that debug is more useful. By doing debugging, i can learn about the way that computer works, for each line of code compiled. I can see that how the program make a call to a function, push and pop data from stack, the change of registers and flags in cpu, stored data of each block in memory, or simply how the assembly code look like when compiled from a high level language,… all are amazing. I always debug all the program, even if it has bugs or not, just to watch those things. Gathered knowledge are very helpful, to me for a better result in programming. Then i can stop asking some stupid question like “What is 32 bit?/ What is 64 bit”, after asked that i will receive many good answers with full information, but all are just theory and no realistic, and i still don’t understand. So debugging will helps us to have a deeper look inside the computer, to see how it works, not only finding bugs and fix them.
P/s in this section: Sometimes i tried to use some debuggers which are integrated in some modern IDEs, and found that this task is too boring, because debugger only allows us to watch and trace by monitoring data in variables. In some cases, we could get more, but it’s not enough. I still like to use some wicked tools like Olly or gdb, they’re much more interesting. Seem that people is stuck with debugging in IDEs too long, so now they don’t have a correct opinion about debugging (especially made it as a not important task).

3. System Programming / Kernel Programming

The hardcoded part started from here. After you got a lot of knowledge about computer system and programming, so you should start with this section. You might have an question after reading this :” So what’s the difference between part 1 and part 3?”. Let me explain to you:
As you see in the first part, i highly recommended you to write application which is needed to help your daily tasks, also other people, just call it as “Application Programming”, then what you’ve done is just make a bridge for normal users to get closer to the computer, and make the computer to be a handy and powerful tool to get the job done. But system programming, is really different. You have to become a “friend” of the computer, listen to it, and determine and recognize its abilities, and make it become full-controlled, by your hand. Seem like too complicated, eh? In normal way, what you have to do is try to make program which can interact with computer, control them and make them work as you want to. I,e, write some drivers for external devices, create your own compiler/debugger, write and submit some code patches for linux kernel, start coding on embedded system,… More over is create your own operating system. These tasks is really hard to do, because, along side with programming skills, the knowledge about the way that computer works, knowledge about operating system, you have to have good knowledge about hardware structure (and a part, just not a few part, about electronic). when you reached this, i’m sure that you’re “demigod”, not a newbie anymore, haha.

4. Hacking and security
This is the last section. In fact, it’s only the sub-section of three parts above, but it’s the highest skills which are “must have” skills for a programmer. A talented programmer, is seem to be a good hacker. But, there are many opinions about hacking and security theory, because these opinions were created in many different conditions, so they’re not the same. In programming, i just set that “hacking and security” is stand for 2 purposes, which are most important and highly required, of a programmer. They are:
– The stability and high performance of code and programs
– The safety/ security of code and programs
There is a fake story like this
When i was at university…
I created a small application, a chat client for me and my girlfriend, to have quick and easy chat. Everything is fine, in night time, me and her made many conversations, and sent a lot of love messages, they’re sick and romantic. But at a period of time, my girlfriend complained that her computer is really slow and laggy, whenever she makes a chat with me. Then i thought that my program has an problem. Rechecked my code, all are fine, the program run without any error with all the features worked well. But with a bit deeper check, i realized that my program consumed a lot amount of RAM Memory also CPU usage. Ah, so this is the issue which caused my girlfriend computer to slow down and lag. So i have to find a way to modify the code, to make it run smoother with lesser RAM and CPU required. the task to make the program become more optimized, is I’m “hacking” into the code to make it suit my needs (also my girlfriend needs, to). I rebuilt program, applied many better algorithms, also created new flexible methods, and finally i completed the task. Then, me and my girlfriend keep connection every night, again.

But sometimes, the love story should be hidden, to avoid other people. They may gossip and make a joke about it (especially with my friends, if they know that i have girlfriend, they would force me to pay for a small party to cheering about that). So both me and my girlfriend didn’t mention about it with anybody, except us, we were waiting for a suitable moment to announce that. The time didn’t come yet, but my friends discovered. And my poor wallet, it’s never become fat, after the party, it turned into a skeleton with empty hole. I asked “Why did they know about my girlfriend?”, then i started to figure it out. Ah, they saw me every night i always sit in front of the computer, keep tapping the keyboard, sometimes i have stupid smiles. They started to capture packets at my machine when it connected to the internet, and grabbed a lot of my love messages included in these packets, in plain text mode. Those messages are not encrypted after sending, so it’s too easy for my friend to find out my secret story. So, my program is not safe and make information to be leaked. And the result is my empty wallet and after that, my girl get shamed because sometimes my friends teased her using that love story. The secret was discovered, but i still want to make my program become more optimized and safety. I added encrypted algorithm to protect my messages, after my girlfriend received encrypted messages, there will be a decryption function to turn them to plain text, so my girlfriend will be able to read them. When i tested new program by capturing packets, i only got some packets which contains encrypted messages and they can not be read. Phew, now my program is safe.

The story above, is just a demonstration for a very, very small part of “Hacking and security”. To do hacking and security in typical way, you need a lot of knowledges, from programming, computer system to networking and hardware. To increase the performance and security of a product is very hard and cost a lot of time, also requires a lot of knowledge, and the most important is you have to fully understand about all the dependencies. Write true code, make a program runnable, make a working system are not enough, you have to tweak them to give a best performance also best security state. And the tweaking task is not once, you have to repeat it, time to time. Each completed tweak, the program should become more stable. That’s why hacking and security is the highest skill for a programmer, in my opinion.

And for the last words, “the guy who makes a most stable program, is the best programmer, no matter how he did it”.