The Architecture of Adaptability: 6 Quotes on Resilience as the New Intelligence

I have collected hundreds of quotes over the years for inspiration. I wanted to share a few of these and my comments on how these quotes help me shape my business and design my lifestyle.

“We are not provided with wisdom; we must discover it ourselves, after a journey through the wilderness which no one else can take for us.”
Marcel Proust

We can read all the books, listen to every single podcast, watch every single documentary or YouTube video: This doesn’t change us. We only learn by doing – and failing. We have to practice and tumble to absorb the wisdom of all that content. How many times have I tried something and failed, only to remember a piece of wisdom from a book that had warned me about that mistake? “Now I get it – that’s what they meant in that book“. We only learn from our own journey – and mistakes.

“It is not the strongest of the species that survives, nor the most intelligent, but the one most responsive to change”
Charles Darwin

This is more true than ever. With the advent of AI, things change all the time. I’ve seen so many companies die in recent years because they failed to adapt and change their business model. Sears didn’t respond to Amazon, and they are gone, like many others. My business has gone through at least 4 major pivots in the last twelve years, and I’ll need to pivot again soon if I want to keep going.

“I’ve missed more than 9,000 shots in my career. I’ve lost almost 300 games. 26 times, I’ve been trusted to take the game-winning shot and missed. I’ve failed over and over and over again in my life. And that is why I succeed.”
Michael Jordan

This classic quote from Jordan says it all. Success isn’t linear. It’s all about trying, over and over again, no matter the outcome: persistence, resilience, and not giving up when things go wrong. The process is humbling, and what makes the difference is resilience.

“Happiness must happen, and the same holds for success: you have to let it happen by not caring about it.”
Viktor E. Frankl

This is one of my favorite tricks for carrying on no matter the outcome. If I write a piece of content, I forget about it as soon as I hit publish. I don’t care whether 5 or 5,000 people end up reading it. I don’t worry about statistics. I don’t care much about likes, followers, reshares, and such. I keep going, do the work, and focus on quality. I wasn’t always like this, but I realized that when I cared too much about numbers, I was more inclined to give up or change my approach before giving it any chance to succeed.

I’m still surprised when people recognize me at conferences and come up to thank me for what I do, because I never expected it, and that’s why it happened and keeps happening. Frankl’s quote actually goes on like so: “I want you to listen to what your conscience commands you to do and go on to carry it out to the best of your knowledge. Then you will live to see that in the long-run – in the long-run, I say! – Success will follow you precisely because you had forgotten to think about it.”

“A pessimist sees the difficulty in every opportunity, while an optimist sees the opportunity in every difficulty”
Winston Churchill

That one is actually hanging in my office right next to me, so I get reminded about it every day – it’s a little bit like seeing the glass half-full rather than half-empty:

Is AI going to destroy my current business offering? Most likely yes, so I need to embrace it and use that as an opportunity to pivot and offer something different. Change is an opportunity to learn and grow. This quote ties so nicely with the previous ones: Adapt to survive, make mistakes to learn, and then succeed. As Ryan Holiday puts it, the Obstacle is the way.

“Today I will do what others won’t, so tomorrow I can do what others can’t.”
Jerry Rice

Kevin Costner has a variation of that quote: “Being an entrepreneur is being willing to do a job that nobody else wants to do, in order to be able to live the rest of your life doing whatever you want to do“. The idea is the same. Nobody wants to feel the pain of failure, so most people won’t even try. Yet we must try, as this is how we pave our way to success.

How to speak at conferences?

If you’ve ever wondered how people end up on stage speaking at conferences, this article is for you. I’m going to describe the different steps and share some tips & tricks to increase your odds of success. These are lessons I learned over the past 10 years of successfully giving 50+ talks on all continents.

  1. Finding the right conference

The first thing to know about conferences is that they are planned months in advance, and speakers are typically selected at least a few months before the event. As a result, your first step when looking for a conference to speak at is to determine when it will take place. If it’s next month, it’s most likely too late to apply to speak. Most conferences select their speakers four months to a year before the event!

To find such events, you can use AI, Google search, or aggregators such as Papercall, Sessionize (you need to create a speaker account first – it’s free), and developer.events.

