Saturday, March 25, 2017

[Job Skills / Guest Post] Skills Gap Analysis: Is the Tech industry facing a serious talent shortage?

In this cloudy saturday evening I want to share a guest post by Maria Baranowska, Outreach Executive at Mason Frank International, global and niche IT recruitment company, who is passionate about responsible marketing and the growing digital world.

I decided to guest her and this interesting post because nowaday I'm facing an incredibly high shortage of skilled professionals and we are desperatly seeking guys willing to at least learn how to become a Salesforce programmer: and this is surprisingly strange in these times of crisis.


The Tech skills gap is like the monster under the bed. You’re absolutely sure it’s there, but you can’t seem to make it out in the darkness.

According to Fortune "there are currently 607,708 open computing jobs in the US, but only 42,969 computer science students graduated into the workforce". Globally, there is much debate on the area and what that could mean for the industry in years to come. So how significant is the talent shortage? What does it mean to be ‘unskilled’ in the field? And, ultimately, what does this mean for today’s tech professional?

The graduate numbers in computing are the initial concern. Outside the above stated, the problem seems to be global. In the UK, the number of graduates in the field actually reduced in the last year, despite the country’s widely considered status as European Tech hub, and an increasing number of technical jobs. Furthermore, the talent pool is further depleted by the lack of equal opportunities. Globally, "there is less than 20% women in tech" and university statistics do not indicate a growing trend. ‘Of the 63,000 UK students taking the subject in 2014-15, 85% were male’ according to a report published by Hired. This can be seen reflected in the workplace too. The Mason Frank Salary Survey states, globally, the split of male to female Salesforce professionals is 66% to 33% (1% undisclosed) indicating the industry is still falling behind the equality stakes.

The demand for more tech professionals is definitely still on the rise. The US federal government alone reported needing an additional 10,000 IT and cybersecurity professionals and, according to the same source, "more than two-thirds of all tech jobs are outside the tech sector".

The lack of graduates within Computing may seem concerning at first, however, there are many arguments that support the idea of there being absolutely no shortage of professionals . According to Hired, around a quarter of today’s Tech professionals do not hold a degree. This could indicate the nature of Tech vocations allows for ‘on the job’ training and education outside of the traditional framework. In 2016, Mason Frank International were responsible for qualifying 30,000 Salesforce professionals through specifically tailored training programmes. Companies are now taking alternative routes to create their own workforce. Microsoft recently announced their own degree programme in order to train a specialised workforce. This approach could be beneficial long term and as we see a rise in alternative education through apprenticeships. Across the world, governments are introducing coding and computing into school curriculums A shifting attitude. towards education also suggests a greater focus on proving technical and soft skills in other ways.

It’s also important to consider external factors. The US, among other countries such as the UK, relies heavily on foreign workers. The outcomes of changing political landscapes may limit opportunities to work abroad and hinder the closing of the skills gap. Technology leaders such as Mark Zuckerberg and Gerard Grech are speaking out against President Trumps recent travel ban in fear of limiting access to the best talent through changing roaming legislation.

The key takeaways of this post are first and foremost an awareness of the potential issues. Considering the pace of Tech growth, our education systems are not moving fast enough to keep up. However, business owners and employers have a responsibility to nurture talent through other avenues and hire more for personality so that training can be given to the right candidates. It’s the only way we can ensure our feature in Tech.


Thursday, March 23, 2017

[Salesforce] ORGanizer Chrome Extension hits its first 1000 active users! #PartyHard

I proudly announce that ORGanizer Chrome Extension we have reached the 1000th active ORGanusers!

A big thanks to everyone!

The Extension is free for all, support us to keep it free forever!

