Your browser may have trouble rendering this page. See supported browsers for more information.

Contents

273 Articles
13 Comments

Search

Yesterday

Fighting with Fowler on Continuous Integration

Published by marco on

 The article Continuous Integration by Martin Fowler makes many interesting points. It is a compendium of know-how about CI by one of the industry heavyweights, who’s been using it for a long time.

While I found a lot of what he had to say interesting, I did wonder how applicable CI is for the kinds of teams that I know and work with. He makes several statements toward that end that pretty severely limit the applicability of what he calls “true CI” for many, if not most, teams.

I think he should have started... [More]

1 month Ago

Web Interop 2024

Published by marco on

The article The web just gets better with Interop 2024 by Jen Simmons (Webkit Blog) writes,

 The Interop project aims to improve interoperability by encouraging browser engine teams to look deeper into specific focus areas. Now, for a third year, Apple, Bocoup, Google, Igalia, Microsoft, and Mozilla pooled our collective expertise and selected a specific subset of automated tests for 2024.

“Some of the technologies chosen have been around for a long time. Other areas are brand new. By selecting some of the highest priority... [More]

3 months Ago

SourceLink and external sources

Published by marco on

I published a very similar version of the following article in the DevOps Wiki at Uster Technologies AG. Since nearly all of that post is general knowledge that I would have been happy to find before I started my investigations, I’m sharing it here.

Overview

When we think about navigating or debugging our code, we usually focus on the code we’ve written ourselves—local sources in our file system. IDEs have classically focused on being able to debug and navigate this code.

More and more,... [More]

Learning how to use GenAI as a programming tool

Published by marco on

 The article Exploring Generative AI by Birgitta Böckeler (MartinFowler.com) is chock-full of helpful tips from eight newsletters totaling 25 pages that she wrote throughout 2023. I include some of my own thoughts, but most of this article consists of citations.

A lot of my analysis and notes boils down to: you need to know what you’re doing to use these tools. They can help you build things that you don’t understand, but it’s not for medium- or long-term solutions. I’ve written a lot more about the need for expertise in How... [More]

AOT, JIT, and PGO in .NET

Published by marco on

The latest video by Nick Chapsas has a more-than-usually clickbait-y headline. The “big” problem that NativeAOT has, is that it’s 4% slower during runtime than the JIT-compiled version.

NativeAOT in .NET 8 Has One Big Problem by Nick Chapsas (YouTube)

That doesn’t seem like such a big problem to me, when the point of AOT is to improve cold-start times for applications launched on-demand. For that use-case, AOT shines. It’s over 4x faster on startup than the JIT-compiled version. It’s incredibly impressive that JIT-compilation takes less than 1/10 of a... [More]

How to replace “warnings as errors” in your process

Published by marco on

A build started started failing after a commit. However, the errors had nothing to do with the changes in the commit. A little investigation revealed that the cloud agent had started using a newer version of the build tool that included an expanded set of default warnings. These warnings started appearing first on CI because developers hadn’t had the chance to update their tools yet.

The “warnings as errors” setting turned what would have been a build with a few extra warnings into a failing... [More]

PRs suck. Stop trying to fix them.

Published by marco on

I read through the article Your GitHub pull request workflow is slowing everyone down (Graphite.Dev) with great interest because I, too, am not thrilled about how PRs work. While I agree with the problems Graphite see with PRs, I think they miss other problems—and I don’t like their solution very much.

PRs are, apparently, HUGE

“The single most important bottleneck is PR size − large PRs can make code reviews frustrating and ineffective. The average PR on GitHub has 900+ lines of code changes. For speed... [More]”

4 months Ago

“Developer experience” is rarely a requirement

Published by marco on

The article Some notes on Local-First Development by Kyle Matthews (Bricolage) focuses on a very good trend in app development, but focuses a bit too much on what he calls DX, or developer experience.

“I see “local-first” as shifting reads and writes to an embedded database in each client via“sync engines” that facilitate data exchange between clients and servers. […] The benefits are multiple:”
  • Simplified state management for developers.
  • Built-in support for real-time sync, offline usage, and multiplayer... [More]

5 months Ago

Handling long-running projects

Published by marco on

This is a brilliant interview, in that Oren Eini just talks for about 40 minutes, answering pretty much just one or two questions.

Oren Eini on Building Projects that Endure by Technology and Friends (YouTube)

At one point (I forget where), he says,

“I don’t like unit tests.”

Agreed. I likelove automated tests. They’re indispensable. But I think unit tests are only useful when you want to focus on a failing integration test. David rightly points out that they’re really good for pinpointing where a problem actually happens, but Eini says that they also “hinder change”... [More]

Architecture is about intent

Published by marco on

