Mark Everard

Hello, I'm Mark – a PhD physicist turned technologist / architect.

The real cost of owning a development team

without comments

This post was first published on LinkedIn Pulse on 18th September 2015 –The real cost of owning a development team


 

Development teams are expensive. There, I said it. If you want a high-performing development team then be prepared to invest.

I’m not just talking about salaries. You’ll also need to equip your team with high-quality hardware and the expensive software tools they need to deliver the solutions you want.

This isn’t news to many organisations. It’s actually not hard to get those bits right, and there are great benefits from having those skills on-tap in-house.

Just putting a bunch of developers in a room, shouting "Go!" and occasionally rewarding with pizza will rarely get you the high-quality solutions you desire.

 

It’s about the people

What many places struggle to get right is the investment needed in the core of a development team. The people.

Development teams require leadership, mentoring, structured career paths and personal development plans. Just putting a bunch of developers in a room, shouting “Go!” and occasionally rewarding with pizza will rarely get you the high-quality solutions you desire.

Other creative disciplines beyond development perhaps have this slightly easier, as it’s seen as ‘obvious’ that those teams need the room to think and learn.

Take for example a creative design team. They have to work to understand and consume the latest design trends, so they can stay current and produce great work. In my experience this learning need is rarely questioned, perhaps because the design output from those teams is more tangible than the abstract “code” output from a development team. Regardless, the underlying learning need for each team is identical and should be addressed.

Time and direction

The real key to growing your development team is time. This investment allows the team to step back from their primary output and dive into the new technologies and ways of working that could speed up delivery or increase the quality of the technology output. Both valuable outcomes.

Time alone though isn’t enough. You also need leadership and structure. That could be achieved by having a team with a broad mixture of experience, or via a more dedicated architect / lead role helping to bridge the gap between requirements and solutions, helping drive a coherent technology vision.

Again, to those of you working in the industry the above may not seem like rocket science; and really it shouldn’t be. However there are still too many places where there is a attitude of throwing more developers at a problem to get to a solution.

It doesn’t have to be expensive

There are many ideas and ways to give your technology teams the opportunity to learn and improve. Many of them are not as expensive as you might imagine.

  1. On the job training – code / peer reviews are an ideal opportunity to not only increase the quality of the solution but also to share knowledge and build team resilience.
  2. Coding katas – give the team the ability to constantly hone and sharpen their skills by setting aside time for them to regularly practise small development tasks. There are great examples online.
  3. Open source – encourage the team to contribute to an open source project. Here they will learn how to apply their skills in a different environment and learn from fellow contributors. This is even more valuable if your organisation uses open source software. What great karma; to be giving as well as receiving.
  4. Meetups – there are a growing number of outside events encouraging like-minded people to meet up and discuss common skills, techniques and frameworks. Why not encourage your team to participate? Better yet, get them to disseminate what they’ve learnt internally to the rest of the team.
  5. Certification and training – if you have some training budget then paid-for courses not only demonstrate the organisation’s commitment to growing individual skills but are beneficial to your delivery too. Online training courses are relatively cheap and offer a wide variety of subjects.

There’s value to getting it right

Development teams have a very specialised need for learning and growth. Owning a team comes with a heavy responsibility to get this right.

After all, I’m guessing mediocre isn’t your ambition and you want your development team to produce high-quality bug free software? In which case, isn’t it only reasonable to support them and make sure they have everything they need to succeed?

Written by mark

October 7th, 2015 at 10:00 am

Confimed talks for the London Developer Meetup

without comments

One week to go until our next Meetup on 3rd June at the Shooting Star near Liverpool Street.

Have you RSVP’d?

Confirmed talks

“Nested queries with EPiServer Find” – Danie De Kock.

A look into some of the more complex queries and scenarios that can be performed using Find.

“JavaScript Concepts for the EPiServer Developer” – Ben McKernan.

Learn about some of the key JavaScript concepts that developers should know when extending the EPiServer UI

The UnPanel – a panel of opinionated experts will discuss a range of hot EPiServer development topics, set by the audience and seeded by myself!

Hope to see you there

Written by mark

May 27th, 2015 at 3:06 pm

Posted in Community,EPiServer

London EPiServer Developer Meetup Summer 2015

without comments

I can’t believe it’s been almost a year since our last get-together!

Again the EPiServer landscape has changed a great deal since our last Meetup, with approximately 26 continuous releases delivered across both CMS, Commerce and Find (and of course the merger with Ektron)

We’re still finalising talks so stay tuned. If you have something you wish to talk aboutor contribute, please do get in touch.

RSVP

You can sign-up to attend via our Meetup group

Sponsor

Thanks to our sponsor OPUS recruitment who have organised the space, and also the food and drinks.

