Saturday, 2 January 2021

2020 Year in Review - Part 3

July

The London Salesforce Developers held our TrailheaDX Global Gathering. Sadly a lot of this was us explaining how we'd failed to get on to any of the pilots and talking about things rather than demoing them. We still had fun though, which is the main thing.

The EMEA cohort of Speaker Academy completed their six week course and started prepping for their graduation event where they would give a 5 minute lightning talk to a live audience. It's an interesting mixture of relief that the course is over and trepidation that they have to put what they've learnt into practice in front of a bunch of people they don't know.

The Salesforce Summer 20 release went live, and the BrightGen webinar went virtual - not a massive change, but you do miss being able to look over at your co-presenter to see if there are any problems or questions. This release included the Lightning Message Service going GA, and flows that could now be run after a record was saved, getting ever closer to parity with triggers.

Salesforce's inexorable growth continued as their market cap hit $180 billion, passing Oracle's $174 billion. Richard Socher stepped down as Salesforce Chief Scientist to start his own company. 

The UK lockdown officially ended as pubs were allowed to open again!

August

The August meet of the London Salesforce Developers was a Speaker Academy takeover, as our first EMEA cohort gave their graduation talks to an appreciative audience drawn from the developer, admin and women in tech groups. 

As the pandemic started to hit the US, Salesforce had pledged no layoffs for 90 days - this clearly expired in August as 1,000 jobs were cut. In the continuing story of the whole world going virtual, Salesforce replaced Exxon Mobil in the Dow Jones Industrial Average. Marc Benioff also hinted at no digital Dreamforce this year, which sent the community into a bit of a tailspin. 

The UK government launched "Eat Out to Help Out" - an initiative that allowed pubs and restaurant to offer discounted meals Mon-Wed. This was intended to get the economy moving and give people the confidence to mix in public again, but also had the effect of increasing infections - encouraging large numbers of people to congregate indoors was still a bad idea it appeared.

September 

The London Salesforce Developers September meetup was on data factories and presented by Nikos Mitrakis - another remote presenter who would have found it more difficult to attend in person. 

As I took a well earned break from Speaker Academy, a Trailhead badge that I'd written content for was released - Salesforce Skills and Experience Building 

After the layoffs the previous month, Salesforce announced they were creating 4,000 jobs - hopefully giving some of those laid off a better chance of finding another position. There were also a bunch of "new product" announcements : 

Salesforce Meetings - bringing the virtual meeting experience inside Salesforce while still running on third party technology. 

Digital 360 - which felt rather like a repackaging of existing features with an E-Commerce slant. 

Work.com for Vaccines - to help governments and healthcare organisations manage large scale vaccine rollouts (several months before it was needed, it turns out).

The UK continued to open up - I was able to go for a couple of weeks holiday in Norfolk and even go to a few pubs and tea shops. Always socially distanced, but the weather was still glorious so I was mostly walking my dogs on the beach or sat with them in pub gardens. I kept reminding myself (and others) that every other pandemic in history had a second wave, and there was no reason why this time it would be different.

Related Posts

 

Friday, 1 January 2021

2020 Year in Review - Part 2



Three months of lockdown took a toll on the grounds of the beach house!


April

April was notable for a full lockdown in the UK, which moved everything that wasn't nailed down into the virtual space. The London Salesforce Developers had their first event run on Zoom, which gave us significant pause for thought as we'd seen a number of reports of Zoom bombing in the media and were keen not to be another example of lax security. Todd Halfpenny and I had a couple of trial runs were we locked everything down and then tried to cause trouble, which were calmed our nerves. Like many things, it's very difficult to guarantee it won't happen, but if you make people register, maintain control of microphone and screen sharing, and be ready to boot anyone that steps out of line you can be fairly confident you won't have a disaster. We had a great turnout to hear Anup Jadhav talk about event driven architecture, no doubt helped by the fact that everyone was stuck at home. We also welcomed attendees from around the world, which was an unexpected upside. The networking in this first event went on for some considerable time, as everyone was a bit starved of company and needing some form of human interaction. This pattern didn't continue though, as people adjusted to the new normal pretty rapidly. 

At BrightGen we took the view that you can't over-communicate when you are working remotely, so each team had regular social/coffee break calls and there was a company-wide pub quiz at regular intervals. Again this turned out to be something that wasn't required every week, but while it was needed there was plenty of it. Probably the hardest aspect was onboarding the new joiners - building those key relationships is harder when the casual conversations around the office aren't possible. On the upside, we saw a huge surge in lunch and learn, both in terms of sessions and attendance. With so much time on our hands, we were keen to make good use of it. We also had the virtual Grand National sweepstake - no prizes in this format, so obviously for the first time in my life I had the winner - Potters Corner!