Once you find an event, the next important thing is the CFP process.

  1. Find the CFP (Call for Papers) dates

The call for papers (CFP – sometimes Request for Papers – RFP) process is how anyone can apply to speak at a conference. This information is always available on the conference website at some point, usually under a “Speakers” or “CFP” menu:

If you can’t find it, it means you’re too early or too late. The next thing to know about CFPs is that they have a start date and a closing date, which sometimes leave only a short window of time (a month or two) to apply. This is why knowing the dates is crucial: I’ve missed so many conferences when I started public speaking because I missed the CFP dates… Most of the time, you’ll find something like this on the conference website:

I check CFP dates for events I want to speak at once a month. Another option is to contact the organizers, as contact info is always available on conference websites, but don’t expect an answer: they receive tons of messages and tend not to check their email inboxes before a CFP starts.

Another key piece of information in the CFP is whether the conference covers your travel and hotel expenses for the event. Most conferences do, others don’t, so make sure you have that information before applying.

3. Apply to speak

Once the CFP for the event is open, you can apply to speak! Most conferences allow you to submit several ideas, but their submission process often requires repeating the same information for each submission (your name, bio, location, etc.), which is painful.

As a result, I have a document where I keep everything conferences typically ask for, so I can copy and paste that info and save lots of time:

Note that websites like Sessionize allow you to store all that info, as well as your talk ideas, so you can reuse it and apply it to other events quickly.

Here are some suggestions for successful conference applications:

  • Make sure you submit talks that are in line with what the conference already does, but not exactly the same topics as in previous events
  • Submit 3 to 5 different talk ideas, not just one (90% of applicants submit just one talk)
  • You will get rejected over and over again. In my first few years as a speaker, I learned I was selected to speak at about 60% of events, so if I wanted to speak at six conferences per year, I’d apply to 10 events.
  • If you’re a new speaker, don’t compete with star speakers who speak at the event every year. Pick a talk duration or format that is uncommon and unlikely to be selected by the “famous” speakers. For instance, if the main talk is 30 minutes but the conference allows 5-minute lightning talks, choose the lightning talks for your first applications. You’ll have less competition!

4. Wait for the result

Once you’ve submitted your talks, wait for the selection committee to make their choice. Again, expect to be rejected quite a bit; that’s perfectly fine, and even veterans like me get rejected several times per year.

5. Prep your content

This is the “easiest” part, in that it’s fully under our control at that point: we can create our content and get ready to deliver it on stage!

If you have any questions or if I missed anything, please let me know, and I’ll update this tutorial with more information.

How I built a cool art display with the help of AI

A few years ago, I came up with the idea of an art display to illustrate my tech history through code. The idea was to take meaningful code snippets from my career and have them “paint” a canvas on which the logo of my solo business, Interstate 21, would emerge. Basically, I wanted a “The Matrix”-like effect: a wall of code that draws the business’s logo, since that code ultimately created the business itself.

But I didn’t know how to make that happen without spending dozens of hours editing images and code samples.

In late 2025, I decided to prompt AI to do that for me. I got something interesting and fairly close to what I had in mind, but it would not use my code snippets, just random ones instead. Both Gemini and ChatGPT failed in a similar fashion despite multiple attempts:

The rendering was cool, but the code wasn’t mine, so I decided to do it manually. There were still a few hurdles:

  1. The goal was to illustrate my entire career, which means there would be different programming languages, all with different syntax coloring rules. But I wanted consistent colors on my canvas.
  2. Whitespace, tabs, and end of lines. Code editors want to format code properly and won’t cut the lines the way I wanted for this project.

Should I use a code IDE or image editor software? I wasn’t sure what the best approach would be for pixel-perfect rendering. This is where AI gave me a breakthrough. I prompted Gemini Pro with:

I want to create an image that shows different pieces of code in different programming languages, all with syntax coloring, with possibly one line for each example / language. Which process would you recommend for me to achieve this?

And the answer I would never have thought about on my own:

I recommend using Shiki (the syntax highlighter used by VS Code) over Prism.js because it uses TextMate grammars, ensuring the colors match your IDE exactly.

  1. Scaffold an HTML Page: Create a simple container with a dark background.
  2. Integrate Shiki: Use the CDN version to render code strings into HTML tokens on the fly.
  3. Layout with CSS: Use display: grid or flex to stack your one-liners vertically or artistically.
  4. Export: Use Chrome DevTools → Cmd+Shift+P → “Capture node screenshot” (generates a high-DPI PNG of just the container).

