Tuesday, October 15, 2013

Old

So in about 5 hours, I officially become Old. And it's not exactly bothering me - I've spent the last few days taking stock of my life, and I'm pretty happy. Don't get me wrong: over the last decade I've put together plenty of goals that I have failed to reach. But over the course of the last decade I've achieved and been blessed and lucked into so many things that I didn't even know I wanted until I had them that I'm really in no position to complain. Career-wise I'm short of the goal - but a career is hardly a trophy, especially in these modern times. In exchange for the false construct I've strengthened my ties with my family (and said farewell to several members, but at least I managed to say goodbye and tell them that I love them). I've found amazing friend after amazing friend - and more importantly, been able to help those friends through their hard times, and celebrate their good times with them, and been helped and been joined in celebration in turn.

And I have pursued wisdom and understanding. One of the first things I've learned is that the things truly worth knowing can't be put into words - or at least not only into words, and not directly. Poetry and song can come close, but you need some experience to go with them, to resonate with the words and to have something in your heart or soul go "yes, that's right". And so many lessons can only be learned by making mistakes and hurting (or even injuring) yourself. That's part of the reason why I think injury exists - to learn those lessons that only injury can teach.

In any event, I have learnt a great deal this decade, and I thought I would share some of what I've learnt. Some of this is phrased as a "letter to myself a decade ago". Some of this is meant for the reader. But this is stuff that I'm proud to have learnt, or learnt by getting injured, or just stuff I'd like to share.

  • Be hard on yourself, but know that being hard on yourself is artificial, and bad for you, and self-indulgent. Ultimately being a perfectionist doesn't result in you growing - it results in depression because nothing will ever be good enough. It might mean that today's project is marginally better but it also means that you will stop learning broadly or even deeply, and channel that energy into moving that
    3 more pixels to the left, or baking the muffin just the right shade of brown. Do it when the chips are down, but shut it off afterwards. Make mistakes and screw up and experiment, and if stuff doesn't work that's okay.
  • Don't be afraid of arguments. Sometimes you will lose, hard, even when you're obviously right and the other person is obviously wrong. Get better at arguing. Be gracious in your losses and your victories. Know those things that you're prepared to be argued into and out of (should we go out this evening?), and those things that you absolutely, completely, will never-ever-ever compromise on (what's right and wrong, how to treat people).
  • Rattling off a tired old line, as smart and witty as that line might be, doesn't make you smart. And after the thousandth telling of the line, or the joke, or the story it's time to retire it. People might like to laugh, and you might like to make people laugh, but ultimately a line is just a line - it's so much more important to be able to talk about the important stuff than it is to parrot off some satire.
  • Learn to receive. Not just graciously. It's hard - one of the hardest things I've ever had to do, but learn that refusing things given to you by people is not just about you - it's about the giver. You're not doing them a favour by receiving from them, of course, but you're fulfilling an important social contract. Not receiving - be it a physical gift, or affection, or conversation, or love, or appreciation - doesn't mean you're strong or independent, it means you don't care that you're making someone else uncomfortable.
  • Knowing something really, really well means that you will love it. There is good to be found in anything if you study it closely enough. Love is evidenced in action and studying something will call you to action about it, even if it's just to voice support.
  • Know yourself really, really well.
  • Don't just know your mind. Know your body and your soul. Know that reason is always biased by things you can't feel - learn your own habits. Pick up causal relationships. It might seem perfectly reasonable to be raising your voice right now, and that the petty topic that you're discussing seems all-important, but don't you think that might relate to the fact that you haven't exercised in days? Maybe the reason you've fallen head-over-heels for that girl is because she's The One... but maybe it's because you haven't spent enough time with people recently and you're starved for contact.
  • If you feel one particular viewpoint is full of weak arguments and histrionic zealots, there's a fair chance that you've just been adding too many Facebook friends or following too many people on Twitter recently, and you've stumbled onto a cluster of agreeing friends who don't feel the need to fully explain stuff. Give them a break, and de-friend, unfollow or mute if you can't handle it.
  • On that topic: de-friending, unfollowing and muting are good, healthy responses to a noisy world, and none of those things are permanent. Make it a habit to regularly cull things that bother you - but then make it an equally regular habit to search for new (and old) things that you can follow and learn about.
  • Never stop learning, but keep in mind that learning is both broad and deep, and those two properties are mostly mutually exclusive - or at the very least traded off. Learning a lot about something means you shut down shop on broader discoveries, and exploring means that you've stopped uncovering the deep things on the topics you care about. Both are fine, but it's important to alternate from time to time.
  • Sometimes people will need help when it's the worst time for you to give it. Tell them that, and help them sometimes - it will mean personal sacrifice, but if the reason is sound and it's really important, it can be worth it. That said, refuse sometimes and explain why. People will respect that you have your own stuff to deal with sometimes.
  • Speaking of that: you might have all the potential in the world, you might be a genius or have amazing talent, but you will need to interact with other people to do anything of substance. Beyond that, it's only where plans intersect do you truly get the great stuff. Value people, and value people's dreams and goals. Expect that people will do the same for you, and if they don't then wish them well, see them off and find people who will.
  • Don't communicate just the state you're in - telling people you're tired isn't enough. And don't just tell people what you want from them, as you'll come across as demanding and unpleasant. But these two things put together give people an opportunity to really understand you and know how to interact with you. You're the only one with an entire lifetime of experience with yourself, and only you really know how people should act around you when you're in any given state. You need to be able to communicate this with others if you really want to form a deep bond.
  • You can fall in love with anyone if you regularly spend time around them and that time is spent feeling good. Beautiful and interesting people make you feel good, but there's a lot of beauty and interesting stuff to be found in almost anyone if you're prepared to invest a little in learning about them.
  • If you find yourself doing the same thing in your free time for more than three weekday evenings in a row, chances are you're getting over-tired, are in a rut or are getting depressed. Find something else to do - even if that "something else" is going for an evening walk or phoning a friend or family member.
  • Listen to music that resonates with your mood, but remember that it will entrench your mood too. When the season is over and it's time to change moods, change your music.
  • Never underestimate the power of convenience. You might have all the willpower in the world but if there's no healthy food in the fridge, you're going to walk past KFC en-route to the grocery store and buy a Streetwise Two instead of salad greens - then skip past the grocery store (to eat the food while it's still hot!) and you won't have the salad handy tomorrow either.
  • Juggling interests between circles of friends is wonderful - it keeps you engaged in so many different things - but let everyone involved in your life know that you have other commitments and other friendships (invite them to the other common activities!), and that sometimes one will be more important to your life for a while. That other circle is still important to you, and you want to maintain your interest in it, but right now something else is demanding more of your time.
  • Much like handles on resources (files and databases) best practice is to bookend the use of a thing. Know that when you're finished with a book, or a bowl, or a piece of clothing, where you're going to put it and how you're going to return it to a reusable state. Invest a little time to clean up immediately after you finish with a thing. The results won't be significant for this one thing, but it will make your environment much, much healthier - and:
  • Know how your environment affects your moods and thoughts. Know how a chaotic house makes you feel, how a sink full of plates makes you want to do the plates less, and how having noise on in the background makes you want to engage less with the thing you're doing, not more. That said, remember that a chaotic house is equally an expression of freedom and joy, and playing music can manage your mood very well.
  • Know that you can be tricked and fooled into stuff - and become a master of it. Tricking and fooling yourself, that is, not others. Remember what I said about convenience? That's a self-trick. Picking a cereal that takes a few minutes to soak in milk before it's edible makes sure you shower every morning. Reading before going to bed every night - no matter what - means you will read regularly, and get to bed at a sane hour.
  • Write. Or play music. Or paint, draw, dance or do something to express yourself. Every day is best - every day is also unrealistic. A few times a week is a healthy amount, and take one month per year to push yourself in your favorite means of expression (cough - NaNoWriMo - cough).
  • Failing isn't shameful. It's not embarrassing. What's shameful and embarrassing is hiding your failure and letting that snowball into a massive problem. And even that's not that shameful - get up, dust yourself off, apologize to anyone affected and move on.
  • If you think you're rubbish at a thing, but people are prepared to pay you to do it, give it a try. If you produce something that you think is rubbish but the customer loves it, you're not rubbish at the thing. Stop assuming that everything needs to be made in a sterile, shiny iFactory to be any good - etsy is awesome, home-knitted jerseys are just better than store-bought ones, and you bake a better cake/muffin with no preservatives than most professional bakeries, if only because you don't slather it in lowest-common-denominator-appealing chocolate or cream.
  • Stress less about time, but do stress a little. You're probably not going be too late for the doctor's appointment or miss the flight, but you definitely will be if you get cocky.
  • Pat-pat-release with guys. A hug longer than two pats just makes everyone involved feel uncomfortable. Note that this does not apply to girls - hugs are much more emotional for them and they appreciate the extra contact.
  • That said: read the room. Know the type of social expectations that people have, and don't push them beyond that unless they've mentally associated you with someone who is allowed to do that.
  • Don't. Be afraid. To tell someone. That you've forgotten their name. Really. Just say sorry and ask. And sorry again if this is the third (or fourth, or fifth...) time you're asking. This goes double if the person is of an ethnicity or culture whose names you struggle with.
  • Very few questions are racist, sexist or in some way offensive. Very many statements are. If you don't want to anger opinionated people, questions work better than statements.
  • The world may be overcrowded with sensitivity, insisting on complicated concepts of gender, sexuality and identity, but that's no excuse to complain about it. Someone, somewhere has been hurt because people stopped caring and started treating something important to them as unimportant. Be simple, but accept that some people need complexity because they're hurting and can't cope with the simplicity that you're blessed to have.
  • Be friendly to strangers and talk to them like they're friends - but don't give them the responsibilities of friends and don't assume that they'll even be likeable, but being immediately friendly and sharing personal anecdotes is charming and charismatic, and you'll wind up making a good first impression.
  • Being a person that can be relied on, trustworthy and capable of putting aside your own stresses when your friends desperately need you will attract every kind of person to you. Occasionally demanding that back from them will repel the people you don't want in your life.
  • Speaking of which - it's okay to be weak in front of people sometimes. Asking for help while desperate has loads of really good side effects, and barely surviving the tough times in life sucks - having someone who helps you through it, even if you feel bad at how much of your load they're carrying, gives you more resources to invest in being there for them when they need you, and the greatest friends want you to invest those resources in your dreams and the grand plans you have for your life. They want that. If you don't take their help, you'll be letting them down.

...and that's it, I think. I'm pretty much tapped out. Writing this list has given me warm fuzzies as I think about the adventures and agonies I've endured to learn some of them, and the great times I've had with people as we've suffered together to bring great things into the world. The absurdities and hilarities and the brokenness. So I guess all that's left is to thank people. And I'm going to do this in order of places I've lived, because people from all over have contributed to getting me alive, broken and frequently mended through this last decade. If your name isn't on this list, it's probably because it's a long, long list and I'm currently a little high on nostalgia, but I can attest to heroism and awesomeness from everyone here:

Omnipresent
Yahweh :)

