Hello again, this is Kevin O’Shaughnessy from zombiecodekill.com presenting a special question and answer session with some of the world’s top developers.

The field of computer science is huge, far too wide for anyone to master in all areas. We all need to make difficult choices about how and where we spend our time.

It’s often said that in order to be successful in this industry you need to specialize. But it’s also often said that you need a wide range of experience. So what is more important: breadth or depth?

This is a very difficult question, and is why I asked for the advice of some of the very brightest minds in our industry. I am delighted that they all agreed to help. Our expert panel is comprised of the following seven developers:

Scott Allen

Scott has 25+ years of commercial software development experience across a wide range of technologies.

He has worked on everything from 8-bit embedded devices to large scale web sites, developed web services for Fortune 500 companies and firmware for startups.

Since 2001, Scott has focused on server-side and web technologies, and is also a speaker at national conferences like VSLive!, as well as code camps and user groups.

Scott has been recognized as a Microsoft MVP since 2005, and has written or co-authored several books on Microsoft technologies. His blog is Ode To Code.

Mark Seemann

Mark Seemann is a Danish programmer based in Copenhagen, Denmark.

His professional interests include functional programming, object-oriented development, and software architecture, as well as software development in general.

He is the author of Dependency Injection in .NET, has created 8 courses with Pluralsight, and is active on GitHub and Stack Overflow.

He has contributed to renowned automated testing tools including AutoFixture and XUnit.

Julie Lerman

Programmer and mentor for over 25 years, Julie is the leading independent authority on the Entity Framework and has been using and teaching it since its inception.

Author of three Entity Framework books, including the Code First and DbContext editions.

Julie is well known in the .NET community as a Microsoft MVP, ASPInsider, and conference speaker around the world and she has authored the monthly MSDN Magazine Data Points column since 2010. She has also produced 15 courses with Pluralsight.

Kyle Simpson

Kyle Simpson is Head of Curriculum for MakerSquare and an evangelist of the open web. He lives in Austin, Texas, and is passionate about all things JavaScript.

He’s written 8 books published by O’Reilly, including six books in the You Don’t Know JS series.

Kyle teaches JavaScript and has three courses recorded by Front End Masters.

He’s a public speaker, and contributes to the world of OSS.

Troy Hunt

Troy Hunt is a Microsoft MVP for Developer Security, ASPInsider and Pluralsight author.

He’s been building web software since the very early days of the web, and has created Have I been pwned? a free service that aggregates data breaches and helps people establish potential impacts from malicious web activity.

Troy is the author of the eBook and series OWASP Top 10 for .NET Developers and creator of the Automated Security Analyser for ASP.NET Websites. He blogs regularly and is a frequent speaker at industry conferences and throughout the media.

Oren Eini (a.k.a Ayende Rahien)

An independent consultant based in Israel with a focus on architecture and best practices that promote quality software and zero-friction development.

Oren is the author of Rhino Mocks and Raven DB, with contributions in other well known open source projects including the Castle project and NHibernate.

He is an internationally known presenter at conferences such as No SQL Exchange, DevTeach and Oredev.

He has authored the book DSLs in Boo under his pseudonym Ayende Rahien.

Cory House

Cory is founder of Bitnative, an agile software development and training consultancy located in Kansas City. He is a Pluralsight author, Microsoft MVP in C#, and an independent consultant with 15 years of experience in software development.

He regularly speaks and coaches teams on clean code, architecture, and software career development at conferences and user groups across the country and internationally.

Cory blogs at bitnative.com as well as here on outlierdeveloper.com.

The Questions

I asked each developer these 7 questions:

Is your learning primarily driven around the needs of your job, or your personal interests?

Scott: Mostly by the needs of the job and my client. I’ve worked for a healthcare ISV named Medisolv for almost 15 years now. It has always been a Microsoft shop, but we’ve diversified some to meet the challenges of the U.S. healthcare industry, which has evolved dramatically.

I use to only use SQL Server for data persistence, but I kept hearing about NoSQL and document databases. I started working with MongoDB out of personal interest – to see what the hype was about and learn the mechanics and boundaries of document storage. However, I wanted to be comfortable enough to introduce it to Medisolv and make it easier to work with patient data. Putting together the complete medical information for a patient requires 20 to 25 joins in a relational database, but a single query in a document database.

Kyle: I have deep interest in the things that I study and learn about, but that interest is almost always focused on learning so that I can teach others, and teaching so that I learn better. And since I teach for a living, you could say it’s two sides of the same coin.

