Awesome email advice from a friend on how to learn programming.
Do not skip or skim words or communication of any kind. Don't read something assuming you know what it means; if you don't understand it, look around, ask someone, or google until you understand what you've just read. Then, you can move on.
The reason for this is that programming involves comprehension, not knowledge (more on that below).
Failure to follow this will make you a sucky programmer. You'll write buggy code. You'll piss yourself off when you think nobody wants to help you. Then, you'll end up really pissed because everything you thought you knew how to do falls apart, and you finally realize you're a bad programmer. This happened to me about 7yrs ago -- so, I'm trying to save you the trouble. After I realized this, and, after I learned how to program, not only did I quickly become very good but everything was 10 times easier and I enjoyed programming far more than I did before. Bad programming is exciting -- good programming is a party.
First, I want to tell you that learning a programming language and learning how to program aren't the same thing. A very simple metaphor to this is driving. You can learn how to drive, but, driving an automatic transmission sports car is completely different than driving a manual 18-wheeler. They both move on wheels and function the same, but, are very, very different. Also, if you were getting started, it would be easier to learn with a small automatic car than an 18-wheeler.
Programming and driving, however, are very different. Whereas driving is a mechanical task, which uses one part of your brain, programming is comprehension. When you're programming, you're not the driver, you are the mechanical engineer who invented fuel injectors, or the chemical engineer who invented run-flat tires. A programmer uses comprehension to write logic which instructs machines to create something material and useful.
The key when learning to program is that you create; bad programmers only know how to drive while good programmers know how spark plugs work.
So, I will share with you several things: 1) IMPORTANT: What NOT to do and why 2) How you should go about learning to program 3) About Java, Microsoft, and Enterprise 4) Failure and Practice 5) About Hacker News
1) IMPORTANT: What not to do and why Often, when we read sites, books, etc., we're interpreting what we're reading and creating a story (perception) or associating it with something we already know. No matter what you already know from previous experiences with computers, learning to program is new -- it's like learning how to write -- you know the letters, you've seen it all, but getting your hand to draw such concise letters, words, and sentences, is a completely new experience. This is how you should take in programming; coding should be elegant, concise, and flow. Programming isn't glueing things to form a collage or mocking what you've seen. Just as you can't pretend to speak in a foreign language, you should never write code unless you fundamentally know what it does.
There's a lot of crap out there. Rails, most of PHP, a lot of Java, and most of what Microsoft developers come up with are pieces of crap cobbled together to make something which somehow works. The problem is all the people who are SOOOOO excited and exuberant about their crap. Some things, like Rails, started out awesome and are crap now. Unfortunately, people forget that Rails is just a tool; instead, they use it as a crutch -- even though it's now very worn and rusty. Don't trust or use something just because it's popular -- chances are it sucks. By sucks, I mean, it bites you in the ass a lot and/or forces you to do stupid things which waste your time.
Which brings me to my next subject of Tools. There's a saying "when all you have is a hammer, everything looks like a nail". This is one of the many reasons you should learn a language FIRST and not do anything else first. Otherwise you will end up wondering wh...
32 comments
[ 3.9 ms ] story [ 72.5 ms ] thread"Want to write Android apps? Learn Java."
"About Java [...]. The way you're going to learn how to program is completely different than the world of Java [...]."
However, I can see how Rails "gets things done", and why so many people like it.
Perhaps the author came clear with his opinion a bit too hastily, but you shouldn't ignore someone just because you don't agree with every opinion he has. This was not an article about "why I don't like Rails", that's probably why he did not explain why he doesn't like it.
What comes to the article itself, I think it was decent and I don't agree 100% but not bad advice either.
Here we go with the "magic". It is not magic, it just code. Many people are just too lazy to investigate why things works the way they do, and how to change it when the defaults don't fit their needs.
Just for the record, you are wrong about naming conventions, they don't act as mandatory, you can use configuration methods to set up things the way you like it. E.g
Rails has many drawback points, I rather prefer Django views, than Rails, but all this "magic" conspiracy theory is just childish.I happen to like the "magic" aspect of Rails. The downside is that it does make Rails suitable for certain types of development and less so for things that fall outside of its paradigm. That's Ok, as long as you know that. Having said that, my app was actually OLAP, not OLTP, but I was able to extend the framework pretty well to do what I wanted, including working with legacy schemas. So it is more flexible than some give it credit for.
To me the real power isn't in Rails though, it's Ruby, which is the best programming language I've used, albeit extremely slow and inefficient. I haven't not used Python, so want to be clear I'm not making a Ruby v. Python claim.
This will be burdensome to many people in various scenarios, including one where you as an expert need to hold the hand of the new guy so that he can use the ORM effectively or one where you as the newcomer is attempting to learn the framework yet can't get anywhere because it does what Rails does - alot of hidden magic which you don't understand unless you go dig through the source or go to the forums to start asking questions.
Between then and now, I've learnt a lot of theory, and I think the key to good programming is just to keep applying what you learned to your software and to keep evolving.
Microsoft Languages and Frameworks don't suck. They made design decisions based off a lot of legacy stuff - they didn't have the luxury of being able to create a brand new SDK. The attempt they made (.NET) turned out pretty alright. The .NET languages and frameworks are pretty good and consistent.
Python is a good short start, equivalent to learning to develop with C on the console, but once you graduate this level, it becomes horribly limited. Making a GUI with python is a convoluted and painful process. So python may be suitable at the start, but one should quickly graduate into a native SDK for the platform you are working in.
And I don't think either of the two mobile SDKs is really well suited for beginners. There is a lot of non-language things to take care off when developing for mobile.
I personally think the best programming way is : C on the console -> .NET or Java. Those will give you a good grasp about what most programming is about and then you can specialise in whatever you want to do.
Also it's great to namedrop Hacker News, but I think he should also mention seeking advice from Stack Overflow or any of the Stack Exchanges. Trial and error is good, but if you're tearing your hair in frustration, it's always to get backup from a solid support community.
I think Python (or other high level languages) are a much better starting point. Python teaches you functions, expressions and objects in an easy flexible way so you can actually do something. C is more for understanding how things work. But if you can't do anything as a programmer yet, why would you care how things work?
At some point, any serious programmer must learn C and Assembly, as well as the internals of their computer, how the processor and the memory works. But before you are decent in writing programs with an easy language or two, you should just regard the implementation of the language and the computer as the "spirit of the computer".
Like most other things in coding, the right tool for the job will vary from person to person. Rails is probably not the best way to learn programming, but it does introduce a whole bunch of built-in best practices. PHP works for a lot of smart people and powers some big sites; it's an easy first language.
I've learned that there are lots of smart people out there & if they're willing to invest the time/effort and resources on something, chances are that it's probably got some kind of merit. To discount it as "crap" is the stuff of religion & holy wars.
I'd just say be open minded about things & remember that smart people often find different directions to come to the right answer. If it makes sense to you, go ahead and explore it -- even if it is "crap." It's hard to recognize the good without having encountered the not-so-good.
The Chrome dictionary extension is very helpful as well.
For me, I quite adore Ruby; I love it's expressiveness and flexibility and the way I can do all sorts of evil trickery with it. I derive more joy from writing in Ruby than I have from any other language I've used over the last 20 years. And Python, well... I have have great respect for it, and I see that many people get the same enjoyment from Python that I do from Ruby.
Telling people which (of the two) to choose is like (to use a very sexist analogy) pointing someone at a blonde and a redhead and saying "The Blonde is better". The Ruby/Python choice isn't a choice between better/worse; it's a preference like blond/redhead
Experienced programmers forget what it's like to be inexperienced. You need to generalise and don't dwell on the things you don't understand. Effectively, the only way to really learn how to programme is to do it because you enjoy it. As you pile on the experience, you'll learn everything you need to learn out of sheer curiosity. When you're experienced you DO want to understand every single line of code, because that's what interests you. As a beginner, the magic of seeing something come to life, even if you don't fully understand it is often enough. That's certainly how I felt when I started out all those years ago.
Rails is awesome too -- not least of all because 'Agile Web Development with Ruby on Rails' is one of the very best programming books written. It's actually readable. Rails is a fantastic tool that lets you to create first-class web applications without needing to know everything about the framework upfront. That means you get results fast, and you learn the details only when the time is right. You also learn some very valuable conventions to do with code organisation, testing, DRY etc that so many corporate programmers never seemed to have grasp (and are never going to be great programmers as a result).
Also, if you seriously want to learn, don't follow HN. Get programming and get in the zone. Every minute spent reading stuff like this is a minute lost.
Is this not true? I've been wanting to get back to Python recently so I'm genuinely curious if this is a good resource for someone who already knows how to program in another language.
I stopped reading at this point.
6) Engage the community and peers. You need to see how professionals do it, because otherwise you run the risk of develop in a vacuum and taking up weird habits and theories - becoming unorthodox.
I don't know how much my following analogy extends to the programming world, but I would like to point out that being an unorthodox programmer hurts you in team software environments, where there are norms that are assumed and implicit common ground that is assumed, which can be easily broken when one learns programming on their own (such as variable naming conventions, law of demeter, each method only doing one thing, etc. etc. best practices) and becomes confusing and ultimately harming productivity when working with other developers.
As an analogy this happens a lot with sports (golf, tennis, and boxing come to mind), where some people spend many hours and hours as a lone ranger on their own, driven by massive passion and inner fire to learn the sport in a vacuum, instead of seeking out a coach or professional guidance.
The result is they come out with skilled but unorthodox, and effective but arguably ultimately flawed methodology. You will get an occasional diamond in the rough for unorthodox boxing, golf, tennis who can compete at the world class, but for the most part they falter at the more... professional levels of competition.