Ask Me a Question: Software Bugs

By Shamus Posted Thursday Jun 2, 2011

Filed under: Random 101 comments

minecraft_chest.jpg

Here is a question from reader cody:

Me and my brother got into an argument recently and I figured you could help us settle it. It started when an update for Minecraft was released that caused the game to crash when shift clicking items into a full inventory. He thought this was incompetent coding on behalf of the developers and that any problem like that would be obvious and easy to fix. I told him that it's a lot more subtle than that and any number of seemingly insignificant bits of code could break the game in major ways. In the end we both agreed that computers only do exactly what you tell them to, our opinions on what that means are different though. He thinks that it means if you tell them to do something that breaks the game you're bad at making games.

There’s an old saying among writers: Writing is re-writing. The real work isn’t having an idea or putting the words down, the real work is when you’re done with that and you have to go back and polish, cut, and expand until the work flows.

There’s a parallel saying for software engineers: Programming is debugging. Yes, a terrible programmer will write bad code. But a normal programmer and an exceptional programmer will write good code. The difference between the two appears when it comes time to locate an obscure bug or intuit the source of a problem based on the non-technical ramblings of an end user. A task like that can take a day or five minutes, and it all comes down to how deeply the programmer understands the discipline.

The thing is, ALL programmers write bugs. John Carmack is one of the most brilliant software engineers alive today. He’s a visionary, an inventor, a member of Mensa and yes, he’s also a rocket scientist. Yet he writes bugs just like the rest of us. It’s unavoidable. Saying a programmer should never make bugs is like saying writers should never make typos. A good one will make fewer than a bad one, but they happen to everyone. (In fact, it’s probably pretty even between great coders and average coders, because we all seek our own level. If you’re able to write something completely bug-free, then you’re under-utilizing your abilities and you’re probably bored at your job. We all want to hit that sweet spot where the work is challenging enough to be interesting and rewarding, but still easy enough to avoid frustration.)

But this Minecraft bug isn’t about programming skill. That’s a playtesting problem. Writing the bug was a trivial mistake. Releasing the bug was less so. This began as a one-man hobby project with low expectations and is now a multi-million dollar project with a team and an immense base of customers with the usual consumer demands. Mojang is going to go through some growing pains as they develop a production pipeline and company policy regarding releases.

Having said that, let’s keep this in perspective. As I said on Twitter a few days ago:

Today’s Minecraft beta was SO BUGGY that I nearly thought it was a post-release AAA game from Bethesda!

I’m not usually an apologist for companies who put out buggy software, but the game is in beta. This was one bug, released during beta testing and patched soon after. If this is the wost sin of Mojang, then they are way, way ahead of just about every other studio on the planet.

As for how such a simple thing could lead to a crash? Pfft. There’s a thousand things that could to that. Here’s a hypothetical:

minecraft_inventory.jpg

The feature is: When you open a container and shift-click on an item in your inventory, it transfers the whole stack into the container for you. If you click on something in the container, the whole stack is moved back to inventory.

But of course, some containers are joined with other ones, making double-sized containers. Additionally, these joined containers must act as one, so that clicking on either one will present the same list of items in the same order. (As opposed to listing the one you clicked on first, followed by the “other” one, which would confuse users, since it would look like items were “re-arranged” in their box.) If one container is full, your shift-click should send the items into the second container. Containers are joined in pairs, and these pairs can be formed by any two adjacent cubes on the same vertical plane.

If the logic for this was messed up, then it can end up trying to put items into a container that doesn’t exist. Boom. Welcome to crash city.

Maybe Notch wrote the feature, built a single box, tried it, and concluded it was done, without testing it on double boxes. Maybe it worked fine at first, but later making changes to how the server and client transfer container data resulted in a shift-click causing a crash.

Note: This is not an informed guess. Or even a wild guess. This is an illustrative example to show that the complexity of a feature has nothing to do with how simple it is to USE.

Notch single-handedly wrote a rendering engine, an interface, a character animation system, and a client-server architecture. No, he’s not a bad programmer.

 


From The Archives:
 

