Open Side Menu Go to the Top
Register
Progress Report: One year of self-learning in CS / Programming Progress Report: One year of self-learning in CS / Programming

07-02-2012 , 01:57 AM
Four Parts:
1- Background
2- My (so far) journey
3- Advice I would give to myself if started all over again
4- What's next?

Background:

Several years ago, I began learning about programming, which amounted to learning HTML + CSS from w3schools. I did want to learn how to create apps for cell phones or build websites back then. Of course, I didn't realize that HTML + CSS isn't really programming in the traditional sense, and along comes several failed attempts at learning javascript. Anyways, I won't bother to link to the thread I started in this subforum where I publicly embarrassed myself, but a few of you guys informed me that I have to be a tad more serious about this stuff, and all the things I was focusing on was a complete waste of time. I didn't see it at the time, but now I realize you were all correct.

With that: Thank You! Thank you to those who told me to get my head out of my ass and learn how to program from the ground up.

Learning from scratch was an incredibly diffiult idea to swallow. I didn't understand why "everyone" was creating websites and creating phone & tablet apps. I was tricked into thinking that since "everyone" had these things, then there is nothing at all to it and it must be really easy. Now I see that this very illusion is exactly why "everyone" has one. It's an amazing facade and an excellent opportunity for derilicts to become successful in this field, when in reality, many of them should be banned from touching a computer ever again.

My (so far) journey:

I began taking Intro to CS (MITocw 6.000) and tackled that with some zeal, and once again, I don't think I would have been able to understand much of what I was exposed to without this subforum, so thank you again.

Then I began 6.001, Structure and Interpretation of Computer Programs (SICP), and the progress of this book has been extremely slow. For about 2 months, I didn't open the book, then when I tried to continue where I left off, I found I couldn't do anything at all, and I couldn't remember the basics, so I had to start all over again. This was in February of this year. If I have one regret from the past year, this would be it. I wish to hell that I would have stayed completely focused on finishing this book from start to finish. The fact that a book like this is available for free is astounding. Every single page of this book introduces a concept, and each concept simply blows my mind. I cannot express how powerful working through this book has been. There are about 600 pages, and almost each page asks to complete 1 to 4 different assignments. I'll be the first to admit that I couldn't complete all of these assignments: some of them are very difficult, but I can say with full honesty that I have been able to complete about 85% of them, and I think that is pretty good. Between transcribing and doing the homework, each chapter has amounted to ~1,000 lines of code. There are a few blogs online where people have worked through this book, and every one of them took about one year to complete the book and didn't do all the assignments, so at least I'm not too far behind the common trend.

I've also been working on learning Calculus I. This resulted from two things: SICP has a bit of concepts that aren't possible to understand without some Calc, and I foolishly attempted to try Machine Learning. None of this made an iota of sense to me. Why would repeatedly taking the first derivative show me where slope zero is? Yes, I took 2 years of Calculus in high school, but I don't think I ever learned anything about this stuff. <--- Went to school in the ghetto, what can I say? My teacher taught us that if we could learn to calculate polynomials in our head, we'd be able to beat craps.

Lastly, I've been working through Mathematics for Computer Scientists, which is basically all proofs and number theory. I've read the entirety of the book I'm about 50% of the way through the problems in this book. I can't comment on the quality of the proofs I have written. Even without knowing if the proofs are classically valid, the excercise is mind-expanding to say the least.

I did finish working through coursera's Introduction to Databases, and this has been the one class that I have used in my day-to-day life. In my job, I have crunch all sorts of data, and if I didn't know how to build, run, and query a database at my present level. I wouldn't be able to do my job at all. Of course, this makes one wonder why I work at a place where the tools for the job aren't available, but that's a totally different topic.

So, without the luxury of a TA or profs, I would say that my grades in all of the above classes is around a C, right? Isn't a C always the appropriate self-grade?

What advice would I give to myself?

This is something I thought about considerably over the past few months, and there are many different pieces. I hope that, if someone is reading this and thinking of starting along this path, he or she will get something useful out of it. I fully expect that there will be disagreements in my thoughts, but mind that this is mostly pertains to me.

1- Don't lose focus: there is a ton of temptation along the path, and at times, the going gets tough and the going gets pretty boring. But don't be tempted into doing things because you read somewhere that this is a better way, or easier way, or that everyone should do this or that.

In a few months, you will end up deciding to create a few websites. There is nothing at all wrong with this, but trying to tackle Drupal as well? This is nuts. At some point in the future, you'll have enough knowledge to understand a framework, and you'll die a perfectly happy man not knowing what a .info file is. Here you are learning about abstraction barriers and other stuff, there is no reason to try to break apart a pre-built item to create you're own stuff.

There will also be more classes available to attempt. While you'll get lucky on one excursion, your success rate is going to be very low, and you'll waste a ton of hours watching videos you think you understand, but when it comes time to do the homework, you'll be stuck. Don't waste your time, you'll get there at some point, but not yet.

