I’m not going to talk about my job because I’m feeling overwhelmingly burnt-out and wanting.
Otherwise, I’m spending a lot of time training for my first 50M race this spring and 100M beyond that. I love running; it is the one place where I am unreachable and have time to think in depth. I don’t even have to really think, as subjects just seem to bubble up subconsciously.
Also, reading and writing about all sorts of things. Practice in writing really does make a difference and I need to do more.
Awesome @du! Have you read “Born to Run”? I’ve read it the last two summers because it reminds of the pure joy you can feel when running. I’m planning to read “Finding Ultra” during the upcoming holiday.
Yeah, I think you have to read it; it’s the gateway drug for so many people. “Finding” is on my list too, I may have to bump it up a few spots.
Improving Rails and Ruby knowledge, including working on an app to cut-out the back and forth email when making e-introductions.
Personally, getting into Crossfit for most of 2012. Three fourths of the people are in better shape than me, but it’s about having fun and the benefits of staying active. Plus, I think more clearly when I stay active.
Day job working at Treehouse. On the side I’ve been working on open sourcing a CMS for podcasting and new features for my app, Scheduling (http://schedulingapp.com).
@jasonseifer – you’re videos at Treehouse are informative and entertaining!
Curious why people down-voted this article. Because it wasn’t technically-focused? Because it referenced a lobste.rs competitor, HN? Other?
I personally down-voted it for being off-topic. It’s not about Lobsters (meta tag), and it’s not really news.
(I just committed a change to the code so it shows you the reasons that your submitted stories downvoted, when they have any.)
Because who cares?
One of my rules of thumb for reading is: will learning this change any decision I make in the future? If not, is it successful entertainment?
How do you think he decided on which languages to support first? In this case, it was JavaScript, Clojure, and python.
Chris Granger is personally very invested in Clojure, and ClojureScript, so it was a given it would support Clojure and ClojureScript. Supporting ClojureScript effectively requires supporting JavaScript. Python has a huge developer community, possibly the biggest of the interpreted languages (outside of PHP, which is not hip), and even the best of the python IDEs sort of sucks, so there was a lot of support for it.
So basically he built it for himself, and python was an afterthought that was part of his kickstarter “reach” goal, to incentivize more people to buy in. Ruby would have been a reasonable alternative to python, but python’s syntax is simpler, and the development community is bigger. The biggest languages, like C++ and Java, are compiled, and so would not be good candidates for this.
I’m not sure if this was a factor in choosing javascript, but Bret Victor’s talk targeted JavaScript as one of the languages that could have a better development environment, so it was something people were already thinking about.
Programming Education. I got this.
I think the comment by @moses sums up the current theory about what people of the last 5 years think a good beginners' programming language is. I agree with probably none of them wholeheartedly, but I have indeed heard all of these notions over and over again. The only successful computer science curriculum for beginners I’ve seen scientifically measured is the one done by Harvey Mudd College where they present a combination of languages to exhibit theory first and practical application later. They also require all students to take the intro to CS course.
The post is biased toward people involved in the industry or aware of it in order to make decisions about learning a language that is immediately applicable. You don’t really need to do that to pick a beginning language, although you can certainly learn to code on-the-job, where such a choice is not up to you. Frankly, to properly learn how to program, it’s about intuition, and no one language is going to help you. If your goal is to be an expert programmer (is that a valid goal these days?), you’ll need fluency in at least 3 languages, so who cares which one is the first? You should not have to approach programming with the idea that you have to ‘know exactly what you want to do.’ People generally don’t have a project idea beforehand, although it would help.
If you are picking a language for somebody who has never programmed before and doesn’t know if they would like to, then the choice is critical. If they have a project goal, then some mentorship can choose the correct one, and then their learning is project based. You teach them arrays when they need arrays, etc. Mentors are rare, so how about self taught? They’ll fumble around, but eventually come to incorrect conclusions, and eventually somebody will correct them in some condescending manner, and they learn. If they do not have a goal, then essentially they need to follow programming as a study and learn from fundamentals onward.
So, about that classroom setting (or self-taught from a book/lecture videos/etc)? Well, the choice is no longer theirs, because they don’t know anything yet, so what is the best? If your goal as a teacher is to give the basic fundamentals, then you start with the machine itself, plus a little theory. Describe the bounds of what you can and cannot do. Describe what a Turning machine is. And then, after a few weeks, maybe you write some code. It doesn’t matter what the language is, because you’re at the point where you get to say ‘this is a written abstraction of that machine,’ because at the fundamental level, you must expose all magic by describing why such abstractions are necessary.
But, we need immediate feedback loops, they say. For some people that already know what they expect the computer to do, and know that it is not magic, this is good. Give them a REPL, and they can determine how best to complete a task. If they are not aware of the abstractions of a language, then you get to the point where such immediate interactions create the opportunity for somebody to simply try every combination they can think of and either 1) get the result they wanted, but do so accidentally, or 2) do not get the result and become frustrated that their idea of expressing something was not understood. You must demystify the idea that the language is not natural. That’s hard. The more expressive the language, the harder it is, dispelling the belief that this helps beginners as well.
We need a language that has a large community, they say. Well, that’s actually quite true. You see, in all of the time I’ve taught students and graded students and mentored students… there is one thing that is always true: the good ones cheat. They ask everybody around them to look at their code, to fix their code, to write their code for them. That’s against the rules where I taught, but whatever, it’s a good thing if they’re being interactive about it. And they usually will be because my written exams scare them.
What should we do as mentors, teachers, etc to promote people to learn to code?
To end, the notion that people learn programming to ‘become good programmers’ is a silly notion. That may be true to begin with (“I want to be a pirate!” —Guybrush Threepwood) but if you continue learning to code, that original motivation must change. It must mutate into some goal that is worthwhile to the person. You might originally want to be ‘good at drawing,’ but in the end you want to ‘create a work of art.’ Because at the end of the day, nobody is a good programmer, and certainly nobody is great. The better you are, the more you realize how bad you are. We eventually taper off to become eventually good at whatever we need to be eventually good at doing. And then we create worlds one insignificant piece at a time.
Thanks @wilkie for the thorough answer. I especially enjoyed the #1-#6 list in regards to what mentors/teachers should do.
You should write this up as a post as it would be helpful to others.
So would you argue it’s better to not have a REPL? I feel like I current use good REPLs like bpython as learning tools for myself, which is probably why I like them. It seems like your argument is that REPLs can be discouraging because they encourage constant, random experimentation, without first teaching students to think carefully about what they do.
I found that I didn’t learn properly how to think before doing until I wrote a lot of multithreaded code and took an Android hacking course, where kernel compilation + loading the android emulator + loading the code onto the emulator + running the code took fifteen minutes to an hour. I feel like, “A week’s worth of hacking can often save an hour’s worth of careful design and planning” is an advanced topic, although I could be biased because of my own education.
I feel like the most compelling way to present Turing machines is, “You know everything you now know how to do with X (powerful programming language)? Well, you could do it all with just a Turing machine.” Presenting Turing machines as being the explanation for what computers can do seems bounding, and like it will make students underestimate computers, because I certainly underestimated Turing machines when I first read The Diamond Age. Have you had good experiences with this method of explanation?
Also, what language is sufficiently weak enough, and has a long enough feedback loop for you? I personally like Karel—it’s compiled, so you can learn from the compilation errors and its feedback loop isn’t too fast. Furthermore, it’s not at all expressive, the problems are very clearly defined, and you can visually see results without resorting to printlns, which feel sort of primitive.
I teach Ruby and Rails professionally, and also volunteer and teach to kids. We do use a REPL, but some people find switching between the two ‘modes’ a bit confusing, so we generally only use it to introduce the most elementary concepts. As soon as you’re writing methods, switch to a file.
But for the first few hours, it’s great.
@steveklabnik – where do you teach Ruby and Rails professionally? Do you mean to students or working alongside other developers?
http://jumpstartlab.com/ , and volunteer with http://codenow.org/.
Do you mean to students or working alongside other developers?
We have a variety of clients. Sometimes it’s basic Ruby and testing to QA teams, sometimes it’s intermediate Rails for Java devs, sometimes it’s advanced Rails topics with existing, experienced Rubyists.
We also did all the instruction and curriculum development for Hungry Academy in partnership with Living Social. We’ll be running http://www.gschool.it/ next year, as well.
I try!
(also: http://rubyheroes.com/heroes , haha!)
Mental masturbation is fun and all, but when all is said and done, developing a culture of shipping is one of the most important things you can do.
I have to keep pushing myself to focus on results/building/shipping. I tend to get bogged down in theory of why is something a certain way and 20 minutes later I’ll find myself deeper into an issue than when I started, sometimes with less understanding than when I started.
The truth is, it doesn’t really matter what your first language is if your aspiration is to become a good programmer.
Learning to program well is something that transcends languages and platforms. Usually a community will focus on a specific aspect of solving the problems you typically solve with the language, and pretty much all of them have something to teach you. Even if they don’t, the language will.
But your first language probably shouldn’t be INTERCAL.
I think that this makes sense under the assumption that learning a programming language is hard. But after you’ve learned your first programming language, you find that the next is orders of magnitude easier. Really, it’s just understanding the concepts that underly it that are hard. Really, for your first programming language, you want a good language for beginners that will teach you the concepts well, not necessarily the most powerful or expressive ones, or the ones that will still be relevant in the future, or is even relevant today.
I think that your first three points are on the mark, but the fourth is off.
When it comes down to it, I would probably recommend python as a first programming language under this criterion, because it presents a “right” way of doing things, but is also extremely powerful and flexible. It is useful in many different problem domains, and has very good libraries. Ruby is also like this, but it is TMTOWTDI, which I think is not great in a first programming language.
Short feedback loop is very important. Use an interpreted language. It doesn’t really matter which one. Anything with a REPL. You can learn patience another time. Python, ruby, php, lisp, all have very short feedback loops.
Something with a big stackoverflow community. Python, ruby, php, java, c, etc. Easy to look up.
Future Relevance: learning a language isn’t a big investment after you already know one, so this is not important.
I used to think that it was important for a first language to be low level, so that you can appreciate what the computer is doing for you, but now I think it’s more important for it to be expressive, but not magical, so that you can understand the concepts, but don’t get discouraged by seeing too much of the metal.
“After you’ve learned your first programming language…” is a massive barrier entry. With no scientific data, I was guess 9 out of 10 people who at least casually try to learn to program, ultimately fail – just a guess.
My final decision was a choice between python and Ruby. The deciding factor was two-fold: access to director mentorship (smart rationale) and I saw Ruby all-around in the tech startups I worked with (not-so-smart rationale).
Right. I know that the first programming language is hard. My argument is that the first one doesn’t matter, except that it should be easy to learn. If you go in depth in Karel, or Logo, or Alice, that’s probably good enough, despite how weak/useless the languages are. If you have a million different possibilities, and they all have different difficulties, but then after doing one of them, any one of them at its real difficulty, all the others are one hundredth as difficult as their nominal difficulties, you would choose the easiest one, because the difficulty of learning a good learning language, and then any other, harder, but maybe more useful language, will be easier than just learning the harder language.
I used to think that Ruby on Rails was a great tool for building your first web application. In 2008 it was what I used to get my first app off the ground. But either it has changed too much or I have changed to the point where I no longer believe Rails is the best educational tool.
Rails' magic can be useful, and it’s certainly “cute” in a lot of ways. But when you tell beginners that naming things a certain way or putting a file in a particular location will make their app “just work” without explaining what’s going on you do them a disservice. A perhaps unintended consequence of “convention over configuration” is that all programs start to look like configuration when you stick with all the conventions.
RailsGirls has been demonstrating the opposite, lately. While it’s true that you have to skim over some things to get started, the power of having SOMETHING up at the end of the day is super-motivating. Rails + Heroku lets you do that.
There’s nothing particularly special about Rails in that regard though. Sinatra and Heroku would let you do that. PHP and Heroku would let you do that. Python and AppEngine would let you do that. And you’d probably know a little bit more about HTTP afterwards too.
No, Sinatra forces you to do too much low-level work; it’s why Ruby is better than C, for example, even though you don’t know quite as much about how CPUs work, you get something going, which is better motivation for most beginners.
This is something I had to un-learn, as I tend to be a bottom-up kinda learner. Most people are top-down.
We’ll have to agree to disagree. I guess the only way I can really prove that my belief is accurate is to develop a web application training course built on Sinatra that is just as easy and fun as getting started with Rails. That actually sounds like a pretty fun project.
I will say this though. I think even though you know that Sinatra requires “low-level” work, to a beginner it’s all low level work. If you tell someone to put a line in a routes file, put a controller in the controllers dir, and then put a template in the views directory, to a beginner that’s no more or less “low-level” than telling him or her to put a template in the public dir, and then write “get ‘/’ { erb :index }” in their Sinatra app file.
That’s fine. I do Ruby and Rails training professionally, as well as volunteer, and discuss these things with many people that do. Empirically, according to our collective experiences, you are wrong. But I don’t have any studies for you, so we’ll just have to leave it as competing anecdata.
Is that because Sinatra doesn’t have generators? Otherwise the beginner webapp you’d build (build reddit in a day!) would not differ much between the two frameworks. That lack of robustness, by intuition, should be more appropriate for a beginner setting (if you’re teaching process and not specifically trying to teach rails) to introduce the concepts. That said, I’d say you probably do want to add something to Sinatra to make it appropriate for beginners, but you’d not have to add much, and if one agrees with that point then what would that addition be?
Yes, generators help quite a bit. Not only do they accelerate the pace of getting something going, the code they spit out is inherently correct; which means a lot less syntax error style stuff at first. Especially given the fact that you’re generating Ruby, JS, CSS, and HTML.
I haven’t fully given it a ton of thought, I just know I’ve seen much greater success with rails-based courses, and it seems to be predicated on the speed that you see some sort of useful result.
@amb, I still think Rails is a good educational tool (in my limited experience). The value of getting something built provides that first “programming high” and drives you to want to keep chasing that high by learning and building more.
Having said that, I’ve experienced that the out-of-the-box functionality of Rails is a blessing and curse. I discussed it in a Ruby Rogues Ruby Nuby video. It makes Rails very powerful and also confusing when you need to understand the nitty gritty functionality.
I’m not saying Rails isn’t a good educational tool. It is certainly working for a lot of people. But to determine whether it is good or not we need to decide what the goal of this education is.
I am suggesting it is not the best tool to teach “programming.” It is a pretty good tool for teaching “web application development,” although I have disagreements with the way most curricula are built using it. So much of what you do when setting up a Rails app, at least the way “beginners” are told to, is stuff like “change the value in this YAML file” and “run this generator.” That’s not programming.
I’ve volunteered as an instructor at a few RailsBridge (http://workshops.railsbridge.org/) events and I really dislike how little people are actually understanding about what’s going on, because damn isn’t it just so easy to put some pretty pictures on the screen, i.e. “get up and running.” In order to get through the material, I have to wave my hands way too much for my comfort.
Anyway I don’t have anything better to recommend at the moment, but I am now seriously considering putting together some material based on Sinatra.
Unless we’re talking about traditional educational systems, where students are required (forced) to learn fundamentals, I don’t think others in my situation would have the stamina/desire/interest if they didn’t get to build and interact with programming immediately.
To use an analogy, I could learn everything about wind patterns, kite design, and forces before ever going to fly a kite, But, would I have the drive to do so if I’ve never even felt what it feels like to fly one? I think we need that tangible feedback to drive further exploration and learning, when it comes to programming.
No one is arguing that letting people see the results of what they’re building quickly is bad. However, in most sciences, the fundamentals are extremely important. @amb isn’t advocating constructing the natural numbers from the Peano axioms. He is advocating teaching how to add before how to multiply.
I’m glad to see @andrewkkirk documenting this process. For many of us the time spent learning to program is a distant memory, and I think another look at the process, even through someone else eyes, can be enlightening.
yay bugs! reported: https://github.com/jcs/lobsters/issues/35#issuecomment-10081541
It’s been fun to write and see the feedback. It’s amazing how developers can’t really remember the beginning. It’s become so ingrained that they “just kinda do it”.
Thanks @rob and @steveklabnik!
Here I was missing out on all these thumbs up. @steveklabnik
Interesting stuff. I’m new to Ruby and Rails and find videos helpful, so nice work.
First, the full screen is a bit too much to take in visually. I would zoom in more, as this could help with video quality issues. Second, I don’t the unscripted nature is bad. Yes, you can tell when you see a more finished, polished move (cuts, transitions) as seen on Treehouse, but that doesn’t appear to be what you’re going for. I think the quick, natural nature of your videos work fine.
One content suggestion, as noob I’m looking for content that’s one step above Rails 101. There are too many options when it comes to tutorials on building that first app with scaffold. I need the Rails 102 (or 201?) class. -How do I start with TDD and Test:Unit? -How do I build advanced associations/relationships between my models? -How do I create views that are not explicitly created by scaffold, but aren’t necessarily static?
Good luck!
Thanks! OK, I’ll look into doing a part of my screen instead. If I can get my act together, I’m doing MiniTest (the Test:Unit replacement in rails 4) next episode.
And I’ll be rebuilding this app, but using some more TDD focus. I didn’t even talk about tests in this episode.
The focus on this is to eventually bring it to a full blown blogging platform using things like Omniauth, CanCan, paperclip for image uploads, etc. AKA, it will be something I’ll use to replace my octopress based blog, assuming I’m able to complete everything.
Good stuff. I’m new and self-taught Rails developer. Always looking for articles from the same perspective.
This seams like a pretty simple interpretation of genetic makeup. Wouldn’t a well-funded genetic mapping startup have done this same analysis?
I think that 23andme is a well-funded genetic mapping startup. The problem for this guy was that 23andme was wrong. Not all code is going to be right all of the time—bugs are pretty much inevitable, because humans make mistakes. For this kind of bug, you might want to have better testing infrastructure to avoid this kind of unhappy experience though.
If you’re saying, “Shouldn’t he have just gone to a genetic mapping startup, and if there isn’t one, why not?”
Most genetic mapping startups have bootstrapping problems, because they don’t have that many copies of the human genome. So they need to also provide the service of sequencing your DNA. 23andme and Counsyl both do this, and then also provide the mapping service.
There isn’t much of a use case for a mapping service separate from a sequencing service, unless you had a system to get deeper insight into a DNA sequence, or else it was very inexpensive/mandatory to get your DNA sequenced.
About the only use case would be, “I was told I have(/don’t have) this disease, but I want a second opinion.” Which seems very niche.