var pmb = {"page_per_post":true,"max_image_size":1200};// This is some Prince HTML-to-PDF converter Javascript. It's not executed by the browser, but during the // Prince HTML-to-PDF conversion process. See https://www.princexml.com/doc/javascript/ // turn on box tracking API Prince.trackBoxes = true; // once the first pass of rendering is finished, let's make the "pmb-dynamic-resize" images take up the rest of the // page they're on. Prince will then need to re-render. Prince.registerPostLayoutFunc(function() { pmb_continue_image_resizing(); pmb_extend_to_bottom(); }); /** * Resizes images in blocks with CSS class "pmb-dynamic-resize". * Gutenberg image blocks with no alignment: the top-level block has the class and is the figure. * But if they're floating, the top-level block is a div which contains the figure (which floats). * The image's initial height effectively becomes the minimum height. The maximum height */ function pmb_continue_image_resizing(){ var resized_something = false; // To make this more efficient, grab the first image from each section followed by a pagebreak if(pmb.page_per_post){ var dynamic_resize_blocks = document.getElementsByClassName('pmb-section'); for(var i=0; i<dynamic_resize_blocks.length; i++){ var resized_element = pmb_resize_an_image_inside(dynamic_resize_blocks[i]); if(resized_element){ resized_something = true; } } } else { if(pmb_resize_an_image_inside(document)){ resized_something = true; } } if(resized_something){ Prince.registerPostLayoutFunc(pmb_continue_image_resizing); } } /** * Grabs a "pmb-dynamic-resize" element inside here and resizes it and returns it. * (If none are found, returns null) * @param element * @return boolean */ function pmb_resize_an_image_inside(element){ var dynamic_resize_blocks = element.getElementsByClassName("pmb-dynamic-resize"); // just grab one block at a time because how the first image is resized will affect the subsequentn ones // and subsequent ones' telemetry is only updated after re-rendering. So do one, then get Prince to re-render, then // do another... etc. var a_dynamic_resize_block = dynamic_resize_blocks[0]; if(typeof a_dynamic_resize_block === 'undefined'){ return null; } // when images are floating, the block had a div (with no height) because its contents are floating // in that case we want to resize the figure inside the block. So check if there's a figure inside it var figure_is_floating = true; var figure_to_resize = a_dynamic_resize_block.getElementsByTagName("figure")[0]; if( typeof figure_to_resize === 'undefined'){ // There's no figure inside it. The figure is the top-level element in the block. figure_to_resize = a_dynamic_resize_block; figure_is_floating = false; } // For floating images we need to also set the block's width (I can't figure out how to get CSS to set the width automatically) // so for that we need to figure out how much the image inside the figure got resized (non-trivial if there's a caption). var figure_image = figure_to_resize.getElementsByTagName('img')[0]; // determine the caption's height var figure_caption = figure_to_resize.getElementsByTagName('figcaption')[0]; var caption_height = 0; if(typeof(figure_caption) !== 'undefined'){ var caption_box = figure_caption.getPrinceBoxes()[0]; caption_height = caption_box.marginTop + caption_box.h + caption_box.marginBottom; } // If we can't find an image to resize, there's nothing to resize (which is weird but somehow happens?) if(typeof(figure_image) !== 'undefined') { var figure_image_box = figure_image.getPrinceBoxes()[0]; var figure_image_height = figure_image_box.h; var figure_box = figure_to_resize.getPrinceBoxes()[0]; var page_box = PDF.pages[figure_box.pageNum - 1]; // don't forget to take the footnote height into account var footnotes_height = 0; for (var index in page_box['children']) { var box_on_page = page_box['children'][index]; if (box_on_page['type'] === 'FOOTNOTES') { footnotes_height = box_on_page['h']; } } var max_allowable_height = pmb_px_to_pts(pmb.max_image_size); // page_box.y is the distance from the top of the page to the bottom margin; // page_box.h is the distance from the bottom margin to the top margin // figure_box.y is the distance from the top of the page to the bottom-left corner of the figure // see https://www.princexml.com/forum/post/23543/attachment/img-fill.html var top_margin = page_box.y - page_box.h; var remaining_vertical_space = figure_box.y - top_margin - 10 - footnotes_height; var max_height_because_of_max_width = page_box.w * figure_image_box.h / figure_image_box.w + caption_height; // also gather the maximum heights from the original image var max_height_from_resolution_y_of_image = 100000; if('height' in figure_image.attributes){ max_height_from_resolution_y_of_image = pmb_px_to_pts(figure_image.attributes['height'].value); } // resolution_height px max_height pts // ------------------ = -------------- => max_height = max_width pts * original_height px / original_width px // resolution_width px max_width pts var max_height_from_resolution_x_of_image = 100000; if('width' in figure_image.attributes && 'height' in figure_image.attributes){ max_height_from_resolution_x_of_image = (page_box.w * figure_image.attributes['height'].value / figure_image.attributes['width'].value) + caption_height; } Log.info('IMG:' + figure_image.attributes['src'].value); Log.info(' page width:' + page_box.w); Log.info(' pmb.max_image_size' + pmb.max_image_size); Log.info(' remaining_vertical_space ' + remaining_vertical_space + '(distance to bottom margin ' + page_box.y + ', figure bottom at ' + figure_box.y + ')'); Log.info(' max_height_because_of_max_width' + max_height_because_of_max_width); Log.info(' max_height_from_resolution_y_of_image' + max_height_from_resolution_y_of_image); Log.info(' max_height_from_resolution_x_of_image' + max_height_from_resolution_x_of_image); Log.info(' caption height ' + caption_height); // put a limit on how big the image can be // use the design's maximum image size, which was passed from PHP var new_figure_height = Math.min( max_allowable_height, remaining_vertical_space, max_height_because_of_max_width, max_height_from_resolution_y_of_image, max_height_from_resolution_x_of_image ); Log.info('New figure size is ' + new_figure_height); var max_class = 'pmb-dynamic-resize-limited-by-unknown'; switch(new_figure_height){ case max_allowable_height: max_class = 'pmb-dynamic-resize-limited-by-max_allowable_height'; break; case remaining_vertical_space: max_class = 'pmb-dynamic-resize-limited-by-remaining_vertical_space'; break; case max_height_because_of_max_width: max_class = 'pmb-dynamic-resize-limited-by-max_height_because_of_max_width'; break; case max_height_from_resolution_y_of_image: max_class = 'pmb-dynamic-resize-limited-by-max_height_from_resolution_y_of_image'; break; case max_height_from_resolution_x_of_image: max_class = 'pmb-dynamic-resize-limited-by-max_height_from_resolution_x_of_image'; break; } Log.info('max height css class:'+ max_class); // Resize the block figure_to_resize.style.height = new_figure_height + "pt"; if (figure_is_floating) { // Used some grade 12 math to figure out this equation. var new_image_height = new_figure_height - figure_box.h + figure_image_height; var resize_ratio = new_image_height / figure_image_height; figure_to_resize.style.width = (figure_box.w * resize_ratio) + 'pt'; } } // Change the class so we know we don't try to resize this block again a_dynamic_resize_block.className = a_dynamic_resize_block.className.replace(/pmb-dynamic-resize/g, 'pmb-dynamic-resized') + ' ' + max_class; return a_dynamic_resize_block; } function pmb_extend_to_bottom(){ Log.info('pmb_extend_to_bottom'); // find all elements that should extend to bottom var dynamic_resize_elements = document.getElementsByClassName('pmb-fill-remaining-height'); if(dynamic_resize_elements.length){ Log.info('found something to resize'); // find their distance to the bottom of the page var element = dynamic_resize_elements[0]; var element_box = element.getPrinceBoxes()[0]; var page_box = PDF.pages[element_box.pageNum - 1]; Log.info('element to resize'); pmb_print_props(element_box, 'element to resize box'); pmb_print_props(page_box, 'page box'); var remaining_vertical_space = element_box.y - (page_box.y - page_box.h) - 50; Log.info('resize to ' + remaining_vertical_space); // make the element fill that vertical height element.style.height = remaining_vertical_space + "pt"; // remember not to do this one again element.className = element.className.replace(/pmb-fill-remaining-height/g, 'pmb-filled-remaining-height'); // redraw and look again Prince.registerPostLayoutFunc(pmb_extend_to_bottom); } else { Log.info('nothing more to do'); } } /** * From https://www.princexml.com/doc/cookbook/#how-and-where-is-my-box * @param pixels * @returns {number} */ function pmb_px_to_pts(pixels){ return pixels * (72 / 96); } /** * A debugging function, especially useful for figuring out what's on these "box" objects * @param obj * @param label */ function pmb_print_props(obj, label){ Log.info(label); for(var prop in obj){ var val = obj[prop]; Log.info(prop + ':' + val); } }

