1. 43

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.

  • Static typing — most of my work is in JavaScript, and I’m at the point where I’ve yet to be convinced of the tangible benefits vs the overhead for switching to something like TypeScript or Flow. (armchair opinion)

  • 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.

  1.  

  2. 9

    (Note: I’m a student, I don’t have a job yet.)

    • Anything graphics that goes beyond “how to attach a basic shader to a mesh”: I know some basics, but about eg. how to speed up many different computations using efficient data structures, or making things not look like POVRay, I have absolutely no clue.
    • Sound synthesis: I know the basics of filters, additive, subtractive and physical modelling synthesizers, but not how to make it sound good.
    • The ‘details’ of network protocols (from HTTP to ethernet frames), instead of having only a vague idea of what is going on.
    • How to create processors (and other hardware components): I know how the basic components work (instruction decoder, ALU, etc.), but not how to glue them together (bus arbitration logic, etc.), and how to make it faster than a few kHz.
    • Any maths that goes beyong basic linear algebra, vector calculus, differential equations or Fourier transforms: category theory, more advanced algebraic geometry, number theory, spherical harmonics, and lots of various interesting/useful stuff.
    • Cryptography: I know that (and why) one shouldn’t use MD5, I know the difference between symmetric and assymetric cryptography, but without the maths behind it, all this knowledge is pretty much worthless.
    • Physics: anything “quantum”, to put it in a slightly silly way.
    • Programming languages: although I’m not too familiar with many of them, the one that isn’t just a rehash of other ideas and one I don’t know yet, is Prolog.
    • The inner workings of CNC stuff, more in-depth than just “this is how you can control an actuator with a pencil attached”, but I guess the GCode situation is a lot like this (I do engineering, not CS, that’s why it’s relevant for me.)
    • AI, “machine learning” etc: I’m slightly sceptical because of the size of the hype, but I really should know the maths behind it.
    • Anything about UI/UX:

    If I ever strand on a deserted island, and the only way to get home is to create a usable UI, I’ll die on that island.

    • Databases: yes, seriously. SQL? What’s that?
    • Anything JS that isn’t pure DOM stuff, although I probably won’t need it anytime soon, and I’m not really interested in all that stuff.
    • Docker, Kubernetes, serverless, other stuff: pretty much the same. These are all different things to begin with anyway, but I simply have no clue about them. I don’t even know the difference between a VM and a container.

    I guess it doesn’t look like the average list, but many would probably categorise what I’m doing as “embedded”.

    1. 8

      Among the necessary things in the vast sea of domains am not familiar with, I would only name

      • modern Javascript - both the language and the frameworks

      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.

      1. 7
        • Caching: I work with performance-sensitive systems at work, but I don’t know nearly enough about CPU caches: how they work, how fast they are, and most importantly, how to best take advantage of them especially in high-level languages.
        • Network programming: I know what an IP is, but there is so much about the network stack that I don’t know: the pros and cons of choosing UDP over TCP for a network application, what ICMP is, how DNS works, how TLS works, how the fuck the Internet doesn’t crumble under all the exponential backoffs, etc.
        • Resilient software: I wish I knew more about backoff, retrying, proper logging, etc. to make my programs go from applications that perform a task in the best of scenarios to systems that remain functional even in the face of adversity.
        • Satisfiability: this is my CS challenge for 2019: I want to write my own simple SAT solver, I want to become better at reducing other problems to SAT, and I want to investigate whether SAT would have any application at work.

        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.

        1. 4

          Also off the top of my head:

          • OpenGL or any other 3D graphics API – I meant to learn it some years ago (and bought a few books, even) but just never had the time, or the need to do so. I know more about how DRM/Mesa implement OpenGL then about how to use OpenGL at this point…
          • Objective-C – I know some people swear by it even outside of Apple platforms; but I just don’t get it. The syntax looks impenetrable to me.
          • Assembly of any kind – I know enough about it to be able to make educated guesses about matching generated assembly to original source code (from crash dumps without debug info) but that’s it.
          • Hardware specifications – I’m not the biggest fan of reading RFCs, but I can do it; hardware specs on the other hand I’m terrible at.
          1. 1

            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]

          2. 4
            • 3D Graphics Programming – I’ve always been interested, but I have a million other things I want/need to do first.
            • Embedded Programming – Seems super fun. I’d love to have a better understanding of how real-world devices operate at that level.
            • Logic Programming – I’ve read the μKanren paper, but that’s about it.
            • Dependent Typing – I think I understand it, but I haven’t written anything past hello world.
            • Type Theory – I have both TAPL books, but I haven’t gotten around to reading them yet.
            • Statistics and Machine Learning – I’ve implemented basic things like linear regression, kNN and decision trees, but my grasp of statistics is pretty weak and my eyes currently glaze over when I try to understand more complicated ML concepts.
            1. 4

              Things I don’t know:

              • Compilers: I understand how individual parts of a compiler work but I have no idea how to put them together effectively. I’ve done my share of toy interpreters but never completed a compiler for a legit (i.e., not a toy) language.
              • Virtual Machines: More in the sense of programming languages (tied to compilers ^). I get the general idea of how they work but I’ve got no clue on how to implement one.
              • Cache friendly programming: I have a general intuition but I don’t have a method for this. How do I figure out if my code is cache friendly or not? What are good strategies to keep code cache-friendly?
              • Graphics programming: I sort of have some idea of how it works, but I’m mostly clueless. I also don’t have a good understanding of computer graphics concepts. I’ve been planning to get started with this for years but never actually did.
              • Network protocols: My understanding is very shallow. I get the general idea of say TCP, but I don’t understand it enough to reason about traffic behaviour under some situations (e.g., congestion). I’m also clueless about routing protocols: BGP, MPLS, IS-IS, etc.
              • Assembly: I’ve done some programming in ARM assembly many years ago, but I can barely remember anything at this point. I think knowing some x64 asm could be handy, but I have no idea how to even read it. All of those different addressing modes just put me off.
              • Some language other than Haskell/Python: I’ve been coding in Haskell and Python for a few years now and that’s all I really know at this point. I’d really like to learn some other more mainstream language that I could use for lower level stuff. I can get around Go and C++, but that’s about it. Can’t call myself proficient in any of them.
              1. 4
                • Linear Algebra: took a course on it in college, but don’t know it well enough to apply it practically yet. Refreshing my memory on this one by taking the “Coding the Matrix” course from Brown.
                • Parallelism on GPUs: I know a lot about multi-core and multi-node parallelism, but not much (yet) about multi-CUDA-core parallelism. This is also something I’m learning about on my path to…
                • Modern Machine Learning & NLP: I am still developing my curriculum for this, but my practical need is that I am going deep on commercial applications of NLP, which I first explored in 2011-2013, somewhat-abandoned because I didn’t think the results were good enough, and then resurrected my interest in 2017-2018 when I saw the results available with things like word2vec/fastText. I plan to take a path of study here through Linear Algebra (above), then Andrew Ng’s course, then Tensorflow/Python examples, and finally at training my own language models. I also have an interest in ML for time series analysis/forecasting.
                • Optimizing Python with C: I know C and I know Python well, but I never went deep on optimization techniques (like Cython) or pure C extension modules. I am very curious about this space but never landed on a personal/professional project to go deeper.

                Now, for a detour away from the land of data analysis, I also have several gaps in my frontend knowledge:

                • Writing big JavaScript apps with modern ES2017+: the last big JS app I wrote was during the ES5-and-earlier era. I did recently refresh myself on modern JS writing/building with tools like webpack, babel, and jest, but I haven’t written a big program yet.
                • Sass for CSS: the last CSS preprocessor I used was LESS, and only lightly at that. Sass seems like the modern winner.
                • React: I have lots of opportunities to learn this as it is widely used at work, but I am one of the casualties of the JS framework wars. I learned JS as “The Good Parts” in 2008-2010. Then refined my JS in the jQuery era. Then taught myself Node and build tools and the rest. But then Angular 1 arrived and I invested (a lot) in that, and then felt framework wars got out of hand, so I sat it out on the sidelines for a couple years. Seems like if I dip the toes back in, React is the right pool. But, we’ll see!
                • Native mobile anything: I stuck with web and missed the native mobile app building wave from a personal experience standpoint. I am wondering whether Swift and Kotlin are worth learning, or whether React Native truly is the brainspace-saving hack I’ve been waiting for there. Glad that I never learned ObjC.

                Finally, one devops-y topic:

                • Kubernetes: I have a project at work that could truly benefit from it. Not merely as a hype-driven container adoption mechanism. It would allow me to switch some code that utilizes a JVM-based parallelism and availability framework with Python interop, over to pure Python with the parallelism/availability “outsourced” to k8s. Conceptually, seems like a good idea, but I have close to no Kubernetes knowledge and am nervous to invest time in it. The other system “Ain’t Broken”, so there isn’t a rush to “Shave the Yak” :)
                1. 3

                  Optimizing Python with C

                  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.

                2. 3

                  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.

                  1. 3

                    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.

                    1. 2

                      Windows: how can people work with that as developers? Everytime I try to open the prompt I want to cry.

                      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.

                      1. 1

                        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.

                      2. 3

                        Rust or any language that is closer to the “metal”. I’m a web dev so these things scare me a little bit.

                        1. 3

                          Interesting little exercise this. Things I don’t know… that’s bound to be a large list.

                          • Serverless - I know the basics well enough to contrast it with e.g. EJB’s, but have no actual experience building any ‘serverless’ thing. Not sure I currently want to learn though.
                          • Kubernetes - Docker Swarm has been useful enough not to truly investigate deeper.
                          • Modern graphics - I’ve worked through Foley & van Dam’s CGPP, but that was the early ‘90’s edition with SPHIGS, not the modern stuff. While I know shaders and such exist, how to deal with them I do not.
                          • Modern web stack - I know Javascript, I know Typescript, I know some CSS, but the actual practice of using them and the associated pandora’s box of libraries and frameworks, not so much.
                          • GraphQL - other than surface level concepts… nope, nary a clue.
                          • Mobile - I know Android has intents, that it has a java-like VM and that tombstoning is (was?) important. And there is something about ‘activities’? iOS, I truly have no idea about.
                          • Markdown - Well, I always forget what the link syntax is…
                          • Dependently typed programming languages - I think I know enough type theory, having worked through Barendregt’s ‘The lambda calculus: its syntax and semantics’, to deal with this, but I’ve not dived in.
                          • Category theory - I know it may be helpful, I can use monads and know they’re not just sequencing; I have very little active knowledge of the base definitions and the theorems in the field.
                          • Java, beyond 8 - And even beyond Java 1 I need to look things up regularly. Fortunately, I usually know what I want to express in a language, and the simple matter of encoding it in the language at hand is a neat puzzle.
                          • Logging - Useful skill, that. No clue how to apply it at scale beyond ‘printf-debugging’.
                          • Erlang - OO done right, they say. Highly concurrent, they say.
                          • Software engineering - There really is no validated theory as to the best way to do things in the large, is there? I’ll admit that I blunder around in generally good directions, and can explain my reasoning for making choices, but that does not a scientific basis make.
                          • Oz - Always seemed like an interesting language to me to learn.
                          • Time management - I always fall off any process I try to use. I really wish I were better at this… fortunately staying busy with generally useful things mitigates this a bit.
                          • Domain driven design - What are entities and aggregates and aggregate roots, really?
                          • Test driven design - I do design. I write tests. Sometimes at the same time. Writing and refactoring the tests and driven code I do not consider doing the design, but that seems to be what TDD is all about.
                          • Mesh networking - There’s protocols there that I simply do not know.
                          • Return oriented programming - I know of it… I think I could manage to do it… but really don’t know where to start.
                          • Modern hacking tools - I’ve not truly kept up in the past decade (or two). Fortunately, base knowledge does not go stale. Unfortunately, lacking input sanitisation is still the major vulnerability…
                          • Graphic design - I know about ease of use, I know Fitts’ law, I’ve read Donald Norman’s ‘Design of everyday things’, but I have very little clue as to how to translate that knowledge into actual graphics, so am no good at UX.
                          • Machine learning - I’ve dabbled in information retrieval, know TF/IDF, have some idea of what a neural network does, but no deep understanding.

                          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.

                          1. 2

                            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.

                            1. 2
                              • High level languages - I’ve never written a line of Python, and never used a single JS framework.
                              • Serverless - I work developing clouds but have never tried to write an application that dynamically implements load scaling of its own instances.
                              • Modern C++ - I largely use C because it doesn’t hide implementation details. Modern C++ (17 etc) is simultaneously confusing to me while also seeming like a step backwards, because I’m always trying to guess what the compiler is generating, and can’t stand not knowing.
                              • Web apps that don’t suck - I’ve written PHP but it always ends up spaghetti. I have no idea how people build web apps at scale and deal with various browsers and the reality that the server is constantly changing (eg. need to upgrade PHP periodically.) Rolling upgrades and cached content imply that clients can receive different versions of things from servers and servers need to cope with it.
                              • Compilers - I use these things all the time but every time I make an interpreter it’s using ad-hoc parsing and ends up a mess. I don’t know how to make a sane parser, and I couldn’t describe how a register allocator works.
                              • Anything graphics - I’ve never used OpenGL, DirectX, etc. Aside from knowing GPUs are parallel execution units, I don’t know how to leverage them effectively.
                              • COM - I worked at Microsoft for 14 years and have only a rudimentary understanding of COM.
                              • Managed languages - I had bad experiences with Java in school and avoided .NET. I’m sure there’s a different mindset to how to make managed environments acceptably efficient (eg. very long lived processes, avoid allocations) but I’ve never taken the time to understand the mindset.
                              • Cryptography - I feel like I know a bit about security, but due to the problem domain I don’t know what I don’t know and it’s possible that holes in my knowledge end up creating holes in products. I use crypto in various forms all the time but feel like I’m implementing “best practice” without knowing why half the time.

                              (I’m sure this list could be a lot longer.)

                              1. 2

                                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.

                                1. 2
                                  • Driver development: I managed to get a new SoC working on FreeBSD by copy-pasting values from the technical reference manual into an existing driver for a previous SoC… and I got many things wrong, it’s a surprise that it worked at all! :D In general, I’m sort of aware of MMIO and DMA but I haven’t found a good tutorial that teaches how all this maps to the bus_space_whatever functions in kernels, what a BAR is in PCI, which things talk about physical addresses and which ones talk about virtual ones, etc…
                                  • Dependent types: I know what they are, but haven’t used them for anything in practice.
                                  • FPGA/HDL/hardware development: fascinating stuff, but I don’t really have the time to learn it, or any use cases it seems.
                                  • Game development: I can render some cubes with OpenGL, I could probably learn Vulkan, but it’s not the graphics part that’s scary, it’s the physics-controls-mechanics-AI/the-whole-thing-together.
                                  • Offensive security / bug hunting: I never tried to exploit a memory bug, I’m not even good at spotting memory bugs…
                                  • Advanced C++ template metaprogramming: it’s apparently related to pure functional programming (which I do use a lot) but the syntax makes my brain explode. There are people who can make compile time regex engines with this!
                                  1. 2

                                    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.

                                    1. 2

                                      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.)