Bootstrap 3 for the win in responsive design

Screenshot 2014-05-19 07.51.57Have you ever downloaded a WordPress or other CMS template and hit your head against the wall trying to figure out how the styles are setup so that you can format your content? Have you ever built a template from scratch or a website and thought that there has to be some standard by which web formatting and styles should adhere. Bootstrap is about to be your best friend.

Bootstrap is a rapid responsive design development library consisting of mostly standard stylesheet elements. Bootstrap consists of a 12 column grid with standard css names that you can apply to divs. Have you ever tried to make a HTML table work just the way you want it to and nest them? It’s really painful. Bootstrap solves that with these styles.

Bootstrap Grid

The code to produce the above grid is as follows:

<div class="row">
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
  <div class="col-md-1">.col-md-1</div>
</div>
<div class="row">
  <div class="col-md-8">.col-md-8</div>
  <div class="col-md-4">.col-md-4</div>
</div>
<div class="row">
  <div class="col-md-4">.col-md-4</div>
  <div class="col-md-4">.col-md-4</div>
  <div class="col-md-4">.col-md-4</div>
</div>
<div class="row">
  <div class="col-md-6">.col-md-6</div>
  <div class="col-md-6">.col-md-6</div>
</div>

As you can see, this is not complex if you follow the row and column nomenclature.

Bootstrap elements are designed to stack as you resize your browser or as the resolution of the device changes. You can see how beneficial this is if you want the elements above to be viewable on a mobile device.

My Cardinal Rules

Like they used to say about American Express… don’t leave home without it. Well, here are my rules with responsive design.

  • Always looks for Bootstrap templates or structures before you start from scratch. Preferably look for BootStrap3.
  • If you are using a CMS, picking a Bootstrap-based template can not only save you time, but save you vast amounts of hair pulling when working with your post content.
  • Look for existing styles that do what you want in BootStrap. If you need to override them, do so in your CSS after Bootstrap’s is imported.
  • Don’t reinvent the wheel… see rule #1
  • Think mobile first before you look at supporting the desktop versions
  • When in doubt about an element… wrap it in a div. You’ll be able to deal with it better later.

Using Bootstrap is probably the biggest time saving move you can make in preparing your web application or mobile website for the real world. I’ve barely scratched the surface of what the framework can do as well. You can even import the files for Bootstrap via a CDN or import them into your project using Bower.

 

 

 

 

 

Making SEO work in an world of Ajax

I came across a bit of a stumbling block with application development lately as it relates to “public-facing” web sites and SEO and decided I would share my thoughts. On one we all want the most advanced, dynamic Ajax-driven websites but these sites aren’t exactly SEO friendly since crawling engines don’t crawl these sites Seo-Logoswell or most of the time at all. I have no doubt that Google is already indexing some Ajax sites and I have no doubt that Ajax sites will enjoy premium support when it comes to crawling engines in the near future, but for now we have to have a work around.

What is Ajax?

Ajax or Asynchronous Java and XML is not new. Actually more nowadays the XML has been replaced by JSON.. thank goodness. Ajax has been around for a long time, but over the past several years it exploded and you can take your pick at Javascript frameworks that allow you to write a very dynamic and engaging application for the web that has the power and flexibility of a desktop application. Ajax works by making a request to the server with Javascript for data after the HTML page has loaded. Search indexing engines don’t fully support this because of security reasons and because of the resources involved in following Javascript as opposed to just parsing flat HTML.

So how does Google index sites like Twitter, Tumbler etc?

Google’s crawler specification as it relates to Ajax was designed to address the problems that these Ajax sites represent. It works like this. The Crawler hits your HTML and sees a special meta tag or a url with a #! in it. The #! technique is all but dead thanks to HTML5 Push State though.

Http Request -> http://host/index.html

<meta name=”fragment” content=”!”>

The crawler then issues a second call to your site for the same url with the following format.

Request = http://host/index.html?_escaped_fragment_=/index.html

It is now your responsibility to serve up static HTML so that the crawler can scan…

ajax-diagram-1

 

 

 

The simplest way to do this is to use a prerendering engine that will create a snapshot of your page by making a request to it from a headless browser. Prerender.io and PhantomJS are the combination of items that make this normally possible. This approach requires a forwarding rule on your web server to look for the ?_escaped_fragment_= and then to proxy that request to the prerendering engine and return the HTML. The web server must not redirect… You also support this on the web server by looking for the user agent of twitterbot or googlebot along with a dozen or so other indexing bots.

