Skip to content

Instantly share code, notes, and snippets.

@lyxal
Last active June 6, 2022 12:52
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lyxal/64b2ed82a273e530379d979d2e6ed3bd to your computer and use it in GitHub Desktop.
Save lyxal/64b2ed82a273e530379d979d2e6ed3bd to your computer and use it in GitHub Desktop.

The Art of Esolang Communities

Alternatively, what I learned about engagement from making Vyxal

I've always believed that there are two ways to get the most out of participating in the Code Golf Stack Exchange: playing the main game of answering challenges and playing the metagame of golfing language/esolang creation. And arguably, though problem-solving is fun, it's the meticulous planning, strategising and marketing of esolangs, as well as community engagement where the real thrills of this site lie.

And while it's a relatively simple process to become a player in the esolang market, it's really gosh dang hard to become a successful player; out of the thousands of esolangs in existence, only a handful ever leave the confines of their esolangs.org page and gain popularity in the big wide world. So then, how do you beat the odds?

That's a question many have asked over the years. Hell, I even asked that question myself. But I now have answers, thanks in part to observations about the hyper-growth of Vyxal and in part to studying the history of some of the most influential golfing languages (05AB1E, Jelly, Husk and MATL). And I'm here to share those answers with you.

0 - Terminology

Before I start explaining the "magic" that draws people into using your esolang, I'd like to clarify a few things about the wording of this blog post:

  • Whenever I use the word "esolang", I'm talking about languages intended to be used by humans for problem solving on code golf - languages like Malbolge and Brainfrick are novelty languages that you look at once and say "ha, that's cool. Time to never use this lol". Those kinds of esolangs don't exactly leave much room for growth outside of shock-factor responses.
  • The word "market" is used to mean "the pool of actively used esolangs on code golf". There's no monetary value involved in this metagame, only bytes.
  • The phrase "language launch" is defined as the point in time where an esolang is considered ready for normal usage - the language creator(s) decide that enough has been done that it's a "complete" enough language, and not in beta/alpha anymore.
  • "Community building" refers to the act of expanding an esolang's userbase. "Community engagement" refers to the act of maintaining an esolang's userbase.

1 - The Two Eras of a Project

While it's tempting to view community building as something that happens after the launch of an esolang, the reality is that to successfully promote a new language, pre-launch and post-launch marketing needs to be carefully considered. As this post will detail, the pre-launch era of an esolang consists of:

  • Premise generation
  • Implementation
  • Finalisation

While the post-launch era consists of:

  • Initial engagement
  • Controlled expansion
  • Maintenance

These stages within each era all have to be planned and executed in a way that is always focused on the long game of popularity - whether you like it or not, ambition and thirst for market domination is an important part of esolang success. However, it is important to note that in the post-launch era, there are environmental factors that influence community building and engagement that fall outside of the control of the language creator(s). These variables will be discussed in their own section.

2 - The Pre-Launch Era

Alternatively, the part where everything is under your control

Getting the pre-launch era right is extremely important - it sets the foundations and tone for the post-launch era of the esolang. And while the majority of this era is writing the interpreter/compiler for the esolang, there are still long-term marketing decisions that need to be made.

But for a blog post talking about community building and engagement, one would think there wouldn't be a need to discuss the process of creating the initial ideas for the esolang. Surely, the actual esolang creation process doesn't impact the popularity of the esolang? Well yes. It does. In fact, if you get the design goals of your esolang wrong, you'll have a bad time later on when trying to advertise and spread your language. Note that this section does not intend to tell you what to include in your esolang or how to actually write the code for the interpreter/compiler - that's completely up to you. What this section does do it point out some things that you might not have previously conisdered important.

2.1 - Premise Generation

The first pre-launch step to get right is establishing the goals and purpose of the esolang; a clear and objective vision for the esolang will not only help development, it will act as the foundation for how the esolang is defined and marketed. The two things one absolutely needs to consider in this phase are the paradigm of the esolang and the desired userbase. The paradigm of the language impacts what the language will look and feel like, as well as the total percentage of the code-golf userbase will be interested in using your language. The desired userbase will guides through language design decisions and helps tailor the esolang to their needs.

2.1.1 - Paradigms

The paradigm of any programming language (practical and esoteric) is the style in which programs are written in that language (trust me, I did a whole uni course on different programming paradigms.) Possible paradigms include functional, logic, stack-oriented, tacit, tape-oriented, and imperative. And while esolangs can utilise whatever paradigms they desire, it's a good idea to choose one that isn't already monopolised by another major esolang; unless the esolang can stand out from its competitors, people are unlikely to leave what they know. For example, the functional programming paradigm as well as prefix flavoured imperative paradigm are open markets for new esolangs - leaders such as Husk and Pyth have fallen relatively quiet over the last few years, meaning these categories are ripe for the picking. On the other hand, the tacit paradigm and the stack-oriented paradigm aren't as open for new esolangs - Jelly has a strong grip on the tacit market and the stack market is already divied up between Vyxal and 05AB1E. This isn't to say it's a futile activity to make tacit and stack esolangs, and that functional and imperatieve esolangs are the only esolangs that should be made. Rather, this is to say that one is more likely to achieve success by investing in viable markets.

As an aside, one might ask whether or not the market for fractional-byte esolangs is open in the context of dominating esolangs. And while a full discussion is outside of the scope of this blog post (fractional bytes are a scoring system, not a language paradigm), there is arguably room for a new fractional-byte esolang to rise up and become one of the major golfing languages. But such a language has proven elusive, thusfar, as no-one has managed to make such a language that is competitive with standard SBCS languages and is intutive/user-friendly. Prove me wrong.

As another aside, when choosing an esolang paradigm, it's a good idea to avoid something purely for novelty like a brainf*ck derivative or a heavily thematic esolang. This is because novelty esolangs are hard to sell - people will see them, think "oh that's cool", try it for a bit and realise that it's too much effort for them to do anything more complex than adding numbers. Therefore, the esolang should be designed with the intention of either being a) long-term interesting or b) able to win code golf challenges. And it should also be deisgned to be an enjoyable experience for users; unless you're going for an intentional hard mode tarpit, then make it fun and straightfoward to solve non-trivial challenges. You shouldn't need a PhD in finite state automata to sort a list.

2.1.2 - Intended Userbase

The intended userbase of an esolang is the group of users that the language inherently caters toward. That is, the esolang is designed in such a way that a specific set of people are drawn to the language. Unlike the esolang paradigm, the intended userbase doesn't have to be completely objective or rigid - it can change over time and be expanded/narrowed as needed. Possible userbases include new users, casual golfers, hardcore golfers (think those who torture themselves with tarpits) and enthusiasts of another existing language (think APLers and languages such as J, K and BQN). It's important that the chosen intended userbase will be comfortable with the paradigm of the language - a stack-oriented esolang might not be as appealing to experienced golfers as it would be to new users, and a tacit language might be too confusing for news users but a delight for experienced golfers. Put simply, let the paradigm influence the intended userbase.

2.2 - Implementation

The next pre-launch step to get right is actually implementing the esolang - not the actual coding itself, but the way people interact with the development of the esolang. Indeed, it is important to consider not just the coding aspect, but the whole process of implementation, as it lays the groundwork for the initial engagement step that occurs post-launch.

To get a better understanding of why this phase is crucial to esolang success, first consider what can appear to be the most logical method of implementing an esolang: an individual programming and writing the entire language in secret and then having a big reveal once everything is completed. One would expect that hype generated by dropping hints and teasers over time would be enough to fuel initial engagement and secure a user base, as the innate human desire to not be left out of the loop would draw people into being the "first" to use the language. In reality, this has led to a sudden spike of interest followed by a sharp decline into obscurity. People see the announcement, experiment a little, and then move on. They don't get to appreciate the effort that went into making the language and they don't get to identify with the language development process. All they see is something that "magically" appeared, something that comes and goes with the wind. Thus, the esolang is seen as a novelty and a gimmick that has about the same lifetime as that of a starred message.

In this way, the implementation phase of an esolang must allow for a lifetime longer than a starred message. Indeed, it needs to create history and a story that people can embrace and adapt as their own. This is accomplished best by what this post terms "chatlogging" - the process of creating a dedicated language chat room and logging updates to the language, as well as answering any questions prospective users may have. Ideally, one would share "real-time" progress while they develop the language by announcing non-trivial changes and engaging in brain-storming and idea generation sessions.

Aside from the organisational benefits, chatlogging will allow users specifically interested in new and active esolangs to see progress and investigate the language - many code golf users are interested in the metagame of language creation, and chatlogging creates a source of exposure to attract these users. Once curious users start trickling into the chatlogging room, it is important to involve them with the development of the language; ask for language feedback, feature requests and opinions on different items. Doing so creates a "prototype userbase" - a set of people who will be able to a) help development but also b) act as the initial users of the language. And in addition to chatlogging, a good idea to help with the implementation phase is to occasionally ask about language design in TNB. This creates exposure for the esolang to the metagame inclined users who may not scan the active rooms list but do logread TNB.

  1. Terminology
  2. The Two Eras of a Project
  3. Pre-Launch Era
    1. Premise Generation
      • Choosing an avaliable language paradigm
        • Ideally, pick one which isn't currently monopolised
        • Prefix - +1 (Husk and Pyth have fallen quiet - ripe for the picking)
        • Tacit/Stack - 0 (Jelly still reigns supreme in the tacit market. Vyxal [currently] dominates the stack market).
        • Aside: Fractional bytes - +0.5 (Not a paradigm - rather a scoring system. So far proven hard to get right)
      • Identifying the target userbase
        • Can be influenced by the language paradigm (Something like tacit generally restricts the possible user pool to more experienced users. Something like stack or prefix lends itself better to new users, but can alienate more experienced users).
        • Important to define a clear demographic to cater to - defines language design + informs post-launch marketing strategies
        • Generally better to focus on a single demographic when designing - languages can always be marketed down to new users or up to experienced users if need be if their foundations are clear.
    2. Implementation
      • Important to consider not just the coding aspect, but the whole process of implementation.
      • When done right, the implementation phase helps with initial engagement with the esolang.
      • While the idea of creating everything behind the scenes and doing a big reveal at the end seems like the logical thing to do, recent history has shown that it doesn't lead to popular esolangs with thriving communities.
      • What has worked is chatlogging the progress of an esolang during development.
        • Creating a chatroom dedicated to that language.
        • Provide updates on what's happening in "real time" - share while you work.
        • Curious users will see the activity in the chatroom and investigate the language.
        • Engage these users by asking for language feedback, feature requests and opinions.
        • Doing so creates a "prototype userbase" - a set of people who will be able to a) help development but also b) act as the initial users of the language.
      • Occasionally ask about language design in TNB - exposure to users who may not scan the active rooms list but do scan TNB.
      • Vyxal, 05AB1E, Jelly, Husk and MATL all followed this formula in some way or another.
    3. Finalisation
      • While implementing the language decide upon a list of milestones that constitute progress towards launching the language.
      • Aside from the practicality of organisation, it also gives a reference of when hype should be created, and when pre-marketing can occur.
        • As the size of the list approaches 0, that's when you start announcing that the language is nearing completion.
        • This helps with expanding the prototype userbase, but also creating
      • As major milestones are ticked off, make pre-releases of the language and make sure they are adequetly advertised.
        • This allows the prototype userbase to start officially using the language for the main game.
        • And that creates exposure and an oppourtunity to expand the prototype userbase.
  4. Post-Launch Era
    1. Initial Engagement
      1. Language Launch

      2. First Answers
        • Done by you and the prototype userbase you built during the pre-launch era
      3. On the Topic of Excessive Advertising
    2. Expansion
      1. The Fundamentals of Promotion
        • Getting clear on messaging
        • Play to the intended demographic of users
        • It's all about perception and optics
      2. Direct Exposure
        • Language of the Month
        • Learn You a Language
        • Community Ads
        • Deadlineless Bounties
        • Stunts
          • E.g. Code Review
        • Tips Question
      3. Indirect Exposure
        • Getting the language known without explicitly advertising
        • Utilising chat
          • Answering CMCs
          • Sneaking language into conversations - e.g. language recomendations
        • Answering challenges
          • Not just the standard "header, solution, explanation"
          • Targeted wording
        • The perception of activity
      4. Cross-Site Marketing
        • Github
        • Discord
        • Online Interpreter
        • Esolangs wiki
    3. Maintenence
      • Not maintaining the code (bug fixing is a given). Maintaining the community.
        • The point of a large community is wasted if it can't be kept together.
        • Making sure old users don't fade away and that new users don't drop out due to feelings of intimidation.
      • Listening to users within the community
      • Community projects and initatives.
  5. External Factors
    1. Timing
      • Language release date
    2. Influencers
    3. Competition
  6. Conclusion
@lyxal
Copy link
Author

lyxal commented May 26, 2022

Design phase:

  • Novelty esolangs are hard to sell because people will see them, think "oh that's cool", try it for a bit and realise that it's too much effort for them to do anything more complex than adding numbers.
  • Therefore, design the language to win - or at least design the language with the intention to win.
  • But if you're not going for intentional hard mode, then at least make it a pleasant experience for users to solve non-trivial challenges. You shouldn't need a PhD in finite state automata to sort a list.

@lyxal
Copy link
Author

lyxal commented May 26, 2022

Initial Engagement

  • Important to have places set up where people interested in your language can learn.
  • Two things: a tutorial and a front-page pitch. The tutorial is a well explained introduction to the language. The front-page pitch is a high-level overview of your language written to entice people to join your cause.
  • the front-page pitch is what you use in your README.md, your esolangs page and your LoTM/LYAL nomination.
  • Get a place where people can conveniently try your language. Whether that be online or via a quick and easy program they can install and instantly use, get a user-friendly gui working. Make it mobile friendly too!
  • Bare minimum to have: SE chat room, github (or other source host) repository, esolangs page, language of the month nomination, LYAL nomination.
  • Encourage your prototype user base to answer questions and reward them for doing so. Make sure to upvote each and every new answer in your language during this time, and encourage the prototype user base to do the same.
  • Answers you should write: HW, Fizzbuzz, 99 bottles, Fibonacci, factorial (unless trivial)
  • Create a list of reasons why your language is different to all the existing languages. Point out why your language is hot stuff and why people should abandon the boring languages that already exist.

@lyxal
Copy link
Author

lyxal commented May 26, 2022

Expansion:

  • Have people who can FGITW in your language (even including you). Get a highly voted post so that people coming from the HNQ see your answer and language.
  • Get a tips question going - this'll bring a tiny bit of HNQ views and create perception of community engagement.
  • Invest in designing a community ad
  • Deadlineless bounty for new answers.
  • Also, bounties for meta-challenges (answer question X in less than y bytes for example)
  • Make sure that when answering a challenge by a new user that you write a clear explanation and that you've written what is absolutely the shortest you can. And if you beat other languages on these challenges, make it noted. New users will see this and be more likely to click on your language than a competitor's language.
  • Start following people on github and make sure your language is one of your pinned repositories - people generally follow back, and will star your pinned repos.
  • Whenever there's a CMC asked in chat, answer it in your language if it's short enough that people will think "wow that's short." CMCs are opportunities to highlight your language's strong points, so avoid exposing flaws if you wouldn't have otherwise answered the CMC.
  • Find ways to sneak your language into discussions.
  • If you're doing something revolutionary / ground breaking new, create a consensus question on meta to ask about the legality of your language features. While this sounds counter-intuitive (you're risking invalidating the core part of your language), if your community is big enough, you'll almost surely get a majority approval and end up using your language as an example.
  • Make sure that there's a welcoming atmosphere coming from the existing community of users. You don't want new users feeling alienated from the language because there's too many elitists in the group.
  • Make sure that you respond to language criticism in a non-combative way. You want to show strength, but you don't want to antagonise or throw a tantrum at the slightest negative reaction.
  • But if it starts becoming harassment and or a reoccurring joke, speak up. Don't let people explicitly target your language just because they want to.

@lyxal
Copy link
Author

lyxal commented May 26, 2022

Maintenance:

  • More than just fixing bugs and addressing feature requests - it's making sure your community doesn't fall apart and that there is unity/a common goal.
  • Constantly encourage and support the people within your community. Make them feel needed and that they are a crucial part of continuous success, because spoiler: they are. Compliment them when they do a good job of something. Don't be harsh and cruel if something goes wrong. Reward the good things and calmly work through the bad.
  • Once there's enough people contributing to the source code, create an organisation on the code hosting platform - not only does it simplify permissions management, it portrays a sense of unity and togetherness and that you are strong as a pack of like-minded people.
  • On the topic of contributors - make sure there's guidelines in place for contributing code. You want there to be a sense that everyone knows what they're doing (even if you actually don't) and leaves less room for chaos.
  • Make sure that people within your community are heard and that they know that their voice matters. If someone has a feature request or a big report, acknowledge it and make sure there's sufficient response to it. Even if it might take a while to actually address it or if it turns out to be rejected, you want to make sure there aren't people feeling ignored.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment