Pitfalls in learning to program

Tim H. commented:

[…] do you have any advice based on personal experience from when you first started coding? Things to do (or avoid doing) or perhaps something that you know now that you wish you had known when you first started?

Oh, please. I wish I could say that I took all the right turns while learning–if I had, I’d be a much better coder than I am–but that’s not the case.

This is probably more than you bargained for, but here–you’re now the… third? commenter to get a full post in reply to a question.

Building on your own

The biggest thing is that building stuff outside the books and classes is the most important thing to do. I’ve been coding in some form or another since I was about twelve: RPG Maker XP at 12, basic web design at 13-14, VB at 15, Java at 16, and then I went to college–I didn’t choose all my tools, most of this is an expression of what classes/books/programs were available to me at the time. But I usually didn’t go out and build stuff with what I learned in my classes.

I did try to make some games with RPGXP, but I was pretty awful at it because I didn’t know Ruby (the game maker has a Scratch-like interface that generates syntax) and the English documentation was very lacking (I looked). And I put together a few web sites for my parents’ birthdays that… were actually pretty nice-looking, but never got published. I was kind of lukewarm about VB, and I had a hard time coding in Java on my own computer for some reason–something about NetBeans not wanting to work.

–Basically, I tended to use the stuff I self-taught (RPGXP and HTML/CSS) more than the stuff I learned in classes (VB and Java). I did have a class on HTML/CSS, but not before I self-taught it, which was good because the class was horribly outdated. That repeated itself with the Linux class–which was taught very well and was up to date, but didn’t teach me as much as I’d learned by tinkering.

School isn’t as useful as you think

This pattern has held consistently through college: I learn better, and learn more relevant stuff, by screwing around with stuff on my own than by sitting in a class.

What I learned in class: Flash, old Dreamweaver (which was as bad as Flash), VB, Java, pseudocode markup, flowcharts (as if I couldn’t make those before), Windows networking, shell scripting, C#, .NET programming (sort of–the class had serious technical difficulties)

What I’ve self-taught: RPGXP (sort of), HTML/CSS, Linux, Python, working with an API, and a tiny bit of FileZilla and phpMyAdmin for freelance web work. Plus all the stuff I read online about programming and startups and businesses and new technology and other awesomeness of that stripe.

What I’ve used: the second list (minus RPGXP really)

What I feel like I know well: the second list (minus RPGXP again)

I’ve long maintained that I’m going to college to get a degree (formal credentials) and to meet people. I’m much less there to learn, because if that were my only priority, I could accomplish it more cheaply and efficiently by sitting around in an ethnic restaurant of my choice with some books and my laptop every day.

Although, probably the teacher who’s taught me the most is Mr. Noord, because he rarely stays on topic for more than half an hour, and the stuff he ends up talking about tends to be more useful and interesting. Don’t tell the school board.

It’s totally different for networking students though. Then classes are way more worthwhile because the school has the hardware they need to work with, and networking is easier to teach in a class.

Programming is an art form that can’t be taught in a class. Programming is a separate skill from knowing the syntax of programming languages, which can be taught in classes. Knowing the syntax is like memorizing a French textbook. But to learn French, you have to speak it (write programs), listen to other people speak it (read programs), let them correct your speech (take criticism from older programmers), learn the current grammar and slang rules (style and best practices), and keep using your skills.

Classes just don’t usually let you mess around with stuff, and when they do, they put lots of restrictions in place: how long you get to work, how fast you have to work, what you can make, and what other things you have to do or write in order to discuss what you learned so someone can prove you learned it and somehow quantify what you did. It’s a real pain. And then you have to pay for them, instead of getting to spend the money on new books or tools or hardware.

I’m not saying that schools can’t be useful. They can be! They can teach the basics and introduce you to other programmers, and they introduce you to some great teachers and other students. They just won’t teach you the sort of skill that makes a great programmer.

Books are quite a bit better, but still watch out

Books still won’t get you all the way; you have to build on your own. But, at least for me, they’re definitely more productive than classes, in terms of learning a new technology or language.

Books tend to a) be cheaper, b) invite you to mess around freely and without restrictions on time or what you do with the example code or stuff like that, and c) let you choose your tools. When you buy a book, there aren’t required classes. You get to study what you want.

The tools you choose are important

