150 Things Every Software Engineer Should Know
- 0(n log n)
- How to hash a data structure
- When to use a hashmap
- When to use an array
- When not to use an array
- [1..100].map(addOne)
- [1..100].reduce(sum)
- Why you can’t string append in a loop
- That the next time after 1:59 is not 2:00
- Why “float accountBalance = 100.32” is a bug
- How to write a recursive algorithm
- When to write a recursive algoritm
- What tail call optimization is
- How a compiler works
- O(1)
- Why was OO invented?
- Why do some engineers hate LISP?
- Why do some engineers swear by LISP?
- Why do some engineers hate OO?
- Why do some engineers swear by OO?
- How to switch between normal and insert mode in Vi
- How to save in Vi
- Why is there are a long-running flame war between vi and emacs
- What is the visitor pattern
- How does a buffer overflow exploit work
- What does a buffer overflow exploit look like in code
- How does garbage collection work
- How does double buffering work
- How does DNS work
- What it feels like when it is harder than it should be
- What does cyclomatic complexity measure?
- Why does high cyclomatic complexity imply buggy code?
- How to spot buggy code using only whitespace
- Why do some engineers swear by spaces?
- Why do some engineers swear by tabs?
- How to debug with a rubber ducky
- What is TCP and why would you use it?
- What is UDP and why would you use it?
- What is a password salt and why do you use it?
- How do random number generators work?
- When to build a graph?
- What happens when you git rebase?
- When happens when you git merge?
- What is fast-forward in git?
- What really happens when you revert a merge commit in git?
- Why are the estimates always wrong?
- What is the million-man-hour myth?
- Which side of the modal dialog the cancel button goes on
- When not to show a modal dialog
- What is a screen reader
- How do you implement and train a neural network
- An algorithm that sorts in less than O(n2)
- How to sort a binary tree
- What features allow NoSQL databases to scale horizontally better than SQL databases
- What features do NoSQL databases sacrifice from SQL databases
- ACID vs BASE
- How deadlocks happen
- What Turing Completeness proves
- What it doesn’t prove
- Dependency injection
- The two generals problem
- How much latency feels instantaneous
- how much latency feels fast
- slow
- how much latency before the user gives up
- why you never run a cron job every five minutes in a distributed system
- that the user doesn’t know what he wants
- how to tell what the user actually wants
- what your boss really wants
- the cost of your program crashing
- what a new user sees when he starts your program
- what your grandmother sees
- how to explain why a feature is difficult or impossible in words an MBA can understand
- in words your grandmother can understand
- in words an arrogant junior engineer can understand
- what each of these people really wants when they ask for the impossible feature
- that easy-to-learn tools usually increase project complexity
- that hard-to-learn tools usually decrease project omplexity
- why hardware manufacturers invest billions in open source
- how Bill Gates made his billions
- the business model of a successful open source product
- what marginal cost says about software as a business
- what marginal cost says about open source software
- why most of the highest quality software in the world costs $50-$200 per license.
- why the lowest quality software in the world costs $1,000-$100,000 per license.
- when to ask for help
- when to add a third party dependency
- when to roll your own
- when to ignore the contractor
- and when to defer to her
- grep
- grep -v
- what Chesterton’s fence says about legacy code
- Be fluent in a dynamically typed language
- …a statically typed language
- …an object oriented language
- …a functional language
- …a scripting language
- C
- LISP macros
- how to implement a hobby language of each of these types in C
- what it feels like to return to bad code after 6 months away
- what the web is like at 56k
- what the web is like on a screen reader
- why regex cannot model XML
- Each type of SQL join
- its performance
- its treatment of missing data
- that Object-Relational mapping is impossible
- That sometimes impossible things are worth almost doing
- Nothing is easy
- You need sleep to live
- Your skills are probably worth more than you think
- That engineers are taken out and shot at 40
- How and when to optimize for CPU cycles
- How and when to optimize for memory
- How and when to optimize for latency
- That usually it’s best not to optimize at all
- How to optimize for free time
- How to optimize for family
- How to optimize for low bug counts
- How to ask for a raise
- How and why to avoid a bad software team
- You need exercise to live
- That you will desperately want a non-computer hobby by your mid-30s.
- All that stuff about good computer posture applies to you.
- The Gang of Four Design Patterns
- The Unix Philosophy
- Why engineers still use tools written the Unix way decades later
- Why everything for end-users written the Unix way is dead and bankrupt.
- What you sound like as a bright young engineer to the old timers
- What the old timers sound like to a bright young engineer.
- Why it seems like marketing never does any work
- Why your blue-collar cousin thinks you don’t do any work
- Why so many engineers hate Java
- Why so many businesses use Java
- What an architecture astronaut is
- What a network effect is
- Commodification
- Promises
- How to search a 100kb file for a string?
- A 2 terabyte file
- In ISO-8859-1
- How to ensure only one copy of your program is running
- Why email isn’t secure
- The implications of the major open source licenses for commercial software development
- What a Heisenbug is
- How to debug it
- How to avoid it
- What a race condition is and what it looks like in code.
- A bonus one: That much intelligent behavior can be emulated with a heuristic that simply maximizes the number of available actions next tick.
( This was inspired by “Two Hundred and Fifty Things an Architect Should Know” by Michael Sorkin )
blog comments powered by Disqus