|
|
|
+++
|
|
|
|
transparent = true
|
|
|
|
title = "Things I Learnt The Hard Way (In 30 Years of Software Development)"
|
|
|
|
+++
|
|
|
|
|
|
|
|
* [Intro](intro)
|
|
|
|
* [Disclaimer](disclaimer)
|
|
|
|
|
|
|
|
* Programming
|
|
|
|
* Before you start writing code...
|
|
|
|
* [Spec First, Then Code](spec-first)
|
|
|
|
* [Write Steps as Comments](steps-as-comments)
|
|
|
|
* [Gherkin Is Your Friend to Understand Expectations](gherkin)
|
|
|
|
* [Design Patters Are Used to Name Solution, Not Find Them](patterns-not-solutions)
|
|
|
|
* [Thinking Data Flow Beats Patterns](data-flow)
|
|
|
|
* [The Magic Number Seven, Plus Or Minus Two](magical-number-seven)
|
|
|
|
* [Cognitive Cost Is The Readability Killer](cognitive-cost)
|
|
|
|
* [Learn The Basics of Functional Programming](functional-programming)
|
|
|
|
* [Shortcuts Are Nice, But Only In The Short Run](understand-shortcuts)
|
|
|
|
* [Debuggers Are Overrated](debuggers)
|
|
|
|
* [Think About The Users](users)
|
|
|
|
* Testing Software
|
|
|
|
* [Unit Tests Are Good, Integration Tests Are Gooder](integration-tests)
|
|
|
|
* [Testing Every Function Creates Dead Code](tests-dead-code)
|
|
|
|
* [Tests Make Better APIs](tests-apis)
|
|
|
|
* [Make Tests That You Know How To Run On The Command Line](tests-in-the-command-line)
|
|
|
|
* [Good Languages Come With Tests](languages-tests)
|
|
|
|
* Documenting your code
|
|
|
|
* [Documentation Is A Love Letter To Your Future Self](document-it)
|
|
|
|
* [The Function Documentation Is Its Contract](document-is-contract)
|
|
|
|
* [If A Function Description Includes An "And", It's Wrong](document-and)
|
|
|
|
* [Good Languages Come With Integrated Documentation](languages-docs)
|
|
|
|
* Source Control
|
|
|
|
* [Always Use A Version Control System](always-vcs)
|
|
|
|
* [One Commit Per Change](one-change-commit)
|
|
|
|
* [Gerrit Is A Mistake](gerrit)
|
|
|
|
* [Git-Flow Is The Way To Go](git-flow)
|
|
|
|
* Project Organization
|
|
|
|
* [Organize Your Code by Data/Type, Not Functionality](project-organization)
|
|
|
|
* [Create Libraries](libraries)
|
|
|
|
* [Paper Notes Are Actually Helpful](paper-notes)
|
|
|
|
* Writing code
|
|
|
|
* [Be Ready To Throw Your Code Away](throw-away)
|
|
|
|
* [Future Thinking Is Future Trashing](future-trashing)
|
|
|
|
* [Don't Use Booleans As Parameters](boolean-parameters)
|
|
|
|
* [Beware of Interface Changes](interface-changes)
|
|
|
|
* [It's Better To Let The Application Crash Than Do Nothing](crash-it)
|
|
|
|
* [If You Know How To Handle It, Handle It](handle-it)
|
|
|
|
* [Types Say What Your Data Is](data-types)
|
|
|
|
* [If Your Data Has a Schema, Use a Structure](use-structures)
|
|
|
|
* [Don't Mess With Things Outside Your Project](outside-project)
|
|
|
|
* [Resist The Temptation Of Easy](resist-easy)
|
|
|
|
* [Start Stupid](start-stupid)
|
|
|
|
* [Always Use Timezones With Your Dates](use-timezones)
|
|
|
|
* [Always Use UTF-8 For Your Strings](use-utf8)
|
|
|
|
* [Optimization Is For Compilers](optimization)
|
|
|
|
* [Units Makes Things Clear](units)
|
|
|
|
* [If It Doesn't Run On Your Computer, You Have A Problem](run-locally)
|
|
|
|
* [Nothing More Permanent Than A Temporary Solution](permanent-solution)
|
|
|
|
* Making Things Go
|
|
|
|
* [The Config File Is Friend](config-file)
|
|
|
|
* [Command Line Options Are Weird, But Helpful](command-line-options)
|
|
|
|
* [Not Just Function Composition, But Application Composition](application-composition)
|
|
|
|
* [Even for Application Composition, Start Stupid](app-composition-stupid)
|
|
|
|
* [Logs Are For Events, Not User Interface](log-events)
|
|
|
|
* [Be Transparent With The User](transparent)
|
|
|
|
* [One Version To Add, One Version To Remove](add-then-remove)
|
|
|
|
* [Learn To Monitor](monitoring)
|
|
|
|
* Community/Teams
|
|
|
|
* [A Language Is Much More Than A Language](languages-are-more)
|
|
|
|
* [Understand And Stay Away From Cargo Cult](cargo-cult)
|
|
|
|
* ["Right Tool For The Job" Is Just To Push An Agenda](right-tool-agenda)
|
|
|
|
* [The Right Tool Is More Obvious Than You Think](right-tool-obvious)
|
|
|
|
* [Code Reviews Are Not For Style](code-reviews-style)
|
|
|
|
* [Code Formatting Tools Are Ok, But No Silver Bullet](code-formatters)
|
|
|
|
* [Code Style: Follow It](code-style)
|
|
|
|
* [... Unless That Code Style Is The Google Code Style](google-code-style)
|
|
|
|
* [Hero Projects: You'll Have To Do It Yourself](hero-projects)
|
|
|
|
* [Global Changes Must Be Discussed With The Whole Team First](team-discussion)
|
|
|
|
* Personal
|
|
|
|
* [Companies Look For Specialists But Keep Generalists Longer](specialists)
|
|
|
|
* [Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve](stupid-bugs-list)
|
|
|
|
* [When It's Time to Stop, It's Time To Stop](time-to-stop)
|
|
|
|
* [Code of Conduct Protect YOU, Not THEM](coc)
|
|
|
|
* [Learn To Say No](say-no)
|
|
|
|
* [Take Responsibility For The Use Of Your Code](responsible-code)
|
|
|
|
* [Don't Tell It's Done When It's Not](not-done)
|
|
|
|
* [People Get Upset About Code And Architecture Quality 'Cause They Care](people-care)
|
|
|
|
* [You'll Learn About Yourself The Hard Way](learn-about-yourself)
|
|
|
|
* [Pay Attention On How People React To You](watch-reactions)
|
|
|
|
* [Don't Confuse Hero Project With Hero Syndrome](hero-syndrome)
|
|
|
|
* [Beware of Toxic People](toxic-people)
|
|
|
|
* [Beware of Microaggressions](microaggressions)
|
|
|
|
* [Toxic/Aggressive People Are Not Fixable -- Unless It's You](fixable)
|
|
|
|
* [Realize When It's Time To Quit](quit)
|
|
|
|
* [I.T. World Is Really Small](small-world)
|
|
|
|
* [Blogging About Your Stupid Solution Is Still Better Than Being Quiet](blogging)
|
|
|
|
* [Don't Hide Your Stupid Solution](post-solution)
|
|
|
|
* [Keep A List of Things I Don't Know](things-i-dont-know)
|
|
|
|
* [You Always Have The Time](time)
|
|
|
|
* [Own Your Shit](own-your-shit)
|
|
|
|
* [Don't Defend Bad Code](bad-code-defense)
|