I know it sounds daunting, but it’s not really that difficult. There are services out there that make it pretty easy to set this up.

SEO tools slow to adapt

All this being said, SEO tools have become slow to adapt to Ajax technology that has been around for many years now. They really haven’t had to since they thrive on volume and right now the volume is still in the completely in the court of non-ajax driven sites. In fact, I heard the head of an SEO company today say AngularJS would destroy the SEO for your site. Unfortunately, this is the same adversity to change we see every so many years in this industry. The very thing that this attitude does is destroy innovation. Do you really think that Google would support a technology they won’t be able to crawl natively forever? The fact remains that Google and Bing support this technology through the aforementioned Ajax specification and it is a fairly simple matter to set it up.

Ajax is one of the best methods for retrieving content and keeping your presentation layer separate from your backend. It provides for a more pleasant user experience, it is faster than server side rendering of pages and provides users with feedback as resources are loading from the server. Remember the old days on dial up of waiting for a page to load every time you click a link… People no longer worry about this because they mark that devices have a access to high speed bandwidth making this no longer a chief concern. Of course, they are forgetting that mobile devices are still limited when it comes to these resources and bandwidth concerns due to mobile data limits are chief among user’s concerns. Newer Ajax frameworks like AngularJS by Google solve many of these problems with regards to bandwidth. SEO and cutting edge technology are rarely equal in terms of weight. I rank SEO higher in priority myself as if you can’t get found, you might as well be spitting in the wind. However, I believe we can all get our cake and eat it too.

Short-sighted approaches

I believe avoiding Ajax alltogether is a short-sighted approach. Here is a great example of what I am talking about. The author never mentions HTML5 PushState that will remove the # from the urls and make urls appear like they are real to the search engine crawler. If you want to learn more about this, then take a gander here.

Recommendations

Aside from using the prerendering mechanisms there are other tactics that can allow your Ajax enabled site to get indexed.

  • Make sure your menus are plain HTML (AngularJS and HTML5 both allow for dynamic menus that are plain HTML)
  • Make sure you create friendly url schemes and use HTML 5 push state instead of the #! mechanism (AngularJS again will facilitate this)
  • Create a mechanism by which each page will get it’s own meta information and canonicalization. (I do this by passing in the data to my header and footer)
  • Create snapshots that don’t have images or other data… just text. This approach is even better for the crawlers as it keeps them from having to crawl over useless information that it will toss out anyway. A simple process that will create snapshots and store them for the crawler would be excellent if you don’t have a plethora of pages to contend with.
  • If you use prerendering… Make sure you cache the results and precache the results so that the search engine doesn’t have to wait.
  • The prerendered pages don’t have to be pretty… they just have to give the search engine something to read.
  • CMS users… pull your content from your CMS directly for your meta information. For example, pull your description and keyword information to place in your header
  • Delay the complete load of your page until the Ajax completes. If the page completely renders before the Ajax does, the crawler may stop processing it… This is why you need to precache your content. Remember you also have to provide the user with feedback so you need to load part of the page. This is a balancing act.
  • Hang in there… Google’s crawlers area already processing some Ajax and in the near future writing your site this way and getting great SEO won’t be a problem.
  • Last resort, create a server side process for static content or use a CMS. As a last ditch effort if you don’t have the expertise for Ajax-enabled sites, you probably shouldn’t do it anyway. Back up and revisit a CMS-based or a static HTML5 site approach. I highly recommend the latter. It is incredibly easy these days to create and maintain a pure HTML site if you have some HTML experience. If you don’t know HTML or CSS and you don’t really care, you probably need to just outsource it or grab a CSS tool like WordPress or Joomla to do the work for you.
  • If your site is mostly static and doesn’t change, then why use Ajax anyway.

SEO is important

Don’t let me sway you against ranking your SEO as a first class citizen. SEO is extremely important to your website if you want to increase your reach and build your company. The proper balance between technology and common sense is just what most folks need. A proper assessment of what your needs and goals are is what you need. As for myself… I am going all in with AngularJs by Google and I believe in Google’s ability to make it indexable in the near future so none of this is a concern.

What is responsive web design and how do I get there.