Julie: Combination of the two. I am self employed so I can choose which interesting things to pursue. I often make excuses to go down certain rabbit holes. But when I do, I also try to leverage what I’ve learned and share it with others since I typically have gone through some pain as I’m learning.

Oren: Both. I was lucky to be able to direct most of my day to day job to the things that interest me.

Troy: It’s both and you want the two to be combined so that you’re doing the things you genuinely enjoy. Sometimes that happened in my corporate career but the times it didn’t could be really hard; I have trouble picking something up if I’m not personally invested in it in terms of my interest. Fortunately these days the independence I have means the two are almost exclusively put together – I make sure my job is doing things of personal interest!

Cory: The positions that fit me best require continuous learning. When I find the things I’m learning aren’t of interest anymore, I know it’s time to move on. I strive to get the most value I can out of all time investments. So when I learn something for work, I blog about it. I speak at conferences. I offer consulting on the side. I author a Pluralsight course. My philosophy is summed up by Charles Max Wood:

Want to earn $1k today? You can:

(a) consult 6.5 hrs at $150/hr or you can

(b) sell stuff you’ve already made in a different way.

Mark: This has changed through my career. When I was a novice I was entirely driven by what was needed for the current job. In my first professional job I started with Sam’s Teach Yourself C++ in 21 Days, a lot of trial and error, and 100-hour work weeks!

I later worked for Microsoft Consulting Services, which involved serving as Microsoft’s expert on new technology. I once had a gig where the customer was evaluating the first beta of Windows Workflow Foundation, and I was there as the paid expert. Everyone understood that I couldn’t possibly have years of experience with it, but I still had to be noticeably better than the customer’s developers, to justify the rate Microsoft charged for me.

During those years, I became skilled at ramping up on new technology really fast.

Sometimes, I was only a few weeks ahead of my customers, but my sole job was to ramp up on stuff quickly, where they also had to look after their daily development and maintenance tasks, so I was still able to provide value.

After I stopped working there I was able to change gears somewhat. Even though today I’m consulting again, I’m now exclusively pursuing new knowledge based on my own interests.

What do you consider to be your strongest area?

Scott: Web development: 90% of what I’ve worked on since 1998 has involved the web in one way or another.

Kyle: My deep understanding of JavaScript and my ability to teach it are my strongest areas. But more importantly, I think the strongest thing I bring to the community is to obsess about learning something more deeply and more completely than most. I ask tough questions that push against the status-quo, and I’m not afraid to hold opinions that frustrate the mainstream of the development community. I don’t think progress happens when people just say “yes” all the time, but when people push back and challenge and go a different direction.

Julie: Back end development and software architecture.

Oren: A wide understanding on the fundamentals has allowed me to get a good grip on most new technologies. Note that this is wide, and not deep.

That means that I understand how a memory manager works, but can’t fix one. Or that I understand TCP/IP, but need a manual for Wireshark.

Being able to grok how things work at the low level has been invaluable when expanding my knowledge and experience.

Troy: Security is the area I’m most commonly known for publicly, that and Azure. However I’d say my strongest area is in communicating technology concepts to people and that’s far more pervasive than any one discipline.

Cory: I specialize in rich web application development. Although I build full stack solutions, front-end development is my specialty. However, I think I’m strongest in context analysis. I believe in clean code, automated testing, separation of concerns, SOLID principles, etc. And I believe all of these are useful in certain contexts. Humans love absolutes. But experts analyze the situation. Jeff Atwood said it best

“Being an expert isn’t telling other people what you know. It’s understanding what questions to ask, and flexibly applying your knowledge to the specific situation at hand.”

As a software architect and consultant, I spend most of my time asking questions to understand the context. The answer to virtually any question of reasonable complexity: “It depends.”

Mark: A common theme in my ‘mature’ career is how to deal with complexity; how to make code maintainable and sustainable. As Martin Fowler wrote:

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

When I started programming, I wrote code as unmaintainable and unreadable as any other novice. The first technique I discovered to address this problem was Test-Driven Development. This also lead me to discover Dependency Injection as a way to decompose a problem.

Later, I realised that automated testing is only one of a few ways to address the problem of sustainability in software.

I’ve also been thinking a lot about how to reduce complexity by removal. Instead of writing tests, it may be better to remove the need for testing at all.

I’ve been recently discussing how to get by without various language features, such as goto, null, mutation, inheritance, etc. It’s a much wider topic, though.

Instead of relying on a tool to solve a problem, I think it’s better if you can remove the problem altogether. Tools and technologies that I’m happy that I don’t need include ReSharper, ORMs, DI Containers, CI Servers and Virtual Machines.

Software architecture is another way to deal with complexity. If you choose the right architecture for a given problem, you can make some problems disappear.