101 thoughts on “Ask Me a Question: Software Bugs

  1. McNutcase says:

    I’ve done just enough programming that I know how easy it is to screw yourself with assumptions, and how hard it is to catch every single instance of that. I also know that it’s the things you know are right that trip you up…

    1. Alexander The 1st says:

      Ah yes, I remember doing a coordinate calculation code library (It was intended to, given two points and obstacle, find a short path while using Bezier curves to get around objects. The part that messed up was the Bezier calculation code…) which would, when run, have the character stand in the same place, then after a period of time, jump to the position I clicked at, instead of the doing the RTS-like walk over to the area.

      The problem line?

      int i = (float)((float)k/(float)m);

      Now, k was always less than or equal to m. I knew that. So it would always be a float between 0 and 1.

      I spent ages running over the code around this, and finally tracked it down to near this area, but couldn’t quite see it.

      After a week of debugging, I got sick of it, and printed out my source and showed it to a friend of mine. He took the same mathematics course I did, and he also codes java, so I figured he might be able to see where my algorithm went wrong without me having to explain the whole thing to him line by line.

      The conversation went like this

      “Why are you assigning this value to an integer?”

      “I – I’ll be back.”

      Some context: I had originally written it in Python for the mathematics course so I could use it for review purposes, and transferred to Java in order to use in a personal project.

      1. nawyria says:

        That’s a very good example of the kind of problems people typically encounter when debugging. The problem is right there, you’re staring at it, but you don’t see it.

        1. Alexander The 1st says:

          I’ve also had bugs appear on startup of a class, on a sever, before anything happens – but it’s not something the user sees, as it’s a background process, and so no error was shown. But we couldn’t tell it wasn’t working except for the “Hey, I’m starting up” logging that we do for it wasn’t showing.

          Dev testing revealed that we had replaced a class with a different one, removed the old one (It was for refactoring purposes, to be a clearer name). We refactored everything and it builds and loads onto the server fine. But at one point, we load the class through a String reference…which doesn’t get refactored.

          “Oh right,” we thought. That part that drives this one service. “How did we forget about that?”

        2. Deadfast says:

          Furthermore, the more you stare at it, the less chance of you actually noticing what is wrong there is.

      2. Kyte says:

        Funny. Doesn’t Java complain when you try to assign a float into an int? IIRC, it needs an explicit conversion…
        (Or you did and mistyped the (int) cast as a float cast?)

        1. Alexander The 1st says:

          I’ll have to double-check. I know that the problem was VERY close to that line. I may have casted it to an int before assignment, but then I didn’t catch TWO failure points. I prefer the former.

          1. Alexander The 1st says:

            Huh, yeah, it does throw an error. Must’ve converted it to an int instead of a float at the end. “Well, it compiles now, so it must work.”

      3. Soylent Dave says:

        Yeah blind spots like that can be a bitch.

        I think I’ll always remember doing my computing A-level and sitting next to a girl who spent a full two weeks (as the coursework deadline rapidly approached) trying to find out what the hell was wrong with her final project, only for me to glance at it for a couple of minutes and say “that minus should be a plus”.

        She got a higher grade than me in the end, though.

  2. Psithief says:

    “If this is the wost sin of Mojang”. Pointing out everyone makes typos doesn’t mean you don’t have to proofread, Shamus. *WINK*

    Let’s all remember that Notch briefly had other programmers assisting him, but now they’re all on another project! It’s like his company has become a parasite on his success.

    (Haha, don’t get too excited! I’m sure paying heaps of employees is good for Notch somehow.)

    1. Adam says:

      I think only one of Mojang’s new hires was ever (and still is) working directly on Minecraft. The rest were hired for other projects or business-y stuff. Most of the reason he needed employees was to keep the website and backend up.

  3. Ateius says:

    Wait, wait wait.

    Hold the phone.

    I can shift-click to insta-move stacks of items?

    Awesome.

    1. xXDarkWolfXx says:

      Well you apparantly cant as it crashes peoples games. My new world isnt nearly far enough for me to do that yet, my house doesnt even have 4 walls yet.

      1. Mari says:

        It’s since been patched. Feel free to shift+click to your heart’s content.

        1. xXDarkWolfXx says:

          I find it amusing that im gonna be shift-clicking all the dirt and such that i have excess of while my house isnt even built but then again, im awesome like that.

    2. theLameBrain says:

      I felt the same way when I read this! I had no idea I could shift+click to insta-fill containers! I wonder how much else I don’t know…

      1. Mari says:

        Did you know you can make maps now? Yeah, you can. And hatches/trapdoors.

        1. theLameBrain says:

          I haven’t yet made a map, as I have not been lucky enough to find any redstone, but I love trapdoors! Trapdoors have seriously altered the way I layout my mines and structures.

          Now we just need drawbridges…

          1. Shrikezero says:

            you can make a working drawbridge.

            []_ _[] (block, hatch, hatch, block)

            Spinal Tap style Stonehenge not included.

    3. MrWhales says:

      This was news to me too.. I heard people mentioning it before, but it went under the same thing as right clicking a stack picks up half. So that is waht i assumed it did, the few times i actually thought about it, i thought it was silly to have 2 ways to do that one silly task.

  4. Alan De Smet says:

    A “small” game might have 100,000 lines of code. A AAA title? Millions. That’s not even counting the operating system which itself adds millions more lines of code; it’s not your code, but it still adds complexity you need to worry about.

    To a non-programmer: think of a “small” game as having 100,000 moving parts to make work together. And unlike in an engine, it’s entirely possible that the part over here interacts with the part all the way over on the other side.

    One of the differences between a good programmer and a poor programmer is that a good programmer worries about all of those interactions and designs highly isolated systems with minimal interactions with the outside world. That makes complex software possible, but there are still moving parts interacting within each to make work, and the various subsystems need to interact. It’s still a lot to worry about. Oh, and now add thousands or more of different computer systems; different video cards, different operating systems (Did you know that each version of Windows has slightly different functions available?), different versions of Java (in the case of Minecraft), different amount of memory, different processors, different video drivers, and more. Good luck! (This is one reason game developers like consoles; any given pair of Xbox 360s are extremely similar, at least compared to a PC.)

    Bug free (or close enough) software is possible. It just takes a lot of time, and that time scales with the complexity. Time is money. Compromises get made.

    1. psivamp says:

      Then Minecraft has to take into account the variable quality of the Java library, which may intermittently attempt to access uninitialized varibles deep in the bowels of Sun’s code and cause your program to blow up.

      I took a programming class in Java last semester. I lost a couple points because a program had a NullPointerException on load maybe one out of fifteen times I ran it. Every time I used a variable that had to be initialized and there was a chance it wasn’t, I checked for it. Java apparently took my arrays of variables and didn’t always check? The trace on the NullPointer never came back to my code. Frustrating, to say the least.

    2. Alexander The 1st says:

      To a non-programmer: think of a "small" game as having 100,000 moving parts to make work together. And unlike in an engine, it's entirely possible that the part over here interacts with the part all the way over on the other side.

      Now all of a sudden I’m imagining an engine with multiple gears inserted halfway between Portals (Of the Portal kind) all over the place, somehow running a car.

      Come to think about it, isn’t this the main way Buffer Overflows work? Place one gear somewhere, then force enough of the memory to “compress” such that it allows one line of code to access a completely un-related piece of code?

    3. MrWhales says:

      Did you know that each version of Windows has slightly different functions available?

      This is something that puzzled me, back in the day, when i was stuck with pre-XP windows, i always wondered why a game couldn’t run on my windows 98 machine, I mean, it is still windows! But that one sentence cleared it up for me :D

      Also I wonder why games always re-install Directx… But i guess that could be the same too, I think it would be smarter to put in a something taht checks to see if I have it installed(because as far as i know, directx 10 is the same as that guys directx10)

  5. Jeremy says:

    Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.

    Brian W. Kernighan and P. J. Plauger, The Elements of Programming Style.

    1. Mistwraithe says:

      LOL, I like that!

      It isn’t usually true though IMO. At least not unless you equate ‘cleverly’ as ‘complexly’. Because generally speaking writing the code cleverly should involve doing things that help make it easier to debug. Not necessarily so easily that Mr Average Programmer can easily debug it but not so difficultly that you can’t.

      A case could be made that it is true if the problem you are trying to solve is near the limit of your comprehension but that isn’t really what the quote says.

      1. psivamp says:

        Most people would take ‘clever’ here to mean complex or compact. Amateur programmers — like myself — like to do stuff like that, optimize little functions by hand while simultaneously praying that it never needs to be debugged because it relies on getting good input in a specific form and we won’t remember all of the logic behind what it’s doing a month down the road.

        It’s fun to come up with those solutions, but I really should stop. Modern computers are too fast for me to be worrying about a couple cycles in something that only gets called a few times.

        Although, interesting story: My father works with a guy who is ‘clever.’ Likes to use new features of the language, writes very robust code. Then he gets tasked with a sort algo and puts branching logic with multiple arguments to determine the behavior… A sort algo gets called literally thousands of times in a database program for a small database. So, that hurt performance noticeably. My dad then culls that down to the bare-bones and it speeds up, but not enough. Turns out that the client code was pulling the whole database and then discarding what didn’t fit into the query criteria, moved that server-side and *BAM* application starts working at acceptable speeds.

        1. some random dood says:

          Little hint for you (may also help with your java problem earlier): never assume that what you receive as a parameter is correct! Always check that it is defined before attempting to use it. Always check that the data is as correct as possible (e.g. if you expect a number, then is it number? Can you restrict that number range further, as in if it should be between 1 and 6 that it *is* between 1 and 6… etc). Yes, it makes all your subs/functions longer and slower – but they are far more likely to work as they should and not throw the occasional error that will leave you scratching your head.
          Another tip I heard and am starting to believe – never optimise your code during development. All too often, people “optimise” by assuming the data is an an appropriate format so not check for it. All it takes is that several weeks down the road for a spec change (or new realisation that the data can take more forms than originally thought) and suddenly an “optimised” routine is doing unexpected things.
          Oh and another reason not to optimise early? Usually the things people try to optimise are just clever little tricks they want to try out, and do not really impact the performance of the application. Optimisation, and when and where to do it, is a topic in and of itself!

          1. Alexander The 1st says:

            I’d actually like to see a blog post on optimisation. I hear about it all the time, but not really HOW the optimisations work out better.

            Usually, it’s small optimisations, with very little explanation as to how that small optimisation actually helps speed up things – aside from O(n) stuff and such, but it’s stuff like “It’s faster to do bit-shifting instead of actual multiplication” that, while maybe it is faster, it should be considered if that’s the actual bottleneck is something that’s O(2**n) somewhere else first, THEN do the “optimisations” afterwards.

          2. CptRed says:

            It’s true that you shouldn’t get stuck on trying to optimise your code before profiling it but you should still have performance in mind and try to optimise from the beginning with smart algorithm choices and a good design.

            If you afterwards can see big time sinks in the profiling then go ahead and optimize your code by hand.

      2. Darkness says:

        Hmmm. You or BWK. My guess is it is you that K was talking about.

  6. HeroOfHyla says:

    The worst bugs for me are ones where I just type the wrong thing altogether without thinking about it. This happened to me the other day:
    I was writing some code for a Java game that played sort of like dominoes. Specifically, I was writing the code to make sure that the placement of the domino on the board was valid: it didn’t overlap any other pieces, it didn’t go off the edge of the board, and if it touched any other dominoes, adjacent sides had to have the same number on them.
    The first 2 parts went off without a hitch. But something was wrong with the third requirement – pieces were always returning false on the check whether adjacent pieces would allow the placement. Finally, after a lot of digging, I found the problem: It was checking whether the destination position on the board had the same value as its adjacent squares, rather than whether the domino-half’s value was the same as the values of those around the destination square. It just didn’t cross my mind that it could be a case of simply using the wrong variable.

    1. Moonmonster says:

      Honestly, those are the good ones. When you find a bug that is a case of ‘This bit of logic, this line of code, this function, is wrong’, that’s wonderful. I love those.

      The real problems occur when you have, say, a system for publishing from server A to server B, and a system for updating shared assets, and both systems work *perfectly*. Except sometimes when an asset is updated while a publish is in progress, your servers become out of sync or one is out of date. Now you have to restructure one or both systems to take the other into account, adding all sorts of new chances for bugs in things that used to be fine.

      That kind of crap is why ‘foo used to work fine why did stupid company x break this’ happens.

      1. J Greely says:

        I once had a production service bug where the smallest repeatable case we could come up with was “have 50,000 real customers use it steadily for 48 hours, then try to restart the daemon; half the time the parent process won’t correctly handle the child-exited signal”. Dev and QA were not enthusiastic about building an environment capable of reproducing this test.

        (the eventual fix was to detect and ignore the “latchkey zombie” processes, and restart the daemon anyway; they’d closed all their ports and filehandles on the way down, so they were just cruft in the process table until the next full restart)

        -j

  7. Alan De Smet says:

    As soon as we started programming, we found to our surprise that it wasn’t as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs.

    “” Maurice Wilkes, quoted in Expert C Programming by Peter Van der Linden

    But he just developed the first stored-program computer, invented microprogramming, and created symbolic labels, macros, and subroutine libraries. What does he know?

  8. Rob Maguire says:

    Notch single-handedly wrote a rendering engine, an interface, a character animation system, and a client-server architecture. No, he's not a bad programmer.

    And he did that in Java, using LWJGL*. The man is a god.

    What annoys me about the Minecraft updates is that (from what I’ve gathered from Notch’s Twitter feed and blog) the QA testing policy is, literally, Notch hops on IRC and gives the update to random people to play with for a couple of hours. And that doesn’t even happen every patch. This leads to extremely obvious bugs not being caught until the update goes live, virtually every release. But then again, we customers are the beta testers, and knew that when we bought it (the IRC guys are just the beta-Beta testers?).

    * I didn’t realize how much I hated Java/LWJGL until I started making games in C# using the XNA libraries. Suddenly programming games became fun again. I would definitely recommend checking out XNA to anyone who is interested in game development.

    1. Nick-B says:

      Indeed, XNA handles a LOT of the dirty nuts and bolts of programming. Having to interact with a graphics card, or even DirectX is a lot of work, and XNA simplifies that to what you’d expect: I want a sprite (2D picture), and I want it HERE. Draw it. Done.

      My complaint with it is that everyone has to then have the XNA distribution installed. A lot of indie games lately, Magicka included, use it, so it’s not so bad anymore to expect people to have it installed.

      1. Vegedus says:

        I guess that explains how they could make terraria, with the number of features comparable to minecraft, in half a year.

        That, and the 2D thing.

  9. Someone says:

    Anyone else noticed the name of the previous “Random” article?

    1. Eroen says:

      Needs more fusion.

  10. MichaelG says:

    At least with Java, you don’t get those memory-corruption bugs you get with C and C++. What a nightmare! A piece of code overwrites a bit of memory, or uses a dead pointer, and some time later, when you least expect it, unrelated code crashes for no obvious reason.

    Finding those bugs can practically drive you insane.

    1. ps238principal says:

      What about the memory issues Minecraft seems to have? It bogs down my system and I’m running a dual core with 4 gigs of ram. The only other programs that beat it for memory usage are Photoshop and Firefox (when it leaks).

      1. Deadfast says:

        What you are experiencing aren’t issues, it’s just Java. High-level languages aren’t exactly known to be memory-efficient, you have little control over memory allocation. That’s the reason why the absolute majority of games are written in C++.

        1. Alexander The 1st says:

          “Bug closed. Works as designed.”

          I suspect this is why Firefox runs better on Windows than Linux/Mac as well – Windows has always had to run no matter the memory it has(Consider Ctrl-alt-del functionality has to exist, even if nowadays it is a bit slow to respond, if it can’t do that, it Blue Screens to make memory), so they’ve gotten better at anticipating leaks in high-level code and just sort of subtly maneuvering the memory as need be – that leak? Yeah, just put it in this page file for now, get it out of RAM for now.

          1. kerin says:

            that… is not how anything works.

            1. Alexander The 1st says:

              That’s how it seems to work, at least.

              You really have to leave Firefox open for a while before it’ll kick up your memory to a crawl on XP/Vista, as far as I can tell. And Flash never breaks on me unless I’ve been running it for 9 hours, and by that point, my network connection has been disabled 9 times.

              Yet I keep hearing about Macs and Linux complaining about Flash and Java being so unstable/unusable.

              Face it – it’s not the arrow (Flash/Java), its the Indian (OS). Or at least, that’s how it feels,

              1. Drexer says:

                Huh no.

                The Java/Flash problem in Linux is mainly the lack of support. From the developers regarding their products. As most work goes towards the Windows versions, Java and Flash in Linux have to use badly adapted versions or reverse engineered open source versions.

                You seem to suffer a quite badly evaluation of how Windows faults somehow make it ‘better’.

        2. Sean says:

          The number one reason I hate programming in Java – the garbage collector. When I handle my memory myself, I can free my pointers when I’m good and ready, and I know they’re gone, and I won’t have to go dredging through my code looking for leftover references when I run out of memory because the GC wasn’t GCing.

    2. DrMcCoy says:

      That’s what valgrind‘s memcheck tool is for. :)

      <3 valgrind; best thing since sliced bread.

      1. A Different Dan says:

        Oooooooooooh!

  11. ps238principal says:

    Isn’t the lead graphic a room with a bunch of stone slabs over a regular floor? I wanted a house with wood flooring and did something much the same, resulting in either sunken furniture or stuff that appeared to float over the floor.

    1. Deadfast says:

      Yes, it is. The furniture is actually sunken as you can see from the containers. If you don’t want that, why not just put 2 slabs on top of each other?

      1. ps238principal says:

        Actually, I just wound up using whole blocks of wood planks instead.

        I really don’t use slabs for much of anything, actually; I just wanted to point out the result wasn’t a bug.

        1. Deadfast says:

          Oh, my apologies, I misread your post.

          As for the slabs, they are awesome for making believable-looking roofs.

  12. Dan says:

    A computer is like a 4 year old child that adores you. He will do exactly what you tell him to no matter what it is. Even something that will end up hurting himself. He will also take every opportunity to misunderstand you. Especially if you try using big words.

    Programming is a language and like all languages has problems communicating exactly what you want. Especially when “words” can have multiple meanings. The machine must process. It must do the next step. Even if that next step is impossible (insert crash).

    This is why I hate things that try and figure out what you want done (*cough* *cough* IE). Do what I tell you. If there is a problem, do nothing. Don’t do what you think I want because if you do what you think I want and I actually want that, then I don’t know there is a bug.

    1. Alexander The 1st says:

      So you’d prefer IE to be made by Bethesda? :p

      I like my stability, thank you very much.

      Consider, for example, recovery modes in word processors. “Well hey, you didn’t tell me to save, but…I crashed, and…um…I figured you’d want this version of your file that I saved on my own prerogative rather than the other version from when you told me to save 2 days ago. I figured you might want this version later.”

      1. I was reading an article about how HTML standards came to exist, and one of the main *features* of HTML is that it doesn’t force you to have perfect HTML code. If you have a broken tag or an error, it just ignores it and moves on, loading everything else that IS working instead of throwing up a big ol’ error message and refusing to work.

        Why is this valuable? Because more than 99% of web pages have an error in them SOMEWHERE. People didn’t switch to XML because XML pages would just *stop working* if there was an error. Meaning that the entire internet would basically be inaccessible to your average user. That’s not good.

        1. Alexander The 1st says:

          Well, people do use XHTML, they just serve it as text/html.

          And yeah, especially for cgi-dynamic web pages, I wouldn’t doubt there’s usually an error in them somewhere.

        2. Soylent Dave says:

          It also makes html much easier for the average user to learn; the web page starts looking rubbish (or broken) roughly at the point where you cocked up the html (by failing to close a tag, or spelling a tag wrong or whatever it is you’ve done).

          It makes low level error finding really easy, and thus makes html much more accessible for new people (it’s less frightening – you quickly realise that doing something wrong doesn’t ‘break the internet’; it just makes your entire page italicised (or whatever)).

    2. Ben says:

      Thats not always the case. One of the biggest frustrations learning java from a C background is that the computer will not always do what you tell it to or just be really picky about doing certain things.

      That is also of course what makes Java so much better when working in a group, it enforces some basic style guidelines in marked contrast to C which is almost self-obfuscating. Working java code will in general be readable and understandable by another person, to the same with C requires conscious effort on the part of the programmer.

      1. psivamp says:

        Coming from a C background, I write very C-like Java code. Where other people will use String objects, I use char[]. I like loops. I’m not scared of pointers.

        The Java library has functions that won’t give the write answer because it deems it “too inefficient,” and there’s no way to override that behavior. I was trying to rewrite a helper library my university uses, but ran into limitations of the base Java library and didn’t feel like rewriting that level of code.

  13. MaxDZ8 says:

    He’s not a bad programmer, but he is not acting effectively at gearing up the QA for a multi-million dollar project. Perhaps it is not clear: the guy is now flush with cash. As you say Shamus, it is now a team project with a more than appropriate budget – Rob has explained better than me how this goes.
    It seems to me that the “beta” moniker will not go away. Look, it’s just beta. Is there a roadmap for gold?

    1. Paul Spooner says:

      Having worked with Notch, he’s very laid back about code. He simply expects code to work correctly, whether its his own or someone else’s. He’s also very easy to work with, but prefers to do everything himself. Freedom from the rigidity of a pipeline is one of the reasons he wanted to work for himself.
      That said, I agree that Mojang doesn’t appear to be scaling up into a disciplined development environment. Notch has had enough experience in software development to know that a QA process is absolutely required. I think that he’s just putting it off for now. I predict that “letting go” of the project will continue to haunt him with similar difficulties. But who knows.

      Minecraft does have a “release date” though. We’ll see if it sticks.

      1. Adamantyr says:

        I was afraid of that… Notch definitely shows signs of being development-centric.

        I work for a large software company, and despite their best efforts to turn things around, testing is still the “little brother” in the business. You can generally tell the companies that are suffering from this bias because their patches and code are crap in terms of quality, and they waste a lot of resources and time fixing things, until they end up getting swallowed by the bigger fish or file chapter 11.

        I wonder if Notch even HAS a set of suite 0 tests for his builds at all. I bet he just has some guys fire it up, try a few things, then packs it out for download.

  14. Old_Geek says:

    Wow. Sometimes I think I’m smart, then I read threads like this and realize I’m not.

    1. “Smart” and “knowing the particular arcane jargon that industry people know” are not the same.

      I love jargon, but I’m also aware that one of the reasons I love it is because heavy use of jargon can make you sound brilliant even when you have very little idea what you’re talking about. Most people find terminology they don’t know intimidating.

      I’m pretty smart, and one of the reasons why is that I’m capable of glossing over the jargon I don’t know and getting the gist of what people are saying. SOMETIMES jargon will trip you up, but not always.

  15. Gary says:

    Why on earth do you have a pumkin sitting amoung your crates and crafting tables? Seems kind of random :D

    1. Eddie says:

      Well obviously that’s an emergency pumpkin.

    2. RTBones says:

      Looks a bit like a Jack-O-Lantern, actually. Given the bright orange and the night outside….

    3. BenD says:

      In a world where everything is a cube, everything is also a table.

    4. Yar Kramer says:

      MS Paint Adventures fan response: What pumpkin?

  16. RTBones says:

    Hmmmm…bugs. The irony? Fixing bugs can sometimes “break” a program function – even if it wasn’t supposed to be a function in the first place.

    Example: 1.6.6 has the minecart glitch fixed. Minecart boosters no longer work. The problem? The issue has been around so long that folks rely on it. Any minecart system that relied on the glitch for energy is now completely broken. This has also brought out another bug – powered minecarts won’t push a minecart going east-west. So we now rely on the new powered rail for boost.

    Hills used to be a convenient way to get energy into your minecart using the glitch. No longer. Going to mean a re-design or twenty, and LOTS more mining for gold for my own cross-world railroad. Ugh.

    1. Deadfast says:

      Well, the change was logged as…

      Fixed minecarts next to each other causing extreme velocities (sorry!)

      …after all :)

      1. RTBones says:

        Indeed. I don’t begrudge the fix. I do wish powered minecarts worked better. It just means more mining. The world this rail network is on, I have two rules:

        1) Every resource used must come from ‘in game’ (i.e. no inventory editing) This means TONS of mining, as one particular rail line is LONG.

        2) No peaceful (i.e. I have had more than my share of Creeper attacks that required rebuilds)

        1. Deadfast says:

          Oh, I know, I love building railway system myself. I always get stuck building some insane one.

        2. Ian says:

          Even the powered rails can act a bit wonky in SMP. I had to run countless tests on the rail system that I’m using on the server that I’m running just to get the cart to consistently work. Despite conditions being fairly static, it still never stops in the exact same place.

          I admit that I haven’t messed with powered minecarts at all, so I don’t know how hard they are to work with (though it seems like it would be terribly inconvenient if they don’t move east-west!). I never really worked on a rail system until after the powered rails came out, so I just used those instead.

  17. Tomorrow says:

    …Are you gonna compare everything to writing now?

    Glen – “Hmm, this ham and cheese sandvich tastes funny.”

    Hamish – “Well Glen, the ham and cheese isn’t the issue, but why you’re eating it. When i write, i like to create a history around the characters before placing them in a setting, so they can interact in those settings in an interesting way. Your characters are the ham and cheese, the bread the setting – its how OLD they are that makes the difference.”

    Glen – “…So this sandvich is off then?”

    Hamish – “…Sure, if you consider the english adverb of ‘off’ as…”

    Glen – *punches out Hamish*

  18. Dev Null says:

    I'm not usually an apologist for companies who put out buggy software, but the game is in beta.

    Now I’m not saying thats what he’s doing here, because it sounds like he fixed this bug pretty darn quick, but there comes a point where “Its in beta” stops being a legitimate reason and starts being an excuse for why we can’t be bothered to fix anything. I call this the Google Point.

    1. BenD says:

      The word ‘beta’ is all but meaningless in the world of browser-accessed gaming. This meaninglessness is spreading to everything else, games and websites just happen to be on the frontlines.

      1. Sleeping Dragon says:

        In many cases it’s not so much an excuse as it is lack of a commonly recognized word for “in constant development”. People expect that if you release a game than it is going to be finished, some extras may be added later but the game itself is done. This is not the case with a lot of indie titles. Think Dwarf Fortress, Dungeon Crawl, Battle for Wesnoth… Each of these is pretty much a finished game, in the sense that it is playable from start to finish, but each is also constantly developed.

        On the other hand yeah, Kongregate had the beta tag for something like 2 years I think.

        1. kerin says:

          Dwarf Fortress is a bad example because the author still semifrequently does stuff like release updates that change (for instance) the ENTIRE SIMULATION OF WILDLIFE AND RESOURCE MANAGEMENT. You can call it finished software if you want but this kind of thing wouldn’t be tolerated in “finished” software.

          1. Sleeping Dragon says:

            But… that was my point?

  19. TSHolden says:

    There's a parallel saying for software engineers: Programming is debugging.

    There’s a similar phrase that I love:

    If debugging is the process of taking bugs out, then programming is clearly the process of putting them in.

    1. Dev Null says:

      I’ve always liked the quote:

      Debugging is twice as hard as writing the code in the first place.
      Therefore, if you write the code as cleverly as possible, you are, by
      definition, not smart enough to debug it.

      — Brian Kernighan

  20. X2-Eliah says:

    With regard to minecraft being in beta – Er, how so? You paid for it, it’s a product, it works – hence it’s a released version. Sure, notch is working on more stuff instead of just forgetting about it, but the beta moniker certainly doesn’t imply allowance for unsuitability..

    In other words, if it is sold, then it has to be good enough to be sold :) (And minecraft, all in all, is).

    1. Deadfast says:

      It does say beta on the tin though.

    2. Paul Spooner says:

      But in this case, the product is not the current version. The product is the promise of a future version. What you’re paying for is the confidence that Notch (and his team) will “finish” Minecraft. If there are still bugs when it’s “done”, that will be something to complain about. He is not selling the software in the current state though. Access to a playable beta is a perk.

      1. BenD says:

        This is a practice that makes us all completely enraged when it’s a AAA game. Will we be less enraged if the next buggy-as-snot Fallout game (for example) is released with ‘beta’ on the cover? I point to my comment above about the increasing and spreading meaninglessness of ‘beta’ as a word. Minecraft is contributing to the decay of the value of this token.

        1. Alexander The 1st says:

          I’m actually refusing to buy Minecraft until it’s in its final version myself for pretty much this reason.

          That, and when the authentication servers were down, and I gave it a try (During the “free weekend”), for some reason, the game locked out the “tutorial world”, and…needless to say, the game’s more difficult to grok then Dragon Age: Origins probably is. Though I read DA:O’s manual, so that might make me biased. I was annoyed when I had to look up on Youtube how to survive the first night. Because even when people pointed me to the wiki…the wiki servers were down. Presumably because the game was free.

          1. HeroOfHyla says:

            There never was a tutorial world. There was a button for it, but it never did anything. If I had to guess, he just stuck the button in to remind himself to get around to making it or something, or just to have the GUI layout finalized.
            He’s taken out the button for it entirely in later releases.

            1. Alexander The 1st says:

              Well NO WONDER I was confused. :p

              Here I was thinking he was just being anti-“free weekenders” by disabling the tutorial for us.

        2. Deadfast says:

          If it cost 15 Euros and updates were released periodically then yes, I wouldn’t be enraged at all.

        3. Adam P says:

          I think everyone would be enraged if they bought a Fallout game bearing “beta” on the cover. If it’s been packaged for mass production and marketed as being finished, then the release should not be a beta. You would not be paying for the product that is advertised to you.

          With Minecraft, you’re paying for what it says you’re paying for: the version that is going to be released on 11/11/11. What you are in fact paying for when you “buy Minecraft” is actually a pre-order for said 11/11/11 release, at a reduced cost. Beta (and previously alpha) access is just a bonus for pre-ordering, much like how one could “buy into” the Gears 3 beta by pre-ordering Gears 3.

          1. Paul Spooner says:

            Fully agreed. When the buggy 1.6 version came out, I just didn’t play for a few days while it was patched.
            I think what everyone is actually objecting to is having the illusion of a completed game challenged by bugs, incomplete features, etc. It is easy to become accustomed to think of Minecraft as a finished product, instead of a piece of software very much under development.

          2. Sleeping Dragon says:

            I can perfectly see how many people wouldn’t want to pay for an unfinished product. That said, for me the alpha version I paid 10e for alone gave me more hours of fun than many of the AAA titles. In short, if EA sent their assassins to off Notch even before minecraft went out of alpha and the development stopped there it would still be worth it for me.

        4. Cybron says:

          If it was advertised as a beta, was still in development (as befitting a beta), was sold with access to the final version, and was priced appropriately considering those factors (IE no, I won’t pay 60 dollars for an unfinished game)? Then sure. What’s the problem with that?

          The game was explicitly sold as beta. If you expected something else, that’s a failure of understanding on your end. The only real legitimate complaint that can be made is if somewhere along the line Notch breaks his end of the bargain, IE does not provide a finished version of Minecraft at some point down the line.

          If you don’t like it, don’t buy the game until it’s finished. But as it is, complaining about the current state of the game rather than its long term prospects only marks you as someone who’s made a purchase without bothering to read what he was buying.

  21. silver Harloe says:

    “Every C program of sufficient complexity contains at least one bug.

    Every C program with more than one line can be reduced by one line.

    Therefore every C program of sufficient complexity can be reduced to one line of code that doesn’t work.”

    That’s not mine, but I don’t know to whom to attribute the quote, sorry.

    1. Alexander The 1st says:

      Ah yes, I’ve seen this one at work too. Made me laugh, because in Python, you can’t do that. [/elitism]

  22. Sleeping Dragon says:

    You actually mention something I totally hate when people do. Talking about programming as if it is… I dunno… making a cake perhaps?

    In a thousand discussions about “why game X is glitchy” or “why does game Y run slow” I have heard these nonsensical arguments. “Well it’s the same genre as game X and they’ve been released the same year, they must be using the same or very similar code”, “they just need to take the code from the first part and add a few more weapons to it” and my personal favourite, the assumption that a non-flashy feature is easy to code “how hard can it be to add a a few lines that would let me command my companions? Just a simple ‘press button X-companion moves there'”. Yes, sometimes it is that simple (I’m looking at you, UFO:Extraterrestrials) but most often it is not.

  23. A motivating discussion is worth comment. There’s no doubt that that you
    need to publish more on this topic, it may not be a taboo subject but typically people don’t discuss such
    issues. To the next! Cheers!!

  24. Have you ever considered creating an e-book or guest authoring on other blogs?
    I have a blog based upon on the same information you discuss and would really like to have you share
    some stories/information. I know my subscribers would value your work.
    If you’re even remotely interested, feel free to send me an e-mail.

Thanks for joining the discussion. Be nice, don't post angry, and enjoy yourself. This is supposed to be fun. Your email address will not be published. Required fields are marked*

You can enclose spoilers in <strike> tags like so:
<strike>Darth Vader is Luke's father!</strike>

You can make things italics like this:
Can you imagine having Darth Vader as your <i>father</i>?

You can make things bold like this:
I'm <b>very</b> glad Darth Vader isn't my father.

You can make links like this:
I'm reading about <a href="http://en.wikipedia.org/wiki/Darth_Vader">Darth Vader</a> on Wikipedia!

You can quote someone like this:
Darth Vader said <blockquote>Luke, I am your father.</blockquote>

Leave a Reply to BenD Cancel reply

Your email address will not be published.