Castos Picks Up $756K in Funding from Automattic and Joost de Valk to Expand Services in the Private Podcasting Market

Castos, a WordPress-powered podcast hosting provider, announced a $756K pre-seed fundraising round today from Automattic, Joost de Valk, founder of Yoast SEO, and other individuals. The company raised money from all the investors in this round via a SAFE note, which founder and CEO Craig Hewitt said is a fairly standard investment vehicle for companies at Castos’ stage of growth.

“On both the individual and corporate investor side I think the investors see the vision that we have for what the Private Podcasting market can mean for Castos and want to help us achieve that potential,” Hewitt said.

Private Podcasting is a growing trend where creators and organizations broadcast to supporters in a more intimate format that isn’t open to the public. Hewitt likens them to membership sites, except in audio format. It is often used by people who are running membership sites, courses, or online communities as a way to stay connected with members.

“The other application is companies wanting a way to connect with their employees in audio format,” Hewitt said. “Podcasting is perfect for that because it’s mobile-first, on-demand, and can be consumed asynchronously.  We call it the Step Away Experience. Companies that are adopting Private Podcasting internally are giving their team members a way to consume their internal content without being tied to their computer on a Zoom call or glued to Slack.”

Castos is developing a mobile app specifically targeted at the private podcasting market. Hewitt’s team is aiming to have the app become a place where people can listen to all of the private podcasts for which they have a subscription. Listeners would simply use the app instead of going through the process of manually subscribing to all their private podcasts via RSS feed. New episodes will appear automatically in the app for subscribers.

“For our corporate clients, the ability to white label our app with their own branding/style is a big win,” Hewitt said. “It’s also a much more secure way to distribute private podcast content.  There’s no RSS feed to share around, no files to download (our app is streaming only to offer more security to those files).” 

The pandemic ramped up unprecedented interest in podcasting when lockdowns were in place across the globe. Even with vaccines more readily available now, Hewitt said Castos is still witnessing strong growth in the podcasting industry.

“There are all the new podcasters in the market now since so many launched podcasts during the pandemic, but now that people are traveling again and commuting to work we’re seeing listenership going up quite a bit,” he said. “This is a trend we expect to continue into the future.”

In the past 10 months, Castos has grown to serve nearly 3,500 customers and the team has grown from seven employees to 13. The company’s Seriously Simple Podcasting plugin is used on more than 30,000 WordPress sites. Castos is actively hiring for several roles right now, thanks to the new round of fundraising.

“All of the funds will go towards growing our team,” Hewitt said. “This will be pretty evenly split between product (designers and developers) and Sales and Marketing roles – more people, more energy, more great minds working on ways that we can better serve our customers.” 

Can anyone help me.

When ever run this program, I can't get the total price right and I tried it so many times but failed. Can anyone help me where or how to fix this mistake. This is my mini project for my assessment :(.

