Day 281 – Nature of Programming

85 – “Hello World” in 100 Programming Languages

This is a more technical post than the usual 365 fare.
Apologies to the non-programmers.

On the face of it, programming is about creating programs that do something useful. Turning a problem into a solution. And hopefully a working one at that.

To me, programming is about quite a bit more than that; it’s the act of taking an abstract idea and trying to encode all aspects of that idea into a correctly functioning piece of software. I use the word “trying” with purpose, because expressions in real-world programming languages are all just approximations of this ideal. Real-world programs always have some level of defects and “good enough” about them.

In the first instance I’d always strive for the ideal though.

Programming languages provide a great many tools to express meaning; comments, named variables and methods, automated tests, type systems, code contracts with formal verification.

The strongest expressions of meaning are always preferred; a formally verified code contract beats using parameter types alone. Boxing-in the meaning through parameter types beats well considered names. And even code comments beat constraints inherent in the idea that are left un-expressed altogether.

Every piece of meaning from the original idea that is added to a piece of code improves the chances of it getting implemented and maintained correctly. Additional meaning might have the compiler catch you in a lie before it becomes a bug. Additional meaning might help you remember the nit-picky details of how things hang together when you try to work on a piece of code years after you originally wrote it.

When I start with an idea, I look at it from all the angles. I try to work out what the underlying truths of the idea are. And then I try to find a way to translate all of these truths into pieces of the program.

Code contracts can expose code paths that can lead to null pointers where my feeble brain told me it was impossible for them to appear. Exploiting the type system can let the compiler warn me when I’m about to crash the Mars lander by mixing up my feet and metres. Expressively naming my methods and variables can help me spot where I’ve forgotten to sanitise a user-input.

And the trick is to push the encoding of concepts as far as possible into the strongest encodings the language has available.

Sure, I could make all my variables dynamic, then add unit tests to verify appropriate behaviour by variable type… but why not use a strong type system instead? Dynamic variables should really only be used where there is no alternative; maybe because some aspect of the strong type system is too strong to express the flexibility inherent in an implementation. But to use them routinely and then patch the hole with unit tests shows a very profound misunderstanding of the purpose of the type system.

Sometimes approaches can be combined to make an even stronger encoding of a concept. Just using Hungarian Notation to differentiate sanitised user input from un-sanitised user input is a good start… but adding program-wide automated testing in the build system to verify that variables using the naming convention for sanitised input only are assigned from sanitised input, or from the sanitisation method reinforces the concept in a way that makes it almost part of the language itself. A visible portion of the code that is verified by almost-the-compiler.

And there will be concepts that are hard or impossible to encode to the ultimate degree.

A variable name can indicate that the assigned value should only ever be a prime number… but there is very little that can be done to guarantee this is true, beyond hoping everyone is careful not to break that promise in the code. There is no way to reasonably implement a strongly typed “PrimeNumber” type.

But that doesn’t mean we shouldn’t keep trying.

And sooner or later, the ad-hoc encodings that have broad use and applicability will turn into new programming language paradigms for the next generation of languages. And they will be harder to program in… but only because they won’t allow us to be nearly as imprecise with our “words”.

You can lament the fact that not using dynamic variables means that you need to put in some extra effort… but all I hear is “why can’t you let me have some more hard-to-diagnose bugs?”

My Fourth Kiss

Flirty Kiss

Flirty Kiss

The Fourth Element: Chocolate Brownie.

Flirtily (!?) Unboxed

Flirtingly (!?) Unboxed

Ready for chocolate overload.

Flirtingly Bitten

Flirtingly Bitten

Rich chocolatey fudgey goodness inside.
Not too sweet, and gooey and crunchy in just the right amounts.

Ranking refresh: First Kiss / Flirty Kiss (shared first), Passionate Kiss (second), Loving Kiss (third).

Only one chance to out-shine them all…

Day 280 – Quick Brown Fox

86 – The 100 Best Typefaces of All Time

