AMA with

Jon Skeet

Jon is a programmer, author and Googler. He has helped millions of developers worldwide by answering over 34,000 questions on Stack Overflow in last decade.

29th March 2018, 6:00 pm

This AMA is over!

Thank the host

Message from the host 馃挰

Thanks everyone - this was a lot of fun, albeit tiring.

I'm sorry-not-sorry for being repetitive about diversity and the importance of communication skills. (If anything, I'm slightly surprised I didn't bring feminism in more.) Treat the repetition as a signal of their importance to me :)

How much time on average do you spend on StackOverflow reading Q&As and/or answering questions?

How much time do you spend on average breathing? :)

It's only a somewhat silly response, as I do treat Stack Overflow as a background activity a lot of the time, like checking mail or Twitter. When I get round to actually answering a question, that takes more time (or can do), but otherwise it's a very small context bump.

I look at Stack Overflow an awful lot - I'd be surprised if I didn't average 50-100 views of the question page per day, for example. But that doesn't take much time.

These days most of my interactions are in terms of comments, mostly encouraging questioners to ask a more specific question, or include code etc... hopefully in a positive way which will improve their skill level, rather than in a grumpy "This isn't good enough" way.

Will Kotlin replace Java?

Disclaimer: I haven't used Kotlin. I know very little about it. Take all this with a pinch of salt.

COBOL's still around, so I doubt that anything will completely replace Java any time soon.

One aspect of the "Kotlin replacing Java" side of things is that I'd expect most Kotlin developers to still need to know Java, at least for a long time. You're likely to be using libraries written in Java, with Java examples and Java-based questions on Stack Overflow. Maybe libraries will come with Kotlin examples as well over time, but I suspect that relatively few will come with only Kotlin-based resources. (Is this true for Objective-C/Swift? I suspect not, but again, that's a comment from a position of ignorance.)

I suspect that the health of the Kotlin ecosystem will at least somewhat depend on the health of the Java ecosystem for a long time too. It'll be interesting to see how big "Kotlin not in a JVM-like environment" becomes.

Thank you for the insightful answer.

Hi Jon,

What algorithm would you use to sort one million integers?

One that someone else has implemented :) I don't doubt the value of learning underlying algorithms, but I don't pay very much attention to them these days, until I need to. In order to choose an algorithm here, I'd need to know:

  • How important it is to make the right choice. (If it's only going to run once, without tight constraints, I don't really care.)
  • Memory constraints
  • Processor constraints
  • Bounds of the problem - are these all 32-bit integers? 64-bit? 16-bit? Unbounded? The most efficient sort may well depend on those
  • Whether I'm choosing an algorithm with an implementation, or whether I'm going to have to implement it. In many cases I'd trade peak performance for not having to do it myself (with the likelihood that I'd end up with bugs for at least a while)

What are your thoughts on doing code review, do you think that this is a good practice or waste of time?

Hugely good thing, but can definitely be done badly. Nit-picking can be valuable, but it's good to acknowledge when something is only a nit.

I may come back to this answer to provide more detail later, but I could probably spend the whole time on it. It comes back to good communication, as so many things do.

I would urge everyone to regard code review as a skill to be practised and improved upon. Not many people really like doing code reviews, but I'd be scared to code anything significant without them these days. (I tend to skimp a bit on both tests and code reviews for minor tools... that saves time, and hasn't bitten me much yet. Code reviews have certainly vastly improved the code I've written though.)

Thanks for your anwers

What's your definition of a Senior Developer / Programmer?

I don't really have one. I think experience is important, but that experience can be gained in a very wide set of ways. I think freshness and enthusiasm are also important.

I do value communication skills very highly - and the more senior one is, the more important that becomes, in my view. You're likely to have to spend as much (or far more) time explaining your ideas to other people as you are "explaining" them to the computer (aka coding).

If you could say one thing to someone new to programming. What would it be?

Persist: it will be hard, you will make mistakes, it will be frustrating - but it can also be absolutely wonderful.

