Blog

  • Content Writers, Programmers, we chase the same high

    Content Writers, Programmers, we chase the same high

    “I don’t know how they could write content all day, every day.” -Programmer

    A programmer recently said the above comment in reference to a staff of writers[1]The person is actually titled a Software Engineer, but I’m using “programmer” as a catch-all term for “people who write code.”. Both teams, the web development team and the content team, work to create websites for the same marketing company. I interpreted the comment as the programmer highlighting the gulf between what programmers do and what content writers do. As in, there’s no way I could write blog posts all day; I don’t see how anyone could. It’s not who I am. I’m not wired like that.

    As someone who’s played in both the programmer[2]Game developer, using GameMaker Studio (GML), Unity (C#), and Unreal Engine (Blueprints) and content writing[3]Author of five books of fiction, lots of essays, and tons of blog posts sandboxes, my quick response was an attempt to bridge the gulf by correlating similarly motivated dopamine rushes. As a programmer, the thrill of writing a block of code that works just as expected is exalting. The beauty of elegantly written code is often a reward in-and-of itself. Same with writing copy. Finding just the right phrase, with balanced flow and impact, is its own reward. I spat out something to the effect of “content writers are thrilled by an elegant sentence in the same way programmers are thrilled by an elegant statement.”

    “Thrilled” is probably not the exact word I used, but it’s one I’ve since settled on as it conveys a degree of satisfaction that both programmers and content writers chase. In this post I hope to help each side of this gulf, but programmers more directly, empathize with the other, and in turn perhaps eliminate the gulf entirely.

    Let’s gather round the fire and Kumbaya the night away!

    My method is a paragraph. My statement is a sentence. My variable types are the parts of speech. My IDE is a Google Doc.

    Imagine this simple program. Its goal is to determine if the dangers of bear attacks have been properly expressed:

    namespace AvoidBears
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                bool mainIdea = MostInteractions();
                float falseConfidence = SomeInteractions(mainIdea);
                bool hasLearned = DontDoThis(falseConfidence);
    
                Console.WriteLine("The reader has learned that bears are dangerous: " + hasLearned);
            }
    
            static bool MostInteractions()
            {
                bool isMostlySafe = true;
                return isMostlySafe;
            }
    
            static float SomeInteractions(bool isSafe)
            {
                float falselyConfidentInWilderness;
                if (isSafe == true)
                {
                    falselyConfidentInWilderness = 100f;
                }
                else
                {
                    falselyConfidentInWilderness = 0.2f;
                }
                return falselyConfidentInWilderness;
            }
    
            static bool DontDoThis(float falseConfidenceLevel)
            {
                bool hasLearnedBearsAreDangerous;
                if (falseConfidenceLevel >= 100.0f)
                {
                    hasLearnedBearsAreDangerous = false;
                }
                else
                {
                    hasLearnedBearsAreDangerous = true;
                }
                return hasLearnedBearsAreDangerous;
            }
        }
    }

    Here we have three methods. Each takes in a return value from the previous method to ultimately determine the value of hasLearnedBearsAreDangerous.

    Now, imagine these methods are actually paragraphs of text in a blog post about the dangers of bear attacks. Paragraphs, much like methods, require input (ie, ideas from previous paragraphs) and deliver a return value (ie, a new or expanded-upon idea). Both programming and content writing use blocks (methods/paragraphs) to inform functionality of other blocks. If the goal of the example content piece above were to properly teach the reader about the dangers of bears, it would fail (hasLearnedBearsAreDangerous returns false).

    The similarities don’t end at the method/paragraph level:

    • Both start with an end-goal in mind.
    • Both rely on revisions (refactoring/editing) to craft a more elegant solution.
    • Both rely on adjusting values (variables/words) to inform the blocks.
    • Both are strict (syntax/syntax[4]See, even those words are the same. Kumbaya!) so as to ensure proper presentation (compilation/reader understanding)

    The Unabstactability of written language

    A piece of written copy is often designed to teach or entertain the non-binary mental state of a person. A piece of written code is designed to inform the binary needs of a computer. A program either works or it doesn’t, based on how well the problem was abstracted. A piece of content, however, can almost never be absolutely abstracted. This massive difference is where, I think, a programmer might see content writing as something they couldn’t do “all day, every day.” This unabstractability can be uncomfortable for many people[5]Or maybe some people simply find content writing boring. That’s fair. I’ve been bored with it before..

    Unabstractability is ingrained in the very fabric of human language. It’s why we have so many words for single concepts yet still it seems we never have enough words. Throw in social malleability, and the slang it spawns, and you’ve got even more layers of movement and un-absoluteness.

    Declaration isn’t enough

    Another way to look at the unabstractability of written language is to consider the idea of memory. In programming, if we want the computer to remember something, we first create a space (ie, variable) for that memory by declaring the space. Then we tell the computer what value to remember by instantiating that space. Once that space is declared and instantiated, the computer will remember it until we tell it to forget it. This consistency is comforting. This absoluteness makes creating a “code narrative” dependable.

    In the world of content writing, declaration isn’t always enough. A content writing variable isn’t simply given memory (in the RAM), it has got to fight for memory (in a human brain). Think of the way a short sentence among a paragraph of long sentences stands out. Or that, in a paragraph of dull prose, I might suddenly tell you that last night I shit out an entire Donatello action figure. The information in that short or vivid sentence is going to be much easier to retrieve in a later paragraph/function.

    Think of it this way: a vivid detail is globally scoped. A dull detail is locally scoped. Will you remember Donatello’s headless body and its confusing journey through my digestive tract? For sure. Will you remember that the fifth word in this paragraph is “way”? Probably not. At least not once we move on to a new method/paragraph.

    Our tasks are different, our skills are different, but our means are the same

    Programming and content writing initially seem like functions at opposite hemispheres of our brain. Though programmers will insist that creativity is part of programming, and content writers will insist that structure is part of content writing, I have witnessed a reductive division between the “left brainers” and “right brainers.” But that division isn’t actually so static. The gulf isn’t so wide.

    Grab your guitars and your synthesizers, your colorful coats and your survivalist blankets, and let’s sing together around the campfire.

    Photo by Courtnie Tosana on Unsplash

    Footnotes

    Footnotes
    1 The person is actually titled a Software Engineer, but I’m using “programmer” as a catch-all term for “people who write code.”
    2 Game developer, using GameMaker Studio (GML), Unity (C#), and Unreal Engine (Blueprints)
    3 Author of five books of fiction, lots of essays, and tons of blog posts
    4 See, even those words are the same. Kumbaya!
    5 Or maybe some people simply find content writing boring. That’s fair. I’ve been bored with it before.
  • Podcast Island. And Unreal Engine 5 Game (that I made!)

    Podcast Island. And Unreal Engine 5 Game (that I made!)

    Welcome to Podcast Island.

    The podcasts have run amuck. Explore Podcast Island and capture all of the 10 escaped podcasts.

    Or, if you don’t like that story: The podcasts are living their best lives in their native habitat. That must end. Capture them. Make them your pets. Humans rule!

    Or, if you don’t like that story either: because the player character is outfitted in radioactive protective gear, maybe the podcasts are radioactive, and they need to be captured and properly disposed of.

    None of that really matters. Podcast Island is less a game and more a result of my Unreal Engine learning journey. And I can say with confidence, I learned a lot on Podcast Island.

    I came to UE with a history in Gamemaker Studio (GML) and Unity (C#). UE, therefore, presented me with a lot of firsts. UE is the first engine I used that dominantly favored 3D third and first person games. UE is the first engine I used, capable of 3D, that presents as a fairly self-contained tool-set (ie, Unity relies on 3rd party integrations; UE only offers 3rd party integrations). Perhaps most eye-opening of all, UE is the first engine I used that seems to encourage visual scripting over coding.

    Wow, visual scripting can be amazing.

    I love coding in C# with Unity. I love the flexibility. I love how smart it makes me feel. But I love visual scripting, now, too.

    The primary benefits I’ve discovered with visual scripting are:

    1. It’s visual (duh). For me, I can simply understand the logic much more efficiently vs. coding.
    2. It’s extremely strict. Nodes throw errors much more reliably than scripting when I attempt a change. Sure, different IDEs and different languages may be differently strict, but at least based on my experience with Unreal Engine’s Blueprints system vs Unity + C#, I’m much more confident that my programming will work the first time I compile.

    This post isn’t a love-letter to UE, so I’ll move on with some thoughts about the game, Podcast Island.

    Podcast Island is my first Unreal Engine project. It’s got plenty of issues, for sure. My main focus was to learn Unreal Engine, with things like gameplay, level design, optimization, performance, and everything else being way, way down the list of priorities. With this in mind, the project was a huge success. I really like Unreal Engine.

    Constraints support motivation supports learning

    My approach to learning UE was to force some pretty heavy constraints. When I learned other engines, I would start with “let me try to do this thing, which may or may not be applicable to any project I could ever want to do; I just want to see if I can do it.” That’s fun. For a while. But motivation has a hard time fueling itself. It needs a goal. Sure, “fun” is the most powerful motivator because it basically fuels itself, but fun runs dry without an eventual goal. So with UE and Podcast Island I constrained myself to prevent me from aimless mechanics tinkering.

    Only running and jumping. No climbing, crouching, crawling, shimmying, etc, and no combat of any kind. The focus of this game is about exploring and collecting. The goal was to keep the scope incredibly small. Added mechanics increase scope.

    (Almost) only free assets. I’ve made the mistake in the past of spending hours and hours making assets only to be frustrated and bored with the project before the first mechanic can even be programmed. I decided to stop “looking down” on free assets for Podcast Island.

    Simple design ethos: always present two options for exploration. The player is hunting for shimmering microphones. Therefore, every time one is acquired, the player’s exploration loop resets, meaning the player will look for the next goal. So, at every collectible, it’s important for the player to see, from that world-position, at least two interesting points on the horizon to move forward toward. The player is always presented with at least two choices, rather than presented with a single “obvious” direction, giving the player agency in their progression.

    A note on specs

    Look, I have no idea what specs are required to play this game. All I know is that it runs well on my very good PC, but it runs like crap on my not-very-good PC. Should I explore a future version of this game, I’ll likely include a settings menu to allow the player to choose how to run the game. Remember: constraints.

    If you download and play this game, I’d love to know how it performed for you. I’d also like to know what you thought. Did I do well for my first Unreal Engine project?

    Caleb

    All assets are sourced either from Unreal Engine Quixel Bridge, made myself, or come from sources on the Podcast Island itch.io page.

    Head over to my Itch.io page to play Podcast Island.

  • Rogue Jam Ep. 1…That’s my game!

    Rogue Jam Ep. 1…That’s my game!

    My game, I Can Hear Them Coming, was recently showing in an episode of IGN and Rogue Game’s Rogue Jam show.

    I don’t really have much to say about the experience, as my participation was limited (though don’t let that imply that my excitement was limited…I was, and still am, incredibly excited to have been a part of this). The process was pretty straightforward. 1) I entered the contest. 2) I got an email saying that my game moved on to the next round and that I need to submit some clips of me answering a list of questions, 3) Episode 1 of show goes live on YouTube, and there I am. Unexpectedly seeing my game on the show was surreal, for sure.

    While my game didn’t win (and, for the record, I agree with the judges in choosing other games), that won’t stop me from pretending that I have kinda, sorta shared a stage with Reggie Fils-Aimé, Peer Schneider, and Daemon Hatfield.

    For anyone who wants only the Caleb bits, go to minutes 3:27 and 4:50 of the video, linked below.

    Watch Rogue Games Awards $50k to One Game with Huge Potential | Rogue Jam Ep. 1

  • Learning Things I Don’t Want to Learn but Need to Learn Anyway (Maybe)

    Learning Things I Don’t Want to Learn but Need to Learn Anyway (Maybe)

    I recently completed an animation course in Blender. I have no plans to use Blender animations in my games.

    My Blender learning journey has been one so far focused on modeling, shading, and UV texturing. Soon I’m going to start sculpting. All of these focuses are applicable to the game-making journey I’m traveling right now. But animation…well, I’m either building a game that doesn’t use animations or, more likely, I’m avoiding making a game that uses animations because animations are effing intimidating.

    I have some history with animation. In college, I created a Flash cartoon series called The Thirsty Gerbil Super Things (check out this one episode that still survives), recently I completed a short Unity animation course (focused on the Mecanim system), and even more recently I completed an animation section in a very popular 3D modeling course. What I’ve learned from the latest Unity and Blender courses is that animation is really hard and when something goes wrong, knowing how to fix it is pretty hard. Usually I have to start over.

    I know that learning animation in Unity is going to be very important eventually (and is probably very important now, but again, I’m fighting hard to avoid having to actually master animation).

    But how exactly does animating in Blender relate to animating in Unity? I don’t know. The Blender animation course that I recently took doesn’t describe how to get Blender animations into Unity, meaning my practical use for the learnings is far removed.

    So why not just skip the animation section? Because I’m afraid that without taking the course in the proper order I’ll miss the required knowledge for advancing through future courses. Also, if I skipped the animation course, I will have missed out on creating the very cool animation above.

    So, to summarize:

    1. I know learning animation is important
    2. I’m intimidated by learning animation, so I’m avoiding it as much as possible
    3. I have no practical use in mind for animation, which supports my aversion
    4. Looked forward to a future devlog where I inevitably dismiss animation as “super easy”
  • Video Game Music is Pretty Damn Great

    Today we talk about that stuff that goes in your ears when you play a video game. No, not the wet fingers of an annoyingly immature roommate or little brother (though, in this case I’m pretending both the immature roommate and the little brother are named Wily, so getting a “wet Willy” at least makes some kind of sense). No, we are talking about video game music!

    Join us as we talk about the music we’re listening to and the game music we love. Last, but not least, join us in a video game music listening party of sorts as we listen to four tracks created by the Flyover Indies community, which can be listened to as part of the full Flyover Dailies 2021 album, available here: https://flyoverindies.bandcamp.com/album/flyover-dailies-2021

    The sounds we mentioned are:

    The Flyover Indies songs and song-makers we mentioned are:

    The mentioners of the aforementioned mentionables are:

    • Charlotte Trible (@ctrble)  – co-founder of Flyover Indies and game developer
    • Gage Bradley (@DrumGadget_433) – member of Flyover Indies, musician, and game developer
    • Nash High (@nash_high) – member of Flyover Indies, musician, and game developer
    • Caleb J Ross (@calebjross / https://calebjross.com) – member of Flyover Indies and game developer

    If you have any comments to make on this or any Flyover Indies Podcast episode, feel free to Tweet us @Flyoverindies or email us at contact@flyoverindies.party. We might just read your tweets or emails in a future episode.

    Play some of our games here: https://itch.io/games/tag-flyover-indies

    Intro and outro music by Nash (https://www.nashhigh.com)

    Subscribe to the Flyover Indies Podcast:

  • We Talk Video Game Controls

    The game-making lessons we learned are:

    • Button combos don’t have to be complicated if the designers leverage “domains of knowledge” (also mentioned: Caleb’s video, “Button Combinations Should Be Complicated! Why Aren’t They? (Video Game Controls)”
    • “input recycling”… “input pairing”…? Almost every virtual action in the game shares a physical input with another virtual action (Overcooked 2)
    • Introducing more complex controls over time (Animal Crossing New Horizons)

    (more…)