Thursday, March 19, 2015

What I am going to advice a kido who want to be a programmer before going to university

  While i am reading some articles on Quora.com, i passed by this article, it was amazing, i really wish that i'v got such an advice when i finished my high school .. 

  The kid asks: "I want to be a high-class programmer and go in IOIs, Top Coder, Google Code Jam etc. I am 14 at the moment. What should I start from now, from where and how?"

  And here is comes the awesome answer:

  Download the book for Computer Science Unplugged. It's available free under a Creative Commons License. You can go though a module in less than an hour, and IIRC there are 18 modules now. You don't need a computer for the exercises. Print out a module, stick it in your backpack, and work on it while you're sitting and waiting somewhere. (You'll also need a pencil, but that's it) If you go through all the modules, you will know more about computer science than many CS grads.

  Now you have a good foundation to start learning programming.

  Pick a first language. It sort of doesn't matter what language you pick for your first language, but I'd recommend a simple modern scripting language embedded into some platform. If you want something fun, learn LUA using a CRYENGINE 3  game and modify or make your own game mods.  If you're interested in 3D animation, you could learn Python by scripting in Blender.

  Now it's time to learn your second language. No matter which language you pick as a second language, it's going to be hard to learn because you're going to have to separate the concepts from implementations you learned in your first language. I would highly recommend learning C, using Linux, without using an IDE.  Just use the shell and a programmer's text editor. ("Why C?" is a long answer, but leave a comment if you want the answer.)  You don't need to become a C guru (yet) - just get to the point where you understand pointers and structs, and how to compile and link code.

  Now pick a third language. I'd recommend JavaScript, Java, or if you think you want to go into game development either C++ or C# (Unity) and an IDE.  (C# is also good if you're interested in Windows development.)  You could also choose PHP if you're interested in web services development. PHP is likely to keep you employed, since 70% of the web's back-end services are PHP based, but I haven't found a good IDE for PHP.  You mentioned wanting to do iOS development in the comments, so Swift might be a valid choice. I haven't used Swift yet, but XCODE is a decent IDE. (I would't recommend Objective-C until after you've learned another OO language like those mentioned above.)  You will find this third language is very easy to learn, no matter which one you pick. You'll know the programming concept you want to use, then just have to look and and learn how it is expressed in this particular language.  You'll also learn what unique features the language has based on the problem it was created to solve.

  One aspect of being a strong programmer is understanding one level above and below what you're doing. Now you've got programming down, I'd recommend learning a little about about UI/UX.  Front-end web development is a good thing to learn while learning about UI/UX.  If you're interested in optimization and high-speed computing learn some assembly language - specifically vector instruction sets. You should also keep learning new languages and standard/common libraries.



  The kid now wonders... "do you think I should learn these mentioned things before my universities before ioi and stuff or learn them later ?"

  The Reply was :

"..learn before universities..."

  Yes, especially CS Unplugged. (You may discover after CS Unplugged that you hate CS and want to do something else...no college time and money wasted.)  You don't need to go to college to learn how to program. Many software developers, even exceptional 10x developers, are self-taught programmers.  Use your time in college to learn more advanced topics: operating systems, kernels, massively-parallel systems, embedded development, virtualization, etc. Stuff that will be easier with an expert instructing you and with access to equipment you couldn't have at home, like computing clusters or high-end GPGPUs. If you need to work while in college, your programming chops will pay better and provide more flexible hours than waiting tables.

"Why C?"

  C Is is sort of the "Latin" of computer languages, except C is still used quite a bit and sometimes dropping to C is still necessary for solving certain problems. If you want to learn to speak French, you learn French. If you want to be a linguist, you learn Latin, which makes French, Italian, Spanish, and Portuguese much easier and provides a deeper understanding of these languages, as they are all rooted in Latin. Java, JavaScript, PHP, Python, Perl, C#, Objective-C, C++, and many other languages are rooted in C and share a lot of the same syntax. They were all created to address some shortcoming in C or a domain-specific problem that C didn't easily solve, so C is simpler in terms of functionality than the later languages it inspired. The languages that have stuck around added to C in a meaningful way.  So when you know C then learn a new language, you have this "ah ha!" moment where you figure out why the language's developer choose to create a new language rather than using C or whatever C-based language didn't meet their needs.

  An argument can be made for "Smalltalk" fitting the same description as C - a root language. Many languages were influenced by Smalltalk. However, in my view the influence was mostly adding Smalltalk features to C-like languages.


The evolution, but only goes up to 2001 sadly. You can see though most of today's popular languages are rooted in C.