East London
My amazing mother
My lovely cousin and aunt (respectively) Megan and Twink
Marius Erasmus
Darren, Eloise and Nathan Reed
Mr. and Mrs. Ellis
Mr. and Mrs. Rich

Cape Town
My amazing sister
Imogen Wright
Alistair Carver
Yvette Wright
Dr. Mike du Toit and the nurses from Constantiaburg Medi-clinic

Grahamstown
Fifi Formson
Yusuf Motara
Eben Lochner
Verne Franszen and Monique Mulholland (both soon - I'm sure - to be Fightmaster-Guilestheme-Gryffindor-McEpicawesome)
The Wednesday night Rat crowd from Computer Science: Alastair Nottingham, Alan Herbert, Jess Hutchinson, Sean Pennefather, Luke Darlowe, Gareth Dwyer and anyone else I'm suddenly missing in my mind (sorry!)
Ingrid Sieborger and Hannah Thinyane
Jonathan Kenyon

Johannesburg
Peter Leonard Montgomery Hieronymous van Onselen
The Holy Reverend Gregory Peek
Scott Edwards
Chloe Molino
Allen Brown

Elsewhere in the World
Ryan, Chris and Josh. *Manly chest-bump*
...along with their wonderful families, Charis, Anne and the ever-adorable Joanna.

...and that's all I've got. In fairness, I'm tired :) I had to cut the list off at some point, as there have been so many wonderful, brilliant people who have influenced my life, and I love you all very much.

So that's it. Time has passed as I've written this, and it's now only three hours to go until I am Old. CTRTFN, thanks for reading :)

Tuesday, February 26, 2013

Good Guy Zoav

Well well well!

After all my belly-aching about how there were no good, solid CS sources for information on multi-agent software, I came across Yoav Shoham. The guy's my new hero. He saved me from the legion of terrible, horrible, hand-wave "BUT IT'S LIKE REAL INTELLIGENCE, ONLY IT'S NOT" papers.

I came across him by asking Friend Google about "seminal work on agents", and his name kept on being dropped for his highly-cited paper Agented-Oriented Programming (1993). I stalked him looked him up a little further, and he's running a research group that puts out a respectable amount of research at Stanford, and he's recently (well, relatively recently) put out a great book on the topic: "Multiagent Systems: Algorithmic, Game Theoretic and Logical Foundations". Our local academic library, as much as I love it, takes ages to get new material even if explicitly requested. I put in a request anyway, but with little hope to get the book before my contract at Rhodes expires and I it's no longer useful to me.

I pondered just picking it up for myself (it's really reasonable for a high-quality text), but then...
Good Guy Yoav to the rescue! He generously offers the free ebook for download if you can't afford it or can't get access to it.

I love this guy. I've spent years looking to break into this field, ranging from an inkling of interest to building my own agents of varying scale and ambition.

I've started reading his book, and I just need to say: wow. I'm loving every page! It starts with a solid grounding in algorithms and logic, which is exactly what I wanted to banish my concerns that it was going to be another "we needed a paper at the last moment and Bob can hand-wave well" text. Thank you Yoav, you're my new hero!

Thursday, February 21, 2013

Agent Reading and Progress

So I'm in the middle of getting to grips with AI agents - something I've had an on-again, off-again relationship with for years. Toying with it for a PhD idea, but not really finding the Something Special that's gripping me into putting in the monumental amount of effort that a doctorate would demand.

I've started reading "Developing Intelligent Agent Systems" by Padgham and Winikoff, which seems like a more pragmatic text on the topic - refreshing, given I've spent most of today reading through agonizingly poor conference and journal papers on the topic. It seems that Computer Science has decided to drop the entire field (because let's be honest, Asimov's "I, Robot" showed us that specialized applications of technology beat general-purpose development hands-down), and it's been adopted by Information Systems and Infomatics types - the kind of people who think that "pipes" are an innovative idea, if they could only fit a methodology around using it in their current paradigm, so they could implement a framework *retch*.

Back to the book, though: Padgham & Winikoff use the definition of an agent from Wooldridge (2002), that an agent is a "computer system that is situated in some environment, and that is capable of autonomous action in this environment in order to meet its design objectives". Which is a terrible definition, because it requires an extremely specific interpretation of the terms used, or it could easily describe almost all software.

In any event, it's later qualified by a number of additional attributes that the author hastens to mention change the definition from "software agent" to "intelligent software agent": the software must be pro-active, reactive and social. They continue on to add robust or flexible in the event of a blocked/failed goal.

My interest leans heavily on the social aspect of agents: I've been inspired by the concept of Weavrs, software agents that literally exist with their own social networking accounts. While it is certain that automated software agents have existed before weavrs (spambots, for instance), the idea of creating a persona whose role is to digest, process and then publish information seems quite novel. Weavrs, as far as I know, do not taking social input, but do have a social output.

The idea tickling around at the back of my brain is to take this idea of social agents whose job is to consume, process and publish information and to extend the idea into a logical mesh of agents with a fairly transparent communication medium (ala Twitter). Each agent specializes in certain specifically tooled news sources (an RSS agent, a Twitter agent, a Facebook agent, a specific webservice agent), and they share their information both publically and with each other. They can then interact with a series of more complex agents whose role is to digest that information further, and then make intelligent decisions based on that.

Because the variety of different sources of information will almost certainly be providing non-orthogonal outputs (the news headlines from the RSS news feed will no doubt also be tweeted and linked to on Facebook), the agent net will need to be able to intelligently combine information sources into groups of related news - perhaps akin to unroll.me's mechanism of creating email digests.

If this sounds like a great deal of natural language processing, semantics extraction and quite possibly an impossibly complex piece of engineering, then you're now on the same page as me.

As far as I can see, the best way of starting this project will be to start writing a bunch of parsers for each potential "news input" - once I've got processed raw data to work with, decision-making becomes a tangible possibility. I've started playing around with Facebook and Twitter feed consumers, and when they're working I'll put up some code snippets.