using namespace std;
int main ()
{
    char name [30], ic [20];
    char day [10], date [10];
    char package, vehicle_code;
    char number_plate [10];
    double price, total;

    cout<<"\n\n                              ===================================================================";
    cout<<"\n                              |-----------------------------------------------------------------|";
    cout<<"\n                              |                                                                 |";
    cout<<"\n                              |____________________WELCOME TO BOOK PLUS PARKING_________________|";
    cout<<"\n                              |                                                                 |";
    cout<<"\n                              |-----------------------------------------------------------------|";
    cout<<"\n                              ===================================================================";

    cout<<"\n\n                              Please enter your name:";
    cin.getline (name, 30);
    cout<<"\n                              Please enter your IC number:";
    cin.getline (ic,20);

    cout<<"\n\n                               ===============================================================================================";
    cout<<"\n                               | DAY                    | TYPE OF VEHICLE           | PACKAGE PROVIDED           |PRICE (RM) |";
    cout<<"\n                               -----------------------------------------------------------------------------------------------";
    cout<<"\n                               | Weekday                | Car                       | A (1/2 hour)               | 5.50      |";
    cout<<"\n                               |                        |                           | B (3/4 hour)               | 8.30      |";
    cout<<"\n                               |                        |                           | C (5+ hour)                | 10.00     |";
    cout<<"\n                               -----------------------------------------------------------------------------------------------";
    cout<<"\n                               |                        | Motorcycle                | A (1/2 hour)               | 3.50      |";
    cout<<"\n                               |                        |                           | B (3/4 hour)               | 5.30      |";
    cout<<"\n                               |                        |                           | C (5+ hour)                | 8.00      |";
    cout<<"\n                               -----------------------------------------------------------------------------------------------";
    cout<<"\n                               | Weekend                | Car                       | A (1/2 hour)               | 6.50      |";
    cout<<"\n                               |                        |                           | B (3/4 hour)               | 9.30      |";
    cout<<"\n                               |                        |                           | C (5+ hour)                | 11.00     |";
    cout<<"\n                               -----------------------------------------------------------------------------------------------";
    cout<<"\n                               |                        | Motorcycle                | A (1/2 hour)               | 4.50      |";
    cout<<"\n                               |                        |                           | B (3/4 hour)               | 6.30      |";
    cout<<"\n                               |                        |                           | C (5+ hour)                | 9.00      |";
    cout<<"\n                               ===============================================================================================";

    cout<<"\n\n                              =====================================================================";
    cout<<"\n                              | TYPE OF VEHICLE                    | VEHICLE CODE                 |";
    cout<<"\n                              ---------------------------------------------------------------------";
    cout<<"\n                              | Car                                | 'C'                          |";
    cout<<"\n                              -------------------------------------------------------------------- ";
    cout<<"\n                              | Motorcycle                         | 'M'                          |";
    cout<<"\n                              =====================================================================";

    cout<<"\n\n                              Please enter day of booking:";
    cin.getline(day,10);
    cout<<"\n                                Please enter date of booking:";
    cin.getline (date,10);

    cout<<"\n                                Please enter vehicle code:";
    cin>>vehicle_code;
    cout<<"\n                                 Please choose package:";
    cin>>package;


    if (strcmp (day,"Monday")|| (day, "Tuesday")|| (day, "Wednesday")|| (day, "Thursday")|| (day,"Friday"))
    {
        if (vehicle_code == 'C')
        {
            if (package == 'A')
            {
                price = 5.50;
            }
            else if (package == 'B')
            {
                price = 8.30;
            }
            else if (package == 'C')
            {
                price = 10.00;
            }
            else 
            {
                cout<<"\n                      INVALID PACKAGE!";
            }
        }
        else if (vehicle_code == 'M')
        {
            if (package == 'A')
            {
                price = 3.50;
            }
            else if (package == 'B')
            {
                price = 5.30;
            }
            else if (package == 'C')
            {
                price = 8.00;
            }
            else
            {
                cout<<"\n                      INVALID PACKAGE!";
            }           
        }
        else 
        {
            cout<<"\n                           INVALID VEHICLE CODE!";
        }
    }
    else if (strcmp (day, "Saturday")|| (day,"Sunday"))
    {
        if (vehicle_code == 'C')
        {
            if (package == 'A')
            {
                price = 6.50;
            }
            else if (package == 'B')
            {
                price = 9.30;
            }
            else if (package == 'C')
            {
                price = 11.00;
            }
            else 
            {
                cout<<"\n                       INVALID PACKAGE!";
            }
        }
        else if (vehicle_code == 'M')
        {
            if (package == 'A')
            {
                price = 4.50;
            }
            else if (package = 'B')
            {
                price  = 6.30;
            }
            else if (package = 'C')
            {
                price = 9.00;
            }
            else 
            {
                cout<<"\n                       INVALID! PACKAGE!";
            }
        }
        else 
        {
            cout<<"\n                           INVALID VEHICLE CODE!";
        }
    }
    else 
    {
        cout<<"\n                               INVALID DAY!";
    }


    total = price;
    cout<<"\n                                  TOTAL PAYMENT (RM) :"<<total;
}

WordPress Biratnagar Announces Plans for Ujwal Thapa Memorial Scholarship

Earlier this week, the WordPress Biratnagar Facebook group announced a WordCamp scholarship in honor of Ujwal Thapa. The goal is to honor the legacy left behind by one of Nepal’s leaders both inside and outside of the WordPress community.

Thapa passed away a month ago at age 44 from complications with COVID-19. He was a political activist, founding the Bibeksheel Nepali party, originally a peaceful movement against corruption and social injustice. He was the co-founder of WordPress Nepal, a group that has grown to 8,000 members. He was also a close friend and mentor to many in the community and helped many more launch careers in the IT industry.

“After the untimely death of WordPress contributor and co-founder of WordPress Nepal Ujwal Thapa in 2021, due to COVID-19, the WordPress Biratnagar community decided on this scholarship,” wrote the WordPress Biratnagar team. “Ujwal was a dedicated patron to the WordPress community in Nepal, and the WordPress Biratnagar decided to pay applause to his memory in this way.”

The scholarship will cover the following:

  • Travel to Biratnagar from within Nepal.
  • Hotel stay for the duration of the event.
  • A ticket to WordCamp Biratnagar.
  • Local transportation.
  • Meals outside the official event.

Nepal is still struggling with getting COVID-19 cases under control at the moment. The CDC lists the country as “very high” risk and recommends avoiding travel. There is no date set for a physical conference, and a WordCamp Biratnagar 2021 event is unlikely. The organizing team may not be able to grant a scholarship until next year at the earliest.

WordCamp Biratnagar lead organizer Ganga Kafle said they are just waiting for the situation to return to normal but cannot be sure when that will happen. While there is no date for the next WordCamp, they are still holding regular meetups.

The group is still discussing the details of the scholarship. Currently, they plan to consult with other community groups within Nepal and the global community. Any help creating and maintaining such a scholarship system would be welcome.

The WordPress Biratnagar team did agree to some guidelines. Once submissions open, applicants must be Nepalese. “We believe that empowering community members is an excellent way to honor his memory and carry on his legacy,” wrote the team in its announcement.

Group leaders mostly agreed to award the scholarship to those meeting the following criteria:

  • People with disabilities.
  • People from lower-income families.
  • Women interested in WordPress.

The group said the selection process would be completely transparent, and the awarded scholarship would be at the discretion of the current WordCamp Biratnagar organizers.

Kafle said the scholarship would also be annual. The team plans to keep this going in honor of Thapa and paying respect to the man who helped jump-start many of their careers and involvement with WordPress.