The main reason I’ve never used VB or C# or Flash or the other stuff I took classes on isn’t necessarily because the teacher was bad or the curriculum was awful. On the contrary–I’ve had mostly great teachers.

But the technologies are pretty crap, to be honest.

If you’ve been around very long, you know about my burning hatred of Visual Studio. I didn’t always hate it so much. I used to be lukewarm towards it, back in the days I was using VS 2012 for my Visual Basic classes. We had technical difficulties with it even then, and it liked to crash and all sorts of crap, although nothing like the temper tantrums it’s thrown in my more recent classes.

But now that I know what programming is actually like, I look back on it and realize how boring and tedious it was. It sucked! No wonder I wanted to go into psychology instead. I thought coding was cool, but sometimes I wondered if I just thought the idea of coding was cool and I liked the romantic techie-nerd image it let me imagine, because what I was doing was not that much fun.

(Straight-up HTML and CSS isn’t very fun either, to be honest. Once you get good at it, both the novelty and the challenge kind of wear off. I’m looking forward to learning to code dynamic web pages, though.)

Java was okay, but we didn’t get very far into it, the coding examples were largely busywork, and it was really complex. I think we just got a bad textbook, honestly.

The books you choose are important

The difference between a bad textbook and a good textbook is like the difference between a bad teacher and a good teacher.

Here are the different kinds of books:

Diving Into ASP.NET, MVC, TLA, GPS, and SAT by J. Random Microserf

This will probably have some geometric feature on the cover. It’ll look deceptively shiny and colorful, but it’s as engaging a read as the Terms of Use agreement for the technology it’s purporting to teach. Said technology will of course be the kind that has a Terms of Use agreement, because these books are usually made in order to sell both the book and the IDE or language or whatever the book is about, plus all the attached certifications (which probably all have test prep books of their own).

They’re written by someone who probably does not like the technology they’re writing about, even if they say otherwise in the intro. This will translate into the writing, and you will end up not liking it either.

Generally, these books are best used as eBay fodder or, if the technology described therein has already flunked out (it will soon if it hasn’t), as expensive firewood.

Learn Foo in 24 Hours!!!!

You will not learn foo in 24 hours.

You may get a basic but deceptively broad understanding of foo. But you will not have learned foo.

This book is not quite firewood. It may be helpful, if not so in-depth.

Weird homebrew-looking e-book sold on Amazon


Head First Foo

Made by O’Reilly. This will have a lot of pictures and silly jokes. They’re great for learning from if you need to get a complete understanding of a technology quickly, or if you’re a beginner and you’re kind of intimidated.

I lose patience with them, though, under two circumstances:

  1. I have something I want to build, and I don’t want to sift through 50 pages of pictures of tigers and pizza before I find the bit of information I’m looking for. What I need is not exactly a reference book; I just want the info in a more dense and organized form.
  2. I’m trying to read it as an ebook. They don’t translate well to the format. Don’t buy these as ebooks.

Notably, they’re bad reference books, as you might have gathered. Don’t get them for that either.

Making Stuff with Foo

This could be “Building Dynamic Websites with Django”, “Creating Apps with Kivy” (<3), et cetera.

It’ll contain something like this in the intro.

I’ve been using this technology for foo amount of time, and I think it’s a great tool for doing bar because of how it bazzes the quuxilators. I tried some other ways of doing bar and overall, I like this one the best because it’s well-designed and has great features.

Anyway, I thought a lot about how to write this book, and you might notice that the example code (which is on GitHub at [URL], by the way) is actually not a bunch of different projects–it’s just a couple projects, and we change them over the different chapters so you can see the development cycle better.

I really hope you have fun making stuff with foo using this book. If you find any errors along the way, send me an email at foo@gmail.com.

Not exactly, necessarily, but approximately that tone–you get the idea. The tone of the book will be friendly, but practical and not too goofy. These are great books!

It has a picture of an animal on the front?

That is probably an O’Reilly book. It is worth its weight in gold.

These are very often the “Making Stuff with Foo” variety.

If O’Reilly doesn’t make a book about a technology that is well known enough to have school classes taught on it for, say, a year… that technology may not be worth learning. Unless you can find someone else who wrote a good “Making Stuff with Foo” book about it, and then it might be okay.

Dry Internet documentation