mashable-responsive-designA few short years ago, I could have almost guaranteed that you would be reading this on a Windows PC with Internet Explorer (IE) and a few short years after that, I could reasonably conclude you would be reading this on the aforementioned PC with IE, Firefox or Chrome but you could also be on a Mac with Safari, Firefox or Chrome. If we look back to two years ago, I could add that you would most likely be reading this on an iOS device such as an iPhone or iPad with Safari. Today, I would have to add the plethora or Android phones and tablets to that cacophony of mediums. All that being said, I can no longer reasonably guarantee with a degree of certainty how you will be reading this content. This is where a “responsive user interface” comes to the rescue.

The rise of the smartphone and tablet has made the old debate of simply browser and platform responsiveness a purely academic one. Today, we must add to our consideration screen size, device type, browser, mobile, etc. Does anyone remember the old days of trying to write code to determine a user’s browser in Javascript and simply tailoring the response? Doing that very thing today is more of an art instead of a science.

More and more, the phrase “responsive user interface (UI)” or “responsive web design” are thrown around without much consideration to the preponderance of effort that is required to make it happen. Being “responsive” is about detecting the screen size, browser, platform, and device type of the user and providing an aesthetically pleasing and functional interface to said user. In essence, as the user’s resolution changes, so does the interface to accommodate that resolution.

“It’s not a single piece of technology, but rather, a set of techniques and ideas that form a whole.” as stated by a fellow blogger.

Just to get you started as a primer, let’s look at some terminology you’ll hear with regards to responsive design.  Keep in mind that none of this jargon is new to designers as these concepts have been around for many years.

  • Fixed layout – a Web Design that is defined by exact pixel widths. Typically the banner image or header provide the maximum inner width for collapse
  • Fluid layout – Nothing new here, but a fluid design is merely providing a percentage width instead of a fixed width, for example, your header may be defined as 100% of the browser width.
  • Elastic – Adds the best of both fixed and fluid but adapts to the users preference in font size. In this design font are expressed using em or emphasis.
  • Adaptive – Adaptive is merely responding to the users device with a template based on their device type or screen resolution with a canned template. This differs from pure responsive in that typically it involves a redirect.

Now that we have the jargon out of the way, let start talking about being responsive. I’d never get into a discussion about how to paint a car without knowing what kind of car we are painting. We wouldn’t paint a Ford Pinto hot rod red would we? It isn’t just a matter of providing a UI layer with chameleon like properties, but it also means having an architecture to match.

Responsive Design design has given birth to RESS or Responsive Design with Server Side components. Some responsive design purists will claim that being responsive is merely about responding to the screen resolution. This is all fine and dandy so long as the user is going to sit there on their desktop browser and resize it to ohh and ahh at your responsive design. (Come on… you know you have done it.) RESS is merely leveraging server side detection to target the client more specifically, e.g. a template for mobile iPhone users or a specific stylesheet for an Android tablet. The net effect of RESS is that you can provide a better experience with a smaller footprint. This is because less code has to be downloaded for the UI to be responsive. In a pure responsive UI, the images for multiple resolutions are often downloaded all at the same time. This technique wreaks havoc on users with limited bandwidth or a limited data plan. If you load up your favorite responsive site on your mobile phone via wifi, you’ll no doubt notice that it looks really nice. Now turn off your wifi and attempt to load it if you have 3G service and you’ll notice it is probably slow. It is trying to unnecessarily load all those resources to respond to all UI possibilities, including a desktop. The responsive solution here is to conditionally load elements and carefully tailor your design.

The easiest way to get your feet wet with responsive design is to start with a simple web site built with a responsive technology. For example, bootstrap is a good start for a responsive UI layer.

responsive-web-design

Since I cannot guarantee how you will be read this, I can with a degree of certainty say that you are most likely on a mobile device of some kind. The latest statistics show that people who read news and blogs prefer to do so over the mobile web and not through a native app. From my own experience and research, I have seen this to be true. Although, I will add that most users do prefer a native mobile experience when they are doing tasks that require more interaction, e.g. shopping apps, productivity, music. The reasons for these are fairly simple in that they are local to the device and respond faster and are more intuitive that using a browser. The key here really lies in offline ability of an app. Think about it this way … when you request a page over the mobile web it may error out and not load, but if you request something in a native app, I can attempt the connection in the background and catch the error and retry over without you knowing it and also, I could give you cached data that I stored on the device if the connection is down. Which this isn’t entirely out of the question with HTML5 since you can use local storage. The key concept here is allowing you to work regardless of your moving around, traveling or being completely out of service. All that being said, the mobile web is the ideal way to view static content like news, social media, etc.