2- Don't fall into the idea that you won't learn anything unless you build something. It seems hard to believe, but all those 10-line programs you are currently writing is showing way more than you can ever realize. In some instances, it is best to defer to teachers, and this is one area you don't need to force yourself along in. Once it becomes time to create something, you'll have all the knowledge you need to create something. At this point, you'll only need to learn how the particular framework / language / et.al. works.

3- Don't think or worry about goals in this. It will only take you about 2 months to figure that phone apps and websites aren't interesting to you. In all of your life, you've mostly studied for the intellectual excercise. This will be plenty intellectually challenging, and once you learn about algorithms and other things, you'll gain focus, see a new world you never seen before.

4- Buy better equipment. Yeah, dude, you'll be taking a bus, and on the bus, you can take a tablet. Just don't buy that $130 thing that won't show you the correct formatting on the books you are reading. Buy a 10" tablet. Yeah, the cheap computer you have is okay for now, but seeing it crash once you try to interpret or compile 300 lines isn't a good way to continue. Upgrade now and upgrade fast. You really do need this stuff! My god, dude, would you really build a has with a plastic hammer?

What's next?

According to scientic studies, saying what your goals are is an excellent way to not ever achieve them, but here, I'll go ahead and write out my plans for the next year, because I hope they aren't too crazy.

1- Finish SICP, Calculus I, and Mathematics for Computer Science.

2- I am allowed to work on one or two websites because they are good ideas and, at least one will be intellectually challenging.

3- If any open sources are avaialbe, I am only allowed to take Calculus.

4- After completing the classes I am currenlty working through, then I will likely start working through the following three books: Introduction to Algorithms; C Programming Language by K&R; Concrete Mathematics by Knuth. Though I'll admit that the Knuth is probably to premature wihout Calc II first.

5- Learning how to use Clojure isn't too much of a stretch, since it shares a lot in common with Lisp and Python, two things I am already comfortable with.
Progress Report: One year of self-learning in CS / Programming Quote
07-02-2012 , 02:39 AM
I bookmarked this so I could read it later, but from what I have gotten through so far seems interesting I'll read the rest tomorrow. For now check out http://www.khanacademy.org/science/computer-science you might find that interesting, it is also free learning content.
Progress Report: One year of self-learning in CS / Programming Quote
07-02-2012 , 10:28 AM
didnt read it all, just want to comment:

Quote:
Originally Posted by daveT
2- Don't fall into the idea that you won't learn anything unless you build something. It seems hard to believe, but all those 10-line programs you are currently writing is showing way more than you can ever realize.
getting 10 line programs to work IS creating something. usually the advice is to build a complete project that you want to, and that is good advice too. but even working through textbooks and solving 10 line problems IS building something too. that has value. anytime you actually compile and run into errors and debug and compile again, you are training yourself into good habits. and thing is, this happens NATURALLY when you have to actually compile and build things (even 10 liners), to get them to WORK.

in fact, for me, TDD is just a framework for this whole process that i ALREADY DO (compile, debug, compile, debug, debug, debug, compile, still not working god damnit, debug, compile). but with TDD, i end up with a test suite on top of it, instead of the random steps taken in the parenthesis. yet most of the time i still dont do TDD

so yeah, thats where the advice comes from. actually DOING something, even if its 10 line programs. getting something to work
Progress Report: One year of self-learning in CS / Programming Quote
07-02-2012 , 07:00 PM
All of the algorithms and supporting mathematics are just the tools in your toolbox. What makes Computer Science a true science is application of methodologies, design patterns, ways of using your skills efficiently, and then improving upon them.

I don't know about you, but when I started writing programs for initial assignments in college, it was very easy to lose track of the end goal after I had written several lines of code. It wasn't until I learned how to make a plan for the program on a high level, write out some pseudocode and diagrams, then implement the plan incrementally with some occasional revisions that I began to become a more efficient programmer. This process alone is why I enjoy what I do. Designing and creating something out of essentially nothing and give it a purpose is astounding work and can be very rewarding.

So in this I truly encourage you in your learning process to pick up not just the tools, but the mindset of the architect as well. Here are some links I found helpful.
http://infolab.stanford.edu/~burback...tersluice.html
http://infolab.stanford.edu/~burback...ce/node56.html

http://infolab.stanford.edu/~burback...ce/node53.html
Progress Report: One year of self-learning in CS / Programming Quote
07-03-2012 , 01:45 AM
good job! just remember, if you're not looking back at the things you did a year ago and feel slightly embarrassed at the standard of your work, you're not doing it right.
Progress Report: One year of self-learning in CS / Programming Quote
07-03-2012 , 04:09 PM
Good job, looking back is very healthy.

Quote:
According to scientic studies, saying what your goals are is an excellent way to not ever achieve them, but here, I'll go ahead and write out my plans for the next year, because I hope they aren't too crazy.
disagree. Writing them down is excellent. Force yourself to complete stuff you have written down. Rockefeller called a motivational method pretty much based on this his greatest secret iirc
Progress Report: One year of self-learning in CS / Programming Quote
07-03-2012 , 07:58 PM
I've been learning C++ on my own over the summer watching course videos, preparation for my C++ course in the fall at uni and I would have to say that I feel really confident.

