liquidfish current https://liquid.fish/current en-US daily 1 Battle Stations https://liquid.fish/current/battlestations Fri, 12 Apr 19 15:59:21 -0500 When liquidfish hears, "man your battle stations"  this is what we see...

]]>
Agile is Cool! https://liquid.fish/current/agile-is-cool Wed, 27 Mar 19 16:48:40 -0500 Many of you looking at this title might think,

“Just why is Agile cool, and what is Agile anyway?”

Here at liquidfish, we do a lot of amazing work including branding, marketing, SEO, and software development. Today I am going to talk about the latter. Some people think that software development is a completely predictable process, but this is a misconception. Let me explain.

When a client asks for an application (website, mobile, etc.), usually there is a big, exciting vision. In an ideal world, software developers would spend significant time breaking down all the pieces, documenting each details and requirements, writing a plan, and finally, by using previous experience, estimate and predict total hours and cost for each project. But to write down everything could take forever. Clients usually want to know how much a project will cost and how long it will take to produce a product before paying for anything, or entering a contract.  As you see, here we have a vicious cycle. Clients prefer to have promises before paying. Developers would like details and data before making promises. Someone needs to step out of the circle.

This is usually the project manager’s job—breaking projects down into big pieces and providing rough time estimations. Because of our team’s great experience, we do a good job of providing realistic quotes to clients.