In an announcement that surprised nobody, Salesforce announced that Dreamforce would be virtual in 2020, as would all their other events. 

May

Emboldened by the success of our first virtual meetup, the London Salesforce Developers pressed on with Devs Love Low Code Too, presented by Narinder Singh. Another great turnout, with attendees from around the world. We were also remarking how much easier it was to organise these events when you don't need a venue and catering! "Have Zoom account, will meetup" was now our mantra. 

Come the 13th May we weren't stuck in front of our screens for quite so much time, as the lockdown started to slowly lift and we were allowed out for exercise as much as we liked, including meeting one person outside who wasn't part of our household! It was like Christmas come early (and pretty much identical to my actual Christmas it turned out).

Jodi Wagner and I onboarded two new teachers for Speaker Academy (Amber Boaz and Julia Doctoroff) so that we could split into EMEA and US cohorts. Somehow this took a four hour Zoom call, and in my case a surprising amount of rum and coke.

Salesforce launched Work.com to help companies return to the office, which in hindsight seems quite optimistic. Gavin Patterson continued his rise to fame at Salesforce, becoming President and Chief Revenue Officer. 

June

The London Salesforce Developers June Meetup saw David Reed join us from the USA to present on Automating the Development Lifecycle with Cumulus CI - something we'd probably have struggled to achieve in person! The Speaker Academy signup for the EMEA cohort attracted 50 applicants for 6 spaces and we kicked off the first session on June 4th.  The restrictions relaxed further in the UK and we were allowed to travel as far as we liked for exercise, although we still had to return the same day. 

The Summer 20 release notes became available in beta, starting another of the thrice-yearly races to get the first blog post out about the key features. 

The much anticipated TrailheaDX took place, re-imagined as a virtual event that bore a striking resemblance to the actual event but with more of a marketing spin. It's fair to say the response to this was positive, but it was nothing like as well received as the in-person event. The chat aspect seemed particularly problematic, descending into an avalanche of spam after a few minutes. Moving events online wasn't something that only Salesforce were wrestling with - I attended what seemed like hundreds during this time and nobody really came up with anything different to a mix of recorded and live sessions, and a virtual expo that wasn't well patronised. 

But the days were long, the weather in the UK was glorious, the COVID-19 case numbers were dropping and it looked like things would be opening up more in the near future.

Thursday, 31 December 2020

2020 Year in Review - Part 1


January

2020 started quietly, like any other. The first London meetup was Einstein Analytics where the number of people doing dry January meant that there was more than enough booze to for the rest of us. The following day was the London Salesforce Developers, where 60 odd people headed over to PWC's offices to hear about Heroku and the Spring 21 release of Salesforce. London's Calling needed bios and headshots, and tickets were selling like hotcakes. 

There were also reports of a virus in the Wuhan province of China that was highly contagious - this didn't feel like something we had to worry about as (a) it was a long way away and (b) we'd seen this kind of thing before with SARS, swine flu and bird flu in the past. Towards the end of the month there were a few cases in other countries, but easily explained through international travel. On the last day of the month the UK recorded it's first case, along with fellow European countries Sweden and Spain. Again, very much a case of someone bringing it with them on holiday and easily contained.

February

Two meetups for the Developers in February. First a fireside chat with Wade Wegner at Salesforce Tower on 5th, talking about Evergreen (now Salesforce Functions) and more. Little did we know this would be the last trip to the tower of 2020.  Then on 12th we had our Dreamforce Global Gathering at Deloitte's offices in Clerkenwell Green. Little did we know (2) that this would be the last time we would meet in person. 

Spring 20 went live and I presented a release webinar with my colleague Clive Platt. Little did we know ... you get the picture. This brought the new mobile app to all users, and introduced the WITH SECURITY_ENFORCED SOQL clause and the Security.stripInaccessible() method to bolster security in Apex. What a time to be alive!

The COVID-19 virus was still around  - by Feb 6 there were 30 odd cases in Europe which led me to mention it when sending my London's Calling slide deck - a throwaway remark hoping that it didn't derail us. It still seemed a very low risk, and likely something that would level out quickly - in the UK we only had a couple of cases. Fast forward to the end of the month and we still had under 20 cases Looking over to Europe, the case count in Italy was rapidly increasing. Around this time things started to change as we realised that it was likely to be problematic, although human nature still made us expect that things wouldn't be too bad. At BrightGen we started planning for how we'd shift most/all of our workforce to remote, with a dry run day scheduled for March.