Then Gemini created a skeleton page I could use. That was the breakthrough I needed. With some more AI-assistance, I was able to describe my snippets using an array of JavaScript objects that looked like this:

{
        lang: 'java',
        description: 'Java code from university (simulation agent)',
        code: 'public abstract class SimulationAgent extends AbstractAgent implements ReferenceableAgent{ String messages = ""; public void addMessage(String mess){ messages += "<"+getName()+"> "+mess+"/n"; } public String getMessages(){ return messages; } }'
}

All I had to do was add more entries, refresh the HTML page, capture a screenshot, and be done.

Well, I actually spent hours going through my college archives, extracting code from PDF reports, GitHub repos, or old zip files from hard drives from 20 years ago… I failed to recover some Turbo Pascal samples that probably live on a floppy disk somewhere. Yes, I started coding before USB thumb drives and cloud storage solutions were a thing…

I considered using a decompiler to reverse-engineer compiled code in some instances, but my point was to render code I had written myself, so I gave up on that idea.

I found pieces of Visual Basic, SQL, Java, PHP, JavaScript, Google Maps API, KML, TypeScript, OutSystems syntax, HTML, CSS, Angular template syntax, AngularJS template syntax, and more…

There is code from my first internship in college, my first bug fix in a high-stakes university project, my first job, my first freelance Google Maps project, my first AngularJS training, the Angular certification program

It’s all there. My entire career, summarized in code snippets, is now hanging in my office, printed in a plexiglas frame:

Once I had the right process, it was really fun to get to the end result. What’s satisfying is that I don’t think I could have gotten to that result alone, and AI couldn’t either. I had to collaborate with AI to make the project happen, which is really the name of the game these days: Using AI for inspiration and help to reach new horizons.

How to become a Google Developer Expert (GDE)?

The number 1 question I get from people I meet is: How did you become a Google Developer Expert?

I’m always happy to answer that question because I help people learn, develop, grow, and take the next step in their careers every day.

I’ve been a GDE since 2017, so my honorary Experts plaque is starting to run out of space:

If you want a concise answer, here is one for you: If you want to become a GDE, you have to do what a GDE does. That’s it!

If you want a longer answer in podcast format, you can listen to this 80-minute-long podcast episode recorded for Adventures in Angular.

And if you want a more elaborate written answer, stay here and keep reading.

What’s the GDE program?

First, it’s important to understand the Google Developer Expert program and what it isn’t. The program recognizes your expertise and contributions in a Google-centric technology area such as Android, Cloud, Angular, or the Google Maps platform. In other words, it’s a title that rewards everything you’ve done publicly for such a technology and its users.

Being a GDE isn’t about:

  • Becoming a Google employee. Google employees cannot be GDEs; a GDE who becomes a Googler loses their GDE title.
  • Being the best possible coder in that technical area. It’s more about sharing your knowledge, helping others, and providing advice and guidance.
  • Receiving a lifelong award. The GDE title is re-evaluated every year, and if a GDE stops sharing their expertise, they will lose their GDE status.

What Google is looking for in a GDE

The Google Developer Experts page clearly states who can become a GDE (bolding is mine):

Google Developer Experts have a variety of diverse backgrounds. They are developers, founders, mothers, activists, and so much more. The one thing they have in common is that they’re passionate professionals with expertise in Google technology who enjoy continuous learning, sharing knowledge, and making an impact on the community.

Eligibility criteria:

  • Solid expertise in an area featuring Google technology such as Android, Google Cloud, Machine Learning, Web and more. You do not need a formal education to be considered for the GDE program.
  • Display significant contributions in the developer community including but not limited to speaking at events, publishing content, mentoring other developers and companies.
  • Ability to articulate clearly and provide meaningful advice to others.
  • Must be 18+ years old.
  • Ability to interview and communicate in English as it’s the official language of the program.

A GDE is someone who does public speaking (conferences, meetups), creates content (podcasts, videos, blogs, open source projects, books, video courses), and helps others (mentoring, training, tutoring). You don’t have to do all of that, and some GDEs do a lot of one of these and very little of the rest.

