us

Episode 430: Marco Faella on Seriously Good Software

Felienne interviews Marco Faella about his book ‘Seriously Good Software,’ which aims to teach programmers to use six key qualities to better analyze the quality of their code bases.




us

Episode 443: Shawn Wildermuth on Diversity and Inclusion in the Workplace

Felienne discusses diversity and inclusivity in software development with Shawn Wildermuth, Microsoft MVP and creator of the Hello World movie.




us

Episode 472: Liran Haimovitch on Handling Customer Issues

Liram Haimovitch talks about how a business handles customer issues with a software product. How issues start out with a dedicated customer-facing team and when they may be escalated to engineering.




us

Episode 490: Tim McNamara on Rust 2021 Edition

Tim McNamara, author of Rust in Action, discusses the top three benefits of Rust and why they make it a performant, reliable and productive programming language.




us

Episode 498: James Socol on Continuous Integration and Continuous Delivery (CICD)

James Socol of Policygenius discusses continuous integration and continuous delivery, ways to test and deploy software quickly and easily. SE Radio host Felienne spoke with Socol about why CI and CD matter for the development process, what tools to use...




us

Episode 502: Omer Katz on Distributed Task Queues Using Celery

Omer Katz, a software consultant and core contributor to the Celery discusses the Celery task processing framework with host Nikhil Krishna. We discuss in depth, the Celery task processing framework, it's architecture and the underlying messaging...




us

Episode 513: Gil Hoffer on Applying DevOps Practices to Managing Business Applications

Gill Hoffer, co-founder and CTO at Salto, talks with SE Radio host Kanchan Shringi about a new persona -- the Business Engineer -- created by the rise of SaaS and adoption of best-of-breed business applications for back office systems. They examine...




us

Episode 513: Gil Hoffer on Applying DevOps Practices to Managing Business Applications

Gill Hoffer, co-founder and CTO at Salto, talks with SE Radio host Kanchan Shringi about a new persona -- the Business Engineer -- created by the rise of SaaS and adoption of best-of-breed business applications for back office systems. They examine...




us

Episode 520: John Ousterhout on A Philosophy of Software Design

John Ousterhout, professor of computer science at Stanford University, joined SE Radio host Jeff Doolittle for a conversation about his book, A Philosophy of Software Design. They discussed the history and ongoing challenges of software system design, especially the nature of complexity and the difficulties handling it. The conversation also explored various design concepts from the book, such as modularity, layering, abstraction, information hiding, maintainability, and readability.




us

SE Radio 562: Bastian Gruber on Rust Web Development

Bastian Gruber, author of the book Rust Web Development, speaks with host Philip Winston about creating server-based web applications with Rust. They explore Rust language features, tooling, and web frameworks such as Warp and Tokio. From there, they examine the steps to build a simple web server and a RESTful API, as well as modules, logging and tracing, and other aspects of web development with Rust.




us

SE Radio 576: Jens Neuse on Back Ends for Front Ends

Jens Neuse, founder of Wundergraph, joins SE Radio host Jeff Doolittle for a conversation about back ends for front ends, or BFF. Jens begins by explaining how a heavy integration burden is often placed on front-end development teams. When multiple APIs must be integrated, it can be challenging for client development in web, mobile, and desktop environments. Explaining how APIs should be treated as dependencies, just like packages, the episode explores BFF patterns and use cases, as well as the future potential emergence of a “git for APIs” standard. This episode is sponsored by ClickSend




us

SE Radio 578: Ori Mankali on Secrets Management using Distributed Fragments Cryptography

In this episode, Ori Mankali, senior VP of engineering at cloud security startup Akeyless, speaks with SE Radio’s Nikhil Krishna about secrets management and the innovative use of distributed fragment cryptography (DFC). In the context of enterprise IT, 'secrets’ are crucial for authentication in providing access to internal applications and services. Ori describes the unique challenges of managing these sensitive data, particularly given the complexities of doing so on a large scale in substantial organizations. They discuss the necessity for a secure system for managing secrets, highlighting key features such as access policies, audit capabilities, and visualization tools. Ori introduces the concept of distributed fragment cryptography, which boosts security by ensuring that the entire secret is never known to any single entity. The episode explores encryption and decryption and the importance of key rotation, as they consider the challenges and potential solutions in secrets management.




us

