Django Girls Seattle and Reading List for Python

Yikes!  Long time, no post!  Sorry, my faithful few readers, you’re much appreciated.  Here’s some recommended reading, and a small summary of what I’ve been up to!

Python recommended reading list:

  1. Django Girls tutorial gives you a quick and dirty introduction to Python where you can actually start doing things.
  2. Coursera’s Introduction to Python is good for those without any programming experience looking to learn the basics of Python by building games.  It has good projects, though so does Udacity’s Intro to Computer Science that will use your intro skills.
  3. How to Think Like a Computer Scientist is another free online book that is a great introduction to programming and problem solving.
  4. Problem Solving with Algorithms and Data Structures in Python is a free online book that is good once you have the basics of Python down to learn more about algorithms and data structures.

On August 7th/8th, there will be a Django Girls workshop in Seattle, and I encourage others to join!  It’s intended for those with very little/no programming experience to get their feet wet making a blog with Django and Python.  Check out Django Girls Seattle for more information!  I will be coaching, and I believe they still need more coaches as well.

I’ve also been playing with the Meteor framework for JS.  It solves a lot of the frustrating issues with the MEAN stack and instead slops everything together in a beautiful, seamless package.  It’s lovely.  I’ve seen it compared to Rails for Ruby, but it’s considered more seamless because of all the JavaScript on every side, which I personally love.  I’m not going to lie – I like JavaScript.  Hell, I love JavaScript.  I know that’s not a popular opinion amongst programmers, but it’s one that’s growing!

And finally, for those who are worried about my physical well-being…

Physical therapy is still going for my lovely shoulder, which is always fun, but it’s getting stronger.  I still have my shoulder blade winging all the time, unfortunately, but that’s slowly getting better which is good.  2 months from now and it will have been a year since I was injured and a bit longer since I decided to make the career change.  It’s always interesting thinking about the events that set you on your current path.

Also I started an internship!  I’ll go more into that later,  but it’s very exciting!

Advertisements
Django Girls Seattle and Reading List for Python

JavaScript Card Game: The Great Dalmuti (or look Ma, I used JavaScript to make a card game my friends won’t play with me!)

Hi, my name is Stephanie, and I’m a recovering board and card game addict.  My addiction has manifested itself in some very concerning ways over the years including a stint of playing DnD with nerds online over IRC chat in college, but the most recent iteration is by writing myself a small JavaScript app version of The Great Dalmuti/Daihinmin/President.

When I am able to coerce my friends to play this game, we all wear different hats to indicate our position in society, because unlike public schools you are allowed to wear hats in my home, and at times it is required like a construction site.  Only, instead of building apartment complexes, we’re building camaraderie?  Clearly, my preference is to give the dudes in our group the pinkest, prettiest hats I can knowing that society typically doesn’t approve of them embracing their love of lightish red and wanting to give them an opportunity where they can excuse their pink-embrace as the whims of a game addict while their hearts palpitate in an elation they had never previously knew possible from headwear.

Consequently, when I threw together cards based on a stick person I was able to create using arial font, they all had different hats to help simulate this very important part of the Dalmuti experience.  My only regret is that the 12 and 11 needed far more different hats than I provided due to a lack of inspiration in the last 5 minutes of my 30 minute hat making adventure.  Which is why those will not be cards I show you intentionally.  Instead, have an apple merchant:

Or, you know, a red blob saleswoman.
Here we have an apple merchant. 

She has large feathers in her luxurious purple cap and has done well in an apple-deprived market. Apple pies, apple crisps, and apple cider are the mainstays in the realm, and she is rolling in apple dough so much her feathers are bigger than her arms. Life is good for the apple merchant.

Totally did not make her an apple merchant because apples are easily distinguishable at small sizes.  It was definitely a lore thing.  Definitely.  Same with this carrot guy.  Lore.

Or, the amazing orange stick salesman.
The carrot merchant. 

A man with small feathers to signify his small wealth in comparison to the other merchants, especially that darn apple merchant. There was a time in his life where he spent day in and day out trying to convince the members of the realm that orange is the new red, but after being threatened with incarceration by the Great Dalmuti himself, he resigned to his fewer boxes of unwanted carrots and accepted his lot in life. After all, he could be a peon.

Look at that well-developed story line.  It makes you want to play a card game with robots because your friends won’t play with you, doesn’t it?