Print My Blog — Pro Print

BHAGs

Table of Contents

Big hairy audacious goal, or BHAG

A big hairy audacious goal, or BHAG, is a clear and compelling target for an organization to strive for.

Understanding Big Hairy Audacious Goals

A BHAG—pronounced “bee hag”—is a long-term goal that everyone in a company can understand and rally behind. BHAGs are meant to excite and energize people in a way that quarterly targets and lengthy mission statements often fail to.

The litmus test of a true BHAG is how it answers questions like:

  • Does it stimulate forward progress? 
  • Does it create momentum?
  • Does it get people going?
  • Does it get people’s juices flowing?
  • Do they find it stimulating, exciting, or adventurous?
  • Are they willing to throw their creative talents and human energies into it?

If the answers to these questions trend toward the affirmative, you may have a potential BHAG.

Categories of BHAG

The BHAG is meant to pull a team together, upgrade its desire and capabilities, and push it to achieve something that wouldn’t have been possible without the shared commitment.

There are four broad categories of BHAG:

  1. Role model: seek to emulate the success of a well-known company.
  2. Common enemy: focus on overtaking their competitors, often aiming at beating the top companies in the industry.
  3. Targeting: refer to things such as becoming a billion-dollar company or ranking #1 in the industry.
  4. Internal transformation: remain competitive by revitalizing their people and their business (generally used by large, established companies)

