Finding Goals

As I mentioned previously, I believe life presents us with a constant slew of challenges. And if we so choose, we can pick the domain from which those challenges arise. I’ve been too long allowing my meandering mind to pick stupid stuff, so I’m finally going to focus on a specific path — that path is computer programming. The next step is to come up with a goal to pursue. And in order to do that, I’m going through an exercise detailed below:

Compile a list of people whose careers would potentially satisfy you. These aren’t icons you admire per se, but real people with real careers that seem pleasing to you. So although I like Steve Jobs, Elon Musk, and Jeff Bezos — I don’t want their high-flying intensity-fueled careers. Although I appreciate the bigger fish, I prefer to live in a much smaller fish bowl.

But that’s not to say that these real people aren’t famous in their fields. For example, Brian Kernighan co-wrote The C Programming Language, the seminal book on the subject. To play such a large role in the birth of Unix and C is a big deal in the computing/programming world.

Then there’s guys like Guido van Rossum and Rasmus Lerdorf, the founders of Python and PHP. Or Anders Hejlsberg, the lead architect of C#. And Miguel de Icaza of Gnome and Mono fame. Or even Charles Petzold, author of Programming Windows, the definitive book on Windows programming (which I purchased on Oct 16, 1999 according to Amazon).

Now from that cast of characters, what common themes can I discern? It seems that I picked people that were founders and/or documenters of new technological tools. So either my goal can be to create a new tool OR document and explain an emerging tool. Hmm, that sounds like something I can work with.

The next step would be to find that tool. A tool I can pick apart and explain to others in a clear and succinct way. Or, a tool I build myself and present to others as a new way of doing things. So now I must be on the hunt for such a tool, and once found, my goal should be to create or document it. That doesn’t sound too bad.

Algorithmic Art

I’ve been working on some algorithmic art lately — that is, art generated by a computer. In other words: based on my initial input, the computer paints a picture. For instance, I might feed a bunch of numbers into a mathematical formula and then those resulting coordinates get connected with colored lines.

Pure randomness isn’t satisfying by the way — it’s just noise. You need patterns and a graduated flow. Abrupt changes don’t work, satisfying art requires transitions. Yes, splashes of color can work, but such boldness must blend itself into the mix somehow — perhaps as contrast to a simple background.

So what? Well, if life is a simulation (which it is), then the flow of life will be graduated and filled with patterns that are ushered in with transitions. Think of music: it’s not a monotonous note nor is it a random string of tones, there are graduated scales and patterns that progressively transform.

In computer-generated art, the trick is finding an algorithm that produces interesting output. Just filling in a formula is predictable and boring, you need to add some randomness. So yes, the unexpected is a necessity — but it can’t be the only component. Randomness needs to be woven into a pattern.

Stories are like this too. Narratives aren’t random happenings strung together — there are plots and progressions as characters with distinct personalities fade in and out. But all along the way there are surprises here and there — yet nothing too abrupt or outlandish, nothing beyond the boundaries that the narrative sets forth.

By its nature, there most certainly is an ebb and flow to life, a pattern punctuated by the unexpected — events rising and falling on a graduated spectrum. But what do you do with this knowledge? Appreciate it for what it is: art. It is these very aspects that we find appealing in every other medium — life itself is no different.

Enjoyment of art is modulated by the seriousness we apply to it. Take it too seriously, and you stifle it. Approach it too frivolously and it has no impact, no significance, it barely registers. Therefore, you must approach it with lighthearted appreciation — interested enough to explore and examine, but not to the point of stressing-out over it.

Programmer Part II

I am going to reattach the label of “programmer” to myself. The last time I was serious about programming was approximately eight years ago when I was selling desktop-apps on the Mac App Store. Nothing fancy, just little programs I whipped up.

On one hand, I’ve always been fascinated by programming. But on the other hand, I was never able to create something significant enough to manifest a satisfying career. So after a bunch of years going nowhere, I got fed-up and quit.

As an idealist, I imagined creating the most awesome-est software possible that generated tons of passive-income as I sat there raking-in all the profits and praise. When that didn’t happen, I said “Gah, what’s the use!” and gave-up.

Now I’m setting my sights a LOT lower. My current definition of programmer is: someone that writes and runs code — that’s it. And that’s all I plan to do for now: write and run code. Sure, anyone can type in some pseudo-code, but not everyone can get code to compile.

As I was recently reacquainting myself with programming, it was just sooo familiar. With such an intimate knowledge, how can I not have programming in my life? It’s like family. “Hello C#! So good to see you and .NET again! We should totally reminisce later! Oh hey PHP, ha yeah… you look just like I remember you… ooh who’s that over there!? Hey Godot! Wow, haven’t seen you around, but it seems like I know you already. Hello WebGL, wow you seem like a powerful backend for browsers!”