This is a traditional process and is well known in the IT industry as the Waterfall approach (https://en.wikipedia.org/wiki/Waterfall_model).

Using this technique, we provide an estimated total cost for the project and establish the deadline for when it will be delivered. Waterfall monoliths can be ideal for short-term projects that require a strict deadline and budget. The liquidfish team is committed to being overachievers and keeping processes simple for our clients.

At this point I imagine you have a question:  “So, what is the problem? And still you have not answered: What is Agile and why is it so cool?” We will get there, I promise. First, I want to show the potential downside of this traditional process from a coder/developer’s perspective.

When Waterfall is not cool.

As our skills and expertise have grown exponentially, bigger fish with more complex projects are swimming to our current. Complex projects require many months of continuous coding, often without feedback, as clients await the final, finished product. The goal of most projects is nicely described and packaged in the beginning by project manager and clients alike. But while they look nice, these descriptions can be fraught with peril for a coder. Lots of positive emotions at project inception can overshadow and obscure issues that most of the time will not be clear at the initial planning stage. It’s no one’s fault; it’s just one of many steps of the process. And it’s normal for multiple people to have different interpretations of information. As I’m sure you can understand, if there is a misunderstanding during the initial time-estimation step, this can bring unhappiness later for both coders and clients.

Another challenge with the Waterfall approach is the potential lack of clear understanding on the coders’ part regarding the details of clients’ specific business processes. To successfully automate a process, we must know all the rules. Software requires precise checks on all conditions to make a right decision (output). Usually people don’t think in this way, and they don’t need to. In real life, the business process is easily executed heuristically. But for a program, every exception and detail must be accounted for. Of course, if detailed and unique business processes are fully known up front for each client, it can make accurate estimation a lot easier. However, this is rarely, if ever, the case. And even if it were, the understanding or desires can be changed without the coders’ knowledge.

A lot of times, our project is dependent on other services. Those services can significantly change the way our project works, or change pricing, as we would need to change our programming in a way that can interact with them. Other times, for various reasons, the multiple services are incompatible, or create environments that are completely unpredictable. We can’t remove this factor. The biggest misconception here is that software development is just about inputting a code that functions. A big chunk of the mission is to clearly understand the exact “whats and whys” of what will be written. Only then can top-notch code be efficiently designed and built. To change something after the whole project is done can be very expensive. Monolithic waterfall processes can result in wasted money and time, both for a designer and for a client. And this is a big risk that I will talk about later.

Summarizing this, we can highlight four big challenges with Waterfall approaches:

●    Unclear global goals that may change over periods of time

●    Misunderstanding of needs with lack of direct contact between coders and clients

●    Lack of knowledge of customers’ unique business logic

●    Dependencies on third-party applications

So, what is Agile?

I think you have guessed that I will propose it’s a solution that can cover these challenges. Agile is an approach/methodology that eliminates the pattern of a waterfall monolith. Many different approaches fall under the Agile umbrella, but it has a lot to do with providing micro-services throughout a project. There is even an Agile manifesto (https://agilemanifesto.org). It’s cool, right? :)

An Agile approach has different focus points:  Scope changes and “fast failure” are encouraged. Any scope changes are processed as a natural part of development. Understanding how the process is envisioned to work can be changed with new insights or even because of some external factors (economic, political). Feedback is required at regular intervals. Feedback of real users can bring a lot of helpful and important changes in understanding. As a developer, I can say it’s always easier to make than to change something that was done a long time ago. The purpose of failing fast is to get fast feedback while correction is most efficient. Regularly presenting a demo of current status to product owners and business stakeholders helps them to make sure it is as requested, and even more important, to determine if progress is indeed in line with what they really want.

Agile processes involve iterative development. There will be many small steps toward the completion of a colossal project. Customers don’t need to wait for the totality of all massive documents to be finished for review. Finalizing of requirements can be done as the projects go along. There is a huge benefit of being able to start with tests as soon as possible. The ability to respond to feedback and adapt immediately saves everyone time and effort. This is also a benefit because final documents are usually burdensome to read anyway (if it’s not massive, then it usually doesn't include everything, resulting in a big risk of misinterpreting the requirements).

With Waterfall, there is a high upside prospective for continued business coupled with a high downside risk that can ultimately affect costs. Agile procedures remove the risk of unknown costs and delay by encouraging the principle of failing fast to allow for immediate adaptation in cost, scope, and timeframe. The idea of it is to reduce downside risk while keeping upside prospective.

Iterative development can be a little bit tricky, of course. Projects will be divided into pieces and will be complicated with various login screens, lists of users, downloadable documents throughout the process, etc. But developers can implement access levels piece by piece incrementally. Regular feedback is key. This is what makes the process iterative. Otherwise there is the risk of creating multiple mini-waterfall monoliths. Just doing sprints or iterations doesn’t make for Agile development. It’s the attention and adaptation to feedback that breeds efficiency.

Agile development allows for adaptive reprioritization in what can bring the most value to our clients. Iterative development allows our clients to receive a product before it is finished. Sub-portions of final products can be pushed to production and get tested by users, or at least run by higher managers. This would allow midstream corrections from those people whose feedback is the most valuable.

To summarize, I want to repeat the key principles of Agile:

●    Highest priority is to satisfy customer needs rather than quickly complete a project

●    Coders welcome changes early on and throughout the project

●    Frequent feedback from end-users improves and transforms project parameters

●    Iterative development is encouraged with fully transparent costs for changes

And that, dear readers, is why this software developer thinks Agile is cool! It’s fine to disagree. There are valid arguments and feedback on all sides. I’d love to hear yours.

 
]]>
Client Side Search with Fuse.js https://liquid.fish/current/client-side-search-with-fusejs Thu, 14 Mar 19 14:27:02 -0500 Search is arguably one of the most important elements of a successful website. After all, it doesn't matter if the information is there if you can't find it.  Often, it is useful to implement several search strategies on a site, each of which can be optimized for the specific data being searched. Today, I would like to talk about fuse.js, a nifty little fuzzy search utility that can be easily incorporated into any site.

Fuse.js is a lightweight javascript fuzzy search library written and maintained by Kiro Risk.  As of this time, the current version 3.4.4 weighs in at a mere 10.9 KB. Fuse.js, like many of the best dev tools, is open source, released under the Apache License Version 2.0. In addition to it's small size, fuse.js also has the advantage that it has no external dependencies.

In a nutshell, fuse.js takes as its input a set of data in json format, some configuration information (also json formatted) and a search string.  To be more precise, an instance of the fuse class is instantiated with the input data and config, then the search method of that instance is called with the query as its argument.  The input should be in the form of an array of identically structured json objects since we will be telling fuse.js which parts of each object to consider in the search as a part of the configuration. Fuse.js returns an array of matches, filtered by the query string in accordance with the search settings.  These output results can be the full original objects, or if the records have a unique key, this can be identified in the search configuration and the results can simply be an array of these ids.

To configure fuse.js, you pass in an configuration object when you create your fuse.js instance.  Although there is not a huge number of configuration options, there are enough to tune the search in several ways.  Some options such as "caseSensitive", "tokenize", "location", "threshold" and "keys" allow you to specify exactly how the data will be searched.  These determine what will be taken into consideration when deciding which records are matches. Other configuration options such as "includeScore", "includeMatches" and sort affect the format of the output.  I won't go too deep into the meaning of each of these parameters, but will note that the main parameters determining the "fuzziness" of the search are "location", "distance" and "threshold".

The fuse.js homepage explains all of the parameters in greater detail, but even better, it allows you experiment with them live.  You can either use the sample data included in the page, a list of book title and authors, or paste in your own json formatted data.  As you change the selected configuration options, two output windows are updated in real time, one showing the javascript required to instantiate and run the query and the other showing the search results.  This provides a quick method for experimenting with the various configuration parameters and when you have the parameters tweaked to you liking, you can just copy and paste the configuration block into your code.  

Fuse.js might not make sense for every situation, but can be ideal depending on your search requirements.  I am currently using it in what is essentially a single page app within a larger website. Each user has their own data and the number of records per user is relatively small (currently the maximum size is under 400 records) so fuse.js is more than adequate for my purposes.  What's more, the data that I needed to search was already being loaded in the page as it was using Vue.js to generate the page. Previously, the same search was using Algolia which is a great service, but was overkill for this particular use case. With few records per user, but thousands of total users, the Algolia index was huge and growing steadily.  This, coupled with the fact that this was a convenience feature that not all users needed or used prompted me to seek an alternative and fuse.js was the perfect fit.

Fuse.js worked so well for me that I never tried any of the other javascript search libraries that are out there, but if you find that fuse.js doesn't quite cut it for you, you might give one of the the following a try:  js-search (https://github.com/bvaughn/js-search) by Brian Vaughn or fuzzy (https://github.com/mattyork/fuzzy) by Matt York.

 
]]>
How Allen Iverson Convinced Me to Join an Art Show https://liquid.fish/current/allen-iverson-art-and-the-journey-to-push-myself Wed, 27 Feb 19 14:45:58 -0600 In the previous year, I had some monumental changes in my life. I settled into a new job, and I found a groove with my babies that helped to ease the newness of fatherhood. After the initial shock to the system from all the change, I found myself thinking about the stagnation in my personal growth. As January 1st, 2019 came and went, I began conceptualizing ways to push myself. God (or “The Universe”) heard my inner plea, and decided to test my willingness to try something I’ve never done before; and I accepted.