opus

 

 

 

Written by mark

April 28th, 2015 at 9:08 am

Posted in Community,EPiServer

Helping EPiServer editors Find unused content

with 2 comments

It might sound obvious, but content management is about more than just content creation and editing. It is also knowing when your content has reached the end of its useful lifespan. It means knowing when it’s time to ‘Move to Trash’, and when it’s time to ‘Move to Trash’ permanently!

I’ve seen as many content management systems ultimately fail due to poor on-going content control by editorial teams as I have through poor initial implementations by developers. There are many reasons that your content can grow out of control. When it does, your CMS becomes nothing more than a publishing platform and a quite inefficient one.

“I’m sure I’ve written an item like that before…”
“Yeah, it’s in here somewhere, I just can’t find it…”
“I don’t think that content is used but I’m not sure, so I didn’t archive or delete it, just in case…”

Tidying up after yourself whatever your discpline, is just good practise. Whether its content, a codebase or your email inbox. Being scared to delete is a sign that you aren’t in control.

One of the editors I work with on an EPiServer site wasn’t scared to delete content, but he was overawed by the effort needed to discover unneeded content.

This got me thinking. There must be a better and easier way than trawling through a hierarchical tree…

Content reporting using a slice

EPiServer recently reintroduced PowerSlice as a ‘supported’ add-on. PowerSlice uses EPiServer Find to give editors a view of content which goes beyond the traditional hierarchical structure. It allows developers to very easily ‘slice up’ content in any number of ways.

Whilst thinking about the best way to implement a feature for editors to report on unused content, it dawned on me that creating a slice for ‘unused content’ would be incredibly easy :)

  • PowerSlice already has a well-thought out user interface
  • PowerSlice allows editors to very quickly jump to managing content using the standard EPiServer interface / good for if you want to find and then delete content

I’ve put together two slices, to help editors find unreferenced blocks and media, using standard methods from the EPiServer IContentRepository interface.

Unused Blocks Slice

Unused Media Slice

These slices and PowerSlice were such a good solution that I’d argue that PowerSlice should be bundled out of the box with a Find install. It could perhaps form the basis of a new and more flexible content reporting function? Reporting is something that is in need of a little love in EPiServer 7/8.

Thoughts?

Written by mark

March 16th, 2015 at 10:00 am

Posted in C#,EPiServer

Content Icons for EPiServer

without comments

One of the nice features that came along with the new CMS editing interface from EPiServer 7 is the ability to define icons for Pages and Blocks. These icons are used within the new editing interface and give editors a more visual way of deciding which is the right content element to use and create in their site.

Alloy examples

The Alloy Templates starter pack contains a selection of purpose designed images, and demonstrates how useful this can be.

Page icons in EPiServer 7 Alloy templates starter pack

The reality

The horrible reality that I’ve found is that often designing these icons becomes a low priority task for designers and that the below is an example end result! Which lets be honest, doesn’t really help editors too much.

reality-icons

A solution

As part of the project we’re working on at the minute at Marie Curie, we’ve designed a suite of 55 icons for our own implementation. However, being the nice kind-hearted souls that we are (it comes from working in a charity), we’re sharing our work in the hope that fellow CMS implementors will them useful.

CMS-icon-index

The icons can be downloaded here, or are available on a GitHub repository in case you want to contribute some additional icons to the set!

If you use them, why not return some kindness by donating some money to our cause.

* The icons are a derivative of an icon set by Michael Reimer from http://www.bestpsdfreebies.com. If you’re in need of any other icons, you should check out his site.

Written by mark

November 17th, 2014 at 10:00 am

Posted in Community,EPiServer

Find(ing) missing dependencies when installing New EPiServer Find

without comments

Recently we installed the New EPiServer Find so our editors could benefit from the sleek new interface from which they could view and optimise our user’s search journeys.

Installation on our DEV machines was simple and performed through Nuget. However, after deployment we noticed that our upstream environments were broken (obviously we didn’t deploy as far as production!)

The environments were throwing the following exception on Initialisation.

The system cannot find the file specified.
at EPiServer.Find.UI.FindInitializationModule.Initialize(InitializationEngine context)

The cause

The EPiServer Find.UI is dependent on the following libraries

  • Newtonsoft.Json.dll
  • System.Net.Http.dll
  • System.Net.Http.Formatting.dll
  • System.Net.Http.WebRequest.dll
  • System.Web.Http.dll
  • System.Web.Http.WebHost.dll

These libraries are a part of MVC4 / WebAPI. I’m guessing that the Find UI uses WebAPI for delivering some of its goodness.