SE Radio 580: Josh Doody on Mastering Business Communication for Software Engineers

Josh Doody, author of Mastering Business Email, speaks with host Brijesh Ammanath about how software engineers can master business communication. They begin with an exploration of various communication modes, including Slack, virtual meetings, emails, and presentations. Josh shares several strategies to improve communication skills and cross-cultural communication, but if there's one key take away from this episode, it might be: “use positive language for any medium of communication; be kind and use positive words.” Brought to you by IEEE Software magazine and IEEE Computer Society.




us

SE Radio 584: Charles Weir on Ruthless Security for Busy Developers

Charles Weir—developer, security researcher, and Research Fellow at Security Lancaster—joins host Giovanni Asproni to discuss an approach that development teams can use to create secure systems without wasting effort on unnecessary security work. The episode starts with a broad description of the approach, which is based on Weir's research and on a free Developer Security Essentials workshop he created. Charles presents some examples from real-world projects, his view on AI's impact on security, and information about the workshop and where to find the materials. During the conversation, they consider several related topics including the concept of "good enough" security; security as a product decision; risk assessment, classification, and prioritization; and how to approach security in startups, greenfield, and legacy systems.




us

SE Radio 585: Adam Frank on Continuous Delivery vs Continuous Deployment

Adam Frank, SVP of Product and Marketing at Armory.io, speaks with SE Radio’s Kanchan Shringi about continuous integration, continuous delivery, and continuous deployment – and how they differ. Frank suggests that organizations begin by identifying how the CI/CD process aligns best with their unique goals, noting that such goals might be different for B2C versus B2B SAAS (software as a service). They also discuss how the process can differ for monoliths compared to microservices-based products. Finally, they talk about continuous deployment as a service and some unique aspects of Armory’s approach.




us

SE Radio 603: Rishi Singh on Using GenAI for Test Code Generation

Rishi Singh, founder and CEO at Sapient.ai, speaks with SE radio’s Kanchan Shringi about using generative AI to help developers automate test code generation. They start by identifying key problems that developers are looking for in an automated test-generation solution. The discussion explores the capabilities and limitations of today’s large language models in achieving that goal, and then delves into how Sapient.ai has built wrappers around LLMs in an effort to improve the quality of the generated tests. Rishi also suggests how to validate the generated tests and outlines his vision of the future for this rapidly evolving area. Brought to you by IEEE Computer Society and IEEE Software magazine. This episode is sponsored by WorkOS.




us

SE Radio 620: Parker Selbert and Shannon Selbert on Robust Job Processing in Elixir

Shannon Selbert, co-founder of Soren and developer of Oban, and Parker Selbert, creator of the Oban background job framework, chief architect at dscout, and co-founder of Soren, speak with SE Radio host Gavin Henry about robust job processing in Elixir. They explore the reliability, consistency, and observability in relation to job processing, to understand how Oban, Elixir, and PostgreSQL deliver them.

The Selberts describe why Oban was created, its history, which parts of the Elixir ecosystem they use, and why this would not be possible without PostgreSQL and Elixir. They discuss the lessons learned in the 5 years since the first release, as well as use cases, job throughput, the hardest problem to solve so far, workers, queues, CRON, distributed architectures, retry algorithms, just-once methodologies, the reliability the beam brings, consistency across nodes, how PostgreSQL is vital, telemetry data, best use cases for Oban, and the most common issues that new users face. Brought to you by IEEE Computer Society and IEEE Software magazine.




us

SE Radio 622: Wolf Vollprecht on Python Tooling in Rust

Wolf Vollprecht, the CEO and founder of Prefix.dev, speaks with host Gregory M. Kapfhammer about how to implement Python tools, such as package managers, in the Rust programming language. They discuss the challenges associated with building Python infrastructure tooling in Python and explore how using the Rust programming language addresses these concerns. They also explore the implementation details of Rust-based tooling for the Python ecosystem, focusing on the cross-platform Pixi package management tool, which enables developers to easily and efficiently install libraries and applications in a reproducible fashion. Brought to you by IEEE Computer Society and IEEE Software magazine.




us

SE Radio 635: Stevie Caldwell on Zero-Trust Architecture