Being responsive is about blending technologies if you are considering a “roll your own” approach, e.g. HTML5, Javascript, CSS Media Queries, fluid grids, flexible images and JSON. It is not a simple task by any stretch of the imagination. Alternatively, you can choose to utilize a product or reach out to a partner to assist in your responsive needs. Keep in mind that just because you are responsive to screen resolution, doesn’t mean that you don’t have to consider certain nuances of the device or browser you are running on and respond accordingly. This is why most responsive sites have special stylesheets for Android, iPhone, etc.

Here are some of the top framework projects that provide out of the box responsive design.

Overall, I’d say to follow these rules when attempting a responsive UI.

  • If your site is content-based, consumer facing or fairly static, a responsive UI is definitely the way to go
  • If your site is more an application with lots of user interactions, you may be better off choosing to build something more adaptive than responsive.
  • Choose a responsive UI framework like the ones mentioned above… Don’t attempt the role your own approach

This should give the rest of you folks out there a better understanding of responsive design. The key to being effective and getting the most bang for the buck with regards to responsive design is simply in being there when your users need you to be.

15 recommendations to make you a better programmer

I often give the same advice over and over to programmers that I work with. Most of the time I give advice on things to do with regards to coding and that works out pretty well, but “don’ts” are just as important as the dos. Let’s look at the 15 things a programmer should watch for. Most of these are geared toward object-oriented languages, but some can apply to procedural,functional languages as well.

  1. Don’t forget the tenets of object-oriented programming, Inheritance, Encapsulation and Polymorphism.
  2. Don’t overuse inheritance. Inheritance should make sense. Ask yourself about the relationship. If “is a”, then you should inherit, if “has a” then it should be a relationship off the owner.
  3. Watch your method/function/subroutine lengths. If a method or function gets longer than 5-10 lines, you are probably missing an opportunity to abstract or extract functionality. The longer a method is, the more complex it will become exponentially.
  4. Before you start to “roll your own”, spend some time looking for open source solutions or blog articles where someone solved this problem before. There is nothing wrong with leveraging someone else’s hard work. Chances are someone else will take over your work at some point and it is easier for them if it is a solution that they can find support for by a Google search. Also, think about the testing, maintenance time with regards to rolling your own solution. Aside from that the chances that one person can produce a solution better than a community project is unlikely no matter how good you think you are.
  5. Don’t hack. There is a lot to be said for code written during a time crunch, but more often than not, programmers will use this excuse to shortcut a solution and not take time to do it the way they know it should be done. You want the next programmer to look at your code and pat you on the back for your solution, not curse you in disgust.
  6. Don’t forget about reusability. Think about every line of code you write. Ask yourself if what you are doing is going to be repetitive by you or someone else. If it is, then abstract it to a utility class and reuse it. Never just copy code from one place to another when you could extract it to a utility or utilize polymorphism to address the need.
  7. Don’t use obscure variable names. It should be very clear what data a variable contains when another person looks at your code.
  8. Don’t forget to ask for a code review or design review. No one is perfect. You should always walk through your code with a peer with both of you sitting side by side. Explain your rational, what techniques you used and ask the reviewer for recommendations. Two heads are better than one. Also, you should do this early and often. Don’t wait until you finish a project to ask for a review because by then, it may be too late to fix.
  9. Don’t use global or member variables when a local one would suffice. I’ve seen this a few times before. A junior programmer will scope their variables as wide as possible. This not only causes confusion when others look at the code, but it can cause unintended consequences in your applications.
  10. Don’t forget about threading and thread-safety. Threading is a difficult concept for unseasoned programmers. It can bite you really quick if you don’t think about it. Complex applications may have many threads accessing the same resources and if you’re not concentrating on managing this, then you can get junk data, crashes and unexpected results. And DO NOT synchronize everything as a solution to thread safety, else performance will suffer.
  11. Don’t code first and ask questions later. You should understand the problem domain and the goals you want to accomplish before you even write one line of code. Ideally, you will design the application and run through your mental sanity checks in your head well ahead of actually putting code onto a screen.
  12. Don’t forget about unit testing. Unless you just enjoy spending hours and hours testing your application or sitting with your QA resource, you should unit test your code at the lowest levels and run these tests as regression tests along with your builds. Remember that a unit test is for very small bits of code. A unit test does not take the place of actual functional testing of your application, but it sure makes it easier.
  13. Don’t forget to comment and don’t over comment. If you want to provide yourself a hint, reminder or give that hint to another programmer, use a comment to make the point. Don’t over comment your code either as too many comments are an indication of complexity and you need to revisit your code for simplification or refactoring.
  14. Don’t forget to refactor your code as you go. If you see areas of your code you need to revise, do so as early an opportunity as possible. If you wait, the problem can be compounded by other code that utilizes it. Never wait until the end of a project to refactor, you will never get the chance and by then, it is a daunting task.
  15. Don’t forget to layer and loosely couple. Do not forget to keep your code as loosely coupled as possible. A good strategy is to layer your code, e.g. DAO layer, service layer, integration layer, Controllers, UI layer, etc. For example, a UI Layer should never access classes directly from the DAO Layer, but should utilize the controllers to access data, which in turn access service layer and so on.

