Scott Hanselman

Systems Thinking as important as ever for new coders

May 9, '19 Comments [30] Posted in Musings
Sponsored By

Two programmers having a chatI was at the Microsoft BUILD conference last week and spent some time with a young university student who came prepared. I was walking between talks and he had a sheet of paper organized with questions. We sat down and went through the sheet.

One of his main questions that followed a larger theme was, since his class in South Africa was learning .NET Framework on Windows, should he be worried? Shouldn't they be learning the latest .NET Core and the latest C#? Would they be able to get jobs later if they aren't on the cutting edge? He was a little concerned.

I thought for a minute. This isn't a question one should just start talking about and see when their mouth takes them. I needed to absorb and breathe before answering. I'm still learning myself and I often need a refresher to confirm my understanding of systems.

It doesn't matter if you're a 21 year old university student learning C# from a book dated 2012, or a 45 year old senior engineer doing WinForms at a small company in the midwest. You want to make sure you are valuable, that your skills are appreciated, and that you'll be able to provide value at any company.

I told this young person to try not to focus on the syntax of C# and the details of the .NET Framework, and rather to think about the problems that it solves and the system around it.

This advice was .NET specific, but it can also apply to someone learning Rails 3 talking to someone who knows Rails 5, or someone who learned original Node and is now reentering the industry with modern JavaScript and Node 12.

Do you understand how your system talks to the file system? To the network? Do you understand latency and how it can affect your system? Do you have a general understanding of "the stack" from when your backend gets data from the database makes anglebrackets or curly braces, sends them over the network to a client/browser, and what that next system does with the info?

Squeezing an analogy, I'm not asking you to be able to build a car from scratch, or even rebuild an engine. But I am asking you for a passing familiarity with internal combustion engines, how to change a tire, or generally how to change your oil. Or at least know that these things exist so you can google them.

If you type Google.com into a browser, generally what happens? If your toaster breaks, do you buy a new toaster or do you check the power at the outlet, then the fuse, then call the neighbor to see if the power is out for your neighborhood? Think about systems and how they interoperate. Systems Thinking is more important than coding.

If your programming language or system is a magical black box to you, then I ask that you demystify it. Dig inside to understand it. Crack it open. Look in folders and directories you haven't before. Break things. Fix them.

Know what artifacts your system makes and what's needed for it to run. Know what kinds of things its good at and what it's bad at - in a non-zealous and non-egotistical way.

You don't need to know it all. In fact, you may dig in, look around inside the hood of a car and decide to take a ride-sharing or public transport the rest of your life, but you will at least know what's under the hood!

For the young person I spoke to, yes .NET Core may be a little different from .NET Framework, and they might both be different from Ruby or JavaScript, but strings are strings, loops are loops, memory is memory, disk I/O is what it is, and we all share the same networks. Processes and threads, ports, TCP/IP, and DNS - understanding the basic building blocks are important.

Drive a Honda or a Jeep, you'll still need to replace your tires and think about the road you're driving on, on the way to the grocery store.

What advice would you give to a young person who is not sure if what they are learning in school will serve them well in the next 10 years? Let us know in the comments.


Sponsor: Manage GitHub Pull Requests right from the IDE with the latest JetBrains Rider. An integrated performance profiler on Windows comes to the rescue as well.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb
Monday, May 13, 2019 5:30:54 AM UTC
Great discussion and I remember this is similar to the questions that kept running on my mind during university days. Questions like: "why they teaching us relational databases? algorithms? (it was pure theory classes on paper and out of the computer lab), I want to build an application because that will help get a job". I didn't know by that time that Unis study is more about feeding the high/detailed level understanding of the concepts in the software engineering world, once that is built successfully you can apply it later in any tech stack: .net framework, .net core it doesn't matter.
I wouldn't advise at this stage to tie everything to "finding a job in the future", try to make it around learning journey.
Another thing is that this is an example of you getting yourself into in the future: Uni is not teaching you .net core but you want to learn it, you have tons of resources around you to learn it, so start instead of waiting the university to change its program or else.
Fouad
Monday, May 13, 2019 5:39:40 AM UTC
This is a really good post.

My thoughts, in coordination with what you've stated, are that it also depends on what you plan on doing for employment and or ones own projects. At work, a lot of times your fixing old technologies and adding things to old technologies. Then boss comes in and says give me something in Angular 2. Lol, learning never ends. Which is why your point is so valid.

I do have a couple observations to add. First, learning the new stuff to me is a safer bet. Why? Because the new leaves one in a place they should with the idea of systems but also allows a person to have an updated framework in their disposal. Learn .net framework now and relearn .net core later. If I had to pick I would pick new but still learning systems as I need to.