Stevie Caldwell, Senior Engineering Technical Lead at Fairwinds, joins host Priyanka Raghavan to discuss zero-trust network reference architecture. The episode begins with high-level definitions of zero-trust architecture, zero-trust reference architecture, and the pillars of Zero Trust. Stevie describes four open-source implementations of the Zero Trust Reference Architecture: Emissary Ingress, Cert Manager, LinkerD, and the Policy Engine Polaris. Each component is explored to help clarify their roles in the Zero Trust journey. The episode concludes with a look at the future direction of Zero Trust Network Architecture.

This episode is sponsored by QA Wolf.




us

SE Radio 639: Cody Ebberson on Regulated Industries

Cody Ebberson, CTO of Medplum, joins host Sam Taggart to discuss the constraints that working in regulated industries add to the software development process. They explore some general aspects of developing for regulated industries, such as healthcare and finance, as well as a range of specific considerations that can add complexity and effort. Cody describes how translating regulatory requirements into test specifications and automating those tests can help streamline software development in these regulated environments. 

Brought to you by IEEE Computer Society and IEEE Software magazine.




us

AMD 5nm Zen 4 EPYC CPUs And Radeon Instinct GPUs To Power El Capitan Supercomput

AMD just announced today a design win in conjunction with the Lawrence Livermore National Laboratory (LLNL) and Hewlett-Packard Enterprise (HPE), win which it will be providing the hardware powering the El Capitan exascale-class supercomputer. What caught our eye about this announcement was not the compute performance -- which will be enormous ... [PCSTATS]




us

Thrustmaster eSwap Pro Controller Review

Today we test at OCinside.de the top controller from the extensive gamepad collection of Thrustmaster. In comparison we are testing the original controllers from Microsoft Xbox One, Xbox 360, Sony PlayStation 4 and PlayStation 3. What makes this Thrustmaster eSwap Pro game controller different from thousands of other products on the market and wher... [PCSTATS]




us

CalDigit USB-C Pro Dock Review

Is the USB-C Pro Dock from CalDigit the best bang for your buck? Join us as we investigate in our review."... [PCSTATS]




us

AMD CPUs for the past 9 years are vulnerable to data leak attacks

"It's not just Intel chips that are vulnerable to hard-to-fix security flaws. Researchers at the Graz University of Technology have detailed a pair of side channel attacks under the "Take A Way" name that can leak data from AMD processors dating back to 2011, whether it's an old Athlon 64 X2, a Ryzen 7 or a Threadripper. Both exploit the "way predi... [PCSTATS]




us

Corsair Scimitar RGB Elite Optical Mouse Review

The Corsair Scimitar RGB Elite is a mouse that offers plenty of buttons, turns heads with its MMO and MOBA gaming performance, and excellent build quality.... [PCSTATS]




us

ASUS ROG Zenith II Extreme Alpha (TRX40) Motherboard Review

The rewards for offering a high-performance flagship motherboard on the TRX40 platform are clear. Vendors are all competing at price points well above �600 which culminates in motherboard options filled to the brim with the features that almost anybody could wish for. ASUS� ROG Zenith II Extreme was no exception to that point. However, ASUS has tak... [PCSTATS]




us

Raspberry Pi Enthusiast Creates Coronavirus Live Global Tracker Display

There are so many things that can be done with a little spare time and a Raspberry Pi that it boggles the mind; the little developer board can be made to do just about anything builders can dream up. One of the most recent projects we've seen using the Pi turned up on Reddit from a person called jul-bruegger who combined the Raspberry Pi Zero... [PCSTATS]




us

Serious Statistics: The Frustum Follies.

"I will share a better explanation to the idea for this article in a later section, but here is a short version: How much an impact, if any, does the aspect ratio have on performance? Beyond any doubt, 16:9 is the most common aspect ratio, and the differences between a 1920x1080 and 2560x1440 display or image can be thought of in terms of sampling ... [PCSTATS]




us

WordPress Uses RSS as Blog Export Format

If you export your WordPress blog, it is delivered to you as an RSS feed that holds all of the blog's entries, pages and comments. WordPress makes use of five namespaces and calls the format WordPress eXtended RSS (WXR). I'm working on a Java application that converts a WXR file into a set of static HTML pages.




us

Every Mastodon User Has an RSS Feed

The distributed social network Mastodon has grown to 12.8 million user accounts, supporting itself through user donations and a lot of effort by the volunteers running servers. There's no CEO changing the network at whim, no ads and no algorithms that manipulate what you see to increase engagement. Just a scroll of posts by the people you follow pulled from all over the world.

