I am a computer scientist and a computer engineer. I recommend that you learn to code first. After that, the motivation behind the computer science is a lot more clear and you will learn it much more easily.<p>Learning to code means:<p>* Absolutely learn to type correctly and without looking; if you are not willing to do this, then do not bother with this field.<p>* Learn one editor really well; most people who are serious use gnu emacs or vi (vim?); I use gnu emacs.<p>* Learn a revision control system; these days, everyone will expect you to know git; get a github account, which is really cheap, and put all of your projects there; it makes it easy to collaborate with others; learn the correct way to write git commit messages.<p>* Start with the C programming language and the build tool gnu make; have someone show you how to write a simple makefile to build your projects.<p>* Have someone show you how to compile using, say, gcc so that the compiler outputs the assembly files (.s) annotated with the C input: <a href="https://stackoverflow.com/questions/137038/how-do-you-get-assembler-output-from-c-c-source-in-gcc" rel="nofollow">https://stackoverflow.com/questions/137038/how-do-you-get-as...</a><p>* Write lots of little C programs and compile them and look at the assembly langauge with the C input interleaved with it.<p>* Maintain all of that in a github repository named, say, c-examples; write regression tests and run them every time you change anything.<p>* For any code repo you have called, say, foo, make another github repo called foo-notes; maintain a todo list in that repo, possibly in mulitple files; also maintain a list of relevant notes related to the project; also maintain another file or files of proposed changes or future work; doing this makes it easy to coordinate with others; DO NOT PRETEND TO KEEP EVERYTHING IN YOUR HEAD.<p>* Go through a book on C, say, The C Programming Language, and for every feature they mention, write a little program using it and a test for that.<p>* Learn to write C and read assembly before going on to any other language.<p>* After getting fairly competent at C, get a data-structures book and implement all of the primary data structures, such as linked lists, hashtables, red-black trees, etc.<p>* Build something you want, such as a tool to process your logs; you might want to use flex to process the input; write documentation for your project; if you put it in a file Readme.asciidoc in your repo, then github will run asciidoc on it and display it on the main screen of the repo.<p>Doing all of that, including learning all the idiomatic folk ways of doing things, like how to type without looking, how to write makefiles idiomatically, writing regression tests for everything you do, writing down EVERYTHING in the foo-notes repo, checking it off when done, etc. is a LOT of work; if you are not willing to do all of that, then pick a different field.<p>After you have built a few things, you might consider learning how the machine structures work, such as the memory hierarchy; learning this will help you write faster code. You might also want to study asymptotic analysis of algorithms which will help in picking the right data structure for a problem.