The right knowledge for each problem ...
A friend emailed me an interesting quote:
"... what little evidence we have about programmer productivity points to a productivity distribution that's skewed with a long tail of incompetence"
However uncomfortable it might make you, I believe there's a certain amount of truth in this quote.
For any one given task, there are always developers able to complete it much faster than others - and I'm not talking 10% or 20%, I'm talking about delivery in a quarter or a tenth the time.
But is it always the same developers who deliver quickly, or does it differ from task to task?
I've been on both sides of this productivity ratio - once developing (from scratch) in a week a module that another developer had spent six months failing to complete (long, true, story that's not entirely mine to tell). Ratio of 26:1. And, seeing another developer deliver code in an afternoon that I was convinced would take three or four weeks. Ratio around 40:1.
While there are undoubtedly developers that are simply incompetent, I'm convinced that in most cases the underlying issue is one of knowledge - does the developer have the right skills, do they understand the right concepts, in order to get the job done effectively and quickly.
Given the wide variety of tasks that a typical developer has to perform, what concepts, knowledge and skills should they have?
I've come up with this list of concepts, distinctions, techniques and knowledge that every developer should know. Have I got everything? By no means - I've probably got half, if I'm lucky.
Here's the $64,000 question - how many of these items do you know thoroughly?
Bonus question: What would you add?
Abstraction vs Implementation
Amortisation
API Design – noun/verb vs Fluent
Authentication vs Authorisation
Bandwidth vs Latency
Caching:
Expiry strategies and memory use
Class Oriented vs Object Oriented
Class, Instance and Sequence diagrams
Colour Modelling
Compiled vs Interpreted code – byte-code, p-code, IL
Complexity:
O(x) notation, linear vs quadratic vs exponential vs factorial complexity
Connectionless vs Connected
Database management:
Schema design, query optimisation and indexing
Declarative vs Imperative programming
Dependency injection
Duck Typing vs Strict Typing - Type Inference
Encapsulation
Encryption vs Obfuscation
Entity Relationship modelling
Entropy, Compression, Encoding and Encryption
Ethernet, TCP/IP and UDP/IP
Events - Singlecast vs Multicast
Exceptions vs Error Codes
Explaining technical issues to non technical people
Functional vs Procedural programming
Hash tables and arrays
Identity
Indirection
Inheritance vs Composition
Instantiation
Liskov Substitution Principle
Lists/Stacks/Queues and Trees
Memory heaps and fragmentation
Memory management
Garbage collection vs malloc/free vs reference counting, stack frames and pointers
Method Missing
Mutability vs Immutability
Mutual Exclusion and Locks
Object vs Component Orientation
Pattern Matching and Regular Expressions
Polymorphism, Abstraction and Interfaces
Pre-emptive vs Cooperative multitasking
Proxies and Delegation
Recursion vs Iteration
Requirements vs Specifications vs Implementation
Semaphores, Spin Locks and Monitors
Single Responsibility Principle
Source code management - labels, branches and versioning
State machines - deterministic vs non-deterministic
Stateless vs Stateful
Teach a class and Present a seminar
Technical documentation
Testing
Unit vs Integration vs System vs Performance vs User Acceptance
Threads vs Fibres vs Processes
Transactions
Commit/Rollback vs Complete/Abort
Unicode vs ASCII, UTF-8 vs UTF-16
Write Training materials

Recent comments
4 weeks 16 hours ago
4 weeks 22 hours ago
4 weeks 1 day ago
4 weeks 1 day ago
8 weeks 1 day ago
9 weeks 17 hours ago
9 weeks 4 days ago
9 weeks 4 days ago
11 weeks 5 days ago
12 weeks 4 hours ago