On a more technical note, this was fun to practice for some of the different things I’ve learned and a nice break from my behavior tracker app I’m working on.  I added some changes from my original based on suggestions from friends and spouse (ex. delayed listing of what the script in the browser has played rather than it showing as it loads which is instantaneously from a person’s perspective).  There are still some aspects of the game I need to implement (wild cards, revolution, greater revolution, taxes after the 1st play through), I want to make a much better UI, and I need to refractor my code a bit more since in some places I’m pretty sure it’s a bit awkwardly put together.  I’m also likely going to put together a multiplayer version using me some node and socketIO, but that’s for later because if I could get friends to play with me in the first place I wouldn’t have needed to make a computer version.

In the mean time – hats.  Hats are the answer.

JavaScript Card Game: The Great Dalmuti (or look Ma, I used JavaScript to make a card game my friends won’t play with me!)

My nemesis: AngularJS docs.

Hello neglected blog!  I’ve missed you and your beautiful blue-ish pages.  I’m sorry it’s been so long since I’ve interacted with you (and my faithful 15).  I am drowning in the sea of AngularJS as I dig around the MEAN stack.

And I do mean sea.  As anyone who has attempted to read AngularJS’s docs can tell you, the experience is special in the way you describe a friend you personally love but are very aware that anyone who hasn’t spent the time getting to know them will need to invest a large amount of time disliking them to find the love.  With AngularJS docs, as you stumble upon the first page that you’re almost 100% certain any other documentation page for such a large scale project would include the information you’re looking for about the module you want to implement to make your HTML page not look like, well, this:

Yeah...learning is fun.
An uncomfortable mixture of unreadable and mid-html logic intensive that will inevitably be reused when I get back to my login page again and failing to be DRY.

When you navigate to that page in the Angular docs, it starts to answer the question, letting you step into the sea a few inches, feeling the sand between your toes, certain this is the relief your mess was looking for.  Then, as you inch in further, suddenly you realize the sea was not a sea but instead a decapitated kraken in a kiddy pool who wants nothing, as it is mindless and headless, and instead will grab you by the ankles and throw you about the bouncy edges of its plastic entrapment until you resign, regretting your trip to the sea, and crawl away onto the dried out, dying lawn.

Which then leaves me digging around blogs.  The bad thing about bloggers (such as myself), is often we don’t update for years in a row.  So while we had a solution that would have worked a few versions ago, we don’t have a great one for the moment – or even a mediocre one.  So essentially it’s like looking for the sea and finding a puddle.  Sometimes this puddle can offer a bit of relief, but more likely than not if you try to drink from it you’re going to get a disease (in my case, looking at other blogs in hopes for a bit more detail) that will result in hours wasted and no actual relief.

Then I decide the solution is to use vanilla JavaScript, but then I look back at the rest of my code and see how odd that little chunk seems in comparison to everything else.  It’s like meeting an adorable toy poodle with a very unfortunately uneven haircut that looks like missing blocks in a LEGO recreation of the Tower of Piza.  So then I hang my head in shame, crawling back to Angular, apologizing for my failures, and begging to be taken back as a negligent neophyte.

You talk to mentors, peers, anonymous strangers on the internet, but they all respond the same.  “You check Google?” because JavaScript is often perceived as the bastard child of programming languages, and so finding those dedicated to it is like trying to find a bastard child in good standing who will dedicate themselves to live on a giant wall of ice without reasonable comforts in celibacy without being forced there (i.e. Jon Snow).

Consequently, Google frequently leads to this:

xkcd reading. Wait, no. StackOverflow. I’m pretty certain DenverCoder9 moved on, tried something else, and succeeded. (Un)fortunately, I am the embodiment of perseverance (read: stubborn), so…

Unrelated, I’ve interacted with some dev bootcamps & their former students lately out of curiosity (or more realistically wondering if they had a magical instructional model that the internet and bookstores did not), and decided against pursuing it any further, at least not for the foreseeable future.  Maybe I’ll write a post about that later once I’ve finished finding some body of water of AngularJS knowledge that won’t beat me senseless in a kiddy pool, act as a massive time sink without much gain, or simply fade into nothingness.

In summary, AngularJS docs are my nemesis and why I’ve been a negligent blogger.  Google overlords, you have failed me 😥  If anyone happens to know a resource to find information on modules that isn’t painfully out of date, I would LOVE a link.  Love.  Like I would marry that link, eagerly wake up to see it every morning by my side, and grow old with it.

