Wednesday, July 30, 2014

August 2014 Speaking Engagements

I have a couple of events lined up for August. If you're in the area, be sure to stop by.

Wednesday, August 13, 2014
vNext OC
Newport Beach, CA
Meetup Event
Topic: Learn to Love Lambdas

I've been talking about lambda expressions for a long time. And they are really cool. A lot of folks have trouble getting over the syntax hurdle. We'll take things step-by-step and see that they are really easy to use once we get over that initial hurdle. And we'll see how lambda expressions can help us introduce functional programming concepts into our C# code. Lots of cool stuff.

Thursday, August 21, 2014
Central California .NET User Group
Fresno, CA
Meetup Event
Topic: Dependency Injection: A Practical Introduction

Dependency Injection is another of my favorite topics. The problem is that most developers are introduced to DI with a DI container. DI containers are extremely useful, but they hide a lot of the functionality. We'll take a look at DI concepts without a container so that we can really see the benefits of loose coupling in our code. Once we've got that down, we'll use a DI container and get all of the additional benefits -- but the containers will no longer seem like magic.

I'm excited to be going to the Central California .NET User Group since I've never been there before. I love going to new groups, meeting new people, and seeing what developers are doing in different places. If you'd like me to come out to your group, just drop me a line or request me through INETA.

Looking Ahead:  September & October 2014
Dev Sharpener Workshop - Hollywood, CA
Las Vegas Code Camp - Las Vegas, NV
Silicon Valley Code Camp - Los Altos Hills, CA
Desert Code Camp - Chandler, AZ

Hope to see you at an upcoming event.

Happy Coding!

Tuesday, July 22, 2014

Advice for New Developers (and Experienced Developers)

I've had several developers contact me recently asking for advice on getting into a development career and how best to learn about programming. I'm not sure that I'm the best person to ask since I sort of lucked into my career and got great mentoring and training as a junior developer, but here are my thoughts.

Not Just New Developers
Before we dive into this, I want to point out that this advice does not apply only to new developers. Our industry is constantly changing, which means that we need to be constantly learning. And experienced developers need to figure out new technologies and where we want to concentrate our efforts. So we get to keep going through this process every few years (or less).

Find What You Love
The first thing to do is figure out what technologies you need to learn. Something that we need to realize is that we can't learn everything. If you try to do everything, then you'll eventually find that you're competent in nothing. It's best to concentrate on one or two key areas where you can build a strong understanding, and then get a peripheral understanding of other technologies that are available in that environment.

Pick an environment or technology that you love. This is something that took me a long time to learn. Life is short, and work takes up a big part of that time. Do not do something that will make you miserable. There was a time in my career where I dreaded getting out of bed in the morning just thinking about all the things that I had to do. It's totally not worth it.

Finding what you love may be based on a particular industry. Maybe you want to be in entertainment or finance or medical devices. If this is the case, then investigate the companies that are working in that industry. Find out what technologies they use. Most industries gravitate toward similar technologies. For example, functional programming is big in the finance industry; embedded programming is big in the medical device industry. If you are working in an industry that you are passionate about, then you'll want to be productive and motivated to learn the necessary technologies.

Finding what you love may be based on a particular technology. Maybe you find that you love to tinker with Raspberry Pi devices; maybe you like to understand how humans work and want to make user interaction experiences better. At the same time, check to see how the technologies are used in the real world. We have to be practical. It may be that our favorite technology does not have many career prospects. But we can usually find something similar that is widely used in some industry.

I'm going through this now. I really love XAML and WPF, and even though it's a viable (and awesome) technology, it seems to be starting to decline (at least in the desktop world). There are times when I feel like I should be diving into JavaScript and the plethora of libraries, but that does not make me very happy for a variety of reasons.

Conversely, I've been exploring functional programming through different languages, and that has me much more interested. I've found that I've been using functional concepts without realizing it, so this seems like a more natural fit for me.

Find How You Learn Best
As humans, we learn in different ways. Some people learn best from books, some from videos, some from working with a mentor, some through formal training, some through reading the documentation, some through labs, and some through tinkering around.

Try a couple different learning techniques, and find which one works for you. Not everyone learns the same way. So, try a couple different techniques. I've found that I learn best through books. It lets me easily go back to previous topics, re-read sections, pause and concentrate on a particular topic. When I watch video, my mind tends to wander or I find that I want to open up an IDE and try some stuff out. So I usually find myself re-playing parts of a video over and over. (I say "re-playing" rather than "re-watching" because I really wasn't watching it the first time.)

But that's just me. Explore and find what works for you.

Get Involved
The best thing we can do is talk to other developers, especially when we're exploring new technologies. Find someone who's been working with the technology in the real world. You can get some great advice from that person: what works, what doesn't work, the things that are awesome, the "gotchas" that you have to work around. Talk to other people.