For when you already know what you’re doing. Confusing, frustrating, and boring if you don’t. Buy a book.

Good Internet documentation

Save your bookmarks!

Make stuff. Solve problems. Meet other nerds. Eat cake. Browse GitHub. Play a board game. Tinker with stuff. Install Linux on something. Eat cake again. Hang with your nerd friends.

Have fun.

Happy hacking!


Plant Yourself in STEM: Linux FAQ

I. Questions about Linux

Q: I want to play with Linux some more.

A: Great! You have a few options.

  1. Use a virtual machine. Here are my instructions on how to make one. I recommend this one most because you can run the software well on most modern systems, and there’s no risk of accidentally overwriting Windows or whatever you’re running, and losing all your files in the process. Also, if you break a virtual machine, you can reload it from a snapshot or just make it over again. VMs take a little patience to make the first time, which is why I wrote that tutorial. (It contains a lot of stuff I had to learn by trial and error.)
  2. Use a live CD or USB. Google is your friend on making these, but check at least two tutorials when you make Linux-related stuff. Be careful not to install it over your current system.
  3. If you have money: get a Raspberry Pi and its associated accessories. This can be fun, but you’ll probably end up dropping quite a bit of cash on it. If you want to anyway, again, Google it.
  4. If you REALLY know what you’re doing and this is your own computer, not your parents’, you can make a Linux partition. Be careful with this one. You have to be a little more technical to get it right, and it’s risky to get it wrong. You might want to choose your distro a little more carefully with this option too, to make sure it’s one you like.

Q: What’s with all these different “distributions”?

A: Linux distributions, or distros, are just different varieties of Linux. They all have the same stuff running at the core of the system, roughly, but they can have different software installed and sometimes different commands. Each distro is meant to serve a particular purpose.

Ubuntu and its variants (Kubuntu, Xubuntu, Lubuntu, etc) are meant as a beginner’s Linux–they’re designed to look roughly like Windows and be as easy to use as possible. Linux Mint has a clean design for users and programmers who want something simple, elegant and effective, without tons of shiny graphics. Debian and Fedora are often used in servers or on the personal computers of programmers. Kali is for network security administrators. There are even advanced distros such as Arch and Gentoo, for increased customizability or transparency to the core system below–Arch doesn’t even come with a desktop environment installed, you start out with just the command line interface.

It’s best to start with a simpler distro, like Mint or Xubuntu (which is preferable to normal Ubuntu because of the interface it comes with–it runs faster and I think it looks better). I’m fond of Debian, personally. GNOME 3, the window system it comes with, is rather heavyweight but very shiny. You can put different interfaces on it, though.

Q: Wait, what do you mean “interfaces”? What’s a “window system”? Are they different things?

A: In Linux, the command line is the default interface that’s built into the system. But you can put window systems over the top of it. You know how Mac desktops look different from Windows desktops? Like, the windows look different and Mac has the dock instead of the taskbar? That’s because they use a different window system. Linux has tons of these and you can just swap them around.

“Interface” is a more general term than “window system”–the command line is an interface but not a window system. (Apart from that distinction, they’re interchangeable as far as I know.) That’s semantics, though.

Q: What makes Linux so great, anyway?

