Close

Why Does Coding Take Forever to Learn? You’re Making THIS Mistake

This cost me 4 years of my life…

4 years I could have been doing what I loved for a living…

4 years I could have been living well instead of struggling to make ends meet…

4 years further down the road to success I could be right now…

I regret those 4 years every day of my life because the mistake I was making is SO easy to solve… and it was a mistake I didn’t have to make.

In this episode of the John Morris Show, I’m going to share with you what that mistake, why almost EVERY coder makes it, and how to quickly get over it.
(more…)

April 14, 2014

Have You Lost Your Passion for Coding?

Ever felt unmotivated or uninspired while working on a project?

You felt it at first… you were super excited to get started… you felt like you could take on the world…

Then, about halfway through it was ALL gone.

No passion. No inspiration. No motivation.

It happens for a reason.

It’s not chance or luck. It’s not a fluke… or even something you necessarily did wrong.

And, there IS a way to fix it.
(more…)

April 7, 2014

These 5 steps fast-track your coding career

One of the biggest mistakes I think coders make is getting so caught up in the technical side of their coding career that they lose track of all the other (often MORE important) aspects of being a successful coder.

I know I did.

In fact, for the longest time I held this completely erroneous belief that talent trumped everything. That all I needed to worry about was being talented and I’d be good.

WRONG!

Because of that I couldn’t figure out why I started to lose out on client after client and constantly get underbid by coders who I KNEW were less talented.

Couldn’t my potential clients see?

Well, things got bad enough that I eventually had to swallow my pride and figure it out. And, as I did I began to realize that your technical talent is only one very small part of being successful as a freelance coder.

Eventually, I discovered what I call “The 5 Stages of Coding Career Development“… and man did my life change.
(more…)

March 31, 2014

I Was Lost and Didn’t Know What to Do Next…

A few years ago, I was really lost in my coding career. I had spent so much time mastering the technical aspects of coding that I never gave any thought to my career as a whole.

And as I was becoming more and more comfortable with the technical side, I began to wonder…

What’s next?

Where do I go from there and how do I get there?

As I searched for answers, I discovered what I call the 5 stages of coding career development.
(more…)

March 27, 2014

How to Set Yourself Apart and Get Clients to Chase You

Several years ago, I was in a really tough spot with my freelance coding business. I kept getting undercut by low bidders on Elance and oDesk and it was hurting my family financially.

Then, I discovered a little-known strategy for branding yourself as a coder.

Now, I turn down more work than I accept, clients gladly pay my fees and, I’ve left the Elance bidding wars behind forever.

In this episode, I share that same strategy with you and show you how you can implement it in your freelancing business.
(more…)

March 24, 2014

How I Get Clients to Chase Me

Notes:

  1. Here’s the link to Michael Hyatt’s FREE Platform Revolution Series: http://j.mp/1gaFYwX
  2. The transcript of this video is posted below for your reference

As coders, we all want more money…

We all want more freedom… to NOT be chained to our computers 24/7… to work with clients we like and care about… to be able to travel and spend time with our families…

And, we all want to have more impact… to work on projects that really matter… that make people’s lives better… and to be able to turn down projects that make our skin crawl…

The problem?

All the competition!

Anyone who’s ever been on Elance or oDesk or any of the other freelance sites knows just how bad the bidding wars can get.

And, how frustrating it can be to watch the project you really wanted to get snatched away by someone willing to do it for a ridiculously low price.

And to know full well that coder will probably never deliver on that project… and certainly not with the kind of quality you would have.

But, when you’re one face among a sea of other me-too coders… there’s no way for a potential client to know any better.

To them, there’s very little difference between everyone bidding on their project… and when left with that uncertainty… they always go with the lowest cost… because it’s the lowest risk.

If you want to build the kind of trust in advance that your ideal client will need to be willing to invest more money in you… you need to set yourself apart.

In fact, you need to set yourself apart in 3 very specific ways:
(more…)

March 19, 2014

Why YOUR Freelance Jobs are Getting Outsourced to Someone Who’ll Do It Cheaper

The answer: You’re not branding yourself effectively. If you were, your potential clients would never hire another developer just because they’re cheaper.

As business guru, Tom Peters, puts it:

“All of us need to understand the importance of branding. We are CEOs of our own companies: Me Inc. To be in business today, our most important job is to be head marketer for the brand called You.”