How to Dissolve a Corporation

Regardless of the reason, there sometimes comes a point when some corporations decide to call it quits.

But simply halting your business operations isn’t enough to actually end the corporation’s existence.

The corporation will continue existing as a legal business entity until you’ve formally dissolved the company.

Once you’ve legally dissolved the corporation, you can walk away knowing that everything has been settled correctly and start your next venture without any hindrance.

This guide will walk you through the step-by-step process of dissolving a corporation.

The Easy Parts of Dissolving a Corporation

Many business owners are intimidated by the dissolution process because they think it’s something they need to do alone. This simply isn’t the case.

To keep things simple and put your mind at ease, it’s recommended that you seek legal counsel. Retaining an attorney might seem like a big expense, especially if times are tough and you’re going out of business. But there are plenty of affordable online legal services you can use as you go through this process.

Do not go through the dissolution process without an attorney. You could end up with the raw end of the deal and leave yourself exposed to problems down the road.

With an online legal service like Rocket Lawyer, you can get fast answers to your legal questions regarding the dissolution process.

A Rocket Lawyer membership starts at just $39.99 per month. Members get legal questions answered at no cost and free 30-minute consultations for every new legal matter. If you hire an attorney through Rocket Lawyer, your membership gets you up to 40% off.

One of the most critical steps of dissolving a corporation involves filing paperwork with the Secretary of State. We’ll discuss this step in greater detail later on.

But this is another easy part of the dissolution process. The paperwork is easy to obtain, and in many cases, you can file everything online.

The Difficult Parts of Dissolving a Corporation

The psychological aspects of dissolving a corporation pose a big challenge for lots of business owners.

Deciding to end your company is hard enough. Many people struggle to go through the extra steps to formally dissolve the business once they’ve mentally checked out. They’ve already decided to walk away and don’t want to put in any extra work. They just want to put it behind them and move forward.

But the problem here is that the state and IRS will still recognize the corporation as a legal business entity. This means that you’re still responsible for taxes and subject to other legal requirements. Creditors and vendors can still come after you as well.

Another challenge of dissolving a corporation exists when board members aren’t on the same page. The corporation must go through a formal voting process on the dissolution, which could turn ugly if everyone doesn’t see eye-to-eye on the decision.

The entire process from start to finish can take weeks or potentially months to complete. You can’t wake up one morning, decide to end the business, and have it done before dinner.

Going through this lengthy process and taking several steps to formally dissolve a corporation can be frustrating, but it is worth it to dissolve the business legally.

Step 1 – Call a Board Meeting

The first thing you need to do is call a meeting with the board of directors for your corporation. Laws vary by state, but most states require an official vote from board members to approve the dissolution decision.

Even if this is not required in your state, it’s still wise to go through this process as a way to avoid legal blowback down the road.

For the vast majority of corporations, the corporate bylaws will require board approval for a decision like this.

Like any other board meeting, everything must be formally recorded with meeting minutes and kept with the corporation’s records. Remember, you’re still a legal business entity until the dissolution has been made official. So you can’t cut any corners here.

Assuming the board approves the decision, you must then turn over the vote to shareholders for approval.

Shareholder Votes

Shareholder approval laws vary from state to state. In some jurisdictions, there is a two-thirds vote requirement from shareholders to approve the dissolution. Other states just require a majority rule.

Refer to your local laws and corporate bylaws to ensure everyone understands the requirements before votes are cast.

In some instances, the shareholder voting process will be much easier than in others. For smaller corporations, the board of directors might be the same people who hold primary shares in the company. But for larger corporations with lots of shareholders, the process might take a bit longer.

Shareholders need to understand that the dissolution is in their best interest. If this isn’t clear, getting a majority vote could be challenging.

Step 2 – File a Certificate of Dissolution

Once the board of directors and shareholders have voted to approve the dissolution, you can officially file the proper forms with the Secretary of State where the business is incorporated.

It should be pretty easy to obtain this paperwork. The exact name of the government agency in your state might vary slightly. Some states have a Corporation Agency while others call it a Corporation Commission or Incorporation Bureau—but they all do the same thing.

The name of the paperwork can vary as well. Sometimes the certificate of dissolution is also called the articles of dissolution.

Verify all of the fees and filing requirements before you submit the form. Depending on the state, you might be able to file by mail, online, or in person.

This is another scenario when it’s helpful to have fast legal counsel available to answer your questions. You can quickly go online and contact an attorney with Rocket Lawyer to ensure you’re handling this step correctly and following local guidelines.

Again, quick questions are free with your Rocket Lawyer membership.

In some jurisdictions, tax clearance is required before you can file the certificate of dissolution. So if your corporation owes back taxes, they must be paid before you can submit the paperwork.

Notifying creditors and resolving claims is also required in some states before you can file the dissolution papers. That’s why having an attorney guide you through this process is so helpful since the laws vary by location.

Step 3 – Notify the IRS

Once you’ve filed the dissolution forms with the state, you need to contact the Internal Revenue Service and inform them of your decision.

Ending your business doesn’t absolve you of tax liabilities. If you’ve been conducting business throughout the year, you still need to pay all of your state and federal taxes. For S corporations, the corporate income, losses, deductions, and credit can be passed through to shareholders’ individual returns.