What Is the Difference Between Corporate Vision and BHAG?

The main difference between a corporate vision and a company’s big hair audacious goals is the level of boldness or daring involved. Generally, vision is more reasonable and there is consensus that the goals of the vision can be reasonably achieved. BHAGs, on the other hand, are more like moonshots that have some likelihood of success, but might also fail. BHAGs are riskier but bolder, and if they do succeed can be quite groundbreaking.

The Bottom Line

A big hairy audacious goal (BHAG, or “bee-hag”) is a large-scale goal of great importance that is also bold, somewhat risky, and high-stakes. The concept was developed in the mid-1990s by business school professors Jim Collins and Jerry Porras in their book, “Built to Last: Successful Habits of Visionary Companies” as a way to stimulate innovation, creativity, and progress within organizations.

BHAG1: Embed Data-Driven Culture Across All Operations

  • Purpose: Cultivate a culture where data-driven decision-making is embedded into daily operations, empowering every level of the organisation to leverage data for proactive insights and strategic advantage.
  • Scope: This BHAG covers initiatives that promote data accessibility, encourage data literacy, and ensure data platforms provide seamless support across departments.
  • High-Level Intent: Move from isolated data insights to an integrated, organisation-wide data ecosystem where all teams actively use data to inform decisions, supported by user-centric tools and training.

Start-up:

  • Purpose: Launch initiatives to build awareness of data’s role in decision-making across BMT.
  • Goal: Establish a core data team and communicate the vision for a data-driven culture.

Foundation:

  • Purpose: Lay down the infrastructure and data governance practices to support data-driven decisions.
  • Goal: Roll out basic training and introduce data literacy programs across departments.

Reporting:

  • Purpose: Enable easy access to operational and strategic reports that support data-informed decisions.
  • Goal: Establish automated reporting with key metrics visible to all relevant teams through myBMT.

Predictive:

  • Purpose: Integrate predictive insights into decision-making processes.
  • Goal: Equip teams with tools and insights for scenario planning and forecasting to anticipate customer and operational needs.

Embed:

  • Purpose: Cultivate a self-sustaining, data-informed mindset.

