I'm Launching Street-Smart Coding: 30 Lessons to Help You Code Like a Pro (the Roadmap I Wish I Had Starting Out)

Street-Smart Coding cover
Street-Smart Coding: 30 Ways to Get Better at Coding Without Losing Your Mind

I spent five years in college learning to code.

A stupid dissertation delayed my graduation. But that’s another story.

Most of my five-year program didn’t prepare me for real-world coding. My real coding journey began at my first job, with one Google search: “how to get good at coding.”

I found a lot of conflicting advice:

  • “Use comments”
  • “Don’t use comments”
  • “Do this”
  • “Don’t do that”

Arrggg!

It took years of trial and error to learn what worked.

I had to survive on-call shifts, talk to stakeholders, and say “no” politely. More importantly, I had to learn that coding takes more than just syntax.

That’s why I wrote Street-Smart Coding— a roadmap of 30 lessons I wish I had when I started. For every dev who’s ever typed “how to get better at coding” into Google or ChatGPT. (Back in my days, I didn’t have ChatGPT… Wait, I sound like a nostalgic grandpa…)

Scrolling through the first pages of Street-Smart Coding
Preview of the first ~12 pages

Inside “Street-Smart Coding”

This isn’t a textbook. It’s a battle-tested guide for your journey from junior/mid-level to senior.

Some lessons are conventional.

Others were learned the hard way.

And a few are weird.

One lesson comes from a TV show. Nope, not Mr. Robot or Silicon Valley. That’s on Chapter #29. It will teach you about problem-solving.

You’ll learn how to:

  • Google like a pro
  • Debug without banging your head against a wall
  • Communicate clearly with non-tech folks

…and 27 more lessons I learned over ten years of mistakes.

Now they’re yours.

Get your copy of Street-Smart Coding here and skip the years of trial and error. For launch week only: Pay what you want—even $1 or $2.

Friday Links: Claude for VS Code, PHP2Shell, and coding portfolios

Hey there.

Quick update: This week, I finished the first draft of Street-Smart Coding in the Age of AI and already reached out to some of my loyal beta readers. You can preorder your ebook copy starting at just $1.

In case you missed last email, Street-Smart Coding in the Age of AI is book #3 in my Street-Smart Coding collection. It’s a short and actionable guide to help you leverage AI without becoming dependent on it. The first draft sits around 5K words. You can finish it over coffee.


Here are 4 links I thought were worth sharing this week:

#1. If you use Claude Code for VS Code, be aware it was recently compromised (5min).

#2. PHP2Shell vulnerability has taught us it’s time to start paying 40 years of technical debt (3min).

#3. If you still use Postman, be aware it was at some point installing Claude plugins and startup hooks. Here are the findings on the official GitHub repo (3min). I just uninstalled it.

#4. I’ve never had a portfolio. I joke that my blog is my portfolio. But if you have one, here’s how to rethink your portfolio in the age of AI (6min).


And in case you missed it, last week, to celebrate Halloween, I shared 4 posts to scare the coder inside you (1min) and, more recently, I wrote about C# new keyword and data annotations (2min).


(Bzzz…Radio voice) This email was brought to you by… Preorder your copy of Street-Smart Coding in the Age of AI. A short and actionable guide to leverage AI without losing your skills.

See you next time,

Cesar

The Fastest Salary Negotiation I've Had (You Might Have One Too)

I made a list of contributions and achievements in the past year.
I did a quick market research. OK, by research, I mean I asked Gemini.
I came up with a range and an anchor point.
I reached out to an ex-coworker to ask how he asked for a raise.
I reread the chapters on negotiation from Choose Yourself Guide to Wealth.
I wrote a script and had a “what would you do in my shoes?” line ready as fallback.

I texted my “boss” asking for a time slot to discuss a raise.
I was expecting to jump into a call to present my case and “negotiate.”
Instead he asked if we could do it via direct messages.

I texted something like, “It’s been a while, blah, blah, blah… My current rate is $X and I have in mind something between $Y and $Z.”

He replied, “let me check and get back to you.”

Radio silence!

In a 1-on-1 negotiation, you get an immediate answer.
Either “sorry, we can’t do that” or “here’s what I can do for you.”
But this time, a loop was opened in my mind.