While this is not an all inclusive list, it does give a programmer a great advantage. Being a programmer is definitely about working smarter and not harder.

 

 

 

The many types of technology clouds

If you remember from school, there are many different types of clouds. You have stratus, cumulus and nimbus just to name a few. In technology, the cloud is no different. The cloud has a different meaning depending on who you talk to and they are all mostly right but they can be referring to totally different things.

Cloud Architecture

Let’s look at the Wiki definition of a cloud

Cloud computing is the use of computing resources (hardware and software) that are delivered as a service over anetwork (typically the Internet). The name comes from the use of a cloud-shaped symbol as an abstraction for the complex infrastructure it contains in system diagrams. Cloud computing entrusts remote services with a user’s data, software and computation.

There are many types of public cloud computing:[1]

In the strictest sense, cloud computing is not merely just moving your software or services onto a server outside your firewall, but it’s enlisting a service with “cloud” properties like flexible horizontal scalability through elasticity. Cloud architecture is not at all uniform as well. It also means different things to the vendors that provide the services and it they implement it how they choose. Amazon, VMWare Cloud Foundry, Stackato and Azure are some of the hottest cloud architecture services out there today.

Consumer Cloud

From a consumers perspective, the cloud means that your data is stored on the internet somewhere. For example, the iCloud product from Apple keeps all your data in sync between computers and iOS devices. The iTunes Match service stores your music on servers and the same goes for the Google Music service.

Outsourced Cloud

To many IT professionals, the cloud is just a way to offload services they currently have in house to a server outside of their infrastructure managed by someone else to varying levels. Take for example that many organizations have shifted having internal mail servers to migrating to Google for Business, where every aspect of the infrastructure is managed by Google. Another example, might be moving your internal Microsoft Exchange mail server to a hosting provider. The end result, again to varying degrees, is greater reliability and less burden and reliance on internal IT resources. JFrog Artifactory for dependency management has a cloud service or a server you can download. If I purchase this service, can I say that my dependency management is in the cloud regardless of how JFrof implements their cloud service? The answer to this question is yes.

The True Cloud

While the cloud may mean different things to different people, preparing an application for a cloud architecture is not as simple as one might think. There are all kinds of decisions that need to be made and coding practices that should be adhered to. Typically, if you follow Java conventions, then you won’t have much of an issue with cloud deployments. Let’s look at an example Java web application and some of the concerns that need to be addressed prior to cloud deployment to a service such as Cloud Foundry.

  • Your application must be bundled as a war file
  • You application must not access the file system. (Utilize the class loader to load files from within the war, but don’t write to files)
  • Resources/Services should be looked up via JNDI
  • If you cache, utilize caching solutions like EHCache that propagate automatically across instances
  • Persist data to a database such as MongoDB, MySQL or PostgreSQL to guarantee access

For the most part, if you follow the J2EE web application conventions regarding deployments, you won’t have an issue with a deployment to a true cloud environment.

Cloud Architecture Dynamic Scaling vs. Autoscaling