I never really think too deeply about fonts. It’s an interesting enough topic, but there are only so many hours in the day and I have to draw the line somewhere.

Whenever I do think about fonts, type design strikes me as an oddly archaic or niche job. I know there are type designers out there, creating new fonts I write this… but call me a heretic; I think most if not all our everyday font needs are well and truly satisfied with what we have.

When I set up this blog I played around a bit with the font selections; I tried a few variants on the classics, I tried a few playful fonts, and I tried a few dreadful ones. But in the end, I always return to close-to-classic because it just works best.

It is very easy to get carried away with fonts. There is a siren-song about font selection that tempts me with infinite possibilities. It tries to make me forget about anything but fonts. It lures me into fonts-for-fonts sake thinking. And that’d be fine if the sole purpose of this blog were to showcase its design.

I don’t want my font choices to be a distraction from the writing, because… then what’s the point?

Helvetica

Helvetica (and Arial and Calibri) may feel “boring”, but that may not be a bad thing. The reason it might feel boring is because it’s everywhere. And it’s everywhere, because it works. Why wouldn’t you want to pick a font that works? Ignore the knee-jerk reaction, and stick with a nice boring classic unless you can articulate why you need something else.

Frutiger

Frutiger (and Corbel) looks familiar but hard to place. It’s a font that gets used on airport signs (and I believe some road signs) specifically because it is very easy to read at a glance for short fragments. Ideal for direction signs. This might also make it a perfect font for headings perhaps?

Garamond

Garamond (and maybe Constantia) look a little old-fashioned, but nice regular and rounded. There is a lot of debate about whether serif or sans-serif is better for readability of body text, but since new studies continue to find for alternating sides in this debate it probably has more to do with familiarity with the font than whether it has little dangly bits.

Times

Times (and Times New Roman and Cambria) are a more modern choice for serif-ed fonts. I personally would look at the serif/sans-serif as more of an issue for visual contrast than whether one is more legible than the other.

Bodoni

Bodoni feels a bit squished to me. Technically I believe this is closer to the definition of a “modern” font, but I could be mistaken. My mind associates it with headings in magazines that have a very high opinions of themselves and their design-cred. This is probably a bad sign. I’m unlikely to every use this myself.

If design and type interests you, I really recommend reading “The Non-Designer’s Design Book” by Robin Williams (no, not the actor). It is a very lucid and simple introduction to the rules of design.

And I’ll leave you with some Commandments…

My Third Kiss

Passionate Kiss

Passionate Kiss

Next in line: Tiramisu.

Passionately Unboxed

Passionately Unboxed

These really are indistinguishable from the outside.
I could buy a stack of these and mix them around for pot-luck.

Passionately Bitten

Passionately Bitten

A little sweet, but not too much.
Sponge-finger-bits also small… but the flavour is sufficiently convincing.

Ranking so far: First Kiss (best), Passionate Kiss (second), Loving Kiss (third).

Day 279 – Results May Startle You

87 – 100 Tips To be a Lady

First, let me acknowledge this is a very problematic list.
The tone set by the title is very uncomfortable to start with, and the content doesn’t manage to avoid overt sexism. More on that later.

First…

The Score

Have you tried matching yourself against the list?
I did.
The Results May Startle You!

If I disregard all the questions that have gendered language making me ineligible to say yes, I still score 64%. If I simply gender-flip the gendered questions, my total goes up to 81%! I feel more elegant already; I wonder if I should go buy a black dress?

Logic

A large swathe of the questions are surprisingly easy to answer “yes” to as a man. Many of them make assumption about what the reader wants to do; if I don’t, then the statement is true for me by default. Some examples.

4. Only wear heels if you know how to walk in them.
Because I don’t wear heels, this is automatically true.

7. Never show too much leg or too much cleavage at the same time.
I never show cleavage, so this is also automatically true.

24. Your make up does not have to look natural, but make sure it looks clean.
I never wear make-up, so this is automatically true as well.