A: Lots of things! There are so many reasons to use Linux over Windows (and, to a slightly lesser degree, over Mac)–ranging from the practical to the aesthetic to the philosophical. Here, I’ll list a few of the reasons you probably care most about, but understand that this list is by no means exhaustive.

  1. It’s free! Not only are the vast majority of distros free to download and use, but you can change them however you like or make contributions to them.
  2. Linux is faster, especially on old hardware.
  3. It’s far, far more secure than Windows. Linux very rarely gets viruses, even more rarely than Mac OS X, and when viruses for Linux do appear, an update comes out very quickly to protect the system. But it’s hard to write viruses for Linux because it’s designed so well.
  4. They’re easier to program on. Linux comes with better tools for coders and makes things a lot easier. Tools like git and shell scripting make Linux a far better choice than Windows for a coder.
  5. Linux has a powerful command line, which Windows lacks. (Mac’s command line is okay though.)
  6. Package managers make it easy to install and remove software without leftover files like you get on Windows and Mac. This saves space on your hard drive and keeps your programs working well.
  7. Linux is easy to use and customize! You CAN learn to use Linux without touching the command line (although you’d be missing out on a feature, and if you’re coding you should know it). The basic controls aren’t that different from any other operating system–it just has a few extra tricks it can do.
  8. Linux is becoming a platform for gaming! It’s not totally there yet, but there’s serious progress being made. Steam has certainly jumped on this bandwagon with Steam OS. Personally, Humble Bundle is my favorite place to find Linux games, and it’s for a good cause. And remember what I said about Linux being faster? Your games will perform better. It’s pretty awesome.
  9. Free software–you don’t have to pay for Microsoft Word or Photoshop, as Linux has open-source software that does the same thing. LibreOffice and GIMP are great programs.
  10. It’ll teach you about how computers work! Linux is a great behind-the-scenes of how computers function. To me, that’s really important and cool.
  11. Free support from a great community. Got a question? Google it, and if you can’t find anything to help you, there are forums full of people who’ll help you out for kicks–they just like fixing stuff and making users happy because it’s challenging.
  12. The power to fix your computer when it breaks. Windows doesn’t let you see where stuff is failing, it just pops up with the box that says it’s trying to diagnose the problem and fix it–and I’ve never heard of that working for anyone. Linux lets you see what’s going wrong, if you know where to look, and lets you fix it instead of making you give up. Linux boxes don’t really get the kind of issues that can be solved by rebooting–they work too well for that–but they do occasionally run into bigger blocks where Windows would just throw up its hands and tell you to reinstall.

I’m stopping there. Twelve is a nice round number, and I don’t want this to go on forever.

Q: How do I learn Linux?

A: This is actually a really good question. I was asking the same thing about a year ago. Now that I know from experience, I’ve covered it to send you in the right direction.

II. Questions about coding

Q: How do I start learning to code?

A: Starting to code is easy! There are great sites out there to help people take the first step into programming–I like codecademy–and there are plenty of books too–like this one, which is available for free (although I suggest buying a hard copy or tipping the author if you can). If you’re intimidated, you can start with HTML and CSS and make some basic web pages, in which case I recommend this book.

Q: I’ve been coding for a while… I know a language or two, but I feel like I’m missing something. Open source is really hard to get into and everything is confusing.

A: Basically everyone feels like this after working with books and classes and tutorials for a while. It doesn’t go away with more books and classes and tutorials. It starts to go away once you try to build stuff on your own. Keep your eyes peeled for stuff you think you might be able to build, and then try to build those things. Even if they’re terrible at first. Trust your ability to learn what you don’t need in order to finish your projects.

You’ll feel stupid. You’ll think your program sucks. You’ll get frustrated working on a problem and walk away. But then you’ll figure out something that might be the answer while you’re making dinner and you’ll rush back, and you’ll put it in, and maybe it won’t work but sometimes it does and sometimes it helps you figure out what works, and everything is exciting again. And you’ll forget you were making dinner, and you’ll keep coding and forget to eat at all while your cat eats the lunch meat you left out.

If you love it anyway, you should keep coding.

At some point, after months spent alternating between frustration and excitement, it’ll hit you that six months ago you would have absolutely no clue about anything you’re doing now. You’ll realize that, although you may not be as good as the open-source folks yet, you do know a lot of valuable things that would massively confuse most people.

Q: Uh… really? It’s that hard? But I bought a book that says I can learn Java in a week.

A: You might be able to learn Java syntax in a week, but it’s really just another tutorial. Programming is a separate skill, agnostic of any one language but tied to all of them, and it takes time and effort and trial and error to learn. Also, don’t start with Java. Start with Python, Ruby, or web development.

Q: Is HTML a programming language?

A: Not technically, but you can still call yourself a programmer if you want, I won’t jump on you. HTML is a markup language (HyperText Markup Language), and it isn’t Turing-complete. That is, it lacks the different logic structures that programming has. HTML is more just a way to tell the computer how to display stuff, and the things you write with HTML aren’t interactive. To make interactive web sites, you need to use a programming language like Python, Java, PHP, Ruby… etc. You don’t think about it, but most websites you use on a regular basis have tons of programming behind them–it’s not just HTML and CSS.

Someone’s going to tell you you’re not a real programmer if you only code HTML and CSS. Ignore them. What matters is that you’re making stuff.

