Destiny and desolation

This is the story of how I lost my destiny and found a world without destinies. It’s a story of two viewpoints – the human and the institutional. It’s a story of desire, longing, loss and of new beginnings. It’s a story that perhaps is a little uplifting, but also, on the whole, fairly depressing. And that shall suffice by way of preamble.1The title, as well as this sentence, is of course an act of unbridled linguistic thievery committed against one of my favourite papers in moral philosophy by Rae Langton, but maybe the reader will accept a more charitable construction of homage.

Destiny

There are, to the best of my understanding, two ways of dealing with present adversity. One is to fight it in the here and now, and rage against it with all one’s might, and to hell with the consequences. Or, one might instead opt for a slower course, and bide one’s time. The present may be dark, one might say, but there will be a future that will no doubt vindicate oneself. Sometimes, facing overwhelming odds, where there is no chance of success of a fight in the present, biding one’s time might indeed be the only thing one can do.

Inevitably, it becomes an existential necessity to set one’s sights on a target, as much in the stars as one’s adversity-laden present is a gutter. That, that would be the final justification, the thing to set all things right, the just reward for not giving up hope and the well-earned prize of a steadfast hand.

Some people would call that pursuit an ‘ambition’. That, dear reader, is pure steaming bullshit coming from people who do not understand the depth of the emotion herein described. It’s not an ambition. It’s love. It’s infatuation. It’s a passionate desire, an intoxicating mixture of equal part love and madness, that does not admit to alternatives or silver medals. You, you’ve just got to have it.

And to a select few, that thing becomes a part of their identity, dwarfing much that others care about. From time to time, society encounters individuals thus obsessed (or perhaps possessed would be a more apt term?), and sees them at best as eccentrics and at worst as single-minded obsessives devoid of fundamental human equanimity, who have abstracted their human worth onto the single pinpoint pinnacle of reaching their goal, pouring everything into that goal in ways that might, to the so-called ‘sane’, seem strange to the point of insanity (indeed, a good number of history’s asylums were, and remain, filled with people of this mindset).

I’m not here to convince you that people who go through this emotion are sane. That would be, of course, partly false witness. And partly, it would be witnessing in my own case.

Devotion

An ambition is something you follow (or not, depending on how you’re feeling at the time). A Destiny is more like a plant, something one nourishes, and when one is out of water, it is the way of things that one would willingly shed one’s own blood to sustain that frail little flower, and to hell with one’s own survival. And with every day, it grows into a sustaining force of its own, a symbiotic entity of sorts, in need to be nourished much as it also nourishes and protects.

And sometimes, its very existence can help one survive the unsurvivable.

I will dispense with sordid details of past atrocities. All that needs to be said is, there were plenty. All that needs to be understood is that for a long, long time, the sole thing that kept me alive, through the dark night of the decade from age 8 to 18, was my destiny. I know this because I know those who went through the same night, and few made it out sane, never mind at all. Much of the terror of that night was compounded by a bitter lack of companionship, understanding and respect. And so, my destiny would be the place where I would find all three.

I would be a Fellow of All Souls.

Now, in case you have no idea what I’m talking about, here’s the Cliffsnotes version. Every year, All Souls College, the most elite college of Oxford and Cambridge and admitting only graduate students, elects one, sometimes two Prize Fellows (now called Fellows by Election). You can only try in the first few years after your BA, and generally, you need a top 1st – a top of the tops degree in your subject – to try. You sit a written examination, which is as insane as it is fun: two general papers and two subject papers. Many sit. Few, at most five, are chosen to a viva, an oral examination of sorts where your soul – and mind – is weighed by all current Fellows, many distinguished in their field to the point of being household names. Two at most are chosen.

To be a Prize Fellow is the greatest acknowledgement a young academic can hope for. I could wax lyrical about it, but frankly, there’s no point. It doesn’t matter what it was. It matters what it was to me.

To me, it was acknowledgement that I was worthy – the only thing I craved all my life. A simple, plain recognition that I was worthy of respect, of attention, of fostering and perhaps even of love. And a damning verdict on a world that repaid these needs of mine with rejection and abuse.

And so, when I took my pen to paper on a Saturday morning, the air thick with the sausage and hash browns of a whole university town at brunch, I wrote with the force and fervour of every ounce and grain of pain amassed over fifteen years, every insult and atrocity taken with a straight face and saved for this moment, every single one of those blinding flashes of grief and humiliation that are one’s lot – fifteen years of pent-up rage and anger and hate and that ultimate of human fundamental forces: the desire to be understood, loved and respected. I’m surprised the paper did not catch fire.

