Category Archives: Blog Post - Page 4

League of Legends Character Data – an Idea

Gangplank - a champion in League of Legends

Gangplank - champion from League of Legends (he's a pirate! yarr!)


Today, on the way home from work, I had an idea. I’m posting it publicly so that I’ll feel more obligated to see it through.

Lately (read: the past year) I’ve been playing a lot (read: too much) of a little game that I like to call League of Legends (since that’s its name). It’s a really interesting game – it’s not ridiculously fast paced, but it’s very strategic. Before I explain my idea, I’ll explain the premise of the game. League of Legends is a tower defense game. Each game is played by two teams currently consisting of either three or five players each. The goal of each team is to destroy the other team’s nexus. In order to do this, a team must first destroy some of the opposing team’s towers (a.k.a. turrets – they do fight back) and at least one of the enemy’s inhibitors.

Each player plays a champion (there are currently over seventy to choose from!) which has unique statistics (for example, critical strike chance, attack damage, and armor) and abilities (for example, some champions have abilities which slow enemies, while others have abilities which cause them to take reduced damage for a certain amount time). Now, the really interesting part about this game is, in my opinion, the scaling aspect of it. At the beginning of each game, every player’s champion starts out at level one. Over the course of the game, each player’s champion will gain experience and gold from killing enemy champions, enemy minions and neutral monsters, destroying towers, and so on. The experience gained will cause the player’s champion to level up (to a maximum level of eighteen), granting access to new or upgraded abilities and increasing the champion’s statistics (such as armor or health). The gold gained will allow the player to purchase items for his champion which will either increase the champion’s statistics or provide some other benefit (or detriment to the other team). Games are often decided by who can “farm” the most gold and gain levels the quickest in order to overpower the other team (which, granted, always depends on a great number of other factors such as team composition and player skill). Nevertheless, it’s this scaling that is one of the main focuses of the game.

In fact, really good League of Legends players will spend a significant amount of time studying different item, mastery, and rune “builds” (masteries and runes perform functions similar to those of items but are not purchased with gold). It is this between-game study that my idea relates to.

I want to compare the properties of different champions. As I said earlier, each champion has different statistics which will affect what role they will take on a team. These statistics should be relatively easy to compile into a useful format for comparison – this is where I will start. Later on, it will probably be interesting to compile data about how different item builds, rune builds, abilities, etc. affect a champion’s performance, but those will be more complicated and will have to wait until later.

For those of you who read this blog for the coding-related content, fret not! There should be plenty of coding details in future posts in this series (ugh, i said “series,” I’ve got to follow through now).

Oh, and if you’re going to create an account for League of Legends (it’s free!), use my referral link (shameless, I know).

Keys to a stable application

Checkmark

Unit Tests!

If you don’t know about unit testing and the power and flexibility that it gives you then you NEED to get on board!
When your project has over 50% test coverage you’ll start to experience a strange feeling of confidence in the code that you’re writing. This confidence you’re feeling will be the fact that you’ve seen your code perform it’s duties over and over again with success.

Each time you run the tests after you’ve added code, you know that everything still works and that gives you huge peace of mind.

Obviously there are some other things you can aim for to aid this.

Like…

  • If you find a bug…write a test that exercises it and fails…THEN fix the code and see the test pass!
  • Aim for 80% coverage or more on the entire application.
  • Setup hooks in your version control that runs the tests before it lets you check in your code.
  • Use fixtures! If you interact with data then use fixtures! Do not pull from a live database! If you pull from a database on a server you’re introducing configuration issues and tighter coupling.

Want to learn more?

Version Control

I didn’t put this first because I assume that people use version control on their projects. If not on a RAID server or in the cloud then at least a simple Mercurial repository on their local machine.
The ability to track versions of your software is essential in providing long term stability to your application. Interestingly enough I don’t think that tracking your files is what brings stability from version control. Typically when you choose some form of version control there are prescribed methods that are suggested for the developers to interact with this version control. For subversion there is the idea that you’re supposed to have a “trunk” and then branch and merge back down. These methods of separation in work bring more discipline to the development of your application.

Obviously don’t discount the idea of having version tracking on your source code! Version tracking has an immense value in the development of your application. Version control makes it possible to track bugs down to the very line! Version control allows you to branch your project and work on many features in parallel! Best of all version control opens the door to a world of many developers working on the application at one time!

Want to learn more?

Best Practices

What can I say, Duh right?

If you’re in school right now, tell your professor to start teaching some best practices in an area they’re familiar with. You will benefit from these your entire life.

Want to learn more?

Testing

Pretty simple, do it! Make SURE that you test your code before you commit it and send it off to your QA process. There are now quick little changes in which you don’t have to test the actual user interface or consumer of your code. Do this! It’s freaking annoying when you don’t!

Make sure that you have an isolated environment(integration server) to test your code on! This will make it easier and it’s also very important for the next step as well.

In Django you can even use the built in server to test your application. Snap(Haskell) also has it’s own server.

Want to learn more?

Release Planning

This is interesting because it never came up on my radar until we started doing it, and then I realized how important it really was. I mean it’s obvious right? Here make this thing and then release it! Ok, how?  It’s also helpful to practice on your integration server(mentioned above) before releasing to production. This might sound silly but practice does make perfect!

Secondly, or maybe firstly, release planning just helps everyone know what their job is on release day.

Want to learn more?

Issue Tracking

Ok, I’ll be honest, I don’t know if this goes at the top or the bottom.  You can have issue tracking setup as your developing but one thing I know for sure is that you need it once you’ve released the product! Oh, and it really helps to have it public as well! Products like GetSatisfaction.com will help you communicate with your customers! And who’s input should you care about the most? The people that use your product!

The trick with issue tracking is that you must respond to the issues! The quicker the better in most cases.

Want to learn more?

Summary

The steps I’ve outlined here are not from any one particular process. These are just things that I’ve seen through trial and error that have appeared to work in my environment. I feel like they are high-level things that can be acknowledged and done that will increase the stability and maintainability of a software product.

What do you think? Feel free to comment! We can help each learn!

Save us from the NASDAQ Neo!

neo_stopping_bullets_Woah_Neos_Passport_in_the_Matrix_Expired_on_9112001-s460x311-82658-580

“Have you ever had a dream, Neo, that you were so sure it was real? What if you were unable to awake from that dream? How would you know the difference between the dream world, and the real world?” –  Morpheous, The Martix

That kind of sums up the previous NASDAQ bubble and perhaps even more so the current building bubble.

The NASDAQ is in a bubble again.

The NASDAQ is starting to bubble again.

Now I really hope that we’re not heading into a technology bubble, and I’ll tell you why.

I live in Michigan and from my perspective, industry in the United States is pretty much on the way out. My hope is that a the new industry of technology and services replaces material and goods. That might be kind of a bold statement  but let me see if I can explain why.

Simply, I think we should be preparing for the demand of it.  Technology and services are going to get more popular all around the world and I think the United States should be leading the way as far as that goes. We have the tools we need to really own this area but we seem to be lacking the motivation.

Neo, sooner or later you’re going to realize, just as I did, that there’s a difference between knowing the path and walking the path. – Morpheus, The Matrix

It is possible that all these companies (Pandora, Twitter, LinkedIn, Facebook, Skype) are trying to  walk the path. It is possible that technology companies may be more financial responsible than they were 10 years ago, but I guess that’s a ride we’re about to embark on.

It would be amazing to see these companies leading the way for a solid base to turn the United States into a true leader in this area. These companies have some of the greatest talent in the industry and they have seen all of this before so I think we could be on stable ground. What I hope will happen is that this boost in the technology industry can be contained and fully utilized to help it move in where other industries are leaving.

So here’s to an exciting future in technology!

Why I shouldn’t Facebook.

Well, at least I’m not alone!

Why I shouldn't be on facebook.

We're all guilty

Tradeoffs, Conflicts, Assumptions, and Principles

Do you ever face tradeoffs? “We’ll have to release right away and worry about quality later,” or perhaps you’ve heard something along the lines of, “That’s scope creep: just fix what needs to be fixed and leave the rest of the code alone.” These are some basic examples of tradeoffs every software company deals with. Do you release a buggy product right away, or wait until it’s in better shape? Do you make minimally invasive changes, or eliminate some technical debt while you’re in the code? Do you focus on producing more features, or fewer, higher quality features? If you’re working on a web app, you might have faced the tradeoff of creating very fluid interaction (using Javascript) that won’t work for some users versus less-than-fluid interaction that works for everyone. One debate that arose at the office the other day was whether to avoid code duplication by having all code in the same repository or to split code up into multiple repositories in order to avoid tightly coupling several unrelated projects that happen to use some common routines.

Tradeoffs are an age-old problem; “You can’t have your cake and eat it too,” is a well-worn phrase. But is it true? Tradeoffs indicate that a conflict is lurking, a contradiction persists, unaddressed, undermining everyone’s efforts to do the best they can. The developers might want to have a high-quality product, but management is anxious to get their foot in the door of a new market. Who’s right? Which tactic should be taken? How will the most revenue be realized?

Allow me to make a bold statement: you can have your cake and eat it too. You don’t have to make tradeoffs. When someone says you have to make a tradeoff between A and B, don’t believe them. A tradeoff indicates a conflict, and if you can resolve the conflict, you don’t have to make the tradeoff.

The first step is to identify that there is a conflict. Anytime you start talking about tradeoffs, you are talking about conflicts in disguise. Either/or thinking means: conflict. Mandates (“I don’t care if it makes sense, get it done”) mean: conflict. Feudal thinking (“This is my turf”) means: conflict. Unexplained legacies (“I know it doesn’t make sense, but this is how we’ve always done it”) mean: conflict. Practice identifying conflict. We’ve spent so much of our lives living with conflicts—managing them instead of resolving them—that we’ve stopped recognizing conflicts when we see them. Learn to start noticing them again. As they say, admittance is the first step.

Once you have a conflict in hand, it’s your job to figure out what makes it tick, and that means finding the assumptions behind it. For this, I find Goldratt’s conflict resolution diagrams to be very helpful (if you haven’t, read It’s Not Luck).

A conflict resolution diagram illustrating the conflict between changing projects quickly and addressing problems in existing products

The basic premise is that most conflicts arise out of trying to serve a single goal in two different ways. In the above, very real example of the developers who want to address problems with the existing products and managers who want to get on to new products, the goal is the same for both: have valuable products. Management sees keeping products relevant in new markets as the means of providing valuable products, while developers see creating high-quality products as the way to go. Is either of them wrong? Not in the least! Both paths will improve the value of the product to users. Which do you choose? Why do you have to choose? Because, you say, there is a conflict (good eye): you can’t move onto new projects AND address issues in old products.

There are several assumptions involved in this conflict. Each arrow in the above diagram is an assumption. One is that entering new markets will increase the value of the product. Another is that changing to new projects will get you into those new markets. On the other side of the conflict is the assumption that creating a higher quality product will increase it’s value, and that staying on old projects has to happen in order to improve the quality of existing products. Lastly, there is the conflict itself: that you can’t both move onto new projects and address problems in existing products at the same time.

If you can invalidate one of the assumptions, you can resolve the conflict. After all, the assumptions are what create the conflict. Without one of them, the whole problem collapses. Why can’t you both move onto new projects and address problems in the existing products at the same time? What’s stopping you? The number of developers? Okay, double the size of your team and you resolve the conflict. Not an option? Alright, let’s move on to the next assumption: changing projects quickly will allow you keep your product line relevant. What would it take to invalidate that assumption? Are there other ways to keep the product line relevant in the marketplace? If you can find one, you can invalidate the assumption that you have to change projects on a regular basis. What about the assumption that you have to stay on old projects in order to address problems and create a higher quality product? What if you spent one day a week addressing existing problems? Would that be sufficient to create a higher quality product without staying on the same old projects for month after month? If it will, then you can change projects quickly and still create higher quality products.

There are other assumptions involved in this scenario, but the premise is the same: if you can find the assumptions in play, and unravel one of them, you can remove the conflict, which means eliminating the tradeoff. Instead of having to stick to old projects or change to new ones, you can now change to new projects AND address problems in existing products. You can have your cake and eat it too.

What if you just can’t resolve the conflict? What if the tradeoff just has to be made? That sounds suspicious—even defeatist—but I’ll bite. In the event that you have to make a tradeoff, a decision has to be made. It’s been said that a decision is something you must make when you have incomplete information: you don’t know absolutely what the best course to take is, so you have to choose, you have to decide. Trying to gather more information is not a decision, it’s an attempt to know for certain so a decision doesn’t have to be made. I’ve seen people in power put decisions into endless cycles of information gathering because no one wants to make a decision for which they’ll have to be responsible. Part of the reason this happens is because there are no principles to fall back on.

Principles are devices that tell us what to do when a conflict cannot be resolved. For instance, “Always tell the truth” is a principle. Most of the time, it does not come into play because there is no conflict, but when you’ve broken a window with a baseball, that’s when it’s necessary. If you do not adhere to the principle of always telling the truth, you might be tempted to indefinitely weigh your two options: run away or admit that you did it? With the principle, however, you have only one option: admit to it. There are no long cycles of information gathering, collecting survey results on the consequences of admitting to it versus going on the lam. You know precisely what to do because you have a principle to go by.

In business, most decisions are not so morally cut and dried. They can require research. But without guiding principles, the decision might never come out of research mode. In the standoff between the developers and managers over moving on versus fixing old problems, what’s the solution? If you decide that you can’t have your cake and eat it too, what do you do? In some companies, the principle may seem to be, “Managers get what they want.” That may be a fact, but it’s not a principle. If the principle is, “Enter new markets as quickly as possible,” it’s clear what should be done. If the principle is, “Have the highest quality product available,” the decision is obvious. Neither of these is right or wrong; whichever one you choose to abide by depends on your priorities as a company. The important part is to have backing principles. Without a set of guides to go by, you’ve got nothing but politics guiding your company, which means you sail in dangerous waters.

Leaders are important to a company, but their role shouldn’t be resolving day-to-day conflicts. When Andy and Bob have an argument over whether to use a lot of Javascript on the site or to make sure that the site works for those without Javascript enabled, they shouldn’t have to turn to a leader to make the final decision. The leaders in the company should have laid down a set of principles that make the decision obvious. The principle in play might be, “Have the best interaction experience possible,” or it might be, “Make it work for everyone.” Which it is will affect what’s done. The job of a leader isn’t to play mommy, resolving squabbles all day long. The job of a leader is to lay down principles that solve the squabbles without their involvement.

Pointless Rants is now on your Android!

Pointless Rants Logo

Yeah that’s right! In case you hadn’t noticed we have an Android application!
I wrote it a while ago just to learn a little about the Android platform. It was a good learning experience and I think I can really expand it if I have the time.

I would also like to develop an iPhone and Windows Phone 7 version as well, but time and resources are limited. I have been thinking about releasing the source code for the application, so if you’re interested in developing it further let me know.  I currently have it hosted on bitbucket.org but it is a private repository.

Here’s somethings I would like to add…

  • Tabbed content for podcasts/screencasts.
  • Notification of posts/podcasts
  • Better navigation of categories and tags
  • Search

Here’s the link and QR code!

Click to download: Pointless Rants Android App

It’s very simple for now, simply an rss reader directed to the site.

I hope to expand the content of the site and bring the app along with the expansion.

That is our goal this year. Anyway, enjoy and thanks for stopping by!

UPDATE: Podcasts fixed!

DanielBedell.com informed me that my podcasts were not playing on the site!

They’re fixed now so enjoy!