Moreover, learning frameworks are difficult. Entrenching ones self into a framework is a long process and when you mix that in with the real world i.e. we use this .net framework vs we use this wpf vs we want this .net core it can make ones head spin. I think this reality is a major reason of why the Windows store hurts so badly. People who are used to WPF's and in general win32 apps just don't want to relearn a framework.

Framework fatigue I call it. I had to fix an app the other day that was written in backbone. Systems is why a person can quickly learn a framework and deal with it but it does make life difficult.

So I do feel what a person is learning is important to consider but also understanding systems as you describe is of greater importance. Perhaps there should be greater effort to teach it in this manner.

"I am teaching you this and it might be all I know but it is your job to understand it and be able to learn newer things on your own."

My thoughts
Christian Matthew
Monday, May 13, 2019 5:45:03 AM UTC
Had the same feeling when they were teaching us C and Lisp in University. We've also had extensive maths course back in 2003. There was just a bit of "latest" tech (which was .net 1.1 at those times) in the end of my study.
Interestingly, that "core" knowledge of maths, algorithms, networks and databases was what enabled me to actually do something valuable in the industry. Technologies come and go every 1-2 years but the main stuff remains for much longer.
Kirill Metrik
Monday, May 13, 2019 5:45:49 AM UTC
My advice: learn diagnostic skills. Debugging, logging, divide and conquer, extracting nasty problems into a friendlier environment. These skills translate across languages easily, and speed up all other learning.
Jon Skeet
Monday, May 13, 2019 6:18:34 AM UTC
Given the amount of technology out there, trying to wrap your head around everything is a lost battle already. Distilling key skills is a much more scalable approach to making yourself relevant in context of software development.

Both Scott and Jon Skeet (see above) have great suggestions. I would add that being able to test your code is also invaluable. Given that there are millions of people who may use something you've built means that it's usability is paramount. Testing puts you in the mindset of a user and encourages you to make your code more usable, understandable, and therefore, ubiquitous. Learning how to write tests has made the biggest improvement to my code. I can not advocate this skill enough!

Thanks for the great post, Scott. Hope you're doing well đŸ˜€
Martyn Lloyd-Kelly
Monday, May 13, 2019 6:34:44 AM UTC
Great advice given by Scott Hanselman. My addition would be, never be afraid. Anything you learn becomes your skill. During this journey, arm yourself with the thinking pattern Scott mentioned. The skills are important.
I myself graduated from university with specialization in Java, never looked at .Net, much. My first big opportunity was ASP.NET based job. With in a short period of time, I went from almost nothing in ASP.NET, to developing an ASP.NET job portal that was multilingual. Not only that, but actually managing the hosting infrastructure for this and other projects for the company as well.

Adeel
Monday, May 13, 2019 7:11:14 AM UTC
Your advice is not only valuable for new coders, but also for experienced ones. Understanding what is going on under the hood of new or updated programming tools - be it Frameworks, IDEs or just libraries - is essential. No matter how big your experience as a programmer is.
MSicc
Monday, May 13, 2019 7:38:26 AM UTC
I'm from South Africa, sad that I missed you. I agree with the advice you gave 100%.

Its more important to know how a for loop works, than to remember the syntax. Most modern IDE's include snippets that insert commonly used structures.

Another thing for new devs, no workplace will make you write your daily code in Notepad (this was the biggest question when I was studying).
Monday, May 13, 2019 8:05:37 AM UTC
I agree with all of your recommendation and I think they are great,

I wrote my first program in spectrum basic and basic when I was a teenager, and I still think it was the most enjoyable moments of my programming life experiences. it was like magic and I was not thinking about my future career or be worried about next technology that might ruin my learning skills.

In Uni I learnt Pascal, C, C++, Prolog, Lisp, Assembly , Java, etc.
At worked developed with VC, MFC, Python, Delphi, C++Builder, IntelliJ , JavaScript, Visual Studio C#, etc.

But still looking to gain the magic feeling that I had when I was a teenager. Some kind of feeling that it’s driver is not money, deadline, job opportunity/security.
It’s driver is curiosity, learning new skills and doing something useful.
Monday, May 13, 2019 9:29:17 AM UTC
Hi,

Good article. I remember that in school (12 years ago), I mainly learn Java. There was only 1 lesson in C# and 1 in PHP. One would think how hard it is to become a ASP.NET web developer (webforms back at that time). However, what I learnt in Java was not the language. What I learnt was the concepts: how http works, what is a client, what is a server, how to make SQL queries, ... Obviously, ASP.net webforms was a stack on top of all this stuff, but once you had these concept in mind, and the page event cycle, it was just a piece of cake.
Nicolas Penin
Monday, May 13, 2019 9:33:09 AM UTC
This is why I recommend The Elements of Computing Systems to anyone who is interested in digging a little deeper. I really love how it allows you to go from simple elements like logic gates and flip-flops to a high-level language that compiles down to the instruction set for your own CPU you built from scratch.
asgeir
Monday, May 13, 2019 10:00:01 AM UTC
As a young man myself (58.5) these questions are pertinent to my own situation. I love developing but in spite of repeated efforts to the contrary (and a major blind alley which started with WPF, WPF/E, Silverlight and Windows Phone Development "did someone say 'modern'") I have ended up feeling like I lack current "in demand" skills and this (coupled with my age I guess) have meant that I have found it difficult to get a toe back in to a market that I enjoy.