One of the advantages to a cloud architecture is the ability to scale up instances of your application and only pay for what you utilize from your provider. There are two types of scaling, the first is Auto-scaling where a tool is utilized to measure load and will automatically increase instances of your application to accommodate the need and the second if dynamic scaling where you control the scale based on a load forecast. An example of dynamic scaling would be if you normally have a load of 1000 concurrent users and you have an event which will ramp up your load to 10,000. In a more traditional setting, you would have purchased servers and hardware to accommodate the worst case scenario which leaves your infrastructure largely utilized most of the time causing inefficiency and waste. In a cloud scenario,you might have 10 instances to service your normal load and for the 24 hour period of your event, you scale to 100 instances and when the smoke clears, you return to 10 instances. All this can be done with a single click of a button in a cloud infrastructure.

Automatic scaling is provided by some cloud providers in the form of a tool. Amazon provides such a tool that will monitor the load and allow you to set triggers to determine how many instances to ramp and when. Automatic scaling is very useful as it handles the unforeseen, but it should not be used in lieu of true capacity planning. It can also be dangerous and advanced intelligence needs to be built in to determine the different between junk and legitimate traffic. For example, think of what would happen if a DoS attack was performed against your application. Remember you pay based on the number of servers you ramp up.

Under the hood, scaling works by issuing commands to the server through an API. For example, with Cloud Foundry, the vmc command will let you monitor load and add instances which in turn creates a JSON request that gets sent to the server to give it instruction. You can also use a third party tool that interfaces with it in the same fashion or you can also build in the scaling intelligence into your own application by hitting the server API yourself. Using the latter technique, your application can control itself, making it very intelligent.

Conclusion

Regardless of how you see the cloud and how you utilize it, the endgame for your organization should be to offload the burden from your internal staff, decrease your expenses, provide greater uptime and flexibility and give you the ability to scale dynamically.

 

Looking for a unicorn: HR and IT recruiters are overlooking potential candidates

Over the past few years, I’ve been watching more and more IT candidates get overlooked for jobs for various reasons, despite that they are fully capable and qualified. A person can be disqualified for a job position by a recruiter or human resources representative for a number of valid reasons.

  • Not enough experience
  • Not enough experience in the right field or the right technology set
  • Not enough academic education background or lack of a degree
  • Poorly worded resume or one that just doesn’t advertise their skills
  • An overwhelming resume that is too long and contains too much info

By far the most common element I have seen over the past few years is that the HR personnel and recruiters are trying to match requirements from managers verbatim with a candidate’s resume, resulting in completely qualified candidates being overlooked because the lacked a certain keyword. The phrase “looking for a unicorn” has been used to describe the process of looking for someone to fit the exact set of requirements you have in hand. I even saw one example where a company was looking to fill a position and disqualified every candidate because the last title held didn’t match the title of the position they had an opening for. The twist here is that the title of the position that was open was unique to that company and only one person in that company had ever held it. This is like saying I need to drive a nail and I have to have a framing hammer and no other hammer will do. I don’t want a claw hammer, ball-peen hammer, sledge hammer or a rock hammer (which all of these will drive a nail, some better than others I might add) but I just have to have a framing hammer. Why you ask? Because someone said framing hammer at some point so I inferred only a framing hammer would do.

A near fit is still a fit

In IT, I see examples of overlooked candidates every day. For example, a client wants a developer with Dojo  (A Javascript Framework) experience… now being a developer for many years, I understand that looking for someone with experience with Dojo is going to be near impossible, especially if I narrow my search to local candidates only. Also, as an IT professional, I understand I could fill this position with any developer who has extensive Javascript experience or ExtJS, Prototype, NodeJS, Scriptaculous or YUI Javascript frameworks. Many times though, the client is an HR representative who was given the requirement from a software development manager so they want to see Dojo experience on the resume and won’t waiver in the requirement. This results in some recruiters just tempting the developer to just put Dojo on the resume and try to pass them off. This would seem like a reasonable thing to do if the developer is confident they can just acquire the new framework quickly, but it could get you into trouble when the client interviews the candidate and starts asking about specific Dojo questions. It hurts the recruiter’s credibility and the person interviewing or the job. Honesty is always the best policy so we have to address the problem by training people to either learn a little more about technologies and how they relate or get them to lean on a technical resource to aide in screening the candidates.

No one seems willing to train anymore