A mutual friend on Facebook posted about an art show he was hosting that needed artists to submit work. I have been to a couple of his shows in the past (generally a mash up of different pop culture themes) and I’ve always left with the question: “If I were to do this, what would I do?” This time, the topic of the show —NBA legend, Allen Iverson— was enough for me to give it a shot. 

“This Bronze is Worth More Than Gold: An Art Show for Allen Iverson and All Unsung Heroes”, is a show intended to “highlight overlooked greatness. This includes athletes who never won rings, directors who never won Oscars, presidential candidates that came up short and whatever else our city's talented artists can come up with.” To me, there was no doubt on what I wanted to tackle. Allen Iverson was one of the first black athletes who was unapologetically black. Michael Jordan, Eddie Murphy, and Michael Jackson spent the 80’s proving that black people could profit millions in the sports and entertainment industry. They were phenoms that alerted Corporate America that black artists and entertainers could in fact push pop culture. Even though they were black icons, they were polished, branded entities. None of them totally embraced the culture and the essence of blackness as it stood. The 1990’s broadened that scope for more African Americans to enter the superstar stratosphere behind them, but it was a time where if you wanted to be the face of a brand, and you had a black face, you had to be clean cut and media savvy. Non-threatening towards a white audience. Iverson was not that in the slightest.

