15 Jun 2025 #writing
I made my first $100 online on LinkedIn.
It was pure luck. Or a happy accident. Dunno. I wanted people to notice my coding blog and I started to share links to my posts on LinkedIn, pretending to steal their users.
Of course, it was the wrong strategy. I got almost zero engagement on LinkedIn and almost zero visits to my blog. Social media platforms want their users trapped in the platform.
But by sharing those blog posts, the head of marketing of a software company reached out and asked me to write something similar for them. Boom! My first $100.
At some point, I gave up posting and abandoned my LinkedIn account.
But those $100 were in the back of my head. In 2024, I challenged myself to write 100 native posts on LinkedIn to revive my account and see what happened.
Since then, I’ve published over 300 posts. This is what I learned:
1. There’s no a single skill called “writing”
Writing isn’t just one skill.
It’s a collection of subskills:
- Writing hooks,
- Formatting and editing,
- Storytelling,
- Copywriting,
- Offer creation…
You have to practice and master each one.
2. Writing can feel lonely
We all start from almost zero, apart from ex-coworkers and friends as connections.
In my first days, I published my posts and sat down waiting for people to come and like and comment my posts… and waited… and waited… and waited. It was a small town in the Wild West before a Mexican standoff.
Make friends and interact with other accounts. Otherwise, it’ll be you and your screen alone.
3. Writing is an infinite game
And like any other infinite game, you lose if you stop playing.
So keep writing. Write as if nobody is watching. Write for your past self. And keep writing because you don’t know who you’re helping.
4. An intention makes you start but a system keeps you showing up
Find ways to capture ideas and the content you consume and turn them into content.
I keep an eye on everything I consume: books, podcasts, and social media posts. I capture and connect those ideas, and then I write about them.
I write 10 bad ideas a day. Credits to James Altucher. Most of those 10 ideas come from the content I consume. In fact, this post started as a 10-idea list. And I stole this subject from a creator I follow.
When you look with the right attitude, there’s content everywhere.
5. You can’t predict your next hit
Often, my most viewed posts are the ones I write to mark the calendar and call it a day. Not the ones where I spend time choosing the right image or crafting the best post body.
Since you can’t predict your next hit, keep posting, look at the data, and iterate.
6. Hooks can make a huge difference
Picture this, someone busy or bored at work is scrolling down their LinkedIn feed, waiting for the next dopamine hit.
You have to make them stop scrolling with your posts. For that, you need an attention-grabbing first line. That’s what in LinkedIn terms is called a “hook.” It’s your welcome sign.
Often I just repost the same post, but with a better hook and, boom! I get way better engagement.
A good hook can make a huge difference.
7. If it can benefit one person, you can write about it
When I started writing, it was hard to decide what to write about.
You’re throwing everything at the wall to see what sticks. But if what you’re writing can benefit one person, you can write about stories, lessons, mistakes, rants, challenges… Anything.
Remember you’re writing to serve your readers, not to show how smart you are.
8. Writing is the front door for sales
Build an audience and serve that audience and you’ll make money. I’m still figuring this out. I’ll share results in the future.
9. Your best writing course is noticing your behavior as reader
If you want to get better at writing, stop being a dopamine junkie and put on your creator glasses.
Every time you stop to read something, ask yourself:
- Why did this post make me stop?
- What type of visuals did it have?
- What structure did it use?
- What hook did it use?
- What call-to-action?
Then replicate that in your content. Steal like an artist.
10. Don’t give up on an idea unless you try it multiple times
You can’t predict your hits. Remember? And if a post has low engagement, it doesn’t mean it was a bad idea.
Give it another lick of paint and try it again. Don’t worry there’s nothing wrong with repurposing old content. Nobody will notice. And everybody does it.
Writing on LinkedIn (or anywhere online) makes people see you as an expert. Maybe you’ll land your next job from posting. You’ll make new professional connections (your network is your net worth). Or simply you’ll make $100. I can promise anything, but why not trying it yourself?
14 Jun 2025 #career
I’m not exactly sure when “Senior” made its way into my title.
In my last full-time job, I was “Software Engineer 1” out of 5. But I worked on the main features of the software, was in the on-call rotation, and sat in meetings with the company’s president. A “SWE 1” wasn’t supposed to be doing most of those tasks.
OK, that was at a small shop in my city, so maybe it wasn’t that impressive. And it took me about 5 years and a lot of hard work to get there.
Although “Senior” wasn’t officially part of my title, there was a sign I saw in my coworkers and mentors, and later connecting the dots, I noticed I had absorbed from them:
Knowing when to stop because a solution is good enough.
As non-seniors, we keep wasting time:
You’re senior when you truly master YAGNI, not only in your code files, but across your entire career.
Starting out or already on the coding journey? Join my free 7-day email course to refactor your software engineering career now–I distill 10+ years of career lessons into 7 short emails.
13 Jun 2025 #mondaylinks
Hey, there.
Here are 4 links I thought were worth sharing this week:
#1. The day I “was let go” last year, I was told it was because of how tough the economy was doing. High interest rates? AI? But this news article shows the real reason behind layoffs in the tech sector (10min). Spoiler alert: nothing to do with AI.
#2. With AI, our job is to know when to introduce outliers (4min). “In a sea of fish, you want to be a narwhal.”
#3. Like coding, interviewing is another skill to master. Yes, I agree the tech interview is broken and we don’t know how to fix it. But if you’re actively interviewing, here are 8 dos and don’ts to ace your next interviews.
#4. At some point we all as coders have to make a choice: stay technical or jump the management track. The thing is being an engineering manager has never been harder (5min), too many hats to wear.
And in case you missed it, I wrote on my blog about 10 steps I’d take to build a profitable brand from scratch (4min) and 10 lessons I learned from the worst moment of my career (4min). Not much about coding this week.
(Bzzz…Radio voice) This email was brought to you by… Join my course Mastering C# Unit Testing with Real-world Examples on Udemy and learn unit testing best practices to write readable and maintainable unit tests in C# while refactoring real unit tests from my past projects.
See you next time,
Cesar
Want to receive an email with curated links like these? Get 4 more delivered straight to your inbox every Friday. Don’t miss out on next week’s links. Subscribe to my Friday Links here.
12 Jun 2025 #misc
Two years ago, my life sucked. Completely. I felt like a complete loser.
In 2023, I got sick. One day, out of the blue, I started to rush to the bathroom after every meal. And it wasn’t to throw up.
By the end of 2023, I burned out. And in 2024, I was laid off. A simple call over Microsoft Teams ended my 5-year career at a company.
I felt so lost. I felt more lost than when I was a teenager out of high school trying to figure out life as an adult.
That was the worst moment of my career and probably of my life. But that whole situation taught me these 10 lessons:
1. Your health and well-being are more important than any job.
When I burned out, I had stopped working out, running, and eating healthy.
I was so focused on my career that I had forgotten about resting and taking care of my health. It was a painful mistake.
Remember you can always get a new job and a new career, but not a new body.
2. You’re more than your job title.
For years, my career was probably the most important part of my life.
My job was what brought me a sense of accomplishment, fulfillment, and joy… until I heard a “We have to let you go” on a call. It shook my world because I had wrapped my entire identity around a title: “Software Engineer.” It became all I thought I was.
Remember, diversify your sources of joy and fulfillment.
3. Build multiple sources of income like your life depends on it.
No job is safe.
I used to think being an employee was the safest route. I don’t know who made me believe that. I was so wrong. Being an employee is like having one single customer who can decide to stop buying from you at any time.
Don’t only rely on your paycheck. Have more than one way to make money.
4. The moment you stop learning and growing, it’s time to go.
For months and years, I delayed the decision of finding another job or starting my own thing. Being at a “good enough” job was the most expensive decision for my career.
5. Do something that brings you joy every day.
It took me months, probably one entire year, to feel free from burnout. The path was simple but slow: going back to my hobbies and practicing them every day.
6. Your connections and online presence are way better than a CV.
Right after the layoff, I felt relieved. No more meetings or emails.
But after a few weeks, I went into panic mode. I realized no paycheck was coming. I applied to anything with “software engineer” in the job description. I took the CV route. And I don’t have to say it led me nowhere.
When the layoff season came, I didn’t have a solid network and I had set aside my online presence. Your brand is your CV and portfolio.
7. Be careful with what you put in your body and mind.
Apart from pills, to recover from my stomach sickness, I had to eat fruits and vegetables, at a fixed schedule, and eat them slowly.
To recover from burnout? It started with an information diet.
I cut news, music, podcasts, TV shows, movies…. I only focused on binge-watching Borja Vilaseca, a Spanish YouTuber with an inspiring story of personal and professional reinvention.
8. Change and reinvention start in your mind.
It was a little voice in my head that made me start again.
“If you don’t get up by yourself, nobody else will do it for you.” Maybe it was all the inspiring YouTube videos and books I had started to consume.
You have to choose yourself first. Always.
9. Listen to your body for small clues.
I didn’t wake up burned out. It was a slow process on the way down.
Now that I connect the dots, there was a clear sign I failed to notice: not wanting to get out of bed. My body was yelling and I ignored it.
10. Your current struggles will become lessons and stories to share.
After more than one year, I could say I’m free from burnout.
But just thinking of where I was makes me anxious again. That’s my best motivation to keep working today. I thought I wouldn’t make it. Being healthy and doing something I love felt like a distant goal I would never reach.
No storm lasts forever. Your current struggles will become lessons and stories to share. Like the French say: “Après la pluie, le beau temps.” There’s always sunshine after the rain.
11 Jun 2025 #csharp #todayilearned
Every time we retrieve an entity with Entity Framework Core, it will track those entities in its change tracker. And when calling .SaveChanges()
, those changes are persisted to the database.
For read-only queries, we can add .AsNoTracking()
to make them faster.
But when projecting an entity into a custom object, there’s no need to add AsNoTracking()
since Entity Framework doesn’t track query results with a type different from the underlying entity type. Source
For example, let’s save some movies and retrieve them with and without a custom projection,
using Microsoft.EntityFrameworkCore;
namespace LookMaEntityFrameworkDoesNotTrackProjections;
public class Movie
{
public int Id { get; set; }
public string Name { get; set; }
public int ReleaseYear { get; set; }
}
public class MovieContext : DbContext
{
public MovieContext(DbContextOptions<MovieContext> options) : base(options)
{
}
public DbSet<Movie> Movies { get; set; }
}
[TestClass]
public class MovieTests
{
[TestMethod]
public void EFDoesNotTrackProjections()
{
var options = new DbContextOptionsBuilder<MovieContext>()
.UseInMemoryDatabase(databaseName: "MovieDB")
.Options;
// 0. Saving two movies
using (var context = new MovieContext(options))
{
context.Movies.AddRange(
new Movie { Name = "Matrix", ReleaseYear = 1999 },
new Movie {Name = "Titanic", ReleaseYear = 1997 }
);
context.SaveChanges();
}
// 1. Using a custom projection
using (var context = new MovieContext(options))
{
var firstMovieNameAndReleaseYear
= context.Movies
.Where(m => m.ReleaseYear >= 1990)
.Select(m => new { m.Name, m.ReleaseYear })
// ^^^^
// This is a custom projection
.First();
var noTracking = context.ChangeTracker.Entries();
Assert.AreEqual(0, noTracking.Count());
// ^^^
// No entities tracked
}
// 2. Using AsNoTracking
using (var context = new MovieContext(options))
{
var firstMovieWithNoTracking
= context.Movies
.Where(m => m.ReleaseYear >= 1990)
.AsNoTracking()
// ^^^^^
.First();
var withAsNoTracking = context.ChangeTracker.Entries();
Assert.AreEqual(0, withAsNoTracking.Count());
// ^^^
// As imply by its name, no entities tracked here
}
// 3. Retrieving a Movie
using (var context = new MovieContext(options))
{
var firstMovie = context.Movies
.Where(m => m.ReleaseYear >= 1990)
.First();
var beingTracked = context.ChangeTracker.Entries();
Assert.AreEqual(1, beingTracked.Count());
// ^^^
// Since we're retrieving only one Movie, tracking happens here
}
}
}
Only when we queried the first movie without a projection and without .AsNoTracking()
, Entity Framework Core tracked the underlying entity.
Et voilà!
For more tricks with Entity Framework Core, read how to configure default values for nullable columns with default constraints.