This is Not the End

This is Not the End

For the last year or so, I cry almost every single day. I’ve been in a very lonely place for a while now. There’s no one to speak to, no one to help me, and on this particular journey, I’m on my own. A desk is such an odd place to find mountains, but every morning, there they are, steep unclimbable peaks.

I stare up at them from the shadows before the sun has risen. My fingers tremble at the thought of another climb. My mind fatigued from years of complicated problem solving. Every climb presents new challenges. There are no trails to follow. There are no maps to guide me. No one has been here before. 

I wonder, “How far is, far enough?” 

I ask, “Do you have anything left?” 

And I say, “You should give up.” 

I talk to myself like this, but then I look back upon all the mountains I’ve climbed before the one in front of me and the tears begin to flow. What an incredible journey it’s been. How could it ever come to an end? 

A few weeks ago, it almost did. 

In this kind of a place, when you take a day off from the climb, the whole world moves. Tectonic shifts occur that move entire landmasses. The landscape changes overnight, and sometimes, so much so, there’s literally no way over the mountain. And so, you’re forced to go back, usually a great distance, to find another route. 

At the end of last month, I took not one, but eleven days off, four in Dallas, and seven in Seattle. It was the first extended period of time I’d stepped away from everything in nearly a year. When I returned to my desk, as I’d suspected, the landscape had changed, only this time, the mountain hadn’t shifted or grown, it’d collapsed on me, and in that moment, I was buried beneath it. 

I never quite know how I go on in these moments. I kind of lay there motionless for a bit, building up my strength, and when it eventually comes, I push onward. Those first days back were the hardest I’ve ever endured. 

Throughout this journey, I’ve repeatedly reached new levels of exhaustion I didn’t believe were possible, and each time, I think, there’s nothing left, but somehow, something remains. This time, however, nothing remained.

Back to the beginning.

When I write here, I’m having little conversations with myself. In some strange twist, the software that’s nearly killing me to complete, is also giving me the strength to complete it. 

I began in the creative industries as a writer, and so, writing is cathartic for me. It’s a meditation on my past, and how it relates to, my present. I like sharing these stories, and I hope others find meaning in them, but for the most part, it’s about helping me to better understand myself. 

I can write freely and enjoyably online like this, because I’ve created software that allows me to do so. I think if I hadn’t created this website, and started writing again, I’d have already given up. 

On that first day back from Seattle, this is what I wrote, because I genuinely thought I was giving up. I felt as though I’d reached the end:

This is not the end

“This is not the end,” he gasps. 

The words are repeated, fast, yet in an ever so delicate a manner, as if to not upset the very crucible of an untenable predicament – the cautious balancing act of a man’s life. 

His tired feet punish the sodden earth beneath, one hard footstep at a time. His pace ever quickening, a speed he was unaware man capable of achieving – quickening still. What he’s running from, or what he’s running to, now or ever, remains unclear. 

He’s no longer himself, but a reluctant host, overseeing the journey of the boy he once was; young, beautiful, uninterrupted, invincible, so invincible. All of it, lost in a life, some lifetime ago. 

In a fog, he lumbers through hemlocks, junipers and cypresses. It begins to snow and the soft snowflakes land ever so peacefully atop the leaf bed blanketing the forest floor – this is an unspeakable abomination. 

The light of dawn’s first touch; brilliant oranges, yellows, reds, and pinks dance amongst the shadows. Its teasing warmth seducing the newly born flakes to change their very state to follow into the light of a new day.  

The days pass, yet the seasons never change. This ephemeral dreamland is only an aberration in his fallow heart – a necessary component of the process of what was meant to come, but never did. Was it only ever just that? A dream. He wonders.

His anxiety grows, corners him, encroaches upon him like a wolf circling on the hunt in the night of his own vast wilderness – that great vacuous space in his mind. There’s no escaping it, it was his imprisonment all along.  

And now, strung up high atop a wobbling chair on the very noose he’d tied for himself, he tries to hold on, but can’t. His tired legs are failing. His bruised throat tightens. The pain, a reminder of just how long he’s been dangling.

Oh, what a strange place to be, he thinks, where all the hard steps, become footprints in the snow, only to melt away in the light of a new day. 

“This is the end,” he gasps. 

When I finished writing it, I set it aside, because I genuinely thought it was kind of a farewell. After a few miserable days, I read it again. I realized it wasn’t the end. This journey has taken so much from me, but it wasn’t going to take me from me. I was too young to be defeated by it.

By writing about the journey, I rediscovered the chip on my shoulder, and subsequently, the strength to carry on. But that wasn’t an answer, it was merely the strength to start digging my way out.

I started small, one boulder at a time, and after a few days, I’d dug my way out, but of course, when I could finally see the light of day again, there was another steep unclimbable peak awaiting me.

I had an image problem.

Building software isn’t that difficult. Building software that scales, however, is quite the opposite. 

I’ve had fun with the name, “Dopesite,” right from the very beginning. I liked the double entendre. As such, I’d like to use an example from the world of drugs to explain the problem of building software that scales.

Basic software kind of works like your local drug dealer who has product to sell and a handful of customers who want it delivered. The customer calls their dealer. They arrange a specific time and spot to meet. And then they make a transaction. 