BHAG2: Deliver Sustainable, Accessible Data Products as a Single Source of Truth

  • Purpose: Create a centralised, highly accessible, and user-friendly data platform that provides accurate and consistent data across BMT, reducing silos and ensuring data reliability.
  • Scope: This BHAG involves consolidating data products into a unified data model, improving accessibility via user interfaces (e.g., myBMT), and establishing sustainability in data practices.
  • High-Level Intent: Provide a dependable, accessible “single source of truth” that enables all departments to access the data they need, fostering trust in data quality and consistency.

Start-up:

  • Purpose: Begin by identifying critical data sources and implementing basic access controls.
  • Goal: Consolidate data into a centralised repository.

Foundation:

  • Purpose: Establish data governance and data cataloguing to define and document data assets.
  • Goal: Roll out myBMT for initial access to unified data sources and set basic data quality standards.

Reporting:

  • Purpose: Provide standardised, user-friendly reports based on the centralised data.
  • Goal: Create accessible dashboards and reports, ensuring single-source, consistent reporting for operational efficiency.

Predictive:

  • Purpose: Add predictive analytics layers to data products, improving the timeliness and relevance of insights.
  • Goal: Develop models that generate predictive insights for key departments, enabling forward-looking decision-making.

Embed:

  • Purpose: Fully integrate sustainable data products as the “go-to” information source.
  • Goal: Achieve 95%+ adoption of data products across departments, reinforcing a shared, trusted source of truth.

BHAG3: Develop a Data Literacy Pathway Leading to a Wrangler Academy

  • Purpose: Foster a culture of data competency by establishing a clear pathway for data literacy and skill development, culminating in an advanced data training program known as the Wrangler Academy.
  • Scope: This includes foundational to advanced data training programs for all employees, aligned with job-specific needs and progressing to specialist tracks.
  • High-Level Intent: Equip BMT staff with the skills to understand, use, and interpret data confidently, ultimately creating a workforce that embraces data as a strategic asset.

Start-up:

  • Purpose: Raise awareness of data literacy’s importance and introduce basic data education.
  • Goal: Launch initial workshops on data fundamentals for all employees.

Foundation:

  • Purpose: Formalise the data literacy pathway with structured learning modules.
  • Goal: Create tiered literacy levels and core skills for each role (e.g., Awareness, Working, Practitioner).

Reporting:

  • Purpose: Equip employees to interpret and use standard reports effectively.
  • Goal: Provide training on data interpretation and reporting tools through foundational Wrangler Academy modules.

Predictive:

  • Purpose: Advance data skills, focusing on analytics and predictive insights for data-literate users.
  • Goal: Develop and deliver courses on predictive analytics, fostering self-service and empowered analysis among users.

Embed:

  • Purpose: Fully operationalise the Wrangler Academy, making data literacy a continuous, evolving practice.
  • Goal: Graduate 90%+ of employees to a minimum of “Working” level literacy, with specialised paths for advanced users.

BHAG4: Deliver Predictive Insights in Key Business Areas

  • Purpose: Develop and operationalise predictive analytics capabilities to provide forward-looking insights, supporting proactive decision-making in areas such as customer management, project tracking, and operational efficiency.
  • Scope: This BHAG focuses on the development of predictive models, supported by infrastructure enhancements, to deliver real-time, actionable insights.
  • High-Level Intent: Move from reactive to proactive decision-making by implementing predictive analytics, which helps anticipate challenges, optimise resource allocation, and meet strategic objectives more effectively.

Start-up:

  • Purpose: Identify core areas where predictive analytics could drive value.
  • Goal: Begin prototyping simple predictive models in selected areas (e.g., customer trends, project timelines).

Foundation:

  • Purpose: Establish a standard framework and platform for developing predictive insights.
  • Goal: Deploy initial predictive models with stakeholder input to test viability and impact.

Reporting:

  • Purpose: Enable actionable reporting that includes early predictive metrics.
  • Goal: Roll out reports that incorporate predictive elements to relevant departments, such as trend forecasting.

Predictive:

  • Purpose: Integrate predictive insights routinely across key business functions.
  • Goal: Expand predictive models to cover multiple operational areas, refining accuracy and actionable outcomes.

Embed:

  • Purpose: Make predictive insights a fundamental component of strategic planning.
  • Goal: Ensure all major departments use predictive insights as a routine part of decision-making.