So I now find myself looking for a local employer who will "take a risk on me" or looking at doing some serious up-skilling or, heaven forbid, doing something completely different.

GREAT POST! Both as a reference to point other people to (who perhaps don't appreciate the value of the "basic skillset") and also as a motivator for myself to renew my own efforts and get out there again :-)
Ian Walker
Monday, May 13, 2019 10:43:52 AM UTC
Are there any books or courses you advise one picks up to get better at Systems Thinking?
Chidozie
Monday, May 13, 2019 12:14:26 PM UTC
Totally agree. There is a particular issue with systems thinking in the web development world. The friction is so low to get going there, that you can virtually build a full web app without understanding anything about how the web works. No matter what platform you're developing for, it's crucial that you actually understand it.

My only other advice would be to just always be learning. The biggest and only real mistake you can make as a developer is to assume that you've got this, and just allow yourself to stagnate. There is always new stuff, and especially nowadays, languages, platforms, frameworks, and tools change a mile a minute. Frankly, your degree is virtually meaningless once you step out the door of your college, whether you're learning the "latest and greatest" or not. Read voraciously. Watch videos on Pluralsight and such. Get to know others in the community, and learn from them. Just never stop learning.
Monday, May 13, 2019 2:49:08 PM UTC
Great Post Scott. I would like to quote something that a professor of mine in my early days as a computer engineer, that really touched me.

You will be an engineer some day, hopefully. As an engineer you have to find a solution to a problem. Once you find the solution, you have to optimize it..

So learn things that language-agnostic, system-agnostic, have a solid background. Then, everything will be easier.

Fotis Spatharakis
Monday, May 13, 2019 2:59:14 PM UTC
These concepts are behind many of the questions I ask when I interview developers, rather than the usual "API pop-quiz" that most people seem to use...
Mac
Monday, May 13, 2019 3:10:41 PM UTC
110% agree that understanding the system is more important than mastering syntax. Frankly, I'm assuming that you know language syntax and can write reasonable code. If not - you will get yourself laid off quickly. So I don't conduct algorithm interviews much anymore other than quickly ascertaining whether you are blatantly misrepresenting yourself.

But my opening question is always "Describe in as much detail as you can what happens when you type www.google.com (or any web application) and hit enter to the time the browser renders the full page." I even give them a hint that I expect them to be able to talk for 5-10 minutes.

Less than 10% of web developers (including those with "architect" in their title) with 15-20 years of experience can talk for longer than one minute. ONE.

There's a lack of curiosity as to the why of how things work. And their troubleshooting skills aren't usually any better than "I'd go look at the logs".
Jeff
Monday, May 13, 2019 5:13:26 PM UTC
"If your programming language or system is a magical black box to you, then I ask that you demystify it."

I agree wholeheartedly. This is important for young and experienced developers. Recently I blogged about my efforts to remove HTTPS / SSL / TLS from the realm of magic (in my mind) and place it in the realm of the known and understood– a computer algorithm implemented in C# code. See The Math That Enables Asymmetric Key Cryptography.
Monday, May 13, 2019 5:30:43 PM UTC
I recently was helping a colleague who is well versed in java-script learn c#. Instead of sending him directly to a C# website or book. I sent him to a design patterns book and had him read it. And, that's exactly the advice I would give anyone learn the programming-agnostic skills, concepts, and theory. Learning C# syntax will take some time to master but in the end, knowing how design patterns work, how and why we do stuff and structure stuff goes a long way.
James Loyd
Monday, May 13, 2019 6:58:08 PM UTC
Totally agree with you Scott! The faster things are moving with 1000s of open source project and the relentless progress driven by cloud means that the basics become even more important. They will provide a solid foundation for understanding what to use and when. And then you can figure out the details.
Michael Pedersen
Monday, May 13, 2019 8:50:14 PM UTC
"What advice would you give to a young person who is not sure if what they are learning in school will serve them well in the next 10 years?"

I will tell him to focus on the problem he is trying to solve first and figure out the technology stack that can solve it later. This is a classic mistake university students make. I made the same until my Final Year Project supervisor told us to keep aside the tech stack for a bit and focus on the problem and its solution.
Talha Naveed
Tuesday, May 14, 2019 4:05:59 AM UTC
A very good insightful read. Thank you.



I see a many developers just trying to play catch-up with what's new. In the process they are totally forgetting that to really become able to understand newer tools they have to at least reinforce their basic skill, data structure, algorithm and mathematics to enhance problem solving skills. This is not happening and so the technical debt just keeps getting added with addition to exiting technologies that they worked in a project and switched to other without knowing why at first they changed and in the end there is abomination of tech stack becoming a pain to the product owners and the poor current development team.

To a fresher, I would say is a good technology company will care less how well versed you are with any particular technology and s/he should also try to join such where the core skills are valued much more. This will be their best decision as the growth opportunity they will get for their future is incomparable to those prioritizing what technologies can you type in. All the good software engineering organizations they look for talents wrapped up comfortable in the basics regardless of their experience in how many technologies they have worked in.

I have been working for a while and still learning and understanding more about the fundamentals of computer science. And it has never disappointed me by giving something new, simple yet hard to understand moving forward.

Tuesday, May 14, 2019 3:04:11 PM UTC
I agree with a lot of the sentiments in the comments here.

Personally, I think the biggest hurdle the programming community has to face is that (IMO) the perception of what programming is and what programmers do is completely different than the reality in most cases, and one of the reasons it takes many years to become a senior dev is that it typically takes many years for folks to, "unlearn what they have learned" as it were.

One of those concepts is that "most everything you know" has a shelf-life and that how quickly you can learn, and how well you can work with people, communicate, and particularly write and explain things in "plain language" - those are skills that stand the test of time. Frameworks come and go, and many devs start in this career thinking it's not a people-job, but, the older (and hopefully wiser) we get, the more apparent it becomes how much people and soft skills can make or break your career in many cases.

Take a writing class, a speaking class, a psychology class, and that will do you far better than memorizing things that you can google.
Aaron
Tuesday, May 14, 2019 3:24:07 PM UTC
Along with some of the other great comments here. I suggest that programming language specifics are not all that important. The things that matter will be timeless:

A few among many that I might suggest:
- Learn to work with others - the world of modern work is collaborative
- Learn to understand people and human behaviour - you will spend a lot of time coaching and mentoring in your career
- Learn Systems Thinking itself as a tool - this post was a great example of taking a Systemic Perspective
- Learn how to write well (a skill I still struggle with)

Above all, learn how to think
Tuesday, May 14, 2019 3:32:53 PM UTC
Great post.

My senior seminar in college was on a similar subject "What programming language should be taught at an introductory level". After lots of research my seminar was summed up as "Don't teach a language, but rather teach how to program". My professors used C++ to teach how to program but they didn't focus too much on the language itself. Instead they taught the concepts of loops, functions, pointers, etc.

I think that today I would also advise is to learn how to learn, and don't be afraid to fail. Failure is an opportunity to learn.
Tuesday, May 14, 2019 4:27:27 PM UTC
As a follow-up thought regarding people and people skills - the modern developer is increasingly part of a global community and taking the time to learn a little about other parts of the world, maybe a spoken language or learn about holidays or traditions, or follow some events in the news of other countries can have a big impact.

You'd be amazed how something as simple as, "Oh I saw in the news that there was an earthquake in the Philipines, are you and your family okay?" can really help your relationship with your team.
Aaron
Wednesday, May 15, 2019 5:03:09 AM UTC
The hallmarks of being a true pragmatic programmer!
Stuart Clement
Saturday, May 18, 2019 1:48:21 PM UTC
Drag the fiules from your texture ppack and drop
them into Win - Rar directly. An energy condenser is like a
cloner, it is possible to make exact copies using the item.
3D software is pretty an easy task to obtain, so
just about anyone can at least make an effort to develop
products or characters.
Monday, May 20, 2019 7:37:15 PM UTC
Personally I'm off the view university courses should focus on the sorts of foundational knowledge and skills that you're not likely to just "pick up" on the job. On that basis I wouldn't think C#/.NET a great choice of teaching platform (it's what I code in every day). Assembly languages, functional languages and of course some C (being still the king when it comes to down-to-the-metal coding, and the granddaddy of Java/C# etc) would seem to give more opportunities to build the foundational knowledge you will benefit from hugely as a career programmer. Understanding SOLID principles, the role of and how to design unit tests (whether via TDD or otherwise), source control/code review etc etc are also areas I know the course I did was sadly lacking in (it was 25 years ago!), and I'd hope were a focus of modern courses.
Dylan Nicholson
Thursday, May 23, 2019 12:03:27 PM UTC
Good advice!
I think it would be great if you made a new post about what are those thungs and where to start learning about them.
Mohamed Abdultawab
Name
E-mail
(will show your gravatar icon)
Home page
2+5

Comment (Some html is allowed: a@href@title, b, blockquote@cite, em, i, li, ol, pre, strike, strong, sub, super, u, ul) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Live Comment Preview

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.