From Hampton, Virginia, Iverson was an east coast guy. At the time, east coast rap and style dominated the music scene. He was drafted in 1996 to the Philadelphia 76ers, a franchise whose fans are blue collar and traditionally known for supporting the athletes that played hard with their city’s name on their chest. He was the dubbed as the “anti-hero” during the final stretch of Jordan’s second 3-peat with the Chicago Bulls. Iverson challenged the establishment on the court as much as he did off of it. At his peak, his street style was in full display as he accepted the MVP trophy in 2001 in baggy sweats and a du-rag. That moment of unmitigated blackness prompted the league commissioner to mandate a dress policy to suppress a style that had already permeated through a league that was 80% black, in attempts to make his athletes appear more “professional”. Before Iverson; only rappers of the thuggish-ruggish variety wore cornrows. After Iverson; suburban, middle class black kids were wearing cornrows in their hair. Even some white kids had it too. He was the first in the NBA to go all out tattooed. He was the first to debut a shooter sleeve and 3/4 to full length compression tights (a style now commonplace in the NBA and the blacktop). He was the first in line of many shoot-first point guards who’s strength relied in his ball handling, quickness, and midrange shooting, in a league that would soon value analytics and high percentage shots. Before Black Lives Matter started the tidal wave for self-love, appreciation, and “wokeness” amongst Black Americans in recent memory, Iverson was being himself, raw and uncut, before social media gave regular people platforms to do it themselves. And for that, he became a cultural giant.  

My take on Allen Iverson for this art show was to depict him as a Christ-like figure. Looking up somberly to the heavens with a crown of thorns on his head. In sports, we value rings culture so much, that we overlook those who gave it their all and fell short. The very thing that made him unique on the court, also doomed him from obtaining a championship: a franchise committed to building around a high volume shooting, six-foot guard. My contribution to the show is to say that he may not go down as an NBA champion, but his legacy paved the way for the current crop of NBA point guards to be more aggressors than facilitators. Out of the dress policy made to stymie who he knew himself to be, came the flowers that blossomed into a fashion renaissance that we see on Instagram today. They all look like him and play like him on the court, while following his blueprint of branded individuality off of it. Some may see the image and understand the theme, but as a practicing Catholic, I know others might consider it to be sacrilegious. I don’t care. It’s art.

There’s only so much of the status quo you can take before it becomes stale. And if you were in middle school/high school in the mid 90’s, and you were black, you saw the impact Iverson and Reebok had that was an alternative from the clean cut, corporate, bald head, hoop earring of Michael Jordan. It was raw. It was real.

I only hope my piece reflects that.

Come see the show, Saturday, March 2nd at the Speakeasy Bar in Oklahoma City. 7pm!

]]>
Love and Creative Briefs https://liquid.fish/current/love-and-creative-briefs Tue, 12 Feb 19 11:03:07 -0600 Valentine’s Day is upon us and love is in the air!  It’s the perfect time of year to strengthen the relationships in our lives - and here at a creative agency, few relationships need as much attention as those between content strategists and graphic designers.

If you want your graphic designer to love you, don’t be like Mick Jagger.  I know what you’re thinking, “Don’t be like Mick Jagger? He’s got the moves, the charisma, everyone loves him!”  Well here’s the thing: he wrote the worst creative brief; maybe ever. Here it is. Give it a read. It won’t take too long.  

One of the most acclaimed artists of the 20th century, Andy Warhol, was given this barebones set of instructions to come up with album art for The Rolling Stones. The phrase “do whatever you want” is literally used.  I like to call that phrase, “How to Get Dumped by Your Graphic Designer.” Any designer worth wooing will tell you there is nowhere near enough information in this brief to make a deliverable the client will approve of.  So that begs the question, what do you need to include when writing a brief? Most importantly, you need balance. 

There’s certain details that are considered brief must-haves: dimensions, medium (i.e. Instagram ad, LinkedIn post), a general concept of color scheme or font style (for a pure graphic), the right Shutterstock search (for a photo), and the most refined version of any copy the graphic will have. However, you don’t want to put your designer in a box.  That’s where balance comes in. If you love someone, set them free. Especially the creatives. They need room to spread their wings and show you what they can do when given the freedom to create. “Do whatever you want” gives the designer freedom, but doesn’t show them that you care.