Click here and decide to:
  • offer me a coffe, a pizza, a cappuccino, a pasta (I'm italian after all) to thank me for this awesome job
  • share your love for the ORGanizer Chrome Extension on the social channels!

Monday, March 6, 2017

[Salesforce / Apex Runtime] Bug Report: Null exception not thrown

This little and simple post is to get Community's attention to a possible bug my colleagues and me found few days ago.

It's about how null checking differs if occurring from outside or inside an Apex Class.

For those who are TL;DR (like me), jump to the following Gist and comment if you have an explanation.

Let's take this simple class:

public class MyController {
    public Account tst{get;set;}
    public MyController(){
        this.tst = [Select Id, Name From Account limit 1];
    }
    
    public void myMethod(){
        system.debug('Test inside: '+(tst.Name == null)); //Throws null pointer exceptions
        system.debug('Test inside: '+(tst == null));
        system.debug('Test inside: '+json.serializepretty(tst));
    }
}

Let's take the following anonymous code:

MyController cnt = new MyController();
cnt.tst.Name = 'test';
cnt.tst = null;
system.debug('Test outside: '+(cnt.tst.Name == null));
system.debug('Test outside: '+(cnt.tst == null));
system.debug('Test outside: '+json.serializepretty(cnt.tst));
cnt.myMethod();

Question: What do you think is the debug?

Answer:

19:06:58.24 (32784451)|USER_DEBUG|[5]|DEBUG|Test outside: true
19:06:58.24 (32903967)|USER_DEBUG|[6]|DEBUG|Test outside: true
19:06:58.24 (33182107)|USER_DEBUG|[7]|DEBUG|Test outside: null
19:06:58.24 (33393615)|EXCEPTION_THROWN|[7]|System.NullPointerException: Attempt to de-reference a null object

Yes, that is!

Apparently calling a nullified member of type Sobject of an object instance from outside is somehow handled by the runtime as null, whether you recall a field (cnt.tst.Name == null) or the member itself (cnt.tst == null); while calling the same member from inside an object method, correctly throws a null pointer exception as expected.

This seems related to how Sobjects are handled when used in SOQL relationship fields, such as:

List<Contact> cntList = [Select Id, Account.Name From Contact limit 1];
System.debug('Account is: '+cntList[0].Account);
System.debug('Account.Name is: '+cntList[0].Account.Name);

In this example if the Account parent object is not presente, the debug outputs:

19:18:17.18 (79345369)|USER_DEBUG|[3]|DEBUG|Account is: null
19:18:17.18 (79634328)|USER_DEBUG|[4]|DEBUG|Account.Name is: null

This is somehow confusing.

I get that when dealing with SOQL queries this is useful (no null checking) but dealing with custom Apex Classes this can lead to real confusion.

These are my 2 cents, what do you think?

Wednesday, March 1, 2017

[Salesforce] ORGanizer Chrome Extension Version 0.5 is live!

Dear ORGanizer users, we have reached beta version 0.5, that means we are half way to version 1.0!

For anyone that doesn't know what the Salesforce ORGanizer Chrome Extension is, download it for free from the Google Web Store and, believe me, you won't be disappointed for sure!

As usual, if you find ORganizer useful please cast a vote on the store!

This release comes with important major and minor new features and several UI fixes.

  • OAuth login
  • Automatic data backup
  • Very Important Queries and Scripts (VIQ and VIS)
  • Other improvements

OAuth login


The ORGanizer allow login with username and password along with token if the Login with token flag is active.

If your company's password policies prevent you from using the ORGanizer to store passwords, from now on you can enable your browser to user OAuth: by requesting an access token the ORGanizer store (only locally and with encryption) an access token so it can requests a valid session Id without knowing the user's password.

This means that you need to authorize every instance of the ORGanizer you have installed, so you need to input password at least once for every laptop you own.

How does it work?

Create or edit a new Account by clicking on the ORGanizer extension icon and select YES in the Login with OAuth (no password) section:


With this configuration the password field is not mandatory.

The first time you try to login with the above user (or if the authorization of the ORGanizer app has been revoked by admin, read later for how this is done) you are redirected to this internal page:


Remember which username you are about to authorize and click the link.

You are then requested for your username and password:


And to authorize the ORGanizer App (in this screenshot you are seeing the stage app):


This app requires web and API access (otherwise the Extension cannot work).

Once authorized you are then redirected in the following page:


where the access is validated and the access / refresh token stored locally (encrypted, no remote syncronization is done). You can proceed with login or simply close the app.

The next time (ever after days) you login with this user you are automatically provided a valid access token to enter in your ORG.

This authorization process occurs while setting up a new connection or when an App in no more authorized in your ORG.

To revoke an access token, jump to Setup > Users > select the user you want to revoke and go to the OAuth Connected Apps section:


Revoke each OAuth token issued (you can find multiple instances of the Connected App).

If you want to block the whole Salesforce ORGanizer Chrome Extension Connected App jump to Setup > Connected Apps OAuth Usage:


You can even remove the single user that are using it:



Automatic data backup


On the ORGanizer Chrome Extension's Options page there is a new section:


The extension automagically saves a local copy of current ORGs and Accounts configuration every time you change a value from the Popup (or change encryption password).

You can set the maximum backup stack size (maximum is 100, minimum is 0) and download a specific backup.

Remember that the Reset all data! and Reset all local data! actions affect the backups aswell.

The bigger your ORGs and Accounts configuration is, the bigger is the local storage needed. Keep an eye on the new gauge on the SYNC/LOCAL QUOTA section:



Very Important Queries and Scripts (VIQ and VIS)


You can name queries and scripts you use often in the Very Important Queries and Very Important Scripts sections on the Quick Console.

V.I.Q.


V.I.S.


You can name a new query/script, select a saved one or delete one.

Remember that every query / script is only stored locally and affects the local storage limit seen in the previous chapter.

You can download a backup of all VIQs and VISs in the Options page:



Other improvements


The Quick Describe plugin's search now filters objects based on key prefix:


The Options page now shows a link to the main site FAQ page and every section has a ? link to get some help.


Reset the Quick Console size and position (it can become too wide or can move outside the window if you are playing with Chrome's window):




Thursday, February 2, 2017

[Salesforce / Javascript] Visualforce tips for Javascript nerds


No secret I love Javascript.

It's messy to the right point, it can be quick and dirty, it can be elegant, it can be wathever you are: your Javascript code can be a mirror of your personality.

And what's better that putting together 2 things I like the most?

Yes, I'm talking about Salesforce and Javascript.

Javascript is the core of the new Lightning framework but since the birth of S-Controls (now deprecated) and Visualforce it's been an importanto tool to expand the standard Salesforce platform.

What do you have to know before starting your Javascript journey with Visualforce?


Use zipped static resources for your scripts


Put all your JS files into a zipped static resource, this way you have aboslute control over the place where files are stored and have no problem finding them.


Use the apex:includeScript


If you use the HTML script tag the resources can be loaded more than once and this can lead to unexpected errors.

Think you are using jQuery and Bootstrap and your page loads them in sequence.

In the same Visualforce you also use a custom Visualforce component which loads jQuery itself: what's the outcome? Bootstrap is simply erased from jQuery plugins.

The apex:includeScript component loads all the JS files only once, avoiding this kind of conflicts.


Use only one version per library


This is the same scenario of the previous paragraph.

If you load, e.g., jQuery 2 in one point and jQuery 3 on another place, this could lead to conflicts and strange behavior.

Keeping you library version on a static resouces allow you to get the right library version across all Visualforce page and components.


Use jQuery as much as you can


You'll be using Javascript because you'll want to create a slick, modern and responsive UI, so why reinvent the wheel?

Some good programmers still lack in jQuery knowledge, if you are one of them keep some time to study the bases of the library and I assure you won't regret it...and you can be sure you'll have really few problems for compatibility on different browsers.


Give all your components an ID / class name


When you develop a new Visualforce page take few minutes more that necessary to give all your components a recognizable html ID.

<page id="thePage">
 <pageBlock id="mainPB">
  <apex:pageBlockSection id="customerDataPBS" rendered="{!showCustomerData}">
   <apex:pageBlockSectionItem id="csDataNamePBSI">
    <apex:outputLabel id="csDataNameLBL">Name</apex:outputLabel>
    <apex:outputPanel id="csDataNameVAL">
     <apex:inputField id="csDataNameINP" value="{!account.Name}" />
     <apex:commandButton id="refreshCsNameBTN" 
          value="Refresh Data..." 
          action="{!refreshAccountName}"
          rerender="csDataNameVAL" />
    </apex:outputPanel>
   </apex:pageBlockSectionItem>
  </apex:pageBlockSection>
 </pageBlock>
</page>

This will ease your life if in the near future you decide to use Javascript to access the page's markup.

Remember that IDs are automatically calculate by the Visualforce render engine, so if you want the exact ID you can use the $Component global variable, so if you want to access the apex:inputField on the previous code:

document.getElementById("{!$Component.thePage.mainPB.customerDataPBS.csDataNamePBSI.csDataNameINP}");

But I recommend not to use this way.

This is not incorrect but as you continue your Visualforce development (sometimes the customers you work with don't know what they actually want till they want it!) you can change the UI, moving sections on the page, so the ID chain can change over time.

That's why you can use the "ends with" operator with jQuery to get an HTML component:

var inputField = $('[id$="csDataNameINP"]');

That is easier. The only thing is that you must be sure that you only have one and only one component with that ID.

Sometimes I use class names rather that ID, so for example:

<apex:inputField class="csDataNameINP" value="{!account.Name}" />

This way I don't care about ID generation and go directly with searching for a specific class name.

var inputField = $('.csDataNameINP');

That is even clearer (this is something I usually do and I like the syntax but it is not a best practice).

Keep coding and may the Force.com be with you!

Monday, January 23, 2017

[Salesforce / Git] git commit -m "Salesforce"

Why Salesforce developers and admins should use Git and some of the best tools to help you do so.


I'm opening this (hopefully) wonderful 2017 with a guest post about a subject I really love, that is Version Control in Salesforce.

Alex Brausewetter of Blue Canvas contributed this guest post. He is a founder of Blue Canvas - a company that makes version control and CI solutions for Salesforce developers and admins. Prior to starting Blue Canvas Alex built the Salesforce integration for Cloud9 IDE.

A Brief History of Git


Software development changed forever on a humble weekend in April 2005. Linus Torvalds, creator of Linux, was getting annoyed with his the version control system he was using to work on the Linux kernel. They were using a proprietary source control management (SCM) system call Bitkeeper. Legend has it that the notoriously caustic Torvalds and the commercial company that owned Bitkeeper started feuding that spring. Eventually, Torvalds knew he could do a better job himself and went off for a marathon coding session in which he built an entirely new version control system. He named the tool Git after himself (“git” is apparently British slang for an unpleasant person).

Git didn’t catch on right away though. It took until the founding of GitHub in 2008 before it really took off. GitHub provided added value on top of Git because it created a hosted service and user interface that made Git much more accessible. The company was founded in 2008. One year later over 46,000 public repos were hosted on GitHub.


Why Developers Love Git


Today, Git isn’t just for open source projects though. Major enterprises use it regularly.

Software developers in large and small companies love Git because it’s a unique and simple source control system.

Git is very fast - it was written in C - a low level language that can move extremely quickly. Unlike previous version control systems, Git also allows you to work offline. It’s also fully distributed so no one server hosts the code.


Git and Salesforce


Probably the most popular thing about Git though is it’s collaboration tools. And it is these tools which make Git the ideal version control system for Salesforce.

Salesforce is one of the world’s great software development platforms. There is so much you can do with the platform. And you don’t have to be a traditional developer to make great applications with Salesforce. So many people can be involved with a Salesforce project: developers, Awesome Admins, business analysts, product managers, sales ops managers and so many other diverse types of roles can work together to create great applications with Force.com.

Git is a great tool for helping all of these diverse groups collaborate on a code base. It prevents developers from overwriting each other’s work and handles merge conflicts. With Git you can do code reviews and have a picture of who has changed what at all times. You can even use “git blame” to see the specific ways in which a file has changed over time. Who wrote this line of code and when? It’s extremely useful for debugging.

Git also unlocks the power of CI for Salesforce developers. Git facilitates the kind of best practices that make you feel comfortable pushing code to production more frequently. This is good for users because they are getting new features more quickly. It’s also great for hiring developers because developers love seeing their work live in production as soon as possible.


Tools for Using Git



That said, Git can be challenging to use. Here are some of the best tools that make it easier to use.


SourceTree


SourceTree is a free tool from Atlassian that acts as a graphical user interface (GUI) for Git. Most of the time developers use Git on the command line. But many Git commands can be cumbersome and repetitive or even unintuitive. SourceTree cuts through all of that by providing a simple interface for Git commands. It allows you to push, pull, merge, fetch, clone, rebase and so many other Git commands through a simple, well-designed interface. Oh and did we mention it’s free? Many Salesforce developers are already leveraging SourceTree today to make their Git experience smoother.



GitHub, GitLab and Bitbucket: Hosted Git Services


Today it’s not uncommon to hear about GitHub before you even hear about Git itself. That’s because hosted Git solutions provide such an intuitive and wonderful way to leverage the collaborative benefits of Git. GitHub, Bitbucket and GitLab are all great tools. All provide added features like Pull Requests and commenting, as well as save you the trouble of having to host and maintain your own Git server. Which service you prefer is a matter of personal preference but all are worth looking at. GitLab and Bitbucket both also offer CI services which can be useful for Salesforce teams looking to automate their deployment pipeline.


SCM Breeze


SCM Breeze is a lesser known tool but it’s really nice. SCM Breeze is essentially a series of command line aliases for Git which make typing commands much faster and simpler. Instead of typing “git commit -m ‘my commit message’” you can simply type “gc -m ‘my commit message”.

Even better, when you are adding files you can simply type “gs” for “git status” and see a list of all files which have changed since your last commit. And instead of typing “git add ” for each file, you can for example type “ga 1-10” and it will stage all ten of your files for commit. You can even cherry pick files by typing “ga 1-4” and “ga 6” and “ga 9” for example.



Blue Canvas


Finally, there is Blue Canvas: a hosted Git implementation designed specifically for the Salesforce platform. Blue Canvas is version control for Salesforce. It automatically picks up changes that are made on your Orgs and commits them into Git. It will even pick up declarative changes so no one needs to learn Git on the command line if they don’t want to. Everything is synced in Git in real time. Developers can access their code base and refresh their local environments using “git pull”. To learn more check out: https://bluecanvas.io/.

Monday, January 16, 2017

[Salesforce / Lightning] Of the #Lightning afraid be not!




I was introduced to the Lightning world at its very beginning by Jeff Douglas when I was an active member of the Top Coder community.

At that time there were soo few standard components, no way to add a Lightning app / component in a Visualforce Page or easily integrate Lightning with your existing CRM.

Plus it was so hard to make it work, no documentation, no examples, no debugging, but you could feel the beginning of something that would have innovated the platform.

In months the set of components exploded, the posts about Lightning become more and more common, people started sharing their discoveries, trailhead modules were added and the Lightning Design System allowed developers to give their apps the right look and feel.

So what do you need to finally become an expert of this awesome technology?


If you are completely unaware of what Lightning is, start with the Lightning Tralihead Modules:


Once you have a good overview on the technology I suggest to fall into the official lightning guide (always up to date): here you will find everything about the framework.

This is were I first learnt all, well written, easy to understand, covers the whole framework...and it's free!

Have also a look to the Lightning Design System official site: I suggest you to use this library to make your components as much "Salesforcish" as possibile for a perfect UI experience.

Feeling an expert now?


The next step is to develop something unique and amazing with your new set of skills.

I've written in the past years a couple of custom Lightning components (browse here), and this is the good way to master the technology: pick a use case (it can be even a simple component like a progress bar or a related list component) and try to port it in Lightning using the Lightning Design System.

At first you'll feel a bit uncomfortable but as long as you keep coding you'll get more and more confidence with the framework and learn more and more tricks, understanding a new way of developing in your CRM.

Don't be afraid, you'll never get bored of it, I'll just get in love with it and appreciate a new and different way to think code.

If you've never developed in Javascript you can be a bit puzzled at the beginning, but I guarantee this new way of developing in the platform will increase your programming skills to a new level.

This does not mean you'll forget all about Visualforce, some customers still don't use Lightning so the marriage Visualforce + Apex will continue for years, but even if you won't have any chance to use Lightning with a customer's project, there is no reason you should not start learning and mastering it!

Next step?


Open your Tralihead account and start learning Lightning, you won't regret it ! (MVPs never lie!)