Damnit, Codecademy, you're so close. As someone who had to bang their head against the wall for years to learn how to program, you're now doing a great job solving steps 2, 3, 4 and 5 (whereas before you did a great job solving steps 4 and 5). But for people starting out, the problem is that this is all still theoretical.
Sure, you are now actually building a project, but still only in this cute little console. What is a text editor? What is hosting? What does DNS mean? How can I make what I typed into my text editor show up on mydomain.com? What do I actually do with all of this HTML, CSS and JavaScript you're teaching me how to write?
"Let's build the airbnb website" is infinitely better than "this is a 'for loop in JavaScript,'" but it still doesn't solve the main problem of understanding how I can build technology. Solve that problem, and the motivation to learn to program goes up 10x, because all of the sudden it's real and it's live. Stop teaching us how to dick around in apps you built and teach us how to make something real.
What might be cool is to actually create a 'simulator' that puts people through the process of 'purchasing' a server, domain name, and through the actual server and DNS configuration up to the point where you can get a 'success' page on a server, then have them add some code and show them how all the files interact with each other.
Then teach them how to code the files.
Maybe after that something like a whole MEAN/LAMP stack development course. Personally I think the technologies used in MEAN are easier to understand and you can do a lot of neat things with angular in just a few lines of code. An interactive angular course would be really awesome. But people definitely need to know how to interact with a database. What would be nice would be to actually learn MEAN and LAMP side by side to actually understand the differences, but I guess that's diverging from the 'beginner friendly' approach.
thanks for all of this feedback. we're launching some stuff next week that will help you get even closer to realizing all of this -- it gets you out of the terminal (the main UX now for users) and explains a lot more about the concepts you're learning.
would love to hear your feedback when this goes live!
Since you're listening... I've emailed you guys before about a bug I found while working through your ruby module and hit radio silence at your contact@codecademy.com address.
It is like teaching someone to read and write: you teach the letters, how they sound, how they go together to form words and then phrases. And how to construct paragraphs and essays and etc. But you somehow forget to teach that in order to write you need a paper and a pencil. And if you want something more permanent you use a pen!
This is how I feel with the little knowledge about programming that I have. If someone sets everything up for me I can write the functions and they will perform as expected. But if someone give me a new computer I have almost no idea where to start.
I would spend about 4 hours coding the software to perform, let's say, a very basic ecommerce website, with menu, product pages, payment integration (with paypal) and stuff. But I would spent easy more than 10 hours to know where to upload the file, with which name, where to host, how to host, how to test in my computer, how to put in production, how to integrate it with a domain, etc.
Some context: I spent 4 months this year learning how to code using a lot Treehouse and Codecademy, reading Heads First C# and then Google+StackOverflown.
With all this help and a lot more from Visual Studio I was able to create a complete, functional web app hosted at Azure. But I can't say I can code, there are a few basic things I just don't understand. For example, I can't learn how to create a webapp based on a API. The basic rules of how ask for information from an API I understand, but I have no idea where to put it to make it work.
Wholeheartedly agree. This really strikes a chord with me, and it's the exactly problem I'm working to make a dent on.
Earlier this year I created a free course called the New Year of Coding [1] with the goal of helping anyone learn what they're doing and, more importantly, why things function in the way they do.
I'm attempting to tackle the problem at a larger scale with my upcoming book, Your First Web App [2], which will walk anyone through the entire process of creating a web app, from start to finish. The goal is for someone to be able to understand all of the pieces, starting with the text editor, the development environment, etc., and gradually working into the actual development, all the way explaining how everything fits together.
It's proven to be a great deal of work so far, but it sure is rewarding getting the "Hey! This is was super helpful! Thanks!" messages.
I wholeheartedly agree that building a project is many times more useful as a learning tool than little 'for loop' exercises, but completely disagree with the idea that you should be learning DNS/Hosting/Dev Tools as step 1.
These concepts/tools are important to learn eventually, but are not the core of building software. One of the great things about Codecademy is that it abstracts away all of the yak-shaving/ops work so you can dive into what is actually interesting. Obviously this approach can only take you so far, but from my experience[1], I can't think of anything that would motivate a prospective learner less than banging his/her head against the command line, googling cryptic error stack traces, for X hours just trying to get a dev environment setup, just to (finally) write your first line of code.
[1] Quick background: I'm a full time developer, completely self-taught (did the HTML/CSS, and basic JS track on Codecademy back in early 2012 before diving into The Hard Way series and Michael Hartl's book)
Hardly anybody teaches all that boring, infrastructure stuff, and it's a shame. Most web programmers I know can't provision a Unix server, and that's a shame too.
Some people call this stuff "system administration," "operations," or what-have-you. To me though, it's all programming. It's a decidedly more annoying and less glamorous aspect of programming. But it's so essential.
As the parent commenter said, HTML, CSS, and JS are useless without a place for them to live. That place consists of a properly configured Unix server, pointed to by a domain name. It takes a while to understand how it all works together. But at the very least, you need to be able to cargo cult it just to get your project off the ground.
Provisioning a Unix server is not programming. Programming, according to the dictionary is "The action or process of writing computer programs."
Deploying computer programs is, strictly speaking, separate from writing computer programs. With that said, it's certainly a skill that could be better covered by introductory texts.
A fair point. I guess I should have said: "it's all stuff a programmer has to do." It might not be programming proper, but it's part of the job, at least for many (most?) programmers.
We created One Month Rails to address specifically this problem.
It's all online and here are some of the lessons we teach: The command line, Setting up Github, Going online with Heroku, Registering a custom domain.
The idea is to show people how to build a simple Pinterest-like photosharing web app. We're going to be expanding that to include other web apps (like Airbnb and Reddit).
If you're interested @austenallred I can give you access and I'd love to hear your feedback. Email mattan at onemonth dot com
What you're looking for isn't "how to code", it's "how to architect". I'm unaware of any courses that go over the general structure of an entire solution, but that's the direction you want to take.
I agree, it would be infinitely useful to have a lesson on: "Okay this is where programming Python fits into the architecture of a website. Now that you're oriented in the world, let's learn how to program in Python."
I think a lot of the in-person classes do cover the entire ecosystem of the web, and how whatever the course is teaching fits into that.
I teach an Intro to Rails course with HackerYou in Toronto, and we certainly cover the web in general, how requests work and are interpreted by a browser, how to use a text editor, programming concepts in general, git, etc. I don't really think we're particularly unique in that regard, either.
I won't say we're absolutely comprehensive on all of these topics, but if the bar for "making a Rails site work" is that you've read SICP, configured your own Unix server, and can implement something in raw HTTP, we're essentially giving up on the notion of programming as something novices can do at all.
> I won't say we're absolutely comprehensive on all of these topics, but if the bar for
I think you're right not be comprehensive, trying to dig deep would be ridiculous. I think the parent is specifically looking to address the problem of teaching an abstract concept (programming, often through algorithms, data structures, object orientation, all extremely abstract things), which can be aided by some orientation of where the topics in the class reside in the larger concrete, applied space.
I remember when I was sitting in my first object-oriented programming class trying to figure out what all of the "objects" and "instances" were that the instructor was talking about. I didn't have the mental model to associate the groupings of code snippets on my page to "things" that could be manipulated and could "communicate" with each other. Once I was able to build that model, I was able to grok the concept of object composition, etc.
Years later after designing a few systems, I am able to construct large mental models and know where what I'm looking at at a given time (whether that be a database, business logic snippet, or HTML elements) lives in relation to the rest of the system.
It's far from essential to learning "how to program procedural code", but it's essential in building entire things, or even pieces that touch other parts of a whole.
Completely agree. I tried to learn HTML/CSS first, then Python, Ruby, then Rails. Needless to say, I didn't make any progress and was no closer to building out anything on my own.
It's an interesting balance between architecting an entire technology web app and understanding a programming language on a meta level. Most people learn from the ground up - i.e. syntax first, then simple commands..etc. No one starts by building the practical stuff and getting it to work before understanding the details.
I finally built an online food ordering site only after sitting down...and building an online food ordering site. I didn't try to learn Ruby, or Python, or Javascript. I just brute forced my way to getting a functional app. I googled a lot, trolled stackoverflow, debugged errors, nagged people for help, and ended up hacking together a Rails app.
Learning to build apps is different than learning to code. So why are we still learning it the same way?
I agree. I've struggled for years with programming. I would complete every Codecademy-like course or tutorial I could find, only to be left feeling as if I just learned how to go through the motions of programming. I always knew there was a significant void in my understanding that prevented me from both fully grasping the basic ideas underlying programming and making any meaningful progress. The cliche advice people had was "ok, now create your own project," which is much, much, much easier said than done for a beginner. I have a million projects I started and never finished because I got sick of just not understanding what I was doing. SO answers were utterly baffling and copying/pasting them got me nowhere. What is a data structure and why are they using that one? Why would one algorithm be better than another? And for web programming: What're the basic components of the internet? What are HTTP requests? What are all these protocols? How much should I know for the task at hand? It was so overwhelming. Thankfully I found a set of books that have been wonderful in methodically building my knowledge and skills.
There is so, so much more a beginner should be exposed to than for loops and cleverly slicing lists.
Edit:
For those asking for books/resources, here is what I would suggest to someone just starting out. I chose python for myself because I wanted a language with broad potential (ie web development to statistical and biological computation). It's absolutely critical that you complete every exercise provided.
There's an interactive website for "How to Think Like A Computer Scientist", it lets you edit and run code samples right there in the browser. Very convenient for beginners, I can't recommend it enough:
I agree wholeheartedly. I have tried over and over to get into programming and web building. I can go through the courses, retain some knowledge, but when it comes time to build something I'm lost. I feel too often these services focus too much on the middle, but not the beginning and end. As you said, understanding and learning about loops are important, but should not be the full focus.
For example the API stuff on Codecademy doesn't go into the full picture of how you build this into page. I have struggled mightily with understanding how the whole process works. I would love to find a service that walks me through building a page in Flask, hosting it and integrating it into APIs of popular services.
I felt like that, when i finished my first programmin course i was like, well how do i make something useful now? Because you know i could solve some Euler problems. Finally when i started to "get it" was simply when i started to do it.
E.g
You break your problem in pieces and start making something.
Wanna make a music player?
Well how do you play music oh theres a library that you call song.play, cool.
How do you read the tags?
How do you get the files? Isnt a playlist just an array?
And so on...
If a beginner does want to tackle SICP, I recommend they follow the MIT 6.001 lecture series on YouTube. It's much more manageable than simply diving into the text, but makes a great companion if you do want to keep up with all the exercises.
Granted, I'd recommend doing a L*THW or something before going to SICP, but you don't need a ton of programming experience to get something out of it.
People learning to code would be best advised to find a volunteer group who need code writing (even if they don't know they need code writing), or an open-source project. I agree learning to write code is only half the challenge, dealing with constraints like capacity, users, deadlines, hosting, stubborn colleagues, unsolvable problems it's easy to work-round or ignore with theoretical exercises. You only get those in a real-world job or real-world volunteer effort. The student may also find a mentor there.
You allude to the solution in your last sentence, but I think "find an open source project" is pretty bad advice for someone who is really brand new. Most open source projects have very ad-hoc project management. There is typically a big bucket of stuff that needs to be done, but very little direction on how to decide which things you can and should actually do. More experienced developers can go in and muddle around semi-blindly until they figure out a reasonable starting point, but that's really hard for less experienced people to do. It really takes a mentor willing to do that triage - "maybe this would be a good place for you to start" - but few open source projects seem to be forward-looking enough to provide that level of mentorship.
I'd go so far is to buy the time (through money or barter) of an existing senior web developer in your target language for 4-8 hours. There is nothing like pairing with someone who has already done this to get over so many of the introductory hurdles.
Got any book suggestions? I just started learning how to program about 6 months ago and personally JavaScript: The Definitive Guide, 6th Ed. was the first book that got through to me when it comes to Javascript and programming in general, but I feel I'm still lacking in other areas of web development.
Exactly. Each time I told myself "I'm going to learn to code!" it was because I had a specific project in mind I wanted to build. But each time I'd end up spending hours going through tutorials and exercises and not feel any closer to completing my project, so I gave up.
The first time I actually completed a project was when I built the website for my small business, cpustorage.com. I built it by starting with a Wordpress theme and continually tinkering with the HTML and CSS until I got the site where I wanted it to be, using Google to solve problems as I ran into them. This process resulted in more learning, it was more fulfilling and fun, and it actually led to the launch of a business.
Sure, you are now actually building a project, but still only in this cute little console. What is a text editor? What is hosting? What does DNS mean? How can I make what I typed into my text editor show up on mydomain.com? What do I actually do with all of this HTML, CSS and JavaScript you're teaching me how to write?
"Let's build the airbnb website" is infinitely better than "this is a 'for loop in JavaScript,'" but it still doesn't solve the main problem of understanding how I can build technology. Solve that problem, and the motivation to learn to program goes up 10x, because all of the sudden it's real and it's live. Stop teaching us how to dick around in apps you built and teach us how to make something real.