Thursday, April 5, 2012

PSA

You're a young, plucky go-getter with an interest in tech and nothing but time on your hands.  What to do?  Why learn web development, of course!  So, here are some random tips for those just starting out:

1.  Learn HTML and CSS.

Seems kinda like a no-brainer, right?  You'd be amazed at how many people feel uncomfortable with the basic building blocks of the web.  Some developers learned HTML in the late 90's and never took the time to keep up-to-date on it.  They get all Unfrozen Caveman Lawyer when confronted with the modern web ("Your world of Cascading Style Sheets confuses and frightens me").  Don't be that person.

Other would-be devs feel that HTML/CSS is somehow beneath them.  That, somehow, they'll be forever isolated from the unwashed masses that have to write markup because they're a programmer, not a coder.  Don't be that person, either.

Here's the thing: at some point, the stuff you'll program will be rendered in a browser.  Even if you're a programmer, chances are you'll need to tweak templates in order to have the yummy, yummy data you massaged earlier in the process display on screen in the right place/format.  Knowing how to debug these templates when things go wrong (and they will) is essential.

Besides, both are fairly easy to learn.  HTML can be learned in a couple hours.  CSS takes a bit more time, mostly due to CSS positioning and the Box Model, but is still doable.  No one will expect you to be an awesome designer.  They will expect you to be familiar with the basics.

2. Server side language choice

In the long run, this doesn't matter too much as you'll likely learn a variety of languages if you stick with it.  But, short term, it's an important decision that must balance ease of use, availability of quality resources, and success/failure/positive reinforcement.

For me, there are only two viable choices: PHP and C#

PHP has some nice benefits - Ubiquity, easy syntax, it's dynamically typed, so you don't have to worry about type initially, and it rewards the developer with fast results.

PHP also has some drawbacks - A lot of horrible, out-of-date resources and tutorials floating around online, when done wrong PHP can teach some very bad habits, it's dynamically typed, so you may not even learn about type, and a lot of little technical things that a newbie likely wouldn't notice, but are there anyway.

C#'s benefits are - Statically typed, so one learns about type right off the bat, clean syntax, object oriented, more options in terms of more complex data structures.

C#'s drawbacks are - A much higher learning curve from the get-go, possible reliance on the .NET framework as a crutch, the MSDN (although it's getting easier to navigate).

For web development, I started with PHP.  I feel it's the best at efficiently teaching a prospective developer how forms work, how a server side language interacts with a database, and how processes on the back end eventually become things an end user experiences.  YMMV.  That said, I prefer C# now.

3. It's a database, not a spreadsheet

One of the classic mistakes a newbie can make is treating a database like a spreadsheet.  Most of the databases used with the web are relational databases.  Database tables model the relation between different sets of data.  To get the tables into the right form, developers 'normalize' them.  Here's a good primer on normalization: http://mikehillyer.com/articles/an-introduction-to-database-normalization/

Simply put, if you use your database as a spreadsheet, you're doing it wrong.

4. It's 2012.  Time to learn JavaScript

JavaScript is probably the most important language employed on the web today.  It's a vital component of many sites (Google Apps, Facebook, Twitter, to name a few), and with the upcoming improvements in HTML5, it will only become more widely used.

Despite that, JavaScript still carries a stigma.  Older end users remember a time of constant JavaScript errors, and older developers remember the browser wars.  It doesn't help that the language itself is a bit odd, and has some hidden gotchas baked right in.

That said, the emergence of JavaScript frameworks (including the ubiquitous jQuery) has all but made the pain go away.  There's no reason not to learn the basics.  With the way things are progressing, saying, "Nah, I don't do JavaScript," will be akin to saying, "Nah, I don't do email."  Get on board.

---

So, there you go.  Random thoughts on a Thursday morning.

Thursday, March 29, 2012

Spring cleaning

Just a small post to myself, really.  Things I want to focus on this year (aside from actual paying projects):

Hone my design skills - I suck at design.  I think I'm a decent critic of design, but creating my own has always been troublesome.  I'm not an artist.  Even my stick figures suck.  That said, the flexible design book from A Book Apart really opened my eyes to some things, answered some questions I had never previously received clear answers to.  So, with that, I'll redesign my home site, which was made in a rush in order to get free hosting a couple years ago (it definitely looks like it was made in 15 minutes), and my awesome secret personal projects.

