Aaron states that the Community Influencer of the Year award goes to, “someone who has made a dramatic impact on the SQL Server community.” This type of recognition is wonderful to hear and I am honored to have such kind words come from someone like Aaron.
I’m especially flattered since the previous award recipients are Andy Mallon (2016) and Drew Furgiuele (2017). Being recognized in the same league as those two feels amazing. Andy and Drew are incredible and inspiring, both in the data platform community and outside of it.
2018 was a great year and I’m looking forward to 2019. The number of people I’ve befriended this year and have helped me along the way is staggering; thank you to each and every one of you.
And finally, thank you all for following me along on this journey. I truly appreciate the interactions I have with you in-person, on Twitter, in the comments, and everywhere else.
This post is a response to this month’s T-SQL Tuesday #108 prompt by Malathi Mahadevan. T-SQL Tuesday is a way for the SQL Server community to share ideas about different database and professional topics every month.
This month’s topic asks to share how we learn skills other than SQL Server.
I enjoy learning to do new things; there’s a major sense of accomplishment I feel when I can tell myself, “Wow, I went from knowing almost nothing to being able to have this new skill.”
Over the years I’ve realized I’m pretty consistent in how I go about learning something new, so what follows is my process for learning a new skill.
What I Am Learning
And so the appeal here is that if I can ditch the overhead of a large library, my code will be simpler, easier to maintain, and faster to load and execute.
Steps to Learning a New Skill:
me, the hardest part to learning a new skill is time management: if I don’t
make time for it, it won’t happen on its own.
I think the easiest way to make time to learn a new skill is to incorporate it into a project at work. By aligning it with your day job, you’re guaranteeing some time to work on it most days. Yes, critical projects and deadlines do come up where learning has to be set aside temporarily, but if you can find a project that doesn’t have urgent deadlines AND aligns with learning goals, then you’ll be good to go.
working through a library like jQuery.
Now obviously this won’t work in all scenarios: if you want to learn to build drones and you do development work for a chain of grocery stores, you probably can’t figure out a way to align your interest with work (unless of course your company is trying to build out a drone delivery service).
Inthat case, you need to set aside time at home. This essentially comes down to your own discipline and timemanagement. The key here is that youneed to set up time regularly and set yourself deadlines. Instead of having the deadline of a workproject to help motivate you to learn, you need to tell yourself “I’mgoing to get this chunk of plastic and copper wiring up in the air by the endof the month” and try to deliver on that goal.
2. Go Cold Turkey
is the hardest part of kicking any old habit.
Ideally when learning something new, I like to use it exclusively in all
scenarios where I can.
This may not always be possible: sometimes there is a deadline you have to meet and trying a new skill that slows you down is not always the best idea.
But even if that’s your scenario, pick at least one project to go completely cold turkey on for learning your new skill. Going cold turkey on a project will force you to work through the hurdles and actually learn the necessary skills.
3. Build a Collection of Resources
The internet is awesome: it contains nearly all of the information you could ever want for learning a new skill. The internet can also be a terrible place for learning a new skills if used incorrectly.
When learning something new, I try to find resources that guide me through a topic. Whether it’s a book, a website with a structured guide, a video course, or documentation with clear examples, it’s important to find something that will teach you the why as well as the how. I prefer using something with structure because it helps me learn the fundamentals correctly.
What I don’t like doing is searching for each question I have on StackOverflow. Don’t get me wrong, I love StackOverflow, but when learning some brand new skill I don’t think it always provides the best answers. Sometimes you get good answers, but sometimes you’ll come across answers that, while technically correct, apply to some edge case, old version of a language, etc… that make them less-than-helpful when learning a new skill.
4. Document and Share
As I learn, I document what I learn. This could be as simple as code snippets that I find myself using all the time, or it could be links to additional helpful resources.
Eventually I like writing up what I’m learning. Even if no one reads it, summarizing your thoughts and ideas will help clarify and retain them better. A summarized document or blog post also provides an additional reference for you to use if you need to in the future.
taking notes and sharing with individuals who are learning along with me.
5. Rinse and Repeat
That’s it! On my first pass at learning a new skill I try to finish a small project to get some immediate satisfaction. I then pick a new project that’s a little bit more ambitious, but still be manageable because I now have some knowledge that I didn’t have before starting my first project.
Baby steps. A little bit each day (or every other day). Do it enough times and eventually you find yourself being fully capable of whatever skill you set out to learn.
This post is a response to this month’s T-SQL Tuesday #105 prompt by Wayne Sheffield. T-SQL Tuesday is a way for the SQL Server community to share ideas about different database and professional topics every month.
This month’s topic asks to share a time you ran into a metaphorical brick wall and how you worked it out.
Recently I was using FOR JSON PATH to generate a JSON string from a query to use in a web app:
SELECT TOP 100 *
FOR JSON PATH
The resulting JSON string is 5,580 characters long.
The goal was to read this query result into my .NET app like so:
var jsonResult = db.Database.SqlQuery<string>("SELECT TOP 100 * FROM ... FOR JSON PATH");
Is this the best way to design every app/database interaction? Probably not, but it was right for this scenario because I didn’t want to create models for all of the dynamic data I’d be returning.
Design decisions aside, my “brick wall” issue was that my “jsonResult” value was getting truncated around 2,000 characters instead of displaying the full 5,580. The JSON string looked great in SSMS, but for the life of me I couldn’t figure out why the data was getting chopped off when read into .NET.
The first thing I usually do when I hit a wall like this is talk myself through the problem again.
This technique usually works well for me and is equivalent to those times when you ask someone for help but realize the solution while explaining the problem to them.
To save yourself embarrassment (and to let your coworkers keep working uninterrupted), people often substitute an inanimate object, like a rubber duck, instead of a coworker to try and work out the problem on their own.
Alas, in this case explaining the problem to myself didn’t help, so I moved on to the next technique.
2. Simplify the Problem
Breaking a problem down into smaller solvable parts can help sometimes. I changed my query to return less data by switching to SELECT TOP 5 and seeing if .NET was still truncating the data. It wasn’t! Mildly successful!
In this case though, I couldn’t really build off my simplified example. As soon as my result passed ~2,000 characters, the JSON string was getting chopped off.
In this step I also figured out if I put my query into a derived table, my .NET code worked beautifully and returned the complete JSON string:
SELECT * FROM
SELECT TOP 100 *
FOR JSON PATH
This was an ugly solution though and I didn’t like doing it. I especially didn’t like it because I didn’t know why a derived table fixed the output.
3. Check the Internet
As great as the internet is, I try to limit myself to how much searching I do on it when troubleshooting. Searching for an online solution can quickly devolve into wasting two hours with nothing to show.
I performed some cursory searches on Google, StackOverflow, various forums, blogs, etc… but didn’t find anything helpful (fun/sad fact: I searched for solutions again while typing up this post and now find plenty of solutions…who knows what I was doing wrong that day).
4. Ask a Friend
I love working through problems with others because I’m often amazed at how differently others approach a problem. Often times this leads to a solution I would not have thought of on my own. I especially enjoy hearing from people new to the subject area because they often have the most creative solutions due to not yet having become cynical and jaded from previous experience :).
I try to hold off on this option until at least trying all of the above techniques because 1) I hate breaking another person’s concentration 2) I feel like I learn better if I struggle through a problem myself.
And in this case shopping the problem around didn’t help – no one I talked to had a great solution.
5. Take a Break
After trying all of the above, I was out of ideas. I took a break from the problem for the rest of the day, resolved to give it another try in the morning the morning.
And the next morning, I had the idea to check the documentation to see what it said about the return type of FOR JSON PATH.
Embarrassingly, this one should be way higher on the list, and I’d like to say that it usually is, but for one reason or another I didn’t bother checking until this late in the game.
The documentation tells me that the JSON string will be broken up across multiple rows and my client app needs to concatenate them all together. What I ended up doing is a simple String.Join():
var jsonResult = String.Join("",db.Database.SqlQuery<string>("SELECT TOP 100 * FROM ... FOR JSON PATH"));
There’s no explanation for why SSMS is able to concatenate these values together but other client apps have to manually do so, but at least I found my documented solution.
Even though I found a somewhat-satisfactory solution in the documentation, my fall back was going to be to use the ugly derived table solution discovered in step 2. It was ugly, but at some point I would have to call it quits and settle with an ugly workaround rather than spend more time on troubleshooting.
Next time I’ll be sure to check the documentation earlier in the process and hopefully that will save me from some of the frustration I encountered in this particular scenario.