Get involved with a local user group (or several user groups). This has been a huge eye-opener for me. I was pretty late to the game; I've only been involved in the developer community for about 4-1/2 years. Before that, my developer interaction was limited to the people that I worked with. I was fortunate to work with some really good people, but I was missing out on a much, much broader community.

What I've found is that developers love to talk to other people, but (stereotypically) we don't want to *start* the conversation. If you're new to a group or are with a bunch of developers you don't know, just go up and introduce yourself to someone. Ask about what that developer does, and you'll find that a conversation gets started. And usually, other people will come over to join the conversation. I've seen this happen many times; I just had to be brave enough to get the conversation started.

If you don't have a user group in your area, start one. It might just be putting something on MeetUp to have coffee with a couple other developers. And it doesn't matter if you're working with the same technologies are not. Just start talking to other people.

In addition to getting advice on technologies, you'll also build relationships. Over time, you get to know a variety of developers and they get to know you. When you're looking for work, this is invaluable. After being involved in the developer community for a few years, I found myself looking for a new job. I was amazed at how many job prospects I got through people that I knew in the community. Not all of these prospects will work out, but you only need one job (hopefully).

Wrap Up
As developers, our industry is constantly changing. That means we need to be constantly looking at new technologies and we need to be constantly learning.

It is a challenge, but it is also exciting. We get to do new things all the time. We get to discover new ways to meet the needs of our business and users. We get to create on a daily basis. We get to keep learning. That's a pretty awesome job to have.

Happy Coding!

Tuesday, July 15, 2014

My Learning Debt

I learn best through books. But that leads me to a problem. I like to read books all the way through, which takes a bit of time -- especially when I'm following along in code and experimenting.

What that means is that I usually collect books faster than I can read them. And the one that I pull off the heap will depend on my current focus, so some books stay on the unread list for years. I just pulled out my collection of unread books to see what's there. Some of them I've had for quite some time.

Here's a picture:


And the list (in no particular order):
  • Hacker's Delight - Henry S. Warren, Jr.
  • Refactoring to Patterns - Joshua Kerievsky
  • Peopleware: Productive Projects and Teams - Tom DeMarco & Timothy Lister
  • 100 Things Every Designer Needs to Know About People - Susan M. Weinshchenk, Ph.D.
  • Seven Languages in Seven Weeks - Bruce A. Tate
  • Hello World! Computer Programming for Kids and Other Beginners - Warren and Carter Sande
  • The Little Schemer - Daniel P. Friedman and Matthias Felleisen
  • The Art of Lean Software Development - Curt Hibbs, Steve Jewett & Mike Sullivan
  • The Art of Unit Testing - Roy Osherove
  • C# In Depth - Jon Skeet
  • JavaScript and jQuery: The Missing Manual - David Sawyer McFarland
  • Head First HTML5 Programming - Eric Freeman & Elisabeth Robson
  • Refactoring: Improving the Design of Existing Code - Martin Fowler
This is a fairly consistent mix of the types of books that are on the heap at any one time. There are books on specific technologies, books on languages, books on design, books on practices, books on project management, and books on teaching programming.

Some of these have to do with areas I've been thinking about. For example, I have Hello World! not because I want to learn Python but because I'm interested in how people present programming topics to folks who have never programmed before. I've been interested in getting into this space (teaching new programmers) and have been looking through various resources on this.

And some of them are updates -- for example, I've read the first edition of The Art of Unit Testing, and I've flipped through the second edition and some of the updates look interesting to me.

I'd really like to just shove all of these books into my brain. But it takes time to really study and learn stuff. Different people learn different ways, and books work well for me.

Now, I need to decide where I'm going next. If you have ideas or suggestions, feel free to leave them in the comments.

Happy Coding!

Monday, July 14, 2014

July 2014 Speaking Engagements

I've had a late addition to my speaking calendar (yes, it's for tomorrow).

Tuesday, July 15, 2014
San Diego .NET User Group - UI Developer SIG
MeetUp Link
Topic: Clean Code: Homicidal Maniacs Read Code, Too!

Clean Code is one of my favorite things to talk about with other developers. We all have different definitions for what we consider "clean". And what's "clean" varies depending on the environment. In the presentation, we'll look at several practical tips to make our code easier to read, maintain, extend, and test. And we'll spend quite a bit of time in code doing some practical refactoring.

Hope to see you there.

Happy Coding!

Sunday, July 13, 2014

New Video: Nested Generics

Part 4 of the C# Generics video series is now available: C# Generics - Part 4: Nested Generics. This time we take the generic interface (from Part 2) and combine it with our generic factory method (from Part 3). The result is a nested generic. The syntax looks a bit strange, but it's not difficult to understand when we break it into its component parts.

The series will continue with an upcoming video on generic constraints and the "default" keyword.

C# Generics (Playlist
Happy Coding!