(I'm being good and sticking to one thing. I could give a shortlist of maybe five that would all be pretty close - and might become the "one thing" on any particular day...)

My daughter recently started universitet for computer science. I want to say something profound to enspire her but haven't been able to come up with anything. I will pass on your advice. Thank you.

Hi Jon. I wonder about "java vs c#" thing. You work for Google, how does it come with such huge C# background to work in a Java/Python/C++ company? Do you use your .net skills at work?

What's your attitude to Java? Do you know it? If not are you planing to start learning?

Is there any chance Google turns to C#/.NET world?

Thanks!

I use my .NET skills all the time at work. You can follow along with the vast majority of the code that I write, as it's on github, mostly in https://github.com/GoogleCloudPlatform/google-cloud-dotnet. (I do plenty of work that isn't coding of course.)

That's only been the case for the last few years, but it's made my life happier. Java is the only other language I know to any kind of production quality, and frankly I haven't kept up with the new versions as well as I'd like to.

Will C# ever be a "blessed" language in Google? Who knows. I'd be somewhat surprised, but stranger things have happened. For the moment, I'm very happy to "merely" make the Google Cloud Platform experience as awesome as I can for C# developers.

Thank you for the answer. Do I understand correctly that Google itself isn't using .NET internally (besides making its cloud dotnet-friendly for users)?

I'm not sure how far I can answer that, I'm afraid. We're pretty tight-lipped about internal code. Sorry!

What's Your Take on WebRTC?

I really don't have one, I'm afraid. I suspect it may have some really valuable uses, and plenty of useless ones that people are briefly excited about, but that's just a generic opinion of almost any new technology.

What effective approaches or techniques do you suggest to study and master a certain technology? Like, for example C# or CSS.

This is probably a pretty personal question - I suspect people learn in different ways. (And I know far fewer technologies than people seem to expect me to. If you're a web developer, you probably know more languages than I do, to start with...)

If you know you're going to need to know a language/platform well (rather than "just enough to get by") then I'd recommend starting at the basics, and layering the knowledge. That's far more effective in my experience than diving straight into a mobile app with a cloud backend, all written in unfamiliar languages and deployed using a tool you've never used before. When something goes wrong, if you have a solid foundation, you can generally work out where to go from there. If you're mired in 10 different technologies which are new to you, you may well have no idea where the problem lies at all - or how to diagnose it.

Diagnostic skills are really important to me. If I'm going to do any work in a particular area, I want to be able to do at least one of three things pretty easily: a) run tests; b) use a debugger; c) write logs. Ideally all three, but having at least one is important.

Hi Jon,

I've been a developer for ten years, but in the last year I have been managing a team of twelve. In your experience what is a simple thing that a new manager should do?

Thanks, Damien

I was a manager for 6 months before moving back to being an individual contributor. I may be a manager again some day, but it's not on my bucket list. So all the rest of this answer is really hypothetical, but...

Work out what your goal is. Write it down. If it focuses on either you leading, or accomplishes on the product, tear it up and think again. If it focuses on the team, that's a start. If it focuses on the individuals on the team, you're really cooking... and then add value in terms of bringing those individuals together.

For example, I'd have a personal mission statement of something like "I will enable each of the team members to achieve more than they even realize they can, and bring the team together to be awesome." (That awesomeness may be building something awesome. It may be realizing that something doesn't need to be built. It may be finding out what does need to be built.)

My view of good management almost certainly reflects my beliefs as a Christian in Jesus as the "Servant King" - it inspires me to look for and attempt to model "servant leadership". Your team aren't there to make you look good: you're there to make them look good.

What's your take on the recent Blockchain bubble? Have you coded or wish to code a decentralised app?

It's never really interested me, to be honest. While we're in the maybe-bubble, it's hard to tell whether or not it's actually a bubble. We'll only be able to tell in 5, 10 or 20 years. I don't expect it to reach the top of my list of things I should investigate further any time soon, but that's just me... it doesn't mean it's inherently uninteresting.