III. Inevitable diversions

These are here because I don’t want to spend activity time on them.

Q: Can I use Linux to be a l33t hax0r and break into computers?

A: Yeah, if you’re an idiot who can’t figure out anything more fun to do with your computer than break into someone else’s. It’s a lot more technically difficult and interesting to build things rather than destroy them, and it also pays more and doesn’t get you into legal trouble.

Also, that’s not what a hacker is. You’re thinking of crackers. Hackers are the people who build open-source stuff, and they don’t like it when you mix up their names with criminals.

Q: Will you teach me cracking?

A: No.

Q: Should I use Kali Linux as my desktop OS?

A: If you want to be a white-hat, it makes sense to know Kali and the network security tools it comes with. I wouldn’t recommend it as a desktop OS, though. A lot of people are attracted to Kali because it sounds edgy, though, and that’s not a good reason to use it. Don’t do anything stupid with Kali.

Q: What are the best energy drinks? Is Monster good?

A: I covered this, actually. And no, Monster is toxic waste–Full Throttle, NOS, or Venom are much better.


This is lovely and I want to share it

I ran across this JSON tutorial that I think is going to be really helpful. (Yes, I’m still messing with JSON.)


It looks like the site has a bunch of other useful tutorials and stuff. Definitely worth a bookmark if you’re learning Python. I don’t see a Gittip button, so hopefully I can pay the writer in a little well-deserved publicity.

Happy hacking!

The Return of Tinypapers






It’s not the prettiest right now, but I got tinypapers to do something. It doesn’t seem very impressive, but the data structures behind it are pretty complex, this part of Kivy is still under development, the documentation they have isn’t the easiest to read, and the answers on the Internet are basically all different.

What it does is take input, add it to a special sort of string array, and hand it off to a really complex little widget that makes the array into those green buttons. The complex widget involved is still experimental code and the syntax for getting it to work isn’t easily understood.

After groveling through a whole bunch of Internet stuff, I came back to Kivy’s ListView documentation and for whatever reason, I was able to understand it more.

For those who want to know, here’s how to declare a ListAdapter and write its args_converter in KVlang:

ListAdapter(data=[“{0}”.format(i) for i in root.button_list_entries], cls=ListItemButton)

In actual code files, you’ll want to break that up into more lines. It’s certainly more than eighty characters long, just put on one line here for readability.

I may end up refactoring this later and writing the args_converter in the Python file or something; I’m kind of meh about having this Python code stuck in the middle of a KVlang file, even though it’s just a function call. That’s okay for now, though. I’m more concerned about getting the prototype to work; I’ll worry about refactoring and things like correcting my (very likely non-canonical) indentation style later or if it becomes a problem.

Here’s a quick visual demo of what I got the thing to do:

Screen Shot 2015-08-01 at 3.40.50 PM


The nice UI colors from before will eventually come back, don’t worry–I’m not neglecting the interface or anything. This is just more important right now.


Hey, Shan, this is for you ;)

Shan Reddy commented on How I Learned Linux:

I’ve landed here from Steve’s page. Great post. It was so neat, helpful, clean like a crystal. I’ve bookmarked all the links which you’ve included. That’s such a great help. Oh yeah! your blog as well and I’d be following regularly to check the updates and read more. Your writing skills are excellent. Appreciate it. Wish someday I could write as well and share my info all that I learn with the rest of the world like you.

I liked the part where you said that someone if they weren’t interested or not confident they could do it would not have read through so much. I was so happy to read that. ‘Cause for me my programming journey was very steep but once I picked up I could find the intellect in me moving much faster. And now I’m looking to learn hacking and that’s how I landed on Steve’s page and here finally from there. I’m currently on Windows but after reading this article and understanding the importance from Steve’s I’m determined to learn the whole of Linux no matter how hard/long it takes. And the other languages which Steve has mentioned in his article. I’m currently programming in Java but learning more web technologies as well.

I look forward to more great articles from you and hope to stay in touch. Cheers!!!

Thanks for your comment, Shan! You brought up a few things that I wanted to discuss not only with you, but with others in your situation.

Programming can be really tough at first glance. It depends on how you were introduced to it. I started off with HTML and CSS when I was 13 (not counting my RPG Maker XP experiments a year before that) and I think that helped make other languages seem not so intimidating. HTML is kind of the gateway drug to programming, haha.