The next day, about the same time, I got a text, “Good news! Blah, blah, blah… We are supporting your request to increase your rate to $Y, effective $insertDate. Blah, blah, blah…“

The fastest, easiest, and most awkward salary or rate negotiation I ever had.

Lesson: Always go prepared. Always have a salary range and anchor point in mind. “Ask and you shall receive,” Jesus said. And maybe that could be as fast and easy as some messages via Discord or Slack.

If you’re starting out or already ahead in your coding journey, check out Career Lessons From the Trenches, my free 7-day email course where I distill 10+ years of career lessons into 7 short emails–to help you navigate your coding career.

TIL: The new Keyword Doesn't Hide Data Annotations

In another episode of I thought I knew enough about C#…

Today I wanted to “overwrite” the validations of a property from a parent DTO on its child DTO. Let’s say I had a Movie and Clip and needed shorter names for clips.

Just take a look at the attributes on Movie and ShortClip.

using System.ComponentModel.DataAnnotations;

namespace TestProject1;

[TestClass]
public class NewKeywordTests
{
    public abstract class Movie
    {
        [Required]
        [MinLength(52)]  // <--
        public string? Name { get; set; }
    }

    public class ShortClip : Movie
    {
        [MaxLength(20)]  // <-- Different annotations
        public new string? Name { get; set; }
        //     ^^^
    }

    [TestMethod]
    public void NewDoesNotHideValidationAttributes()
    {
        var myClip = new ShortClip
        {
            Name = "AShortName"
            //     ^^^^^
            // It has less than 20 chars,
            // so it must be valid, right?
        };

        var context = new ValidationContext(myClip);
        var validationResults = new List<ValidationResult>();

        bool isValid = Validator.TryValidateObject(
            myClip,
            context,
            validationResults,
            validateAllProperties: true
        );

        Assert.IsTrue(isValid);
        //     ^^^^^
        // Booom!!!
    }
}

Whaaat?! It didn’t work. The new keyword in the child class hides the property, but not the attributes. Sad trombone!

Sneaking into TryValidateObject() source code, it uses TypeDescriptor.GetProperties() to list the properties to validate, which returns a “merged” list of attributes. [Source].

var descriptor = TypeDescriptor.GetProperties(myClip.GetType());
var attributes = x[0].Attributes;
//  ^^^^^
// Among other attributes:
// RequiredAttribute
// MinAttribute
// MaxAttribute

When I asked Gemini for help, it suggested using virtual and override. And guess what? That doesn’t work either.

On my original code, I ended pulling down the property I wanted to have different annotations to the child classes on the hierarchy.

That’s why you shouldn’t blindly trust AI and build code reading and troubleshooting skills. I cover those skills and more in Street-Smart Coding—A roadmap with 30 lessons to help you code like a pro.

A Parenting and Book Writing Lesson Learned At a Bookstore

Do you have a book for parents raising two teenager girls?, a guy said.

He was in the next aisle at a bookstore. I was looking for some Christmas presents. I had on my hands Clear Thinking and The Cat Who Saved Books. I was looking for a third book to take advantage of the month’s promotion. The cheapest of the three was free.

The guy kept walking the aisles. An employee started to recommend titles: Think and Grow Rich, The 5:00 Club… Then his daughter said, “I’ve seen this book…I don’t know the title, but its cover is a little brain made of 1-dollar bills…“

“The Psychology of Money,” I said laughing. That moment I knew she was my kind of reading mate. And I knew his after was doing something good: surrounding them with books.

Then I saw it: sometimes a good book covers does all the heavy work for your book. Design your cover so a 13-year-old girl, probably not interested in your subject, could remember your book.

Like it or not, a book is judged by its cover. Just like you and me are judged by the way we look.

The Subtle Difference Between Success and Fame

Fame isn’t the same as success.

Fame is public spotlight.

Success is quiet.

It’s feeling good with what you do,
Feeling you’ve found a purpose,
Finding out what you’re here for and doing it every day.

It’s working every day,
Putting bread in your table,
Having a family,
Liking what you do, getting paid for some money for it, and feeling at ease with it.

That’s a true successful person.

A lesson I heard in a Sunday sermon that made me nod in agreement and realize I’m not that far to being successful.