And a few days later, I got an e-mail. I made it into the viva. I was within the Final Five. I could see it, just inches away. Here was my prize, and by All Souls’ Day, a few days after the viva, it would be mine.

I came in from the river early, and ran for my room at a breakneck pace on the day of election. It was, we of the final five knew, that afternoon that the results would be communicated to us by the Warden (the head of the College).

And just as sure, the phone rang a few minutes after I entered my room. I picked up the receiver. As soon as I heard the Warden’s tone, I knew what the message was going to be. I was passed over. For whatever reason, and reasons are not really given in this stupid game, I’ve been found wanting.

I don’t care much for seven years’ free food and board. But that day, I lost my destiny.

+0

Losing your destiny is like permanently missing a body part. It’s not so much painful as it is an acute awareness of the fact that there ought to be something there, and it isn’t. The edges of the wound, from which a part of one’s soul was torn with the violence of a stellar explosion, are sore. They heal slowly. Five years on, they still are incredibly sore.

I don’t know to this day how I survived that day, and the following weeks. I fielded calls of sympathy and e-mails telling me how incredibly proud the college was of having me in the viva… well meant, but I frankly couldn’t have cared less. After two and a half decades of working through pain and fatigue and a non-specific sickness of the previous few years that would soon make its grand entrance; after all-nighters heaped upon all-nighters, after exceeding every single expectation, after sacrificing more than many will ever know, – and perhaps I ought to be ashamed of writing this, but I am not – I hung my head and wept for an hour.

I would never be the same.

+1825

Destinies are not like houses. You cannot build yourself a new one if the old one crumbles. You cannot buy a new one. They are crafted in fiery furnaces, and it’s exceptional enough to have one in a lifetime. You certainly don’t get a second one.

What’s left is to pick up the pieces and carry on. That’s indeed what I did. I made a moderate success of my BCL, but it was clear after this rejection that there was no way I could with any self-respect get a doctoral place in Oxford. That’s the cost of shooting your arrow to the sky: if you’re chastened, there’s a good chance you’ll be chastened with that arrow through your knee.

It’s been 1,825 days since the worst injustice of my entire life – worse than any other – the thing that could’ve made everything good. Or so I thought, anyway. I never said there was a trace of sanity in this. If you think I’m entitled, you are probably right – but then, that word also means ‘deserving of receiving something’. And were you not chastising me for just that?

Or, if you think I was insane to put so much into an abstract, not even objectively measurable process: once again, I did not give warranties of sanity.

A few months later, I would stop being able to eat, violently throwing up every bite of food. I carried on doing 20-hour days in utter physical agony. I would eventually come down with a disease so rare, it was the fifth haematologist to pick it up. Things looked pretty darn grim. Very little is known about HLH, but it was pretty well known that it does one thing pretty well: it kills most patients. 78%, according to some statistics. That, by the way, is with treatment. I did not exactly care a lot, but probably decided to do chemotherapy because it was the right thing to do, plus, I am constitutionally intolerant of not doing something about a problem.

In what struck me as utterly bizarre, I lived.

A lot of pieces have fallen into place since then. Towards the end of my chemotherapy, I met the girl who became my loving, devoted wife. If I can write about this experience with pain only, but no anger and resentment, that’s all due to her. I did not really need someone to explain to me how silly the whole thing was, but that does not make it any less real. My heart will never be whole, and I have no more choice in that than I have in having greenish-blue eyes. But whether I would let this poison the good in it or not, that was my choice. I doubt I would have recognised it without her.

She is everything to me. I don’t know if she is my destiny, and I don’t care. Destiny can kiss my ass.

Since then, I have made my own destiny. I married the girl I loved, and now, I can hear her soft breathing as she sleeps next to me, occasionally exuding a giggle from what must be a particularly amusing dream. We have a kitten, and she’s a joy, even if she decides to poop where she’s not supposed to. I’ve found my place in a new career in a new industry that I love, and perhaps I’m better off now. On more cogent days, I even realise I came closer to my dream than virtually everyone save the 1-2 people a year, and that in and of itself is an honour. Some put it on their CV, proudly. I’m not there yet.

I’ve had plenty of recognition, too, since, and I’ve found many like-minded people. And perhaps part of growth is understanding that dreams are just that. We have them and they get us through the night. But we can’t spend our days in dreams. Not unless we aim to have some Thorazine with our dinner, too.