Universal

About 37 of the statements are really things everybody should be aspiring to, regardless of any other factors. I have to admit, I cannot actually tick all of them myself, but I’m working on it.

12. Remember birthdays and send thank you notes.
I wish I were better at this, but my memory is shocking. Time runs away with me, and once I catch up it is far too late to do anything about it. But what does this have to do with being a lady exactly?

55. Do not interrupt people speaking to you.
This is much harder than it sounds in theory. It’s hard to listen and not speak to begin with. And every once in a while I find myself in a conversation where I really want to say something, but there are no gaps, so the only way to get in is to crowbar in an interjection.

Sexist

I was hoping to be surprised what I would find at the other end of the link, but sadly I found enough of what I expected.

6. Enjoy the fact that you are a woman and men will enjoy it, too.
I’m not sure what this is supposed to mean.
I know what it sounds like, and it makes my skin crawl.

56. Never ask if you look fat.
90. Exercise and stay fit ! A lady isn’t overweighted.
I don’t even know what to say.
I’ll comment on the atrocious grammar, because it’s easier than saying something coherent about the sentiment.

63. Don’t use fake tears to win something.
I think… I’m going out on a limb here… but I think… most adult women do not in fact do this.
But feel free to propose a few more tips for non-existent problems that make women sound like they’re only two steps away from being spoiled 12-yr-olds.

96. Never let a man define you. Be amazing on your own!
Except, in as much as you should be following these tips to be a lady of course.

Bizarre

And then there is one more that I just couldn’t even wrap my head around.

73. Don’t eat your roll like an apple. The courteous way to dine on bread is to tear off a bite-size piece and pop it in your mouth.
If anyone has ever seen someone eat a roll in the fashion described here, please let me know. Or even better, send a picture!

Day 278 – Life: A Game Review

88 – 100 Dumbest Ways To Die In Video Games

This game is not for the faint-of-heart. Although the scope and complexity of the game-world and storyline are truly awe-inspiring, the game is not without its flaws. What makes it needlessly harder is the missing save/restore feature. There is widespread evidence that the quality of the gaming experience is highly variable. And the sheer number of options presented along the way just leave an uneasy feeling of missing out on many interesting side-quests and possibilities.

The structure of this game is very unconventional. So far I have managed to play 3 chapters, and the rules and character of each is very distinct. The first chapter is a drawn-out introductory game that explores the controls and world-mechanics. The second chapter has a complex levelling / up-skilling system that I have only managed to scratch the surface on. And the third chapter seems to consist of a very free-form MMRPG.

It isn’t clear what other chapters there are, but so far the game is incredibly engrossing… and frustrating. On several occasions I have made really stupid choices leaving me reaching for the non-existent restore. Those moments sometimes linger and haunt as I keep playing.

Despite the frustrations though, it is a very compelling and enjoyable game*. Not quite as tough as Battletoads, but perhaps a little too close for comfort.

I would easily give it an 8/10 at this stage.

Chapter 1: Orientation

When I started the game, my character was almost completely auto-generated. At first this was most definitely a boon, because there are many thousands of attributes that affect the character. It didn’t take long before I started wishing I had some control over a few of the attributes, but on the whole I have a well-rounded character, so I cannot complain.

In this part of the game I was given two other players to show me how the game works. This is a feature of the game; there is no manual or FAQ, all the game mechanics and controls must be discovered in-game and handed down from gamer to gamer. It does leave me with the uncomfortable feeling that there are mechanics built into the game that nobody has uncovered yet.

One of the earliest quests I tried was the “build-with-blocks” quest. It sounds easy now, but it was by no means so at the time. Early on in the game, the controls felt a bit like Octodad; wildly out of control and not responding well to my instructions. Luckily it seemed that the more quests I completed, the more control I gained. Now I don’t even think about it any more.

In retrospect, it seems that there weren’t really any concrete goals in the first chapter. None of the quests were of any consequence to the further unfolding of the game.