My nemesis: AngularJS docs.

Getting MEAN: Building My First Web App for Realsies (and also fries are the worst food gift)

You heard me, for realsies.  I even got to self-create security violations, but thankfully as the app works now it doesn’t include usernames.  Unless you’re capable of inferring.  Then, yeah, definitely an issue.

Not THE Batman.
I AM Batman.

I love you, internet, you’re a great outlet for all of my weird.

But first?  Fries.  Three nights in a row, my husband has eaten out for dinner due to working crazy hours recently (poor, handsome bastard).  Since he knows the secret to a happy marriage is food, he brought me home left over fries.  Now, I love fries.  When I was a kid and I got fries from McDonald’s, I would happily eat those hot, salty, death sticks as soon as I could get my fingers on them.

I ate them before my cheeseburger.  Not because I didn’t love the hot, cheesy, non-compostable burger as much as the death sticks, but because the death sticks would gradually develop a weird texture and consistency as they grew cold.  This is especially true with fries that will actually decompose over time such as those that you get from a sit down restaurant.  That crispy, crunchy, delicious starchy stick just turns into a cold, lumpy, limp, soft wad.  It’s like coal in your stocking on Christmas.  Complete disappointment unless you happen to live in a town running on coal power that is running low, and for Christmas you want to give everyone around you warmth again.

So I tried a few solutions.  One: microwave.  BAD idea.  Ten times as soggy.  Two: oven.  Took way too long.  Still quite soggy.  Three: Toaster oven.  Still soggy, but warm fast.  This may have been improved if I could cook directly on the toaster rack without complete and utter fear of causing a small fire.  This may have been a fear exacerbated by the quantity of “in case of fire!” signs all over my toaster oven, I admit, but also fries slide through thin cracks quite easily so it may also just be a common sense thing that I wish didn’t exist.

I tried to think of other food gifts that came home as bad as fries.  Don’t get me wrong, anything that is a starch to which you add sauce isn’t great (burgers, sandwiches, etc), but a quick run in the toaster oven can fix all of those.  Fries though, too thin to be toaster ovened without aluminum foil.  Tis truly a shame.  If anyone has a leftover fry solution, let me know, cause I have quite a bit left.

(Side note: Dear Husband, if you happen to read this, please don’t take this to mean that I do not appreciate the lumpy food gift, but rather that I am desperately seeking a way to improve my enjoyment of the lumpy food gift as google has not provided an answer that works with the cookware we currently own.  This was a pretty close answer though.)

Now onto the programming portion of our lecture.  A couple months ago I followed a django tutorial that told me I made a web app, and once I finished the site I had loaded congratulated me for my amazing endurance for all of the 5 minutes it took, but I knew the truth.  I knew I had accomplished nothing.  When I attempted to make my own web app at that point, my brain laughed at me and called me names, so I knew I had more work ahead of me.

I landed on learning the MEAN stack because it could all be done in JavaScript.  At that point, I’d finished a majority of the Headfirst Javascript book (2 chapters away from the end, I believe?), so I really wanted to learn something that I could use to help solidify what I had learned about JavaScript.

I have an idea for a program I want to make for some of my old teacher buddies to make life a bit easier, and while I have an idea of the kinds of data I need and some of the objects, I decided it’d probably be better to start with something a little simpler.  There were a good dozen plus websites going through MEAN stack tutorials creating a to-do list (the “Hello World” of web dev), and a few making chat programs.  I decided to be awkward and make a chat program where you talk to yourself and no one else.  Why?  It felt right and had the kind of functionality I knew would be a good stepping stone into the future.  It also allowed some really awkward test cycles where I posed as Batman and used the classic trilogy throat-tearing voice every time I posted a test.  It made the whole experience feel way more epic.

Using a combination of resources including the documentation for node.js, angular.js, MongoDB and express.js, multiple websites, blogs, and video lectures from strangers, it took me about a week of working on it after work to get it together.  I learned that express.js is a beautiful blackbox where I don’t know anything about what goes inside, but I should probably learn what happens in that blackbox.  Finally, the best learning tool of all was learnyounode.  The reason for this is because it is called learnyounode, which automatically makes it amazing.  Plus it just gave you problems to solve using the JavaScript you hopefully know to start creating a web server.  Pretty good times.