Basically, a call is made. That call triggers an action. That action triggers an event. 

Websites and web apps are like this. Of course, they’re more complicated, but only nominally so. A request is made by typing a web address into your browser. A call is made to the server asking for specific inventory. The server pulls what it needs from the database. And finally, it delivers it back in the form of a webpage or whatever else has been requested.

Easy enough, but what do you do, when you have to account for infinite instances of these kinds of transactions? This is the problem of scale. 

In other words, Dopesite is less like your local drug dealer, and more like, your global drug cartel. 

To move vast amounts of product to a global consumer base you need a global supply chain. You also need to produce and move your product efficiently. You then need to avoid varying jurisdictional law enforcement and provide strong enforcement of your shipment. So forth, and so on.

With Dopesite, I needed to move vast amounts of data, specifically, media assets. Media assets tend to slow up load times and create bottlenecks in the movement of data more than anything else. I won’t get too technical, but here’s what was involved.

Step on that shit.

We live in a visual world. One of the first things you’ll want to do when you get that fresh new site is fill it up with beautiful imagery, so you go through your phone or desktop, and upload a bunch of high-resolution images. Bam! Your new site is slow. Pages are loading like it’s 1996. 

So how do you fix this?

Many website builders don’t even bother. Ever load a Wix website? Not only does it look like it’s from 1996 it also loads like one.  

For Dopesite, this just wouldn’t do. I needed to strip out all of the unnecessary data, without losing any image quality. When you upload a media file like a JPEG all of the associated data comes along with it. A JPEG might just seem like a bunch of pretty pixels but hidden underneath that glossy exterior is a lot of data.

The problem becomes further complicated when you support various media types. Currently, Dopesite supports the following: 

jpg jpeg png gif mov avi mpg 3gp 3g2 midi mid pdf doc ppt odt pptx docx pps ppsx xls xlsx key mp3 ogg wma m4a wav mp4 m4v webm ogv wmv flv svg zip

That’s a lot of data! Moreover, each media type carries different types of data, some of it’s necessary, and some of it’s not. Each media type is unique. 

Further still, even though you’re only uploading a single asset, several versions of that asset need to be created for usage in other places. It wouldn’t be convenient if you had to upload a new JPEG for something like a thumbnail, or if someone were to share your content on social media, so the platform automatically creates those assets for you. Suddenly, a single JPEG, or media asset, becomes many. 

Again, avoiding the technical details, Dopesite identifies which media type is being uploaded, it then removes the unnecessary data, thereby, reducing the file size dramatically, and lastly, it creates the additional assets. 

To make this happen requires about a billion lines of code. I’m being hyperbolic, but the point is, it’s a lot for one person, namely me, to handle. 

Now move that shit.

Ok, so now we have less data, but how do we distribute it?

You create a global supply chain. 

Imagine how inefficient it would be if everybody had to call up the head of the cartel to get an 8 ball. It would take forever. 

Imagine how stupid it would be if the cartel tried to move their entire shipment of drugs through one port of entry. It would get seized. 

Imagine how ineffective it would be if they produced all of their drugs in one place. It would never come.

Lastly, imagine how insecure it would be if they shipped all of their drugs without enforcement. It would be compromised.

This one, believe it or not, was a bit easier to solve.

Again, instead of getting into the technical aspects (yawn,) I’ll give a topical explanation.

First, you don’t call the head of the drug cartel. Instead, you call your local drug dealer. In my world, that involves telling my application programming interface to route calls to the appropriate dealers, who’re themselves instructed to follow very specific protocols, in order to, get you the right drugs, in the right spot, as quickly as possible.

Second, I don’t try to move my entire shipment through one port of entry. Instead, I go through multiple ports. In my world, that involves setting up a global content delivery network. My dealers are supplied in the regions closest to them. In essence, if you ask for your drugs from New York City, you’ll be receiving drugs that have already been delivered and cleared through the Port of New York and New Jersey.

Third, you don’t produce all of your drugs in one place. Instead, you produce them in the right environments for the according products. Cali Kush is, “Cali Kush,” for a reason. In my world, that means identifying, which environments are best for producing and storing certain assets. As it turns out, Amazon is good for things like weed, whereas, DigitalOcean is good for things like cocaine. Both, however, are cloud storage providers.

Lastly, none of this works, unless your drugs are protected. In my world, that means, every asset needs to be encrypted and served through HTTPS. If you don’t do this, the red flags go up, and your drugs are either seized, or messed with. 

There are over 300 files to make that happen. Here’s what one file of that code looks like:  