Every Mastodon account has an RSS feed that can be found by going to the user's Mastodon page and adding ".rss" to the URL of that page. For example, the RSS feed for Bonaventure Software is at this address:

https://mastodon.online/@bonaventuresoft.rss

The feeds are valid RSS and use the Media-RSS and Webfeeds namespaces.

The Media-RSS content element contains the photo, audio or video included in the Mastodon post, if one is present:

<media:content url="https://files.mastodon.online/media_attachments/files/109/326/769/636/254/303/original/552ebb9fd3f30171.png" type="image/png" fileSize="49052" medium="image">
  <media:rating scheme="urn:simple">nonadult</media:rating>
  <media:description type="plain">Eli Lilly & Co stock performance graph over the last month, showing lower valuations than the one caused by the bogus announcement of free insulin.</media:description>
</media:content>

The Webfeeds icon element holds the URL of the user's avatar:

<webfeeds:icon>https://files.mastodon.online/accounts/avatars/109/298/336/948/075/673/original/e76dfce4df4bef76.gif</webfeeds:icon>

One potential improvement to the feed would be to add a link element from the Atom namespace to identify the URL of the RSS feed, as in this example:

<atom:link href="https://mastodon.online/@bonaventuresoft.rss" rel="self" type="application/rss+xml" />

That might not happen anytime soon. Mastodon is a frenetic open source project with 61 open issues and suggestions involving RSS.




us

How to Read an RSS Feed with PHP Using SimplePie

If you need to load an RSS feed with the PHP programming language, the open source library SimplePie greatly simplifies the process of pulling in items from a feed to present on a website, store in a database or do something else coooool with the data. There's a full installation guide for SimplePie but you can skip it with just three steps:

  1. Download SimplePie 1.5.
  2. Copy the file autoloader.php and the folder library to a folder that's accessible from your PHP code.
  3. Make note of this folder; you'll be using require_once() to load autoloader.php from that location.

SimplePie has been designed to work the same regardless a feed's format. It supports RSS 2.0, RSS 1.0, Atom and the earlier versions of RSS. Additionally it can read feed elements from nine namespaces.

Here's PHP code that loads feed items from the news site Techdirt and displays them in HTML:

// load the SimplePie library
require_once('/var/www/libraries/simplepie-1.5/autoloader.php');

// load the feed
$feed = new SimplePie();
$feed->set_feed_url('https://www.techdirt.com/feed/');
$feed->init();
$feed->handle_content_type();

// create the output
$html_output = '';
foreach ($feed->get_items() as $item) {
  $html_output .= '<p><a href="' . $item->get_link() . '">' . $item->get_title() . '</a></p>';
  $html_output .= $item->get_description();
  $html_output .= '<p>By ' . $item->get_author(0)->get_name() . ', ' . $item->get_date();
}

// display the output
ECHO <<<END
$html_output
END;

The API documentation for SimplePie_Item lists the functions that can extract data from each feed item. The versatility of the library is demonstrated by get_authors(), which can retrieve an item's authorship information whether it was in the RSS author element, Dublin Core creator, iTunes author, or Atom author.

SimplePie supports caching so that a feed isn't downloaded every time code is executed. The addition of these lines turns on caching, specifies the location of a cache folder and sets the time to use a cached version to four hours (14,400 seconds):

$feed->set_cache_location('/var/www/cache/');
$feed->set_cache_duration(14400);
$feed->enable_cache();

SimplePie was created by RSS Advisory Board member Ryan Parman, Geoffrey Sneddon and Ryan McCue. The project is currently maintained on GitHub by Malcom Blaney.




us

Be Unique And Use RSS Guid Like Everybody Else

Winter scenes: Snowflakes by Theodor Horydczak

If you publish an RSS feed, you should do a solid for the developers of RSS readers by including a guid in each item. The guid's job is to be a unique identifier that helps software downloading your feed decide whether it has seen that item before. Here's the guid for an item on the arts and technology blog Laughing Squid:

<guid isPermaLink="false">https://laughingsquid.com/?p=914660</guid>

No other item on Laughing Squid will ever have this guid value. It's a URL that loads a blog post with the title Playful Elephant Pretends to Eat Woman's Hat. If you load the guid's URL https://laughingsquid.com/?p=914660, it redirects to the permanent link of the post. Because the guid is not the permanent link, there's an isPermaLink attribute with a value of false.