Curious to know your Compare & Contrast between "Angular JS" versus "ReactJS" THX.

Well, one apparently has a space in, and the other doesn't. Any further comments I might make would be less informed than that...

Could You Kindly be more specific like; Amoung Two Which One is "One" in Your Reply. THX. Sorry to Ask Silly follow-up Question.

Hi Mr.Jon Skeet,

Curious to know directly from you like; For a Large Scale "Video Chat" as the One of the "Main Features" Application (both web/mobile), Kindly Suggest Preferred Languages, Technolgies, and Platforms which can be Used.

As an extended Question: especially the Open Source.

Regards,

I'm afraid I don't think I have enough knowledge to even speculate on this one, I'm afraid.

It's OK; What is the Most Preferred Latest Open Source Languages, Technolgies, and Platforms...?

"Most preferred" for what? In general over the industry? The Stack Overflow Developer Survey for 2018 is probably more useful than anything else I could say here, really.

Hi Jon,

A very serious question! Do you like pineapple on pizza? Why, why not? 馃懆鈥嶐煉火煃曫煃

Absolutely, and I've never understood why so many people think this is odd.

Pizza is almost the only context in which I do like pineapple - I find it too stringy in a fruit salad, for example. It's okay in a sweet and sour dish, so long as there isn't too much of it.

But on pizza? Absolutely - and not just for "ham and pineapple". When ordering take-out I'll often start with a meat-based pizza, and swap out pepperoni for pineapple.

What's Your Advice for a Startups Worldwide other than Bay-Area, especially from India.

Warning: no experience whatsoever at creating a startup. That said...

Make sure you build a diverse culture from the start. Once you've realized that your company has 50 engineers all of whom are men with the same background, it's going to be much harder to change that.

I've 5k rep points on stack overflow. It's an interesting platform. I've noticed that answering some questions pay dividends better than others (... better title, better formed questions, etc). And providing a thoughtful, complete, and humble answer is key (IMHO). What other insights have you gleaned from your experiences? What do you think is the most effective way to rack up those rep points?

I think it depends on what you view as "paying dividends". One dividend is enjoyment: are you enjoying the time you're putting in? That's typically easier with a well-asked question.

Another might be skills learned: are you picking up new techniques, new approaches by solving someone else's problem? Are you improving your communication skills?

Another might be the dividend to the world: is your answer making the world a better place, not just for the person who asked the question but others who may be facing the same problem?

And yes, there's rep. A number on a server somewhere. Don't pay that too much attention :) There are effective ways to rack up rep points that don't accomplish anything else nearly as worthwhile. My advice is not to go there. Focus on things that matter, and typically the rep will come as a side-effect, at least in many cases.

I'll suppose this is really "ask me ANYTHING", I was looking for a long time, for an answer to this question: Can EF code first replace all database-centric features like stored procedures, views, UDF.. Etc, and still maintaining high performance?

You can ask me anything, but that doesn't mean I'll have a useful answer. I'm afraid I know very little about EF myself. I can see a place for stored procs where logic is required "close to the data" but in my former roles where I actually used SQL in business apps, I still preferred to avoid them where possible.

Thanks Jon for your answer and your value time helping us. Greetings

Which editor do you use?

  • Sublime Text
  • VS Code
  • Atom
  • Something else?

Visual Studio, almost exclusively, for "real" code. I use an emacs-like editor called Jed for general text editing, mostly because I learned it in university, and have muscle memory for it now.

I'm a pretty "shallow" user of most tools - I'm sure there are very useful features in every tool I use that I've just never got round to learning.

I do have SublimeText installed, and tend to use that for non-VS scenarios where I want to do search/replace across multiple files, or to browse a large set of files.

I've played with VS Code several times but never quite become familiar enough with it. Maybe I need to try again.

Hi Jon,

Thanks for hosting this AMA. What motivated you to answer questions on SO? I have been following your work since a long time.

