Skip to content

Instantly share code, notes, and snippets.

@ggorlen
Last active July 7, 2022 00:56
Show Gist options
  • Select an option

  • Save ggorlen/9e36f82e1cf8f682faca18a55cc913f8 to your computer and use it in GitHub Desktop.

Select an option

Save ggorlen/9e36f82e1cf8f682faca18a55cc913f8 to your computer and use it in GitHub Desktop.
CW tag notes

Background

The kata library is difficult to browse because it's huge (9.3K+ kata!) and lacks structure. We'd like to improve the browsing experience by providing convenient ways to access interesting topics, and allowing users to drill down from broader concepts based on their interest.

The current tag system allows users to find kata based on keywords, but it's difficult to use because the list is large and unstructured. We also need to improve tagging in general.

Things to keep in mind:

  • We need to have a good balance between breadth and depth in the taxonomy for good user experience. Too many initial items like the current tags will overwhelm users. Reducing it too much and nesting too deep will be annoying to use.
  • We also don't want this metadata to be a spoiler, especially for more difficult kata. Figuring out what can be applied is often the most important.

Implementation

The initial implementation will use the existing tag system, and introduce (internal) "tag types" to categorize them to utilize the subsets separately. This allows incremental adaption with minimal change to how search works.

Example tag types:

  • keyword: General keywords related to the kata ("normal" tag, default)
  • topic: Tags with wider scope than keyword tags (e.g., data-structures, math). May have child tags that apply this topic implicitly.
  • style: Tags describing kata style (e.g., debugging, refactoring, restricted, puzzles)
  • domain: Similar to topic, but specifically for career paths/domain (e.g., backend, frontend, data-science)
  • tool: Tags for libraries, frameworks, packages, etc. (e.g., numpy, flask, react) (Couldn't think of a better type name.)

These tag types allow using subsets of tags to provide more focused navigation.

Example of making some topics more accessible:

by-topic

TODO

  • Improve tagging (HELP WANTED)
  • Improve tags: deduplicate, rename, document (HELP WANTED)
  • Add navigation based on topics similar to the above example

Current Tags

Feel free to propose changes. We've been discussing tags in https://discord.com/channels/846624424199061524/981303825472315412

  • Algorithms (topic)
  • Data Structures (topic)
    • Binary Search Trees -- (drop in favor of binary trees or trees?)
    • Binary Trees -- (drop in favor of trees?)
    • Heaps -- (drop?)
    • Linked Lists
    • Lists
    • Monads
    • Priority Queues -- (drop in favor of queues?)
    • Queues
    • Sets -- (drop? We don't have maps/dicts then I don't see sets having much filtering value)
    • Stacks
    • Trees
  • Design Patterns (topic)
    • Singleton
    • Decorator
  • Mathematics (topic)
    • Algebra
    • Geometry
    • Linear Algebra
    • Number Theory
    • Probability
    • Statistics
  • Discrete Mathematics (topic)
    • Permutations -- (drop, too specific?)
    • Combinatorics
  • Language Features (topic)
  • Basic Language Features (topic)
  • Advanced Language Features (topic)
  • Theorem Proving (topic)
  • Cryptography (topic)
    • Ciphers
  • Object-oriented Programming (topic)
  • Functional Programming (topic)
  • Logic Programming (topic)
  • Reactive Programming (topic) -- use for the declarative programming paradigm
  • Graphics (topic)
    • Image Processing
  • Fundamentals -- (drop as too broad?)
  • Concurrency -- general-purpose tag for parallelization of code
  • Threads
  • Asynchronous -- use when code is executed in non-sequential order by means of futures or asynchronous language features
  • State Machines
  • Cellular Automata -- use for kata related to state- and rule-based grid simulations
  • Computational Science -- use for computer science theory such as finite state machines, automata, regular languages, complexity analysis
  • Domain Specific Languages
  • Regular Expressions
  • Dynamic Programming
  • Memoization -- use for challenges that involve caching or dynamic programming to avoid repeated computation (drop in favor of DP?)
  • Binary -- (dupe of bits?)
  • Bits -- (dupe of binary?)
  • Strings -- (drop; too broad?)
  • Arrays -- (drop; too broad?)
  • Date Time
  • Big Integers -- (drop; too narrow?)
  • Graph Theory -- use for algorithms and data structures that deal with graphs/networks made up of edges and vertices (nodes)
  • Vectors -- (drop?)
  • Matrix -- use for multidimensional, non-jagged arrays
  • Iterators -- (drop?)
  • Closures -- (drop?)
  • Macros
  • Metaprogramming -- use when languages modify their source or classes at runtime (sort of a dupe of reflection?)
  • Reflection -- use when code examines itself at runtime (sort of a dupe of metaprogramming?)
  • Memoization (on the list twice; drop)
  • Search -- (rename to searching to be congruent with sorting/filtering?)
  • Compilers
  • Interpreters
  • Parsers -- use for kata concerned with extracting data from strings (change to parsing?)
  • Sorting
  • Filtering
  • Simulation
  • Formatting -- use for kata primarily concerned with complex string formatting (drop tag?)
  • Validation -- use for kata concerned with validating input (drop tag?)
  • Recursion -- problem solving paradigm common to math and algorithms; use for recursive definitions and
  • Physics -- sub category of math?
  • Scheduling -- use for operating system scheduling algorithms
  • Networks -- use for networking protcols and standards such as TCP/IP and HTTP (not the graph data structure; use Graph Theory)
  • Numerical Analysis -- sub category of math?
  • Machine Learning (topic)
  • Genetic Algorithms
  • Randomized Algorithms
  • Neural Networks
  • Artificial Intelligence
  • Deep Learning
  • Reverse Engineering
  • Event Handling
  • Esoteric Languages -- languages that aren't intended for general-purpose problem solving; use for interpreters/compilers of these languages, or challenges designed to be solved exclusively in esoteric languages.
  • Polymorphism -- (drop in favor of OOP as too specific?)
  • Inheritance -- (drop in favor of OOP as too specific?)
  • Games
  • Riddles -- (dupe of puzzles?) use when the kata description is intended to be indirect and provoke thought and analysis to grasp.
  • Game Solvers
  • Optimization -- (dupe of performance?)
  • Performance -- (dupe of optimization?)
  • Promises
  • Logic -- (drop?)
  • Set Theory -- (subset of mathematics?) (not the data structure)
  • Databases
  • JSON
  • ASCII Art
  • Unicode
  • Streams
  • Data Visualization
  • Graphs: charts -- use for charts (use Graph Theory for the algorithm paradigm/data structure)
  • Web Scraping

Styles

  • Bugs (rename to Debugging?) -- use when existing code is provided that must be fixed (debugged)
  • Refactoring -- no new functionality is added; use for code quality and design improvements
  • Tutorials
  • Puzzles
  • Restricted -- use for kata that impose artificial constraints, such as disallowed language features or limited solution code length

Domains

  • Data Science (domain)
    • Data Frames
  • Web3 (domain)
  • Backend (domain)
  • Frontend (domain)
    • React (tool)
    • Angular (tool)
  • Security (domain)

Tools

  • Express
  • Flask
  • MongoDB
  • NoSQL
  • NumPy
  • RxJS
  • SQL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment