Prioritizing Your Own Vision
Creativity is a great part of life, it's something that inspires people to create goals and meaning in their lives. Everyone has different levels of creativity, and in some regards it is a highly important skill to possess. I have always felt that I have a very solid creative spark, and when that spark gets lit by any other topic in my life, I can usually say that it's exciting. Sometimes, however, it can be challenging to compromise with your own vision. I'm going to briefly write about an experience where my creativity got the best of me.
Work and creativity surprisingly make a great mix most of the time. When you can line up your own ideas and interests with a goal, it makes the process a lot more fun. You feel inspired, and most of the time work much harder. Recently I had to take part in another project, this time mainly focusing on Python and databases. The goal of the project was to create a Python application that featured a Command Line Interface (CLI), and Object-Relational Mapping (ORM). These come together to make an interactive backend, where ideally you can create methods to make communicating with the database a lot more streamlined.
The specifics of the project were tougher than my past projects, and this was another situation where I really did not know where to start. I essentially had to create my own database using SQL, create a CLI using Python, and then build out ORM methods for interaction. These include creating classes, deleting classes, listing out every class, etc. On top of that, there were some deliverables I had to meet such as including a one-to-many relationship and having solid user interaction. Cool, so I know what I have to do, why was this tough and what does this have to do with creativity? Well, I'll get there.
When it comes to having freedom in this sort of thing, a part of me always tugs into the creative route. I could have just simply created an application to complete all the deliverables, such as a coffee shop or something along those lines, but that's not how I operate. A partner of mine brought up "ascii art", something that ended up being the ember to spark the creative flow. Ascii art is essentially creating art using keys on a keyboard, something like this:
If you look hard enough, you'll notice it is made up of simple key strokes. Ones, zeros, dollar signs, periods, letters, etc. Well when the idea of ascii art was on my mind, I started to wonder how we could integrate this idea with the project. After all, this art is simply made up of keys, so a database very well could hold such a thing. Not to mention there are so many game ideas that are possible with this concept. We had an interesting generation alpha concept, it involved being presented with an ascii art image of a room featuring three doors. You'd be able to "go into" these doors by pressing 1, 2 or 3, and inside each room would be some kind of new art that would involve some sort of gameplay. Inside the CLI, it would look like this:
+---------------------------------------------------+
| |
| |
| +----+ +----+ +----+ |
| | | | | | | |
| | 1 | | 2 | | 3 | |
| | | | | | | |
| +----+ +----+ +----+ |
| |
| |
| |
| |
+---------------------------------------------------+
Anyway, let me get to my point before it gets too boring. The issue I faced and the main idea behind this blog is that when you start creating these cool concepts and trying to fit your required code around the ideas, it can be an issue. At the end of the day, a project is a project and we have deliverables that need to be met. In our final concept, we were inspired by the game "Among Us" and created an interactive CLI that allows you to play a social interaction game. Our idea was that you could start a game where you'd be presented with 3 characters, and these characters would be able to be asked questions and reply with unique responses. The responses would give you information to further deduce who is suspicious, and ultimately be accused of being a "killer" to reach victory. We decided this would be the final concept, and the one we would actually start coding.
When you focus on your creative vision over the actual essentials of the project itself, you are forced to run into road blocks. About half way into creating this new version of the project, I was met with the crisis that it was headed in the wrong direction. I didn't truly have a one-to-many relationship between any of my classes, and on top of that, there were no create, delete, or list all features for my integral classes. Those being the characters and responses. After all, how could I? I can't just let anyone create a character inside the game, that would ruin the functionality of the game. So would the responses. The whole point is that there are set responses that show who is and is not suspicious. If anyone could create or delete my responses, the game would be ruined.
At this point I got really stressed out. I didn't know how to proceed, or if I'd have to start the project from scratch. I couldn't reach any of the deliverables and still hold my creative vision in tact. It was here that I realized that I should not have focused on the thing that truly doesn't matter in the end over our actual grading criteria. If I had messed up and chose a worse concept than I had, I very well may have thrown away 2 whole days of work and had to start over from scratch with a new, easy and boring concept. Out of all the projects I've done so far, I'd say this point was the most stressed out I've been from the situation.
Luckily for me, our group brainstormed and with some leadership guidance we found a route we could take. If we just allowed for the CRUD commands to be associated with characters that didn't effect gameplay and were simply there to be names, it would totally work. On top of that, if we set enough specific input fields, we could get people to apply CRUD concepts to the responses too. The npc characters would also have a one-to-many relationship with the responses. I'll briefly go through the specifics and how we made this work.
Here we have an NPC class:
The important things to notice here are that the initialization of a new NPC instance will involve having a name, an ascii art, and an is_killer value. With this design, if I integrate the CRUD methods into the interactive CLI menu, players should be allowed to create a new NPC that won't necessarily interrupt the gameplay. We had the idea to randomly pick 3 NPCs whenever the game starts, and select one of them to turn their boolean is_killer value to true.
Together with the NPC class, we have a response class. The response class is initialized with a name, three response strings (each string will be a response to a question the player asks), and if the response is suspicious (the killer can only be assigned suspicious resonses, as you can see above). With this structure, the functionality of my game was held, and it was genuinely solid code. The final menu where players could interact with CRUD commands looked like so:
Things did work out in the end, and we got our project to a point where it wasn't only functional, but was pretty darn good. Miraculously, my creative vision was also held up until the end, surprisingly even better than I imagined at the start. That is not to say though, that what I did was fundamentally correct. Prioritizing my own goal over the goal of the project almost led us into a very bad situation, and next time I work on a project similar to this, I need to plan out exactly how it lines up with the deliverables from the start. Lucky for me, the project worked as both a success and a learning experience, and I'm happy that the thought occurred to me. If you made it this far, thank you for reading, and I hope you take my experience and learn something from it. Creativity and passion are very important and excellent motivational factors, but don't be blinded from ultimately doing what you have to do.