Most guid values in RSS feeds are the permanent link of the item, as in this example from the world news site Semafor:

<guid>https://www.semafor.com/article/07/07/2023/us-jobs-data-what-experts-make-of-the-new-numbers</guid>

A drawback of using the permalink is that if any part of the URL changes -- such as the title text or the domain name -- the guid changes and RSS readers will think this is a new item to show the feed's subscribers, when it's actually a repeat.

A guid doesn't have to be a URL. It can be any string that the feed publisher has chosen to be unique. Here's the guid from the RSS Advisory Board's feed for this blog post:

<guid isPermaLink="false">tag:rssboard.org,2006:weblog.217</guid>

Our guid follows the TAG URI scheme, a simple way to assure uniqueness by putting these five components together in this order:

  1. The text "tag"
  2. A domain owned by the feed provider
  3. A year the provider owned that domain
  4. A short name for the feed different from any other feed on the site
  5. The internal ID number of the post

There's different punctuation between each component. The year 2006 was when the board began using the domain rssboard.org. No one else used that domain that year, so any feed reader that stores "tag:rssboard.org,2006:weblog.217" as this item's guid should never encounter that value in any other item on any other feed.

To see how RSS 2.0 feeds are using guid, several thousand feeds were downloaded this evening from an RSS aggregator that publicly shares the OPML subscription lists of its users.

CategoryTotalPercentage
Total number of feeds4,954--
Feed using guid4,77796.4%
Feeds using non-permalinks in guid75215.2%

The term guid means "globally unique identifier," but RSS 2.0 does not require global uniqueness in guids. Because the TAG URI scheme does a good job of serving that purpose, Blogger, Flickr, MetaFilter, SoundCloud and The Register are among the sites using it in their feeds.




us

The RSS Advisory Board Just Turned 20

"Tomorrow we will run faster, stretch out our arms farther."

Today is the 20th birthday of the RSS Advisory Board, the group that publishes the RSS specification. It was formed on July 18, 2003, when the copyright of the specification was transferred to Harvard University, which immediately released it under a Creative Commons license and deferred all matters related to RSS to the new board.

At the time of the board's launch, here's how the founding members described its purpose:

Is the advisory board a standards body?

No. It will not create new formats and protocols. It will encourage and help developers who wish to use RSS 2.0. Since the format is extensible, there are many ways to add to it, while remaining compatible with the RSS 2.0 specification. We will help people who wish to do so.

What does the advisory board actually do?

We answer questions, write tech notes, advocate for RSS, make minor changes to the spec per the roadmap, help people use the technology, maintain a directory of compatible applications, accept contributions from community members, and otherwise do what we can to help people and organizations be successful with RSS.

This remains the purpose 140 dog years later. In addition to maintaining the current RSS specification, we are the official publisher of Netscape's RSS 0.90 and RSS 0.91 specifications and Yahoo's Media RSS specification.

We also offer an RSS Validator and RSS Best Practices Profile containing our recommendations for how to implement the format.

There's a resurgence of interest in RSS today as people discover the exhilarating freedom of the open web. Some of this is due to dissatisfaction with deleterious changes at big social sites like Twitter and Reddit. Some is due to satisfaction with Mastodon, a decentralized social network owned by nobody with more than one million active users. As long as there are social media gatekeepers using engagement algorithms to decide what you can and can't see, there will be a need to get around them. When someone offers an RSS or Atom feed and you subscribe to it in a reader, you get their latest updates without manipulation.

Here's to another 20 years of feeding readers, unlocking gates, helping developers adopt RSS and repeatedly getting asked the question, "Can an RSS item contain more than one enclosure?"




us

How to Read an RSS Feed with Java Using XOM

There are a lot of libraries for processing XML data with Java that can be used to read RSS feeds. One of the best is the open source library XOM created by the computer book author Elliotte Rusty Harold.

As he wrote one of his 20 books about Java and XML, Harold got so frustrated with the available Java libraries for XML that he created his own. XOM, which stands for XML Object Model, was designed to be easy to learn while still being strict about XML, requiring documents that are well-formed and utilize namespaces in complete adherence to the specification. (At the RSS Advisory Board, talk of following a spec is our love language.)

