Hacker News new | ask | show | jobs
by angersock 4259 days ago
That is a very tame definition of "generalist" you have there.

Here, let's propose some things I'd expect a generalist to be able to do:

  IT
  ===========
  
  - Provision wired networks for small businesses/homes/labs
  - Do basic troubleshooting of printers and networked printing (and know when to throw in towel)
  - Setup and debug towers and rack servers from parts
  - Provision wireless networks using access points for small businesses/homes/labs
  - Setup and debug mail clients
  - Setup and debug file servers
  - Setup and provision virtual machines with network access
  - Setup and debug scripts for common administration tasks
  - Setup and secure user accounts on remote systems with centralized management
  - Setup disaster recovery systems and policies for above
  - Write project plans and deliverables for doing above
  - Write cost analyses and bills of materials for doing above
  - Explain existing service providers and when they'd be preferable to doing things in-house
  
  Web
  ============
  
  - Write front-end JS, without frameworks, to do basic tasks
  - Write single-page app with proper history integration
  - Write front-end JS using AJAX endpoints
  - Write functional JS where appropriate
  - Write CSS
  - Write CSS with less pain using LESS/SASS/Stylus/whatever
  - Write CSS with rough idea of compatibility concerns
  - Write HTML from scratch
  - Write responsive web pages (and know when this is a fool's errand)
  - Explain how HTTP works, what it gets wrong, and what alternatives exist
  - Write JS using websockets
  - Write JS using webworkers
  - Write JS using canvas (2D or 3D)
  - Provision a basic website using turnkey hosting ( Heroku, etc. )
  - Provision a basic website using virtual hosting ( Linode, Digital Ocean, etc. )
  
  
  Software engineering
  =======================
  
  - Write useful and succinct comments in code
  - Write useful and succinct documentation for projects
  - Provide useful root-cause analysis for production failures
  - Provide reasonable estimates for project completion
  - Provision and use a centralized version control system (CVS, SVN, etc.) and explain its uses
  - Provision and use a decentralized version control system (git, mercurial, etc.) and explain its uses
  - Write useful and approriate tests for code (TDD, BDD, library unit tests, whatever)
  - Provision continuous integration services for an application
  
  Systems
  ==============
  
  - Explain how different data types can be represented in memory
  - Explain how filesystems work
  - Explain functions of a kernel
  - Explain at least 2 approaches to operating systems design
  - Explain basic architecture for at least 1 processor family, and be able to provide design considerations (MIPS, x86, x64, Itanium, ARM, SPARC, etc.)
  - Write organized project in a systems language (assembly, C, C++, D, Rust, Go)
  - Create build environment for native code projects
  - Create makefiles (or platform's equivalent)
  - Write in systems language: hash table, linked list, resizable array, binary tree
  - Write networking code in a systems language supporting IPv4, IPv6, and which can support lookups by hostname
  - Write UDP code with reliability mechanisms
  - Write TCP client code, explain common mistakes
  - Write multithreaded code, explain concurrency approaches
  - Write asynchronous code in a systems language
  - Write cross-language binding for systems language library ( Ruby over C, Python over C, etc.)
  - Create and document binary format for storing structure data to a file
  - Create and document binary format for streaming and message-based communication over a network
  - Explain why we prefer JSON for above purposes
  - Explain why JSON is slow and dumb, and we'd rather use <CapnProto, protocol buffers, STOMP, whatever > instead
  - Write code handling file IO using normal methods, using asynchronous methods, using memory mapping in systems language
  - Write code performing IPC in systems language
  
  Databases
  ===============
  
  - Provision an RDBMS (MariaDB, Postgres, whatever)
  - Write basic queries for fetching data
  - Write useful and succient data model documentation for database
  - Explain performance considerations for hardware running that RDBMS
  - Perform maintenance (backups, benchmarking) on RDBMS
  - Provision at least one NoSQL solution (neo4j, MongoDB, Redis, Cassandra, etc.)
  - Perform maintenance (backups, benchmarking) on NoSQL databases)
  - Explain when to use that NoSQL solution in preference of an RDBMS, and why.
  - Perform ETL using above systems
  - Perform map-reduce using above systems
  - Collect real-time time-series data using above systems
  - Connect to above systems using web framework of choice, using manual and secure queries
  - Connect to above systems using web framework of choice, using an ORM
  - Scale database of choice across multiple machines
  - Perform failover of database of choice across multiple machines
  
  Maths
  ==============
  
  - Understand basic linear algebra and rigid transforms (i.e., 2D graphics)
  - Understand basic statistcal properties
  - Understand basic themes of intergration and differentation
  - Understand IEEE 754 floating-point and basic numerical issues in computation
  - Understand trigonometric functions and their relations
  - Estimate computational complexity of implementing above
This is not an exhaustive list, and I don't expect everyone to be 100% on it. That said, if you call yourself a "generalist" and can't do like at least half of everything in each of those categories, you're either a novice generalist, or you're full of shit.

EDIT:

I left out so things applying to programming languages, applying to machine learning, applying to graphics, applying to electronics, and several other things. Being a generalist is hard.

This is also why a good one is expensive.

1 comments

That's a massive compendium! I wish I had been more crisp in my question; the thought over here was to figure whether there's a simpler step by step process to minimize frustration and maximize your confidence on your path to becoming an enlightened generalist (which would naturally takes years to accomplish). I'm mostly interested in the "sequencing" of these steps which is why I provided a rather contrived example of the web app that grows in features with each iteration. For junior devs it's usually pretty hard to figure this out on their own so they end up either doing a deep dive in a very limited number of technologies (ex: Building a webservice in Spring + Hibernate ecosystem comes to mind) without or just float up top at very superficial layers.

You've done an incredible job at detailing the expectations of a generalist but might you have some recommendations on forging that path for people interested?