Language Learner Looks for Leads in Learning?
zanzibar asks: "I learned C in a college course, I learned C++ and Java from books, and I learned Rails from blogs. I'm not convinced one of these methods was more effective than the others. I want to know what other readers think about technical education. What do they want to learn and how do they want it delivered? What do they like about their options today (from college coursework to Wikiversity)? What's missing? What just doesn't work?"
Cute alliteration headline, n'est-ce pas? Useless, though, ya Looser.
Lack of Lisp and Logo in the List of Languages that Language Learner has Learned is Lame! :)
to look long at loquacious lexicons lengthening learning luminosity.
Take the cheese to sickbay, the doctor should see it as soon as possible - B'Elanna Torres, "Learning Curve"
What do they want to learn and how do they want it delivered? What do they like about their options today (from college coursework to Wikiversity)? What's missing? What just doesn't work?"
In my personal experience, classrooms that were structured were one of the best methods for me. In the end though, the best way to learn is to practice, which may be why the structure of the classroom was most effective for me. Learning from books is my second suggestion, as when I try to learn from an online source, I tend to get distracted... too many links and other areas to explore.
I know this subject has been talked about many times before on slashdot, and the general consensus is that discipline can keep this from affecting you, but with ADD and a daily overdose of caffeine, the discipline falls by the wayside when I see something shiny (oooo a 14 line ruby rss aggregator!).
So what works for me? If I'm not in a classroom, I work from a laptop and a book... with the wireless turned off. It's the only way to enforce the discipline I need.
Your sig(k) has been stolen. There is a puff of smoke!
Once you learn one language (self taught or in school) you should be able to teach yourself any other. What I didn't like about college was being forced to attend class to pass. (where the silly professor taught from power point slides.) And I really hated in-class tests where I had to write code with pen on paper. Projects are the best way to learn.
Did you really learn from blogs or books, or was it the practical application on some project that taught you what you know?
http://en.wikipedia.org/wiki/Jury_nullification
After you've learned a half dozen or so languages it doesn't really matter how you learn a language. You often don't need to learn a languge to, say, modify a program written in it, so long as you have the reference by your elbow.
I'd recommend reading the reference documentation which defines the language, then doing some non-trivial maintenance on some real code written in that language. You shouldn't need the programming 101 stuff, and as often as not that stuff imprints bad habits (e.g. sql injection in PHP). Ideally you would work on a first class example of top notch code, then maybe work on some not so stellar ones, to get an idea of what is good and what is bad about the language.
Learning a language is a trivial exercise once you have a few similar ones under your belt. The toughest thing is learning the environment the programs are supposed to run in. Anybody who can program in some C like programming language can learn to program in Java in a few days. It takes months to wrap your brain around J2EE.
On the languge front, you really want to learn master several different paradigms or models. If you program Java, it doesn't make sense to worry very much about C#. What you really want is to learn a set of languages that "think" different ways. For example: Java, Prolog, SQL, Lisp, and something really primitive like assembler. Knowing different models for expressing your ideas will help.
After that, it's a long nasty slog through learning platforms, frameworks and APIs. If the biggest problem in my professional life was learning new languages, then I'd be very happy. It would mean that I would have only my own hubris and fallibilty to have to deal with.
Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
It's not what language you know. It's about knowing how to solve a problem independent of any language, and then using the language that best solves the problem.
Just keep learning languages for new ideas to express things, but don't keep learning languages thinking that you're going to end up learning The Language, that conquers them all. That language doesn't exist, and it likely never ever will.
WARNING! This girl exceeds the MAXIMUM SAFE standards established by the FDA for BRATTINESS
I personally learn languages by simply firing them up and fiddling about.
:)
Of course, a book is a good idea to learn from, but you learn fastest by simply starting to code.
I wrote a Windoze-Version of the 1985 Mac game 'ChipWits' (see sig) in Delphi, and now plan to learn C# by simply rewriting that game. Immediate usage is probably by far the quickest way
Free PC version of ChipWits at http://www.breueronline.de/klaus/chipwits/
I just got my CS degree and let me tell you, once you've been through a class in Scheme and Prolog and enough theory, you'll just simply start seeing all languages as trivial when it comes to their details. They are, actually, so trivial that you won't even bother dirtying your hands actually implementing anything in them, although you could, if you wanted to. There are better things for a superior mind to do, though. Such is the Tao of Computer Science.
I want to play Free Market with a drowning Libertarian.
Don't waste time learning a lot of computer languages. Pick one or two, learn them well, learn their standard libraries, write programs in them, and read/maintain other people's code. Spend most of your time focusing on concepts that generalize to all programming.
Knowing about design patterns is useful in any language. The intricacies of C++ template programming are not. If I say "That's a singleton", people will know what I'm talking about whether the code is written in Ruby, C++, Java, or Cobol.
Once or twice a year, spend some time learning about a language you don't know. Try to understand how it's different than the language you normally use, and more importantly *why*. Look at example code and code from open source projects and try to emulate their code with your code. For example, Ruby will let you open a file, read and process each line in a while loop, then close the file. But the "ruby way" of doing it is to pass a code block to the file's "each_line" method.
After you understand the syntax and the strengths of the new language, and the idioms used by the language, decide what you like, and what you don't. Then figure out how you can apply the new things in the language you regularly use.
Maybe not
I also used to think that way: "After you've learned a few, learning more is all the same".
I knew BASIC, C, Pascal, 80x86 assembler, C++, VB...
A look was enough to learn PHP, Python, Lua or any other of many languages that I learned for a single project and forgot.
The easiest to learn was Ruby, but it had a catch: it introduced me to the world of languages that aren't as easy to learn.
You see, learning PHP when you know C and VB is trivial because they're practically dialects of the same execution model. That's why when you learn another one, it doesn't feel like you actually learned something.
Learning LISP was like learning to program all over again.
Brainfuck too.
I still haven't found myself in Smalltalk (I have problems with trying to do too much too soon - I can write simple programs, but the GUI systems, both MVC and Morphic, I couldn't fit my foot in).
I'm still dreaming of looking at APL, but I already know that it will be something TOTALLY different and mind expanding, with all the beautiful function math there.
SonOfLilit
Someone in our office was aiming
to learn C, C++ & - maybe - Java,
a few years ago.
For some reason, they signed up
for a Carnegie course at Adelaide
TAFE (Adelaide, South Australia).
They were FORBIDDEN from taking C
ie, until they'd completed C++
A "we know better than thee" at-
titude (blamed, by Adelaide TAFE,
on a contract they'd signed with
[Carnegie Institute?], which laid
out the course, for local folks
to teach... with - apparently -
took the reigns from the local
"zomies"...).
Why take a superset language C++
before its core sub-language (C)?
At least, one ought to have the
choice, by virtue of:
"The Paying Customer
is "always" right."
Why an educational institude
would sign any agreement, that
would "tie their hands" - as
Adelaide TAFE claimed theirs did...
surely beats me. Go figure...
I probably focused too heavily on languages in the original post.
What about technology in general: networking, security, architecture, programming languages, libraries, testing, operating systems, analysis and design, distributed computing, concurrent programming, artificial intelligence, algorithms.
From the parts of the thread I've read, I suggest that hands-on experience (practice) is essential to learn how to do any of these things well. But what about the content? What the best was to learn about these technologies (with the idea that you're going to use them)?
>"...What's missing?..." ...
a plug and learning like Neo in Matrix
P.S. I know that it will take the fun out, but we can always learn the traditional way.
As has been mentioned, once you've learned a few languages -- and learned how to use them well -- you can learn any language. Once you undertand that here are various flavors of data, and how to put them to use, once you understand separation of presentation and business logic -- whether that's OO or not -- when you know enough to understand that there are better/best practices, that different concepts apply to different situations, it simply becomes a matter of syntax and structure. I tend to prefer to dive into a new language -- I have a problem to solve, so I get my environment set up, and I start writing. First thing I do is probably check the web to get a clue on syntax. Sometimes that means language/API docs, sometimes forums, sometimes enthusiast web pages or blogs, or something article-based like 4GuysFromRolla. If I find I need, or want, to learn more than I can get from the web, then it's time to buy a book.
... professional environments with a local guru are excellent, but the past few years, that guru as tended to be me. I'm thinking of diving back into Java, however, as I now work in an environment with a lot of hardcore Java people (I'm primarily a .NET enterprsie engineer myself.) I've also given some thought to, finally, getting around to picking up COBOL, as we also have a 15ish year old mainframe application that uses VSAM for storage, and a team of highly skilled, old school COBOLers. In order to understand structures and rules within the database, I need to grok COBOL. I'll probably get a hold of some COBOL source, walk though the corresponding green screens, look up or ask about stuff I don't understand, and simply immerse myself.
Class learning environments, however, are virtually useless to me. I tend to get bored and antsy. Lab environments were OK, but not great
I am, therefore you think.
I've taken classes in which programming languages were taught, and I've read books teaching programming languages and various web resources. But these are just ways of conveying facts about a language into your mind. The best way to really learn how to use a programming language is to use it.
If you're sharp, you can memorize the syntax of a language by inhaling reference manuals, and that's great! But to really KNOW the language in a meaningful way, you have to write programs in it.
To comment a bit on another topic brought up in this discussion... many "popular" languages are reasonably similar. C/C++/Java/C#... it would likely do you good to learn languages in a totally different "paradigm"... learn some Lisp, and some Ocaml, and some Python, and maybe even some assembly language. Learn them (i.e., use them) until you feel you really "get" the language. Why? Because languages really are just formality on top of general principles. The wider variety of languages you learn, the better you can understand the core principles... which do not change from language to language.
As others have pointed out, languages don't really matter, esp. after you've learned more than siblings (C and C++, C++ and Java, you get the idea).
Standard libraries and the correct way to 'think' in each language, e.g., when to use anonymous inner classes instead of standalone classes in java, that's where you can start writing real applications that won't make other maintainers winch... and that takes time. Minimum 6 months so you don't trip on your own feet, and you may not really know how to use the language and standard libraries well for several years.
How to get from here to there? Look for 'cookbooks' and the discussion forums that seem to have good reputations. (For instance, 'javaranch' for java.) Look at lots of sample code, try different things. Unfortunately a lot of people have found one thing that solved a relatively simple problem and now try to apply it everywhere, and they're the most vocal in knowing THE way to program in that language.
For every complex problem there is an answer that is clear, simple, and wrong. -- H L Mencken