The bottom line is that I enjoy helping people. It makes me feel good, in the way that generosity often does for most people. (See "The Money Song" from Avenue Q for more details...)

But it's way more than just altruism:

  • I enjoy solving problems; small, tractable problems where you know you've done the job are great.
  • I enjoy finding out more about coding - give me a question about some obscure bit of the C# spec where the behaviour surprises me, and I'll be very happy.
  • I benefit from improving my communication skills, which Stack Overflow certainly helps with massively. I believe communication is one of the most undervalued skills in a software engineer... so why wouldn't I want to get better at it? :)

Hi, Nikos from i-programmer.info . What's your advice to beginning programmers.Should one get to learn Java or C#?, looking at the matter both career prospect wise as well as programming language capabilities/style/framework wise.

I would definitely not think about a career to start with. If you're just beginning, you probably don't have enough experience yet to know that it's a career you even want to pursue.

The most important thing I'd suggest is to find a language you get along with and which lets you do things that you find fun and (maybe) useful.

I do think there's a benefit in starting with something small and immediate. If you're right at the start of coding, don't expect to build the next Halo over the school holidays. I like to emphasize small tasks that are still useful or fun. For example, if I'm learning a new language, I'll implement a little guess-the-number game. That's a small, achievable task that has a concrete, interactive goal.

Or as an example of more useful-for-existing-activities skills, I've learned most of what I know about spreadsheets (which isn't much) by coming up with scoring sheets for board or card games (Scrabble, Mexican Trains, The Great Dalmuti etc).

When you're starting to get serious, I'd try to get a solid foundation on which to build - but that's probably not something for the very first few weeks of coding, where you're constantly experimenting. You don't want to spend ages on academic-sounding (though important) topics just to play a bit. There's a balance here...

Do you have any suggestions on Function programming techniques that would be beneficial for C# developers to learn?

Tomas Petricek did the vast majority of the work on "Real-World Functional Programming" (published by Manning) - I tagged along for the ride, but enjoyed doing so. There's a lot in there.

Hi.

How do I integrate TypeScript into every layer of the MERN Stack (i.e. MongoDB, Express.js and Node.js, not just ReactJS) using the MERN.io repo?

Thanks.

I'm afraid I've never even heard of MERN before - I'm sure you already know more about any reasonable answer to this than I do, I'm afraid.

Is Stackoveflow creating hordes of copy and paste programmers, hindering truefull education or is it the other way around, that is complementing education?

I expect it's a mixture, and that it's always been a mixture. I hope those who do just copy and paste right now eventually see that it's only a short-term benefit compared with the longer-term benefit of learning how things work. (Having said that, sometimes, if it's just "what command line argument do I need to do X" copy/paste is very effective, I've found.)

I don't think the availability of Stack Overflow has made things significantly worse here - people who are focused on "just get the job done" have always been able to find shortcuts without investing the time in learning more, I suspect. It's also important not to demonize people with that approach; we may think they're not doing themselves any favours, but it doesn't mean they're evil or should be treated badly. This is a failing in myself - I suspect I've been too harsh with those who don't appear to want to learn, in the past. I hope to improve in the future.

When writing a book as in your C# in Depth, how do you strike the balance between recycling old material and covering the language's newest features? For example do you leave out stuff that was done in a particular way under an older C# version since under a newer version alternative ways of going about the same thing have been introduced?

I'm currently writing the 4th edition, and I'm nearly at the end of writing about C# 2... which I've done from scratch, mostly. I'm condensing C# 2, 3 and 4 into one chapter per version, which means cutting out a lot of the detail, unfortunately. (Fortunately the 4th edition comes with an ebook of the 3rd edition, so you can look there for more details.)

As an example of this, I've barely mentioned anonymous methods - I'll go into all the detail of captured variables etc when I cover lambda expressions, because that's what I expect the vast majority of C# developers to use these days.

Hello Jon,

First all, Thanks for the AMA. I would like to know what is your day to day workflow. How you manage your work be productive and still able to keep on eye on SO. Are you using any specific tools for the that or any productivity tips?