In most software development, you can’t avoid complexity, but you can do a lot to make sure it isn’t complicated. As Fred Brooks described in The Mythical Man-month, there’s essential and accidental complexity. My strongest area is to remove the accidental complexity.

What areas of software development have you decided to avoid in order to focus on other areas?

Scott: At times my domain knowledge has suffered because I’ve tended to focus more on the technology. Domain knowledge is vital – a developer who knows the business is more productive and can anticipate change better than a developer who doesn’t understand the business or domain. Tweet this

This can provide a huge benefit in the software design.

Kyle: I don’t learn new frameworks when they come out, or new testing methodologies, or even new tools (editors, build tools, etc). I don’t have time or space in my brain to be broad, when I’m going after the narrow but deeper stuff.

I don’t chase after every new JS invention, but rather I linger on the core things that others gloss over. If I ever get to the point where I really feel I know JS enough, I’ll move beyond the core language. But I’ve been at this for years and I sometimes feel like I’ve only just begun.

Julie: I tend to avoid trying to be expert in front end technologies although I often have to dabble in them and work extra hard to get up to speed as needed. Then I don’t use those tools for a long time and have to go through the pain again down the road.

Oren: I was never very good with User Interfaces, and in recent years I’ve all but given up on doing any front-end work.

It requires explicit specialization today that I don’t have the time to dedicate to. That said, understanding how the User Interface works means that I can debug and troubleshoot such issues when needed.

Troy: Choosing what not to do is always hard. A good example is the LAMP stack; I used to live in that world many years ago but these days – even though it’s important technology – I just don’t get involved. There’s a lot of stuff I’d have to take on-board to be competent with so instead I focus more on the Microsoft bits and occasionally revisit some *nix or PHP.

Cory: Over the last few years I’ve focused heavily on JavaScript and the front-end. I’ve followed innovation in front-end development and grown comfortable with the major frameworks and libraries so that I can flex between them. I’ve had to ignore interesting innovations in NoSQL, functional languages like F# and Haskell, and dev ops related innovations like Docker. Selective ignorance is hard, but necessary.

“The difference between successful people and very successful people is that very successful people say no to almost everything.” – Warren Buffett

Mark: I’m currently avoiding JavaScript development, which means that I don’t do front-end development.

Hardware programming, machine learning, and game programming are other big areas where I’ve resigned myself. These could be interesting as well, so I don’t want to rule out anything, but if I never get to do any of these, I can still die a happy man.

Software development is such a big field, though, that there’s most likely areas I’ve not even considered.

What are you interested in learning next?

Scott: Building scalable multi-tenant cloud solutions. I’ve built scalable web sites in the past but I’m now looking at processing big data using compute intensive algorithms.

Kyle: My two areas of learning focus in JS right now are around advanced async patterns like reactive and CSP, and around practical, tangible applications of the basics (sans terminology) of functional programming. I am trying to figure out how to learn and teach FP in a way that never needs to scare others (or myself!) with words like monad or functor.

Julie: I recently dipped my toe in to Aurelia which is a JavaScript client ala AngularJS. I may get distracted quickly by something else though. But gosh there are so many things that many of my geeky friends are excited about. More NoSQL, Docker & other containers, Node, Internet Of Things. Who knows where my wandering mind may lead me?

Oren: Interested is an interesting term! There are areas that I would like to learn more about, but they don’t generate any excitement.

For example, it would be good to learn how to properly work with assembly, but that is just not interesting, and I can get away with not knowing it.

On the other hand, learning a new algorithm, or a novel way to do something is usually fascinating. I tend to follow what is going on in the industry and find the things that are interesting and exciting.

Troy: Picking up some of the Microsoft Power BI bits, mostly because I have a need for it as a tool.

Cory: I just finished recording a new Pluralsight course on React and Flux. There are over a dozen alternative Flux implementations out there that I’d like to understand better. I’m currently most interested in Redux.

Mark: While I’ve learned the basics of Functional Programming, I still have a way to go, so I’m still working on that.

I’m always looking for ways to expand my horizon and am interested in learning more about distributed and fault-tolerant computing the Erlang way.

I’d also like to learn more about logic programming, and I find modern lisps like Clojure fascinating.

Are you more interested in learning new areas or increasing your expertise in existing ones?

Scott: Learning new areas. Web development is in a transition period where technologies are raw and most of the industry is experiencing some pain in trying to keep pace with the W3C. The industry is focused on building better APIs and platforms for consumer facing apps. The back end systems and enterprise are being left out. Everything in life is cyclical, so I’m curious to see how long it will be before the trend reverses.