I've had two java courses at Uni and I'm not really a big fan of java compared to C++ at the moment.

I'm very much like yourself OP, where I started learning html and css (huge waste of time).

Anyway what I would like to say is that I've found my secret to learning, write everything down when learning with a pen! Make sure you can write code from memory in your head and be able to write it on paper. If you can write it on paper with very little errors, you can move on to learning more about the language, then repeat!

I'm no programmer yet... but I'm making progress like you and wish you luck.
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 12:23 AM
Quote:
Originally Posted by greg nice
didnt read it all, just want to comment:



getting 10 line programs to work IS creating something. usually the advice is to build a complete project that you want to, and that is good advice too. but even working through textbooks and solving 10 line problems IS building something too. that has value. anytime you actually compile and run into errors and debug and compile again, you are training yourself into good habits. and thing is, this happens NATURALLY when you have to actually compile and build things (even 10 liners), to get them to WORK.

in fact, for me, TDD is just a framework for this whole process that i ALREADY DO (compile, debug, compile, debug, debug, debug, compile, still not working god damnit, debug, compile). but with TDD, i end up with a test suite on top of it, instead of the random steps taken in the parenthesis. yet most of the time i still dont do TDD

so yeah, thats where the advice comes from. actually DOING something, even if its 10 line programs. getting something to work
I knew that one would be a little controversial and it's also why I clarified it is for me more than the general person, but I do want to illustrate where this comes from with a recent experience.

About a week ago, I began messing around with Clojure and specifically the Noir Framework, and I came across the basic code and the thought occurred to me that I can create a :set and to not only change the url, but to change the content of the page to say what url I am at, all with one function! This was described to me as programmatic routing.

Quote:
The implications of this toy programming is mind-blowing:


Code:
Code:
(ns webby.views.welcome
  (:require [webby.views.common :as common])
  
  (:use [noir.core :only [defpage]]
        [hiccup.core]
		[hiccup.form-helpers]))

(defpage "/:page" {:keys [page]}
         (common/layout
           [:h1 "Hello!"]
		   [:p "you are on page " page]
		   [:p "see ya!"]))
			   
(def page {:1 1 :2 2 :3 3})
The output is:

go to this page: http://localhost:8080/1

and see:

Quote:
Quote:
Hello!
you are on page 1
see ya!
then go to this page: http://localhost:8080/2

and see:

Quote:
Quote:
Hello!
you are on page 2
see ya!
then go to this page: http://localhost:8080/3

and see:

Quote:
Quote:
Hello!
you are on page 3
see ya!
The point being that if I didn't study about this stuff first, I would have completely missed the concept. Not saying that I wouldn't have got the basic idea down, but I most certainly would not have figured out the implications of this without having some study before hand. And the funny part is that it took me all of four seconds to see what I could do.

Obviously, there is much much more power to this idea, and one that I am looking forward to exploring.

So, what I'm saying isn't so much "not to work on stuff" but rather "be methodical and careful of what you work on, because there is tons of stuff you'll miss if you jump ahead of yourself, and diving into that big huge project you're thinking of isn't the correct way by any means." Yes, completion is worth a pat on the back, but imagine doing the above the naive way, as a beginner is wont to do, and continuing down that route.
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 12:24 AM
Quote:
Originally Posted by MonsoonMoon
All of the algorithms and supporting mathematics are just the tools in your toolbox. What makes Computer Science a true science is application of methodologies, design patterns, ways of using your skills efficiently, and then improving upon them.

I don't know about you, but when I started writing programs for initial assignments in college, it was very easy to lose track of the end goal after I had written several lines of code. It wasn't until I learned how to make a plan for the program on a high level, write out some pseudocode and diagrams, then implement the plan incrementally with some occasional revisions that I began to become a more efficient programmer. This process alone is why I enjoy what I do. Designing and creating something out of essentially nothing and give it a purpose is astounding work and can be very rewarding.

So in this I truly encourage you in your learning process to pick up not just the tools, but the mindset of the architect as well. Here are some links I found helpful.
http://infolab.stanford.edu/~burback...tersluice.html
http://infolab.stanford.edu/~burback...ce/node56.html

http://infolab.stanford.edu/~burback...ce/node53.html
Awesome. I think they'll be great tools to have.

Agreed: creating something from nothing is pretty darn cool.
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 12:27 AM
Quote:
Originally Posted by RoundTower
good job! just remember, if you're not looking back at the things you did a year ago and feel slightly embarrassed at the standard of your work, you're not doing it right.
Thanks. I remember how you in particular was one of my harshest critics, and I'm okay with that. I suspected that you would come in and tell me that I am too much of a slow poke and get back to work, then I would have to come up with excuses.

I'm not a little ashamed of my work from a year ago. I am massively ashamed of it.

Quote:
Originally Posted by clowntable
Good job, looking back is very healthy.


