Ask HN: With no CS degree, what was most frustrating about learning how to code?
1) For those of you without CS degrees, what do you (or did you) find most frustrating about learning how to code?
2) What resources (e.g. mentors, websites, coding classes or bootcamps, youtube videos, books, co-workers) did you find MOST helpful in accelerating your learning?<p>For example, if it was a combination of factors that led you to have the skills you have today, what could you have not done without?
21 comments
[ 2.4 ms ] story [ 55.4 ms ] thread2) Co-Founders were my mentors
2) No resources in particular stand out to me, though I think books were way more useful early on than blog posts or tutorials. I think it's the linear nature of books that really helped me.
My advice would be to pick one medium (web, iOS, Android, whatever) and one language (for me that was Ruby) and stick to that language only for at least a year.
Other advice would be to always be inquisitive. Though I didn't get a degree, I eventually went on to learn about operating systems, sockets, basic algorithms and data structures.
However, in my opinion getting a CS degree would be frustrating if I were to do it all over again. Learning all that implementation detail and a lot of schools not even pushing or requiring you to build things would really frustrate me.
Anyway, I remember the hardest part for me was wrapping my mind around Ruby blocks. It sounds kind of dumb but honestly I couldn't understand them for weeks. The first programs I wrote were those text-based adventure games, like, "You're on a path in a forest. What do you do? > Go left". I did those because you didn't need to ever use blocks for them, it was all just conditional logic.
Once I grokked Ruby blocks I feel like it has all been downhill from there, at least until I stated looking at Haskell...
As far as resources: Really depends on the topic.
You can watch lectures for an entire CS degree for free online via places like UC Berkeley. There are also paid video stuff at places like Pluralsight (coding), CBTNuggets (server management), and as you said even YouTube has the good video now and again.
I just google whatever I need as I need it. It isn't a very formal way of learning but it is an effective one. The only trick is not to skip doing things because you don't already know how to do them.
1) I found it most frustrating to try and choose between learning what's the most popular new technology and what would help me advance my career. It turns out, focusing on mastering the basics of HTML, CSS, and Javascript have gotten me much further than trying to jump on every new bandwagon that rolls by.
2) Honestly, the single greatest resource has been my side projects. All of the tutorials, training and learning from Google have been far surpassed by the amount of knowledge I've gained from sitting down and hacking on ideas. I seriously have had 1million side projects in my 5 years and each of them has been a challenge and an amazing learning experience.
Hope that helps
2) Some of the more helpful things for me were the Head First series of books from O'Reilly (Java and C# in particular), and having a few experienced programmers in real life to talk to. The one thing I seriously could not have done without, no question, is Google.
* Setting up environments and auxiliary tools: Should I use rvm or rbenv? What's bundler? Why do I need a rake? Where's my Gemfile? Ooops, I meant my Gemfile.lock.
* Understanding the sysadmin/architecture things: So I need an HTTP server and an app server? Wait, but some app servers are HTTP servers? But you need a proxy for static content? And a load balancer? (To be fair, in the modern world these tasks are vastly simplified by services like Heroku)
* Databases: Choosing a DB, choosing a library to connect to the DB, do you use an ORM or write SQL? Nowadays, I follow the "Always use Postgres unless you have a damn good reason" rule.
* Testing. Writing unit tests is incredibly tedious. Learning how to mock/stub/fake out critical libraries is a giant pain that I still commonly goof up today. Writing good tests easily takes 2-3X the amount of time it takes me to write working code.
* Deploying. Ugh.
I had much more success learning XCode and C/Obj-C. I read some lessons on C, then switched to Objective-C by following the Stanford video course on iTunes which showed you programming + hooking up XCode interface objects to run your methods (I realize I could have done that with Visual Basic originally, but at the time I couldn't think of anything I wanted to build in VB). Then I followed tutorials on raywenderlich.com and continued from there.
If I needed help, I Googled, posted on StackOverflow or asked my one programming friend.
2) More than anything, contributing to open source projects taught me how to code, how to read and edit existing code, and how to collaborate with other developers. In terms of early stages, Learn Python the Hard Way was huge, because it introduced me to all the OTHER online resources (like Stack Overflow) that were available. I also found some of the Udacity videos helpful.
And oh yeah, Make. I fucking hate Make. Not as much as I hate pay-to-play ecosystems like Microsoft Visual Studio, but yeah, fuck Make.
On the whole I think it's gotten a lot easier. I remember spending days on forums trying to solve little problems.
Either way the best way to learn is by doing.
This was a huge issue for me for probably about two years.
Then, I took a look at my projects using a dependency visualization tool (Structure101 for Java/C#) and I got a lot better as I fixed all of the tangled code/fat classes.
I highly recommend finding a project you're actually passionate to work on after you are done with your tutorials. If you're passionate about it, you're going to push through the frustrating parts that feel like you're not prepared or don't have the experience.
Use co-workers, forums, communities like StackOverflow and use them aggressively. Become rigorous at searching Google to find the answers first and give it a few tries, but don't be ashamed when you hit the wall. For me, the only way things will stick is by practicing them and trying to take them to the next level!
During my childhood finding a computer was the most frustrating part. I instead wrote programs on a fucking notebook.
2) Just sitting down at the computer and struggling with it -- not looking for the easy way out, figuring out things myself. Teaching only gets you one step of the way, after that it is all you. I would spend hours ready every book I could and writing small programs.
2) Second part was programming as part of a team and doing code reviews. That will shape you up like nothing else. But you can't do this step if you don't do the other part (writing lots of code on your own).
I started programming in 1984, writing in C64 basic, and didn't move on to C and assembler until 1989 (shortly after borrowing a modem from a friend), simply because I didn't even know such languages existed until then.
There's a staggering amount of (free!) information available nowadays for the budding programmer, to the point where your only major challenge is discerning the good from the bad (and that's easy enough to solve). The biggest accelerator to learning is having a pet project or three.
These types of resources tend to be informative, easy to grasp and often inspiring. They are things like books/textbooks, blog posts, tutorials(most tutorials suck though). They will usually reference other (even more canonical) resources so you shouldn't really have problems finding new stuff to read. You can pick and choose based on what sounds interesting and repeat.
This has been extremely efficient for me, and I have learned a lot pretty quickly.
2) I felt sites that promote start-to-end lessons step by step are great. Like codelearn.org. Videos and all are good too but they often target experienced people, so its much more painful to use those.
1 - Other computer science "things" that I presume you get taught. The ideas and concepts behind common algorithms. Sorting, searching, path finding, some other things I vaguely remember from my "decision maths" course at school.
1 - Setting up my environment. It is much easier with now with newer versions of cygwin and mingw64.
1 - Autotools.
2 - If you're looking for just one stand-out resource: the existing code you want to work with. Beyond the basic "hello world" examples I don't find writing something from scratch to be that beneficial to learning.