+++ transparent = true title = "Things I Learnt The Hard Way (In 30 Years of Software Development)" template = "section-contentless.html" +++ * [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) * Project Organization * [Organize Your Code by Data/Type, Not Functionality](project-organization) * [Create Libraries](libraries) * 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) * 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) * [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) * 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) * [You'll Learn About Yourself The Hard Way](learn-about-yourself)