For more information on the exact forms to file and the process required by the IRS, review this IRS resource for closing a corporation. Here’s a brief overview and summary of those requirements:

Income Tax Returns

C corps must file Form 1120 and report capital gains and losses on Schedule D (1120). S corps must file Form 1120-S and report gains and losses on Schedule D (1120-S).

When filing, you need to check the box that says “final return” for the tax year in which the corporation was dissolved.

If you’re liquidating stock, you must also file Form 966 for corporate dissolution or liquidation.

Along with forms 1120 or 1120-S, corporations need to file Form 4797 and Form 8594. These are necessary if the company’s property is sold or exchanged or if the business itself is sold.

Employment Taxes

If your corporation has employees, you need to make all final federal tax deposits. Failure to do so can result in penalties. Officers, employees, accountants, and anyone else who has the authority to spend business funds can be held responsible for unpaid employment taxes.

Form 941 must be filed for the quarter in which final wages were paid. Form 944 must be filed for the year in which final wages were paid.

You’ll also need to file Form 940 for FUTA in the year where final employment wages were paid. Check the box identifying that the form is final.

Just because your business is dissolving doesn’t exempt you from providing W-2s to your employees. So you’ll still need to file those papers for all wages paid to date in the year your corporation was dissolved.

If your company pays freelancers or contract workers, you still need to provide 1099s to any contract worker paid $600 or more during that calendar year.

Employer Identification Number (EIN)

When you first started the corporation, you obtained an EIN from the IRS. It’s a common misconception that EINs are terminated when a company dissolves—that’s not the case.

The EIN assigned to your business is permanent. This will never be given to another company, and you can use it at a later date if need be.

But you still need to close the tax account associated with your EIN. Mail a letter to:

Internal Revenue Service
Cincinnati, Ohio 45999

The letter should contain the corporation’s legal name, EIN, address, and why you’re closing the account. If you have a copy of the form sent when you first received the EIN, include that as well.

Step 4 – Close Your Accounts

Next, you need to close all of your business bank accounts and credit lines.

You should also cancel any business licenses, permits, or other similar accounts held in your company’s name. Failure to do this could leave you on the hook for annual fees.

For those of you operating your corporation in multiple states, you need to fill out any additional forms to terminate those registrations. Otherwise, your company could be responsible for minimum tax requirements in those jurisdictions.

Terminate DBAs or fictitious business names that you’re using as well.

Notify Creditors

You’ll need to officially notify all creditors that the corporation is dissolving. Send a letter including a mailing address that they can submit claims. Include a deadline for claim submissions—usually 120 days from the notice date.

Each letter to creditors should include a final statement saying all claims will be barred if they aren’t received by the deadline. You can have your attorney draft this statement for you to ensure you’re covered from a legal standpoint.

In some states, you might be required to put a notice in the local paper about your corporation dissolving. This is to inform all creditors that may not be known to the business.

Settle Claims

If claims are sent during the time window stated in the letter, you need to settle those accounts. This is another instance where you should have an attorney review any claims to ensure creditors aren’t taking advantage of you.

Lots of times, creditors just want to be paid something—so you can potentially settle the claims for less than the original value.

If you’re rejecting claims, provide these rejections in the form of a written statement drafted by your lawyer.

Keep future business ventures in mind as you’re going through this process. You might be starting a new corporation down the road, so try not to burn any bridges during the dissolution.

Step 5 – Distribute Remaining Assets

Once your taxes have been paid, accounts have been closed, and claims are settled, it’s time to distribute the remaining assets to all owners.

Generally speaking, assets will be distributed by ownership percentage. If there are four equal owners, each person will receive 25% of the assets.

It’s usually easier to distribute assets once things have been liquidated. For example, if you have machinery or vehicles, splitting those between owners can be a hassle. The liquidation process could take some time, depending on what needs to be sold.

You must report all distributions to the Internal Revenue Service.

For those of you dissolving a corporation with multiple stock classes, the corporate bylaws should describe the procedure for distributing assets to shareholders.

How COVID-19 Has Changed the IT World

Since the global pandemic turned up on our doorsteps, the world has noticed drastic changes. In many different ways, things have changed dramatically. Societal norms and economic challenges have impacted people in many ways after the emergence of COVID-19.     

There is no way we can sweep away the differences the time has caused and move back to the life we had in the past. 

Zero-Width Space

The name zero-width space is antithetical, but it’s not without uses. In text, maybe you’d use it around slashes because you want to be sure the words are treated individually but not have any physical space around the slash:

That’s an image. WordPress was being weird about it and not escaping it even when in a code block.

That’s pretty theoretical though—I’ve never once needed to do that. It might be useful in a long word to suggest that it can be broken there… but that’s also rare as we have the soft-hyphen (&shy;) which is designed for that and leaves a typically appropriate hyphen at the break.

What I have needed to do is exactly the opposite: trick a system into thinking a single word is two words. Like on Twitter, if I @username or #hashtag in the text of a tweet, those will be linked up respectively. But I don’t always want that. On CSS Twitter, I might want to refer to a @media query or show an #id-selector. Toss a zero-width space between the symbols and the text and I’m all set.

Get a zero-width space on your clipboard

Here’s a Pen I created ages ago that will help you do that:

There is also a quick trick for doing it from the browser console:

copy('u{200B}')

via:

And for yet another way that may appeal to you, a bookmarklet!

Copy & Paste concern

The danger with the zero-width space is, well, you can’t see it. If someone were to, for example, copy your @media query using the zero-width space trick from a tweet, it won’t work in their code editor (because it will invalidate the rule) and it might be extremely confusing. For that reason, it’s probably good to avoid using it in anything that might be copied as a code example, but probably fine when explicitly trying to not autolink something.


The post Zero-Width Space appeared first on CSS-Tricks. You can support CSS-Tricks by being an MVP Supporter.

Kubernetes Service Types

Services in Kubernetes are used to group pods into a single endpoint. As Pods can be recreated, they can be attached to services for stable IP addresses.

A service can be defined using yaml file. Example of Kubernetes service using yaml file is given below. The "targetport" specified in the yaml file is the port value where the container is running.

Evolution of the Quarkus Developer Experience

Introduction

Since its inception, Quarkus has focused on more than just delivering sets of features. Developer productivity and joy have been critical components of Quarkus. The developer experience and how to improve it are carefully considered with every new feature added. This article showcases the maturity and evolution of developer productivity capabilities within Quarkus from inception to the newly-released version 2.0.

Developer Productivity and Joy

Quarkus rests on a vast ecosystem of technologies, standards, libraries, and APIs, making Quarkus “familiar” but “new”. Developers don’t have to spend lots of time learning an entirely new set of APIs and technologies to take advantage of the benefits Quarkus brings to the JVM or native images. Instead, developers can utilize their existing knowledge and skills. Among the specifications and technologies underlying Quarkus are Eclipse MicroProfile, Eclipse Vert.x, Contexts & Dependency Injection (CDI), JAX-RS, the Java Persistence API (JPA), the Java Transaction API  (JTA), Apache Camel, and Hibernate, just to name a few.

Recover From a Disaster Using a userfile Backup

CockroachDB supports enterprise-grade backup and restores using object storage targets. For local development, a userfile scheme was introduced to allow fast prototyping without a heavy burden of spinning up costly infra. A customer requested the ability to quickly validate whether they can recover from a complete teardown of a cluster without using object storage. This is my experience and current workaround to get this to work.

Motivation

This tutorial takes a short detour compared to my other articles due to a specific requirement that we need to recover from a local disaster into a new cluster. userfile is very helpful but it assumes the cluster is up and restore can proceed as intended. However, when you intend to shut down the source cluster, remove all of the underlying storage along with the user space where userfile stores its backups, userfile stops being useful. In that case, we have to download the backups out of the user space prior to shutting down the cluster and removing the data volumes.

Focus, Culture, and Metrics in a Remote-First World

How can you build and scale an effective remote organization?

In our digital world, figuring out the answer to this question is crucial, and Chris Brookins the VP of Engineering at Appcues, has some great ideas about how to improve team focus time and maintain company culture in remote-first work environments.

BankNext Microservices: A Case Study

Business Objective 

BankNext” is on an ambitious digital transformation phase and desires to make its customer onboarding process seamless. After an elaborate functional flow analysis, BankNext implemented an orchestration architecture to collaborate between various microservices.

 Business Flow

  1. Initiation: Prospective customer initiates the joining process on BankNext
  2. Prechecks: BankNext first invokes a Screening MSvc and a Deduplication Msvc to study the prospect and ensure that this entity is not already present in the system
  3. Processing (after prechecks pass): CustomerMgt Msvc to create the Customer entity and AccountMgt Msvc to create the Account entity for this customer.
  4. Compliance: Monitoring Msvc for the initial period to check suspicious activities and Recommendation Msvc to provide customer delight based on customer preferences.

Architecture Positives 

BankNext is quite happy with this architecture due to the following:

Experiencing the Aftermath Will Make You Tougher, Wiser, and Ready For Anything

I was in charge of managing a dedicated server running Debian 7. The server hosts multiple websites with email services, the server also hosts multiple instances of a critical web application for a client who is running a business across different regions.

That day was a very important day, as the client was expecting his own client to turn up. The client wanted to make a demo of the application and show how they manage some business processes.
During that event, I got a phone call claiming client users not able to access the web application. I took the request as usual and started checking the filed issue, and a few seconds later, I got another call about other users not able to access their mailbox. It is then I realized that a very nasty thing is happening and I'm in serious trouble.  

I quickly figured out that I had made the worst mistake ever!

That day I was performing usual maintenance tasks on the server, freeing some disk space here and there. However, at some moment, I deleted critical files that belong to different services like Postgres, Mysql, mail server, etc. I didn't notice anything until I started receiving reported issues from the clients. 

It was catastrophic in all corners.
We lost three months of data as backups resided in a single place where I launched the deletion operation, there were no other copies of backups. Many services were surviving with what was left in RAM (I guess) and any respawned process was lethal for the corresponding service.
In the field, the client was badly embarrassed in front of his client, as he was cut off at the beginning of the demo. 

Users started processing customer data manually using a pen and paper. The recovering of the server was a "mission: impossible". We needed to reinstall everything from the scratch, but it was decided that the fastest recovery would be to migrate to another server with the latest Debian version.

So, I installed all the required services on the new server and restored the most recent backup. The business application was finally live.
One must learn a lot of lessons because of this disaster.  