You may be massively overestimating my productivity, of course... but I don't have any secret sauce, I'm afraid. I work from home a fair amount, which is great for productivity, happiness and a flexible family life - I'd like to see more companies enable this.

If there's one trait I have which is pretty useful, it's quick context switching. I'm really bad at true multi-tasking, but I can context switch from one task to another quickly in most cases. (There are some things where that really doesn't work, particularly for code reviews in codebases I don't know well.)

Now I could be fooling myself of course - it's very possible (probable, even) that if I tried to context switch far less often, I'd be more productive. I might even gain better concentration overall. I don't know whether we'll ever find out.

Great answer Thanks, Jon!!

Hii Jon ,
What is your suggestion for a beginner to improve UI and UX skills??

Well, you could look at any UI I come up with, then do the exact opposite.

Seriously, I have close to no UI/UX skills. The closest I can come is in terms of API design - that's a style of UX, but very different from web or app design.

To speak (yet again) from ignorance, I would expect that important aspects would be:

  • Working out how you're different from your users
  • Working out what the most important user experiences are, and making those awesome
  • Getting feedback and listening to it

THANKS FOR YOUR SUGGESTION

I'd like to know your opinion on the new(-ish) wave of system programming language.

To qualify this question: is it reasonable to want to have a programming language to be used for the vast majority of serious, money making, world changing (however arrogant or unrealistic this might sound) of engineering tasks?

I would take issue with the assumption that code that changes the world and makes money needs to be written in a system-level language.

One of the beautiful things about the way technology is going is that we're able to take advantage of a range of technologies together, and use the most appropriate one at each layer.

Any world-changing app is likely to end up using code written in a system-level language, but that doesn't mean the app has to be written in that system-level language.

Take ML: with something like TensorFlow, I gather a data scientist is likely to write most of their code in Python... not a system-level language. The core of TensorFlow no doubt needs system-level work, but someone could write world-changing ML without using that language themselves.

Of course, you could view TensorFlow itself as a "serious, money-making, world-changing" task - and I'd agree, but I wouldn't want anyone to think that those words can't also be used to describe applications. Intrastructure and apps enable each other - let's not encourage a view that one is inherently better than the other.

I should note that I don't work in any system-level language myself. I've heard mostly-good things about go, but haven't used it. I've written C and a tiny bit of C++ in the past, but nothing significant. I don't think that's impeded either my career or my possibility of accomplishing things. But I'm still really grateful to people who do write infrastructure, and it's nice to see that the ecosystem of system-level languages seems like it's doing well.

What are some of the future features of C# that you're most looking forward to ?

I'm fascinated to see how nullable reference types play out, in terms of adoption. That goes for a lot of other things - there's a cadence of adoption, when libraries, tutorials etc start to make it important to know about features. C# 7 tuples don't have much usage yet as far as I've seen, but could become really important over time. Who can say? I'll be watching closely...