Of course, the big question is… how do you brand yourself effectively and fix your “outsourcing problem”?
(more…)

January 28, 2014

Justin Bieber Should Learn How to Code

Apparently, the Biebs was arrested this morning in Miami for drag racing and driving under the influence. If you’ve paid even a little attention, you know this has been coming for awhile now.

I don’t really hate on the kid too much because I understand he’s a kid with a lot of money and a lot of fame… and I wonder what kind of decisions I’d have made at that age with that money and that fame.

Probably not great ones.

But, it does make me think dude should learn how to code!

Why?

Here’s a few reasons why:
(more…)

January 23, 2014

Should You Just Give Up Learning How to Code?

Give Up Coding

I was recently asked:

Man… I truly hope I can just know what to do at some point without having to ask. You think PHP is an easy language to learn though?

When I read that, it reminds of the frustration I felt when I first started learning how to code. It can be very frustrating and make you feel like you want to give up. Should you? Here’s why I think you shouldn’t:

  1. It will get easier. The first few months are the most difficult. It truly is like learning a new language… not just a new way of speaking but a new way of thinking. But, once you’ve immersed yourself in it for awhile you do start to think differently… and each new piece you learn gets little bit easier. Eventually, learning new skills is pretty simple and happens very quickly.
  2. It’s worth it. Learning how to code may not be easy, but it’s definitely worth it. From a career perspective, you will eventually reach a point where you control your own destiny. You make what you want to make, you work with only the people you want to, and only on the projects you want to. And, you eventually can set your own hours, take off when you want… and you get to build cool new things as your “job”. All in all, it’s a pretty badass lifestyle.
  3. It’s your passion. If you’ve made it this far, my guess is that building things in code is something you’re passionate about. If not, you would have already given up. That being the case you probably couldn’t walk away even if you wanted to. Your mind would continually bring you back to it and you’d find yourself once again tinkering with code. So, you might as well embrace it. In fact, I believe that no matter how frustrating it may be at any given moment… if you follow your passion it will always work out better for you in the long-run.

Of course, learning how to code doesn’t have to be as hard as most of us make it. I learned this the hard when with PHP. I made several mistakes that prolonged my learning curve and set me back a few years. Fortunately, you don’t have to make these mistakes because I’m going to share with you what they are and how to avoid them:

  1. Don’t try to do it all on your own. This is easily the biggest mistakes new coders make. It has to do a little bit with ego and a little bit with this false belief that if you let somebody teach then you’re not “smart enough” to be a good coder. It’s absolutely false. I know some really great coders and what makes them great is that they’ll take instruction from anyone. If it can help them master something they need to know faster, they’ll do it. So, don’t be afraid to let others help you (in fact, I am offering to do just that for you when it comes to both PHP & MySQL and responsive web design).
  2. Don’t learn without a purpose. The next big mistake I made was to code just to code. I was too afraid to take on clients or put out an open-source project, so I would just code things I thought I was “supposed to” know. The problem is that, as a beginner, you have no idea what you’re “supposed to” know. So you end up wasting your time on a lot of things that just aren’t very fruitful. Also, without any kind of deadline from a client, you can prolong and put off your coding… which really slows you down. As scary as it might seem, I recommend you take on clients or start an open source project. You’ll speed up your learning curve dramatically by doing so.
  3. Don’t give up. Sounds bit circular but I made this mistake several times. I would get frustrated and quit for a few weeks or months. But, I also ended up coming back to wanting to learn more. And, the time I took off really set me back. Not only did I miss that time, but I usually had to re-teach myself things I had already learned. Coupled with the things above, it extended my learning curve from a year or so to almost 4 years before I really felt comfortable as a coder. That doesn’t mean you shouldn’t take breaks… just keep them short.

At the end of they day, I know learning how to code isn’t necessarily easy… but I believe it’s worth it. And, if you follow the advice above you can boost your progress and slash the amount of time it takes you to finally get over the hump and feel comfortable as a coder.

QUESTION: Have you ever considered giving up coding? How did you deal with it?

January 7, 2014

PHP Multiple Checkbox Array Handling

Handling Checkboxes in PHP Forms

I tend to get a lot of questions around checkbox handling when submitting forms to  PHP. Here’s a simple snippet to illustrate how it works:

<?php
print_r($_POST);
?>
<form method="post">
Car <input type="checkbox" name="stuff[car]" value="1" />
Dog <input type="checkbox" name="stuff[dog]" value="1" />
<input type="submit" value="Submit" />
</form>

A couple things to pay attention to here…

1. Notice the input names. They follow this pattern name[key]. The name is really the name of the “group” of checkboxes. The key is the name of that individual checkbox. This is how you know which checkboxes were checked and which weren’t. When submitted, this form will only include the checkboxes that ARE checked.

2. Notice the created array. When this form is submitted the output will look something like this:

Array ( [stuff] => Array ( [car] => 1 [dog] => 1 ) )

If you look at our inputs… “stuff” becomes the top-level array key, “dog” and “car” become the 2nd-level array keys, and the input values become the values of “dog” and “car” respectively.

With this, you can properly handle these checkboxes and process them accordingly.

December 31, 2013

Why I Code

It was mid-June 2011 in Texas. I had just been released from Active Duty for the Army and was on my way to pick up my then 3-year-old son, Davin, from daycare.

I pulled into the parking lot, hopped out of my car and headed toward the front door of the daycare. I remember feeling the heat hit my face as I strode across the parking lot.

It was hot… but it was a beautiful summer day. Not at all like what I was about to discover inside the daycare.

Why I Code

I made my way across the parking lot and in the front door to the receptionist’s desk. No one was there.

As I looked around, I heard what sounded like a faint yelling sound from around the corner. Instinctively, I moved toward the sound.

As I hurried down the hallway, the yelling got louder…

“Is this how you behave? Like animals? You are a bunch of monsters! You guys better start acting right or you’ll have hell to pay!”

As I got closer to the sound, I realized, “It’s coming from Davin’s room!”

Now angry, I swung open the door to his room. The room fell silent as everybody turned toward the door.

I saw the receptionist. Her face immediately turned bright red.

“Where’s his teacher?” I asked angrily.

“She called in sick today”, she said meekly.

“Davin, let’s go”, I said as I stepped away from the door. The receptionist hurried by me and back down the hallway to her desk.

Davin gathered his things and we headed down the hallway toward the front door.

When I reached the receptionist’s desk, she was typing frantically at her computer. I noticed she was typing an email to someone… the owners of the daycare I assumed.

“While you’re at it on that email… you can tell them that Davin will no longer be coming to daycare here. And, I won’t be giving a 2-week notice and I won’t be paying any termination fee. If they have a problem with that, then I’d be more than happy make this whole incident a public event”.

She said nothing.

Davin and I left the daycare and never went back. We never heard from them again.

The Moment I Realized Why I Code…

Davin had only gone to that daycare for a few months… but over the last few weeks I had noticed a change in his attitude. He had become a lot more irritable and grumpy. He became very demanding and had began yelling for the first time in his life.

Something had seemed off to me… that day in mid-June I figured out what.

From that day forward, I watched Davin at home. For most people, that would have been impossible. Most people would have been forced to find another daycare… and hoped the same things didn’t happen. They would have been helpless.

But, I code for a living.

I have the luxury of working from home and setting my own schedule.

And, that’s why I code…

I code for Davin. Regardless of your beliefs on parenting… the fact that I code for a living meant I could do something when a daycare went against mine. I didn’t need them. And, I got the added benefit of spending a lot more time with him (and all my other children)… which was good for both him and I.

I code to express myself. Coding is like any other artistic endeavor (Yes! Coding is an art!)… to be good it requires perspective, passion, and persistence. It is more a reflection of its writer than any hard fast “coding rules”. I code to find out who I am as a coder as much as anything else.

I code to learn. I’ve always believed and said the most important skill a coder can possess and facilitated within themselves is the ability to mentally abstract. There is a direct correlation between a coder’s “mental abstraction skill level” and the value of his code. I code to get better at coding… but I code to get better at thinking, as well.

I  couldn’t imagine not coding. It’s like a writer writing or a painter painting… it’s who I am. But, at the end of the day… it’s more than that. I don’t just code for me. I code so I never have to put my family in a position where they (or I) feel helpless.

And, I write all this because I think it’s important to remember when you’re feeling overwhelmed or un-motivated… why you’re here. So…

Question: Why do you code?

December 30, 2013

Force a Single (2, 3, 4…) Column Dashboard Layout in WordPress 3.8

Bring back single column