Kyle: Definitely increasing my expertise in JS – that’s my main focus, and has been for years now. However, I’ll say that I think the most healthy pattern for any developer is to pursue a path that switches between periods of narrow, focused, deep learning, and other periods of broad, shallow, rapid exploration and experimentation. Some of the greatest stuff we have today is because really smart people decided to explore areas that were far afield from their normal comfort zones.

Julie: Both! I spend a lot of time keeping relevant on the things that are my bread and butter. But I also dabble in other technologies because it is critical to at least have some awareness of the different technologies out there. Tweet this

It enables me to provide guidance to clients and other people who consume my written or recorded content. Even though I can’t always tell them HOW to do something, I can at least suggest relevant paths for them to look further into.

Oren: Learning new things, but learning them in a useful manner. Not just to skim them if they can be of use.

Troy: It has to be both. You can’t let yourself stagnate in one area, the industry is too broad and moving too fast for that. Besides, once you broaden horizons you open up a world of other opportunities as well.

Cory: Lately I’ve been more interested in learning new areas, but I find this is an ebb and flow. I try to follow Kathy Sierra’s mantra:

“Focus on just-in-time learning, not just-in-case learning.”

I’ve found just-in-case learning is often unused, so I’m better off focusing on the fundamentals than speculatively learning cutting edge tech that I may not utilize. Thus, I learn new tech when I have an immediate need, and otherwise fill my free time focusing on fundamentals. This is why nearly all the books I’ve read on programming relate to fundamentals.

Mark: In 2010 I got a dream job: Microsoft Azure technology lead for a local Microsoft partner. It was a consultancy, and my job was to make the partner known as the primary Azure partner in Copenhagen. It was research and development, with a strong emphasis on publication, and no billing goal.

A few months into it, I realized that I couldn’t muster the enthusiasm for learning all the nitty-gritty details of Azure. This surprised me as I had thrived on absorbing new technology at a fast pace. Nevertheless, when I looked at the documentation for a new Azure feature, I’d scan it and think: I’ve seen APIs like this before. I think I understand, on a high level, how it works.

I no longer had a desire to dig into the details; I’d already dug into so many details in the previous years that patterns had started to form in my head. Although the devil is in the details, I no longer felt the need to understand details in order to learn. That was a significant shift in my approach to learning.

Since then, I’ve been mostly interested in learning new areas instead of increasing my expertise in existing areas.

It’s not that all those years spent increasing my experience in various .NET technologies were wasted; they helped me establish a foundation that I could use to learn.

How important is having a niche?

Scott: Being niche is important to get started if you are in business for yourself as a consultant. It allows people to understand your brand and find you when they are looking for help. However, once you have an established name, I think being in a niche only limits your potential and the niche becomes a rut in the road forward.

Kyle: Diving deep into a topic that interests you is extremely important. If that topic happens to have mass appeal, you’ll probably make a lot of money being an expert in that. If that topic happens to be niche, you may struggle to make as much money doing it, but that doesn’t detract from its importance.

In fact, I think it’s likely that some of the best ideas are the ones with fewer than 10 stars on Github, that remain virtually undiscovered. If fewer of us were scared at the negative impact to our careers to explore those paths instead of just following the hype curves of the popular stuff, we’d probably collectively find a lot more great stuff.

Niche is important because when you strip away all the excitement, you get to the more important signals that are what truly make a project great.

Julie: Well, it has served me well, but it can also be a problem. I have almost 30 years of experience that goes way beyond coding syntax. I want people to benefit from that, not just ask me how to write a LINQ query.

Oren: It’s hard to be jack of all trades and bring a lot of value to the table – you want to be able to provide expertise at a given field. Tweet this On the other hand, being trapped inside your niche and having blinders is worse. You don’t want to be the person with only a hammer.

Troy: I’ve found it advantageous to build up a broad set of skills but also specialize in the security side which you might call niche. This helps me work across a broad range of technologies but also be that subject matter expert that people often need. A good example is my Pluralsight courses: Security is a niche I have a good command of there and have done extremely well as a result, but my broader technology background has meant I can go between a bunch of different things without getting pigeon-holed.

Cory:Being a generalist is obviously necessary if you want to build full solutions independently. But if you want to set yourself apart, it really helps to select and market a clear strength. The great news is you can select a different niche whenever you get bored. Through the years I’ve switched stacks multiple times and shifted my focus between different layers as well.

Mark: Having a niche is mostly important as a sales tool.

In reality, in order to solve any complex task, I think you need a team with both generalists and specialists. Each has valuable skills that contribute to the success of a project.