disagree. Writing them down is excellent. Force yourself to complete stuff you have written down. Rockefeller called a motivational method pretty much based on this his greatest secret iirc
This is where I got the sentence from. I do agree that I have done better by writing things down than not.

http://www.ted.com/talks/lang/en/dan...otivation.html
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 12:44 AM
Quote:
Originally Posted by daveT
Thanks. I remember how you in particular was one of my harshest critics, and I'm okay with that.
I wasn't going to bring it up, but yeah I definitely thought you would never get anywhere. And I was wrong, which is pretty cool.
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 12:49 AM
Quote:
Originally Posted by iosys
I've been learning C++ on my own over the summer watching course videos, preparation for my C++ course in the fall at uni and I would have to say that I feel really confident.

I've had two java courses at Uni and I'm not really a big fan of java compared to C++ at the moment.

I'm very much like yourself OP, where I started learning html and css (huge waste of time).

Anyway what I would like to say is that I've found my secret to learning, write everything down when learning with a pen! Make sure you can write code from memory in your head and be able to write it on paper. If you can write it on paper with very little errors, you can move on to learning more about the language, then repeat!

I'm no programmer yet... but I'm making progress like you and wish you luck.
When you were talking about using pen and paper, I was nodding my head, but then when you explained why, I shook my head. I totally disagree with the why section of the sentence.

A year an a half ago, I was trying to learn some Java as well, and I "learned" by writing everything down and memorization, but now I think that is an utter waste of time. The reason is that after typing the same basic thing over and over again, you're going to have it memorized anyways.

Now, I may be taking issue with the above because I only work in two languages that are anti-Java: Python and Lisp. There is almost no verbosity, and when they say you can learn Scheme (Lisp dialect) in a half hour, they really aren't joking with you. The reason Scheme and Python are excellent learning languages is that there is no need to spend days studying syntax. This allows you to use a pencil and paper to focus on things that really do need to be charted out, and in this, a pen / paper helps along immensely in understanding the program you are writing and helps in debugging.

I'll give a few copy / paste examples:

Code:
(define (lookup key-1 key-2 table)
  (let ((subtable (assoc key-1 (cdr table))))
    (if subtable
        (let ((record (assoc key-2 (cdr subtable))))
          (if record
              (cdr record)
              false))
        false)))
The above doesn't make a whole lot of sense to you, and that's okay. The point of the program is to search for stuff on a table.

Now, in order to reverse-engineer this program, it may help to have a picture:



That picture, if you have it available, helps immensely in understanding this program. Now imagine if you wanted to add another branch to the table? Rather than diving directly into the program, you may want to consider what the program is doing, change the table, then worry about changing the program to reflect what is happening on the table. If the program bugs, then you can try to draw the table of exactly what the program you have written is doing.

The table is Lisp-style pointers. I guess this is similar to C pointers, but I'm not able say for certain.

It's important to understand why this happens:



and why this happens:



Then you have to figure out why your program does one instead of the other. At this point, getting the syntax should be trivial. Perhaps you have a cheat-sheet or you can use Google for the syntax. Honestly, "learning a language" isn't a good use of pen & paper, IMO.
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 12:54 AM
Quote:
Originally Posted by RoundTower
I wasn't going to bring it up, but yeah I definitely thought you would never get anywhere. And I was wrong, which is pretty cool.
The day I have the balls to send out a serious application and stand at a white board is when you are wrong. Otherwise, you're still spot on.

Happy 4th. You'll take the day off, and I'll be studying. lol
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 03:06 AM
Quote:
Originally Posted by daveT
Quote:
Originally Posted by clowntable
Quote:
Originally Posted by daveT

According to scientic studies, saying what your goals are is an excellent way to not ever achieve them, but here, I'll go ahead and write out my plans for the next year, because I hope they aren't too crazy.
disagree. Writing them down is excellent. Force yourself to complete stuff you have written down. Rockefeller called a motivational method pretty much based on this his greatest secret iirc
This is where I got the sentence from. I do agree that I have done better by writing things down than not.

http://www.ted.com/talks/lang/en/dan...otivation.html
i too disagreed with what you said. so i went to watch that video.

he makes a very interesting point in the video. however, i think youve grossly misunderstood the message the guy was trying to make, for you to conclude your original quote.

hes saying that incentives hinder performance. thats usually due to the pressure of having to perform. the equivalent of his message would be if you had to learn to code to win a prize, rather than learning because you want to and enjoy it. hes saying the speed and quality of your learning is likely faster in the latter case.

its a good idea that you chose anyway to state your goals. if you go into a bookstore, go to the self help section, pick up any book about "getting things done", and youll likely find the advice that clear goals are essential for progress
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 10:44 AM
Quote:
Originally Posted by daveT
When you were talking about using pen and paper, I was nodding my head, but then when you explained why, I shook my head. I totally disagree with the why section of the sentence.

A year an a half ago, I was trying to learn some Java as well, and I "learned" by writing everything down and memorization, but now I think that is an utter waste of time. The reason is that after typing the same basic thing over and over again, you're going to have it memorized anyways.