Prior to WordPress 3.8, you had the option to select the number of columns you wanted on your admin dashboard. Personally, I prefer 2.

However, in version 3.8… that option is gone. Here’s a handy little code snippet to bring it back:

function jmo_screen_layout_columns($columns) {
$columns['dashboard'] = 2;

return $columns;
}

add_filter('screen_layout_columns', 'jmo_screen_layout_columns');

function jmo_screen_layout_dashboard() {
return 2;
}

add_filter('get_user_option_screen_layout_dashboard', 'jmo_screen_layout_dashboard');

Just change all instances of “2” to the number of columns you’d like your admin dashboard to have and drop the code into your theme’s functions.php file and you’re all set.

December 27, 2013

A Simple PHP Class For Prepared Statements in MySQLi

PHP Prepared Statements Class

Prepared statements are all the rage right now in PHP development… and for good reason. Not only do prepared statements make your queries more secure… they also help future-proof your code by relying more heavily on PHP itself for that security.

If you’re not using prepared statements in your queries, you really should be. Here’s a simple class that helps you do just that using MySQLi:

<?php
if ( !class_exists( 'DB' ) ) {
class DB {
public function __construct($user, $password, $database, $host = 'localhost') {
$this->user = $user;
$this->password = $password;
$this->database = $database;
$this->host = $host;
}
protected function connect() {
return new mysqli($this->host, $this->user, $this->password, $this->database);
}
public function query($query) {
$db = $this->connect();
$result = $db->query($query);

while ( $row = $result->fetch_object() ) {
$results[] = $row;
}

return $results;
}
public function insert($table, $data, $format) {
// Check for $table or $data not set
if ( empty( $table ) || empty( $data ) ) {
return false;
}

// Connect to the database
$db = $this->connect();

// Cast $data and $format to arrays
$data = (array) $data;
$format = (array) $format;

// Build format string
$format = implode('', $format);
$format = str_replace('%', '', $format);

list( $fields, $placeholders, $values ) = $this->prep_query($data);

// Prepend $format onto $values
array_unshift($values, $format);

// Prepary our query for binding
$stmt = $db->prepare("INSERT INTO {$table} ({$fields}) VALUES ({$placeholders})");

// Dynamically bind values
call_user_func_array( array( $stmt, 'bind_param'), $this->ref_values($values));

// Execute the query
$stmt->execute();

// Check for successful insertion
if ( $stmt->affected_rows ) {
return true;
}

return false;
}
public function update($table, $data, $format, $where, $where_format) {
// Check for $table or $data not set
if ( empty( $table ) || empty( $data ) ) {
return false;
}

// Connect to the database
$db = $this->connect();

// Cast $data and $format to arrays
$data = (array) $data;
$format = (array) $format;

// Build format array
$format = implode('', $format);
$format = str_replace('%', '', $format);
$where_format = implode('', $where_format);
$where_format = str_replace('%', '', $where_format);
$format .= $where_format;

list( $fields, $placeholders, $values ) = $this->prep_query($data, 'update');

//Format where clause
$where_clause = '';
$where_values = '';
$count = 0;

foreach ( $where as $field => $value ) {
if ( $count > 0 ) {
$where_clause .= ' AND ';
}

$where_clause .= $field . '=?';
$where_values[] = $value;

$count++;
}

// Prepend $format onto $values
array_unshift($values, $format);
$values = array_merge($values, $where_values);

// Prepary our query for binding
$stmt = $db->prepare("UPDATE {$table} SET {$placeholders} WHERE {$where_clause}");

// Dynamically bind values
call_user_func_array( array( $stmt, 'bind_param'), $this->ref_values($values));

// Execute the query
$stmt->execute();

// Check for successful insertion
if ( $stmt->affected_rows ) {
return true;
}

return false;
}
public function select($query, $data, $format) {
// Connect to the database
$db = $this->connect();

//Prepare our query for binding
$stmt = $db->prepare($query);

//Normalize format
$format = implode('', $format);
$format = str_replace('%', '', $format);

// Prepend $format onto $values
array_unshift($data, $format);

//Dynamically bind values
call_user_func_array( array( $stmt, 'bind_param'), $this->ref_values($data));

//Execute the query
$stmt->execute();

//Fetch results
$result = $stmt->get_result();

//Create results object
while ($row = $result->fetch_object()) {
$results[] = $row;
}

return $results;
}
public function delete($table, $id) {
// Connect to the database
$db = $this->connect();

// Prepary our query for binding
$stmt = $db->prepare("DELETE FROM {$table} WHERE ID = ?");

// Dynamically bind values
$stmt->bind_param('d', $id);

// Execute the query
$stmt->execute();

// Check for successful insertion
if ( $stmt->affected_rows ) {
return true;
}
}
private function prep_query($data, $type='insert') {
// Instantiate $fields and $placeholders for looping
$fields = '';
$placeholders = '';
$values = array();

// Loop through $data and build $fields, $placeholders, and $values
foreach ( $data as $field => $value ) {
$fields .= "{$field},";
$values[] = $value;

if ( $type == 'update') {
$placeholders .= $field . '=?,';
} else {
$placeholders .= '?,';
}

}

// Normalize $fields and $placeholders for inserting
$fields = substr($fields, 0, -1);
$placeholders = substr($placeholders, 0, -1);

return array( $fields, $placeholders, $values );
}
private function ref_values($array) {
$refs = array();

foreach ($array as $key => $value) {
$refs[$key] = &$array[$key];
}

return $refs;
}
}
}

