Systems Thinking as important as ever for new coders
I 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.
About Newsletter
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
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.
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 đŸ˜€
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).
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.
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.
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 :-)
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.
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.
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".
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.
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.
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.
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.
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
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.
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.
I think it would be great if you made a new post about what are those thungs and where to start learning about them.
Comments are closed.
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.