We can agree to disagree!

In all honesty, I didn't intend to appear as if to write everything over and over on paper... I believe writing everything ONCE down on paper is beneficial in memorization. (Also the logic behind the code)

I have a weird memory where I can remember useless things that happened months or years ago but always struggled with second languages or code.

Why? Well it's as you say of why not to write... "If you type it a lot then there is no point, you will remember it!" which doesn't tend to be the case for me when learning code or secondary languages.

People that move to Spain will of course learn the language faster because they have to use it every single day. This isn't really the case for people getting into programming.

Right now I'm mostly learning the syntax compared to java and don't really feel like writing my old programs with C++ because I simply could if I really wanted to. But the more control that C++ has that I'm putting into my toolbox of a brain is very exciting.

Anyway my post was more intended for people getting into programming which I expect lots of people will view your thread are and I thought it would be cool to tell them what I recommend also when starting out.

edit: Also typing everything and never writing for me when I started with java, was not very great because the learning process probably took longer than if I sat down with a pen and paper to memorize what is going on.

I would tend to have to always go to java's api and repeat.
I believe many people can be starring at a computer screen, typing and all the knowledge just goes from their eyes to their fingers and is gone... lol

Last edited by iosys; 07-04-2012 at 11:01 AM.
Progress Report: One year of self-learning in CS / Programming Quote
07-04-2012 , 07:04 PM
Quote:
Originally Posted by greg nice
i too disagreed with what you said. so i went to watch that video.

he makes a very interesting point in the video. however, i think youve grossly misunderstood the message the guy was trying to make, for you to conclude your original quote.

hes saying that incentives hinder performance. thats usually due to the pressure of having to perform. the equivalent of his message would be if you had to learn to code to win a prize, rather than learning because you want to and enjoy it. hes saying the speed and quality of your learning is likely faster in the latter case.

its a good idea that you chose anyway to state your goals. if you go into a bookstore, go to the self help section, pick up any book about "getting things done", and youll likely find the advice that clear goals are essential for progress
Ooops. I must have linked the wrong video. This one is only 3 minutes long and not really as interesting as the original video:

http://www.ted.com/talks/lang/en/der..._yourself.html

Writing things down and stating the parameters of the plan has a different impact according to 59 Seconds. I was being somewhat tongue-in-cheek / trolling with that comment.
Progress Report: One year of self-learning in CS / Programming Quote
07-05-2012 , 12:07 AM
ah, yeah that video is much more apropos. and what he is suggesting makes a lot of sense. but having concrete goals for yourself (in writing or otherwise) can still coexist without announcing them
Progress Report: One year of self-learning in CS / Programming Quote
07-07-2013 , 10:37 PM
I wanted to return to this thread and mark out my continued progress. This is year 2-ish.

I still have the .txt file of the original on my desktop. I never looked at it over the past year, but wow, I set the bar really low for myself. It is quite strange to look back at that time and think that it was all overwhelming.

I finished off the Calculus, and I am pleased that I taught myself enough that I was able to understand what was happening in the Calc2 class offered by Coursera. Not sure what I think of Calculus anymore. I used to be a total math nerd when I was a kid, but nothing like that anymore.

This isn't to say that I can't, or don't, appreciate what Calculus is or what it means. I think it is a beautiful perspective on math, but it is probably a bit too wide and it feels like it is a glom of a zillion concepts that are only tangentially connnected.

Been working through Linear Algebra, and I do like it a little better. It is really a bunch of different ideas of attacking Ax = b and seeing what happens. I think that, computationally, it is far superior than Calculus, though I do think Calculus is much better if you are a "real" mathemetician, or aspire to do so.

Sort of finished SICP. Per the advice of one poster here, I decided to scan over, and not really do, Chapter 5 and head off into doing other things.

Started up with K&R, but I have to say that the book really isn't that "up to date." I then tried out Learn C the Hard Way, but I found it to be incomplete. I then worked on C: A Modern Approach, and I can honestly say that it is a truly outstanding book.

I'm about 1/3 of the way through Introduction to Algorithms. Not sure how much I'd suggest this book to others. It takes a certain "type" who really wants a deep level of understanding here, but I'd certainly suggest it to anyone who is interested, as it is a mind-blowing effort. If you just want a quick overview and be able to pass a whiteboard by recall and add a few tricks to your bag, then I'd probably suggest reading something else. For those who are considering CLRS, don't be put off by the size: the boook is conversational and not as dense as you'd expect it to be. You can read a few pages in a day with no real problem, though it isn't bed-time reading either.

Starting working through Concrete Mathematics by Knuth. I'm glad that I can understand what is happening there. Just great stuff so far, though I'm only at chapter 3.

I guess I sort of learned Clojure.

I've built two sites with Clojure. The first was a full-out CRUD site with different "views" and authorizations, a database, and a deployment to Heroku. Probably a zillion mistakes on that site, though I have been passively fixing the issues. Much cleaner now and I'm slowly open-sourcing the entire site so others can have a guide-post on problem areas.