var as3cfModal = (function( $ ) {

	var modal = {
		prefix: 'as3cf',
		loading: false,
		dismissible: true
	};

	var modals = {};

	/**
	 * Target to key
	 *
	 * @param {string} target
	 *
	 * @return {string}
	 */
	function targetToKey( target ) {
		return target.replace( /[^a-z]/g, '' );
	}

	/**
	 * Check if modal exists in DOM or in Memory.
	 *
	 * @param {string} target
	 *
	 * @return {boolean}
	 */
	modal.exists = function( target ) {
		var key = targetToKey( target );

		if ( undefined !== modals[ key ] ) {
			return true;
		}

		if ( $( target ).length ) {
			return true;
		}

		return false;
	};

	/**
	 * Open modal
	 *
	 * @param {string}   target
	 * @param {function} callback
	 * @param {string}   customClass
	 */
	modal.open = function( target, callback, customClass ) {
		var key = targetToKey( target );

		// Overlay
		$( 'body' ).append( '<div id="as3cf-overlay"></div>' );
		var $overlay = $( '#as3cf-overlay' );

		// Modal container
		if ( modal.dismissible ) {
			$overlay.append( '<div id="as3cf-modal"><span class="close-as3cf-modal">×</span></div>' );
		} else {
			$overlay.append( '<div id="as3cf-modal"></div>' );
		}

		var $modal = $( '#as3cf-modal' );

		if ( undefined === modals[ key ] ) {
			var content = $( target );
			modals[ key ] = content.clone( true ).css( 'display', 'block' );
			content.remove();
		}
		$modal.data( 'as3cf-modal-target', target ).append( modals[ key ] );

		if ( undefined !== customClass ) {
			$modal.addClass( customClass );
		}

		if ( 'function' === typeof callback ) {
			callback( target );
		}

		// Handle modals taller than window height,
		// overflow & padding-right remove duplicate scrollbars.
		$( 'body' ).addClass( 'as3cf-modal-open' );

		$overlay.fadeIn( 150 );
		$modal.fadeIn( 150 );

		$( 'body' ).trigger( 'as3cf-modal-open', [ target ] );
	};

	/**
	 * Close modal
	 *
	 * @param {function} callback
	 */
	modal.close = function( callback ) {
		if ( modal.loading || ! modal.dismissible ) {
			return;
		}

		var target = $( '#as3cf-modal' ).data( 'as3cf-modal-target' );

		$( '#as3cf-overlay' ).fadeOut( 150, function() {
			$( 'body' ).removeClass( 'as3cf-modal-open' );

			$( this ).remove();

			if ( 'function' === typeof callback ) {
				callback( target );
			}
		} );

		$( 'body' ).trigger( 'as3cf-modal-close', [ target ] );
	};

	/**
	 * Set loading state
	 *
	 * @param {boolean} state
	 */
	modal.setLoadingState = function( state ) {
		modal.loading = state;
	};

	/**
	 * Set dismissible state.
	 *
	 * @param {boolean} state
	 */
	modal.setDismissibleState = function( state ) {
		modal.dismissible = state;
	};

	// Setup click handlers
	$( document ).ready( function() {

		$( 'body' ).on( 'click', '[data-as3cf-modal]', function( e ) {
			e.preventDefault();
			modal.open( $( this ).data( 'as3cf-modal' ) + '.' + modal.prefix );
		} );

		$( 'body' ).on( 'click', '#as3cf-overlay, .close-as3cf-modal', function( e ) {
			if ( 'A' === e.target.tagName ) {
				return;
			}

			e.preventDefault();

			// Don't allow children to bubble up click event
			if ( e.target !== this ) {
				return false;
			}

			modal.close();
		} );

	} );

	return modal;

})( jQuery );

Call up a homie.

The last thing I needed to get over the last few mountains, was the last thing I ever expected; people who understood what I was going through. I often say I’m alone on this journey, but that’s a bit of a misnomer. 

My wife understands my struggle, because she’s witnessed the entire journey. Every day before she leaves for work, she says, “Today’s going to be a great day. I believe in you and what you’re doing so much.”

It helps a lot. It helps so much that I probably wouldn’t be here without it. It gives me the strength to climb mountains. This is consistent.

Some is less consistent, but just as important.

A few days after executing the aforementioned script, I was still reeling, broken, and weak. One of my best friends, and perhaps, the only mentor I’ve ever had, Gil Duldulao, was visiting. He’s witnessed my entire journey, like, day one. In fact, he was the one who nudged me on my way ten years ago. 

We both shared what we’ve gone through over the last year, which is about how often I see him these days. He nearly gave up too. His journey, unlike mine, spanned not years, but decades. It was tough, but he made it through. And so, I asked him, “How did you do it?”

He looked at me, in the only way he ever has, with absoluteness, and said, “Oh, you know. People like us, we’ve done so many things, and lived so many lives. People always think when they get somewhere, they’ll be happy, but you and I, we’ve both been there before, and we know it doesn’t make you happy. You just want to do the next thing. I learned to just be happy on my own, you know?”

“Yes, I know big bru. I know all too well.”

I wrote this for my author profile, which can be found at the bottom of this article, and every article on here, four months ago when I setup this website, “When you’ve done everything you’ve set out to do, where else is there to go, but inwards?” So, I guess I’ve known all along, I just had to be reminded of it.

It’s only the end, if you decide so. You’ll never know, unless you look inside.

This is what Dopesite looks like today. A few days before release.

It’s all sad but it’s not bad,

Stephen

Leave a Reply

Your email address will not be published.

Up Next:

A Conversation With Es Devlin at HXOUSE

A Conversation With Es Devlin at HXOUSE