In short, if you want your designers to love you back, give them what they need, but don’t hold them down.  Let them be themselves, but make sure they know you’re there for them.

At the end of the day, despite Mick Jagger’s creative brief shortcomings, here’s what Warhol made: one of the most iconic album covers ever.

Happy Valentine's Day, XOXO liquidfish

 

]]>
Planning for the Unplanned https://liquid.fish/current/planning-for-the-unplanned Wed, 30 Jan 19 11:01:00 -0600 Schedules are hard.

Really hard.

The dictionary defines a schedule as "a series of things to be done or of events to occur at or during a particular time or period."

In my experience, a schedule is a list of items that you expect to do, but then everything goes haywire and you end up doing things that you either weren't expecting to do, hadn't planned on, or simply forgot.

Schedules are hard!

Missing plans, cancelling plans, forgetting that you were supposed to be the clown at your niece's 8th birthday party, and then remembering 6 months later.
It strains relationships.
It causes people to lose trust.
It could be why the last time you visited your sister, your niece kicked you in the shins.

I've been there, and those kicks hurt! Fortunately, this is shortly after the new year, and with new years come new resolutions! So throw away that plan to "eat heathier" or "exercise more" that you aren't going to keep, and resolve to plan smarter! Let's start with the basics:

Start With A Plan(ner)

The obvious first step is to set up a planner. If you don't already have one, a planner can help you keep in mind what's happening when, but a more likely issue is that you don't remember to write it down. Remembering to write things down can be hard, especially if you're already having a hard time remembering what you're supposed to write down to be remembering.

What can we do about that?

Well, there are any number of handy scheduling apps, calendar apps, and the like. With everyone having a portable planner anyways, it's easy to remember that when you set up that meeting over text, you can switch over to your calendar and set up a timeframe.

What about in-person plans?

These are a bit harder to remember, what with adorable little 7-year-old nieces running around and having tea parties. I've played around with methods and found that the easiest way to remember is to have your calendar on your home screen so that when you open your phone again, you're reminded to make a plan for whatever it was was scheduled. Repeat until second nature.

Buffer Your Plans With Plans

This is easier to grasp than to follow, and it has to do with planning an amount of time around your planned time. I've found that 30 minutes before and after a planned item is ideal. 1 hour meeting? plan for 2 hours. 30 minute lunch? plan for 90 minutes. The extra 60 minutes isn't a hard and fast rule, you can adjust to your liking or expectations. This isn't to extend your plans, but to make them more malleable. It's far easier to spend 90 minutes in a 60 minute meeting if you've already expected it to be 90 minutes. This will keep you from over extending your days and finding yourself unable to complete everything.

Make Time For You

This one is imperative and almost requires a separate article on it's own. It's of vital importance that you take some time out of every day to relax, unwind, and focus on things that make you happy. It can be early, with a small nap; It can be late, with a nice show; It can be sprinkled throughout the day, in the in-between time that you have from your buffers. Remembering that the reason you make these plans is because people like you and want to spend time around you, so it helps that you like you too.

As I wrap up, and get ready to head off to my niece's 9th birthday party in a clown outfit, I'd like to touch on a cancelling and rescheduling:

Rescheduling - Sometimes all of this planning amounts to having to push things back. It's no big failure to communicate that you need to pick a better day. The sooner you mention it, the easier it'll be to take.

Cancelling - It happens. Sometimes something comes up and you can't reschedule a plan. A birthday party comes to mind, but maybe you need to spend time with a friend who's grieving, or maybe work was just too much. It's better for yourself to admit when you're over extended.

These two things are unfortunate, but so necessary to keeping your schedule, and mind, stable.

Happy scheduling!

]]>
Title: ($dogs > $humans) ? true : "WRONG"; https://liquid.fish/current/title-dogs-humans-true-wrong Fri, 18 Jan 19 10:52:23 -0600 Did you know spending quality time with your dog can help with stress, anxiety, depression, loneliness and other "down-and-out" feelings? They can also increase exercise and cardiovascular health when you play with them. The one thing that separates dogs from our other pets is the love they can give back to us.