Here’s a link to the outcome.  More importantly, here’s a link to all my testing posts.  It gets weird in all the right ways with Batman, Joker, and Robin being the stars of my tester accounts.  This page would look a lot less awkward if I tagged the users who post, but since, again, my intent is to only see MY posts alone when I sign in, I don’t see this as an issue.

I think my next step will be to start working a bit more on the app I’d like to build for my teacher friends.  I’ll need to plan out what it needs to do and how it will work a bit more first so I can get my MVC on.

Getting MEAN: Building My First Web App for Realsies (and also fries are the worst food gift)

Simple JavaScript Image Slideshow: Refactoring = Progress!

Now, I know the posts about me programming are a bit dull since I’m still very much a beginner, but since I didn’t have any activities scheduled this weekend and no work stuff to take care of, I felt like I was finally able to make some significant growth in my programming powers.  Admittedly, compared to anyone who is even remotely competent, I’m still a babbling baby, but still, it’s pretty cool to go back to something I made about a month ago from going along with a webmonkey post to going through and making it my own AND more easy to read, change, and follow along with.  I think the combination of those two things are something I really love about coding.  You can look up just about anything online (at least for the kinds of problems my beginner butt is running into), and then you can recreate bits of what you find with other knowledge you have to make them more simplistic or elegant.

CS vocabulary has been a bit new to me.  There are a lot of words I know in completely different contexts that have a very different definition in CS.  I’ve been trying to track new words I learn as I read about them and trying to see if I can understand them without my brain hurting while looking it up.  Sometimes I’m completely able to get it, and other times I sort of brain fart and feel like a toddler again.  So, for example, I read an article about a person who was working as a recruiter for a company.  This company was concerned about gender/racial bias interfering with its interview process, so together with the recruiter decided to do the programming portion of the interview with the candidates completely anonymously online.  Aside from written language (which one might argue could give some of this information away), he never saw or spoke with the candidates.  He gave them a refactoring challenge where they were to identify code smells.  When I read through the rest of the article, I was completely and utterly confused about exactly what it was he was having them do, but from what I could guess at the time he was having them look for hints of something being inefficient or problematic in the code then restructuring it.  Thanks to some quality time with my overlord Google, this turned out to mostly seem accurate.

Refactoring is when you alter the internal structure of the code without changing its external behavior.  When I wrote the first draft of my slideshow code I hadn’t any experience with objects or events, so when the site I followed along with pointed out different events, I just sort of rolled with it without really fully understanding what was going on beyond that when something was clicked, I told it to execute a function.  I also used global variables quite liberally, because that was the only way I really knew how to get some of the work done that I needed.  Even after I switched out all my functions to be methods instead, this hasn’t really changed too terribly much if I’m honest, but the beginning value of the variables is all easily accessible at the beginning of the method object.

Now, with the original script I had made a slight change to it.  I had added a while loop to create the imageArray[] since typing them in individual was not on my future desires list.  At the time I felt slightly successful being able to make that change, but ultimately I had mostly ended up with code very similar to the article as I wrote it after reading what needed to be done, and then I compared to what they had with functionality.  Not a great strategy, but again, the event handlers were a bit over my head at the time.

When I went through it to refactor, I renamed some variables to names that made more sense to me.  I added comments.  I restructured it to have the functions sorted as methods in objects and all the variables within objects as well.  None of what I did was really ground breaking, and a lot of it was work I honestly will probably change again as I continue learning in the next few weeks, but it helped me practice the skills I have learned and apply them, which is always helpful for retaining information and being able to use those skills creatively in the future.

You can go to my GitHub account to check out the code and the revision in a Gist.

One thing I need to revisit when I’m less sleepy is the event handlers.  I left them in HTML like I had before since I was running into strange errors when I tried placing them in the JavaScript instead.  I believe this was caused by setting the onclick handler and trying to pass it an argument, which I don’t believe is supposed to happen.  Without the argument, the rest of the code was no longer interested in functioning.  I checked some JavaScript documentation, but I wasn’t able to come up with an alternative that would work any better than just leaving the event handlers on the HTML page.  I will likely need to review options when I’m less sleepy, and with any luck, I’ll keep thinking about it while I dream and wake up with an answer!  I love code dreams.  So productive.

Next: to improve the Battleship game.

Simple JavaScript Image Slideshow: Refactoring = Progress!

You Sank My Battleship! (Learning JavaScript Continued)

