SSW Foursquare

Orphaned Rules - 33 Rules

The rules listed below have no parent category
  1. Do you know how to do A/B testing for social media campaigns?

    A simple way to test and improve your social media advertising campaigns is by smartly testing different approaches, no matter where you're based or what you're selling.

    What's A/B Testing?

    It's like trying out 2 versions of your ad to see which one works better. We're talking about finding the sweet spot that clicks with your audience and gets them engaged.

    10 tips to amp up your ads

    1. Know your goals: Be crystal clear on what you want – clicks, conversions, or eyeballs on your content.
    2. Tweak one thing at a time: Test out individual elements like headlines, images, CTAs, colours or buttons. It's like finding the secret sauce, one ingredient at a time.
    3. Understand your audience: Group your audience based on what makes them tick. Knowing your audience's quirks helps you tailor your ads to hit the right notes.
    4. Get enough eyes on your test: Make sure your test reaches enough people to give you solid results. No shortcuts here – use statistical tools to know your numbers.
    5. Mix it up: Randomly show different versions of your ad. Keep a control group to see what works without any tweaks.
    6. Give it time: Let your tests run for a good period. Quick decisions might lead you astray – think long-term.
    7. Stay on your toes: Keep an eye on how your tests are doing. If things go wonky, be ready to hit pause or tweak things.
    8. Take good notes: Write down what you're testing, what you find, and why it matters. Your future self will thank you.
    9. Learn, rinse, repeat: Use what you learn to make your next ads even better. It's all about getting smarter with each test.
    10. Share the learnings with your team: Share what you find with your team. Collaboration is key – you never know who might have the golden nugget of insight.
  2. Do you avoid adding unnecessary CSS classes?

    When making or editing CSS or HTML content it is important to avoid adding classes and ID's unnecessarily.

    It can be tempting to add classes on elements, as it is often the most obvious solution to CSS problems... but doing so will lead to overly cluttered code and a host of overly specific solutions. When working on CSS it is almost always better to reuse rather than adding additional classes.

    You should use a front-end framework, like Bootstrap or Tailwind. The best front-end frameworks will include most of the clases you will need on a project. Basically you will only need new classes for very specific layout elements.


    <a class="view-all-link" href="">View All</a>


      margin-top: 0;

    Figure: Bad example - The "view-all-link" class was added unnecessarily


    <a class="mt-0" href="">View All</a>

    Figure: Good example - Using Bootstrap's class "mt-0" has the same affect without adding any class

  3. Pre event - Do you prepare a Brainstorming intro presentation?

    Before a Brainstorming event starts, the Brainstorming Presenter should give a presentation to the entire brainstorming group. They should share some highlights and lowlights from the employees, explain how the day will run, share the agenda.

    To prepare, draft an email to the boss with the following:

    Send it to the person who will do the presentation.

  4. Do you call SysAdmins before formatting company-owned laptops?

    It is important to make sure all standards are followed before formatting a laptop that is managed by your company.

    SysAdmins follow all kinds of procedures and standards to make sure all company-owned laptops and devices are configured correctly, with the right permissions, users and applications.

    Refer to the quickest way to get your Windows 10 SOE up and running to get the best way of setting up your computer with the right applications.

    If you, for any reason, has a company-owned laptop and needs to format it for various reasons (e.g. slowness, forgotten computer, new computer) it is important to give your SysAdmins a call first to ensure any pre-steps are followed, for example:

    1. Backing up the current data in the laptop
    2. Ensuring no client data is present
    3. Ensuring the new admin username set follows the password standards

    Failing to contact your SysAdmins might lead to computers that need to be reformatted down the line, meaning unnecessary rework!

  5. Do You create a combo-box that has a custom template?

    When designing your form, you should try to help your user whenever it's possible. So it's a good idea to create a combo-box that has a custom template.

    Figure: Good example – Combo-box with custom template

    Feel free to use our sample:

    1. Download and install Kendo UI Controls from Kendo UI
    2. HTML (Razor) - Create a combo-box that has a custom template. Use a code bellow as an example:
    @(Html.Kendo().ComboBoxFor(x => x.EmpTime.ProjectID)
    .DataSource(source => source.Read(read => read.Action("ProjectNameAjaxBind", "Ajax")
    .Data("function() { return {clientId : getClientId()}; }")
    <table class='comboBox-Projects'>
    <td class='projectName'>${data.DisplayText}</td>
    <td class='projectTotalCount'>${data.UsedCount}</td>
    <td class='projectLastUsed'>${data.LastUsedText}</td>
    .Events(e => e.Change("projectChanged").Open("onProjectOpened"))
    1. CSS - Customize the look & feel to suit your needs. Example:
    #projectsTableBorder {
     border-bottom: 1px solid rgb(217, 217, 217);
     margin: 0 -2px;
     .comboBox-Projects#projectsHeader {
     color: black;
     font-weight: bold;
     margin: 4px 16px 4px 4px;
     .comboBox-Projects td.projectName {
     width: 400px;
     text-align: left;
     .comboBox-Projects td.projectTotalCount {
     width: 70px;
     text-align: right;
     padding-right: 16px;
     .comboBox-Projects td.projectLastUsed { text-align: left; }
     #projectNameHeader:hover, #projectTotalCountHeader:hover, #projectLastUsedHeader:hover {
     cursor: pointer;
     text-decoration: underline;
    1. JavaScript - Use JavaScript to change the combo-box's behavior. Example:
    // resize the drop-down list
    function resizeComboBoxList(comboBoxListId, width) {
     var list = $(comboBoxListId);
     var height = list.height();
     list.children("ul").height(height - 25);
    function onProjectOpened() {
     resizeComboBoxList("#EmpTime_ProjectID-list", 600);
    // execute sorting when a header column is clicked
    function onClick_ColumnHeader(senderId, comboBoxId, fieldName) {
     var column = $(senderId);
     column.unbind('click'); {
     sortComboBoxBy(comboBoxId, fieldName);
    // sort any combo-box based on a field name
    function sortComboBoxBy(comboBoxId, fieldName) {
     var comboBox = $(comboBoxId).data("kendoComboBox");
     var sortDescriptors = comboBox.dataSource._sort;
     var direction = "asc";
     if (typeof(sortDescriptors) != "undefined") {
     var sortDescriptor = sortDescriptors[0];
     if (typeof(sortDescriptor) != "undefined") {
     if (sortDescriptor["field"] == fieldName) {
     if (sortDescriptor["dir"] == "asc") {
     direction = "desc";
     field: fieldName,
     dir: direction,
    // prepare 
    $(document).ready(function() {
     var projectsId = "#EmpTime_ProjectID";
     var projectsListId = projectsId + '-list';
     // prepend header to combo-box list. By default you only get <ul>
    Project Name</td>" +
     "<td id='projectTotalCountHeader' class='projectTotalCount'>Used</td>" +
     "<td id='projectLastUsedHeader' class='projectLastUsed'>Last Used</td>" +
     "</tr></table>" +
     // register click events for each column
     onClick_ColumnHeader('#projectNameHeader', projectsId, "DisplayText");
     onClick_ColumnHeader('#projectTotalCountHeader', projectsId, "UsedCount");
     onClick_ColumnHeader('#projectLastUsedHeader', projectsId, "LastUsedValue");
  6. Do you know how to make lost opportunities more visible?

    Losing opportunities is very common for a business. Keeping track of the win/lost ratio is a good start if you want to track how you're doing, but making sure you keep a close look on what you've lost more important why, is critical.

    The basics

    There are a number of reasons you may lose an opportunity: The project may be cancelled, you may be too expensive or out-sold, or maybe you simply don't have the capacity to cater for bookings.

    If you want to report on lost opportunities, the first step is to make sure Sales have the opportunity to do so. Make sure you provide a field with enough options when closing an opportunity:

    Figure: Only giving a couple options is not enough

    Figure: Give at least 4 options

    Once the information is stored in CRM, you can then easily report on it, e.g. using PowerBI or any other reporting tool. This provides great insights to make educated business decisions (i.e. "should we hire more?")

    Going the extra mile

    Reporting is great, but this may come back through your feedback loop a bit too late. If you want to be alerted when you just lost a big opportunity because you don't have enough staff, you can go the extra mile and setup alerting based on conditions.

    The best way to do so is to setup a LogicApp to trigger when an opportunity has been lost, setup your filters (e.g. Budget Amount >= $100,000 and Reason = "Not enough staff") and you're done!

  7. Do you disable connections for TFS 2010 migration?

    Once you are ready to start you need to make sure that no one can access the existing TFS 2008 server while you do the migration.

    1. You are ready to start
    2. Send out an email notifying all users that TFS2008 will be turned off. Follow Do you have a server reboot/restart policy?
    3. Make sure no-one can check in files by either: A. Running TFSQuiesce (recommended)

      B. Turning off TFS Service 1. Remote desktop into TFS 2008 2. Start IIS 3. Right click Team Foundation Server | Stop

    Figure: You need to stop anyone checking in files

    1. Confirm you can no longer get latest on the team project
  8. Do you disable connections for TFS 2015 migration?

    It is important that while you're upgrading, nobody can check in. Any check-ins after you backup your database will be lost.

    To make sure that nobody can change anything during the upgrade, follow these steps.

    a. Send out an email notifying everyone TFS will be unavailable for the upgrade period

    b. Make sure nobody can check in files:

    c. Open the TFS Administration Console on the server.

    d. Navigate to Application Tier / Team Project Collections.

    e. For each Team Project Collection, select it, and click "Stop Collection". Enter a useful message (this will be displayed to users trying to connect from Visual Studio) and click "Stop":

    stop each term
    Figure: Stop each Team Project Collection

    all team project
    Figure: All Team Project Collections are stopped

    f. In Visual Studio, confirm you can no longer connect to TFS

    visual studio
    Figure: Visual Studio shows the message that you entered when you stopped the Team Project Collection

  9. Do you get rid of legacy items in SharePoint Online?

    Most people have now moved to SharePoint Online, either from scratch or by migrating content from previous versions of SharePoint. In SharePoint Online, a lot of legacy features have been deprecated and replaced by more modern counterparts. Unfortunately, chances are you have ported a whole lot of useless things as part of your migration.

    [TODO: Screenshot of Useless stuff]

    Before removing seemingly useless or old stuff, you should always make sure that site owners are OK with the deletion and that the data is actually not useful. In most cases however, the libraries detailed below have been added to your site by default and contain only demo and/or defautl data.


    The process to remove legacy items is always the same regardless of the library/list you're trying to remove:

    1. Find the product or feature that replaces it in SharePoint Online
    2. Deactivate the site feature associated with the list or library:

    Either manually via:

    Site Settings | Site Features | Feature XYZ | Deactivate

    Or programmatically using:

    # Connect and get context
    Connect-PnPOnline -Url
    # Get Feature Object
    $Feature = Get-PnPFeature -Scope Web -Identity $FeatureId #Feature IDs below
    # Get the Feature status
    If($Feature.DefinitionId -ne $null)
        # De-activate the Feature
        Disable-PnPFeature -Scope Web -Identity $FeatureId -Force
        Write-host -f Yellow "Feature is not active!"
    1. If feature is already disabled or if SharePoint throws an error on deactivation (can happen for very old features), perform a forced delete of the library using powershell.
    # Connect and get context
    Connect-PnPOnline -Url
    $ctx = Get-PnPContext
    # Get list object
    $list = $ctx.Web.Lists.GetByTitle("Library_To_delete")
    # Force delete (send to recycle bin)
    $list.AllowDeletion = $True
    $list.Recycle() | Out-Null 


    Microfeed has been replaced in SharePoint by Yammer webparts and is no longer supported.

    Associated Site feature to disable: "Site Feed" GUID: 15a572c6-e545-4d32-897a-bab6f5846e18


    Annoucements are now replaced by the news webparts [TODO: Link to news webpart doc]

    Associated Site feature to disable: "Announcement Tiles" GUID: 00bfea71-d1ce-42de-9c63-a44004ce0104

    Workflow Tasks

    SharePoint Worklow are deprecated and replaced by Power Automate [TODO:link to rule to PowerAutomate]

    Associated Site feature to disable: "Workflow Task" GUID: 57311b7a-9afd-4ff0-866e-9393ad6647b1

    Drop-Off Library

    Drop-Off Library is not deprecated in SharePoint Online explicitely, however it is considered best practice to user Power Automate to achieve the same results with much greater flexibility and maintainability.

    Associated Site feature to disable: "Content Organizer" GUID: 7ad5272a-2694-4349-953e-ea5ef290e97c

  10. Do you know the difference between a 'smart' and a 'clever' developer?

    When we first start out as a developer, we want to show the world what we can do by creating complex solutions. As we gain experience, we learn to show our worth by creating simple solutions.

    Developers are like a fine wine, they get better with age.

    Lets take this piece of code as an example:

    <span className="text-xl">
            targetedDays === 0 ? "Today" : 
            targetedDays === -1 ? "Yesterday" : 
            targetedDays === 1 ? "Tomorrow" : 
            moment().add(targetedDays, 'days').format("dddd D MMMM YYYY")

    One liner! Nailed it 🥳 Pity the next developer who has to decipher what is going on! The cognitive load here is really high! and the the maintainability, is really low. What is the first thing you are going to need to do if this piece of code start behaving poorly?

    Now lets take the following reformatted code example:

    const getTargetedDayAsText = (targetedDays) => {
      if (targetedDays === -1) {
        return "Yesterday";
      } elseif (targetedDays === 0) {
        return "Today";
      } elseif (targetedDays === 1) {
        return "Tomorrow";
      } else {
        let days = moment().add(targetedDays, 'days');
        let formatted = days.format("dddd D MMMM YYYY");
        return formatted;
    <span className="text-xl">

    Now this is nowhere near as terse, but anyone looking at it is able to quickly determine what is going on. And anyone who has to investigate any issue with the code is going to be able to step through and debug this without any issues.

    This above is not an overly complicated example but now imagine something like this example

    var pixelsQuery =
        from y in Enumerable.Range(0, screenHeight)
        let recenterY = -(y - (screenHeight / 2.0)) / (2.0 * screenHeight)
        select from x in Enumerable.Range(0, screenWidth)
               let recenterX = (x - (screenWidth / 2.0)) / (2.0 * screenWidth)
               let point =
                                           Vector.Plus(Vector.Times(recenterX, scene.Camera.Right),
                                                       Vector.Times(recenterY, scene.Camera.Up))))
               let ray = new Ray() { Start = scene.Camera.Pos, Dir = point }
               let computeTraceRay = (Func<Func<TraceRayArgs, Color>, Func<TraceRayArgs, Color>>)
                (f => traceRayArgs =>
                 (from isect in
                      from thing in traceRayArgs.Scene.Things
                      select thing.Intersect(traceRayArgs.Ray)
                  where isect != null
                  orderby isect.Dist
                  let d = isect.Ray.Dir
                  let pos = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start)
                  let normal = isect.Thing.Normal(pos)
                  let reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal))
                  let naturalColors =
                      from light in traceRayArgs.Scene.Lights
                      let ldis = Vector.Minus(light.Pos, pos)
                      let livec = Vector.Norm(ldis)
                      let testRay = new Ray() { Start = pos, Dir = livec }
                      let testIsects = from inter in
                                           from thing in traceRayArgs.Scene.Things
                                           select thing.Intersect(testRay)
                                       where inter != null
                                       orderby inter.Dist
                                       select inter
                      let testIsect = testIsects.FirstOrDefault()
                      let neatIsect = testIsect == null ? 0 : testIsect.Dist
                      let isInShadow = !((neatIsect > Vector.Mag(ldis)) || (neatIsect == 0))
                      where !isInShadow
                      let illum = Vector.Dot(livec, normal)
                      let lcolor = illum > 0 ? Color.Times(illum, light.Color) : Color.Make(0, 0, 0)
                      let specular = Vector.Dot(livec, Vector.Norm(reflectDir))
                      let scolor = specular > 0
                                     ? Color.Times(Math.Pow(specular, isect.Thing.Surface.Roughness),
                                     : Color.Make(0, 0, 0)
                      select Color.Plus(Color.Times(isect.Thing.Surface.Diffuse(pos), lcolor),
                                        Color.Times(isect.Thing.Surface.Specular(pos), scolor))
                  let reflectPos = Vector.Plus(pos, Vector.Times(.001, reflectDir))
                  let reflectColor = traceRayArgs.Depth >= MaxDepth
                                      ? Color.Make(.5, .5, .5)
                                      : Color.Times(isect.Thing.Surface.Reflect(reflectPos),
                                                    f(new TraceRayArgs(new Ray()
                                                        Start = reflectPos,
                                                        Dir = reflectDir
                                                                       traceRayArgs.Depth + 1)))
                  select naturalColors.Aggregate(reflectColor,
                                                 (color, natColor) => Color.Plus(color, natColor))
               let traceRay = Y(computeTraceRay)
               select new { X = x, Y = y, Color = traceRay(new TraceRayArgs(ray, scene, 0)) };
    foreach (var row in pixelsQuery)
        foreach (var pixel in row)
            setPixel(pixel.X, pixel.Y, pixel.Color.ToDrawingColor());

    This was fortunately just someone's exercise in proving that they could and happily states

    Just because you can, doesn't mean you should!

    So what are some of the things that developers learn over time that takes them from being a Clever developer to being a Smart developer?

    Avoiding problems

    Clever developers fix a problem where Smart Developers stop a problem from happening.

    Lets say you receive a PBI saying that XYZ method is always returning a value 0.001 more than it should.

    Smart Developer

    Identifies that some incoming data is always out and results in the small rounding issue.

    return (value-0.001) 

    Clever Developer

    Identifies that a method downstream is rounding to 2 decimal places and removes this.

    Understanding the whole before they start

    Code costs money, not just to create but also to maintain.

    Figure: Clever developer coding away and resolving PBI's

  11. Do you know which check-in policies to enable?

    Check-in policies are a great tool to enforce quality code before it hits your source control repository. SSW recommends that the following check-in policies be enabled by default on your project:

    1. Changeset Comments Policy - To enforce that all check-in contain comments
    2. SSW Code Auditor - To enforce coding standards and best practices before check-in
    3. Testing Policy - To enforce that unit tests should all pass before code can be checked-in
    4. Code Analysis Policy – To enforce that code analysis rules are not broken
    5. Builds Policy – To enforce that the developer has built the project end to end before they check-in

    More Information

    To enable these policies:

    1. Right click the Team Project in Team Explorer > Team Project Settings > Source Control
    2. Select the check-in policies above
    3. Click OK

    Chose check in policy
    Figure: Chose check-in policies in TFS

  12. Do you look for call back over event handlers?

    [bad code]

    [good code]

  13. Do you look for memory leaks?

    a. These could be in the UI and middle level tiers

    b. There are common patterns for memory leak, e.g. proxy to WCF [code]

    e.g RIA service [code]

    e.g. Load +=     (9 out of 10 people will forget to remove their statement)

    Google: Common Memory Leak
    [bad code]

    [good code]

  14. Do you make business travel easier?

    In our fast-paced work environment, it is crucial to get to client sites or attend meetings efficiently. However, managing the associated expenses can often be a time-consuming and challenging task.

    When staff need to travel, they normally need to follow the company’s standards and keep physical or virtual records including approvals or tax invoices.

    It may take 10 minutes to finish the paperwork and could be worse if the tax invoices are lost.

    Is there an easier way?

    Traditional method – collecting physical tax invoices

    Some companies may ask employees to get a physical tax invoice and get it reimbursed through the finance team.


    • No additional system is required.


    • Hard to manage – approval may get lost, and tax invoices can be missing, or duplicated.
    • Out of pocket – it may take days to have the reimbursement processed and paid.
    • Heavy admin – managing paperwork is time-consuming and relies on human resources.

    Expense management system

    Software can be used to get expenses approved, paid and reimbursed.

    E.g, XeroMe - check this rule Best Mobile App for Expenses.


    • Less admin – expense claims can be processed easily in the cloud.
    • Efficient reimbursement – can be reimbursed anytime, anywhere.


    • Risk of not being paid - if the tax invoices are missed or forgotten.
    • No analysis tool – hard to have insights into the expenses

    Business travel 1
    ❌ Bad Example - Trying to find taxi receipts and how to get them reimbursed.

    Taxi corporate account

    Business users can set up a corporate account that manages travel expenses with a few clicks, or offer employees a digital pass with a prepaid budget. E.g, 13 Cabs for business.


    • Safe and secure – Taxis usually provide a level of safety and professionalism.
    • Cloud-based dashboard – Easy to manage multiple bookings at once and pay with a corporate account or passengers themselves.
    • Customised Pass – Digital or physical pass that has customisable travel rules.


    • Cannot be used overseas – the operating area of taxi companies are often limited.
    • Not flexible enough – May require admin to book the taxi for the passengers or the passengers are pre-approved to travel within the area.

    Uber for Business is a powerful tool that allows employees to use Uber services including ride or food delivery if they meet certain rules predefined by the business. This is done by adding a business profile to a new or existing Uber account, so the users have the option to pay with their business profile. It offers employees a simplified business travel experience because all the charges and invoices go to the business directly.


    • Centralized dashboards - real-time visibility, and control over all business rides. No more guesswork or manual tracking.
    • Global service – Travelling to New York or Tokyo? All are covered in one program.
    • Customization - Businesses can set pending limits, specify eligible ride types, define other parameters, and manage the access of employees at any time.
    • No misuse - Uber for Business forces the user to switch back to their personal profile if they go to a location that has not been pre-approved (see permitted locations in the figure below).
    • Ride and meal vouchers - Businesses are able to create customised vouchers that can be shared and applied at checkout.

    Business travel 2
    Example - Predefined rules that allow staff travelling to and from airports and within ACT.


    • Forced to go with Uber – People may have personal objections to Uber.
    • Safety and user experience – generally, shared ride service provides less professionalism and safety compared to taxi services.

    Business travel 3
    ✅ Good Example - Using Uber for Business by a simple toggle of a button.

  15. Do you read “Timeless way of building” ( has relevance to software)?

    This field should not be null (Remove me when you edit this field).

  16. Do you review the Builds?

    Quote: don’t use gated check-ins because…. thanks Peter Provost

  17. Do you use part of Sprint review to drill into the next most important number in this list?

    a. Use the retro to come up with better work practises

    b. Image of our “Scrum 8 steps” 

    Google: Tips for Retrospective

  18. Do you use the Web API (REST)?

    RIA services – RIP

    WCF – RIP(Now shipped in Asp.Net MVC4)

    SOAP - RIP

  19. Do you keep yourself connected when travelling overseas?

    Ensuring seamless connectivity during international travel is a crucial consideration, especially on business trips. While obtaining a roaming package from your service provider is a common solution, you might face exorbitant bills upon returning home.

    The question arises: How can one stay connected without the risk of huge bills?

    There are few options:

    If you travel overseas a lot, it may be worth considering owning a dual-SIM phone. This is highly recommended due to its cost-effectiveness, easy management, and enhanced security.

    Take the popular iPhone as an example, which offers an eSIM and a physical SIM slot. You can convert your primary mobile number to an eSIM and keep the physical SIM slot for your travel SIMs.

    • ✅Travel SIMs are usually data-only, cheap, and easy to acquire.
    • ✅Travel SIMs can be pre-purchased weeks before you go – it is only activated once you connect it to the network.
    • ✅Your mobile number is still active when overseas (with your eSIM) and the data usage stays with the travel SIMs.

    2. Portable 4G Router:

    Invest in a device, insert the local travel SIM, and share the Wi-Fi with multiple users and devices.

    • ✅This option proves cost-effective, preserves your phone's battery life and is perfect for single-SIM phones.
    • ❌You will need to carry an extra device.
    • ❌You may miss out on free Wi-Fi – the router is connected by Wi-Fi so you cannot connect to others, for example, hotels.

    3. Roaming package:

    Rely on your current roaming service, for example, Telstra charges $10 per day for 1 GB of data and $10 per extra GB. Some other carriers may offer more competitive packages.

    • ✅This method is straightforward, with no additional purchases, and a pay-as-you-go structure.
    • ❌This can be expensive and occasionally poor internet connectivity.


    Each option has its pros and cons, allowing you to tailor your connectivity strategy based on your preferences and specific travel needs.

    Travel SIMs usually offers better user experience if you spend more data.

    • ✅Travel SIMs are usually much cheaper than roaming packages.
    • ✅They are prepaid and disposable.
    • ✅ It can be a perfect combination with your roaming service to have enough cheap data to use and make calls from your roaming service. Of course, you will have your regular mobile connected as well, so you won’t miss the important calls and text messages.
    • ❌Often limited to data only and will expire after a certain period.

    keep yourself connected 1
    ❌ Bad Example - Exorbitant Telstra bills upon returning home due to roaming data usage of 120 GB.

    keep yourself connected 2
    ✅ Good Example - Paying $129 AUD for 200 GB of data on a travel SIM to Europe.

    Tip: travelling to China can be different due to the Great Firewall, which prevents you from accessing Google, Facebook, Teams etc. It may require a VPN to access these services from a local network. But the travel SIMs purchased outside of China or roaming mobile data packages have no restrictions because your IP is where the SIMs are registered.

  20. Do you look for native code that’s missing dispose?

    a. Suggestion to MS: make a tool 

  21. Do you know when to use an on-premises build server with Azure DevOps?

    If you are using Azure DevOps, there's an awesome Hosted Build Server option you can use to perform your builds with little to no setup. But if you're working on a project that has continuous integration and a long build time, it's not long before those build minutes start to add up.

    To reduce your build costs, you could reduce the number of builds or try to reduce the build time. Continuous integration is very important so you don't want to turn that off, and we encourage checking in early and often. Reducing the build time is a nice idea, but you can't always reduce it enough to make a difference.

    For large, expensive projects, the best option is to configure an on-premises build server rather than using hosted builds.

    To configure an on-premises build server for Azure DevOps, check out Anthony Borton's great walkthrough.

    Once you have a build server configured, you'll be able to see the build controller as an option when you configure a new build definition.

    vso build
    Figure: Good Example - We have the option of an on-premises build controller as well as the Hosted Build controller

  22. Do you know the relevant Power Platform certifications and associated exams?

    Whether you're an expert or just getting started, working towards gaining a new certification is a worthwhile investment.

    Microsoft provides numerous certifications and training options to help you:

    • Learn new skills
    • Fill technical knowledge gaps
    • Boost your productivity
    • Prove your competence

    certification map
    Figure: Microsoft Certification RoadMap


    If you're just getting started, take a look at:

    Microsoft Certified: Power Platform Fundamentals

    Earn this certification to prove you have a foundational knowledge of the Power Platform.

    You will need to pass Exam PL-900: Microsoft Power Platform Fundamentals.


    Once you've mastered the fundamentals, developers should move on to:

    Microsoft Certified: Data Analyst Associate

    Earn this certification to prove you have skills and knowledge in data processing and storage.

    You will need to pass Exam DA-100: Analyzing Data with Microsoft Power BI.

    Microsoft Certified: Power Platform Functional Consultant Associate

    Earn this certification to prove you can build solutions on the Power Platform using low code or no code solutions.

    You will need to pass Exam PL-200: Microsoft Power Platform Functional Consultant.

    Microsoft Certified: Power Platform Developer Associate

    Earn this certification to prove you can design, develop, secure and extend Microsoft Power Platform solutions.

    You will need to pass Exam PL-400: Microsoft Power Platform Developer.

    Microsoft Certified: Power Platform App Maker Associate

    Earn this certification to prove that as a business stakeholder you can engage well with Power Platform developers to design and specify business automations.

    You will need to pass Exam PL-100: Microsoft Power Platform App Maker.

    Microsoft Certified: Dynamics 365 Business Central Functional Consultant Associate

    Earn this certification to prove you have a solid knowledge of Dynamics 365 Business Central.

    You will need to pass Exam MB-800: Microsoft Dynamics 365 Business Central Functional Consultant.


    Microsoft Certified: Customer Data Platform Specialty

    Earn this certification to prove you understand using the Power Platform to manage customer retention, improve customer experiences.

    You will need to pass Exam MB-260: Microsoft Customer Data Platform Specialist.


    Microsoft Certified: Power Platform Solution Architect Expert

    Earn this certification to prove you have a foundational knowledge of the Power Platform.

    You will need to pass Exam PL-600: Microsoft Power Platform Solution Architect

    and complete one of

    Microsoft Certified: Power Platform Functional Consultant Associate


    Microsoft Certified: Power Platform Developer Associate.

    screen shot 2022 01 06 at 10 17 14 pm
    Figure: Get the poster to see Microsoft's certifications

    Check the Become Microsoft Certified poster for details of exams required for each of the certifications.

    Preparing for exams can involve a lot of work, and in some cases stress and anxiety. But remember, you're not in school anymore! You've chosen to take this exam, and no one is forcing you. So just sit back and enjoy the journey - you should feel excited by the new skills you will soon learn. If you want some great advice and tips, be sure to check out Successfully Passing Microsoft Exams by @JasonTaylorDev.

    Good luck!

  23. LinkedIn - Do you know how to reply to company messages on LinkedIn?

    Responding to messages from the general public and clients on social media is an integral part of maintaining a company's online presence and reputation. Platforms like LinkedIn, Meta (Facebook, Instagram, WhatsApp), X (formely Twitter) and others provide different avenues for these interactions.

    Focusing primarily on LinkedIn, this rule outlines how to effectively manage and respond to messages ensuring that the conversation aligns with the utility and purpose of the feature.

    LinkedIn Company Pages

    When messaging for your Page is enabled on LinkedIn, members can directly communicate with your company. This feature is a powerful tool for engaging with a professional audience, allowing for direct interaction and networking. And the best part? You can select conversation topics 😃

    The reply feature plays a pivotal role in managing LinkedIn communication and interactions if your businesses frequently receive inquiries from clients, potential employees, and partners.

    How to Enable Messages for LinkedIn

    To enable messages for your Page:

    1. Go to your Page super or content admin view.
    2. Click Inbox in the left menu.
    3. Click the three dots (more icon) to the right of Inbox.
    4. Select Inbox settings from the dropdown menu.
    5. Turn on the Message button toggle on the right and select relevant conversation topics.

      linkedin more
      Figure: Inbox settings screen.

    6. Click Save in the upper-right corner.

    Key Aspects of the Reply Feature

    Here are some keys reasons why you should consider implementing the LinkedIn reply feature.

    Pre-set Responses: Setting up pre-written responses to common inquiries relating to conversation topics such as requesting a demo, careers, service request and gneralt support.

    Common Questions: For frequently asked questions based on the above conversation topics, automated replies provide instant information, improving the user experience and reducing the inital workload on your team.

    Conversation Topics: On platforms like LinkedIn, automated replies can be aligned with selected conversation topics, ensuring relevance in responses.

    Time-Saving: It significantly reduces the time spent on repetitive queries, allowing your team to focus on more complex inquiries that require personalized attention.

    Customer Experience: Immediate responses to inquiries, even if automated, enhance the customer experience, as users receive prompt acknowledgments and information.

    Best Practices for LinkedIn Messaging

    • Assign the Right Admin Roles: Ensure that individuals with the 'super' or 'content admin' role are equipped to reply to messages. This is particularly important for specific conversation topics, like "Careers," where subject matter experts should manage interactions.
    • Prompt Responses: Aim to reply to messages as quickly as possible to maintain engagement and show that your company values the interaction.
    • Setting Up Conversation Topics: When enabling messaging, select conversation topics that reflect the subjects you want members to inquire about. This helps in guiding the conversation and ensuring relevance.
    • Edit Conversation Topics for Accuracy: Modify the topic of a message to accurately reflect its content. This aids in organizing and filtering conversations in your inbox.
    • Option to Disable Messaging: If necessary, you can disable the messaging feature from your inbox settings. This removes the "Message" button from your Page and stops new messages from members.

    Ensure that your LinkedIn Page messaging reflects your company's voice and expertise, and that it's managed by knowledgeable team members.

    Meta: Limited Engagement

    Meta's tools are particularly effective for businesses targeting a demographic that is highly engaged on social media, especially for consumer-focused interactions.

    However, for B2B communications or audiences less active on social platforms, the utility of Meta's messaging features is limited.

    X: An Alternative Approach

    X offers messaging features that might provide alternative advantages for certain business communications. It's crucial to evaluate how user demographics align with your company's goals and target audience.

    If your business caters to a more professional or niche market, X is a great tool for targeted B2B communications or reaching specific customer segments.

  24. Do you know when to use scoped CSS?

    On large frontend projects with lots of components it's common to have issues with your CSS classes overwriting each other or conflicting. There are a few different ways to solve this.

    It can be very frustrating when CSS classes overwrite and behave differently to how we want them to.

    overwritten style
    Figure: Overwritten CSS can make our site styles break

    Debugging this can be a nightmare on larger projects with huge amounts of styling as you need to comb through the entire file to find what's overwriting the style.

    h1 {
      color: red;
    /* 3000 more lines of code... */

    Utility Classes

    One solution to this problem is using a CSS framework such as Tailwind.


    • Faster setup
    • Simple to use
    • Faster development speed once devs are familiar with it


    • Poor readability as you add more classes
    • Learning curve for class names

    Scoped CSS

    Most frontend frameworks such as Blazor, Angular and React support scoped CSS, allowing you set CSS classes on a component level.

    When you create a scoped CSS file, those classes are only accessible to the component that the CSS file is associated with.

    This is useful as you don't need to worry about class names or CSS values conflicting with eachother like you would if all the classes are set at the root level. It also makes it much easier to change styling on individual components without breaking the styling on other classes.


    • Can reuse class names in each component without conflicts


    • Styles have to be manually written


    In Blazor scoped CSS files are associated with components with dot syntax.
    For example, if we have a component called MyComponent.razor, we can create a file called MyComponent.razor.css and the classes set in that file will only apply to MyComponent.


    Blazor supports having scoped CSS classes inherited by child components.

      <MyChildComponent />

    In MyComponent.razor.cs, if we use the ::deep psuedo selector on a class, it will be applied to MyChildComponent.

    ::deep .myClass {
      /* Styling goes here */

    Blazor CSS Isolation - Microsoft Docs


    When you create a component in Angular, a scoped CSS file is automatically created for it along with the HTML and TypeScript files.

    |- myComponent.component.html
    |- myComponent.component.css
    |- myComponent.component.spec.ts
    |- myComponent.component.ts

    Angular also offers the ::ng-deep pseudo selector, but there are some considerations when using this.

    Component Styles - Angular Docs


    We can achieve local, component-level styles in React by using importing from a file ending in module.css:

    /* component.module.css */
    .heading {
      font-weight: 700;
    import styles from "component.module.css";
    const Component = () => {
      return (
        <h1 style={styles.heading}>Bold Heading Here</h1>

    This will then render the element with a component specific class, differentiated from other .heading elements:

    <h1 class="Component_heading__nEBhk">Bold Heading Here</h1>
  25. Do you add branding to screenshots?

    It is great when people use screenshots. You can communicate better by using screenshots with balloons and other visual elements (arrows, shapes, and highlights) instead of only text. Read the benefits of using screenshots.

    We recommend you define a standard style for your visual elements by changing the default colors and shapes according to your branding.

    See some examples of different visual elements under same branding:

    Figure: Indicate someone to enter the mobile field. Do you use a red arrow?

    Figure: Or do you like the red box?

    Figure: Or do you like the yellow highlight?

    More Information on SSW Branding

    You can automatically have the SSW Snagit presets on sign-in via a script.

    Instructions to create and use Snagit themes can be found at Quick Style Themes Tutorial.

  26. Communication - Do you send "Done Videos"?

    The big communication points with clients are:

    • Daily Scrums (Product Owners often don’t join)
    • Sprint Review, Retro and Planning
    • Done Videos

    Most Scrum teams do the first 2 well but Done Videos are less common.

    A picture is worth a thousand words; and a video is worth a thousand pictures.

    Clients love Done Videos. Done Videos offer transparency, visibility, testing, and early releasing of a feature they might otherwise have to wait weeks or months to see released. The video lets them see the new feature and enables early feedback, which is beneficial to both the developer and the client.

    The best way to demonstrate that a new piece of functionality is working is to record yourself using it successfully. this works as both a demo, as well as a training aid if they need to reference it again later.

    The benefits of Done Videos are:

    • Product Owner - The PO (often the client) can watch as many times as they like
    • New Developer - Shows what the feature does
    • Developer - They can be referenced in code for others in the future
    • UX designer (and tester) - Easy to can give feedback
    • User - can be included as documentation

    Figure: Video call with the client

    How to do a Done Video

    Do you know how to record a quick and dirty 'Done Video'?

  27. Do you know where to add style files for deployment?

    When a designer (or a developer) adds style (CSS) files to SharePoint - care must be taken regarding where the files are placed:

    • Some places are are not suitable because they are not good for deployment
    • Other places may have permission issues - designers can't access them
    • Some files are part of the site definition and should not be customized

    So the rules are:

    1. Never modify out of the box SharePoint files in /Style Library/ - those files are part of the site definition, if you customize them they are hard to deploy
    2. Start with a clean, minimal masterpage
    3. Create and reference your own CSS files and put them under /Style Library/CSS/<client>/
    4. You may want to further divide your CSS paths according to the areas of the site that your CSS is designed for:

      E.g. /Style Library/CSS/SSW/Clients/layout.css

    5. Designers can modify the XSL file as well!

      put them under /Style Library/XSL Style Sheets/<client>/

  28. GitHub - Do you use GitHub teams for collaborator permissions?

    You can use teams within a repository to manage a whole group's permissions instead of setting permissions for each new member of the organisation.

    See Organizing members into teams.

    Figure: Good example - Using a good teams structure to organize access

    Correctly configuring your organisation's teams structure will make it easy to give members the permissions level that they need. You can add teams to repositories to manage their roles.

    Figure: Good example - Using teams to assign roles in a repository

    Another benefit of using teams is that you can mention a whole team in a discussion instead of individual members. See Mentioning people and teams

    Use teams as maintainers over individuals

    When you add a team to a repository, you can give the team a role that determines their access level to the repository. You can also add teams to issues and pull requests to manage their access to those resources. Often individuals are added to repositories as administrators, but this is not a good idea as it gives them destructive access to the repository. Instead, add a team to the repository and give the team the maintainer role.

    individuals added as admins
    Figure: Bad example - Individuals should not have Admin access to a repository

    teams added as maintainers
    Figure: Good example - Teams should have Maintainer access to a repository

  29. Do you use mobile DevOps?


  30. Do you use source control for your Power Apps?

    Source control is essential for any software development project, and Microsoft Power Apps solutions are no exception. Here are some reasons why you would want to use source control like GitHub or Azure DevOps for your Power Apps projects:

    • Versioning - Keep track of changes made to your Power Apps solutions over time.
    • Collaboration - Enable multiple developers to work on the same Power Apps project simultaneously.
    • Audit Trail - Maintain a history of who made what changes and when.
    • Rollback - Easily revert to a previous version if something goes wrong.
    • Branching and Merging - Work on new features or bug fixes in isolation before integrating them into the main project.
    • Automated Deployment - Integrate with CI/CD pipelines for automated testing and deployment.

    How to Implement Source Control

    Exporting Power Apps Solution

    1. Open Power Platform CLI: Open a terminal and navigate to your project directory.
    2. Export Solution: Use the Power Platform CLI to export your Power Apps solution. This will create a .zip file or a directory structure that represents your solution.

      pac solution export --path ./YourSolutionName --name YourSolutionName

    Using GitHub

    1. Initialize a Git Repository: Navigate to your project directory and run git init.

      git init
    2. Add Remote Repository: Add GitHub as the remote repository.

      git remote add origin <Your-GitHub-Repository-URL>
    3. Commit and Push: Add your Power Apps exported solution files to the Git repository, commit them, and push to GitHub.

      git add .
      git commit -m "Initial commit"
      git push -u origin master

    Using Azure DevOps

    1. Create a New Repository: In Azure DevOps, create a new Git repository under your project.
    2. Clone the Repository: Clone the repository to your local machine.

      git clone <Your-Azure-DevOps-Repository-URL>
    3. Commit and Push: Add your Power Apps exported solution files to the Git repository, commit them, and push to Azure DevOps.

      git add .
      git commit -m "Initial commit"
      git push -u origin master

    Importing Power Apps Solution

    1. Open Power Platform CLI: Open a terminal and navigate to the directory where your exported solution is stored.
    2. Import Solution: Use the Power Platform CLI to import the solution into another environment.

      pac solution import --path ./YourSolutionName --name YourSolutionName

    By following these steps, you can implement source control for your Power Apps solutions using either GitHub or Azure DevOps. This will help you manage your project more effectively, collaborate with others, and maintain a history of your changes.

  31. Do you use "var"?

    TODO: Byrden - needs a new home (category) and a complete rewrite
    Old content from Better LINQ on .ASPX pasted below


    Despite what it looks like, the var keyword is not a throwback to the dark ages where we did not have strongly typed variables. It is just a short hand to save developers from typing out the type of a variable.

    IQueryable<Customers> results =
        from c in dbContext.Customers
        where c.CompanyName.StartsWith(companyNameTextbox.Text)
        select c;
    customersBindingSource.DataSource = results;

    Figure: Bad example - You should just use "var" instead of "IQueryable"

    var results =
        from c in dbContext.Customers
        where c.CompanyName.StartsWith(companyNameTextbox.Text)
        select c;
    customersBindingSource.DataSource = results;

    Figure: Good example - Using "var" to save few keystrokes

  32. Do you know what a container is?

    The main benefits about containers is that it can reduce your running and maintanence costs; and hear no more it worked on my machine...

    A container is like a little virtual machine that does not have a operating system installed. They already contains all the libraries that your web application needs.

    Video: What you need to know about Containers (in under 3 minutes!)

    Related keywords: Docker, AKS, Kubernetes, Container Orchestration.

  33. Do you use Word Documents instead of Wiki Pages in SharePoint?

    In the past, Wiki pages were a great way to store content in SharePoint. These days, with advancements in browser and smartphone capabilities, Word Documents are a better place to store content.

    Many articles, like this one from 2017, talk about the benefits of using Wiki Pages over Word Documents - however, these benefits are no longer relevant.

    word 2013 online presentation
    Figure: We've come a long way since Word 2013 Online Presentation

    Let's have a quick look at some of the points that the article above used:

    Accuracy - It's easy to see the Modified date of documents in SharePoint, so you can tell if the Document is the most current one (of course, it should be the only one).

    Load Time - In the past, this was an issue. These days, browsers have no problem loading Word Documents.

    Mobile - Mobile browsers also do a pretty good job of opening Word Documents, and there are the Office and OneDrive apps to make it even easier.

    Note: If you want to create an actual Wiki within SharePoint, Modern Pages may be the way to go - but for general content, Word Documents are best.

    Advantages of Word Documents

    1. One main advantage of Word Documents is the editing capabilities – most people are familiar with the rich document editing features of Word. Documents can be created in the desktop app as it has the most editing capabilities, and can be easily edited in the web version - which is still very good! The SharePoint wiki page editor has fewer features, and can be harder to use.

    sharepoint editor
    Limited SharePoint formatting

    microsoft ribbon
    Microsoft Word's well-known, feature rich formatting options

    1. Versioning is one of SharePoint's strongest features - and it works really well with Word Documents.
    2. Many people are using Microsoft Teams, and storing files in there - sometimes not using SharePoint at all. While Teams still uses SharePoint in the backend, it is much easier to browse through Documents than link and view Wiki Pages.

    teams browsing files
    Figure: Browsing files in Teams

    1. OneDrive allows you to sync files from SharePoint libraries to your computer. This is very useful if you need offline access, or if users prefer to work from files within File Explorer in Windows, or Finder on macOS. This works really well with Word Documents, but is not possible with wiki pages.
We open source. Powered by GitHub