Dogs learn how to be more human just how we learn to be more dog. If you have the joy of a cuddly pup in your life, you'll know what I'm talking about. We learn what the ticks and movements mean just how they learn our tone of voice, facial expressions and commands. With this type of communication, a bond between man and canine is unlike any other.

Studies have found that people with a canine companion tend to have lower stress, depression, blood pressure, cholesterol levels and even our average of doctor visits (by about 30%). All of this just from laying around with your best friend next to you. The benefits are extremely obvious for those living with some sort of disability or ailment. The training and skill set these pets have is truly remarkable. I know a few of my friends wouldn't have the same quality of life if it wasn't for their service pet.

With a strong animal bond, you can escape the realities and annoyances of humanity. I know my Rosie specifically likes watching soccer and listening to music. I know when she needs outside, is excited, anxious, hungry, sleepy, happy, scared, lonely...all of them. ROSIE LIVES!

]]>
Making a List You Can Check Twice: A Yule Log https://liquid.fish/current/making-a-list-you-can-check-twice-a-yule-log Wed, 19 Dec 18 15:59:44 -0600 Here at liquidfish, our developers are like a family. Like a family, we help each other out. In much the same way, developers the world over are one big extended family. Sure, we have our disagreements, we don't always see eye-to-eye, but for the most part we help each other. So when I needed to find a good way to make Laravel log to the database, I went looking for help. And wow but that extended family made it harder than it needed to be! Laravel is a very extensible framework; that's why we like it. It comes pre-built with logging tools, models, and plenty of other goodies to make a developer happy. Laravel uses Monolog for most of its logging needs, which can write to whatever channel you care to set up. So why is logging to the database not built in? I couldn't say, but it turns out it's actually super simple! No need for a store-bought package with gimmicky settings; the best gifts are often homemade.

#How To: The Meat of the Yuletide Feast

So, you're ready for the recipe for my super-simple database log?

You'll need: 1 Model class

1 AbstractProcessingHandler class

1 migration and a dash of setting spices.

The Model:

namespace App\Logging;
use Illuminate\Database\Eloquent\Model;
class Log extends Model
{
    protected $fillable = ['message','context','level','level_name','extra'];
    protected $casts = ['context'=>'array','extra'=>'array'];
}

The AbstractProcessingHandler:

namespace App\Logging;
use Monolog\Handler\AbstractProcessingHandler;
class MonoLogDBHandler extends AbstractProcessingHandler
{
    protected function write(array $record)
    {
        $log = new Log($record);
        $log->save();
    }
}

The Migration:

Schema::create('logs', function (Blueprint $table) {
    $table->increments('id');
    $table->string('message');
    $table->text('context');
    $table->smallInteger('level');
    $table->string('level_name',50);
    $table->text('extra');
    $table->timestamps();
});

And finally, settings: In your `config/logging.php` you'll find a list of channels. Here's what our new db channel looks like:

'db' => [
    'driver' => 'monolog',
    'with'=>['level' => \Monolog\Logger::DEBUG],
    'handler' => \App\Logging\MonoLogDBHandler::class,
], 

Now we can use the db channel for all our logging. To use it by default, we can either set the 'default' channel to db, or (my preference) use the 'stack' channel which logs to multiple channels and then add the db channel to the stack. Easy as mincemeat pie!

#Wrapping it up: Santa's Little Helpers

Now we just have to write to the log:

Log::info('Little Johnny',['Nice'=>true]);
Log::info('Cindy Lue Who',['Nice'=>true]);
Log::warning('The Grinch',['Nice'=>false]);

Now that's the makings of a happy yule log!

]]>
Oklahoma City's Design Community https://liquid.fish/current/oklahoma-citys-design-community Mon, 10 Dec 18 15:25:23 -0600 I’ll be the first to admit it. I haven’t always been the best in supporting the design community in Oklahoma City. My participation comes in waves but I’m here to say that I’m back. In such a small city, each and every designer plays an important role in supporting our fellow designers and developers in town. As creatives, it’s also important for us to continue growing, learning, networking and spreading education of our profession around the city.

If you’re looking to be get involved, here are a few ideas:

 