A solution is detailed here, but in summary you have two choices:

  1. The wrong way– Install MVC4 on your build server / target environments. The MVC4 installer will add these libraries to the GAC, so your application will be able to resolve them.
  2. The right wayInclude these dependencies as part of your application using Nuget. Install the Microsoft.AspNet.WebApi.WebHost package.

The right way means that your application is portable and is not dependent on system components being deployed on each server environment. Additionally the EPiServer.Find.Nuget package should explicitly list Microsoft.AspNet.WebApi.WebHost as a dependency. Put it on the backlog please Find team :)

Happy Finding!

Written by mark

June 26th, 2014 at 9:54 am

Posted in ASP.NET,EPiServer

PageStructureBuilder for EPiServer 7.5

without comments

If there was an award for the best EPiServer extension produced by a member of the World community; that didn’t gain the recognition it deserved. Of course, my own Personalisation Engine would win hands down 😉

Coming in a very close second would be one of Joel Abrahamsson’s masterpieces. This one lesser known than PageTypeBuilder, Truffler or PowerSlice, but one that solves a common CMS challenge equally as elegantly.

PageStructureBuilder was a solution Joel put together to automatically organise EPiServer pages, meaning you could define areas of your site that would ensure its content was arranged into a predefined structure. The obviously use-case here being ‘news’ type pages that would be stored in a date hierarchy (Year > Month > Day > News Article).

The solution was originally built against CMS6 and PageTypeBuilder, so I’ve forked Joel’s original solution and upgraded it to work against EPiServer 7.5 and the native strongly typed page implementation.

Available on EPiServer Nuget now.

 

Written by mark

June 10th, 2014 at 10:00 am

Posted in Community,EPiServer

Configurable Content Feeds for EPiServer 7.5

with 2 comments

AKA – another (and better!) RSS/ATOM feed for EPiServer. Developing an RSS feed for an EPiServer CMS system is actually quite a simple task and there is already a good amount of information and community options that you can download and use.

However, the particular problem I was presented with required something a little more than what was already out there, so I took the opportunity to build a fuller solution based on CMS 7.5. This may be the last RSS feed module for EPiServer that you’ll ever need!

This effort started out with a requirement to integrate content from EPiServer CMS to an IBM WebSphere Commerce system (WCS). WCS contains out-of-the-box functionality to consume external content from a publishing feed presented in an ATOM format so this seemed like a suitable integration method.

The design of the pages and content area to be shared required that we shared only specifc HTML snippets from the CMS to the WCS system. This fitted in perfectly with the new Content Blocks in EPiServer 7; meaning we needed a content feed that could share not only pages but also content blocks. This additionally  meant that content blocks needed to be routed so the individual output could be consumed by the external WCS solution.

Also the new Media system in EPiServer 7.5 allows the content feeds to handle and output media items in a simpler way. Its all IContent man!

Editor functionality

  • Editors can create multiple feeds (a feed is a Page Type)
  • Feeds contain a date ordered (most recently published first) list of content items
  • Editors can specify whether a feed is delivered in RSS or ATOM format
  • Editors can specify how many items appear in the feed.
  • Editors have granular control over what content items are shared. They can include any of the following in a single feed.
    1. Descendents of a specified page in the page tree
    2. Child blocks contained within a specified content folder
    3. Child media items within a specified media folder
    4. Any number of individually selected pages, blocks or media items, via a ContentArea property
  • Blocks included in a feed are externally routed so their HTML output can be consumed by external systems.
  • Feed pages have a partial renderer meaning they can be dragged into Content Areas to display an RSS feed logo and link.

 

event-feed

Extending and modifying

There isn’t much to do as a developer beyond installing the package. Note. I’ve only tested this against an MVC Alloy solution. It should play nicely with WebForms but I’ve not tested!

  • You may want to change the partial renderer view for a Feed Page. This can be found in /modules/Chief2moro.SyndicationFeeds/Views/Partial.cshtml

event-feed-partial

  • You can override the description that is shown along with each item in the feed by providing a method for the SetItemDescription delegate. By default this is of the form ‘An src link to content with id = {content.ContentLink.ID} and name = {content.Name}’

Other integration considerations

There is one item not included in the solution which you may need to consider . Whilst the feed presents absolute urls from the feed to pages, blocks and media.  Any content within a page or block that contains editor set hyperlinks, such as an XHtml property will most likely contain relative urls. If these are consumed and presented on an external website you’ll get a serious case of the 404’s.

You can get around this by rewriting any outbound urls in the content to be absolute. The solution I used was to set up a rule in my favourite tool IIS UrlRewrite. This intecepted all outbound html from a particular path and rewrites all links to be absolute. This isn’t the most flexible solution as it relies on outbound scanning on specific paths. It may be better to add something into this solution, but this isn’t something I’ve looked at yet.