To me, programming is mostly a means to paint pixels on a screen. Even the text I’m typing is just painted-on pixels — a series of ever-changing specks with varying hues. So my task is to make those little dots dance — and by the power of programming, I shall.

Search for Success

Did you ever try searching for the thing you’re good at? Like when you see an interview with a super-successful person, and they mention how well-suited they were for the particular path they took. And so you start thinking, “Hmm, maybe I have an obvious talent within a specific domain as well!” So you run down a checklist of traits and abilities trying to ascertain where you fit within the catalog of available professions.

Psh. After several decades, I’ve yet to come up with anything conclusive. The areas which I’ve explored most are: exercise/nutrition, computer-programming, writing. Yet nothing has yet to snowball into a viable long-term career. In each of those domains, I invested YEARS of practice. The most financially successful was programming, but for some reason it just kinda stalled.

Recently, I procured a Windows-based laptop and installed a bunch of programming-related stuff on it. I’ve been browsing around for the most suitable programming paradigm — one that matches my temperament and skill-set. So far I’ve installed Python, Python with Qt, C# and .NET, Roblox Studio, Godot, and Android Studio with Kotlin. I also looked at a few others but passed them by.

I don’t have anything particular I want to make, I just want to “program” and have fun while doing so. Therefore I’m attempting to find an appropriate medium with which to express myself — something that’s powerful but not too complex. So far Godot seems the most promising, it’s a blank canvas backed by a physics engine — but of course its feature-rich flexibility comes with a learning curve. I’d actually like to get into robotics programming, but I haven’t found an entry-point yet.

But anyway, that’s where I’m at right now: trying to find something I’m good at. Of course I was very good at being negative and complaining and scaring myself, but now I’m looking for an activity on the fun-side of life. Something I can invest myself into and experience a return of appreciation. “Wow Rich, great job! Thank goodness you’re around to do what you do!” That kinda thing.

Programmed Autonomy

I’ve been obsessed by automation lately. I’ve had two dreams about riding in a Tesla on Autopilot. I fantasize about owning a Spot robot from Boston Dynamics and taking him out for walks. I’ve been browsing programmable robotic arms, robot parts, and lidar systems. I even got back into programming as a hobby, making little simulations of self-driving cars and autonomous-ants finding food — nothing fancy, just rectangles on the screen doing their own thing.

Ideally, I’d like to get some actual robots and program them to do stuff. The idea of having a small commercial-quality robotic arm to program seems like a fun hobby. I went so far as to order a Windows-based laptop recently, in-case I need to interface with some electronic-components. It hasn’t arrived yet, but I think it’s been about a decade since I used one. I’ve been exclusively using an iPad Pro for the past few years. I happened to mention a laptop to my mom and she offered to get me one, so that was that.

Until robot-parts magically fall into my lap, I’ll probably be using the PC for more hobby-level programming projects. I have the software lined up and I’m itching to go. Who knew it would take over a week for the laptop to arrive!? Excuse me, I thought this was 2019! I ordered from Dell because it’s all I know — I used to configure PCs and order from them in the late-90s/early-2000s. For this build, I wanted a solid-state hard-drive and a dedicated graphics-card. I can’t believe they still sell spinning hard-drives.

Oh and just to mention, I’ve been using Codea on my iPad for programming. It’s a neat app that allows you to program with the Lua language to create on-screen interacting sprites — it even includes a basic physics-engine for motion and collisions and gravity and such. It’s not really a beginner’s app, so you kinda have to know what you’re doing. And for the PC, I’ve been looking at Godot, which seems like a super-charged version of that. I’ll also take a look at Visual Studio and C# to see what’s new there as well.

But that’s not the point. The point is this: what interests me, is attempting to program something to navigate its world autonomously i.e. based solely on the initial instructions I provide. Basically, wind it up and let it go. Then, I observe it interacting with its world, evaluating how well I did with the programming. That takes me to my larger point: if I was an infinite-being, I would probably do something similar i.e. create a character and let it go within a world while observing and evaluating how well I did with the initial programming.

I’d see him attempting to navigate a path through life, interacting with others, and even just walking through the world using his body. And perhaps I’d see where I made mistakes and try to correct them for the next time around. Maybe some parameters were tweaked a bit too high, some too low. Perhaps my buddy sent her character in too and they linked-up for some squad-play — who knows. But I must admit that I’m not impressed with how my character’s performing — hopefully some hot-fixes can boost his abilities.

Autonomy Day

I watched Tesla’s “Autonomy Day” event yesterday and these are my notes.

According to Tesla, a self-driving car is best served via visual/camera input, just like a human driver. “Lidar” and detailed maps are crap compared to simply seeing the world as a series of still-framed images — visual cues are best. But in order to recognize what all these visualized objects are, the car needs access to a vast human-annotated database. In other words, humans must create a collection of labeled images so that the car can meaningfully interpret the shapes it detects.