AIGA OK

If you’re looking for design specific organization, they have want you need: bi-monthly speaker events and monthly meetups. They’ve been responsible for bringing some prominent designers to the city: Aaron Draplin, Debbie Millman, Jay Schuster, House Industries, Ty Wilkins, Hoodzpah to name a few.

oklahoma.aiga.org

 

OKC Ad Club

The Addys are a staple in Oklahoma City design awards. But they do more than just hand out hardware. They put on monthly lunches with speakers that range from social media to copywriting.

okcadclub.com/

 

DSN/DEV

Although their events has died down as of lately, they have established a great online community. Whether you’re looking for jobs, advice, or casual conversation from other creatives, there’s a channel for you.

dsndevokc.com/join-our-slack

 

Local Inspiration

Some great work getting out there, check it out.

dribbble.com/places/oklahoma-city

 

Design Lunches

Lunch meetups around town for designers to talk shop or vent about clients. Actually, I haven’t seen one put on in a while. Anyone out there know? Hit me up, let’s start it up again.

twitter.com/DesignLunchOKC

 

]]>
The Holidays in OKC https://liquid.fish/current/the-holidays-in-okc Fri, 16 Nov 18 09:30:09 -0600 With the holidays right around the corner and the cold weather upon us, the desire to get out and about is only going to shrink. If you are like me, the cold winter months with little sun can make me feel down. I try to make an assertive effort to combat those feelings by staying active and engaged with what is happening in my city and enjoy the many things going on.

If you are new to Oklahoma City or don’t travel downtown much, you might be surprised on the number of events and activities going on in the metro area. I am lucky to work and live near downtown, so I have been able to enjoy what it has to offer, and I wanted share some of the tips and tricks I have learned from attending a few of these events.

Devon Ice Rink

The ice rink opens on November 9th and runs through January 27th. If you plan on going with the family during the holiday season, make sure you know the holiday hours. Also, remember to take a pair of tall, warm socks!

Find out more about the Devon Ice Rink

Holiday Pop Up Shops in Midtown

The shops open the day after Thanksgiving and go through December 23rd, and a new set of local merchants are featured each week! This is a perfect solution for those who hate shopping at the mall, which can be especially stressful during the holiday season.

Read more about the Holiday Pop Up Shops in Midtown

Free Holiday Water Taxi Rides

The Bricktown canal is a spectacle filled with Christmas lights and is definitely worth checking out. It is a great (and free) event for a family night out or date night, but be sure to get in line early because it can be a long wait.

Find out more about the Bricktown Canal Holiday Water Taxi Rides

Opening Night

For those who don’t know what to do on New Year’s Eve, this is a great solution for the entire family or that special someone. Skip the line by pre-purchasing your wristband at participating 7-Eleven stores, MidFirst Bank locations, the Oklahoma City Museum of Art, and Plenty Mercantile.

Learn more about Opening Night

Now that you have learned a bit about the events going on in Oklahoma City during the holiday season, I challenge you to get out of the house, stop worrying about the holidays and enjoy yourself!

Find the full list of things to do in Oklahoma City around the holidays

]]>
Mobile Apps: Native vs Hybrid https://liquid.fish/current/mobile-apps-native-vs-hybrid Fri, 26 Oct 18 10:39:47 -0500 There are lots of decisions to make when deciding to build a mobile app, and one of the first decisions you’ll make is deciding which technology to use. In this post, we’ll explain the differences between Native and Hybrid mobile apps and help you decide which approach is best for your product and preferences.

First, let’s examine what the terms “Native” and “Hybrid” mean.

Native Application: an application written for a specific operating system in its native language.  For iOS, you would build a mobile app using Swift or Objective-C, and for Android, Java or Kotlin. Developing natively means that if you want your app on both iOS & Android, you’ll be building and maintaining two separate apps.

Hybrid Application: an application built to run on two or more operating systems.  These are usually built using web technologies such as HTML, CSS, and Javascript, but the main idea is that the same app will run on both iOS & Android.

So which is better?  There isn’t an easy answer, and it’s probably no surprise that deciding which to use depends on what your goals and budget are.

