Lindsey Kopacz has a wonderful blog about accessibility. I’ve seen a number of her articles making the rounds lately and I was like, dang I better make sure I’m subscribed. For example:
Regarding that last one, I remember learning from Sara Soueidan that a good tip for this to position them over the new custom checkboxes and hide them via opacity instead of hiding the native checkboxes by clipping them away. That covers the scenario of people exploring a touch screen for native interactive elements.
Splash pages are a great way for you to communicate in a deeper, more personal way with your user base. In today’s business landscape, it can be difficult to attract visitors to your page over your competitor’s page. Competition is fierce, and businesses everywhere use design and marketing to create an effective message that resonates with their audience.
As you start to design your website, you might find that adding an extra layer—a splash page—can help you bridge a gap, filling the spaces for anything you feel is missing from a traditional landing page.
In some cases, a splash page can more clearly deliver a message than your homepage can. But in a world where the average attention span is lowering, you need to execute your splash page right to make it a success. Here’s what you should know:
What Is a Splash Page?
It’s important to understand that the splash page isn’t the same as yourlanding page or homepage. A landing page’s sole purpose is to act a conversion hotspot: with a landing page, you’re seeking to fulfill a goal, whether that goal is to encourage visitors to subscribe or to make a purchase.
A splash page’s purchase is to serve as a creative introduction and is much more personalized. Think of your splash page a welcome screen and teaser for users visiting your page for the first time.
This is what they see before they officially reach your landing page, and it’s a great way for you to set the mood and tone for your site.
As you start to think about how you cancreate a splash page of your own, you can take a look at how others are executing splash pages to communicate their vision and mission. Use this as inspiration for your personal creative efforts. Take a look at theseexample splash pages for some ideas.
Two Key Components
There are two key components that need to be integrated into your splash page. The first should be a clear message and purpose for the splash page. The second should be a clear exit that takes them to the actual landing page. These two simple elements are the crux of a splash page, and without both, you’ll most likely have a crappy user experience.
The text should be clear and to the point. Any visitor should be able to read the splash page and take action within just a few seconds. As such, the copy should veer on the short and snappy side. A heading and subheading should easily cover your most basic splash page needs. Graphics and images, a CTA, and bullet points are all helpful to add.
Pay Close Attention to Design
Design is one of the most important aspects of a splash page. Today’s users will spend less than four seconds deciding whether they want to engage further with a page, and your business should capture attention quickly.
Your imagery should be captivating, and your content should be equally as attention-grabbing. There are plenty of splash page templates that make creating a great design easier than ever.
When to Use a Splash Page
While splash pages can be a great feature on your site, not everyone needs them. Determining whether splash pages are for you is a great first step towards making the best decision for you and your site.
One of the best reasons for offering a splash page is if you have multiple types of experiences for the user. For example, Football.com asks visitors if they want to know more about American football or World football.
Their user experience will differ depending on the choices they make. There are other preferences that can be communicated via splash page too, such as languages or currency—ideal for businesses who service multiple worldwide locations.
You can also use a splash page for age verification purposes, which is ideal if your business is centered around delivering age-appropriate content. For example, alcohol-based businesses are required to verify age before users can learn more about the product on the homepage. And lastly, you can use a splash page as a “coming soon” banner if your website is still in its production phase.
Tracking content performance is the key to a successful campaign, but you can’t do that unless you know which metrics to track.
How do you measure whether a content piece (blog post, ebook, social media post, etc.) is meeting the goals it needs to? In order to meet these goals, you’ll need measurable indicators that can help you gauge the progress and make any necessary adjustments. These measurable indicators are known as Key Performance Indicators (KPIs).
A KPI is a…metric that helps you measure performance
A KPI is a measurement or metric that helps you measure performance (for example, of a blog post) relative to the goals you want to achieve. When setting up KPIs, it’s important to be focused and set up KPIs that directly lead to your goal.
Focusing on the wrong set of KPIs can give you an inaccurate view of how your campaigns are performing. Far too many marketers have encountered disaster because they were tracking the wrong KPIs…resulting in large amounts of wasted budget and poor results.
With the correct KPIs set, you’ll be positioned to ensure your campaigns are highly successful.
How to Choose the Correct KPIs
There’s no one-size fits all KPI – the right one depends on what you’re doing and how you’re doing it. Keep the following factors and tips in mind when you’re setting up KPIs for your content marketing campaigns:
Set Clear Business Goals
The primary function of KPIs is to help your content achieve your business goals by measuring their progress and contribution. As such, your KPIs can only work if you have clear and specific business goals that you want your content piece or campaign to achieve, such as:
Acquire new customers;
Increase ecommerce revenue;
Generate more marketing qualified leads (MQLs);
Generate more sales qualified leads (SQLs);
Generate more leads that convert into a purchase.
Understand Your Revenue Model & Sales Process
Websites typically fall into one of three broad business types: ad-driven, ecommerce, and leads-driven. This article will focus primarily on businesses who need to generate leads or drive ecommerce revenue.
If your company focuses on driving ecommerce revenue, this is usually pretty easy to track. Google Analytics and other solutions have built-in features for directly tracking ecommerce revenue.
If your company focuses on generating leads that are contacted and closed by a sales team, the picture is a little more complicated. It’s easy to track leads, but savvy marketers do much more than that – you’ll need to have a full understanding of the sales process, and how leads are tracked through each step.
For example, a professional consulting firm might have a sales cycle that looks something like this:
User reads a blog post;
User downloads an ebook or other resource;
User receives a series of emails;
User interacts with salesperson;
User receives a proposal;
User decides to purchase the consulting package offered.
Don’t Be Afraid to Set Different KPIs for Different Campaigns
Most likely, your company will have multiple sales processes, with each one being a little different depending on the type of prospect, which campaign they responded to, what you’re trying to sell to them, and so forth. You’ll likely need a slightly different set of KPIs for each sales process and/or marketing campaign you launch.
The Goal Is to Get to the Next Step
Here’s a good rule of thumb when choosing KPIs for content pieces: the purpose of each piece of content is to move the user to the next step in the sales process.
Set a KPI for each piece of content that measures its ability to get a user to the next step. Using the same example as above:
User reads a blog post; KPI is conversions to download an ebook or other resource.
User downloads an ebook or other resource; KPI is % of users who click on the CTA and contact a sales representative.
User receives a series of emails; KPI is % of users who contact a sales representative.
User interacts with salesperson; KPI is % of users who request the proposal.
User receives a proposal; KPI is the % of users who purchase the proposed solution.
User decides to purchase the consulting package offered; it’s a win!
Before you can set KPIs for a given piece of content, you need to know where in the buying process the content will interact with users, and what the next step is!
For most websites, the ultimate goal is revenue, whether it’s gained via ecommerce or via generating leads that close into sales. That’s your ultimate goal, and revenue should be the ultimate KPI you use to track the success of marketing campaigns.
But it doesn’t necessarily make sense to track each content piece’s performance based on the ultimate KPI (revenue). As mentioned above, you’ll likely have different KPIs for each step of the sales process – these are often called micro-conversions or KPIs.
But always keep an eye on how your micro-conversions relate to your ultimate goal. If you’re seeing good results achieving your micro-conversions but you’re not achieving your ultimate goal (i.e. revenue) that’s a red flag that there’s a problem with your campaign targeting or strategy.
Run Away From Vanity Metrics
Far too many marketers love to report on metrics that sound good, but don’t necessarily help you make a profit. These are ultimately vanity metrics – and you want to avoid paying too much attention to them. Here are a few popular metrics that you should usually avoid using as KPIs:
Pageviews
Site visits
Bounce rate
Time on site
Social media likes
Social media shares
How to Manage KPIs
All of your Key Performance Indicators should be objectively identified, measured, and tracked. To help with that, you can create a spreadsheet or worksheet to keep track of your KPIs for each campaign, which usually works well to track KPIs at multiple levels: overall, campaign-level, and content-level.
Don’t Forget Attribution
Because many analytics solutions are set to use a specific type of attribution (such as last-click), it’s easy to get inaccurate metrics for some points in your sales cycle.
Take this example sales cycle:
Prospect clicks on a PPC ad
Prospect downloads a free ebook
Prospect clicks a link in the ebook to purchase the full training package
In a case like this, if your analytics program uses last-click attribution, it would show 1 sale attributed to the ebook campaign link, and 0 sales attributed to the PPC ad campaign.
That’s why it’s important to understand and use different attribution models. If you’re using Google Analytics, you can view a variety of attribution models, as well as create custom attribution models to accurately track each step in your sales process.
I hate to admit it, but five or six years ago my interest in web design started to wane. Of course, owning a business meant I had to keep working, but staying motivated and offering my best thinking to clients became a daily struggle.
Looking at the web didn’t improve my motivation. Web design had stagnated, predictability had replaced creativity, and ideas seemed less important than data.
The reasons why I’d enjoyed working on the web no longer seemed relevant. Design had lost its joyfulness. Complex sets of build tools and processors had even supplanted the simple pleasure of writing HTML and CSS.
When I began working with the legendary newspaper and magazine designer Mark Porter, I became fascinated by art direction and editorial design. As someone who hadn’t studied either at art school, everything about this area of design was exciting and new. I read all the books about influential art directors I could find and started collecting magazines from the places I visited around the world.
The more inspired I became by mag- azine design, the faster my enthusiasm for web design bounced back. I wondered why many web designers think that print design is old-fashioned and irrelevant to their work. I thought about why so little of what makes print design special is being transferred to the web.
My goal became to hunt for inspiring examples of editorial design, study what makes them unique, and find ways to adapt what I’d learned to create more compelling, engaging, and imaginative designs for the web.
My bookcases are now chock full of magazine design inspiration, but my collection is still growing. I have limited space, so I’m picky about what I pick up. I buy a varied selection, and rarely collect more than one issue of the same title.
I look for exciting page layouts, inspiring typography, and innovative ways to combine text with images. When a magazine has plenty of interesting design elements, I buy it. However, if a magazine includes only a few pieces of inspiration, I admit I’m not above photographing them before putting it back on the shelf.
I buy new magazines as regularly as I can, and a week before Christmas, a few friends and I met in London. No trip to the “Smoke” is complete without a stop at Magma, and I bought several new magazines. After I explained my inspiration addition, one friend suggested I write about why I find magazine design so inspiring and how magazines influence my work.
That conversation sparked the idea for a series on making inspired design decisions. Every month, I’ll choose a publication, discuss what makes its design distinctive, and how we might learn lessons which will help us to do better work for the web.
As an enthusiastic user of HTML and CSS, I’ll also explain how to implement new ideas using the latest technologies; CSS Grid, Flexbox, and Shapes.
I’m happy to tell you that I’m inspired and motivated again to design for the web and I hope this series can inspire you too.
Andy Clarke April 2019
Avaunt Magazine: Documenting The Extraordinary
One look at me is going to tell you I’m not much of an adventurer. I don’t consider myself particularly cultured and my wife jokes regularly about what she says is my lack of style.
So what drew me to Avaunt magazine and its coverage of “adventure,” “culture,” and “style” when there are so many competing and varied magazines?
It often takes only a few page turns for me to decide if a magazine offers the inspiration I look for. Something needs to stand out in those first few seconds for me to look closer, be it an exciting page layout, an inspiring typographic treatment, or an innovative combination of images with text.
Avaunt has all of those, but what struck me most was the way its art director has used colour, layout, and type in diverse ways while maintaining a consistent feel throughout the magazine. There are distinctive design threads which run through Avaunt’s pages. The bold uses of a stencil serif and geometric sans-serif typeface are particularly striking, as is the repetition of black, white, a red which Avaunt’s designers use in a variety of ways. Many of Avaunt’s creative choices are as adventurous as the stories it tells.
Plenty of magazines devote their first few spreads to glossy advertising, and Avaunt does the same. Flipping past those ads finds Avaunt’s contents page and its fascinating four-column modular grid.
This layout keeps content ordered within spacial zones but maintains energy by making each zone a different size. This layout could be adapted to many kinds of online content and should be easy to implement using CSS Grid. I’m itching to try that out.
For sans-serif headlines, standfirsts, and other type elements which pack a punch, Avaunt uses MFred, designed initially for Elephant magazine by Matt Willey in 2011. Matt went on to art direct the launch of Avaunt and commissioned a stencil serif typeface for the magazine’s bold headlines and distinctive numerals.
Avaunt Stencil was designed in 2014 by London based studio A2-TYPE who have since made it available to license. There are many stencil fonts available, but it can be tricky to find one which combines boldness and elegance — looking for a stencil serif hosted on Google Fonts? Stardos would be a good choice for display size type. Need something more unique, try Caslon Stencil from URW.
Avaunt’s use of a modular grid doesn’t end with the contents page and is the basis for a spread on Moscow’s Polytechnic Museum of Cold War curiosities which first drew me to the magazine. This spread uses a three-column modular grid and spacial zones of various sizes.
What fascinates me about this Cold War spread is how modules in the verso page combine to form a single column for text content. Even with this column, the proportions of the module grid still inform the position and size of the elements inside.
While the design of many of Avaunt’s pages is devoted to a fabulous reading experience, many others push the grid and pull their foundation typography styles in different directions. White text on dark backgrounds, brightly coloured spreads where objects are cut away to blend with the background. Giant initial caps which fill the width of a column, and large stencilled drop caps which dominate the page.
Avaunt’s playful designs add interest, and the arrangement of pages creates a rhythm which I very rarely see online. These variations in design are held together by the consistent use of Antwerp — also designed by A2-TYPE — as a typeface for running text, and a black, white, and red colour theme which runs throughout the magazine.
Studying the design of Avaunt magazine can teach and inspire. How a modular grid can help structure content in creative ways without it feeling static. (I’ll teach you more about modular grids later.)
How a well-defined set of styles can become the foundation for distinctive and diverse designs, and finally how creating a rhythm throughout a series of pages can help readers stay engaged.
Next time you’re passing your nearest magazine store, pop in a pick up a copy of Avaunt Magazine. It’s about adventure, but I bet it can help inspire your designs to be more adventurous too.
Say Hello To Skinny Columns
For what feels like an eternity, there’s been very little innovation in grid design for the web. I had hoped the challenges of responsive design would result in creative approaches to layout, but sadly the opposite seems to be true.
Instead of original grid designs, one, two, three, or four block arrangements of content became the norm. Framework grids, like those included with Bootstrap, remain the starting point for many designers, whether they use those frameworks or not.
It’s true that there’s more to why so much of the web looks the same as web designers using the same grid. After all, there have been similar conventions for magazines and newspapers for decades, but somehow magazines haven’t lost their personality in the way many websites have.
I’m always searching for layout inspiration and magazines are a rich source. Reading Avaunt reminded me of a technique I came across years ago but hadn’t tried. This technique adds one extra narrow column to an otherwise conventional column grid. In print design, this narrow column is often referred to as a “bastard column or measure” and describes a block of content which doesn’t conform to the rest of a grid. (This being a family friendly publication, I’ll call it a “skinny column.”)
In these first examples, squeezing an image into one column reduces its visual weight and upsets the balance of my composition. Making the image fill two standard columns also upsets that delicate balance.
Splitting the final column, then adding half its width to another, creates the perfect space for my image, and a more pleasing overall result.
I might use a skinny column to inform the width of design elements. This Mini Cooper logo matches the width of my skinny column, and its size feels balanced with the rest of my composition.
Sometimes, content won’t fit into a single column comfortably, but by combining the widths of standard and skinny columns, I create more space and a better measure for running text. I can place a skinny column anywhere within a layout to wherever I need my content.
An empty skinny column adds whitespace which allows the eye to roam around a design. The asymmetry created by placing a skinny column between two standard columns also makes a structured layout feel more dynamic and energetic.
Another empty skinny column carves a wide gutter into this design and confines my running text to a single column, so that its height reflects the image’s vertical format. I can also use a skinny column to turn typographic elements into exciting design elements.
Developing With Skinny Columns
Designs like these are surprisingly simple to implement using today’s CSS. I need just four structural elements; a logo, header, figure, plus an article to contain my running text:
I start with a design for medium size screens by applying CSS Grid to the body element within my first media query. At this size, I don’t need a skinny column so instead am developing a symmetrical three-column grid which expands evenly to fill the viewport width:
@media screen and (min-width : 48em) {
body {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-column-gap: 2vw; }
}
I use line numbers to place items into my grid columns and rows. I place my logo into the skinny first column and the first row using a substring matching attribute selector. This targets an image with “logo” anywhere in its source value:
[src*="logo"] {
grid-column: 1;
grid-row: 1; }
Next, I place the header element — containing my headline and standfirst paragraph — into the second row. Using line numbers from 1 to -1 spreads this header across all columns:
header {
grid-column: 1 / -1;
grid-row: 2; }
With display:grid; applied, all direct descendants of a grid-container become grid-items, which I can place using areas, line numbers, or names.
This design includes a figure element with a large Mini image, plus caption text about the original Cooper model design. This figure is crucial because it describes a relationship between the img and figcaption. However, while this figure makes my markup more meaningful, I lose the ability to place the img and figcaption using CSS Grid, because by neither are direct descendants of the body where I defined my grid.
Luckily, there’s a CSS property which — when used thoughtfully — can overcome this problem. I don’t need to style the figure, I only need to style its img and figcaption. By applying display:contents; to my figure, I effectively remove it from the DOM for styling purposes, so its descendants take its place:
figure {
display: contents; }
It’s worth noting that although display effectively removes my figure from the DOM for styling purposes, any properties which inherit — including font sizes and styles — are still inherited:
It’s time to implement a design which includes a skinny column for larger screens. I use a media query to isolate these new styles, then I create a five-column grid which starts with a 1fr wide skinny column:
@media screen and (min-width : 64em) {
body {
grid-template-columns: 1fr repeat(4, 2fr); }
}
Then I add values to reposition the header, img and figcaption, and article, remembering to reset the column-count to match its new width:
Radically changing how a design looks using CSS alone, without making changes to the structure of HTML makes me smile, even after almost two decades. I also smile when I change the composition to create a dramatically different layout without changing the grid. For this alternative design, I’m aiming for a more structured look.
To improve the readability of my running text, I divide into three columns. Then, to separate this block of content from other text elements, I place my skinny column between the first two standard columns. There’s no need to change the structure of my HTML. All I need are minor changes to grid values in my stylesheet. This time, my 1fr wide skinny column value comes between two standard column widths:
@media screen and (min-width : 64em) {
body {
grid-template-columns: 2fr 1fr 2fr 2fr 2fr; }
}
I place my header in the second row and the article in a row directly underneath:
Because neither the img and figcaption are direct descendants of the body element where I defined my grid, to place them I need the display:contents; property again:
Depending on how you use them, introducing skinny columns into your designs can make content more readable or transform a static layout into one which feels dynamic and energetic.
Skinny columns are just one example of learning a technique from print and using it to improve a design for the web. I was itching to try out skinny columns and I haven’t been disappointed.
Adding a skinny column to your designs can often be an inspired decision. It gives you extra flexibility and can transform an otherwise static layout into one which is filled with energy.
Designing Modular Grids
Avaunt magazine contains plenty of inspiring layouts, but I want to focus on two pages in particular. This spread contains ‘Cold War Design’ objects within a design which could be applied to a wide variety of content types.
On first glance, modular grids can look complicated, however, they’re easy to work with. It surprises me that so few web designers use them. I want to change that.
When you use modular grids thoughtfully, they can fill your designs with energy. They’re excellent for bringing order to large amounts of varied content, but can also create visually appealing layouts when there’s very little content.
For this design — inspired by Avaunt — I base my modular grid on six symmetrical columns and four evenly spaced rows. Grid modules define the placement and size of my content.
I bind several modules together to create spacial zones for large images and running text in a single-column on the left. Boundary lines help emphasise the visual structure of the page.
This type of layout might seem complicated at first, but in reality, it’s beautifully simple to implement. Instead of basing my markup on the visual layout, I start by using the most appropriate elements to describe my content. In the past, I would’ve used table elements to implement modular grids. Fast forward a few years, and divisions replaced those table cells. Incredibly, now I need just two structural HTML elements to accomplish this design; one article followed by an ordered list:
<body>
<article>…</article>
<ol>…</ol>
</body>
That article contains a headline, paragraphs, and a
table for tabular information:
The modular grid of Mini blueprints is the most complicated visual aspect of my design, but the markup which describes it is simple. The blueprints are in date order, so an ordered list seems the most appropriate HTML element:
My HTML weighs in at only 2Kb and is under sixty lines. It’s a good idea to validate that markup as a little time spent validating early will save plenty more time on debugging CSS later. I also open the unstyled page in a browser as I always need to ensure my content’s accessible without a stylesheet.
I begin developing a symmetrical three-column layout for medium size screens by isolating grid styles using a media query:
@media screen and (min-width : 48em) {
body {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-column-gap: 2vw; }
}
The article and ordered list are the only direct descendants of body, but it’s what they contain which I want to place as grid-items. I use display:contents; to enable me to place their contents anywhere on my grid:
article, ol {
display: contents; }
Every element in my article should span all three columns, so I place them using line numbers, starting with the first line (1), and ending with the final line (-1):
The items in my ordered list are evenly placed into the three-column grid grid. However, my design demands that some items span two columns and one spans two rows. nth-of-type selectors are perfect tools for targetting elements without resorting to adding classes into my markup. I use them, the span keyword, and the quantity of columns or rows I want the items to span:
Previewing my design in a browser, I can see it’s not appearing precisely as planned because some grid modules are empty. By default, the normal flow of any document arranges elements from left to right and top to bottom, just like western languages. When elements don’t fit the space available in a grid, the CSS Grid placement algorithm leaves spaces empty and places elements on the following line.
I can override the algorithm’s default by applying the grid-auto-flow property and a value of dense to my grid-container, in this case the body:
body {
grid-auto-flow: dense; }
Row is the default grid-auto-flow value, but you can also choose column, column dense, and row dense. Use grid-auto-flow wisely because a browser fills any empty module with the next element in the document flow which can fit into that space. This behaviour changes the visual order without altering the source which may have implications for accessibility.
My medium size design now looks just like I’d planned, so now it’s time to adapt it for larger screens. I need to make only minor changes to the grid styles to first turn my article into a sidebar — which spans the full height of my layout — then place specific list items into modules on a larger six-column grid:
Keeping track of grid placement lines can sometimes be difficult, but fortunately, CSS Grid offers more than one way to accomplish a modular grid design. Using grid-template-areas is an alternative approach and one I feel doesn’t get enough attention.
Using grid-template-areas, I first define each module by giving it a name, then place elements into either one module or several adjacent modules known as spacial zones. This process may sound complicated, but it’s actually one of the easiest and most obvious ways to use CSS Grid.
I give each element a grid-area value to place it in my grid, starting with the logo and article:
Next, I assign a grid-area to each of my list items. I chose a simple i+n value, but could choose any value including words or even letters like a, b, c, or d.
My grid has six explicit columns, and four implicit rows, the height of which are being defined by the height of the content inside them. I draw my grid in CSS using the grid-template-areas property, where each period (.) represents a grid module:
Then, I place elements into that grid using the grid-area values I defined earlier. If I repeat values across multiple adjacent modules — across either columns or rows — that element expands to create a spacial zone. Leaving a period (.) creates an empty module:
In every example so far, I isolated layout styles for different screen sizes using media query breakpoints. This technique has become the standard way of dealing with the complexities of responsive web design. However, there’s a technique for developing responsive modular grids without using media queries. This technique takes advantage of a browser’s ability to reflow content.
Before going further, it’s worth remembering that my design requires just two structural HTML elements; one ordered list for the content and an article which I transform into a sidebar when there’s enough width available for both elements to stand side-by-side. When there’s insufficient width, those elements stack vertically in the order of the content:
<body>
<article>…</article>
<ol>…</ol>
</body>
The ordered list forms the most important part of my design and should always occupy a minimum 60% of a viewport’s width. To ensure this happens, I use a min-width declaration:
ol {
min-width: 60%; }
While I normally recommend using CSS Grid for overall page layout and Flexbox for flexible components, to implement this design I turn that advice on its head.
I make the body element into a flex-container, then ensure my article grows to fill all the horizontal space by using the flex-grow property with a value of 1:
body {
display: flex; }
article {
flex-grow: 1; }
To make sure my ordered list also occupies all available space whenever the two elements stand side-by-side, I give it a ridiculously high flex-grow value of 999:
article {
flex-grow: 999; }
Using flex-basis provides an ideal starting width for the article. By setting the flex container’s wrapping to wrap, I ensure the two elements stack when the list’s minimum width is reached, and there’s insufficient space for them to stand side-by-side:
body {
flex-wrap: wrap; }
article {
flex-basis: 20rem; }
I want to create a flexible modular grid which allows for any number of modules. Rather than specifying the number of columns or rows, using repeat allows a browser to create as many modules as it needs. autofill fills all available space, wrapping the content where necessary. minmax gives each module a minimum and maximum width, in this case 10rem and 1fr:
ol {
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); grid-column-gap: 2vw; }
To avoid modules staying empty, I use grid-auto-flow again with a value of dense. The browser’s algorithm will reflows my content to fill any empty modules:
ol {
grid-auto-flow: dense; }
Just like before, some list items span two columns, and one spans two rows. Again, I use nth-of-type selectors to target specific list items, then grid-column or grid-row with the span keyword followed by the number of columns or rows I want to span:
This simple CSS creates a responsive design which adapts to its environment without needing multiple media queries or separate sets of styles.
By using of modern CSS including Grid and Flexbox, relying on browsers’ ability to reflow content, plus a few smart choices on minimum and maximum sizes, this approach comes closest to achieving the goals of a truly responsive web.
It was almost uncanny to think how Wikipedia shifted from a mere online encyclopedic platform to a website where businesses, brands, and individuals seek recognition and notability from audiences across the globe.
However, with the competition on the rise on a worldwide scale, businesses have been facing probable issues in outweighing their current competitors. Probably the only relevant way is to seek professional help for creating their Wikipedia profiles since Wikipedia itself has strict guidelines to follow. Those pages that do not comply with the guidelines result in the deletion and at times, even permanent bans. To someone who is eager to acquire a presence and a renowned name, a permanent ban is surely not a good sign.
For that very same reason, Wikipedia page creation has now become a part of writing and content creation services and many agencies are steadfast in providing these page creation services to global clients.
Now that you have clearly understood the importance of a Wikipedia page and all the reasons to have one, here are the top 10 Wikipedia page creation agencies that can assist you in enhancing your online presence.
Wiki Management Inc. has proved itself a visionary amongst the existing Wikipedia writing agencies. Most notable individuals and businesses that want to earn online recognition but without resorting to digital marketing and branding campaigns prefer having a Wikipedia page the most. This Wikipedia agency has gained the proficiency to assist those who seek online visibility through the creation of quality content for their Wiki pages. Both the writers and editors at Wiki Management Inc. also possess the talent to follow SEO techniques to bring readability and build an online reputation for their clients.
With the competition on the rise, businesses and individuals have been looking for ways to earn better visibility and recognition. The most feasible and cost-effective solution to overcome this dilemma is to acquire a Wikipedia page dedicated to you or your brand. For that reason, writing and editing agencies such as Wiki Page Creators have emerged. The services most of these companies offer are somewhat similar as you can either get a draft written from scratch or you can send brief project details which the writers will edit and formulate themselves. Those who want already have a page but want to translate it can also contact the agency and get it done.
Just as any other Wikipedia page creation agency, Wiki Editors has almost a similar set of services to offer to its clients. However, the core of their services includes not only the creation of a quality Wikipedia page but also the inclusion of relevant keywords to improve your search engine rankings across popular search engines. The domain authority of Wikipedia itself is very high so those who want a Wikipedia page can get it done from professional writers at Wiki Editors since the agency is currently offerings discount offers and coupons as well.
One of the main reasons to have a Wikipedia page is to acquire a visible brand or individual presence to your name. While the Wikipedia platform has strict guidelines to follow, only those who are professional writers can help the ones in need of a page. Wiki Contributors has also influenced the domain of Wikipedia page writing to a completely new extent. From the creation of page drafts to page editing and altering, Wikipedia Contributors has made sure to encompass every Wikipedia related service and solution at its core.
Qualified Wikipedia writers are a rare find, for those, who are seeking to get exceptional, and worthwhile Wikipedia pages approach Wiki Consultant. It is quite astonishing how there has been a spontaneous upsurge in the popularity of Wikipedia for branding and marketing purposes. Every Wikipedia page creation agency has been steadfast in providing page creation and editing solutions so Wiki Consultant simply contributed to it. The agency is currently having a 70% discount offer so if you believe you are eligible for a page; you can get in touch with them to guide you further.
Businesses are facing difficulties in gaining notability but Wikipedia page creation platforms such as The Wiki Agency exist that have been helping businesses with their esteemed page creation services over the years. One cannot rely on the credibility of any random writer or writing agency but The Wiki Agency has proven its worth and reliability by following the current and upcoming strategies of SEO, community management and factors required for building better domain authority for its clients.
Years of notable experience has given Get on Wiki the privilege to deem itself as a premier agency for Wikipedia writing. Their services are not limited to making and altering content for existing pages, as they also comprise of SEO consultants and agents that incorporate the existing SEO strategies into the content of the pages they make. The writers at Get on Wiki do not commence with a page’s creation without performing adequate research and assessment beforehand. So, if you are eager to have a page and you are skeptical about a specific writing agency then Get on Wiki will not overlook any of your content requirements and queries.
Creating a Wikipedia page from scratch all by yourself is an arduous and time-consuming task. For that reason, the only possible solution is to let a team of professionals does it since making and drafting Wikipedia pages is not the task for a single person. From the curation of creative content to finalizing the final draft, a lot has to be taken care of. Pro Wiki Makers has claimed itself to promise excellence and exceptional page creation solutions for Wikipedia and that is exactly what they do. The client simply has to send a shot brief of their requirements, as per the guidelines at Pro Wiki Makers and their writers will formulate the content in a remarkable manner.
Wiki page creation might sound easy to some but it only dedicated and proficient writers possess the talent to curate quality searchable content. The writers at Guru Wiki Creators have completely indulged themselves in the countless of benefits Wikipedia has compiled for authors, musicians, celebrities and even businesses. Not every notable person and brand has the resources for turning their profiles into a full-fledged profile so that is where Guru Wiki Creators enters the big picture. With their proficiency in professional writing and compilation of searchable content, this Wikipedia writing agency has earned a well-deserved name and position amongst its clients.
It makes sense to seek professional and trustworthy services for creating a Wikipedia page and that is what The Wiki Writers agency ensures in the utmost manner possible. What makes them reliable is the fact that their strategists, writers, and editors hold the potential and qualification for coming up with content that is not promotional in nature and yet it yields their clients with traffic towards their business. You do not have to face the challenges in making your own Wikipedia page, as The Wiki Writers are there to assist you with it.
Do you remember those animated films such as Bob the Builder and Toy Story in which non-living beings, or basically “things” talk to each other?
Well, that has started turning into a reality now.
No, they have not started making machines with mouths to utter words, at least not yet. But what these modern machines are actually using to communicate with each other is a technology called the Internet of things (IoT).
Almost everybody has heard about this technology and its applications. From connected cars to home appliances and from smart clothes to fitness trackers, the popularity of IoT cannot be ignored. But most of the eye-catching implementations of this technology are generally assumed to be existing in the consumer market. The under-attended fact related to this technology is that IoT can be useful for other businesses too, or maybe your venture also.
And if your business has an already existing enterprise mobile app, then it will act as a cherry on the cake. The combination of IoT and a mobile app can open those doors for your organization that you weren’t even thinking about knocking on. And to know how this combo can help your company, kindly pay attention to the following points:
1- Smart Offices
The most talked about feature of IoT is its ability to sense and adjust your surroundings according to you. It can provide you with the benefits of suitable lighting and temperature with the help of a smartphone. The companies are trying to make products which will not only give you a productive atmosphere but also save energy in your office spaces.
Lifx, a company which sells smart lights, can install an app-controlled lighting system in your office. These lights can also communicate with other technologies like smart security alarms and adjust the brightness of the space accordingly. Comfy is another company which can create a comfortable environment in your office by managing the temperature. And fortunately, a mobile app can control your HVAC settings in this case. These apps also provide you with the dashboard, which helps you track and monitor energy usage. Therefore, this technology is helping the environment too.
2- Safer Logistics
IoT is making the world more secure by providing smart security solutions. It helps in keeping track of the consignments and cargo, which has to be delivered in the required quantity to your customers. Thefts amidst the transportation can severely affect both reputation and revenue of your business.
A Texas-based company, Nuve, is involved in implementing IoT in the logistics area. They use advanced cameras and sensors for vehicle tracking. The trailers can be monitored from anywhere and at any time using a mobile app. It can also significantly reduce the losses incurred to the transportation businesses due to fuel thefts and late deliveries, as claimed by the company.
3- Digital Transactions
It is not always possible for some businesses to receive online payments. Industries like retail, transportation, and banking involve millions of small cash transactions. And the biggest drawback of some of these transactions is that the two parties have to be physically nearby. But with the IoT, even these transactions can be made digital. The parties have to share the same room and open their mobile apps to execute the payment.
A company named ProxToMe has mastered the art of converting close offline objects into digital mediums. Whether it is about withdrawing cash from the ATMs without using plastic cards or it is about transforming the receipt printers into smart devices, this company uses cloud computing and IoT to provide enhanced security to all of your transactions.
4- Intelligent office furniture
Your traditional office furniture may have been ruining the health of your employees for many years. The standard sizes of desks and chairs make them mold their bodies to fit in. IoT has solved this problem already. Now your employees will be able to control the settings of your office furniture.
Companies like Stirworks are making smart and healthy office furniture for your workforce. Now they can adjust the furniture settings according to their own needs with their next generation desks using a mobile app. This intelligent furniture will not only provide comfort to them but also engage them in their work.
Data Management
Like the startups and companies as mentioned earlier, if you also have a business idea related to IoT, then you need to collect and manage your data. Don’t worry! Other companies are ready to do it for you. The sensors involved in your business need to talk to your computer to give you useful insights. For that, these companies are all geared up to provide you full proof solution corresponding to data visualizations and management.
TempoIQ is one such company which can give wings to your IoT business idea. This company provides you with products which can connect any “thing” with a flexible data model, collect data, perform analytics, draw useful insights, give real-time alerts, host mobile application and provide cloud computing. Hence, it can turn your IoT imagination into reality.
Summary and Conclusion
So we saw how new companies and startups have all buckled up to provide IoT and mobile app development solutions to other businesses. From creating smart offices to perform digital transactions, you can do it all using IoT. These IoT products will not only reduce your costs in the long run but will also make your business operations more efficient.
IoT is the future, but its application depends on your business. There are always some functional areas which require improvements. Just check if any problem can be solved using IoT in your organization. Successful and long-lasting companies are those who are quick to accept the change. So, if you want your enterprise to be one step ahead technologically, then don’t forget to think about this deadly duo of mobile app and IoT.
That HTML ends up in the DOM that way (and thus how it is is exposed to assistive technology), and by default, those list items are also visually shown in that order. In most layout situations, the visual order will match that DOM order. Do nothing, and the list items will flow in the block direction of the document. Apply flexbox, and it will flow in the inline direction of the document.
But flexbox and grid also allow you to muck it up. Now take this:
ol {
display: flex;
flex-direction: row-reverse;
}
In this case, the DOM order still makes sense, but the visual order is all wrong. It’s not just row-reverse. There are a number of flexbox and grid properties that can get involved and confuse things: the order property, flowing items into columns instead of rows, and positioning items specifically in unusual orders, among others. Even absolute positioning could cause the same trouble.
If the visual order and the DOM order don’t match, it can irritate and confuse users up to a point where the experience is so bad that the site is unusable.
I think this is something we sorely need to address at a CSS level. We need to provide a way to allow the tab and reading order to follow the visual order. Source order is a good default, if you are taking advantage of normal flow, a lot of the time following the source is exactly what you want. However not always, not at every breakpoint. If we don’t give people a solution for this, we will end up with a mess. We’ve given people these great tools, and now I feel as if I’m having to tell people not to use them.
End-to-end tests are written to assert the flow of an application from start to finish. Instead of handling the tests yourself — you know, manually clicking all over the application — you can write a test that runs as you build the application. That’s what we call continuous integration and it’s a beautiful thing. Write some code, save it, and let tooling do the dirty work of making sure it doesn’t break anything.
>Cypress is just one end-to-end testing framework that does all that clicking work for us and that’s what we’re going to look at in this post. It’s really for any modern JavaScript library, but we’re going to integrate it with React in the examples.
Let’s set up an app to test
In this tutorial, we will write tests to cover a todo application I’ve built. You can clone the repository to follow along as we plug it into Cypress.
Navigate into the application, and install the dependencies:
cd cypress-react-tutorial
yarn install
Cypress isn’t part of the dependencies, but you can install it by running this:
yarn add cypress --dev
Now, run this command to open Cypress:
node_modules/.bin/cypress open
Typing that command to the terminal over and over can get exhausting, but you can add this script to the package.json file in the project root:
"cypress": "cypress open"
Now, all you have to do is do npm run cypress once and Cypress will be standing by at all times. To have a feel of what the application we’ll be testing looks like, you can start the React application by running yarn start.
We will start by writing a test to confirm that Cypress works. In the cypress/integration folder, create a new file called init.spec.js. The test asserts that true is equal to true. We only need it to confirm that’s working to ensure that Cypress is up and running for the entire application.
You should have a list of tests open. Go there and select init.spec.js.
That should cause the test to run and pop up a screen that shows the test passing.
While we’re still in init.spec.js, let’s add a test to assert that we can visit the app by hitting http://localhost:3000 in the browser. This’ll make sure the app itself is running.
it('visits the app', () => {
cy.visit('http://localhost:3000')
})
We call the method visit() and we pass it the URL of the app. We have access to a global object called cy for calling the methods available to us on Cypress.
To avoid having to write the URL time and again, we can set a base URL that can be used throughout the tests we write. Open the cypress.json file in the home directory of the application and add define the URL there:
{
"baseUrl": "http://localhost:3000"
}
You can change the test block to look like this:
it('visits the app', () => {
cy.visit('/')
})
…and the test should continue to pass. ?
Testing form controls and inputs
The test we’ll be writing will cover how users interact with the todo application. For example, we want to ensure the input is in focus when the app loads so users can start entering tasks immediately. We also want to ensure that there’s a default task in there so the list is not empty by default. When there are no tasks, we want to show text that tells the user as much.
To get started, go ahead and create a new file in the integration folder called form.spec.js. The name of the file isn’t all that important. We’re prepending “form” because what we’re testing is ultimately a form input. You may want to call it something different depending on how you plan on organizing tests.
The beforeEach block is used to avoid unnecessary repetition. For each block of test, we need to visit the application. It would be redundant to repeat that line each time beforeEach ensures Cypress visits the application in each case.
For the test, let’s check that the DOM element in focus when application first loads has a class of form-control. If you check the source file, you will see that the input element has a class called form-control set to it, and we have autoFocus as one of the element attributes:
<input
type="text"
autoFocus
value={this.state.item}
onChange={this.handleInputChange}
placeholder="Enter a task"
className="form-control"
/>
When you save that, go back to the test screen and select form.spec.js to run the test.
The next thing we’ll do is test whether a user can successfully enter a value into the input field.
We’ve added some text (“Learn about Cypress”) to the input. Then we make use of cy.get to obtain the DOM element with the form-control class name. We could also do something like cy.get('input') and get the same result. After getting the element, cy.type() is used to enter the value we assigned to the input, then we assert that the DOM element with class form-control has a value that matches the value of input.
In other words:
Our application should also have two todos that have been created by default when the app runs. It’s important we have a test that checks that they are indeed listed.
What do we want? In our code, we are making use of the list item (
) element to display tasks as items in a list. Since we have two items listed by default, it means that the list should have a length of two at start. So, the test will look something like this:
it('displays list of todo', () => {
cy.get('li')
.should('have.length', 2)
})
Oh! And what would this app be if a user was unable to add a new task to the list? We’d better test that as well.
it('adds a new todo', () => {
const input = "Learn about cypress"
cy.get('.form-control')
.type(input)
.type('{enter}')
.get('li')
.should('have.length', 3)
})
This looks similar to what we wrote in the last two tests. We obtain the input and simulate typing a value into it. Then, we simulate submitting a task that should update the state of the application, thereby increasing the length from 2 to 3. So, really, we can build off of what we already have!
Changing the value from three to two will cause the test to fail — that’s what we’d expect because the list should have two tasks by default and submitting once should produce a total of three.
You might be wondering what would happen if the user deletes either (or both) of the default tasks before attempting to submit a new task. Well, we could write a test for that as well, but we’re not making that assumption in this example since we only want to confirm that tasks can be submitted. This is an easy way for us to test the basic submitting functionality as we develop and we can account for advanced/edge cases later.
The last feature we need to test is the deleting tasks. First, we want to delete one of the default task items and then see if there is one remaining once the deletion happens. It’s the same sort of deal as before, but we should expect one item left in the list instead of the three we expected when adding a new task to the list.
OK, so what happens if we delete both of the default tasks in the list and the list is completely empty? Let’s say we want to display this text when no more items are in the list: “All of your tasks are complete. Nicely done!”
This isn’t too different from what we have done before. You can try it out first then come back to see the code for it.
it.only('deletes all todo', () => {
cy.get('li')
.first()
.find('.btn-danger')
.click()
.get('li')
.first()
.find('.btn-danger')
.click()
.get('.no-task')
.should('have.text', 'All of your tasks are complete. Nicely done!')
})
Both tests look similar: we get the list item element, target the first one, and make use of cy.find() to look for the DOM element with a btn-danger class name (which, again, is a totally arbitrary class name for the delete button in this example app). We simulate a click event on the element to delete the task item.
Testing network requests
Network requests are kind of a big deal because that’s often the source of data used in an application. Say we have a component in our app that makes a request to the server to obtain data which will be displayed to user. Let’s say the component markup looks like this:
The benefit of testing the server (as opposed to stubbing it) is that we are certain the response we get is the same as that which a user will get. To learn more about network requests and how you can stub network requests, see this page in the Cypress documentation.
Running tests from the command line
Cypress tests can run from the terminal without the provided UI:
./node_modules/.bin/cypress run
…or
npx cypress run
Let’s run the form tests we wrote:
npx cypress run --record --spec "cypress/integration/form.spec.js"
Terminal should output the results right there with a summary of what was tested.
Tests are something that either gets people excited or scared, depending on who you talk to. Hopefully what we’ve looked at in this post gets everyone excited about implementing tests in an application and shows how relatively straightforward it can be. Cypress is an excellent tool and one I’ve found myself reaching for in my own work, but there are others as well. Regardless of what tool you use (and how you feel about tests), hopefully you see the benefits of testing and are more compelled to give them a try.
A ‘code review’ is a moment in the development process in which you (as a developer) and your colleagues work together and look for bugs within a recent piece of code before it gets released. In such a moment, you can be either the code author or one of the reviewers.
When doing a code review, you might not be sure of what you are looking for. On the other side, when submitting a code review, you might not know what to wait for. This lack of empathy and wrong expectations between the two sides can trigger unfortunate situations and rush the process until it ends in an unpleasant experience for both sides.
In this article, I’ll share how this outcome can be changed by changing your mindset during a code review:
Before we start, it’s fundamental to understand the value of why code needs to be reviewed. Knowledge sharing and team cohesion are beneficial to everyone, however, if done with a poor mindset, a code review can be a huge time consumer with unpleasant outcomes.
The team attitude and behavior should embrace the value of a nonjudgmental collaboration, with the common goal of learning and sharing — regardless of someone else’s experience.
Include Code Reviews In Your Estimations
A complete code review takes time. If a change took one week to be made, don’t expect the code review to take less than a day. It just doesn’t work like that. Don’t try to rush a code review nor look at it as a bottleneck.
Code reviews are as important as writing the actual code. As a team, remember to include code reviews in your workflow and set expectations about how long a code review might take, so everyone is synced and confident about their work.
Save Time With Guidelines And Automatization
An effective way to guarantee consistent contributions is to integrate a Pull Request template in the project. This will help the author to submit a healthy PR with a complete description. A PR description should explain what’s the change purpose, the reason behind it, and how to reproduce it. Screenshots and reference links (Git issue, design file, and so on) are the final touches for a self-explanatory submission.
Doing all of this will prevent early comments from reviewers asking for more details. Another way of making code reviews seem less nitpicky is to use linters to find code formatting and code-quality issues before a reviewer even gets involved. Whenever you see a repetitive comment during the review process, look for ways to minimize it (being with better guidelines or code automatization).
Stay A Student
the amateur is defensive, the professional finds
Anyone can do a code review, and everyone must receive a code review — no matter the seniority level. Receive any feedback gratefully as an opportunity to learn and to share knowledge. Look at any feedback as an open discussion rather than a defensive reaction. As Ryan Holiday says:
“An amateur is defensive. The professional finds learning (and even, occasionally, being shown up) to be enjoyable; they like being challenged and humbled, and engage in education as an ongoing and endless process.”
In my opinion, picking the reviewers is one of the most important decisions for an effective and healthy code review as a team.
Let’s say your colleague is submitting a code review and decides to tag “everyone” because, unconsciously, she/he might want to speed up the process, deliver the best code possible or making sure everyone knows about the code change. Each one of the reviewers receives a notification, then opens the PR link and sees a lot of people tagged as reviewers. The thought of “someone else will do it” pops up in their minds, leading to ignore the code review and close the link.
Since nobody started the review yet, your colleague will remind each one of the reviewers to do it, i.e. creating pressure on them. Once the reviewers start to do it, the review process takes forever because everyone has their own opinion and it’s a nightmare to reach a common agreement. Meanwhile, whoever decided to not review the code, is then spammed with zillions of e-mail notifications with all of the review comments, thus creating noise in their productivity.
This is something I see happening more than I’d like: Pull Requests with a bunch of people tagged as reviewers and ending, ironically, in a non-productive code review.
There are some common effective flows when selecting the reviewers: A possible flow is to pick two to three colleagues who are familiar with the code and ask them to be reviewers. Another approach, explained by Gitlab team is to have a chained review flow in which the author picks one reviewer who picks another reviewer until at least two reviewers agree with the code. Regardless of the flow you choose, avoid having too many reviewers. Being able to trust your colleagues’ code’s judgment is the key to conduct an effective and healthy code review.
Have Empathy
Spotting pieces of code to improve is just a part of a successful code review. Just as important is to communicate that feedback in a healthy way by showing empathy towards your colleagues.
Before writing a comment, remember to put yourself in the other people’s shoes. It’s easy to be misunderstood when writing, so review your own words before sending them. Even if a conversation starts being ugly, don’t let it affect you — always stay respectful. Speaking well to others is never a bad decision.
Know How To Compromise
When a discussion isn’t solved quickly, take it to a personal call or chat. Analyze together if it’s a subject worth paralyzing the current change request or if it can be addressed in another one.
Be flexible but pragmatic and know how to balance efficiency (delivering) and effectiveness (quality). It’s a compromise to be made as a team. In these moments I like to think of a code review as an iteration rather than a final solution. There’s always room for improvement in the next round.
In-Person Code Reviews
Gathering the author and the reviewer together in a pair programming style can be highly effective. Personally, I prefer this approach when the code review involves complex changes or there’s an opportunity for a large amount of knowledge sharing. Despite this being an offline code review, it’s a good habit to leave online comments about the discussions taken, especially when changes need to be made after the meeting. This is also useful to keep other online reviewers up to date.
Learn From Code Review Outcomes
When a code review has suffered a lot of changes, took too long or has already had too many discussions, gather your team together and analyze the causes and which actions can be taken from it. When the code review is complex, splitting a future task into smaller tasks makes each code review easier.
When the experience gap is big, adopting pair programming is a strategy with incredible results — not only for knowledge sharing but also for off-line collaboration and communication. Whatever the outcome, always aim for a healthy dynamic team with clear expectations.
? As An Author
One of the main concerns when working on a code review as an author is to minimize the reviewer’s surprise when reading the code for the first time. That’s the first step to a predictable and smooth code review. Here’s how you can do it.
Establish Early Communication
It’s never a bad idea to talk with your future reviewers before coding too much. Whenever it’s an internal or external contribution, you could do a refinement together or a little bit of pair programming at the beginning of the development to discuss solutions.
There’s nothing wrong in asking for help as a first step. In fact, working together outside the review is a first important step to prevent early mistakes and guarantee an initial agreement. At the same time, your reviewers get aware of a future code review to be made.
Follow The Guidelines
When submitting a Pull Request to be reviewed, remember to add a description and to follow the guidelines. This will save the reviewers from spending time to understand the context of the new code. Even if your reviewers already know what it is about, you can also take this opportunity as a way to improve your writing and communication skills.
Be Your First Reviewer
Seeing your own code in a different context allows you to find things you would miss in your code editor. Do a code review of your own code before asking your colleagues. Have a reviewer mindset and really go through every line of code.
Personally, I like to annotate my own code reviews to better guide my reviewers. The goal here is to prevent comments related to a possible lack of attention and making sure you followed the contribution guidelines. Aim to submit a code review just as you would like to receive one.
Be Patient
After submitting a code review, don’t jump right into a new private message asking your reviewers to “take a look, it only takes a few minutes” and indirectly craving for that thumbs-up emoji. Trying to rush your colleagues to do their work is not a healthy mindset. Instead, trust your colleagues’ workflow as they trust you to submit a good code review. Meanwhile, wait for them to get back to you when they are available. Don’t look at your reviewers as a bottleneck. Remember to be patient because hard things take time.
Be A Listener
Once a code review is submitted, comments will come, questions will be asked, and changes will be proposed. The golden rule here is to not take any feedback as a personal attack. Remember that any code can benefit from an outside perspective.
Don’t look at your reviewers as an enemy. Instead, take this moment to set aside your ego, accept that you make mistakes, and be open to learning from your colleagues, so that you can do a better job the next time.
? As A Reviewer
Plan Ahead Of Your Time
When you are asked to be a reviewer, don’t interrupt things right away. That’s a common mistake I see all the time. Reviewing code demands your full attention, and each time you switch code contexts, you are decreasing your productivity by wasting time in recalibrating your focus. Instead, plan ahead by allocating time slots of your day to do code reviews.
Personally, I prefer to do code reviews first thing in the morning or after lunch before picking any other of my tasks. That’s what works best for me because my brain is still fresh without a previous code context to switch off from. Besides that, once I’m done with the review, I can focus on my own tasks, while the author can reevaluate the code based on the feedback.
Be Supportive
When a Pull Request doesn’t follow the contribution guidelines, be supportive — especially to newcomers. Take that moment as an opportunity to guide the author to improve his/her contribution. Meanwhile, try to understand why the author didn’t follow the guidelines in the first place. Perhaps there’s room for improvement that you were not aware of before.
Check Out The Branch And Run It
While reviewing the code, make it run on your own computer — especially when it involves user interfaces. This habit will help you to better understand the new code and spot things you might miss if you just used a default diff-tool in the browser which limits your review scope to the changed code (without having the full context as in your code editor).
Ask Before Assuming
When you don’t understand something, don’t be afraid to say it and ask questions. When asking, remember to first read the surrounding code and avoid making assumptions.
Most of the questions fit in these two types of categories:
“How” Questions
When you don’t understand how something works or what it does, evaluate with the author if the code is clear enough. Don’t mistake simple code with ignorance. There’s a difference between code that is hard to read and code that you are not aware of. Be open to learn and use a new language feature, even if you don’t know it deeply yet. However, use it only if it simplifies the codebase.
“Why” Questions
When you don’t understand the “why”, don’t be afraid of suggesting to commenting the code, especially if it’s an edge case or a bug fix. The code should be self-explanatory when it comes to explaining what it does. Comments are a complement to explaining the why behind a certain approach. Explaining the context is highly valuable when it comes to maintainability and it will save someone from deleting a block of code that thought was useless. (Personally, I like to comment on the code until I feel safe about forgetting it later.)
Constructive Criticism
Once you find a piece of code you believe it should be improved, always remember to recognize the author’s effort in contributing to the project and express yourself in a receptive and transparent way.
Open discussions.
Avoid formalizing your feedback as a command or accusation such as “You should…” or “You forgot…”. Express your feedback as an open discussion instead of a mandatory request. Remember to comment on the code, not the author. If the comment is not about the code, then it shouldn’t belong in a code review. As said before, be supportive. Using a passive voice, talking in the plural, expressing questions or suggestions are good approaches to emphasize empathy with the author.
Instead of “Extract this method from here…” prefer “This method should be extracted…” or “What do you think of extracting this method…”
Be clear.
A feedback can easily be misinterpreted, especially when it comes to expressing an opinion versus sharing a fact or a guideline. Always remember to clear that right away on your comment.
Unclear: “This code should be….”
Opinion: “I believe this code should be…”
Fact: “Following [our guidelines], this code should be…”.
Explain why.
What’s obvious for you, might not be for others. It’s never too much explaining the motivation behind your feedback, so the author not only understands how to change something but also what’s the benefit from it.
Opinion: “I believe this code could be…”
Explained: “I believe this code could be (…) because this will improve readability and simplify the unit tests.”
Provide examples.
When sharing a code feature or a pattern which the author is not familiar with, complement your suggestion with a reference as guidance. When possible, go beyond MDN docs and share a snippet or a working example adapted to the current code scenario. When writing an example is too complex, be supportive and offer to help in person or by a video call.
Besides saying something such as “Using filter will help us to [motivation],” also say, “In this case, it could be something like: [snippet of code]. You can check [an example at Finder.js]. Any doubt, feel free to ping me on Slack.”
Be reasonable.
If the same error is made multiple times, prefer to just leave one comment about it and remember the author to review it in the other places, too. Adding redundant comments only creates noise and might be contra-productive.
Keep The Focus
Avoid proposing code changes unrelated to the current code. Before suggesting a change, ask yourself if it’s strictly necessary at that moment. This type of feedback is especially common in refactors. It’s one of the many trade-offs between efficiency and effectiveness that we need to make as a team.
When it comes to refactors, personally, I tend to prefer small but effective improvements. Those are easier to review and there’s less chance of having code conflicts when updating the branch with the target branch.
Set Expectations
If you leave a code review half-done, let the author know about it, so time expectations are under control. In the end, also let the author know if you agree with the new code or if you would like to re-review it once again later.
Before approving a code review, ask yourself if you are comfortable about the possibility of touching that code in the future. If yes, that’s a sign you did a successful code review!
Learn To Refuse A Code Review
Although nobody admits it, sometimes you have to refuse a code review. The moment you decide to accept a code review but try to rush it, the project’s quality is being compromised as well as your team’s mindset.
When you accept to review someone’s else code, that person is trusting your capabilities — it’s a commitment. If you don’t have the time to be a reviewer, just say no to your colleague(s). I really mean it; don’t let your colleagues wait for a code review that will never be done. Remember to communicate and keep expectations clear. Be honest with your team and — even better — with yourself. Whatever your choice, do it healthily, and do it right.
Conclusion
Given enough time and experience, doing code reviews will teach you much more than just technical knowledge. You’ll learn to give and receive feedback from others, as well as make decisions with more thought put into it.
Each code review is an opportunity to grow as a community and individually. Even outside code reviews, remember to foster a healthy mindset until the day it comes naturally to you and your colleagues. Because sharing is what makes us better!
If you are a business owner, then you must acknowledge the power that having a strong online presence brings to a business.
If you don’t, then you may fall behind your competitors who know the importance of having an online brand presence.
Strong branding in the online realm has many benefits that drive people and businesses to invest in branding programs and campaigns on the Internet. One, it will make it easier to recognize your brand, which is crucial when customers are making purchasing decisions.
Aside from that, it generates customer loyalty so that your previous customers who’ve completed a transaction with your business will come back to transact again. Additionally, it will ensure that you have brand ambassadors willing to recommend your brand to their peers.
With these benefits, it is recommended that you find ways on how to build a strong online presence if you haven’t yet. With that said, below, you’ll find seven ways businesses can create a strong online presence.
Understand what your business goals are
The most common problem that businesses have when they’re creating their online social media presence is that they don’t have a goal in mind. They believe that having a social media or online presence and posting on occasion is enough effort.
However, an aimless social media account and inconsistent approaches mean that you are hardly going to get results that you want. That is the reason why the first thing you should do before starting to build your online presence is creating a business goal.
You should also make sure that you are creating realistic expectations for your business. You can’t expect an increase in profit when you’ve only started building your community and don’t yet have a strong connection with your consumers. However, if you keep at it long enough and with smart steps, you should be able to reach the goals you’ve set.
Develop a solid platform
Once you’ve set your business goals, what you should then focus on is developing a solid platform to start off your online presence.
The best place to start with your business’s platform is your very own website. If you have a fast loading and clean-looking website, it can attract visitors to look over your business more.
Aside from that, creating a high-quality landing page experience is an excellent way of optimizing your site for search engines.
Your website should contain all relevant information about your business. Make sure that the site is easy to navigate and that you create relevant content inside your website.
Make sure that your homepage, or any other website page for that matter, is as uncluttered as possible. That will contribute to a positive brand image showing your reliability and professionalism. Otherwise, your website will seem distracting and messy and unappealing to website visitors.
Keep optimizing and improving
The key to a thriving business online is to know about how to optimize your brand for search engines.
Search engine optimization or SEO is the process of tweaking your website or content so that your site will rank high on search engine results. There are many ways you can optimize your site for search engines.
One of which is by incorporating keywords on all the right places. Keywords are the terms or phrases that will help search engines filter out the right sites based on the needs of the users who searched online.
If you already have a website and content, then you might want to look back and reoptimize or optimize previous content. That will make sure that your previous efforts aren’t going to waste.
Plus, it’s always a great touch when you continuously look for ways to improve upon yourself.
Produce consistent and valuable content
Another common mistake that a lot of brands or businesses do when they try and make a breakthrough online is that they aren’t consistent. Plus, they tend to create content for content’s sake and try to ride on trends that aren’t relevant to their business.
According to VoyMedia.com, “The key to creating a strong online presence is consistency”. It doesn’t mean that you should post content all day every day to be able to have a strong online presence. As long as you stick to a schedule, then you should be fine.
Consistency does not only refer to the frequency with which you post content. It also refers to your consistency with the tone and personality of your brand throughout all your social media accounts and even in your articles.
When you’re consistent, and you create valuable, relevant content, you establish yourself as an industry expert over time. You will build a strong community based around your brand, and you will have a stronger online presence than ever.
Engage and be social
The problem with traditional media is that too often, the brand’s communication with its target audience is very one-sided. Instead of having a conversation, all you’re really doing is broadcasting a message hoping you’ll hear positive feedback in some way.
Nowadays, if you don’t try and have engaging and personal conversations with your target audience, it can make people dislike or have a negative impression of your brand. That is the reason why you should always be engaging and social on the Internet.
Although you don’t have to ride every trend that comes your way, you need only be responsive to customers. Luckily, social media is a powerful customer service tool that makes it easy and convenient to address customer concerns.
Aside from that, if you’re engaging enough and create great content, then you are more likely to attract potential clients. Don’t forget to also connect with key influencers in your industry to make it easier to engage with your target audience.
Establish relationships
Speaking of being social, creating a strong online presence will most likely mean that you have to connect and build a rapport between you and key players in your industry.
As briefly mentioned before, you shouldn’t neglect the connections you could have with key influencers in the industry. Influencers in the online realm already have a strong community and are an established authority in the field.
With that said, it is crucial that you discern who your key influencers are. There are a couple of factors to look out for.
One, you should look at their engagements instead of their following. This is because engagement shows a better overview of the people who regularly support them. Two, you should also identify who their key demographics are and whether or not they coincide with your target market.
When you have a connection with the right people online, you will have access to an audience that you previously wouldn’t have. Remember to maintain a good relationship and not just create a strong connection at the start of the relationship.
Much like how you try to connect with key influencers, the principle is the same when you write for other blogs. They have the following and the authority that you need to create a strong online presence.
Aside from that, writing for other blogs is a great search engine optimization technique because if other blogs with authority link your site, search engines are more likely to rank your website higher.
Wrap up
A strong online presence does not only offer intangible benefits such as customer loyalty and brand awareness, but it can also influence conversions. That is the reason why any business should try creating a strong online presence for themselves.