In your case, I’d suggest that Java hasn’t made it any easier on you. Java is not a great first language. Java isn’t a spectacular language anyway; it can be very useful, and sometimes it’s the right tool for the job, but it’s not the first tool that a programmer with a varied language skill set will reach for. Python is cleanly designed, easy to read, and won’t give you fifty lines of error messages because you forgot a semicolon.

(Also, contrary to popular opinion, starting with a more difficult language is not necessarily going to make you a better programmer. It may just make you a more frustrated programmer. In other words–don’t start off with C or Lisp either, even if knowing those later on *will* make you a better programmer.)

Furthermore, you expect learning Linux to be a long, hard slog because you started off with Java and that was a long, hard slog. This is likely to MAKE learning Linux a long, hard slog. And that doesn’t help you! Don’t be so pessimistic. Programming is fun!

So, learn HTML5 and CSS, and tinker with it a while. That should keep you busy for about, oh, three weeks. Maybe more, maybe less. Then head over to learn Python. That’ll take you… mm, six weeks maybe. Maybe more, more likely less. Don’t let yourself get bored with either of these tasks–if you’re bored, then either make it interesting or move on, because if you’re bored, you aren’t working at your full efficiency.

(Bored || frustrated || mentally tired) programmers == ineffective programmers.

THEN come back to Java. Wow, it’s a lot easier, right?

It’s like this. Imagine a guy walking down a path. He comes across a boulder in the middle of the path, and thinks, “I should move this boulder so I can move on.” He could go around the boulder, but he sort of wants to try to move it because he thinks moving the boulder will make him stronger and thus be a better option than going around. So he shoves and pushes and presses all his weight and muscle against it for hours, until his muscles are extremely sore and he is hungry, thirsty and exhausted. He gives up for the night and goes home.

From here, the story splits into two parallel universes.

In Universe 1, the man goes back the next day. He pushes and pushes the boulder until, like the previous night, he’s sore and exhausted.

In Universe 1a, he gives up and goes home to watch TV and drink beer. He’s pretty happy about that but he never got to go on his hike. This is the more likely outcome from Universe 1, really.

In Universe 1b, he doesn’t give up. He goes back to the boulder every day, and while he gets stronger and stronger from trying to move it, he’s started to hate going out onto the path to push against it. One day he goes out and is finally strong enough to move the boulder, but is too fed up with just the sight of his path that he goes home to watch TV and drink beer anyway. Besides, the seasons [current technology] have changed and the mountain the path led up is five feet deep in snow.

In Universe 2, he just goes around the boulder… and finds a pickaxe. He uses it to get rid of the boulder and then goes on his hike. The hike is long and in places difficult, but at the end, he is as strong as he would have been from trying to push the boulder, and he’s enjoyed his time out in the fresh air.

You see where I’m going with this?

Yet there are a lot of teachers (and old programmers! and competenprogrammers!) who will insist that the best way to get the metaphorical boulder out of your way is to push and push until you hate the path, even if there’s a more efficient way to move it and a more enjoyable way to become strong.

Anyway, I’ve heard a lot of people struggle with this problem, so I wanted to write about it.

The bottom line is that Linux, and programming in general, won’t be as hard for you as you think it is as long as you use the right tools in the right order.

If you get told that the ONLY way to move a boulder is with a pickaxe, though, but it doesn’t work for you, try a crowbar or something instead. Not everyone’s creative brain works the same way; if they did, we’d have a billion copies of Mona Lisa and no “Starry Night”s or “The Scream”s or “Persistence of Memory”s. And sometimes you just need a break from trying a certain approach.

So, even as I give you advice to learn HTML5/CSS and Python (a set of introductory but objectively useful tools which has indeed worked for many programmers), I warn you that it may not be the right beginner’s set for you. But be warned away from anything that’s specifically meant as a teaching tool; these generally aren’t worth learning because you can’t use them for anything bigger than a 50-line toy program.

Anyway, get yourself a VirtualBox download and set up a Linux VM. I’ll warn you that BASH scripting is annoying to work with, but you should learn it at some point. You know where to go for links on learning the command line and stuff, of course 😉

Oh, and if you ever make a blog to share what you learn, send along the URL and I’ll link you on here.

