Early in the season, Jimmy Garoppolo was considered by many to be the weak link on the San Francisco 49ers.

The defense was dominant, the running game was brilliant and Kyle Shanahan seemed to have an incredible grasp of what to do and how to do it, but Garoppolo was a pretty big question mark.

That was then. This is now, and over the last several weeks, Garoppolo has begun to earn his keep.

On the season overall, Garoppolo has thrown for 3,245 yards, 25 touchdowns and 11 interceptions while completing 69.5 percent of his passes and posting a passer rating of 103.9.

Much of that production has come since Week 9, as Garoppolo has tallied 16 touchdowns as opposed to just four picks since then, with 11 of his touchdowns coming over the last four weeks.

During this stretch, he has posted a pair of 400-yard, four-touchdown performances, and the 49ers have scored over 35 points three times, including a 48-point outburst against the New Orleans Saints last Sunday.

It seems safe to say that Garoppolo has found himself.

Remember: Garoppolo tore his ACL last year and was still getting his legs back underneath him earlier this season, which could very well explain his struggles in the first half.

But now, the 28-year-old seems incredibly comfortable and no longer seems to be the soft spot on a San Francisco club that boasts an 11-2 record heading into a Week 15 matchup with the Atlanta Falcons.

Garoppolo is also doing all of this without a true No. 1 receiver.

Yes, the Niners picked up Emmanuel Sanders at the deadline, but, while he is still effective, he is clearly past his prime. Deebo Samuel has had an impressive rookie year, but he is just that: a rookie. Plus, Dante Pettis, who was widely expected to be the 49ers' top wide out going into 2019, has been a virtual non-factor.

Sure, San Francisco has superstar tight end George Kittle, but as far as wide receivers go, the team is relatively limited in terms of talent.

That makes what Garoppolo has been able to do all the more impressive.

I liked Garoppolo a heck of a lot while he was backing up Tom Brady in New England, but the fact of the matter was that none of us had any clue what type of quarterback he could become, and his early returns in the Bay weren't great, which led me to question whether or not he was the real deal.

And to be perfectly honest, we still don't know for sure, because we have yet to see Garoppolo do this for a full season, but he seems to be peaking at the right time with the playoffs just around the corner.

We can have concerns about Garoppolo heading into the postseason all we want, and some of those concerns are valid, particularly seeing as how he has never played in a playoff game in his life.

But we can't deny just how well he has been playing over the last several weeks, which is why I am giving him a B grade for his performance in 2019 in spite of his slow start.

The numbers don't lie: Garoppolo has been good.