10 years ago, people understood that after hiring a candidate there is a certain amount of training that is necessary, in fact, most companies were perfectly allright with hiring someone who didn’t match at all so long as they felt they could train them to do the job and had confidence that they would stay with the job. A lot of the problem  lies not only with the recruiters and human resources personnel and how they match requirements to candidates but with the economy. Employers think they can afford to be really picky and not pay premium rates for IT talent, plus they don’t have the training budgets they once had back in the good ol’ days. IT is suffering the greatest shortage of talent it has ever had and if you go by the laws of supply and demand, the wages should be the highest they have ever been for skilled IT talent, but this is not the case. Wages in IT have stagnated for years after they dropped off following the .COM bust. The poor economy has affected almost every other field out there in a dramatic way, but IT hasn’t suffered as much because of mass attrition. This is due to several factors;

  • Overseas outsourcing created job losses and scared a lot of young students from pursuing IT careers and scared others out of the field
  • The .COM bomb years ago also scared a lot of people out of the field and from going into it
  • The initial hit of the recession hit IT pretty hard at first and weeded people out of the field
  • The Facebook/CSI generation are graduating to find out that IT isn’t all hacking and getting rich so they are not staying in the field
  • Larger companies have grabbed up all the IT people and paid them well, creating a shallow pool for smaller companies to choose from
  • People are staying put in this economy…IT professionals barely even poke their heads up to look around, as a matter of fact, most developers are ignorant to the fact that there is a shortage of their skills.

With such a shortage of talent, why haven’t the people that hire woken up and started to smell the coffee. Well, this is part of the disconnect; the same people who are trying to match skill for skill are also under the impression that IT is just like the other positions they are trying to fill and that there is a greater pool of unemployed out there to choose from. I don’t see the light at the end of the tunnel really at this point either. These problems might just persist until the economy recovers although I hope not.

How can we fix the issues?

I’ve come up with a shortlist of recommendations that might help hiring managers, human resources and recruiters be able to increase their success with placements.

  • Look at cross-cutting skills when trying to fill a position. A good example is that Java and C# have a lot in common. In most cases a Java developer can fill a C# position with minimal effort. This doesn’t always work the other way around very well unfortunately because Java’s learning curve is steeper and it’s been around longer.
  • Use a technical resource to help screen candidates. My company is very good at this since we are a custom software company as well as a staffing company. I conduct interviews and technical screenings all week. Not only do I weed out candidates who don’t fit, I can provide candidates who are near fits that a non-technical person might overlook.
  • Don’t automatically disqualify candidates without degrees, some of the best IT people I have had the pleasure of working with didn’t have a degree or had a degree in an unrelated field. For example, I know a guy who has a doctorate in physics who has always been a talented programmer.
  • Don’t be picky in this economy when choosing a candidate. Don’t compromise, but don’t be complacent in thinking that you are going to find anyone close to perfection.
  • Don’t forget that aside from you interviewing the candidate, the candidate is interviewing you. You need to show them how happy they will be and enjoy working for you as well as try to ascertain whether or not they are a good fit for the position.
  • Don’t let archaic rules like dress codes get in the way. Look at the candidate and determine, within reason, if they attempted to dress for the interview. So what if they failed to wear a tie or jacket? The average interview these days in conducted in a polo shirt and slacks and increasingly this is changing to be jeans.
  • Do ask the candidate what they have heard about your company candidly and inform them that in no way will it affect their chances of getting hired. Intel is very useful and a person who is interviewing with you most likely has spent a bit of time researching you before stepping in the door.
  • Look at the salary landscape and take that into consideration with the lack of people available.
  • Be willing to train a capable person

OK, so I colored outside the lines a bit from my original premise, but it is definitely useful to get out in the open some of these issues affecting. In the future, I hope that more IT professionals get the jobs that make them happy and fulfill their career aspirations. I also have high hopes that the folks who are hiring get a wake up call and maybe they can learn that it is ok to train qualified candidates again and stop looking for that unicorn.

Leadership qualities are still important in business

Sun Tzu said that if a man fears you, he’ll fight for you, but if I man respects you, he’ll die for you. The Art of War has been used for decades as a guidebook on how business leadership should function. Though many people scoff at the idea of juxtaposing battle command tactics with running a business, a lot could be learned from just the principles of the book. Sun Tzu meant for a leader to inspire troops and demoralize the enemy into retreat to minimize the losses on both sides. Is this not in essence what we seek to do in business management.