So I’ve been learning JavaScript using Head First’s book, as I’ve mentioned about 12 times when frustrated with the pacing of other sources.  Around the 8th chapter, you’re given the goal of developing a JavaScript web app for battleship.  They go through it step by step how to make it, but typically when given a project, I’ll read the next step and create it on my own.  I still don’t feel I have a great conceptualization of how those steps are reached – I’m working on it – but this is a good start.  Afterward, I tested, and then I’d compare my code to the book’s.  Obviously, I learned through the book, so in some areas what I produced as incredibly similar to what the book suggested, and sometimes what I did was less efficient, and others I believed it was more efficient.  As far as event handlers, though, I had to look up information on that mostly and definitely need to learn more before going further.

Battleship Link!

My next steps for it are to include a way for the player to place ships for the computer to guess in order to compete and add sound.  I think this will help with my issue with feeling a lack of experience going from start to finish with a project.  Also, my goal is to change what I have to make it response as well, since currently on my phone, while I can zoom in and play, I feel like I should play anywhere!

The game itself isn’t very fun since it’s like playing Battleship with a wall, but I still think it’s a pretty good project for learning.  Plus, it’s just nice to look lovingly at something you made and feel all productive about it.

What I’ve learned so far with this project: testing after each implementation of a code block is essential.  Objects make me feel warm and fuzzy, and it’s lovely to be able to make information more easily structured using them, and I haven’t really used them until now.

That’s all the post for today, folks.  Back to work I go!  Happy Digital Learning Day!  Practice safe computing!

You Sank My Battleship! (Learning JavaScript Continued)

MOOCs (Treehouse, Udacity, Udemy, Codecademy, etc): A source of slooooow frustration to learn coding. Long live books!

I’ve recently learned after another week of blog neglect that I had a visitor from Canada, Jamaica, and Germany.  Welcome, non-Americans!  Hello to all the American readers as well.  My faithful 15 who see this show up in their news feed then click away in hopes of something more interesting.  You’re appreciated.  Adored even.  Adored so much that I drew an MS paint picture of all of you to show my adoration!

followers

Sorry for the pile of you stacked together.  I ran out of room for standing people, and then my hand got tired.  I did, however, include that one guy’s two kids.  Yeah, you know who you are, that one guy, and thanks to personal information you divulged on the internet I know you have children.  Don’t worry, you know about my little dog too, so we’re pretty even on the creepy factor.

If you’re the person who is singing, smiling, or permanently in a chair refusing to move while everyone else is standing, you’re awesome.  You’re not like the other followers who just pile up on the floor when the room gets crowded or awkwardly stand on other people’s heads.  You know what’s up.

Alright, odd monologue about nothing aside, let’s get back to the point, shall we?

I previously wrote a post about where to learn web coding where I compared Udacity, Udemy, and Codecademy as either very cheap or free learning methods.  I ultimately decided Udacity was for me, then had to go back and redact the monkeys out of that statement when I realized Udacity was for me situationally but progressively got less for me and more for no one as they stopped describing the “why” and got into just straight up “how”, which put me back to inferring the why a lot, which I’m fully capable of doing, but for very basic things was just so inefficient and rather than watching video lectures I could get my Google search on much faster (which is to say still rather slowly in comparison to having a skilled teacher instruct me).  I then thought, hmm, well, I keep getting spammed by CodeSchool and Treehouse ads on youtube, why not succumb to my Google overlords?

I went with Treehouse because my husband kept telling me how great it was, and I’m super easily influenced by incredibly handsome men who are easily excitable.  Plus, upon researching it, everyone seemed to support it for beginners and CodeSchool was more for intermediate people.  After Codecademy and some Udacity, I didn’t feel very intermediate.  So I signed up, and after the first course on “how to make a website”, I was grateful how much faster I gained the information compared to Udacity and how complete it was.  I happily petered over to my website and put some fancy looking things on it that changed size and disappeared as the screen resolution shrunk.  Then I did the next part, which was “CSS basics”.  Which was hours of the same information.  I was not pleased!  But I figured I grew in depth slightly, so maybe it was worthwhile.  Or so I tried to convince myself.