Lessons learned:

How to program calculator array to not include sentinel?

Task is to create a basic calculator using double value and sentinel. I cannot figure out how to get the array to avoid counting the sentinel. To me, it looks like I've put in safeguards such as only looping if the value is >=0, but it still counts, lists, and even adds the sentinel number to the final result. I've tried changing the while statement to !=-1 with no change in the results. I'm a complete Java newbie (obviously), and have tried many options, but can't find the right one.

package arraypractice;

import java.util.ArrayList;
import java.util.Scanner;

public class CashRegister

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    {
    final int SENTINEL=-1;
    double priceFromUser=0;
    double total=0;
    double average=0;
    double count=0;
    boolean done=false;
    String trash="";
    String lists="";
    ArrayList<Double> list = new ArrayList<>();
    Scanner in = new Scanner(System.in);

    //Prompt user to enter a price, or -1 when finished entering prices.

    while (!done)
    {


    while (priceFromUser >= 0)
    {
        System.out.println("Please enter item price, or enter -1 to quit.");

        if(in.hasNextDouble())//if the input is a double
        {
            priceFromUser=in.nextDouble(); //read value from user
            list.add(priceFromUser); //add valid price to the list
        }
        else                

        {
            trash=in.nextLine(); //throw away the input 
            System.out.println("You did not enter a price.");

        }



    //add valid input to list


    //total the prices added by user, and keep track of how many were added

        {
             total += priceFromUser;
             count++;
        }

    }

    //print the array list of entries, the total cost, and the average cost.

    list.forEach(System.out::println);

    System.out.println("The total price of the items is $" + total +". The average cost per item is: $" + (total/count));
    done=true;

}

Output is:

run-single:
Please enter item price, or enter -1 to quit.
25
Please enter item price, or enter -1 to quit.
25
Please enter item price, or enter -1 to quit.
25
Please enter item price, or enter -1 to quit.
25
Please enter item price, or enter -1 to quit.
-1
25.0
25.0
25.0
25.0
-1.0
The total price of the items is $99.0. The average cost per item is: $19.8

Good Meetings

Like it or not, meetings are essential to a good working environment and communication. Therefore, it’s crucial that we work on making them as productive as possible. Today we’ll explore myriad ways to keep meetings coordinated, well documented, and talk about how to recognize and steer away from anti-patterns.

I’m timid to write this because I have not always hosted good meetings. I have, however, hosted thousands of them, so I’ve learned both from some mistakes and successes. In all likelihood, if you do any kind of management or lead work for a while, you’ll also see your own spectrum of meetings: meetings with different types of agendas and purposes, meetings with varying levels of awkwardness, meetings that didn’t have a formal outcome. We’ll dive into all of these in this article, as well as some tips for each.

The truth is, a meeting by its nature can almost never be perfect because it is by definition a group of people. That group of people will consist of different people: with different tastes, different opinions, different priorities, and different values. There’s a high chance that not everyone will agree on what a great meeting is. So half of the journey is aligning on that.

The Good, The Bad

One thing’s for sure: we can agree on what a bad meeting is. So let’s start by using that as a ballast:

  • There’s no clear purpose or direction
  • It feels chaotic
  • The wrong people are there
  • People are generally disrespectful of one another
  • Everyone feels it’s a waste of time

From those assertions, we can then derive what a good meeting is:

  • The purpose of the meeting is clear
  • There’s an agenda (we’ll dive in to the complexity of this in a moment)
  • There are the right people in the room. Not too many where communication is overly complicated, not too few where the people you need to move forward aren’t there.
  • There’s some order. People aren’t dropping in and out, talking over each other, or being generally inconsiderate
  • There’s a clear decision, outcome, and next steps at the end

Purpose of the Meeting and Direction

The first point and the last are connected: to have a good meeting, there is a core. You’ve all come for a unique purpose, and the end of the meeting should encapsulate what you’ve learned about that purpose and what the next steps are. Thus, the beginning and end of the meeting might sound a little similar:

We’re all here today to discuss how we’re going to support the next version of framework X. I have some new data to show you that frames the direction, Hassan and Jenna are here to talk about some of the details of the implementation, and Angela, we’d love to coordinate with you on a rollout process because it affects your team.

And at the end:

OK, so we decided we’re going in Y direction. Angela, your team seems comfortable doing Z, is that correct? And the rollout timeline we’ve agreed on is 5 weeks. The next steps are to explore the impacts of A, B, and C and reconvene in a week on our findings and process.

This is just an example—it’s not important to model this precisely. But you should be aligning at the beginning and end of the meeting to make sure that nothing major is missing and everyone is on the same page. If you haven’t come to a decision by the end of the meeting, then your next steps may be either to figure out who will make the decision and inform everyone or roll over to a new meeting.

Ideally these sentences are encapsulating information everyone needs:

  • The shared purpose
  • What you’re doing about getting to that outcome
  • Who is owning what
  • How
  • When, what are the timelines

If there are people there who do not need to know this information, they probably shouldn’t have been at the meeting in the first place.

The Agenda

Beyond deciding that a meeting should have an agenda, there are so many ways and means an agenda can be used. Strangely enough, an agenda can also be a way to not have a good meeting, so let’s explore that, too.

An agenda should ideally always state the purpose of the meeting. I personally love to then include some bullets as talking points, as well as space to take notes right in the document during the meeting.

Sometimes people use an agenda to write thoughts down before the meeting, and I would strongly suggest you steer clear of this—there’s nothing wrong with a person keeping notes for themselves for the meeting but if you come to a meeting where an agenda is locked top to bottom with material, it can sometimes shut down the collaborative aspect of the meeting—which means it shouldn’t be a meeting at all, it should just be a shared doc, to be consumed async. Part of the purpose of the meeting is the discussion itself. Again, louder:

Part of the purpose of the meeting is the discussion itself.

Not all meetings are the same

There are also different kinds of meetings. Let’s go over what type of agenda you might use for each:

Brainstorming session: perhaps you don’t want a full agenda, just the purpose and a notes section, or even a Miro board or other whiteboarding tool to use for capturing people’s thoughts, with small areas stubbed out.

Weekly discussion or daily standup: I typically have folks add whatever they like to ours, prefacing their contribution with their name and a small category, for instance, RD for rapid decision, D for discussion, and P for process. Here’s an example:

- [Sarah, RD] should we block off 4 hours to triage our iceboxed issues?

Our team uses a kanban board during the standup and people take turns talking about what they’re doing for that time period. It’s nice how it helps solidify the tasks and priorities for the week, and allows for some course correction if there’s accidental misalignment before the work is done.

We also talk about what was done or shipped in the previous week so we can celebrate a little. Especially on tasks we know took the person a long time or took a lot of effort.

We found through trial and error that twice a week check-ins suited us: once on Monday to kick the week off, and again on Wednesday to keep us aligned and the momentum going.

Cross-Functional meetings: This is one where a more formal agenda with some preparation can be really helpful, so that all parties have enough information about the purpose and what’s being discussed. If you have a lot of information, though, I would suggest creating a one-sheeter and sharing that ahead of time instead of adding everything to an agenda. Sometimes if I know everyone is too busy to read everything async, I will give the first 5 minutes to the group to read through the one-sheeter on the call so we’re all on the same page. People usually appreciate this. YMMV.

All this said, agendas are very useful, but I’ve seen strange culture arise from making strict rules around them. The point of the agenda and meeting is to collaborate on something. That point is nullified if folks are putting process ahead of that impetus.

The best cultures I’ve worked at use both meetings and agendas as tools for working together effectively- tools that everyone equally feels responsible for making useful.

All Kinds of Awkward

OK, you led a meeting! You gave people purpose, you set direction and timelines. But why was it so awkward?!

Not all forms of awkward are bad, really. There are different kinds of awkward, and some are quite natural, some are more harmful. Let’s analyze this for a moment, starting from most innocuous to something more insidious.

You all didn’t know each other well

The team I got to work with at Netlify was some of the silliest, most collaborative, and trustworthy groups I’ve ever had the pleasure of working with. We actively cultivated this culture and it was great fun. Every meeting started with goofing off and chatter. Then, when we got to business.

The meeting would flow effortlessly because we were all comfortable together. One time a friend in the People department asked “what do you do to break the ice with your team”, and I jokingly responded “ice? Our team? No… we don’t need that… maybe we should be frozen?”

Not all conversations are going to be like this. We knew each other fairly well and actively worked to have vulnerability together. If your meetings with other groups you don’t know well have awkward moments, that’s actually pretty natural, and nothing to be too concerned with. You can try to make conversation and that can help, but trying to force it too much can also feel a bit stilted, so just ease up on the guilt for this one. There’s nothing wrong with you, I promise.

There were too many people

During the pandemic, my husband and I would sometimes try to replace in-person dinner parties with zoom versions of the same. What we learned was they didn’t quite work at scale. When you have an in-person party with 12 or more people, everyone doesn’t really stay in one huddle together, they break off to smaller conversations. When we started hosting the zoom parties with smaller groups, the calls became more fluid, relaxed and comfortable.

There’s a certain scale at which conversation begins to feel performative because there are so many eyes on a person when they’re speaking. Meetings are very much the same. Try not to invite too many people to a meeting. If you are worried folks might not feel included unless you invite them, you can either mark them as optional or let them know you’ll be sure to tell them the outcome.

If you’re inviting too many people because there’s a company culture that everyone should be involved in every decision, that might be a sign of a wider issue that needs some solving. Companies at a certain scale start to have issues functioning if there is no clear understanding of ownership. If you’re inviting everyone out of fear of hurt feelings often, it’s likely not a problem with your meetings, and more a sign that you need some clarity. See the DRI section at the end of this chapter for more information on how to mitigate this.

There’s something people aren’t saying

This kind of awkward is probably the most harmful. If the meeting is awkward because people don’t feel comfortable telling the truth, or there’s an elephant in the room, or there’s a smell that needs to be dealt with. Elephant smells? Ok, moving on.

We should watch out for this and try to do something about it. Personally, I’m a “walk towards the fire to put it out” kind of person, and will actually just acknowledge that it’s awkward because it doesn’t feel like we’re being transparent with one another. I’ll state what I know from my perspective and then ask if other folks are feeling the same. 

If you do this, you’ll usually have to wait a beat or two. People will likely be a bit shocked that you came right out and said it. It will take them a couple of seconds to adjust and consider what will happen if they tell the truth, too. It’s crucial that you not speak to fill the silence in these moments. It will feel very uncomfortable, but I promise, you have to let the silence hang for a bit before someone speaks up. Typically from there, people will all start speaking, and you can actually dig into the problems.

Conflicts

There’s an entire chapter devoted to conflicts because the topic is big and nuanced enough to warrant its own time and space, but let’s apply some of the principles here, because there is an intersection of good meetings and dealing with conflicts directly.

The most important piece here is that conflicts are not something to be avoided. It’s not bad that people feel passionate about their work, it’s great. Not all conflicts are negative- the point of the meeting may be to bring to light where folks aren’t aligned. There probably is some base premise or problem they are all trying to solve, but they see the solution differently. It can help to find the alignment there so the ideas can be fleshed out without being attached to a particular person’s identity.

 The identity thing can be a pitfall, because if you have two people discussing their idea instead of an idea, it can feel to them like someone is rejecting them rather than a concept

We want to try to guide towards an approach where it doesn’t feel like anyone is attacking one another, and also manage actively against people being disrespectful to one another. It’s the job of a manager to disambiguate healthy conflict from attack so that respectful discourse is encouraged. If folks are putting out ad hominem attacks, it’s on you to reel that in and move the conversation towards the work instead. Otherwise, it really is hard for the conversation to stay productive.

Typically I’d say it’s good to hear people out, and then reign things back in by discussing what you think you’re hearing and tying it back to a shared purpose. Then we find where we have common ground. Here’s an example:

“What I’m hearing is that Rashida feels that team X is migrating a system that affects her team while they are trying to release a big feature. Is that correct? And that Jerome feels that it’s crucial that team X be able to migrate the system soon for stability purposes. Is that correct?

“OK, well, it sounds like we have a shared goal of making sure the company can ship features with some stability. Perhaps we can talk through what timelines are immovable and which are not so that we can stay coordinated?

“I’m sure we all want to be able to ship said feature without any hiccups and also get the new system up and going”

Here, we stated what we thought we were hearing, which allows for the person to either feel heard or correct us if we’re mistaken and there’s a miscommunication. (Sometimes there is!)

Then we stated the shared goal from both parties, as well as risks and constraints that may play a part in some of the conflicts that need to be ironed out.

You’ll note in the last sentence, we try to tie a knot for a vision of stability that addresses both of their understandable needs.

A couple of things to note: I’m giving an example here and you absolutely don’t have to do it like me. The most important thing is that folks feel heard and that you all agree on what the conflict is. And that you remain open to that discussion, while finding the base premise of why you’re even talking about it.

It’s also way easier said than done. If you have a conversation that goes off the rails, I’d suggest spending a bit of time after you’re off the call to write down what you think happened.

I tend to give myself a section to just talk through the facts of what happened, and then another to talk through my feelings of what went poorly and what could have been better. It helps to check in with the facts separately because our human brains can sometimes try to protect us and see a particular version of an event. Hard to do, but checking in with just the facts helps ground that a bit.

There can be times where a strong conflict happens during a meeting and you’re at an impasse, and you need to give folks time to regroup. I’d suggest calling another meeting in a week as a follow up, and try to hear people out individually in the meantime. Sometimes people need a little distance from a matter, or they’re having a hard day, and that’s totally ok.

The DRI

The DRI stands for “Directly Responsible Individual” and is one of the most important pieces that we haven’t covered yet. A good meeting must have a DRI, and it is not necessarily the person who called the meeting. It might not be you. But you must designate who owns the project and ultimately makes decisions when there’s one to be made.

Why do you need a DRI? Well, as much as you do want to hear input from everyone, eventually you have to make a decision, and there are plenty of things in software development that don’t necessarily have one true answer.

Note that the phrasing is not PWMD (Person Who Makes Decisions) though that acronym looks pretty hardcore. Instead, we use Directly Responsible Individual because that’s also core to deciding who this person is. They are the person who is going to own the outcome.

That’s part of why not everyone can get equal say- if it’s your project and you are on the line for the outcome of whatever decisions are made, you can see how you would also need to own decision making. And likewise, if people who have no skin in the game decide things, they might not understand all the moving parts or invest as much in the gravity of the matter.

The appointment of the DRI not only unlocks the groups to make final decisions and move forward, but also places the responsibility on the party that will carry the weight.

There are several systems of ownership you can explore, such as DACI, which separates out Driver, Approver, Contributors, and Informed so that everyone knows their roles, and several others such as RACI and RAPID. Use whichever system makes the most sense for your organization.

I find it best to identify this person early on in a project and make sure it is restated at the start of a meeting (it can be included on the agenda as well), as it helps greatly if you find yourself at a crossroads. This person can unblock you and help the group move forward.

Moving Forward

It may at times feel like meetings are a drag on a software engineering process, but it doesn’t always have to feel this way. There’s something special about collaborating with a group of people who are respectful and working towards a common purpose. Good meetings can provide clarity and save people hours and days of work when they’re headed in the wrong direction. Having clear ownership, documentation, and only the right people in the room can keep many teams in lockstep, even when problems are complex.

Buy the Book

This is just a sample of the kind of content from my latest book coming out soon…


The post Good Meetings appeared first on CSS-Tricks. You can support CSS-Tricks by being an MVP Supporter.