Chapter 2: Choose Your Skills

I was sent to “School” early in the second chapter. I gather this is generally what happens, although it seems there is a bug in the game that causes some players to lose out on this extensive quest-line.

This chapter is an interesting, but extremely challenging part of the game.

For one thing, the rules do not seem fixed for this part of the game. The overall world-mechanics are fixed, but the structures and rules surrounding player-interaction seemed to change constantly. Additionally, character-development seems to come with quirks.

As part of the growth process the game throws random challenges your way and my rewards and future opportunities were heavily influenced by how I reacted to these. The “bad skin” quest was in particular challenging since I started the game with a high “fidget” attribute; although the high “fidget” score has been a boon at times, it also means this particular quest left me somewhat scarred.

Another mixed blessing at this stage are high “intelligence” and “insight” attributes. Although it makes most of the quests down the “science” branches of the skills tree very easy, it seems to have the side-effect of making the “social skills” quests harder to reach. I seem to have been lucky not to get incorporated into any “bullying” quests.

This is another interesting and annoying feature of the game. A lot of quests seem to incorporate other players in a variety of roles, meaning that players can actually end up at-odds with each other over quest completions. This is an ongoing feature of the game in the next chapter, and it doesn’t get any easier there.

The only other thing I want to touch on is the awe-inspiring depth of the skills tree. When I reached this chapter there were already many branches to explore, but it would seem that as time progresses the skills tree itself continues to evolve.

Although levelling and up-skilling is a much smaller part in the next chapter, it continues to play a minor role so I am still watching developments in the skill-tree and considering options to train my character a little further.

Chapter 3: Into The Wide-Open

Another major quest-line opens this chapter of the game. It’s called “entering the workforce”, although that’s a bit of a misnomer since it is a continuing line to this moment.

So far I have found the rules and mechanics of this chapter consistent throughout, even if my understanding of them is evolving. There seems to almost be a fractal nature to the game itself here. Every time you study a portion of it to decipher its rules, it is shown having an infinite layering of complex self-referential detail underneath. I have gotten somewhat obsessed with the nature of the game itself during this chapter, and although there are official quests galore, I have invented my own side-quest in which I try to understand not so much the structure of the game, but the very nature of the game and how it folds back on itself. I really have no better way of explaining.

Another interesting aspect of this chapter is that many of the quests on offer get presented as “social conventions”, which means that you are heavily pressured into accepting the quests regardless of whether you have an interest in playing them. Other quests that go counter to these “social conventions” are hidden in the game, but take much more effort to discover and unlock.

What I found increasingly frustrating in this chapter is that many of the choices I made seem to affect my ability to take on certain quests. The quest-lines are much stricter, and start unlocking on attributes you may not have. Although there are still options to further develop my character during this part of the game, it takes more effort because the game is not really structured to accommodate personal development well along the major quest-line.

I’ve heard of characters that have decided to forego the major quest-line with mixed results. For some this has opened up a wider range of possibilities (this seems to coincide to a high degree with high “imagination”, “initiative” and “drive” attributes). For most players this is actually a much harder path though because you become reliant on completing many smaller quests to meet the same goals you can reach much more quickly with the main quest-line.

Strategy Guide

I recently read the excellent Strategy Guide that is now available for this game. It has given me a few new insights into the game, but sadly also has confirmed some suspicions I had about the game.

I found the explanation of how various stats interact very insightful, albeit a bit high-level. I would have loved to see the Strategy Guide explore the skills tree and attributes in more detail.

It also confirmed my suspicions that certain skills are dead ends, while others open up many varied possibilities. I hadn’t realised the value of “Psychology” until reading the guide.

I seem to have accidentally stumbled on a few good early choices without realising it. And from what it explains I have been blessed with character traits and skills that have massively simplified my game-play. On the other hand that makes me wonder if I should have taken a gamble on a few of the higher-risk-higher-reward quests earlier in the game.