Happy hacking!

KV language DOES NOT take in-line comments

In KV, you can put comments on their own line, preceded by a # as usual.

However, if you try to put them after code, on the same line, you will get this error:

TypeError: ‘NoneType’ object has no attribute ‘__getitem__’

It took me WAY too long to figure this out. KVlang just doesn’t support in-line comments.

This is here so that anyone Googling the same error has the shortcut I didn’t.

I don’t really want to type out a full-fledged update right now though. I’m busy!

How I Learned Linux

[Update: A bunch of you are here because Eric S. Raymond is awesome and nice. Thanks, ESR!]

And, by extension, how you can.

I’ll start this off with a disclaimer. I am not a Linux expert by any means–in fact, I’m not even fluent, and don’t use it as my main operating system. However, if I sit down in front of a Linux computer to do some work, I’m perfectly comfortable with using it. I can use the command line comfortably, I know what repositories are for and not to download just whatever interesting-looking tarball off the Internet (unless I’m doing so to tinker with it), I can do a tiny bit of shell scripting, and I can even compile or interpret my own programs (written in less annoying languages) via the command line.

Most people are not there. It took me a long time to get there; I remember being interested in Linux long before I figured out even how to learn how to use it.

The boost that let me get into the Linux world was discovering virtual machines, which are great for letting you play with different distros, screw things up, delete everything if you want/need to, start over–all sort of nonsense. It’s worth noting that Linux systems won’t be as reliable on a VM because of funky stuff with virtual hardware and guest additions and that kind of thing. The tutorial I wrote earlier can help with that. (If you’re used to Windows, you won’t notice anything strange about their reliability.)

You don’t need to take a formal class on Linux. In fact, if you really want to learn Linux, taking a class will feel painfully slow for you and will probably try to teach you silly stuff like how to get X Windows [*] to run on a network, which will be boring and frustrating. You can learn much of what you would in a Linux class by tinkering–although, if you’re focused on computer networking rather than programming, you might like taking a class.

On whether it’s right to write intro posts like this

Hackerdom seems to contain a large contingent which considers that anyone who can’t find the information in the rest of this post for themselves isn’t worth helping, because they won’t have the right spirit or work ethic. I disagree. It’s entirely possible to not even know what to type into Google in order to start solving your problem, and this doesn’t necessarily imply anything about the person who is confused. Whether they’ll admit it or not, many hackers will have been similarly helped by being around other hackers who at least know what program their juniors are looking for but don’t know exists. This is what Linux User Groups are for–but, again, most people don’t know those exist, either.

I can understand not wanting to spoon-feed people all the way, and someone with the true hacker spirit wouldn’t want to be spoon-fed anyway because it’s too much fun to do your own research, since you run into lots of other interesting knowledge along the way. But I don’t consider it a detriment to the Linux world to give people a boost in, so here we go: how to get comfortable with Linux.

No, I’m not going to describe what everything does. This post would become ridiculously long and that IS something you can Google for yourself. I will, however, provide you with good links and descriptions where they’re necessary. 

1. Set up your first virtual machine (VM).

i. Download VirtualBox (opens in new tab)

ii. Download a torrent client–a reader suggested deluge or transmission; I haven’t used them myself. I use uTorrent, but as I don’t know much about P2P systems, I pretty much picked the first one I found. As our commenter pointed out, uTorrent has certain questionable downsides. Perhaps when I have time, I’ll do some research about the different torrent clients and do a post about it.

Also, learn how to set it up. If stuff downloads, but only uploads at a painful snail’s pace, you probably have it set up wrong (although you might just have a less popular distro).

iii. Torrent at least one Linux .iso file. If given the option, choose 32-bit.

Distros (distributions) you might want to play with include Xubuntu (which is pretty easy to use and has a decent interface), Debian with GNOME (which is my favorite), Fedora (which is a little different! but maybe you’ll like it), and Mint (which, depending on which one you get, may be based off of either Ubuntu or Debian–it’s kind of a nice middle ground between them and very popular). I suggest making VMs of any distro you’re interested in, and playing with them, rather than relying on other people’s opinions about which you should use. Those posts can be fun to read, but not very helpful in the long run.