March

The London Salesforce Developers decided not to hold a meetup in March, as the London's Calling community conference was taking place and that typically consumes most of the community's energy. At BrightGen we'd had our dry run day in early March with everyone working from home and it had been pretty straightforward. Which was handy as we went completely remote the following week, although with offices still open for the odd face to face meeting. 

The Salesforce World Tour London, due the third Thursday in May, was postponed. By the end of the month TrailheaDX had gone virtual and become a half day or so event. 

As everywhere started to shut down, or operate at a much reduced capacity, I had to make a trip to a testing centre in Stratford to take my JavaScript Developer 1 exam. After a weird journey where I shared a whole carriage with about 10 other people in rush hour, I arrived at a deserted Stratford that would usually be bustling. I had an hour to spare in a ghost town where not much was open and there was nowhere for a casual visitor to sit inside with a coffee and carry out some last minute revision. So I wandered the streets while reviewing my notes and did my best to avoid going within 6 feet of anyone else. After the test I headed back home on a carriage with about 8 other people, as the London's Calling speaker drinks scheduled for that evening had been cancelled due to the ever increasing virus.

London's Calling had tried to stay in-person, but eventually gave up the battle and went all remote, with the exception of a few speakers, including myself. This involved another trip to London, this time sharing the carriage with 5 other people and arriving at an eerily quiet Liverpool Street, which typically resembles the zombie apocalypse at that time of the morning. A strange day then commenced of a group of speakers shuffling from one room to another to support each other, moving the chairs into corners of the room and generally avoiding each other while trying to network with each other. I personally had the pleasure of presenting to the cavernous and almost totally empty keynote room - this was actually a great experience as I had to still give my best even in the absence of an audience and in a somewhat uncomfortable environment. Whatever doesn't kill you makes you stronger. I'm not sure the organisers would agree though, having pivoted from an in person to virtual event at a few days notice, and spending a lot of the day finding out the limitations of the various livestream event platforms! 

After a happy hour involving a live band and highly distanced drinks and dancing, I headed home sharing the carriage with 3 other people, wondering how long the trains would continue to run with so few passengers. This was also the last day that the pubs were allowed to open, in an attempt to slow the spread of the virus, and they were packed both inside and out until closing time. It didn't seem like this was going to help much, and it didn't. A mere three days later we were locked down and only allowed out for an hour's exercise a day.

I'd been asked to present at the Finland Developer Group on 25th March. It was always going to be remote, but as I was preparing my talk it started to feel like a vision of my future. Short term future, though, which turned out to be all kinds of wrong!

Related Posts

Saturday, 12 December 2020

Org Documentor - Fields Usage in Page Layouts




The November meetup of the London Salesforce Developers saw us sharing our favourite tools, those we use regularly and those we have written ourselves. I showed the Org Documentor, and got a great question from Lawrence Newcombe - does the information output for the custom fields include details of which page layouts they are used on. The answer was no, but definitely doable. And here we are less than a month later and it's done! 

There's no additional configuration required, but as always remember that it only works against the metadata that you have retrieved from your org. If fields or page layouts aren't present on disk, they won't appear in the report.

Output


I've had to tweak the format of the report slightly, as the layout names can be quite long so I needed more real-estate. For those that care about the bootstrap side of things, the main bodies of the pages now use the container-fluid class rather than container, as this allows them to take up most of the width of the page.

The fields table now contains a new column - Page Layouts - which has the layout name and the behaviour.





As the names can be quite long and there can be multiples, the behaviour is in bold and there's a separator between each layout. 

This output was generated from the sample metadata and can be viewed online.

Processing


Much like the last enhancement I added, aura enabled classes, I was again pleased by how little code needed adding. I loaded the page layouts from the source folder and iterated the layoutItems entries. For each of these I created an ObjectPageLayoutData record and stored this in an array associated with the object and field combination. I then cached this information in a map, keyed by the object name, followed by a ':', followed by the field name.

When generating the field record, after it has been enriched with any extra information, I then retrieve the cached ObjectPageLayoutData array for the object name and field combination, and add this to the object information that is passed to EJS to generate the HTML.

In the HTML template, I check to see if there are any ObjectPageLayoutData entries, as fields don't have to be present on layouts, and if there are some, I iterate them and output the layout name and the behaviour (Required/Edit/Readonly). As there can be multiple entries, and the names can be quite lengthy, I add a thematic break tag (<hr/>) after all but the last item in the array (and I also think it's pretty cool that in an EJS HTML template I can iterate an array and tell if I am on the last entry!).