And this is where the absence of a save/restore feature is most annoying. There are some alternate paths I’d love to try, but the access quests have now been locked off forever by my attributes unless I find a bug/feature/glitch in the game that allows me to get around the primary access quest. Also, there are a few decisions I’ve made that I would really like to change, even if I had to re-play some portions leading up to them.

Overall this is only a minor gripe though, because the infinite fractal nature of the game leads me to believe that there are probably variants on the quests I have missed out on that I can still reach later in the game if I wished.

And every once in a while, stories circulate that other players have found ways to reverse some of the attribute changes that have locked off quests… as well as a persistent rumour of a chapter they will release later that will allow players to move between chapters and infinitely access earlier quests turning it into a truly open-ended game.

I’m not bored with the game-play yet.

I recommend you give it a try.


* – As I alluded to, there are wide-spread indications that the quality of the game experience is highly variable. This seems tied to certain racial, gender and personality traits that are locked early in the game. More-over, it seems there is no way to freely choose these traits; the Strategy Guide seems to confirm this. As a result, there are large groups of players that are simply grinding through the game waiting for a chapter that is more balanced, or others that simply close the game and un-install. Again, I think some more play-testing and a more balanced rule-set could make this a more universally enjoyable game.

My Second First Kiss

I have to correct an earlier article on this blog. I cannot let a factual error of this magnitude stand. When I wrote my earlier Magnum Kisses post, I was under the mistaken impression that this was a line of 5 First Kisses. As it turns out, it is merely a line of 5 Kisses. My apologies for the grave error. I will take full responsibility for the mental anguish this may have caused.

Now…

On to the second kiss.

Loving Kiss

Loving Kiss

Streets have labelled this one a “Loving Kiss”, and it supposedly has “Meringue and Red Fruits”.

Lovingly Unboxed

Lovingly Unboxed

Externally, no different to the first kiss…

Lovingly Bitten

Lovingly Bitten

But internally… a bit of a disappointment. It has everything it says on the box, but not as I expected. The “Red Fruits” are a slightly-too-sweet jam, and the “Meringue” bits are there, but only if I really pay attention. I guess there is a limit to the size of the meringue that can go inside a Magnum, but still.

So far, the first kiss is best.

Day 277 – Defeat: A How-To Guide

89 – Top 100 Places to Eat in Sydney

My morning stint at the gym felt great during the doing, but left my legs more wobbly than I had anticipated. This would not normally be a great concern, but today I was going out and options calling for walking were on the table. I feared I might be reduced to crawling as my only means for survival.

“Luckily”* it turned out that neither Lexi nor Abbey were up for much walking either.
Lunch it is!

Rather than going to the usual suspects around here, we decided to travel a little further to the Australian Brewery Hotel. I briefly sneaked a peak at their website to make sure they were open, because my back-up plan was not as well prepared as I wanted to pretend it was.

Abbey had never been.

It does not look like much from the outside, but looks are deceiving. The décor on the inside isn’t fancy, but it is solid, warmer and more inviting than you’d suspect from a space the size.

I had talked up the food beforehand, and now I was hoping it was going to live up to my hyping.

Lexi decided on the “petite sirloin” to match the size of her appetite, and Abbey and I thought we were properly hungry; me with a plate of slow roasted lamb, and she with a pulled-pork roll. Everything was larger than we expected.

Unfortunately, the food was excellent, and the resulting left-overs were making us all sad and dejected. The dog scored some slow roasted lamb out of the deal, and we had to abandon all hope of finishing even just the crunchiest fries.

My Waterloo

My Waterloo

Once defeated by a dish, there really isn’t much that can hide the evidence. In a last-ditch effort I spread the remaining lamb chunks around a bit, nibbled on some more leaves and sliced another piece of bread.

Also: nobody will call you on your declared defeat when they were all defeated themselves. I’m not sure there’s much practical advice in that one though.


* – I’d have much rather pushed through myself though… if only that could fix exhaustion in others.