Distros you should save for a point when you know what you’re doing better and want to explore other things Linux can do include, but are not limited to, Puppy Linux and Kali Linux. Puppy is meant for running on tiny systems and can be run on computers which don’t even have a hard drive (it can run on just RAM), and Kali is meant for digital security testing. Please don’t do anything stupid with Kali.

iv. Set up your VM.

There are a lot of how-tos on this subject, including my own, which I just updated; I really suggest that you get into the habit now of checking more than one to see how they’re different and how one might be better than the other. My own included a few weird voodoo/cargo-cult programming things that were in there because they’d made something work for arcane reasons when really it was something else that was wrong–which is why it just got updated, and why you should always look at more than one tutorial. Keep the links of good tutorials; you’ll meet other newbies who need them.

2. Learn the command line.

There are numerous excellent tutorials on this. I don’t need or want to rewrite them, but I will link to them.

Zed A. Shaw’s tutorial at the end of Learn Python the Hard Way. Start with this one. Keep the link; you can learn Python at that web site, the tutorials are really good. Don’t be dissuaded by the name, it’s easier than learning from the dispassionate bureaucrats writing Microsoft programming manuals any day.

How-To Geek (Will teach you how to install things, very important–although if you’re using Fedora or a derivative, you can’t use apt-get. Just replace “apt-get” with “yum” in any of the commands mentioned and you should be fine.)

If you’re still confused about apt-get, look here for Ubuntu’s how-to.

LinuxCommand.org — I don’t remember reading this all the way through, but I had it bookmarked, so probably it answered some question or other. Come back to it if you have questions.

3. Don’t break your system (unintentionally).

Sometimes you intentionally pound on stuff to see what breaks it. However, if something breaks and you have no idea what you did, that’s a glaring neon sign that you haven’t learned enough. It helps to know what kind of stuff will break your system and why before you get to that point, though.

Here’s a link I found with good advice. It says Debian, but the points it makes are not Debian-specific.

Don’t Break Debian

4. Know where to go for help.

Your first resource when you don’t know how something works should be this really helpful command that you NEED to know. It’s called “man”. No, there isn’t a “woman” command. “man” is short for “manual.”

Typing “man ls” into the Terminal will show you everything you could ever want to know about the ls command, including different formatting options like -a and -l. The utility of those flags may not seem like much, until you write a shell script that needs to use ls and have the output in a reliable format, so man pages can be your best friend.

Man pages can also be found on the Internet.

Google is your other best friend. Learn how to use it, please; it’ll save everyone’s time, including yours, in the long run.

However, if you’ve spent more than 30 minutes to an hour (depending on the complexity/obscurity of your problem) trying to find answers, it’s probably time to go to a human. Preferably, one who can program.

Your distro will have its own forum. If you’re trying out different distros, make sure you go to the right forum for the distro that has the problem, even if the bug isn’t distro-specific.

There are also more general Linux forums, like this one which even has a newbie section.

5. Learn the secret handshake.

I was going to make a joke about this to finish off the article. Then I realized there actually is kind of a secret handshake, if you want to be a hacker and not just become competent with Linux. Consider this optional but fun; it may help you stick with Linux instead of giving up, so visit these links if you get bored.

The Jargon File

How to Become a Hacker

How to Learn Hacking

This collection of links should set you in good stead to becoming competent with Linux. If, given this boost, you can’t get any further or find anything interesting to do with what you’ve learned… well, that’s the point where we’d be spoon-feeding you. But I think it’d be hard to get through all this without sort of learning the attitude and skills you’d need to keep going, if you wanted. If you weren’t cut out for this sort of hobby, you probably wouldn’t have had the persistence or interest to make it through–you would have given up halfway through this post.

Good luck, and happy hacking!

*X Windows is an older remote access program, and a window system. It used to be a reasonably good program, I’ve heard, but it’s not a good option now. It would allow you to virtualize one computer’s GUI on another computer. But there are inherent security risks in programs that transfer GUIs over a network–at least, so far. If there were a startup that wanted to improve that, I bet there’s a huge market for a secure remote access system.

Our teacher didn’t like it–she’s a firm believer in using SSH and the command line for this sort of thing, and I agree until someone comes up with a better solution–and I don’t think the textbook writer liked it either because he put it at the very end of the chapter, after all the other options.


SSH is faster anyway.