I’m probably never going to have a destiny again, and most of the time, that’s fine with me. “Fine”, like an old injury is fine – painless most days, but makes itself felt every once in a while when moving funny or when the weather turns damp.

References   [ + ]

1. The title, as well as this sentence, is of course an act of unbridled linguistic thievery committed against one of my favourite papers in moral philosophy by Rae Langton, but maybe the reader will accept a more charitable construction of homage.
Posted in Uncategorized

10 tips for passing the Neo4j Certified Professional examination

Everybody loves a good certification. Twice so when it’s for free and quadruply so if it’s in a cool new technology like Neo4j. In case you’re unfamiliar with Neo4j, it’s a graph database – a novel database concept that belongs to the NoSQL class of databases, i.e. it does not follow a relational model. Rather, it allows for the storage of, and computation on, graphs.

From a purely mathematical perspective, a graph G(V,E) is formally defined as an ordered pair of vertices V (called nodes in Neo4j) and edges E (known as relationships in Neo4j). In other words, the first class citizens of a graph are ‘things’ and ‘connections between things’. No doubt you can already think of a lot of problems that can be conceptualised as graph problems. Indeed, for a surprising number of things that don’t sound very graph-y at all, it is possible to make use of graph databases. Not that you should always do so (no single technology is a panacea to every problem and I would look very suspiciously at someone who would implement time series as a graph database), but that does not mean it’s not possible in most cases.

Which leads me to the appeal of Neo4j. In general, you had two approaches to graph operations until graph databases entered the scene. One was to write your own graph object model and have it persist in memory. That’s not bad, but a database it sure ain’t. Meanwhile, an alternative is to decompose the graph into a table of vertices and its properties and another table of connections between vertices (an adjacency matrix) and then store it in a regular RDBMS or, somewhat more efficiently, in a NoSQL key-value store. That’s a little better, but it still requires considerable reinvention of the wheel.

The strength of graph databases is that they facilitate more complex operations, way beyond storage and retrieval of graphs, such as searching for patterns, properties and paths. One done-to-death example would be the famous problem known as Six Degrees of Kevin Bacon, a pop culture version of Erdös numbers: for an actor A and a Kevin Bacon K within a graph G_{Actors} with A, K \in G_{Actors}, what is the shortest path (and is it below six jumps?) to get from A to K? Graph databases turn this into a simple query. Neo4j is one of the first industrial grade graph DBs, with an enterprise grade product that you can safely deploy in a production system without worrying too much about it. Written in Java, it’s stable, fast and has enough API wrappers to have some left over for the presents next Christmas. Alongside the more traditional APIs, it’s got a very friendly and very visual web-based interface that immediately plots your query results and a somewhat weird but ultimately not very counter-intuitive query language known as Cypher. As such, if graph problems are the kind of problem you deal with on a regular basis, taking Neo4j for a spin might be a very good idea.

Which in turn leads me to the Neo4j certification. For the unbeatable price of $0.00, you can now sit for the esteemed title of Neo4j Certified Professional – that is, if you pass the 80-question, 60-minute time-capped test with a score of 80% or above. Now, let not the fact that it’s offered for free deter you – the test is pretty ferocious. It takes a fairly in-depth knowledge of Neo4j to pass (I’ve been around Neo4j ever since it has been around, and while I’ve never tried it and passed at first try recently, it has been surprisingly hard even for me!), the time cap means that even if you do decide to refer to your notes (I am not sure if that’s not cheating – I personally did not, as it was just so time-intensive), you won’t be able to pass merely from notes. Worse, there are no test exams and preparation material is scarce outside (rather pricey!) trainings. As such, I’ve written up the ten things I wish I had known before embarking upon the exam. While I did pass at the first try, it was a lot harder than I expected and I would definitely have prepared for it differently, had I known what it would be like! Fortunately, you can attempt it as often as you would like for no cost, and as such it’s by no means an impossible task,1I’ve been told that feedback on failed tests is fairly terrible – there is no feedback to most questions, and you’re not given the correct answers. but you’re in for a ride if you wish to pass with a good score. Fasten your seat belt, flip up the tray table and put your seat in a fully upright position – it’s time to get Neo4j’d!

1. This is not a user test… it’s a user and DBA test.

I haven’t heard of a single Neo4j shop that had a dedicated Neo4j DBA to support graph operations. Which is ok – compared to the relatively arcane art of (enterprise) RDBMS DBAs, Neo4j is a breeze to configure. At the same time, the model seems to expect users to know what they’re doing themselves and be confident with some close-to-the-metal database tweaking. Good.