BHAG5: Strengthen Data Governance and Quality to Achieve Recognised Excellence

  • Purpose: Build a robust governance framework to maintain data quality, ensure regulatory compliance, and protect sensitive information, setting the standard for data management.
  • Scope: This BHAG encompasses data governance practices, quality control processes, compliance with regulations, and security protocols.
  • High-Level Intent: Achieve excellence in data governance by ensuring BMT’s data is trustworthy, compliant, secure, and accessible only to authorised users.

Start-up:

  • Purpose: Set foundational data governance standards and appoint data stewards.
  • Goal: Establish data handling and access protocols, including initial data quality checks.

Foundation:

  • Purpose: Formalise governance policies and quality standards across departments.
  • Goal: Develop a Data Governance Framework and introduce quality assessments in critical areas.

Reporting:

  • Purpose: Ensure consistent, high-quality data supports reliable reporting.
  • Goal: Embed regular quality checks and provide reporting dashboards on data quality metrics.

Predictive:

  • Purpose: Extend governance to cover advanced analytics and machine learning models.
  • Goal: Implement governance and monitoring processes for predictive models, including data lineage and usage tracking.

Embed:

  • Purpose: Achieve industry-recognised excellence in data quality and governance.
  • Goal: Continuously maintain a high standard in data quality metrics and compliance, with certification where applicable.

Foundational Principles for Data Engineering in Support of the BHAGs

Data Engineering is a crucial enabler for BMT’s data transformation goals. The following principles define the scope and commitments of Data Engineering to support our broader strategic aims:

Conscious Design

Promote forward thinking around usability and interoperability of the data and user-centric design principles of sustainable data products

  • Usability: Making sure data is accessible and understandable for end users, reducing friction in accessing and utilising data effectively.
  • Interoperability: Ensuring that data can flow seamlessly across different systems and platforms, promoting collaboration and data integration without technical barriers.
  • User-Centric Design: Focusing on the needs and workflows of end users, tailoring data access and structures to align with how they work, ultimately boosting productivity and satisfaction.
  • Sustainability: Emphasising long-term usability and efficiency, where data products are designed not only to serve current needs but also to adapt and remain relevant as requirements evolve.

Purpose-Driven Platform:

The modern data platform is a versatile tool that supports a broad spectrum of use cases, from BI/MI reporting and self-service analytics to real-time data streaming and advanced AI capabilities. However, each use case requires focused planning, specific resources, and structured data workflows. The data platform itself is not the final solution but a foundation for delivering value through aligned people, processes, and technology.

Data Engineering Commitments:

  • Implement Robust Data Pipelines: Establish consistent data flows that connect operational systems with BI/MI systems, ensuring that data is timely, accurate, and accessible.
  • Maintain Documentation and Transparency: Create and update detailed source-to-target mappings and data lineage documentation to support transparency, data quality, and knowledge transfer.
  • Automate and Scale: Where possible, re-engineer manual workflows to achieve repeatable, scalable data processes, supporting growth without compromising data integrity.
  • Optimise ETL Performance: Write and maintain ETL scripts that perform efficiently, ensuring timely data delivery without excessive resource consumption.
  • Support BI Reusability: Design BI and analytics outputs that can be leveraged across use cases, reducing redundancy and empowering users to make data-informed decisions.

Managing Expectations:

  1. Clear Use Case Prioritisation: Each use case will be evaluated and prioritised based on alignment with strategic objectives, data readiness, and resource availability. Not all use cases can be supported simultaneously, and clear prioritisation is essential for effective delivery.
  2. Iterative Delivery: Data products and solutions will be built and refined iteratively. Early delivery will focus on foundational needs, while more complex capabilities like advanced AI and real-time analytics will follow once core processes are stable and validated.
  3. Capacity for Evolution: As new use cases and data demands emerge, the data engineering team will assess and adapt the data platform. However, changes will be managed through a structured process that balances innovation with stability.

Value Realisation Beyond the Data Warehouse:

The data platform by itself doesn’t create value—it enables it. Realising the full value requires an intersection of process, people, and technology aligned to the data model. Organisational structures, from data governance to data literacy programs, must complement data engineering to achieve the operational and strategic potential envisioned.