It’s on Nuget

The source code is available at https://github.com/markeverard/Chief2moro.SyndicationFeeds – I’m happy to accept Pull requests

A package (currently v1.0.0.1)  is (soon to be – when its approved) available in the EPiServer Nuget Feed – http://nuget.episerver.com/ – search for CHIEF2MORO.SyndicationFeeds

Happy Feeding!

Written by mark

May 30th, 2014 at 1:30 pm

Posted in ASP.NET,C#,EPiServer

London EPiServer Developer Meetup Summer 2014

without comments

Many of you have been asking when the next London EPiServer Developer Meetup would be…… If you keep reading then you’ll find out (spoiler – its Tuesday 10th June)

It’s been a year since we last met and there is much to catch up on. As we were all getting to grips with version 7, EPiServer released 7.5, including a new way to handle media files. There has been further large feature enhancements and consolidation and integration of the Commerce product, and a move to near continuous delivery; with new features for all products being delivered direct to our doorsteps (aka Nuget feeds) every few weeks.

To help us find out all of the latest news, EPiServer have sent some of their top techys across from Sweden to tell us all about it – (thanks to all who made this possible).

We’ve got a very full programme of talks, networking and refreshements so we’re planning on starting a little earlier at 6pm at our friends Nansen.

1. Chris Sharp, Nansen – Commerce 7.5 Markets
Configuration, customization, development, usages, and purposes of the Commerce 7.5 market system.​

2. Magnus Stråle, EPiServer
Commerce & MVC – some simple patterns. Also, Frequent EPiServer releases – how & why.

3. Shahram Shahinzadeh – Visual Studio integration and Azure
Intro to the new Visual Studio integration based on NuGet and installing EPiServer CMS sites with one click. Also, highlighting which EPiServer modules changed because of Cloud considerations (DB, Event provider, blob provider, cloud license, etc.).

Those details for your diaries.

  • Tues 10th June 2014, 18.00– 20.30ish
  • Nansen – 109-111 Farringdon Road, London – (directions)

Looking forward to seeing you there. Please RSVP on our Meetup page

http://www.meetup.com/EPiServer-London/events/183813602/

Written by mark

May 19th, 2014 at 8:38 am

Posted in Community,EPiServer

Image resizing in EPiServer 7.5 CMS

with 13 comments

Dynamic image scaling is an often sought after feature for interface designers and content editors. Whilst not natively supporting this feature; EPiServer 7.5 CMS contains a neat hidden feature (Thanks @athraen for the heads up) that allows a limited but useful ability to automatically scale your images.

True dynamic scaling, and by that I mean that your http request for an image also contains your requested height, width and cropping options, is a complex operation to perform successfully, just check out the interesting blog posts at http://imageresizing.net/. Note there is a community integration of ImageResizer.Net with EPiServer 7.5.

The new media editing interface allows in-line preview of uploaded images via a scaled thumbnail representation of the image. These are created automatically by EPiServer for any ImageData content types that are created.  This is achieved via a ImageDescriptor attribute which can be placed on any ‘routed’ blob property (i.e those on ImageData content types).

Thumbnails in the media edit interface

The ImageDescriptor is pretty cool, but not so helpful when you start working with real images with differing aspect ratios.

A simple use case could be that for every uploaded image you want to create a version that has a maximum width of 300 px, which could be used in a site sidebar. The ImageDescriptor as-is forces you to define a height and width at compile time meaning that all uploaded images will be resized to the same width and height specified in the attribute. Any additional height or width will be filled with white-space.

The CHIEF2MORO.ImageDataExtensions nuget package I blogged about previously also contains a couple of additional attributes to help overcome this limitation. Extend your ImageData content object (ImageFile in Alloy) with a few Blob properties for the different sizes and mark up with the attributes. The blob routing feature in EPiServer means that these scaled images are available publically (<imagename>.jpg/image250 and <imagename>.jpg/half). Behind the scenes both of these descriptors use the underlying ThumbnailManager class contained in the EPiServer API.


   [ScaffoldColumn(false)]
   [ImageWidthDescriptor(Width = 250)]
   public virtual Blob image250 { get; set; }

   [ScaffoldColumn(false)]
   [ImageScaleDescriptor(Percent = 50)]
   public virtual Blob half { get; set; }

The ImageWidthDescriptor only requires you to specify the scaled width and will calculate the height at content publish time from the originally uploaded image dimensions to ensure that the aspect ratio is maintained (so you get no padding / whitespace)

The ImageScaleDescriptor allows you to specify a scale and will calculate the desired height and width from the original image.

Written by mark

February 13th, 2014 at 10:00 am

Posted in ASP.NET,C#,EPiServer