The following video is a talk by Robert Martin “Uncle Bob”, one of the graybeards worth listening to. This video from 2011 is wide-ranging and contains a lot of brilliant advice. It’s stuff that we’ve known for a long time now, but every generation of programmers needs to re-learn these things about every 5-10 years. You usually can’t stop people from just reinventing the wheel because who wants to watch videos of or read blog posts written by old dudes, ammirite?

Ruby Midwest 2011 − Keynote: Architecture the Lost Years by Robert Martin by Robert C. Martin in 2011 (YouTube)

At 10:00, he talks about... [More]

Woefully unqualified “programmers”

Published by marco on

As I was reading the absolute train wreck of a unit test in Testing with a Lisp (Daily WTF), the song “What the fuck is going on?” popped into my head, like it always does when I see that a programmer not only didn’t understand the assignment, not only doesn’t know how to program, but also doesn’t know that they don’t know how to program.

They are living their best life because they don’t think that “knowing how to program” is required in order to be a programmer. Neither does their boss or team, I guess.... [More]

6 months Ago

Technology-independent software-development courses

Published by marco on

I was recently asked something like the following question, which I am citing with a few minor edits.

We would like to do a course about SW development with Python, preferably an online course, so that we can start at our own pace.

We don’t want a Python course, but would instead like a course more about SW development. It would be great if it were in Python because we are comfortable with it.

The interesting topics would be:

  • object-oriented programming
  • functional programming
  • design... [More]

To crash or not to crash; that is the question

Published by marco on

Note: I found this old draft containing my response to a colleague.

I 100% agree with you, in general. I absolutely want to know immediately when an assumption I’ve made does not hold.

But…😁

The degree to which I’m willing to crash depends on whose consistency I’m basing my assumptions on. When I call a method in my code from another method in my code, I’m absolutely going to assert that an argument is not null. I can control that. My IDE will tell me when I might be passing null. That... [More]

Encodo White Papers Archive

Published by marco on

This article is a copy of the white papers and process description that I wrote for Encodo Systems while I still worked there. I’ve preserved a copy of it here and in the linked articles.

Through our many years of experience building software, we’ve accumulated methodologies and principles that lead to quality software.

  • The experience and know-how we bring to our consulting services also make us excellent partners in development-process consulting.
  • We have experience in reviewing existing... [More]

Encodo White Papers: DI, IOC and Containers (2019)

Published by marco on

Encodo keeps the SOLID principles in mind when designing software.

DI & IOC

We implement the Inversion of Control [I] pattern with the dependency-injection pattern (D) to allow for a large amount of flexibility in how an application is composed. We’ve applied this principle throughout the Quino framework and use it in our products as well.

What does this mean? It means that the product or framework doesn’t make any decisions about which exact components to use. Instead, it indicates the API... [More]

Encodo White Papers: Clean and Safe Code (2019)

Published by marco on

These are the two core principles that guide how we write code:

  • KISS: Keep It Simple, Stupid
  • YAGNI: You Ain’t Gonna Need It

KISS

This first principle is a constant reminder to ourselves to avoid the seductive call of cleverness. Most code does not need to be clever. Very occasionally, it is necessary to implement something with real flair, that requires explanation.

The best code, though, requires no explanation. The best code gets its job done in a very boring way, using the same... [More]

Encodo White Papers: Testing as first-class citizen (2019)

Published by marco on

Tests are code. Writing tests is not a “step”—it is part of writing the code itself. The component is nothing without its tests.

It should be easy to verify any requirement with a test. The tests should tell the story of the requirements.

A developer can test any component in isolation (unit testing) or can test the component in the constellation in which it normally exists (integration testing).

Tests are code

Just so we’ve said it: tests are not a place to use a different coding style... [More]

Encodo White Papers: Document Everything (2017)

Published by marco on

Good documentation is part of every piece of quality software. What do we mean by “good”, though? Or “documentation”, for that matter? Quality software should be self-explanatory, but don’t be fooled into thinking that you don’t need to write documentation.

Actors & Use Cases

Documentation has an audience. Before writing anything, consider who you’re writing it for. What are the possible audiences?

Evaluators

Evaluators are interested in what your software does, how it interacts with other... [More]

Encodo White Papers: Continuous Integration and Delivery (2017)

Published by marco on

An important part of the software process is the final step: delivery.

If you can’t get your software into your customer’s hands, then what’s the point of writing it at all?

Goals

There are several at-times cross-cutting goals. In descending order of importance, they are:

  • Improve reliability and quality of releases
  • Improve efficiency of the release process
  • Improve testing feedback loop
  • Improve efficiency of the development process

Definition

There are several aspects to continuous... [More]

Encodo White Papers: Design by Contract (2006)

Published by marco on

Design by Contract is a software engineering practice in which software requirements and promises − the “Contract” − are explicitly written into the code. The code is, at the same time, better documented, more reliable and easier to test against. Encodo uses this technique to ensure software quality.

A brief overview of contracts

A software contract is composed of several components: preconditions, postconditions and invariants. Preconditions are what a component requires of a client, whereas... [More]