XOM was introduced in 2002 and is currently up to version 1.3.9, though all versions have remained compatible since 1.0. To use XOM, download the class library in one of the packages available on the XOM homepage. You can avoid needing any further configuration by choosing one of the options that includes third-party JAR files in the download. This allows XOM to use an included SAX parser under the hood to process XML.

Here's Java code that loads items from The Guardian's RSS 2.0 feed containing articles by Ben Hammersley, displaying them as HTML output:

// create an XML builder and load the feed using a URL
Builder bob = new Builder();
Document doc = bob.build("https://www.theguardian.com/profile/benhammersley/rss");
// load the root element and channel
Element rss = doc.getRootElement();
Element channel = rss.getFirstChildElement("channel");
// load all items in the channel
Elements items = channel.getChildElements("item");
for (Element item : items) {
  // load elements of the item
  String title = item.getFirstChildElement("title").getValue();
  String author = item.getFirstChildElement("creator",
    "http://purl.org/dc/elements/1.1/").getValue();
  String description = item.getFirstChildElement("description").getValue();
  // display the output
  System.out.println(">h2>" + title + ">/h2>");
  System.out.println(">p>>b>By " + author + ">/b>>/p>");
  System.out.println(">p>" + description + ">/p>");

All of the classes used in this code are in the top-level package nu.xom, which has comprehensive JavaDoc describing their use. Like all Java code this is a little long-winded, but Harold's class names do a good job of explaining what they do. A Builder uses its build() method with a URL as the argument to load a feed into a Document over the web. There are also other build methods to load a feed from a file, reader, input stream, or string.

Elements can be retrieved by their names such as "title", "link" or "description". An element with only one child of a specific type can be retrieved using the getFirstChildElement() method with the name as the argument:

Element linkElement = item.getFirstChildElement("link");

An element containing multiple children of the same type uses getChildElements() instead:

Elements enclosures = item.getChildElements("enclosure");
if (enclosures.size() > 1) {
  System.out.println("I'm pretty sure an item should only include one enclosure");
}

If an element is in a namespace, there must be a second argument providing the namespace URI. Like many RSS feeds, the ones from The Guardian use a dc:creator element from Dublin Core to credit the item's author. That namespace has the URI "http://purl.org/dc/elements/1.1/".

If the element specified in getFirstChildElement() or getChild Elements() is not present, those methods return null. You may need to check for this when adapting the code to load other RSS feeds.

If the name Ben Hammersley sounds familiar, he coined the term "podcasting" in his February 2004 article for The Guardian about the new phenomenon of delivering audio files in RSS feeds.




us

Surprising Solidarity in the Fight for Clean Water and Justice on O’ahu

After a 2021 leak at the U.S. military’s Red Hill fuel storage facility poisoned thousands, activists, Native Hawaiians, and affected military families have become unlikely allies in the fight for accountability.





us

Imagining a More Just Climate Future

When we think about climate change, we often think in terms of statistics, studies, and measurements of melting glaciers, dwindling wildlife populations, and mass human migration. It’s a grim reality.






us

Sacred Sustenance

Fifty years ago, the Boldt decision reaffirmed Indigenous fishing rights and recognized tribes as equal partners in resource management.




us

A Progress 2025 Vision for Climate Justice

As Hurricanes Helene and Milton devastate the Southeastern U.S., Antonia Juhasz articulates a just vision for how to fix our climate.




us

The Contentious Role of Third-Party Candidates

In a high-stakes election, left-leaning third party candidates are receiving Republican support, and may be wooing disaffected progressive voters. Former Green Party vice presidential candidate Rosa Clemente shares her take on this year’s race.






us

United Auto Workers’ Strike Yields Win for “Just Transition”

In bringing electric vehicle battery plants under its national contract, the UAW took a major step toward transitioning away from fossil fuels in a way that protects workers' rights.




us

Debt Collective Cancels $10M of Morehouse College Student Loans

Black students are disproportionately impacted by student loans, but this debtors' union is taking steps to repair that disparity.




us

New York Considers a Social Housing Bill

Social housing as a concept is gaining popularity. Now, the state of New York is considering a bill to make it a reality.




us

Tax Day Injustice

Thanks to the GOP’s 2017 tax reform law, dozens of large corporations paid their CEOs more than they paid the federal government in taxes.