The downside is that about a quarter or so of the questions have to do with the configuration of Neo4j, and they do get into the nitty-gritty. You’re expected, for instance, to know fairly detailed minutiae of Enterprise edition High Availability server settings.

2. Pay attention to Cypher queries. The devil’s in the details.

If you’ve done as many multiple choice tests as I have, you know you’ve learned one thing for sure: all of them follow the same pattern. Two answers are complete bunk and anyone who’s done their reading can spot that. The remaining two are deceptively similar, however, and both sound ‘correct enough’. In the Neo4j test, this is mainly in the realm of the Cypher queries. A number of questions involve a ‘problem’ being described and four possible Cypher queries. The candidate must then spot which of these, or which several of these, answer the problem description. Often the correct answer may be distinguished from the incorrect one by as little as a correctly placed colon or a bracket closed in the right order. When in doubt, have a very sharp look at the Cypher syntax.

Oh, incidentally? The test makes relatively liberal use of the ‘both directions match’ (a)-[:RELATION]-(b) query pattern. This catches (a)-[:RELATION]->(b) as well as (b)-[:RELATION]->(a). The lack of the little arrow is easy to overlook and can lead you down the wrong path…

3. Develop query equivalence to second nature.

Python was built so that there would be one, and exactly one, right way to do everything. Sort of. Cypher is the opposite – there are dozens of ways to express certain relations, largely owing to the equivalence of relationships. As such, be aware of two equivalences. One is the equivalence of inline parameters and WHERE parameters:

MATCH (a:Person {name: "John Smith"})-[:REL]->(b)
RETURN a;
MATCH (a:Person)-[:REL]->(b)
WHERE a.name = "John Smith"
RETURN a;

Also, the following partials are equivalent, but not always:

(a)-[:FIRST_REL]->(b)<-[:SECOND_REL]-(c)
(a)-[:FIRST_REL]->(b)
(c)-[:SECOND_REL]->(b)

When you see a Cypher statement, you should be able to see all of its forms. Recap question: when are the statements in the second pair NOT equivalent?

4. The test is designed on the basis of the Enterprise edition.

Neo4j comes in two ‘flavours’ – Community and Enterprise. The latter has a lot of cool features, such as an error-resilient, distributed ‘High Availability’ mode. The certification’s premise is that you are familiar – and familiar to a fairly high degree, actually! – with many of the Enterprise-only features of Neo4j. As such, unless you’re fortunate enough to be an enterprise user, it might repay itself to download the 30-day evaluation version of Neo4j Enterprise.

5. The test is generally well-written.