But because of variances in every object, the car needs to make guesses about what it sees. In order to make guesses, a “neural network” is necessary. By inputing and labeling many pictures, the computer learns to identify images that are more likely to be one thing rather than another, in other words, it’s “close enough”. So now when the car sees an object that’s reminiscent of all the pedestrians it was previously shown, the car can assume that the unique object currently on camera is a pedestrian too.

Tesla’s self-driving technology relies on a vast array of cars-in-the-field sending data back to feed the ever-learning neural-network, which then sends updated instructions back to those cars, in effect teaching them to drive better based on the shared-experience of all the networked cars. When one car encounters a unique experience, a human at Tesla analyzes and annotates the scene and updates the database so that all cars can benefit from the experience of the first car.

A couple other things to note: For times when vision is obscured, such as fog, a forward-facing radar does come into play. For the most heavily congested areas, an aggressive driving mode seems to be necessary. The car will likely engage in a “game of chicken” where it attempts to force itself through — this means that there is a non-zero chance of “fender benders” under these conditions (but the level of aggression is going to be optional per driver).

More things to note: The cars being manufactured right now are NOT fully autonomous but they have all the necessary hardware for self-driving — and will only require software updates when ready (possibly within months). Tesla does have experimental self-driving cars on the road right-now that run with impressive results. Their timeline to a self-driving car has been incredibly fast, perhaps about 2 to 3 years.

Also something to note: Tesla’s taxis. There will be a fleet of self-driving cars available to be summoned via an app. This will be a cheaper option than current solutions from Uber/Lyft. Tesla itself will have dedicated cars for this purpose and Tesla owner’s can also add their own cars to this network (for a financial benefit).

Elon predicts that human-driven cars will become a thing-of-the-past very quickly. He expects the reliability of computer-controlled cars to become so undeniable that human-driven cars will seem reckless in comparison.

And of course: I, for one, welcome our new autonomous overlords.

Intro To Magic

An excerpt from the fictional tales of Way of the Wizard: Modern Magic

So the question becomes, how do we program our world? There are those among us that claim such alteration is possible and we have no cause to doubt them. Skepticism is certainly not reason enough, as that’s merely a form of stodgy conservatism. To make any change, great or small, we must believe in its possibility.

Typically, when we start using computers, we’re not even aware that computer-programming is a thing. The operating system, and the applications running on top, just exist. And when we learn that actual people wrote said software, we believe it to be a feat apart from ourselves, a task undertaken by geniuses tucked away in a laboratory. We could never do that, it’s simply not possible.

We wouldn’t even know where to begin. What do we write, where do we write it? And if we dare look it up, we’re deluged by complexity. What if we look for a book? Which book do we pick? And once we start, how do we keep our head above the sea of uncertainty? Plus, a simplistic step-by-step guide is one thing, an unguided project is a far different beast.

It turns out that software development is more art than math. It is not so much completing equations, but a constant treadmill of trial-and-error. We should therefore expect world-level programming to be quite the same. For instance, let’s examine a realistic scene from the desk of a software developer:

“Will it work? Let’s see. Nope. Okay try something else. Nope. Wait, why’s it doing that now!? Okay how about this. Hmm. Okay let me look something up. Ah, okay, I’ll try this. Ooh better. Ahh, nope, now the other part doesn’t work. Okay let me take a break and see if inspiration strikes. [Later that day…] Aha, that’s it! [Fervent typing ensues…] It works! Now onto the next problem….”

This common scenario plays itself out again and again. The solution so often comes from outside the programmer. Either it comes from an actual archive of answers (a forum for programmers), or from some mystical source of inspiration that’s accessed by the programmer’s subconscious once he engages in another task.

Let’s not gloss over this point, that the key to a programmer’s code comes from external sources. One source is a repository of discussion compiled by programmers over the years. And another source is some other-worldly well-of-knowledge that provides solutions for problems posed to it while the mind is no longer actively searching.

So a wizard should expect much of the same. First, he needs to grasp that magic exists. Second, he must believe it’s a process he can proficiently navigate. Third, he must dive into some introductory materials that provide a cryptic set of rules and steps for completing basic but essentially useless projects. Then as aspirations expand, on comes a contentious time of attempting to self-solve a particular problem. This is accompanied by research into the ways of others who solved similar issues, alongside bouts of inspiration from one’s own imagination. Voila! A wizard is born.

In programming, there is no set canon of introductory materials. Programmers learn their craft by various means. There are a myriad of languages and techniques and styles of programming. There’s countless sources of introductions. The common theme though, is the intent and determination of the practitioner. And there is one other commonality: every programmer begins by writing a small program that prints a simple phrase, a very telling phrase: hello, world