The second site is little more than a glorified HTML site. Yes, I hand-code the Hiccup every time I write an article. I take considerable pride in the site, and coding it this way forces me to take my time and consider the value of any article I decide to post on it. I know myself: If I was to just pump up Drupal and copy/paste articles at whim, the article quality would go to trash very quickly. I have had a few articles written where I decided not to post it up after hand-coding it. This bit of work is insurance that I won't just blow off more and more trash. Regardless, Hiccup is very fast to work with and not too painful. I also don't want any database calls on the site. I just want it to be as fast as possible, so pure .jar files is the way to go for me.

I built a poker bot in Clojure and ClojureScript. I can say that this is far more complicated than anything I've programmed so far. There are many side-cases in poker, and there has been many speed and profiling issues to explore along with minor details. The UX has also been challenging.

I have no real plans with the bot, except to make it smarter and perhaps start doing a NL, Omaha, Stud, etc. version, though not sure when that will happen. I would love to create an entirely separate site with it and run it with a nice database, but... for those who remember Poker Paradime and Sonya, I'm sure you can understand my concern. I would be paying a ton of money to keep it alive and I don't think there is any way to monetize it. Grant it, if I had a 75k/year job, I'd probably pay out the $100/month I'd need to keep it running, but that isn't relevant now since I'm not earning that kind of money.

Other things I've accomplished include:

Learning Emacs: Okay, I won't get into any wars here, but I think that learning a text-editor of some sort is a major step for any programmer. I've came to the conclusion that I really could not respect someone who exclusively uses Notepad++. I know this makes me sound like an ass, but if you have not spend a bit of time really trying to learn a good editor / IDE, I would strongly suggest giving it an honest shot. Your productivity will increase by a good country mile, and when you can move fast, you can try concepts much quicker. The payoff is well worth the price. I'm not joking when I say learning to use Emacs is one of my proudest accomplishments for me this past year.

Internship working with .Net / C#: Unfortunately, I couldn't fade the risk of not paying rent due to questionable paying practices, so I had to quit this internship. Trust me, if I had enough money to support myself for 3 months and not worry, I would still be there.

Linux: For those haven't bothered with Linux, I can only say "do it," especially if you are still mucking around with Windows. I use Arch, which I think is perfectly okay for a newb, but I won't blame anyone for going elsewhere. I strongly suggest not using Ubuntu. I'll let Richard Stallman explain it to you: https://www.youtube.com/watch?v=DXnfa0H30L4

Marketing Program for My Old Job: It was nice because it was all pretty much written anyways, but they needed something an idiot could use. I didn't quite deliver on that, but there wasn't really enough time.

This past year, I focused more on learning a bit of engineering, which is quite different than learning the basics of Computer Science. It's an interesting place to be right now, since it is obvious that my first attempt didn't turn out that good, my second attempt is better, but not that good, and my third attempt is better, but still not that good. Engineering, although different, does a really good job of exposing where my fundamentals are lacking. I can't really describe this, but I guess the gist is that what I thought I understood 6 months ago becomes very different after applying the concepts. Don't get me wrong, the CS stuff is extraordinarily valuable to all of this.

The next issue is that after some N-Size program, the considerations and consequences of my earlier decisions quickly start to show. There is a vast difference between 50 LOC and 500 LOC, and a very large difference past 1000 LOC. I'm speaking of Lisp LOC here. C# LOC would probably need to 3x these numbers. I've found that 1000 LOC of C# is not much different than say 200 LOC of Lisp. To be fair to myself, I was quite pleased that my first large project didn't topple after 1000 LOC.

On Lisp:

I'll be a Lisper 4 Life. Perhaps Lisp is a Land of Certain Sickos, I don't know. I just love the language.

There was a quote from Jerry Sussman where he said that all of the reserved words of any programming language should not be more than what you can count on your fingers and toes. I've come to appreciate the philosophy.

I've found that I like languages that are small. I think that Scheme is a tad too small. Python can function small, but I hate the idea of the Standard Lib. If the "Pythonic Way" of doing X is "from x import y" then what is the point of not making the Standard Lib part of the core language? Grant it, I can understand the idea of csv or database modules, but math.sqrt()?

I find .Net / C# to be a pretty good language, but I also think that the language is way too large. I guess I can see the logic of it for larger teams, but I'm not sure. It really does enforce a "bottom-up" paradigm and not a top-down / bottom-up combo. I guess for large teams, top-down / bottom-up would be fairly impractical.

I think Clojure nearly hits the sweet-spot in language size. It is a small language and all the functions are succinctly listed on one web page. http://clojure.org/cheatsheet

Should you learn Lisp?

If you have heard of Lisp, you may have heard that it is a difficult language to learn. Paul Graham doesn't make it sound easy. Stuart Halloway, who works with Clojure creator Rich Hickey on Datamic, said that after years of experience working with Java and Ruby, Clojure was the most difficult language he ever learned.

My take? Well, I don't really know anything but Lisp and Python. Although I do know a bit of C and C#, there's nothing impressive enough to say I "know" those languages.