Get more familiar with JavaScript, jQuery, and maybe even Node.js - I'm not a complete newbie with JS.  I mean, I own and read Resig's book.  I'm definitely not what I'd consider to be proficient, though.  In today's development world, that's like saying, "I like computers, it's just that pesky keyboard and mouse I'm not comfortable with."

Ruby on Rails - I figure an additional tool in my toolbox couldn't hurt.  It was either that or Python/Django, and I'm not a fan of the idea of whitespace actually conveying meaning.

Longer term things:

Learn a functional language - Thinking F# is the way to go.  I mean, I already have it with VS.  Might as well learn it.

Make a game - I'm probably the only programmer nerd on the planet that's never made a completely functional, simple game.  I had the skeleton of a web-based, turn-based RPG written in ASP.NET web forms (yeah, getting to that point was as painful as it sounds), but it lies languishing on my HDD.  Since I hate web forms, I doubt I'll touch it again.  So, some kind of Tetris/Breakout clone, written either in C++ or XNA.

Tuesday, March 13, 2012

I'll have a plate of awesome, with a side order of shit

This post is about the Mass Effect 3 ending.  Needless to say, SPOILERS ahead.  Read at your own peril.










I beat Mass Effect 3 yesterday.  After having slept on it, I think I'm ready to talk about the ending.  First, a quick summary:

The end forces Shepard to return to earth.  Turns out the Citadel is the Catalyst, and an indoctrinated Illusive Man informed the Reapers of this fact.  The Reapers, wanting to protect themselves, take control of the Citadel, fly it to the safest area of Reaper controlled space, which is earth.  Shepard meets up with Anderson in London, and must get to the new Conduit in order to open the Citadel arms to allow the Crucible to dock.  It's a nice return to the end mission of ME1, albeit with higher stakes.

During the push to the Conduit, Harbinger lands and starts zapping people.  Shepard and his squad get caught in the blast.  Fade to white.  You take control of a broken, burned, bloodied Shepard after he regains consciousness.  He grabs a pistol, and it's up to the player to make him limp to the Conduit, shooting at Husks and other Reaper forces on the way.

When you teleport to the Citadel, Anderson is there somehow.  He and Shepard make it to a control panel, when a Huskified Illusive Man takes control of both Shepard and Anderson.  He forces Shepard to shoot Anderson (looks like it's a stomach wound... apparently this happens only if your effective fleet strength is 5000+), but later dies himself, either due to Shepard shooting him, or suicide a la Saren in ME1, depending on dialogue choices (which is another great nod to the original).

A dying duo of Shepard and Anderson sit next to each other and reminisce while watching earth and the fight.  Anderson succumbs to his wound.  Hackett calls, informing Shepard that while the Crucible is docked, nothing is happening.  Shepard crawls toward the control panel, but loses consciousness right before it.  The floor beneath Shepard turns white, and lifts him toward the heavens....

...into another part of the Citadel.  A ghostlike entity resembling the child from the opening segment of the game/Shepard's nightmares appears, and forces him to wake up.  The entity explains that he is a representation of the Catalyst, and that it/the Reapers were built to protect organic life.  According to him, organics always create synthetic life, which, in turn, attempts to destroy its creators.  The Reapers harvest the advanced civilizations, where they sort of live on in the form of another Reaper.

Since the Crucible was successfully built, and Shepard allowed it to dock, he essentially broke that cycle, and must now choose how to proceed.  The Crucible will allow him to:

1. Control the Reapers at the expense of his life
2. Destroy ALL synthetic life, including the Geth and EDI
3. Synthesis - merge the building blocks of organic and synthetic life into the next evolutionary step

In all three, the Mass Relays are destroyed, as they spread the Crucible's signal/energy through the galaxy.

Regardless of the player's choice, the next scene has the Normandy trying to escape the energy wave, only to be caught by it.  The ship crashes on an unknown planet, and Joker and a couple of crew members exit the ship to take a look at where they are.

Credits.

After the credits, on what looks to be the same planet (at night), two silhouettes - an adult and child - look to the moons.  The adult (voiced by Buzz Aldrin) talks about the infinite wonders of the galaxy.  The child wants to hear more about 'The Shepard'.  The game then loads back up to the point before the assault on the Cerberus base.

---

Personally, I liked the ending until the Catalyst ghost entity infodumped the entire thing to me.  The very last segment bothered me for a number of reasons:

1. In my game(s), I tend to play a predominantly Paragon Shepard.  He's a peacemaker, a person looking to unite the galaxy against a real threat.  As such, I got him to broker peace between the Quarians and Geth (yay, two fleets!).  Doesn't that show that there can be peace between organics and synthetics?  Why isn't there dialogue to reflect that option?

Also, the Geth didn't rise up for the hell of it.  They acted in self-defense, then fled behind the Veil.  Their later aggression was fueled by the Reapers themselves.  Why is none of that addressed?

2. The same basic ending happens, regardless of what you do: Reapers pacified, mass relays destroyed, Normandy crashed.  The whole idea of the series is to force the player to make choices that will have consequences later on.  We never see the consequence of the last choice, which is incredibly unfulfilling.  Since the same basic progression happens regardless of the choice you make, the choice itself seems pointless.

3. The Reapers supposedly save advanced organic races by harvesting them, turning the individual members of those societies into grey sludge, and combing them all into a techno-organic form.  What happens to the synthetic races after that?  Do the Reapers just destroy them?  Again, not addressed.

EDIT: And, really, why do the Reapers harvest organics at all?  Why not simply destroy synthetics when they inevitably revolt?

4. The Reaper reveal fell a bit flat as it came in the form of an infodump.  It would have worked better, IMO, as a slow burn.  Reveal some of it after obtaining the Mars data, and again on Thessia.  Really question if using the Crucible is a wise move.  Do more than:

"We don't know what it does."
"Well, we have no choice."
"Okay."

Using the Crucible itself should represent a choice, really.

5. There's a way to keep Shepard alive.  Have an effective fleet strength of 5000+ and chose the destroy option.  After everything is done, there's an extra scene of Shepard, buried beneath rubble in London(!), taking a big inhale.  And, apparently, it's a save state flag....

There are a couple things odd with that:

A. The Catalyst explicitly tells you that the destroy option will destroy ALL synthetic life.  Shepard is a cyborg.

B. What is he doing in London, seeing as how the Citadel blows up?

Rumors/theories are flying that the dreams Shepard was having is a sign of him being indoctrinated (he was rebuilt with Reaper tech...), and that after Harbinger's blast, he simply lost consciousness.  And, there will be new DLC/a patch/new game to address it.  I doubt it, but it is definitely odd.

---

So, there you have it.  My early morning rambling thoughts on Mass Effect 3's ending.  For the record, I loved 99% of the game.  I haven't felt these kinds of emotions since Xenogears.  It's just the ending I didn't like.

Monday, March 5, 2012

Nerd musings as I wait

Not much to talk about re: web development.  I'm waiting for one client to get back to me about an e-commerce project, and waiting for another client to pay me.  Mass Effect comes out tomorrow (hell yeah!), and, well, that's about it.

With that said, I figured I might as well blabber about one of my favorite games of all times: Xenogears.

Xenogears was released by Squaresoft (before it became Square-Enix) in 1998.  This was pretty much the Golden Age of Square, with Final Fantasy VII and Final Fantasy Tactics being released in this era, as well as Square's marked Christianity criticism era, as Final Fantasy Tactics, Vagrant Story, and Xenogears were all pretty scathing in their own way towards the Church (apologies if that sentence made no sense... it's 8:30 AM).

Xenogears (XG from now on, as I'm lazy) is a sci-fi epic, and it's also a gigantic, loveable mess.  It's incredibly ambitious.  It was also so over-budget that the 2nd disc is primarily the two main characters sitting in a chair talking about what happened, as the actual dungeons/events could not be finished in time.  It features robots and a giant pink...thing getting crucified.  It's filled with warts and facepalm worthy moments (I'm looking at you, Soylent System), and yet, in its own bizarre way, it works.

SPOILERS from here on.

XG's main premise is simple enough.  Sometime way in the future, the starship Eldridge was transporting a biological weapon - Deus - to some planet.  En route, Deus gained sentience, woke up, took over the ship, and started killing everyone on board.  The captain (who looked an awful lot like the captain of the SDF-1 in Robotech/Macross), left with no alternative, engaged the self-destruct.  The debris fell to an unknown planet.  See below (sorry for the crappy quality):


From there, the game skips forward several thousand years.  Humanity is the dominant species.  Old technology from the Eldridge - including mechs called Gears - are found, and are in somewhat common use.  Most are utilitarian models, but the various nation militaries have combat models.  What's more, technology has advanced to the point where new ones can be developed.

Gears are maintained by the Ethos, the world's dominant church (dun-dun-DUN).  Of course, the Ethos is actually a covert arm of Solaris, a technologically advanced, secret nation in the sky that uses surface dwellers as a renewable resource.  Yeah, the setting is batshit crazy.

So, there's the setup.  Here's why the game is awesome:

The characters.  There's a large cast, but almost all get their moment to shine.  They all have clear personalities, and are almost all memorable.  Even the NPCs are well done, and very few feel one-dimensional.  The villains are all flavorful, and have various motivations.

The plot.  There are many layers to the story, and XG is probably one of the best at balancing the incredibly epic with the deeply personal.  At its core, XG is a love story, and a very well written one at that.  JRPG fans tend to point to FF VIII or FF X as the best love stories in the genre.  They can't hold a candle to XG.  More spoilers:

The protagonist, Fei Fong Wong (whom I use as my Twitter avatar), and his love interest, Elhaym Van Houten (Elly), are trapped in an Eternal Return.  Through the ages, they're born, meet, and fall in love.  Every time, their relationship ends tragically, usually with one of them dying.  What's worse is that, as time goes on, they start gaining the memories of their past lives.  That tragedy, and the madness it causes, leads to the creation of one of the main villains.  The cycle itself is explained in pseudo-scientific terms (the best kind!), and opens up questions about fate and free will.  It's all well done, with small reveals here and there building to a crescendo.

Of course there's more to the game than that.  It pokes at the ideas of God, faith, death, sacrifice, etc.  It's a very dense story, but mostly orchestrated well.

The music.  Yasunori Mitsuda is a video game music master.  His holy trinity includes Chrono Trigger, Xenogears, and Chrono Cross.  Some examples:






Again, objectively, the game has plenty of flaws.  Despite them, I love it.  It's the shame the second disc will likely never get fleshed out, as a lot of big things (read: thousands-millions die) happen, but it's all off-screen.  That said, check it out if you have a PS3 and don't mind pixelated sprites.  It's available on the PSN.

Tuesday, January 24, 2012

And now for something completely different - how I'd fix the Final Fantasy series

First, a professional update: I haven't had much time to dabble with .NET lately since I've been doing PHP work for two different clients.  That said, my MVC projects are still going forward.  They're just on hiatus.

Okay, so that said, now to the meat of this post.

I decided to bite the bullet and play the Final Fantasy XIII-2 (there's a catchy name) demo this afternoon.  I was curious to see if all of the negativity surrounding XIII-proper was justified, even though fans of the series (which I used to be) told me that the demo fixed a lot of what was wrong with the original game.  Having now played (but not finished...) the demo, my response can only be: really?  The sequel's demo shows improvement over the original?  Man....

First, a quick rundown of my problems with the demo:

For starters, it's confusing/convoluted as hell.  The main characters in the demo don't have much in terms of personality or character, aside from being really, really earnest.  The backstory presented in the menu says that the girl's older sister saved the world 3 years ago, but disappeared.  The boy is a time traveler.  Shenanigans await the duo.  Of course, that's all couched in made up words and terms like fal'cie, l'cie, etc.  I was hoping for a pop'cicle, but no dice.

Combat was...odd.  It's a weird mix of a watered down job system and gambit (Bioware fans - DA tactics, but not nearly as well implemented) system.  Characters have roles - like Commando, Ravager, Sentinel, etc. - which gives them access to certain abilities.  Combinations of these jobs (like, setting the girl as Medic and the guy as Commando) are called Paradigms.  These Paradigms can be changed on the fly by pressing LB/L1 and selecting a new mix.  Cleverly(?), this is known as a Paradigm Shift. 

Confused yet?  It actually makes sense in play.  Unfortunately, since the game rewards speed, generally all one needs to do is select Auto Attack, which will let the AI do what it thinks is best.  As a longtime fan of the FF series, this strikes me as funny.  The series has always been derided for its combat because in the vast majority of cases simply choosing Attack is the most efficient way to progress.  XIII adds all these layers to combat, yet Auto Attack is still the best option.  I've heard that Paradigm Shifting is necessary for the endgame/hidden content, but still, press A/X to win is still the name of the game 25 years after the original Final Fantasy was released.

There are some other small things, like the camera being too close to the characters while walking, the continued existence of battle screens, poor UI, etc.  Ultimately, as I played the demo, one thought kept repeating itself in my head - for a game that's all about speed (battles are timed, the pace in battles is the fastest its ever been in a FF game), it sure is slow.  Walking around is boring.  Conversations are needlessly wordy.  There's no emotion aside from a vague desire to stop/find something/someone.  And as someone who can handle, and even enjoy, badly paced games (hello Xenogears and Xenosaga), that's saying something.

---

So, how would I change things?

First, remove random encounters.  They've never been challenging, and they're really just a time sink.  All encounters should be relevant to the main plot or side quest.  Since that would likely limit the number of encounters, make them more difficult.  Ultimately, the goal should be to make encounters meaningful.  Having to kill a group of imps every 10-20 steps only serves to annoy the player.

Second, give the player multiple ways to complete a quest.  Final Fantasy quests fall into three categories:

Ultimate weapon/summoned monster quests, which require a bit of exploration and a lot of annoying mini-games.

Fetch/return quests.

Combat.

Sometimes they're mixed together (do hidden thing X, take secret thing Y, and kill super monster Z), but those are the general categories.  While there is something to be said about solving a convoluted puzzle (and, really, classic gaming is all about that), they feel increasingly rigid in settings as large and detailed as a FF game's.

Third, better character balance.  FF characters have the annoying tendency to be functionally the same (see: FF VI, VII, VIII, XII (to a certain extent)).  Jobs (character classes - fighter, white mage, black mage, ninja, etc.) are a great way to provide party balance, as they force the player to define roles for their characters early on.  Deviating from those roles is exceedingly inefficient, and not worth the hassle (unless you're playing a FF Tactics game, which is a different can of worms).

The problem with jobs is that there's not a lot of choice within the jobs themselves.  Usually, players will choose a job to learn key abilities, then ditch it for another. 

I suggest going the opposite route: have characters be locked into their jobs, but give the player a myriad of abilities to choose from.  From a story perspective, it makes more sense - a highly trained warrior isn't going to say "You know what?  I'm going to be a mystic healer today." - and it gives each character a role to call their own, eliminating the sameness problem.

My final suggestion deals with plot and presentation.  FF games have been pretty batshit insane/convoluted over the last 15 years or so.  Not that that's bad in and of itself.  My problem is that, generally speaking, whatever good ideas are in a FF story are buried under a mound of jargon and/or minutia, to say nothing of the Japanese-style "Say, don't show" storytelling.  If we're talking economy of plot, FF games need some TARP money.

Obviously, a good deal of this is cultural, so I'm trying to tread carefully.  That said, the older, technologically limited games in the series still had insane stories, but they were conveyed in a more concise, and thus more powerful, way.  Hell, IV's endgame has the heroes fly to a moon in a damn whale-shaped spaceship.  The moon is also a spaceship.  Crazy is part of the series, and I wouldn't want it any other way.

Unfortunately, the games have become increasingly suffocating.  The signal-to-noise ratio has dipped to 24.4k modem levels, complete with shrieking sound.  There are whole sections of IX, X, and XII that could be removed without affecting the plot at all.  That, to me, is a very large problem, and one that seems to be getting worse as the series moves on.

So, to tie this back to my first suggestion, make things meaningful.  This doesn't mean that everything must tie into the main plot.  I love side quests that flesh out settings and characters, even if it doesn't move the main plot forward an inch.  Just, remove the crap and clutter.  Let the setting and characters breathe.  Don't be afraid of emotions beyond earnestness, vague evil, and the ever Japanese protection promise.  Make the world's heart and soul shine as much as its graphics.

Monday, August 15, 2011

Small update

Still breathing, still wrapping things up.  Trying to do a fair amount of testing before unleashing the first site on the world.  Next up: uploaded image validation testing.

With all of my previous EF4 issues, I had a lot of duplicate table rows, which really screwed up some of my model structure, so I've spent the last little bit rebuilding my test db and EF model.  Should be ready to go tomorrow.

Something to add to my "Microsoft should focus on the following when trying to get people in on the ground floor" list:

A crash course in core OOP patterns.  Factories, IoC, Repositories, various data patterns, etc.  The kinds of things a MVC coder will undoubtedly run across early on.  Just an idea.

Monday, July 18, 2011

Objects in mirror are closer than they appear

What's this?  A non-bitchy, non-whining, perhaps even HAPPY blog post?!

Yup.

I'm inching closer to the finish line.  A bunch of not hard, tedious stuff (tightening up the graphics on level 5, and whatnot), and one non-trivial design decision (nothing major, just trying to figure out how to address something in a somewhat intelligent way), and it's done.

I've actually learned a lot during this process.  I'm anxious to see how things flow with a fresh project, to see if I've learned what I think I've learned.