Plug-in


Version 3.3 of the plug-in has this new functionality and can be found on NPM

If you already have the plug-in installed, just run sfdx plugins:update to upgrade to 3.3.

if you aren't already using it, check out the dedicated page to read more about how to install and configure it.

The source code for the plug-in can be found in the Github repository.

Related Posts

Saturday, 5 December 2020

Salesforce buys Slack


A week after the news broke that Salesforce were looking to acquire Slack, the deal is done - we knew it would be, so that it could be announced at the Dreamforce to You keynote. It turns out that talks started some time ago, but with Slack talking to Salesforce about an acquisition of Quip. This would have been a real surprise, as I can't recall Salesforce ever selling on an acquisition, although they have shut a few down (including my favourite todo list, do.com).

In my previous post I touched a little on why Salesforce would need another tool to collaborate outside of the Salesforce instance, and I've been thinking more about this.

Chatter

Chatter is a great tool for collaboration around Salesforce data, allowing you to combine structured information in the record detail and related records with unstructured data in the chat. You can see the historic discussion around changes to the record, not just which fields changed, and understand more about the lifecycle of a record. Did a case involve pulling in additional teams, did a Sales manager have to chase up a rep to progress an opportunity. All of this is valuable information which is hard to capture on a record without having a million related records.

Chatter groups are also useful in the context of Salesforce data. Being able to @mention a group regarding a record, using the same example from above, if there was a case that required a specialist team you could get their attention with a single post. They are less good at general collaboration in my view - while I use groups a lot, it's for headline type posts - announcements or asking if anyone has seen a specific problem before. But only for the initial contact. Once the protagonists are identified, any further collaboration is typically carried out via Google Chat, Slack, email or videoconference. Essentially I find hem a way to get the attention of the right collection of people. 

I don't think Chatter was helped by the investment drying up after a few bumper years. The desktop application lagged way behind the web interface, and was eventually withdrawn, even though it was pretty popular. But the key sticking point to expanding to the wider company is the org-centric aspect. If you have multiple orgs, then people need to maintain multiple logins, which is a bit easier with mobile app as can easily switch, but still not ideal. You also need to be very clear which is the correct org for collaboration, even if it's around something happening in another org. There were some third party solutions around providing single view of chatter across orgs, but generally these replicated posts across orgs and required additional licenses for the ISV product and often something like Heroku orchestrating the transfers. You also can't integrate inside the feed like you can with a tool like Slack, although you can do a bit more around the feed with Lightning Experience pages. Automatic notifications also felt quite antiquated, as for a long time you had to construct a post through the Connect API, @mention someone, then detail what it was you wanted to alert them about. This has improved since the advent of process builder and custom notifications, but was introducing features that other tools had for years. Once Quip came along, that felt like Chatter was heading down the maintenance only route. 

Employee Communities

Communities were another attempt to introduce collaboration across the enterprise, and replace the intranet, that didn't make it. What most companies wanted were a simple way to create a related set of pages (Google sites anyone?) for intranet type content and a way to collaborate on the content. What they got was a $20/user/month platform-lite style license, that pretty much guaranteed limited take-up. For example, I was working with a 4,000 person company who wanted to migrate their intranet to Salesforce. They had 300 or so existing Salesforce users, so needed around 3,700 community licenses, which would lead to a bill of around $75,000 per month, for an intranet that people would use to find someone's phone number or figure out how to book holiday! Yes they could access up to 10 custom objects, but the vast majority had no interest in that. Without reasonably priced, login-based, entry level licenses, the employee community was always going to be priced out of the market. The employee community license was eventually withdrawn and users transitioned to a platform user license with a company communities for force.com permission set, which feels like what was actually being sold.

Slack

Against a dedicated solution like Slack, aimed at the entire company rather than specific groups of users, it was always going to be a difficult battle. Acquiring Slack gives Salesforce access to the entire enterprise, especially if they stick with the free tier. Yes you don't get the history, but important information should not be stored in chatlogs. If people have to search back through the history of chats they may not have been involved in to find something they need, you're doing it wrong.  

Where the chat history is important, as mentioned earlier, is when it is colocated with a record, and this is why I think chatter will live on after the acquisition - people won't switch to another tool to search for any messages related to the record they are currently viewing.