Apparently Lisp bends most poeple's brain to a place they are not used to dealing with. If this is truly the case, I think that it is perhaps much easier to "unbend" from Lisp to other languages than vice versa. I would then suggest learning Lisp as early as possible. Despite this, Lisp probably takes a much deeper dedication to learn and to appreciate than any other language you can bother to learn, and for this reason, it is not surprising to see such a fervor around this language. Stuart Halloway says Lisp / Clojure takes at least 18 months of dedicated learning to become really good, and he is without question an expert. He also offers the caveat that getting to semi-alien level only takes a few months, so at least after the initial ramp-up, the expressiveness and power of the language becomes obvious quickly.

I'm not sure what to make of the above, I really haven't reach the level of understanding what "expressive" and "power" means in relation to other languages.

What are my plans for the next year?

I don't really know yet, but I have a few things in mind:

1- Finish up the poker bot and expand it.

2- Keep up my blog more. I've neglected it pretty good and even with the few articles on it, traffic is pretty healthy.

3- Finish off the resume site conversion and open source it. It is partly uploaded to github, but its not complete yet.

4- Attend more meetups. They are a ton of fun.

5- Really dive further into Computer Science foundations. I want to drill down and learn C and Assembly. I don't know, these things fascinate me to no end, what can I say?

6- Write an open-source CRM, ERP, Marketing Analysis Program. I have the idea mapped out in my brain pretty good. Probably end up doing it in Django / Python so it is more accessible.

7- I am thinking about contacting people in the Clojure community to help out writing documentation. It is truly awful and it appears no one else wants to fix it.

Perhaps Decent Advice to People Considering a Self-Learning Path:

I'm sort of doing things the "hard" way, but I don't think of it as such. I think that there is immense value in getting foundations and learning things on your own. The compiler / interpreter is an amazing teacher, since it demands accuracy in syntax and (usually) is self-documenting of proper semantics. It is those things that do go by that are head-wracking, and yes, spending 6 hours hunting down a bug is... educational.

There are quite a few decent resources available that weren't available when I started about 2 years ago. All I had was OCW, but now there is EdX, Coursera, and Udacity. In simple terms, there is no excuse to sit around and wait. It's all there for the taking: take advantage! But don't ignore OCW, since there is a nice path to learning what you need if you take the time to look at the course outlines and progressions, plus it is there for those classes you'd like to look at but aren't available.

I am a proponent of not really planning the future. I think it is much better and more powerful to approach all of this with an open mind. You stand to lose way more if you think "Oh, what does learning X have to do with my goal?" I think the answers will surprise you. Trust me, I've been surprised a million times over.

It is too early to think about "being productive." I believe that anything that makes things look like magic to you is ultimately detrimental to your learning.

If you are considering one of those acceleration programs, I would say spend a good 9 months learning as much as you can by yourself before applying. I say this because you really don't want to, and you shouldn't, be paying someone $4k / mth to teach you how to write a for loop or write basic SQL queries. I also discourage diving in because you may find that building websites isn't all that interesting to you, and it would be a terrible thing to lose out on $12k + >= 3 mths of living expenses to figure out that you may not like programming and you may not want to write web sites for the rest of your life. Seriously, with the free resources available, there is plenty of time to explore, fail, and bring yourself up to a level where, if you enter an accelerator, you will hit the ground running and be highly prepared upon graduation.

The path I've taken so far:

Introduction to Computer Science
SICP
Introduction to Databases
Calculus
Coursera Calculus
Mathematics for Computer Science
Introduction to Algorithms
Linear Algebra

In the OP, I mentioned a few regrets from the prior year. I don't really have many regrets from this year. I was much more focused and I had a few months of no real job so I had considerable time to study. The things I wish I had right now are things I couldn't really help, so it isn't really worth mentioning. Yes, progress is perhaps a bit slow, but I think my focus was fine.
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 02:03 AM
Sounds like you have had a fun year.

Anyway, don't mean to derail, but the math nit in me is really confused about your comments on Calculus.

Quote:
Originally Posted by daveT
I finished off the Calculus, and I am pleased that I taught myself enough that I was able to understand what was happening in the Calc2 class offered by Coursera. Not sure what I think of Calculus anymore. I used to be a total math nerd when I was a kid, but nothing like that anymore.

This isn't to say that I can't, or don't, appreciate what Calculus is or what it means. I think it is a beautiful perspective on math, but it is probably a bit too wide and it feels like it is a glom of a zillion concepts that are only tangentially connnected.
As far as I remember, Calculus has 3 basic concepts: limits, derivatives, and integrals. Limits are used to define the other two concepts, and those two are inverses of each other. So I am confused about why you think Calculus is a "zillion concepts that are only tangentially connected" when in my mind Calculus is pretty compact.
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 02:14 AM
Quote:
Calculus has 3 basic concepts: limits, derivatives, and integrals
The first one is broad enough that it doesn't follow that the material is compact. It's all related in the sense that all math is related, but it's not like Linear Algebra where you can blow through 2 college classes worth of material just by understanding a handful of basic concepts.
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 03:28 AM
Quote:
Originally Posted by daveT
I built a poker bot in Clojure and ClojureScript. I can say that this is far more complicated than anything I've programmed so far. There are many side-cases in poker, and there has been many speed and profiling issues to explore along with minor details. The UX has also been challenging.