When I became a GDE in 2017, I had done 0 conference talks and only a little blogging, but I had done a lot of training and meetup talks (probably 30+ over the past few years). So don’t worry if you’ve never spoken at a conference or are afraid of public speaking. You can produce other types of content that are just as valuable if not more.

What’s really nice about the above eligibility criteria is that Google follows them by the book. If you do all that work, you’ll eventually become a GDE.

With all that in mind, you can see why my TLDR introduction sentence was: If you want to become a GDE, you must do what a GDE does. And yes, it takes time to create content, prepare talks, and build your expertise, which is what makes the GDE title rare and valuable.

TypeScript Object Spread

TypeScript plays a big part in making Angular a great framework. Part of the reason why it’s great is because it brings to the table a lot of features from ES2015 or even ES2017 that aren’t available yet for all browsers. Yet TypeScript allows us to use those features and transpiles them down to good old ES5 javascript, which runs great in all browsers.

Today I want to highlight one of those features: Object spread, which basically allows us to copy an entire object as a part of another object:

The above code turns copy into a copy of the original object. Easy enough, right?

Now let’s use the spread syntax to merge two objects together:

Note that when you use the spread operator, objects can have properties that have the same name. In that case, the last declaration wins, which translates into the following example:

In order to keep the value of name for object b, we would have to use the spread operator first, then declare name as follows:

The spread operation can also be used to concatenate several objects into one:

As you can see, a lot of great things can be done with the spread operator. Next week I’ll show you that we can also use the three-dot syntax in another interesting way: Object rest.

Why you should use Angular CLI

When I first started working with Angular (back when it was known as Angular 2 beta), I had a hard time getting my head around the lengthy set-up process. After all, all Angular JS required was a single Javascript file, and now I had to download hundreds of megabytes of dependencies, install a compiler, use Node JS and npm, etc.

It was definitely not fun nor easy. Plus that process would change fairly often as Angular would first favor System JS, then Webpack.

Luckily enough for all of us Angular developers, the Angular team listened to our feedback and started working on Angular CLI, a tool to  initialize, develop, scaffold and maintain Angular applications.

The lengthy process finally became much easier:

Four simple commands and now you not only have Angular installed, you also get:

  • A local server the serves your app on locahost:4200 when you run ng serve
  • That local server looks for file changes as you develop, and refreshes your app for you in the browser as soon as you save your updates!

The above alone sounds awesome and that’s not it. Angular CLI has a ng generate command that allows you to generate components, pipes, modules, directives , services, classes, etc. When you create a new component using CLI, it generates a sample component for you (with the class name and all of the regular imports that you need) and adds that component to your app module definition.

Oh, and it also generates a sample test specification that you could run later on using… ng test! Functional tests with Protractor are also covered with a specific option: ng e2e.

Angular CLI also helps follow the best practices recommended by the Angular team in terms of folder structure, file names and other coding conventions. Instead of reading the entire style guide, you can just use Angular CLI and follow the best practices by default, which is way easier.

Finally, Angular CLI also helps with your production build or any other kind of build for your different environments (QA, test, dev, etc.). There is a ng build command that you can customize to build for a specific environment, for instance: ng build –env=prod.

As a result, I strongly recommend using Angular CLI. It brings so many features to the table that it would be really difficult to write Angular code without using it. I don’t think I would ever use Angular without the CLI!

 

What’s new in Angular 4?

Angular 4 was released last week, following the new schedule set by the Angular team that decided to release one new major version every 6 months.

Wait, where is Angular 3?

There won’t be any Angular 3. That’s because the Angular Router package was already at version 3.x, while all other Angular packages were at version 2.x. The Angular team decided to jump to version 4.0 for all those packages so that they are back in sync from a versioning perspective.

Is Angular 4 another full rewrite of the framework?

No, quite the opposite actually. Angular 4 is really an Angular 2++. The versioning strategy changed but the code is not different at all. If you know how to work with Angular 2, then you already know Angular 4.

So what’s new then?

In a nutshell,  Angular is smaller and faster. many improvements have been made under the hood to make sure that your code compiles down to something that is more efficient and less verbose.

