<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Andrew Crites on Medium]]></title>
        <description><![CDATA[Stories by Andrew Crites on Medium]]></description>
        <link>https://medium.com/@ExplosionPills?source=rss-bc97e3d61549------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*lI5V9BD7KA9es07Kp6B-vQ.png</url>
            <title>Stories by Andrew Crites on Medium</title>
            <link>https://medium.com/@ExplosionPills?source=rss-bc97e3d61549------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 16 Jun 2026 01:31:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ExplosionPills/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Andrew’s Top 100 Video Games of All Time]]></title>
            <link>https://medium.com/@ExplosionPills/andrews-top-100-video-games-of-all-time-7327739f7463?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/7327739f7463</guid>
            <category><![CDATA[videogames]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Mon, 02 Feb 2026 03:25:58 GMT</pubDate>
            <atom:updated>2026-03-07T22:13:55.221Z</atom:updated>
            <content:encoded><![CDATA[<p>As I reach my 40th year here on planet Earth, given that video games have been such an important part of my entire life, I thought a fun way to cap those first 40 years would be to force rank my top 100 video games of all time. Below is a list of my personal top 100 games, in order, from bottom to top.</p><p>Creating this ranking was challenging, time consuming, and took a lot of compromising, but this is the list that I came up with. Ranking of any media is going to be subjective, and this list is purely subjective. However, there are different measures of subjectivity. The quality of a video game may be subjective, but the personal impact the game had in your life or your story behind it is in another strata of subjectivity. This list largely leans into the latter: the games get their ranking because I <em>feel</em> they deserve that ranking, and I probably have some story behind it. What’s funny is that I think some of the games I’ve rated relatively high, at least compared to some others, I acknowledge are quite niche, but for me personally, they’ve earned their spot on the list.</p><p>In addition to the list itself, I have a lot of biographical things to share, and I have a lot to say about the history of video games. I was born in 1986, so I have been alive for a large portion of video game history. Of course, I can’t neglect the Atari and its predecessors, but I think things got really interesting after Nintendo survived the 1983 video game crash which ushered in a new age: a golden age of video gaming that, in a sense, we still live in today.</p><p>Overall, this was a very fun look back at my childhood and entire life. A lot of great memories with family and friends resurfaced for me when I revisited these games. I think that anyone’s list would be unique, but I can <em>guarantee</em> that my list is purely unique in a way that no one else’s will be based on personal experiences that I’ll get into. In fact, let’s start there.</p><h3>Andrew’s History With Video Games</h3><p>I’ve played video games practically all my life. I’m not sure how old I was, but I think I was probably 3 or maybe 4 when we were at the store getting our original Nintendo Entertainment System. I can still visualize it. I don’t know what store it was, but it was most likely the Fort Jackson Post Exchange in Columbia, South Carolina. My father was an Army Colonel who worked at the base.</p><p>The first game we ever owned, and the first game I ever played, was Super Mario Bros. More specifically, it was the Super Mario Bros. / Duck Hunt multicart that was packaged with the NES that also came with the NES Zapper light gun, which I understand is one of the best selling video games of all time, probably because of this bundle.</p><p>For a large portion of my life, I was only allowed to play video games on the weekend. I got one hour on Saturday and one hour on Sunday. I’m not actually sure how strict my parents were about this, but given how strict I felt they were in other aspects of my life, I have to assume I was on an average of 2 hours of video game time per week. This changed in my teenage years when I got to play more during the weekend, and I also played games on our family PC and Gameboy during the week. I got to emulate a lot during that time too, which was great. You younger folks may not appreciate it, but I didn’t really get to play any video games on weekdays in part because we only had the family TV. It wasn’t till I was a teenager that I got to play on the small TV in my parents’ bedroom while everyone else was watching the big TV in the living room.</p><p>Let me get into the history of consoles that I owned: the NES might have been the first. We also had a Commodore 64, and we owned a lot of DOS games. It’s not clear to me if we got that earlier or later. Back then, it wasn’t like it is now. We probably got the NES around 1990. The SNES was released in the US in August of 1991. That wasn’t crazy back then, where a console or game wouldn’t be outdated after a month. All that being said, yes, I was a bit behind the curve when it came to video games in my early childhood.</p><p>It’s also important to note that I never owned a SNES. I vividly remember playing in the backyard of our Columbia home when my mom had a talk with my sister and me: they were getting a Super NES for my older half brother and sister, who didn’t live with us. It’s impossible to say whether I’d be a different person if I had owned a SNES. I got to play many SNES games contemporaneously thanks to friends and those demo video game kiosks that they always used to have in department stores. Still, that lack of a SNES at home has had a huge impact on my video game tastes, and it will obviously impact the list. I don’t blame my parents. It’s not a big deal. They did what they thought was right at the time. Video games were an emerging idea of which they were mistrustful. I have no resentment for anyone in my family over this situation, but I need to point it out because of how it will impact the list.</p><p>Anyway, I remember when we got our Nintendo 64. I never had an allowance or anything, so my older sister and I agreed to work with our parents to try to earn it. I think I did three hours worth of yard-work (maybe it was way less… I was a on kid time), and my dad said I’d earned $10. I think the N64 was like $300, so I was pretty devastated. I’m not sure how I reacted, but I’m sure it wasn’t good. At that point, I must have been 10 or 11. In spite of everything, that summer, our parents gifted us the N64, Super Mario 64 included. I don’t think I’ve ever been so happy in my life. Yes, I was there for my daughter’s birth, but happiness is experienced very differently when you’re 10 versus when you’re 33. I remember lying down on my back, flailing my legs and screaming in pure felicity and excitement. If I’d done that at the hospital, I’d probably have been kicked out. Funnily enough, I did slip on some water someone had spilled in the hallway of the hospital and landed on my back the day my daughter was born, but I wasn’t happy about that. I have more to say about Super Mario 64, but I’ll do that when I get to it in the list, which it obviously made. In case it’s not clear, I’ll spoil some list entries incidentally throughout the article.</p><p>Some time later, my parents also got a PSX. Back then, it was just called the PlayStation. I don’t remember exactly when that happened. It wasn’t an early purchase, but it was before the PS2. I always found this surprising. They couldn’t spring for a SNES, but they got both the N64 <em>and</em> surprised us with a PlayStation. I’m not complaining. The first game we had was Crash Bandicoot: Warped (the third one), and they were playing it too. This was a fundamental shift in my family, where my parents started to have a bit of an appreciation for video games. While it’s sad to me that I missed out on the SNES, I’m glad I got in on the PlayStation era, because there are a lot of excellent seminal RPGs from that system. Many of them made the list. The PS2 followed, and what a time to be alive.</p><p>Meanwhile, we also played a lot of games on the PC throughout my childhood. This includes things like The Oregon Trail and Battle Chess from early on. There are a lot of DOS and Commodore 64 games we played that are now lost to time. There are plenty of PC games I’ll talk about in the list, not to mention internet games, flash games, and emulation in my teen years. I didn’t get to experience the SNES at its peak, but I ultimately got to play and even finish a lot of the games I’d missed out on. People assume that consoles ruled the day early on, but classical computer gaming was always there, and I think my list will reflect that. I owned a 1,001 2-CD collection of DOS and Windows games. I think it’s the Galaxy of Games one, but I’m not 100% certain. Most of those games sucked, but there were a lot of gems in there too.</p><p>Along with the PS2 came the GameCube. I honestly can’t remember which we got first, but we ended up with both. Yes, I did miss out on the SNES, (and the Sega consoles, which I care less about), but I have to say that I got all of the other major consoles in childhood, except for the XBox, which I wasn’t interested in. When I went off to college, my friend had a Wii, I got an XBox 360, and eventually I got a PS4. I also happened to get a Wii U once I was a working professional, for some reason. I’ve owned a Switch, and now, I have a Switch 2. It’s funny how concrete the early days seem while the later years seem to accelerate so much. Well, I always say that life is long in the short term and short in the long term.</p><h3>Notable Exclusions</h3><p>I feel the need to mention some games that did not make the list for reasons I can expand upon. I don’t want someone to go into the list expecting their favorite game to be at the top only to be struck with disappointment that it’s not there at all. These are games that are considered to be classics or among the greatest games of all time, but I’ve excluded them for one or more of the following reasons:</p><ol><li>They were on the SNES, so I played them later, so they are comparatively not as good in the series overall, or I subconsciously resent them.</li><li>I was too old for them when they came out</li><li>I don’t like the series</li><li>I don’t like the genre</li><li>It didn’t click with me</li><li>It’s bad, and everyone else is wrong</li></ol><p>I think it’s important to note that this is, in its own way, a list of honorable mentions. These are all games that I personally don’t like. However, these are all games that are considered good. In fact, I think or even know that they’re probably good, but I personally excluded them. If one of your favorite games is here, consider it an honor. If it were an unworthy game, it wouldn’t have been mentioned at all.</p><h4>Final Fantasy VII (7)</h4><p>This one deserves a specific mention because it’s so beloved. Don’t get me wrong… when I saw the trailer in 6th grade, I thought this was probably the greatest game of all time, but I didn’t own a PlayStation until much later. In fact, the first PSX RPG I played was the FF8 demo that was included with Brave Fencer Musashi, where you could play as Seifer and summon Leviathan for some reason.</p><p>As a probably dumb kid, I assumed that 8 had to be better than 7 because it was newer. I’ll reveal now that 8 made the list, even though 7 did not. I learned later on that 7 was beloved while 8 was reviled. I learned even later that 8 has been reappraised and is now also largely beloved, and I’m not alone in thinking that 8 is better than 7, and that 8 is considered by many to the best. The Final Fantasy series makes for great conversation, to say the least.</p><p>Anyway, much later, I played FF7 somewhat briefly, and I simply couldn’t get into it. I’m not quite sure why. The graphics are simplistic. It’s very early PSX. Obviously, graphics aren’t a limiting factor when it comes to games, and my list will reveal that, but FF7 just didn’t draw me in at all. It feels like sacrilege, but I just didn’t really enjoy my brief time with FF7. I haven’t played the remakes, and I have no interest in them.</p><h4>Final Fantasy VI (6)</h4><p>I have to call this one out specifically because I included FF7 as well. Why not take the time to make FF fans even angrier? I debate whether I should have mentioned this before of after 7. Regardless, my experience with FF6 is similar, though with a twist. I had friends who had this game, so I played it a bit when it came out, but I didn’t really know what was going on. I didn’t get to play it much, anyway.</p><p>I emulated it later, but as with FF7, I simply couldn’t get into it. It just didn’t draw me in, no thanks to Relm. Maybe part of it was having so many people recommend it and tell me that it was the greatest game / RPG of all time, and it just didn’t live up to expectations. I don’t really know. I just don’t really like the graphics, the characters, the story, or the mechanics. I think Kefka is kind of a lame villain, honestly. I don’t see why everyone loves him so much. Sephiroth is much cooler, and he’s from a game in my <em>Notable Exclusions</em>. Overall, I just don’t see why FF6 is so great and what makes it so different from or better than FF4 (or 5, or 1, or 2, or 3, for that matter).</p><h4>Various Popular SNES Games</h4><p>This includes, but is not limited to:</p><ul><li>The Donkey Kong Country series</li><li>Chrono Trigger</li><li>Secret of Mana</li><li>Super Metroid</li><li>The Legend of Zelda: A Link to the Past</li><li>The Mega Man X Series</li></ul><p>I’ve played and even beaten most of these games, but I played them much later in life. Chrono Trigger I will call out since I knew about it when it came out and talked with friends about it, and I’m pretty sure I remember the awesome TV commercials about it, assuming I didn’t just imagine them. I got to play it with the PSX remaster disc that included FF4, and getting to play both of those games was pretty awesome, but maybe I just missed out on Chrono Trigger at the right time.</p><p>I think the Donkey Kong Country series is just overrated. Maybe it was groundbreaking at the time, but it’s a generic, outdated platformer to me.</p><p>The other games all deserve respect in my eyes, but they’re in an awkward spot since I didn’t own a SNES. So, for example, I played Metroid, <em>then</em> Metroid Prime and Metroid Fusion, <em>then</em> Super Metroid — so Super Metroid seems much closer to Metroid than to Metroid Prime for me, so without the context of the time, it’s hard to see what the game did differently. It’s just a little bit of an evolution of Metroid. I could say the same for ALttP compared to the other Zelda games.</p><p>The Mega Man X series was cool, and I have memories of playing Mega Man X 3 in a kiosk at the PX where you got to play as Zero in the starting level. That was my favorite part, but apparently, Mega Man X 3 is one of the least popular ones. I’ll note that I did 100% Mega Man X as an adult. To be frank, if I had owned it around when it came out, it probably would have made the list, but this is the reality we live in: the one where I never owned a SNES. Okay, I’ll stop harping on that now.</p><h4>Fighting Games (2D &amp; 3D)</h4><p>I can’t ignore fighting games as a massive genre that simply didn’t make my list. I have memories of fighting games from the beginning: I played Street Fighter II and Mortal Kombat and its evolutions when they came out. I’ve played a ton of different fighting games throughout my life including the KoF series, BlazBlue, Guilty Gear, Killer Instinct, Primal Rage, and too many others to name. When it comes to 3D, I’ve played a lot of Soulcalibur II and III, some Tekken, Battle Arena Toshinden, and plenty of others.</p><p>I know I’m not alone in being a video game fan that doesn’t favor fighting games. It’s tough to explain why, but in a weird way, they almost don’t feel like video games to me. Obviously they are, but when I think of “video games,” I think fighting games get an asterisk. I wish I could explain why, but I just can’t. Anyway, they didn’t make my list, but I have played a lot of them, and they definitely deserve a mention.</p><h4>Sports Games</h4><p>Similar to fighting games, but I think this one is less contentious. To paraphrase the AVGN, sports games are as old as video games, and they’re not going away. I’ve played many sports games in my day, and I’ve had a lot of fun with plenty of them, but I don’t feel any of them deserve to be on the list. None of them have had any influence on me besides fun distraction.</p><p>I do have to mention a couple NES games including <em>Blades of Steel</em>, and <em>Nintendo World Cup</em>. I played both of these with my sister a lot when I was very little. I remember the announcer from <em>Blades of Steel</em> shouting “hit the pass,” although we always thought it was “be prepared,” or something. The soccer game free play music was very great and memorable.</p><p>I can see why sports games overall would have an impact on people, and they’re obviously very popular, but they didn’t make the list for me. At this point, I can’t remember the last time I even played a sports video game.</p><h4>GoldenEye 007</h4><p>I’m calling this game out specifically because of how beloved it is. Although it hasn’t aged well, especially given its controls, I’m not holding that against it. I never liked this game, even when it came out. More importantly, I didn’t really like the movie.</p><p>I’ve watched GoldenEye later in life, and I like it more now than I did when I saw it as a kid. My dad introduced me to the James Bond films, and I liked the older ones like Dr. No, although my memories of them are very faint. I didn’t like how he never uses his car in a cool way in GoldenEye. I thought <em>Die Another Day</em> with the ice fortress and <em>Tomorrow Never Dies </em>with the helicopter chase were better movies, but nobody agrees with me. I guess the tank segment in GoldenEye is pretty cool. Pierce Brosnan will always be James Bond to me.</p><p>Anyway, I’ve never been good at FPS games, including this one. I’ve played with friends who didn’t hold back and absolutely wrecked me in a way that I didn’t find fun, so I got little to no enjoyment out of this game in the limited time I played it.</p><h4>The Guitar Hero &amp; Rock Band Series</h4><p>This is important to acknowledge since there are some rhythm games that made the list. The thing is: I don’t really like rock music. I never appreciated classic rock or any of the songs from these series. Yes, I weirdly prefer cheesy J-pop, K-pop, and techno to rock music.</p><p>I did play these quite a bit with friends in college. Funnily enough, playing the games helped me appreciate classic rock a lot more, and I learned a lot of songs that I like from the rock genres just from playing these games. As I’ve grown older, my musical tastes honestly haven’t changed that much — I still like a lot of the same cheesy stuff (and music that I think is objectively good), but I have an appreciation for all genres of music including classic rock, and my breadth of music appreciation is much broader. I can’t deny the influence of these game series on that. But as games, they didn’t make the list for me.</p><h4>The Castlevania Series</h4><p>I don’t know what it is, but I’ve just never liked the Castlevania series. I didn’t play it when I was younger, although I remember this old guide book that had lots of tips and tricks for a bunch of different NES games including <em>Castlevania II: Simon’s Quest. </em>At the time, I didn’t know what it was.</p><p>I would read it for fun on weekdays since those were days I wasn’t allowed to play video games. Moreover, we just didn’t have access to many games back then, and there was no Internet. Does anyone else remember Nintendo Power? Especially the Super Mario Bros. 3 guide edition? I think I memorized that thing from cover to cover.</p><p>I actually haven’t played the Castlevania games much. They do seem kind of cool, but I just don’t like them. I don’t really like the gothic horror themes. I don’t like the characters, or story, or action. I don’t think <em>Symphony of the Night</em> is interesting. Castlevania II seems like a cool RPG departure, and Castlevania III seems cool with is QoL improvements and a broader collection of characters. It’s a bit sad since the series is so beloved and does seem cool including the spiritual sequels like the Bloodstained series. It’s one of the few video games that has its own TV series.</p><p>I also resent the fact that “Metroidvania” has become the name for a popular genre. I think “Metroidlike” would have been fine since it’s really the original Metroid that defined this idea of item-discovery-based progression. Castlevania didn’t add anything to it, except maybe some RPG elements that aren’t always needed or used. My understanding is that it’s the Symphony of the Night series (and maybe Simon’s Quest?) that’s adding to the “vania” part, and granted, I haven’t had much exposure to those games, but does it really add anything more interesting to the idea than what Metroid did? I think the Castlevania fans are just piggybacking. Whelp, none of your games made my list.</p><h4>Later Generation Games</h4><p>This includes Minecraft, Five Nights and Freddie’s, and, to a lesser extent, Fortnite, but there are many others. These are games that I’m very aware of but have either not played or have only played under duress from a child. I’m not castigating the games, and I think at least some of them are of excellent quality. In fact, if I were born about 5 years later, it’s possible Minecraft would be #1 on this whole list. Sadly for the games, or probably moreso for me, I was a little too old for them. I missed the boat. Or they missed the boat. Whichever’s funnier. I have to mention them because everyone knows about them, but to be blunt about it, I’m too old for them to make my list.</p><h3>The Honorable Mention Suites</h3><p>I have a few categories of honorable mentions. These are video games that I think could have been worthy of making the list, but that I felt needed to be excluded for some criteria. Chiefly, I thought that including them would have made the list less interesting. That said, I cannot deny their existence and the impact on my life, so I will mention them here, honorably, of course.</p><h4>Honorable Mentions Suite A) Magic: The Gathering Arena, chess.com, &amp; Mahjong Soul</h4><p>I have probably played these three for more hours collectively than all of the other games mentioned in this article combined, so there’s no way I could ignore them. Of course, these are virtualizations of an experience rather than first class video games in their own right, so it didn’t feel correct to include them on the list… especially since they would probably consume the top three slots and be very uninteresting.</p><p>I’ve played MTG, chess, and Mahjong on and off throughout my entire life, and I am even fortunate enough to play these live or over the board today from time to time, so the “games” are more about the underlying game themselves rather than the video game experience. That’s not to detract from MTGA, chess.com, or Mahjong Soul, which are all excellent products. It’s a wonder of the modern world that I can play any of these games that I love at any time, in any place, on any device, with anyone in the world.</p><p>Still, it doesn’t feel right to include them in my list of top 100 video games. I won’t argue that these are not video games. They clearly are. However, I think they deserve to be analyzed in their own pantheon of games, and I think that doing so here would severely detract from what I have to say about video games in the classical sense. Still, I couldn’t ignore them entirely, so I have to give them this honorable mention.</p><h4>Honorable Mentions Suite B) Digital Card Games, Board Games, and Pinball</h4><p>This is piggybacking a bit on suite A in that these games are virtualizations of real-life experiences, so I’m excluding them from the list for the same reason. There are also way too many of these games to count, and I probably don’t even remember all or most of them. I think anyone my age probably remembers Windows Solitaire and Hearts, but there were also the old Hoyle games that included Old Maid, and many more. There were also lots of awesome pinball simulators on PCs and consoles that I spent hours playing.</p><p>One (or two, I suppose) doubly honorable mention goes out to Hoyle Card Games 2000 and Hoyle Board Games 2000. I haven’t seen much information on these, nor have I found a way to emulate them, but they were incredible collections of lots of different popular card and board games with really good AI, fun characters, great settings and music, and endless entertainment. I’ve looked into playing them again, but I haven’t found a way to do so other than downloading a virus. I didn’t know what I was missing back when I kept losing to the AI as a young teen. They really don’t make games like this anymore, and it’s a shame.</p><h4>Honorable Mentions Suite C) Graphing Calculator Games, Old Mobile Phone Games, etc.</h4><p>These games are tough to place. This includes Arkanoid / Breakout, Snake, Galaxian, etc. Playing on your TI-83, TI-89+, or old Nokia cell phone in the parking lot before school was a unique experience that I don’t think any other generation could share. Or maybe they still do.</p><p>Of course, indie games are as old as video games, but there was something that felt special about sharing games using the calculator link cable or whatever. I even programmed a few here and there… mostly RPGs in TI-BASIC where I ran out of memory really quickly, but it certainly helped ignite my passion for software and creativity. There was a Mario game, a drug dealing simulator game (imagine if our parents knew about that one), and many more.</p><p>I have to give a particular shoutout to my favorite sidescrolling shmup of all time — a game whose name I can’t remember and that I can’t find that was on my old Nokia brick phone. I don’t see that kind of passion put into games that are shipped with devices nowadays, but it was awesome. Gradius, eat your heart out.</p><h4>Honorable Mentions Suite D) Flash Games</h4><p>This includes a large swath of games that are difficult to place. Now that Flash is no longer supported practically anywhere, many of these games have been lost to time, along with their animation siblings. This includes a lot of PopCap games that you can no longer play. My personal favorite was always Rocket Mania. I also enjoyed Digby’s Donuts, Alchemy, and Feeding Frenzy, but there were a lot of others. I liked playing Bridge on Yahoo Games as well. Bejeweled, Zuma, and Cubis were very popular and memorable. I’m sure I’m leaving some beloved ones out, but again, there are too many to talk about.</p><p>Sadly, many of these games simply haven’t survived the shift in technology, which is a shame since I think a lot of them are frankly better than the slop I see available today. Maybe it’s nostalgia talking, but I’d much rather have Rocket Mania on my phone than another zombie killing simulator gacha. I’m sure I’m not alone. It’s tough to place any of these games in the list since they are mostly meant to be pick-up-and-play distractions rather than dedicated video games in the classical sense, but I have to mention them and their impact on my life and tastes.</p><h3>Games That Didn’t Make The List</h3><p>This is a list of games that I considered putting on the list, but after force ranking, they simply didn’t make it. I could probably say a lot about each of these games, but for the sake of respect for the list, I’ll simply enumerate them and move on. This is not exhaustive, and there were a lot of other games that I thought of, but the games that made it here were at least in contention for the top 100. I didn’t strongly consider the order here, so the 101st game listed wasn’t necessarily the closest to making the list, but for the sake of expediency, let’s move on. Consider these honorable mentions in their own right:</p><p>143. Various popular series titles (FF, Mario, Metroid, etc., etc., etc.)<br>142. Various educational games (Carmen San Diego, The Learning Company Games, etc., etc., etc.)<br>141. Roller Coaster Tycoon 2<br>140. Rad Racer II<br>139. Baba Is You<br>138. Commander Keen (series)<br>137. Duke Nukem<br>136. Secret Agent Sam<br>135. Breath of Fire I, II, and III<br>134. Under a Killing Moon<br>133. Deus X<br>132. Lost Odyssey<br>131. The Tales Series<br>130. Paperboy<br>129. Dynasty Warriors (series)<br>128. Avoid the Noid<br>127. North &amp; South<br>126. Vectorman<br>125. Comix Zone<br>124. Drakengard<br>123. Crazy Taxi<br>122. Crypt of the Necrodancer<br>121. Sweet Home<br>120. Heavy Shreddin’<br>119. Marble Madness<br>118. Joust<br>117. Rodland<br>116. Wild Arms (Series)<br>115. Time Crisis II<br>114. House of the Dead II<br>113. Duck Hunt<br>112. Aladdin &amp; The Lion King (SNES / Genesis, stand-in for most games based on popular media)<br>111. Frogger<br>110. Sunset Riders<br>109. Bandit Kings of Ancient China<br>108. Fire Emblem (Series)<br>107. Resident Evil (Series, especially 4)<br>106. Bust a Move / Puzzle Bobble<br>105. Brave Fencer Musashi<br>104. Sonic the Hedgehog (Series)<br>103. Wrecking Crew<br>102. Donkey Kong (Series)<br>101. Angry Birds</p><h3>Andrew’s Top 100 Games, Ranked</h3><p>Now, onto the list. This list crosses platforms and genres. I crafted this list with careful consideration, and I reserve the right to change this order in the future — in the months it took me to put this together, I kept randomly remembering games that should’ve been on the list — , but as of my 40th year on this earth in 2026, this is <em>the list</em>.</p><blockquote>Brief note: nobody has played every video game. That’s impossible. If I missed a game or series in this article or my list, it’s probably because I haven’t played it. It’s possible I haven’t even heard of it. This will focus on games that I’ve played at least enough to have an opinion on.</blockquote><p>I have played all of these games extensively. I have beaten (if possible) most of them, though there are a few on the list that I didn’t actually finish. They were still impactful enough that I had to include them. Now, for your edification and delight:</p><h4>100. Fall Guys</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/0*-A2wt2f5rmz2K_9H" /></figure><p>Why not start off the list with a game I started playing recently, with my friends Mike and Mike? (Shout-out to [Our Hero De Niro](<a href="https://sites.libsyn.com/561970">https://sites.libsyn.com/561970</a>)). This game makes the list chiefly because it speaks to one of the best things about video games: playing with friends.</p><p>Many of the games on my list were enjoyed with friends and my sister — even some of the single player games, played side-by-side in the same living room or bedroom. Fall Guys is a game made for babies, but it’s the closest to capturing the fun of simple, low-stakes competitive gaming with a team of friends.</p><h4>99. Pac-Man (&amp; Pac-Mania)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*Bqtbmftrq8nBeH-c" /></figure><p>This is the first entry on my list that encompasses more than one game, which might feel like cheating a bit, but it’s my list, so I can do what I want. The original Pac-Man gets a nod as a representative of arcade games in general, especially older arcade games. I’ve definitely played my share of Pac-Man, although I don’t know exactly when, and I don’t have any specific memories about it.</p><p>Pac-Mania is probably not a very well-known or well-loved game, but it was in my collection of NES games as a kid, and I played it a lot. It’s a 3D Isometric Pac-Man where Pac-Man (and some of the ghosts) can actually jump. Believe it or not, you can beat it, and I did so as a kid. That’s definitely not true for all of the NES games that I owned.</p><h4>98. Mirror’s Edge</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*_LRyIQUjZjT2dZ1setGfIQ.jpeg" /></figure><p>This is a pretty begrudging entry for me because I kind of hate this game, but it’s not entirely the game’s fault. I played this with my friend Alfred, and he wanted to get all of the achievements in the game, so I had to play through it with him without using any weapons and on hard mode. This makes the game a lot less enjoyable, at least for a first playthrough.</p><p>To the game’s credit, I do see it as unique and groundbreaking. I doubt it started the whole idea of brightly coloring things to show stupid gamers the way, but hard-mode — the real way to play — actually turns that feature off. I appreciate a game with scaling challenge.</p><h4>97. Spyro the Dragon</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/326/0*dT2qJcfuNzc2kvbJ" /></figure><p>This isn’t a stand-in for the series. This is the first game, which is the only one I’ve actually played. I also beat it and 100%ed it. Spyro is one of many goofy wide-eyed video game mascots with attitude from the 90’s. A few of them, like Crash, worked and are remembered. Many died off. Spyro hasn’t had the longevity of the beloved Sonic, but I love the unique UI and gameplay of this game that we got throughout the PS1 era. That sort of thing just doesn’t really seem to exist anymore.</p><h4>96. Dragon Warrior</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/186/1*Jrz9mggGmBr1Ysx0pRFCPQ.jpeg" /><figcaption>Fortune smiles upon thee, Aija. Thou hast found the Magic Key.</figcaption></figure><p>This is a bit of a stand-in for the series, although the entry proper is the original Dragon Warrior / Dragon Quest. I’m not the biggest fan of this series. I’ve just never really loved the style, combat, inventory systems, and so on. However, as one of the OG JRPG’s, I have to toss it some respect. Clearly there is something I’m missing as this series has a lot of entries, is still going on, and people are buying the remakes. I know it’s absolutely beloved in Japan. I don’t think they actually make it a public holiday when they release a new entry in the series, but the games deserve some respect if they can spawn a believable urban legend like that.</p><p>I like the first one specifically because of its simplicity. This is a Nintendo-hard sort of RPG where a lot of its difficulty is in obscurity and beginners’ traps. You don’t have to love it, but that was all experimental back then. There’s just something uniquely enjoyable about a game where you actually have to use DOORS and STAIRS commands. Reminds me of an old DOS game.</p><h4>95. PaRappa the Rapper</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*8sXVvusSpbH6Vrq8rFaM4Q.jpeg" /><figcaption>Kick, punch, it’s all in the mind…</figcaption></figure><blockquote>You gotta believe!</blockquote><p>PaRappa the Rapper makes this list chiefly because it’s the first (true) rhythm game, which is one of my favorite genres of games. I never owned this one, nor did I play it a lot, but I did play it in some kiosk as a youngster. It was probably in a Blockbuster. Anyone else have great memories of a weekly trip to Blockbuster to rent a game or two for the weekend?</p><p>I could never beat (get it) the first level. I would always lose when the onion karate guy started making you do three inputs in a row, especially with the combination of trigger buttons and game pad buttons. This game is unique for its mechanics and art style, and even though I never played it much, I find it popping up in my mind quite often. A brief shout-out to Gitaroo Man also.</p><h4>94. Teenage Mutant Ninja Turtles</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*Tqkprfz8O7rx-2nYVc37Pg.jpeg" /><figcaption>You have my support</figcaption></figure><p>All NES kids have to show this game some respect. I actually <em>did</em> eventually beat the dam level as a kid, although I never got past level 3. I think I couldn’t figure out where to go or actually make the difficult jump in the sewer, but I don’t know. Since I could only play an hour at a time on the weekend, I was limited in how far I could get. Apparently the rest of the game is actually much harder. This is another one of many NES entries that I find are hard to believe were designed for kids.</p><p>This game was in a collection of NES games that I owned that my mom gave away for some reason. I think that she said I didn’t play it anymore, but it’s also possible that they didn’t approve of TMNT in general since I wasn’t allowed to watch the show. I’ll never know how far I actually could have gotten.</p><p>This game is fun because of the franchise, story (inasmuch as there is one), and the fact that it’s comedically unbalanced. I think everyone figured out the strategy of saving Donatello’s HP and letting Raphael tank the seaweed.</p><h4>93. Ghosts &amp; Goblins, Ghouls &amp; Ghosts</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*6IR7BMLTjwmOIgWrNE3bbQ.jpeg" /></figure><p>Ghouls and Ghosts is the better game, but I have to show some respect for the OG as well. I played these games on and off throughout my life, and there was a multi-board arcade cabinet in the Reitz Union at the University of Florida that actually had both of these games. I’m not sure how many quarters I spent on them, but I never beat either one. I think I got past the third level of Ghosts &amp; Goblins maybe once. As much as I love video games, I’m not the most skilled player ever.</p><p>I don’t know what it is about these games that they can’t leave our collective memory. They’re abusively challenging and incredibly cheesy. They’re also just tons of fun. Get the knife. Get the knife. Get the knife.</p><h4>92. Grandia</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7IgiRu6dpdXdKk-H.jpg" /><figcaption>Hundred million degrees, take that!</figcaption></figure><p>The second JRPG to make the list. Grandia’s not my favorite game or RPG ever, obviously, but there is something really charming and special about it. I love the gameplay mechanics and the characters. I think some quality of life elements like the lack of any kind of dungeon map make the game a lot less accessible in modern times, but apparently it has an HD remaster.</p><p>The PS1 had so many great RPGs, and this is definitely not the last one to make the list. I think Grandia 2 for the PS2 is a higher quality game with better QoL, but I love the charm of the first one too much. It also gets points since I finished the first, but not the second.</p><h4>91. Absolum</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*n-fee3573MsWUitq2srOuA.jpeg" /></figure><p>This is the newest game to make the list, and it just came out last year, so mad respect. This is a fun beat ‘em up in a classic style with modern sensibilities, including roguelike elements that every game apparently has to have now. I haven’t quite beaten it yet, but I’m optimistic that there’s at least one new game a year that’s worthy of enough of my attention. If you’re a gamer, you might want to check it out!</p><h4>90. Chrono Cross</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*SCoIO6jxkH2VkkLxCPIjDQ.jpeg" /></figure><p>Yes, yes, Chrono Cross made the list while Chrono Trigger didn’t. Put the pitchforks down. I think I rented this game alongside Final Fantasy Tactics around the time it first came out. I definitely beat it, so I probably ended up owning it at some point, but I don’t really remember. I think this is an apropos moment to talk about memory cards and what a game changer they were for game rentals. I had saves of many games that I used across rentals, and Chrono Cross was definitely one of those. Before memory cards, you had to hope to get lucky and get the right cartridge that you had rented before… and you couldn’t even do that for CD’s! We don’t really need them now, but shoutout to gaming memory cards!</p><p>I’m not the biggest fan of the art style, and while I do really like some of the innovative combat system, I find other elements to be clunky. I also never really got the story, quite frankly — but I was a dumb teenager anyway, so that applies to a lot of the list, I guess.</p><p>Even so, I think Chrono Cross is a highly unique game that I have mostly fond memories of. It also gets some bonus points for being the only game, that I know of, to introduce the best feature ever: The ability to fast forward in New Game+. This game probably has the best New Game+ of any RPG I’ve played that has one, so I at least have to respect it for that.</p><h4>89. Metroid Fusion</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/275/1*ZbZQBgb_m0yDCJo263tDGg.jpeg" /></figure><p>I don’t remember exactly when I played Metroid Fusion, but I had quite a few Gameboy Advance games including this one. I really enjoyed the unique mechanics and gameplay of Metroid Fusion, and the SA-X that you had to avoid was a legitimately scary threat that created tense moments. I also really like the lore of the game; the fact that Samus is fused with Metroid DNA and can no longer use the Ice Beam, and the fact that metroids, a legitimate threat in their own right, are the only creatures that can counter the new threat of the X parasites.</p><p>I think it’s probably pretty underrated as a Metroid game, so if you’re a big fan of the series, you might consider checking it out. It’s a great sequel to Super Metroid and partner to Metroid Prime.</p><h4>88. Pipe Dream</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u3LN3sphmKWLHyuJ-wDH2Q.png" /></figure><p>This is the NES port of a puzzle game called Pipe Mania, and it’s sort of a spiritual predecessor to the game Rocket Mania I mentioned earlier. I think this game is probably pretty obscure, and not particularly beloved, but it gets points for a few reasons:</p><ol><li>My sister and I played it as kids, so, memories.</li><li>It was my first published TAS: <a href="https://www.youtube.com/watch?v=m1kooRmOvlo">https://www.youtube.com/watch?v=m1kooRmOvlo</a></li><li>It’s got amazing music. Sadly, my sister always picked Music 1, the worst one, and never let me pick Music 3, which is the best, but 2026 Andrew acknowledges that all of the songs are good.</li></ol><p>Sadly my TAS has since been obsoleted, although the new runner did give me a shoutout. This is another game along with TMNT that our mom gave away because we didn’t play it enough, or something.</p><h4>87. Wolfenstein 3D</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/284/1*BgW5tkLyS_wDVvaDkptxXQ.jpeg" /><figcaption>Shift+Alt+Backspace: Debugging keys are now available</figcaption></figure><p>I’m not the biggest fan of FPS games, but this is one of the seminal FPS “gun” games, and I played it around the time it came out. I have a lot of memories surrounding this game because the IT guy my dad worked with got it for him to install on our PC for me to play. There was a lot of anticipation leading up to that including my reading of the printed out manual. There was also a pretty cool sound chip that had realistic sounds including the dogs yelping, which baby Andrew didn’t really like. Yes, this is one of the probably very few video games where you can actually shoot dogs, although they’re Nazi dogs.</p><p>Doom didn’t make the list even though I did play it too, but I never owned it like Wolfenstein. Thinking about how my dad let me play this game around when it came out is pretty crazy to me considering that I wasn’t allowed to watch TMNT or Power Rangers. To be honest, I didn’t play very much without all of the cheats enabled. Anyone remember the Pac-Man level?</p><h4>86. Myst</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/287/1*3V-tK89aIvh1O3Cg8t13SQ.jpeg" /><figcaption>Who the devil are you?</figcaption></figure><p>This game gets a lot of points for a couple of reasons: it’s one of the few games my dad actually loved, and we played together and finished it, and it’s very unique. It wasn’t the first point and click adventure game, but they don’t really make games like this anymore. In fact, they didn’t really make a game like it for a long period after the fact, unless you count the sequels.</p><p>Eventually, I learned how to get through the game, although the gorilla head in one of the brothers’ rooms always scared me, so I didn’t really like that part. Or maybe I made my sister do it or something.</p><h4>85. The Bugs Bunny Birthday Blowout</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/248/1*UQAWVl1aCACTkz8GI8K3Og.png" /></figure><blockquote>What’s up, Doc?</blockquote><p>I always thought the name of this game was “Bugs Bunny’s Birthday Blowout.” It was only when making this list that I figured out the actual title, even though it’s written on the box. What a strange title. Anyway, I was a huge Looney Tunes (yes, that’s how it’s spelled) fan as a kid.</p><p>AVGN made a video about this game, and I think he exaggerates its ostensibly negative qualities, as is his way, but I think this is a great NES game. It was a lot of fun, and not overly challenging either — you have 12 HP, and a ton of i-frames, after all. Young Andrew was eventually able to beat it even with all of my video game playing restrictions at that age.</p><p>This game probably just wasn’t that well known, but it surprises me that it’s not more beloved. It’s got great music, fun and unique mechanics, good references to the show, pretty cool level design with secrets to discover, and awesome minigames including the one where you can win 50 extra lives. Screw Elmer Fudd. He was the worst boss. Nimrod. Well, maybe Pepé Le Pew was worse.</p><h4>84. Saboten Bombers</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*-yreSDuSOMV2p-pOmU641A.jpeg" /></figure><p>This is a very strange, probably obscure Japanese arcade game that was included in the Reitz Union multi-board arcade cabinet I mentioned that included Ghosts &amp; Goblins, Ghouls and Ghosts, Rodland, etc. I think I got pretty good at this game, although I never got super far since it cost a lot of quarters otherwise.</p><p>It’s a unique puzzle sort of game in the vein of Bubble Bobble where you’re a cactus (is “saboten” Japanese for cactus or something?) throwing bombs at enemies. It’s a lot of fun, so if you’re a gamer who ever has the opportunity to check it out, you should give it a try. It makes the list in part because I considered myself one of the top American players of the game, although I’ve never heard of anyone else even being vaguely aware of this game’s existence in the US, so who really knows.</p><h4>83. Final Fantasy Mystic Quest</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*Y82RKmpID3J89Jkk.jpg" /></figure><p>I picked this picture because this hilarious SNES box art has nothing to do with the game — the player character sprite never actually wears a helmet. This game is reviled among Final Fantasy fans, and while it is the first FF to make my list, it’s nowhere near the top one.</p><p>Even so, the common complaints I hear about the game’s simplicity are aspects that I actually appreciate. Quality of life features such as the auto upgrading of equipment and replacement of random battles with overworld sprites that have often been critiqued as simplistic or unnecessarily dumbed down are now pretty much standard game elements for modern RPGs. FFMQ has one big feature that is better than most other FF games: damaged enemy sprites. I don’t know why this creative and lovely feature was so broadly ignored in the genre, even today.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/168/1*EzcVPwSp1HYF7mhRNyem3g.png" /></figure><p>I think some of the negativity towards this game stems from resentment that we were given this easy-mode RPG from Japan instead of Final Fantasy V. It is definitely much easier and simpler, and it doesn’t have much of a story, but it has great music and charm, and I think it’s a fun experience overall. As for it being too easy… it does have what is probably the hardest JRPG battle in history, in point of fact, the very <em>first</em> battle against the Behemoth. Talk about a beginner’s trap.</p><h4>82. Oregon Trail</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*hsZ7FQGZxefkZKOcIN2U3A.jpeg" /></figure><p>As a millenial, I can’t ignore this game, although I was never able to beat it as a kid — even as the banker. I think I got to the last part where you had to ford the river, and I was never able to do it. I remember trying to play this game on a new computer with a different clock speed, and the hunting scenarios were too fast for humans. Game development for computers was a bit different back then.</p><h4>81. The Simpsons</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tzgKQvNaBE24TURxeeZQtA.png" /></figure><p>It’s interesting that this game never received any kind of home port, so I’ve only ever played it in arcades. I manage to find this once every few years, and I’ll always play it, getting a little bit further every time, although I’ve never beaten it. It has that brutal, quarter grabbing arcade beat ’em up difficulty.</p><p>I played it before I was ever allowed to watch <em>The Simpsons</em>, although as a superfan of the show now, I have a new appreciation for the game. I think I was 16 when my sister was visiting from college, and we watched the first episode I saw of the show together, “Faith Off.” At that point, I guess I was old enough for my parents to allow me to watch the forbidden show.</p><p>At any rate, this article isn’t about shows, so I guess I’ll move on.</p><h4>80. Sid Meier’s Civilization III</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*cj-S0UJo8MX3nDZw.png" /><figcaption>Play Civ III. Play The World!</figcaption></figure><p>The Civilization series seems like a series that I would always really like, but I’ve only ever actually played the third one. I don’t think that it’s particularly beloved compared to the first one, or the fifth one. I’ve never really heard anyone talk about it, but I think it was the first one you could play online, so that was pretty cool.</p><p>I can’t remember if I actually managed to finish a campaign. Maybe once. This was one among many RTS or RTS-like games that I played with my friend, Bobby. I don’t have a lot to say about this game, except that it’s worthy of its spot on the list, and I have some good memories surrounding it.</p><h4>79. Wii Sports, Wii Games, Wii Sports Resort</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/304/1*m6IZxI9pgf6Padppry2Qhg.jpeg" /></figure><p>I think Wii Sports is probably the real entry for the list, but the others are so similar and related, it makes sense to include them together. Nintendo really nailed it with this one: the fusion of a video game, cute characters, real mobility, and the social aspects of playing these games with family and friends. These are the only games that I still play with both my parents and my daughter, even today.</p><h4>78. Luigi’s Mansion</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*1e3TFqTMWKCijCtI" /><figcaption>Mario!</figcaption></figure><p>I’m not exactly sure what makes Luigi’s Mansion so popular, but it’s spawned multiple sequels. The OG for the GameCube has earned its spot for me, due at least in part to the fact that Luigi is my favorite Mario franchise character: just like me, he’s a younger brother who loves green.</p><p>It’s a very quirky and unique game with just a tinge of scariness made for the perfect Christmas morning gift. I could never get my friends into this game, partly because you can’t jump.</p><p>I might be wrong about this, but I think it’s the only game where Luigi cries tears of joy after being reunited with his brother, which is a moment of real human emotion that’s pretty rare for the Mario franchise. Another game that I 100%ed. The series gets a bit of a boost since my daughter loves watching me play Luigi’s Mansion 3, but I don’t think you can outdo the first one.</p><h4>77. Gauntlet Legends</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*s-03i5g_H49ia0Bc" /></figure><p>I’ve always called this Gauntlet 64 even though that’s not its actual name, and I’ve played it both on the N64 with a friend and in arcades. I think this is the best representation of the Gauntlet series, even though it has a lot of N64-like quirks. I feel that I’m also weirdly good at this game — not amazing, but I can usually get pretty far on a single credit. I’ve only ever played as the wizard, though. Killing large swathes of enemies will always be fun gameplay.</p><h4>76. Ikaruga</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*uVZvdYOp2SvGWO6g.jpg" /><figcaption>Energy Max!</figcaption></figure><p>Speaking of killing large swathes of enemies…</p><p>Apparently, Ikaruga means spotted dove in Japanese, which I think is kind of cool. I think many would agree that this is a top tier shmup, and while by no means is it the most challenging game in the genre, I’ve only managed to beat it once, and that was on normal mode.</p><h4>75. Final Fantasy IV</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/233/0*YWsRXJFvGkmPUKO6" /><figcaption>A true paladin will sheathe his sword</figcaption></figure><p>Yes, FFIV is better than FFVI. It’s older and a bit simpler, but as you can tell from my list, I don’t always see that as a downside. I first played this on the Playstation as part of Final Fantasy Chronicles (which also included Chrono Trigger). I like the story and the characters, the music, Cecil’s arc, and the weird plotline where it turns out that the main villain is your brother and you’re from the moon. Okay…</p><p>It was also kind of funny to me, though also emotional that so many party members die, sort of like in <em>The Mummy</em>, although I guess some of them actually survive if you go out of your way. Anyway, this is by no means the best FF, and I have to wonder how many people consider it their favorite, but I think it’s a great, worthy game to round out the bottom quarter.</p><p>Apparently, my friend Jeff used to grind this game for Pink Tails from the Flan Princesses, which had like a 1/64 chance to drop until he got pink armor for his whole party. Dedication.</p><h4>74. Initial D Arcade Stage</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*J4EibgXJfVCpq5Ll_2MJIA.jpeg" /></figure><blockquote>Running in the 90&#39;s!</blockquote><p>This arcade cabinet was also in Reitz Union, and I got convinced to try it out by a few other people I met there, including my friend Mark. I think that most people probably aren’t really aware of this game’s existence, but it’s a highly sophisticated arcade racing game with semi-realistic controls. I’m not much of a car or racing guy, and I never got to a very high level with this game, but it’s clear that it was made with love. It gave you a card that you could keep with you and put into the game slot each time to track your lifetime progress and keep the car you’ve selected and upgraded. Pretty cool, right?</p><h4>73. Ogre Battle 64: Person of Lordly Caliber</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/0*7QoOFnyX2RRzSOO1" /></figure><p>This game gets some bonus points for me in part because I find its name unique and kind of hilarious. It’s not the only such title in the Ogre series, as there is also Ogre Battle: March of the Black Queen and Tactics Ogre: Let Us Cling Together. Apparently, they’re named after Queen songs.</p><p>This game also gets a lot of points because I really like the main character, Magnus, I like the unique gameplay and the idea of requiring specific equipment for class change, its overall look and feel, and the fact that it’s one of the few RPG-like games on the N64. I didn’t play this game much… I think I rented it only one time, maybe twice, but clearly it left some kind of an impact on me. I remember my dad, with his military experience, giving me strategic tips for one of the battles too, so that was fun.</p><p>My understanding is that March of the Black Queen is supposed to be something like the fourth entry in the series, Star Wars style, and Person of Lordly Caliber is the seventh, but it’s the last Ogre Battle game. It seems highly unlikely that the series will ever be completed, which is too bad because of the lore of the Ogre Battle universe seems really cool.</p><h4>72. The Legend of Zelda: The Wind Waker</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/220/1*CVuatoyhS-8Ks5kbTixRmw.jpeg" /></figure><p>The first Zelda game to make the list. This was coming off of the tails of Ocarina of Time, and those were big shoes to fill. The whole sailing thing was a tough pill to swallow, but we all went through it at the time. Not like with the remake where you can get that really fast sail. Same with moving from playing an instrument to using a conductor’s baton. Strange choices, but they grew on me, and they ultimately worked. Same with the animation style.</p><p>I will say this has some of my favorite Zelda series combat, and the final battle against Ganondorf is awesome. It’s probably not going to be at the top of most gamers’ lists, but I find it a surprisingly worthy contender.</p><h4>71. Final Fantasy XII</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*1um94kZOObjirutC4m1hxg.jpeg" /><figcaption>Heads Up!</figcaption></figure><p>I think FF12 is probably quite underrated, and people maligned it for stupid reasons like the license system, which while oddly named, was actually a great mechanic. This was the programmer’s Final Fantasy, thanks to the unique gambit system. I have to say that I didn’t love the shift in Final Fantasy from turn based or even ATB over to real time combat, but I at least think it’s pretty well done in FF12.</p><p>I have a few memories related to this game, like arguing on the GameFAQs forum about who is the main character/protagonist, and pointing out that Ashe is the main character while Vaan is the protagonist, similar to <em>The Great Gatsby</em> where Jay Gatsby is the main character, and Nick Carraway is the protagonist, or we had that debate in high school English class anyway. At least I had quite a handful of people agree with me.</p><p>A better story is the fact that I played this with my college friends, Alfred and Jeff. Jeff was my roommate, and being the poor college students we were at the time, we didn’t have a memory card (youngsters, refer to the <em>Chrono Cross</em> section) for some reason, so we just kept the game on for however many hours straight. When we got to the Necrohol of Nabudis to get the Zodiac Spear, we encountered a powerful rare mob, the Helvinek (pictured). It almost wiped out our party, but with one character still alive, we managed to zone to the next room, and mobs can’t follow you between rooms… or so we thought, as in the next room, we were attacked by a Helvinek, which we realized had spawned separately. In spite of this bad luck, we managed to kill one of them, zoning back and forth constantly and using all our healing items. Immediately afterwards, we ran out and bought the memory card.</p><h4>70. Plants vs. Zombies</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*KZfM3dFaVHUCFEzJCWtzBQ.jpeg" /></figure><p>A bit of a stand-in for tower defense games in general, but this one stands above the rest. A really fun and unique game with interesting resource management, and a lot of charm. I can’t say much more about Plants vs. Zombies that hasn’t already been said.</p><h4>69. LittleBigPlanet</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/277/0*yoI6CER4YD9Lk-op" /></figure><p>I played through this entire game with my friend in college, Alfred, and we even designed a couple of levels together including one modeled after Shadow of the Colossus. My sackboy was Mr. Peanut. Another unique and very charming game that leans more into its aesthetic, as mechanically it’s just a simple platformer. It’s got great music too, and I have great memories associated with it overall.</p><h4>68. RPG Maker</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*yGsKIC-VPO0tgqPCjwP6lw.jpeg" /></figure><p>I think you can contend that this isn’t a valid entry for the list, but I certainly treated it like a game when I was playing around with it and downloading community games for a big chunk of my high school free time. This is the OG RPG Maker, not RPG Maker 2003, which uses first person combat for some reason, and is therefore inferior. I got pretty far in designing a game with unique mechanics built around the constraints of the software. We all always wanted to make our own video games, and the fact that I got to do that, even a little bit, was awesome.</p><h4>67. Maple Story</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/290/1*9axTmqiI2MmNTqN9zsHBXA.jpeg" /></figure><p>This is a bit of an embarrassing entry on the list, but I had to include an MMORPG somehow, and this is the one I played the most. I got to max level, at least at the time. I played on my super shitty Dell laptop that would always overheat and didn’t have enough memory to perform raids. Maple Story isn’t a great game, or even a particularly good game, but for whatever reason, it was enough to capture more of my attention than my university classes. I lost access to my account long, long ago. I wonder if it still exists.</p><h4>66. Super Mario Bros. 3</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/0*8d862QQGdl3q323S" /><figcaption>Oh, it’s terrible! The King has been transformed!</figcaption></figure><p>This is another somewhat begrudging entry, but I couldn’t omit it from the list in good conscience. I played it a ton in my childhood, replayed it in adulthood, and read through the Nintendo Power guide more times than I can remember. I pretty much had the match games all memorized.</p><p>Though groundbreaking, it’s never been my favorite Mario game for some reason. Maybe I’m too contrarian or something. This game is worshipped. I think my favorite aspect of the game is just how many different enemies it introduced, each mechanically unique. I love a good bestiary.</p><h4>65. Teenage Mutant Ninja Turtles: Turtles In Time</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/262/0*2uZL-YfemG7tQ0hH" /></figure><blockquote>Cowabunga!</blockquote><p>It’s hard to match the fun beat ’em up action of this game in both its arcade version and the Super Nintendo port. Always funner when played with friends, being able to throw enemies at the screen and even having that be a mechanic for one of the boss fights was super sweet.</p><h4>64. Legend of Mana</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*J1wObNRz9Mx6ZeXO" /></figure><p>No, not Secret of Mana. <em>Legend</em> of Mana, the sequel. It’s very different as a sequel, so I can see why Secret of Mana fans don’t appreciate it so much, but this, along with quite a few other PlayStation RPGs, was introduced to me by my soccer team friend, John. I like the aesthetic of the game, the enemies, the unique mechanics, and its tremendous depth. I never came close to cracking the crafting system as a boy.</p><h4>63. Pandora’s Box</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*lvz7blUxfyQqu2G_9XrN0g.jpeg" /></figure><p>I don’t think many people are aware of this game, but it’s a puzzle game designed by the creator of Tetris, Alexey Pajitnov. It’s a shame this game isn’t more well known because it’s excellent. The puzzles are great, and it has a fun story based on mythological tricksters from around the world.</p><p>I actually have a playlist of this game on my YouTube channel, although it’s incomplete: <a href="https://www.youtube.com/watch?v=W8slYsJi30w&amp;list=PL254E75E28DD01123">https://www.youtube.com/watch?v=W8slYsJi30w&amp;list=PL254E75E28DD01123</a>.</p><h4>62. Quest 64</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/261/0*9tQNQYHnUSBbBTM2" /></figure><p>This is sort of the opposite of a begrudging pick for me, in that it’s a game that I acknowledge has a lot of issues, but I still love it anyway. It mostly struggles in terms of its quality of life with the encounter rate, the fact that the elements are so unbalanced, and a few other things that make it clear that the game was rushed and incomplete.</p><p>Quest 64 is definitely a what-could-have-been game. The creators were ambitious, and the Japanese version introduces some improvements such as critical hits. I don’t think the game gets the respect it deserves. It has its problems, including the stat grinding, and it might be a little bit too slow paced and simple, but I think the underlying ideas are great. I haven’t really seen another RPG combat system like the one Quest 64 offers (except for one entry later), and the spirits magic system and spell crafting is very unique and fun. I don’t know if the game’s failure itself killed these ideas or if the world just wasn’t ready for them. Maybe one day.</p><p>I remember being excited for this game and reading about it with my dad in the paper. It partly makes the list also for being one of the few N64 RPGs.</p><h4>61. Bubble Bobble</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*wywh-swf0oe49ayy" /><figcaption>Now it is the beginning of a fantastic story!</figcaption></figure><p>Bubble Bobble is unique in its charm, aesthetic, and gameplay (surrounding enemies with bubbles and popping them, all the power-ups, and so on). I played this game a lot with my sister when we were children in India. It was another one that fell prey to my mom giving away when she thought we hadn’t been playing it enough — but we had a lot of games to get through! It is kind of brutal that you can only get the true ending of this game with two players. It’s hard to say whether there will be another game quite like Bubble Bobble. The sequel is nowhere near as good. One of my favorite aspects of the game is how colorfully distinct every level is.</p><h4>60. Earthbound</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/349/0*3_VE00S0vsg7FEJN" /><figcaption>What, you’re busy?</figcaption></figure><blockquote>This game stinks!</blockquote><p>This was a game that I really wanted to play at a friend’s house, but he wasn’t into it. I also have a little story about it: when I was at the PX, I saw Earthbound for sale, and they had one of those SNES kiosks you could play. I can’t remember what game it was — maybe Uniracers or something. Anyway, I opened up the Earthbound box, so I could put the game in and play it. <em>I never intended to steal it, I swear. I didn’t even own a SNES!</em> Anyway, a man walked in before I could proceed, so I was busted. He asked if I was going to put it back, and I did. To this day, I don’t know who this man was — if they had me on camera and sent him in, or he was just a rando, but I never got to play Earthbound in the store.</p><p>However, I did emulate it later, so I wasn’t deprived of Earthbound my entire life. What’s not to love about this game? Fun, unique combat, great characters and enemies, amazing music, incredible charm, and an interesting sci-fi story that gets very dark at the end. As a dad, I have to respect Earthbound given that working parenting is one of its core themes, as is growing up. I love the part where Ness gets super OP, as main characters should.</p><h4>59. Starscape</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*eNTuLIeJkv-_J3ew" /></figure><p>A little known indy 2D space shmup with crafting elements. This game is great, so it’s a little sad that it seems to have somewhat flown under the radar. It’s got great gameplay and an incredible soundtrack. Worth checking out, if you can. After I’d played the demo, my friend Bobby, who I’ve mentioned a few times, got this for me as a birthday gift in high school!</p><p>I have a playthrough of this on my YouTube as well: <a href="https://www.youtube.com/watch?v=X4ioLAnsMfM&amp;list=PLD968D6CDA755E3B8">https://www.youtube.com/watch?v=X4ioLAnsMfM&amp;list=PLD968D6CDA755E3B8</a></p><h4>58. Final Fantasy IX</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*Tfg-AnM8dmxvaKx-66wCVQ.jpeg" /></figure><p>Apparently my friend Mike’s favorite entry in the series. I did play this game a <em>ton</em> as a kid, though I never came close to 100%ing it or anything. I think the extra challenges for this game, including the Excalibur II, are pretty out there. It’s amazing to me that multiple people have played a “perfect” game of FF9: <a href="https://gamefaqs.gamespot.com/ps/197338-final-fantasy-ix/faqs/41181">https://gamefaqs.gamespot.com/ps/197338-final-fantasy-ix/faqs/41181</a></p><p>For me, it’s not the most groundbreaking in terms of anything, be it combat, enhancement systems, the characters and their weird body proportions, but hey… you can’t help but love Zidane. He’s so charming. It’s still a great game, and it’s worthy of its spot on my list.</p><p>I have to mention the PlayOnline strategy guide — I loved strategy guides as a kid, including the SMB3 Nintendo Power edition I’ve eluded to, and there were plenty of others that I can’t quite remember. One I know of for certain, though, was FFIX. My parents bought it for me in good faith, but this is the only guide that I know of that included a lot of segments that told you to visit PlayOnline to fill in the blanks that weren’t actually included in the book. Apparently, this was a huge issue for a lot of people, and that includes me — my parents wouldn’t allow me to create a PlayOnline account, so I never actually got to see any of these details, and apparently, the PlayOnline site doesn’t even exist anymore, (though some dedicated fans have recreated it). What a ripoff!</p><h4>57. Super C</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/0*k7APgMyN1nfO5ug7" /></figure><p>The best Contra (though they’re all awesome). I recently played all the way through this with my former brother-in-law. I just love everything about this game, and I think it’s my favorite in the run ‘n gun genre. I guess I’ll see below. It’s got great graphics, gameplay, music, sound effects, weapons, and overall, it makes you feel like a badass, except for the fact that you can die in one hit. I love hearing the 1up sound, not only because it sounds cool, but it’s great to have that lifeline. Don’t forget where the Spread guns spawn, commando.</p><h4>56. Puyo Puyo Tetris</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*fnSiLXD_mEhQCS2aPqX3GA.jpeg" /><figcaption>Gravity was my ally</figcaption></figure><p>This is a bit of a stand-in for both the Puyo Puyo series and Tetris as a whole, but I love the charm and mechanics of this game in particular. I don’t think I need to say a lot about those game series as they are both widely beloved, and with good reason. Maybe I’ll check out the sequel someday.</p><h4>55. Mario Party</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/261/0*wfx0x8BP-YuBXr5E" /></figure><p>This is also something of a stand-in for the Mario Party series as a whole, but it’s also the OG Mario Party itself. It earns its spot on the list because it’s one of a very small handful of games that’s caused me physical injury. Anyone who did the palm rotation technique knows what I’m talking about. I couldn’t tell my parents about the burning pain in my hand since I was worried they’d take the game away, but at the same time, it hurt too much to even play normally.</p><p>I have too many memories from the Mario Party series to count, playing with both friends and family.</p><p>Does anyone else think it’s disorienting that the dice block Mario is hitting has a 3 on it right under the words Mario Party on the game box? Makes it seem like it’s supposed to be Mario Party 3.</p><h4>54. Kingdom Hearts</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/0*7va7Y0-lBq3-YYMl" /></figure><p>The whole idea behind Kingdom Hearts — what if we mix Disney and Final Fantasy — sounds kind of insane, but apparently, it works great. I love both franchises, after all. A great game in the pantheon of PS2 action RPGs.</p><h4>53. Mario Kart 64</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*b58OQ5qHFm8wgub8btE7QQ.jpeg" /><figcaption>Welcome to Mario Kart!</figcaption></figure><p>Another stand-in for the series, but Mario Kart 64 is <em>probably</em> the best. My daughter’s started asking me to play Mario Kart World with her, so even though the Mario Kart series as a whole has never been my favorite, and I’ve never been that great at it, it gets a lot of bonus points just for that. Lots of memories playing this, especially with friends in college. Just goes to show once again that Nintendo really knows what they’re doing. Lots of memories playing Mario Kart 64 with my roommates Jeff and Bobby in college. Shoutout to Mario Kart: Super Circuit, which I also played a lot on the go.</p><h4>52. Yoshi’s Story &amp; Yoshi’s Island</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*EsOalDQIL_Umuj4D" /></figure><p>I remember my screed about SNES games from earlier in the article, but I like Yoshi’s Island too much for it not to make the list or get a mention at all. I appreciate the uniqueness of each level. Yoshi’s Story is similar, and is a criminally underrated game that is often dismissed as too easy. You need to try getting all melons.</p><p>I guess I didn’t really fall in love with Yoshi early on what with my lack of a SNES and the fact that I kind of missed out on Super Mario World, but how could you not love him? Charming games with unique aesthetics and fun gameplay. What else can I say?</p><h4>51. Empire Earth</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/342/1*lD4Xo5M6yogOaZtXbRcfqg.jpeg" /></figure><p>Fun game recommended to me by my friend Bobby in high school during our RTS phase. This game is similar to the Civilization series in its premise of taking a civilization from pre-history all the way to the future, except it’s an RTS. If you never got to play this one when it came out, you missed out.</p><h4>50. Super Mario Bros.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*NPUUUCc9Eb8X-B278YsYxw.png" /><figcaption>Thank you Mario! But our Princess is in another castle!</figcaption></figure><p>It’s only right to start the top half of the list with the game that started it all. The first game that I, and many other people, ever played. SMB1 is often dismissed as primitive and outdated, but this game is a marvel. It has great gameplay; tight, intuitive controls; great enemies and characters that have stood the test of time; all wrapped in a cute fairy tale story. Don’t sleep on SMB1, folks!</p><h4>49. Metroid</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/220/0*GoZWGObmUMlrJrpr" /><figcaption>Time bomb set! Get out fast!</figcaption></figure><p>I realized what a gaming boomer I must be after I saw a video thumbnail about how Metroid is “unplayable” now. This takes me back to the time in my childhood before the internet, where you had to figure out all of the cryptic stuff in this game on your own, with school friends, your parents, or rumors and info that people gathered from magazines and things like that. I also give a lot of credit to Metroid for the whole “Samus is really a woman” twist, which seems trite now, but it did it first, so show some respect. Who figured out Justin Bailey anyway?</p><p>I still think the game is fun as hell, and it belongs here in the top half alongside its compatriate, SMB1. It brings back great childhood memories of things like reading through the instruction booklet with my dad. That’s what you had to do back then with video games.</p><h4>48. Super Smash Bros.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/263/0*VSSopYudOVSfw1Hz" /></figure><p>My story behind this game is a lot of fun for me. I remember seeing the commercial where there were people dressed in Nintendo character costumes beating each other up. My mom was shocked and thought it was degenerate. Then she turned around and shocked me back by surprising me with a rental of Super Smash Bros. to play with my friends who were coming over for the weekend. This sort of undoes all of the damage that was done by the whole SNES debacle.</p><p>I excluded fighting games as a category earlier, but I think most people will agree that Smash Bros. breaks the mold enough to be in its own category. It started the mascot brawler trend, and it’s still played to this day at a competitive level. Not many games can compete with the combined laughter and rage this game generated in my life, both from me and friends. Good times all around.</p><h4>47. Mystical Ninja Starring Goemon</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*rTmKS4wjAy6b7yXokqEXbQ.jpeg" /><figcaption>PLASMA!</figcaption></figure><p>I think any American like me who played this game when it came out probably loves it, although I’ve never heard of it being a particularly well-liked game, which is too bad, because it’s awesome. I don’t think the Japanese humor translates over very well, but it was nice that they included a laugh track. My dad also helped me beat the stupid mermaid waterfall level because he could mash faster than me.</p><p>I Am Impact is still one of my favorite video game songs, silly as it is. Of course, this is a long-running Japanese series, but I believe this was the first entry the US got, and I’m really glad we did, because it was a great time.</p><h4>46. The Last Remnant</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*_mUNePRf-qnuZJh9" /></figure><p>I still contend that The Last Remnant is spiritually a SaGa game, but I’ll talk about those more later. It has all of the same elements of the SaGa series: a cavalcade of sweet characters, unique, open-ended and obscure combat and mechanics, incredible music, and super cool weapons. I played this game with my friends Jeff and Alfred.</p><p>My favorite aspect of this game is the fact that you get limited choices in combat, sometimes excluding what might be the optimal choice, which forces you into interesting decisions. It’s a great game with a lot of fun memories associated with it for me.</p><h4>45. Super Mario Sunshine</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*HzQumdB30aXFGVCY" /></figure><p>This game took a long time to grow on me. It’s the sequel to Super Mario 64, one of the greatest video games of all time, and a game whose experience for me at the time would be impossible to replicate, so it was easy for me to scorn this very different sequel. This was during the odd period where Nintendo decided that the Mario franchise should involve carrying equipment with backpacks.</p><p>Anyway, over time, I’ve come to sincerely appreciate Super Mario Sunshine. It’s got great aesthetics, really fun gameplay with unique challenges, and even though I at first was put off by the fact that you generally couldn’t sequence break shine collection like you could with stars in SM64, I now appreciate the fact that the scenarios are often noticeably different for each individual shine. Overall, it says a lot that a game that is so heavily overshadowed by its predecessor could rise to this level.</p><h4>44. Beatmania IIDX</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*4DLIS530xCC1Ef4iDbDCtQ.jpeg" /></figure><p>There are over 20 entries in the IIDX series, and I’ve played a handful of them with no particular favorite, so this refers to the series as a whole. I never got particularly good at IIDX in spite of being roommates with my friend, Mark, who owned one of the home controllers and games. For whatever reason, the Japanese developers thought it would be cool to make even the easiest songs in this rhythm game punishingly hard. I think IIDX is probably the hardest game ever in terms of potential scaling difficulty.</p><p>Incredible music, even for the menus, and its strong connection to DDR gets it a lot points. My daughter also loves the music, calling the IIDX 9 intro and menu music “awesome,” so it’s clearly a generational game.</p><h4>43. Mischief Makers</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*RrjjGRbavl-zufuj" /><figcaption>Help…! Me…! Marina!</figcaption></figure><blockquote>Through fire, justice is served.</blockquote><p>A weird and quirky N64 game that has a unique way of storytelling alongside level selection. I don’t think I ever actually owned this game, I just rented it a lot, but I don’t quite remember. I did almost 100% it though. I could never get the last gold gem I needed which required button mashing that I was simply not capable of at the time, or possibly even now. I’m a terrible masher.</p><p>A game that doesn’t take itself too seriously with its cool and quirky characters, an adorably lovable protagonist, and very unique gameplay where you have no combat action except throwing and shaking. Something of a puzzle platformer, I’ve never quite seen another game like it, and it belongs here in the top half of the list.</p><h4>42. Age of Mythology</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*SYYZGZ2_cV_Ty52GPzMwwg.jpeg" /><figcaption>Prostagma.</figcaption></figure><p>Made by the creators of the Age of Empires series, this is an awesome RTS that I also played with Bobby after Empire Earth was old news. It’s quite a creative approach to an RTS in terms of story, tech tree, and gameplay. I’ve always loved mythology of all cultures too, so this game was right up my alley.</p><h4>41. The Sims</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*2nm8-JMW4UKE1Pa5" /></figure><p>The OG Sims, the best Sims, and the only Sims I’ve ever played. The Sims seems like a game that wasn’t made for gamers, and my sister played it a ton, so there is some truth to that, but it’s a fun game in its own right. You’d think a real time life simulator wouldn’t be particularly interesting, but The Sims definitely nailed it.</p><h4>40. Pikmin</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*wRbevhSi-kwDCFpwhQqxug.jpeg" /></figure><p>Pikmin is a great, fun, and highly creative RTS-like that has turned into a beloved franchise. How could you not love the little guys, or Captain Olimar, for that matter. Only the OG makes the list. The others were ruined by removing the challenge of the time limit on playthroughs, which wasn’t even oppressive. Maybe games don’t need to be NES-hard, but you don’t have to remove all failure conditions either.</p><h4>39. Golden Sun</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*fS6cuTo9zlpiHQ-P" /></figure><p>I did play Golden Sun 2, which was okay, but I have a special connection to Golden Sun 1. When my abuela passed away, and my family was in Puerto Rico, it was the only video game I had or could play (except maybe Mario Kart: Super Circuit and/or Metroid Fusion), so I spent a lot of time with it grinding in the final dungeon, getting multiple copies of 1/64 rare drops, and overleveling. This game gets a lot of credit for comforting me through the grief.</p><p>This game has some pretty unique RPG elements that combine puzzles with spell casting and a high level of customizability. It’s a fun game with a cute story. Maybe they’ll revive the series some day.</p><h4>38. Kirby’s Adventure</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*VWYjzPpN_mzwyWBkm3NqrQ.jpeg" /><figcaption>First you draw a circle, then you dot the eyes…</figcaption></figure><p>I have a story to tell about Kirby’s Adventure. It is a fairly late NES entry, and I didn’t get it until long after the SNES was already out. There was a video game store at the mall (I think) in South Carolina, and my dad would always stop in there with me any time we’d go.</p><p>By that time, most of the stuff for sale was relatively new SNES, Genesis, and PC games. There were only three NES cartridges left. One of those was Kirby’s Adventure. We got it for Christmas, 199X.</p><p>This was the game that introduced Kirby’s unique and beloved copy ability. It’s incredibly cute, lots of fun, has great music, wonderful graphics for the time, and it was a great way to cap off the lifespan of the NES. I find Kirby’s Adventure, while it’s still well-liked, to be somewhat underrated by the gaming community, perhaps overshadowed by Kirby Super Star. Maybe it’s too easy or too short. I <em>did</em> manage to beat it contemporaneously after all. Well anyway, I’ll always love you, Kirby’s Adventure!</p><h4>37. Paper Mario</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/284/0*pslACahKV_bmY5hr" /></figure><p>No, not TTYD, which is a nice game, but I think it got rid of a lot of the spirit of Paper Mario. I really like the mechanics of your partners not having HP, and of the HP and FP counts being really tight. I love big numbers in my video games just like anyone else, but I think there’s something enjoyable about very clean, precise number counts in damage calculations for RPGs.</p><p>Another game that I repeatedly rented for the N64, the last RPG on the N64 that I played, and also the best one. Shine on, Mario Story. Shine on.</p><h4>36. Super Mario Bros. 2</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*Kdw-MpaIfWdjhq_i" /></figure><p>In one of my earliest memories, my dad set up a treasure hunt for Easter Sunday at our home in India, and SMB2 was the treasure. What a treasure it was, because this game is great. I think SMB2 generally gets the proper amount of respect it deserves, although I do see some people pointing out that it’s not a <em>true </em>Mario game, but I contest this somewhat since it’s clear from its development that it was always designed as if it could be a Mario game. Then, they made it so.</p><p>I always thought it was a little bit weird that Wart never resurfaced as a villain. I assume he has a cameo here or there, but I don’t see why he was never brought back as an antagonist for any game. I guess the same is true for most of the bosses as well, but the other enemies have mostly become Mario staples, of course. SMB3 got its Bob-ombs from SMB2, after all.</p><p>I’ve always loved SMB2 for its amazing music, fun gameplay, great level design, groundbreaking character selection mechanic and overall legacy. I just played through it again last year. In my opinion, it deserves to be at the top of the three SMB NES games.</p><h4>35. Zelda II: The Adventure of Link</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*GNv1xWrZj0bc2FDx" /></figure><p>I’ve always had a unique relationship with Zelda II, for some reason. In fact, I wrote a whole article about it: <a href="https://medium.com/@ExplosionPills/exploring-the-archetypal-themes-of-zelda-ii-dcab2d15cdfc?source=your_stories_outbox---writer_outbox_published-----------------------------------------">https://medium.com/@ExplosionPills/exploring-the-archetypal-themes-of-zelda-ii-dcab2d15cdfc</a></p><p>I’ve already said a lot there that doesn’t need much repeating here, but I think this game is both improperly maligned and inappropriately tagged as “underrated.” Given its legacy and outstanding popularity, it seems well-rated to me. It’s not a perfect game, but keep in mind that it’s the second Zelda game, so the fact that it behaves so differently from all the other Zelda games is not that strange. They hadn’t established that the Zelda games should be largely the same.</p><p>Zelda II is great. It’s a big boy game, as it should be, since Link is a big boy now. Give Link and Zelda II the respect they deserve.</p><h4>34. Tetris Effect</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*GmttrDMFMWKLWF10VGGw0g.jpeg" /></figure><p>Alongside Puyo Puyo Tetris, this is also representing the Tetris franchise as a whole, but this game is awesome. It’s got incredible music, engaging graphics, and is overall my favorite manifestation of the Tetris experience.</p><h4>33. Breath of Fire IV</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*_C2CJXCDop1IpL8Rf0Kb_w.jpeg" /></figure><p>I did play Breath of Fire III first, and that game is great too, but Breath of Fire IV is the one I had to select for the list. It has some of my favorite video game music of all time. As a teenager, I really appreciated all of the clear nods to Asian culture. Heck, I even wrote a fan fiction about Fou-Lu for an English assignment, so this game has to get quite a lot of credit.</p><p>I really like the BoF series in general, but this one was a nice evolution from the previous forms. It’s more mature in both presentation and story. It still maintains the fun combat, awesome enemy designs, and engaging “you get to play as a dragon” element that’s sorely lacking from so many RPGs.</p><h4>32. Star Fox 64 (and Star Fox)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/256/0*vrqFHelkcXD0Bw30" /><figcaption>Mission Accomplished</figcaption></figure><blockquote>Watch where you’re flyin’, Fox!</blockquote><p>I played the original Star Fox on the SNES at one of those grocery store kiosks where, at the time, it was clearly the greatest video game ever made. I could never make it past the first level, but I was but a young boy with a very limited video game schedule. The first one deserves some credit, but there has never been nor will there probably ever be a game like Star Fox 64 again.</p><p>My college friends and roommates, Bobby, Jeff, and I played this game a lot alongside Mario Kart 64. I believe we 100%ed it, even unlocking the ground bazooka gameplay option for multiplayer. I definitely saw that, but I don’t quite remember how.</p><p>Star Fox 64 is a little cheesy in retrospect, but it’s a great game with really fun characters, great action, good variety in levels, and plenty of replayability. It’s a shame to me that the franchise couldn’t rise to this level again, and I’m not quite sure why. Anyone else play with the rumble pack?</p><h4>31. Ninja Gaiden II: The Dark Sword of Chaos</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*bYaNUL893Ry2Zd47AZroCA.png" /><figcaption>This earth shall fall into shadow and the demons of evil shall rule forever.</figcaption></figure><p>This is a stand-in for the three NES Ninja Gaiden games, but Ninja Gaiden II wins out for a few reasons: I think it has the best story and the best music, it’s the only one that has the awesome ninja clones power-up, and it’s the one I owned as a kid.</p><p>I don’t know what kind of sadist was designing these games, but I don’t think they were really intended for children to be able to beat them. While by no means the most challenging games on the NES, the Ninja Gaiden games are in the tier of NES games that were unnecessarily cruel to little boys who were just trying to enjoy their hour of video game time with relentless enemies that respawn, sometimes while their respawn point is still on the screen. Not to mention that the love interest gets stabbed, and they actually show the blood.</p><p>When you play these games well, you really do feel like a ninja, so I think they did a great job of capturing the essence of badassery with these games. Plus Ryu Hayabusa, “Peregrine Falcon of the Dragon Clan,” is one of the most badass video game characters in history.</p><p>I managed to get to Astos as a kid, though I never beat him. I assumed he was the final boss. Little did I know that he was just the halfway point. I have beaten all of the Ninja Gaiden NES games in adulthood, though. The third one is the hardest. The entire series has amazing music, graphics, and gameplay, though I find the first one a bit more simplistic and repetitive, and the third one to be a bit overwrought (plus the main villain’s name is <em>Clancy</em>. Lame!) The second one hits the sweet spot. It also has possibly my favorite box art of any video game, with Ryu floating over the harbor next to a city, for some reason.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/256/0*j9JjP9kKPrbyB3Or.jpg" /></figure><h4>30. Dark Cloud 2</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*LBx8VKHNn7cc_39N" /><figcaption>Which shall it be? Very good! Here you are.</figcaption></figure><p>Apparently Dark Chronicle in Japan, it has little relationship to its predecessor, which I’ve never played. This is a great game, but I also have a special association with it since my friend and roommate, Jeff and I played this game practically in shifts for a few weeks during my third year in college, much to the chagrin of our other roommate, Bobby, who had no interest in the game, but was more or less locked out of using the living room TV.</p><p>The game has a lot of fun and unique mechanics that combine action RPGs and some kind of weird Act Raiser-like world building. Anyone else remember getting really tilted by Spheda?</p><h4>29. Tyrian</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*SmtQpVoG8C8Stilx" /></figure><p>I hope people remember this game, because it’s awesome. I believe it’s at the top of the list in the shmup category, and it deserves to be there because it’s got great gameplay, great music, fun levels with a lot of variety, a ton of customizability for your ship with different weapons and power-ups, and a plethora of secrets. I probably have never played a DOS game more than this one. Nearly perfect in its execution, it’s a great trip down memory lane.</p><h4>28. Bomberman 64</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/249/0*tjvH6WSfR2kW-Usv" /><figcaption>I’ll finish you!</figcaption></figure><p>This is the only Bomberman game I’ve ever owned. They really went all out with this one, changing Bomberman from a pure puzzle game into an action-puzzle platformer with a surprisingly fun story that included an entire world you could unlock by getting all of the collectibles… definitely a better prize than Yoshi at the top of the castle. I also thought it was pretty cool that Regulus fought by your side at the end.</p><p>I’ve always loved Bomberman 64, and it brings back a lot of nostalgia for me. It gets a lot of points not only for the great main game, but also because the multiplayer is awesome. Lots of fun times with friends and I blowing each other up. It’s got great music, too.</p><h4>27. Metroid Prime &amp; Metroid Prime 2</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*3BqbEk9UEBsUbc4cmDKOpg.jpeg" /><figcaption>Recording to logbook</figcaption></figure><p>I think we were all a little bit skeptical about Metroid Prime being an FPS, particularly those of us FPS-haters like me, but they totally nailed it with both of these entries. I exclude the third one because I didn’t like or play it as much. I wasn’t the biggest fan of the Wii controls, but who knows? Maybe I’ll go back and finish the trilogy some day.</p><p>The first Metroid Prime is perfect. The ideal combination of an incredible ambiance with mystery and tension, a fun planet to explore, great power-ups and mechanics, and memorable boss fights — especially the game’s namesake, which is one of the most intense final bosses I can remember.</p><p>It’s tough to say for me which one of these two really deserves this slot, but I think Metroid Prime 2 overall is a little bit better. I really like the fact that it has the screw attack, but that’s only a minor point. I think the world is more engaging and interesting. The Emperor Ing doesn’t compare to fighting Metroid Prime, though.</p><h4>26. Mega Man 6</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/0*hG8nIUsQOAuaR29G.png" /></figure><p>Let’s take a trip back to the mall in South Carolina. Alongside Kirby’s Adventure, the second NES cartridge that was left for me and me alone to pick up was Mega Man 6. I’m not exactly sure of the timeframe between when I actually got each of these games, but it was interesting that it worked out that when we would go back, they’d be there in the store, waiting just for me.</p><p>It’s not the first Mega Man I’d played… I actually played the first one first, and I’d probably played at least one other, but I think that Mega Man 6 is the best. I did manage to beat it as a kid too, and right before Saturday night mass!</p><p>I don’t think it’s nearly as beloved as most of the other entries, all of which I’ve played and beaten in adulthood with my friend Mike. Let’s be honest: at least after Mega Man 1, the Mega Man games are all largely the same. They’re all great, and the soundtrack and character designs in particular are worthy of praise, but if you like a particular Mega Man game, it’s probably because you have specific memory associated with it, or it was the first one you seriously played, or it just clicked with you for some specific reason. Anyway, that’s Mega Man 6 for me.</p><h4>25. The Legend of Zelda</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/361/0*e3OU8-93hzsjmnXc" /></figure><p>There’s just something very nostalgic about hearing the title theme for this game. Getting into the top quarter of the list, I have to pay homage to another game that really helped to kick off gaming as we know it.</p><p>It was definitely tough for me to put the original Legend of Zelda above Zelda II, but I think it belongs here. Why was it hard? Because I never finished this game as a kid whereas I played through and beat Zelda II when I was older. This was another game that somehow was either given away or lost when I was much younger. My sister and I were stuck on Level 6 with the Wizzrobes, and we never found enough heart containers to get the magical sword either. I didn’t even know that’s what unlocked it. I have beaten both the main game and the second quest in adulthood, though.</p><p>This game is associated with great childhood memories for me too, like when my sister turned blue after beating Aquamentus in the first dungeon, or my dad filling in the blank parts of the partial map that was bundled with the game. Oftentimes, video games were family affairs that involved both physical and digital media. I think that a lot of that is a relic of the past, which is a shame, but TLoZ still holds its own in the pantheon of games.</p><h4>24. Legend of Legaia</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/278/1*v8kAZWBDC_bsgHjo5iqWvg.jpeg" /><figcaption>Tornado Flame!</figcaption></figure><p>I will always cherish this game which combines a lot of elements of things that I deeply love, particularly martial arts and JRPGs. I’m not sure why this game is not more beloved or remembered, because it’s awesome. Getting to play as a band of trained martial artists with magical powers in a unique combat system based on striking combinations was an experience that will probably never be truly replicated for me. Legaia 2 is okay, but it can’t compete with the original.</p><p>It’s also weird that this game is based around an ominous mist that turns things evil and came out a little before FF9, which has a similar plot line. I don’t think either game ripped off the other, but I definitely thought that about FF9 at the time. Maybe that’s why it’s so much lower on my list.</p><p>I still say “yus!” In my head, one of Gala’s victory cries, after some meaningful accomplishments. As silly as it is, the Japanese battle cries are a very memorable part of the game for me, and they make it a lot of fun. I don’t think another game has done it as well as Legend of Legaia.</p><p>It also has a really great story with a really interesting cast of characters, good villains, and fun monsters. If there’s one big downside to the game, it’s that you move <em>really slowly</em> on the world map, and the random encounter rate is maybe a bit too high. Thanks to my soccer friend John for turning me on to this game, as is true of many of the PS1 JRPGs on this list.</p><h4>23. Braid</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*pK4ba3K7PBK6GB4eFeybEQ.jpeg" /></figure><blockquote>Ain’t got no point to the game.</blockquote><p>My favorite puzzle game on the list. Braid is as fun as it is unique and intriguing. Along with just being a high quality game, my friend Alfred and I played it together quite a bit in college, and for a brief time, we even held the number 2 slot on the leaderboard for speedrunning. Who knows what the game is really about? Not even Jonathan Blow does. But what it’s really about is great platforming, cool puzzles that make you feel smart, and an incredibly engaging time manipulation mechanic that’s memorable to this day. This game oozes charm, and its uniqueness helps propel it high on my list.</p><h4>22. UFO 50</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*BZk25io3Sg8ifd3NZRg34w.jpeg" /></figure><p>It’s a little bit sad to me that this game was apparently not very popular, because it’s awesome. I ranked all of the games in the fantasy collection, for anyone curious: <a href="https://youtu.be/bSpnBTJvJoA?si=1fVtzPSZvXqmBkWF">https://youtu.be/bSpnBTJvJoA?si=1fVtzPSZvXqmBkWF</a>.</p><p>Not all of the games are winners, but this deserves to be on the list for Party House, Campanella 2, Elfazar’s Hat, Fist Hell, and Avianos, at least, though it’s bolstered by even more great games in the collection. You could tell that this whole game is a labor of love. I hope one day it can get the appreciation it deserves. Thanks to Mike for telling me about it.</p><h4>21. Call of Duty: Modern Warfare 2</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*9c1lbR0uG6y1vDyyawZnAw.jpeg" /></figure><p>At least for me, this is the game that really changed the face of FPS gaming forever. This is another game that we played a ton in college, including my friends Jeff, Bobby, and Alfred. It’s a bit of a stand-in for the Call of Duty series as a whole, since I’ve played a lot of the games since then. There aren’t many games that we stayed up till 6am playing on release day.</p><h4>20. Castle of the Winds</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vGke23M1ZypkaQ0v.png" /></figure><p>Castle of the Winds is a very unique entry for me as the first roguelike I ever played before I knew what roguelikes were. Developed for windows, it’s one of the few games I know of that actually uses multiple windows for game elements, which was kind of strange. This game wins a lot of points for me because of nostalgia, but I think it’s of high quality as well. It was developed by a single person, Rick Saada, who loved RPGs and ultimately released it for free.</p><p>I can’t remember exactly how I played it, although I think it was on the 1,001 games CD I’ve referenced a few times in this article. Clearly not a very well known or popular game, but the few who know about it all love it.</p><h4>19. Zoda’s Revenge: StarTropics II (and StarTropics)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/298/0*3EajZFUAiifA-SLh" /><figcaption>Was it a cat I saw? Was it a rat I saw?</figcaption></figure><p>StarTropics 2 is the real one to make the list, but I had to mention StarTropics as well. It’s my understanding that the second game entry is not as beloved for some reason, even though it has better controls and more or less fixes all of the quality of life issues from the first game. Heck, you can move diagonally in the sequel!</p><p>I did manage to beat StarTropics 1 when I had it as a kid, but it suffers in part because it was one of those games my mom ended up giving away because I didn’t play it anymore. It saddens me since I love the game, and I never got the chance to go back and play it again. We did actually have the letter you had to dip into water, and I remember my sister and I doing it in the bathroom sink to solve the puzzle at that point in the game, so that’s a pretty sweet NES memory for me.</p><p>It is a bit sad to me that StarTropics never made it really big, but I understand it was made for the US and thus never released in Japan, and the sequel wasn’t released until well into the SNES’ lifespan. Given my circumstances, this is probably one of the reasons I ended up playing it so much. I didn’t like the victory music of the second game as much as the first game, but it’s grown on me. Otherwise, the other songs and pretty much every other aspect of the second game is better. It’s a rare sequel that essentially improves on its predecessor in every why while still capturing its core qualities.</p><h4>18. Pokémon Gold (and Pokémon Blue, and Pokémon Sapphire)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*b82Z-_w4_nmzXPLdBb6YLA.jpeg" /></figure><p>I had to represent Pokémon on the list somewhere, and I think this is a great spot for it. Nintendo and Game Freak really did an amazing job of capturing the magical idea of Pokémon — a coming of age story about a young man or woman going out into the world to capture animals and force them to fight with each other. For whatever reason, it really spoke to all of us, and in a lot of ways, it felt real. I didn’t have the time or social allowance to regularly trade or battle with friends, but I did from time-to-time — especially with my childhood friend, Bobby, whom I’ve mentioned a few times throughout this article. Yes, we played in middle school, and we went on to be college roommates.</p><p>Apparently, Gold/Silver are not very highly regarded as far as Pokémon games go, which is strange to me, because it introduced a lot of critical mechanics to the series like items and the day-night cycle. It’s also two games in one! No respect for that? Ho-oh is my favorite Pokémon too.</p><p>I did play Pokémon Blue first, and of course, it’s also great, but I liked Gold better. Awesome Christmas gift. Sapphire was okay, and I haven’t really played much Pokémon since then. I think I just grew out of it. Bittersweet, in its way. I don’t want to hear any arguments about this either: water starters are the best.</p><h4>17. Age of Empires II</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*JA1prjpoCYhuLhliP21ltA.jpeg" /><figcaption>The English are terrorizin’ all o’ Scotland!</figcaption></figure><blockquote>Beware of the Qara Khitai. They are without honor.</blockquote><p>Another shoutout to Bobby, who introduced me to this game. At the time, I didn’t even realize that a game like this could exist, but I spent countless hours playing single player campaigns, with friends, online, and in building and playing custom campaigns. This game really does have everything.</p><p>It was a very timely game for me to start too since our playing of the game coincided with the study of similar civilization histories in high school. I can’t say that AOE2 actually helped me do better in history class, but there were definitely a lot of fun connections and talking points to be made there.</p><blockquote>Barbarossa now commands a massive-a navy. We must stop him lest he attempts to cross-a the river.</blockquote><p>I’m not alone in this as AOE2 has clearly stood the test of time. It’s gotten multiple expansions and even a remaster in the <em>Definitive Edition</em>. It’s still highly popular and even played competitively today.</p><h4>16. Final Fantasy VIII</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*uRZ6EgQ758qPoy5W2rvPfg.jpeg" /><figcaption>I’ll be waiting here for you. If you come here, you’ll find me. I promise.</figcaption></figure><p>When I was younger and for a long time until recently, I thought I was fairly unique in rating FF8 as highly as I did. It was pretty much just me and my college friend, Alfred. More recently, it seems like FF8 has caught some traction in the community and is recognized as being a highly underrated and not properly respected game in the series.</p><p>I didn’t get a chance to play 7, which probably would’ve been awesome at the time, so it’s impossible for me to say if my impression of 8 would’ve been affected in any way, but given how beloved 7 is, it’s tough footsteps to follow. I think it was just a great time in my life to play a game with a moody, angsty protagonist who was just a little bit older than I was. Not to mention I appreciate a good love story.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*4xPuRLEgm5MeotDaTZjQwQ.jpeg" /></figure><p>I love FF8 for many of the things it’s hated for, including the junction system, the exploitability of drawing magic from the same enemy over and over and just spamming the square button until you can use Degenerator to win every non-boss fight, and the fact that enemies level up with you. I never understood why people disliked that mechanic other than the fact that it was unusual for RPGs. Wouldn’t you <em>want</em> the game’s battles to match your ability level?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*FNQR8SBeojul9dHAlBtNtA.jpeg" /></figure><p>I have too many great memories of FF8 to list here. It’s not a perfect game, and some of the graphical choices are a little awkward. The music isn’t my favorite either (except “The Man With The Machine Gun.” Come on!), but it’s still an FF game that belongs in the top tier of Final Fantasy games for me.</p><h4>15. Halo 3 (and Halo 2)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*nR3122uwFQHt2sqN" /></figure><p>Halo 2 gets a nod because I did play it quite a lot in college, but Halo 3 was the one Bobby, Jeff, Alfred, Mark, and I spent a lot of time playing after I’d acquired an Xbox 360 along with the game. Still one of the best FPS single and multiplayer games in terms of controls and weapons, I’ll always have a deep fondness for Halo 3 and the series as a whole. I really like the story too, even though I didn’t get into it until pretty late in the series.</p><p>COD may have changed the face of online multiplayer FPS gaming, but Halo certainly contributed to that. They’re different enough in content and style, but Halo wins out for me because of the great couch co-op memories.</p><h4>14. Final Fantasy Tactics</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*mnZtF_Fu2I2gSZ22kCFUIA.jpeg" /><figcaption>Layer upon layer, make your mark now!</figcaption></figure><p>I’ve never been more disappointed about a game not getting a sequel than this (no, the Tactics Advanced games do <em>not</em> count). FFT is nearly perfect in terms of everything: its mechanics, structure, music, and story. It’s an incredibly deep game, and it’s worthy of the recent remaster that it got. I played it a lot with Jeff in college too. I have no idea what happened to my copy of it, though. So many games just lost to the ether…</p><p>I remember feeling that this was a more adult story than the childish games I had been used to at that ripe age of early high-school. I’m also a sucker for an exploitable game (see FF8). They’ll always be Calculators to me.</p><p>I know I might have been a little (too) harsh with my mom about the whole SNES thing, but after I had my wisdom teeth pulled at 14, I remember that my mom surprised me with Final Fantasy Tactics. I can still envision her holding it in her arms, obscuring the surprise a little bit, while I exclaimed “Fina Fan’asy Ac-ics!” with my busted jaw. I love you, Mom.</p><h4>13. Star Ocean: The Second Story</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*R-aoTryRyMxbI_JoJZOV5w.jpeg" /><figcaption>Looks like I’m going to be popular with the ladies again!</figcaption></figure><blockquote>I will burn you to the bone!</blockquote><p>Another PS1 JRPG introduced to me by my friend John. I got to play it when my mom took me over to his house one weekend, then I rented it, and eventually bought it (or got it as a gift for Christmas or something like that). Apparently, this game is pretty well received since it got a pretty big remaster recently with a lot of QoL updates.</p><p>I was pretty religious about this game in middle school. No one else in my class played it, but I talked about it a lot. So much of the game is memorable for me. I even have a mostly complete challenge run of the whole game, though I never finished the extra dungeon: <a href="https://www.youtube.com/watch?v=Yx3icMxxpOs&amp;list=PL370DCD1DE1638EE0">https://www.youtube.com/watch?v=Yx3icMxxpOs&amp;list=PL370DCD1DE1638EE0</a></p><p>I 100%ed this game inside and out, and I played through it many, many times. Similar to the “yus!” from Legend of Legaia, I still say Claude’s “Hey!” level up line in my head after some minor victory. I really think he sounds like Garfield. I wasn’t able to find the voice cast for the original NA release of the game, but it’s not impossible that he was voiced by Lorenzo Music.</p><p>It’s a great game with great combat, a fun sci-fi story, memorable characters, and a really deep crafting system. Luckily for me, the Internet was coming around at the time, so I was able to look up how to get all of the important weapons and stuff. The game also has a really cool secret where you can go back to the first half of the game with your airship to gather anything you might have missed as well as take on the bonus challenge dungeon, which I finished quite a few times. I played it all the way up through college.</p><h4>12. Final Fantasy X</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*IuXpzlWYbDJnmBpo" /><figcaption>No mercy</figcaption></figure><p>It was a real struggle for me deciding whether FFX or FF8 deserved the higher slot, but ultimately, I had to give it to FFX because I just think it’s a better game. I don’t quite love the characters or story as much (though I do still love them enough), but I prefer the turn based FFT-ordering style combat and FFX’s mechanics overall. This one also seems to be quite popular in the FF community, and it deserves it, because it’s great.</p><p>If for no other reason, the game should be here because of one of its critical elements: The Sphere Grid, the greatest progression system ever developed for any video game.</p><p>I 100%ed this game. Yes, I dodged 200 lightning strikes. My friend Bjorn had a deep, philosophical epiphany that impacted his golf game: you have to treat every strike as if it’s the first one. Same with every golf stroke. Yes, I did get 0 on Chocobo racing, which I honestly don’t remember being that hard. Certainly, it’s not harder than getting 1,000 jump ropes like in FF9, but maybe I was just more invested.</p><p>A great game overall. I feel a little guilty that it couldn’t quite make it into the top 10 for me.</p><h4>11. The Legend of Zelda: Ocarina of Time</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*7JJcoixtfbdiouhk" /><figcaption>Hey! Listen!</figcaption></figure><p>Similar to Star Ocean 2, which came out around the same time, I was pretty religious about this game. Bobby called me a “Zelda’s Witness,” because I talked about it so much. There’s no denying that this game was great. It was the perfect segue for the Zelda series into 3D while still retaining the core spirit of what makes a Zelda game. Great mechanics, fun puzzles, memorable characters, good music… it’s got it all.</p><p>I also actually liked Navi — I thought she was a cute companion, and she never really bothered me. I completed most of the game, but I actually never managed to get the last bottle by shooting all of the Poes on horeseback. I think this game has stood the test of time (haha), even if the N64 controller hasn’t.</p><p>It was really challenging to make a top 10. I’m satisfied with my selections, but many of the previous games really feel like they should be in the top 10 for me. It’s surprising that neither FF8, FFX, or Ocarina of Time could get there. This process has taught me that creating this kind of force ranked list is very challenging. However, I think my top 10 games are all worthy of their slot. Apologies to the other greats who couldn’t quite get there.</p><h4>10. Breath of Fire: Dragon Quarter</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/258/0*2dY1uf9PPC1YEtdg" /><figcaption>This is a tiny tale of time</figcaption></figure><p>I love this game, and it’s my favorite Breath of Fire. It’s Breath of Fire V as far as I’m concerned. Apparently this game is somewhat reviled, especially among Breath of Fire fans including my friend Jeff, who hates it. Yes, it is exceedingly different from the rest of the series, it’s intentionally much more difficult, and it seems like I’m the only one who appreciates enforced time limits in games like this one and Pikmin, but that’s all pure upside for me.</p><p>I did play through the game multiple times, and I got to a D-ratio of 1/8, but I could never quite get the coveted dragon quarter. I also think it’s got a great story. I often think about when the lady is coming to capture you and trying to sweet talk you into coming along, and Odjn, the dragon in your brain repeats “She lies..She lies!”</p><blockquote>I did my best. I have no regrets.</blockquote><p>This was my senior quote, said by Elyon, the penultimate boss of the game. The noise Ryu makes when doing D-Charge in dragon form also plays in my head any time I achieve a victory… usually a more important one than the Gala “yus!” or Claude “hey!”</p><p>I just love the game’s mechanics, atmosphere, characters, and story. A sadly very under appreciated game that was essentially the end of the franchise. This is the game I was referencing in Quest 64 that has similar movement+turn-based RPG mechanics. They should make more games like that. I’ll always love you, Dragon Quarter. Maybe one day, I’ll achieve the true dragon quarter.</p><blockquote>Thank you for playing the game to the end!</blockquote><h4>9. Overwatch</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/0*EbLJlMSnVv6H_Coy" /></figure><p>This game is not only of incredibly high quality, it earns its spot here because my friends and I played it <em>a lot</em>. It’s memorable not just for the game itself, but for the entire culture surrounding it including the memes about Jeff Kaplan. This game also represents a bit of a fusion of two periods in my life since I played it both with my friend Mike, whom I met after college, and my college friends. It’s not certain to me that our friend group would be what it is if not for Overwatch.</p><p>In spite of all that, no one can deny that the game is great. It’s got a great cast of characters with good variety, very clean mechanics, and is just a joy to play. Of course, I have to point out that no one will ever play it again. A sad state of modern affairs when it comes to gaming.</p><h4>8. Super Smash Bros. Melee</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/248/1*qThxrAN2lAdYKh4-fVgVzg.jpeg" /><figcaption>Super… Smash Brothers… MELEEEEEE!</figcaption></figure><p>Of course, I had to include Melee as a game that I played a lot not only in high school, but Jeff, Bobby and I would play it pretty much daily in college trying to get through a rotation of characters. This is another game where consensus seems to somewhat agree with me as it’s still wildly popular and played competitively today.</p><p>This game has everything. Excellent single player, perfect multiplayer, and just about anything you could want out of this style of fighting game. It provides endless entertainment, and in my opinion, it’s still the best in the series.</p><h4>7. Romancing SaGa Re;universe</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/390/0*ImU-H3Bqh8atWKLy.jpg" /></figure><p>It took a while to come back around to the SaGa series, so why not have the whole thing at one time? This is the only mobile game on the list, and the only Gacha game. And yes, I did spend money on the in-game currency.</p><p>The SaGa series, also developed by Square, is sort of like the resentful little brother of the FF series. It’s been around pretty much the whole time — the original SaGa games were called Final Fantasy Legend in the US, after all. It steps away from the FF games by typically being more challenging and having more open ended mechanics that are often, in my opinion, misunderstood.</p><p>It might be kind of silly to love a game because you get to play as all of your favorite characters from other games (like Smash Bros., right?), but that’s besides the point. I played this game religiously almost every day more or less since its US release. It’s not amazing in terms of gameplay, but it’s sort of the perfect mobile game for me.</p><p>Sadly, the US version was discontinued in December of 2024, so this is another game that I’ll never play again. I’m unsure if the JP version is still going. I think this game makes my list very unique in that I don’t think most people would enjoy this game. It’s really for SaGa fans only, and I think there are very few of those in the US which might explain its ultimate downfall. It had a pretty good four year run, though. Well, Romancing Saga Re;universe, I’ll miss you and your awkward name and context that was impossible to explain to anyone.</p><h4>6. O2Jam</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*-4M7pcrwtwAf7XTw6hBMZw.jpeg" /></figure><p>I didn’t get to play much IIDX, so for all intents and purposes, this was my IIDX. I don’t know how many hours of O2Jam I actually played, but I think I ultimately got pretty good. I could at least finish almost every song in the game except for some of the absolute hardest, and the game isn’t very forgiving.</p><p>O2Jam was another game that was shut down long, long ago, although there are still some ways to play it, but I’m way too busy and rusty to get into that now. This game was just a big part of my life, and I still listen to a lot of O2Jam music to this day. The only other college friend I remember who played it was Beans, whom I’d almost forgotten about.</p><h4>5. SaGa Frontier 2 (and Unlimited SaGa)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/243/1*CHh9zRMXGQ5Mgjr4CxyP_w.jpeg" /></figure><p>When people would ask me what my favorite video game was, I would often say SaGa Frontier 2. This was a game that I beat and effectively 100%ed even though I never actually owned it until I got to college — as with Chrono Cross, this was a game that lived purely on my memory card in high school. I just used to rent it pretty much every weekend. I never played SaGa Frontier, which I think is the preferred one by SaGa fans, which is funny since Blockbuster actually had both, but once again, as a dumb kid, I figured the newer one probably had to be better. They’re actually very different games, as all SaGa games are.</p><p>This game has my favorite video game music of all time. I also love the art style, the story, the characters, the gameplay, the enemies, the difficulty, the victory celebration poses… just everything about the game. It’s pretty much perfect in my view, and I think I’m one of a very small number of people who would say that.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/432/1*pThZv7Z3Dy1xgKPeV2lkaw.png" /></figure><p>I actually have a playthrough of the entire game on my YouTube channel: <a href="https://www.youtube.com/watch?v=fLlQn4uGALQ&amp;list=PL7F65DC5CD4D6849F">https://www.youtube.com/watch?v=fLlQn4uGALQ&amp;list=PL7F65DC5CD4D6849F</a></p><p>Shoutout to the sequel, Unlimited SaGa, which is a good game in its own right. I never could actually beat the final boss either. For shame. Unlimited SaGa was, in my view, rejected by players and critics for the very mechanics that made the game unique and were created intentionally. Us contrarian SaGa fans can appreciate this, and I’m proud to be one of the few who would represent SaGa games so highly on their list, at least in the US.</p><h4>4. Super Mario 64</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/290/1*nHe08bg9-jT6oHNjFJhRqw.jpeg" /><figcaption>Dear Mario, please come to the castle. I have baked a cake for you.</figcaption></figure><p>I already told the first half of my story about Super Mario 64 and how I actually acquired it earlier in the article. Now for the second half of the story, which actually comes before: Super Mario 64 was my idea. Now I’m not saying that Nintendo actually stole the idea from me for use in a franchise that I don’t own, but when I walked into the PX Kiosk that was showcasing SM64 and saw kids crowded around and playing it for the first time, it looked exactly like the 3D Mario I’d always imagined in my head.</p><p>SM64 is to Mario what Ocarina of Time is to Zelda. It’s the proper evolution, and honestly, there probably will never be another game quite like it. This game has stood the test of time as it is still consistently worshipped. It’s been pretty much torn apart from the inside out and studied academically by both developers and players. It was able to achieve so much in spite of still being relatively simple. The genius Shigeru Miyamoto’s mantra for the game was that the most important thing should be that Mario was fun to play with, and like Reggie Fils-Aimé said, “If it’s not fun, why bother?” It was tough to get my family past the title screen sometimes, where you could literally play with his face, but the game’s movement and variety of Mario’s abilities is truly awesome. It’s a legendary game, and a cultural icon.</p><h4>3. Final Fantasy</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*askNEkff39KKz1l3" /><figcaption>I, Garland, will knock you all down!</figcaption></figure><p>I had to show some respect for the OG and put it close to the top of the list. In many ways, FF8, FFX, SaGa Frontier 2, etc. are better games than FF1, but credit where credit is due: none of them would exist without this bad boy, nor would I have played them. The seminal JRPG that really kickstarted the genre and defined game elements for it and video games more broadly that are still widely used today.</p><p>This game is important for me in many ways. It was the first RPG I ever played, which I think is actually quite cool. It taught me all about RPGs. It’s where I learned the term “hit points.” At the time for me, it was a unique and totally different kind of game that I really hadn’t imagined could exist before that point. RPGs shape a huge part of this list, and that’s really all thanks to FF1.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*ARBku7BDzQmKVAaTZDk9wQ.jpeg" /><figcaption>Yes, I have beaten a WarMECH</figcaption></figure><p>As with The Legend of Zelda, FF1 was more than just a video game, but a multimedia experience. The original FF1 was packaged with a manual that was taller and much longer than your typical NES manual. It actually included a walkthrough for the first half of the game. I think it’s pretty humorous that it implied that certain party compositions wouldn’t be able to finish the game, and that a party “going far” was an accomplishment in and of itself.</p><p>It also came with a huge chart that included a list of all of the game’s equipment and spells, and all of the enemies in the game along with their HP, strengths and weaknesses with lots of blanks for you to fill in as you figured them out, which I of course did. My parents laminated it for me so I could write on the chart with a marker.</p><p>I think this game doesn’t get quite the respect it deserves for the sequence breaking it allows. Once you complete the Earth cave, you can do the rest of the game in pretty much any order except for the final dungeon. I can’t even think of another game, let alone another RPG that allows you that much freedom until we got to the much more open world games of recent times, or unless you count unintentional sequence breaks through glitches and the like.</p><p>I’m still traumatized by the Marsh Cave, like all FF1 players. Of course the music of the game is iconic. I love the fusion of fantasy and sci-fi elements that’s endemic to the series. Getting to go into space for one of the dungeons was an unexpectedly fun journey. I did manage to beat this game as a kid too, even after several devastating losses to Chaos where he managed to cast CUR4.</p><p>This game has been a huge influence on my life and my tastes. It has deeply informed the way I think about video games. Tremendous respect for everyone who developed the game, especially the sole programmer, Nasir Gebelli. Yes, the game has quite a few bugs that break what were supposed to be core mechanics, but I think it makes the game somewhat charming.</p><p>I have the second half of a challenge I created for FF1 on my YouTube too: <a href="https://www.youtube.com/watch?v=GmOJUf2IgY0&amp;list=PLCD91750028EEB78F">https://www.youtube.com/watch?v=GmOJUf2IgY0&amp;list=PLCD91750028EEB78F</a></p><p>I could go on and on about this game, but I think a good way to wrap up would be to finish my story about the mall. Those paying attention would remember that there were three NES game cartridges left in the store as the NES was on its way out. I’ve already told you the first two: Kirby’s Adventure, and Mega Man 6. The third, and last? Final Fantasy.</p><h4>2. Dance Dance Revolution</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/0*aWDePDo4QVmMbC0K" /><figcaption>Come on let’s party; never stop the groovin’!</figcaption></figure><p>When the movie theater I worked at in high school got its Dance Dance Revolution Extreme machine, and I started playing it, I never imagined the impact it would ultimately have on the course of my life. For better or for worse, I spent way too much of my time in college playing DDR — mostly Extreme and Supernova at the Reitz Union, as well as In The Groove, the unauthorized spinoff, at the Oaks Mall, though this entry is for the series as a whole.</p><p>What can I say? I love DDR. I love the game, and I love the music. There are way too many memories to consider. Most importantly, I met some of my friends who either played DDR or who were friends with people who played DDR, particularly Alfred, Mark, and Jeff.</p><p>DDR also probably wins the award for game that I’ve spent the most money on… probably by a pretty wide margin. I love rhythm games, so it’s only appropriate that the best ever rhythm game make it to this spot on the list of greatest video games ever for me.</p><p>I still see a DDR machine occasionally, and I’ll usually play it if I have a chance. It’s no fun getting old where your brain knows what moves to make, but your body can’t do it. Maybe I’d be in better shape if I could play DDR consistently again. Well… not to get depressing. I still listen to DDR music all the time. I love you, DDR, and I always will.</p><h4>1. Balatro</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/802/1*YE-TBDxNZSNhhhYNDS7nEA.png" /></figure><p>For quite a long time, Balatro was my religion. I couldn’t stop playing this game, and it’s impossible for me to say that this isn’t the greatest video game that’s ever been made. Developed by a single genius, Localthunk, Balatro has everything I could ever want in a game. It’s simple and intuitive but also incredibly deep and fulfilling with a broad range of scaling difficulty. Everything about this game is perfect, from the music, to the sound design, to the mechanics. Big number go up.</p><p>Balatro also got me through a pretty tough period in my life where playing it was a merciful distraction in a challenging world. In an era of endless Roguelikes/lites, Balatro simply stands apart. Thus, the number one slot for my greatest video games of all time list goes to Balatro. I have plenty of Balatro videos on YouTube as well. Thank you, Balatro. You’ve earned it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7327739f7463" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Managing Picky Eating]]></title>
            <link>https://medium.com/@ExplosionPills/managing-picky-eating-3b1392758d21?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/3b1392758d21</guid>
            <category><![CDATA[pediatrics]]></category>
            <category><![CDATA[children]]></category>
            <category><![CDATA[picky-eaters]]></category>
            <category><![CDATA[picky-eating]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Tue, 30 Dec 2025 07:09:59 GMT</pubDate>
            <atom:updated>2025-12-30T07:17:18.087Z</atom:updated>
            <content:encoded><![CDATA[<p>As the parent of a now six-year-old, I’ve been very fortunate that my daughter has never really been that picky of an eater. She’s definitely gone through phases, as I’m sure all children do, but I rarely struggle to get her to try new foods or eat what I serve for meals. While I feel that I’ve done a lot right in this regard, I’m always reminded of my now erstwhile father-in-law’s advice about raising children:</p><blockquote>Parents take too much credit and too much blame for their children.</blockquote><p>I’ve seen a lot of dialog around picky eating lately, so I was inspired to write this article about my own experience on feeding young children. I am not any kind of child specialist or health professional, so this is merely the advice of a layperson gleaned from personal experience and informed by the opinions of pediatricians I’ve met and articles I’ve read. Be sure to consult your own professionals and make the decisions that are best for you and your children.</p><p>Parenting is hard. It’s not that simple to follow advice that may seem straightforward, even if it’s in an area you’re seeking to resolve. Nowadays, we are all busy with highly stressful jobs, financial challenges, social obligations, extended families, and the desire to live our own lives as individuals with our own hobbies and interests, not to mention the need for rest. Especially during school days, our time with our children can be very limited. Given the amount of homework I’ve seen kids getting, I can see why parents wouldn’t want to spend much time having a debate about meals and proper nutrition at runtime.</p><p>Thus, my goal is not to put anyone down or shame anyone. We all have our triumphs and our faults as parents and as people. What works well for some parents may not work for others. My advice also doesn’t consider other difficulties such as mental or physical disorders that may further complicate meals and make children pickier. This is mostly geared towards well children. I also know that some advice can appear easy on the surface but be very hard to put into practice. For example, I don’t think that “stop being depressed” has ever been useful advice.</p><p>I can only hope that some parents who have self-recognized issues with picky eating in their children can find some tidbits in this article that can work for them. I hope it relieves one additional stressful point in their lives. I hope they know that even if they’re not perfect at it, and they make mistakes with it, that they shouldn’t give up. Parenting was, is, and will always be challenging, and we’re doing our best. You can do it.</p><h3>Why Address Picky Eating?</h3><p>I think we should start by proposing the null hypothesis: that it doesn’t really matter if a child is a picky eater or not. The effects of picky eating are both broad and deep. If you can help your child learn to be less picky of an eater, it will have tessellating effects that improve their overall quality of life. Picky eating can cause at least some of the following common issues:</p><ul><li>Challenges at home mealtimes that create delays and stress</li><li>Eating challenges when away from home</li><li>Social challenges when eating with other children and families</li><li>Nutritional impacts</li><li>Greater issues with confidence</li></ul><p>There are many more, and we could break these down, but I also have to assume you wouldn’t be reading this article if you thought there was no problem with picky eating. Understanding this moves us in the right direction towards addressing picky eating. Finally, I have to assume that these challenges become harder and harder later in life and into adulthood, so the earlier they can be addressed, the better.</p><h4>Causes of Picky Eating</h4><p>There are a lot of underlying causes of picky eating. Many of them happen simultaneously.</p><ul><li>Underlying health issues</li><li>Children’s natural avoidance of new food/things</li><li>Children’s natural dislike for unusual or particular textures and flavors</li><li>Desire for routine</li></ul><p>It is clear that Mother Nature is not entirely on our side when it comes to trying new foods. In many cases, we need to address these root causes of picky eating and either resolve them or otherwise work around them. Yes, a routine is great, but the routine of eating the exact same thing every day may be quite limiting. Now that we’ve discussed the <em>why</em>, let’s get into the <em>how.</em></p><h3>Addressing Picky Eating</h3><p>Before we get into any practical ideas, I think the right mindset is important. When it comes to raising children, I don’t think that their development should be seen as a challenge to overcome. I also don’t think you can or should “make” them develop in a certain way. I think the approach should be helping them grow rather than “making them less picky.” If you have a specific goal in mind for your child’s development, this can lead to a lot of issues for both you and the child which creates more stress and disappointment. If your child doesn’t achieve a milestone, this is not a failure for either of you.</p><p>Once you are in the right mindset, you can start putting some ideas into practice. This is a process.</p><h4>You’re In This for the Long Haul</h4><p>First, you have to accept that this will be a daily process. Meals are something we do multiple times every day. There needs to be a level of commitment — not to persist in attempts that go nowhere, but to recognize that growth can be slow, and it is rarely linear.</p><p>I’ve seen pediatricians say that you may need to offer your child unwanted food as many as 17 times before they will try it. That is to say: don’t give up. Just because your child won’t eat something one, two, or even (apparently) sixteen times doesn’t mean you shouldn’t keep offering it to them.</p><p>You can put it on their plate along with other foods they enjoy. Sure, they may not touch it at all, but we need to start somewhere. If you don’t even give them the opportunity, then they may never try it.</p><h4>Structure Eating Times</h4><p>This one is personally the most challenging for me, and I’m sure that will apply to many of you. The more structure you can have around eating and mealtimes, the better it will be for your children’s eating habits — not just in terms of picky eating, but in general.</p><p>This refers to all eating times. Of course there is the traditional snacktime after school, but if you have a picky eater, this may not be helping (more on that later). I’m not saying to eliminate snack times entirely, but you should have a plan around when snacktime happens, how long it takes, and what is eaten. You probably don’t have to get down to the level of calorie counting, but it should happen at roughly the same time and be roughly the same amount of food.</p><p>This structure applies to all meals, and not just snacks. For school days, I think breakfast is easy, and lunchtime is somewhat automatic. There’s an additional consideration if you’re packing lunch whereby you want to make sure your child has a meal of a similar size each day so that they are not overly hungry or full after school. I’m sure your child’s appetite is not consistent every single day, so this is more about finding the right balance over time rather than getting it perfect day-to-day.</p><p>Overall, consistency in terms of timing and portions are most important. Practice getting into this routine for your family. If you are not already doing it, you may need to put in some effort before implementing some of the other ideas. If you’re already consistent about how you structure meals, you have a big head start.</p><h4>Mealtime Should Be Shared</h4><p>It’s important to have at least one shared meal time each day where the family sits down together with no distractions to eat and waits till everyone is finished or asks to be excused. Typically, this is dinnertime. If you can have a shared breakfast or lunchtime together too, or even snack, that is great, but that is challenging or not possible for a lot of families, myself included. Dinner tends to be the most straightforward shared mealtime.</p><p>This means that not only is the time shared together, the food is shared together. Serve one meal for everyone. This reduces the expectation your children may have that you will cook an additional meal specifically for them. This not only helps with picky eating, but it reduces your own workload and stress.</p><p>If you’ve already been making extra meals for your children, it may be a bit of a challenge to switch to a single meal, but it will help if you make the effort to get into this routine. Your children will adjust. At the very least, you should tell your children that once you’ve served dinner, the kitchen is closed. If you’re making box mac &amp; cheese after they refuse to eat the dinner you’ve cooked, they end up eating later which can affect both their eating and sleeping cycles, not to mention it’s extra work for you. I’m certain you’d do anything for your children, but sometimes, resentfully giving in is bad for both of you.</p><p>Seeing your children eat the same food as you also builds trust. I have quite a few memories of my daughter being skeptical about something until she watched me eat it. Then, there was no problem. That’s not foolproof, but at least it demonstrates that the food can be trusted. Of course eating a shared meal makes for a great bonding experience, and you can learn about your child’s tastes which can help plan meals in the future — in addition to learning more about them in general.</p><h4>Embrace Hunger</h4><p>They won’t starve themselves… or so I’m told. Hunger was the default for humanity for most of our history. We are very fortunate that malnutrition is largely a thing of the past, especially for those of you who may be reading this, but that doesn’t mean that we should never be hungry. The idea that we need to constantly satiate our children’s hunger or feed them whenever they ask is wrong.</p><p>This takes some discipline both on the part of us and our children. If you’re used to handing them a snack whenever they ask, it may take a long time and a lot of effort to break that habit. It may be met with arguing and even tears, but over time, your child will learn to live with a little bit of hunger. It can be painful as a parent to have our child experience any negative emotions or feelings, and hunger can be one of the worst, but think about it rationally: this is probably on the order of a couple of hours or less. That’s not nearly enough time to have any impact to their nutritional needs.</p><p>You should try to stick with mealtimes as consistently as possible. This means no additional snacking, and no food after dinner or snacks later at night. If your child is consistently very hungry at certain times after a long period, and they are not adjusting, you may need to make further changes in terms of meal times and portions. Particularly, if your child is finishing dinner and still hungry, you might want to increase portions, change ingredients, or manage the speed at which they’re eating. There may also be other underlying health issues to keep an eye on. Keep in mind that a 500 calorie peanut butter sandwich is incredibly filling, whereas 500 calories of candy isn’t filling at all, so it may be a question of what they’re eating rather than how much.</p><p>Ultimately, hunger works to your advantage. If your child is hungry at mealtime, they’ll be more amenable to eating foods that they normally don’t favor. Think of it this way: if you’re stuffed, even the most delicious pastry you can image would disgust you. If you’re starving, you’ll eat just about anything. No, I’m not suggesting that you intentionally starve your children, but I am saying that you don’t always need to hand them a granola bar midday just because they’re complaining about being hungry.</p><h4>It’s a Family Affair</h4><p>Building on the idea of shared mealtime, addressing picky eating should happen as a family. This means communication and assent across the board. You should even speak to your young children if there is going to be a change to your routine. They should be an active participant and help in making decisions. Once your child is old enough, you should ask them for meal suggestions as well. Giving options to children is often seen as a good thing, so you can present a couple of options of meals that include foods that are not preferred. If your child is anything like my daughter, they may respond with a third option like “mac &amp; cheese,” so its up to you how you want to handle that.</p><p>Mealtime should be a time of joy, not stress. If you find it is more of a stressful battle than a joyful time together, you may consider making some adjustments. I’ll reiterate that parenting is hard. If dinnertime for your family is more on the side of stressful battle than joyful get-together, this isn’t a failing on your part. If it’s not working out the way you want or expect, that just creates more stress.</p><p>The point is that your goals for meals should be a positive experience overall and not a negative one. See where you can adjust a little at a time, and figure out what works for you and your family. One thing I haven’t addressed is whether you yourself are a picky eater. I have very little advice on that, but I can say that if you’re limiting what you eat, you’re going to limit what your children eat. See if you can expand your horizons and find new foods that your entire family can enjoy. You don’t have to do anything crazy, and you can start a little at a time. Eating out and trying a new cuisine can be a fun way to approach this too.</p><h4>Food Is to Be Enjoyed</h4><p>We all want our children to get the best nutrition that they can, so that includes eating a lot of good protein and vegetables. I think that many of us have memories of eating something distasteful because it was supposedly good for us. It might have even traumatized us in a small way — I know some adults who won’t eat certain vegetables that were forced on them as children. I always hated fish, and I only started eating it consistently in my 30s.</p><p>I want to reiterate what I said at the start of this article: not all parents or families have the time or ability to experiment in the kitchen. However, I would suggest to those who are ignoring it to put in a little effort at a time. Your child might turn their nose up at green beans from a can, but haricot verts sautéed in a little butter, seasoned with salt and garnished with thyme may be a big hit.</p><p>I’m fortunate that my daughter loves Brussels sprouts and beet root. She’ll happily eat them roasted with no accouterments. However, a pinch of salt and a dash of Balsamic vinegar almost guarantees a clean plate. I’m not sure why the idea that healthy food tastes bad is so pervasive. Food is meant to be enjoyed, so prepare it in a way that you and your children enjoy. Children may have simple palates, but this can work to your advantage. Adding strong savory, sweet, salty, sour, and even spicy notes to food makes it more palatable and can provide more nutrients. Even one small change or additional ingredient can make a huge difference. It doesn’t have to be complex or time consuming. It may be that some children prefer bland food, but given the opportunity, you should experiment with the flavors that you and your family enjoy.</p><p>This also means that food shouldn’t be a reward or punishment. The “two more bites, then you can have dessert” idea may be a harmful one (I do this with my daughter too!) I think that encouraging our children to eat a little more of what is good for them is probably okay, but that it’s not a good idea to force them. My mother had this philosophy, which I also follow: you don’t have to eat if you’re not hungry. I wouldn’t force your child to clean their plate. That might mean they don’t get dessert, but that shouldn’t be a <em>punishment</em> for not finishing their food, but a practical way to address their approach to the meal. I think you have to approach this on a case-by-case basis, and it really depends on you and your child.</p><h4>Nobody’s Perfect</h4><p>We are man, not machine. You will never perfectly execute on your plans to address picky eating. Thus, you should forgive yourself in case you make mistakes or don’t always follow the plans you’ve set out for yourself. This applies to picky eating in particular and parenting in general. We’ve all ordered takeout because we were too tired and stressed. I once got my daughter delivery pizza two nights in a row.</p><p>You also need to apply this line of thinking to your children. Maybe you’ve come up with a meal schedule or plan. Maybe you’re practicing new cooking techniques and using different ingredients. Maybe after all that, your child isn’t budging or has become even more resistant. Your child is an individual, and you know them better than anyone else does. You need to do what works for them and for you. If your ideas aren’t working for them, some adjustments may be needed. This isn’t a failure on anyone’s part. Remember: food is to be enjoyed, and at the same time, we want to provide our children with excellent nutrition and a variety of life experiences.</p><p>A stressful mealtime creates an environment where picky eating can thrive. If your child is stressed, they’ll prefer “comfort” foods. Those might be okay from time to time, but you may want your child to experience a wider variety of foods that provide a greater expanse of tastes and may be more nutritious. If mealtime is a fun, enjoyable experience, and not a challenge, it might be easier for them.</p><p>Overall, I hope this advice helps any parent or family who might have an issue with picky eating one way or the other. I love cooking, and I love food, so I want every family to be able to enjoy their mealtimes in a healthy and enriching way. If you’re committed to making a healthy change for you and your family, know that I believe in you. Remember: you can do it!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3b1392758d21" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Avoid the `any` Type in TypeScript]]></title>
            <link>https://medium.com/@ExplosionPills/avoid-the-any-type-in-typescript-aba2496d1e6a?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/aba2496d1e6a</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Wed, 13 Mar 2024 16:04:47 GMT</pubDate>
            <atom:updated>2024-03-13T16:07:15.784Z</atom:updated>
            <content:encoded><![CDATA[<p>TypeScript emerged much longer ago than I can really remember, and it has been several years since it has encroached on JavaScript as a web development standard. Many web and JavaScript-based frameworks now use TypeScript as a default including Angular and React Native, and some have been doing so for quite some time. TypeScript is a JavaScript superset, as they say, and if you’re not on the TypeScript bandwagon already, I’d recommend you jump on board. That’s all a bit out of the scope of this article, though. Let’s dive in to my discussion about the any type.</p><h4>Why Have `any` *Any*way?</h4><p>When TypeScript was first created as a type safe version of JavaScript, there were many concessions that needed to be made for backwards compatibility with existing JavaScript programs. One of these was the need for a type that could be used in place of types that could not be inferred. Hence, the any type was created. I don’t know that much about the history of the any type, but as its name implies, it can be used for compatibility with any other type, no matter how complex. It is a simple way to ignore type checking while pretending that your declaration is typed.</p><p>The creators of TypeScript knew that there was no way people would be willing to rewrite some 100,000 line+ JavaScript programs to be type safe before they could be imported into new TypeScript programs. Moreover, many of these JavaScript modules were public libraries that were being used by thousands of third parties. If maintainers of these libraries were not willing or able to implement type safety, this would put this burden on each of these third parties individually… a cardinal sin in the development world.</p><p>While I can’t be certain how much typeless JavaScript code is being used alongside TypeScript in our world, I have to imagine it’s still substantial. This is in spite of the tireless work and strides we have made across countless first and third party programs to be rewritten or built for type safety. Thus, any has continues to serve a purpose and is unlikely to be something TypeScript can or will want to remove <em>any</em> time soon. We can debate about the approach to using any or the fact that it is leaked from an internal quirk for handling typeless third party programs into first party TypeScript code, but that’s also outside the scope of this article and probably above my pay grade.</p><h4>`any`&#39;s Curse</h4><p>What gets to me is that I continue to see any written explicitly in new code. This compromises the benefits of TypeScript. While I understand the need for a quick turnaround in development projects, especially if its main purpose was to introduce TypeScript quickly into a new project with a strangulation plan to make it more and more type safe as development goes on, I think it would be difficult to justify the explicit use of any as a type in new first party programs. I could muse about why this happens, whether it’s ignorance, laziness, or inertia — I’m not accusing you anyers of anything specific — but I think a better approach is to suggest my reasoning and my alternatives.</p><p>Legacy code that was using any may make introducing type safety difficult. To do so would require consideration about the existing data models and their types on top of whatever other compatibility changes may be needed. However, type safety improves quality: quality of user experience, and developer quality of life. As a brief aside, <em>quality</em> in this sense means that the thing does what you expect it to do: the program will run according to developer and user expectations.</p><p>Take this example:</p><pre>class AssetComponent {<br>   assets: any;<br>   <br>   getAssetId = () =&gt; this.assets?.[0]?.Id;<br>}</pre><p><em>For those unfamiliar with optional chaining, you could similarly write this as </em><em>this.assets &amp;&amp; this.assets[0] &amp;&amp; this.assets[0].id ? this.assets[0].id : null, and there are other ways to write this, but that’s I’m scope creeping this article again.</em></p><p>Ignore the awkwardness of this statement; this is taken from a real-world example. Now this may all seem well-and-good, but there is an issue that is very difficult to spot. Do you see it?</p><p>No you don’t, because there was no way for you to know about it. The data we are getting for assets includes a property id, <em>not </em>Id. JavaScript property names are case-sensitive, as they should be. This is tough to spot, but if you had a well-defined type for assets, it wouldn’t matter. TypeScript would spot it for you.</p><h4>Avoiding `any`</h4><pre>interface Asset {<br>  id: string;<br>}<br><br>class AssetComponent {<br>  assets: Asset[];<br>  ...<br>}</pre><p>Asset may have other properties as well. It’s up to you and your project team to determine whether your declaration for Asset needs to include all possible properties it could have or just those used by your application. If you are also using TypeScript on your server, or you have some data model declarations that can map to TypeScript interfaces, you can maintain those to improve compatibility between your TypeScript code and other programs.</p><p>This is not all sunshine and rainbows, of course. If Asset has 200 properties, you either have to make some of them optional, or if you manually create an Asset somehow, e.g. for testing, you will have to declare all 200 properties when you do so — even if most of them are useless in your specific situation. <a href="https://www.typescriptlang.org/docs/handbook/utility-types.html">Utility types</a> can help with this in some cases, but this creates more overhead as well. When you consider all of this additional work to make a program type safe, any starts to look appealing, but you should still resist the temptation. After all, other type safe languages don’t have this any option, and the risks and pitfalls outweigh any potential time gains.</p><p>I alluded to the strangulation pattern earlier. I don’t expect you to go through a 100,000-line app for a project you were just put on and systematically create data model declarations for everything and make all of the existing code compatible with these. Instead, I’d adopt these tenets:</p><ul><li>For code you touch, remove any and replace with an appropriate type. If this type does not exist, create it.</li><li>Never write any as a type declaration. Reason about what type to use. Create a new type, if needed. You can also use existing custom types, built in types, or, my favorite, rely on type inference.</li></ul><p>Now, you’re not going to create new types willy-nilly. You should check the source and with your team as to whether the corresponding type already exists. These types will likely also apply across repositories. In many cases, the most complex types are those that come from persistence and APIs, so the data model should be defined and shared across repositories in the same project. You should have a systematic way for declaring data types that avoids duplication. Having a well-organized code base where reusable type declarations are easy to find and identify can help avoid this as well.</p><h4>The Dark Cousins of `any`</h4><p>TypeScript also allows you to declare object types with arbitrary properties:</p><pre>interface Asset {<br>  id: string;<br>  [propName: string]: any;<br>}</pre><p>So any shows up here again, and it’s even in TypeScript’s official documentation on this. I’d suggest you use the unknown type here. If you’re trying to use a property of Asset you haven’t explicitly declared yet, you would get a type error for unknown, so then you know to go update your Asset interface with this other property that you want to use with an accurate type. With any, this wouldn’t be so, but that might never even be a problem if you happen to be using that property properly. That makes any very convenient… until it isn’t.</p><p><em>For more detail on this, see an example I put together: </em><a href="https://stackblitz.com/edit/vitejs-vite-v9rdwf?file=src%2Fmain.ts"><em>https://stackblitz.com/edit/vitejs-vite-v9rdwf?file=src%2Fmain.ts</em></a></p><p>You can also have an array of any type, any[]. This is just as bad as any, and it implies that the array is not homogeneous. I suppose there may be some use case for that, but not for any project I would want to work on. Expanding on the example above:</p><pre>class AssetComponent {<br>  assets: any[];<br>  getAssetId = () =&gt; this.assets?.[0]?.id;<br>}</pre><p>This achieves very little except that the optional chaining for the zeroth array element is now redundant since this type declaration implies that assets is always an array, even if it may be empty. The optional chaining check done by [0]?. will return undefined if the array is empty, so this could be written as this.assets[0]?.id. Complicated? Maybe that’s why people like to lean on any.</p><p>At any rate, this doesn’t help you if you mistyped Id or ID.</p><h4>It’s Not All Sunshine and Rainbows</h4><p>…as I said before. Just because you put in the effort to define and use types doesn’t mean that you won’t run into runtime issues or that your code will be correct. As with the rest of the universe, software development is cold, uncaring, harsh, and unforgiving. Let’s expand on our previous examples by applying our new Asset type.</p><pre>interface Asset {<br>  id: string;<br>}<br><br>class AssetComponent {<br>  assets: Asset[];<br>  getAssetId = () =&gt; this.assets[0]?.id;<br>}</pre><p>Do you spot the problem? I think it’s more likely than my previous quiz, so kudos to you if you did. Just because you say assets is an array doesn’t mean that it’s going to be at runtime… particularly if it’s populated by a response from some API.</p><p>If it’s not, your program will crash when it attempts to access the zeroth element of something that’s not an array with the cryptic</p><blockquote>Cannot read properties of undefined (reading ‘0’)</blockquote><p>…and you’ll curse all the time you spent reasoning about your program and trying to make it type safe, all the story points you estimated towards creating types for your data models, and go back to using any.</p><p>There are a lot of ways to handle this that will depend on your situation, such as assets: Asset[] = []; or assets: Asset[] | null;. I prefer to avoid any kind of conditional checks where possible, so I prefer initializing to an empty array and providing a baseline array or “null object” where it may be needed, <em>but I’m scope creeping the article again</em>. Of course, you have to <strong>know</strong> and <strong>remember</strong> to do this when you’re declaring your types and using them as properties. This will come with experience and practice. I can’t guarantee that your programs will be correct, but I can guarantee that you won’t learn to make them more correct if you keep using any.</p><p>There is another potential problem that we haven’t discussed in enough detail yet. Calling back to what I said above, just because you say that a type is something doesn’t mean that it actually will be at runtime. Say for example, you had declared id: number. Just because you say Asset[&#39;id&#39;] is a number doesn’t mean that it actually will be. If your API is returning you asset IDs of 1234b, or even worse, 01234, this might lead to other mysterious issues, and you’ll have to have a talk with your team. At the very least, having an incorrect type shouldn’t lead to runtime issues, but if you’ve been using assetId: number all over the place in your code, you’re going to have a breakdown when your project manager gives you a feature that requires you to do string manipulation on assetId. It would be correct to use assetId: Asset[&#39;id&#39;], but let’s go one step at a time. I at least want you to stop using any.</p><p><em>By the way, ID properties like this should always be strings.</em></p><p>Just keep in mind that <em>any</em> time you’re using any, you’re creating more work for a future developer who will have to do additional work when they hit runtime issues that could have been avoided by type safety or they’ll have to spend additional time updating the program for type safety. Oh, and that developer is likely to be you. Taking the time to reason about your programs and improve their type safety will result in a better experience for users, your team, yourself, and improve your development skills overall. If you think it will take too much extra time, I would argue that it probably won’t take as much as you think. Your types don’t have to be perfect, but any is the <strong>worst</strong> possible outcome for type safety. Avoid it at all costs!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aba2496d1e6a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Developing a Software Feature at Different Levels of Mastery]]></title>
            <link>https://medium.com/@ExplosionPills/developing-a-software-feature-at-different-levels-of-mastery-21e519d775c2?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/21e519d775c2</guid>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Fri, 14 Oct 2022 19:02:36 GMT</pubDate>
            <atom:updated>2022-10-14T19:02:36.812Z</atom:updated>
            <content:encoded><![CDATA[<p>I recently had the chance to be involved in some feature development which required a lot of code writing and code reviewing. I had the opportunity to give feedback on code that was written by developers at several different levels. This pushed me into analyzing how developers at different levels may approach problems, reason about code, and write code. I thought it might be useful to go through a couple of small coding problems and showcase how a developer might solve them at several different levels.</p><p>There is no strict definition for different levels of developer. Different individuals and organizations have their own definitions. The point of these examples is not to say that you should expect a developer at the stated level to produce the code in the accompanying example, but rather than you can think of the code itself as being at that level. More junior developers may produce masterful code, and senior developers can certainly produce naive code. More senior developers naturally have gained more knowledge associated with the platforms they have spent more time with, and they have more experience in general having encountered more and different kinds of problems.</p><p>The tenets of a senior developer include producing cleaner code; understanding their work more holistically, and how their changes may affect other developers as well as users; focusing on code readability rather than ease of writing; analyzing their work at multiple levels of resolution simultaneously; and considering cross-cutting concerns and nonfunctional requirements that may not be an explicit part of the requirements of their specific task. A novice developer would not have any tenets as they would not have had any time to cultivate them or even had any exposure to them. Their code may be unclean, and they may only focus on the lowest resolution of the feature they are working on in order to get it done and meet their acceptance criteria. None of this is to say that developers at all levels can’t make contributions and can’t grow, or make mistakes for that matter. It is the responsibility of senior developers to propagate these tenets in other developers through mentorship and by example. In these code examples and explanations, I hope to showcase achievement of these tenets and more.</p><h3>An Explanation of the First Problem</h3><p>This is an Angular application. Some domain knowledge of JavaScript, Angular, RxJS, and Promises will help to digest the examples, but I will try to genericize as much as I can.</p><p>The feature requested is for an authorized user to click on a link on one of the pages in the app. This link will open a separate webapp, the “Game” webapp. We need to pass some user identification to the game, so we also have to call a service to format this identification and pass it to the query string in the URL of the game. To summarize:</p><ol><li>Logged-in user clicks on Game link.</li><li>User’s identification is used to retrieve a formatted token for the game.</li><li>Game webapp opens with the user’s identification in the query string.</li></ol><h3>Solutions at Various Levels</h3><p>This will attempt to walk through an initial implementation at the junior level. Each subsequent implementation is an evolution of the first one that is built upon what was existing and attempts to be cleaner. The junior implementation in the example is also buggy — this is not to say that junior developers’ code is inherently buggy, but the bugs in the example result from a lack of considerations a developer might have if they are less experienced or knowledgable. Some code is omitted for simplicity.</p><p>I’ll just make a blanket statement that all of my feedback is debatable. Whether or not it is correct or clean will depend on particular teams and their conventions. I will justify my reasoning behind my feedback in each instance, but there is still a margin for debate about correctness, and there may be other areas to consider that I missed.</p><h4>Junior Level</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/74f49dee0c500edf3dffa05705f9c36f/href">https://medium.com/media/74f49dee0c500edf3dffa05705f9c36f/href</a></iframe><p>There are several potential issues with the code, so I will point out individual lines. To be charitable to the junior developer, a lot of this code was probably referenced from existing examples that may have been working properly for their use cases but are not applicable here. Unclean code that was written in the past can also propagate when it is referenced, and eventually, this referencing code may also be used as a reference.</p><pre>export const GAME_WEB_FORMAT_URL =&#39;/#{session}/game/format&#39;;<br>export const GAME_WEB_APP_URL = &#39;https://qa.game.com&#39;;</pre><p>It is not unusual or a bad practice to have constants representing API endpoints. These values effectively represent different data types and should be named to reflect this. GAME_WEB_FORMAT_URL is not a URL, but a path. The PATH suffix could be used, but it can be excluded if the convention of API endpoint path constants is to exclude PATH as a suffix. WEB also does not make sense here; this may have been added because GAME_WEB_APP_URL has WEB in it since it is a separate webapp. I think that GAME_TOKEN_FORMAT is a valid name, but I will point out that I would prefer this be written in a RESTful fashion rather than include a verb or action as part of the path. If we’re all in on action naming, FORMAT_GAME_TOKEN might be a better name. It depends on the naming conventions of the other paths too.</p><p>GAME_WEB_APP_URL is aptly named, but the notice that it is hard coded with qa in the name. This implies that this URL links to the QA environment. Rather than being hard coded and included in the constant file for app URLs, this should be an environment property that is set at build time.</p><pre>this.urlBuilder.build(SPECIALS_WEB_FORMAT_URL, {<br>  sessionId: this.sessionId,<br>  listId: this.listId,</pre><p>This is difficult to catch given the example and, even in the context of the application, it would be difficult to catch. Note that GAME_WEB_FORMAT_URL = ‘/#{sessionId}/game/format’; has a sessionId path part, but it does not have a listId path part. URL builder may have no problem accepting unused path parts and will probably just ignore it, so this unnecessary property may not have an impact on the app at all. It is possible that the developer referenced another instance of urlBuilder.build that was using the listId, or both the listId and the sessionId, and assumed that it was necessary to include both. As long as this.listId is a valid property of the ProfilePage, there are no type errors or runtime errors to be caught; this is just a semantic error of including extraneous information.</p><pre>const token = userId?.token;<br>if (token) {<br>  this.formatUserId(token).subscribe((id) =&gt; {<br>    if (id) {</pre><p>These variables can be named more clearly. I would suggest userToken and formattedUserId.</p><p>It appears that getUserId can return the user’s information, including the token property, or undefined, so the use of the userId?.token here is valid. The conditional check is required since token can be undefined, but the code does not cover the conditional branch for when token is undefined, so this check is only done to appease TypeScript. Instead, this could be short-circuited, (although this also creates a conditional branch). A similar redundant check is done on the id property of the response.</p><p>We will discuss how to handle this more in the examples for the other mastery levels. In the meantime, I’ll point out that it may not make sense to have the getUserId return undefined and instead throw an error if the userId is not available. Practically speaking, the code should not attempt to access getUserId under circumstances where the user cannot be identified. Whether or not this is likely to happen depends on many factors of how the application is structured that are not clear in this example. The ProfilePage relates to a user’s profile, so it should be inaccessible without authentication. Thus, I believe it makes more sense to have getUserId throw an error rather than return undefined. Either way, the application needs to handle this error condition, and the conditional check with an empty branch does <em>not</em> handle the condition.</p><pre>const userId = await this.userService.getUserId();<br>const token = userId?.token;     <br>...</pre><pre>this.formatUserId(token).subscribe((id) =&gt; {<br>...</pre><pre>async formatUserId(token: any) {<br>  return from(this.http.get(</pre><p>formatUserId should be moved to something like GameService. The Pages (ProfilePage) should not use the http service or make API calls directly. This code is also combining and using two synchronization methods at once: Promises and Observables. It would be cleaner to select one or the other. This may be a result of a junior developer referencing code that uses Promises in one area and Observables in another, or perhaps it was already combining them. The mixing may be a result of incorrect software design or incorrect implementation of the software architecture.</p><p>I am a proponent of Observables as they have advantages of composability and cancelability, but they are best used holistically, so it would require some refactoring to use them entirely here. You should also avoid explicitly using subscribe if you can and rely on features such as Angular’s async pipe or ngrx Effects for managing Observable subscriptions. This would of course require refactoring that would be difficult for a junior or even senior developer to do without guidance or collaboration in this example.</p><p>There is also no try / catch wrapping anything in getSpecialsApp, so there is undefined behavior and potentially an app crash if any of the code throws an error, especially if any of the awaited promises are rejected.</p><pre>console.log(response, &#39;got id&#39;);<br>...<br>console.warn(&#39;Failed to format token&#39;);</pre><p>There is a lot of space to debate whether or not console messages should be included in source. The console.log may be useful for debugging, but it is cluttered and unnecessary to deploy with the app. I am of the opinion that web apps should never include console.log messages. Using console.warn or console.error may be useful for debugging in higher environments at times, so they have their place, but I don’t think there is a reason to use warn instead of error here. It is possible that the developer saw console.warn being used elsewhere and used that as a model here.</p><p>Moreover, these errors are better intended for users to indicate a failure, and users will not see console messages (putting aside developers as potential users). Using console when catching errors can be useful for debugging, but a more robust error handling system that takes into account informing users and allowing for recoverability where possible needs to be part of the software architecture and implemented at a higher level that can be used throughout the app. My argument would be to remove these console messages as we have no plan for using them. It is likely that we will have to implement some other error handling or messaging to meet the feature requirements. My main issue with using console is that I often see it used as a replacement for functional error handing that would notify the user.</p><pre>const url = [SPECIALS_WEB_APP_URL, id].join(&#39;?&#39;);</pre><p>This may be a tough one to catch, but this literally appends ?&lt;formatted-id&gt; to the URL, so this may look like https://qa.game.com?formattedIdHere. If formattedId is an Object, and not a string, this would be <a href="https://uat.special-app.com?">https://qa.game.com?</a>%5Bobject%20Object%5D, which is not intended. Even if it were a string, it doesn’t include the query parameter name. This may be difficult to catch even in testing if the URL still works since the app will probably ignore this useless query string. This may have been coded due to a lack of information in the requirements which should include the query string parameter name and the data type of the value and perhaps even an example.</p><pre>async formatUserId(token: any) {<br>...<br>map((response: any) =&gt; {</pre><p>The any type should be avoided in TypeScript as it defeats the purpose of having strong typing. Designing types is very difficult, so it’s not surprising that a developer may fall back on any in order to complete their work, especially when the values may be used in isolation such as getting a property from the response body. There is a cross-cutting opportunity to define types that match API responses as these can be shared by both the client and server code, especially if they both happen to be written in TypeScript. If the code bases are sharing types and if the server’s definition changes, this will result in a type error on the client that can be caught and easily corrected. When using any, this error may go undetected indefinitely.</p><p>any also tends to beget any. Since the token that is passed in has the any type, this will be passed an argument to urlBuilder.build for a query parameter, but this should be a string. If token is not actually a string, this error will only manifest at runtime even if urlBuilder.build is using accurate type definitions. If some other operation is required on the token in the future, the resulting data type may also default to any which may cause similar issues. Even though these problems seem unlikely and the apparent impact is small, these are the types of issues that can be major headaches to debug further and further down the line. Taking the time to use accurate types up front can save teams from a lot of strife. At least, it makes the code easier to reason about.</p><h4>Senior Level</h4><p>Each subsequent level will continue to iterate on the previous example and correct the issues that I brought up. I will attempt to write the code more cleanly and justify the decisions behind the corresponding changes.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4e16d48691f9678b36e02257abd889bb/href">https://medium.com/media/4e16d48691f9678b36e02257abd889bb/href</a></iframe><p>This corrects many of the semantic and functional issues of the code in the previous level. To summarize:</p><ul><li>The application constants have been renamed and moved to appropriate spots.</li><li>The unnecessary use of listId has been removed.</li><li>There are no skipped branches, and control flow issues are mostly (though not entirely) resolved.</li><li>formatUserId has been moved to the appropriate service.</li><li>Use of console is removed. The errors mostly propagate to the Page component, as expected, where they will be reported using the mythical error service.</li><li>The Game Web App URL and its query string are being built correctly.</li><li>The any type is not used; more appropriate types are used instead.</li></ul><p>There are a couple of additional changes that are semantic improvements. A senior developer who is more familiar with a language and platform will know about and be more comfortable with using its more robust and higher level features.</p><p>Examples include conditional short circuiting, userId?.token || &#39;&#39; and object argument destructuring, { body: { formattedId } } being used instead of something like:</p><pre>(body: FormatUserIdResponse) {<br>  const formattedId = body.formattedId;</pre><p>This also allows for an implicit return, =&gt; formattedId. It’s debatable as to whether this is better than an explicit return since you would have to update it to use an explicit return to insert debugging statements, and it may not be more readable in some cases. It is up to the teams to decide which conventions work best for them, but my personal position and guidance I give to my teams is that less is more and to generally avoid creating unnecessary variables and statements.</p><p>While this resolves many issues and offers a lot of improvements, it still has its own issues and potential areas for improvement. There are a couple of major issues that may be easy to miss:</p><ul><li>The use of throwIfEmpty here attempts to throw an error if the formatted token is empty, but the Observable does not work this way. throwIfEmpty only throws if the Observable does not emit, which is currently impossible, so this will never trigger.</li><li>catchError does not propagate an error and will emit the Error as a value. In case of an error, formattedId will be the stringified error. This will attempt a Browser.open on an invalid URL.</li><li>There is no error handling inside of the .subscribe callback.</li></ul><p>As always, there is the potential for more cleanliness and more semantic improvements. These will be added in the next example.</p><h4>Principal Level</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/71668c30a2c455743b77307ba3aef4af/href">https://medium.com/media/71668c30a2c455743b77307ba3aef4af/href</a></iframe><p>The principal level code is able to achieve more with less. All of the control flow issues are resolved, and the success and error paths will be reached and handled appropriately. There is no extraneous code that is not achieving its intended purpose.</p><p>There are some TypeScript-specific items as well:</p><ul><li>userIdToken: String is now userIdToken: string. This is an unfortunate side effect of JavaScript having a built-in String object as well as string primitives. This doesn’t come up much, but String cannot be used as a type where strings are expected, and the primitive type is preferred. This is something easy to miss even by someone with deep knowledge of the platform.</li><li>this.http.get already returns an Observable and does not need to be wrapped in from. This method also does not need to be async because it does not use await in the level of the function’s call stack.</li><li>lastValueFrom converts the Observable from the previous method into a Promise so an explicit subscribe is not needed and all of the operations can be kept on the same call stack. This is valid as the Observable can only emit once.</li><li>The use of .join(&#39;?&#39;) to build the app URL is cute, but this makes it harder to reason about the order the string is built in. My preference is to use template strings so that you can see what the string will look like once it’s built at a glance, especially since a template string was already being used for the query string part.</li></ul><p>The introduction of the filter() RxJS operator makes throwIfEmpty work as intended. Now, the Observable will not emit if the token is empty due to the filter check. Thus, if passing an empty string for a userId token results in an empty response, this method will throw an error, so we can eliminate extraneous conditional checks. The specials service has also been updated to build the entire URL rather than just call the format ID API. It’s debatable whether this is preferred or even if this method should be split up, so it’s going to depend on the specific requirements and what the app is trying to achieve as well as whether the formatting or URL needs to be used for another purpose. catchError is omitted because it is unnecessary — we want the error to propagate so the ProfilePage can handle it.</p><p>getGameApp has been renamed to openGameApp to be more explicit about what actually happens when user clicks on the special app link. This method was updated to take advantage of TypeScript’s destructuring capabilities to reduce branches that would need additional coverage. In my opinion, this makes the code both easier to reason about and to test. Similarly, formatUserId has been repurposed and renamed to buildSpecialsUrl. This keeps the convention of using the term “build” to construct the URLs as is done with the URL builder utility.</p><h4>Master Level</h4><p>Once you have achieved mastery in your craft, you start to specialize. As it relates to software and application development, this includes the consideration of cross-cutting concerns and a simultaneous ability to develop in your dominant platform at the principal level and understand the application holistically including how it will interact with other platforms. The result is an ability to consistently think and work outside the box.</p><p>There are a lot of potential points to consider that could require some refactoring of the code to better handle these points and future situations. This is not an exhaustive list, but these are the ones I came up with:</p><ul><li>Could we rename the endpoint to specials/formatted-id so that it is a noun rather than a verb? Does this have an impact on our naming conventions for other paths or the app URL constants?</li><li>Is the sessionId actually required to format the User’s ID? If not, we can remove this additional parameter from the API.</li><li>Do we need to retrieve the user’s ID from the service each time they attempt to open the webapp? Could this cause a delay, or are there other performance concerns? If the user is already authenticated, we should have their ID and be able to keep it in application state — what is the chance that their ID in the state could be stale or mismatch what it is supposed to be? Are there related security concerns?</li><li>Do we need to handle potential errors for Browser.open? Does its SDK allow for this? If not, is there enough of a risk that we need to customize it to handle errors we may encounter?</li><li>When would the API respond with an empty string? It should either respond with a valid token or an error, so the filtering and throwIfEmpty should be unnecessary on the client side.</li><li>If the user is opening the game app a lot, we call the format specials API each time. Are there performance or availability concerns here? We could memoize this value.</li><li>Rather than explicitly call the url builder in application object services such as GameService, could we create a facade for API services that uses the URL builder and even the API constants internally and exposes developer-friendly names?</li><li>Are the activities of this feature being properly logged and analyzed? If not, is there a way this could be done automatically?</li></ul><p>These are just a few of the potential questions that a high level developer may ask. These questions are also not to be asked rhetorically — this developer must have an appropriate response or at least a position that can be informed by the responses of other more specialized developers or those closer to the project or feature in question. They must also develop a plan for implementing or guiding other developers to implement solutions to the items that require actions.</p><p>A lot of software development is deciding what needs to be done rather than just how to do it. On top of creating the questions in the first place, a lead developer must be able to prioritize the items that come up so that the most important items are addressed first. Some items may roll off entirely. Part of the plan to address these technical debt items may need to include how to integrate the technical debt resolutions alongside other feature work. This may be done with the development of new features to help defray the propagation of unclean code.</p><p>It would be a let-down to keep this level as an esoteric discussion about software development and not provide any code. I don’t think that the principal level code can be improved very much unless we take into account possible changes to functionality that may improve user experience or implement some of the nonfunctional features I mentioned. Instead, I’ll showcase a refactor of this feature that uses Observables to holistically control each of the different possible states of this feature.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fddbcdbbd243a49b7b03299471a61008/href">https://medium.com/media/fddbcdbbd243a49b7b03299471a61008/href</a></iframe><p>(Other services code is unchanged from the principal version).</p><p>This is one possible approach that opens the url as a side effect of the user clicking the link to open the Game. I would probably prefer to either have a component that opened the provided url when initialized, but that would complicate the example. I’m also not a big fan of this boolean trigger, and I’d rather have this event-driven and initiate the Observable stream via a click using something like fromEvent, but there are complications when doing this in Angular. Depending upon the Browser API and what open does, we could also compose this as part of the Observable to provide more error handling and reset the open action upon completion of the .open method or event too, but I’ve excluded those possibilities here. After all, as my boss always says:</p><blockquote>Perfect is the enemy of good.</blockquote><p>I’ve attempted to write this in a declarative rather than imperative fashion. A lot of the control flow is tied to the rendering of the template. The composability of Observables also allow us to tap into potential errors in the Observable stream and handle these as their own separate stream which simplifies the handling of the different possible application states as they are rendered in the template. I like this style of writing applications because of the intrinsic relationship between control flow logic and rendering, the lazy (rather than eager) nature of Observables, and the ability to handle separate application states and associated nonfunctional aspects in one collection of streams. It may be a personal preference, but this looks cleaner to me. I don’t like having to wrap things in try / catch or create other such conditional branches — these are certainly necessary, and I don’t want to throw the baby out with the bathwater, but they increase cognitive complexity and are easy to handle improperly or forget about.</p><h3>The Second Problem</h3><p><em>This is another recent change I encountered where the original solution had some potential control flow issues. This one is more JavaScript/TypeScript-specific, but I thought it would be another good illustration of a similar thought process or approach developers at different levels will have. If you’re not interested in or don’t understand some of the details of TypeScript asynchronous control flow, feel free to skip this section.</em></p><p>A vague description of the problem is that periodically, a user’s stale “speccials” need to be cleared from the specials service. There should be a deeper discussion at the requirements level about how periodic this should be and when the clearing must be done, but for this solution, we’ll just implement a service method that deletes stale specials that can be used wherever it may be needed. This assumes that the specials already exist in memory as part of the specials service.</p><h4>Junior Level</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/edff9062eb36f9df5213d9f8babd67c8/href">https://medium.com/media/edff9062eb36f9df5213d9f8babd67c8/href</a></iframe><p>There are issues with this implementation in terms of semantics, control flow, and error handling. Part of this may be a misunderstanding of how async / await works that the junior developer either referenced in existing incorrect code or misapplied what was working in the referenced code.</p><p>First, there is a mistake in the declaration of the specials property. [Special] is a data type that is an array that contains exactly one element, which is a special. The data type that is desired is Special[] , which is an array of zero or more specials. The class property needs to be initialized, and it can be initialized to an empty array, []. specials: [Special] = []; throws the following type error:</p><blockquote>Type &#39;[]&#39; is not assignable to type &#39;[Special]&#39;. Source has 0 element(s) but target requires 1.</blockquote><p>The example above attempts to correct this by resolving the issue stated in the type error: “requires 1 [element],” and adds this element. If the specials array is loaded or hydrated at runtime, this will not necessarily cause any runtime errors, and it may avoid type errors as well since you can still call array methods such as .map on this type. Before resorting to casting, a more experienced developer would double-check the types they are using.</p><p>The method is declared as async, but this is unnecessary since await is never used at the same call stack level of the method contents (it is used in an internal callback). I believe a linter may be able to report this as an error, but it’s good to understand why it would be an error. You only need to declare a method as async if you need to use await. async functions always return Promises. Calling code may be expecting some asynchronous behavior where there is none, and additional code used to handle such asynchronicity (such as error handling attempts or using another await) will be wasted.</p><p>The try / catch never has an opportunity to catch anything since Promise rejections made inside of the callback to forEach will not propagate. This would only catch an error if there were some runtime error with this.specials.forEach, e.g. if this.specials were undefined. You can have a philosophical discussion with your team about whether you need such fine-grained error handling, but I would usually just omit it since this.specials will always be an array and is initialized to an empty array.</p><p>Similarly, making the callback to forEach async does not do anything since the Promise returned from the callback is not assigned to anything. Even though await is being used, there is no operation done after the await which makes it useless, and there is no error handling inside of the callback that would catch a rejected promise.</p><h4>Senior Level</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e1ddf309a7de033438e38b7e41e6006f/href">https://medium.com/media/e1ddf309a7de033438e38b7e41e6006f/href</a></iframe><p>This corrects the issue with the typing of the specials class property.</p><p>The use of Promise.all wrapping .map is an improvement since errors will propagate. You could wrap this method in try / catch and handle potential errors here, or you could allow this method to propagate errors to be handled at the application or page level, or potentially some combination thereof — this depends on your specific needs.</p><p>Note that the method itself does not need to be async because it does not await on anything, even though it does return a Promise.</p><p>A potential issue with this is that Promise.all will throw immediately if any of the deleteSpecial calls is rejected, even if it’s the very first call. However, this does not break out of the loop, so this will still attempt to delete all of the other specials even if one attempt fails. This behavior is potentially undefined, and we also won’t get any information about whether or not other deletion attempts failed. If we expect deletion failure to be a corner case in the first place, these things may be unimportant, but they can still be addressed without much disruption.</p><h4>Principal Level</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cd781bc94c10453e7c3ee6f2bda16daa/href">https://medium.com/media/cd781bc94c10453e7c3ee6f2bda16daa/href</a></iframe><p>One semantic correction: the .map callback does not need to be async. It does await on this.deleteSpecial , but that is unnecessary — this.deleteSpecial must be a Promise anyway in order to await on it, but there is no functional difference between returning that Promise or using the implicitly returned promise of the async function.</p><p>The new code also uses the array .filter method for the conditional check. I prefer these semantics over the conditional if statement, especially since the alternate branch is not handled, not that it needs to be in this case.</p><p>Because of the way Promise.allSettled works, it will never throw, so this requires us to check the status of the promise resolutions ourselves and then rethrow if an error is encountered. The .some check is done to short circuit if there are any failed deletions. Then, a filter is done to construct the error that concatenates all of the rejections. If failure to delete specials is rare, this does have to loop through the entire array to check for failed statuses, but if the array is small, I prefer the semantic benefit of performing this check to a possible optimization that minimizes the number of array elements that are touched. If failures are common, it might be better to do the filter first and check its length to see whether an error needs to be thrown.</p><h4>Master Level</h4><p>I’ve come up with a few questions relevant to this functionality that may need to be addressed in the software architecture:</p><ul><li>How often do we expect stale special deletions to fail?</li><li>If this happens, how can we recover?</li><li>Do we need to make the user aware? If not, we could fire-and-forget stale deletions and record potential errors in the background.</li><li>If a stale special fails to delete, can we retry?</li><li>Is it relevant if multiple stale specials fail to delete, or can we handle things the same way if one or more fails to delete?</li></ul><p>I like an Observable solution to this requirement as well.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d60b094ec9864391a3d22ee4958bf7f4/href">https://medium.com/media/d60b094ec9864391a3d22ee4958bf7f4/href</a></iframe><p>This attempts to delete all stale specials after creating an Observable from the stale specials filtered out of the specials array. The nested mergeMap and catchError allow the operations to continue even if one of the items throws an error. from wraps this.deleteSpecial since based on its use in the previous examples, it returns a Promise, but if it returned an Observable itself, this wrapping would be unnecessary.</p><p>catchError is necessary for the Observable stream to continue, so this is similar to Promise.allSettled in that it does not throw anything on its own. This implementation gives us the freedom to tap into the Observable how we see fit which includes checking whether an Error was emitted and handling individual errors or aggregating them. We could also attempt a retry by composing additional methods onto this Observable. mergeMap also lets us set concurrency, so we could wait for these operations to complete one at a time if we wanted to stop in the case of a single error or there are other concerns for deleting multiple specials simultaneously. The Observable and the RxJS operators provide us with a lot of flexibility, although a certain level of mastery is required to get the most out of it.</p><h3>Conclusion</h3><p>My purpose in writing this article is to help differentiate between what developers can achieve attempting the same requirement and operating at different levels of mastery. My hope is that this can help developers at all levels open their mind to see how other developers may approach problems differently, especially when their knowledge does not fully overlap, and how more senior developers can iterate on a coding approach to improve its functionality and semantics.</p><p>One important consideration I have noticed is that it can be difficult for junior developers to adopt practices at a higher level without more practice and experience, especially if there is a large gap between levels. This is to be expected, but the point is that higher level developers’ jobs are not done when they write or refactor code, or suggest changes. They need to help bridge the knowledge gap and ensure that their APIs and conventions are understandable, usable, and adoptable by everyone on the team. At the same time, they must keep an open mind since they can certainly learn from other developers at all levels.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=21e519d775c2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[An Example Code Review]]></title>
            <link>https://medium.com/@ExplosionPills/an-example-code-review-490b2418475c?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/490b2418475c</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[redux]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Fri, 25 Feb 2022 02:20:49 GMT</pubDate>
            <atom:updated>2022-02-25T02:20:49.689Z</atom:updated>
            <content:encoded><![CDATA[<p>This is a companion piece to my article <a href="https://medium.com/@ExplosionPills/on-code-reviews-in-2021-71febc88f231">https://medium.com/@ExplosionPills/on-code-reviews-in-2021-71febc88f231</a>. Here, I take a code review that I did in the recent past and extract some points of interest for discussion. This includes diffs or explanations of the code changes as well as direct quotes from the review. I will also editorialize with explanations and corrections to the review itself.</p><p>This is for a React Native mobile retail app, but I will attempt to make the content generic enough to be understood for any software development language or platform. Some identifying features of the app or its developers have been intentionally obscured. I compliment anyone from the team who sees this as they did a great job, worked well with this initial feedback, and provided great feedback themselves.</p><p><em>Any Mobiquity developers who would like to see the review itself, just let me know.</em></p><h3>Introduction</h3><p>This was a general review of one of the early stages of the application. My approach was to merge in some of the functionality and then create my own merge request that included some refactoring. I discuss this as one possible approach to code review in my previous article. This includes a substantial amount of changes which does go against conventional wisdom and even my own advice that pull requests should be kept relatively small, but there are a couple of sticking points:</p><ol><li>I am from the US and was working with a team that was entirely in India. This dramatically increases the turnaround time for making changes.</li><li>This was in the relatively early stages of the app, so I wanted to try to get some advice and best practices out quickly as there were many fresh features being introduced.</li></ol><p>I also tried to offset some of the overhead for the review by including inline comments explaining my changes. I asked the developers to review my comments and changes in lieu of normal development time for a day or two in an attempt to ease the stress of having to read the large review while also having development work. I could have taken a different or better approach, but we were still ultimately able to achieve our goals with the app, and I was very satisfied with the product’s code quality.</p><p>I’ll start with my merge request’s description:</p><h4>Refactor and Improvements</h4><p>This merge request includes all of my suggested changes for the logic, code organization, and naming in the app. For the most part, this does not include any functional changes. It attempts to carry over all of the existing app functionality identically with a couple of notable functional changes:</p><ol><li>The refresh token stored in the application state is automatically used when it’s necessary. This doesn’t really apply to the existing app, but this functionality can be carried over.</li><li>The sign in screen UX has been updated to better support user keyboard interaction. You should be able to “next” and “submit” from the keyboard. This was done as part of a larger refactor for InputField.</li></ol><p>Some smaller functional changes that attempt to improve user experience include better request and error handling.</p><p>All of the other changes will be explained in inline comments in the merge request. Some common themes are:</p><ul><li>Unifying naming conventions, clarifying names, and correcting spelling.</li><li>Splitting up components for clarity, organization, and potential reusability.</li><li>Refactoring state management for specificity, clarity, and moving items as close as possible to their intended use.</li><li>Adding unit tests to include examples of reducer tests, epic tests, and Page tests.</li><li>Removing as many eslint-disable comments as possible.</li></ul><p>These changes are suggestions for how I would write the app. I am certain that I made some mistakes, and I am certain that it can be improved upon as well. I think some of these changes are also subjective. Please keep this in mind when reviewing the changes and feel free to either suggest improvements or to make future alterations.</p><p>I think that I tend to struggle with introductions and conclusions. I state that the code “for the most part” doesn’t include functional changes and undercut that by explaining the major functional changes. My explanation of the refresh token, <em>This doesn’t really apply to the existing app, but this functionality can be carried over, </em>is also unclear to me. It may have made more sense in context at the time, but I find this difficult to understand. I think that my point is that this is a feature that isn’t used now but can be used in the future.</p><p>I can also reduce my use of qualifying words. For example, “potential reusability” should just be “reusability.” My goal in qualifying statements is to avoid being presumptuous… I don’t assume that the code will be more reusable. However, I should be confident in this goal and imbue this confidence in the team as well. It would also reduce verbosity which is important for anyone reading the review.</p><p>I think this introduction and explanation of my changes and their goals is okay, but I should have read through it and edited it a couple more times to provide clarity. Don’t forget to review your review.</p><h3>My Feedback in the Review</h3><p>I’ve split the feedback into logical sections. Content from the actual review will be quoted. I’ve also provided a diff of the original code when it adds clarity. Otherwise, I summarize the changes that were made.</p><h4>Introducing a Reusable Component</h4><p>I created a BiometryCheckbox component. Originally, the code had the checkbox and other biometry checks inline on the existing sign-in page.</p><blockquote><em>This element handles the functionality for displaying the “Use Face ID,” etc. checkbox. It was convenient to split it into its own component to simplify the sign in page, and it could potentially be reused in other places such as the registration page.</em></blockquote><blockquote><em>This encapsulates the sensor check and biometric type text.</em></blockquote><p>Creating generic reusable components is difficult to do because it can be <a href="https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction">the wrong abstraction</a>. I wrote this component because I knew it was going to be used on multiple pages in the same way and to provide an example of an abstract, reusable component for the team.</p><p>While abstraction often implies reuse, it is only one goal. Abstraction can also provide clarity and organization. In this case, it made sense to me that since the biometric checkbox should only appear if the sensor is available, the component itself can encapsulate the logic for the sensor.</p><h4>Unnecessary Code / Types</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/07c344def55ff228a06c1e46a84f5639/href">https://medium.com/media/07c344def55ff228a06c1e46a84f5639/href</a></iframe><blockquote><em>FunctionComponent is only needed to simplify specifying the prop types for functions that are components. Otherwise, the component is implicitly a function component as long as it returns a JSX element.</em></blockquote><blockquote><em>The page-level component will never have props because they are top level components.</em></blockquote><blockquote><em>I also adopted the “Page” suffix to clarify these.</em></blockquote><p>This is a bit specific to React semantics. The SignIn component is compatible with FunctionComponent, so the correctness here is debatable, but all other things being equal, I err on the side of using less code rather than more. Fresh and even experienced React developers may not know what FunctionComponent does here, or that it is not needed, so I see it as a distraction that can be safely removed.</p><p>You could make the argument that in the future, this component will take props that will make FunctionComponent useful. If you introduce props and want type safety, then you would have to import and add this type. I prefer to avoid code that serves no purpose now but might be useful in the future for a few philosophical reasons:</p><ul><li>YAGNI (you ain’t gonna need it) — don’t add functionality until it is deemed necessary.</li><li>Code should be optimized for reading over writing, so removing a distraction is better than including code that may or may not be used in the future.</li><li>This is Typescript and React specific, but inferred typing, where sufficient, is less verbose than explicit typing. Your tools may vary, so don’t think of this as an absolute best practice.</li></ul><p>Moreover, in this specific case, this is a top-level component which can never have props, so FunctionComponent will never add additional type safety. I added the “Page” suffix to signify this. I’m ambivalent about how useful these suffixes are since they can be redundant and difficult to enforce programmatically, but since our teams do both React and Angular development, and the Page suffix makes more sense with Angular’s style guide, I like the cross-platform consistency approach. As with many developers, I will forever be tortured by the question of whether this naming decision was the right choice.</p><p>Finally, I brought this up as a learning opportunity. The developer may not have been aware that the explicit FunctionComponent type was unnecessary. If they did know, this would give them an opportunity to justify their choice, and we would both learn something.</p><h4>Symbol Name Formatting</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c3822b2d044a490403abce6e2f2c5a75/href">https://medium.com/media/c3822b2d044a490403abce6e2f2c5a75/href</a></iframe><blockquote><em>I changed the locale files to use camelCase. There doesn’t appear to be a set standard for i18n/React Native, although examples I found do use camelCase. This is more in line with how object definitions are done more universally.</em></blockquote><p>There seems to be a fine line between what is a nitpick or personal preference and a tangible improvement in code writing. Naming, and particularly name formatting, are at the forefront of this battleground. The reference to Phil Karlton’s quote, <em>There are only two hard things in Computer Science: cache invalidation and naming things, </em>is thrown around often, and probably much more often than issues in cache invalidation are encountered.</p><p>When it comes to this change, I don’t have an issue with the naming convention itself, but my goal is to achieve consistency in naming overall. Other examples of inconsistencies in the locale file naming were the use of groupings like menu and landing on the same level as SignIn, Switch_Language, and STORE . Any of these naming formats would be okay, but a lack of consistency can make values more difficult to identify. This can affect a new developer and even an existing developer on the project in a few ways:</p><ol><li>The lack of consistency itself can be distracting.</li><li>Without a consistent reference, the developer will have to spend extra time choosing how they want to name new values.</li><li>Manually named values may be inconsistent or incompatible with those created by automated tools which can propagate inconsistency.</li></ol><p>When it comes to things like naming conventions, you should follow your organization’s standards, and, unless there is a good reason, you should try to follow industry or library standards as well. These don’t always exist as in my i18n React Native example, so sometimes you have to make a choice, but you should only deviate if you can justify the reason why.</p><p>My feedback can be too verbose. I also used the qualifier “more” twice in the same sentence. What I should have written is <em>this follows our standards for variable and object naming.</em></p><h4>Variable Naming</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ec7a7d98fc32977163de0fa5370e0e81/href">https://medium.com/media/ec7a7d98fc32977163de0fa5370e0e81/href</a></iframe><blockquote><em>The purpose of these values is mostly the same, but they were renamed for clarity:</em></blockquote><blockquote><em>* isErrorVisible -&gt; isEmailErrorVisible since this error is specific to the email field</em></blockquote><blockquote><em>* setX -&gt; setIsX to match the property name that is being set (in the case of these booleans).</em></blockquote><p>There are a few quality aspects going on here that I will discuss, but this continues the theme of correct naming. I don’t fault anyone for choosing names that are not optimal on the first pass. In fact, I think that code review is a great opportunity to offer clearer or more accurate variable and property names. As long as the author and reviewer maintain the grateful, inquiring, and kind mindset, there can be a free exchange of potential names that will approach the correct one.</p><p>It seems to me, at least in my organization, that code reviews don’t point out potential name improvements as often as they could. Even I am guilty of this for a variety of reasons. Naming is difficult, but one way to improve it is through the ideas offered through a code review. Suggesting an improvement to a name does not require a change to the name either, but even the suggestion can provide more clarity about the original name to the author and reviewer.</p><p>In this example, the renaming was done for clarity and consistency. Names should be clear with as little context as necessary. isErrorVisible is understandable — it is a boolean that indicates whether an error is visible or not — but in the context of the page, there can be multiple errors. Thus, to provide clarity, I changed it to isEmailErrorVisible to indicate how the error is generated and where it is displayed. An even more accurate name may be shouldShowEmailError. This may be better since we currently have a mixture of is and should prefixes.</p><p><em>We could also have an errors object with properties or use a form management library. The former is a bit more difficult to manage in React, so this choice is contextual to the tools. The latter would require more overhead, but it would not be a bad option in the larger application context. Finally, this is following React’s own naming and usage standards according to their documentation.</em></p><p>On the other hand, the is properties control whether the errors are displayed, and the should property is related to a functional aspect of user interaction. As there is a separation in functionality, a separation in the naming strategy may be appropriate. Your team may want to adjudicate naming strategies in cases such as these, but this takes additional time and isn’t always necessary. If the team is tacitly consistent with an implicit naming strategy, that’s probably an indication that it’s working well.</p><p>I learned a long time ago that it’s helpful to prefix booleans that operate like flags such as these with is, should, has . There is a worthy debate about how useful this practice is, but it helps to distinguish values that manage control flow versus those that contain content or some other functionality. My team and I seem to have adopted this naming strategy more or less automatically, so we’ll stick with it for now.</p><p>The React state setter names should match with the state variables except for the set prefix. This makes the state value easier to identify in the context of its setter. It also provides consistency. Above, there is isErrorVisible and setErrorVisible versus isButtonTap an setIsButtonTap . I’d rather short circuit the thought process and simply prefix the setter with set.</p><p>My review here is incomplete. isErrorVisibleOnTop is unclear and probably unnecessarily verbose. There are some other clarifications I could have made, but it is a step in the right direction. The review has to come to an end at some point.</p><p>Along the same lines:</p><blockquote><em>For convention and clarity, we prefix all of the selector functions with </em><em>select. This also allows us to use names that match selected values. That is, we don&#39;t have to do </em><em>isLoader = useSelector(isLoading) and instead could do </em><em>isLoading = useSelector(selectIsLoading).</em></blockquote><p>For style declaration files:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e043efd76532609e2cd89cfaa272508d/href">https://medium.com/media/e043efd76532609e2cd89cfaa272508d/href</a></iframe><blockquote><em>This is an example of a more general change to the style definitions. Style properties should be camelCased and not PascalCased as with other object property definitions. Only class/interface/component definitions should be in PascalCase.</em></blockquote><blockquote><em>I also removed the </em><em>Style suffix from style properties since they will almost always be prefixed by the style object that has style in its name, </em><em>style. which would make the suffix redundant. It was also not being used consistently. I can see why it might be used in cases such as this where you have a library prop that has a style suffix too, but I think it&#39;s ultimately clearer and more succinct to leave it off.</em></blockquote><p>contentContainer is my attempt to be more clear. This styles a generic container for the page’s content. content or container may be appropriate names as well. When it comes to naming, there is always room for debate, but I’ll reiterate that you ultimately have to make a decision and move on.</p><h4>Properties and Names from Third Parties</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f7ace0662eead66b4802982068540a2f/href">https://medium.com/media/f7ace0662eead66b4802982068540a2f/href</a></iframe><blockquote><em>Not all of the information (e.g. </em><em>token_type) needs to be stored in the state -- only what we need to use. This was originally done because the API responses were being passed into the state directly, but for clarity, the state should only hold values that it needs and they should be named according to the application code conventions (camelCase property names).</em></blockquote><blockquote><em>The purpose of the application state layer is to transition properties that we may receive from the API or otherwise and make them palatable to the application logic, using our terms and naming conventions.</em></blockquote><blockquote><em>string | null generally doesn&#39;t need to be used. We can make the property optional instead with a question mark </em><em>?, but this should be avoided in cases where it&#39;s not needed too since that creates more conditional chains in the application logic.</em></blockquote><p>There is a temptation to align properties with API responses. If you have total control over the API definition, you can certainly reuse types across platforms, and the teams should develop the types and names together. You can even have a shared library of types or data structure definitions.</p><p>Often, you will have to consume third party APIs you don’t control whose conventions will not match your application’s. These third party APIs may also respond with properties that are not used by the application. I believe it is better to include properties as-needed rather than to create definitions that match the entire shape of the API response. You can create an object definition that matches the useful properties of the API since you will need to access these, but the objects used by the application should follow your standards.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2ba21a36687b895b3735af8fb674c3fc/href">https://medium.com/media/2ba21a36687b895b3735af8fb674c3fc/href</a></iframe><p>Then, in your application, you can use this as authState.authToken = authApiResponse.access_token.</p><p>The final point about optional properties has one TypeScript-specific point. There is a functional difference between an optional property ? and the string | null union type, but there’s no practical difference here. I use this as an opportunity to show the developers the preferred semantics which conveniently take up less space and are easier to read.</p><p>It could be correct to not make these properties optional. When the application state first loads, they are missing, and it is theoretically possible to retrieve an access token without a loyalty token and vice versa. However, Properties of the auth state will not be used unless they have been successfully retrieved together. This provides theoretical type safety, but it also enforces checks where they may not be needed. For instance, you will always have to do authState.?authToken rather than authState.authToken, and you may have to provide additional conditional checks to handle the undefined states where this will practically provide no value since authState is only usable in components that are rendered after successful authorization. TypeScript can allow you to simplify this via type guards, so I think both options are viable.</p><h4>Grammar and Pluralization in Naming</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/080fb7fa113ea9245613d922c316b1f0/href">https://medium.com/media/080fb7fa113ea9245613d922c316b1f0/href</a></iframe><blockquote><em>Since we are only displaying the details for individual stores, this should be singular: “StoreDetails” rather than “StoresDetails.”</em></blockquote><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/603c3eeab9dbff988e96e2df3543230d/href">https://medium.com/media/603c3eeab9dbff988e96e2df3543230d/href</a></iframe><blockquote><em>These names have been updated to match corresponding action names which were also updated to start with verbs. For example, there could be a </em><em>deleteOffers. </em><em>signIn itself is a verb.</em></blockquote><p>Keep in mind the relevance of using nouns versus verbs when necessary. Often a verb signifies an action such as a function call whereas a noun is an object instance or property. There are not hard and fast rules for the part of speech to use in naming, so the discussion should always be open. In this case, I’m also pointing out that there will be multiple epics/actions related to offers, so the previous name offers is overloaded.</p><p>I should clarify this in the review, but I typically intend retrieve and get to mean different things. In this case, retrieve will procure the credentials from local storage where as get refers to GET API calls.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f154ab91d0e46db9e49e61c5c535d2bb/href">https://medium.com/media/f154ab91d0e46db9e49e61c5c535d2bb/href</a></iframe><blockquote><em>A couple of things here. </em><em>Items is the name of the property containing the array of offer objects from the API, but this seems to apply to other APIs as well. For clarity, we can call this </em><em>offers as the list of current offers in state.</em></blockquote><blockquote><em>The </em><em>Offer type should be singular since the object refers to a single offer, so an array of offers would be </em><em>Offer[] and not </em><em>Offers[].</em></blockquote><blockquote><em>[offerItem] in TypeScript is literally an array that has a single </em><em>offerItem object. Most likely this was intended to be </em><em>offerItem[] which would be an array of these objects that can be of any length (or empty). </em><em>interface / object shape types should also be PascalCase, and property names should be camelCase.</em></blockquote><p>These are a few more items related to naming showcasing the importance of analyzing various aspects of naming and the process it takes to get it right. Pluralization is important since a plural variable name implies a collection. The language or platform that you are working in may have conventions for naming collections as well.</p><p>I prefer to avoid using generic names such as “items” or “things.” In this case, Items came from the API response, but I’ll restate that strictly using names that come from APIs is not necessary. In this case, the interface being defined is for a component that displays a list of offers, so the more descriptive names make sense (state.offers = offersApiResponse.Items).</p><p>The last paragraph points out a misunderstanding of TypeScript array declarations that is specific to TypeScript. I offer the correction, but it is possible that the intended type was indeed [Offer] rather than Offer[]. The inquiring mindset will help reach a proper resolution for this.</p><p>Finally, the component being referenced is called OffersList which includes the plural “offers.” I’m ambivalent about this too since you could make the argument that “list” implies a collection and thus OfferList would be the correct name. I think that OfferList is ambiguous since it might be related to a list of properties related to a single offer rather than a list of offers. It’s possible that there is an even better name than these.</p><h4>User Experience, OS, and Library APIs</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/61b4767eb9dcd13ac895ebb64b6a51af/href">https://medium.com/media/61b4767eb9dcd13ac895ebb64b6a51af/href</a></iframe><p>This changes an email field in the app so that it uses the email address keyboard for mobile devices. By default, this was using the standard text keyboard and automatically capitalized the first letter. Sometimes, developers may simply not be aware of the options available for specific user experience improvements such as available keyboards. This is an opportunity for more senior developers or anyone who is familiar to share this knowledge with the team. In this case, I would include a link to the library’s input APIs that allow you to change the OS keyboard for input fields.</p><p>Once developers realize that these powers are available, they’ll be able to use them for other purposes and disseminate them to the rest of the team. It doesn’t hurt to periodically review the documentation and changelog for the libraries you commonly use. Developers, testers, and other team members should point out these potential user experience improvements. The libraries and APIs we have are so powerful nowadays that there is often a specific improvement available.</p><h4>Unnecessary Asynchronization</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3672313380f8f498c1bf07dca98e116a/href">https://medium.com/media/3672313380f8f498c1bf07dca98e116a/href</a></iframe><p>I can’t speak for other platforms, but misuse and misunderstanding of synchronization is common in web technologies. In this case, the code was making the result of an email string validation asynchronous. However, this code doesn’t depend on anything asynchronous since validate and email.trim are not asynchronous.</p><p>This will require some synchronization where this function is called, e.g. async/await. This adds unnecessary complexity. Moreover, Promise.resolve() returns an object and all objects in JavaScript are truthy. if (validateEmail(email)) will always be true before the correction. My hope is that the lesson in this feedback will be applied more broadly. Asynchronous functionality should only be used when it’s needed.</p><h3>State Management</h3><p>I created this section because there is content specific to Redux and React. Without at least a high level understanding of Redux state management, these examples may not make sense. I will give a crash course.</p><p>Redux is a state management library and paradigm where the application state or store is a first class high level aspect of the software. The View is the output of the state. Actions are <em>dispatched</em> and update the state which in turn updates the View. Actions can be dispatched based on user interactions and other events. The state is managed by <em>reducers</em> which are synchronous functions that take the current state and a dispatched action as input and return the new state as output.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/0*P7KFLVj1I-BkQf2a.gif" /><figcaption>Visualization of Redux Software Architecture</figcaption></figure><p>React-Redux allows you to <em>select</em> state properties and also allows you to <em>dispatch</em> actions to update the state, often, though not always, in response to user interaction.</p><h4>Organizing States</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5c3eac3dbe9b16ef9368682f872e2519/href">https://medium.com/media/5c3eac3dbe9b16ef9368682f872e2519/href</a></iframe><blockquote><em>Rather than dispatch two separate actions, we consolidate the actions since they should succeed and fail together.</em></blockquote><p>Dispatching two separate actions is not necessarily a bad approach, but you must analyze your state machine to see if this is desired. If you dispatch separate actions that are not dependent, you will automatically have four states:</p><ol><li>Initial state (no action resolved)</li><li>First action has resolved, but the second has not</li><li>Second action has resolved, but the first has not</li><li>Both actions have resolved.</li></ol><p>This also does not take into account the possibility of either action failing which results in additional possible error or recovery states. Even if the action is fire-and-forget, errors need to be noted and recovered from.</p><p>In the example above, the token is either unavailable or not useful if the sign in request fails. Thus, even though these are separate events, they are dependent, and so a single action should encapsulate both. This simplifies the possible states of your application and gives you a single point of failure for error handling. There is a worthy discussion about the level of encapsulation for actions, and this could still be two separate actions that operate in a chain. I’d prefer to keep a single action for operations that must succeed or fail together which doesn’t eliminate the addition of an action that only performs one of the operations where that may be needed.</p><h4>Avoid Unnecessary Value Passthrough</h4><p>I made another change to the SignInPage where I removed the retrieval of an application state access_token value and the use of that value in actions. I left the uninteresting diff out since it’s just removing a couple of lines using access_token .</p><blockquote><em>The </em><em>access_token is no longer needed here since it’s used in the API handling layer. It’s generally better to access application state as close as possible to where it is needed so that it is more accurate / not passed through and also more consolidated. In this case, we were selecting the accessToken from the state so that we could pass it to a request to be used as part of an API call. Instead, the API handler can get this from the state. Otherwise, we would have to select and pass this through on any page that needed to make such a call.</em></blockquote><p>A good heuristic is that if you retrieve a value in one layer only to pass it to another layer without operating on it, instead you should do the retrieval in the relevant layer. This depends on your software architecture, but this is a fairly common problem in hierarchical component-based architectures where an ancestor may need to pass data to a distant descendant (or “cousin”), but we have a wealth of patterns and libraries available to assuage this problem now. This includes Redux which this app is using.</p><p>The original code was selecting the access token from Redux in the SignIn component and then passing this token when dispatching the sign-in action. Ultimately, the API layer uses this token for authenticating requests. My suggestion was to have the API layer retrieve the token for requests that require authentication.</p><p>This is specific to React and Redux, but this requires explicit retrieval of the application state in the API layer (applicationStore.getState()). This is not a bad thing, but it can make testing more complex since you will have to mock the importing of applicationStore. There may be other ways around this, but for now, I prefer this explicit retrieval in the relevant layer over passing the value through different layers without operating on it.</p><h3>Conclusion</h3><p>I hope this example code review helps developers learn what a code review should look like. One thing that is absent from the review that should be more common is questions. I took a different approach with this review since it is made up almost entirely of suggestions. My goal was to keep this as an open discussion for additional feedback as well as to provide some standardization for the code and as teaching materials.</p><p>I have learned a lot writing this article and going through this code review multiple times, and the review itself was created by going over the original code multiple times. Every iteration can improve quality, but you can’t forget to compromise on a reasonable stopping point. I’ll take that advice right now and end this here.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=490b2418475c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understanding Git Rebase — A Case Study]]></title>
            <link>https://medium.com/@ExplosionPills/understanding-git-rebase-a-case-study-3704ce8bebd3?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/3704ce8bebd3</guid>
            <category><![CDATA[git-merge-vs-rebase]]></category>
            <category><![CDATA[rebase]]></category>
            <category><![CDATA[git-rebase]]></category>
            <category><![CDATA[git-merge]]></category>
            <category><![CDATA[git]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Tue, 18 Jan 2022 00:58:28 GMT</pubDate>
            <atom:updated>2022-01-18T17:10:50.062Z</atom:updated>
            <content:encoded><![CDATA[<h3>Understanding Git Rebase — A Case Study</h3><p>git rebase is arguably the most arcane of git’s commands. Even after using it for about 10 years, I’m still learning new things about it including crucial aspects of how it functions. This sort of event happens a lot to software developers such as myself, and it’s both humbling and encouraging. I take advantage of the tools I use every day and expect them to work implicitly even though I may understand very little of what they’re actually doing under the hood. At the same time, it’s always exciting to have new things to learn and add to your tool belt to keep progressing.</p><p>My company, Mobiquity, adopted a fairly common trunk-based git-flow version control process long ago that we continue to use today. Rebasing is commonly done to keep new feature changes up-to-date with trunk changes. The alternative strategy is to use merges. The philosophy of using rebasing versus merging for synchronizing code changes has been discussed to death, so I won’t go into that topic here. Suffice to say, Mobiquity and I subscribe to the rebasing model.</p><p>I’m also going to skip the primer on rebasing or other specific git commands. There are a lot of great resources that explain them in depth including git’s own documentation. I’ll give a brief explanation: rebasing takes the commits from a source branch and applies or replays them on a target branch. Merging combines both changes into a single commit and retains the branching history. Thus, a repository that is consistently rebased will have a streamlined history that is mostly a straight line. Using a merging strategy, you will get a network of interconnected branches. Neither is categorically superior, but my preference and industry preference tends to be the more streamlined option.</p><p><em>If you want a thorough understanding of git rebase or other commands, I recommend reading through </em><em>git help rebase, etc. — probably multiple times.</em></p><p>While this is outlined in our process, it is possible for mistakes and misunderstandings to happen. I have often seen merge commits show up in pull requests. I believe that this usually happens because developers will git pull origin trunk into their feature branch, though it is also possible for them to merge their feature with the trunk more explicitly, or they may just merge their branch with another remote branch without realizing it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/368/1*Q0CfMXXJNHJB75203agutw.png" /></figure><blockquote>Avoid merges when pulling by using git pull --ff-only, or you can git config --global pull.ff only .</blockquote><p>Note that if you pull and fast forward, you won’t create a merge commit. You either have to create one by explicitly disallowing fast forwards, or one is created because there are merge conflicts. The method for resolving merge conflicts is perhaps a point of contention between the merge strategy and the rebasing strategy, and I have to admit that the merge strategy may have the upper hand here. The good news is that you can strip out extraneous merge commits by rebasing.</p><p>Rebasing replays all of your commits, so if there are changes that result in conflicts for multiple commits, you will have to resolve them all individually. This leads to potentially resolving multiple similar conflicts, or the resolution from a previous commit can compound into a conflict in a future commit. This does also result in a not uncommon Fix merge issues commit after the fact, although I have seen this both after merging and rebasing. Practically speaking, I don’t have a big problem with these commits. It can be tough to properly resolve conflicts, and the cognitive complexity of identifying, remembering, and properly applying changes discovered during conflict resolution to redo a merge or rebase are unlikely to be worth the ostensible history preservation in most of the situations I’ve encountered. Purists have a point that you want each individual commit to be a working snapshot, but there are always tradeoffs in software development.</p><h3>A Tale of Two Trunks</h3><p>Now, onto the case study. Mobiquity development tends to be trunk-based. This means that Most of the branches that we cut are off of a single branch called develop and then merged back into develop. I believe this is a very common approach, although there are many others including using multiple feature branches. The approaches all have situational advantages and disadvantages, so I’m not advocating for trunk-based development here, but it works best with our process.</p><p>Recently, I worked on a project where we were making some experimental changes to some software. While we were doing this, another group was working on their own feature development and changes, and they were working off of a trunk that we’ll call develop. In order for us to get started, I cut develop-mobiquity from develop, treated it as our trunk, and we were underway.</p><p>Since we were making changes to many of the same modules simultaneously, we knew that there were going to be conflicts between the trunks. To assuage this, I would periodically rebase develop-mobiquity on top of develop to reduce the size of the merges and allow us to continue working on top of newer changes. Each time I did this, all of our changes would have to be replayed on top of the latest develop which would result in conflicts. I have known about git’s rerere feature for a long time an even had it set. I understood what it did, but I think this is probably the first time that I’ve taken full advantage of it. It saved me a lot of time not having to resolve the same conflicts each time I rebased to keep things up-to-date.</p><p>We were doing a total visual redesign of some features as well, so sometimes when there were conflicts, I would only want to take our changes. This also gave me a chance to learn about git checkout --ours/--theirs. One important point: when you are rebasing, --theirs is the changes made in the topic branch and --ours is the branch you’re rebasing onto (feature and trunk, respectively). This is a bit counterintuitive since you were likely to have made the feature changes you’re rebasing, but the git help rebasedoes make it clear. Using this tool along with rerere simplified and sped up the continuous rebasing.</p><p>Finally, I had never fully understood how rebasing handles merge commits. As in the example image above, whenever I see merge commits in pull requests, I tell the developer to rebase. I never knew why it stripped out the merge commits — I just took that fact for granted. Why does it do this?</p><blockquote>By default, a rebase will simply drop merge commits from the todo list, and put the rebased commits into a single, linear branch.</blockquote><p>This makes sense since the point of rebasing is to have a single branch of history rather than multiple merging branches, so all of the commits from the merged branches get played back which essentially unravels the merge. Knowing this simple fact answers the question of why rebasing with the trunk will remove merge commits.</p><p>This was particularly relevant with the continuous rebasing with the two trunks. One way or another, merge commits did end up in develop-mobiquity from some pull requests. I wasn’t certain of what the impact would be, but when the time came to rebase again, I realized that I was having to resolve many repeating conflicts even with rerere enabled. This was because the original merges from the pull requests were unraveled, and both of the develop-mobiquity branches were replayed on top of one another. I was very confused to see why I was getting similar conflicts repeatedly and why sometimes the relevant changes were --ours (already merged into develop-mobiquity), sometimes --theirs (from feature branches), or some combination (reasonably expected).</p><p>I couldn’t find either through documentation or my own experiments the order in which rebase will replay the commits from two different branches — it’s not strictly based on timestamp. When you rebase a branch with a merge, it may replay the commits in an unexpected order which can lead to the scenarios above where you may have to keep either --theirs or --ours. This creates a lot more work and potential for mistakes than if you rebased first. You still end up having to resolve the conflicts on the feature branch, but if there is a merge that is unraveled later, you will have to resolve these conflicts again in the second trunk.</p><h3>Conclusion</h3><p>When it comes to the Mobiquity’s rebase-based trunk-based git-flow approach, I think I have solidified my understanding of why we use it and its benefits to our process. I can now point to this article as a potential justification for why we need to exclude extraneous merge commits from being included in pull requests to the trunk and even a better understanding of how to safely remove them. If you are unsure of whether or not a command you are running will create an extraneous merge commit or otherwise impact your git history, one powerful thing you can do is checkout another branch to test what happens: git checkout -b &lt;feature&gt;-2, for example.</p><p>Even while writing this article, I found things about git and rebasing that I still don’t fully understand. It is very easy to take for granted the powerful tools that we use almost every day in our software development lives. It’s important to maintain an attitude of humility or even respect while using these tools, and be prepared to put in the work and research to achieve a deeper understanding to solve specific problems you may encounter. From this, you can develop the standards and practices that can streamline the work of other developers who may not understand the underlying mechanisms as deeply and give back to the software development world.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3704ce8bebd3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[On Code Reviews in 2021]]></title>
            <link>https://medium.com/@ExplosionPills/on-code-reviews-in-2021-71febc88f231?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/71febc88f231</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[code-review]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Fri, 07 May 2021 18:33:22 GMT</pubDate>
            <atom:updated>2022-02-25T16:41:30.677Z</atom:updated>
            <content:encoded><![CDATA[<p>Back in 2017, I wrote an article called <a href="https://medium.com/@ExplosionPills/on-code-reviews-83e07f448c3f">On Code Reviews</a> that was both an open article on the topic of code reviews as well as some documentation for my then-and-still-current employer, Mobiquity, and its developers. I think that article is still relevant and has good information, but of course there have been tremendous changes in software development within the last four years which is an unavoidable aspect of a very fast-moving industry. I would not say that my opinions on code review have changed, although they have evolved. While that article is still a good read, it’s not necessary to read as a precursor to this article which should stand on its own.</p><p>After rereading the original, I also realized that I never filled in the section about web development specific code reviews. This article will only provide my general thoughts on code review, its purpose, and how to approach it, but this time around, I will write a separate article that includes specific examples based on a review that I did recently. My goal is that this article will change how developers see code review and how they approach it or at least reinforce its important aspects.</p><p>The example code review is finally available here: <a href="https://medium.com/@ExplosionPills/an-example-code-review-490b2418475c">https://medium.com/@ExplosionPills/an-example-code-review-490b2418475c</a></p><h3>What Is Code Review?</h3><p>The process of code review is nebulous and varies from organization to organization. In simplest terms, it is self-descriptive. However, this says nothing about how and when one should approach code review nor does it say anything about its goals.</p><p>Code review is an open and ongoing communication between authors and reviewers about the authors’ code. Usually there is only one author’s code being reviewed, and it is common for there to be one reviewer, at least at a time, although multiple reviewers are also very common. The mechanism for the communication can be anything, but frequently a code review is presented in the form of a report — inline and general comments about the author’s code. The report is an important and lasting aspect of the code review, but it’s not the only aspect. Reviewers and authors can have in-person, virtual, and text discussions about the code as well. These artifacts are more ephemeral, but they are not any less important.</p><p>The reason why I present code review as a communication will become clearer when I get to the purpose of code review. I think that communication describes it more accurately than discussion. While discussions do occur and are important to a code review, especially for large reviews where alternative solutions are presented, not all aspects of code review may be strictly discussed. For example, there may not need to be any discussion after pointing out a misspelling in the codebase. I think that it would be a bit harsh to say that a discussion should be a required part of a code review, and especially in some small cases, the only communication that may happen is that the reviewer signs off on the author’s changes.</p><h3>The Purpose of Code Review</h3><p>The goals of code review can get lost in the shuffle as it is commonly baked into the process of software development for organizations or projects. In spite of this, we can’t lose sight of the goals, or we risk the process becoming meaningless. Glancing at and signing off on code so that we can release a feature is not code review.</p><blockquote>Code review maximizes the number of people who fully understand the code and alters the code to achieve its purpose optimally.</blockquote><p>Code review is often thought of as an aspect of quality assurance, and it is, but discovering bugs, misses, and technical debt is a side effect of the core purpose of code review. If the code is understood better, issues in its quality become clearer. Reviewers typically perform the code review, but authors are an integral part of code review as well and should view themselves that way. After all, there wouldn’t be a reason for a code review if the code to review hadn’t been written by the author.</p><p>Getting the most out of a code review requires getting into a particular mindset. As a reviewer, you should go into the code review…</p><ol><li>expecting to learn as much as possible from the author.</li><li>expecting to teach the author as much as possible.</li></ol><p>Thus, the best attitude to have when approaching a code review is one that is grateful and inquiring. No matter how senior the author or reviewer may be relative to one another, there will be something to learn or teach that can come out of the review of all but the simplest of changes. I prefer this grateful and inquiring attitude over one of a critical eye. While it can be very satisfying to catch logical issues in a code review, this may narrow your vision to the point where you miss the bigger picture. An open-minded approach allows you to not only catch possible issues, but also to learn and teach potential improvements that can be applied to a broader scope later on and even in future projects. My boss reminds me of one of the core tenets of Mobiquity code review:</p><blockquote>Be Kind.</blockquote><h3>How To Code Review</h3><p>This section won’t go into the technical aspects of code review. Instead, it will discuss a general approach to performing code reviews, including how to get started and how to finish. It will offer suggestions for leaving feedback and documenting what was learned in an effort to help you and your team get the most out of your code reviews.</p><p>As with any other exercise in software development and other disciplines, the only real way to improve is to practice. Learning new skills is always awkward, and that awkwardness can be a sign of growth. If you are new to code review, you shouldn’t let that fact discourage you from leaving feedback. I believe that developers should start code reviewing from the beginning. Of course, you should support and supplement a novice developer’s code review, but this is not to say that they can’t have great feedback. Even their questions and attempts to learn can help a very experienced developer see things a different way or reinforce good practices. If you’re a developer who hasn’t had a chance to review someone else’s code, you can and should practice by reviewing your own code. In fact, all developers should review their own code before they submit it to be reviewed by someone else.</p><p>You are bound to make mistakes no matter how experienced you are, and it’s important to be ready to accept those mistakes. The collaborative nature of code review is what minimizes mistakes, not the talent of individual people. As an author, you should have the grateful and inquiring mindset and not one that is defensive. As a reviewer, you should have the grateful and inquiring mindset and not one that is antagonistic. Reviewers may make mistakes in their review as well, and these can also be important learning experiences.</p><h4>Starting the Review</h4><p>Code review is not just a spot check, but a process. When getting ready to review code, you should start with the mindset described in the previous section: a grateful and inquiring open mind that is prepared to learn and understand as much as possible. You can approach it like you are sitting down to study or read to understand. Do the best you can to make sure you have the time and solitude necessary. Finish other outstanding work and try to eliminate other distractions.</p><p>If it’s feasible, work with another reviewer and especially the author. There is no substitute for being together in person, but this is often not very realistic. Virtual calls or availability on messaging apps are substitutes that will often have to do. The globalized nature of modern software development may also put heavy time constraints on team availability, so you may need to review a merge request when someone is inactive in order to meet a deadline. Keep in mind that code review does not require a merge request even though merge requests require code review. Your team should take time to review code when some or all of you can be together.</p><p>Depending upon the breadth of the code review, you may not be able to do the entire review in one sitting. If you’re approaching the time you’ve allocated for doing the review or what you can mentally handle, get to a good stopping point and be prepared to pick back up later on or on another day. Keep the same startup approach when you’re ready to start again. Rushing a code review will work as well as rushing anything else including writing and testing code. It may even be appropriate to tell the author that they should push code for review more often and in smaller, logical chunks.</p><p>You can time box your code review based on what you are reviewing and what you think you can do. It may also be useful to select certain chunks or even files that you want to go through at a time and split those up to be reviewed at different intervals. Every developer is different, and you will find what works best for you through more practice and experience.</p><h4>Leaving Feedback</h4><p>Your team should adopt a convention for leaving feedback on code. It’s very often that this is done through comments on merge requests which are a great tool. You may also want to document conversations about a particular merge request or code review meeting that you can refer back to later. Once you’ve completed this documentation, you can also synthesize it into lessons that can be applied to future development, reviews, and ultimately, standards.</p><p>Feedback needs to be inquisitive. You should give the author the benefit of the doubt when you come across something you don’t understand. Your code review will likely consist of more questions than anything else. There may be satisfactory answers to those questions, but even asking the question might help the author see a better approach. When giving feedback in a code review or otherwise, I’m always reminded of Alexander Pope’s words in “An Essay On Criticism,<strong>”</strong></p><blockquote>Men must be taught as if you taught them not,<br>And things unknown propos’d as things forgot.</blockquote><p>You are much more likely to get someone to adopt a solution to a problem if you get them to think that it is their idea. The point is not to be manipulative because that won’t work and isn’t a good long term strategy. Instead, you are trying to help the author see the full depth of the solution, and they will inevitably see it differently than you do. In the end, they may understand it more deeply. You also need to remember that your proposed solution may not be optimal or even better than what was already written. As long as you have the grateful and inquiring mindset, you won’t be set back on your heels too much when you make a mistake like offering a suggestion that won’t work.</p><p>In simple terms, you can leave positive or negative feedback. The word negative is loaded, but in this context it would be any feedback that suggests a change to the original code. I have very rarely seen positive feedback on a code review, but the purpose it serves is the same. If you want to reinforce a practice that a developer has done well, positive feedback is a great way to do it. Even though people are prone to remember and act on negative feedback, they are also prone to pay attention to positive feedback. Positive feedback is often ignored by organizations in general. I could get into a deeper discussion about why this is, but instead, I’ll just end with this reminder: positive feedback on a code review is a necessary and useful tool.</p><h4>A Good Conclusion</h4><p>When you finish your first pass of a code review, your work is not done. In fact, you’ve introduced more work now because you not only need to go back and review the code again, but you also need to review your feedback. You should be prepared to read through the code multiple times in order to increase your understanding and offer more feedback. You may realize that you made a mistake in your own feedback as well and need to make corrections.</p><p>I’ve seen a suggestion that code should take about three times as long to review as it took to write. What this really says to me is that there is no relative limitation on how long you can review code. As with books or any other media, you can consume them over and over and still find new details that you didn’t notice previously. For this reason, it’s important to define a stopping point for yourself as part of your preparations for the code review.</p><h4>Implementing Feedback</h4><p>Code reviews are often looked at as pass-fail gates for introducing code changes into a project. Existing version control and merge request tools, and the software development process itself can make it difficult to accept some code changes in a merge request while rejecting others. Thus, recommended changes are often split into two categories:</p><ol><li>Changes required to accept the merge</li><li>Technical debt items that will be refactored in the future</li></ol><p>Cynics can point out that technical debt items will never be done, but I still think it’s possible to learn lessons from feedback even the changes themselves aren’t implemented. As a reviewer, part of your responsibility will be to move development forward with an appropriate level of quality. It’s a judgment call that takes practice and is impossible to do perfectly.</p><p>In the past, I have accepted code changes to move the project forward in contemplation of refactoring at an appropriate time. Then, I’ve provided my own merge request with refactoring suggestions to be reviewed. I think this is a good approach, although it’s difficult to do very often since it requires code stability, among other things. Not all reviewers may have time to refactor in this way as well, but it is an approach to code review to keep in mind, and you can always do it on a small scale and as an example.</p><p>Reviewers and authors must be willing to compromise and decide on the optimal outcome of the code changes based on their constraints. Achieving this takes time and practice, but it’s a necessary part of the software development exercise. If you are a reviewer who is not having your code changes successfully implemented, you may want to revisit the feedback that you are leaving. Your goals may be overreaching or even incorrect. In this case, it may be better to adopt the standards of the team.</p><p>On the other hand, authors must pay attention to feedback that they get consistently. Don’t resist refactoring or implementing suggestions only because of a time crunch or visceral disagreement. Make sure that you understand the technical debt that will be created if you don’t address it now. If your code is correct, you may be able to improve its clarity or documentation as well to reduce the red herrings of reviewers in the future.</p><p>The ongoing communication between reviewers and authors that is engendered at least in part by code review will help them improve in quality over time. Authors may improve their code writing in general, and reviewers will learn better ways to give the team feedback. You and your team must work together to find the best way to learn from and implement feedback at the appropriate time.</p><h3>Being Realistic About Code Review</h3><p>In an ideal world, everyone including myself would follow all of the advice that I’ve laid out in the previous sections, but if we lived in an ideal world, we wouldn’t have the problems to solve that make software development necessary. In fact, software development is frequently a very messy and disorganized enterprise. While I present the advice above as an ideal to strive for and to look towards, in practice I realize that it is impossible for people and organizations to follow this consistently.</p><h4>Working With Time Constraints</h4><p>The first major blocker to optimal software development, including code review, is time constraints. Being able to spend three days reviewing code that it took one day to write sounds like a beautiful dream, but most reviewers have their own code that they need to write as well. A reviewer may also be focused on other tasks that they need to do while in the middle of an urgent code review which will inevitably lead to mistakes but is simply unavoidable.</p><p>Code review needs to be baked into any estimates of effort alongside other non-functional requirements like testing. It will be up to your team to determine how code review impacts your estimates. For example, in a story point model, a 3 point story might equate to a day’s worth of coding at your normal velocity and an additional day’s worth of code review. Perhaps you might even be willing to equate that to three days’ worth of code review too.</p><p>When there is breathing room, it’s important to take a step back and see how code reviews overall for your team or project are going. A meta analysis of code reviews can help provide feedback for individual improvements or a chance to improve the standards. Reviewers won’t have much opportunity to improve if there is no appraisal of their work. These breaks in the schedule can also be used for code review of existing code that is not part of a merge request. This can help you create technical debt items that you can incorporate alongside other fixes. Stabilization and refactoring efforts should be applied not just to the code itself but to the general process of software development including code review.</p><h4>Common Pitfalls</h4><p>As projects go on, code reviews can become the victims of what is often thought of as entropy even if that may not be physically accurate. When a project is first started, there may be a lot of excitement about code review, attendance, testing, and other actions that are viewed as ancillary to the coding. As time goes on, especially if work becomes difficult and timelines draw near, the quality of any of these ostensibly ancillary actions will be sacrificed to allow for more focus on the coding itself. Things just need to get done. The problem is that the quality of the code will suffer too which introduces more technical debt that can create a downward spiral in quality that can be more difficult to recover from than if it were addressed in the first place.</p><p>Your team needs to have the mindset that all quality assurance exercises including code review are critical to software development. They can’t be sacrificed on the altar of coding because they are so integral. If you sacrifice them, you will have to pay for that cost elsewhere and probably further down the line. I won’t berate a team’s slip in their code review quality. We’re only human, after all, but the slip is not an inevitability.</p><p>While in the weeds of a project, especially a difficult one or one approaching a deadline, it can be very difficult to see these sorts of quality slips. This is why rituals like the Scrum retrospective are so important. In addition to giving everyone a bit of a break and providing a forum for honesty, they give the team a chance to shine a light on these lurking quality problems. If code review has become perfunctory, it may be a good time to go through some training or introduce a third party to take look.</p><p>The usefulness of quality exercises diminishes when they are seen as more and more routine. A high quality code review requires a level of deep focus that is not always attainable, especially in high stress situations. There can be no doubt that developers get burned out reading code as much as they do writing it, and the quality of code review from both the author and the reviewer can fall into the downward spiral alongside any other quality exercise. Eventually, it can get to the point where it appears useless, and developers merge code without offering any feedback, or authors that are tired of seeing seemingly the same issue over and over push for a merge without addressing the feedback.</p><p>Code review is only as useful as you make it. If you go in with the mentality that it’s a drudge that you have to complete because it’s part of the process rather than a quality exercise that is necessary for its own sake, it’s bound to go poorly. If you can’t get into the grateful and inquiring mindset, free from as many distractions as possible, you may want to schedule your review for another time.</p><p>In that vein, I will get into the specifics of what you should look for and the kind of feedback you can provide in another article.</p><h3>Summary</h3><p>I will reiterate my definition of code review: it is an open and ongoing communication between authors and reviewers about the authors’ code. I will also restate the goal:</p><blockquote>Code review maximizes the number of people who fully understand the code and alters the code to achieve its purpose optimally.</blockquote><p>The code review itself can be considered a report that reviewers create in response to authors’ code. More broadly, code review is a subprocess inside of the larger software development process that is a collaboration and communication between reviewers and authors which often includes discussions, changes, documentation, technical debt items or other issues to be tracked, and much more.</p><p>Reviewers and authors should approach code review with a grateful and inquiring mindset. This will allow both to learn and grow, and the code will be better off. After a review, the reviewers should be able to fully understand the authors’ intent, and all should concur that it aligns with whatever the stated goals of the code may be. This process is an integral part of software development, and this can’t be understated. You and your team will greatly benefit from a strong understanding of how to code review properly and a hardening of your code review process.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=71febc88f231" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Magic: The Gathering — Why Play Sealed?]]></title>
            <link>https://medium.com/@ExplosionPills/magic-the-gathering-why-play-sealed-546664599ba9?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/546664599ba9</guid>
            <category><![CDATA[magic-the-gathering]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Tue, 09 Mar 2021 21:50:13 GMT</pubDate>
            <atom:updated>2021-03-09T21:50:13.449Z</atom:updated>
            <content:encoded><![CDATA[<h3>Magic: The Gathering — Why Play Sealed?</h3><p>I just got into playing sealed on Magic: The Gathering Arena. Before I decided to give it a try, I had very rarely played sealed and usually focused on drafting when playing limited. I was looking for an article or something that could explain why someone would choose to play sealed instead of drafting. For whatever reason, I just decided to take the leap and really fell in love with it. Sealed is not always available on MTGA, but I definitely plan to play it more when it comes around again.</p><p>This article is aimed at three groups of people: constructed players who avoid limited, draft players who avoid sealed, and any MTG players who just like reading opinions about the game.</p><p>I’m not sure exactly what prompted me to try sealed except that I had seen it making the rounds with some content creators on YouTube. When a new set comes out, I usually like to draft for a while until I learn the mechanics and synergies of the new set. Then, I’ll start trying to build constructed decks based on what I’ve learned from limited. I play Standard more than anything else, although I still draft quite a lot.</p><h3>Why Play Limited at All?</h3><p>I’ll try to answer this question for constructed players who really enjoy MTG but who haven’t given limited a try. Limited offers a very different playing experience than constructed. Constructed players will get to play with the exact same deck and cards as many times as they want to. Some constructed players stick to only a single deck or archetype and may play hundreds of games with it. Others may play a wide variety of decks in constructed, but in theory you can play whatever you want in constructed and optimize the deck as you see fit.</p><p>I mainly play standard, so I am certainly a constructed player as well. The big difference in limited is that the card pool from which you can construct your deck is … well … limited. While these additional limitations on your deck building make your deck a lot less powerful, it also adds a different dimension to the game. You have similar deck construction requirements to constructed except with a much tinier card pool, and it’s much rarer to have many multiple copies of the same cards. This makes your play patterns more consistent or at least known ahead of time even though there is high variance in what you may be playing against.</p><p>With limited, since you often have only one or two copies of the same card, games tend to have much higher variance. This also gives you an opportunity to play with a lot of cards that you otherwise wouldn’t play with, usually in the common and uncommon slots. Granted, many of these cards may not be particularly exciting, but it does always give you something new between the 4–9 games you usually get to play with your limited decks.</p><p>I like playing limited a lot when a new format comes out specifically to learn about synergies and archetypes that might not immediately be obvious just by reading the cards. This informs the kinds of decks I would like to play around with in constructed as well. From an MTG Arena perspective, the packs I open and win in limited also give me cards to play with from the new set in constructed too.</p><p>To summarize:</p><ul><li>Limited is a very different game than constructed in both deck building and play patterns. Trying the other out will give you a new experience.</li><li>Playing limited gives you an opportunity to play with a lot of cards or groups of cards you would otherwise ignore in constructed.</li><li>Limited gives you insight into the mechanics, archetypes, and synergies of the set in a unique way. This can be beneficial to your constructed play as well.</li></ul><p>I think that people who don’t like limited (or constructed for that matter) have their own personal reasons and preferences. It is true that deck power in limited is substantially lower which leads to less opportunity for flashy plays and the play patterns are also inconsistent. It can be tough to get into and know what you’re doing. The fact that constructed is free-to-play and limited is only pay-to-play on Arena may also be holding people back, but if you do have an opportunity to try limited out, I suggest that you take it. At least it will be a different experience.</p><h3>The Difference Between Draft and Sealed</h3><p>For those who don’t know, there are two major limited formats: draft and sealed. In draft, you sit around a [virtual] table with three packs. You open the first pack, choose a card that you want in your deck, and pass the rest of the pack around the table. Another player will pass you their pack and you choose from the remaining cards. This process continues until everyone has selected all of the cards from all three packs.</p><p>The actual drafting portion of draft is a major component and also a major draw. This gives you a lot of interactivity with the other players who are drafting. You have to read their signals and see which colors or color combinations are available. If everyone is trying to play Red, or a specific archetype like cycling, the pool of cards available for you will be very shallow if you go along. You also have a limited amount of time to make a card selection, so you must analyze your options relatively quickly. This combination of high interactivity and skill is a major draw for the draft format.</p><p>Sealed is more straightforward. You open six packs and create a deck from the card pool. Both formats allow you to add as many basic lands as you want to your deck.</p><h3>So why play Sealed instead of Draft?</h3><p>When I was first thinking about trying Sealed, I looked for an article with this exact title, or at least something that would go to bat for sealed, at least as opposed to draft. I didn’t see anything this specific. Most of what I found was advice about how to play sealed with some generic praise thrown in: “sealed is awesome!”</p><p>I had seen some discussion about sealed and some YouTube content creators playing sealed online, and as someone who plays a lot of draft, I asked the initial question, “why not sealed?” I was held back a bit at first because of the cost on MTG Arena: 1,500 gems for draft and 2,000 for sealed, but sealed is actually a better deal since you get 6 packs whereas you only get 3 for draft. That’s a potential reason to pick sealed over draft if you’re trying to build your collection, but I’m more interested in why you would want to play sealed from a gameplay perspective.</p><p>There seem to be some people that prefer sealed over draft and play sealed much more often. Sealed is not always available on Arena, though, and it seems like it’s much more common to have people who draft exclusively. I enjoy playing both, so I wouldn’t necessarily suggest that someone should only play sealed or only play draft. I like the variety, and, as I mentioned, I like to play constructed too. This section is more about why you should give sealed a try instead of draft sometimes and not suggesting that you should only play one or the other.</p><p>I’m not quite certain about what pushed me over the edge to finally give sealed a try, but for whatever reason, I just did it, and I thoroughly enjoyed it immediately. One of the big draws of draft is the drafting portion itself and the concomitant interactivity with a bunch of other players. For me, it’s the biggest draw, so my question about why to play sealed in a sense was why to play a limited format that lacks the main draw of playing limited in the first place. Once I gave sealed a try, I discovered that it’s because it has its own big draw which is the deck building from a larger card pool.</p><p>When you’re drafting, you do get to see more cards overall than you do in sealed. This gives you a larger selection, but because you have to build a cohesive deck with limited slots, your choices overall are limited. With sealed, you have twice as many cards to build your deck from the get-go. In draft, you only see up to 15 cards at a time, but in sealed, you have all 90 cards available to you all at once, and you have to make your choices from there.</p><p>The drafting portion can be a bit slow. I’m personally a very fast drafter. To be honest, I would probably be better at drafting if I slowed down a bit, but I’m a fast drafter and a fast player. I usually have to spend a significant portion of the draft waiting since ultimately everyone has to go at the slowest drafter’s pace. On MTGA there’s not a lot else you can do to pass the time with everyone else, and you can’t put social pressure on people to select faster. It can be mildly frustrating at times, but more than anything else, it’s just downtime. Once you open your packs in sealed, you can totally go at your own pace with the deck building. This is good for both fast and slow drafters. If you want to jump into the games quickly, you can build your decks as quickly as you like. If you’re slow and methodical, there’s no downside to taking all the time you need to build your decks.</p><p>Working from a card pool that is twice as large is also a totally different experience. Common advice in sealed is to build as many different decks as you can. In my experience, you rarely have enough cards in two colors to make a purely two color deck in sealed, but you can usually make all different kinds of three color decks. After you finish drafting, you will probably have already selected the colors of your deck. It’s rare that you can go in a very different direction than what you were intending by about halfway through the draft once it comes to deck building.</p><p>Because you ultimately see fewer cards in sealed, this makes it more difficult to get all the cards you need for some specific strategies. You also get 6 rares in sealed. In draft, you will get to see at least three rares, and it’s not unheard of to have a draft deck with 6 rares, but it seems more common to me that you will end up with two or three. With sealed, you are unlikely to use all of the rares or uncommons that you get, but you should be able to use more of them more regularly. These occurrences tend to make sealed decks slower and more powerful. In this way, sealed is a bit like a bridge between draft and constructed although it is still very heavily on the limited side of things.</p><p>I hope that I have convinced some people to at least give limited or sealed a look. If you have never played sealed before, it will be different from your experiences in constructed and draft, so for that reason alone, it may be worth a try. If you’re used to drafting, you may want to play sealed if you don’t want to feel the pressure and downtime of the draft itself and instead build a unique deck at your own pace. You may also be interested in more powerful yet slower decks that are still limited decks.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=546664599ba9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What I Got Right and Wrong In My Theros Beyond Death Article]]></title>
            <link>https://medium.com/@ExplosionPills/what-i-got-right-and-wrong-in-my-theros-beyond-death-article-543cc26e65c4?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/543cc26e65c4</guid>
            <category><![CDATA[magic-the-gathering]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Thu, 09 Jul 2020 17:27:07 GMT</pubDate>
            <atom:updated>2020-07-09T17:27:07.594Z</atom:updated>
            <content:encoded><![CDATA[<p>Original article here: <a href="https://medium.com/@ExplosionPills/the-cards-im-most-excited-about-in-theros-beyond-death-336ef632e7b9">https://medium.com/@ExplosionPills/the-cards-im-most-excited-about-in-theros-beyond-death-336ef632e7b9</a></p><p>Two other sets have already gone by, so this article is way overdue. I didn’t do a full set analysis of TBD, but I commented on some possible constructed and limited applications for a few cards that stood out to me. I got things right, and plenty wrong, so I’ll go through each of the cards I discussed here and talk about that.</p><h3>Elspeth Conquers Death</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*B7S7NAuHX7Q4Lbp9" /></figure><p>I was originally pretty excited for this card, but that excitement has waned. Now that this card has become ubiquitous, I can’t stand it anymore. However, I do think that it’s a good card for the meta that is also fair. It gives competitive decks the ability to respond to things that are indestructible. It also punishes opponents for killing whatever you have be it creatures or planeswalkers, although leaving them alive may be a punishment in and of itself. I just think it’s a little <em>too</em> competitive. It’s gotten to the point where players will exile each others’ ECDs. In spite of my prediction, I think that it’s actually turned out to be way more powerful than The Eldest Reborn ever was (and I called it “far inferior” to that card), and that’s mainly because of its I which has the flexibility to remove any threat at all. Getting things back from your own graveyard is usually what you want to be doing anyway. The 3 mana target CMC limitation doesn’t matter in most matchups, although there are a lot of competitive Lurrus decks running around, but hey, one card can’t be good in <em>every</em> situation (except Teferi, Time Raveler).</p><p>My final analysis was that the card would be too inefficient as removal and too slow for recursion. Boy was I wrong… control decks would run 10 of these if it were allowed. It was good in limited too. It turns out that 5 mana to exile basically anything is more than just reasonable… it’s really good. It doesn’t even have to do anything else to be good, but not only does it do something else, it does something very powerful, and it turns out that starting Teferi, Time Raveler at 5 loyalty instead of 4 is a bigger deal that it would appear at first too… and that’s just one example of what it’s capable of.</p><p>This also doesn’t need to be in reanimator decks like I first though… as I said, its removal effect is so powerful that it doesn’t even matter if you can’t reanimate something by its III, but that’s unlikely anyway. There actually aren’t many better turn 5 plays… Nissa, Who Shakes the World comes to mind, although that’s usually found in a different style of deck anyway.</p><p>I was way off about this card, except I’m more annoyed by it than excited.</p><h3>Kiora Bests the Sea God</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*czzS_p9-IbDjexhJ" /></figure><p>As much as I underestimated the power level of the ECD Saga, I overestimated the power level of Kiora Bests the Sea God, at least in constructed. It’s still arguably the best card in Theros limited earning nicknames like Kiora Bests Your Opponent, but when it comes to Sagas, the I for ECD is much more powerful than I anticipated, and the I for Kiora Bests is much less powerful than I thought, for the most part. The 8/8 Kraken for 7 mana isn’t all that great against most competitive decks, and that’s assuming you can even get to 7 mana in the first place. Even if you did, you’d probably want the Saga’s most powerful effect to happen first which you could have already done with Agent of Treachery before it was banned. Couple that with the fact that this saga can be bounced, removed, or even exiled by ECD itself, and it’s just too much of a liability to really be competitive. It turns out that my comparison of this being close to Agent was off as well … they’re not that close because you don’t get the agent effect until 2 turns later, and there are better and easier ways to cheat out Agent as well, so much so that it finally got banned after the Ikoria tools.</p><p>All that being said, I still underestimated it as being an A- in limited. It’s just an A+ bomb that you should build your deck around, and probably the best card in the format all things considered. I can’t count it out completely in constructed what with Agent being gone and there not being another way to steal permanents, but the 7 mana and 2 additional turn cycles needed for the powerful steal effect still hold it back, and it’s not worth including cards that would otherwise not really do anything like Mirrormade or cards that just proliferate. I’ve still had fun playing it in some non-competitive constructed decks, though.</p><h3>Nadir Kraken</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*Qsu2c5gOLwgymWUd" /></figure><p>I think that overall this has turned out to be a bit of a disappointment. It just has a bad baseline as a 3 mana 2/3. A 3 mana 3/4 is so-so, but it’s still not great since it lacks any kind of evasion or other effects that make it worth than one card. The problem is that you have to invest mana into it in order to keep it growing. There are other cards including some new ones printed in Core Set 2021 that get counters for free when you draw a card that aren’t strong enough to see constructed play. The fact that you get a 1/1 tentacle for that additional mana too isn’t enough to justify the cost. If you’re not using all your mana every turn until at least turn 6 or so, so there’s never really a good opportunity to invest mana into this even if you’re drawing extra cards for it.</p><p>It was still a bomb in limited, although I’ve definitely lost with it a few times and beaten it a few times. In limited, being able to use all your mana every turn is much less common, and the additional 2/2 worth of stats for 1 mana is actually worth it in limited too.</p><p>I did say it would probably find a home somewhere in constructed, but I don’t think it ever really did. I didn’t end up building around it during the format. It didn’t end up making waves in standard like I had predicted.</p><h3>Thryx, the Sudden Storm</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*eAQhZZEi_9y4wzcg" /></figure><p>I was correct about this card for Limited since it was generally a 2-for-1 that was also a win condition. I don’t think that its other abilities ever came up for me, but big flyers are just good in limited in general.</p><p>I thought that he could work in control decks in standard, but he never really did. I think that he was competing mainly with Cavalier of Gales, but that card was never really played anyway except in Fires of Invention decks. In fact, those decks are probably a small part of the reason why Thryx never took off since if you were playing Fires you couldn’t take advantage of the fact that he had Flash nor did the discount really matter. He was too expensive for Simic Flash decks which became unpopular anyway, and there are just better 5 mana plays in general like ECD and Nissa. His ramp ability was inconsequential in a deck that was ramping anyway.</p><p>Sorry, Thryx… you just weren’t as powerful as I first thought. You are probably one of the most annoying Brawl commanders out there though.</p><h3>Purphoros, Bronze-Blooded</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*ZqxuSKFIBEAIVF3l" /></figure><p>Purphoros really didn’t need Fires to get going… he could pop out a hasty Drakuseth which was usually enough to win. I’ve never gotten that sort of deck to work, although I have seen it work for other people quite a few times which was frustrating.</p><p>Fires also didn’t need Purphoros to get going either. Cavalier of Flames is a much better enabler and also provides haste to all your creatures with less of a cost. I do think that I was still right about how bad he was in limited. The gods in general were disappointing and were really difficult to turn on, and Purphoros probably had the worst static abilities combined with the most expensive casting cost, so at least I was right about that. I was never sure whether Purphoros would actually work competitively in constructed, but I was wrong about where he would potentially see play in general.</p><h3>Destiny Spinner</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*EM0BhVwpLRYxuFmo.png" /></figure><p>Once Theros Beyond Death came out, people stopped playing Simic Flash for some reason, so Destiny Spinner’s static ability really didn’t matter that much. A 2 mana 2/3 is efficient, but that’s basically all she is, and that’s not a card for constructed. There are much better things to be doing on turn 2. If Simic Flash had continued to be played as frequently as it was, I think that Destiny Spinner might have seen a bit more play than it did, but Nessian Wanderer is probably what you’re after for a green 2 drop from TBD, especially if you’re ramping.</p><p>At the very least, she was quite good in limited as an efficient creature with some real late game potential. There were enough enchantments around to easily turn a land into a 4/4 or 5/5 trampler which could break open stalls.</p><p>I don’t want to say she wasn’t played, at least in sideboards, and Simic Flash seems to be having a bit of a resurgence, so maybe some players will start dusting her off.</p><h3>Nyxbloom Ancient</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*ZSlY3RtQhfsFutQ6" /></figure><p>I think that this card has remained the curiosity that I presented it as initially, but it really hasn’t been anything more than that. It was unplayable in limited, so I was right about that. That I know of, it hasn’t found its way into any competitive constructed deck in any format, but people have played it here and there for fun including in formats like Brawl. I haven’t built a deck around it myself, but I have copied one an opponent played with Mirrormade to great effect which was quite fun. Mainly because it costs 7 mana, I don’t think it can ever really see much play even in janky decks, but from time to time I’ll see if I can build some crazy big mana strategy centered around it.</p><h3>Setessan Champion</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*D98-YvxAyHdJ2ryP" /></figure><p>I was probably most wrong about this card in terms of how much fun I would expect to have with it. I played Setessan Champion in a ton of decks, and it’s always been a lot of fun. I think the largest I’ve ever gotten one is a 9/10, but I’ve seen larger ones played that were buffed with things like All That Glitters. This never rose to a competitive level, but it was still played more than enough in Tier-2 decks, mainly those focusing around auras or enchantments like Season of Growth. I’ve enjoyed it in Simic, Abzan, and Sultai builds too.</p><p>I don’t think she was quite at the bomb level in limited, but she was definitely a lot better than I first presented her in the original article. She was a powerful and consistent card draw engine… there were just so many enchantments available.</p><h3>Allure of the Unknown</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*1WbMGebZmpMoRbDT" /></figure><p>I was wrong about opponents not being able to cast any spell they could choose with Allure of the Unknown. This severely lowered its potential power level, but ultimately, it wasn’t that strong to begin with.</p><p>I tried to make this work in all kinds of decks… I really did, including decks that ran a lot of counter and X spells or decks that ran Brazen Borrower to bounce what the opponent played back to your hand among other strategies. In spite of all of that, the limitations you have to put on your deck to play this card restrict the potential card advantage severely. It is a draw 5, but a few of those are going to be lands anyway. That’s not awful, but it’s 1 mana more than something like Drawn from Dreams which actually lets you look at more cards and can probably get you what you need more efficiently and more safely.</p><p>I don’t think I ever drafted it, so I honestly can’t say how it performed in limited, but I don’t recall ever hearing about it, so I can conclude that it didn’t do well there. Overall, it’s just too much of a downside giving your opponent a free spell no matter what it is and no matter how many ways there are to mitigate against it.</p><h3>Ashiok, Nightmare Muse</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*tuNEtDb9gsSv-5rn" /></figure><p>I think that everyone was kind of excited about Ashiok at first, and he/she was played more than she/he should have been in constructed, but it’s still not the worst 5 mana planeswalker ever. It did slot nicely into Grixis superfriends decks that didn’t have a ton of other options for 5 drops anyway, but those decks have never been super competitive, although they are strong. I don’t really see this card played anymore. It’s sort of the same story with Liliana… the meta has just shifted to the point where their creature tokens and removal just aren’t effective for their cost, even if you have the possibility to do both things over a couple of turns. There are just stronger things to be doing. His/her ultimate is also not that easy to get to anyway, and forcing opponents to discard doesn’t do a ton what with all of the powerful card advantage engines available in standard.</p><p>In limited, Ashiok was definitely a bomb, and probably more powerful than the A- I gave her/him at first. As I had said, Planeswalkers are just always good in limited more or less no matter what they do. 5 mana for a 2/3 in limited is bad, but if you’re desparate, it will do, and bouncing something for 5 mana is not unheard of either.</p><p>Overall, I think that I was mostly right about Ashiok as a powerful limited card and a niche constructed card that people were curious about, but that couldn’t quite take the decks he/she was played in to the next level.</p><h3>Dream Trawler</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*gqwZKWbulAajmmDl" /></figure><p>This is probably the card that I was most right about in my predictions. This was arguably the most powerful individual card in TBD limited: a creature with evasion that created a 10 point life swing when attacking that was also a card draw engine that you could also protect from spot removal by discarding cards… a resource that it is an engine for to begin with. It’s a bit of a moot point about whether it’s better than Kiora Bests the Sea God since they are both rare cards that could go in the same deck. I think that ultimately Dream Trawler is stronger since it costs a bit less, it can save you with its lifelink, and it draws you additional cards, but it’s close. It’s more dependent on the game state as to which one is better.</p><p>By the end of the limited format, I think that people had discovered ways to overcome Dream Trawler, though, and it wasn’t quite the auto scoop that it was at the beginning of the format. I lost after playing Dream Trawler more times than I lost after playing Kiora Bests, but I also played the former a lot more overall too. There’s no doubt in my mind that it was in the top 2 cards of the limited format, though.</p><p>Dream Trawler has definitely been strong enough to see play in Tier 1 constructed decks as well. I loved this card at first… I really liked the art as well as the gameplay, but since this card got super popular and was played in a lot of powerful decks, I honestly got a bit sick of it, and I didn’t end up playing it all that much even in limited. I pointed out that I didn’t think the card would be a game changer… I think that I was right about that too. Yes, it was played as a powerful win condition in at least Tier 2 (often Tier 1) decks, (and it wasn’t played in Jeskai Fires), but it didn’t singlehandedly alter the play style or deck composition of other competitive decks in the way that Teferi, Time Raveler has, for example.</p><h3>Enigmatic Incarnation</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*lfWf67P2xa-evA63" /></figure><p>I did get to pull off the turn 2 Niv-Mizzet Reborn combo a couple of times. It was a lot of fun, but other than having a 6/6 flyer out on turn 2, it doesn’t help you a ton since your hand is already full anyway. I don’t think that it ended up being very good in limited, although there were occasionally some decks that pulled it off. I never built around it myself. For constructed, it was definitely held back to the jank tier too. I haven’t seen it played in quite a while, so I think that people had their fun with it and then dropped it into their bulk rare box.</p><h3>Gallia of the Endless Dance</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*1xT14M2MF7Tdwzqb" /></figure><p>When I first started playing the format, I was worried that Gallia was not as awesome as I wanted her to be, but I think that she ultimately did become one of the funnest cards for me to play. Just the expression on her face and the fact that she has haste makes it hard not to get excited when you cast her.</p><p>For a time, I couldn’t really get her to work in constructed. She was played a bit when Gruul was still seeing competitive play as a 2-of in some decks, but I don’t think she ever really caught on. I also tried building saytr decks to play with her, but most of the other satyrs are bad in constructed except maybe Nessian Wanderer who is not an aggressive card.</p><p>However, I’ve probably had the most fun playing with her in Brawl. She’s an awesome Brawl commander, and casting her for 4 mana isn’t a huge problem either. Since Brawl is a more open format, it’s easier to justify running more satyrs as well, and that can all represent big damage alongside her.</p><p>I think that she turned out to be fine in limited, but I don’t think I ever actually triggered her ability there. However, I have triggered it plenty of times in Brawl and standard, usually to great effect. I still haven’t managed to draw and cast an Embercleave with her ability … I did draw it once, but I didn’t have the mana to cast it (as I recall, I did ultimately win that game, though). Gallia has carried countless Embercleaves on my behalf at this point, though.</p><p>Towards the end of the Ikoria format, I rolled up my sleaves and built a Gruul deck centered around Gallia. It’s not competitive, but it has actually been a ton of fun, so I think that I ultimately did get the joy I was expecting out of playing her in standard… might be nice that I waited so long to write this article after all. The fact that she’s a fun Brawl commander was a nice surprise too. We didn’t get any satyrs in Core Set 2021 either, so I don’t think Gallia is going to be competitive at any point, but as far as I’m concerned, she’s still the funnest card on this list.</p><h3>Uro, Titan of Nature’s Wrath</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*9yw8oAWqRLHKI15T" /></figure><p>Uro has turned out to be as ubiquitous as the ramp strategy itself. Uro definitely ended up being a limited bomb. Filling up your graveyard was not hard, and the additional ramp and life that Uro gave you allowed you to keep recurring him. I think that I escaped him four times in a single game once. I never decked myself because of Uro, but I did come close in one or two games. I think that he probably ended up being an A in spite of my initial B rating, even though he couldn’t win you the game on the spot like some other bombs in the format.</p><p>He has indeed seen a ton of play in Tier-1 competitive Simic and Bant ramp decks. He even sees play in what is arguably the most powerful deck right now: Temur Reclamation. I think that I underestimated just how powerful he would be, but Cavalier of Thorns enables him so easily too.</p><h3>Nyx Lotus</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*7YtanPMd1vIrg7LW" /></figure><p>I don’t have a ton to say about this one… I’ve never actually played with it. It’s unplayable in limited, so I never drafted it, and I just never got around to building a constructed deck around it. I think that ultimately there was only one good strategy for it: mono blue self mill, and that strategy never became competitive. I was excited about the potential for this card at first, but to be honest, it kind of fell flat. I think that people have just forgotten about it now, and it’ll gather dust alongside Enigmatic Incarnation.</p><h3>Shadowspear</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*xM_3R1AjtowiI2tB" /></figure><p>I think that Shadowspear took some time to find its footing. While I predicted that it would see play immediately mainly because of its activated ability, I don’t think it’s ever actually used for that. Instead, it’s being used in low-to-the-ground decks that like to play things like Lurrus. Aggressive strategies like the additional reach and evasion it provides. I don’t think that it’s really reached Tier-1 status yet, but it’s teetering. The Equip 2 does hold it back after all.</p><p>I think I was wrong when I said, “this isn’t a bomb or anything,” because it pretty much is. That’s pretty shocking for something that’s 1 mana. It turns out that a +1/+1 boost to a lot of creatures is much more significant than it first appears. It provides evasion, and lifelink is much more impactful in limited than in constructed. It was definitely worth picking up, but where I was wrong is that it is indeed incredible in limited, and not just a very good card.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=543cc26e65c4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MTG Cards that I will miss (and not so much miss) After 2020 Standard Rotation]]></title>
            <link>https://medium.com/@ExplosionPills/mtg-cards-that-i-will-miss-and-not-so-much-miss-after-2020-standard-rotation-97b33f30f91c?source=rss-bc97e3d61549------2</link>
            <guid isPermaLink="false">https://medium.com/p/97b33f30f91c</guid>
            <category><![CDATA[magic-the-gathering]]></category>
            <dc:creator><![CDATA[Andrew Crites]]></dc:creator>
            <pubDate>Tue, 07 Jul 2020 22:44:57 GMT</pubDate>
            <atom:updated>2020-08-03T18:58:20.947Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Update: August 3, 2020 — </em><strong><em>Banned Banned Banned!</em></strong></p><p><em>Wotc announced that 3 of the cards I wrote about in this article have been banned. See their post here: </em><a href="https://magic.wizards.com/en/articles/archive/news/august-8-2020-banned-and-restricted-announcement">https://magic.wizards.com/en/articles/archive/news/august-8-2020-banned-and-restricted-announcement</a>. <em>I find it a bit unusual that they decided to ban cards that were so popular and have been around for so long, but they offer a pretty good explanation in the article: it’s experimental.</em></p><ul><li><strong><em>Teferi, Time Raveler — </em></strong><em>The protector and destroyer of jank is finally dead. Long live Teferi, Time Raveler! This is a big change since he’s been banned in all Arena constructed formats. The philosophy of bannings has changed, and now he’s even more banned than Narset.</em></li><li><strong><em>Wilderness Reclamation — </em></strong><em>Perhaps it really was too powerful for its own good.</em></li><li><strong><em>Growth Spiral — </em></strong><em>Is this the most unassuming card to ever be banned? If everyone is as sick of ramp as I am, it makes sense.</em></li></ul><p><em>I am personally glad that Cauldron Familiar was banned too. I never played with that card, and it’s a pain in the ass to play against, and it wasn’t rotating either. Sorry, kitty lovers.</em></p><p>Now that Core set 2021 is upon is, we’ve reached the point in Magic: The Gathering’s standard format where we we’ve seen all we’re going to see before set rotation. I’m taking this time to look back on impactful cards that are going to rotate once Zendikar Rising comes out, provide some analysis, and reminisce a bit. I’ll talk about cards that I was a personal fan of regardless of their power level, and I’ll of course discuss cards that had a big impact on the game whether I liked them or not. This is by no means a complete list, and I only talk about cards that I have a lot to say about or have stories about. I’ll have a long list of honorable mentions at the end, though.</p><p>The four sets that will be rotating are Guilds of Ravnica, Ravnica Allegiance, War of the Spark, and Core Set 2020. I’ve been playing MTG off and on since more or less when it first came out. I played the Duels of the Planeswalkers solo campaigns in 2013 and 2014 back when I had an Android, and Magic Duels on iOS. Once Magic: The Gathering Arena came out, I became a hardcore MTG player, and now I play almost every day. I mainly play standard constructed, but I play a lot of limited as well. Anyway, onto the cards discussion.</p><h3>Guilds of Ravnica</h3><h4><strong>Niv-Mizzet, Parun</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/0*WtTRy5c4r3h_JFVB.jpg" /></figure><p>Niv-Mizzet, Parun has the distinction of probably being my favorite Magic: The Gathering card ever, and I know I’m not the only person that feels that way. I like everything about the card from the art, to the gameplay, to the character of Niv-Mizzet himself. In fact, we’ll see him again on this list.</p><p>When I first started playing MTGA, I only played one deck which was a blue red spells deck. Little did I know how underpowered that was and remains to be in the current metagame. I didn’t even have Niv-Mizzet since I hadn’t opened him in a pack, and I wanted to hold onto my wildcards once I figured out you could actually craft cards.</p><p>Once I finally got ahold of him though, I did everything I could to make him work. He is a very powerful card individually — there’s no denying that, but he’s had major problems even before the 2019 standard rotation since he could be killed by a Ravenous Chupacabra or bounced by Teferi, Time Raveler without taxing your opponent at all. Since he costs 6 mana, and you can’t even always play him on turn 6 because of his awkward cost, this is a huge tempo (and probably game) loss. To me, he’s like the little card that could… you need to survive to turn 6, cast him, and untap with him. That’s always been a huge ask in Standard. Cards that cost 6 mana need to do something right away or have some way to protect themselves, and Niv-Mizzet doesn’t do either of those things. Apparently he was a limited bomb, but I didn’t get the chance to play the Guilds of Ravnica limited format where blue red spells with Niv-Mizzet would be a strong deck.</p><p>Niv-Mizzet isn’t the only guild leader card that seems powerful on its surface, but just can’t quite stand up to the power level or efficiency of a lot of other cards in standard. Aurelia, Exemplar of Justice and Rakdos, the Showstopper are two cards in this family that come to mind. They are powerful individual cards, but you need to untap with them to really get their value. Rakdos is a bit different in that he can be a one-sided board wipe, but there aren’t that many other Devils, Demons, or Imps worth playing, and he’s risky to play anyway since you could end up wiping your board and not affecting your opponent at all, so he never really took off.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*ZEJ6DIX9x7Gs679x" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*SOyhDsYUlqX4DiN4" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*EeDO6wDHS2USu9Jr" /></figure><p>Another problem that he has is that in order to really go off with him, you need a lot of cheap spells. A deck that runs a lot of those can easily be overpowered. While you’re casting 1 and 2 mana card draw spells, your opponent is killing you by turn 6 in the original standard, and probably around turn 4 of 5 now. All that being said, in those games where I did get to untap with him with a Goblin Electromancer and maybe even a Guttersnipe or two in play, It was fun killing an opponent from 17 life with pings and other incidental damage and card draw. Sadly, that just didn’t happen all that often.</p><p>One thing I will say about Niv-Mizzet is that he has found some competitive success in some interesting spots. He’s pretty good out of the sideboard in Bo3 (I really only play Bo1) since he punishes control and counter-heavy decks so well. Apparently he’s had some success in the new Pioneer format, and he was a good sideboard card for Temur Reclamation before Uro took over his slot. He is great with Wilderness Reclamation since you don’t have to untap with him to get his value anymore, assuming you or your opponent have instant or sorcery spells to cast. He’s also probably the best card to play against the popular Simic Flash, a deck that I’ll discuss later. He was never all that popular, so popping him out against a Simic Flash player that was holding up counterspell mana felt particularly good, and he was almost unbeatable at that point unless the opponent could kill you right away.</p><p>Maybe Niv-Mizzet will find his spark and come to Zendikar, but that seems unlikely to me. Unfortunately, all of the Ravnica sets are rotating out, so we may not see Niv-Mizzet for a while, but there’s no doubt we’ll be back to Ravnica some day.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*231f4l5BLxvQj0ny.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*Alx2gZ1Ob_Rfnv0s.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*pie_SWIqmsLpTbg7" /></figure><p>Other related cards that I don’t think are worthy of their own section include Arclight Phoenix which saw a lot of success before blue red spells became way too underpowered. Sadly for me, I didn’t open or craft any before the 2019 rotation. Crackling Drake and Pteramander were fun cards too, and played nicely with Niv-Mizzet.</p><h4>The Surveil Package</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*GJekLk__NWE-ai7P.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*7WzTjd6CYFzOP2re.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*V1m1rRjG5uLgw6v3" /></figure><p>I think that Thought Erasure might win the title for the most hated card at any one time in MTG, at least from Guilds of Ravnica onward. While I was playing blue red spells, I certainly hated it since it would usually take something very impactful. Back before the 2019 rotation when Esper was basically unstoppable, you’d see this card played on every turn 2, and I used to think it was overpowered. I’ve even seen some random posts from a while back calling for it to be banned.</p><p>Now that I know the game a lot better, and at least in part because of the 2019 rotation, Thought Erasure doesn’t seem all that powerful… it’s mostly just a one-for-one that doesn’t impact the board. I had also come to hate Disinformation Campaign, and while that does give legitimate card advantage unless your opponent is empty handed, it’s also not very powerful in today’s format. For a while after playing blue red spells, I switched to blue black surveil. I fell in love with the cards that I had once hated… especially Thought Erasure. As a newer player, I think that I mostly just liked looking at other peoples’ decks, and almost as the art implies, Thought Erasure was a good window into that. I probably annoyed the hell out of a lot of people following up Disinformation Campaign with Thought Erasure or a Nightveil Sprite activation, winning the card advantage battle. The sprite is the only free, repeatable source of Surveil, but a 2 mana 1/2 flyer gets run over in way too many match ups. It was more manageable when control and spells were still able to contend with aggro, but that’s mostly not the case anymore.</p><p>After playing with the deck for a while, I learned a lot about Magic, and cards are not always as powerful as they first appear. With the crazy amount of card advantage engines available in current standard, trying to run anything that seeks to drain your opponent of resources is a losing battle, but at least before Throne of Eldraine, it was fun while it lasted.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*l0QlYBP745onGUjv" /></figure><p>Dream Eater in particular was a very fun card, and I’ve run it in a lot of decks. A double activation with Yarok (who I’ll discuss later) was awesome, and I’ve dug myself out of many a losing situation with multiple bounces and trading the Dream Eater’s 4 power for something scary. Dream Eater reminds me a bit of Niv-Mizzet in that it’s a 6 mana card that’s powerful on its own, but just can’t quite stand up to the demands of the current metagame. If a card costs 6 mana, it basically has to say “you win the game,” and while Dream Eater does a lot of stuff, it honestly doesn’t give you any card advantage… just tempo, which is a problem for something that’s 6 mana. I will have fond memories of saying to myself, “well, it’s time to eat some dreams” before casting it and blowing my opponent out.</p><p>It does have the distinction of being what is probably the most powerful individual card in Guilds of Ravnica limited, contending with fellow surveillor Doom Whisperer and card advantage engine Experimental Frenzy, not to mention Niv-Mizzet.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*vRcHnUeRFzC1ruOH" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*J0gaPX_4GGWv5vt9" /></figure><p>I didn’t want a whole section for Experimental Frenzy since I won’t really miss it, and I don’t think that ultimately it was impactful enough to warrant more than a paragraph, so I’ll just mention it here even though it’s not part of the surveil package at all. I like the design of the card, and it was very unique. Mono Red was fairly dominant for a while, and the frenzy helped to ensure that it would never run out of gas. When I first saw the card, I didn’t understand why you would want to play it or that it would be any good. I was quite the noob.</p><p>Sinister Sabotage also deserves a mention as a surveil card, but it doesn’t deserve a picture. I both love and hate that card, mainly depending upon whether I’m the one casting it.</p><h4>Drowned Secrets</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*c-CssSAgMGivi5nY.png" /></figure><p>Drowned Secrets is not an especially unique or powerful card, but it does enable two distinct strategies very well: mill and self mill. There’s nothing else like that in standard right now since the new mill enchantment from Core Set 2021, Teferi’s Tutelage, only mills opponents.</p><p>I have to imagine that there will be a self mill engine printed in Zendikar Rising, so maybe Drowned Secrets will not be missed so much, but I have had a lot of fun playing with it and employing both strategies even if neither one was particularly competitive. There’s nothing like activating four Arclight Phoenixes out of your graveyard on turn 3 thanks to this bad boy, and even though I only did that once, the memory will still last a lifetime.</p><p>This is a big groan test card for me. I guess for the kinds of decks that I play, I will usually lose to a deck that can put out a turn 2 Drowned Secrets and counter everything for the rest of the game. As with many cards, I love playing it, but I hated having it played against me, and in mill mirrors, my opponents always seem to draw all their Drowned Secrets immediately while mine get milled away. Sure, I’m biased, but what the hell, game!</p><h3>Ravnica Allegiance</h3><h4>Cavalcade of Calamity</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*1C9s-XLGpcVcyE5J.png" /></figure><p>I would be remiss if I didn’t mention this card since in a mono red shell it was a very dominant strategy for quite a while, and it still sees play from time-to-time. I’ve always hated cavalcade decks since I could pretty much never beat them with the decks that I like to play. Even if I would come close, they would always have exactly what they needed to do that additional damage and grind me down. I also hated playing those decks myself, even though I did for a while. I just don’t like the mono red gameplay style, and it never seemed to work for me quite as well as it seemed to work for everyone else. It’s gotten to the point where I’ll usually scoop if an opponent plays a mono red card on turn one, especially on the draw.</p><p>Anyway, this card is unique — I’ll give it that. It enabled all kinds of spectacular building around, and while it’s not the most popular strategy around right now, there are still cards that are printed that could benefit from the additional incidental damage it provides. Even though I hate the deck, I can’t say I really hate the card itself. I think it’s kind of cool.</p><h4>Wilderness Reclamation</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*5MpdSAmweLiwRVNm.png" /></figure><p>There’s no doubt this card deserves some discussion since it’s been at the center of a Tier-1 deck called Temur Reclamation for a long time. I think that there are a lot of people who hate this card or think that it’s overpowered, but I disagree. There’s no doubt that it’s powerful, and it’s effectively free, but it’s still a do-nothing enchantment on its own, and you can really get blown away by playing it. Temur Reclamation is a unique strategy in that it’s always looming, and occasionally it rises up to conquer the metagame once it becomes too controlling, and then the meta shifts to counter Temur Reclamation, and the cycle continues.</p><p>Now that Fires of Invention is banned, there won’t really be this sort of mana-multiplying enchantment available unless something analogous is printed in Zendikar Rising. That certainly seems likely, but I think that this unassuming uncommon will go down in MTG history as one of the most powerful cards at the center of one of the most powerful decks during the 2019–2020 period.</p><p>I was never really frustrated when playing against this card. If my opponent started tapping individual lands in response to the reclamation triggers, I already knew I was going to lose to a big Explosion, and I could just scoop. For a time on Arena there was a bug where tapping your lands for mana would take a really long time, and you could almost time out trying to tap everything to get a maximum sized Explosion. Now, we have the QQ shortcut, playing with or against this deck is a lot more pleasant, but that came much later than we needed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/311/0*3OsijD8FGp9DD0Lc" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*suBUt8a2hUCIAJaZ" /></figure><p>Since I’m a big blue red spells fan, I’ve enjoyed Expansion//Explosion and Chemister’s Insight in a variety of other decks too. Copying Thought Erasure or Circuitous Route was always a lot of fun.</p><h4>Growth Spiral</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*pyZ7Nm9lzUk6Rrtd.png" /></figure><p>While Wilderness Reclamation is probably the most powerful uncommon card that’s rotating, Growth Spiral will take the slot of most powerful common. You’d think that a 2 mana card that does nothing but replace itself wouldn’t be all that good, but the additional land clause has totally changed the way Magic is played. Decks usually run 26 to 28 lands, and for a while there were decks running 30+ lands too like Bant ramp Field of the Dead. Missing a land drop early means you lose, and Growth Spiral is a big part of that on both sides of the field.</p><p>Arboreal Grazer is also a popular ramp card that costs only 1 mana, but the nice thing about Growth Spiral is that at the very least it does replace itself in the late game where you probably have a ton of additional mana anyway while Grazer does basically nothing. Growth Spiral is so powerful, that it’s worth countering if you have the opportunity to do so. Being able to consistently make a turn 4 play on turn 3 is a huge deal, and while there are other ways to do that, Growth Spiral just straight up gives you the additional land instead of a body that could potentially be blown up.</p><p>I still hate games that are about who can ramp the fastest, and it seems unfair to be up against an opponent who has 4 lands up when you only have 2, even if you’re also playing a ramp deck, but you didn’t draw your Growth Spiral. We already have Uro who sort of replaced Growth Spiral for the upcoming meta, but a lot of decks still run both. A turn 5 play on turn 4 is nice, but a turn 4 play on turn 3 is still a big deal in its own right. We’ll have to see if we get something analogous in Zendikar Rising, but I’m not a big fan of the ramp meta. Don’t get me wrong, I’m sure I’ve cast hundreds of Growth Spirals, but it’s usually just to give me a chance to ramp into whatever janky strategy I’m trying to employ in the Play queue.</p><h4>The Gate Deck</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*FhKOo9x5dUi_qrnt.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*1mhZhffFLwns2cMK.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*mp5r7JmCnTcfV0yh.png" /></figure><p>I have to admit that I’ve never actually played the gate deck in constructed, although I have drafted one. This will probably go down as my most hated deck ever since while I was playing blue red spells, it was basically unbeatable. It continues to be a thorn in my side even now. It’s lost a lot of its power, but the gate shell does provide a lot of options, and people doing janky things like running Mirror March or Clear the Mind tend to still beat me out of nowhere. There was no shortage of Agents of Treachery played in gate decks either before that card got banned.</p><p>The gate deck really did have everything… powerful, efficient (after discount) creatures with evasion, a sweeper that could often be one-sided, a massive card advantage engine in Guild Summit, stabilization against aggro decks via Archway Angel, and recursion with Gate Colossus. Even Growth Spiral in the gate deck was popular, and often necessary since most of the gate player’s lands enter the battlefield tapped.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*R3DbcOSMb7xwA5Gf" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*kyamX0It5QS6R56w" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*u1pxoUj80rvi8nmB" /></figure><p>The gate deck is not nearly as scary or popular as it used to be, but it still pops up every once in a while and somehow finds a way to beat whatever I happen to be doing, even if it’s not as underpowered as blue red spells was back when it was the only deck I played.</p><p>One of the most satisfying games I ever had was against a gate deck where I was running a Sultai Yarok ETB deck with The Great Henge. I laughed in the face of getting swept by Gates Ablaze and churned out card advantage drawing into more Yaroks, Goloses, and Agents of Treachery. It was nice to overpower a deck that at one time seemed like it was so unbeatable — at least in the late game.</p><p>Gate deck, from hell’s heart, I stab at thee!</p><h3>War of the Spark</h3><p>While I started playing MTGA after War of the Spark had already come out, in retrospect, I think that it really changed the tone of the power level of cards in MTG. I don’t think we’d seen anything like War of the Spark before, and it has cards that have completely reshaped the game that are still seeing Tier-1 play today. It’s also funny to think that a lot of the most powerful cards in War of the Spark are actually fairly underpowered now compared to what has been printed, but that’s all part of the design direction Mark Rosewater and his team chose since this set.</p><h4>Gideon Blackblade</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*PwhOXcRDTcjh1Z4y.png" /></figure><p>This was a very frustrating card to play against as a blue red spells player, since you can’t interact with it well when it’s a creature, and as a planeswalker, he has an awkward effective starting loyalty of 5. This is a card that seems nearly unbeatable when it’s played on turn 3 under certain circumstances… even if you get to the point where you can play something that’s more powerful than it is, he can probably remove whatever that is after 2 turns of being on the battlefield.</p><p>All that being said, Gideon Blackblade doesn’t really fit in competitively. He’s not bad in a control deck, but the double white is awkward, and he’s competing with a lot of other powerful 3 mana plays we’ll discuss later. Mono white aggro is and always has been popular, but has never quite crossed into Tier-1 competitive territory. Gideon also now has Heliod, Linden, and Banishing Light to compete with on turn 3, so even though he’s practically more powerful than those cards once he’s on the battlefield, there’s just never a great time to cast him.</p><p>R.I.P., Gideon. I’m not sure that we’ll ever see you again since your character is dead and everything, but going back in time is always a possibility. You did get an awesome last card, but it somehow still wasn’t powerful enough. I definitely scooped because of you quite a few times, though.</p><h4>The God Eternals (and Ilharg)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*YA2M8HduRx60Xeo-.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*xq4phpMp55dSFZAn.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*5x0EY6MRg4Uc4U0c.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*oGh10YpyC9LWfZmU.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*9KltXFKvhVxB1QGE.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*w20JjU6uGeXhfBEo.png" /></figure><p>I’m not really sure why Hazoret couldn’t make it to the party, but I guess from a story perspective, she wasn’t eternalized by Nicol Bolas. Anyway, I think that these cards are all similar to Gideon above… they’re all ridiculous individual cards, but they’re still just not powerful enough to be truly competitive. I think that Bontu has seen some play in the sideboard of some sacrifice decks or as a way to refuel, but the others don’t do anything the turn they come down which is a no-no for something that costs 5 mana. Okay, Rhonas does, but End-Raze Forerunners gives trample, so I think it’s a better choice in that case.</p><p>The God Eternals were all fun cards to play, and they were terrifying to me as a newer player as well. Once I had crafted a few of them — especially Kefnet for blue red spells, I wondered how I could keep losing with them in my deck. It turns out that even though it’s cool that they never really go away unless they get countered, tucking them is more of a liability than anything else. It doesn’t give you card advantage, and your opponent knows they are coming again, and they all either do nothing or not enough even if you get the chance to cast them again. If they stick around, they’re good, but still not insane. I think these are the classic Timmy/Tammy cards — flashy, but without much substance.</p><p>They still deserve a mention because I have a lot of good and bad memories of playing with and against each one of them. Popping Niv-Mizzet out with Ilharg was awesome, as was doubling a Thought Erasure thanks to Kefnet, and who hasn’t either built or faced off against a vigilant zombie army thanks to Oketra?</p><p>I included Enter the God-Eternals here too just to have a nice, even gallery for this section even though it doesn’t really have anything to do with the other cards. It still deserves a mention, though, but I didn’t want to give it its own section. This was a card that I had great disdain for when I was playing blue red spells since it would usually kill my only creature: a Crackling Drake, and leave my opponent with more life to overcome as well as a big creature. They’d probably mill over a Niv-Mizzet, Parun for good measure. This card has actually been competitive since it gives card advantage by acting as removal while giving you a creature too, but I think it’s fallen by the wayside mainly because it’s too expensive, and its cost is a bit awkward. In a meta with Teferi, Time Raveler and Brazen Borrower running around, you’re probably not going to get much out of your 4/4 token either. It was always nice when your opponent had no choice but to use this on a 5/5 or 6/6 creature that you happened to have out either.</p><h4>Feather, the Redeemed</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*W4KgQY46C-gZD2jZ.png" /></figure><p>Were it not for the gate deck, the Feather deck would probably be my most hated deck to play against except that I also played it for a while to grind competitively. It turns out that when you effectively tack on “draw a card” to anything that costs 1 mana and also powers up your aggressive creatures, you get a damn powerful deck. Once Gods Willing was reprinted in Core Set 2020, Feather decks became more frustrating than ever before since there was a pretty consistent way to protect her, but before the 2019, rotation, Reckless Rage was the card to look out for.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*aItRJOMInr_iEgAS" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*NSddjnnu9inLz5i0" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*7K6Y7MKTNE4Smkil" /></figure><p>With all the powerful removal and sweepers around now, Feather decks have really fallen by the wayside, but for a time, they were a frustrating force to be reckoned with. It’s not really my play style, but it was definitely an interesting spin on the Boros aggro shell.</p><h4>Teferi, Time Raveler and Narset, Parter of Veils</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*EL2neGtPyw1hmNin.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*FP7mvpR2AL2dNJ33.png" /></figure><p>These cards don’t strictly go together, but they often did, and I have a lot of memories playing with and against them as a couple, so I thought I would talk about them together.</p><p>They have a lot of similarities being 3 CMC planeswalkers that both have static abilities that might as well say “half of your opponents don’t get to play the game anymore.” Both of these cards have had a massive impact on the game. Teferi was still seeing play even when white had nothing to offer competitively at all — basically Esper decks would run white to play Teferi, Time Raveler and Teferi, Hero of Dominaria. Teferi continues to see Tier-1 play today in blue white and Jeskai control decks. I’ll go out on a limb to say that Teferi, Time Raveler is the most hated card that’s about to rotate. There’s even the “Teferi Test” that’s named after him — a card can’t be played in standard if it doesn’t pass that test, which means the card has to do something before it can be bounced by Teferi. That being said, he never got banned, but Narset has been restricted in Vintage which I suppose is much more consistently reliant on card draw.</p><p>I was part of the pool of people who hated Teferi, Time Raveler and wanted him to be banned. I had discussions with friends about how planeswalkers should have summoning sickness. It seems silly now, since that would make them into do-nothing enchantments. Seeing how the metagame has played out, and how Wizards goes about banning cards, Teferi, Time Raveler would pretty much never see a ban since he’s just not a win condition on his own. He’s just very annoying and he does warp the metagame to require either playing with or around him in a way, but that doesn’t make a card bannable.</p><p>As with a lot of other cards I proclaim my hatred for, I’ve played with Teferi, Time Raveler in dozens of decks, but I never feel good about it. I wish I could tell my opponent, “look, the only way for this deck to work is for me to play this card, and it’s likely that you don’t care and you may be playing it too, so here we are.” It turns out that what’s basically a 3 mana Time Walk is powerful enough to see consistent play at all levels of the game. He was particularly awful to play against when I was on blue red spells since his high starting loyalty for his cost was especially awkward. Even his +1 can blow an opponent out by sweeping or Thought Erasuring at instant speed. On a more positive note, I think he was the good guy for a while when Simic Flash was on a rampage, and he does shut off Embercleave, so he has that going on.</p><p>Unlike Teferi, Narset’s popularity and apparent power level has ebbed and flowed. I think that one major thing that holds her back is her inability to find adventure creatures with her ability — mainly Brazen Borrower. She does give you some card selection, but she’s 3 mana to slowly draw 2 cards if she survives, and the 2 blue in her casting cost is awkward in some decks as well. Since check lands rotated and aggressive and ramp strategies have become more powerful, and there are ways to generate card advantage without actually <em>drawing</em> cards, Narset has faced a lot of limitations. She does shut off cycling, though, but I’m not sure whether that was enough for her to see competitive play nowadays. She also competes with Teferi for the 3 drop planeswalker slot in some decks, and Teferi is better in a wider variety of situations. Of course, I absolutely hated her when playing blue red spells that relied on a lot of card draw.</p><p>Narset probably has the distinction of being the card that has individually resulted in the greatest number of misplays, at least on MTGA. I’ve watched videos and streams where players try to draw cards against her, I’ve attempted it myself, and I’ve had a Narset out when an opponent tried to draw cards at least 100 times in total. As with Teferi, I’m not sure how I feel about a card that shuts off a major portion of the game — one that is so ingrained in peoples’ play styles that they forget to play around it. At least having Teferi out doesn’t even let you misplay unless you try to use Finale of Promise or something. I learned that the hard way.</p><p>I’m a bit conflicted, since I’ve played with both of these cards so much. If there is nothing like them reprinted in Zendikar Rising, it will be an adjustment, but above all else, I’m breathing a sigh of relief that the reign of terror of these two is almost over for Standard.</p><h4>Liliana, Dreadhorde General</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*AWqnhQozG0crIijP.png" /></figure><p>Before the 2019 rotation when Esper control ruled the world, Liliana was a welcome finisher. She could keep the board clear, could generate card advantage and a win condition, and she required an answer since her ultimate was basically game winning (although I have seen someone lose after using it).</p><p>When I was playing blue red spells, every game seemed to play out the same: I’d have any threat bounced by Teferi, Time Raveler, tucked by Teferi hero, and before I could rebuild anything, Liliana would come out to seal the deal for my opponent. I don’t understand how my opponents always had these cards and could play them consistently on turns 3, 5, and 6, but they did.</p><p>Liliana was powerful for a time, especially when removing planeswalkers was harder, but that’s not the case anymore. In a way, she’s 6 mana for a 2/2 which is obviously awful. It’s harder to take advantage of her, and it’s hard to imagine a world where she’s as terrifying as she used to be to me. Her -4 is very powerful under the right circumstances, but 6 mana for that effect leaves a lot to be desired, even if it can draw you some cards. I do have fond memories of playing her and Chandra, Awakened Inferno both on turn 6 in Grixis Fires decks with a lot of other removal that made the sacrifice one-sided, especially with Chandra’s sweeper ability thrown into the mix. Liliana is also a great Brawl card.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*BLf-eVn8E3inww1D" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*3BUJ5ePvc7lfhk3L.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*slYj6q30yBluM2pQ.png" /></figure><p>Speaking of Chandra, lots of people were upset about the fact that her emblem could never be removed, but taking 1 damage a turn from turn 6 onward is not game breaking. She really only worked with a strategy that kept the board clear. While it seems unfair on its surface, there are plenty of strategies that kill you around turn 6 anyway, so let her have her little emblem. Now if Nicol Bolas, Dragon-God were also adding on emblems…</p><h4>Nissa, Who Shakes the World</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*-yo7Vz6Uxz71sr6M.png" /></figure><p>When I talk about hating cards, it’s mostly in jest. If there is one card that I had to choose to eradicate from past and present existence, it’s this one. I’ve only played Nissa in one or two rather janky decks. I’ve never played her in any kind of competitive ranked deck, although I have stolen her and played with her before. I think that a lot of people agree with me too, and many have called for her ban.</p><p>The ability to consistently make pretty powerful creatures that can hit hard and also defend her every turn is bad enough, but her static ability puts things over the edge. If you can untap with her, which is not a big ask at all, you can cast anything you want for the rest of the game. Even if you cast her on turn 5, she gives you access to 2 extra mana to do powerful things like counter or bounce to give her even more protection.</p><p>There’s no disputing that she’s a powerful card, and she’s been the biggest groan test for me. Any time I see her in the play queue, I always wish I could say to the opponent, “what point are you trying to prove by playing this card?” Unlike Teferi, Time Raveler who is only powerful when played in the right deck, once Nissa resolves, the game is basically over if you’re not also playing a Tier-1 deck of some sort. You do need other powerful cards to spend all that extra mana on, but there is never a shortage of those in MTG. Hydroid Krasis is probably the biggest offender out of all of those.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*eXnq_m2myUXvfvqu" /></figure><p>The Krasis is another card that I think is worth a mention, but I didn’t have enough to say for it to warrant its own section. Yes, it’s powerful as hell giving you resilience against aggressive decks, card advantage that control decks are after, and a win condition all in one — and it scales all game long. This is yet another card that I often found unbeatable with whatever I was trying to do, but has never been quite as phenomenal when I’ve played with it myself, so it does have its limitations. I hated seeing it for a while, because like a lot of green big boys, it’s particularly good against the blue red spells I liked to play. I think we’re all a little tired of Hydroid Krasis at this point, so it’s a good time for it to rotate, but I can’t deny that it will be missed.</p><h4>Paradise Druid</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*_By4IA4SAKgVP6s6.png" /></figure><p>Mana dorks aren’t particularly competitive right now, although they are always popular. I think that Paradise Druid is the gold standard for a turn 2 mana dork — it’s difficult to remove before you can get at least one use out of it, but it’s also fair since it can’t really block well. It’s enabled some interesting strategies with its hexproof ability too — especially since you can mutate onto it now. It even hits hard when it needs to.</p><p>I’m not sure whether we’ll see something like Paradise Druid in Zendikar Rising, so I felt like talking about it. It makes for interesting gameplay decisions on both sides of the table. Should you attack into it? Often, your opponent won’t block with it, so you get some extra damage in, but they could ruin your plans if they do block. Incubation Druid is also a fun card what with its adapt ability, but I still think that Paradise Druid is what you want out of a mana dork. Sadly, Growth Spiral is just a better enabler overall.</p><h4>Niv-Mizzet Reborn</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*qfBJezLw_EKrXBUT.png" /></figure><p>Fortunately for us Niv-Mizzet fans, he didn’t stay dead when Nicol Bolas killed him, so he’ll probably be back. For the time being, he made his way onto this fun card. A powerful attacker and card advantage engine, running Niv-Mizzet Reborn was more about deck building than anything else. You needed to run enough cards to be able to play him quickly and consistently <em>and</em> to refill your hand with effective gold cards. I was sad when Fires of Invention was banned mostly because it was the best enabler of Niv-Mizzet Reborn decks, and there were so many of those that you could run even though they were never really competitive. It’s a shame that Fires was too good in decks that actually were competitive.</p><p>There’s still a little time, but I’ve never managed to draw 10 cards with Niv-Mizzet Reborn. I did manage to get him on the battlefield on turn 2 with a Gilded Goose, Leyline of Abundance, Enigmatic Incarnation combo, but that’s more a hilarious meme than anything else — drawing all of those extra cards doesn’t do much when your hand is already full anyway.</p><p>I hope we see another card like this in Zendikar Rising.</p><h3>Core Set 2020</h3><h4>Simic Flash</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*as0zksZq81Hps3wQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*K3cRI30h0yCA06TO.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*NbDDN2jCe8RNciaR.png" /></figure><p>This may go down in history as the most annoying deck to play against (since 2019 anyway), and it was quite dominant for a while. I think that it is still very powerful, but for whatever reason, it has fallen from favor although perhaps the reprinting of Rewind from Core Set 2021 will give it new life.</p><p>You generally had to either go under this deck to beat it, or get a timely Teferi, Time Raveler (with added flavor). Otherwise, they could just beat you to death while countering everything you tried to cast until they had an opening to cast their powerful Nightpack Ambusher finisher. I played the deck myself for some competitive grinding back when I was into that, but now I’ll usually scoop if anything I cast gets countered on turn 2 or 3 regardless of the matchup… not that it’s not a valid way to play the game, but it’s just not what I’m personally interested in playing against like with mono red.</p><p>Draw Go strategies are as old as Magic, so it’s no surprise that there would be a viable one in the current Standard. Zendikar Rising will have to provide a lot of new toys in order to make that viable, so we’ll have to wait and see. I will say that I do love Wolf from a design and gameplay standpoint, and I liked playing it. Even though it’s a wolf, the art reminds me of my Russian Blue cat, so I like to call him my little Nightpack Ambusher.</p><p>I also enjoyed playing Brineborn Cutthroat in a variety of blue red spells decks, so I was happy that he helped me go back to my roots. Frilled Mystic can get lost, though.</p><h4>Risen Reef</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*fPAGO10UbBeUGfyl.png" /></figure><p>Risen Reef seemed like a fun card, and I have played it in many decks, but unlike all my opponents who consistently had one on turn 3 and 4, I never actually got to draw it, so I’ll never be able to experience that joy.</p><p>All joking aside, I think that this was a very fun card that was severely underrated for both constructed and limited when it was first spoiled. For a time, it got to the point where people were calling for its ban. It was pretty ubiquitous too, but It’s just a 3 mana 1/1 after all. Elemental decks and decks that run Risen Reef for any reason don’t see much play nowadays, but I’ll have mostly fond memories of playing with this card and going off with it with the various payoffs available. Speaking of that…</p><h4>Yarok, the Desecrated</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/265/0*mRn11DyMmqAthDOo.png" /></figure><p>At 5 mana with no cast or ETB ability (strictly speaking), Yarok never got there when it came to competitive play, but I’ve played him with almost every card that has an ETB regardless of its color.</p><p>It turns out that the result of doubling ETB effects is more than twice as powerful than each of those effects individually. Attaching that to Yarok’s decent body that’s also an elemental payoff gives you a pretty strong package altogether. I’ve played him with the obvious cards like Risen Reef, Healer of the Glade, Cloudkin Seer, Overgrowth Elemental, Golos, and of course Agent of Treachery, but I’ve also gone deep playing him alongside the surveil cards like Disinformation Campaign and Dream Eater to enchantment payoffs like the omens and Setessan Champion. I’ve built a Dread Presence deck with Yarok too. Adding another color makes things more awkward and more fun — go off with Charming Prince, or Omnath. He’s a fun Brawl commander too. Add Thassa, Deep Dwelling and Alirios Enraptured to the mix too.</p><p>Yarok’s effect existed in the past on a card whose name I can’t remember, so it’s not unique to the game, but it is unique to Standard. Before it was banned, Yarok made things really wacky with Field of the Dead too. It’s a shame that the other cards with his namesake were not particularly good, although Yarok’s Fenlurker sees play in discard decks from time-to-time, but not with Yarok himself.</p><p>I’ve had more than a few memorable games with Yarok. In addition to the gate deck I beat up on that I mentioned earlier, I had 50+ zombies from Field of the Dead in one turn, and I had a very close game that I snatched from the jaws of defeat thanks to a well-timed Dream Eater my opponent wasn’t prepared to play around.</p><p>For a time, Yarok was probably my favorite card, and he’s a lot more flexible in terms of deck building requirements compared to Niv-Mizzet, Parun, but he still had his limitations in terms of power. I’ll miss playing with him, so I hope that there’s a suitable replacement for him in Zendikar Rising.</p><h3>Honorable Mentions</h3><p>I’m glad I got to talk about and reflect on cards that have been meaningful to me that are about to rotate out of standard. It’s a bittersweet time, and I can’t wait to see what’s in store for Zendikar Rising. Core Set 2021 seems to be ramping down the power level a bit since things went nuts in War of the Spark, and then somehow even more nuts in Core Set 2020 and Throne of Eldraine, but we’ll see. There were more cards that I wanted to talk about, but I mostly only have one or two sentences to say about them, so I’ll just list them here without the pictures since I think that would take up too much space.</p><p>I’ll only mention cards that I have something interesting to say about. There are some cards I’m omitting that I have memories of, but not much more to say than “it was a card.” I’m sorry if I missed one of your favorites.</p><ul><li>Divine Visitation — I never really got this card to work, but it was pretty hilarious at times. I love the flavor text too.</li><li>Murmuring Mystic — I never really got this one to work either. It just seemed really cool, but its stats just couldn’t justify its cost.</li><li>Quasiduplicate &amp; Spark Double — I’ve had a lot of fun duplicating all kinds of things, mostly with ETBs. Having multiple copies of a legendary permanent was also cool, and while it was held back by requiring you to already have something worth copying on the battlefield, I hope we see this sort of effect again.</li><li>Midnight Reaper — This card was frustrating as hell to play against sometimes, but there’s so much exile-based removal running around now it’s not such a threat anymore. We’ll see how Liliana’s Standard Bearer does as a replacement.</li><li>Ritual of Soot — The only card that let me play certain decks when going up against aggro strategies. It served me well, and will be missed. Cry of the Carnarium is similar, but I liked Ritual of Soot better and played it a lot more.</li><li>Runaway Steam-kin — This card was the nuts before the 2019 rotation, and even afterwards it was crazy. It was and is part of the reason I resent mono red.</li><li>Beast Whisperer — This guy was very powerful in limited. He was too expensive for constructed for the most part, but I’ve had fun playing with him here and there, especially in Brawl.</li><li>Nullhide Ferox — I used to think this was something like the most powerful card ever. It’s funny how much my thinking has changed. He is almost impossible for a blue red spells deck to deal with, I’ll give it that, and that was all I played for a while. I remember one time where I cast Dispersal on it too… whoops (I still won that game, though).</li><li>Pelt Collector — This is yet another card that always seems to work great for my opponents, but never for me. I’m sure many people will have great memories of playing with him… and not so great memories of playing against him.</li><li>Gruul Spellbreaker — A friend and I had discussed how the power level of the game in general and creatures in particular had shifted, and this card was at the center of our conversation. You’re either going up in power for its cost, or it has haste, and either way it has hexproof on your turn and gives it to you too. Gruul was pretty strong for a while, and Gruul Spellbreaker has always seen play in Gruul decks, but I think it’s really just a strong but fair creature with current gameplay.</li><li>Thief of Sanity — I used to hate this card, but it’s actually not all that scary. Depending on your opponent’s deck doesn’t work out that well in constructed since hopefully your deck is all cards that are worth spending all your mana on for the whole game anyway. It was still a ton of fun, though.</li><li>Thousand-Year Storm — While this card is hilarious, it was very tough to make it work since you basically had to take turn 6 off to use it, and your deck also had to have enough cheap spells to get it going. It has enabled all kinds of silly things, though, and it’s sort of a fair take on the <br>Storm mechanic.</li><li>Chromatic Lantern — This was and is a fun card that enables any sort of wacky multi-color strategies you might have. Dryad of the Ilysian Grove is a fairly suitable replacement, though.</li><li>Smothering Tithe — I honestly don’t have much more to say about this than “it was a card,” but I just have to mention it because it’s so unique. Hopefully White keeps getting more and better tax effects.</li><li>Guardian Project — It will be sad to see one of the best green Brawl cards go.</li><li>The Wanderer — Did everyone forget about this card? I think that it’s a bit too expensive for what it does, but it’s definitely a cool design.</li><li>Massacre Girl — I’ve lost way too many times because of this card.</li><li>Casualties of War — How many times have you been able to cast it with all 5 modes?</li><li>Dreadhorde Butcher — This is another card that I was terrified of that’s actually not that strong. On turn 2 it’s quite good, but that’s about it. What’s the biggest you ever managed to make it?</li><li>Mayhem Devil — This card is still very powerful, and it’s part of Tier-1 standard decks as we speak. I can’t stand it, so I’m mostly glad that it’s rotating. I hate being pinged to death.</li><li>Oath of Kaya — When Esper was dominant, this was part of that package too. I have a love-hate relationship with this card, since I’ve enjoyed using it in quite a few decks, but it’s completely ruined other decks I’ve tried to play when it’s used against me.</li><li>Ral, Storm Conduit — I have to mention him since he’s part of an infinite combo that I played for a bit: cast any spell, copy it with Expansion, and then copy that Expansion indefinitely. Ral’s static ability can deal infinite damage. It’s not very robust since it requires you to have Ral on the battlefield and two of the same card (Expansion//Explosion) in your hand, but it was especially fun when you pulled it off by copying an opponent’s spell.</li><li>Sorin, Vengeful Bloodlord — I almost forgot about this card entirely, but for a while, it seemed like it was being played everywhere. Giving planeswalkers lifelink is cool. Maybe we’ll see it again some time.</li><li>Tamiyo, Collector of Tales — This is a bit of a strange card that you can play in decks where you have to have a particular card or cards. Narset may be better than that, but Tamiyo’s recursion ability is nice. I don’t think I’ve ever had her protect me from a sacrifice or discard effect, though.</li><li>Time Wipe — before Shatter the Sky came along and ruined things with its mono-colored efficiency, this was the best sweeper around.</li><li>Karn, the Great Creator — he got restricted in Vintage which is really saying something. I enjoyed playing with him in some fancy artifact decks, but those weren’t very strong in standard, and they’re even worse now, so even though he shuts off ovens and the like, he’s more of a hassle at 4 mana than anything else. I did manage to beat an opponent in a Steel Overseer-based artifact mirror match once I shut off all of his artifacts thanks to Karn. Fun times. Steel Overseer doesn’t make the list itself, but I have fond memories of it. It was already a reprint, though, so maybe it’ll be back. Mystic Forge gets a nod too, and hey, it was also restricted.</li><li>Ugin, the Ineffable — Along with an artifact package that may include Karn and Mystic Forge, he can really turn into Ugin, the effable, if you know what I mean.</li><li>God-Pharaoh’s Statue — This was a terrifying card for a blue red multi-spell deck for a time, but it’s too expensive to do much with the way the game is now.</li><li>Interplanar Beacon — what are superfriends decks going to do without this?</li><li>Rotting Regisaur — I think that this still is the most efficient creature ever printed, but because of his discard effect, he’s also very easy to punish. Sadly for it, there was never a really strong deck like a reanimator deck that wanted to discard that much although I played with and against those strategies plenty of times, and against the Regisaur in general in all kinds of shells. It’s also proudly carried Embercleave any number of times.</li><li>Sorin, Imperious Bloodlord — Does anyone remember when black white vampires was dominating standard? I used to hate this guy too, and I just played against a vampire deck with him the other day and lost.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=97b33f30f91c" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>