Let’s look at some specific issues and compare the two.

Native

Pros

  • Faster & more responsive. Animations and transitions come in at a buttery smooth 60 frames-per-second.

  • Native access to all of a mobile device’s capabilities and immediate access to new features.

  • Better user interface. Android and iOS users are used to seeing buttons, switches, lists, navigation, etc looking a certain way on their OS of choice. The practical effect here is that your app will feel familiar to users, and learning how to use it will come more naturally. This leads to a...

  • Better user experience. This is what keeps a user coming back to your product.

Cons

  • Additional skills required. You’ll need developers skilled in two separate native languages.

  • More expensive. After all, you’re developing and rolling out features twice every time.

Hybrid

Pros

  • Faster development time, which means...

  • Less expensive. You’ll develop your app in around half the time which means you’re paying less and you have a faster rollout.

  • Fewer skills required. Hybrid platforms such as Cordova require the same skills as a front-end web designer.

Cons

  • Works and feels like a web page does on mobile, i.e. clunky & unresponsive.  

  • The HTML, CSS & Javascript need to work and look perfect on ALL native browsers for Android. Each different Android manufacturer has their own built-in default browser (Sony, Samsung, LG, etc), and every browser has their quirks and needs attention to get CSS to look right.  

  • Users may not be able to articulate it, but they can tell when an app isn't native. It feels janky, and scrolling and taps aren't as responsive, and the user will “feel” that something is not quite right.

So which is better? There’s no easy answer. It depends on your goals and budget. Consider these aspects of your app when you’re making your decision.

UI/UX - How important are these to you and your users?  If you answered “Very”, go Native and don’t look back.

Cost - Developing an app on a budget? Consider a Hybrid solution.

Performance - Native apps will run faster and use fewer resources than their Hybrid counterparts. Decide if this is important to the success of your app.

Development Time - If you need to get an app out sooner rather than later, then add another point for Hybrid.  

At the end of the day, the decision should be based on a practical assessment of your needs.   liquidfish specializes in custom software and custom design, so if you’re looking for a motivated team to help craft your mobile app, contact us!

]]>
The Principles of Motion https://liquid.fish/current/the-principles-of-motion Thu, 11 Oct 18 17:06:27 -0500 As the old saying goes, “A picture is worth a thousand words”, and if that’s true, how much more can be communicated through something in motion?

Motion is an essential part of life. It enables us to grow, to develop, and to express ourselves in unique and individual ways. You can tell a lot about a person by how they communicate through their movements. For example, body language and facial expressions can have a host of meanings to an observer and communicate a vast amount of information in seconds. What’s amazing is that we live in a time where we can replicate this kind of expression through technology, and more specifically, digital platforms.

As a designer here at liquidfish I get to work on some pretty amazing projects like websites and mobile applications, and one of my favorite tools to use in our process is a program called Principle. With Principle, I can take the designs I’ve created in a static environment and bring them to life in an interactive environment with animated interactions and movements.

Telling the Story

Why is this important you might ask? Well, the purpose isn’t just making something look more lively — though it is a lot of fun. Through movement we can go a step further in crafting the story behind a brand.

This enables us to find creative ways to bring our client’s personality to the foreground of the design. When the interactions and movements are executed well, just like our comparison on the old adage, we’re able to say even more about a product, service, company or individual through movement than we would have with just static visuals alone.

Communicating Functionality

Another important aspect for using a tool like Principle is that it allows us to explore functionality in a more meaningful and productive way. For example, when we’re determining the relationship of landing pages to secondary page content, or how a menu will function on mobile as opposed to the desktop, we can prototype these movements and interactions before we ever type a line of code. This means catching issues early and creating better solutions before investing the heavy lifting required during development and programming stages. It also means happier developers!

Making Lasting Impressions

With all of the planning and strategizing that goes into our projects, our ultimate goal is to create an experience that people will enjoy and want to revisit again and again. Whether that be through an eye opening website introduction or the subtle movement of an icon to let you know you’ve successfully interacted with the page content, motion is a tool I look forward to exploring further to bring more value to our clients and enhance the effectiveness of our work.

]]>