There are many types of leaders out there. I’d have to say that most are ineffective at “leading” because leadership training is something that is rarely sought after and few consider it is important as raw office politics. Despite the fall of Rome, most Roman conquerors kept their perspective as leaders until politics became too much for them to control. Behind the Roman conquerer stood a man who would whisper messages to the Cesar as he was cheer and worshipped by the masses. He would whisper, “You are only human and all glory is fleeting.” This was a tactic to keep the leader grounded in reality. Today, no one wants to hear about the poor leadership job they are doing, in fact, most are scared to lose their jobs by criticizing their leadership, even if it is in a constructive way.

I’ve had the pleasure and displeasure of serving many masters over the years. Out of the 40 or so leaders I have encountered, only 3 standout in a crowd, but what made them effective? What made their people choose to fall on their own sword if they had ever been asked to do so? Over the years, I’ve tried to wrap my head around the qualities they had that I believe are the key to success. You will be surprised at some of them.

  • A leader leads by example and is not afraid to get their hands dirty. A good business leader has been where you have stood, has moved up through the ranks, attained their position. For example, a Warrant Officer in the Marine Corps is an enlisted man who became an officer. A WO automatically gets more respect from men than a straight officer rank.
  • A leader doesn’t micromanage and trusts people to do their jobs and only intervenes when absolutely has to. A good leader surrounds himself with people who can get the job done without them. I know this seems counter-intuitive for some people to comprehend and it leads to the thinking that if your people can move the machine without you, then why are you needed. A leader’s job is to provide cohesion but not be the actual glue. A leader will choose the right people, cull the wrong people and cultivate an environment that fosters autonomy.
  • A leader doesn’t criticize, berate, belittle or otherwise demoralize his people, nor does a leader criticize his superiors in front of his people. Tom Hanks character in Saving Private Ryan said, “I don’t complain to you, complaints go up the chain of command… not down.”
  • A leader never puts himself in a position to take anything from his people. For example, the main protagonist in Band of Brothers reprimands a fellow officer for gambling with the enlisted men because he was concerned about what would happen if he won.
  • A leader knows his people. He should know their names, where they live, what their wife’s name is and their children. He should never struggle to remember anything about them and always be wary if they seem different or distracted. How can you know what is out of the ordinary if you do not know what is ordinary.
  • A leader should be decisive but also be open to advice. You should know who your subject matter experts are and lean on them when you need counsel, but when you make a decision, make it and do not appear like you have any doubt. Doubt and uncertainty are deadly adversaries to a leader and they are contagious and easily transmitted down to your people. Also, remember that pride is also your enemy
  • Anger should be used cautiously. Anger can rarely be a motivational tool and most of the time anger conveys a lack of control over yourself and the situation which leads to doubt and remember what I said about doubt. Also, anger induces fear in most people. Remember we want respect … not fear.
  • A leader doesn’t surround himself with toadies, brown-nosers and yes men. A leader wants people to ground him. Remember the guy who whispered in to the conqueror’s ear… A leader hires people who he feels are better men than he is. A leader does not hire people who are incapable to make himself feel more secure.
  • A good leader never throws his people to the wolves. Failure on the part of your people is a failure on your part always. It is a leader’s responsibility to shield, not to push them into the path of destruction to save his own neck.
  • Know when you can push your people and know when you can’t. Know when you need to reward them. Know when the need encouragement or when they feel demoralized. Know when you can help to take some of the burden they carry. Know them and know thyself.
  • Do not ask anything of your people you are not willing to do yourself. In the Marine Corps, leaders are required to participate in any physical activity that their subordinates are doing and lead by example by doing it better.
  • A leader should be strong, confident, fit, clean. Again, you lead by example. Set the example. You want your people to respect you. The people in my life I always respected were the people I couldn’t beat in a run at weightlifting or at figuring out difficult technical problems.

By no means is this an exhaustive list of leadership qualities that are keys to success, but it is a good start. Unfortunately, the people that possess these qualities rare had to work to achieve them, they just come naturally. The people who do not have these qualities are usually the ones who are arrogant enough to think they possess them already. I am fortunate that when I chose Doozer Software as a place to settle down, I recognized the qualities in the leadership of the company and that was one of the many things that influenced my decision.

I’m not advocating that you immediately go out and read Sun Tzu, but I am going to recommend that if you are in a position of leadership, see about getting a professional to come in an give a class or think about taking leadership classes yearly. I do believe that it is a worthy investment and that it will improve the bottom line of your business.