'The Great Northern Creative Expo' awards 2018.
Peter Dimitrov,
James Moorby and
Jakob MacDonald were nominated for their creative excellence and passion for their subject.
Developer: | Sega | | | Release Date: | 1991 (1990 NA) | | | Systems: | Mega Drive, Master System, Game Gear |
|
Sometimes I get stuck and look for a way to think about a problem a different way. There are some problems that you can view in the form of a matrix/table. The structure looks like this:
A | B | C | D | E | |
---|---|---|---|---|---|
1 | A1 | B1 | C1 | D1 | E1 |
2 | A2 | B2 | C2 | D2 | E2 |
3 | A3 | B3 | C3 | D3 | E3 |
4 | A4 | B4 | C4 | D4 | E4 |
5 | A5 | B5 | C5 | D5 | E5 |
There are rows and columns, and I'm trying to work on the cells. Let's try an example from a simple game:
Attack | Defend | Special | |
---|---|---|---|
Fighter | sword | armor | slam |
Mage | fireball | reflect | freeze |
Thief | dagger | dodge | disarm |
The rows are the character classes: Fighter, Mage, Thief.
The columns are the types of actions: Attack, Defend, Special.
The matrix contains all the code to handle each of these types of actions for each of the types of characters.
What does the code look like? The usual thing to do is to organize this into three modules:
Fighter
will contain code to handle sword attacks, damage reduction from armor, and slam special attacks.Mage
will contain code to handle fireballs, damage reflect, and freeze special attacks.Thief
will contain code to handle dagger attacks, damage avoidance from dodge, and disarm special attacks.Sometimes it's useful to transpose the matrix. I can organize along the other axis:
Fighter | Mage | Thief | |
---|---|---|---|
Attack | sword | fireball | dagger |
Defend | armor | reflect | dodge |
Special | slam | freeze | disarm |
Attack
will contain code to handle sword attacks, fireball attacks, and dagger attacks.Defend
will contain code to handle damage reduction, damage reflect, and damage avoidance.Special
will contain code to handle slam, freeze, and disarm.I was taught that the one style is "good" and the other style is "bad". But it's not obvious why this should be so. The reason is that there is an assumption that we will often add more character classes (nouns) but rarely add more types of actions (verbs). That way I can add more code with a new module, without touching all the existing ones. It may or may not be true for this game. By looking at the transpose, it makes me aware of the assumption, and I can question it. I'll then think about what kind of flexibility I want, then decide on the code structure.
Let's consider another example.
In programming language implementations, there are different types of nodes corresponding to the primitives: constants, operators, loops, branches, functions, types, etc. I need to generate code for each of these.
Generate Code | |
---|---|
Constant | |
Operator | |
Loop | |
Branch | |
Function | |
Type |
Great! I can have one class for each type of node, and they can all derive from a superclass Node
. But this is based on the assumption that I will often add more rows and rarely add more columns. What happens in an optimizing compiler? We add more optimization passes. Each one is another column.
Generate Code | Data flow | Constant folding | Loop fusion | … | |
---|---|---|---|---|---|
Constant | |||||
Operator | |||||
Loop | |||||
Branch | |||||
Function | |||||
Type |
If I want to add a new optimization pass, I would need to add a new method to each class, and all the code for an optimization pass is spread out all over the place. This is the situation I was trying to avoid! So some systems will add another layer on top of this. Using "visitors" I can keep all the loop fusion code in one module instead of splitting it up among lots of files.
If I look at the transpose of the matrix, it reveals another approach:
Constant | Operator | Loop | Branch | Function | Type | |
---|---|---|---|---|---|---|
Generate code | ||||||
Data flow | ||||||
Constant folding | ||||||
SSA | ||||||
Loop fusion |
Now instead of classes with methods, I can use tagged unions with pattern matching (not all languages support this). This keeps all the code for each optimization pass together without requiring the indirection of visitors.
It's often useful to look a a problem in terms of a matrix. Applied to the object-oriented structure that everyone thinks about, it might lead me to use something different, such as an entity-component-systems, relational databases, or reactive programming.
It's not just for code. Here's an example of applying the idea to products. Let's suppose there are people with various interests:
Nick | Feng | Sayid | Alice | |
---|---|---|---|---|
cars | X | X | ||
politics | X | X | ||
math | X | X | ||
travel | X | X |
If I were designing a social web site, I might let people follow other people. Nick might follow Alice because they're both interested in cars and Feng because they're both interested in travel. But Nick would also get Alice's math posts and Feng's politics posts. If I consider the transpose of this matrix, I might let people follow topics. Nick might join a cars group and also a travel group. Facebook and Reddit started around the same time, but they're transposes of each other. Facebook lets you follow people; Reddit lets you follow topics.
When I get stuck, or when I'm wanting to consider alternatives, I look at the problem to see if there are multiple axes of organization. Sometimes approaching the problem from a different direction can yield a better approach.
When I walked into the room, I saw a deadly asp on the other side of it. I didn't want him to get too close, so I killed him with my shurikens. I wanted to eat his corpse to get intrinsic poison resistance, but I didn't have any artificial resistance, so I knew trying would kill me. I had three unidentified rings, one of which might have been a Ring of Immunity, which would have protected me from poison while I ate him, but I only had one Scroll of Identification, and I was hoping to hold onto until I found a Scroll of Blessing because blessed Scrolls of Identification identify everything in your pack. I tried one of the rings blind, but it turned out to be a Ring of Relocation, and it teleported me to another part of the dungeon. While I was trying to make it back, I stepped in quicksand and started to drown. The only thing I could think to do was drink an unidentified potion, hoping it was a Potion of Phasing, but it turned out to be a Potion of Lycanthropy, and my character dropped all his stuff when he changed into a werewolf, then ran around the dungeon killing everything he encountered for a few minutes. Eventually, he turned back into a man, but I got killed by another deadly asp before I could get back to my equipment. C'est la vie.
![]() |
And maybe stay away from mushrooms entirely. |
![]() |
I had lycanthropy for a while. It was worse for the other creatures in the dungeon. |
![]() |
Using my horn to collapse the ceiling on a roomful of deadly moss. |
![]() |
At least the hill giant probably won't make it out, either. |
![]() |
What kind of potion was that!? |
![]() |
In retrospect, the best answer would have been: "I wish I wasn't so excited about having found a Wand of Washing that I'm failing to notice the dude coming up from the southeast." |
![]() |
Thankfully, my Ring of Translocation will eventually get me out of here. |
![]() |
That's one logistical concern I no longer have to deal with. |
![]() |
This seemed like a unique enemy, so I thought there would be more to him. |
![]() |
Entering the temple. These special screens help create an atmosphere lacking in a lot of roguelikes. |
![]() |
I like that the game supports these special options in addition to the usual plethora of roguelike commands. |
Out of all the privacy-focused products and apps available on the market, Brave has been voted the best. Other winners of Product Hunt's Golden Kitty awards showed that there was a huge interest in privacy-enhancing products and apps such as chats, maps, and other collaboration tools.
Last year has been a pivotal one for the crypto industry, but few companies managed to see the kind of success Brave did. Almost every day of the year has been packed witch action, as the company managed to officially launch its browser, get its Basic Attention Token out, and onboard hundreds of thousands of verified publishers on its rewards platform.
Luckily, the effort Brave has been putting into its product hasn't gone unnoticed.
The company's revolutionary browser has been voted the best privacy-focused product of 2019, for which it received a Golden Kitty award. The awards, hosted by Product Hunt, were given to the most popular products across 23 different product categories.
Ryan Hoover, the founder of Product Hunt said:
"Our annual Golden Kitty awards celebrate all the great products that makers have launched throughout the year"
Brave's win is important for the company—with this year seeing the most user votes ever, it's a clear indicator of the browser's rapidly rising popularity.
If reaching 10 million monthly active users in December was Brave's crown achievement, then the Product Hunt award was the cherry on top.
The recognition Brave got from Product Hunt users shows that a market for privacy-focused apps is thriving. All of the apps and products that got a Golden Kitty award from Product Hunt users focused heavily on data protection. Everything from automatic investment apps and remote collaboration tools to smart home products emphasized their privacy.
AI and machine learning rose as another note-worthy trend, but blockchain seemed to be the most dominating force in app development. Blockchain-based messaging apps and maps were hugely popular with Product Hunt users, who seem to value innovation and security.
For those users, Brave is a perfect platform. The company's research and development team has recently debuted its privacy-preserving distributed VPN, which could potentially bring even more security to the user than its already existing Tor extension.
Brave's effort to revolutionize the advertising industry has also been recognized by some of the biggest names in publishing—major publications such as The Washington Post, The Guardian, NDTV, NPR, and Qz have all joined the platform. Some of the highest-ranking websites in the world, including Wikipedia, WikiHow, Vimeo, Internet Archive, and DuckDuckGo, are also among Brave's 390,000 verified publishers.