In most cases, code generated with the AOT option is 60% smaller than before, which is a huge improvement.

The animations were moved from @angular/core to their own package so that if you don’ t use animations, your app code can get even smaller.

From a code perspective, the only real difference you can experience is the addition of  “else” conditions to ng-if as well as some other syntax improvements summarized in this snippet:

<div *ngIf="userList | async as users; else loading">
  <user-profile *ngFor="let user of users; count as count" [user]="user">
  </user-profile>
  <div>{{count}} total users</div>
</div>
<ng-template #loading>Loading...</ng-template>

Everything else remains unchanged so no painful migration ahead!

Another major update is that Angular 4 works with TypeScript 2.1 and 2.2, which is also an intresting update to get more out of TypeScript as well.

For a full list of what’ s new in Angular 4, don’t hesitate to take a look at the release post on the official blog.

Authentication with Angular

One of the questions I hear the most often when I teach Angular is: How do I implement authentication? There are a lot of options out there so I’ll stick with the tools Angular provides out of the box, which allow to implement authentication without any external dependency.

First, I’m assuming that you’re familiar with the Component Router. In a nutshell, the router decides which component to display based on the current URL, thus emulating multi-page behavior in Angular (which is a single-page application framework).

It’s easy to guess that the router will be involved in all-things authentication. By default, configuring a route in the router looks like this:

Now if I want to protect the above route, I can use a guard to do that. The route declaration then becomes:

In the above code, AuthGuard is a class that implements the CanActivate interface, which consists of a single canActivate method that returns an Observable. Below is what a basic guard looks like – it has to be an Angular service – note that this one doesn’t do much as it would basically let all requests go through since it always returns true:

In order for that guard to be useful, it would have to use a LoginService that would tell whether the current user is logged in or not. That’s where the implementation becomes specific to your application as that service will depend on how your back-end wants to authenticate the user. The guard code then becomes:

Note that you can also use the guard to redirect the user to a LoginComponent whenever the user has to log in. Here is the full code of such a guard:

You now know the basics of how to implement authentication with Angular. The specifics of what the LoginService would do depends on your back-end, though it is very likely that you will have to make a request to your authentication server and get some kind of token or session object as a result.

How to migrate from Angular 1 to Angular 2?

With Angular 4 around the corner, now is a great time to migrate to Angular 2. There is no rush though as Angular 4 is just the next iteration of what is now called Angular, the new name for v2, 4, 5,6 and so forth. As a result, per the latest branding guidelines, this article should really be titled How to migrate from Angular JS to Angular?

1) Migrate to the latest version of Angular JS

As of right now, the latest version of Angular JS is 1.6. You should really consider upgrading because Angular JS 1.5+ has introduced features that are similar to what Angular now uses (components being the most important one). The main goal for 1.5 and 1.6 was to make the migration to Angular easier, so that’s the first step to take. The migration guide for all 1.x versions can be found here.

2) Get your 1.x code ready for Angular

First, remove $scope from your code and use the “controller as” syntax instead. Since Angular uses TypeScript classes, getting rid of $scope and using a syntax that is much closer to actual class properties makes perfect sense. Here is an example of a controller + HTML template that use the “controller As” syntax:

Then it would be a good idea to replace your controllers / directives with components, introduced in Angular 1.5. A component is a directive with a HTML template. Here is what a simple Angular 1.x component looks like – A directive with a HTML template:

The final step is to start learning and using TypeScript in your code. Since TypeScript transpiles down to ES5 code, you can already use TypeScript for development purposes and then deploy the resulting Javascript to production.

3) Upgrade incrementally to Angular

Angular has an upgrade adapter that allows you to mix and match Angulaar JS and Angular in the same app:

The next step is to use the upgrade adapter to migrate your code piece by piece. I would suggest to first upgrade your services, then directives / components. The reason for this is that services are not very different in Angular compared to what they were in Angular JS.

Finally, use the Angular component router and bootstrap your app with Angular.

4) Enjoy and relax!

Seems like an easy process? Not quite, right? That’s why I would only consider upgrading apps if a full rewrite is not an option. In most cases, it’s actually easier to build a new Angular project with CLI and create components / services inspired from your old Angular JS code.

It’s a great opportunity to only keep what you need and to learn Angular in the process as well.