Seeing Dan Abramov’s wonderful post is doing the rounds here (and elsewhere), I thought it would be a fun exercise to share some of the things we don’t know yet.
I’ll go first. I’ve limited the list to technologies / methods floating around in my mind that are at least tangential to what I do, otherwise it would spiral out of control :) Off the top of my head:
Functional programming — as I was mentioning here, I’ve a working understanding of the basic concepts, but I haven’t really spent time going on a deep-dive of the theory.
WebGL — I’ve deeply admired the demos I’ve been seeing theoughout the years, but my only experience is loading and navigating through a 3D landscape with three.js and much hand-holding.
Testing complex interfaces — I work on a web application that features rather complex mouse / keyboard / touch interactions, and don’t feel I have a firm grasp on how to best test them and guard against regressions.
Serverless — sounds exciting, but haven’t had the time to dig in to really get what’s going on.
Taming complexity — a hairy goal that I’m now exploring more thoroughly. It’s currently a mix of readings / concepts, patterns from a 10yr practice that have turned out to be successful, and the intuition that comes with it. Looking towards systematizing this tacit knowledge.
Accessibility — I understand how to write semantic markup, letting the browser do the heavy-lifting, dos and don’ts accrued from reading and experience, but I’m still shamefully under-documented on how people actually use assistive technologies, their experiences, and their expectations.
(Note: I’m a student, I don’t have a job yet.)
I guess it doesn’t look like the average list, but many would probably categorise what I’m doing as “embedded”.
Among the necessary things in the vast sea of domains am not familiar with, I would only name
Also some faddish stuff that are sorta necessary to learn from career POV but I hope to sit out. Managed that with XML in its time. Today it’s largely anything containers.
And my #1 thing I don’t know:
How to write good documentation: I often have internal monologues in my head where I explain how something works. In my own head, it’s very clear and straight-forward, but when I try to put those thoughts down into words, I become paralyzed and unable to be clear. In 2019, I want to become better at writing documentation that my colleagues can read quickly and understand easily.
Also off the top of my head:
Happy to help with grokking ObjC if I can: a handy book is the Big Nerd Ranch guide which spends 11 chapters on C stuff before introducing Objects, so it can be read whether you have C experience or not. [mild disclaimer: I have worked, but no longer work, for BNR]
Things I don’t know:
Now, for a detour away from the land of data analysis, I also have several gaps in my frontend knowledge:
Finally, one devops-y topic:
Cython is very cool. I ended up using it for a PyPI package I maintain and the speed improvements it brings over pure Python is fascinating. Additionally, it doesn’t feel like you’re leaving Python space at all. I’d highly recommend playing around with it.
I did some Android programming for the first time about 10 years ago shortly after the platform came out. I’ve picked it up here and there but I’ve never gotten an app to the point of publishing it. I wouldn’t mind doing that sometime in 2019 but it seems like every time I am about to do something in that space, I hear of a developer’s account getting arbitrarily closed and their apps orphaned. Just today, another report. The argument is always something like “don’t do anything against the terms of service” but when the account closings don’t clearly state why, it’s essentially arbitrary.
One of the things I want to pick up the most in 2019 is some better web programming methodology. This means that I want to pick up Scala.js, Elm, Rust WebAssembly, etc. 10 years ago I would have considered myself a front end developer but about five years ago I went to system software and haven’t really done anything web that wasn’t basic Ruby ERB stuff.
I wanted to write down this list but I felt a blog post was too much. Thank you for the chance.
Things I don’t know as a data engineer/ml engineer with 5 years of expertise and a master degree.
How to work with Native Code: I know some C, I’m learning Pony, but I’ve never really worked with compiled stuff. This means everytime I have to work with a FFI there are a lot of grey areas that I don’t understand and I just trust my colleagues.
Hardware: I’m in this for the fancy abstractions and the elegant code, not the metal. Hardware to me exists only as an abstraction. I only understand the basics of how it works and how to interface with it. I also have plenty of problems configuring devices on Linux
Networking: same as before. I understand it as an abstraction, but don’t ask me to configure a network from the CLI.
Windows: how can people work with that as developers? Everytime I try to open the prompt I want to cry.
Mobile, Frontend and Web Development: while I did some web development, the amount of knowledge and methodologies involved to write good websites or in general human-facing software is beyond my understanding. The fact that I only meet terrible code at work when dealing with those fields makes me think there’s no way to do it properly. The internet seems to confirm, especially for the JS part. But I guess many people can get it right and I’ve never met them.
Haskell: I’m a functional programmer, I know at least 3 functional languages (Scala, Clojure, Racket), I tried to study Idris, but still, Haskell is a mistery. The syntax is just too cumbersome to begin to study it properly and every time I give up.
Heh, that’s why I started writing my own command shell…
But seriously, the target market for Windows is typically not developers which means that a lot of developer support isn’t “in the box.” Once you get a real command prompt, a compiler/interpreter for your language of choice, some archive tools, source control system, etc, it works okay. It just feels like there’s a lot of manual configuration whereas a Linux install is ready to go, because its target market is for people who do development in some form.
Heh. As to Windows: Development is done with IDE’s in general (ever since Turbo Pascal and Visual Basic, in the 1980’s and 1990’s respectively, not discounting the dBase/Clipper line of products). There is PowerShell though these days, and it is truly not bad.
Rust or any language that is closer to the “metal”. I’m a web dev so these things scare me a little bit.
Interesting little exercise this. Things I don’t know… that’s bound to be a large list.
Yes, this looks like humble bragging. It is meant as a show of having learned a lot and still know but a part of just my chosen field of computer science. I’ve not even touched on many things that I do know about but do not truly know, whether it be in the direction of sensor fusion, or device drivers, or software team organisation. Please, please, pretty please realise that our field is not simply huge, it is truly humongous, and bigger than can be fully learned in a single lifetime. Not knowing is the norm! The biggest asset I’ve learned is to learn, to organise knowledge, to get a foothold in an area of learning. That makes me confident that if any of the things mentioned above were to become relevant (either through being interesting, or through commercial relevance) I would probably have no insurmountable barriers in acquiring the knowledge, possibly even quite quickly. But I have little illusions as to knowing everything in my field. It’s simply impossible.
Progressive Web Apps - which seems to be future of “apps”. Chrome OS is leading in this front, by gradually erasing the distinction between “mobile” and “desktop” and “web” apps.
(I’m sure this list could be a lot longer.)
Would be quicker to write a list of the stuff I do know :P
I feel like it might make more sense to rank skill level not by the stuff we know but the speed at which we can work out new things. 2 months ago I had never used React before but I got a job working with it and have no issues because after a read over the codebase it all just makes sense. So I feel there isn’t much use making a list of what I do know because if I needed to know something I should be able to work it out quick enough unless its radically different to the stuff I already know.
bus_space_whateverfunctions in kernels, what a BAR is in PCI, which things talk about physical addresses and which ones talk about virtual ones, etc…
Stuff I don’t really know:
Parallelism: I write embarassingly scalar solutions for problems.
Hardware: How does the CPU work? It’s just a series of transistors, and everything is built on those, but there’s definitely gaps.
Algorithms and Data Structures: I’m ashamed to say it - it gets really fuzzy after linked lists. This doesn’t help my funcprog attempts.
Graphics and Game Programming: I’m not good at graphics, especially because I don’t know the underlying math. For some reason, the game logic loop seems to escape me.
Stuff I’m working at being better at:
Assembly:: I started learning PowerPC assembly for a project, and even if I have to constantly refer to the ISA manual, I can sort of understand basic sequences and even write very simple chunks; enough to optimize a JIT.
Portability: Also due to that project, I have a better perception of POSIX, C, and where they fall short. I can identify endianness issues.
Communication: A soft skill, but it’s the most important when working on FLOSS projects. Being able to tell people clearly what you need and what they need, even if it involves big abstract concepts.
Databases: I have a basic comprehension of SQL now, but I’m still a little lost on how DBs work internally.
Networking: I have a much better idea of how TCP/IP and Ethernet work nowadays, though not really from the programmer’s perspective.
Off the top of my head:
desktop or mobile app development: I just started learning Swift and macOS and iOS, and it’s fascinating to be learning UI stuff and being a novice all over again after more than a decade of doing web UI work
assembly: I did a small amount of it in my first job, and I can read enough to get by in a desperate pinch, but I couldn’t write it to save my life
GPU or graphics anything: I’ve never touched any of it, and I wouldn’t even know where to start
compilers: I have some understanding conceptually, but in practice, I’ve never so much as written a parser
APL and friends: formal verification sounds super interesting, but I’ve never done it
good performance tuning on the web: I can do a fair bit of optimization and analysis in C-or-similar contexts, but deep performance tuning on the web is, ironically, something I don’t have almost any experience in—despite having spent the last years doing web dev full time and having been doing it at least part time for longer than anything else
advanced FP, much less dependent types: most production Haskell might as well be gibberish to me, and the kinds of proofs and formalisms you can express in F* or Idris blow my mind
SQL optimization: I’ve written a fair bit of MySQL and PostgreSQL over the years, but if you wanted me to tune a query… nope. I hear there are reports you can ask the SQL engines to run? 😆
logic programming: just a big ¯\_(ツ)_/¯ here: I know it exists, and that’s the extent of my knowledge of it
hardware: I did some electronics work for my bachelors (physics), and that’s the extent of my knowledge
OS implementation: hazards of being self-taught; I have essentially no OS implementation knowledge
networking: anything beyond the basics; off the top of my head I couldn’t tell you the difference between TCP and UDP, and the details of how HTTP vs. HTTP/2 works is just a “huh” at this point
machine learning: there’s some linear algebra and derivatives and stuff I hear?
mathematical formalisms: both on the linear algebra side and the set theory side, I’m just mostly ignorant of this side of things yet. (Sadly in the linear algebra case: it’s the only math class I ever dropped, because I had a horrid teacher—the kind who was misgrading my homework assignments.)