Things I Don’t Know as of 2018
overreacted.io
overreacted.io
When I try to learn about topics that I'm unfamiliar with, the hardest information to find is "Why is X important?" and "What is the most important thing to know about X?"
With those in hand, I'd be able to determine if a deep dive into the topic is useful for me or not.
I think that's the point: we all know (most of) the gist of it. But the practical experience isn't something you can prep for in advance. You never know what tech you'll need to use in the real world. The "deep dive" comes when you get hired and the employer needs that tech. I'm not sure the employer gets that.
Why would vocalizing that be dumb? It's actually not a matter of perceived capabilities, but of concrete results, and, in the case of those guys, there aren't plenty of room for discussion on this regard..
This may be true in many fields, but not in science and engineering.
Vim or Emacs IIRC.
As of 2014, relational databases.
https://mobile.twitter.com/ID_AA_Carmack/status/457916010234...
Made me feel less bad about it :)
I'm not a good programmer, but I can say very proudly that I've never used any debugger (except for assembly language, where the debugger is more like an interactive shell).
I don't want to claim this is superior to printf debugging, or whatever other technique. I just like seeing the code executing, and debugging some weird error can sometimes be an almost relaxing activity, as you just step through the code one by one and try to keep track of what's happening without needing to think more than 2 or 3 steps ahead.
That said, I'm also the guy who will happily put breakpoints into internal framework code (e.g. Spring Boot) so that I can understand why the framework doesn't do what it's supposed to do. Usually, I find the answer, although maybe in some cases it would have been more economical to use a workaround instead, but that would leave me dissatisfied...
Furthermore, in response to what one the siblings said about creating logging infrastructure, in my own debugging I tend to not find much value in keeping a bunch of logging around. For me keeping logging around boggs me down. Typically what I will do if I do printf debugging is I add logging statements, hunt down the bug and then commit the fix and the added printfs because they add context but then I immediately make another commit where I remove the printfs. This way I have them in the version history should I need them, while at the same time avoiding extraneous log entries at later time.
And really I’ve found that over time I do printf debugging less and less.
I attribute this to mainly four things:
1. A friend of mine that encouraged me to use an actual debugger
2. Watching Jonathan Blow program on his Twitch stream and observing how proficiently and fast he is able to get the information that he needs by using the debugger
3. CLion. As much as I like the commandline, I never found gdb with the commandline interface to be a suitable tool for me. Whereas with CLion I get a good debugger that makes visible to me most of the information that I need while I am debugging
4. Through years of programming I have learned to recognize many of the types of bugs that I produce. Also, with experience I have learned to write code that is easier to reason about and to debug as opposed to in the beginning where I was trying to be “too clever” for my own good with the code that I wrote.
I think another of the sibling comments put it well about the debugger being like a scalpel. Trying to step through a whole program and following what’s going on would be slow, confusing and ultimately error prone. In order to effectively use a debugger I think you need to have a hypothesis about what is causing the bug and then set very specific breakpoints that you make use of in order to figure out where things are going wrong. From your initial observations you can set more breakpoints at a more coarse level (shallower call stack levels) and use those to observe what leads up to things going wrong.
Good IDEs with good static analysis, good unit test/integration test/e2e test coverage, a true understanding of the code base before changing it, all these avoid most bugs.
When the production hits a bug, good monitoring and logging can help root-causing. It is extremely difficult to debug and reproduce a bug in a distributed environment. Many bugs I have root-caused are purely based on monitoring and logging then show the proof with mind-execution of the code.
there is one notable exception to the no debugger rule: if you are learning/exploring a new code base on your dev machine and/or when writing tests [to cover legacy code]. but apart from that, unless your work is really special, you should not need a debugger.
My background is video games. I specialize in real-time 3D applications. I think web tech is an overcomplicated embarrassment of cruft built on cruft built on cruft.
Programming is a wide and diverse field. Webdev is the overwhelming majority of programming jobs. But you can have a very successful career not knowing _any_ of that stuff.
People do just enough to get by and "get things done," which always looks great at the time it happens. And then things break, and no one knows why because no one has the depth of knowledge to investigate it. But it has to be fixed, so typically one or two people in the team are assigned to it and are miserable for days or weeks while they painstakingly try and learn about the things they should've known in the first place, while at the same time try and fix a system under a lot of pressure from management.
I wish the software industry rewarded knowledge, correctness and excellence rather than speed of execution.
There are way too many things involved in a software system these days for people to know all of it. We shouldn't expected people to be highly knowledgeable about all of a programming language, multiple frameworks, libraries, cloud providers, CI/CD, security, and who knows what else. Instead, those should be specializations and teams should be composed of multiple specialists.
I'm well aware that what I'm saying is a pipe dream. The industry at large is fine with the idea of deploying broken things and patching them later, no matter the cost to the health of engineers, so it's not gonna change anytime soon.
I'm building multi-million dollar applications for companies, and often it's with languages and frameworks I've never used before.
I think what we need is to stop having "flat" feel-good organizations where everyone gets a say, and similarly we need to stop having corrupt organizations where the most politically savvy person is at the top.
We need strong, competent technical leaders who truly know most languages, frameworks, paradigms, and we need to pay them well. They need to take responsibility for the whole project and architecture, ruthlessly simplify, and work with product to define what actual problem is so the team and code doesn't turn into Frankenstein's monster.
We need non-corrupt competence hierarchies.
</Soapbox>
Besides that, a deep dive into operating systems (yes, that means to get rid of MacOS if you use it) will give you a solid foundation to understand networking, containers and even more.
Does it also mean we all need to learn how to design integrated circuits?
Otoh, running strace, gdb, and objdump can get you pretty far when debugging production code you've never seen that uses trillions of abstractions.
https://overreacted.io/the-elements-of-ui-engineering/
Reading it I feel that creative problem solving is more important than simply knowing stuff. I wonder if knowing too much stuff is actually detrimental to exploring new ideas and trying them out.
And nothing of value is lost.
1. That took a lot of futzing around.
2. But way less futzing around than I expected for a fully cross-platform application.
I still think the idea of Electron (using modern web technologies to develop applications) has merit. It just needs a better implementation (i.e use native webviews rather than shipping an entire browser.)
But similarly, he might well know these things to an above-average level, and just think that he doesn't.
In a practical sense that should be fine, given the level of specialization that a company like Facebook can have given its size and scope. But I wonder if Dan would make it through the average Facebook engineer interview without his Redux cred however.
He is also the rare person who is very honest about this kind of thing which is refreshing. For example he claims he only vaguely understands time complexity ("nested loops are bad").
I don't know exactly what point I'm making here, besides there can be a disconnect between a developer interview process and what people actually contribute. I think engineers should strive to be solid at the fundamentals, but at the same time there are very productive people who just learn as they go. Also, it takes a village so to speak, and over-optimizing for Comp Sci majors who drill LeetCode may not be the best long term choice for building teams either.
I am talking about people like Jon Gjengset who got hired to work on Rust at AWS.
The way I see it the advent of React was basically a rejection of the imperative MVC model that was prevalent with the likes of Backbone in favor of a more functional one. The first prototype of React was written in Standard ML. The evolution over the years with flux, redux and hooks was basically answering the questions that were arguably solved in MVC already but coming from the angle of declarative, immutable approaches. Where does state live? How do I handle asynchronous effects? How do I abstract that behavior from my views?
I don't think the community has answered those questions definitively yet and a lot of the interest seems to be in refining the view mechanics with the likes of Svelte rather than really getting to grips with how to best handle long lived application state and the effects that operate on it.
One thing I could see being the case in a couple of years, and in some ways the video does reach this conclusion, is that the reactive, stateful layer will be abstracted from the view and how you render your data will be almost like choosing a templating engine on the server. It could be React, Vue, Svele, Marko, Web Components, whatever. Those libraries and components will handle your dropdowns opening and closing and your tooltips showing but your real application state that distinguishes your product from another will live somewhere else and will be less subject to churn.
He's a library designer and is working with a team maintaining and updating one of the most popular Javascript libraries in the world. He has a very deep background in that language which is one of the most important skills for his role.
I don't blame him for not knowing some of those things you listed more deeply. There's only so many hours a day to dig deep into a wide range of material. You still have to spend time going into other material that might be more relevant to the day to day including testing, managing people, communication with team members, planning, etc. Yeah sure I'd love to be more knowledgeable about CORS or networking, but I also want to be much stronger in Javascript, the JS library I'm working on, design patterns, deployment, etc.
Lastly, I'd rather be in Abramov's shoes where my work profoundly influenced web development than be all over the place with my 'expertise' and not actually be all that impactful with my time.
I can relate to that a bit, especially CORS since I never bothered to see what was up with that at a deep level either. Honestly just used a module for Flask when needed to get it working there and set up a CORS proxy on a cloudflare worker for a different project and called it a day.
Maybe that's how it went with him too. I'd call this something like "Laze Driven Development"—learning just enough to solve the problem (like my experiences with bash scripts).
I’d say he built actual products for the web just fine.
Not that I would care either way - this is about skill sets and not personalities.
The guy is a specialist. That's like asking Lionel Messi to also be good at goalkeeping.
You should take a good look at who posted the article.
Fundamentally, who he is and what he's done in the community is the context of the blog. Without understanding that, you miss the entire point.
He's skilled at JavaScript and C# and worked with Python for years, what's the betting he's as good as any typical Python developer, if not better? Pretty good, I'd think.
> "I struggle to read either LISP-inspired (like Clojure), Haskell-inspired (like Elm), or ML-inspired (like OCaml) code"
How many people don't know Haskell but can successfully struggle through reading it instead of having their eyes glaze over and completely refuse to try?
> "CORS. I dread these errors! I know I need to set up some headers to fix them but I’ve wasted hours here in the past."
"I don't know it - but I've also worked on it and know how to fix it and done so" - hmmmm. I suspect he is more capable than he's making out; politely talking himself down.
Why?
If you are heads down working on core Javascript technologies, why do you step over and dig into learning more than the basics of Python? Likewise most of these languages/ skills.
I'll accept his word that he doesn't know the details of Python module imports, that he isn't an expert, but surely there's a difference between "not expert at X" and "don't know X"?
You are commingling "Don't understand programming" with "Don't understand Python here. It's pretty clear that an experienced developer is going to understand parenthesis matching. But regardless of how many years of experience you have in Javascript, the first time you see a Python list comprehension you are likely to scratch your head for a bit. Python lambdas are also quite alien if you aren't familiar with them.
FWIW, I was a professional developer for 10+ years before I knew learned Big O notation. I know a fair number of junior and even senior developers who don't know Big O notation even now. I knew how to avoid Big O type problems long before I knew the terminology.
The first time, sure. After several years of working with Python? He does say that. "I have worked with Python for several years".
Dan isn't a frontend engineer in the usual sense. He works on the underpinnings of the language, he's not building web sites.
From the comments it appears this person has done some significant work in YetAnotherJavaScriptFramework.
Boasting that: Fuzzy on the details of how TCP/IP works (hello web developer, read a book!), does not understand order complexity specifically or algorithms in general - as one commenter pointed out - no wonder JS front ends are such shit if this is the level of intellectual heft that the authors have. Not knowing modern CSS - how can this person possibly work in any sort of cutting edge web development and not know about that?....
Specialisation is OK, but ignoring the general knowledge of how computing works, and then going on to write software used in people's critical systems is irresponsible.
Buy some books. Read them. Understand. It is not hard. But, yes, reading is harder than writing, listening is harder than talking, learning is harder than making stuff up and reinventing the wheel....
Yes. No wonder the state of web front ends.
I don't think it was meant to impress. On the contrary I think the overarching point of the whole article was that it's okay to not know things outside of your domain that may seem trivial to other CS folks.
> Not knowing modern CSS - how can this person possibly work in any sort of cutting edge web development and not know about that?
Well, I don't know how he does it anymore than you do. But it looks like he's still working on cutting edge web development and it seems to be working out, so my takeaway is that he doesn't need to know about it plain and simple.
Well, it's not ok. It's bad. It's irresponsible.
There is a lot of basic stuff on that list one has to know.
If the knowledge is not relevant or applicable to what you are working on, what is the problem?
Knowing that things exist is more important than in-depth knowledge of those things.
The vast majority of web developers I've worked with don't know TCP, and I'd count myself in that group too.
Now I'm not saying he doesn't know how to program. I'm just saying it's very interesting to me how little you actually have to specialize in to make it in this field. What my internship has taught me, it really makes me feel secure job wise knowing I won't have difficulty being employed in the areas I know. I hate sounding so cocky but when I first started schooling again geared toward comp sci, I thought programmers knew just absurd amounts of stuff. Now I've found, they typically are just the average tech savvy individuals that weren't afraid to poke around in an OS.
During my last job hunt three years ago, I had interviews every week. On my current job hunt, I'm having problems booking just one.
There will always be a combination of factors that can make your job search easier or harder.
If people you know do not know much, then the people you know do not know much, there are also people you do not know.
Out of curiosity, could you elaborate on that?
When I see several total stack changes on a resume it sends me a strong signal that the person can adapt and learn.
There are devs with 10 years of experience that really have ten time one year of experience.
Some places teach IT as rote and magical knowledge. Others teach fundamentals. The first are effectively constantly re-learning and the later are improving. I always say I would rather hire someone with a good understanding of graphs and who never heard of git than someone who rote memorized git commands but has no clue what a graph is. Because the first one can pick up git after reading one or two tutorials.
> Experienced developers have valuable expertise despite knowledge gaps
contributes heavily to
> learning technologies when I need them
which can be very valuable.
I agree it’s ok to not program C or understand network/transport layer in depth. but things like unix shell basics, python, micro services, docker - these are all fundamentals I assume everyone (backend, frontend, mobile, or game engine) has working understanding of in order to be a proficient developer today.
nice that the author recognizes the areas they lack, and should commit to learning in 2021. happy to give good recommendations on books or online classes.
more curious to see this list authored from someone with more diverse experience.
working on an open source JS framework is great and all, but doesn’t make you a seasoned engineer IMO.
TlDR: take this list and dedicate time in 2021 to learning so you can be productive in real world business engineering teams
Some ideas of redux are great, but the execution could have been much better. I think lack of experience (maybe also related to Javascript) is the reason.
I _think_ this demonstrates something similar to what you're talking about: https://redux.js.org/recipes/isolating-redux-sub-apps
I'm also curious which parts of Redux weren't executed well, especially considering how small the library is.
> These <SubApp>s will be completely independent. They won't share data or actions, and won't see or communicate with each other.
and
> This pattern is not recommended for parts of the same app that share data.
This is precisely where it gets interesting. Composition is important to combine things without these things knowing that they will be combined in advance and having to change them.
So imagine there exists a redux application that shows a dashboard which lists sales within a timeframe. Now I build a new redux application that wants to use two of the existing redux applications next to each other, using one to show sales for last year and one to show sales for this year, using the same timeframe (months/days) but for different years. This is a very very simple case of composition, but it becomes tricky fast.
Question: how do can I align the timeframes within the two sub-applications? I want to make it so that if the user changes the timeframe within one of the subapplications, it should translate to the other one and vice versa. Can I do this _without modifying the code of the sub-applications_?
Why do side projects matter for a job? Learning, maybe, but they both point to "extracurricular" time spent programming, which shouldn't affect someone's hiring. I've been on hiring panels and have pushed specifically against that mentality, because I strongly believe what a person is interested in outside of their work shouldn't affect my decision to hire them, as long as they're competent during the interview.
but there are plenty of ways to learn the general basics of modern computing on company dime. whether thru training, talking with peers, reviewing others code, or taking a step back and looking at architecture outside your specific domain.
if I’m speaking with a frontend engineer on my team who doesn’t understand how his code is deployed or basics on the compute resources used to run that code it’s likely not going to be a very productive discussion
Maybe:
- The author is has a very acute sense of where his expertise is limited and that fact leads him to seek really expert help when he needs it?
- He has spent his time gaining deep expertise in an area rather than trying to spread his time across a number of unrelated?
- He works in a team where he doesn't need the skills he's listed?
- He's just modest about his capabilities?
I have only passing familiarity with Python and as for the two others, I just know what the tools are for, but have never touched either, and I am certainly a proficient developer. My workplace just happens to use other tools.
I am very proficient with the unix shell myself, but there are certainly competent developers where I work that are not.