Slack may have lost $147 million last two quarters and may not have seen the growth that other tools have during the pandemic, but they also haven't had the unstoppable force of Salesforce Sales and Marketing pushing it. According to Marc Benioff, 90% of Slack customers are also Salesforce customersOnce the machine is tooled up to sell Slack, I'd expect the numbers to trend towards this in reverse - a massive existing customer base, existing access to the upper echelons of leadership, and a motivated (incentivised) Sales operation will, I believe, lead to a large amount of Salesforce customers becoming Slack customers.

Follow @bob_buzzard


Saturday, 28 November 2020

Salesforce and Slack - the End of the Beginning


The big news this week (last week of November 2020) is that Salesforce are in "advanced talks" about acquiring Slack. While I wasn't expecting this particular deal, I was expecting something of this nature, but I thought it would be in the realm of video rather than chat and they would try to buy Zoom.

I expected something because of the uptake that Microsoft Teams has seen since the pandemic started - from a disputed 20 million daily active users in November 2019,  to 75 million in May and then jumping to 115 million by November. The combination of file sharing, chat, collaboration, and video clearly has a lot of appeal, even though Microsoft referred to it as "digital translation of an open office space" which I'd imagine would put a lot of people off using it! Given that we'll be almost exclusively be using technology to communicate and collaborate for the foreseeable future, Salesforce had to be regarding the way Teams was embedding itself into the enterprise with envious eyes.

Slack hasn't seen the same explosion of usage and its share price has recently dropped, making it vulnerable to a takeover bid. From the Salesforce perspective, this is an opportunity to get across the entire enterprise rather than being constrained by the org - something the Chatter Free license attempted a number of years ago, but in my view foundered because it just wasn't a great collaboration tool when outside the context of Salesforce data. There was also the Company Community attempt to replace the intranet and more, but that was wildly expensive for a large organisation where most employees weren't Salesforce users.

While an acquisition will widen the Salesforce footprint, and no doubt bring deeper integration between the two tools, there will still be the need for Yet Another License for videoconference software. Meetings moves some of the experience inside Salesforce, but it's still someone else's application.

There's also Google Workspace to compete with - Meet and Chat have come on a lot in the last year, and complement docs, mail, calendar and co. very well. Again, it's one G-Suite license and all of those tools are bundled.

So in my view, buying Slack makes sense, but it's not the end - rather it needs to be part of a larger program to provide all the tools needed for enterprise collaboration in a single offering. That's what Microsoft and Google are doing and Salesforce is playing catch up. To paraphrase Winston Churchill, this needs to be the end of the beginning, not the beginning of the end.

Follow @bob_buzzard



Sunday, 1 November 2020

Giving the CLI Scanner the GUI Treatment

Introduction

As I've written about in recent posts, I'm using the Salesforce CLI Scanner to perform static code analysis on a number of my projects. As it's clearly part of my day to day use of the Salesforce CLI, I decided to add it to my CLI GUI.  

TL;DR, pull the latest code from the Github repository, or clone it and follow the instructions to carry out the initial setup. When it starts up you'll have the Scanner command group.

Commands

I added the scanner as a new command group, with a couple of commands - listing the rules and running the scanner.

Listing Rules

Listing the rules is fairly straightforward as I used existing parameter types to capture the categories and language, should the user wish to provide them:



and only needed to include a function to process the return JSON to extract the rule details and dump them to the log panel:


Running the Scanner


Running the scanner was a little more complex. First, I usually want to pick the categories but I don't want to have to remember the exact names, so I needed a mechanism to allow me to select from list of options. I've got a good start for this around allowing the user to choose which log file to retrieve from the Debugging command group. Under the hood I run the scanner:rule:list command, process the output to extract the unique category names, then build a select element using the categories as options. As I can choose multiple options I set the multiple attribute and give it a size of 7.  I don't always want to choose though, so I didn't want to have to wait every time for the command to run, so I gave myself a button to click:



I also typically want to open the file that the output is sent to, so I added this capability too:




Aside from this, most of my effort went into figuring out how to pass enquoted parameters to the scanner:run command (to define the targets, for example) on MacOS and Windows 10. I learned, for example, that Node's execFileSync will not spawn a shell to run the command thus any spaces I provide will be assumed to be different arguments to be passed to the command, regardless of any quotes that I might add in a futile attempt to influence it. execSync, on the other hand, will spawn a shell which will know that an enquoted string is a single parameter, allowing the command to succeed. I wouldn't be surprised if there is still the odd issue around this in there, so if you find one let me know by raising an issue at the Github repo.