$db = new DB('root', '', 'test');
print_r($db->select('SELECT * FROM objects WHERE ID = ?', array(10), array('%d')));

I recommend walking through this code and unraveling how it all comes together. There are a few gotchas when using prepared statements in a dynamic way like this.

Or you could just check out my course PHP & MySQL 101 where I walk you step-by-step through building this exact class (and a lot more).

December 26, 2013

How to Get the Post Thumbnail Source URL in WordPress

Often, when working with WordPress, you’ll find the need to grab a post’s thumbnail source URL. Unfortunately, the_post_thumbnail() and get_the_post_thumbnail() only return the entire image tag.

How to Get a Post Thumbnail Source URL in WordPress

This handy little WordPress code snippet takes care of it for you, though:

function wp_get_thumb_src($post = false, $size = 'thumbnail') {
if ( ! $post ) {
global $post;
}

$thumb = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), $size );
$url = $thumb['0'];

return $url;
}

As you can see, you can post in a $post object or let it use the globalized $post object… depending on your needs. You can also pass in the image size you’re after. By default, it uses the “thumbnail” size.

Hopefully, you find it useful.

December 25, 2013

How to Use Media Queries to Build a Responsive Web Site

Media queries are the cornerstone of responsive web design. They are what make the kind of advanced responsive design we see today even possible.

So, here’s how to master using them…

How to Use Media Queries

So, What ARE Media Queries?

Here’s the official definition from the Mozilla Developer Network:

Media queries consist of a media type and can, as of the CSS3 specification, contain one or more expressions, expressed as media features, which resolve to either true or false.

Huh?

Think of media queries as conditional statements. You create a query that either resolves as true or false… and if TRUE, you designate certain CSS that then gets applied.

Here’s an example snippet:

@media screen and (max-width: 600px) {
.facet_sidebar {
display: none;
}
}

The above query says:

If the media type equals screen and the width is 600px or less… then apply these styles.

The “screen” part is the media type and can be things like “all”, “screen”, “print”, “tv”, etc ( Click here for a list of available media types).

The “max-width: 600px” part is the “expression expressed as a media feature” and can be things like max-width, max-device-width, orientation, etc (Click here for list of available media features).

And, the above statement will also resolve to true or false.

This is what allows us to target certain screen widths and change the way our site behaves based on that screen size. Essentially, this is responsive web design.

Finally, you have logical operators that help you “chain together” multiple expressions to target certain scenarios more specifically. Here’s an example snippet:

@media (min-width: 700px) and (orientation: landscape) { … }

Here’s you’ll notice the word “and” sandwiched between two expressions. This query states:

The screen must be at least 700px wide and the orientation of the device must be landscape.

You can use different logical operators like: and, comma-separated lists (or), not, etc (Click here for a list of available logical operators).

Where Do I Start?

At this point, you’re probably wondering where to start with all this. The most common way media queries are used is to target certain devices widths in order to change the display of a web site for different devices.

Here’s a common set of media queries (taken from Bootstrap 3.0):

@media (min-width: 768px) and (max-width: 979px) {}

@media (max-width: 767px) {}

@media (min-width: 1200px) {}