Then I got to JavaScript basics.  Also, no bad.  It was a bit slow, very a bit slow, and I was introduced to a concept and would start completing the programs they were going to use as an example before the example happened.  I figured it was good practice, so why not carry on?  Then…then I got to HTML forms.  I heard the advice to practice with CSS on your own since how you format an HTML form behaves in strange ways compared to usual HTML and that we couldn’t actually do anything with the form without a server side language either.  This made me want to bang my head on the wall.  I mean, what’s the point in wasting the time to say that if you aren’t going to go over why it behaves strange in comparison and what some of that behavior looks like?  But again, I used my inferential skills, and all was well.  The second part was incredibly frustrating, though.  I’ve been trying to apply whatever I learn as soon as I learn it so I can retain it, however having just learned a skill I couldn’t do more with than make a form that went to nowhere wasn’t particularly useful for practicing.  Motivating myself to get through that section involved a lot of tooth pulling.

I’ve moved on to more JavaScript, but it still feels like it’s moving slow.  I’ve invested over 25 hours into this program so far based on their in program timer for how long it should take to complete (and I’m not sure how much their track changes have adjusted this), but I feel like my retention is pretty poor.  Since doing my photo gallery slide show side project and learning far more from that, I had continued doing Treehouse, but I realized my issue with it.

Treehouse is intended for everyone starting at next to no computer experience, which is made pretty clear from their first course in the Front End Web Developer track.  Massively Open Online Courses are like general education in public school.  It’s meant to serve everybody and assumes everyone knows nothing, even though that’s not necessarily the case.  This isn’t a bad thing, it’s just if you can infer, and if you need some redundancy for retention but the redundancy you respond to isn’t someone telling you the same thing repeatedly, then it’s probably not a great resource for you.  This is unfortunate since I respond really well to hearing information then discussing it with others, and MOOCs provide auditory input.  Consequently, I think a bootcamp such as ADA would be a good match for my learning style, but whether or not I will be able to participate is undetermined yet (since, uh, applicants hear back around mid-March for interviews and end of March for actual acceptance?).  Whether or not ADA is in my future, I still want to learn, so I’ve moved on to another resource.

A book!  I know, I know, learning from books is a super novel idea that no one until this very moment has thought of.  My husband had used the Head First C# book, but he eventually found one part too hard and gave up.  I was never particularly interested in C#, so I never checked it out, but I checked out a couple of their other books while loitering in book stores and then checking the kindle sample version.  The strategies employed are simply good teaching (and entertaining!), and on top of that when I looked at the Java book, the first chapter nearly caught me up with everything I’d learned in roughly 10 hours+ on Treehouse.  So…yeah, I went with this book for the time being.  It’s super interesting to read and engaging, which helps with some of the motivational deficits I’ve experienced with watching MOOC videos.  They had an older Javascript book that was apparently pretty not great, but the internet tells me this is a good resource.  Then again, the internet also told me that Udacity, Treehouse, Udemy, and Codecademy were good resources, which to a point they were, but had a lot of room to grow.

I haven’t decided if I’ll keep dabbling on Treehouse for a bit or not.  After multiple lessons that I couldn’t put into practice, the slow pacing, and the seemingly limited breadth, I may have outgrown it.  The biggest reason for people to go to MOOCs instead of scouring the internet is because they want to save the time spent identifying resources to learn, what to learn, and sometimes the more personable approach to learning with a video lecturer.  A lot of MOOCs still seem to structure their content illogically (ex. HTML forms without any back-end knowledge to make it actually work placed in the middle of JavaScript lessons when no JavaScript is actually needed in order to use HTML forms), which is a good area to improve, and some focus more on having their students regurgitate information than practicing to mastery.  Udacity’s end of unit assignments, practice problems, and optional homework were great for independent practice, but often the quality of teaching dipped.  Treehouse also started having some independent practice exercises as I progressed, but the slow pacing caused me to treat everything like an independent practice exercise, which left me with a new content deficit.  Determining sequential, engaging curriculum is an area any education needs to firmly establish to help educate its students, let alone retain them.  Pacing, however, is usually more an indicator of who you’re trying to teach.

Hopefully my books + Google strategy will go well.  Otherwise CodeSchool has nearly all of the MEAN stack taught on their site, and that might be an appealing alternative.  So far, though, I’m a big fan of the book strategy.  …Don’t read near the end of my last blog post discussing coding resources where I said the same thing then shortly after changed my mind.

MOOCs (Treehouse, Udacity, Udemy, Codecademy, etc): A source of slooooow frustration to learn coding. Long live books!