I have no real plans with the bot, except to make it smarter and perhaps start doing a NL, Omaha, Stud, etc. version, though not sure when that will happen. I would love to create an entirely separate site with it and run it with a nice database, but... for those who remember Poker Paradime and Sonya, I'm sure you can understand my concern. I would be paying a ton of money to keep it alive and I don't think there is any way to monetize it. Grant it, if I had a 75k/year job, I'd probably pay out the $100/month I'd need to keep it running, but that isn't relevant now since I'm not earning that kind of money.
Don't mean to derail , but the Internet Marketing nit in me is confused about this. If the thing will bring in enough traffic to cost heavily in hosting, it has to be able to turn a profit.

- Make an affiliate account on Stars and throw up a banner. Do the same for Bodog? and show that one to USA visitors. people will click them links often enough that $100+ signup CPAs will do you nicely, imo.

- track stats, analyze, optimize.

- less scruples: take emails in exchange for a simple how2hunl ebook of your creation. "spam" them with signup bonus offers (Aweber etc)

- even less scruples. "congrats you beat lizzie! here's a free ipad offer especially for you!"

- annoying bastard: some combination of the above, as a "facebook game". spam people's friendslists with "DaveT beat Lizzie in 5:42 minutes! do you have what it takes?" etc. Add leaderboard, who can win the most from Lizzie's infinite bankroll! For prizes (spammy affiliate offers)!

Of course you couldn't link that version of the site here, for obvious reasons. but I strongly suspect it would make you good money *IF it gets traffic*. if it doesn't get traffic, it'll be cheap!

I'd like options 1 & 2.
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 03:34 AM
oh, and great post!
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 05:12 AM
Quote:
Originally Posted by Xhad
The first one is broad enough that it doesn't follow that the material is compact. It's all related in the sense that all math is related, but it's not like Linear Algebra where you can blow through 2 college classes worth of material just by understanding a handful of basic concepts.
I guess it depends on what you mean by "the material". Limits have tons of applications in various places, so if you're counting all that then the material is very broad. But I think the concept itself is pretty compact - "as x gets close to s then f(x) gets close to L" or if you prefer "for every epsilon>0 there exists delta>0 such that if 0<|x-s|<delta then |f(x)-L| < epsilon".

Linear Algebra in contrast has lots of big concepts like Vector spaces, Matrices, Eigenvalues, Determinants, Diagonalization etc. It all fits together if you understand it, but to me it seems like a lot more concepts than Calculus, which as far as I can remember boiled down to "here's a bunch of tricks for finding limits, derivatives, and integrals", with a very brief introduction to Taylor series at the end. Looking at http://en.wikipedia.org/wiki/AP_Calculus seems to confirm my memory.
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 05:30 AM
Amazing read dave. I think it would be a very cool idea to go meta and really think long and hard about how you approached the learning and what you'd do differently.

Maybe make one of the next items on your todo list "learning about learning" which is a topic that really fascinates me.

Quote:
6- Write an open-source CRM, ERP, Marketing Analysis Program. I have the idea mapped out in my brain pretty good. Probably end up doing it in Django / Python so it is more accessible.
If you can hold off and move this down your priority list until roughly May next year we should talk for sure. I like Python, I have worked on ERPs before. Doing it in Clojure sounds somewhat neat as well if you'd like that (I have this exact same project on my todo list except in Erlang because that seems like the neat language to try).
Progress Report: One year of self-learning in CS / Programming Quote
07-08-2013 , 07:42 AM
Quote:
Originally Posted by ballin4life
I guess it depends on what you mean by "the material". Limits have tons of applications in various places, so if you're counting all that then the material is very broad. But I think the concept itself is pretty compact - "as x gets close to s then f(x) gets close to L" or if you prefer "for every epsilon>0 there exists delta>0 such that if 0<|x-s|<delta then |f(x)-L| < epsilon".

Linear Algebra in contrast has lots of big concepts like Vector spaces, Matrices, Eigenvalues, Determinants, Diagonalization etc. It all fits together if you understand it, but to me it seems like a lot more concepts than Calculus, which as far as I can remember boiled down to "here's a bunch of tricks for finding limits, derivatives, and integrals", with a very brief introduction to Taylor series at the end. Looking at http://en.wikipedia.org/wiki/AP_Calculus seems to confirm my memory.
The uPenn class started at Taylor Series of e and Euler's formula and ended at the Discrete Taylor of e.

FWIW, my friend agrees with you, that Calculus is easier than Linear Algebra.

Last edited by daveT; 07-08-2013 at 07:47 AM.
Progress Report: One year of self-learning in CS / Programming Quote

      
m