Encodo White Papers: Code Reviews (2017)

Published by marco on

A healthy and active review culture is essential for any team interested in building quality software. At Encodo, we’ve been doing reviews for a long time. They’ve become an essential part of everything we do:

  • Analysis
  • Estimates
  • Design
  • Architecture
  • Coding
    • Style
    • Performance
    • Coverage
    • Security
  • Deployment
  • And more…

Definition

What we mean by review is not a formal process at all. It is simply that you prepare work you’ve done for an informal presentation to a team member. Explaining what... [More]

Encodo White Papers: Component-based Design (2006)

Published by marco on

This article is part of an archive of Encodo White Papers.

What is the best approach when designing a new application, be it a small tool or an end-user application?

Build a Prototype?

Many developers jump straight into a prototype, in order to get a feel for how the application will work. While prototypes are good for demonstrations, they are dangerous: in projects with tight time or budget constraints, the temptation to simply “build out” the prototype becomes irresistible. This leads to... [More]

Encodo White Papers: Test-driven Development (2006)

Published by marco on

Most people in the software industry have heard of test-driven development — it has become a buzzword with several possible meanings.

The Problem with Unit Testing

One of the more negative associations is the notion of unit testing. Unit testing traditionally involves writing a test for each and every routine in a unit or class, to ensure that it does what it claims. This practice has, of late, declined in popularity — mostly because of the sheer mindlessness of maintaining complete... [More]

7 months Ago

The UI is an afterthought, a detail

Published by marco on

Complexity: Divide and Conquer! by Michel Weststrate on May 7, 2017 (YouTube)

“Can we make our UI dumb enough to make our app usable without it?”

The video demonstrates navigating through a simple e-commerce site. Then, he shows how the app can be driven from the console by calling the APIs directly—upon which the URL and UI all update automatically. That is, the logic is not in the UI.

He then demonstrates that he can drive the web site without a UI by deleting the rendering to React DOM entirely. He can still manipulate the console API to perform the same... [More]

On the usefulness of containers like Docker

Published by marco on

The article Works on most machines by Mark Seemann (Ploeh Blog) argues provocatively that containers are a fallback for poorly written software.

“When you have general-purpose software, though, do you really need containers?”

Well, yes. The point isn’t that you need a container to paper over software that isn’t sufficiently generic: it’s to avoid fixing incompatibilities that have nothing to do with your target deployment systems.

I think the author is thinking too much of highly general-purpose software whereas the... [More]

10 months Ago

ImageSharp vs. SkiaSharp

Published by marco on

I watched a great video about image-manipulation using an AWS lambda function.

Working With Images Like a Pro in .NET by Nick Chapsas (YouTube)

I was curious about the imaging library he was using and searched for ImageProcessingContext (because I saw it in his code). That led me to ImageSharp, after which I searched for comparisons to the cross-platform library used in Maui (MSDN).

That led me to the issue SkiaSharp vs ImageSharp (GitHub), which noted that,

“Note that JimBobSquarePants, the creator of ImageSharp, contributed some interesting discussion in #47.”

I... [More]

1 year Ago

Working with Git Submodules

Published by marco on

Introduction

The intended audience of this document is people interested in knowing which commands to execute to update submodules. The initial analysis section is intended for people interested in knowing how the commands work and what their strengths/weaknesses are.

The inspiration for this documentation was that I was wondering whether submodules were always cloned with detached heads and if there were some way to avoid that. The short answers to these questions are, respectively, “yes”... [More]

Extracting subtitles from an mkv with ffmpeg

Published by marco on

I’d watched an excellent movie[1] that was primarily in German but had some English parts, with hard-coded English subtitles and soft German subtitles plastered on top of that. I wanted to cite a bunch of interesting sections, so I looked for the subtitles online. Only the English subtitles are available, which I didn’t want. I liked the German formulation and wanted to cite that.

Well, I have the subtitles: they’re just trapped in the mkv file. I figured that there was some way of extracting... [More]

You’re already testing; now automate it.

Published by marco on

Introduction

Testing is any form of validation that verifies a product. That includes not only structured validation using checklists, test plans, etc. but also informal testing, as when engineers click their way through a UI, emit values in debugging output to a console, or perform operations on hardware.

Automated testing is common for software, as regression-style tests that execute both locally and in CI. This includes unit, integration, and end-to-end tests.

The following discussion... [More]

Hiding folders in Azure DevOps Code Wikis

Published by marco on

 It is currently not possible to hide individual folders or files in an Azure DevOps Code Wiki. Folders and files beginning with a . are hidden by default, but you can’t influence the structure other than by reordering pages with a .order file in an individual folder.

The topic Hide folders that do not contain Markdown files (Microsoft Developer Community) discusses extending this functionality.

I replied with the following:


There are a lot of good suggestions here.

Changing the name of the folder or file in order to... [More]