In other words, most things are fairly clear. By fairly clear, I mean that there is little ambiguity and it uses the same language as the reference (although comparing test questions to phrases that stuck in my head which I ended up checking after the test, just enough words are changed to deter would-be cheaters from Ctrl+F-ing through the manual! There are no trick questions – so try to understand the questions in their most ‘mundane’, ‘trivial’ way. Yes, sometimes it is that simple!

6. TRUNCATE BRAINSPACE sql_clauses;

A lot of traditional SQL clauses (yes, TRUNCATE is one example – so is JOIN and its multifarious siblings, which describe a concept that simply does not exist in Neo4j) come up as red herrings in Cypher application questions. Try to force your brain to make a switch from SQL to Cypher – and don’t fall for the trap of instinctively thinking of the clauses in the SQL solution! Forget SQL. And most of all, forget its logic of selection – MATCHing is something rather different than SELECTing in SQL.

7. Have a 30,000ft overview of the subject

In particular, have an overview of what your options are to get particular things done. How can you access Neo4j? You might have spent 99% of your time on the web interface and/or interacting using the SDK, but there is actually a shell. How can you backup from Neo4j, and what does backup do? What are your options to monitor Neo4j? Once again, most users are more likely to think of one solution, perhaps two, when there are several more. The difficult thing about this test is that it requires you to be exhaustive – both in breadth and in depth.

8. Algorithms, statistics and aggregation

As far as I’m aware, everyone gets slightly different questions, but my test did not include anything about the graph algorithms inherent in Neo4j (good news for philistines people who want to get stuff done). It did, however, include quite a bit of detail about aggregation functions. You make of that what you will.

9. Practice on Northwind but know the Movie DB like the back of your hand.

Out of the box, if you install Neo4j Community on your computer, you have two sample databases that the Browser offers to load into your instance – Movie and Northwind. The latter should be highly familiar to you if you have a past in relational databases. Meanwhile, the former is a Neo4j favourite, not the least for the Kevin Bacon angle. If you did the self-paced Getting Started training (as you should have!), you’ll have used the Movie DB enough to get a good grip of it. Most of the questions on the text pertain or relate in some way to that graph, so a degree of familiarity can help you spot errors faster. At the same time, Northwind is both a better and bigger database, more fun to use and allows for more complex queries. Northwind should therefore be your educational tool, but you should know Movie rather well for that little plus of familiar feeling that can make the difference between passing and failing. Oh, by the way – while Getting Started is a great course, you will not stand a snowball’s chance in hell without the Production course. This is so even if you’ve done your fill of deployments and integrations – quite simply put, the breadth of the test is statistically very likely to be beyond your own experiences, even if you’ve done e.g. High Availability deployments yourself. In the real world, we specialise – for the test, however, you must be a generalist.

10. Refcards are your friends.

Start with the one for Cypher. Then build your own for High Availability. Laminate them and carry them around, if need be – or take the few functions or clauses that are your weak spots, put them on post-its and plaster them on your wall. Whatever helps – unless you’re writing Cypher code 24/7 (in which case, what are you doing here?), which I doubt happens a lot, there’s quite simply no substitute for seeing correct code and being able to get a feeling for good versus bad code. The test is incredibly fast paced – 80 questions over 60 minutes gives you 45 seconds for a turnkey execution. At least 15-20 of that is reading the question, if not more (it definitely was more for me – as noted, most questions repay a thorough reading!). Realistically, if you want to make that and have time to think about the more complex questions, you’ve got to be able to bang out simple Cypher questions (I’d say there were about 8-10 of them altogether, worth an average number of points, though I (and I do regret this now) didn’t count them.

 

While the Neo4j certification exam is far from easy, it is doable (hey, if I can do it, so can you!). As graph databases are becoming increasingly important due to the recognition that they have the potential to accelerate certain calculations on graph data, coupled with the understanding that a lot of natural processes are in reality closer to relationship-driven interactions than the static picture that traditional RDBMS logic seeks to convey, knowing Neo4j is a definite asset for you and your team. Regardless of your intent to get certified and/or view on certifications in general (mine, too, is in general more on the less complimentary side), what you learn can be an indispensable asset in research and operations as well. Of course, I’m happy to answer any questions about Neo4j and the certification exam, insofar as my subjective views can make a valid contribution to the matter.

Update 15.02.2016: Neo4j community caretaker Michael Hunger has been so kind as to leave a comment on this article, pointing out that the scant feedback is intentional – it prevents re-takers from simply banging in the correct answers from the feedback e-mail. That makes perfect sense – and is not something I thought of. Thanks, Michael. He is also encouraging recent test takers to propose questions for the test – to me, it’s an unprecedented amazingness for a certificate provider to actually ask the community what they believe to be to be the cornerstone and benchmarks of knowledge in a particular field. So do take him up on that offer – his e-mail is in his comment below.

 

Title image credits: Dr Tamás Nepusz, Reconstructing the structure of the world-wide music scene with Last.fm.

References   [ + ]

1. I’ve been told that feedback on failed tests is fairly terrible – there is no feedback to most questions, and you’re not given the correct answers.
Posted in Uncategorized

Raising elephants is so utterly boring.

If you’re a Linux nerd, you should know what the post title means.1For the sane: it’s a mnemonic for REISUB, the sequence of buttons to mash together with Alt and SysRq (does anybody remember that key?) to restart a completely locked up Linux box that refuses to listen to reason. Every couple of years, it’s time to start anew and eschew the utter boredom of importing posts, going through shortcodes that no longer exist, fixing tags… there are more important things in life than that.

This time, it’s not just a reboot – it’s hopefully also a change of directions. For years, I have tried to keep things separate, to write about what’s on my mind and what’s on my heart in separate fora, with each coming at the expense of the other. The truth is, the two are not that separate. As such, in this incarnation, the blog will feature things that you might not be used to. If you have read my more personal blogs, you will be struck by the occasional post about some esoteric aspects of a little known technical programming language. And if you’re a reader of my technical posts, you might find some raw honesty by the man behind the numbers.

As such, this is also an experiment. Does my technical writing improve if I am liberated of the constraints of subject|>forum? Do my personal insights benefit from accountability to the professional self (owing to society’s views on what we’re doing for a living, there’s a limit to how dumb you’re allowed to get when talking about something entirely different if you also talk about maths, statistics and software development, as if knowledge of any of these areas endowed you with some degree of universal smarts – a matter squarely contradicted by some spectacular doozies uttered by otherwise respectable scientists when it comes to issues of society)? I’m quite keen to find out.

As a precaution, I am categorising work and life posts separately, for readers whose sensitivities preclude them from discussions of faith and society on one hand or introspection in functional programming languages on the other. I’m hoping this will allow those with exclusive interests in one or the other to get just what they need and no more – although even to them I would say that sometimes, risking the whole man is worth it.

References   [ + ]

1. For the sane: it’s a mnemonic for REISUB, the sequence of buttons to mash together with Alt and SysRq (does anybody remember that key?) to restart a completely locked up Linux box that refuses to listen to reason.
Posted in Uncategorized

If you love something, let it break your heart.

A few days ago, I finished re-reading Michele Cushatt‘s book Undone, an incredible journey through what she describes as an ‘unexpected life’. I cannot possibly do the book justice, save by telling you to go out and buy it, right now. I was reminded of her book today when thinking about coding and software development (which I do way too much for someone who is principally supposed to be a tool user, not a toolmaker).

Broken

There’s a style of Japanese pottery known as 金繕い (kintsukuroi), in which broken pottery is repaired with a mixture of lacquer and fine-grained gold or silver dust. The first time I saw a kintsukuroi bowl, I must have been about 12. It was unceremoniously stacked among a lot of other stuff in a side room of the Kunsthistorisches Museum in Vienna, which hosted an exhibition on Asian pottery. It was as close to a transcendental experience as I have ever had.

Kintsukuroi accepts brokenness as part of life. It accepts the fact that Things Break, and sometimes not all the king’s horses and not all the king’s men can put what was broken back together again. It is a brutally honest acknowledgement of what it means to live in an imperfect, fallen world. But at the same time, it is an acknowledgement of the fact that yes, sometimes, you cannot put something broken back together again with seams fitting in lattice-to-lattice perfection. But what fills up the empty spaces, what fills up the gaps of what used to be, can be valuable. Just as the few drops of gold lacquer in a kintsukuroi bowl are worth more than the bowl itself ever was, brokenness and healing can make us something more valuable.

Coding is hard. It’s heartbreaking. It’s sometimes frustrating. A few weeks ago, I spent hours trying to figure out what to make of a fifteen-line, completely obscure error message in R citing various Java code citing C++ code… I was near punching the screen.

It turns out it was the system’s way of telling me the server connection timed out. Did it say so? Heck no. It took hours of digging and debugging around to find out how a Java exception in the middle of R code even made sense. Those are the moments you just want to smash some of the objects in arm’s reach.

The only good thing about these moments is that there’s a faint chance you’ll remember them. That, by the way, is called growth.

Mended

Which leads me to the point of developing immunity to heartbreak. I wrote my first piece of code that I actually dared to share with the wider public in 2000. Github wasn’t around yet, so people shared code on mailing lists and messageboards. I posted this snippet of code I wrote to calculate the haversine distance, written in Python, that for some reason didn’t run.

Within an hour, I had 25 comments. They ran the gamut of “just give up already” to “this is some of the worst code I’ve ever seen”. In other words, the kind of feedback you aren’t allowed to give these days. Now, I’m not a particularly thick-skinned person, and it duly broke my heart.

I got upset… until I felt something stir in me, a resolve and an unwillingness to leave it at this. I decided I’m going to work on my code until I could turn out the best haversine implementation that I can. It took me the best part of a month. I posted it to the same messageboard, in the same thread.

The same people I thought were absolute jerks now sent appreciative comments. One even noted he learned a new trick from my code.

That’s when I understood the people who broke my heart only weeks ago didn’t do so out of ill-will or meanness. They did so because they, too, had their hearts broken day by day by the interpreter’s harsh output. And they knew that getting your heart broken by people is a lot easier than getting your heart broken by a machine.

Heartbreak is important. Heartbreak is what happens when you try to scale a mountain too high. Heartbreak is the sign that you’ve gone beyond your comfort zone.

And growth happens in that space. Growth cannot happen in a space of continual heartbreak – that’s just pure frustration, and frustration causes resignation, not growth. But a space without heartbreak has no challenges, no risk, no disappointment, no growth.

If you love something, go out and make it break your heart.

Then stand up, and try again.

And again.

Posted in Uncategorized