Author: admin

  • How I saved a client millions with a one liner

    How I saved a client millions with a one liner

    A client requested business consulting and solutions architecture services from me. We decided to have our first meeting in a casual setting – a coffeeshop in Pretoria. It was situated close to his target market, so that we could immerse ourselves in the environment.

    We started off by chatting about the pain points he is trying to solve – statistics, analysis and buy-in from a big organisation that he would be targeting. The project was funded by the founders, and therefore bootstrapped.

    Development was already on the way.

    The dev team was doing an exceptional job. The latest cloud technology was used with great front end libraries to build out features. The minimum viable product was coming together.

    The client was well connected with a big organisation. This would be their gateway to reaching their target market.

    But something was missing.

    What’s missing from your MVP?

    This simple question drained all the colour from my client’s face. They have been working hard for more than six months, and have never had this in front of the end consumer – the person that would actually use the app.

    This is more common than you might think.

    The single question – another case

    A few years ago, I was working at a large investment firm. We were developing a complex new retirement product that was described as ‘revolutionary’ and ‘innovative’. The issue was that the team worked for more than six months to push out this new product.

    I often wonder how much of their existing retirement business was cannibalised by this new product – and how this would be measured in such a big company.

    I’m not against extending your product range or horizontal integration. But it should be done with due diligence and small, measureable steps. Especially if your startup doesn’t have large capital to spend.

    What did I do for the client?

    Getting the product in front of an end user was critical. And maybe we didn’t even need code for it right now. I opted to design the user interfaces on Figma, and link the pages with buttons so my client could show this to end consumers.

    What do we learn from this?

    Feedback received from users will shape the business.

    It’s such a simple thing. Such a simple question. But when we’re heavily invested in our own business, we forget to ask the obvious questions.

    How can I help you?

    Yes I can code. But also I ask critical questions to save my clients money and empower them to make better business decisions and refine their offerings.

    If you’re looking for a turn key software developer, feel free to schedule a free first consultation.

  • Case Study: Pair Tree

    Case Study: Pair Tree

    The Good Coder helped PairTree transform the recruitment process with a groundbreaking matching platform.

    The Vision Behind PairTree

    PairTree aimed to disrupt the recruitment industry by creating an automated platform that matches employee skills with employer requirements—saving time, reducing manual effort, and ensuring no valuable candidates are overlooked.

    The Challenge: Overcoming Technical and Business Hurdles

    Manual CV processing was the industry standard, but PairTree needed a web-based system that was aesthetically pleasing, user-friendly, and powerful enough to make accurate matches in record time.

    The Solution: The Good Coder’s Strategic Approach

    Phase 1: Diagnostics and Blueprinting

    The Good Coder conducted a comprehensive diagnostics phase, identifying risks, clarifying integration requirements, and defining an architectural roadmap for PairTree’s long-term success.

    Phase 2: UI/UX Design and Collaboration

    Working with Stratusolve, The Good Coder helped create PairTree’s brand identity. Using Adobe XD, high-fidelity mockups and detailed user flows were designed and tested to ensure an intuitive user experience.

    Phase 3: The Coding Phase

    The development team focused on building a robust matching algorithm and user-friendly interface. By breaking the project into manageable components, The Good Coder ensured smooth progress and rapid delivery.

    Phase 4: Project Management, Maintenance, and Enhancement

    The Good Coder managed timelines, coordinated communication, and provided continuous support after launch. Monthly feature updates ensured the platform remained innovative and adaptive to PairTree’s evolving needs.

    Results: Saving Time and Automating Recruitment

    With automated matching, dashboards, and real-time reports, PairTree now streamlines recruitment processes while planning future innovations with data-driven insights.

    Conclusion: Leading the Way in Recruitment Innovation

    PairTree exemplifies the power of automation to transform industries. With The Good Coder’s expertise, the platform is a game-changer in recruitment, delivering value to both employers and candidates.

    Ready to bring your ideas to life? Let The Good Coder help you transform your vision into reality.

  • Case Study: AVA Solutions

    Case Study: AVA Solutions

    Profitability through Performance: Empowering the Mining Sector with Data-Driven Solutions

    In the mining sector, where vast operations require careful management, profitability is the ultimate measure of success. Mining companies face enormous expenses and revenues, and the key to sustaining profitability lies in effective management of both staff and equipment. Ensuring that vehicles are running smoothly and that personnel are operating efficiently can have a direct impact on the bottom line.

    Historically, mining operations have generated a wealth of data, but making sense of that data has often been a challenge. The complexity of operations and the number of factors at play made it difficult to extract actionable insights from this wealth of information.

    At The Good Coder, we believe that when data is used for good, it can transform industries and positively impact communities. That’s why we partnered with Advanced Vehicle Analytics (AVA) to help them unlock the power of their data and use it to improve both profitability and sustainability in the mining sector.

    The Challenge: Turning Data into Actionable Insights

    AVA, with its extensive experience in open-cast mining, faced a significant challenge—how to simplify and make sense of the vast amounts of data being generated by mining equipment and processes. New technological advancements, such as tracking mining equipment’s fuel usage, engine performance, and maintenance schedules, were crucial, but the data needed to be extracted and managed without disrupting the ongoing mining activities.

    The goal was to collect vital intelligence without affecting current output, ensuring minimal impact on daily operations.

    Planning and Solutioning: A Vision for Simplified, Meaningful Data

    The Good Coder worked closely with AVA to craft a solution that would help them unlock the value in their data, simplifying it in a way that would be easy for mining managers to interpret and act on. By applying our expertise in business analysisUX/UI design, and technology integration, we were able to design a streamlined solution that met their needs.

    The diagnostics phase identified the following critical components for success:

    • Real-Time Tracking: The ability to track vehicles in real-time was essential to ensure efficient operations.
    • Alerts and Notifications: Alerts via SMS and email would notify mining managers if KPIs or output levels weren’t being met, empowering them to make quick decisions.
    • Visual Replay of Activities: A feature that would allow mining managers to visually replay mining activity to assess performance and identify inefficiencies.
    • Issue Tracking: The ability to explore existing data to pinpoint where processes went wrong.
    • Visual Maps and Dashboards: Displaying data on maps of the mine, allowing managers to track all activities in real-time on intuitive dashboards.

    The Design Process: Creating an Intuitive, Impactful Experience

    Our design approach was rooted in creating a solution that would empower mining managers with the information they needed without overwhelming them. By simplifying complex data into visual elements that were easy to interpret, we ensured that the solution was not only functional but also user-friendly.

    The scope of our work focused on the diagnostic phase and UX/UI design. This included:

    • Requirement Gathering: Understanding the technical and business requirements that would make the solution successful.
    • Domain Knowledge: Gaining deep insight into the mining industry’s challenges and the processes that would benefit from this solution.
    • User Role Analysis: Defining the different personas who would use the software and their goals.
    • User Process Flows: Mapping out the workflows to ensure the solution would be intuitive and efficient.

    The deliverables provided to AVA included a blueprint that outlined the project in detail, including:

    • Personas: The different users and their goals.
    • User Stories: Narratives that outlined how users would interact with the system.
    • Wireframes and High-Fidelity Mockups: Detailed designs of the user interface to guide development.
    • Visual Elements and Controls: Icons, fonts, colors, and CSS to ensure a cohesive and visually appealing design.

    Results: A Data-Driven Solution That’s Expanding Globally

    The Good Coder’s work resulted in a comprehensive document that provided the detailed findings, personas, process flows, and visual assets needed to guide the software development process. As of 2020, the solution is fully operational, and AVA now serves clients across South Africa, Australia, and beyond.

    The solution has continued to grow, with additional analytics becoming crucial to AVA’s services. As AVA expands into the Internet of Things (IoT), they now offer clients a holistic view of their mining operations, allowing them to track and optimize every aspect of their business.

    Conclusion: Making Sense of Data for a Better Tomorrow

    The blueprint The Good Coder delivered played a pivotal role in the success of AVA’s solution. By simplifying the vast amounts of data generated by mining operations, we enabled AVA to offer a solution that is not only easily navigable but also rich with actionable insights.

    In an industry as complex as mining, simplifying data is essential for increasing profitability while maintaining operational efficiency. Through data-driven insights and user-centric design, AVA is now able to help mining companies improve performance, save costs, and ultimately, contribute to a more sustainable and profitable future.

    At The Good Coder, we are committed to leveraging technology for good—helping businesses transform their data into meaningful, impactful solutions that make a positive difference in the world.

  • Case Study: Marshi – Reward users for engaging with ads.

    Case Study: Marshi – Reward users for engaging with ads.

    The Vision Behind Marshi

    Marshi empowers users to engage with advertisements in a way that benefits them directly. Users earn free data by answering simple questions after interacting with ads. This data can be exchanged for valuable rewards like electricity vouchers or used to browse freely using the Marshi browser. The Good Coder’s approach helped bring this user-centric, innovative platform to life.

    The Challenge: Overcoming Technical and Business Hurdles

    Marshi needed to partner with mobile network providers to offer free data to users. The Good Coder tackled this and other technical barriers by creating a seamless data tracking, reporting, and API integration system.

    The Solution: The Good Coder’s Strategic Approach

    Phase 1: Diagnostics and Blueprinting

    The Good Coder began with a thorough diagnostics phase, setting clear business and technical goals. We identified potential risks, outlined integration requirements, and made informed architectural choices to support Marshi’s long-term success.

    Phase 2: UI/UX Design and Collaboration

    With high-fidelity mockups provided by Marshi’s design agency, The Good Coder’s team implemented detailed process flows using Adobe XD to ensure a smooth user experience.

    Phase 3: The Coding Phase

    The Good Coder’s team focused on building infrastructure for tracking, analysis, and logging. By breaking the features into manageable components, we identified and solved critical challenges, particularly with third-party API and network integrations.

    Phase 4: Project Management, Maintenance, and Enhancement

    After launching Marshi a month ahead of schedule, The Good Coder continued to provide ongoing support, ensuring the platform’s growth and evolution with new features added each month.

    Results: Rapid Growth and Meaningful Impact

    Marshi launched a month ahead of schedule and reached 10,000 users in the first month. With dashboards and reports, Marshi’s team can monitor ad performance, user engagement, and business health, all while planning for future data-driven innovations.

    The Future of Marshi: Data Commoditization

    As Marshi grows, the ability to mine data and analyze user behavior opens up new opportunities for growth and refinement. The platform’s integration with mobile network providers has set a precedent for how data can be monetized in innovative and user-beneficial ways.

    Conclusion: Embracing Disruptive Innovation

    In a world dominated by profit-driven models, Marshi is a shining example of how technology can be used for good. By commoditising data, Marshi allows users to earn valuable rewards, creating a win-win scenario that benefits all parties.

    Ready to bring your ideas to life? Let The Good Coder help you transform your vision into reality.

  • Scheduling location tracking tasks in the background with Xamarin Forms on Android

    Scheduling location tracking tasks in the background with Xamarin Forms on Android

    Android and background tasks

    Android has started to change how background tasks are run. For security and battery life, many new android phones are changing the length of background tasks to terminate within a few seconds of running – killing the desired result. The intention is that apps don’t run things that the user is not aware of in the background. 

    Imagine apps mining bitcoin in the background!

    Possible solutions and options

    As mobile technology is not nearly as mature as the web, it can be complicated – even for simple tasks. One would think that if you want to do a task without the user knowing, that you would need a background task – which is not necessarily the case. The operating system (OS) can kill a background service silently if it deems it unnecessary, processing heavy or doesn’t like it. For recurring tasks, this makes the background service a no go.

    A foreground service did seem like the next best option. This is a service that runs in the foreground – i.e. there is an icon and a sticky notification that displays. The issue is that pure “handle in the background” tasks are now active and visible.

    With previous versions of Android, the AlarmManager and Broadcast Receivers work on older devices, whereas API 23+ implemented something called the JobScheduler. This allows us to schedule jobs to be executed. Though you can schedule periodic jobs through the WorkManager, the OS can kill it.

    So, using the WorkManager, we can get around this. The WorkManager allows us to create a worker that can run to do a task. Before this completes, we are able to reschedule another event that will allow the worker to execute. 

    The WorkManager

    The Android WorkManager is a library that manages tasks, even if the app exits or the device restarts. It manages this by wrapping the JobScheduler, AlarmManager and BroadcastReceivers all in one. Jon Douglas explains it like this on his Microsoft dev blog:

    Permissions

    The following permissions are needed to track location:

    • ACCESS_FINE_LOCATION – this is for getting the location
    • ACCESS_COARSE_LOCATION – this is for getting the location
    • ACCESS_BACKGROUND_LOCATION – if you need to access the location in the background, you need this permission for Android 11 (API level 30) or higher.
    • FOREGROUND_SERVICE – this will allow the app to run the service. 

    Technical requirements

    For this post, we need to have an Android foreground service and use the WorkManager to handle the scheduling. You can use any of the following libraries:

    Architectural code overview

    Shared Library / PCL Project calls

    We need several things to make this work. The first would be to get something to start the job schedule from the shared library/PCL project:

     public interface ILocationWorkerService
    {
    void StartService();
    void StopService();
    }

    This will be called with dependency resolving as below. Please make sure to register the dependency in the main activity!

     DependencyService.Get<ILocationWorkerService>().StartService();

    Worker Service

    In the Android project, we need an implementation of the interface above, with some place to schedule the worker. I use the name LocationWorkerService, as this is not the worker yet. The Worker is called the LocationWorker.

    public class LocationWorkerService : ILocationWorkerService
    {
    private static Context context = global::Android.App.Application.Context;
    public void StartService()
    {
    OneTimeWorkRequest taxWorkRequest = OneTimeWorkRequest.Builder.From<LocationWorker>()
    .SetInitialDelay(TimeSpan.FromSeconds(30)).Build();
    WorkManager.Instance.Enqueue(taxWorkRequest);
    }

    public void StopService()
    {
    SmarTechMobile.Helpers.Settings.TrackingIsActive = false;
    }
    }

    The Worker

    For the worker, we implement the Worker Android-specific class. The code to do the location tracking has been removed here, as links will be supplied further down below.

    The code below should run the job repeatedly, every 30 seconds. You might want to add special conditions, such as in the YouShouldResechedule variable – and I recommend doing so, as waking up the device every 30 seconds can be taxing on battery life.

    public class LocationWorker : Worker
    {
    public LocationWorker(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
    {

    }
    public override Result DoWork()
    {
    try
    {
    var YouShouldRescedule = true;
    if (YouShouldRescedule)
    {
    Reschedule();
    }
    }
    catch (Exception)
    {
    Reschedule();
    }

    return Result.InvokeSuccess();

    }

    private static void Reschedule()
    {
    if (SmarTechMobile.Helpers.Settings.TrackingIsActive)
    {
    OneTimeWorkRequest taxWorkRequest = OneTimeWorkRequest.Builder.From<LocationWorker>()
    .SetInitialDelay(TimeSpan.FromSeconds(30)).Build();
    WorkManager.Instance.Enqueue(taxWorkRequest);
    }
    }

    }

    Location Tracking

    There are quite a few libraries that allow for location tracking, and thus it wouldn’t make sense to discuss all of their implementations in detail. I do want to list them with links, so that you can explore them:

    The Geolocator plugin was merged into Xamarni Essentials a while back, but it still has some background features that Xamarin Essentials lack. Both are really good though! I use the one by James Montemagno. The location can be called by the following in the worker:

    var locator = CrossGeolocator.Current;
    var position = await locator.GetLastKnownLocationAsync();

    Please make sure that you have all the permissions sorted – anything that happens in the background will fail silently if no permissions were granted.

    Conclusion

    Location tracking can be complicated. Be careful though – it is recommended that you don’t use it because it’s a nifty feature – the Play store might decline your app if you don’t have a purpose for it. As stated on the documentation:

    Note:The Google Play store has updated its policy concerning device location, restricting background location access to apps that need it for their core functionality and meet related policy requirements. Adopting these best practices doesn’t guarantee Google Play approves your app’s usage of location in the background.

    The message is this: use functionality with care.

    Enjoy your business! 

    Sources consulted

  • Search Engine optimisation for .NET Core  MVC

    Search Engine optimisation for .NET Core MVC

    SEO and .NET Core

    SEO is an art and a science at the same time. Historically, it has not really been in the sphere of software development, but web design.

    When a business grows beyond the normal WordPress website into a large web application, the line between the search engine optimiser and software developer becomes blurred – as does the responsibility.

    Though I do not deny the importance of SEO factors such as back links, domain age and content optimisation, we need to consider the technical aspect of SEO and code. 

    That is the purpose of this article.

    Issue tracking and fixing of SEO issues

    We know that page speed affects SEO, yet finding the issues that affect performance can be challenging. At the lowest level, one can use Google Page Speed Insights or GTmetrix to understand the page speed issues. 

    Monitoring where the slowness is happening will give you a better understanding. This could be done by custom code or by using Azure Monitoring.

    Chrome Developer Tools (I call them the F12 tools) also has a great interface for checking performance. This can be accessed F12 > Performance > Record. Refresh the page, and you will receive loads of info about the FCP, LCP and the response times of scripts. 

    Infrastructure factors affecting SEO

    Before we get into the detail of MVC and .NET Core applications, I want to mention that page speed and responsiveness is exceptionally important in upping your SEO score. 

    I find that many companies like to have a custom setup of their system on a virtual machine – often running databases, web applications and third-party services on the same machine. Though this might make sense, the performance of the website could be affected due to a spike in website traffic, SQL jobs and other factors. 

    In certain cases, the use of cloud services such as Azure or AWS might make the website performance better. These services are optimised for performance (replication and redundancy)  stability (scalability). Examples include Azure web services and Azure Elastic

    Code factors affecting SEO

    Depending on whether a company optimises a solution for delivery, performance or configurability, the approach of resolving some of the issues that SEO will require changes to the MVC Views, C# business logic or to the persistence of data (The database or Elastic).

    Largest Contentful Paint (LCP)

    Largest Contentful Paint (LCP) is a Core Web Vitals metric and measures when the largest content element in the viewport becomes visible.

    Web.dev

    LCP has a lot to do with making everything in the initial viewport load as fast as possible. The largest content tends to be images and videos and sometimes large scripts. These can be optimised as follows:

    • Use Gzip compression
      • The following DLL works for script files (link here to implementation)
        Microsoft.AspNetCore.ResponseCompression
      • Change the server settings to allow all images to use Gzip compression. If you’re using a CDN for your images, make sure they support Gzip.
    • Avoid having huge script files blocking the rendering of the HTML and CSS. Place less important files at the bottom of the page and only have globally essential scripts in the _layout.cshtml file. 
    • Avoid inline styles as this delays drawing the UI. 
    • Pick your website’s front end plugin carefully: Some plugins an cause massive performance issues due to browser side rendering of content. 

    Website speed and performance

    As page speed indirectly also affects your SEO rating, e.g. people leaving because they’ve waited too long for it to load (bounce rate), it is important to make sure your application loads fast. The following needs to be considered or making your website faster:

    • If possible, implement caching. In some cases, this is challenging, especially in an e-commerce solution where products sell out quickly.
    • Leverage browser caching – oftentimes, developers add a query string to a script to reload it every time. Avoid this if possible.
    • Reduce redirects: avoid the following on Get operations:
      • return RedirectToAction("Index");
      • return Redirect("Area/Controller/Index");

    Sitemap and the robots.txt file

    A robots.txt file tells search engines what should and shouldn’t be indexed. This is thus the perfect place to reference the sitemap.xml file! A sitemap references all pages that you want Google to spider. Note that other pages may be included if another website references them.

     There are a few ways to do this:

    • For general static sites, one can use sitemap generators and add the file to the solution. 
    • For dynamic sites such as eCommerce sites, this would need to be done manually. Solutions for manual inclusion include:

    Cumulative Layout Shift (CLS)

    Imagine trying to click a link, but it keeps on moving? For this reason, Google added CLS. This metric was added to favour sites with better user experience – where the layout doesn’t change. The image below (source here) illustrates the issue nicely.

    As .Net Core is built on asynchronous behaviour, it sometimes makes sense to get content asynchronously and draw it as it arrives at the browser. 

    It also happens with third-party JavaScript plugins and integrations where content gets appended to a div – causing the layout to shift down, as well as user controls such as carousels and accordions. 

    There are two potential work-arounds:

    • Add a fixed height for the container that the content will be rendered into. This will stop the shift from happening
    • Move business logic of third party components to the server, so that all the data will be drawn together on render.

    Finding what is shifting the page can be challenging at times. The Chrome developer tools can assist with finding the culprits by checking the performance and expanding the experience dropdown – more info here.

    Compression and Minification

    Performance and page speed is very central to Google and SEO and many of the above points touch on this already. Historically, bundles were added in the C# code like this:

     bundles.Add(new ScriptBundle("~/bundles/bs-jq-bundle").Include(
                          "~/Scripts/bootstrap.js",
                          "~/Scripts/jquery-3.3.1.js"));

     

    With .Net Core, this has changed drastically. Online there are examples of where a tag is now added to include or exclude the bundling, as in this snippet:

    <environment exclude="Development">

    <link rel="stylesheet"
    href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
    asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
    asp-fallback-test-class="sr-only"
    asp-fallback-test-property="position"
    asp-fallback-test-value="absolute" />
    <link rel="stylesheet"
    href="~/css/site.min.css" asp-append-version="true"
    />

    </environment>

    I have, however found for some odd reason, this doesn’t always work – especially when scripts that are loaded from a CDN. The other way is to add the bundles in the bundleconfig.json (full example here):

    [

    {

    "outputFileName": "wwwroot/css/site.min.css",
    "inputFiles": [
    "wwwroot/lib/bootstrap/dist/css/bootstrap.css",
    "wwwroot/css/site.css"
    ]

    }

    ]

    This file does use the ‘BuildBundlerMinifier‘ Nuget package, but works really well with setting it up with your CI/CD, as per he link here – and it works well with setting the code up for local debug with your <environment> tags, as per above.

    Conclusion

    As much as SEO is an art, it is also a science. Developers need to be more cognizant that business to customer solutions might need to be indexed by search engines. Adding the appropriate solution in place to help the marketing team is essential in a successful online strategy.

    Though there are many libraries that can help with site maps, compression and modification, sitemaps and website speed and performance, the implementation of these will depend on the infrastructure and ability of the development team to accommodate the new changes in the existing infrastructure and workload.

    Though SEO has historically not been something that software engineers focus on, we can see the shift of becoming more customer-focused changing the status quo.

    Enjoy your business  

  • Managing form builders and contracts

    Managing form builders and contracts

    When form requirements change often

    When starting a project, we add fields in the database as per the technical specification supplied. For example, we might start with a customer table with a few fields.

    It is not long before more requirements surface.

    Companies change and so does requirements.

    In some cases, such as compliance or contracts, the information required can change depending on the machine, audit or new information that is required.

    For these use cases, it doesn’t make sense to have all of these fields in a traditional relational (or noSQL) database.

    In some industries, changes need to happen quickly and dynamically. For example, someone doing audits of kitchen devices in the hospitality industry needs to have the power to change required fields for different sites, appliances and roles.

    In this post, I want to explore the options for ever-changing forms and contracts – what tools and patterns are available to us to help us manage this better?

    Contract Templates

    Contracts come in all shapes and sizes. These include rental, legal and employment to name a few.

    Many of these can be semi-standard. For example, rental contracts might have a few permutations – sectional title, full title and daily/weekly rentals. One could create a text replace function where certain characters need to be extracted, such as double curly brackets – {{CustomerName}}. These fields can then be entered and the contract created.

    Form Builders

    It is every developer’s dream to write a meta-system that writes code – many having the dream to build a system that caters for 80% of permutations of customer needs. Though form builders can assist with this, I have found that this is a goal marker that keeps on moving.

    I do however believe that in many cases, a form builder makes a lot of sense.

    I recently came across formbuilder.online. It allows for a simple drag and drop interface that saves data back into JSON. It is easily initialised by the following code (if you have the CDN script installed):

    jQuery($ => {
    const fbTemplate = document.getElementById('build-wrap');
    $(fbTemplate).formBuilder();
    });

    Exporting the form in HTML is easy. As the building and rendering generally happens in two different locations in the software, it uses two different libraries:

    the formBuilder and the formRender:

    const html = $('#render-container').formRender('html'); // HTML string

    And saving the output into JSON:
    const fbEditor = document.getElementById("build-wrap");
    const formBuilder = $(fbEditor).formBuilder();
    document.getElementById("saveData").addEventListener("click", () => {

    console.log("external save clicked");
    const result = formBuilder.actions.save();
    console.log("result:", result);

    });

    Managing form data

    In some cases, it would make sense to save the form data in lookup tables – especially if reporting will be a requirement. Generally, for most applications though, the full JSON result can be saved in a single field and be recalled as a whole when needed.

    A pattern I have seen that tends to work well is using a template type where the original template is saved and the result copies the template as a form that can be filled in.

    Contract related requirements

    To end off the requirements, I want to add a special section on other elements I’ve seen that are required for contracts:

    • Editable terms and conditions – these change from time to time and it is recommended to handle this in the same template mechanism
    • Signatures – there are multiple JavaScript libraries handling signatures. I quite like Signature pad, as it is easily implemented
      • Creation:
        var canvas = document.querySelector("canvas");
        var signaturePad = new SignaturePad(canvas);
      • Saving result:
        signaturePad.toDataURL("image/jpeg"); // save image as JPEG
    • History and data tracking –
      • Having a history table that tracks the logged-in user’s changes to contracts would be prudent.
      • Most code solution gives you the ability to track the IP of the device. In C# .NET Core, it can be done with the following code:
        var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;
        return remoteIpAddress.MapToIPv6().ToString();
    • PDF Creation – It would often be required for users to export signed contracts to PDF. There are many HTML to PDF converters, including the well-known iText. Always check the licensing terms to make sure you are not breaking the law.

    Conclusion

    Managing forms and contracts that change can be challenging. With current technology, there are solutions to make our lives a bit easier such as form builders and writing a simple find and replace function.

    Make sure you meet all the legal requirements of the contract or audit!

    Enjoy your business

  • Mobile or web application  – which one does my business need?

    Mobile or web application – which one does my business need?

    Mobile or web application – the big debate

    When starting out, founders often have a strong idea about what channel their new venture should use. The two most popular ones are mobile applications and web applications. We know that these technologies have been used for a few years, but it is worth it to explore what the technological limitations, human behaviour and product-channel fit will be for the startup.

    If you only have a hammer, every problem looks like a nail

    With well-established technology in both spheres, software developers are able to build cross-platform mobile and web applications. Yet, with the resource restrictions (financial, time and people) on startups, it becomes exceptionally important to minimise wastage – and researching the pros and cons of all channels before making the final decision.

    All things considered

    I want to make fair mention that you need to consider each platform, different infrastructure and marketing channels for the platforms. For example, you need to look at:

    • Infrastructure costs
    • Customer acquisition models
    • Market segmentation and technological compatibility
    • The financial impact on the startup or small business

    I am of the opinion that you should have empirical proof from your customers before you code a feature. The same is true for choosing a platform. Don’t just choose a platform on a feature or system without testing the outcome!

    Mobile or web application: A channel architectural overview

    The cross-platform technology for converting a single code set for use on the web, mobile phones and tablets is not as mature as for example the cross-browser support that JQuery and Bootstrap offer all web browsers. There are a few coding frameworks that offer a general one-size-fits-all solution but can create unforeseen technological stonewalls and issues. These may range from scrolling issues to unsupported features.

    Generally, the server allows shared business logic between a mobile app and a website. The browser and mobile app tend to be a lightweight ‘shell’ with very little business logic. This allows for server code reuse and decreases platform specific issues and bugs.

    Choosing a mobile app

    When deciding on a mobile application as your chosen channel, cost and business niche are the two biggest considerations.

    Certain business models need to have an app available on-the-go. For example, it makes sense for a pick-up and delivery solution, such as Uber, to be on a mobile phone – you need access to it wherever you are.  In another case, it would be convenient to have a mobile app, but not essential to the business model. Examples include an informational service (such as an article repository with only a few articles) and services that are used less often (such as motor vehicle registration).

    It is not unheard of that people delete an app if the internet connection is lost in the app, a UI alignment issue is not to their liking or the app experience is not exactly what they are looking for.

    Mobile app users are not forgiving.

    Considerations for mobile apps

    Mobile apps, though perceived as the holy grail, can sometimes sink a startup The following factors need to be considered:

    • Users on the store rate your app and leave reviews – customer service is vital in resolving issues. Even though cross platform technology allows catering to many phones and tablets, it is impossible to cater for everything.
    • There might be a substantial amount of red tape to cross before you launch your app. For example, legal paperwork and login details would need to be provided and certain approvals need to be handled.
    • You will set yourself at the mercy of the store. If they update their terms of service, your business model might be affected.

    A mobile app also has a financial impact on your business:

    • Mobile app development tends to be more expensive to code. It can also become very complex really fast.
    • All payments need to be handled by the store. The standard charge is around 30% of gross payment
    • Annual fees payable to the stores – some stores have a once off fee, whereas others have an annual subscription fee to host your mobile apps
    • Server costs and infrastructure – in many cases, only half of the business logic is on the mobile app. The other half is on a web server that the mobile app connects to.

    In my personal experience, the only features I have seen that make a mobile app different from a web application is push notifications. Though Android does allow for web push notifications,  iOS doesn’t allow for this at the moment.

    Choosing a web application

    Web applications are more mature in technology than mobile apps. With code libraries like bootstrap and jQuery and Angular coders can create cross-platform single page applications or progressive web apps for online and offline use.

    Though web apps are versatile and easy to deploy, the issue of trust can be difficult to overcome. There is nobody that can verify the legitimacy of a website.

    Websites are also easily forgotten and not bookmarked. Retargeting and customer communications are vital in turning them into returning customers. In some cases, it makes sense to use web push notifications, but might be seen as spam by some.

    Considerations for a mobile app

    Consider the following before choosing to build a web application:

    • Would you need to integrate a payment gateway? What will the cost be?
    • Do you need to send communications such as email and SMSs for awareness?
    • Which technology stack do you want to use? The .NET Framework, MEAN- or LAMP stack?
    • How much should be doable offline? Is this a fully online solution?

    Concerning the financial impact, the following should be considered:

    •  Infrastructure costs
      • Web application hosting, including database costs
      • Annual domain renewal and SSL certificates
      • Third party costs for security and validation

    Conclusion

    I realise that this article is not nearly extensive enough for all the articles available on the internet.

    For the survival of any business or startup, we need to focus on what is important and avoid wasting resources (money, time or energy).

    Though mobile apps are the go-to solution for may startups, we need to count the cost and confirm if this will serve the end goal and purpose of our proposed solution. The same can be said for web applications. Mobile applications will need to withstand the ratings, cost and fulfil the need of the user’s experience to avoid being deleted quickly.

    Valid proof is needed that your product will fit the channel – test your assumptions with your customers.

    Enjoy your business.

  • Executing your small business strategy

    Executing your small business strategy

    Reaching your goals by execution

    Susan created a startup to do document management for medium sized businesses. Having a mission, vision and execution strategy in place, she believes she is on the right track to get a product market fit – but has a problem executing the strategy that she has pinned down.

    This situation is not unique. 70 % of strategic transformations fail – and the rate of startups and small businesses failing is close behind this number. As a matter of survival, we need to measure the health of our business and then determine if we are on track to reach our goals.

    The different strategies for different businesses

    I find that there are three different types of company structures: organisations with high levels of uncertainty, businesses with a formula and big corporates. Each of these have different aims, goals and execution paths.

    Organisations with high levels of uncertainty – those doing groundbreaking work and have no existing frameworks to lead from, would require a lean build-measure-learn approach. For example, in the above startup, Susan might need to pivot at some stage. This might happen when her customers expect a different strategic alignment of her offering to their vision.

    Many small businesses have a formula that they can use to achieve their vision. This includes the insurance tech – Ubelele wrote an excellent article here on how you can use a formula to launch an insurance app (Naked, Simply, JaSure).

    You also have a corporate strategy. There are generally three strategies that are focused on:

    • Growth strategy – when a big business is looking to expand its services, products and offering
    • Stability strategy – when an organization keeps the status quo and adds more stability to its existing infrastructure.
    • Renewal strategy – if there is a decline in the performance of an organization. This would either mean retrenchment or a turnaround strategy.

    Breaking down the execution

    If you are working in an environment with a high level of uncertainty, you need to break it down into bite sized chunks. This can be broken down as many times as needed. Being overwhelmed, you need to decide on an area of focus.

    In the book “The 4 disciplines of execution”, the authors refer to a concept called WIGs – wildly important goals. WIGs are small, dial lifting changes that can be implemented to move your company forward. If you can reach this small goal, then it would have a huge impact on your business, revenue, inter alia freeing up time.

    These can be decided weekly or bi-weekly.

    Focus on small wins

    In some cases, the WIGs can sometimes be big wins – and can take two weeks to execute. Make effort to break it down into smaller daily wins. Remember – you need to motivate yourself (and your staff) to grow your business in the right direction.

    And small daily wins can serve as a great motivation

    Aligning staff members

    Though this section deserves an article by itself, I want to touch on staff and your strategy.

    Many businesses do not engage staff meaningfully. Staff members need to do the grunt work, without the a clear buy-in of the vision. Make it a priority to communicate your vision and strategy on how to get there with your staff members.

    They need to feel valued and part of the plan.

    Make sure expectations are communicated, measured and broken down accordingly.

    Align KPIs and performance to the goal – this is why you have KPIs and performance reviews in the first place.

    The power to say no

    As a small business owner, I find that there are many opportunities that come my way – anything from fun little projects, startups looking for a technology parter to large projects where you need a team of hundreds of developers.

    To align my company with the vision and strategy, I have learnt the power to say no.

    When you say no to something, you say yes to something else.

    It is not wrong to say no to a project that is easy money – you need to make tough decisions to align yourself to who you want to become. If it does not fit into your vision or strategy, then say no.

    Measure & evaluate

    No company can move forward without vision.

    Without implementation of a strategic roadmap, you will never get where you want to be. But how do you know your actions have the desired effect? Are you moving in the right direction?

    For this there needs to be a measurable outcome to your goals, mini goals and tasks. The smaller the measurement, the quicker you will be able to get back on track if you have strayed away from the main goals. These measurements can take many forms. Here are some examples:

    • Do weekly evaluations if the customers you have and attract are in alignment with your company vision
    • For software development projects – checking if the velocity and tickets align with the end goal (e.g. delivery date of a specific feature)
    •  Financial alignment with features and services added – Use dashboards to see the impact of your changes

    Conclusion

    In some cases, a formula can be followed for growth. For startups and businesses in an environment of high uncertainty, it might not be as simple as to have a clear long term goal other than client take up and financial stability.

    The key concept in reaching your goals in business is execution – we need to action our plans to achieve.

    If your goals are too big, then add mini goals. Add tasks. Add sprints.

    Be efficient in measuring your outcome. You need to know within two weeks if you are not on target to achieve your goals.

    Enjoy your business.

  • When should I rewrite an existing system?

    When should I rewrite an existing system?

    Before you rewrite an existing system

    To rewrite an existing system takes time, money and effort. The decision should not be taken lightly. A large number of resources (money, man-hours, management) will be poured into the new solution. A fair amount of analysis will also need to be done upfront, with estimates of new hardware requirements, technology costs and the training learning curve that will eat into your developer’s time.

    When considering a rewrite, you need to think about your existing codebase  (quality, versions and architecture), the software you use (e.g. hosting operating system, database management too) and the obvious time/money/quality equilibrium.

    What is legacy code/software?

    Defining legacy code/software can be challenging. Here are some of my favourite definitions:

    • The code I checked into source control this morning
    • Software that is no longer supported by the company that published it (e.g. Windows XP)
    • Software or code that has a very limited number of developers in the world that specialise in it and is older than 5 years.

    It really boils down to this: is your legacy software holding you back from scaling your business? do you want to grow your business, but don’t have the ability due to constraints?

    The maintenance/green fields dilemma

    Most developers want to work on new systems. They want new technologies, new challenges and to create something fresh and challenging. Whoever the person is that will need to maintain the solution – well, that is irrelevant. In my experience, I see and hear many developers who leave a company as soon as they are forced into a support role.

    Having said that it is challenging for a business to start a project from scratch again. The reason as all the business rules are hardly ever documented. Spending a year in an attempt to get business analysts to assess the solution is also not necessarily viable – especially for small and medium-sized businesses.

    As with all things, in business there is a trade-off between quality, time and money. It is often believed that staying with the status quo will be more cost-effective.

    The real cost of legacy systems

    When I was still working as a fulltime developer, I sat in a meeting where I explained to my (then) boss that the code was a mess and it was just impossible to manage. We also didn’t have unit tests, continuous integration or any means to note if something broke. His response was simple: “Well, it is working”.

    I find that software developers cannot always tell the business what is really happening under the hood in the code. Here are some factors to consider and discuss before doing a rewrite – and some to discuss with your tech partner:

    • Developer turnover – what is the cost of training new developers on a legacy system? What if your current developers leave?
    • Legal implications – what would happen if changes need to be applied or the system fails due to spaghetti code?
      • For example, if your code base generates legal documents in different locations. A legal change has to be implemented, but your developers cannot guarantee that all the changes will be implemented in all the locations.
    • Financial impact – With the amount of support, inflexibility and constraints, is the legacy software stopping you from expanding your business?

    Legacy code has a much bigger impact on a business than we would like to believe.

    Complexity and the rewrite

    Many business systems are very complex – some with good reason (such as complex financial systems). Other systems tend to be boiler-plated and made more complicated to future proof the system (e.g. dynamic configurability).

    When rewriting a system, it makes sense that one would want to have the code as open and as extendible as possible – yet one needs to consider the maintenance, learning curve of new developers and the resources that are wasted by not getting to market quickly enough.

    I don’t want to rewrite my existing system

    Any system will at one time or another become legacy. Your system will need an upgrade at some time in the life of the business. It is also fair that there might not be an opportunity today for the rewrite.

    Let us take the following scenario. An MVC (C# .NET) solution was written about 10 years ago. The version of MVC is outdated, it is running on SQL 2000 and contains more than 10 years of business logic and fine-tuning. As a stable system, it makes sense that you don’t want to tinker too much with it.

    There are however certain elements that one can change to upgrade the solution incrementally:

    • Set a day every week that will be spent on upgrades.
    • Consider upgrading the testing servers/database first. The testers will be able to find issues fast here
    • Upgrade the packages and linked libraries to the latest versions.
    • Have a rule that unit/integration tests be added whenever a bug is fixed.
    • Consider extracting the code logic – This could be done in a separate project,  into DLL libraries or an external solution in some cases. This will make it easier to rebuild the solution when the time comes.

    Keeping software clean and well maintained can assist when the time for a rewrite comes. It also gives the team a sense of pride and accomplishment.

    I need a rewrite

    When the risk becomes too big, it makes sense to rewrite a legacy system. In this case, it would be prudent to:

    • Find a minimum viable product that would cover at least a small business case. Start with this small dial lifting change and then grow your business. Get something out to the client or business as soon as possible.
    • After the MVP, focus on the next small feature that will have the biggest impact on the business
    • Make sure that the software is well documented – this might not be important right now, but will be exceptionally important later on.
    • If the old and new systems can be run in parallel, then do so until the new system fulfils all the requirements.

    Conclusion

    Not all legacy code needs to be rewritten – and not all systems should be upgraded to the latest versions. We need to understand that there is a risk to keep old code and software as-is in our businesses.

    Make sure that the risk will not drive away developers or leave the business cripple once the system falls over due to a vulnerability, exploitation or hack.

    When deciding on rewriting your legacy system, start with something small – focus on dial lifting changes that will make a big difference in the company. These should be small chunks/sprints, so that direction can be changed quickly without costing too much.

    Keep your pulse on the technology, cost and maintenance.

    Enjoy your business.