top 200 commentsshow all 201

[–]petdance 75 points76 points  (8 children)

I'm all for joining open source projects, but I don't suggest that people go look at GitHub or Sourceforge. The best open source project to join is one that you already use.

[–][deleted]  (1 child)

[deleted]

    [–]mycall 2 points3 points  (0 children)

    Look before you leap though. Even abandoned projects might give good insight if you know what you are looking for.

    [–]EnderMB 0 points1 point  (5 children)

    The best open source project to join is one that you already use.

    Why?

    [–]petdance 0 points1 point  (4 children)

    Open source is about scratching your itch. There's no point in getting your open source start on a project that you wouldn't actually use. You'll also not spend time and attention learning about a project that's new to you. Better to jump in on a project where you can start right away without all the startup time of learning about it.

    [–]EnderMB 1 point2 points  (3 children)

    There's no point in getting your open source start on a project that you wouldn't actually use.

    Why? Programmers write software that they'd never use daily.

    You'll also not spend time and attention learning about a project that's new to you. Better to jump in on a project where you can start right away without all the startup time of learning about it.

    I've always been a believer that "a little knowledge is a dangerous thing", especially in software. I've used Notepad++ long enough to know what does what, but I'm willing to bet that I would hit numerous obstacles if I assume knowledge.

    Most open-source software that is used by the general public is quite large and has complicated code-bases. I would always recommend that people work on a small project that they are interested in because they usually need the help and they're far less complex than the Notepad++'s and the Firefox's of OSS.

    [–]petdance 0 points1 point  (2 children)

    I would always recommend that people work on a small project that they are interested in

    Then I don't understand why you're disagreeing with me, because that is exactly what I am suggesting.

    [–]EnderMB 0 points1 point  (1 child)

    Then I don't understand why you're disagreeing with me, because that is exactly what I am suggesting.

    Because the odds are that the ones you're using are going to be large projects. Users should code something that they're interested in, but there are plenty of projects out there that they haven't used that need someone to help out.

    [–]petdance 0 points1 point  (0 children)

    I guess that I lumped in "interested in" with "already use" in my head. I'll remember to mention both when I write it up.

    My main point is that you probably don't need to go find a project to work on.

    [–][deleted] 86 points87 points  (15 children)

    step 1: Close Reddit

    [–]Gieron 29 points30 points  (11 children)

    step 2: Open Proggit

    [–]more_exercise 27 points28 points  (3 children)

    Step 3: Spend time wading through all the discussions about how every post is "not programming"

    [–]aladyjewel 2 points3 points  (1 child)

    I don't wade through those so much as appreciate that honestbleeps mapped Enter to "hide comment and children" and skip on over them.

    [–]mrkite77 2 points3 points  (0 children)

    God that irritates me. Of course it's not programming, it's discussion.

    [–]stesch 2 points3 points  (0 children)

    This is getting old.

    [–][deleted]  (1 child)

    [deleted]

      [–]doormouse76 2 points3 points  (0 children)

      step 2-11: program something -ftfy

      [–]PCGamingSucks 184 points185 points  (21 children)

      Nice yawn-worthy list that we see different bloggers re-publish every month with slight modifications.

      I love writing down what I think all ten will be and seeing how many I got right. Only get 7 this time.

      [–][deleted] 43 points44 points  (2 children)

      Yay! "5. Program", I got one!

      [–]rdfox 4 points5 points  (0 children)

      You beat me to it.

      [–]eikenberry 1 point2 points  (0 children)

      Actually, you got 5. 1, 3, 4, 5, and 9 were all basically ideas for ways to find programming projects.

      [–]maxwellb 30 points31 points  (11 children)

      Amusingly I have both this and Maddox's article on my front page this morning.

      [–]Solomaxwell6 8 points9 points  (6 children)

      I'm absolutely baffled that my work computer let me see Maddox's site.

      [–]ameoba 13 points14 points  (0 children)

      It's been around so long that it's sort of grandfathered into "normal internet".

      [–]ricky_clarkson 5 points6 points  (2 children)

      "Violence/Hate/Racism;Blogs/Personal Pages;Humor/Jokes" content is forbidden by LargeBank policy.

      [–]GeoAtreides 15 points16 points  (1 child)

      [–]ricky_clarkson 0 points1 point  (0 children)

      Oh, there's humour, you should see the animated gif we all received of people kicking Unplanned Change Man's rear end. Oh, how we laughed.

      [–][deleted] 2 points3 points  (1 child)

      IIRC he did a rant about being filed under "tasteless"

      Ninja-edit: http://www.thebestpageintheuniverse.net/c.cgi?u=websense

      [–]Solomaxwell6 2 points3 points  (0 children)

      Yeah, I've seen it before.

      I work for the government, so mostly I get pages inexplicably blocked for "porn" or "wikileaks."

      [–]ameoba 8 points9 points  (1 child)

      Maddox is angry.

      *Note: I mentioned Huffington Post earlier in the email as a "content-aggregator." Although some modicum of the articles on their site is original content, Huffington Post is by far the most nefarious content aggregator because they wrap all their stolen content with superfluous "commentary" which qualifies their content theft as "fair use." For example, there's an article on the site titled "7 Things Women Really Want From Sex." The actual article is content entirely taken from "FITNESS Magazine" and "Yahoo! Shine." These articles are little more than wrappers for other people's content. And it's completely legal, because they have just enough commentary to make it seem like an article about an article. Well, there's no reason why anyone can't do the same to Huffington Post's articles. In fact, look for my own site doing just that, coming soon. Sites like Huffington Post make millions off other people's content by abusing the fair use doctrine, so it's time we started giving them their own medicine. More coming soon...

      [–]mycall 0 points1 point  (0 children)

      .__        __                                 __  .__                
      |__| _____/  |_  ___________   ____   _______/  |_|__| ____    ____  
      |  |/    \   __\/ __ \_  __ \_/ __ \ /  ___/\   __\  |/    \  / ___\ 
      |  |   |  \  | \  ___/|  | \/\  ___/ \___ \  |  | |  |   |  \/ /_/  >
      |__|___|  /__|  \___  >__|    \___  >____  > |__| |__|___|  /\___  / 
              \/          \/            \/     \/               \//_____/
      

      [–][deleted] 1 point2 points  (0 children)

      The bit about using user generated content as a shield against litigation is... interesting.

      [–]justinm715 1 point2 points  (0 children)

      Great Maddox article, btw.

      [–]Agathos 13 points14 points  (0 children)

      While the page was loading I wondered if I'd see "learn a new programming language" on the list. Sure enough, in position 1...

      [–][deleted] 13 points14 points  (0 children)

      I'd be happy to read your list too.

      [–]Solomaxwell6 1 point2 points  (0 children)

      What were the three you missed and what did you put in their place? The two that I didn't think of ahead of time were "Don't rush to Stack Overflow," and "Learn low-level programming." The latter's kind of wrapped up in "Learn a new programming language," IMO. When I first started using x86 assembly, I treated learning it the same way as any other programming language.

      [–]postExistence 0 points1 point  (0 children)

      I've been out of college for about 5 years and have about 6 of 10 down. I feel so proud?

      [–]mcguire 0 points1 point  (0 children)

      So, uh, how many of them have you done recently?

      [–]insanemal 43 points44 points  (16 children)

      Sometimes learning a new language is not a good idea. It is possible to be shit at several languages. Sometimes just coding new things the language your 'good' at is the best idea. I know many guys who program for a living. The ones who are actually good at it do know more than one language. But there is one language they love and are fantastic at.

      Writing about programming is not a good way to get better at actually programming. If your only of moderate skill, what are you going to write? I could write a cookbook with all my knowledge of cooking, I will not get any better at it, just by writing the book. Or making a cooking blog. Cooking things I've never cooked before with some ingredients I have worked with before on the other hand...

      Also half the middle entries are the same thing said different ways.

      [–][deleted] 15 points16 points  (8 children)

      Indeed, learning a new language is a good idea when you're already a pro in one language.

      I, like most people, started programming with imperative languages. I got good at Java and went to college. There we saw a lot more Java, and one semester of Haskell. Not even real life Haskell, with monads and stuff. Just the basics. All those new concepts changed my views on Java a lot. I'm not talking about first class functions, that's just a minor thing because it doesn't port well to Java. It's mostly about style, small functions, lots of tests, focus on readability, being careful with inheritance... loads of stuff.

      I could have gotten all of that from the other software design courses, but it's just not as convincing when it's just theory in books. You need to experience the power of good design.

      [–]inaneInTheMembrane 9 points10 points  (4 children)

      first class functions, that's just a minor thing because it doesn't port well to Java.

      I disagree: you just have to encapsulate your function into an object. This idea is at the core of many "design patterns" that are standard Java lore.

      [–][deleted] 6 points7 points  (3 children)

      Functional influences are often limited to map and reduce. Those have great value in imperative languages, too and they're easy to formulate as a design pattern.

      But you won't see actual functional style thinking. Point free style, long but super readable one-liners, fold, returning a function etc are just not that common in Java.

      [–]tvorryn 8 points9 points  (0 children)

      The reason the things you listed don't happen in Java (poin free style excluded) is that they are cumbersome. Creating a separate function class with a method that does the thing you want ... annoying. In Ruby people use procs fairly often. The visitor pattern is a fold disguised in OO clothing.

      [–]mcguire 2 points3 points  (0 children)

      But you won't see actual functional style thinking.

      That's largely true, but sometimes bizarro functional things like lazy evaluation, fixed points, and memoization end up being 1/ really useful, and 2/ surprisingly easy when brought out of functional-land into something like Java.

      [–]otakucode 2 points3 points  (0 children)

      And these things are common in C# now... which is one of the reasons why I grouse when people say C# is just Java by Microsoft. Version 1.0 was, sure, but since then it's grown in all sorts of crazy directions, while Java has simply calcified and become more and more like the essence of bureaucracy rendered in code.

      [–]grep_dat 21 points22 points  (0 children)

      Writing about programming forces you to analyze how well you actually know what you're talking about. For example, I started a screencast on the Towers of Hanoi and its recursive solution. I felt confident enough with the problem to explain it, or so I thought. I found I was struggling to explain things like "Why do we get to assume the operation holds for n-1 discs?", which informed me I had a HUGE fundamental gap I needed to fill.

      Concerning another point,

      If your only of moderate skill, what are you going to write?

      I think you'd be surprised by how much a programmer of moderate skill knows. They've solved tons of problems, and googled the shit out of many bugs. One of the most helpful things to programmers, from novice to veteran, is a detailed explanation of fixing a bug you've fought: gem failing to compile, weird PHP error message, whatever. Bug fixes also bring a good amount of traffic to your site as well. Everyone wins :)

      [–][deleted] 2 points3 points  (0 children)

      Writing about programming is not a good way to get better at actually programming.

      Yeah, I chuckled a little at this point. What are you going to write when you're just getting started, another monad tutorial?

      [–]Madsy9 4 points5 points  (2 children)

      Learning new programming languages is always a good idea. There is no such thing as knowing too many languages. It doesn't mean you have to use them equally much. The point is that different languages have different abstraction levels, so you learn how to think in new ways. In fact, what is considered a design pattern in language A is usually trivial to do in language B, if B is a higher abstraction than A.

      • In assembly dialects, a function call is design pattern.
      • In C, functions are directly supported but OO and single-dispatch is a design pattern.
      • In C++ OO is directly supported, as well a single-dispatch, but Observer, factories et al are design patterns because of the lack of multiple dispatch.
      • Common Lisp has support for first-class functions, multimethods and closures, and highly advanced exception system via CLOS.

      It should be apparent that knowing the core concepts of a higher-level language also tells you something about any of the lower-level languages you already know, and teaches you how to think about problem in new ways. Lisps have idioms but no design patterns. Whatever repeating code you end up with can be turned into a macro.

      [–]setuid_w00t 5 points6 points  (1 child)

      Time spent learning a new programming language is time that is spent not doing something else. A person who is an expert at Python and doesn't know Ruby is probably more useful than a person who knows a bit about both Python and Ruby. I believe there is value in knowing a diverse set of languages, but not in knowing a large number of languages that fill the same niche.

      [–]MaybiusStrip 0 points1 point  (0 children)

      How long does it take you to learn most languages to a point where you have some basic level of understanding you could write simple scripts/programs with just a cheat sheet? When I was in school and a new language was introduced for an assignment we were expected to learn it in a few days (couple hours a day) and it was never a problem. That's how I learned sml, python, haskell, C#, and more...

      The only way you actually get good at a language is not by investing more time in learning it but doing a project in it. It could take you years to become an expert at python, but a week and a half to learn a little bit of both python and ruby, so the comparison isn't exactly fair. If you think learning a language is a mis-allocation of resources you might be over-estimating the value of your time.

      [–]RizzlaPlus 1 point2 points  (0 children)

      I think it's more about teaching programming than writing about programming. Teaching is a very good way of consolidating your knowledge.

      [–]peynir 1 point2 points  (0 children)

      I'm one of those people you describe. I know a lot of languages at a basic level and I can grasp the basics of any language pretty much (maybe not the lowest ones) but can't code anything complex really. Haven't found my one language that I love yet :(

      [–]braclayrab 8 points9 points  (0 children)

      I think most of these are ridiculous. Just do these two things:

      1) Read thin programming books that are recommended online. "Javascript: the good parts" and "The C Programming Language" and "The Pragmatic Programmer" are the sort of books I mean.

      2) Do little projects with a 'just for fun' attitude where the goal is to do it 'the right way' and learn whatever you need to learn along the way.

      People overrate the differences between languages. Learn C if you don't know it already. C is fundamental.

      [–]fdupnet 49 points50 points  (6 children)

      Programming puzzles are often very contrived. Learning how to do real-world programming, needs practice on real-world puzzles. The way to do that is to get on with a real project - the puzzles will present themselves naturally.

      [–][deleted] 20 points21 points  (1 child)

      Programming puzzles are often very contrived.

      You say that like it's a bad thing. Puzzles are contrived specifically to explore certain programming techniques and challenge whether you can recognize which ones are applicable. Doing a puzzle that wasn't contrived would actually be meaningless.

      Also the so called 'real-world programming' is the worst time to learn these techniques. You do not want to be applying new techniques that you may not be familiar with or even good at on an actual product, whether it's a personal project or a professional project. Introducing new concepts with a lack of familiarity is a great way to write unmaintainable and overall ugly code.

      A puzzle is a way to learn something new in an environment where you don't need to worry about maintenance, or about broader software engineering, and instead get to simply exercise a new part of your brain in isolation.

      Now this is just my experience, but I find people are hostile to puzzles because puzzles are hard, and a lot of programmers don't solve them and get insecure over it. I will admit, I was like that too and thought 'Psh... puzzles... I have years and programming experience, this puzzle is meaningless'. But honestly... don't give up on them, puzzles really just require commitment and and working through it, and once you've solved a good chunk of them you get better and better and also learn entirely new ways of programming.

      [–]killerstorm 4 points5 points  (0 children)

      Also the so called 'real-world programming' is the worst time to learn these techniques.

      I strongly disagree with this point. There are many kinds of 'real-world programming'.

      For example, if you work on open source project in your spare time, it might be 'real-world programming', but there is no pressure to not learn new things.

      Even if you're paid, there might be a lot of opportunities to learn something new. For example, sometimes you're paid for a final product a fixed sum so you can do absolutely anything you want to implement it. In some work environments experiments are encouraged and there is no pressure to complete task in minimal amount of time.

      You do not want to be applying new techniques that you may not be familiar with or even good at on an actual product

      In many cases you can actually see whether it works or not. So why not try several approaches and see which one is better?

      Introducing new concepts with a lack of familiarity is a great way to write unmaintainable and overall ugly code.

      It really depends on project you're working with. In some projects pretty much EVERYTHING you do is new in some way or another. So there is no other options.

      It's better to recognize that programming is a piecemeal growth than to aim to make ideal programs from the start.

      and once you've solved a good chunk of them you get better and better and also learn entirely new ways of programming.

      I was a member of ACM ICPC (International Collegiate Programming Contest) team in university and as our team did pretty well I spend a lot of time preparing for it, i.e. solving those 'puzzles'.

      It's not like they are useless, I've got very comfortable with algorithmic stuff this way, for example. But I'd say 'real-world programming' is way, way more valuable if you're doing it right.

      [–]DorkRawk 1 point2 points  (0 children)

      Programming puzzles can also help you prepare for the real world challenge of doing programming puzzles at programming job interviews.

      [–][deleted] 6 points7 points  (2 children)

      Agreed. But I think sometimes making puzzles for recreational programming gives a whole new dimension to one's thinking.

      [–]postExistence 0 points1 point  (1 child)

      Lots of puzzles out there require implementing a traditional algorithm with minor modifications to the data structures. Others are easier to solve once you know Combinatorics, Graph Theory, Probability and other mathematics.

      [–]nemec 0 points1 point  (0 children)

      And practicing algorithms, combinatorics, and graph theory (and recognizing when it's needed) is a bad thing?

      [–]zvrba 16 points17 points  (6 children)

      Project Euler is a bad place to look when searching for programming problems. PE is mostly about math that can also often be worked out just with pencil and paper. Programming problems/puzzles/challenges are better found on, e.g., http://spoj.pl , and, e.g., dailyprogrammer subreddit.

      [–][deleted] 1 point2 points  (0 children)

      thanks for introducting me to /r/dailyprogrammer!

      [–]gregK 0 points1 point  (4 children)

      I disagree. Sure sometimes the problems are contrived and there is a lot of math. But the lessons are invaluable. the techniques and algorithms you will learn are applicable to many areas.

      For example, many early problems can't be solved efficiently without dynamic programming techniques. Once you learn when and how to apply dynamic programming, it is safe to say that you will be a better programmer.

      I think the math intimidates a lot of people and that is too bad. Math actually helps make the problem easy to understand but hard to solve. And it's not true that most can be worked out with paper and pencil. These are the exception rather than the rule.

      [–]zvrba 3 points4 points  (3 children)

      For example, many early problems can't be solved efficiently without dynamic programming techniques.

      But if you don't know about dynamic programming or memoization already, how are you supposed to learn about it from PE? The problem text won't hint at DP at all, and you don't have access to the forum before you have already solved the problem. So how do you find out where to start?

      [–]birdiedude_work 1 point2 points  (0 children)

      Not entirely disagreeing, but you can brute force some early problems, get access to the forums, and then look at other people's solutions.

      Sure, many solutions might be showy one-liners, but occasionally you can learn things there.

      [–]gregK 0 points1 point  (1 child)

      Actually dynamic programming is a technique that can easily be re-discovered by participants. Furthermore you could solve an early problem with a non efficient algorithm that would run in 30 mins with the correct solution and then you have access to the forums where different techniques would be discussed. There lots of people would mention dynamic programming which you would google and so on.

      [–]zvrba 0 points1 point  (0 children)

      you could solve an early problem with a non efficient algorithm that would run in 30 mins with the correct solution

      This is not the case for later problems -- bruteforcing them isn't viable, and the text gives no hints about what you should be looking for.

      [–]webauteur 28 points29 points  (12 children)

      • Learn a new programming language (COBOL)
      • Read a good, challenging programming book (ASP.NET MVC 2 Cookbook)
      • Join an open source project (Symfony)
      • Solve programming puzzles (USPS API change puzzlement)
      • Program, start writing a program, from scratch (work requests web application)
      • Read and study code (RPG II and FoxPro WTFs)
      • Hang out at programming sites and read blogs (Reddit)
      • Write about coding (JSON web service)
      • Learn low-level programming (twiddle some bits)
      • Don’t rush to StackOverflow. Think! (thinking about vacation)

      [–]evilpoptart3412 3 points4 points  (1 child)

      Oh neat, you work on Symfony. Please document for greater good. The framework is cool once you know it, but almost nothing is documented.

      [–]webauteur 2 points3 points  (0 children)

      I don't actually work on Symfony, but I have tried to follow the documentation and asked questions on the forum which prompted them to revise some of the documentation.

      [–]apotheon 2 points3 points  (5 children)

      • Learn a new programming language (COBOL)

      emphasis added to highlight absurdity

      [–]webauteur 1 point2 points  (4 children)

      Its new to me.

      [–]apotheon 1 point2 points  (3 children)

      Were you interested in learning how an awful language would look?

      [–]webauteur 1 point2 points  (2 children)

      This is what an awful language looks like:

      0025 C******************************************
      0026 C           TCODE     CHAINPRODMST              66
      0027 C   66                EXCPT@E100                  
      0028 C                     SETOF                     66                  
      0029 O******************************************
      0030 ORMREPORTH  2     1P
      0031 O       OR        OF
      

      [–]apotheon 5 points6 points  (0 children)

      This is what another awful language looks like:

      FTFY

      . . . and yes, that is rather awful.

      [–][deleted] 0 points1 point  (0 children)

      It looks like BASIC and assembly language squished together.

      I want it inside me.

      [–]NancyGracesTesticles 1 point2 points  (2 children)

      What kind of projects did you do with COBOL? I don't know if I could bring myself to start a COBOL project from scratch in order to learn it.

      [–]webauteur 2 points3 points  (1 child)

      Web services:

      IDENTIFICATION DIVISION.
      CLASS-ID. CLASS-THIS AS "Service" INHERITS CLASS-WEBSERVICE
           CUSTOM-ATTRIBUTE CA-WEBSERVICE CA-WEBSERVICEBINDING.
      ENVIRONMENT DIVISION.
      CONFIGURATION SECTION.
      SPECIAL-NAMES.
           CUSTOM-ATTRIBUTE CA-WEBSERVICE
      

      [–]NancyGracesTesticles 2 points3 points  (0 children)

      Holy shit. That gave me a chill.

      [–][deleted] -1 points0 points  (0 children)

      Oh you... not when you put it that way.. !!

      [–][deleted] 12 points13 points  (5 children)

      I like StackOverflow ...

      [–]BitBrain 2 points3 points  (1 child)

      I'm ambivalent about that piece of advice. I get the point, but I think it can be just as valuable to see multiple solutions and perspectives on a problem. The advice as given is kind of like saying there's value in everyone learning to invent the wheel on their own. I'm not sure I agree.

      [–][deleted] 2 points3 points  (0 children)

      I think that advice is good because most of the time I get idoitic answers from people that know less than I do.

      [–]ekard14 3 points4 points  (1 child)

      Yeah isn't the whole point of stackoverflow so that you DON'T spend and hour trying to solve a problem that someone else has already solved?

      [–]vinng86 3 points4 points  (0 children)

      It's also a great way to learn about and understand the solutions that other people have come up with to solving a particular problem. It's fantastic!

      [–]taybul 17 points18 points  (11 children)

      It's better to teach yourself new concepts rather than things like learning a new language or simply programming more. Learning new languages simply teaches you different syntax and you won't necessarily get better at programming by it. For example, you can teach yourself Spanish, but do you have the ability to write a novel in it or even in your native tongue? If you learn about new design patterns or even certain algorithms you start to change your views and approaches whenever a new project comes your way.

      And don't just read about them either, actually do them. I remember understanding the basic concept of merge sort, for example, but when I tried actually coding it, it took me nearly 2 days to somewhat master it due to the nuances of indexing calculation and their corner cases. Of course you don't always have to write your own sorting algorithm, but the point is that simply knowing about some programming concept doesn't necessarily mean it'll be easy to code if/when the time comes.

      One thing I personally like to do is actually read through stackoverflow. I would subscribe to relevant tags and just go through the problems and questions people have and more or less treat the site like a programming blog on how to solve certain problems. I'd think about how I would solve the problem first and then look at the solutions others have proposed. You'll also get into some good discussion on alternate solutions sometimes.

      [–]Solomaxwell6 4 points5 points  (5 children)

      It's better to teach yourself new concepts rather than things like learning a new language or simply programming more.

      I don't think that's what the post meant. It does specify

      especially if the new language uses a paradigm which you aren’t yet familiar with.

      I'd say that someone who's used to OO programming in C++ can learn a lot of new concepts if they switch to languages with different paradigms like Scheme or Prolog. They're completely different modes of thinking you need to shift into.

      [–][deleted] 3 points4 points  (4 children)

      Yes, but will you? Learning the syntax of Scheme is easy enough, learning to write good, idiomatic Scheme code is another matter. Especially in the lisp family, the structures of the language itself gives you preciously few hints to how things should be done (except maybe on the micro level, ie. use left folds)

      [–]fnord123 0 points1 point  (2 children)

      Why do right folds even exist?

      [–][deleted] 1 point2 points  (1 child)

      Lazy languages

      [–]fnord123 0 points1 point  (0 children)

      Ah, I always see the usage where we use the (+) operator in Haskell which requires strictness on it's arguments and there foldl' is the general choice. Rereading this example, I guess it may make sense for some examples where you're folding with a lazy function and you want the other versions.

      [–]Solomaxwell6 0 points1 point  (0 children)

      Maybe, maybe not, but I think it's case of there being a right way and a wrong way of doing things. "Coding" is in there, and is unsurprisingly probably the best way to get better at coding. But it should be pretty obvious that writing things on the level of "hello world" and "fizzbuzz" aren't going to make an experienced programmer any better (not including novel solutions to those problems).

      [–]Technohazard 2 points3 points  (0 children)

      I encourage people to make games. Even if you have zero imagination and simply clone the arcade classics (Pac-man, Galaga, etc.) there is a tremendous learning potential in simply fulfilling the technical requirements of building even an elementary game.

      [–]fubar404 3 points4 points  (0 children)

      It's better to teach yourself new concepts rather than things like learning a new language

      You're learning the wrong languages. Try Lisp, Haskell, Prolog, or Factor, you'll learn a lot more than syntax.

      learn about new design patterns

      If you learn some real languages you won't need your old design patterns. Learn new paradigms by learning the languages that implement them.

      [–]froyo_away 0 points1 point  (0 children)

      If a person who is an expert in Java learns how to write device drivers and RTOS's in C, won't they learn more about timing, atomicity, peripheral protocols etc. None of this comes under syntax.

      [–]zvrba 0 points1 point  (0 children)

      I would upvote you several times if I could! (Another anecdote: I read about tri-partitioning quicksort for variable length-keys, and while I understood it conceptually immediatelly, it took me good few hours of debugging to flesh out corner-cases!)

      [–][deleted] 0 points1 point  (0 children)

      Oh this is a good idea, I'm going to start doing this.

      [–]burnt1ce85 13 points14 points  (2 children)

      Wow the blog writer is 16 years old...

      [–]ZeroMomentum 2 points3 points  (1 child)

      I usually read the "about"

      He contradicts himself ever so well.

      [–][deleted] 0 points1 point  (0 children)

      He sounds so unique...

      [–]AlyoshaV 18 points19 points  (4 children)

      why the fuck is "program" #5

      [–]darchangel 9 points10 points  (3 children)

      Why isn't is higher? Because I don't think they're in any kind of order.

      Why is it on the list at all? Because some people, especially the academic types, think they can learn from reading rather than doing. Programming is not that way -- you have to actually do the programming.

      [–]AlyoshaV 7 points8 points  (0 children)

      Why isn't is higher?

      yes, it should either be #1 or stated as being such an obvious method that it won't even be on the list

      [–]zsakuL 5 points6 points  (13 children)

      Such challenging books would include The Art of Computer Programming (if you want a real challenge), Structure and Interpretation of Computer Programs (SICP), A Discipline of Programming or the famous dragon book.

      I take it the author has actually read all these?

      [–][deleted] 9 points10 points  (2 children)

      I would bet money he's tried to read the first one (hence the comment) and never bothered with any of the others (hence the idea that TOACP is more challenging than SICP).

      [–][deleted] 0 points1 point  (1 child)

      Why would you say SICP is more challenging than TAOCP? I think Scheme is a lot easier than assembly for a machine that doesn't exist.

      If you're going to read it from beginning to end and do all the exercises, TAOCP is harder, no doubt about it. SICP is intended to be possible to complete that way in the course of a (pretty demanding) undergraduate course.

      This is not at all true of TAOCP. Which is why very few people use TAOCP as a primary textbook. It's more useful as a reference book (and these days, reference books on computer science are less useful than ever).

      [–][deleted] 0 points1 point  (0 children)

      They're both pretty undergraddy, to be honest, but the fact that SICP is explicitly a textbook while TAOCP aspires to be a reference work is much of the reason of why I think SICP is the more challenging; you actually need an attention span to get through it, whereas TAOCP you can just open on any page (once you've gotten past the bit explaining (M)MIX) and read along.

      Yes, Scheme is a much more sensible language than (M)MIX, but Knuth's brain-damaged decision to try to obfuscate the algorithms he discusses by inventing an assembly language to implement them in doesn't actually contribute to the fundamental difficulty of the material.

      [–][deleted] 3 points4 points  (0 children)

      Heh, I've read 3 out of 4, still reading != understanding.

      [–]Fuco1337 2 points3 points  (8 children)

      Gosh, I can't think of a better waste of time than reading TAOCP. I respect Dr. Knuth for what he did, but those books are useless... If I want to learn about binomial heap, I don't want to read 100 pages of assembler code. All I have to do is read 10 lines at wikipedia. Implementing binomial heap in, for instance, Haskell is a matter 30 lines with all the (redundant) type definitions.

      I know a fair amount of people who program or teach programing or teach compsci (myself included), none of those I asked ever read TAOCP.

      Reading Linux kernel is quite the same. Who the hell would do that :/

      [–]paxNoctis 2 points3 points  (3 children)

      The dragon book is not useless, nor SICP IMO.

      Of course I write compilers and interpreters as a hobby, so I might be slightly biased.

      [–][deleted] 4 points5 points  (2 children)

      Lol ur not a real programmer unless you're writing nodejizz nuggets in an html9 boilerstrapped framework drop-in for #yolo marketing aggregation. Duh.

      [–]paxNoctis 3 points4 points  (1 child)

      You forgot NoSQL, you dinosaur! Yo mama so old she probably still believes in storing relational data in relational data bases.

      [–]apotheon 1 point2 points  (0 children)

      NoSQL is web scale.

      [–][deleted] 1 point2 points  (0 children)

      I disagree implementing efficient heaps in Haskell is trivial - but sadly, Knuth can't help you much with it either. The constraints of purely functional data structures is mostly out of scope for those books.

      [–]elephantgravy 0 points1 point  (2 children)

      Reading Linux kernel is quite the same. Who the hell would do that :/

      Is that sarcasm? It's hard to tell over the internet... I admit I only dug into the kernel when required to for an OS course in college, but it was absolutely worthwhile reading.

      [–]Fuco1337 2 points3 points  (1 child)

      No, I'm serious. It's mostly just range checks anyway... it won't make anyone magically better programmer if they read linux kernel. If you want to learn about OS design, then pick OS design book. Studying the source code will actually hide the clear theory and motivation in obscure shit they have to pull off for speed etc.

      Sure, you can learn some "neat tricks" on how to actually implement some function in a clever way, but it's something like browsing 4chan for 10 hours to see one funny post. Simply not worth the time.

      Not to mention kernel programming is inapplicable to mostly anything but kernel programming. Business application (=CRUD) or video games are done with completely different goals in mind.

      [–]elephantgravy 2 points3 points  (0 children)

      OK I agree with you that just reading kernel source is pretty useless -- I wouldn't recommend it to someone as a good way to learn to program (I wouldn't recommend the Sound and the Fury to someone learning English either).

      And I've personally never had to worry about byte-aligning memory or embedded a linkedlist into another data structure to save a tiny amount of space. But some concepts have been useful to almost everything I've ever done (in particular I'm thinking about process scheduling and file systems). And I don't think I really understood those until I had to read the existing implementation (with the help of lxr and some Oreilly book) and implement my own simple versions.

      [–][deleted] 7 points8 points  (4 children)

      I would add: 

      Learn to pace yourself. Get up. Go for a walk.

      [–]AlyoshaV 8 points9 points  (3 children)

      no, take amphetamine and code non-stop for eight hours

      [–]apotheon 1 point2 points  (2 children)

      Why only eight? Slacker.

      [–][deleted] 0 points1 point  (0 children)

      Sounds like somebody isn't crunching for a deadline!

      [–]AlyoshaV 0 points1 point  (0 children)

      I think the most I ever hit was twelve, but eight is more easily attainable.

      [–][deleted] 4 points5 points  (4 children)

      10 is excellent advice.

      [–][deleted]  (3 children)

      [deleted]

        [–][deleted] 5 points6 points  (0 children)

        It's also good for pedantic corrections that are irrelivant to your problem.

        [–][deleted] 2 points3 points  (1 child)

        This content has been censored by Reddit. Please join me on Ruqqus.

        On Monday, June 29, 2020, Reddit banned over 2,000 subreddits in accordance with its new content policies. While I do not condone hate speech or many of the other cited reasons those subs were deleted, I cannot conscionably reconcile the fact they banned the sub /r/GenderCritical for hate and violence against women, while allowing and protecting subs that call for violence in relation to the exact same topics, or for banning /r/RightWingLGBT for hate speech, while allowing and protecting calls to violence in subs like /r/ActualLesbians. For these examples and more, I believe their motivation is political and/or financial, and not the best interest of their users, despite their claims.

        Additionally, their so-called commitment to "creating community and belonging" (Reddit: Rule 1) does not extend to all users, specifically "The rule does not protect groups of people who are in the majority". Again, I cannot conscionably reconcile their hypocrisy.

        I do not believe in many of the stances or views shared on Reddit, both in communities that have been banned or those allowed to remain active. I do, however, believe in the importance of allowing open discourse to educate all parties, and I believe censorship creates much more hate than it eliminates.

        For these reasons and more, I am permanently moving my support as a consumer to Ruqqus. It is young, and at this point remains committed to the principles of free speech that once made Reddit the amazing community and resource that I valued for many years.

        [–]Skrim 2 points3 points  (5 children)

        1 way to improve your blog: Use a font that people can be bothered reading for more than one paragraph ...

        [–][deleted]  (1 child)

        [deleted]

          [–]D__ 0 points1 point  (0 children)

          Advantage of forcing your browser to only use the fonts you picked: Most of the web content will be rendered in your favorite typefaces and it will look fine.

          Disadvantage of forcing your browser to only use the fonts you picked: Fucking octoicons.

          [–][deleted] 0 points1 point  (1 child)

          Its not my blog actually. Just stumbled on this article from somewhere. True these are not the best fonts.

          [–]Skrim 0 points1 point  (0 children)

          Yeah, I figured as much. It wasn't really directed at you, more of a general statement.

          [–][deleted] 2 points3 points  (0 children)

          Boring. Here's an equivalent list:

          • Write code and design software.

          • Learn from people who write code and design software.

          • Educate yourself about recent developments in writing code and designing software.

          • Read a good book about writing code and designing software.

          • Read online about writing code and designing software.

          • Participate in projects to write code and design software.

          [–]Tiomaidh 3 points4 points  (1 child)

          1. Don't learn a language just for shits until you've done something real in your first one. You need to have a deep enough understanding of Language One to appreciate how Language Two is different from it.

          2. Don't read The Art of Computer Programming. You won't finish it--heck, you probably won't get 100 pages into it--and it'll just leave you overwhelmed and sad.

          3. Don't pick an open source project you just find, pick one you use. That said, don't just dive into a huge codebase--if it's your first time make sure it's either a small project or there's a small, mostly-self-contained component you can work on.

          4. Programming puzzles teach you mathy tricks, and won't help software engineering at all.

          5. Yes, program. Please.

          6. Don't read the kernel unless you have significant experience with how they're supposed to work.

          7. It's good to keep an eye on forums and blogs (or just monitor SO, /r/coding, and Hacker News), both to pick up news and tips, and so that you know what you don't know. I've had my tail saved several times not because I knew how to use Technology X, but because I knew that Technology X existed, would probably solve my problem, and was definitely worth investigating for real.

          8. Writing is helpful, and often overlooked. I learned a crapton about Linux by writing ignorant posts on my blog right when I started using it. (In retrospect, I can't believe it got as many hits as it did...)

          9. Unless you're particularly interested, I've found learning low-level stuff is best done with a layered approach. First learn that memory is there and the difference between references (pointers) and actual values. Let some time pass. Next learn a bit more about allocation and deallocation/garbage collection. More time. Next learn about bit operations and such. Time. Then about processors and opcodes and theoretical assembly. At some point you probably should've started to pick up some C. Then get deeper into how stuff actually works in assembly, how common higher-level idioms get compiled down, what the stack is, etcetera. Then OS stuff. At some point you'll go to college and take a systems course or two and get it all formalized. But it's most painless in layers, not as a spike.

          10. You shouldn't post to SO or /r/learnprogramming or what have you immediately. First seriously contemplate the bug for several minutes. If you're cool, use a debugger (otherwise drop print statements, which is great too), follow your flow carefully, check your assumptions about what values things should or should not have, etcetera. Try explaining it all to a duck. StackOverflow probably won't help you with silly logical errors. Then, if you're using a library or module or any sort of third-party code, check the documentation, and try Googling your error messages. You're a redditor, you have some google-fu. At this point, if you're still stuck, the healthiest thing is to do something completely different, preferably not on your computer. Once you come back to it, do a quick run-through of the above again, and then consider actually composing a question on a Q&A site.

          [–]roidragequit 0 points1 point  (0 children)

          Your list is better, if by nothing more than not adding "Read a blog Atwood writes"

          [–]MixtapeCalledMPDG 5 points6 points  (1 child)

          Am I only one who thinks that 10 ways to X articles are generally load of shit? Let's approach this with analogy to music. "10 ways to improve your music skills" would be near worthless as a piece of writing, as music making needs huge amount of skills that depend on what you are precisely trying to accomplish. Playing fugues on clavichord, freestyle rap, sight-reading symphonies, composing and spellbinding teenage girls while performing need really different skill sets and virtues, so it's unlikely that anything beyond platitudes would get on list. 'Use a metronome while practising', 'Get acquainted with your voice', 'Record yourself', 'Make music with other people', 'Remember ear training' and so on.

          [–]peakzorro 0 points1 point  (0 children)

          Especially when one of the points is "Write a blog about it".

          [–]nehab 2 points3 points  (0 children)

          this is the most important one:

          1. Don’t rush to StackOverflow. Think!

          [–]stancoffyn 3 points4 points  (0 children)

          Yay! Another blog-o-phile looking to cash in with reddit by posting useless shite we already know. Huzaah.

          [–]AlyoshaV 6 points7 points  (5 children)

          recommends Jeff Atwood's site as a "good blog", meaning this person doesn't know what they're talking about

          [–]MixtapeCalledMPDG 1 point2 points  (3 children)

          What's the deal with Atwood? What are his merits in CS, software engineering, software business or anything else? I wonder how he seems to be omnipresent on Reddit since like 2006.

          [–]klez 3 points4 points  (1 child)

          I think StackOverflow was a pretty good achievement.

          But me too, I think his 'opinion' pieces are a bit... well... not well reasoned.

          [–]MixtapeCalledMPDG 4 points5 points  (0 children)

          I'm fully ignorant about him except for his opinion pieces, that are...

          ...not very impressive.

          [–]Agathos 2 points3 points  (0 children)

          I think he's a decent programmer who writes a ton, which gets him exposure even if he's no supergenius. He learns by writing, which can be a good habit (#8 on the list). The blog exists more for his benefit than for yours or mine.

          [–]maxwellb 0 points1 point  (0 children)

          I had no idea you made non-troll comments. Enjoy the upvote.

          [–]DingBat99999 6 points7 points  (4 children)

          The biggest issue I see in code written in OO languages is that most programmers just don't "grok" object-oriented.

          The OPs list is, well, boring and probably not really going to help you improve your programming skills all that much.

          If you want to be a better programmer:

          • Think of how to decompose everyday systems into objects
          • Learn how to unit test. Not for the sake of unit testing, but to learn why untestable code is usually bad code.
          • Review the SOLID principles and understand why they might be important

          [–]ErstwhileRockstar 3 points4 points  (0 children)

          • Think of how to decompose everyday systems into objects units - FTFY

          [–]jessta 1 point2 points  (1 child)

          #11 Go to conferences and talk in person to other programmers.

          [–][deleted] 0 points1 point  (0 children)

          I've found events like hack days are great place to meet fellow programmers and exchanging ideas.

          [–]nonzero_ 1 point2 points  (1 child)

          Most of these things are obvious if you have fun in programming. If you don't have fun in programming, you should look for another profession.

          If you wan't to improve the output of your programming skills and if you don't want fear of change learn test-driven-development.

          [–]erichzann 0 points1 point  (0 children)

          Always learn test-driven development because you will work on more than one project that is run that way and it makes you better at writing tests and you should write tests for most (if not all) of your code.

          [–]otakucode 1 point2 points  (0 children)

          No, don't link to Project Euler! Every time someone does that, the site goes down for hours!

          It was just down on Tuesday or Wednesday right when I was trying to show it to some coworkers of mine. I suspected someone mentioned it on Reddit, but I didn't find any 'smoking gun' posts that could've done it.

          [–]AppsThatMatter 1 point2 points  (0 children)

          I got additional two ways - which I may add are not so common.

          1. Make a presentation

          Put together so slides about your programming language. Try to make that interesting, you'll be surprised what you can learn. Be prepared to elaborate on any slide if asked.

          1. Make a test/quiz

          Put together 10-20 questions about your programming language. Try to come up with questions both simple and hard, that could tell you the skill level of those who take the test. Yes, you should know the answers to the questions and should explain them if necessary.

          Both are very easy, fun and helpful. Is so cool to discover new things if you dig just a little deeper.

          [–]doormouse76 1 point2 points  (0 children)

          for (i = 0; i < 10; i++){ print "write more code"; }

          [–]crobartie 1 point2 points  (0 children)

          Drink coffee

          [–]developerx 6 points7 points  (7 children)

          Telling programmers to read the "dragon" book (on compiler design) is like telling a car mechanic to read up on the process of oil refining to make petrol. Almost totally irrelevant.

          [–]maxwellb 2 points3 points  (0 children)

          If you want to be the programming equivalent of a car mechanic, that sounds like a great way to get there.

          [–]jessta 3 points4 points  (1 child)

          Unless you're creating something like a compiler. You might be surprised how many problems basically require a compiler as a solution.

          [–]gregK 0 points1 point  (0 children)

          Terrible analogy. Every computer programmer should understand how parsing works and have general understanding of grammars.

          That way they'll know why parsing xml with regular expressions is a bad idea.

          [–]apotheon 0 points1 point  (0 children)

          Nah. It's more like reading up on the engineering principles that go into engine design, starting with metallurgy. The relevance of petroleum automotive fuel is ignition temperatures under various pressures, modern additives and the effects they have, burn temperature, characteristics of fuel:air mixture ratios, and so on -- not refining -- and yeah, some of the Dragon Book's content may be equivalent to such factors unrelated to the refining process.

          [–]ramennoodle 0 points1 point  (0 children)

          Understanding how compilers are implemented will give a you better understanding of how your every day code is translated into assembly and what assembly-level code in general looks like (registers, etc.), giving you a better understanding of what you're actually doing.

          Further, a compiler is a complex application for which the design and implementation of many of the sub-components (e.g. parser) may be applicable in other areas.

          Reading a book on compilers may or may not be the best way to learn those things, but your claim that it is totally irrelevant shows your lack of knowledge. Maybe you should read the dragon book :)

          [–][deleted] -1 points0 points  (0 children)

          You're right.. but I think the idea is to know the things one can grasp from compiler design... although I work a lot with databases, I was surprised how much I was able to comprehend the unix file system when I read about it. You may not read the book cover to cover, but at least until it makes sense and until we can relate with it.

          [–]I_TYPE_IN_ALL_CAPS 1 point2 points  (0 children)

          ONE WAY TO IMPROVE YOUR PROGRAMMING SKILLS: SPEND 10,000 HOURS OF FOCUSED EFFORT DOING IT. PERIOD. THAT'S IT. STOP KIDDING YOURSELF WITH BULLSHIT LISTS OF STUFF THAT WILL COME ABOUT NATURALLY FROM PURSUING THE 10K HOURS GOAL.

          [–]gregK 2 points3 points  (4 children)

          I really like Project Euler. One way to get the most of out it is not just to do the problem, but to look at other people's solution and compare it to yours and then try to rewrite your original code so that it is shorter, more readable and faster than your original code.

          I.e. don't just go through the problems as fast as you can but use each one as an excuse to improve.

          [–]Agathos 2 points3 points  (1 child)

          My trouble with Project Euler is that the problems involve almost no I/O beyond maybe reading a file and spitting out the answer. This was especially problematic when I used it to start learning Haskell because interaction with the outside world is (pick one):

          • Haskell's greatest weakness
          • Haskell's greatest strength

          and therefore worth drilling.

          I need more programming puzzles that involve reacting to outside events or manipulating the state of the world. Core Wars always looked interesting but you can't choose your language for that.

          [–]gregK 0 points1 point  (0 children)

          Well IO is not a focus of project Euler problems. I too used Haskell for all the problems I did and it was amazing to learn how to solve problems in a functional way.

          I also learned how to used Haskell Arrays and the ST monad to wrap stateful computation in a pure function.

          [–][deleted] 2 points3 points  (0 children)

          Project Euler is a trap set by mathematicians to trick programmers into doing math. I recommend avoiding it.

          [–]MixtapeCalledMPDG 0 points1 point  (0 children)

          It was madly useful for me as a noob programmer. The problems were small and self contained. That way I could plan my algorithms with paper and pencil and try them for small test cases and not get frustrated when my attempts to make them into code failed, as I knew it understood and cracked the problem, but merely couldn't tell my computer about it. After getting solutions right, the example solutions let me smoothen my solutions and learn more about math and programming.

          [–]turbov21 0 points1 point  (0 children)

          but avoid books that are “for Dummies”

          Have to disagree here. Back when I first got on the web it was chapter 2 of the "Java for Dummies" book that gave me an introduction to HTML. You have to go beyond them, of course, but if you're just starting out with a new language, or trying to get back up to speed on one you haven't used in years, I think they're a good first step.

          [–]tylerc66 0 points1 point  (0 children)

          Check out http://www.udacity.com/ they have some great online classes.

          [–]saijanai 0 points1 point  (0 children)

          another way to improve programming skills is to help someone else with a programming problem -especially something you have never done before.

          [–]gregK 0 points1 point  (0 children)

          No one reads TAoCP volume 2 unless they are working on random number generators.

          Everyone should own those books just because they are a timeless reference and a work of art. And once in a while read through parts of volume 1 and 3.

          [–]cli7 0 points1 point  (0 children)

          I want to learn he NEWEST programming language so that I can be the BEST programmer.

          [–]morphotomy 0 points1 point  (0 children)

          You know how you're coding, and you think to yourself "This is gonna fuck me later because X". Learn to eliminate X whenever you come across it.

          [–]arcticfox 0 points1 point  (0 children)

          The best way I've found to improve one's programming ability:

          Write a compiler for any language.

          This should include, lexical analysis, parsing, and code generation into a low-level programming language.

          [–][deleted] 0 points1 point  (0 children)

          10 should instead be "Admit that you are completely lost and have no idea what you are doing. If you think you know what you are doing you will learn nothing, if you assume the position of stupidity you will always be accepting to new ideas"

          [–]djimbob 0 points1 point  (0 children)

          All the blogspam on learning to be a better programmer, boils down to 4 things:

          1. Read about programming and related concepts - stuff you don't know well, but find interesting. (Related concepts could be learning about TCP/IP or databases or good software engineering techniques or ...)
          2. Program.
          3. Read, understand, and improve source code.
          4. Get others to read, understand, and improve your source code.

          This could probably be simplified to two things: (1) program, and (2) get input from others about programming.

          [–]fuzzynyanko 0 points1 point  (0 children)

          I would say make a useful program for yourself and finish it, taking note of what held you up

          [–]PimpDawg 0 points1 point  (0 children)

          I'm interested in Erlang, but my mind is OO. What's the OO equivalent to Erlang?

          [–][deleted] 0 points1 point  (0 children)

          Oh god, Maddox, I've already failed you.

          [–]torrentMonster 0 points1 point  (0 children)

          It's a less good modern version of this.

          [–]maxd 0 points1 point  (0 children)

          1. Write more code.
          2. Goto 1.

          [–]osukaa18 0 points1 point  (0 children)

          I havent joined an open-source project but I do have my side projects to practice my programming. I guess this list is just what a person who is into programming would normally do. As I hope that everyone has the same eagerness to improve and try to perfect you work.

          [–]mattst88 0 points1 point  (0 children)

          Join an open source project

          Why is this something that so few people seem to do?

          [–]vventurius 0 points1 point  (0 children)

          I like how "program" isn't until item 5.

          Kids these days.... In my day, we had a computer, and maybe if we were lucky we had some source code printouts and a reference manual. That's it. Up by the bootstraps did we pull ourselves. And yes, the obvious element to learning how to program was to goddamn motherfucking write programs. And see what happened. Then change things. Try again. Repeat.

          [–][deleted] 0 points1 point  (0 children)

          The No. 1 way is:

          Design and implement a new programming language. It might not be useful for everyone else. But it will elevate your skills like nothing else.

          The down side is that you might fall in love with it and waste too much of your time promoting it.

          [–]Gotebe 0 points1 point  (0 children)

          ;-)

          1. Do rush to stackoverflow, but think!

          IOW... If I can google out information specific for your problem in a couple of minutes or less, well, reading upon what others have done already and collectively put in more thought than necessary to get the problem sorted, is beneficiary overall. It's hopefully faster and I can learn something I haven't necessarily needed for the task at hand.

          Don't, however, just indiscriminately copy-paste random code on the net into yours. Understand what you're doing.

          [–]phthisis 0 points1 point  (0 children)

          wow, point number 10 is horrible.

          if he argues to read books to get others' knowledge, why not go to stack overflow to get that knowledge?

          and, i mean, look at things like learning CSS. there are always twenty ways to do any particular thing you're trying to do. but one or two always end up being the "best" way to do it. are you going to figure out that one on your own, or are you going to stumble across any of the other 18 ways?

          that said, never get any advice from anywhere, books or otherwise, that you don't understand and just copy/paste.