It’s difficult to become known for being a generalist, so in order to sell yourself it’s important to have a niche.

Selling yourself is important to anyone who wants to further their career. It applies to independent advisers like me, but it also if you’re a full-time employee somewhere: you still need to position yourself to get the assignments you want.

Having a niche can be a double-edged sword, though, because it can also lock you into a role you want to break out of.

After I wrote my book on Dependency Injection, people mostly knew me as a Dependency Injection expert. That’s still good, but these days, I’m working hard to become known as an F# and Functional Programming expert. Sometimes, the Dependency Injection and .NET labels can work against that new goal.

So having a niche is important, but it’s also important to be able to reinvent yourself regularly. Tweet this

What is the biggest thing that drives you to keep improving as a developer?

Scott: I have a love for software development and I approach software development as a craft. I’m always looking to see how others approach and solve a problem because the “aha!” moment is euphoric.

Kyle: Every line of code we write is teaching someone else. I constantly want to learn better how to communicate to others through the code I write. If I can write code that virtually teaches its concepts itself, that’s when I’ll know I’ve arrived at true understanding of it.

Our code will never be any better than our understanding of it, so I have to learn to code better, so I can teach better with my code, so that I and others can learn better. It’s one big cycle that feeds back into itself. And that feedback loop is what makes being a developer worth it. Otherwise, I’d have burned out long ago.

Julie: The constant flow of new ideas, new technologies. All so exciting. Who wouldn’t want to learn or at least learn about it all? But sometimes it’s not new ideas. I’ve gotten very inspired by so many of the ideas in Domain Driven Design and I think that is truly what is making me a better developer every day. It really makes me think in a different way about how I approach problem solving.

Oren: It is interesting. I don’t have to force myself to do this, I want to do it. Learning new stuff, figuring out new things is fun.

Troy: It’s a combination of things. A general curiosity of how these things work, a desire to improve what I’ve already built, and the potential to turn the technology into something genuinely useful.

Cory: Love of learning. If you love learning, you have a massive advantage.

Mark: I get a kick out of it. I’ve been extremely curious about how things work for as long as I can remember, so I just have to learn more. I love the feeling I get when I can feel my brain rearranging itself, so I’m always searching for the next trip.

Which industry figure has been the biggest source of inspiration for you and your career?

Scott: Don Box. Tweet this He’s an effective communicator both when speaking (he can be very entertaining) but also in prose. I like dense books that have layers of meaning. I’d like to think I’ve mimicked Don’s style a bit in my own writing and teaching, because Don has a knack for tearing apart a complex subject and finding the very essence of a technology. Then he’d hold that essence in the light and move it around so you could see different facets and perspectives. He taught me not just about the technology but also about the teaching.

Kyle: Allen Wirfs-Brock, TC39 member and editor of the ES6 (ES2015) specification. Every single time I talk to him, I come away having learned more than I can even realize. Tweet this

Oren: Michael Feathers. He’s the inspiration behind Rhino Mocks. Tweet this

Troy: I know it’s a clichéd answer, but I’m going with Bill Gates. Tweet this A lot of what he’s done resonates with me, everything from how he hacked away at software in the early years to his dropping out of university to his meteoric success. And in later years his philanthropic work has been a standout too and really set him apart from his counterparts.

Cory: Robert C. Martin. Tweet this He’s an excellent developer. He’s an engaging writer. He’s a superb speaker. Rarely does one person have all three of these skills. And to top it off, he’s a genuinely nice guy. Talking shop with Bob at a conference was one of the highlights of my career.

Mark: I’ve been thinking seriously about starting a campaign to nominate Robert Martin for a Turing Award, although he wouldn’t be a traditional winner. Tweet this

His work with describing and codifying the SOLID principles, Clean Code, and his TDD advocacy have been tremendously important in the industry. He deserves the recognition of that, even if he would be the first to admit that a lot of it isn’t his original work. As an example, the Liskov Substitution Principle was first described by Barbara Liskov, but Robert made this accessible to the millions of ‘normal’ programmers.

I’ve also learned a lot from Martin Fowler and Kent Beck, but Robert is my biggest hero.

Kevin: I completely agree on Robert Martin. Before I read Clean Code and Agile PPP, I considered myself to be a professional, but I didn’t even have a good understanding of the word. It began a big change in how I approached my work. I might still be a junior developer today if it wasn’t for him. Tweet this

I’d say all of the original Agile Manifesto signatories have done a huge amount for our industry. Beck, Fowler and Feathers as already mentioned. Thomas, Cunningham, Cockburn and others have also taught me a lot.

Lessons Learned

There’s no magic recipe for success as a software developer.