I'm interested by the shapes proposals, but I'm not sure whether it might be a bridge too far. (That said, I've usually been wrong about things like that.)

"Extension everything" is interesting, and I'm expecting to have fun using it to come up with some really evil code.

More generally, I'm looking forward to seeing how the C# team thinks about not bringing new features out. How can the language stay relevant without becoming a kitchen sink? Which features will be retained only for backward-compatibility, but not used by new code?

Should programmer learn data science ?

"Should" always feels a bit worrying to me. It suggests a homogeneity which I'd like to reject.

Does data science appeal to you? If so, go for it! There are awesome possibilities, more than ever before, I'm sure.

Does data science really not appeal? Don't make yourself feel miserable or guilty about it. There are plenty of other areas to explore. Maybe learn just enough about data science to let you communicate effectively with those who do love it, but then don't sweat it.

Thank you for answering ! :D

Steak with or without ketchup?

Definitely ketchup on the fries with the steak, but at most only small amounts with the steak itself... and ideally not in the same mouthful as mustard on the steak. (And again, mustard in small amounts.)

What essential books do you recommend that are related to programming?

I suspect the book that would improve the software engineering world most if all software engineers read it and really took it in would be "Everyday Sexism" by Laura Bates. Understanding how shockingly sexist the world is in all kinds of different ways, and then thinking how that applies within the software industry, might help us to overcome it - both in terms of our own industry diversity, and building products which better serve all users. (There are plenty of other great feminist books of course; that's just one that I know is pretty accessible and has the kind of data/evidence that I suspect a lot of existing software engineers may find compelling.)

That's a serious answer, but if you really pressed me for a programming book, I'm not sure what I'd recommend, other than C# in Depth of course. I have shelves and shelves of programming books, and I rarely use them. I do think books are a great way of learning a language or framework, mostly because they're structured knowledge, designed for the task - all the information is usually out there already, but you don't know the order in which to read it. Books provide that ordering, as well as a consistent narrative and approach - hopefully, anyway.

Cause everyone asks this (or similar) of me...

What's the future "promising" programming language, framework, OS, platform(s) that are on your horizon?

I'm struggling just to keep up with C# well enough to write about it in C# in Depth.

I do think .NET Core is awesome, and I'm enjoying seeing it go from strength to strength.

I think cloud computing in general is starting to reach a new level of maturity which is very welcome, too.

What are your thoughts on F#?

Well, it's reasonably easy to play on the recorder, which is a good start. I don't think I've tried it on the trumpet yet (which I've only just started playing) so I can't comment there.

If you meant the programming language, it's my guilty secret - I really need to learn F# at some point. Although my name is on the cover of Real-World Functional Programming and I did write some of it, Tomas Petricek did the vast bulk of the work, and I've forgotten the tiny bit of F# I knew.

On the other hand, without knowing it I can still be grateful for its existence, in terms of the new features it has inspired in C#.

I know you've done quite a bit investigation into LINQ in the past. I'd love to hear your thoughts on Reactive Extensions

Ooh, RX. I haven't really used it much for quite a long time. When I did, I found it really, really interesting - but not terribly easy to use in reality. I just got confused a lot of the time. I still loved the ideas, but didn't quite see how to put them into practice.

Now it looks like a lot of people are very successful with RX in its various forms, and I definitely don't want to dissuade them. I don't even want to dissuade anyone who isn't currently using RX from giving it a try. I just want to avoid anyone else who finds it hard from feeling bad about themselves. I don't feel guilty for not embracing it wholeheartedly.

Is Node Time a never-ending project, or will it one day be 'complete'?

I suspect that the only point at which I'll take down Noda Time is when Microsoft has embraced/reimplemented it and it's in the framework. I'd be absolutely fine with that.

Until then, I at least need to keep producing updates when there are new versions of time zone data.

Realistically, there haven't been many changes in the codebase since 2.0. I want to release a 3.0 which removes binary serialization and embraces Span<T> at some point (it may well only target netstandard2.0) but there aren't many extra features I really want to add. There's range-related stuff we might be able to do, and maybe there are some extra calendars we could add, but I'm pretty satisfied with the bulk of it.

(There's a lot of work that could improve the docs and web site, but that's somewhat separate.)

Is a book these days, where there's competition by other mediums at large, like video lectures/mooc's, still considered a viable option? Have you considered using those newest mediums for teaching ?

I've recorded various Pluralsight videos, and some of my conference talks are online too. I think it's important that there are lots of different media available for teaching, because people learn in different ways.

Personally I find reading (whether online or - less often these days - in book form) more useful than videos for most things, but I know it varies.

I do think there's a lot of benefit in a structured approach to learning when you're a relative beginner in a topic, instead of learning piecemeal. I'd expect a good online course to do that in the same way that a book does, but there's less benefit in watching lots of different, uncoordinated videos, each on one different language feature, for example... each video may assume a different amount of knowledge beforehand, use different metaphors etc. With a structured, ordered approach you can build from one topic onto another.