Here we’re targeting three different widths:

  • BETWEEN 768px and 979px
  • LESS THAN 767px
  • MORE THAN 1200px

Now, you might be wondering WHY these widths?

In my Responsive Web Design 101 course, I cover that particular question in great detail and show how you exactly how to structure your media queries to target different devices…

But, in a nutshell, these widths are based on common device widths. A number of devices (included iPads) have a width of 768px in the portrait orientation… thus the focus on widths around 768 pixels.

Also, common laptop widths are 1280px and 1366px… so the min-width:1200px is target those devices and anything bigger… while excluding iPads in the landscape position (1024px).

Why the 979px?

Well, 980px became a design standard on the web. So, designers (and web users for that matter) have gotten used to using that width. So,  you’ll often see media queries based around that width, as well.

All in all… media queries are about targeting certain groups of devices based on their widths. This allows us to create different designs for different devices and make our site look and function good no matter the device viewing it.

QUESTION: How do you use media queries in  your responsive designs? Do you have a standard set of queries that you use?

December 24, 2013

Coding Isn’t For You

I’ve been coding for almost 10 years now and I’m finally fully embracing that coding isn’t for me. It’s taken me awhile to reach this point, but the release of frustration is pretty amazing.

Please read on, though, because it’s probably not what you think.

Coding Isn't For You

You see, when I first started out coding… I did it for me. It was about me expressing myself, doing what I loved, making ME a living.

But, the reality of coding is that you’ll spend the majority of your time building stuff for other people. And, that’s why coding isn’t for YOU… it’s for them.

It’s a mutually-beneficial relationship where you achieve your goals by helping them achieve theirs. You win when they do.

I bring this up because as coders it’s easy to get caught up in our own view of how things should be done. It’s easy to believe that a client doesn’t know what they’re talking about and to get frustrated with them wanting things done a certain way.

And, it can even cause you to leave or screw up really beneficial relationships… because you want your way.

And, if you do… well, it’s your loss.

You still need to be an artist… but if you really want to be successful as a coder you need to fully embrace the fact that the more you help your clients achieve their goals… the more you will achieve yours.

And, that’s why coding isn’t for youit’s for them.

QUESTION: Do  you struggle with balancing your perspective on how something should be built vs how your client thinks it should be done? How have you dealt with it?

December 23, 2013

How to Fail in 2014

Brace for impact. As we near the end of 2013, you’re going to be hit with an onslaught of “how to succeed in 2014” posts. That’s all fine and well…

But, sometimes knowing what NOT to do can be more powerful that knowing what TO do. This is one of the times.

Imagine this…

Imagine if you were around 100 or so years ago and were a horse and buggy maker. Imagine if you had ignore this new “fancy” technology called a combustion engine that was making waves at the time.

Imagine how in a few short years you’d be put out of business as the automobile made your product obsolete.

Or, imagine even just a couple decades ago when this “fancy” new technology called the internet came out. Imagine if you ignored THAT.

Now, fast-forward to right now. Consider all the “fancy” mobile technology that’s taking the world by storm.

Wanna know how to fail as a web developer right now?

Ignore mobile.

Ignore mobile and watch as clients and site visitors slowly fade away. Ignore mobile and watch as your competitors slowly run you out of business. Ignore mobile and watch as your online business dreams vanish.

If you really want of fail in 2014… that’s exactly how.

Now, here’s what TO do in order to succeed…

Of course, you don’t want to fail and that’s why responsive web design is now more important than ever. The world has gone mobile and as a web developer you have to keep up if you want to stay relevant.

That said, LEARNING responsive web design isn’t necessarily easy. In fact, at first it can be quite confusing. Plus, there’s a very specific set of skills you need to learn in order to master responsive design… and, if you don’t know what those skills are…

Well, that makes it about 100x harder.

Thankfully, I’m going to tell you what you need to learn:

  1. the 3 different approaches to responsive web design and which one you should be taking
  2. the 5 individual skills that make responsive design “happen”
  3. how to work with and extend responsive frameworks

Once you master those things, you’ll be all set with responsive design.

Of course, if you want to fast-track your learning curve, I offer a responsive web design course that will teach you all of the above and more.

But, whether you take that course, a different course, and you learn it all on your own (not recommended)… make 2014 about mastering responsive design and building mobile-friendly web sites.

Frankly, you can’t afford not to.

December 10, 2013